diff --git a/.clang_complete b/.clang_complete
deleted file mode 100644
index 21434586c73..00000000000
--- a/.clang_complete
+++ /dev/null
@@ -1,24 +0,0 @@
-
--I.
--I./drivers
--I./drivers/avr
--I./keyboards/ergodox_ez
--I./keyboards/ergodox_ez/keymaps/vim
--I./lib
--I./lib/lufa
--I./quantum
--I./quantum/api
--I./quantum/audio
--I./quantum/keymap_extras
--I./quantum/process_keycode
--I./quantum/serial_link
--I./quantum/template
--I./quantum/tools
--I./quantum/visualizer
--I./tmk_core
--I./tmk_core/common
--I./tmk_core/common/debug.h
--I./tmk_core/protocol
--I./tmk_core/protocol/lufa
--I./util
--DQMK_KEYBOARD=\"$(KEYBOARD)\" -DQMK_KEYMAP=\"$(KEYMAP)\"
diff --git a/.github/workflows/cli.yml b/.github/workflows/cli.yml
index 27558127354..28c6bb36798 100644
--- a/.github/workflows/cli.yml
+++ b/.github/workflows/cli.yml
@@ -19,7 +19,7 @@ jobs:
container: qmkfm/base_container
steps:
- - uses: actions/checkout@v1
+ - uses: actions/checkout@v2
with:
submodules: recursive
- name: Install dependencies
diff --git a/.gitignore b/.gitignore
index 0e80cdb6c4b..20437224f18 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,6 +24,7 @@ quantum/version.h
.idea/
CMakeLists.txt
cmake-build-debug
+.clang_complete
doxygen/
.DS_Store
/util/wsl_downloaded
@@ -47,7 +48,6 @@ doxygen/
*.iml
.browse.VC.db*
*.stackdump
-util/Win_Check_Output.txt
# Let these ones be user specific, since we have so many different configurations
.vscode/c_cpp_properties.json
.vscode/launch.json
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 0caee2241dc..9aa546a7877 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -9,12 +9,17 @@
"**/*.bin": true
},
"files.associations": {
- "*.h": "c",
- "*.c": "c",
- "*.cpp": "cpp",
- "*.hpp": "cpp",
- "xstddef": "c",
- "type_traits": "c",
- "utility": "c"
+ "*.h": "c",
+ "*.c": "c",
+ "*.inc": "c",
+ "*.cpp": "cpp",
+ "*.hpp": "cpp",
+ "xstddef": "c",
+ "type_traits": "c",
+ "utility": "c"
+ },
+ "[markdown]": {
+ "editor.trimAutoWhitespace": false,
+ "files.trimTrailingWhitespace": false
}
}
diff --git a/Makefile b/Makefile
index 9478c14f8c2..9ad0755d57b 100644
--- a/Makefile
+++ b/Makefile
@@ -29,6 +29,9 @@ $(info QMK Firmware $(QMK_VERSION))
endif
endif
+# avoid 'Entering|Leaving directory' messages
+MAKEFLAGS += --no-print-directory
+
ON_ERROR := error_occurred=1
BREAK_ON_ERRORS = no
diff --git a/autocomplete.sh b/autocomplete.sh
deleted file mode 100644
index dffb260c425..00000000000
--- a/autocomplete.sh
+++ /dev/null
@@ -1 +0,0 @@
-complete -W " 9key-default alps64-default amj40-default amj40-fabian amj60-default_60_ansi amj60-iso_split_rshift amj60-maximized amjpad-default amjpad-max amjpad-ortho_left amjpad-ortho_right atomic-default atomic-default_ortho_5x15 atomic-pvc atreus-alphadox atreus-classic atreus-default atreus-erlandsona atreus-gerb atreus-jeremy atreus-replicaJunction atreus-xyverz atreus62-atreus52 atreus62-default atreus62-mneme atreus62-xyverz bananasplit-0010 bananasplit-coloneljesus bananasplit-default bananasplit-hhkbanana bananasplit-nic bananasplit-rask bantam44-default chibios_test-default clueboard-bloodlvst clueboard-caps_fn clueboard-colemak clueboard-default clueboard-jokrik clueboard-mac_optimized clueboard-magicmonty clueboard-maximised clueboard-mouse_keys clueboard-serubin clueboard-shift_fn clueboard-skully clueboard-smt clueboard-tetris clueboard-unix_optimized clueboard-win_optimized clueboard-xyverz cluecard-default cluecard-rgb_effects cluepad-default deltasplit75-default deltasplit75-itsaferbie deltasplit75-protosplit dk60-default eco-default eco-that_canadian ergodone-333fred ergodone-ab ergodone-absenth ergodone-adam ergodone-adnw_k_o_y ergodone-albert ergodone-alexjj ergodone-algernon ergodone-alphadox ergodone-andrew_osx ergodone-belak ergodone-bepo ergodone-bepo_csa ergodone-bryan ergodone-coderkun_neo2 ergodone-colemak ergodone-colemak_osx_pc_no ergodone-colemak_programmer ergodone-common_nighthawk ergodone-csharp_dev ergodone-dave ergodone-deadcyclo ergodone-default ergodone-default_ergodox ergodone-dragon788 ergodone-dvorak ergodone-dvorak_emacs ergodone-dvorak_emacs_software ergodone-dvorak_intl_squisher ergodone-dvorak_plover ergodone-dvorak_programmer ergodone-dvorak_programmer_swe ergodone-dvorak_spanish ergodone-emacs_osx_dk ergodone-erez_experimental ergodone-familiar ergodone-french_hacker ergodone-galson ergodone-german ergodone-german-kinergo ergodone-german-lukas ergodone-german-manuneo ergodone-guni ergodone-ishigoya-jp ergodone-italian ergodone-j3rn ergodone-jack ergodone-jacobono ergodone-jafo ergodone-jgarr ergodone-josh ergodone-kastyle ergodone-kines-ish ergodone-kristian ergodone-maz ergodone-mclennon_osx ergodone-mpiechotka ergodone-msc ergodone-naps62 ergodone-neo2_on_qwertz_hardware ergodone-norwegian_programmer_osx_pc ergodone-norwegian_programmer_osx_pc_colemak ergodone-ordinary ergodone-osx_de ergodone-osx_de_adnw_koy ergodone-osx_de_experimental ergodone-osx_fr ergodone-osx_kinesis_pnut ergodone-osx_whiskey_tango_foxtrot_capslock ergodone-phoenix ergodone-plover ergodone-plums ergodone-pvinis ergodone-replicaJunction ergodone-reset_eeprom ergodone-robot_test_layout ergodone-romanzolotarev-norman-osx ergodone-romanzolotarev-norman-plover-osx ergodone-romanzolotarev-norman-plover-osx-hjkl ergodone-romanzolotarev-norman-qwerty-osx ergodone-sethbc ergodone-siroken3 ergodone-sneako ergodone-software_neo2 ergodone-supercoder ergodone-swedish ergodone-swedish-lindhe ergodone-swissgerman ergodone-techtomas ergodone-teckinesis ergodone-tkuichooseyou ergodone-tm2030 ergodone-tonyabra_osx ergodone-townk_osx ergodone-twentylives_dvorak_with_hebrew ergodone-twey ergodone-videck ergodone-win10_writers-block ergodone-workman_osx_mdw ergodone-xyverz ergodone-yoruian ergodone-zweihander-osx ergodox_ez-333fred ergodox_ez-ab ergodox_ez-absenth ergodox_ez-adam ergodox_ez-adnw_k_o_y ergodox_ez-albert ergodox_ez-alexjj ergodox_ez-algernon ergodox_ez-alphadox ergodox_ez-andrew_osx ergodox_ez-belak ergodox_ez-bepo ergodox_ez-bepo_csa ergodox_ez-blakedietz ergodox_ez-bryan ergodox_ez-coderkun_neo2 ergodox_ez-colemak ergodox_ez-colemak_osx_pc_no ergodox_ez-colemak_programmer ergodox_ez-common_nighthawk ergodox_ez-csharp_dev ergodox_ez-dave ergodox_ez-deadcyclo ergodox_ez-default ergodox_ez-default_ergodox ergodox_ez-default_osx ergodox_ez-dragon788 ergodox_ez-drashna ergodox_ez-drashna-custom ergodox_ez-dvorak ergodox_ez-dvorak_emacs ergodox_ez-dvorak_emacs_software ergodox_ez-dvorak_intl_squisher ergodox_ez-dvorak_plover ergodox_ez-dvorak_programmer ergodox_ez-dvorak_programmer_swe ergodox_ez-dvorak_spanish ergodox_ez-emacs_osx_dk ergodox_ez-erez_experimental ergodox_ez-familiar ergodox_ez-french_hacker ergodox_ez-galson ergodox_ez-german ergodox_ez-german-kinergo ergodox_ez-german-lukas ergodox_ez-german-manuneo ergodox_ez-guni ergodox_ez-ishigoya-jp ergodox_ez-italian ergodox_ez-j3rn ergodox_ez-jack ergodox_ez-jacobono ergodox_ez-jafo ergodox_ez-jgarr ergodox_ez-josh ergodox_ez-kastyle ergodox_ez-kines-ish ergodox_ez-kristian ergodox_ez-maz ergodox_ez-mclennon_osx ergodox_ez-mpiechotka ergodox_ez-msc ergodox_ez-naps62 ergodox_ez-neo2_on_qwertz_hardware ergodox_ez-norwegian_programmer_osx_pc ergodox_ez-norwegian_programmer_osx_pc_colemak ergodox_ez-ordinary ergodox_ez-osx_de ergodox_ez-osx_de_adnw_koy ergodox_ez-osx_de_experimental ergodox_ez-osx_fr ergodox_ez-osx_kinesis_pnut ergodox_ez-osx_whiskey_tango_foxtrot_capslock ergodox_ez-phoenix ergodox_ez-plover ergodox_ez-plums ergodox_ez-profet_80 ergodox_ez-pvinis ergodox_ez-replicaJunction ergodox_ez-reset_eeprom ergodox_ez-robot_test_layout ergodox_ez-romanzolotarev-norman-osx ergodox_ez-romanzolotarev-norman-plover-osx ergodox_ez-romanzolotarev-norman-plover-osx-hjkl ergodox_ez-romanzolotarev-norman-qwerty-osx ergodox_ez-sethbc ergodox_ez-siroken3 ergodox_ez-sneako ergodox_ez-software_neo2 ergodox_ez-steno ergodox_ez-supercoder ergodox_ez-swedish ergodox_ez-swedish-lindhe ergodox_ez-swissgerman ergodox_ez-techtomas ergodox_ez-teckinesis ergodox_ez-tkuichooseyou ergodox_ez-tm2030 ergodox_ez-tonyabra_osx ergodox_ez-townk_osx ergodox_ez-twentylives_dvorak_with_hebrew ergodox_ez-twey ergodox_ez-videck ergodox_ez-win10_writers-block ergodox_ez-workman_osx_mdw ergodox_ez-xyverz ergodox_ez-yoruian ergodox_ez-zweihander-osx ergodox_infinity-333fred ergodox_infinity-ab ergodox_infinity-absenth ergodox_infinity-adam ergodox_infinity-adnw_k_o_y ergodox_infinity-albert ergodox_infinity-alexjj ergodox_infinity-algernon ergodox_infinity-alphadox ergodox_infinity-andrew_osx ergodox_infinity-belak ergodox_infinity-bepo ergodox_infinity-bepo_csa ergodox_infinity-bryan ergodox_infinity-coderkun_neo2 ergodox_infinity-colemak ergodox_infinity-colemak_osx_pc_no ergodox_infinity-colemak_programmer ergodox_infinity-common_nighthawk ergodox_infinity-csharp_dev ergodox_infinity-dave ergodox_infinity-deadcyclo ergodox_infinity-default_ergodox ergodox_infinity-dragon788 ergodox_infinity-dvorak ergodox_infinity-dvorak_emacs ergodox_infinity-dvorak_emacs_software ergodox_infinity-dvorak_intl_squisher ergodox_infinity-dvorak_plover ergodox_infinity-dvorak_programmer ergodox_infinity-dvorak_programmer_swe ergodox_infinity-dvorak_spanish ergodox_infinity-emacs_osx_dk ergodox_infinity-erez_experimental ergodox_infinity-familiar ergodox_infinity-french_hacker ergodox_infinity-galson ergodox_infinity-german ergodox_infinity-german-kinergo ergodox_infinity-german-lukas ergodox_infinity-german-manuneo ergodox_infinity-guni ergodox_infinity-ishigoya-jp ergodox_infinity-italian ergodox_infinity-j3rn ergodox_infinity-jack ergodox_infinity-jacobono ergodox_infinity-jafo ergodox_infinity-jgarr ergodox_infinity-josh ergodox_infinity-kastyle ergodox_infinity-kines-ish ergodox_infinity-kristian ergodox_infinity-maz ergodox_infinity-mclennon_osx ergodox_infinity-mpiechotka ergodox_infinity-msc ergodox_infinity-naps62 ergodox_infinity-neo2_on_qwertz_hardware ergodox_infinity-norwegian_programmer_osx_pc ergodox_infinity-norwegian_programmer_osx_pc_colemak ergodox_infinity-ordinary ergodox_infinity-osx_de ergodox_infinity-osx_de_adnw_koy ergodox_infinity-osx_de_experimental ergodox_infinity-osx_fr ergodox_infinity-osx_kinesis_pnut ergodox_infinity-osx_whiskey_tango_foxtrot_capslock ergodox_infinity-phoenix ergodox_infinity-plover ergodox_infinity-plums ergodox_infinity-pvinis ergodox_infinity-replicaJunction ergodox_infinity-reset_eeprom ergodox_infinity-robot_test_layout ergodox_infinity-romanzolotarev-norman-osx ergodox_infinity-romanzolotarev-norman-plover-osx ergodox_infinity-romanzolotarev-norman-plover-osx-hjkl ergodox_infinity-romanzolotarev-norman-qwerty-osx ergodox_infinity-sethbc ergodox_infinity-siroken3 ergodox_infinity-sneako ergodox_infinity-software_neo2 ergodox_infinity-supercoder ergodox_infinity-swedish ergodox_infinity-swedish-lindhe ergodox_infinity-swissgerman ergodox_infinity-techtomas ergodox_infinity-teckinesis ergodox_infinity-tkuichooseyou ergodox_infinity-tm2030 ergodox_infinity-tonyabra_osx ergodox_infinity-townk_osx ergodox_infinity-twentylives_dvorak_with_hebrew ergodox_infinity-twey ergodox_infinity-videck ergodox_infinity-win10_writers-block ergodox_infinity-workman_osx_mdw ergodox_infinity-xyverz ergodox_infinity-yoruian ergodox_infinity-zweihander-osx four_banger-default frosty_flake-default frosty_flake-nikchi frosty_flake-tkl gh60-dbroqua gh60-dbroqua_7U gh60-default gh60-default_60_ansi gh60-default_60_ansi_split_bs_rshift gh60-default_60_iso gh60-robotmaxtron gh60-sethbc gh60-talljoe gh60-unxmaal gh60-xyverz gherkin-default gherkin-mjt gherkin-steno gherkin-talljoe gonnerd-default gonnerd-mauin gonnerd-tkl hadron-default hadron-side_numpad hhkb-blakedietz hhkb-cinaeco hhkb-dbroqua hhkb-default hhkb-jp hhkb-jp_mac hhkb-lxol hhkb-mjt hhkb-rdg_jp hhkb-sh_jp hhkb-shela hhkb-smt infinity60-default infinity60-default_60_ansi_split_bs_rshift infinity60-depariel infinity60-hasu infinity60-jpetermans infinity60-talljoe jc65-default jc65-jetpacktuxedo jd40-default jd40-vanagon jd45-blakedietz jd45-default jd45-jeebak jd45-justin jd45-mjt jd45-mjt6u kbd75-default kc60-dbroqua kc60-dbroqua_hhkb kc60-default kc60-default_60_ansi kc60-mechmerlin kc60-sgoodwin kc60-stanleylai kc60-wigguno kc60-workman-dead kc60-ws2812 kinesis-default kinesis-dvorak kinesis-milestogo kinesis-xyverz kitten_paw-default kitten_paw-ickerwx kmac-default kmac-winkeyless lets_split-OLED_sample lets_split-adam lets_split-dale lets_split-default lets_split-default_ortho_4x12 lets_split-ergodoxish lets_split-fabian lets_split-henxing lets_split-hexwire lets_split-khord lets_split-mbsurfer lets_split-mjt lets_split-piemod lets_split-smt lets_split-xk lets_split-xyverz m10a-default maxipad-default mechmini-default minidox-default minidox-that_canadian mitosis-carvac_dv mitosis-default mitosis-mjt miuni32-adam-lee miuni32-default miuni32-ht_156 nyquist-333fred nyquist-default nyquist-default_ortho_5x12 nyquist-hexwire org60-boardy org60-default orthodox-default pegasushoof-blowrak pegasushoof-default phantom-default phantom-rgbmod phantom-xyverz planck-ab planck-alexey planck-angerthosenear planck-austin planck-basic planck-bone2planck planck-brandon planck-callum planck-cbbrowne planck-chance planck-charlie planck-circuit planck-coloneljesus planck-dale planck-daniel planck-david planck-dbroqua planck-default planck-default_ortho_4x12 planck-dshields planck-dzobert planck-ergodoxish planck-espynn planck-experimental planck-gabriel planck-handwired_binaryplease planck-impossible planck-jacob planck-jeebak planck-jeremy-dev planck-jhenahan planck-joe planck-johannes planck-khord planck-kyle planck-lae3 planck-leo planck-lucas planck-lukas planck-luke planck-max planck-mitch planck-mjt planck-mjtnumsym planck-mollat planck-nico planck-originerd planck-pete planck-piemod planck-premek planck-priyadi planck-pvc planck-rai-suta planck-sgoodwin planck-smt planck-steno planck-tak3over planck-thermal_printer planck-tong92 planck-unicode planck-vifon planck-xyverz planck-yale planck-yang planck-zach preonic-0xdec preonic-CMD-Preonic preonic-dale preonic-default preonic-default_ortho_5x12 preonic-jacwib preonic-kinesis preonic-nikchi preonic-smt preonic-xyverz preonic-zach ps2avrGB-default roadkit-default roadkit-default_ortho_4x4 roadkit-flipphone roadkit-mjt roadkit-singles roadkit-singlesBrent s60_x-ansi_qwertz s60_x-bluebear s60_x-custom s60_x-dbroqua s60_x-default s60_x-hasu s60_x-hhkb s60_x-iso s60_x-jpec s60_x-plain s60_x-poker s60_x-poker_bit s60_x-poker_set s60_x-spacefn s65_x-default s65_x-iso s65_x-nall s65_x-smt satan-admiralStrokers satan-ben_iso satan-colemak satan-dbroqua satan-default satan-default_60_ansi satan-default_60_ansi_split_bs_rshift satan-default_60_iso satan-denolfe satan-iso_split_rshift satan-mark1 satan-midi satan-poker satan-rask63 satan-sethbc satan-smt satan-stanleylai satan-talljoe satan-unxmaal sixkeyboard-default subatomic-default sweet16-default tada68-default tada68-maartenwut tada68-rgb tiger_lily-default tv44-belak tv44-core tv44-default tv44-jeebak tv44-jetpacktuxedo tv44-mjt tv44-smt tv44-tong92 tv44-xyverz uk78-default vision_division-default whitefox-default whitefox-jetpacktuxedo whitefox-matt3o xd60-cheese xd60-default xd60-stanleylai xd75-default xd75-default_ortho_5x15 xd75-fabian" make
diff --git a/bin/qmk b/bin/qmk
index 60555d3d709..801852d4e8d 100755
--- a/bin/qmk
+++ b/bin/qmk
@@ -2,52 +2,61 @@
"""CLI wrapper for running QMK commands.
"""
import os
-import subprocess
import sys
from importlib.util import find_spec
-from time import strftime
+from pathlib import Path
# Add the QMK python libs to our path
-script_dir = os.path.dirname(os.path.realpath(__file__))
-qmk_dir = os.path.abspath(os.path.join(script_dir, '..'))
-python_lib_dir = os.path.abspath(os.path.join(qmk_dir, 'lib', 'python'))
-sys.path.append(python_lib_dir)
+script_dir = Path(os.path.realpath(__file__)).parent
+qmk_dir = script_dir.parent
+python_lib_dir = Path(qmk_dir / 'lib' / 'python').resolve()
+sys.path.append(str(python_lib_dir))
-# Make sure our modules have been setup
-with open(os.path.join(qmk_dir, 'requirements.txt'), 'r') as fd:
- for line in fd.readlines():
- line = line.strip().replace('<', '=').replace('>', '=')
- if line[0] == '#':
- continue
+def _check_modules(requirements):
+ """ Check if the modules in the given requirements.txt are available.
+ """
+ with Path(qmk_dir / requirements).open() as fd:
+ for line in fd.readlines():
+ line = line.strip().replace('<', '=').replace('>', '=')
- if '#' in line:
- line = line.split('#')[0]
+ if len(line) == 0 or line[0] == '#' or line.startswith('-r'):
+ continue
- module = line.split('=')[0] if '=' in line else line
+ if '#' in line:
+ line = line.split('#')[0]
+
+ module = dict()
+ module['name'] = module['import'] = line.split('=')[0] if '=' in line else line
- if module in ['pep8-naming']:
# Not every module is importable by its own name.
- continue
+ if module['name'] == "pep8-naming":
+ module['import'] = "pep8ext_naming"
- if not find_spec(module):
- print('Could not find module %s!' % module)
- print('Please run `pip3 install -r requirements.txt` to install the python dependencies.')
- exit(255)
+ if not find_spec(module['import']):
+ print('Could not find module %s!' % module['name'])
+ print('Please run `python3 -m pip install -r %s` to install required python dependencies.' % (qmk_dir / requirements,))
+ if developer:
+ print('You can also turn off developer mode: qmk config user.developer=None')
+ print()
+ exit(255)
-# Figure out our version
-# TODO(skullydazed/anyone): Find a method that doesn't involve git. This is slow in docker and on windows.
-command = ['git', 'describe', '--abbrev=6', '--dirty', '--always', '--tags']
-result = subprocess.run(command, universal_newlines=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-if result.returncode == 0:
- os.environ['QMK_VERSION'] = result.stdout.strip()
-else:
- os.environ['QMK_VERSION'] = 'nogit-' + strftime('%Y-%m-%d-%H:%M:%S') + '-dirty'
+developer = False
+# Make sure our modules have been setup
+_check_modules('requirements.txt')
# Setup the CLI
import milc # noqa
+# For developers additional modules are needed
+if milc.cli.config.user.developer:
+ # Do not run the check for 'config',
+ # so users can turn off developer mode
+ if len(sys.argv) == 1 or (len(sys.argv) > 1 and 'config' != sys.argv[1]):
+ developer = True
+ _check_modules('requirements-dev.txt')
+
milc.EMOJI_LOGLEVELS['INFO'] = '{fg_blue}Ψ{style_reset_all}'
diff --git a/build_json.mk b/build_json.mk
index 087944cc418..6e2f9c4c8f2 100644
--- a/build_json.mk
+++ b/build_json.mk
@@ -21,6 +21,11 @@ else ifneq ("$(wildcard $(MAIN_KEYMAP_PATH_1)/keymap.json)","")
KEYMAP_PATH := $(MAIN_KEYMAP_PATH_1)
endif
+# Load the keymap-level rules.mk if exists
+ifneq ("$(wildcard $(KEYMAP_PATH))", "")
+ -include $(KEYMAP_PATH)/rules.mk
+endif
+
# Generate the keymap.c
$(KEYBOARD_OUTPUT)/src/keymap.c: $(KEYMAP_JSON)
bin/qmk json2c --quiet --output $(KEYMAP_C) $(KEYMAP_JSON)
diff --git a/build_keyboard.mk b/build_keyboard.mk
index b086420653f..4108704875d 100644
--- a/build_keyboard.mk
+++ b/build_keyboard.mk
@@ -231,44 +231,19 @@ endif
# We can assume a ChibiOS target When MCU_FAMILY is defined since it's
# not used for LUFA
ifdef MCU_FAMILY
- FIRMWARE_FORMAT?=bin
PLATFORM=CHIBIOS
+ PLATFORM_KEY=chibios
+ FIRMWARE_FORMAT?=bin
else ifdef ARM_ATSAM
PLATFORM=ARM_ATSAM
+ PLATFORM_KEY=arm_atsam
FIRMWARE_FORMAT=bin
else
PLATFORM=AVR
+ PLATFORM_KEY=avr
FIRMWARE_FORMAT?=hex
endif
-ifeq ($(PLATFORM),CHIBIOS)
- include $(TMK_PATH)/chibios.mk
- OPT_OS = chibios
- ifneq ("$(wildcard $(KEYBOARD_PATH_5)/bootloader_defs.h)","")
- OPT_DEFS += -include $(KEYBOARD_PATH_5)/bootloader_defs.h
- else ifneq ("$(wildcard $(KEYBOARD_PATH_5)/boards/$(BOARD)/bootloader_defs.h)","")
- OPT_DEFS += -include $(KEYBOARD_PATH_5)/boards/$(BOARD)/bootloader_defs.h
- else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/bootloader_defs.h)","")
- OPT_DEFS += -include $(KEYBOARD_PATH_4)/bootloader_defs.h
- else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/boards/$(BOARD)/bootloader_defs.h)","")
- OPT_DEFS += -include $(KEYBOARD_PATH_4)/boards/$(BOARD)/bootloader_defs.h
- else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/bootloader_defs.h)","")
- OPT_DEFS += -include $(KEYBOARD_PATH_3)/bootloader_defs.h
- else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/boards/$(BOARD)/bootloader_defs.h)","")
- OPT_DEFS += -include $(KEYBOARD_PATH_3)/boards/$(BOARD)/bootloader_defs.h
- else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/bootloader_defs.h)","")
- OPT_DEFS += -include $(KEYBOARD_PATH_2)/bootloader_defs.h
- else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/boards/$(BOARD)/bootloader_defs.h)","")
- OPT_DEFS += -include $(KEYBOARD_PATH_2)/boards/$(BOARD)/bootloader_defs.h
- else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/bootloader_defs.h)","")
- OPT_DEFS += -include $(KEYBOARD_PATH_1)/bootloader_defs.h
- else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/boards/$(BOARD)/bootloader_defs.h)","")
- OPT_DEFS += -include $(KEYBOARD_PATH_1)/boards/$(BOARD)/bootloader_defs.h
- else ifneq ("$(wildcard $(TOP_DIR)/drivers/boards/$(BOARD)/bootloader_defs.h)","")
- OPT_DEFS += -include $(TOP_DIR)/drivers/boards/$(BOARD)/bootloader_defs.h
- 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)","")
@@ -304,11 +279,6 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","")
POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h
endif
-# Save the defines and includes here, so we don't include any keymap specific ones
-PROJECT_DEFS := $(OPT_DEFS)
-PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS)
-PROJECT_CONFIG := $(CONFIG_H)
-
# Userspace setup and definitions
ifeq ("$(USER_NAME)","")
USER_NAME := $(KEYMAP)
@@ -354,23 +324,17 @@ SRC += $(TMK_COMMON_SRC)
OPT_DEFS += $(TMK_COMMON_DEFS)
EXTRALDFLAGS += $(TMK_COMMON_LDFLAGS)
-ifeq ($(PLATFORM),AVR)
-ifeq ($(strip $(PROTOCOL)), VUSB)
- include $(TMK_PATH)/protocol/vusb.mk
+include $(TMK_PATH)/$(PLATFORM_KEY).mk
+ifneq ($(strip $(PROTOCOL)),)
+ include $(TMK_PATH)/protocol/$(strip $(shell echo $(PROTOCOL) | tr '[:upper:]' '[:lower:]')).mk
else
- include $(TMK_PATH)/protocol/lufa.mk
-endif
- include $(TMK_PATH)/avr.mk
+ include $(TMK_PATH)/protocol/$(PLATFORM_KEY).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
+# TODO: remove this bodge?
+PROJECT_DEFS := $(OPT_DEFS)
+PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS)
+PROJECT_CONFIG := $(CONFIG_H)
ifeq ($(strip $(VISUALIZER_ENABLE)), yes)
VISUALIZER_DIR = $(QUANTUM_DIR)/visualizer
diff --git a/build_test.mk b/build_test.mk
index cac2cba5092..d13d9a515b8 100644
--- a/build_test.mk
+++ b/build_test.mk
@@ -41,6 +41,7 @@ all: elf
VPATH += $(COMMON_VPATH)
PLATFORM:=TEST
+PLATFORM_KEY:=test
ifneq ($(filter $(FULL_TESTS),$(TEST)),)
include tests/$(TEST)/rules.mk
diff --git a/common_features.mk b/common_features.mk
index b71dbc77e28..50b1127dc60 100644
--- a/common_features.mk
+++ b/common_features.mk
@@ -13,52 +13,42 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-SERIAL_DIR := $(QUANTUM_DIR)/serial_link
SERIAL_PATH := $(QUANTUM_PATH)/serial_link
-SERIAL_SRC := $(wildcard $(SERIAL_PATH)/protocol/*.c)
-SERIAL_SRC += $(wildcard $(SERIAL_PATH)/system/*.c)
-SERIAL_DEFS += -DSERIAL_LINK_ENABLE
-COMMON_VPATH += $(SERIAL_PATH)
+
+QUANTUM_SRC += \
+ $(QUANTUM_DIR)/quantum.c \
+ $(QUANTUM_DIR)/keymap_common.c \
+ $(QUANTUM_DIR)/keycode_config.c
ifeq ($(strip $(API_SYSEX_ENABLE)), yes)
OPT_DEFS += -DAPI_SYSEX_ENABLE
- SRC += $(QUANTUM_DIR)/api/api_sysex.c
OPT_DEFS += -DAPI_ENABLE
- SRC += $(QUANTUM_DIR)/api.c
MIDI_ENABLE=yes
+ SRC += $(QUANTUM_DIR)/api/api_sysex.c
+ SRC += $(QUANTUM_DIR)/api.c
endif
-MUSIC_ENABLE := 0
-
ifeq ($(strip $(AUDIO_ENABLE)), yes)
OPT_DEFS += -DAUDIO_ENABLE
- MUSIC_ENABLE := 1
+ MUSIC_ENABLE = yes
SRC += $(QUANTUM_DIR)/process_keycode/process_audio.c
SRC += $(QUANTUM_DIR)/process_keycode/process_clicky.c
- ifeq ($(PLATFORM),AVR)
- SRC += $(QUANTUM_DIR)/audio/audio.c
- else
- SRC += $(QUANTUM_DIR)/audio/audio_arm.c
- endif
+ SRC += $(QUANTUM_DIR)/audio/audio_$(PLATFORM_KEY).c
SRC += $(QUANTUM_DIR)/audio/voices.c
SRC += $(QUANTUM_DIR)/audio/luts.c
endif
ifeq ($(strip $(MIDI_ENABLE)), yes)
OPT_DEFS += -DMIDI_ENABLE
- MUSIC_ENABLE := 1
+ MUSIC_ENABLE = yes
SRC += $(QUANTUM_DIR)/process_keycode/process_midi.c
endif
-ifeq ($(MUSIC_ENABLE), 1)
+MUSIC_ENABLE ?= no
+ifeq ($(MUSIC_ENABLE), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_music.c
endif
-ifeq ($(strip $(COMBO_ENABLE)), yes)
- OPT_DEFS += -DCOMBO_ENABLE
- SRC += $(QUANTUM_DIR)/process_keycode/process_combo.c
-endif
-
ifeq ($(strip $(STENO_ENABLE)), yes)
OPT_DEFS += -DSTENO_ENABLE
VIRTSER_ENABLE ?= yes
@@ -80,28 +70,6 @@ ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/pointing_device.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)
- SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c
-endif
-
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c
EEPROM_DRIVER ?= vendor
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
@@ -249,31 +217,18 @@ ifeq ($(strip $(RGB_KEYCODES_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_rgb.c
endif
-ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
- OPT_DEFS += -DTAP_DANCE_ENABLE
- SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c
-endif
-
-ifeq ($(strip $(KEY_LOCK_ENABLE)), yes)
- OPT_DEFS += -DKEY_LOCK_ENABLE
- SRC += $(QUANTUM_DIR)/process_keycode/process_key_lock.c
-endif
-
ifeq ($(strip $(PRINTING_ENABLE)), yes)
OPT_DEFS += -DPRINTING_ENABLE
SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c
SRC += $(TMK_DIR)/protocol/serial_uart.c
endif
-ifeq ($(strip $(AUTO_SHIFT_ENABLE)), yes)
- OPT_DEFS += -DAUTO_SHIFT_ENABLE
- SRC += $(QUANTUM_DIR)/process_keycode/process_auto_shift.c
- ifeq ($(strip $(AUTO_SHIFT_MODIFIERS)), yes)
- OPT_DEFS += -DAUTO_SHIFT_MODIFIERS
- endif
-endif
-
ifeq ($(strip $(SERIAL_LINK_ENABLE)), yes)
+ SERIAL_SRC := $(wildcard $(SERIAL_PATH)/protocol/*.c)
+ SERIAL_SRC += $(wildcard $(SERIAL_PATH)/system/*.c)
+ SERIAL_DEFS += -DSERIAL_LINK_ENABLE
+ COMMON_VPATH += $(SERIAL_PATH)
+
SRC += $(patsubst $(QUANTUM_PATH)/%,%,$(SERIAL_SRC))
OPT_DEFS += $(SERIAL_DEFS)
VAPTH += $(SERIAL_PATH)
@@ -315,11 +270,7 @@ ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
else
SRC += $(QUANTUM_DIR)/backlight/backlight_driver_common.c
ifeq ($(strip $(BACKLIGHT_DRIVER)), pwm)
- ifeq ($(PLATFORM),AVR)
- SRC += $(QUANTUM_DIR)/backlight/backlight_avr.c
- else
- SRC += $(QUANTUM_DIR)/backlight/backlight_arm.c
- endif
+ SRC += $(QUANTUM_DIR)/backlight/backlight_$(PLATFORM_KEY).c
else
SRC += $(QUANTUM_DIR)/backlight/backlight_$(strip $(BACKLIGHT_DRIVER)).c
endif
@@ -371,34 +322,16 @@ ifeq ($(strip $(USB_HID_ENABLE)), yes)
include $(TMK_DIR)/protocol/usb_hid.mk
endif
+ifeq ($(strip $(WPM_ENABLE)), yes)
+ SRC += $(QUANTUM_DIR)/wpm.c
+ OPT_DEFS += -DWPM_ENABLE
+endif
+
ifeq ($(strip $(ENCODER_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/encoder.c
OPT_DEFS += -DENCODER_ENABLE
endif
-HAPTIC_ENABLE ?= no
-ifneq ($(strip $(HAPTIC_ENABLE)),no)
- COMMON_VPATH += $(DRIVER_PATH)/haptic
- SRC += haptic.c
- OPT_DEFS += -DHAPTIC_ENABLE
-endif
-
-ifneq ($(filter DRV2605L, $(HAPTIC_ENABLE)), )
- SRC += DRV2605L.c
- QUANTUM_LIB_SRC += i2c_master.c
- OPT_DEFS += -DDRV2605L
-endif
-
-ifneq ($(filter SOLENOID, $(HAPTIC_ENABLE)), )
- SRC += solenoid.c
- OPT_DEFS += -DSOLENOID_ENABLE
-endif
-
-ifeq ($(strip $(HD44780_ENABLE)), yes)
- SRC += drivers/avr/hd44780.c
- OPT_DEFS += -DHD44780_ENABLE
-endif
-
ifeq ($(strip $(VELOCIKEY_ENABLE)), yes)
OPT_DEFS += -DVELOCIKEY_ENABLE
SRC += $(QUANTUM_DIR)/velocikey.c
@@ -417,26 +350,11 @@ ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/dynamic_keymap.c
endif
-ifeq ($(strip $(LEADER_ENABLE)), yes)
- SRC += $(QUANTUM_DIR)/process_keycode/process_leader.c
- OPT_DEFS += -DLEADER_ENABLE
-endif
-
-
ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
- SRC += $(QUANTUM_DIR)/dip_switch.c
- OPT_DEFS += -DDIP_SWITCH_ENABLE
+ OPT_DEFS += -DDIP_SWITCH_ENABLE
+ SRC += $(QUANTUM_DIR)/dip_switch.c
endif
-include $(DRIVER_PATH)/qwiic/qwiic.mk
-
-QUANTUM_SRC:= \
- $(QUANTUM_DIR)/quantum.c \
- $(QUANTUM_DIR)/keymap_common.c \
- $(QUANTUM_DIR)/keycode_config.c
-
-
-
VALID_CUSTOM_MATRIX_TYPES:= yes lite no
CUSTOM_MATRIX ?= no
@@ -494,6 +412,29 @@ ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
COMMON_VPATH += $(QUANTUM_PATH)/split_common
endif
+HAPTIC_ENABLE ?= no
+ifneq ($(strip $(HAPTIC_ENABLE)),no)
+ COMMON_VPATH += $(DRIVER_PATH)/haptic
+ SRC += haptic.c
+ OPT_DEFS += -DHAPTIC_ENABLE
+endif
+
+ifneq ($(filter DRV2605L, $(HAPTIC_ENABLE)), )
+ SRC += DRV2605L.c
+ QUANTUM_LIB_SRC += i2c_master.c
+ OPT_DEFS += -DDRV2605L
+endif
+
+ifneq ($(filter SOLENOID, $(HAPTIC_ENABLE)), )
+ SRC += solenoid.c
+ OPT_DEFS += -DSOLENOID_ENABLE
+endif
+
+ifeq ($(strip $(HD44780_ENABLE)), yes)
+ SRC += drivers/avr/hd44780.c
+ OPT_DEFS += -DHD44780_ENABLE
+endif
+
ifeq ($(strip $(OLED_DRIVER_ENABLE)), yes)
OPT_DEFS += -DOLED_DRIVER_ENABLE
COMMON_VPATH += $(DRIVER_PATH)/oled
@@ -501,10 +442,34 @@ ifeq ($(strip $(OLED_DRIVER_ENABLE)), yes)
SRC += oled_driver.c
endif
+include $(DRIVER_PATH)/qwiic/qwiic.mk
+
+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)
+ SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c
+endif
+
SPACE_CADET_ENABLE ?= yes
ifeq ($(strip $(SPACE_CADET_ENABLE)), yes)
- SRC += $(QUANTUM_DIR)/process_keycode/process_space_cadet.c
- OPT_DEFS += -DSPACE_CADET_ENABLE
+ SRC += $(QUANTUM_DIR)/process_keycode/process_space_cadet.c
+ OPT_DEFS += -DSPACE_CADET_ENABLE
endif
MAGIC_ENABLE ?= yes
@@ -523,3 +488,31 @@ ifeq ($(strip $(DYNAMIC_MACRO_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_dynamic_macro.c
OPT_DEFS += -DDYNAMIC_MACRO_ENABLE
endif
+
+ifeq ($(strip $(COMBO_ENABLE)), yes)
+ SRC += $(QUANTUM_DIR)/process_keycode/process_combo.c
+ OPT_DEFS += -DCOMBO_ENABLE
+endif
+
+ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
+ SRC += $(QUANTUM_DIR)/process_keycode/process_tap_dance.c
+ OPT_DEFS += -DTAP_DANCE_ENABLE
+endif
+
+ifeq ($(strip $(KEY_LOCK_ENABLE)), yes)
+ SRC += $(QUANTUM_DIR)/process_keycode/process_key_lock.c
+ OPT_DEFS += -DKEY_LOCK_ENABLE
+endif
+
+ifeq ($(strip $(LEADER_ENABLE)), yes)
+ SRC += $(QUANTUM_DIR)/process_keycode/process_leader.c
+ OPT_DEFS += -DLEADER_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
diff --git a/docs/_summary.md b/docs/_summary.md
index e7e9fa13205..75b9a83e66b 100644
--- a/docs/_summary.md
+++ b/docs/_summary.md
@@ -6,6 +6,7 @@
* [Testing and Debugging](newbs_testing_debugging.md)
* [Getting Help/Support](support.md)
* [Other Resources](newbs_learn_more_resources.md)
+ * [Syllabus](syllabus.md)
* FAQs
* [General FAQ](faq_general.md)
@@ -52,7 +53,7 @@
* Simple Keycodes
* [Full List](keycodes.md)
* [Basic Keycodes](keycodes_basic.md)
- * [Layer Switching](feature_advanced_keycodes.md)
+ * [Modifier Keys](feature_advanced_keycodes.md)
* [Quantum Keycodes](quantum_keycodes.md)
* Advanced Keycodes
@@ -71,14 +72,17 @@
* [Combos](feature_combo.md)
* [Debounce API](feature_debounce_type.md)
* [Key Lock](feature_key_lock.md)
+ * [Layers](feature_layers.md)
* [One Shot Keys](one_shot_keys.md)
* [Pointing Device](feature_pointing_device.md)
+ * [Raw HID](feature_rawhid.md)
* [Swap Hands](feature_swap_hands.md)
* [Tap Dance](feature_tap_dance.md)
* [Tap-Hold Configuration](tap_hold.md)
* [Terminal](feature_terminal.md)
* [Unicode](feature_unicode.md)
* [Userspace](feature_userspace.md)
+ * [WPM Calculation](feature_wpm.md)
* Hardware Features
* Displays
@@ -119,6 +123,7 @@
* [Drivers](hardware_drivers.md)
* [ADC Driver](adc_driver.md)
* [I2C Driver](i2c_driver.md)
+ * [SPI Driver](spi_driver.md)
* [WS2812 Driver](ws2812_driver.md)
* [EEPROM Driver](eeprom_driver.md)
* [GPIO Controls](internals_gpio_control.md)
@@ -133,6 +138,10 @@
* [Development Environment](api_development_environment.md)
* [Architecture Overview](api_development_overview.md)
+ * Hardware Platform Development
+ * Arm/ChibiOS
+ * [Early initialization](platformdev_chibios_earlyinit.md)
+
* QMK Reference
* [Contributing to QMK](contributing.md)
* [Translating the QMK Docs](translating.md)
diff --git a/docs/adc_driver.md b/docs/adc_driver.md
index d808a82158a..7c4e05efc4b 100644
--- a/docs/adc_driver.md
+++ b/docs/adc_driver.md
@@ -2,7 +2,7 @@
QMK can leverage the Analog-to-Digital Converter (ADC) on supported MCUs to measure voltages on certain pins. This can be useful for implementing things such as battery level indicators for Bluetooth keyboards, or volume controls using a potentiometer, as opposed to a [rotary encoder](feature_encoders.md).
-This driver currently supports both AVR and a limited selection of ARM devices. On AVR devices, the values returned are 10-bit integers (0-1023) mapped between 0V and VCC (usually 5V or 3.3V). On supported ARM devices, there is more flexibility in control of operation through `#define`s, but by default the values returned are 12-bit integers (0-4095) mapped between 0V and VCC (usually 3.3V).
+This driver currently supports both AVR and a limited selection of ARM devices. The values returned are 10-bit integers (0-1023) mapped between 0V and VCC (usually 5V or 3.3V for AVR, 3.3V only for ARM), however on ARM there is more flexibility in control of operation through `#define`s if you need more precision.
## Usage
diff --git a/docs/cli.md b/docs/cli.md
index 760fe1cdb56..01641bd8b87 100644
--- a/docs/cli.md
+++ b/docs/cli.md
@@ -6,7 +6,7 @@ The QMK CLI makes building and working with QMK keyboards easier. We have provid
### Requirements :id=requirements
-The CLI requires Python 3.5 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI.
+QMK requires Python 3.6 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI.
### Install Using Homebrew (macOS, some Linux) :id=install-using-homebrew
@@ -21,7 +21,7 @@ qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build
### Install Using easy_install or pip :id=install-using-easy_install-or-pip
-If your system is not listed above you can install QMK manually. First ensure that you have python 3.5 (or later) installed and have installed pip. Then install QMK with this command:
+If your system is not listed above you can install QMK manually. First ensure that you have python 3.6 (or later) installed and have installed pip. Then install QMK with this command:
```
pip3 install qmk
diff --git a/docs/cli_commands.md b/docs/cli_commands.md
index eb5362bd295..eff5321bdb1 100644
--- a/docs/cli_commands.md
+++ b/docs/cli_commands.md
@@ -1,38 +1,6 @@
# QMK CLI Commands
-# CLI Commands
-
-## `qmk cformat`
-
-This command formats C code using clang-format.
-
-Run it with no arguments to format all core code that has been changed. Default checks `origin/master` with `git diff`, branch can be changed using `-b `
-
-Run it with `-a` to format all core code, or pass filenames on the command line to run it on specific files.
-
-**Usage for specified files**:
-
-```
-qmk cformat [file1] [file2] [...] [fileN]
-```
-
-**Usage for all core files**:
-
-```
-qmk cformat -a
-```
-
-**Usage for only changed files against origin/master**:
-
-```
-qmk cformat
-```
-
-**Usage for only changed files against branch_name**:
-
-```
-qmk cformat -b branch_name
-```
+# User Commands
## `qmk compile`
@@ -136,16 +104,6 @@ This command lets you configure the behavior of QMK. For the full `qmk config` d
qmk config [-ro] [config_token1] [config_token2] [...] [config_tokenN]
```
-## `qmk docs`
-
-This command starts a local HTTP server which you can use for browsing or improving the docs. Default port is 8936.
-
-**Usage**:
-
-```
-qmk docs [-p PORT]
-```
-
## `qmk doctor`
This command examines your environment and alerts you to potential build or flash problems. It can fix many of them if you want it to.
@@ -180,28 +138,6 @@ Creates a keymap.c from a QMK Configurator export.
qmk json2c [-o OUTPUT] filename
```
-## `qmk kle2json`
-
-This command allows you to convert from raw KLE data to QMK Configurator JSON. It accepts either an absolute file path, or a file name in the current directory. By default it will not overwrite `info.json` if it is already present. Use the `-f` or `--force` flag to overwrite.
-
-**Usage**:
-
-```
-qmk kle2json [-f]
-```
-
-**Examples**:
-
-```
-$ qmk kle2json kle.txt
-☒ File info.json already exists, use -f or --force to overwrite.
-```
-
-```
-$ qmk kle2json -f kle.txt -f
-Ψ Wrote out to info.json
-```
-
## `qmk list-keyboards`
This command lists all the keyboards currently defined in `qmk_firmware`
@@ -232,6 +168,74 @@ This command creates a new keymap based on a keyboard's existing default keymap.
qmk new-keymap [-kb KEYBOARD] [-km KEYMAP]
```
+---
+
+# Developer Commands
+
+## `qmk cformat`
+
+This command formats C code using clang-format.
+
+Run it with no arguments to format all core code that has been changed. Default checks `origin/master` with `git diff`, branch can be changed using `-b `
+
+Run it with `-a` to format all core code, or pass filenames on the command line to run it on specific files.
+
+**Usage for specified files**:
+
+```
+qmk cformat [file1] [file2] [...] [fileN]
+```
+
+**Usage for all core files**:
+
+```
+qmk cformat -a
+```
+
+**Usage for only changed files against origin/master**:
+
+```
+qmk cformat
+```
+
+**Usage for only changed files against branch_name**:
+
+```
+qmk cformat -b branch_name
+```
+
+## `qmk docs`
+
+This command starts a local HTTP server which you can use for browsing or improving the docs. Default port is 8936.
+
+**Usage**:
+
+```
+qmk docs [-p PORT]
+```
+
+## `qmk kle2json`
+
+This command allows you to convert from raw KLE data to QMK Configurator JSON. It accepts either an absolute file path, or a file name in the current directory. By default it will not overwrite `info.json` if it is already present. Use the `-f` or `--force` flag to overwrite.
+
+**Usage**:
+
+```
+qmk kle2json [-f]
+```
+
+**Examples**:
+
+```
+$ qmk kle2json kle.txt
+☒ File info.json already exists, use -f or --force to overwrite.
+```
+
+```
+$ qmk kle2json -f kle.txt -f
+Ψ Wrote out to info.json
+```
+
## `qmk pyformat`
This command formats python code in `qmk_firmware`.
@@ -251,3 +255,4 @@ This command runs the python test suite. If you make changes to python code you
```
qmk pytest
```
+
diff --git a/docs/cli_development.md b/docs/cli_development.md
index cc8c59d067e..af86686c070 100644
--- a/docs/cli_development.md
+++ b/docs/cli_development.md
@@ -6,6 +6,18 @@ This document has useful information for developers wishing to write new `qmk` s
The QMK CLI operates using the subcommand pattern made famous by git. The main `qmk` script is simply there to setup the environment and pick the correct entrypoint to run. Each subcommand is a self-contained module with an entrypoint (decorated by `@cli.subcommand()`) that performs some action and returns a shell returncode, or None.
+## Developer mode:
+
+If you intend to maintain keyboards and/or contribute to QMK, you can enable the CLI's "Developer" mode:
+
+`qmk config user.developer=True`
+
+This will allow you to see all available subcommands.
+**Note:** You will have to install additional requirements:
+```bash
+python3 -m pip install -r requirements-dev.txt
+```
+
# Subcommands
[MILC](https://github.com/clueboard/milc) is the CLI framework `qmk` uses to handle argument parsing, configuration, logging, and many other features. It lets you focus on writing your tool without wasting your time writing glue code.
@@ -32,7 +44,7 @@ def hello(cli):
First we import the `cli` object from `milc`. This is how we interact with the user and control the script's behavior. We use `@cli.argument()` to define a command line flag, `--name`. This also creates a configuration variable named `hello.name` (and the corresponding `user.name`) which the user can set so they don't have to specify the argument. The `cli.subcommand()` decorator designates this function as a subcommand. The name of the subcommand will be taken from the name of the function.
-Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.5/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator.
+Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.6/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator.
# User Interaction
@@ -44,13 +56,13 @@ There are two main methods for outputting text in a subcommand- `cli.log` and `c
You can use special tokens to colorize your text, to make it easier to understand the output of your program. See [Colorizing Text](#colorizing-text) below.
-Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.5/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example.
+Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.6/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example.
You should never use the format operator (`%`) directly, always pass values as arguments.
### Logging (`cli.log`)
-The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.5/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong.
+The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.6/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong.
The default log level is `INFO`. If the user runs `qmk -v ` the default log level will be set to `DEBUG`.
diff --git a/docs/coding_conventions_c.md b/docs/coding_conventions_c.md
index 16e28b28849..f4e359611b7 100644
--- a/docs/coding_conventions_c.md
+++ b/docs/coding_conventions_c.md
@@ -20,11 +20,11 @@ Most of our style is pretty easy to pick up on, but right now it's not entirely
* We accept both forms of preprocessor if's: `#ifdef DEFINED` and `#if defined(DEFINED)`
* If you are not sure which to prefer use the `#if defined(DEFINED)` form.
* Do not change existing code from one style to the other, except when moving to a multiple condition `#if`.
- * Do not put whitespace between `#` and `if`.
- * When deciding how (or if) to indent directives keep these points in mind:
- * Readability is more important than consistency.
- * Follow the file's existing style. If the file is mixed follow the style that makes sense for the section you are modifying.
- * When choosing to indent you can follow the indention level of the surrounding C code, or preprocessor directives can have their own indent level. Choose the style that best communicates the intent of your code.
+* When deciding how (or if) to indent preprocessor directives, keep these points in mind:
+ * Readability is more important than consistency.
+ * Follow the file's existing style. If the file is mixed, follow the style that makes sense for the section you are modifying.
+ * When indenting, keep the hash at the start of the line and add whitespace between `#` and `if`, starting with 4 spaces after the `#`.
+ * You can follow the indention level of the surrounding C code, or preprocessor directives can have their own indentation levels. Choose the style that best communicates the intent of your code.
Here is an example for easy reference:
diff --git a/docs/coding_conventions_python.md b/docs/coding_conventions_python.md
index 1aefc044e84..47dff7f8eea 100644
--- a/docs/coding_conventions_python.md
+++ b/docs/coding_conventions_python.md
@@ -2,7 +2,7 @@
Most of our style follows PEP8 with some local modifications to make things less nit-picky.
-* We target Python 3.5 for compatability with all supported platforms.
+* We target Python 3.6 for compatability with all supported platforms.
* We indent using four (4) spaces (soft tabs)
* We encourage liberal use of comments
* Think of them as a story describing the feature
@@ -317,7 +317,7 @@ At the time of this writing our tests are not very comprehensive. Looking at the
## Integration Tests
-Integration tests can be found in `lib/python/qmk/tests/test_cli_commands.py`. This is where CLI commands are actually run and their overall behavior is verified. We use [`subprocess`](https://docs.python.org/3.5/library/subprocess.html#module-subprocess) to launch each CLI command and a combination of checking output and returncode to determine if the right thing happened.
+Integration tests can be found in `lib/python/qmk/tests/test_cli_commands.py`. This is where CLI commands are actually run and their overall behavior is verified. We use [`subprocess`](https://docs.python.org/3.6/library/subprocess.html#module-subprocess) to launch each CLI command and a combination of checking output and returncode to determine if the right thing happened.
## Unit Tests
diff --git a/docs/config_options.md b/docs/config_options.md
index 661cfccce6d..b96079e6054 100644
--- a/docs/config_options.md
+++ b/docs/config_options.md
@@ -115,9 +115,9 @@ If you define these options you will disable the associated feature, which can s
* `#define NO_ACTION_ONESHOT`
* disable one-shot modifiers
* `#define NO_ACTION_MACRO`
- * disable old style macro handling: MACRO() & action_get_macro
+ * disable old-style macro handling using `MACRO()`, `action_get_macro()` _(deprecated)_
* `#define NO_ACTION_FUNCTION`
- * disable calling of action_function() from the fn_actions array (deprecated)
+ * disable old-style function handling using `fn_actions`, `action_function()` _(deprecated)_
## Features That Can Be Enabled
@@ -191,7 +191,12 @@ If you define these options you will enable the associated feature, which may in
* `#define RGBLIGHT_ANIMATIONS`
* run RGB animations
* `#define RGBLIGHT_LAYERS`
- * Lets you define [lighting layers](feature_rgblight.md) that can be toggled on or off. Great for showing the current keyboard layer or caps lock state.
+ * Lets you define [lighting layers](feature_rgblight.md?id=lighting-layers) that can be toggled on or off. Great for showing the current keyboard layer or caps lock state.
+* `#define RGBLIGHT_MAX_LAYERS`
+ * Defaults to 8. Can be expanded up to 32 if more [lighting layers](feature_rgblight.md?id=lighting-layers) are needed.
+ * Note: Increasing the maximum will increase the firmware size and slow sync on split keyboards.
+* `#define RGBLIGHT_LAYER_BLINK`
+ * Adds ability to [blink](feature_rgblight.md?id=lighting-layer-blink) a lighting layer for a specified number of milliseconds (e.g. to acknowledge an action).
* `#define RGBLED_NUM 12`
* number of LEDs
* `#define RGBLIGHT_SPLIT`
@@ -317,10 +322,10 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
* `LAYOUTS`
* A list of [layouts](feature_layouts.md) this keyboard supports.
* `LINK_TIME_OPTIMIZATION_ENABLE`
- * Enables Link Time Optimization (`LTO`) when compiling the keyboard. This makes the process take longer, but can significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable). However, this will automatically disable the old Macros and Functions features automatically, as these break when `LTO` is enabled.
- It does this by automatically defining `NO_ACTION_MACRO` and `NO_ACTION_FUNCTION`
+ * Enables Link Time Optimization (LTO) when compiling the keyboard. This makes the process take longer, but it can significantly reduce the compiled size (and since the firmware is small, the added time is not noticeable).
+However, this will automatically disable the legacy TMK Macros and Functions features, as these break when LTO is enabled. It does this by automatically defining `NO_ACTION_MACRO` and `NO_ACTION_FUNCTION`. (Note: This does not affect QMK [Macros](feature_macros.md) and [Layers](feature_layers.md).)
* `LTO_ENABLE`
- * It has the same meaning as LINK_TIME_OPTIMIZATION_ENABLE. You can use `LTO_ENABLE` instead of `LINK_TIME_OPTIMIZATION_ENABLE`.
+ * Has the same meaning as `LINK_TIME_OPTIMIZATION_ENABLE`. You can use `LTO_ENABLE` instead of `LINK_TIME_OPTIMIZATION_ENABLE`.
## AVR MCU Options
* `MCU = atmega32u4`
diff --git a/docs/de/_summary.md b/docs/de/_summary.md
index a894420a2b5..19c75ecd38f 100644
--- a/docs/de/_summary.md
+++ b/docs/de/_summary.md
@@ -98,6 +98,7 @@
* [ISP Flashing Guide](de/isp_flashing_guide.md)
* [ARM Debugging Guide](de/arm_debugging.md)
* [I2C Driver](de/i2c_driver.md)
+ * [SPI Driver](de/spi_driver.md)
* [GPIO Controls](de/internals_gpio_control.md)
* [Proton C Conversion](de/proton_c_conversion.md)
diff --git a/docs/es/_summary.md b/docs/es/_summary.md
index 7dffea7d2b0..b58d825f746 100644
--- a/docs/es/_summary.md
+++ b/docs/es/_summary.md
@@ -98,6 +98,7 @@
* [Guía de flasheado de ISP](es/isp_flashing_guide.md)
* [Guía de depuración de ARM](es/arm_debugging.md)
* [Driver I2C](es/i2c_driver.md)
+ * [Driver SPI](es/spi_driver.md)
* [Controles GPIO](es/internals_gpio_control.md)
* [Conversión Proton C](es/proton_c_conversion.md)
diff --git a/docs/faq_debug.md b/docs/faq_debug.md
index 6c66defbd44..08c84fe4fd3 100644
--- a/docs/faq_debug.md
+++ b/docs/faq_debug.md
@@ -160,10 +160,3 @@ As of now root of its cause is not clear but some build options seem to be relat
https://github.com/tmk/tmk_keyboard/issues/266
https://geekhack.org/index.php?topic=41989.msg1967778#msg1967778
-
-
-
-## FLIP Doesn't Work
-### `AtLibUsbDfu.dll` Not Found
-Remove current driver and reinstall one FLIP provides from DeviceManager.
-http://imgur.com/a/bnwzy
diff --git a/docs/feature_advanced_keycodes.md b/docs/feature_advanced_keycodes.md
index 4f970c6b347..b8664074a7c 100644
--- a/docs/feature_advanced_keycodes.md
+++ b/docs/feature_advanced_keycodes.md
@@ -1,46 +1,3 @@
-# Switching and Toggling Layers :id=switching-and-toggling-layers
-
-These functions allow you to activate layers in various ways. Note that layers are not generally independent layouts -- multiple layers can be activated at once, and it's typical for layers to use `KC_TRNS` to allow keypresses to pass through to lower layers. For a detailed explanation of layers, see [Keymap Overview](keymap.md#keymap-and-layers). When using momentary layer switching with MO(), LM(), TT(), or LT(), make sure to leave the key on the above layers transparent or it may not work as intended.
-
-* `DF(layer)` - switches the default layer. The default layer is the always-active base layer that other layers stack on top of. See below for more about the default layer. This might be used to switch from QWERTY to Dvorak layout. (Note that this is a temporary switch that only persists until the keyboard loses power. To modify the default layer in a persistent way requires deeper customization, such as calling the `set_single_persistent_default_layer` function inside of [process_record_user](custom_quantum_functions.md#programming-the-behavior-of-any-keycode).)
-* `MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated.
-* `LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15 and the left modifiers: `MOD_LCTL`, `MOD_LSFT`, `MOD_LALT`, `MOD_LGUI` (note the use of `MOD_` constants instead of `KC_`). These modifiers can be combined using bitwise OR, e.g. `LM(_RAISE, MOD_LCTL | MOD_LALT)`.
-* `LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. Only supports layers 0-15.
-* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. See [One Shot Keys](one_shot_keys.md) for details and additional functionality.
-* `TG(layer)` - toggles *layer*, activating it if it's inactive and vice versa
-* `TO(layer)` - activates *layer* and de-activates all other layers (except your default layer). This function is special, because instead of just adding/removing one layer to your active layer stack, it will completely replace your current active layers, uniquely allowing you to replace higher layers with a lower one. This is activated on keydown (as soon as the key is pressed).
-* `TT(layer)` - Layer Tap-Toggle. If you hold the key down, *layer* is activated, and then is de-activated when you let go (like `MO`). If you repeatedly tap it, the layer will be toggled on or off (like `TG`). It needs 5 taps by default, but you can change this by defining `TAPPING_TOGGLE` -- for example, `#define TAPPING_TOGGLE 2` to toggle on just two taps.
-
-## Caveats
-
-Currently, `LT()` and `MT()` are limited to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. Modifiers specified as part of a Layer Tap or Mod Tap's keycode will be ignored. If you need to apply modifiers to your tapped keycode, [Tap Dance](feature_tap_dance.md#example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys) can be used to accomplish this.
-
-Additionally, if at least one right-handed modifier is specified in a Mod Tap or Layer Tap, it will cause all modifiers specified to become right-handed, so it is not possible to mix and match the two.
-
-# Working with Layers
-
-Care must be taken when switching layers, it's possible to lock yourself into a layer with no way to deactivate that layer (without unplugging your keyboard.) We've created some guidelines to help users avoid the most common problems.
-
-## Beginners
-
-If you are just getting started with QMK you will want to keep everything simple. Follow these guidelines when setting up your layers:
-
-* Setup layer 0 as your default, "base" layer. This is your normal typing layer, and could be whatever layout you want (qwerty, dvorak, colemak, etc.). It's important to set this as the lowest layer since it will typically have most or all of the keyboard's keys defined, so would block other layers from having any effect if it were above them (i.e., had a higher layer number).
-* Arrange your layers in a "tree" layout, with layer 0 as the root. Do not try to enter the same layer from more than one other layer.
-* In a layer's keymap, only reference higher-numbered layers. Because layers are processed from the highest-numbered (topmost) active layer down, modifying the state of lower layers can be tricky and error-prone.
-
-## Intermediate Users
-
-Sometimes you need more than one base layer. For example, if you want to switch between QWERTY and Dvorak, switch between layouts for different countries, or switch your layout for different videogames. Your base layers should always be the lowest numbered layers. When you have multiple base layers you should always treat them as mutually exclusive. When one base layer is on the others are off.
-
-## Advanced Users
-
-Once you have a good feel for how layers work and what you can do, you can get more creative. The rules listed in the beginner section will help you be successful by avoiding some of the tricker details but they can be constraining, especially for ultra-compact keyboard users. Understanding how layers work will allow you to use them in more advanced ways.
-
-Layers stack on top of each other in numerical order. When determining what a keypress does, QMK scans the layers from the top down, stopping when it reaches the first active layer that is not set to `KC_TRNS`. As a result if you activate a layer that is numerically lower than your current layer, and your current layer (or another layer that is active and higher than your target layer) has something other than `KC_TRNS`, that is the key that will be sent, not the key on the layer you just activated. This is the cause of most people's "why doesn't my layer get switched" problem.
-
-Sometimes, you might want to switch between layers in a macro or as part of a tap dance routine. `layer_on` activates a layer, and `layer_off` deactivates it. More layer-related functions can be found in [action_layer.h](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/action_layer.h).
-
# Modifier Keys :id=modifier-keys
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.
@@ -49,11 +6,11 @@ These allow you to combine a modifier with a keycode. When pressed, the keydown
|----------|-------------------------------|----------------------------------------------------|
|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
-|`LALT(kc)`|`A(kc)` |Hold Left Alt and press `kc` |
+|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` |
|`LGUI(kc)`|`G(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)`|`ALGR(kc)` |Hold Right Alt and press `kc` |
+|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt and press `kc` |
|`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)` |Hold Right GUI 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` |
@@ -61,12 +18,16 @@ These allow you to combine a modifier with a keycode. When pressed, the keydown
|`MEH(kc)` | |Hold Left Control, Shift and Alt and press `kc` |
|`HYPR(kc)`| |Hold Left Control, Shift, Alt and GUI 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.
+You can also chain them, for example `LCTL(LALT(KC_DEL))` or `C(A(KC_DEL))` makes a key that sends Control+Alt+Delete with a single keypress.
-# Legacy Content
+# Legacy Content :id=legacy-content
This page used to encompass a large set of features. We have moved many sections that used to be part of this page to their own pages. Everything below this point is simply a redirect so that people following old links on the web find what they're looking for.
+## Layers :id=switching-and-toggling-layers
+
+* [Layers](feature_layers.md)
+
## Mod-Tap :id=mod-tap
* [Mod-Tap](mod_tap.md)
diff --git a/docs/feature_bootmagic.md b/docs/feature_bootmagic.md
index 54ebd0867ad..f084052cc74 100644
--- a/docs/feature_bootmagic.md
+++ b/docs/feature_bootmagic.md
@@ -123,7 +123,7 @@ If you would like to change the hotkey assignments for Bootmagic, `#define` thes
# Bootmagic Lite :id=bootmagic-lite
-In addition to the full blown Bootmagic feature, is the Bootmagic Lite feature that only handles jumping into the bootloader. This is great for boards that don't have a physical reset button but you need a way to jump into the bootloader, and don't want to deal with the headache that Bootmagic can cause.
+In addition to the full blown Bootmagic feature, is the Bootmagic Lite feature that only handles jumping into the bootloader. This is great for boards that don't have a physical reset button but you need a way to jump into the bootloader, and don't want to deal with the headache that Bootmagic can cause.
To enable this version of Bootmagic, you need to enable it in your `rules.mk` with:
@@ -131,7 +131,7 @@ To enable this version of Bootmagic, you need to enable it in your `rules.mk` wi
BOOTMAGIC_ENABLE = lite
```
-Additionally, you may want to specify which key to use. This is especially useful for keyboards that have unusual matrices. To do so, you need to specify the row and column of the key that you want to use. Add these entries to your `config.h` file:
+Additionally, you may want to specify which key to use. This is especially useful for keyboards that have unusual matrices. To do so, you need to specify the row and column of the key that you want to use. Add these entries to your `config.h` file:
```c
#define BOOTMAGIC_LITE_ROW 0
@@ -144,9 +144,20 @@ And to trigger the bootloader, you hold this key down when plugging the keyboard
!> Using bootmagic lite will **always reset** the EEPROM, so you will lose any settings that have been saved.
+## Split Keyboards
+
+When handedness is predetermined via an option like `SPLIT_HAND_PIN`, you might need to configure a different key between halves. This To do so, add these entries to your `config.h` file:
+
+```c
+#define BOOTMAGIC_LITE_ROW_RIGHT 4
+#define BOOTMAGIC_LITE_COLUMN_RIGHT 1
+```
+
+By default, these values are not set.
+
## Advanced Bootmagic Lite
-The `bootmagic_lite` function is defined weakly, so that you can replace this in your code, if you need. A great example of this is the Zeal60 boards that have some additional handling needed.
+The `bootmagic_lite` function is defined weakly, so that you can replace this in your code, if you need. A great example of this is the Zeal60 boards that have some additional handling needed.
To replace the function, all you need to do is add something like this to your code:
@@ -163,4 +174,4 @@ void bootmagic_lite(void) {
}
```
-You can additional feature here. For instance, resetting the eeprom or requiring additional keys to be pressed to trigger bootmagic. Keep in mind that `bootmagic_lite` is called before a majority of features are initialized in the firmware.
+You can additional feature here. For instance, resetting the eeprom or requiring additional keys to be pressed to trigger bootmagic. Keep in mind that `bootmagic_lite` is called before a majority of features are initialized in the firmware.
diff --git a/docs/feature_debounce_type.md b/docs/feature_debounce_type.md
index b5e5b61bb3d..65b4ea1e535 100644
--- a/docs/feature_debounce_type.md
+++ b/docs/feature_debounce_type.md
@@ -38,5 +38,6 @@ For use in keyboards where refreshing ```NUM_KEYS``` 8-bit counters is computati
appropriate for the ErgoDox models; the matrix is rotated 90°, and hence its "rows" are really columns, and each finger only hits a single "row" at a time in normal use.
* eager_pk - debouncing per key. On any state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key
* sym_g - debouncing per keyboard. On any state change, a global timer is set. When ```DEBOUNCE``` milliseconds of no changes has occured, all input changes are pushed.
+* sym_pk - debouncing per key. On any state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occured on that key, the key status change is pushed.
diff --git a/docs/feature_encoders.md b/docs/feature_encoders.md
index 4a0ae60c314..7799b78d6e4 100644
--- a/docs/feature_encoders.md
+++ b/docs/feature_encoders.md
@@ -61,7 +61,7 @@ void encoder_update_user(uint8_t index, bool clockwise) {
} else {
tap_code(KC_PGUP);
}
- } else if (index == 1) { /* Second encoder */
+ } else if (index == 1) { /* Second encoder */
if (clockwise) {
tap_code(KC_DOWN);
} else {
diff --git a/docs/feature_hd44780.md b/docs/feature_hd44780.md
index 0a174035be8..dc476c734f8 100644
--- a/docs/feature_hd44780.md
+++ b/docs/feature_hd44780.md
@@ -1,6 +1,6 @@
# 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://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
+This is an integration of Peter Fleury's LCD library. This page will explain the basics. [For in depth documentation visit his page.](http://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.
@@ -50,8 +50,8 @@ 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_clrsrc()`.
+To do so call `lcd_clrscr()`.
To now print something to your Display you first call `lcd_gotoxy(column, line)`. To go to the start of the first line you would call `lcd_gotoxy(0, 0)` and then print a string with `lcd_puts("example string")`.
-There are more methods available to control the display. [For in depth documentation please visit the linked page.](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html)
+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)
diff --git a/docs/feature_layers.md b/docs/feature_layers.md
new file mode 100644
index 00000000000..c6ffb24053b
--- /dev/null
+++ b/docs/feature_layers.md
@@ -0,0 +1,94 @@
+# Layers :id=layers
+
+One of the most powerful and well used features of QMK Firmware is the ability to use layers. For most people, this amounts to a function key that allows for different keys, much like what you would see on a laptop or tablet keyboard.
+
+For a detailed explanation of how the layer stack works, checkout [Keymap Overview](keymap.md#keymap-and-layers).
+
+## Switching and Toggling Layers :id=switching-and-toggling-layers
+
+These functions allow you to activate layers in various ways. Note that layers are not generally independent layouts -- multiple layers can be activated at once, and it's typical for layers to use `KC_TRNS` to allow keypresses to pass through to lower layers. When using momentary layer switching with MO(), LM(), TT(), or LT(), make sure to leave the key on the above layers transparent or it may not work as intended.
+
+* `DF(layer)` - switches the default layer. The default layer is the always-active base layer that other layers stack on top of. See below for more about the default layer. This might be used to switch from QWERTY to Dvorak layout. (Note that this is a temporary switch that only persists until the keyboard loses power. To modify the default layer in a persistent way requires deeper customization, such as calling the `set_single_persistent_default_layer` function inside of [process_record_user](custom_quantum_functions.md#programming-the-behavior-of-any-keycode).)
+* `MO(layer)` - momentarily activates *layer*. As soon as you let go of the key, the layer is deactivated.
+* `LM(layer, mod)` - Momentarily activates *layer* (like `MO`), but with modifier(s) *mod* active. Only supports layers 0-15 and the left modifiers: `MOD_LCTL`, `MOD_LSFT`, `MOD_LALT`, `MOD_LGUI` (note the use of `MOD_` constants instead of `KC_`). These modifiers can be combined using bitwise OR, e.g. `LM(_RAISE, MOD_LCTL | MOD_LALT)`.
+* `LT(layer, kc)` - momentarily activates *layer* when held, and sends *kc* when tapped. Only supports layers 0-15.
+* `OSL(layer)` - momentarily activates *layer* until the next key is pressed. See [One Shot Keys](one_shot_keys.md) for details and additional functionality.
+* `TG(layer)` - toggles *layer*, activating it if it's inactive and vice versa
+* `TO(layer)` - activates *layer* and de-activates all other layers (except your default layer). This function is special, because instead of just adding/removing one layer to your active layer stack, it will completely replace your current active layers, uniquely allowing you to replace higher layers with a lower one. This is activated on keydown (as soon as the key is pressed).
+* `TT(layer)` - Layer Tap-Toggle. If you hold the key down, *layer* is activated, and then is de-activated when you let go (like `MO`). If you repeatedly tap it, the layer will be toggled on or off (like `TG`). It needs 5 taps by default, but you can change this by defining `TAPPING_TOGGLE` -- for example, `#define TAPPING_TOGGLE 2` to toggle on just two taps.
+
+### Caveats :id=caveats
+
+Currently, `LT()` and `MT()` are limited to the [Basic Keycode set](keycodes_basic.md), meaning you can't use keycodes like `LCTL()`, `KC_TILD`, or anything greater than `0xFF`. Specifically, dual function keys like `LT` and `MT` use a 16 bit keycode. 4 bits are used for the function identifier, the next 12 are divided into the parameters. Layer Tap uses 4 bits for the layer (and is why it's limited to layers 0-16, actually), while Mod Tap does the same, 4 bits for the identifier, 4 bits for which mods are used, and all of them use 8 bits for the keycode. Because of this, the keycode used is limited to `0xFF` (0-255), which are the basic keycodes only.
+
+Expanding this would be complicated, at best. Moving to a 32-bit keycode would solve a lot of this, but would double the amount of space that the keymap matrix uses. And it could potentially cause issues, too. If you need to apply modifiers to your tapped keycode, [Tap Dance](feature_tap_dance.md#example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys) can be used to accomplish this.
+
+Additionally, if at least one right-handed modifier is specified in a Mod Tap or Layer Tap, it will cause all modifiers specified to become right-handed, so it is not possible to mix and match the two.
+
+## Working with Layers :id=working-with-layers
+
+Care must be taken when switching layers, it's possible to lock yourself into a layer with no way to deactivate that layer (without unplugging your keyboard.) We've created some guidelines to help users avoid the most common problems.
+
+### Beginners :id=beginners
+
+If you are just getting started with QMK you will want to keep everything simple. Follow these guidelines when setting up your layers:
+
+* Setup layer 0 as your default, "base" layer. This is your normal typing layer, and could be whatever layout you want (qwerty, dvorak, colemak, etc.). It's important to set this as the lowest layer since it will typically have most or all of the keyboard's keys defined, so would block other layers from having any effect if it were above them (i.e., had a higher layer number).
+* Arrange your layers in a "tree" layout, with layer 0 as the root. Do not try to enter the same layer from more than one other layer.
+* In a layer's keymap, only reference higher-numbered layers. Because layers are processed from the highest-numbered (topmost) active layer down, modifying the state of lower layers can be tricky and error-prone.
+
+### Intermediate Users :id=intermediate-users
+
+Sometimes you need more than one base layer. For example, if you want to switch between QWERTY and Dvorak, switch between layouts for different countries, or switch your layout for different videogames. Your base layers should always be the lowest numbered layers. When you have multiple base layers you should always treat them as mutually exclusive. When one base layer is on the others are off.
+
+### Advanced Users :id=advanced-users
+
+Once you have a good feel for how layers work and what you can do, you can get more creative. The rules listed in the beginner section will help you be successful by avoiding some of the tricker details but they can be constraining, especially for ultra-compact keyboard users. Understanding how layers work will allow you to use them in more advanced ways.
+
+Layers stack on top of each other in numerical order. When determining what a keypress does, QMK scans the layers from the top down, stopping when it reaches the first active layer that is not set to `KC_TRNS`. As a result if you activate a layer that is numerically lower than your current layer, and your current layer (or another layer that is active and higher than your target layer) has something other than `KC_TRNS`, that is the key that will be sent, not the key on the layer you just activated. This is the cause of most people's "why doesn't my layer get switched" problem.
+
+Sometimes, you might want to switch between layers in a macro or as part of a tap dance routine. `layer_on` activates a layer, and `layer_off` deactivates it. More layer-related functions can be found in [action_layer.h](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/action_layer.h).
+
+## Functions :id=functions
+
+There are a number of functions (and variables) related to how you can use or manipulate the layers.
+
+|Function |Description |
+|----------------------------------------------|---------------------------------------------------------------------------------------------------------|
+| `layer_state_set(layer_mask)` | Directly sets the layer state (recommended, do not use unless you know what you are doing). |
+| `layer_clear()` | Clears all layers (turns them all off). |
+| `layer_move(layer)` | Turns specified layer on, and all other layers off. |
+| `layer_on(layer)` | Turns specified layer on, leaves all other layers in existing state. |
+| `layer_off(layer)` | Turns specified layer off, leaves all other layers in existing state. |
+| `layer_invert(layer)` | Interverts/toggles the state of the specified layer |
+| `layer_or(layer_mask)` | Turns on layers based on matching bits between specifed layer and existing layer state. |
+| `layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing layer state. |
+| `layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing layer state. |
+| `layer_debug(layer_mask)` | Prints out the current bit mask and highest active layer to debugger console. |
+| `default_layer_set(layer_mask)` | Directly sets the default layer state (recommended, do not use unless you know what you are doing). |
+| `default_layer_or(layer_mask)` | Turns on layers based on matching bits between specifed layer and existing default layer state. |
+| `default_layer_and(layer_mask)` | Turns on layers based on matching enabled bits between specifed layer and existing default layer state. |
+| `default_layer_xor(layer_mask)` | Turns on layers based on non-matching bits between specifed layer and existing default layer state. |
+| `default_layer_debug(layer_mask)` | Prints out the current bit mask and highest active default layer to debugger console. |
+| [`set_single_persistent_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer) | Sets the default layer and writes it to persistent memory (EEPROM). |
+| [`update_tri_layer(x, y, z)`](ref_functions.md#update_tri_layerx-y-z) | Checks if layers `x` and `y` are both on, and sets `z` based on that (on if both on, otherwise off). |
+| [`update_tri_layer_state(state, x, y, z)`](ref_functions.md#update_tri_layer_statestate-x-y-z) | Does the same as `update_tri_layer(x, y, z)`, but from `layer_state_set_*` functions. |
+
+
+In additional to the functions that you can call, there are a number of callback functions that get called every time the layer changes. This passed the layer state to the function, which can be read or modified.
+
+|Callbacks |Description |
+|-----------------------------------------------------|----------------------------------------------------------------------------------------|
+| `layer_state_set_kb(layer_state_t state)` | Callback for layer functions, for keyboard. |
+| `layer_state_set_user(layer_state_t state)` | Callback for layer functions, for users. |
+| `default_layer_state_set_kb(layer_state_t state)` | Callback for default layer functions, for keyboard. Called on keyboard initialization. |
+| `default_layer_state_set_user(layer_state_t state)` | Callback for default layer functions, for users. Called on keyboard initialization. |
+
+?> For additional details on how you can use these callbacks, check out the [Layer Change Code](custom_quantum_functions.md#layer-change-code) document.
+
+|Check functions |Description |
+|-------------------------------------------|------------------------------------------------------------------------------|
+| `layer_state_cmp(cmp_layer_state, layer)` | This checks the `cmp_layer_state` to see if the specific `layer` is enabled. This is meant for use with the layer callbacks. |
+| `layer_state_is(layer)` | This checks the layer state to see if the specific `layer` is enabled. (calls `layer_state_cmp` for the global layer state). |
+
+!> There is `IS_LAYER_ON(layer)` as well, however the `layer_state_cmp` function has some additional handling to ensure that on layer 0 that it returns the correct value. Otherwise, if you check to see if layer 0 is on, you may get an incorrect value returned.
diff --git a/docs/feature_leader_key.md b/docs/feature_leader_key.md
index 1d3e2ef7f48..828d6557d3e 100644
--- a/docs/feature_leader_key.md
+++ b/docs/feature_leader_key.md
@@ -74,9 +74,9 @@ SEQ_THREE_KEYS(KC_C, KC_C, KC_C) {
## Strict Key Processing
-By default, the Leader Key feature will filter the keycode out of [`Mod-Tap`](mod_tap.md) and [`Layer Tap`](feature_advanced_keycodes.md#switching-and-toggling-layers) functions when checking for the Leader sequences. That means if you're using `LT(3, KC_A)`, it will pick this up as `KC_A` for the sequence, rather than `LT(3, KC_A)`, giving a more expected behavior for newer users.
+By default, the Leader Key feature will filter the keycode out of [`Mod-Tap`](mod_tap.md) and [`Layer Tap`](feature_layers.md#switching-and-toggling-layers) functions when checking for the Leader sequences. That means if you're using `LT(3, KC_A)`, it will pick this up as `KC_A` for the sequence, rather than `LT(3, KC_A)`, giving a more expected behavior for newer users.
-While, this may be fine for most, if you want to specify the whole keycode (eg, `LT(3, KC_A)` from the example above) in the sequence, you can enable this by added `#define LEADER_KEY_STRICT_KEY_PROCESSING` to your `config.h` file. This well then disable the filtering, and you'll need to specify the whole keycode.
+While, this may be fine for most, if you want to specify the whole keycode (eg, `LT(3, KC_A)` from the example above) in the sequence, you can enable this by added `#define LEADER_KEY_STRICT_KEY_PROCESSING` to your `config.h` file. This will then disable the filtering, and you'll need to specify the whole keycode.
## Customization
diff --git a/docs/feature_macros.md b/docs/feature_macros.md
index 99dd564bf8a..1c7705a5160 100644
--- a/docs/feature_macros.md
+++ b/docs/feature_macros.md
@@ -88,6 +88,46 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
```
+### Advanced Macros
+
+In addition to the `process_record_user()` function, is the `post_process_record_user()` function. This runs after `process_record` and can be used to do things after a keystroke has been sent. This is useful if you want to have a key pressed before and released after a normal key, for instance.
+
+In this example, we modify most normal keypresses so that `F22` is pressed before the keystroke is normally sent, and release it __only after__ it's been released.
+
+```c
+static uint8_t f22_tracker;
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case KC_A ... KC_F21: //notice how it skips over F22
+ case KC_F23 ... KC_EXSEL: //exsel is the last one before the modifier keys
+ if (record->event.pressed) {
+ register_code(KC_F22); //this means to send F22 down
+ f22_tracker++;
+ register_code(keycode);
+ return false;
+ }
+ break;
+ }
+ return true;
+}
+
+void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case KC_A ... KC_F21: //notice how it skips over F22
+ case KC_F23 ... KC_EXSEL: //exsel is the last one before the modifier keys
+ if (!record->event.pressed) {
+ f22_tracker--;
+ if (!f22_tracker) {
+ unregister_code(KC_F22); //this means to send F22 up
+ }
+ }
+ break;
+ }
+}
+```
+
+
### TAP, DOWN and UP
You may want to use keys in your macros that you can't write down, such as `Ctrl` or `Home`.
@@ -121,11 +161,11 @@ There's also a couple of mod shortcuts you can use:
* `SS_LCTL(string)`
* `SS_LSFT(string)`
-* `SS_LALT(string)`
+* `SS_LALT(string)` or `SS_LOPT(string)`
* `SS_LGUI(string)`, `SS_LCMD(string)` or `SS_LWIN(string)`
* `SS_RCTL(string)`
* `SS_RSFT(string)`
-* `SS_RALT(string)` or `SS_ALGR(string)`
+* `SS_RALT(string)`, `SS_ROPT(string)` or `SS_ALGR(string)`
* `SS_RGUI(string)`, `SS_RCMD(string)` or `SS_RWIN(string)`
These press the respective modifier, send the supplied string and then release the modifier.
diff --git a/docs/feature_ps2_mouse.md b/docs/feature_ps2_mouse.md
index ce072fbe935..c1bd8bff50a 100644
--- a/docs/feature_ps2_mouse.md
+++ b/docs/feature_ps2_mouse.md
@@ -266,6 +266,25 @@ To reverse the scroll axes you can put:
into config.h.
+### Rotate Mouse Axes :id=rotate-mouse-axes
+
+Transform the output of the device with a clockwise rotation of 90, 180, or 270
+degrees.
+
+When compensating for device orientation, rotate the output the same amount in
+the opposite direction. E.g. if the normal device orientation is considered to
+be North-facing, compensate as follows:
+
+```c
+#define PS2_MOUSE_ROTATE 270 /* Compensate for East-facing device orientation. */
+```
+```c
+#define PS2_MOUSE_ROTATE 180 /* Compensate for South-facing device orientation. */
+```
+```c
+#define PS2_MOUSE_ROTATE 90 /* Compensate for West-facing device orientation. */
+```
+
### Debug Settings :id=debug-settings
To debug the mouse, add `debug_mouse = true` or enable via bootmagic.
diff --git a/docs/feature_rawhid.md b/docs/feature_rawhid.md
new file mode 100644
index 00000000000..ed848a4c793
--- /dev/null
+++ b/docs/feature_rawhid.md
@@ -0,0 +1,65 @@
+# Raw HID
+
+Raw HID allows for bidirectional communication between QMK and the host computer over an HID interface. This has many potential use cases, such as switching keymaps on the fly or changing RGB LED colors and modes.
+
+There are two main components to getting raw HID working with your keyboard.
+
+## Keyboard firmware
+
+The implementation is fairly straightforward for the firmware.
+In your `rules.mk` add:
+
+```make
+RAW_ENABLE = yes
+```
+
+In your `keymap.c` include `"raw_hid.h"` and implement the following:
+
+```C
+void raw_hid_receive(uint8_t *data, uint8_t length) {
+ // Your code goes here. data is the packet received from host.
+}
+```
+
+The `"raw_hid.h"` header also declares `void raw_hid_send(uint8_t *data, uint8_t length);` which allows sending packets from keyboard to host. As an example, it can also be used for debugging when building your host application by returning all data back to the host.
+
+```C
+void raw_hid_receive(uint8_t *data, uint8_t length) {
+ raw_hid_send(data, length);
+}
+```
+
+`raw_hid_receive` can receive variable size packets from host with maximum length `RAW_EPSIZE`. `raw_hid_send` on the other hand can send packets to host of exactly `RAW_EPSIZE` length, therefore it should be used with data of length `RAW_EPSIZE`.
+
+Make sure to flash raw enabled firmware before proceeding with working on the host side.
+
+## Host (Windows/macOS/Linux)
+
+This is the more complicated part as it will require some digging.
+
+To connect your host computer to your keyboard with raw HID you need four pieces of information about your keyboard:
+
+1. Vendor ID
+2. Product ID
+3. Usage Page
+4. Usage
+
+The first two can easily be found in your keyboard's `config.h` in the keyboard's main directory under `VENDOR_ID` and `PRODUCT_ID`. **Usage Page** is **`0xFF60`** and **Usage** is **`0x0061`**.
+
+### Building your host
+
+You can build your host using any language that has an available HID implementation library if you don't wish to make your own. The ones we know of for popular languages are:
+
+* Node: [node-hid](https://github.com/node-hid/node-hid).
+* C: [hidapi](https://github.com/libusb/hidapi).
+* Java: [purejavahidapi](https://github.com/nyholku/purejavahidapi) and [hid4java](https://github.com/gary-rowe/hid4java).
+* Python: [pyhidapi](https://pypi.org/project/hid/).
+
+This is not an exhaustive cross-platform list but should get you started. There are no special requirements for using raw HID so any HID library should work.
+
+Now that you have all four pieces of information required to open HID interface to your keyboard. All you need to do is use your library's available functions to open the device with its ID parameters.
+
+Note that Vendor ID and Product ID are not actually required to open the device. They are used only to filter to a specific device out of the many HID devices you have plugged in. Many libraries will give you the option to open the device using Product Name or Manufacturer Name instead, `node-hid` being a prime example. This will create issues for devices with builtin USB Hub or any extra HID interfaces where you will have multiple interfaces with the same name or from the same manufacturer. The Vendor ID together with Product ID create a unique designation to a single interface and will not exhibit this problem. Therefore, even if your library doesn't require you to, it is best to use them to avoid issues.
+Unlike Vendor ID and Product ID though, Usage Page and Usage are necessary for successful communication.
+
+It should go without saying that regardless of the library you're using, you should always make sure to close the interface when finished. Depending on the operating system and your particular environment there may be issues connecting to it again afterwards with another client or another instance of the same client if it's not explicitly closed.
diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md
index 7bc21934720..2cec55ee772 100644
--- a/docs/feature_rgb_matrix.md
+++ b/docs/feature_rgb_matrix.md
@@ -396,18 +396,88 @@ The EEPROM for it is currently shared with the RGBLIGHT system (it's generally a
Where `28` is an unused index from `eeconfig.h`.
-## Suspended state :id=suspended-state
+## Functions :id=functions
-To use the suspend feature, add this to your `.c`:
+### Direct Operation :id=direct-operation
+|Function |Description |
+|--------------------------------------------|-------------|
+|`rgb_matrix_set_color_all(r, g, b)` |Set all of the LEDs to the given RGB value, where `r`/`g`/`b` are between 0 and 255 (not written to EEPROM) |
+|`rgb_matrix_set_color(index, r, g, b)` |Set a single LED to the given RGB value, where `r`/`g`/`b` are between 0 and 255, and `index` is between 0 and `DRIVER_LED_TOTAL` (not written to EEPROM) |
+
+### Disable/Enable Effects :id=disable-enable-effects
+|Function |Description |
+|--------------------------------------------|-------------|
+|`rgb_matrix_toggle()` |Toggle effect range LEDs between on and off |
+|`rgb_matrix_toggle_noeeprom()` |Toggle effect range LEDs between on and off (not written to EEPROM) |
+|`rgb_matrix_enable()` |Turn effect range LEDs on, based on their previous state |
+|`rgb_matrix_enable_noeeprom()` |Turn effect range LEDs on, based on their previous state (not written to EEPROM) |
+|`rgb_matrix_disable()` |Turn effect range LEDs off |
+|`rgb_matrix_disable_noeeprom()` |Turn effect range LEDs off (not written to EEPROM) |
+
+### Change Effect Mode :id=change-effect-mode
+|Function |Description |
+|--------------------------------------------|-------------|
+|`rgb_matrix_mode(mode)` |Set the mode, if RGB animations are enabled |
+|`rgb_matrix_mode_noeeprom(mode)` |Set the mode, if RGB animations are enabled (not written to EEPROM) |
+|`rgb_matrix_step()` |Change the mode to the next RGB animation in the list of enabled RGB animations |
+|`rgb_matrix_step_reverse()` |Change the mode to the previous RGB animation in the list of enabled RGB animations |
+|`rgb_matrix_increase_speed()` |Increases the speed of the animations |
+|`rgb_matrix_decrease_speed()` |Decreases the speed of the animations |
+
+### Change Color :id=change-color
+|Function |Description |
+|--------------------------------------------|-------------|
+|`rgb_matrix_increase_hue()` |Increase the hue for effect range LEDs. This wraps around at maximum hue |
+|`rgb_matrix_decrease_hue()` |Decrease the hue for effect range LEDs. This wraps around at minimum hue |
+|`rgb_matrix_increase_sat()` |Increase the saturation for effect range LEDs. This wraps around at maximum saturation |
+|`rgb_matrix_decrease_sat()` |Decrease the saturation for effect range LEDs. This wraps around at minimum saturation |
+|`rgb_matrix_increase_val()` |Increase the value for effect range LEDs. This wraps around at maximum value |
+|`rgb_matrix_decrease_val()` |Decrease the value for effect range LEDs. This wraps around at minimum value |
+|`rgb_matrix_sethsv(h, s, v)` |Set LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 |
+|`rgb_matrix_sethsv_noeeprom(h, s, v)` |Set LEDs to the given HSV value where `h`/`s`/`v` are between 0 and 255 (not written to EEPROM) |
+
+### Query Current Status :id=query-current-status
+|Function |Description |
+|-----------------------|-----------------|
+|`rgb_matrix_get_mode()` |Get current mode |
+|`rgb_matrix_get_hue()` |Get current hue |
+|`rgb_matrix_get_sat()` |Get current sat |
+|`rgb_matrix_get_val()` |Get current val |
+
+## Callbacks :id=callbacks
+
+### Indicators :id=indicators
+
+If you want to set custom indicators, such as an LED for Caps Lock, or layer indication, you can use the `rgb_matrix_indicators_kb` or `rgb_matrix_indicators_user` function for that:
+```c
+void rgb_matrix_indicators_kb(void) {
+ rgb_matrix_set_color(index, red, green, blue);
+}
+```
+
+### Suspended state :id=suspended-state
+To use the suspend feature, make sure that `#define RGB_DISABLE_WHEN_USB_SUSPENDED true` is added to the `config.h` file.
+
+Additionally add this to your `.c`:
```c
-void suspend_power_down_kb(void)
-{
+void suspend_power_down_kb(void) {
+ rgb_matrix_set_suspend_state(true);
+ suspend_power_down_user();
+}
+
+void suspend_wakeup_init_kb(void) {
+ rgb_matrix_set_suspend_state(false);
+ suspend_wakeup_init_user();
+}
+```
+or add this to your `keymap.c`:
+```c
+void suspend_power_down_user(void) {
rgb_matrix_set_suspend_state(true);
}
-void suspend_wakeup_init_kb(void)
-{
+void suspend_wakeup_init_user(void) {
rgb_matrix_set_suspend_state(false);
}
```
diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md
index a000241f8bd..7e54bfef3c1 100644
--- a/docs/feature_rgblight.md
+++ b/docs/feature_rgblight.md
@@ -94,6 +94,7 @@ if `RGBLIGHT_EFFECT_xxxx` or `RGBLIGHT_ANIMATIONS` is defined, you also have a n
|`RGBLIGHT_MODE_STATIC_GRADIENT`| 0,1,..,9 |Static gradient |
|`RGBLIGHT_MODE_RGB_TEST` | *None* |RGB Test |
|`RGBLIGHT_MODE_ALTERNATING` | *None* |Alternating |
+|`RGBLIGHT_MODE_TWINKLE` | 0,1,2,3,4,5 |Twinkle |
Check out [this video](https://youtube.com/watch?v=VKrpPAHlisY) for a demonstration.
@@ -103,8 +104,8 @@ Note: For versions older than 0.6.117, The mode numbers were written directly. I
Use these defines to add or remove animations from the firmware. When you are running low on flash space, it can be helpful to disable animations you are not using.
-|Define |Default |Description |
-|------------------------------------|-------------|-------------------------------------------------------------------------------------|
+|Define |Default |Description |
+|------------------------------------|-------------|-------------------------------------------------------------------------|
|`RGBLIGHT_ANIMATIONS` |*Not defined*|Enable all additional animation modes. |
|`RGBLIGHT_EFFECT_ALTERNATING` |*Not defined*|Enable alternating animation mode. |
|`RGBLIGHT_EFFECT_BREATHING` |*Not defined*|Enable breathing animation mode. |
@@ -115,6 +116,7 @@ Use these defines to add or remove animations from the firmware. When you are ru
|`RGBLIGHT_EFFECT_RGB_TEST` |*Not defined*|Enable RGB test animation mode. |
|`RGBLIGHT_EFFECT_SNAKE` |*Not defined*|Enable snake animation mode. |
|`RGBLIGHT_EFFECT_STATIC_GRADIENT` |*Not defined*|Enable static gradient mode. |
+|`RGBLIGHT_EFFECT_TWINKLE` |*Not defined*|Enable twinkle animation mode. |
### Effect and Animation Settings
@@ -131,6 +133,8 @@ The following options are used to tweak the various animations:
|`RGBLIGHT_EFFECT_KNIGHT_OFFSET` |`0` |The number of LEDs to start the "Knight" animation from the start of the strip by |
|`RGBLIGHT_RAINBOW_SWIRL_RANGE` |`255` |Range adjustment for the rainbow swirl effect to get different swirls |
|`RGBLIGHT_EFFECT_SNAKE_LENGTH` |`4` |The number of LEDs to light up for the "Snake" animation |
+|`RGBLIGHT_EFFECT_TWINKLE_LIFE` |`75` |Adjusts how quickly each LED brightens and dims when twinkling (in animation steps) |
+|`RGBLIGHT_EFFECT_TWINKLE_PROBABILITY`|`1/127` |Adjusts how likely each LED is to twinkle (on each animation step) |
### Example Usage to Reduce Memory Footprint
1. Remove `RGBLIGHT_ANIMATIONS` from `config.h`.
@@ -168,6 +172,9 @@ const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {100, 50, 20};
// How long (in milliseconds) to wait between animation steps for each of the "Knight" animations
const uint8_t RGBLED_KNIGHT_INTERVALS[] PROGMEM = {127, 63, 31};
+// How long (in milliseconds) to wait between animation steps for each of the "Twinkle" animations
+const uint8_t RGBLED_TWINKLE_INTERVALS[] PROGMEM = {50, 25, 10};
+
// These control which hues are selected for each of the "Static gradient" modes
const uint8_t RGBLED_GRADIENT_RANGES[] PROGMEM = {255, 170, 127, 85, 64};
```
@@ -175,23 +182,27 @@ const uint8_t RGBLED_GRADIENT_RANGES[] PROGMEM = {255, 170, 127, 85, 64};
## Lighting Layers
By including `#define RGBLIGHT_LAYERS` in your `config.h` file you can enable lighting layers. These make
-it easy to use your underglow LEDs as status indicators to show which keyboard layer is currently active, or the state of caps lock, all without disrupting any animations. [Here's a video](https://youtu.be/uLGE1epbmdY) showing an example of what you can do.
+it easy to use your underglow LEDs as status indicators to show which keyboard layer is currently active, or the state of caps lock, all without disrupting any animations. [Here's a video](https://youtu.be/uLGE1epbmdY) showing an example of what you can do.
+
+### Defining Lighting Layers :id=defining-lighting-layers
+
+By default, 8 layers are possible. This can be expanded to as many as 32 by overriding the definition of `RGBLIGHT_MAX_LAYERS` in `config.h` (e.g. `#define RGBLIGHT_MAX_LAYERS 32`). Please note, if you use a split keyboard, you will need to flash both sides of the split after changing this. Also, increasing the maximum will increase the firmware size, and will slow sync on split keyboards.
To define a layer, we modify `keymap.c` to list out LED ranges and the colors we want to overlay on them using an array of `rgblight_segment_t` using the `RGBLIGHT_LAYER_SEGMENTS` macro. We can define multiple layers and enable/disable them independently:
```c
// Light LEDs 6 to 9 and 12 to 15 red when caps lock is active. Hard to ignore!
const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
- {6, 4, HSV_RED}, // Light 4 LEDs, starting with LED 6
- {12, 4, HSV_RED} // Light 4 LEDs, starting with LED 12
+ {6, 4, HSV_RED}, // Light 4 LEDs, starting with LED 6
+ {12, 4, HSV_RED} // Light 4 LEDs, starting with LED 12
);
// Light LEDs 9 & 10 in cyan when keyboard layer 1 is active
const rgblight_segment_t PROGMEM my_layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS(
- {9, 2, HSV_CYAN}
+ {9, 2, HSV_CYAN}
);
// Light LEDs 11 & 12 in purple when keyboard layer 2 is active
const rgblight_segment_t PROGMEM my_layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS(
- {11, 2, HSV_PURPLE},
+ {11, 2, HSV_PURPLE}
);
// etc..
```
@@ -201,30 +212,69 @@ We combine these layers into an array using the `RGBLIGHT_LAYERS_LIST` macro, an
```c
// Now define the array of layers. Later layers take precedence
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
- my_capslock_layer,
- my_layer1_layer, // Overrides caps lock layer
- my_layer2_layer // Overrides other layers
+ my_capslock_layer,
+ my_layer1_layer, // Overrides caps lock layer
+ my_layer2_layer // Overrides other layers
);
void keyboard_post_init_user(void) {
- // Enable the LED layers
- rgblight_layers = my_rgb_layers;
+ // Enable the LED layers
+ rgblight_layers = my_rgb_layers;
}
```
+Note: For split keyboards with two controllers, both sides need to be flashed when updating the contents of rgblight_layers.
-Finally, we enable and disable the lighting layers whenever the state of the keyboard changes:
+### Enabling and disabling lighting layers :id=enabling-lighting-layers
+
+Everything above just configured the definition of each lighting layer.
+We can now enable and disable the lighting layers whenever the state of the keyboard changes:
```c
layer_state_t layer_state_set_user(layer_state_t state) {
- // Both layers will light up if both kb layers are active
- rgblight_set_layer_state(1, layer_state_cmp(state, 1));
- rgblight_set_layer_state(2, layer_state_cmp(state, 2));
- return state;
+ // Both layers will light up if both kb layers are active
+ rgblight_set_layer_state(1, layer_state_cmp(state, 1));
+ rgblight_set_layer_state(2, layer_state_cmp(state, 2));
+ return state;
}
bool led_update_user(led_t led_state) {
- rgblight_set_layer_state(0, led_state.caps_lock);
- return true;
+ rgblight_set_layer_state(0, led_state.caps_lock);
+ return true;
+}
+```
+
+### Lighting layer blink :id=lighting-layer-blink
+
+By including `#define RGBLIGHT_LAYER_BLINK` in your `config.h` file you can turn a lighting
+layer on for a specified duration. Once the specified number of milliseconds has elapsed
+the layer will be turned off. This is useful, e.g., if you want to acknowledge some
+action (e.g. toggling some setting):
+
+```c
+const rgblight_segment_t PROGMEM _yes_layer[] = RGBLIGHT_LAYER_SEGMENTS( {9, 6, HSV_GREEN} );
+const rgblight_segment_t PROGMEM _no_layer[] = RGBLIGHT_LAYER_SEGMENTS( {9, 6, HSV_RED} );
+
+const rgblight_segment_t* const PROGMEM _rgb_layers[] =
+ RGBLIGHT_LAYERS_LIST( _yes_layer, _no_layer );
+
+void keyboard_post_init_user(void) {
+ rgblight_layers = _rgb_layers;
+}
+
+// Note we user post_process_record_user because we want the state
+// after the flag has been flipped...
+void post_process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case DEBUG:
+ rgblight_blink_layer(debug_enable ? 0 : 1, 500);
+ break;
+
+ case NK_TOGG:
+ case NK_ON:
+ case NK_OFF:
+ rgblight_blink_layer(keymap_config.nkro ? 0 : 1, 500);
+ break;
+ }
}
```
diff --git a/docs/feature_swap_hands.md b/docs/feature_swap_hands.md
index 09e01d50d3c..009477d2033 100644
--- a/docs/feature_swap_hands.md
+++ b/docs/feature_swap_hands.md
@@ -28,3 +28,4 @@ Note that the array indices are reversed same as the matrix and the values are o
|`SH_MOFF` |Momentarily turns off swap. |
|`SH_TG` |Toggles swap on and off with every key press. |
|`SH_TT` |Toggles with a tap; momentary when held. |
+|`SH_OS` |One shot swap hands: toggles while pressed or until next key press. |
diff --git a/docs/feature_unicode.md b/docs/feature_unicode.md
index 69754145880..a6f2cb4d0de 100644
--- a/docs/feature_unicode.md
+++ b/docs/feature_unicode.md
@@ -90,13 +90,15 @@ Unicode input in QMK works by inputting a sequence of characters to the OS, sort
The following input modes are available:
-* **`UC_OSX`**: macOS built-in Unicode hex input. Supports code points up to `0xFFFF` (`0x10FFFF` with Unicode Map).
+* **`UC_MAC`**: macOS built-in Unicode hex input. Supports code points up to `0xFFFF` (`0x10FFFF` with Unicode Map).
To enable, go to _System Preferences > Keyboard > Input Sources_, add _Unicode Hex Input_ to the list (it's under _Other_), then activate it from the input dropdown in the Menu Bar.
- By default, this mode uses the left Option key (`KC_LALT`) for Unicode input, but this can be changed by defining [`UNICODE_KEY_OSX`](#input-key-configuration) with another keycode.
+ By default, this mode uses the left Option key (`KC_LALT`) for Unicode input, but this can be changed by defining [`UNICODE_KEY_MAC`](#input-key-configuration) with another keycode.
!> Using the _Unicode Hex Input_ input source may disable some Option based shortcuts, such as Option + Left Arrow and Option + Right Arrow.
+ !> `UC_OSX` is a deprecated alias of `UC_MAC` that will be removed in a future version of QMK.
+
* **`UC_LNX`**: Linux built-in IBus Unicode input. Supports code points up to `0x10FFFF` (all possible code points).
Enabled by default and works almost anywhere on IBus-enabled distros. Without IBus, this mode works under GTK apps, but rarely anywhere else.
@@ -124,7 +126,7 @@ You can switch the input mode at any time by using one of the following keycodes
|----------------------|---------|------------|--------------------------------------------------------------|
|`UNICODE_MODE_FORWARD`|`UC_MOD` |Next in list|[Cycle](#input-mode-cycling) through selected modes |
|`UNICODE_MODE_REVERSE`|`UC_RMOD`|Prev in list|[Cycle](#input-mode-cycling) through selected modes in reverse|
-|`UNICODE_MODE_OSX` |`UC_M_OS`|`UC_OSX` |Switch to macOS input |
+|`UNICODE_MODE_MAC` |`UC_M_MA`|`UC_MAC` |Switch to macOS input |
|`UNICODE_MODE_LNX` |`UC_M_LN`|`UC_LNX` |Switch to Linux input |
|`UNICODE_MODE_WIN` |`UC_M_WI`|`UC_WIN` |Switch to Windows input |
|`UNICODE_MODE_BSD` |`UC_M_BS`|`UC_BSD` |Switch to BSD input (not implemented) |
@@ -145,9 +147,9 @@ If you have the [Audio feature](feature_audio.md) enabled on the board, you can
For instance, you can add these definitions to your `config.h` file:
```c
-#define UNICODE_SONG_OSX COIN_SOUND
+#define UNICODE_SONG_MAC AUDIO_ON_SOUND
#define UNICODE_SONG_LNX UNICODE_LINUX
-#define UNICODE_SONG_BSD MARIO_GAMEOVER
+#define UNICODE_SONG_BSD TERMINAL_SOUND
#define UNICODE_SONG_WIN UNICODE_WINDOWS
#define UNICODE_SONG_WINC UNICODE_WINDOWS
```
@@ -171,7 +173,7 @@ You can customize the keys used to trigger Unicode input for macOS, Linux and Wi
|Define |Type |Default |Example |
|------------------|----------|------------------|-------------------------------------------|
-|`UNICODE_KEY_OSX` |`uint8_t` |`KC_LALT` |`#define UNICODE_KEY_OSX KC_RALT` |
+|`UNICODE_KEY_MAC` |`uint8_t` |`KC_LALT` |`#define UNICODE_KEY_MAC KC_RALT` |
|`UNICODE_KEY_LNX` |`uint16_t`|`LCTL(LSFT(KC_U))`|`#define UNICODE_KEY_LNX LCTL(LSFT(KC_E))`|
|`UNICODE_KEY_WINC`|`uint8_t` |`KC_RALT` |`#define UNICODE_KEY_WINC KC_RGUI` |
@@ -180,7 +182,7 @@ You can customize the keys used to trigger Unicode input for macOS, Linux and Wi
You can choose which input modes are available for cycling through. By default, this is disabled. If you want to enable it, limiting it to just the modes you use makes sense. Note that the values in the list are comma-delimited.
```c
-#define UNICODE_SELECTED_MODES UC_OSX, UC_LNX, UC_WIN, UC_WINC
+#define UNICODE_SELECTED_MODES UC_MAC, UC_LNX, UC_WIN, UC_WINC
```
You can cycle through the selected modes by using the `UC_MOD`/`UC_RMOD` keycodes, or by calling `cycle_unicode_input_mode(offset)` in your code (`offset` is how many modes to move forward by, so +1 corresponds to `UC_MOD`).
diff --git a/docs/feature_wpm.md b/docs/feature_wpm.md
new file mode 100644
index 00000000000..12dd0805798
--- /dev/null
+++ b/docs/feature_wpm.md
@@ -0,0 +1,25 @@
+# Word Per Minute (WPM) Calculcation
+
+The WPM feature uses time between keystrokes to compute a rolling average words
+per minute rate and makes this available for various uses.
+
+Enable the WPM system by adding this to your `rules.mk`:
+
+ WPM_ENABLE = yes
+
+For split keyboards using soft serial, the computed WPM
+score will be available on the master AND slave half.
+
+## Public Functions
+
+`uint8_t get_current_wpm(void);`
+This function returns the current WPM as an unsigned integer.
+
+
+## Customized keys for WPM calc
+
+By default, the WPM score only includes letters, numbers, space and some
+punctuation. If you want to change the set of characters considered as part of
+the WPM calculation, you can implement `wpm_keycode_user(uint16_t keycode)`
+and return true for any characters you would like included in the calculation,
+or false to not count that particular keycode.
diff --git a/docs/flashing.md b/docs/flashing.md
index ab003308d05..1f71c253c3a 100644
--- a/docs/flashing.md
+++ b/docs/flashing.md
@@ -26,7 +26,6 @@ Compatible flashers:
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (recommended GUI)
* [dfu-programmer](https://github.com/dfu-programmer/dfu-programmer) / `:dfu` in QMK (recommended command line)
-* [Atmel's Flip](http://www.microchip.com/developmenttools/productdetails.aspx?partno=flip) (not recommended)
Flashing sequence:
diff --git a/docs/fr-fr/_summary.md b/docs/fr-fr/_summary.md
index bb14d2f0ad2..25a593b2ec2 100644
--- a/docs/fr-fr/_summary.md
+++ b/docs/fr-fr/_summary.md
@@ -101,7 +101,8 @@
* [Guide des claviers soudés à la main](fr-fr/hand_wire.md)
* [Guide de flash de l’ISP](fr-fr/isp_flashing_guide.md)
* [Guide du débogage ARM](fr-fr/arm_debugging.md)
- * [Drivers i2c](fr-fr/i2c_driver.md)
+ * [Drivers I2C](fr-fr/i2c_driver.md)
+ * [Drivers SPI](fr-fr/spi_driver.md)
* [Contrôles des GPIO](fr-fr/internals_gpio_control.md)
* [Conversion en Proton C](fr-fr/proton_c_conversion.md)
diff --git a/docs/fr-fr/faq_debug.md b/docs/fr-fr/faq_debug.md
index 754c79921cb..9c12f2917a0 100644
--- a/docs/fr-fr/faq_debug.md
+++ b/docs/fr-fr/faq_debug.md
@@ -155,11 +155,3 @@ Pour le moment, l'origine du problème n'est pas comprise, mais certaines option
https://github.com/tmk/tmk_keyboard/issues/266
https://geekhack.org/index.php?topic=41989.msg1967778#msg1967778
-
-## FLIP ne marche pas
-
-### `AtLibUsbDfu.dll` Not Found
-
-Supprimez le pilote actuel et réinstallez celui donné par FLIP dans le gestionnaire de périphériques.
-
-http://imgur.com/a/bnwzy
diff --git a/docs/fr-fr/flashing.md b/docs/fr-fr/flashing.md
index c380614a5de..74eae497799 100644
--- a/docs/fr-fr/flashing.md
+++ b/docs/fr-fr/flashing.md
@@ -26,7 +26,6 @@ Méthodes de flash compatibles :
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (interface graphique recommandé)
* [dfu-programmer](https://github.com/dfu-programmer/dfu-programmer) / `:dfu` avec QMK (outil en ligne de commande recommandé)
-* [Atmel's Flip](http://www.microchip.com/developmenttools/productdetails.aspx?partno=flip) (non recommandé)
Ordre des actions :
diff --git a/docs/getting_started_vagrant.md b/docs/getting_started_vagrant.md
index da26682d7f3..7a4541cfc63 100644
--- a/docs/getting_started_vagrant.md
+++ b/docs/getting_started_vagrant.md
@@ -20,7 +20,6 @@ The "easy" way to flash the firmware is using a tool from your host OS:
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox) (recommended)
* [Teensy Loader](https://www.pjrc.com/teensy/loader.html)
-* [Atmel FLIP](http://www.atmel.com/tools/flip.aspx)
If you want to program via the command line you can uncomment the ['modifyvm'] lines in the Vagrantfile to enable the USB passthrough into Linux and then program using the command line tools like dfu-util/dfu-programmer or you can install the Teensy CLI version.
diff --git a/docs/hardware_keyboard_guidelines.md b/docs/hardware_keyboard_guidelines.md
index 5d9968f6d72..a862bc0ca88 100644
--- a/docs/hardware_keyboard_guidelines.md
+++ b/docs/hardware_keyboard_guidelines.md
@@ -61,10 +61,76 @@ This file is used by the [QMK API](https://github.com/qmk/qmk_api). It contains
All projects need to have a `config.h` file that sets things like the matrix size, product name, USB VID/PID, description and other settings. In general, use this file to set essential information and defaults for your keyboard that will always work.
+The `config.h` files can also be placed in sub-folders, and the order in which they are read is as follows:
+
+* `keyboards/top_folder/config.h`
+ * `keyboards/top_folder/sub_1/config.h`
+ * `keyboards/top_folder/sub_1/sub_2/config.h`
+ * `keyboards/top_folder/sub_1/sub_2/sub_3/config.h`
+ * `keyboards/top_folder/sub_1/sub_2/sub_3/sub_4/config.h`
+ * `users/a_user_folder/config.h`
+ * `keyboards/top_folder/keymaps/a_keymap/config.h`
+ * `keyboards/top_folder/sub_1/sub_2/sub_3/sub_4/post_config.h`
+ * `keyboards/top_folder/sub_1/sub_2/sub_3/post_config.h`
+ * `keyboards/top_folder/sub_1/sub_2/post_config.h`
+ * `keyboards/top_folder/sub_1/post_config.h`
+* `keyboards/top_folder/post_config.h`
+
+The `post_config.h` file can be used for additional post-processing, depending on what is specified in the `config.h` file. For example, if you define the `IOS_DEVICE_ENABLE` macro in your keymap-level `config.h` file as follows, you can configure more detailed settings accordingly in the `post_config.h` file:
+
+* `keyboards/top_folder/keymaps/a_keymap/config.h`
+ ```c
+ #define IOS_DEVICE_ENABLE
+ ```
+* `keyboards/top_folder/post_config.h`
+ ```c
+ #ifndef IOS_DEVICE_ENABLE
+ // USB_MAX_POWER_CONSUMPTION value for this keyboard
+ #define USB_MAX_POWER_CONSUMPTION 400
+ #else
+ // fix iPhone and iPad power adapter issue
+ // iOS device need lessthan 100
+ #define USB_MAX_POWER_CONSUMPTION 100
+ #endif
+
+ #ifdef RGBLIGHT_ENABLE
+ #ifndef IOS_DEVICE_ENABLE
+ #define RGBLIGHT_LIMIT_VAL 200
+ #define RGBLIGHT_VAL_STEP 17
+ #else
+ #define RGBLIGHT_LIMIT_VAL 35
+ #define RGBLIGHT_VAL_STEP 4
+ #endif
+ #ifndef RGBLIGHT_HUE_STEP
+ #define RGBLIGHT_HUE_STEP 10
+ #endif
+ #ifndef RGBLIGHT_SAT_STEP
+ #define RGBLIGHT_SAT_STEP 17
+ #endif
+ #endif
+ ```
+
+?> If you define options using `post_config.h` as in the above example, you should not define the same options in the keyboard- or user-level `config.h`.
+
### `rules.mk`
The presence of this file means that the folder is a keyboard target and can be used in `make` commands. This is where you setup the build environment for your keyboard and configure the default set of features.
+The `rules.mk` file can also be placed in a sub-folder, and its reading order is as follows:
+
+* `keyboards/top_folder/rules.mk`
+ * `keyboards/top_folder/sub_1/rules.mk`
+ * `keyboards/top_folder/sub_1/sub_2/rules.mk`
+ * `keyboards/top_folder/sub_1/sub_2/sub_3/rules.mk`
+ * `keyboards/top_folder/sub_1/sub_2/sub_3/sub_4/rules.mk`
+ * `keyboards/top_folder/keymaps/a_keymap/rules.mk`
+ * `users/a_user_folder/rules.mk`
+* `common_features.mk`
+
+Many of the settings written in the `rules.mk` file are interpreted by `common_features.mk`, which sets the necessary source files and compiler options.
+
+?> See `build_keyboard.mk` and `common_features.mk` for more details.
+
### ``
This is where you will write custom code for your keyboard. Typically you will write code to initialize and interface with the hardware in your keyboard. If your keyboard consists of only a key matrix with no LEDs, speakers, or other auxiliary hardware this file can be blank.
diff --git a/docs/he-il/_summary.md b/docs/he-il/_summary.md
index 21059f997aa..bdacd0d1fd2 100644
--- a/docs/he-il/_summary.md
+++ b/docs/he-il/_summary.md
@@ -114,6 +114,7 @@
* [מדריך לצריבת ISP](he-il/isp_flashing_guide.md)
* [מדריך לדיבאגינג ARM](he-il/arm_debugging.md)
* [מנהל התקן I2C](he-il/i2c_driver.md)
+ * [מנהל התקן SPI](he-il/spi_driver.md)
* [בקרת GPIO](he-il/internals_gpio_control.md)
* [המרת Proton C](he-il/proton_c_conversion.md)
diff --git a/docs/index.html b/docs/index.html
index f810e6c38fd..68bd00f6ddd 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -32,7 +32,7 @@
// Moved pages
'/adding_a_keyboard_to_qmk': '/hardware_keyboard_guidelines',
- '/build_environment_setup': '/getting_started_build_tools',
+ '/build_environment_setup': '/newbs_getting_started',
'/cli_dev_configuration': '/cli_configuration',
'/dynamic_macros': '/feature_dynamic_macros',
'/feature_common_shortcuts': '/feature_advanced_keycodes',
@@ -45,6 +45,7 @@
'/tap_dance': '/feature_tap_dance',
'/unicode': '/feature_unicode',
'/python_development': '/cli_development',
+ '/getting_started_build_tools':'/newbs_getting_started',
},
basePath: '/',
name: 'QMK Firmware',
diff --git a/docs/internals_gpio_control.md b/docs/internals_gpio_control.md
index 74ac090355f..48eaf8875b7 100644
--- a/docs/internals_gpio_control.md
+++ b/docs/internals_gpio_control.md
@@ -16,6 +16,7 @@ The following functions can provide basic control of GPIOs and are found in `qua
| `writePinLow(pin)` | Set pin level as low, assuming it is an output | `PORTB &= ~(1<<2)` | `palClearLine(pin)` |
| `writePin(pin, level)` | Set pin level, assuming it is an output | `(level) ? PORTB \|= (1<<2) : PORTB &= ~(1<<2)` | `(level) ? palSetLine(pin) : palClearLine(pin)` |
| `readPin(pin)` | Returns the level of the pin | `_SFR_IO8(pin >> 4) & _BV(pin & 0xF)` | `palReadLine(pin)` |
+| `togglePin(pin)` | Invert pin level, assuming it is an output | `PORTB ^= (1<<2)` | `palToggleLine(pin)` |
## Advanced Settings :id=advanced-settings
diff --git a/docs/isp_flashing_guide.md b/docs/isp_flashing_guide.md
index 944dd346222..8ee5a40d9e8 100644
--- a/docs/isp_flashing_guide.md
+++ b/docs/isp_flashing_guide.md
@@ -115,12 +115,18 @@ The simplest and quickest way to get things back to normal is to flash only a bo
You can find the stock bootloaders in the [`util/` folder](https://github.com/qmk/qmk_firmware/tree/master/util). Be sure to flash the correct bootloader for your chip:
-* [`atmega32u4`](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_atmega32u4_1_0_0.hex) - Most keyboards, Planck Rev 1-5, Preonic Rev 1-2
-* [`Pro Micro`](https://github.com/sparkfun/Arduino_Boards/blob/master/sparkfun/avr/bootloaders/caterina/Caterina-promicro16.hex) - The default bootloader for Pro Micro controllers
-* [`at90usb1286`](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_at90usb128x_1_0_1.hex) - Planck Light Rev 1
-* [`atmega32a`](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_atmega32a_1_0_0.hex) - jj40, and other V-USB/ps2avrGB keyboards
+* **Atmel DFU**
+ * [ATmega16U4](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_atmega16u4_1.0.1.hex)
+ * [ATmega32U4](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_atmega32u4_1.0.0.hex)
+ * [AT90USB64](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_at90usb64_1.0.0.hex)
+ * [AT90USB128](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_at90usb128_1.0.1.hex)
+* **Caterina**
+ * [Pro Micro (5V/16MHz)](https://github.com/sparkfun/Arduino_Boards/blob/master/sparkfun/avr/bootloaders/caterina/Caterina-promicro16.hex)
+ * [Pro Micro (3.3V/8MHz)](https://github.com/sparkfun/Arduino_Boards/blob/master/sparkfun/avr/bootloaders/caterina/Caterina-promicro8.hex)
+* **BootloadHID (PS2AVRGB)**
+ * [ATmega32A](https://github.com/qmk/qmk_firmware/blob/master/util/bootloader_ps2avrgb_bootloadhid_1.0.1.hex)
-If you're not sure what your board uses, look in the `rules.mk` file for the keyboard in QMK. The `MCU =` line will have the value you need. It may differ between different versions of the board.
+If you're not sure what your board uses, look in the `rules.mk` file for the keyboard in QMK. The `MCU` and `BOOTLOADER` lines will have the value you need. It may differ between different versions of the board.
### Production Techniques
diff --git a/docs/ja/README.md b/docs/ja/README.md
index 8959a9dd955..c02a14b487c 100644
--- a/docs/ja/README.md
+++ b/docs/ja/README.md
@@ -1,8 +1,8 @@
# Quantum Mechanical Keyboard Firmware
[](https://github.com/qmk/qmk_firmware/tags)
@@ -12,26 +12,37 @@
[](https://github.com/qmk/qmk_firmware/pulse/monthly)
[](https://github.com/qmk/qmk_firmware/)
-## QMK ファームウェアとは何か?
+## QMK ファームウェアとは何でしょうか?
-QMK (*Quantum Mechanical Keyboard*)は QMK ファームウェア、QMK ツールボックス、qmk.fm およびそれらのドキュメントを保守するオープンソースコミュニティです。QMK ファームウェアは[tmk\_keyboard](http://github.com/tmk/tmk_keyboard) を元にしたキーボードファームウェアで、Atmel AVR コントローラ、より具体的には [OLKB 製品](http://olkb.com)、[ErgoDox EZ](http://www.ergodox-ez.com) キーボードおよび [Clueboard 製品](http://clueboard.co/) のための幾つかの便利な機能を持ちます。また、ChibiOS を使って ARM チップに移植されています。これを使ってあなたの作った手配線のキーボードあるいはカスタムキーボード PCB で作ったキーボードを動かすことができます。
+QMK (*Quantum Mechanical Keyboard*)は、コンピュータ入力デバイスの開発を中心としたオープンソースコミュニティです。コミュニティには、キーボード、マウス、MIDI デバイスなど、全ての種類の入力デバイスが含まれます。協力者の中心グループは、[QMK ファームウェア](https://github.com/qmk/qmk_firmware)、[QMK Configurator](https://config.qmk.fm)、[QMK ツールボックス](https://github.com/qmk/qmk_toolbox)、[qmk.fm](https://qmk.fm)、そして、このドキュメントを、あなたのようなコミュニティメンバーの助けを借りて保守しています。
-## 入手方法
+## 始めましょう
-QMK のキーマップ、キーボード、機能に貢献をする予定がある場合、最も簡単なのは、[Github を介してリポジトリをフォークし](https://github.com/qmk/qmk_firmware#fork-destination-box)、リポジトリをあなたの開発環境にクローンして変更を加え、それらをプッシュし、[プルリクエスト](https://github.com/qmk/qmk_firmware/pulls)を開くことです。
+QMK は初めてですか?始めるには2つの方法があります:
-それ以外の場合は、`git clone https://github.com/qmk/qmk_firmware` を介して直接クローンすることができます。zip または tar ファイルをダウンロードしないでください。コンパイルするためのサブモジュールをダウンロードするために git リポジトリが必要です。
+* 基本: [QMK Configurator](https://config.qmk.fm)
+ * ドロップダウンからあなたのキーボードを選択し、キーボードをプログラムします。
+ * 見ることができる [紹介ビデオ](https://www.youtube.com/watch?v=-imgglzDMdY) があります。
+ * 読むことができる概要 [ドキュメント](ja/newbs_building_firmware_configurator.md) があります。
+* 発展: [ソースを使用します](ja/newbs.md)
+ * より強力ですが、使うのはより困難です。
-## コンパイル方法
+## 自分用にアレンジします
-コンパイルをする前に、AVR または ARM 開発のための[環境をインストール](ja/getting_started_build_tools.md)する必要があります。それが完了したら、`make` コマンドを使用して、以下の表記でキーボードとキーマップをビルドします。
+QMK には、探求すべき多くの[機能](ja/features.md)と、深く知るためのリファレンスドキュメントがたくさんあります。ほとんどの機能は[キーマップ](ja/keymap.md)を変更し、[キーコード](ja/keycodes.md)を変更することで活用されます。
- make planck/rev4:default
+## 手助けが必要ですか?
-これは、`planck` の `rev4` リビジョンを `default` キーマップでビルドします。全てのキーボードにリビジョン(サブプロジェクトまたはフォルダとも呼ばれます)があるわけではありません。その場合は省略されます:
+[サポートページ](ja/support.md) をチェックして、QMK の使い方について手助けを得る方法を確認してください。
- make preonic:default
+## 貢献する
-## カスタマイズ方法
+QMK コミュニティに貢献する方法はたくさんあります。始める最も簡単な方法は、それを使って友人に QMK という単語を広めることです。
-QMK には、探求すべき多くの[機能](ja/features.md)と、深堀りするための[リファレンス ドキュメント](http://docs.qmk.fm)がたくさんあります。ほとんどの機能は[キーマップ](ja/keymap.md)を変更し、[キーコード](ja/keycodes.md)を変更することで活用されます。
+* フォーラムやチャットルームで人々を支援します:
+ * [/r/olkb](https://www.reddit.com/r/olkb/)
+ * [Discord サーバ](https://discord.gg/Uq7gcHh)
+* 下にある「Edit This Page」をクリックしてドキュメントに貢献します
+* [ドキュメントをあなたの言語に翻訳します](ja/translating.md)
+* [バグを報告します](https://github.com/qmk/qmk_firmware/issues/new/choose)
+* [プルリクエストを開きます](ja/contributing.md)
diff --git a/docs/ja/_summary.md b/docs/ja/_summary.md
index 8091781e8a0..e6423c6c26f 100644
--- a/docs/ja/_summary.md
+++ b/docs/ja/_summary.md
@@ -1,130 +1,163 @@
-* [完全な初心者のガイド](ja/newbs.md)
- * [はじめに](ja/newbs_getting_started.md)
- * [初めてのファームウェアの構築](ja/newbs_building_firmware.md)
- * [ファームウェアのフラッシュ](ja/newbs_flashing.md)
- * [テストとデバッグ](ja/newbs_testing_debugging.md)
- * [QMK における Git 運用作法](ja/newbs_git_best_practices.md)
- * [あなたのフォークの master ブランチ](ja/newbs_git_using_your_master_branch.md)
- * [マージの競合の解決](ja/newbs_git_resolving_merge_conflicts.md)
- * [同期のとれていない git ブランチの再同期](ja/newbs_git_resynchronize_a_branch.md)
- * [学習リソース](ja/newbs_learn_more_resources.md)
+* チュートリアル
+ * [入門](ja/newbs.md)
+ * [セットアップ](ja/newbs_getting_started.md)
+ * [初めてのファームウェアの構築](ja/newbs_building_firmware.md)
+ * [ファームウェアのフラッシュ](ja/newbs_flashing.md)
+ * [テストとデバッグ](ja/newbs_testing_debugging.md)
+ * [手助けを得る/サポート](ja/support.md)
+ * [他のリソース](ja/newbs_learn_more_resources.md)
-* [QMKの基本](ja/README.md)
- * [QMK の導入](ja/getting_started_introduction.md)
- * [QMK CLI](ja/cli.md)
- * [QMK CLI 設定](ja/cli_configuration.md)
- * [QMK への貢献](ja/contributing.md)
- * [Github の使い方](ja/getting_started_github.md)
- * [ヘルプ](ja/getting_started_getting_help.md)
+* FAQ
+ * [一般的な FAQ](ja/faq_general.md)
+ * [QMK のビルド/コンパイル](ja/faq_build.md)
+ * [QMK のデバッグ/トラブルシューティング](ja/faq_debug.md)
+ * [キーマップ FAQ](ja/faq_keymap.md)
+ * [用語](ja/reference_glossary.md)
-* [破壊的な変更](ja/breaking_changes.md)
- * [プルリクエストにフラグが付けられた](ja/breaking_changes_instructions.md)
- * [2019年8月30日](ja/ChangeLog/20190830.md)
+* Configurator
+ * [概要](ja/newbs_building_firmware_configurator.md)
+ * [ステップ・バイ・ステップ](ja/configurator_step_by_step.md)
+ * [トラブルシューティング](ja/configurator_troubleshooting.md)
+ * QMK API
+ * [概要](ja/api_overview.md)
+ * [API ドキュメント](ja/api_docs.md)
+ * [キーボードサポート](ja/reference_configurator_support.md)
-* [FAQ](ja/faq.md)
- * [一般的な FAQ](ja/faq_general.md)
- * [QMK のビルド/コンパイル](ja/faq_build.md)
- * [QMK のデバッグ/トラブルシューティング](ja/faq_debug.md)
- * [キーマップ](ja/faq_keymap.md)
- * [Zadig を使ったドライバのインストール](ja/driver_installation_zadig.md)
+* CLI
+ * [概要](ja/cli.md)
+ * [設定](ja/cli_configuration.md)
+ * [コマンド](ja/cli_commands.md)
-* 詳細なガイド
- * [ビルドツールのインストール](ja/getting_started_build_tools.md)
- * [Vagrant のガイド](ja/getting_started_vagrant.md)
- * [ビルド/コンパイルの説明](ja/getting_started_make_guide.md)
- * [ファームウェアのフラッシュ](ja/flashing.md)
- * [機能のカスタマイズ](ja/custom_quantum_functions.md)
- * [キーマップの概要](ja/keymap.md)
+* QMK を使う
+ * ガイド
+ * [機能のカスタマイズ](ja/custom_quantum_functions.md)
+ * [Zadig を使ったドライバのインストール](ja/driver_installation_zadig.md)
+ * [キーマップの概要](ja/keymap.md)
+ * [Vagrant のガイド](ja/getting_started_vagrant.md)
+ * 書き込み
+ * [書き込み](ja/flashing.md)
+ * [ATmega32A の書き込み (ps2avrgb)](ja/flashing_bootloadhid.md)
+ * IDE
+ * [Eclipse で QMK を使用](ja/other_eclipse.md)
+ * [VSCode で QMK を使用](ja/other_vscode.md)
+ * Git のベストプラクティス
+ * [入門](ja/newbs_git_best_practices.md)
+ * [フォーク](ja/newbs_git_using_your_master_branch.md)
+ * [マージの競合の解決](ja/newbs_git_resolving_merge_conflicts.md)
+ * [ブランチの修正](ja/newbs_git_resynchronize_a_branch.md)
+ * キーボードを作る
+ * [Hand Wiring ガイド](ja/hand_wire.md)
+ * [ISP 書き込みガイド](ja/isp_flashing_guide.md)
-* [ハードウェア](ja/hardware.md)
- * [互換性のあるマイクロコントローラ](ja/compatible_microcontrollers.md)
- * [AVR プロセッサ](ja/hardware_avr.md)
- * [ドライバ](ja/hardware_drivers.md)
+ * 単純なキーコード
+ * [完全なリスト](ja/keycodes.md)
+ * [基本的なキーコード](ja/keycodes_basic.md)
+ * [修飾キー](ja/feature_advanced_keycodes.md)
+ * [Quantum キーコード](ja/quantum_keycodes.md)
-* リファレンス
- * [キーボード ガイドライン](ja/hardware_keyboard_guidelines.md)
- * [設定オプション](ja/config_options.md)
- * [キーコード](ja/keycodes.md)
- * [コーディング規約 - C](ja/coding_conventions_c.md)
- * [コーディング規約 - Python](ja/coding_conventions_python.md)
- * [ドキュメント ベストプラクティス](ja/documentation_best_practices.md)
- * [ドキュメント テンプレート](ja/documentation_templates.md)
- * [用語](ja/reference_glossary.md)
- * [ユニットテスト](ja/unit_testing.md)
- * [便利な関数](ja/ref_functions.md)
- * [Configurator サポート](ja/reference_configurator_support.md)
- * [info.json 形式](ja/reference_info_json.md)
- * [Python CLI 開発](ja/cli_development.md)
+ * 高度なキーコード
+ * [コマンド](ja/feature_command.md)
+ * [動的マクロ](ja/feature_dynamic_macros.md)
+ * [グレイブ エスケープ](ja/feature_grave_esc.md)
+ * [リーダーキー](ja/feature_leader_key.md)
+ * [モッドタップ](ja/mod_tap.md)
+ * [マクロ](ja/feature_macros.md)
+ * [マウスキー](ja/feature_mouse_keys.md)
+ * [Space Cadet Shift](ja/feature_space_cadet.md)
+ * [US ANSI シフトキー](ja/keycodes_us_ansi_shifted.md)
-* [機能](ja/features.md)
- * [基本的なキーコード](ja/keycodes_basic.md)
- * [US ANSI シフトキー](ja/keycodes_us_ansi_shifted.md)
- * [Quantum キーコード](ja/quantum_keycodes.md)
- * [Advanced キーコード](ja/feature_advanced_keycodes.md)
- * [オーディオ](ja/feature_audio.md)
- * [自動シフト](ja/feature_auto_shift.md)
- * [バックライト](ja/feature_backlight.md)
- * [ブルートゥース](ja/feature_bluetooth.md)
- * [ブートマジック](ja/feature_bootmagic.md)
- * [コンボ](ja/feature_combo.md)
- * [コマンド](ja/feature_command.md)
- * [デバウンス API](ja/feature_debounce_type.md)
- * [DIP スイッチ](ja/feature_dip_switch.md)
- * [動的マクロ](ja/feature_dynamic_macros.md)
- * [エンコーダ](ja/feature_encoders.md)
- * [グレイブ エスケープ](ja/feature_grave_esc.md)
- * [触覚フィードバック](ja/feature_haptic_feedback.md)
- * [HD44780 LCD コントローラ](ja/feature_hd44780.md)
- * [キーロック](ja/feature_key_lock.md)
- * [レイアウト](ja/feature_layouts.md)
- * [リーダー キー](ja/feature_leader_key.md)
- * [LED マトリクス](ja/feature_led_matrix.md)
- * [マクロ](ja/feature_macros.md)
- * [マウスキー](ja/feature_mouse_keys.md)
- * [OLED ドライバ](ja/feature_oled_driver.md)
- * [One Shot Keys](ja/one_shot_keys.md)
- * [ポインティング デバイス](ja/feature_pointing_device.md)
- * [PS/2 マウス](ja/feature_ps2_mouse.md)
- * [RGB ライト](ja/feature_rgblight.md)
- * [RGB マトリクス](ja/feature_rgb_matrix.md)
- * [Space Cadet](ja/feature_space_cadet.md)
- * [分割キーボード](ja/feature_split_keyboard.md)
- * [Stenography](ja/feature_stenography.md)
- * [Swap Hands](ja/feature_swap_hands.md)
- * [タップ ダンス](ja/feature_tap_dance.md)
- * [ターミナル](ja/feature_terminal.md)
- * [感熱式プリンタ](ja/feature_thermal_printer.md)
- * [ユニコード](ja/feature_unicode.md)
- * [ユーザスペース](ja/feature_userspace.md)
- * [Velocikey](ja/feature_velocikey.md)
+ * ソフトウェア機能
+ * [自動シフト](ja/feature_auto_shift.md)
+ * [コンボ](ja/feature_combo.md)
+ * [デバウンス API](ja/feature_debounce_type.md)
+ * [キーロック](ja/feature_key_lock.md)
+ * [レイヤー](ja/feature_layers.md)
+ * [One Shot Keys](ja/one_shot_keys.md)
+ * [ポインティング デバイス](ja/feature_pointing_device.md)
+ * [Swap Hands](ja/feature_swap_hands.md)
+ * [タップダンス](ja/feature_tap_dance.md)
+ * [タップホールド設定](ja/tap_hold.md)
+ * [ターミナル](ja/feature_terminal.md)
+ * [ユニコード](ja/feature_unicode.md)
+ * [ユーザスペース](ja/feature_userspace.md)
+ * [WPM 計算](ja/feature_wpm.md)
-* メーカーおよびモッダーのために
- * [Hand Wiring ガイド](ja/hand_wire.md)
- * [ISP 書き込みガイド](ja/isp_flashing_guide.md)
- * [ARM デバッグ ガイド](ja/arm_debugging.md)
- * [ADC ドライバ](ja/adc_driver.md)
- * [I2C ドライバ](ja/i2c_driver.md)
- * [WS2812 ドライバ](ja/ws2812_driver.md)
- * [EEPROM ドライバ](ja/eeprom_driver.md)
- * [GPIO コントロール](ja/internals_gpio_control.md)
- * [カスタムマトリックス](ja/custom_matrix.md)
- * [Proton C 規約](ja/proton_c_conversion.md)
+ * ハードウェア機能
+ * 表示
+ * [HD44780 LCD コントローラ](ja/feature_hd44780.md)
+ * [OLED ドライバ](ja/feature_oled_driver.md)
+ * 電飾
+ * [バックライト](ja/feature_backlight.md)
+ * [LED マトリックス](ja/feature_led_matrix.md)
+ * [RGB ライト](ja/feature_rgblight.md)
+ * [RGB マトリックス](ja/feature_rgb_matrix.md)
+ * [オーディオ](ja/feature_audio.md)
+ * [Bluetooth](ja/feature_bluetooth.md)
+ * [ブートマジック](ja/feature_bootmagic.md)
+ * [カスタムマトリックス](ja/custom_matrix.md)
+ * [DIP スイッチ](ja/feature_dip_switch.md)
+ * [エンコーダ](ja/feature_encoders.md)
+ * [触覚フィードバック](ja/feature_haptic_feedback.md)
+ * [Proton C 規約](ja/proton_c_conversion.md)
+ * [PS/2 マウス](ja/feature_ps2_mouse.md)
+ * [分割キーボード](ja/feature_split_keyboard.md)
+ * [Stenography](ja/feature_stenography.md)
+ * [感熱式プリンタ](ja/feature_thermal_printer.md)
+ * [Velocikey](ja/feature_velocikey.md)
-* より深く知るために
- * [キーボードがどのように動作するか](ja/how_keyboards_work.md)
- * [QMK の理解](ja/understanding_qmk.md)
+* QMK の開発
+ * 破壊的な変更
+ * [概要](ja/breaking_changes.md)
+ * [プルリクエストにフラグが付けられた](ja/breaking_changes_instructions.md)
+ * 履歴
+ * [2020年2月29日](ja/ChangeLog/20200229.md)
+ * [2019年8月30日](ja/ChangeLog/20190830.md)
-* 他の話題
- * [Eclipse で QMK を使用](ja/other_eclipse.md)
- * [VSCode で QMK を使用](ja/other_vscode.md)
- * [サポート](ja/getting_started_getting_help.md)
- * [翻訳を追加する方法](ja/translating.md)
+ * C 開発
+ * [ARM デバッグ ガイド](ja/arm_debugging.md)
+ * [AVR プロセッサ](ja/hardware_avr.md)
+ * [コーディング規約](ja/coding_conventions_c.md)
+ * [互換性のあるマイクロコントローラ](ja/compatible_microcontrollers.md)
+ * [ドライバ](ja/hardware_drivers.md)
+ * [ADC ドライバ](ja/adc_driver.md)
+ * [I2C ドライバ](ja/i2c_driver.md)
+ * [SPI ドライバ](ja/spi_driver.md)
+ * [WS2812 ドライバ](ja/ws2812_driver.md)
+ * [EEPROM ドライバ](ja/eeprom_driver.md)
+ * [GPIO コントロール](ja/internals_gpio_control.md)
+ * [キーボード ガイドライン](ja/hardware_keyboard_guidelines.md)
-* QMK の内部詳細(作成中)
- * [定義](ja/internals_defines.md)
- * [Input Callback Reg](ja/internals_input_callback_reg.md)
- * [Midi ドライバ](ja/internals_midi_device.md)
- * [Midi デバイスのセットアップ手順](ja/internals_midi_device_setup_process.md)
- * [Midi ユーティリティ](ja/internals_midi_util.md)
- * [Send Functions](ja/internals_send_functions.md)
- * [Sysex Tools](ja/internals_sysex_tools.md)
+ * Python 開発
+ * [コーディング規約](ja/coding_conventions_python.md)
+ * [QMK CLI 開発](ja/cli_development.md)
+
+ * Configurator 開発
+ * QMK API
+ * [開発環境](ja/api_development_environment.md)
+ * [アーキテクチャの概要](ja/api_development_overview.md)
+
+ * QMK Reference
+ * [QMK への貢献](ja/contributing.md)
+ * [QMK ドキュメントの翻訳](ja/translating.md)
+ * [設定オプション](ja/config_options.md)
+ * [Make ドキュメント](ja/getting_started_make_guide.md)
+ * [ドキュメント ベストプラクティス](ja/documentation_best_practices.md)
+ * [ドキュメント テンプレート](ja/documentation_templates.md)
+ * [コミュニティレイアウト](ja/feature_layouts.md)
+ * [ユニットテスト](ja/unit_testing.md)
+ * [便利な関数](ja/ref_functions.md)
+ * [info.json 形式](ja/reference_info_json.md)
+
+ * より深く知るために
+ * [キーボードがどのように動作するか](ja/how_keyboards_work.md)
+ * [マトリックスがどのように動作するか](ja/how_a_matrix_works.md)
+ * [QMK を理解する](ja/understanding_qmk.md)
+
+ * QMK の内部詳細(作成中)
+ * [定義](ja/internals_defines.md)
+ * [Input Callback Reg](ja/internals_input_callback_reg.md)
+ * [Midi デバイス](ja/internals_midi_device.md)
+ * [Midi デバイスのセットアップ手順](ja/internals_midi_device_setup_process.md)
+ * [Midi ユーティリティ](ja/internals_midi_util.md)
+ * [Send Functions](ja/internals_send_functions.md)
+ * [Sysex Tools](ja/internals_sysex_tools.md)
diff --git a/docs/ja/arm_debugging.md b/docs/ja/arm_debugging.md
index 9a6cd515a02..afb5c4e0e6a 100644
--- a/docs/ja/arm_debugging.md
+++ b/docs/ja/arm_debugging.md
@@ -1,8 +1,8 @@
# Eclipse を使った ARM デバッグ
このページでは、SWD アダプタとオープンソース/フリーツールを使って ARM MCU をデバッグするためのセットアップ方法について説明します。このガイドでは、GNU MCU Eclipse IDE for C/C++ Developers および OpenOCD を必要な依存関係と一緒にインストールします。
@@ -60,7 +60,7 @@ Java は Eclipse で必要とされるため、[ここ](https://www.oracle.com/t
Eclipse に QMK をビルドしようとするデバイスを教える必要があります。QMK フォルダを右クリック -> Properties -> C/C++ Build -> Settings を選択します。Devices タブを選択し、Devices の下から MCU の適切な種類を選択します。私の例では、STM32F303CC です。
-この間に、Build コマンドもセットアップしましょう。C/C++ Build を選択し、Behavior タブを選択します。build コマンドのところで、`all` を必要な make コマンドに置き換えます。例えば、rev6 Planck の default キーマップの場合、これは `planck/rev6:default` になります。Apply and Close を選択します。
+この間に、Build コマンドもセットアップしましょう。C/C++ Build を選択し、Behavior タブを選択します。Build コマンドのところで、`all` を必要な make コマンドに置き換えます。例えば、rev6 Planck の default キーマップの場合、これは `planck/rev6:default` になります。Apply and Close を選択します。
## ビルド
@@ -70,13 +70,13 @@ Eclipse に QMK をビルドしようとするデバイスを教える必要が
### デバッガの接続
-ARM MCU は、クロック信号(SWCLK) とデータ信号(SWDIO) で構成される Single Wire Debug (SWD) プロトコルを使います。MCU を 完全に操作するには、この2本のワイヤとグラウンドを接続するだけで十分です。ここでは、キーボードは USB を介して電力が供給されると想定しています。手動でリセットボタンを使えるため、RESET 信号は必要ありません。より高度なセットアップのために printf と scanf をホストに非同期にパイプする SWO 信号を使用できますが、私たちのセットアップでは無視します。
+ARM MCU は、クロック信号(SWCLK) とデータ信号(SWDIO) で構成される Single Wire Debug (SWD) プロトコルを使います。MCU を完全に操作するには、この2本のワイヤとグラウンドを接続するだけで十分です。ここでは、キーボードは USB を介して電力が供給されると想定しています。手動でリセットボタンを使えるため、RESET 信号は必要ありません。より高度なセットアップのために printf と scanf をホストに非同期にパイプする SWO 信号を使用できますが、私たちのセットアップでは無視します。
注意: SWCLK と SWDIO ピンがキーボードのマトリックスで使われていないことを確認してください。もし使われている場合は、一時的に他のピンに切り替えることができます。
### デバッガの設定
-QMK フォルダを右クリックし、Debug As -> Debug Configurations... を選択します。ここで、GDB OpenOCD Debugging をダブルクリックします。Debugger タブを選択し、MCU に必要な設定を入力します。これを見つけるにはいじったりググったりする必要があるかもしれません。STM32F3 用のデフォルトスクリプトは stm32f3discovery.cfg と呼ばれます。OpenOCD に伝えるには、Config options で `-f board/stm32f3discovery.cfg` と入力します。
+QMK フォルダを右クリックし、Debug As -> Debug Configurations... を選択します。ここで、GDB OpenOCD Debugging をダブルクリックします。Debugger タブを選択し、MCU に必要な設定を入力します。これを見つけるにはいじったりググったりする必要があるかもしれません。STM32F3 用のデフォルトスクリプトは `stm32f3discovery.cfg` と呼ばれます。OpenOCD に伝えるには、Config options で `-f board/stm32f3discovery.cfg` と入力します。
注意: 私の場合、この設定スクリプトはリセット操作を無効にするために編集が必要です。スクリプトの場所は、通常はパス `openocd/version/.content/scripts/board` の下の実際の実行可能フィールドの中で見つかります。ここで、私は `reset_config srst_only` を `reset_config none` に編集しました。
@@ -86,7 +86,7 @@ Apply and Close を選択します。
キーボードをリセットしてください。
-虫アイコンをクリックし、もし全てうまく行けば Debug パースペクティブに移動します。ここでは、main 関数の最初でプログラムカウンタが停止するので、Play ボタンを押します。全てのデバッガのほとんどの機能は ARM MCU で動作しますが、正確な詳細については google があなたのお友達です!
+虫アイコンをクリックし、もし全てうまく行けば Debug パースペクティブに移動します。ここでは、main 関数の最初でプログラムカウンタが停止し、Play ボタンが押されるのを待ちます。全てのデバッガのほとんどの機能は Arm MCU で動作しますが、正確な詳細については Google があなたのお友達です!
ハッピーデバッギング!
diff --git a/docs/ja/cli.md b/docs/ja/cli.md
index e0bee35a6f5..dc6dddc41d9 100644
--- a/docs/ja/cli.md
+++ b/docs/ja/cli.md
@@ -1,29 +1,19 @@
-# QMK CLI
+# QMK CLI :id=qmk-cli
-このページは QMK CLI のセットアップと使用方法について説明します。
-
-# 概要
+## 概要 :id=overview
QMK CLI を使用すると QMK キーボードの構築と作業が簡単になります。QMK ファームウェアの取得とコンパイル、キーマップの作成などのようなタスクを簡素化し合理化するためのコマンドを多く提供します。
-* [グローバル CLI](#global-cli)
-* [ローカル CLI](#local-cli)
-* [CLI コマンド](#cli-commands)
+### 必要事項 :id=requirements
-# 必要事項
+CLI は Python 3.5 以上を必要とします。我々は必要事項の数を少なくしようとしていますが、[`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt) に列挙されているパッケージもインストールする必要があります。これらは QMK CLI をインストールするときに自動的にインストールされます。
-CLI は Python 3.5 以上を必要とします。我々は必要事項の数を少なくしようとしていますが、[`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt) にリストされているパッケージもインストールする必要があります。
-
-# グローバル CLI :id=global-cli
-
-QMK は、QMK ビルド環境のセットアップ、QMK の操作、および `qmk_firmware` の複数のコピーの操作を容易にできるインストール可能な CLI を提供します。これを定期的にインストールおよび更新することをお勧めします。
-
-## Homebrew を使ったインストール (macOS、いくつかの Linux)
+### Homebrew を使ったインストール (macOS、いくつかの Linux) :id=install-using-homebrew
[Homebrew](https://brew.sh) をインストールしている場合は、タップして QMK をインストールすることができます:
@@ -34,7 +24,7 @@ export QMK_HOME='~/qmk_firmware' # オプション、`qmk_firmware` の場所を
qmk setup # これは `qmk/qmk_firmware` をクローンし、オプションでビルド環境をセットアップします
```
-## easy_install あるいは pip を使ってインストール
+### easy_install あるいは pip を使ってインストール :id=install-using-easy_install-or-pip
上のリストにあなたのシステムがない場合は、QMK を手動でインストールすることができます。最初に、python 3.5 (以降)をインストールしていて、pip をインストールしていることを確認してください。次に以下のコマンドを使って QMK をインストールします:
@@ -44,7 +34,7 @@ export QMK_HOME='~/qmk_firmware' # オプション、`qmk_firmware` の場所を
qmk setup # これは `qmk/qmk_firmware` をクローンし、オプションでビルド環境をセットアップします
```
-## 他のオペレーティングシステムのためのパッケージ
+### 他のオペレーティングシステムのためのパッケージ :id=packaging-for-other-operating-systems
より多くのオペレーティングシステム用に `qmk` パッケージを作成および保守する人を探しています。OS 用のパッケージを作成する場合は、以下のガイドラインに従ってください:
@@ -52,247 +42,3 @@ qmk setup # これは `qmk/qmk_firmware` をクローンし、オプション
* 逸脱する場合は、理由をコメントに文章化してください。
* virtualenv を使ってインストールしてください
* 環境変数 `QMK_HOME` を設定して、ファームウェアソースを `~/qmk_firmware` 以外のどこかにチェックアウトするようにユーザに指示してください。
-
-# ローカル CLI :id=local-cli
-
-グローバル CLI を使いたくない場合は、`qmk_firmware` に付属のローカル CLI があります。`qmk_firmware/bin/qmk` で見つけることができます。任意のディレクトリから `qmk` コマンドを実行でき、常に `qmk_firmware` のコピー上で動作します。
-
-**例**:
-
-```
-$ ~/qmk_firmware/bin/qmk hello
-Ψ Hello, World!
-```
-
-## ローカル CLI の制限
-
-グローバル CLI と比較して、ローカル CLI には幾つかの制限があります:
-
-* ローカル CLI は `qmk setup` あるいは `qmk clone` をサポートしません。
-* 複数のリポジトリがクローンされている場合でも、ローカル CLI は常に `qmk_firmware` ツリー上で動作します。
-* ローカル CLI は virtualenv で動作しません。そのため依存関係が競合する可能性があります
-
-# CLI コマンド :id=cli-commands
-
-## `qmk cformat`
-
-このコマンドは clang-format を使って C コードを整形します。引数無しで実行して全てのコアコードを整形するか、コマンドラインでファイル名を渡して特定のファイルに対して実行します。
-
-**使用法**:
-
-```
-qmk cformat [file1] [file2] [...] [fileN]
-```
-
-## `qmk compile`
-
-このコマンドにより、任意のディレクトリからファームウェアをコンパイルすることができます。 からエクスポートした JSON をコンパイルするか、リポジトリ内でキーマップをコンパイルするか、現在の作業ディレクトリでキーボードをコンパイルすることができます。
-
-**Configurator Exports での使い方**:
-
-```
-qmk compile
-```
-
-**キーマップでの使い方**:
-
-```
-qmk compile -kb -km
-```
-
-**キーボードディレクトリでの使い方**:
-
-default キーマップのあるキーボードディレクトリ、キーボードのキーマップディレクトリ、`--keymap ` で与えられるキーマップディレクトリにいなければなりません。
-```
-qmk compile
-```
-
-**例**:
-```
-$ qmk config compile.keymap=default
-$ cd ~/qmk_firmware/keyboards/planck/rev6
-$ qmk compile
-Ψ Compiling keymap with make planck/rev6:default
-...
-```
-あるいはオプションのキーマップ引数を指定して
-
-```
-$ cd ~/qmk_firmware/keyboards/clueboard/66/rev4
-$ qmk compile -km 66_iso
-Ψ Compiling keymap with make clueboard/66/rev4:66_iso
-...
-```
-あるいはキーマップディレクトリで
-
-```
-$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
-$ qmk compile
-Ψ Compiling keymap with make make gh60/satan:colemak
-...
-```
-
-**レイアウトディレクトリでの使い方**:
-
-`qmk_firmware/layouts/` 以下のキーマップディレクトリにいなければなりません。
-```
-qmk compile -kb
-```
-
-**例**:
-```
-$ cd ~/qmk_firmware/layouts/community/60_ansi/mechmerlin-ansi
-$ qmk compile -kb dz60
-Ψ Compiling keymap with make dz60:mechmerlin-ansi
-...
-```
-
-## `qmk flash`
-
-このコマンドは `qmk compile` に似ていますが、ブートローダを対象にすることもできます。ブートローダはオプションで、デフォルトでは `:flash` に設定されています。
-違うブートローダを指定するには、`-bl ` を使ってください。利用可能なブートローダの詳細については、
-を見てください。
-
-**Configurator Exports での使い方**:
-
-```
-qmk flash -bl
-```
-
-**キーマップでの使い方**:
-
-```
-qmk flash -kb -km -bl
-```
-
-**ブートローダのリスト**
-
-```
-qmk flash -b
-```
-
-## `qmk config`
-
-このコマンドにより QMK の挙動を設定することができます。完全な `qmk config` のドキュメントについては、[CLI 設定](ja/cli_configuration.md)を見てください。
-
-**使用法**:
-
-```
-qmk config [-ro] [config_token1] [config_token2] [...] [config_tokenN]
-```
-
-## `qmk docs`
-
-このコマンドは、ドキュメントを参照または改善するために使うことができるローカル HTTP サーバを起動します。デフォルトのポートは 8936 です。
-
-**使用法**:
-
-```
-qmk docs [-p PORT]
-```
-
-## `qmk doctor`
-
-このコマンドは環境を調査し、潜在的なビルドあるいは書き込みの問題について警告します。必要に応じてそれらの多くを修正できます。
-
-**使用法**:
-
-```
-qmk doctor [-y] [-n]
-```
-
-**例**:
-
-環境に問題がないか確認し、それらを修正するよう促します:
-
- qmk doctor
-
-環境を確認し、見つかった問題を自動的に修正します:
-
- qmk doctor -y
-
-環境を確認し、問題のみをレポートします:
-
- qmk doctor -n
-
-## `qmk json2c`
-
-QMK Configurator からエクスポートしたものから keymap.c を生成します。
-
-**使用法**:
-
-```
-qmk json2c [-o OUTPUT] filename
-```
-
-## `qmk kle2json`
-
-このコマンドにより、生の KLE データから QMK Configurator の JSON へ変換することができます。絶対パスあるいは現在のディレクトリ内のファイル名のいずれかを受け取ります。デフォルトでは、`info.json` が既に存在している場合は上書きしません。上書きするには、`-f` あるいは `--force` フラグを使ってください。
-
-**使用法**:
-
-```
-qmk kle2json [-f]
-```
-
-**例**:
-
-```
-$ qmk kle2json kle.txt
-☒ File info.json already exists, use -f or --force to overwrite.
-```
-
-```
-$ qmk kle2json -f kle.txt -f
-Ψ Wrote out to info.json
-```
-
-## `qmk list-keyboards`
-
-このコマンドは現在 `qmk_firmware` で定義されている全てのキーボードをリスト化します。
-
-**使用法**:
-
-```
-qmk list-keyboards
-```
-
-## `qmk list-keymaps`
-
-このコマンドは指定されたキーボード(とリビジョン)の全てのキーマップをリスト化します。
-
-**使用法**:
-
-```
-qmk list-keymaps -kb planck/ez
-```
-
-## `qmk new-keymap`
-
-このコマンドは、キーボードの既存のデフォルトのキーマップに基づいて新しいキーマップを作成します。
-
-**使用法**:
-
-```
-qmk new-keymap [-kb KEYBOARD] [-km KEYMAP]
-```
-
-## `qmk pyformat`
-
-このコマンドは `qmk_firmware` 内の python コードを整形します。
-
-**使用法**:
-
-```
-qmk pyformat
-```
-
-## `qmk pytest`
-
-このコマンドは python のテストスィートを実行します。python コードに変更を加えた場合、これの実行が成功することを確認する必要があります。
-
-**使用法**:
-
-```
-qmk pytest
-```
diff --git a/docs/ja/cli_commands.md b/docs/ja/cli_commands.md
new file mode 100644
index 00000000000..013689e5e84
--- /dev/null
+++ b/docs/ja/cli_commands.md
@@ -0,0 +1,258 @@
+# QMK CLI コマンド
+
+
+
+# CLI コマンド
+
+## `qmk cformat`
+
+このコマンドは clang-format を使って C コードを整形します。
+
+引数無しで実行すると、変更された全てのコアコードを整形します。デフォルトでは `git diff` で `origin/master` をチェックし、ブランチは `-b ` を使って変更できます。
+
+`-a` で全てのコアコードを整形するか、コマンドラインでファイル名を渡して特定のファイルに対して実行します。
+
+**指定したファイルに対する使い方**:
+
+```
+qmk cformat [file1] [file2] [...] [fileN]
+```
+
+**全てのコアファイルに対する使い方**:
+
+```
+qmk cformat -a
+```
+
+**origin/master で変更されたファイルのみに対する使い方**:
+
+```
+qmk cformat
+```
+
+**branch_name で変更されたファイルのみに対する使い方**:
+
+```
+qmk cformat -b branch_name
+```
+
+## `qmk compile`
+
+このコマンドにより、任意のディレクトリからファームウェアをコンパイルすることができます。 からエクスポートした JSON をコンパイルするか、リポジトリ内でキーマップをコンパイルするか、現在の作業ディレクトリでキーボードをコンパイルすることができます。
+
+**Configurator Exports での使い方**:
+
+```
+qmk compile
+```
+
+**キーマップでの使い方**:
+
+```
+qmk compile -kb -km
+```
+
+**キーボードディレクトリでの使い方**:
+
+default キーマップのあるキーボードディレクトリ、キーボードのキーマップディレクトリ、`--keymap ` で与えられるキーマップディレクトリにいなければなりません。
+```
+qmk compile
+```
+
+**指定したキーマップをサポートする全てのキーボードをビルドする場合の使い方**:
+
+```
+qmk compile -kb all -km
+```
+
+**例**:
+```
+$ qmk config compile.keymap=default
+$ cd ~/qmk_firmware/keyboards/planck/rev6
+$ qmk compile
+Ψ Compiling keymap with make planck/rev6:default
+...
+```
+あるいはオプションのキーマップ引数を指定して
+
+```
+$ cd ~/qmk_firmware/keyboards/clueboard/66/rev4
+$ qmk compile -km 66_iso
+Ψ Compiling keymap with make clueboard/66/rev4:66_iso
+...
+```
+あるいはキーマップディレクトリで
+
+```
+$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
+$ qmk compile
+Ψ Compiling keymap with make make gh60/satan:colemak
+...
+```
+
+**レイアウトディレクトリでの使い方**:
+
+`qmk_firmware/layouts/` 以下のキーマップディレクトリにいなければなりません。
+```
+qmk compile -kb
+```
+
+**例**:
+```
+$ cd ~/qmk_firmware/layouts/community/60_ansi/mechmerlin-ansi
+$ qmk compile -kb dz60
+Ψ Compiling keymap with make dz60:mechmerlin-ansi
+...
+```
+
+## `qmk flash`
+
+このコマンドは `qmk compile` に似ていますが、ブートローダを対象にすることもできます。ブートローダはオプションで、デフォルトでは `:flash` に設定されています。
+違うブートローダを指定するには、`-bl ` を使ってください。利用可能なブートローダの詳細については、[ファームウェアを書き込む](ja/flashing.md)を見てください。
+
+**Configurator Exports での使い方**:
+
+```
+qmk flash -bl
+```
+
+**キーマップでの使い方**:
+
+```
+qmk flash -kb -km -bl
+```
+
+**ブートローダの列挙**
+
+```
+qmk flash -b
+```
+
+## `qmk config`
+
+このコマンドにより QMK の挙動を設定することができます。完全な `qmk config` のドキュメントについては、[CLI 設定](ja/cli_configuration.md)を見てください。
+
+**使用法**:
+
+```
+qmk config [-ro] [config_token1] [config_token2] [...] [config_tokenN]
+```
+
+## `qmk docs`
+
+このコマンドは、ドキュメントを参照または改善するために使うことができるローカル HTTP サーバを起動します。デフォルトのポートは 8936 です。
+
+**使用法**:
+
+```
+qmk docs [-p PORT]
+```
+
+## `qmk doctor`
+
+このコマンドは環境を調査し、潜在的なビルドあるいは書き込みの問題について警告します。必要に応じてそれらの多くを修正できます。
+
+**使用法**:
+
+```
+qmk doctor [-y] [-n]
+```
+
+**例**:
+
+環境に問題がないか確認し、それらを修正するよう促します:
+
+ qmk doctor
+
+環境を確認し、見つかった問題を自動的に修正します:
+
+ qmk doctor -y
+
+環境を確認し、問題のみをレポートします:
+
+ qmk doctor -n
+
+## `qmk json2c`
+
+QMK Configurator からエクスポートしたものから keymap.c を生成します。
+
+**使用法**:
+
+```
+qmk json2c [-o OUTPUT] filename
+```
+
+## `qmk kle2json`
+
+このコマンドにより、生の KLE データから QMK Configurator の JSON へ変換することができます。絶対パスあるいは現在のディレクトリ内のファイル名のいずれかを受け取ります。デフォルトでは、`info.json` が既に存在している場合は上書きしません。上書きするには、`-f` あるいは `--force` フラグを使ってください。
+
+**使用法**:
+
+```
+qmk kle2json [-f]
+```
+
+**例**:
+
+```
+$ qmk kle2json kle.txt
+☒ File info.json already exists, use -f or --force to overwrite.
+```
+
+```
+$ qmk kle2json -f kle.txt -f
+Ψ Wrote out to info.json
+```
+
+## `qmk list-keyboards`
+
+このコマンドは現在 `qmk_firmware` で定義されている全てのキーボードを列挙します。
+
+**使用法**:
+
+```
+qmk list-keyboards
+```
+
+## `qmk list-keymaps`
+
+このコマンドは指定されたキーボード(とリビジョン)の全てのキーマップを列挙します。
+
+**使用法**:
+
+```
+qmk list-keymaps -kb planck/ez
+```
+
+## `qmk new-keymap`
+
+このコマンドは、キーボードの既存のデフォルトのキーマップに基づいて新しいキーマップを作成します。
+
+**使用法**:
+
+```
+qmk new-keymap [-kb KEYBOARD] [-km KEYMAP]
+```
+
+## `qmk pyformat`
+
+このコマンドは `qmk_firmware` 内の python コードを整形します。
+
+**使用法**:
+
+```
+qmk pyformat
+```
+
+## `qmk pytest`
+
+このコマンドは python のテストスィートを実行します。python コードに変更を加えた場合、これの実行が成功することを確認する必要があります。
+
+**使用法**:
+
+```
+qmk pytest
+```
diff --git a/docs/ja/config_options.md b/docs/ja/config_options.md
index b994b1982c5..9e0dd714729 100644
--- a/docs/ja/config_options.md
+++ b/docs/ja/config_options.md
@@ -1,8 +1,8 @@
# QMK の設定
QMK はほぼ無制限に設定可能です。可能なところはいかなるところでも、やりすぎな程、ユーザーがコードサイズを犠牲にしてでも彼らのキーボードをカスタマイズをすることを許しています。ただし、このレベルの柔軟性により設定が困難になります。
@@ -39,167 +39,173 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
## ハードウェアオプション
* `#define VENDOR_ID 0x1234`
- * VID を定義します。ほとんどの DIY プロジェクトにおいて、任意のものを定義できます
+ * VID を定義します。ほとんどの DIY プロジェクトにおいて、任意のものを定義できます
* `#define PRODUCT_ID 0x5678`
- * PID を定義します。ほとんどの DIY プロジェクトでは、任意のものを定義できます
+ * PID を定義します。ほとんどの DIY プロジェクトでは、任意のものを定義できます
* `#define DEVICE_VER 0`
- * デバイスのバージョンを定義します (多くの場合リビジョンに使われます)
+ * デバイスのバージョンを定義します (多くの場合リビジョンに使われます)
* `#define MANUFACTURER Me`
- * 一般的に、誰もしくはどのブランドがボードを作成したか
+ * 一般的に、誰もしくはどのブランドがボードを作成したか
* `#define PRODUCT Board`
- * キーボードの名前
+ * キーボードの名前
* `#define DESCRIPTION a keyboard`
- * キーボードの簡単な説明
+ * キーボードの簡単な説明
* `#define MATRIX_ROWS 5`
- * キーボードのマトリックスの行の数
+ * キーボードのマトリックスの行の数
* `#define MATRIX_COLS 15`
- * キーボードのマトリックスの列の数
+ * キーボードのマトリックスの列の数
* `#define MATRIX_ROW_PINS { D0, D5, B5, B6 }`
- * 行のピン、上から下へ
+ * 行のピン、上から下へ
* `#define MATRIX_COL_PINS { F1, F0, B0, C7, F4, F5, F6, F7, D4, D6, B4, D7 }`
- * 列のピン、左から右へ
+ * 列のピン、左から右へ
+* `#define MATRIX_IO_DELAY 30`
+ * マトリックスピン状態の変更と値の読み取り間のマイクロ秒単位の遅延
* `#define UNUSED_PINS { D1, D2, D3, B1, B2, B3 }`
- * 参考として、キーボードで使われていないピン
+ * 参考として、キーボードで使われていないピン
* `#define MATRIX_HAS_GHOST`
- * マトリックスにゴーストがあるか(ありそうにないか)定義します
+ * マトリックスにゴーストがあるか(ありそうにないか)定義します
* `#define DIODE_DIRECTION COL2ROW`
- * COL2ROW あるいは ROW2COL - マトリックスがどのように設定されているか。COL2ROW は、スイッチとロウ(行)ラインの間にダイオードが黒い印をロウ(行)ラインに向けて置いてあることを意味します。
+ * COL2ROW あるいは ROW2COL - マトリックスがどのように設定されているか。COL2ROW は、スイッチとロウ(行)ラインの間にダイオードが黒い印をロウ(行)ラインに向けて置いてあることを意味します。
* `#define DIRECT_PINS { { F1, F0, B0, C7 }, { F4, F5, F6, F7 } }`
- * ロウ(行)ラインとカラム(列)ラインにマップされているピンを左から右に。各スイッチが個別のピンとグラウンドに接続されているマトリックスを定義します。
+ * ロウ(行)ラインとカラム(列)ラインにマップされているピンを左から右に。各スイッチが個別のピンとグラウンドに接続されているマトリックスを定義します。
* `#define AUDIO_VOICES`
- * (循環させるために)代替音声を有効にします
+ * (循環させるために)代替音声を有効にします
* `#define C4_AUDIO`
- * ピン C4 のオーディオを有効にします
+ * ピン C4 のオーディオを有効にします
* `#define C5_AUDIO`
- * ピン C5 のオーディオを有効にします
+ * ピン C5 のオーディオを有効にします
* `#define C6_AUDIO`
- * ピン C6 のオーディオを有効にします
+ * ピン C6 のオーディオを有効にします
* `#define B5_AUDIO`
- * ピン B5 のオーディオを有効にします (C[4-6]\_AUDIO の1つとともに B[5-7]\_AUDIO の1つが有効にされている場合、疑似ステレオが有効にされます)
+ * ピン B5 のオーディオを有効にします (C[4-6]\_AUDIO の1つとともに B[5-7]\_AUDIO の1つが有効にされている場合、疑似ステレオが有効にされます)
* `#define B6_AUDIO`
- * ピン B6 のオーディオを有効にします (C[4-6]\_AUDIO の1つとともに B[5-7]\_AUDIO の1つが有効にされている場合、疑似ステレオが有効にされます)
+ * ピン B6 のオーディオを有効にします (C[4-6]\_AUDIO の1つとともに B[5-7]\_AUDIO の1つが有効にされている場合、疑似ステレオが有効にされます)
* `#define B7_AUDIO`
- * ピン B7 のオーディオを有効にします (C[4-6]\_AUDIO の1つとともに B[5-7]\_AUDIO の1つが有効にされている場合、疑似ステレオが有効にされます)
+ * ピン B7 のオーディオを有効にします (C[4-6]\_AUDIO の1つとともに B[5-7]\_AUDIO の1つが有効にされている場合、疑似ステレオが有効にされます)
* `#define BACKLIGHT_PIN B7`
- * バックライトのピン
+ * バックライトのピン
* `#define BACKLIGHT_LEVELS 3`
- * バックライトのレベル数 (off を除いて最大31)
+ * バックライトのレベル数 (off を除いて最大31)
* `#define BACKLIGHT_BREATHING`
- * バックライトのブレスを有効にします
+ * バックライトのブレスを有効にします
* `#define BREATHING_PERIOD 6`
- * 1つのバックライトの "ブレス" の長さの秒数
+ * 1つのバックライトの "ブレス" の長さの秒数
* `#define DEBOUNCE 5`
- * ピンの値を読み取る時の遅延 (5がデフォルト)
+ * ピンの値を読み取る時の遅延 (5がデフォルト)
* `#define LOCKING_SUPPORT_ENABLE`
- * メカニカルロックのサポート。キーマップで KC_LCAP、 KC_LNUM そして KC_LSCR を使えるようにします
+ * メカニカルロックのサポート。キーマップで KC_LCAP、 KC_LNUM そして KC_LSCR を使えるようにします
* `#define LOCKING_RESYNC_ENABLE`
- * キーボードの LED の状態をスイッチの状態と一致させ続けようとします
+ * キーボードの LED の状態をスイッチの状態と一致させ続けようとします
* `#define IS_COMMAND() (get_mods() == MOD_MASK_SHIFT)`
- * マジックコマンドの使用を可能にするキーの組み合わせ (デバッグに便利です)
+ * マジックコマンドの使用を可能にするキーの組み合わせ (デバッグに便利です)
* `#define USB_MAX_POWER_CONSUMPTION 500`
- * デバイスの USB 経由の最大電力(mA) を設定します (デフォルト: 500)
+ * デバイスの USB 経由の最大電力(mA) を設定します (デフォルト: 500)
* `#define USB_POLLING_INTERVAL_MS 10`
- * キーボード、マウス および 共有 (NKRO/メディアキー) インタフェースのための USB ポーリングレートをミリ秒で設定します
+ * キーボード、マウス および 共有 (NKRO/メディアキー) インタフェースのための USB ポーリングレートをミリ秒で設定します
* `#define F_SCL 100000L`
- * I2C を使用するキーボードのための I2C クロックレート速度を設定します。デフォルトは `400000L` ですが、`split_common` を使っているキーボードは別でデフォルトは `100000L` です。
+ * I2C を使用するキーボードのための I2C クロックレート速度を設定します。デフォルトは `400000L` ですが、`split_common` を使っているキーボードは別でデフォルトは `100000L` です。
## 無効にできる機能
これらのオプションを定義すると、関連する機能が無効になり、コードサイズを節約できます。
* `#define NO_DEBUG`
- * デバッグを無効にします
+ * デバッグを無効にします
* `#define NO_PRINT`
- * hid_listen を使った出力やデバッグを無効にします
+ * hid_listen を使った出力やデバッグを無効にします
* `#define NO_ACTION_LAYER`
- * レイヤーを無効にします
+ * レイヤーを無効にします
* `#define NO_ACTION_TAPPING`
- * タップダンスと他のタップ機能を無効にします
+ * タップダンスと他のタップ機能を無効にします
* `#define NO_ACTION_ONESHOT`
- * ワンショットモディファイアを無効にします
+ * ワンショットモディファイアを無効にします
* `#define NO_ACTION_MACRO`
- * 古い形式のマクロ処理を無効にします: MACRO() & action_get_macro
+ * 古い形式のマクロ処理を無効にします: MACRO() & action_get_macro
* `#define NO_ACTION_FUNCTION`
- * fn_actions 配列(非推奨)からの action_function() の呼び出しを無効にします
+ * fn_actions 配列(非推奨)からの action_function() の呼び出しを無効にします
## 有効にできる機能
これらのオプションを定義すると、関連する機能が有効になり、コードサイズが大きくなるかもしれません。
* `#define FORCE_NKRO`
- * NKRO をデフォルトでオンにする必要があります。これにより EEPROM の設定に関係なく、キーボードの起動時に NKRO が強制的にオンになります。NKRO は引き続きオフにできますが、キーボードを再起動すると再びオンになります。
+ * NKRO をデフォルトでオンにする必要があります。これにより EEPROM の設定に関係なく、キーボードの起動時に NKRO が強制的にオンになります。NKRO は引き続きオフにできますが、キーボードを再起動すると再びオンになります。
* `#define STRICT_LAYER_RELEASE`
- * キーリリースがどのレイヤーから来たのかを覚えるのではなく、現在のレイヤースタックを使って強制的に評価されるようにします (高度なケースに使われます)
+ * キーリリースがどのレイヤーから来たのかを覚えるのではなく、現在のレイヤースタックを使って強制的に評価されるようにします (高度なケースに使われます)
## 設定可能な挙動
* `#define TAPPING_TERM 200`
- * タップがホールドになるまでの時間。500以上に設定された場合、タップ期間中にタップされたキーもホールドになります。(訳注: PERMISSIVE_HOLDも参照)
+ * タップがホールドになるまでの時間。500以上に設定された場合、タップ期間中にタップされたキーもホールドになります。(訳注: PERMISSIVE_HOLDも参照)
* `#define TAPPING_TERM_PER_KEY`
- * キーごとの `TAPPING_TERM` 設定の処理を有効にします
+ * キーごとの `TAPPING_TERM` 設定の処理を有効にします
* `#define RETRO_TAPPING`
- * 押下とリリースの間に他のキーによる中断がなければ、TAPPING_TERM の後であってもとにかくタップします
- * 詳細は [Retro Tapping](ja/feature_advanced_keycodes.md#retro-tapping) を見てください
+ * 押下とリリースの間に他のキーによる中断がなければ、TAPPING_TERM の後であってもとにかくタップします
+ * 詳細は [Retro Tapping](ja/tap_hold.md#retro-tapping) を見てください
* `#define TAPPING_TOGGLE 2`
- * トグルを引き起こす前のタップ数
+ * トグルを引き起こす前のタップ数
* `#define PERMISSIVE_HOLD`
- * `TAPPING_TERM` にヒットしていなくても、リリースする前に別のキーが押されると、タップとフォールドキーがホールドを引き起こします
- * 詳細は [Permissive Hold](ja/feature_advanced_keycodes.md#permissive-hold) を見てください
+ * `TAPPING_TERM` にヒットしていなくても、リリースする前に別のキーが押されると、タップとホールドキーがホールドを引き起こします
+ * 詳細は [Permissive Hold](ja/tap_hold.md#permissive-hold) を見てください
+* `#define PERMISSIVE_HOLD_PER_KEY`
+ * キーごとの `PERMISSIVE_HOLD` 設定の処理を有効にします
* `#define IGNORE_MOD_TAP_INTERRUPT`
- * 両方のキーに `TAPPING_TERM` を適用することで、ホールド時に他のキーに変換するキーを使ってローリングコンボ (zx) をすることができるようにします
- * 詳細は [Mod tap interrupt](ja/feature_advanced_keycodes.md#ignore-mod-tap-interrupt) を見てください
+ * 両方のキーに `TAPPING_TERM` を適用することで、ホールド時に他のキーに変換するキーを使ってローリングコンボ (zx) をすることができるようにします
+ * 詳細は [Ignore Mod Tap Interrupt](ja/tap_hold.md#ignore-mod-tap-interrupt) を見てください
* `#define IGNORE_MOD_TAP_INTERRUPT_PER_KEY`
- * キーごとの `IGNORE_MOD_TAP_INTERRUPT` 設定の処理を有効にします
+ * キーごとの `IGNORE_MOD_TAP_INTERRUPT` 設定の処理を有効にします
* `#define TAPPING_FORCE_HOLD`
- * タップされた直後に、デュアルロールキーを修飾子として使用できるようにします
- * [Hold after tap](ja/feature_advanced_keycodes.md#tapping-force-hold)を見てください
- * タップトグル機能を無効にします (`TT` あるいは One Shot Tap Toggle)
+ * タップされた直後に、デュアルロールキーを修飾子として使用できるようにします
+ * [Tapping Force Hold](ja/tap_hold.md#tapping-force-hold)を見てください
+ * タップトグル機能を無効にします (`TT` あるいは One Shot Tap Toggle)
* `#define TAPPING_FORCE_HOLD_PER_KEY`
- * キーごとの `TAPPING_FORCE_HOLD` 設定処理を有効にします。
+ * キーごとの `TAPPING_FORCE_HOLD` 設定処理を有効にします。
* `#define LEADER_TIMEOUT 300`
- * リーダーキーがタイムアウトするまでの時間
- * タイムアウトする前にシーケンスを終了できない場合は、タイムアウトの設定を増やす必要があるかもしれません。あるいは、`LEADER_PER_KEY_TIMING` オプションを有効にすると良いでしょう。これは各キーがタップされた後でタイムアウトを再設定します。
+ * リーダーキーがタイムアウトするまでの時間
+ * タイムアウトする前にシーケンスを終了できない場合は、タイムアウトの設定を増やす必要があるかもしれません。あるいは、`LEADER_PER_KEY_TIMING` オプションを有効にすると良いでしょう。これは各キーがタップされた後でタイムアウトを再設定します。
* `#define LEADER_PER_KEY_TIMING`
- * 全体では無く各キーを押すたびに実行されるリーダーキーコードのタイマーを設定します
+ * 全体では無く各キーを押すたびに実行されるリーダーキーコードのタイマーを設定します
* `#define LEADER_KEY_STRICT_KEY_PROCESSING`
- * Mod-Tap および Layer-Tap キーコードのためのキーコードフィルタリングを無効にします。例えば、これを有効にすると、`KC_A` を使いたい場合は `MT(MOD_CTL, KC_A)` を指定する必要があります。
+ * Mod-Tap および Layer-Tap キーコードのためのキーコードフィルタリングを無効にします。例えば、これを有効にすると、`KC_A` を使いたい場合は `MT(MOD_CTL, KC_A)` を指定する必要があります。
* `#define ONESHOT_TIMEOUT 300`
- * ワンショットがタイムアウトするまでの時間
+ * ワンショットがタイムアウトするまでの時間
* `#define ONESHOT_TAP_TOGGLE 2`
- * ワンショットトグルが引き起こされるまでのタップ数
+ * ワンショットトグルが引き起こされるまでのタップ数
* `#define QMK_KEYS_PER_SCAN 4`
- * 走査ごとに1つ以上のキーを送信できるようにします。デフォルトでは、走査ごとに `process_record()` 経由で1つのキーイベントのみが送信されます。これはほとんどのタイピングにほとんど影響しませんが、多くのコードを入力しているか、走査レートが最初から遅い場合、キーイベントの処理に多少の遅延が生じる可能性があります。それぞれのプレスとリリースは別のイベントです。スキャン時間が 1ms 程度のキーボードの場合、とても高速なタイピストでさえ、実際にキーボードから数 ms 以上の遅延を発生させるのに必要な 500 キーストロークを1秒間に生成することはないでしょう。しかし、3~4ms の走査時間でコードを入力している場合はどうでしょうか?おそらくこれが必要です。
+ * 走査ごとに1つ以上のキーを送信できるようにします。デフォルトでは、走査ごとに `process_record()` 経由で1つのキーイベントのみが送信されます。これはほとんどのタイピングにほとんど影響しませんが、多くのコードを入力しているか、走査レートが最初から遅い場合、キーイベントの処理に多少の遅延が生じる可能性があります。それぞれのプレスとリリースは別のイベントです。スキャン時間が 1ms 程度のキーボードの場合、とても高速なタイピストでさえ、実際にキーボードから数 ms 以上の遅延を発生させるのに必要な 500 キーストロークを1秒間に生成することはないでしょう。しかし、3~4ms の走査時間でコードを入力している場合はどうでしょうか?おそらくこれが必要です。
* `#define COMBO_COUNT 2`
- * [コンボ](ja/feature_combo.md)機能で使っているコンボの数にこれを設定します。
+ * [コンボ](ja/feature_combo.md)機能で使っているコンボの数にこれを設定します。
* `#define COMBO_TERM 200`
- * コンボキーが検出されるまでの時間。定義されていない場合は、デフォルトは `TAPPING_TERM` です。
+ * コンボキーが検出されるまでの時間。定義されていない場合は、デフォルトは `TAPPING_TERM` です。
* `#define TAP_CODE_DELAY 100`
- * 適切な登録に問題がある場合(VUSB ボードで珍しくない)、`register_code` と `unregister_code` の間の遅延を設定します。値はミリ秒です。
+ * 適切な登録に問題がある場合(VUSB ボードで珍しくない)、`register_code` と `unregister_code` の間の遅延を設定します。値はミリ秒です。
* `#define TAP_HOLD_CAPS_DELAY 80`
- * MacOS で特別な処理が行われるため、`KC_CAPSLOCK` を使う時にタップホールドキー (`LT`, `MT`) に遅延を設定します。この値はミリ秒で、定義されていない場合はデフォルトは80msです。macOS については、これを200以上に設定すると良いでしょう。
+ * MacOS で特別な処理が行われるため、`KC_CAPSLOCK` を使う時にタップホールドキー (`LT`, `MT`) に遅延を設定します。この値はミリ秒で、定義されていない場合はデフォルトは80msです。macOS については、これを200以上に設定すると良いでしょう。
## RGB ライト設定 :id=rgb-light-configuration
* `#define RGB_DI_PIN D7`
- * WS2812 の DI 端子につなぐピン
+ * WS2812 の DI 端子につなぐピン
* `#define RGBLIGHT_ANIMATIONS`
- * RGB アニメーションを実行します
+ * RGB アニメーションを実行します
+* `#define RGBLIGHT_LAYERS`
+ * オンとオフを切り替えることができる [ライトレイヤー](ja/feature_rgblight.md) を定義できます。現在のキーボードレイヤーまたは Caps Lock 状態を表示するのに最適です。
* `#define RGBLED_NUM 12`
- * LED の数
+ * LED の数
* `#define RGBLIGHT_SPLIT`
- * 分割キーボードの左半分の RGB LED の出力を右半分の RGB LED の入力につなげるかわりに、それぞれの側で個別にコントローラの出力ピンが直接 RGB LED の入力に繋がっているときは、この定義が必要です。
+ * 分割キーボードの左半分の RGB LED の出力を右半分の RGB LED の入力につなげるかわりに、それぞれの側で個別にコントローラの出力ピンが直接 RGB LED の入力に繋がっているときは、この定義が必要です。
* `#define RGBLED_SPLIT { 6, 6 }`
- * 分割キーボードの各半分の `RGB_DI_PIN` に直接配線されている接続されている LED の数
- * 最初の値は左半分の LED の数を示し、2番目の値は右半分です。
- * RGBLED_SPLIT が定義されている場合、RGBLIGHT_SPLIT は暗黙的に定義されます。
+ * 分割キーボードの各半分の `RGB_DI_PIN` に直接配線されている接続されている LED の数
+ * 最初の値は左半分の LED の数を示し、2番目の値は右半分です。
+ * RGBLED_SPLIT が定義されている場合、RGBLIGHT_SPLIT は暗黙的に定義されます。
* `#define RGBLIGHT_HUE_STEP 12`
- * 色相の増減時のステップ単位
+ * 色相の増減時のステップ単位
* `#define RGBLIGHT_SAT_STEP 25`
- * 彩度の増減時のステップ単位
+ * 彩度の増減時のステップ単位
* `#define RGBLIGHT_VAL_STEP 12`
- * 値(明度)の増減時のステップ単位
+ * 値(明度)の増減時のステップ単位
* `#define RGBW`
- * RGBW LED のサポートを有効にします
+ * RGBW LED のサポートを有効にします
## マウスキーオプション
@@ -214,7 +220,7 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
分割キーボード固有のオプション。あなたの rules.mk に 'SPLIT_KEYBOARD = yes' が有ることを確認してください。
* `SPLIT_TRANSPORT = custom`
- * 標準の分割通信ルーチンをカスタムのものに置き換えることができます。現在、ARM ベースの分割キーボードはこれを使わなければなりません。
+ * 標準の分割通信ルーチンをカスタムのものに置き換えることができます。現在、ARM ベースの分割キーボードはこれを使わなければなりません。
### 左右の設定
@@ -233,52 +239,52 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
#### 左右を定義します
* `#define SPLIT_HAND_PIN B7`
- * high/low ピンを使って左右を決定します。low = 右手、high = 左手。`B7` を使っているピンに置き換えます。これはオプションで、`SPLIT_HAND_PIN` が未定義のままである場合、EE_HANDS メソッドまたは標準の Let's Splitが使っている MASTER_LEFT / MASTER_RIGHT 定義をまだ使うことができます。
+ * high/low ピンを使って左右を決定します。low = 右手、high = 左手。`B7` を使っているピンに置き換えます。これはオプションで、`SPLIT_HAND_PIN` が未定義のままである場合、EE_HANDS メソッドまたは標準の Let's Splitが使っている MASTER_LEFT / MASTER_RIGHT 定義をまだ使うことができます。
* `#define EE_HANDS` (`SPLIT_HAND_PIN` が定義されていない場合のみ動作します)
- * `eeprom-lefthand.eep`/`eeprom-righthand.eep` がそれぞれの半分に書き込まれた後で、EEPROM 内に格納されている左右の設定の値を読み込みます。
+ * `eeprom-lefthand.eep`/`eeprom-righthand.eep` がそれぞれの半分に書き込まれた後で、EEPROM 内に格納されている左右の設定の値を読み込みます。
* `#define MASTER_RIGHT`
- * マスター側が右側と定義されます。
+ * マスター側が右側と定義されます。
### 他のオプション
* `#define USE_I2C`
- * Serial の代わりに I2C を使う場合 (デフォルトは serial)
+ * Serial の代わりに I2C を使う場合 (デフォルトは serial)
* `#define SOFT_SERIAL_PIN D0`
- * serial を使う場合、これを定義します。`D0` あるいは `D1`,`D2`,`D3`,`E6`。
+ * serial を使う場合、これを定義します。`D0` あるいは `D1`,`D2`,`D3`,`E6`。
* `#define MATRIX_ROW_PINS_RIGHT { }`
* `#define MATRIX_COL_PINS_RIGHT { }`
- * 右半分に左半分と異なるピン配置を指定したい場合は、`MATRIX_ROW_PINS_RIGHT`/`MATRIX_COL_PINS_RIGHT` を定義することができます。現在のところ、`MATRIX_ROW_PINS` のサイズは `MATRIX_ROW_PINS_RIGHT` と同じでなければならず、列の定義も同様です。
+ * 右半分に左半分と異なるピン配置を指定したい場合は、`MATRIX_ROW_PINS_RIGHT`/`MATRIX_COL_PINS_RIGHT` を定義することができます。現在のところ、`MATRIX_ROW_PINS` のサイズは `MATRIX_ROW_PINS_RIGHT` と同じでなければならず、列の定義も同様です。
* `#define DIRECT_PINS_RIGHT { { F1, F0, B0, C7 }, { F4, F5, F6, F7 } }`
- * 右半分に左半分と異なる直接ピン配置を指定したい場合は、`DIRECT_PINS_RIGHT` を定義することができます。現在のところ、`DIRECT_PINS` のサイズは `DIRECT_PINS_RIGHT` と同じでなければなりません。
+ * 右半分に左半分と異なる直接ピン配置を指定したい場合は、`DIRECT_PINS_RIGHT` を定義することができます。現在のところ、`DIRECT_PINS` のサイズは `DIRECT_PINS_RIGHT` と同じでなければなりません。
* `#define RGBLED_SPLIT { 6, 6 }`
- * [RGB ライト設定](#rgb-light-configuration)を見てください。
+ * [RGB ライト設定](#rgb-light-configuration)を見てください。
* `#define SELECT_SOFT_SERIAL_SPEED ` (デフォルトの速度は1です)
- * serial 通信を使う時のプロトコルの速度を設定します。
- * 速度:
- * 0: 約 189kbps (実験目的のみ)
- * 1: 約 137kbps (デフォルト)
- * 2: 約 75kbps
- * 3: 約 39kbps
- * 4: 約 26kbps
- * 5: 約 20kbps
+ * serial 通信を使う時のプロトコルの速度を設定します。
+ * 速度:
+ * 0: 約 189kbps (実験目的のみ)
+ * 1: 約 137kbps (デフォルト)
+ * 2: 約 75kbps
+ * 3: 約 39kbps
+ * 4: 約 26kbps
+ * 5: 約 20kbps
* `#define SPLIT_USB_DETECT`
- * マスタ/スレーブを委任する時に(タイムアウト付きで) USB 接続を検出します
- * ARM についてはデフォルトの挙動
- * AVR Teensy については必須
+ * マスタ/スレーブを委任する時に(タイムアウト付きで) USB 接続を検出します
+ * ARM についてはデフォルトの挙動
+ * AVR Teensy については必須
* `#define SPLIT_USB_TIMEOUT 2000`
- * `SPLIT_USB_DETECT` を使う時のマスタ/スレーブを検出する場合の最大タイムアウト
+ * `SPLIT_USB_DETECT` を使う時のマスタ/スレーブを検出する場合の最大タイムアウト
* `#define SPLIT_USB_TIMEOUT_POLL 10`
- * `SPLIT_USB_DETECT` を使う時のマスタ/スレーブを検出する場合のポーリング頻度
+ * `SPLIT_USB_DETECT` を使う時のマスタ/スレーブを検出する場合のポーリング頻度
# `rules.mk` ファイル
@@ -287,11 +293,11 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
## ビルドオプション
* `DEFAULT_FOLDER`
- * キーボードに1つ以上のサブフォルダがある場合にデフォルトのフォルダを指定するために使われます。
+ * キーボードに1つ以上のサブフォルダがある場合にデフォルトのフォルダを指定するために使われます。
* `FIRMWARE_FORMAT`
- * ビルドの後でルート `qmk_firmware` フォルダにコピーされる形式 (bin, hex) を定義します。
+ * ビルドの後でルート `qmk_firmware` フォルダにコピーされる形式 (bin, hex) を定義します。
* `SRC`
- * コンパイル・リンクリストにファイルを追加するために使われます。
+ * コンパイル・リンクリストにファイルを追加するために使われます。
* `LIB_SRC`
* コンパイル・リンクリストにライブラリとしてファイルを追加するために使われます。
`LIB_SRC` で指定されたファイルは、`SRC` で指定されたファイルの後にリンクされます。
@@ -307,11 +313,11 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
... a.o c.o ... lib_b.a lib_d.a ...
```
* `LAYOUTS`
- * このキーボードがサポートする[レイアウト](ja/feature_layouts.md)のリスト
+ * このキーボードがサポートする[レイアウト](ja/feature_layouts.md)のリスト
* `LINK_TIME_OPTIMIZATION_ENABLE`
- * キーボードをコンパイルする時に、Link Time Optimization (`LTO`) を有効にします。これは処理に時間が掛かりますが、コンパイルされたサイズを大幅に減らします (そして、ファームウェアが小さいため、追加の時間は分からないくらいです)。ただし、`LTO` が有効な場合、古いマクロと関数の機能が壊れるため、自動的にこれらの機能を無効にします。これは `NO_ACTION_MACRO` と `NO_ACTION_FUNCTION` を自動的に定義することで行われます。
+ * キーボードをコンパイルする時に、Link Time Optimization (`LTO`) を有効にします。これは処理に時間が掛かりますが、コンパイルされたサイズを大幅に減らします (そして、ファームウェアが小さいため、追加の時間は分からないくらいです)。ただし、`LTO` が有効な場合、古いマクロと関数の機能が壊れるため、自動的にこれらの機能を無効にします。これは `NO_ACTION_MACRO` と `NO_ACTION_FUNCTION` を自動的に定義することで行われます。
* `LTO_ENABLE`
- * LINK_TIME_OPTIMIZATION_ENABLE と同じ意味です。`LINK_TIME_OPTIMIZATION_ENABLE` の代わりに `LTO_ENABLE` を使うことができます。
+ * LINK_TIME_OPTIMIZATION_ENABLE と同じ意味です。`LINK_TIME_OPTIMIZATION_ENABLE` の代わりに `LTO_ENABLE` を使うことができます。
## AVR MCU オプション
* `MCU = atmega32u4`
@@ -320,56 +326,56 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
* `F_USB = $(F_CPU)`
* `OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT`
* `BOOTLOADER = atmel-dfu` と以下のオプション:
- * `atmel-dfu`
- * `lufa-dfu`
- * `qmk-dfu`
- * `halfkay`
- * `caterina`
- * `bootloadHID`
- * `USBasp`
+ * `atmel-dfu`
+ * `lufa-dfu`
+ * `qmk-dfu`
+ * `halfkay`
+ * `caterina`
+ * `bootloadHID`
+ * `USBasp`
-## 機能オプション
+## 機能オプション :id=feature-options
これらを使って特定の機能のビルドを有効または無効にします。有効にすればするほどファームウェアが大きくなり、MCU には大きすぎるファームウェアを構築するリスクがあります。
* `BOOTMAGIC_ENABLE`
- * 仮想 DIP スイッチ設定
+ * 仮想 DIP スイッチ設定
* `MOUSEKEY_ENABLE`
- * マウスキー
+ * マウスキー
* `EXTRAKEY_ENABLE`
- * オーディオ制御とシステム制御
+ * オーディオ制御とシステム制御
* `CONSOLE_ENABLE`
- * デバッグ用コンソール
+ * デバッグ用コンソール
* `COMMAND_ENABLE`
- * デバッグ及び設定用のコマンド
+ * デバッグ及び設定用のコマンド
* `COMBO_ENABLE`
- * キーコンボ機能
+ * キーコンボ機能
* `NKRO_ENABLE`
- * USB N-キーロールオーバー - これが動作しない場合は、ここを見てください: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+ * USB N-キーロールオーバー - これが動作しない場合は、ここを見てください: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
* `AUDIO_ENABLE`
- * オーディオサブシステムを有効にします。
+ * オーディオサブシステムを有効にします。
* `RGBLIGHT_ENABLE`
- * キーボードアンダーライト機能を有効にします
+ * キーボードアンダーライト機能を有効にします
* `LEADER_ENABLE`
- * リーダーキーコードを有効にします
+ * リーダーキーコードを有効にします
* `MIDI_ENABLE`
- * MIDI 制御
+ * MIDI 制御
* `UNICODE_ENABLE`
- * Unicode
+ * Unicode
* `BLUETOOTH_ENABLE`
- * Adafruit EZ-Key HID で Bluetooth を有効にするレガシーオプション。BLUETOOTH を見てください
+ * Adafruit EZ-Key HID で Bluetooth を有効にするレガシーオプション。BLUETOOTH を見てください
* `BLUETOOTH`
- * 現在のオプションは、AdafruitEzKey、AdafruitBLE、RN42
+ * 現在のオプションは、AdafruitEzKey、AdafruitBLE、RN42
* `SPLIT_KEYBOARD`
- * 分割キーボード (let's split や bakingpy のキーボードのようなデュアル MCU) のサポートを有効にし、quantum/split_common にある全ての必要なファイルをインクルードします
+ * 分割キーボード (let's split や bakingpy のキーボードのようなデュアル MCU) のサポートを有効にし、quantum/split_common にある全ての必要なファイルをインクルードします
* `CUSTOM_MATRIX`
- * 標準マトリックス走査ルーチンを独自のものに置き換えることができます。
+ * 標準マトリックス走査ルーチンを独自のものに置き換えることができます。
* `DEBOUNCE_TYPE`
- * 標準キーデバウンスルーチンを代替または独自のものに置き換えることができます。
+ * 標準キーデバウンスルーチンを代替または独自のものに置き換えることができます。
* `WAIT_FOR_USB`
- * キーボードが起動する前に、USB 接続が確立されるのをキーボードに待機させます
+ * キーボードが起動する前に、USB 接続が確立されるのをキーボードに待機させます
* `NO_USB_STARTUP_CHECK`
- * キーボードの起動後の usb サスペンドチェックを無効にします。通常、キーボードはタスクが実行される前にホストがウェイク アップするのを待ちます。分割キーボードは半分はウェイクアップコールを取得できませんが、マスタにコマンドを送信する必要があるため、役に立ちます。
+ * キーボードの起動後の usb サスペンドチェックを無効にします。通常、キーボードはタスクが実行される前にホストがウェイク アップするのを待ちます。分割キーボードは半分はウェイクアップコールを取得できませんが、マスタにコマンドを送信する必要があるため、役に立ちます。
## USB エンドポイントの制限
diff --git a/docs/ja/contributing.md b/docs/ja/contributing.md
index 401cabcd4e6..75cedf0b347 100644
--- a/docs/ja/contributing.md
+++ b/docs/ja/contributing.md
@@ -1,8 +1,8 @@
# 貢献方法
👍🎉 まず、これを読み貢献する時間を作ってくれてありがとうございます!🎉👍
@@ -106,7 +106,7 @@ enum my_keycodes {
};
```
-### ドキュメントのプレビュー
+### ドキュメントのプレビュー :id=previewing-the-documentation
開発環境をセットアップした場合は、プルリクエストを開く前に以下のコマンドを `qmk_firmware/` フォルダから実行することで、あなたの変更をプレビューすることができます:
@@ -122,7 +122,7 @@ enum my_keycodes {
ほとんどの初めての QMK 貢献者は、個人のキーマップから始めます。キーマップの標準はかなりカジュアルなものにしようとしています(キーマップは結局のところ作成者の性格を反映しています)が、他の人があなたのキーマップを簡単に見つけて学ぶことができるように、これらのガイドラインに従うようにお願いします。
-* [the template](documentation_templates.md) を使って `readme.md` を書きます。
+* [テンプレート](documentation_templates.md) を使って `readme.md` を書きます。
* 全てのキーマップの PR は squash されるため、コミットがどのように squash されるかを気にする場合は、自分で行う必要があります。
* キーマップの PR に機能をまとめないでください。最初に機能をサブミットし、次にキーマップのための2つ目の PR をサブミットします。
* `Makefile` をキーマップフォルダに含めないでください(もう使われていません)。
@@ -134,7 +134,7 @@ enum my_keycodes {
また以下のガイドラインに従うことをお願いします:
-* [the template](ja/documentation_templates.md) を使って `readme.md` を書きます。
+* [テンプレート](ja/documentation_templates.md) を使って `readme.md` を書きます。
* コミットの数を適切に保ってください。そうでなければあなたの PR を squash します。
* コア機能を新しいキーボードにまとめないでください。最初に機能をサブミットし、次にキーボード用に別の PR をサブミットしてください。
* `.c`/`.h` ファイルにすぐ上の親フォルダに従って名前を付けます。例えば、`/keyboards///.[ch]`
diff --git a/docs/ja/custom_matrix.md b/docs/ja/custom_matrix.md
new file mode 100644
index 00000000000..f333711e63c
--- /dev/null
+++ b/docs/ja/custom_matrix.md
@@ -0,0 +1,114 @@
+# カスタムマトリックス
+
+
+
+QMKは、デフォルトのマトリックススキャンルーチンを独自のコードで部分的に入れ替えたり全部入れ替えたりしたりするメカニズムを提供します。
+
+この機能を使用する理由は次のとおりです:
+
+* キーボードのスイッチと MCU ピンの間に追加のハードウェアがある場合
+ * I/O マルチプレクサ
+ * ラインデコーダー
+* 一般的ではないキースイッチマトリックス
+ * `COL2ROW` と `ROW2COL` の同時使用
+
+## 前提条件
+
+カスタムマトリックスの実装には、通常、追加のソースファイルのコンパイルが含まれます。
+一貫性を保つために、このソースファイルのファイル名は `matrix.c` とすることをお勧めします。
+
+あなたのキーボードディレクトリに新しいファイルを追加します:
+```text
+keyboards//matrix.c
+```
+
+そして、新しいファイルのコンパイルを指定するため、以下を `rules.mk` に追加します
+```make
+SRC += matrix.c
+```
+
+## マトリックスコードの部分置き換え
+
+カスタムマトリックスを実装する際、定型コードを書かなくてすむように、さまざまなスキャン関数のデフォルト実装を提供しています。
+
+設定するには、以下を `rules.mk` に追加します:
+```make
+CUSTOM_MATRIX = lite
+```
+
+そして、キーボードディレクトリの `matrix.c` ファイルに次の関数を実装します。
+
+```c
+void matrix_init_custom(void) {
+ // TODO: ここでハードウェアの初期化をする
+}
+
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
+ bool matrix_has_changed = false;
+
+ // TODO: ここで、マトリックススキャンを行なう
+
+ return matrix_has_changed;
+}
+```
+
+## マトリックスコードの全面置き換え
+
+スキャンルーチンをさらに変更する必要がある場合は、完全なスキャンルーチンを実装することを選択できます。
+
+設定するには、以下を `rules.mk` に追加します:
+```make
+CUSTOM_MATRIX = yes
+```
+
+そして、キーボードディレクトリの `matrix.c` ファイルに次の関数を実装します。
+
+```c
+matrix_row_t matrix_get_row(uint8_t row) {
+ // TODO: 要求された行データを返します
+}
+
+void matrix_print(void) {
+ // TODO: printf() を使って現在のマトリックスの状態をコンソールにダンプします
+}
+
+void matrix_init(void) {
+ // TODO: ここでハードウェアとグローバルマトリックスの状態を初期化します
+
+ // ハードウェアによるデバウンスがない場合 - 設定されているデバウンスルーチンを初期化します
+ debounce_init(MATRIX_ROWS);
+
+ // 正しいキーボード動作のためにこれを呼び出す*必要があります*
+ matrix_init_quantum();
+}
+
+uint8_t matrix_scan(void) {
+ bool matrix_has_changed = false;
+
+ // TODO: ここにマトリックススキャンルーチンを追加します
+
+ // ハードウェアによるデバウンスがない場合 - 設定されているデバウンスルーチンを使用します
+ debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
+
+ // 正しいキーボード動作のためにこれを呼び出す*必要があります*
+ matrix_scan_quantum();
+
+ return matrix_has_changed;
+}
+```
+
+また、次のコールバックのデフォルトも提供します。
+
+```c
+__attribute__((weak)) void matrix_init_kb(void) { matrix_init_user(); }
+
+__attribute__((weak)) void matrix_scan_kb(void) { matrix_scan_user(); }
+
+__attribute__((weak)) void matrix_init_user(void) {}
+
+__attribute__((weak)) void matrix_scan_user(void) {}
+```
diff --git a/docs/ja/custom_quantum_functions.md b/docs/ja/custom_quantum_functions.md
index f49df8f65b6..7e4fbd897ee 100644
--- a/docs/ja/custom_quantum_functions.md
+++ b/docs/ja/custom_quantum_functions.md
@@ -1,8 +1,8 @@
# キーボードの挙動をカスタマイズする方法
多くの人にとって、カスタムキーボードはボタンの押下をコンピュータに送信するだけではありません。単純なボタンの押下やマクロよりも複雑なことを実行できるようにしたいでしょう。QMK にはコードを挿入したり、機能を上書きしたり、様々な状況でキーボードの挙動をカスタマイズできるフックがあります。
@@ -39,7 +39,7 @@ enum my_keycodes {
};
```
-## 任意のキーコードの挙動のプログラミング
+## 任意のキーコードの挙動のプログラミング :id=programming-the-behavior-of-any-keycode
既存のキーの挙動を上書きしたい場合、あるいは新しいキーについて挙動を定義する場合、`process_record_kb()` および `process_record_user()` 関数を使うべきです。これらは実際のキーイベントが処理される前のキー処理中に QMK によって呼び出されます。これらの関数が `true` を返す場合、QMK はキーコードを通常通りに処理します。これは、キーを置き換えるのではなく、キーの機能を拡張するのに便利です。これらの関数が `false` を返す場合、QMK は通常のキー処理をスキップし、必要なキーのアップまたはダウンイベントを送信するのかはユーザ次第です。
@@ -316,7 +316,7 @@ void suspend_wakeup_init_user(void) {
* キーボード/リビジョン : `void suspend_power_down_kb(void)` および `void suspend_wakeup_init_user(void)`
* キーマップ: `void suspend_power_down_kb(void)` および `void suspend_wakeup_init_user(void)`
-# レイヤー切り替えコード
+# レイヤー切り替えコード :id=layer-change-code
これはレイヤーが切り替えられるたびにコードを実行します。レイヤー表示あるいはカスタムレイヤー処理に役立ちます。
@@ -491,14 +491,24 @@ void eeconfig_init_user(void) { // EEPROM がリセットされます!
# カスタムタッピング期間
-デフォルトでは、タッピング期間はグローバルに設定されていて、キーでは設定することができません。ほとんどのユーザにとって、これは全然問題ありません。しかし、場合によっては、`LT` キーとは異なるタイムアウトによって、デュアルファンクションキーが大幅に改善されます。なぜなら、一部のキーは他のキーよりも押し続けやすいためです。それぞれにカスタムキーコードを使う代わりに、キーごとに設定可能な `TAPPING_TERM` を使用できます。
+デフォルトでは、タッピング期間と(`IGNORE_MOD_TAP_INTERRUPT` のような)関連オプションはグローバルに設定されていて、キーでは設定することができません。ほとんどのユーザにとって、これは全然問題ありません。しかし、場合によっては、`LT` キーとは異なるタイムアウトによって、デュアルファンクションキーが大幅に改善されます。なぜなら、一部のキーは他のキーよりも押し続けやすいためです。それぞれにカスタムキーコードを使う代わりに、キーごとに設定可能なタイムアウトの挙動を設定できます。
-この機能を有効にするには、最初に `config.h` に `#define TAPPING_TERM_PER_KEY` を追加する必要があります。
+キーごとのタイムアウトの挙動を制御するための2つの設定可能なオプションがあります:
+
+- `TAPPING_TERM_PER_KEY`
+- `IGNORE_MOD_TAP_INTERRUPT_PER_KEY`
+
+必要な機能ごとに、`config.h` に `#define` 行を追加する必要があります。
+
+```
+#define TAPPING_TERM_PER_KEY
+#define IGNORE_MOD_TAP_INTERRUPT_PER_KEY
+```
## `get_tapping_term` の実装例
-キーコードに基づいて `TAPPING TERM` を変更するには、次のようなものを `keymap.c` ファイルに追加します:
+キーコードに基づいて `TAPPING_TERM` を変更するには、次のようなものを `keymap.c` ファイルに追加します:
```c
uint16_t get_tapping_term(uint16_t keycode) {
@@ -513,6 +523,21 @@ uint16_t get_tapping_term(uint16_t keycode) {
}
```
-### `get_tapping_term` 関数のドキュメント
+## `get_ignore_mod_tap_interrupt` の実装例
+
+キーコードに基づいて `IGNORE_MOD_TAP_INTERRUPT` の値を変更するには、次のようなものを `keymap.c` ファイルに追加します:
+
+```c
+bool get_ignore_mod_tap_interrupt(uint16_t keycode) {
+ switch (keycode) {
+ case SFT_T(KC_SPC):
+ return true;
+ default:
+ return false;
+ }
+}
+```
+
+## `get_tapping_term` / `get_ignore_mod_tap_interrupt` 関数のドキュメント
ここにある他の多くの関数とは異なり、quantum あるいはキーボードレベルの関数を持つ必要はありません (または理由さえありません)。ここではユーザレベルの関数だけが有用なため、そのようにマークする必要はありません。
diff --git a/docs/ja/faq.md b/docs/ja/faq.md
deleted file mode 100644
index 00b0ff82771..00000000000
--- a/docs/ja/faq.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# よくある質問
-
-
-
-* [一般](ja/faq_general.md)
-* [QMK のビルドあるいはコンパイル](ja/faq_build.md)
-* [QMK のデバッグとトラブルシューティング](ja/faq_debug.md)
-* [キーマップ](ja/faq_keymap.md)
diff --git a/docs/ja/faq_debug.md b/docs/ja/faq_debug.md
index 8e42aebbb55..856e9473a17 100644
--- a/docs/ja/faq_debug.md
+++ b/docs/ja/faq_debug.md
@@ -152,10 +152,3 @@ https://geekhack.org/index.php?topic=14290.msg1884034#msg1884034
https://github.com/tmk/tmk_keyboard/issues/266
https://geekhack.org/index.php?topic=41989.msg1967778#msg1967778
-
-
-
-## FLIP が動作しない
-### `AtLibUsbDfu.dll` が見つかりません
-デバイスマネージャから現在のドライバを削除し、FLIP が提供するものを再インストールします。
-http://imgur.com/a/bnwzy
diff --git a/docs/ja/faq_general.md b/docs/ja/faq_general.md
index 935d1a3c6af..a365e380b30 100644
--- a/docs/ja/faq_general.md
+++ b/docs/ja/faq_general.md
@@ -1,14 +1,52 @@
# よくある質問
## QMK とは何か?
Quantum Mechanical Keyboard の略である [QMK](https://github.com/qmk) は、カスタムキーボードのためのツールをビルドしている人々のグループです。[TMK](https://github.com/tmk/tmk_keyboard) の大幅に修正されたフォークである [QMK ファームウェア](https://github.com/qmk/qmk_firmware)から始まりました。
+## どこから始めればいいかわかりません!
+
+この場合は、[初心者ガイド](ja/newbs.md) から始めるべきです。ここには多くの素晴らしい情報があり、それらはあなたが始めるのに必要な全てをカバーするはずです。
+
+問題がある場合は、[QMK Configurator](https://config.qmk.fm)にアクセスしてください。あなたが必要なものの大部分が処理されます。
+
+## ビルドしたファームウェアを書き込むにはどうすればいいですか?
+
+まず、[コンパイル/書き込み FAQ ページ](ja/faq-build.md) に進みます。そこにはたくさんの情報があり、そこには一般的な問題に対する多くの解決策があります。
+
+## ここで取り上げていない問題がある場合はどうしますか?
+
+OK、問題ありません。[GitHub で issue を開く](https://github.com/qmk/qmk_firmware/issues) をチェックして、誰かが同じこと(似ているかだけでなく実際に同じであることを確認してください)を経験しているかどうかを確認してください。
+
+もし何も見つからない場合は、[新しい issue](https://github.com/qmk/qmk_firmware/issues/new) を開いてください!
+
+## バグを見つけたらどうしますか?
+
+[issue](https://github.com/qmk/qmk_firmware/issues/new) を開いてください。そしてもし修正方法を知っている場合は、GitHub で修正のプルリクエストを開いてください。
+
+## しかし、`git` と `GitHub` は怖いです!
+
+心配しないでください。開発を容易にするために `git` と GitHub を使い始めるための、かなり良い [ガイドライン](ja/newbs_git_best_practices.md) があります。
+
+さらに、追加の `git` と GitHub の関連リンクを [ここ](ja/newbs_learn_more_resources.md) に見つけることができます。
+
+## サポートを追加したいキーボードがあります
+
+素晴らしい!プルリクエストを開いてください。私たちはコードをレビューし、マージします!
+
+### `QMK` でブランドしたい場合はどうればいいですか?
+
+素晴らしい!私たちはあなたを支援したいと思います!
+
+実際、私たちにはあなたのページとキーボードに QMK ブランドを追加するための [完全なページ](https://qmk.fm/powered/) があります。これは QMK を公式にサポートするために必要なほぼ全て(知識と画像)をカバーしています。
+
+これについて質問がある場合は、issue を開くか、[Discord](https://discord.gg/Uq7gcHh) に進んでください。
+
## QMK と TMK の違いは何か?
TMK は [Jun Wako](https://github.com/tmk) によって設計され実装されました。QMK は [Jack Humbert](https://github.com/jackhumbert) の Planck 用 TMK のフォークとして始まりました。しばらくして、Jack のフォークは TMK からかなり分岐し、2015年に Jack はフォークを QMK に名前を変えることにしました。
diff --git a/docs/ja/faq_keymap.md b/docs/ja/faq_keymap.md
index 0c742bf6b91..2726e18728d 100644
--- a/docs/ja/faq_keymap.md
+++ b/docs/ja/faq_keymap.md
@@ -1,8 +1,8 @@
# キーマップの FAQ
このページは人々がキーマップについてしばしば持つ疑問について説明します。まだ読んだことが無い場合には、[キーマップの概要](ja/keymap.md)を最初に読むべきです。
@@ -19,9 +19,20 @@

+## 複雑なキーコードのカスタム名を作成する方法はありますか?
+
+時には、読みやすくするために、一部のキーコードにカスタム名を定義すると役に立ちます。人々は、しばしば `#define` を使ってカスタム名を定義します。例えば:
+
+```c
+#define FN_CAPS LT(_FL, KC_CAPSLOCK)
+#define ALT_TAB LALT(KC_TAB)
+```
+
+これにより、キーマップで `FN_CAPS` と `ALT_TAB` を使えるようになり、読みやすくなります。
+
## 一部のキーが入れ替わっているか、または動作しない
-QMK には2つの機能、ブートマジックとコマンドがあり、これによりその場でキーボードの動作を変更することができます。これには Ctrl/Caps の交換、Gui の無効化、Alt/GUI の交換、Backspace/Backslash の交換、全てのキーの無効化およびその他の動作の変更が含まれますが、これらに限定されません。
+QMK には2つの機能、ブートマジックとコマンドがあり、これによりその場でキーボードの動作を変更することができます。これには Ctrl/Caps の交換、Gui の無効化、Alt/Gui の交換、Backspace/Backslash の交換、全てのキーの無効化およびその他の動作の変更が含まれますが、これらに限定されません。
迅速な解決策として、キーボードを接続している時に `Space`+`Backspace` を押してみてください。これはキーボードに保存されている設定をリセットし、これらのキーを通常の操作に戻します。うまく行かない場合は、以下を見てください:
diff --git a/docs/ja/feature_advanced_keycodes.md b/docs/ja/feature_advanced_keycodes.md
new file mode 100644
index 00000000000..c6e21feb946
--- /dev/null
+++ b/docs/ja/feature_advanced_keycodes.md
@@ -0,0 +1,85 @@
+# レイヤーの切り替えとトグル :id=switching-and-toggling-layers
+
+
+
+これらの機能により、様々な方法でレイヤーをアクティブ化することができます。レイヤーは一般的に独立したレイアウトでは無いことに注意してください -- 複数のレイヤーを一度にアクティブ化することができ、レイヤーが `KC_TRNS` を使ってキーの押下を下のレイヤーに渡すことが一般的です。レイヤーの詳細については、[キーマップの概要](ja/keymap.md#keymap-and-layers)を見てください。MO()、LM()、TT() あるいは LT() を使って一時的なレイヤーの切り替えを使う場合、上のレイヤーのキーを透過にするようにしてください。さもないと意図したように動作しないかもしれません。
+
+* `DF(layer)` - デフォルトレイヤーを切り替えます。デフォルトレイヤーは、他のレイヤーがその上に積み重なっている、常にアクティブな基本レイヤーです。デフォルトレイヤーの詳細については以下を見てください。これは QWERTY から Dvorak レイアウトに切り替えるために使うことができます。(これは一時的な切り替えであり、キーボードの電源が切れるまでしか持続しないことに注意してください。デフォルトレイヤーを永続的に変更するには、[process_record_user](ja/custom_quantum_functions.md#programming-the-behavior-of-any-keycode) 内で `set_single_persistent_default_layer` 関数を呼び出すなど、より深いカスタマイズが必要です。)
+* `MO(layer)` - 一時的に*レイヤー*をアクティブにします。キーを放すとすぐに、レイヤーは非アクティブになります。
+* `LM(layer, mod)` - (`MO` のように)一時的に*レイヤー*をアクティブにしますが、モディファイア *mod* がアクティブな状態です。layer 0-15 と、左モディファイアのみをサポートします: `MOD_LCTL`、`MOD_LSFT`、`MOD_LALT`、`MOD_LGUI` (`KC_` の代わりに `MOD_` 定数を使うことに注意してください)。これらのモディファイアは、例えば `LM(_RAISE, MOD_LCTL | MOD_LALT)` のように、ビット単位の OR を使って組み合わせることができます。
+* `LT(layer, kc)` - ホールドされた時に*レイヤー*を一時的にアクティブにし、タップされた時に *kc* を送信します。layer 0-15 のみをサポートします。
+* `OSL(layer)` - 次のキーが押されるまで、一時的に*レイヤー*をアクティブにします。詳細と追加機能については、[ワンショットキー](ja/one_shot_keys.md)を見てください。
+* `TG(layer)` - *レイヤー*を切り替えます。非アクティブな場合はアクティブにし、逆も同様です。
+* `TO(layer)` - *レイヤー*をアクティブにし、他の全てのレイヤー(デフォルトレイヤーを除く)を非アクティブにします。この関数は特別です。1つのレイヤーをアクティブなレイヤースタックに追加/削除する代わりに、現在のアクティブなレイヤーを完全に置き換え、唯一上位のレイヤーを下位のレイヤーで置き換えることができるからです。これはキーダウンで(キーが押されるとすぐに)アクティブになります。
+* `TT(layer)` - レイヤーのタップ切り替え。キーを押したままにすると*レイヤー*がアクティブにされ、放すと非アクティブになります (`MO` 風)。繰り返しタップすると、レイヤーはオンあるいはオフを切り替えます (`TG` 風)。デフォルトでは5回のタップが必要ですが、`TAPPING_TOGGLE` を定義することで変更することができます -- 例えば、2回のタップだけで切り替えるには、`#define TAPPING_TOGGLE 2` を定義します。
+
+## 注意事項
+
+現在のところ、`LT()` と `MT()` は[基本的なキーコードセット](ja/keycodes_basic.md)に制限されています。つまり、`LCTL()`、`KC_TILD` あるいは `0xFF` より大きなキーコードを使うことができません。レイヤータップあるいはモッドタップのキーコードの一部として指定されたモディファイアは無視されます。タップしたキーコードにモディファイアを適用する必要がある場合は、[タップダンス](ja/feature_tap_dance.md#example-5-using-tap-dance-for-advanced-mod-tap-and-layer-tap-keys)を使うことができます。
+
+さらに、モッドタップあるいはレイヤータップで少なくとも1つの右手用のモディファイアが指定された場合、指定された全てのモディファイアが右手用になるため、2つをうまく組み合わせて一致させることはできません。
+
+# レイヤーの使用
+
+レイヤーを切り替える時は注意してください。(キーボードを取り外さずに)そのレイヤーを非アクティブにすることができずレイヤーから移動できなくなる可能性があります。最も一般的な問題を避けるためのガイドラインを作成しました。
+
+## 初心者
+
+QMK を使い始めたばかりの場合は、全てを単純にしたいでしょう。レイヤーをセットアップする時は、これらのガイドラインに従ってください:
+
+* デフォルトの "base" レイヤーとして、layer 0 をセットアップします。これは通常の入力レイヤーであり、任意のレイアウト (qwerty、dvorak、colemak など)にすることができます。通常はキーボードのキーのほとんどまたは全てが定義されているため、これを最下位のレイヤーとして設定することが重要です。そうすることで、もしそれが他のレイヤーの上 (つまりレイヤー番号が大きい)にある場合の影響を防ぎます。
+* layer 0 をルートとして、レイヤーを "ツリー" レイアウトに配置します。他の複数のレイヤーから同じレイヤーに行こうとしないでください。
+* 各レイヤーのキーマップでは、より高い番号のレイヤーのみを参照します。レイヤーは最大の番号(最上位)のアクティブレイヤーから処理されるため、下位レイヤーの状態を変更するのは難しくエラーが発生しやすくなります。
+
+## 中級ユーザ
+
+複数の基本レイヤーが必要な場合があります。例えば、QWERTY と Dvorak を切り替える場合、国ごとに異なるレイアウトを切り替える場合、あるいは異なるビデオゲームごとにレイアウトを切り替える場合などです。基本レイヤーは常に最小の番号のレイヤーである必要があります。複数の基本レイヤーがある場合、常にそれらを相互排他的に扱う必要があります。1つの基本レイヤーがオンの場合、他をオフにします。
+
+## 上級ユーザ
+
+レイヤーがどのように動作し、何ができるかを理解したら、より創造的になります。初心者のセクションで列挙されている規則は、幾つかの巧妙な詳細を回避するのに役立ちますが、特に超コンパクトなキーボードのユーザにとって制約になる場合があります。レイヤーの仕組みを理解することで、レイヤーをより高度な方法で使うことができます。
+
+レイヤーは番号順に上に積み重なっています。キーの押下の動作を決定する時に、QMK は上から順にレイヤーを走査し、`KC_TRNS` に設定されていない最初のアクティブなレイヤーに到達すると停止します。結果として、現在のレイヤーよりも数値的に低いレイヤーをアクティブにし、現在のレイヤー(あるいはアクティブでターゲットレイヤーよりも高い別のレイヤー)に `KC_TRNS` 以外のものがある場合、それが送信されるキーであり、アクティブ化したばかりのレイヤー上のキーではありません。これが、ほとんどの人の "なぜレイヤーが切り替わらないのか" 問題の原因です。
+
+場合によっては、マクロ内あるいはタップダンスルーチンの一部としてレイヤーを切り替えほうが良いかもしれません。`layer_on` はレイヤーをアクティブにし、`layer_off` はそれを非アクティブにします。もっと多くのレイヤーに関する関数は、[action_layer.h](https://github.com/qmk/qmk_firmware/blob/master/tmk_core/common/action_layer.h) で見つけることができます。
+
+# 修飾キー :id=modifier-keys
+
+以下のようにキーコードとモディファイアを組み合わせることができます。押すと、モディファイアのキーダウンイベントが送信され、次に `kc` のキーダウンイベントが送信されます。放すと、`kc` のキーアップイベントが送信され、次にモディファイアのキーアップイベントが送信されます。
+
+| キー | エイリアス | 説明 |
+|----------|-------------------------------|----------------------------------------------------|
+| `LCTL(kc)` | `C(kc)` | 左 Control を押しながら `kc` を押します。 |
+| `LSFT(kc)` | `S(kc)` | 左 Shift を押しながら `kc` を押します。 |
+| `LALT(kc)` | `A(kc)`, `LOPT(kc)` | 左 Alt を押しながら `kc`を押します。 |
+| `LGUI(kc)` | `G(kc)`, `LCMD(kc)`, `LWIN(kc)` | 左 GUI を押しながら `kc` を押します。 |
+| `RCTL(kc)` | | 右 Control を押しながら `kc` を押します。 |
+| `RSFT(kc)` | | 右 Shift を押しながら `kc` を押します。 |
+| `RALT(kc)` | `ROPT(kc)`, `ALGR(kc)` | 右 Alt を押しながら `kc` を押します。 |
+| `RGUI(kc)` | `RCMD(kc)`, `LWIN(kc)` | 右 GUI を押しながら `kc` を押します。 |
+| `SGUI(kc)` | `SCMD(kc)`, `SWIN(kc)` | 左 Shift と左 GUI を押しながら `kc` を押します。 |
+| `LCA(kc)` | | 左 Control と左 Alt を押しながら `kc` を押します。 |
+| `LCAG(kc)` | | 左 Control、左 Alt、左 GUI を押しながら `kc` を押します。 |
+| `MEH(kc)` | | 左 Control、左 Shift、左 Alt を押しながら `kc` を押します。 |
+| `HYPR(kc)` | | 左 Control、左 Shift、左 Alt、左 GUI を押しながら `kc` を押します。 |
+
+また、それらを繋げることができます。例えば、`LCTL(LALT(KC_DEL))` は1回のキー押下で Control+Alt+Delete を送信するキーを作成します。
+
+# 過去の内容
+
+このページには多くの機能が含まれていました。このページを構成していた多くのセクションをそれぞれのページに移動しました。これより下は全て単なるリダイレクトであるため、web上で古いリンクをたどっている人は探しているものを見つけることができます。
+
+## モッドタップ :id=mod-tap
+
+* [モッドタップ](ja/mod_tap.md)
+
+## ワンショットキー :id=one-shot-keys
+
+* [ワンショットキー](ja/one_shot_keys.md)
+
+## タップホールド設定オプション :id=tap-hold-configuration-options
+
+* [タップホールド設定オプション](ja/tap_hold.md)
diff --git a/docs/ja/feature_audio.md b/docs/ja/feature_audio.md
new file mode 100644
index 00000000000..0f845161eb8
--- /dev/null
+++ b/docs/ja/feature_audio.md
@@ -0,0 +1,328 @@
+# オーディオ
+
+
+
+キーボードは音を出すことができます!Planck、Preonic あるいは特定の PWM 対応ピンにアクセスできる AVR キーボードがある場合は、単純なスピーカーを接続してビープ音を鳴らすことができます。これらのビープ音を使ってレイヤーの変化、モディファイア、特殊キーを示したり、あるいは単にイカした8ビットの曲を鳴らすことができます。
+
+最大2つの同時オーディオ音声がサポートされ、1つはタイマー1によってもう一つはタイマー3によって駆動されます。以下のピンは config.h の中でオーディオ出力として定義することができます:
+
+Timer 1:
+`#define B5_AUDIO`
+`#define B6_AUDIO`
+`#define B7_AUDIO`
+
+Timer 3:
+`#define C4_AUDIO`
+`#define C5_AUDIO`
+`#define C6_AUDIO`
+
+`rules.mk` に `AUDIO_ENABLE = yes` を追加すると、他の設定無しで自動的に有効になる幾つかの異なるサウンドがあります:
+
+```
+STARTUP_SONG // キーボードの起動時に再生 (audio.c)
+GOODBYE_SONG // RESET キーを押すと再生 (quantum.c)
+AG_NORM_SONG // AG_NORM キーを押すと再生 (quantum.c)
+AG_SWAP_SONG // AG_SWAP キーを押すと再生 (quantum.c)
+CG_NORM_SONG // CG_NORM キーを押すと再生 (quantum.c)
+CG_SWAP_SONG // CG_SWAP キーを押すと再生 (quantum.c)
+MUSIC_ON_SONG // 音楽モードがアクティブになると再生 (process_music.c)
+MUSIC_OFF_SONG // 音楽モードが非アクティブになると再生 (process_music.c)
+CHROMATIC_SONG // 半音階音楽モードが選択された時に再生 (process_music.c)
+GUITAR_SONG // ギター音楽モードが選択された時に再生 (process_music.c)
+VIOLIN_SONG // バイオリン音楽モードが選択された時に再生 (process_music.c)
+MAJOR_SONG // メジャー音楽モードが選択された時に再生 (process_music.c)
+```
+
+`config.h` の中で以下のような操作を行うことで、デフォルトの曲を上書きすることができます:
+
+```c
+#ifdef AUDIO_ENABLE
+ #define STARTUP_SONG SONG(STARTUP_SOUND)
+#endif
+```
+
+サウンドの完全なリストは、[quantum/audio/song_list.h](https://github.com/qmk/qmk_firmware/blob/master/quantum/audio/song_list.h) で見つかります - このリストに自由に追加してください!利用可能な音は [quantum/audio/musical_notes.h](https://github.com/qmk/qmk_firmware/blob/master/quantum/audio/musical_notes.h) で見つかります。
+
+特定の時にカスタムサウンドを再生するために、以下のように曲を定義することができます(ファイルの上部付近に):
+
+```c
+float my_song[][2] = SONG(QWERTY_SOUND);
+```
+
+以下のように曲を再生します:
+
+```c
+PLAY_SONG(my_song);
+```
+
+または、以下のようにループで再生することができます:
+
+```c
+PLAY_LOOP(my_song);
+```
+
+オーディオがキーボードに組み込まれていない時に問題が起きる事を避けるために、`#ifdef AUDIO_ENABLE` / `#endif` で全てのオーディオ機能をくるむことをお勧めします。
+
+オーディオで利用可能なキーコードは以下の通りです:
+
+* `AU_ON` - オーディオ機能をオン
+* `AU_OFF` - オーディオ機能をオフ
+* `AU_TOG` - オーディオ機能を切り替え
+
+!> これらのキーコードは全てのオーディオ機能をオンおよびオフにします。オフにするとオーディオフィードバック、オーディオクリック、音楽モードなどが完全に無効になります。
+
+## ARM オーディオボリューム
+
+ARM デバイスの場合、DAC サンプル値を調整できます。キーボードがあなたやあなたの同僚にとって騒々しい場合、`config.h` 内の `DAC_SAMPLE_MAX` を使って最大量を設定することができます:
+
+```c
+#define DAC_SAMPLE_MAX 65535U
+```
+
+## 音楽モード
+
+音楽モードは列を半音階に、行をオクターブにマップします。これは格子配列キーボードで最適に動作しますが、他のものでも動作させることができます。`0xFF` 未満の全てのキーコードはブロックされるため、音の演奏中は入力できません - 特別なキー/mod があればそれらは引き続き動作します。これを回避するには、音楽モードを有効にする前(あるいは後)で、KC_NO を使って別のレイヤーにジャンプします。
+
+メモリの問題により、録音は実験的です - 奇妙な動作が発生した場合は、キーボードの取り外しと再接続で問題が解決するでしょう。
+
+利用可能なキーコード:
+
+* `MU_ON` - 音楽モードをオン
+* `MU_OFF` - 音楽モードをオフ
+* `MU_TOG` - 音楽モードの切り替え
+* `MU_MOD` - 音楽モードの循環
+ * `CHROMATIC_MODE` - 半音階。行はオクターブを変更します
+ * `GUITAR_MODE` - 半音階、ただし行は弦を変更します (+5 階)
+ * `VIOLIN_MODE` - 半音階。ただし行は弦を変換します (+7 階)
+ * `MAJOR_MODE` - メージャースケール
+
+音楽モードでは、以下のキーコードは動作が異なり、通過しません:
+
+* `LCTL` - 録音を開始
+* `LALT` - 録音を停止/演奏を停止
+* `LGUI` - 録音を再生
+* `KC_UP` - 再生をスピードアップ
+* `KC_DOWN` - 再生をスローダウン
+
+ピッチ標準 (`PITCH_STANDARD_A`) はデフォルトで 440.0f です - これを変更するには、`config.h` に以下のようなものを追加します:
+
+ #define PITCH_STANDARD_A 432.0f
+
+音楽モードも完全に無効にすることができます。コントローラの容量が足りなくて困っている場合に役に立ちます。無効にするには、これを `config.h` に追加します:
+
+ #define NO_MUSIC_MODE
+
+### 音楽マスク
+
+デフォルトで、`MUSIC_MASK` は `keycode < 0xFF` に設定されます。これは、`0xFF` 未満のキーコードが音に変換され、何も出力しないことを意味します。`config.h` の中で以下のものを定義することで、これを変更することができます:
+
+ #define MUSIC_MASK keycode != KC_NO
+
+これは全てのキーコードを捕捉します - これは、キーボードを再起動するまで、音楽モードで動けなくなることに注意してください!
+
+どのキーコードを引き続き処理するかを制御する、より高度な方法については、`.c` の中の `music_mask_kb(keycode)` および `keymap.c` の中の `music_mask_user(keycode)` を使うことができます:
+
+ bool music_mask_user(uint16_t keycode) {
+ switch (keycode) {
+ case RAISE:
+ case LOWER:
+ return false;
+ default:
+ return true;
+ }
+ }
+
+false を返すものはマスクの一部では無く、常に処理されます。
+
+### 音楽マップ
+
+デフォルトでは、音楽モードはキーのスケールを決定するために列と行を使います。キーボードレイアウトに一致する長方形のマトリックスを使うキーボードの場合、これで十分です。しかし、(Planck Rev6 あるいは多くの分割キーボードなどのように)より複雑なマトリックスを使うキーボードの場合、非常に歪んだ感じを受けることになります。
+
+しかしながら、音楽マップオプションにより、音楽モードのためにスケーリングを再マップすることができるため、レイアウトに一致し、より自然になります。
+
+この機能を使うには、`#define MUSIC_MAP` を `config.h` ファイルに追加します。そして、`キーボードの名前.c` または `keymap.c` に `uint8_t music_map` を追加します。
+
+```c
+const uint8_t music_map[MATRIX_ROWS][MATRIX_COLS] = LAYOUT_ortho_4x12(
+ 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
+ 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
+ 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
+);
+```
+
+キーボードが使用する `LAYOUT` マクロも使用したいでしょう。これは正しいキーの位置にマップします。キーボードレイアウトの左下から開始し、右に移動してさらに上に移動します。完全なマトリックスができるまで、全てのエントリを入力します。
+
+これを実装する方法の例として、[Planck Keyboard](https://github.com/qmk/qmk_firmware/blob/e9ace1487887c1f8b4a7e8e6d87c322988bec9ce/keyboards/planck/planck.c#L24-L29) を見ることができます。
+
+## オーディオクリック
+
+これは、ボタンを押すたびにクリック音を追加し、キーボードからのクリック音をシミュレートします。キーを押すたびにわずかに音が異なるため、すばやく入力しても長い単一の音のようには聞こえません。
+
+* `CK_TOGG` - ステータスを切り替えます (有効にされた場合、音を再生します)
+* `CK_ON` - オーディオクリックをオンにします (音を再生します)
+* `CK_OFF` - オーディオクリックをオフにします (音を再生しません)
+* `CK_RST` - 周波数をデフォルトの状態に再設定します (デフォルトの周波数で音を再生します)
+* `CK_UP` - クリック音の周波数を増やします (新しい周波数で音を再生します)
+* `CK_DOWN` - クリック音の周波数を減らします (新しい周波数で音を再生します)
+
+
+容量を節約するためにデフォルトではこの機能は無効です。有効にするには、`config.h` に以下を追加します:
+
+ #define AUDIO_CLICKY
+
+
+これらの値を定義することで、デフォルト、最小および最大周波数、ステッピングおよび組み込みのランダム性を設定することができます:
+
+| オプション | デフォルト値 | 説明 |
+|--------|---------------|-------------|
+| `AUDIO_CLICKY_FREQ_DEFAULT` | 440.0f | クリック音のデフォルト/開始音の周波数を設定します。 |
+| `AUDIO_CLICKY_FREQ_MIN` | 65.0f | 最小周波数を設定します (60f 未満は少しバグがあります)。 |
+| `AUDIO_CLICKY_FREQ_MAX` | 1500.0f | 最大周波数を設定します。高すぎると同僚があなたを攻撃する可能性があります。 |
+| `AUDIO_CLICKY_FREQ_FACTOR` | 1.18921f | UP/DOWN キーコードのステップを設定します。これは掛け算の係数です。デフォルトでは、音楽のマイナーの1/3ずつ、周波数を上げ/下げします。 |
+| `AUDIO_CLICKY_FREQ_RANDOMNESS` | 0.05f | クリックのランダム性の係数を設定します。これを `0f` に設定すると各クリックが同一になり、`1.0f` に設定するとこの音は90年代のコンピュータ画面のスクロール/タイピングの効果があります。 |
+| `AUDIO_CLICKY_DELAY_DURATION` | 1 | 1がテンポの 1/16、または64分音符である整数音符の長さ (実装の詳細については、`quantum/audio/musical_notes.h` を見てください)。メインのクリック効果は、この時間だけ遅れます。これらを6-12前後の値に調整すると、うるさいスイッチの補正に役立ちます。 |
+
+
+
+
+## MIDI 機能
+
+これはまだ WIP ですが、何が起きているかを見るために、`quantum/process_keycode/process_midi.c` を調べてください。Makefile から有効にします。
+
+
+## オーディオキーコード
+
+| キー | エイリアス | 説明 |
+|----------------|---------|----------------------------------|
+| `AU_ON` | | オーディオモードオン |
+| `AU_OFF` | | オーディオモードオフ |
+| `AU_TOG` | | オーディオモードを切り替えます |
+| `CLICKY_TOGGLE` | `CK_TOGG` | オーディオクリックモードを切り替えます |
+| `CLICKY_UP` | `CK_UP` | クリック音の周波数を増やします |
+| `CLICKY_DOWN` | `CK_DOWN` | クリック音の周波数を減らします |
+| `CLICKY_RESET` | `CK_RST` | 周波数をデフォルトに再設定します |
+| `MU_ON` | | 音楽モードをオンにします |
+| `MU_OFF` | | 音楽モードをオフにします |
+| `MU_TOG` | | 音楽モードを切り替えます |
+| `MU_MOD` | | 音楽モードを循環します |
+
+
diff --git a/docs/ja/feature_auto_shift.md b/docs/ja/feature_auto_shift.md
new file mode 100644
index 00000000000..c230f93815e
--- /dev/null
+++ b/docs/ja/feature_auto_shift.md
@@ -0,0 +1,135 @@
+# 自動シフト: なぜシフトキーが必要ですか?
+
+
+
+キーをタップすると、その文字を取得します。キーをタップするが、*わずかに*長く押し続けると、シフト状態になります。ほら!シフトキーは必要ありません!
+
+## なぜ自動シフトなのですか?
+
+多くの人が腱鞘炎などの症状に苦しんでいます。一般的な原因は、指を繰り返し長い距離を伸ばすことです。私たちはキーボード上でシフトキーに手を伸ばすためにあまりにも頻繁に小指を伸ばします。自動シフトキーはそれを軽減しようとしています。
+
+## どのように動作しますか?
+
+キーをタップする時に、キーを放す前にほんの短い間押したままにします。この押したままにする時間は全ての人にとって異なる長さです。自動シフトは、定数 `AUTO_SHIFT_TIMEOUT` を定義し、これは普段の押された状態の時間の2倍に通常は設定されます。タイマーは、キーを押す時に開始され、キーを放す時に止まります。押された時間が `AUTO_SHIFT_TIMEOUT` 以上の場合に、キーのシフトバージョンが発行されます。時間が `AUTO_SHIFT_TIMEOUT` 時間よりも短い場合は、通常の状態が発行されます。
+
+## 自動シフトには制限がありますか?
+
+残念ながらあります。
+
+1. キーリピートが動作しなくなります。例えば、20個の 'a' 文字が必要な場合、'a' キーを1、2秒押し続けるかもしれません。オペレーティングシステムに押されたキーの状態を発行する代わりに押された時間を計るので、自動シフトでは動作しません。
+2. シフトをするつもりがない時にシフトされた文字を取得し、シフトしたい時にそうではない他の文字を取得するでしょう。これは結局は練習になります。急いでいる時は、シフトされたバージョンのために十分長くキーを押したと思うかもしれませんが、そうではありませんでした。一方、キーをタップしていると思うかもしれませんが、実際には予想よりも少し長い間押していました。
+
+## どうやって自動シフトを有効にしますか?
+
+キーマップフォルダの `rules.mk` に追加します:
+
+ AUTO_SHIFT_ENABLE = yes
+
+`rules.mk` が存在しない場合、それを作成することができます。
+
+そして自動シフトキーを有効にした新しいファームウェアをコンパイルしてインストールします!以上です!
+
+## モディファイア
+
+デフォルトで、1つ以上のモディファイアと一緒にキーが押されると自動シフトは無効になります。従って、本当に長い間 Ctrl+A を保持しても、Ctrl+Shift+A と同じではありません。
+
+`config.h` に定義を追加することで、モディファイアの自動シフトを再度有効にすることができます
+
+```c
+#define AUTO_SHIFT_MODIFIERS
+```
+
+この場合、`AUTO_SHIFT_TIMEOUT` を超えて押された Ctrl+A は Ctrl+Shift+A として送信されます
+
+
+## 自動シフトの設定
+
+必要に応じて、自動シフトの挙動を変更することができる幾つかの設定があります。キーマップフォルダにある `config.h` に様々な変数を設定することで行われます。`config.h` ファイルが存在しない場合、それを作成することができます。
+
+例
+
+```c
+#pragma once
+
+#define AUTO_SHIFT_TIMEOUT 150
+#define NO_AUTO_SHIFT_SPECIAL
+```
+
+### AUTO_SHIFT_TIMEOUT (単位: ミリ秒)
+
+これは、シフトされた状態を取得するためにどれだけ長くキーを押し続けなければならないかを制御します。
+明らかにこれは人によって異なります。一般的な人にとって、135 から 150 の設定がうまく機能します。ただし、少なくとも 175 の値から開始する必要があります。これはデフォルト値です。その後、ここから下げていきます。間違って検出することなくシフトされた状態を取得するのに必要な、最も短い時間を得るという考え方です。
+
+完璧に動作するまで、いろいろな値を試してみます。多くの人は、全てが所定の値で適切に動作するものの、時々、1つあるいは2つのキーがシフト状態を発行することが分かるでしょう。これは単に習慣と、幾つかのキーを他のキーよりも少し長く押し続けることによるものです。この値を見つけたら、問題のキーを通常よりも少し早くタップするとともに、その値を設定します。
+
+?> 自動シフトには、この値を素早く取得するのに役立つ3つの特別なキーがあります。詳細は「自動シフトのセットアップ」を見てください!
+
+### NO_AUTO_SHIFT_SPECIAL (単純にこのように定義します)
+
+-\_, =+, [{, ]}, ;:, '", ,<, .> および /? を含む特殊キーを自動シフトしません
+
+### NO_AUTO_SHIFT_NUMERIC (単純にこのように定義します)
+
+0から9までの数字キーを自動シフトしません。
+
+### NO_AUTO_SHIFT_ALPHA (単純にこのように定義します)
+
+AからZを含むアルファベット文字を自動シフトしません。
+
+## 自動シフトセットアップの使用
+
+これにより、`AUTO_SHIFT_TIMEOUT` で設定している時間を一時的に増減させたり報告するために、3つのキーを定義することができます。
+
+### セットアップ
+
+3つのキーを一時的にキーマップにマップします:
+
+| キー名 | 説明 |
+|----------|-----------------------------------------------------|
+| KC_ASDN | 自動シフトタイムアウト変数を下げる |
+| KC_ASUP | 自動シフトタイムアウト変数を上げる |
+| KC_ASRP | 現在の自動シフトタイムアウト値を報告する |
+| KC_ASON | 自動シフト機能をオンにする |
+| KC_ASOFF | 自動シフト機能をオフにする |
+| KC_ASTG | 自動シフト機能の状態を切り替える |
+
+新しいファームウェアをコンパイルしてアップロードします。
+
+### 使い方
+
+これらのテスト中は、完全に普段通り入力する必要があり、意図的にシフトされたキーを使わずに入力するように注意する必要があります。
+
+1. アルファベットの複数の文を入力します。
+2. 大文字に注意してください。
+3. 大文字が存在しない場合は、自動シフトタイムアウト値を減らすために `KC_ASDN` にマップしたキーを押し、ステップ1に戻ります。
+4. 大文字が幾つかある場合は、押す時間を短くしてこれらのキーをタップする必要があるか、あるいはタイムアウトを増やす必要があるかを決定します。
+5. タイムアウトを増やすことに決めた場合は、`KC_ASUP` にマップしたキーを押し、ステップ1に戻ります。
+6. 結果に満足したら、`KC_ASRP` にマップしたキーを押します。キーボードは `AUTO_SHIFT_TIMEOUT` の値を自動的に入力します。
+7. 報告された値で `config.h` の `AUTO_SHIFT_TIMEOUT` を更新します。
+8. `config.h` から `AUTO_SHIFT_SETUP` を削除します。
+9. `KC_ASDN`、`KC_ASUP` および `KC_ASRP` のキーバインディングを削除します。
+10. 新しいファームウェアをコンパイルしてアップロードします。
+
+#### 実行例
+
+ hello world. my name is john doe. i am a computer programmer playing with
+ keyboards right now.
+
+ [KC_ASDN を何度か押します]
+
+ heLLo woRLd. mY nAMe is JOHn dOE. i AM A compUTeR proGRaMMER PlAYiNG witH
+ KEYboArDS RiGHT NOw.
+
+ [KC_ASUP を数回押します]
+
+ hello world. my name is john Doe. i am a computer programmer playing with
+ keyboarDs right now.
+
+ [KC_ASRPを押します]
+
+ 115
+
+キーボードは現在の `AUTO_SHIFT_TIMEOUT` 値を表す `115` を入力しました。これで設定が完了しました!テスト中に現れる *D* キーを少し練習してください。それで完璧です。
diff --git a/docs/ja/feature_backlight.md b/docs/ja/feature_backlight.md
new file mode 100644
index 00000000000..e722656b79e
--- /dev/null
+++ b/docs/ja/feature_backlight.md
@@ -0,0 +1,253 @@
+# バックライト
+
+
+
+多くのキーボードは、キースイッチを貫通して配置されたり、キースイッチの下に配置された個々の LED によって、バックライトキーをサポートします。この機能は通常スイッチごとに単一の色しか使用できないため、[RGB アンダーグロー](ja/feature_rgblight.md)および [RGB マトリックス](ja/feature_rgb_matrix.md)機能のどちらとも異なりますが、キーボードに複数の異なる単一色の LED を取り付けることは当然可能です。
+
+QMK は *パルス幅変調*(*Pulse Width Modulation*) すなわち PWM として知られている技術で急速にオンおよびオフを切り替えることで、これらの LED の輝度を制御できます。PWM 信号のデューティサイクルを変えることで、調光の錯覚を起こすことができます。
+
+MCU は、GPIO ピンにはそんなに電流を供給できません。MCU から直接バックライトに給電せずに、バックライトピンは LED への電力を切り替えるトランジスタあるいは MOSFET に接続されます。
+
+## 機能の設定
+
+ほとんどのキーボードではバックライトをサポートしている場合にデフォルトで有効になっていますが、もし機能しない場合は `rules.mk` が以下を含んでいることを確認してください:
+
+```makefile
+BACKLIGHT_ENABLE = yes
+```
+
+## キーコード
+有効にすると、以下のキーコードを使ってバックライトレベルを変更することができます。
+
+| キー | 説明 |
+|---------|------------------------------------------|
+| `BL_TOGG` | バックライトをオンあるいはオフにする |
+| `BL_STEP` | バックライトレベルを循環する |
+| `BL_ON` | バックライトを最大輝度に設定する |
+| `BL_OFF` | バックライトをオフにする |
+| `BL_INC` | バックライトレベルを上げる |
+| `BL_DEC` | バックライトレベルを下げる |
+| `BL_BRTG` | バックライトの明滅動作を切り替える |
+
+## バックライト関数群
+
+| 関数 | 説明 |
+|----------|-----------------------------------------------------------|
+| `backlight_toggle()` | バックライトをオンあるいはオフにする |
+| `backlight_enable()` | バックライトをオンにする |
+| `backlight_disable()` | バックライトをオフにする |
+| `backlight_step()` | バックライトレベルを循環する |
+| `backlight_increase()` | バックライトレベルを上げる |
+| `backlight_decrease()` | バックライトレベルを下げる |
+| `backlight_level(x)` | バックライトのレベルを特定のレベルに設定する |
+| `get_backlight_level()` | 現在のバックライトレベルを返す |
+| `is_backlight_enabled()` | バックライトが現在オンかどうかを返す |
+
+### バックライトの明滅動作の関数群
+
+| 関数 | 説明 |
+|----------|---------------------------------------------------|
+| `breathing_toggle()` | バックライトの明滅動作をオンまたはオフにする |
+| `breathing_enable()` | バックライトの明滅動作をオンにする |
+| `breathing_disable()` | バックライトの明滅動作をオフにする |
+
+## ドライバの設定
+
+どのドライバを使うかを選択するには、以下を使って `rules.mk` を設定します:
+
+```makefile
+BACKLIGHT_DRIVER = software # 有効なドライバの値は 'pwm,software,no' です
+```
+
+各ドライバについてのヘルプは以下を見てください。
+
+## 共通のドライバ設定
+
+バックライトの挙動を変更するには、`config.h` の中で以下の `#define` をします:
+
+| 定義 | デフォルト | 説明 |
+|---------------------|-------------|--------------------------------------------------------------------------------------|
+| `BACKLIGHT_LEVELS` | `3` | 輝度のレベルの数 (オフを除いて最大 31) |
+| `BACKLIGHT_CAPS_LOCK` | *定義なし* | バックライトを使って Caps Lock のインジケータを有効にする (専用 LED の無いキーボードのため) |
+| `BACKLIGHT_BREATHING` | *定義なし* | サポートされる場合は、バックライトの明滅動作を有効にする |
+| `BREATHING_PERIOD` | `6` | 各バックライトの "明滅" の長さ(秒) |
+| `BACKLIGHT_ON_STATE` | `0` | バックライトが "オン" の時のバックライトピンの状態 - high の場合は `1`、low の場合は `0` |
+
+### バックライトオン状態
+
+ほとんどのバックライトの回路は N チャンネルの MOSFET あるいは NPN トランジスタによって駆動されます。これは、トランジスタを*オン*にして LED を点灯させるには、ゲートまたはベースに接続されているバックライトピンを *high* に駆動する必要があることを意味します。
+ただし、P チャンネルの MOSFET あるいは PNP トランジスタが使われる場合があります。この場合、トランジスタがオンの時、ピンは代わりに *low* で駆動されます。
+
+この機能は `BACKLIGHT_ON_STATE` 定義することでキーボードレベルで設定されます。
+
+## AVR ドライバ
+
+AVR ボードでは、デフォルトのドライバは現在のところ最善のシナリオを選択するために構成を探っています。ドライバはデフォルトで設定されますが、rules.mk 内の同等の設定は以下の通りです:
+```makefile
+BACKLIGHT_DRIVER = pwm
+```
+
+### 注意事項
+
+ハードウェア PWM は以下の表に従ってサポートされます:
+
+| バックライトピン | AT90USB64/128 | ATmega16/32U4 | ATmega16/32U2 | ATmega32A | ATmega328P |
+|-------------|-------------|-------------|-------------|---------|----------|
+| `B1` | | | | | Timer 1 |
+| `B2` | | | | | Timer 1 |
+| `B5` | Timer 1 | Timer 1 | | | |
+| `B6` | Timer 1 | Timer 1 | | | |
+| `B7` | Timer 1 | Timer 1 | Timer 1 | | |
+| `C4` | Timer 3 | | | | |
+| `C5` | Timer 3 | | Timer 1 | | |
+| `C6` | Timer 3 | Timer 3 | Timer 1 | | |
+| `D4` | | | | Timer 1 | |
+| `D5` | | | | Timer 1 | |
+
+他の全てのピンはソフトウェア PWM を使います。[オーディオ](ja/feature_audio.md)機能が無効あるいは1つのタイマだけを使っている場合は、ハードウェアタイマによってバックライト PWM を引き起こすことができます:
+
+| オーディオピン | オーディオタイマ | ソフトウェア PWM タイマ |
+|---------|-----------|------------------|
+| `C4` | Timer 3 | Timer 1 |
+| `C5` | Timer 3 | Timer 1 |
+| `C6` | Timer 3 | Timer 1 |
+| `B5` | Timer 1 | Timer 3 |
+| `B6` | Timer 1 | Timer 3 |
+| `B7` | Timer 1 | Timer 3 |
+
+両方のタイマーがオーディオのために使われている場合、バックライト PWM はハードウェアタイマを使いませんが、代わりにマトリックススキャンの間に引き起こされます。この場合、PWM の計算は十分なタイミングの精度で呼ばれないかもしれないため、バックライトの明滅はサポートされず、バックライトもちらつくかもしれません。
+
+### AVR 設定
+
+バックライトの挙動を変更するには、`config.h` の中で以下の `#define` をします:
+
+| 定義 | デフォルト | 説明 |
+|---------------------|-------------|--------------------------------------------------------------------------------------------------------------|
+| `BACKLIGHT_PIN` | `B7` | LED を制御するピン。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
+| `BACKLIGHT_PINS` | *定義なし* | 実験的: 詳細は以下を見てください |
+| `BACKLIGHT_LEVELS` | `3` | 輝度のレベルの数 (オフを除いて最大 31) |
+| `BACKLIGHT_CAPS_LOCK` | *定義なし* | バックライトを使って Caps Lock のインジケータを有効にする (専用 LED の無いキーボードのため) |
+| `BACKLIGHT_BREATHING` | *定義なし* | サポートされる場合は、バックライトの明滅動作を有効にする |
+| `BREATHING_PERIOD` | `6` | 各バックライトの "明滅" の長さ(秒) |
+| `BACKLIGHT_ON_STATE` | `1` | バックライトが "オン" の時のバックライトピンの状態 - high の場合は `1`、low の場合は `0` |
+
+### バックライトオン状態
+
+ほとんどのバックライトの回路は N チャンネルの MOSFET あるいは NPN トランジスタによって駆動されます。これは、トランジスタを*オン*にして LED を点灯させるには、ゲートまたはベースに接続されているバックライトピンを *high* に駆動する必要があることを意味します。
+ただし、P チャンネルの MOSFET あるいは PNP トランジスタが使われる場合があります。この場合、トランジスタがオンの時、ピンは代わりに *low* で駆動されます。
+
+この機能は `BACKLIGHT_ON_STATE` 定義することでキーボードレベルで設定されます。
+
+### 複数のバックライトピン
+
+ほとんどのキーボードは、全てのバックライト LED を制御するたった1つのバックライトピンを持ちます (特にバックライトがハードウェア PWM ピンに接続されている場合)。
+ソフトウェア PWM では、複数のバックライトピンを定義することができます。これらすべてのピンは PWM デューティサイクル時に同時にオンおよびオフになります。
+この機能により、例えば Caps Lock LED (またはその他の制御可能な LED) の輝度を、バックライトの他の LED と同じレベルに設定することができます。Caps Lock の代わりに LCTRL をマップしていて、Caps Lock がオンの時に Caps Lock LED をアクティブにする代わりにバックライトの一部にする必要がある場合に便利です。
+
+複数のバックライトピンをアクティブにするには、`config.h` に次のようなものを追加する必要があります:
+
+```c
+#define BACKLIGHT_LED_COUNT 2
+#undef BACKLIGHT_PIN
+#define BACKLIGHT_PINS { F5, B2 }
+```
+
+### ハードウェア PWM 実装
+
+バックライト用にサポートされているピンを使う場合、QMK は PWM 信号を出力するように設定されたハードウェアタイマを使います。タイマーは 0 にリセットする前に `ICRx` (デフォルトでは `0xFFFF`) までカウントします。
+希望の輝度が計算され、`OCRxx` レジスタ内に格納されます。カウンタがこの値まで達すると、バックライトピンは low になり、カウンタがリセットされると再び high になります。
+このように `OCRxx` は基本的に LED のデューティサイクル、従って輝度を制御します。`0x0000` は完全にオフで、 `0xFFFF` は完全にオンです。
+
+明滅動作の効果はカウンタがリセットされる(秒間あたりおよそ244回)たびに呼び出される `TIMER1_OVF_vect` の割り込みハンドラを登録することで可能になります。
+このハンドラ内で、増分カウンタの値が事前に計算された輝度曲線にマップされます。明滅動作をオフにするには、割り込みを単純に禁止し、輝度を EEPROM に格納されているレベルに再設定します。
+
+### タイマーにアシストされた PWM 実装
+
+`BACKLIGHT_PIN` がハードウェアバックライトピンに設定されていない場合、QMK はソフトウェア割り込みを引き起こすように設定されているハードウェアタイマを使います。タイマーは 0 にリセットする前に `ICRx` (デフォルトでは `0xFFFF`) までカウントします。
+0 に再設定すると、CPU は LED をオンにする OVF (オーバーフロー)割り込みを発火し、デューティサイクルを開始します。
+希望の輝度が計算され、`OCRxx` レジスタ内に格納されます。カウンタがこの値に達すると、CPU は比較出力一致割り込みを発火し、LED をオフにします。
+このように `OCRxx` は基本的に LED のデューティサイクル、従って輝度を制御します。 `0x0000` は完全にオフで、 `0xFFFF` は完全にオンです。
+
+明滅の効果はハードウェア PWM 実装と同じです。
+
+## ARM ドライバ
+
+まだ初期段階ですが、ARM バックライトサポートは最終的に AVR と同等の機能を持つことを目指しています。ドライバはデフォルトで設定されますが、rules.mk 内の同等の設定は以下の通りです:
+```makefile
+BACKLIGHT_DRIVER = pwm
+```
+
+### 注意事項
+
+現在のところ、ハードウェア PWM のみがサポートされ、タイマーはアシストされず、自動設定は提供されません。
+
+?> STMF072 のバックライトサポートのテストは制限されています。人によって違うかもしれません。不明な場合は、rules.mk で `BACKLIGHT_ENABLE = no` を設定します。
+
+### ARM 設定
+
+バックライトの挙動を変更するには、`config.h` の中で以下の `#define` をします:
+
+| 定義 | デフォルト | 説明 |
+|------------------------|-------------|-------------------------------------------------------------------------------------------------------------|
+| `BACKLIGHT_PIN` | `B7` | LED を制御するピン。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
+| `BACKLIGHT_PWM_DRIVER` | `PWMD4` | 使用する PWM ドライバ。ピンから PWM タイマへのマッピングについては、ST データシートを見てください。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
+| `BACKLIGHT_PWM_CHANNEL` | `3` | 使用する PWM チャンネル。ピンから PWM チャンネルへのマッピングについては、ST データシートを見てください。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
+| `BACKLIGHT_PAL_MODE` | `2` | 使用するピンの代替機能。ピンの AF マッピングについては ST データシートを見てください。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
+
+## Software PWM Driver :id=software-pwm-driver
+
+他のキーボードのタスクを実行中に PWM をエミュレートすることにより、追加のプラットフォーム設定なしで最大のハードウェア互換性を提供します。トレードオフは、キーボードが忙しい時にバックライトが揺れる可能性があることです。有効にするには、rules.mk に以下を追加します:
+```makefile
+BACKLIGHT_DRIVER = software
+```
+
+### ソフトウェア PWM 設定
+
+バックライトの挙動を変更するには、`config.h` の中で以下の `#define` をします:
+
+| 定義 | デフォルト | 説明 |
+|-----------------|-------------|-------------------------------------------------------------------------------------------------------------|
+| `BACKLIGHT_PIN` | `B7` | LED を制御するピン。自身のキーボードを設計している場合を除き、これを変更する必要はないはずです |
+| `BACKLIGHT_PINS` | *定義なし* | 実験的: 詳細は以下を見てください |
+
+### 複数のバックライトピン
+
+ほとんどのキーボードは、全てのバックライト LED を制御するたった1つのバックライトピンを持ちます (特にバックライトがハードウェア PWM ピンに接続されている場合)。
+ソフトウェア PWM では、複数のバックライトピンを定義することができます。これらすべてのピンは PWM デューティサイクル時に同時にオンおよびオフになります。
+この機能により、例えば Caps Lock LED (またはその他の制御可能な LED) の輝度を、バックライトの他の LED と同じレベルに設定することができます。Caps Lock の代わりに LCTRL をマップしていて、Caps Lock がオンの時に Caps Lock LED をアクティブにする代わりにバックライトの一部にする必要がある場合に便利です。
+
+複数のバックライトピンをアクティブにするには、`config.h` に次のようなものを追加する必要があります:
+
+```c
+#undef BACKLIGHT_PIN
+#define BACKLIGHT_PINS { F5, B2 }
+```
+
+## カスタムドライバ
+
+有効にするには、rules.mk に以下を追加します:
+
+```makefile
+BACKLIGHT_DRIVER = custom
+```
+
+カスタムドライバ API を実装する場合、提供されるキーボードフックは以下の通りです:
+
+```c
+void backlight_init_ports(void) {
+ // オプション - 起動時に実行されます
+ // - 通常、ここでピンを設定します
+}
+void backlight_set(uint8_t level) {
+ // オプション - レベルの変更時に実行されます
+ // - 通常、ここで新しい値に応答します
+}
+
+void backlight_task(void) {
+ // オプション - 定期的に実行されます
+ // - ここで長時間実行されるアクションはパフォーマンスの問題を引き起こします
+}
+```
diff --git a/docs/ja/feature_bluetooth.md b/docs/ja/feature_bluetooth.md
new file mode 100644
index 00000000000..90b88bd7c24
--- /dev/null
+++ b/docs/ja/feature_bluetooth.md
@@ -0,0 +1,52 @@
+# Bluetooth
+
+
+
+## Bluetooth の既知のサポートハードウェア
+
+現在のところ Bluetooth のサポートは AVR ベースのチップに限られます。Bluetooth 2.1 については、QMK は RN-42 モジュールと、Bluefruit EZ-Key をサポートしますが、後者はもう生産されていません。より最近の BLE プロトコルについては、現在のところ Adafruit Bluefruit SPI Friend のみが直接サポートされています。iOS デバイスに接続するには、BLE が必要です。iOS はマウス入力をサポートしないことに注意してください。
+
+| ボード | Bluetooth プロトコル | 接続タイプ | rules.mk | Bluetooth チップ |
+|----------------------------------------------------------------|----------------------------|----------------|---------------------------|--------------|
+| [Adafruit EZ-Key HID](https://www.adafruit.com/product/1535) | Bluetooth Classic | UART | `BLUETOOTH = AdafruitEZKey` | |
+| Roving Networks RN-42 (Sparkfun Bluesmirf) | Bluetooth Classic | UART | `BLUETOOTH = RN42` | RN-42 |
+| [Bluefruit LE SPI Friend](https://www.adafruit.com/product/2633) | Bluetooth Low Energy | SPI | `BLUETOOTH = AdafruitBLE` | nRF51822 |
+
+まだサポートされていませんが、可能性のあるもの:
+* [Bluefruit LE UART Friend](https://www.adafruit.com/product/2479)。[tmk 実装がおそらく見つかります](https://github.com/tmk/tmk_keyboard/issues/514)
+* RN-42 ファームウェアが書き込まれた HC-05 ボード。どちらも明らかに CSR BC417 チップを使っています。RN-42 ファームウェアを使って書き込むと、HID 機能が提供されます。
+* Sparkfun Bluetooth Mate
+* HM-13 ベースのボード
+
+### Adafruit BLE SPI Friend
+現在のところ QMK によってサポートされている唯一の bluetooth チップセットは、Adafruit Bluefruit SPI Friend です。Adafruit のカスタムファームウェアを実行する Nordic nRF5182 ベースのチップです。データは Hardware SPI を介した Adafruit の SDEP を使って転送されます。[Feather 32u4 Bluefruit LE](https://www.adafruit.com/product/2829) は Adafruit ファームウェアを搭載した Nordic BLE チップに SPI 経由で接続された AVR mcu であるため、サポートされます。SPI friend を使ってカスタムボードを構築する場合、32u4 feather が使用するピン選択を使うのが最も簡単ですが、以下の定義で config.h オプションでピンを変更することができます:
+* #define AdafruitBleResetPin D4
+* #define AdafruitBleCSPin B4
+* #define AdafruitBleIRQPin E6
+
+Bluefruit UART friend は SPI friend に変換することができますが、これにはMDBT40 チップへの直接の再書き込みとはんだ付けが[必要です](https://github.com/qmk/qmk_firmware/issues/2274)。
+
+## Adafruit EZ-Key hid
+これには[ハードウェアの変更](https://www.reddit.com/r/MechanicalKeyboards/comments/3psx0q/the_planck_keyboard_with_bluetooth_guide_and/?ref=search_posts)が必要ですが、Makefile を使って有効にすることができます。ファームウェアは引き続き USB 経由で文字を出力するため、コンピュータ経由で充電する場合は注意してください。任意にオフにするために Bluefruit 上にスイッチを持つことは理にかなっています。
+
+
+
+## Bluetooth の Rules.mk オプション
+これらのうちの1つだけを使ってください
+* BLUETOOTH_ENABLE = yes (レガシーオプション)
+* BLUETOOTH = RN42
+* BLUETOOTH = AdafruitEZKey
+* BLUETOOTH = AdafruitBLE
+
+## Bluetooth キーコード
+
+これは複数のキーボードの出力が選択できる場合に使われます。現在のところ、これは USB と Bluetooth の両方をサポートするキーボードで、それらの間の切り替えのみが可能です。
+
+| 名前 | 説明 |
+|----------|----------------------------------------------|
+| `OUT_AUTO` | USB と Bluetooth を自動的に切り替える |
+| `OUT_USB` | USB のみ |
+| `OUT_BT` | Bluetooth のみ |
diff --git a/docs/ja/feature_bootmagic.md b/docs/ja/feature_bootmagic.md
new file mode 100644
index 00000000000..1f38914edae
--- /dev/null
+++ b/docs/ja/feature_bootmagic.md
@@ -0,0 +1,171 @@
+# ブートマジック
+
+
+
+再書き込みせずにキーボードの挙動を変更することができる、3つの独立した関連する機能があります。それぞれは似たような機能を持ちますが、キーボードがどのように設定されているかによって異なる方法でアクセスされます。
+
+**ブートマジック**は初期化の間にキーボードを設定するためのシステムです。ブートマジックコマンドを起動するには、ブートマジックキーと1つ以上のコマンドキーを押し続けます。
+
+**ブートマジックキーコード** は前に `MAGIC_` が付いており、キーボードが初期化された*後で*ブートマジックの機能にアクセスすることができます。キーコードを使うには、他のキーコードと同じようにそれらをキーマップに割り当てます。
+
+以前は**マジック**として知られていた**コマンド**は、キーボードの異なる側面を制御することができる別の機能です。ブートマジックと一部の機能を共有しますが、コンソールにバージョン情報を出力するような、ブートマジックにはできないこともできます。詳細は、[コマンド](ja/feature_command.md)を見てください。
+
+一部のキーボードでは、ブートマジックはデフォルトで無効になっています。その場合、`rules.mk` 内で以下のように明示的に有効にする必要があります:
+
+```make
+BOOTMAGIC_ENABLE = full
+```
+
+?> `full` の代わりに `yes` が使われていることがあるかもしれませんが、これは問題ありません。ただし、`yes` は非推奨で、理想的には `full` (あるいは`lite`) が使われるべきです。
+
+さらに、以下を `rules.mk` ファイルに追加することで、[ブートマジックライト](#bootmagic-lite) (スケールダウンした、とても基本的なバージョンのブートマジック)を使うことができます:
+
+```make
+BOOTMAGIC_ENABLE = lite
+```
+
+## ホットキー
+
+キーボードを接続しながら、ブートマジックキー(デフォルトはスペース)と目的のホットキーを押します。例えば、スペースと `B` を押したままにすると、ブートローダに入ります。
+
+| ホットキー | 説明 |
+|------------------|---------------------------------------------|
+| エスケープ | EEPROM のブートマジック設定を無視する |
+| `B` | ブートローダに入る |
+| `D` | シリアルを介するデバッグ出力の切り替え |
+| `X` | キーマトリックスのデバッグ出力の切り替え |
+| `K` | キーボードのデバッグの切り替え |
+| `M` | マウスのデバッグの切り替え |
+| `L` | EE_HANDS 左右設定に、"左手"を設定 |
+| `R` | EE_HANDS 左右設定に、"右手"を設定 |
+| Backspace | EEPROM をクリア |
+| Caps Lock | Caps Lock を左コントロールとして扱うかを切り替え |
+| 左 Control | Caps Lock と左コントロールの入れ替えを切り替え |
+| 左 Alt | 左 Alt と左 GUI の入れ替えを切り替え |
+| 右 Alt | 右 Alt と右 GUI の入れ替えを切り替え |
+| 左 GUI | GUI キーの有効・無効を切り替え (ゲームの時に便利です) |
+| `
| `
とエスケープの入れ替えを切り替え |
+| `\` | `\` とバックスペースの入れ替えを切り替え |
+| `N` | N キーロールオーバー (NKRO) の有効・無効を切り替え |
+| `0` | レイヤー 0 をデフォルトレイヤーにする |
+| `1` | レイヤー 1 をデフォルトレイヤーにする |
+| `2` | レイヤー 2 をデフォルトレイヤーにする |
+| `3` | レイヤー 3 をデフォルトレイヤーにする |
+| `4` | レイヤー 4 をデフォルトレイヤーにする |
+| `5` | レイヤー 5 をデフォルトレイヤーにする |
+| `6` | レイヤー 6 をデフォルトレイヤーにする |
+| `7` | レイヤー 7 をデフォルトレイヤーにする |
+
+## キーコード :id=keycodes
+
+| キー | エイリアス | 説明 |
+|----------------------------------|---------|--------------------------------------------------------------------------|
+| `MAGIC_SWAP_CONTROL_CAPSLOCK` | `CL_SWAP` | Caps Lock と左コントロールの入れ替え |
+| `MAGIC_UNSWAP_CONTROL_CAPSLOCK` | `CL_NORM` | Caps Lock と左コントロールの入れ替えの解除 |
+| `MAGIC_CAPSLOCK_TO_CONTROL` | `CL_CTRL` | Caps Lock をコントロールとして扱う |
+| `MAGIC_UNCAPSLOCK_TO_CONTROL` | `CL_CAPS` | Caps Lock をコントロールとして扱うことを止める |
+| `MAGIC_SWAP_LCTL_LGUI` | `LCG_SWP` | 左コントロールと GUI の入れ替え |
+| `MAGIC_UNSWAP_LCTL_LGUI` | `LCG_NRM` | 左コントロールと GUI の入れ替えを解除 |
+| `MAGIC_SWAP_RCTL_RGUI` | `RCG_SWP` | 右コントロールと GUI の入れ替え |
+| `MAGIC_UNSWAP_RCTL_RGUI` | `RCG_NRM` | 右コントロールと GUI の入れ替えを解除 |
+| `MAGIC_SWAP_CTL_GUI` | `CG_SWAP` | 両側のコントロールと GUI の入れ替え |
+| `MAGIC_UNSWAP_CTL_GUI` | `CG_NORM` | 両側のコントロールと GUI の入れ替えを解除 |
+| `MAGIC_TOGGLE_CTL_GUI` | `CG_TOGG` | 両側のコントロールと GUI の入れ替えの切り替え |
+| `MAGIC_SWAP_LALT_LGUI` | `LAG_SWP` | 左 Alt と GUI の入れ替え |
+| `MAGIC_UNSWAP_LALT_LGUI` | `LAG_NRM` | 左 Alt と GUI の入れ替えを解除 |
+| `MAGIC_SWAP_RALT_RGUI` | `RAG_SWP` | 右 Alt と GUI の入れ替え |
+| `MAGIC_UNSWAP_RALT_RGUI` | `RAG_NRM` | 右 Alt と GUI の入れ替えを解除 |
+| `MAGIC_SWAP_ALT_GUI` | `AG_SWAP` | 両側の Alt と GUI の入れ替え |
+| `MAGIC_UNSWAP_ALT_GUI` | `AG_NORM` | 両側の Alt と GUI の入れ替えを解除 |
+| `MAGIC_TOGGLE_ALT_GUI` | `AG_TOGG` | 両側の Alt と GUI の入れ替えの切り替え |
+| `MAGIC_NO_GUI` | `GUI_OFF` | GUI キーを無効にする |
+| `MAGIC_UNNO_GUI` | `GUI_ON` | GUI キーを有効にする |
+| `MAGIC_SWAP_GRAVE_ESC` | `GE_SWAP` | `
とエスケープの入れ替え |
+| `MAGIC_UNSWAP_GRAVE_ESC` | `GE_NORM` | `
とエスケープの入れ替えを解除 |
+| `MAGIC_SWAP_BACKSLASH_BACKSPACE` | `BS_SWAP` | `\` とバックスペースを入れ替え |
+| `MAGIC_UNSWAP_BACKSLASH_BACKSPACE` | `BS_NORM` | `\` とバックスペースの入れ替えを解除する |
+| `MAGIC_HOST_NKRO` | `NK_ON` | N キーロールオーバーを有効にする |
+| `MAGIC_UNHOST_NKRO` | `NK_OFF` | N キーロールオーバーを無効にする |
+| `MAGIC_TOGGLE_NKRO` | `NK_TOGG` | N キーロールオーバーの有効・無効を切り替え |
+| `MAGIC_EE_HANDS_LEFT` | `EH_LEFT` | 分割キーボードのマスター側を左手に設定(`EE_HANDS` 用) |
+| `MAGIC_EE_HANDS_RIGHT` | `EH_RGHT` | 分割キーボードのマスター側を右手に設定(`EE_HANDS` 用) |
+
+## 設定
+
+ブートマジックのためのホットキーの割り当てを変更したい場合は、キーボードあるいはキーマップレベルのどちらかで、`config.h` にこれらを `#define` します。
+
+| 定義 | デフォルト | 説明 |
+|----------------------------------------|-------------|---------------------------------------------------|
+| `BOOTMAGIC_KEY_SALT` | `KC_SPACE` | ブートマジックキー |
+| `BOOTMAGIC_KEY_SKIP` | `KC_ESC` | EEPROM のブートマジック設定を無視する |
+| `BOOTMAGIC_KEY_EEPROM_CLEAR` | `KC_BSPACE` | EEPROM 設定をクリアする |
+| `BOOTMAGIC_KEY_BOOTLOADER` | `KC_B` | ブートローダに入る |
+| `BOOTMAGIC_KEY_DEBUG_ENABLE` | `KC_D` | シリアルを介するデバッグ出力の切り替え |
+| `BOOTMAGIC_KEY_DEBUG_MATRIX` | `KC_X` | マトリックスのデバッグを切り替え |
+| `BOOTMAGIC_KEY_DEBUG_KEYBOARD` | `KC_K` | キーボードのデバッグの切り替え |
+| `BOOTMAGIC_KEY_DEBUG_MOUSE` | `KC_M` | マウスのデバッグの切り替え |
+| `BOOTMAGIC_KEY_EE_HANDS_LEFT` | `KC_L` | EE_HANDS 左右設定に、"左手"を設定 |
+| `BOOTMAGIC_KEY_EE_HANDS_RIGHT` | `KC_R` | EE_HANDS 左右設定に、"右手"を設定 |
+| `BOOTMAGIC_KEY_SWAP_CONTROL_CAPSLOCK` | `KC_LCTRL` | 左コントロールと Caps Lock の入れ替え |
+| `BOOTMAGIC_KEY_CAPSLOCK_TO_CONTROL` | `KC_CAPSLOCK` | Caps Lock を左コントロールとして扱うかを切り替え |
+| `BOOTMAGIC_KEY_SWAP_LALT_LGUI` | `KC_LALT` | 左 Alt と左 GUI の入れ替えを切り替え (macOS 用) |
+| `BOOTMAGIC_KEY_SWAP_RALT_RGUI` | `KC_RALT` | 右 Alt と右 GUI の入れ替えを切り替え (macOS 用) |
+| `BOOTMAGIC_KEY_NO_GUI` | `KC_LGUI` | GUI キーの有効・無効を切り替え (ゲームの時に便利です) |
+| `BOOTMAGIC_KEY_SWAP_GRAVE_ESC` | `KC_GRAVE` | `
とエスケープの入れ替えを切り替え |
+| `BOOTMAGIC_KEY_SWAP_BACKSLASH_BACKSPACE` | `KC_BSLASH` | `\` とバックスペースの入れ替えを切り替え |
+| `BOOTMAGIC_HOST_NKRO` | `KC_N` | N キーロールオーバー (NKRO) の有効・無効を切り替え |
+| `BOOTMAGIC_KEY_DEFAULT_LAYER_0` | `KC_0` | レイヤー 0 をデフォルトレイヤーにする |
+| `BOOTMAGIC_KEY_DEFAULT_LAYER_1` | `KC_1` | レイヤー 1 をデフォルトレイヤーにする |
+| `BOOTMAGIC_KEY_DEFAULT_LAYER_2` | `KC_2` | レイヤー 2 をデフォルトレイヤーにする |
+| `BOOTMAGIC_KEY_DEFAULT_LAYER_3` | `KC_3` | レイヤー 3 をデフォルトレイヤーにする |
+| `BOOTMAGIC_KEY_DEFAULT_LAYER_4` | `KC_4` | レイヤー 4 をデフォルトレイヤーにする |
+| `BOOTMAGIC_KEY_DEFAULT_LAYER_5` | `KC_5` | レイヤー 5 をデフォルトレイヤーにする |
+| `BOOTMAGIC_KEY_DEFAULT_LAYER_6` | `KC_6` | レイヤー 6 をデフォルトレイヤーにする |
+| `BOOTMAGIC_KEY_DEFAULT_LAYER_7` | `KC_7` | レイヤー 7 をデフォルトレイヤーにする |
+
+# ブートマジックライト :id=bootmagic-lite
+
+本格的なブートマジック機能の他に、ブートローダへのジャンプのみを処理するブートマジックライトがあります。これは、物理的なリセットボタンが無くブートローダにジャンプする方法が必要だが、ブートマジックが引き起こす問題を扱いたくないキーボードに適しています。
+
+ブートマジックのこのバージョンを有効にするには、以下を使って `rules.mk` で有効にする必要があります:
+
+```make
+BOOTMAGIC_ENABLE = lite
+```
+
+さらに、どのキーを使うかを指定したほうが良いかもしれません。これは普通ではないマトリックスを持つキーボードで特に便利です。そのためには、使いたいキーの行と列を指定する必要があります。`config.h` ファイルにこれらのエントリを追加します:
+
+```c
+#define BOOTMAGIC_LITE_ROW 0
+#define BOOTMAGIC_LITE_COLUMN 1
+```
+
+デフォルトでは、これらは 0 と 0 に設定されます。これは通常はほとんどのキーボードで "ESC" キーです。
+
+ブートローダを起動するには、キーボードを接続する時にこのキーを押し続けます。たった1つのキーです。
+
+!> ブートマジックライトを使用すると、EEPROM を**常にリセットします**。つまり保存された全ての設定は失われます。
+
+## 高度なブートマジックライト
+
+`bootmagic_lite` 関数は必要に応じてコード内で置き換えることができるように、弱く定義されています。これの良い例は Zeal60 キーボードで、追加の処理が必要です。
+
+関数を置き換えるには、以下のようなものをコードに追加するだけです:
+
+```c
+void bootmagic_lite(void) {
+ matrix_scan();
+ wait_ms(DEBOUNCE * 2);
+ matrix_scan();
+
+ if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
+ // ブートローダにジャンプする。
+ bootloader_jump();
+ }
+}
+```
+
+追加の機能をここに追加することができます。例えば、eeprom のリセットやブートマジックを起動するために押す必要がある追加のキーです。`bootmagic_lite` はファームウェア内で大部分の機能が初期化される前に呼ばれることに注意してください。
diff --git a/docs/ja/feature_combo.md b/docs/ja/feature_combo.md
new file mode 100644
index 00000000000..4fbd6847d2c
--- /dev/null
+++ b/docs/ja/feature_combo.md
@@ -0,0 +1,108 @@
+# コンボ
+
+
+
+コンボ機能は、同時押し方式でのカスタムアクション追加機能です。同時に複数のキーを押して、異なる効果を生み出すことができます。例えば、タッピング時間内で `A` と `S` を押すと、代わりに `ESC` が押されます。もっと複雑なタスクを実行させることもできます。
+
+この機能を有効にするには、`rules.mk` に `COMBO_ENABLE = yes` を追加する必要があります。
+
+さらに、使用するコンボの数を `config.h` の中で、`#define COMBO_COUNT 1` (1を使用するコンボの数で置き換えます)と書いて、指定する必要があります。
+
+
+また、デフォルトでは、コンボのタッピング時間は `TAPPING_TERM` と同じ値に設定されます (ほとんどのキーボードではデフォルトで 200)。ただし、`config.h` で定義することにより異なる値を指定することができます。例えば: `#define COMBO_TERM 300` はコンボのためのタイムアウト時間を 300ms に設定します。
+
+次に、`keymap.c` ファイルに、`COMBO_END` で終了するキーのシーケンス、およびキーの組み合わせを列挙する構造体、その結果のアクションを定義する必要があります。
+
+```c
+const uint16_t PROGMEM test_combo[] = {KC_A, KC_B, COMBO_END};
+combo_t key_combos[COMBO_COUNT] = {COMBO(test_combo, KC_ESC)};
+```
+
+これは、A と B のキーを押した場合に、"Escape" を送信します。
+
+!> このメソッドは[基本的なキーコード](ja/keycodes_basic.md)のみをサポートします。詳細な制御については例を見てください。
+
+## 例
+
+リストを追加したい場合は、以下のようなものを使います:
+
+```c
+enum combos {
+ AB_ESC,
+ JK_TAB
+};
+
+const uint16_t PROGMEM ab_combo[] = {KC_A, KC_B, COMBO_END};
+const uint16_t PROGMEM jk_combo[] = {KC_J, KC_K, COMBO_END};
+
+combo_t key_combos[COMBO_COUNT] = {
+ [AB_ESC] = COMBO(ab_combo, KC_ESC),
+ [JK_TAB] = COMBO(jk_combo, KC_TAB)
+};
+```
+
+より複雑な実装として、カスタム処理を追加するために `process_combo_event` 関数を使うことができます。
+
+```c
+enum combo_events {
+ ZC_COPY,
+ XV_PASTE
+};
+
+const uint16_t PROGMEM copy_combo[] = {KC_Z, KC_C, COMBO_END};
+const uint16_t PROGMEM paste_combo[] = {KC_X, KC_V, COMBO_END};
+
+combo_t key_combos[COMBO_COUNT] = {
+ [ZC_COPY] = COMBO_ACTION(copy_combo),
+ [XV_PASTE] = COMBO_ACTION(paste_combo),
+};
+
+void process_combo_event(uint8_t combo_index, bool pressed) {
+ switch(combo_index) {
+ case ZC_COPY:
+ if (pressed) {
+ tap_code16(LCTL(KC_C));
+ }
+ break;
+ case XV_PASTE:
+ if (pressed) {
+ tap_code16(LCTL(KC_V));
+ }
+ break;
+ }
+}
+```
+
+これは、Z と C を押すと Ctrl+C を送信し、X と V を押すと Ctrl+V を送信します。これを変更して、レイヤーの変更、サウンドの再生、設定の変更などを行うこともできます。
+
+## 追加の設定
+
+長いコンボあるいはさらに長いコンボを使っている場合、構造体があなたのしていることに対応するのに十分な大きさで無いかもしれないため、問題が発生するかもしれません。
+
+この場合、`config.h` ファイルに `#define EXTRA_LONG_COMBOS` または `#define EXTRA_EXTRA_LONG_COMBOS` のどちらかを追加することができます。
+
+`COMBO_ALLOW_ACTION_KEYS` を定義することでアクションキーを有効にすることもできます。
+
+## キーコード
+
+その場でコンボ機能を有効、無効および切り替えすることができます。ゲームなどで、一時的にそれらを無効にする必要がある場合に便利です。
+
+| キーコード | 説明 |
+|----------|---------------------------------|
+| `CMB_ON` | コンボ機能をオンにします |
+| `CMB_OFF` | コンボ機能をオフにします |
+| `CMB_TOG` | コンボ機能のオンとオフを切り替えます |
+
+## ユーザコールバック
+
+キーコードに加えて、状態を設定または状態をチェックするために使うことができる幾つかの関数があります:
+
+| 関数 | 説明 |
+|-----------|--------------------------------------------------------------------|
+| `combo_enable()` | コンボ機能を有効にします |
+| `combo_disable()` | コンボ機能を無効にし、コンボバッファをクリアします |
+| `combo_toggle()` | コンボ機能の状態を切り替えます |
+| `is_combo_enabled()` | コンボ機能の状態(true か false)を返します |
diff --git a/docs/ja/feature_command.md b/docs/ja/feature_command.md
new file mode 100644
index 00000000000..f8b7e892941
--- /dev/null
+++ b/docs/ja/feature_command.md
@@ -0,0 +1,56 @@
+# コマンド
+
+
+
+コマンド(旧称:マジック)は、ファームウェアを書き込んだり、[ブートマジック](ja/feature_bootmagic.md)を使うためにプラグを抜いたりすることなくキーボードの挙動を変更する方法です。この機能と[ブートマジックキーコード](feature_bootmagic.md#keycodes)には多くの重複があります。可能な限り、コマンドでは無くブートマジックキーコードの機能を使うことをお勧めします。
+
+一部のキーボードではコマンドがデフォルトで無効になっています。その場合、`rules.mk` 内で明示的に有効にする必要があります:
+
+```make
+COMMAND_ENABLE = yes
+```
+
+## 使用法
+
+コマンドを使うには、`IS_COMMAND()` マクロで定義されたキーの組み合わせを押し続けます。デフォルトでは、これは「左Shift + 右Shift」です。次に、目的のコマンドに対応するキーを押します。例えば、現在の QMK バージョンを QMK Toolbox コンソールに出力するには、「左Shift + 右Shift + `V`」を押します。
+
+## 設定
+
+コマンドのためのキーの割り当てを変更したい場合は、キーボードあるいはキーマップレベルのどちらかで、`config.h` にこれらを `#define` します。ここで割り当てる全てのキーコードは `KC_` 接頭辞を省略する必要があります。
+
+| 定義 | デフォルト | 説明 |
+|------------------------------------|--------------------------------|------------------------------------------------|
+| `IS_COMMAND()` | `(get_mods() == MOD_MASK_SHIFT)` | コマンドをアクティブにするキーの組み合わせ |
+| `MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS` | `true` | ファンクション行を使ってデフォルトレイヤーを設定 |
+| `MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS` | `true` | 数字キーでデフォルトレイヤーを設定 |
+| `MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM` | `false` | `MAGIC_KEY_LAYER0..9` を使ってデフォルトレイヤーを設定 |
+| `MAGIC_KEY_DEBUG` | `D` | シリアルを介するデバッグの切り替え |
+| `MAGIC_KEY_DEBUG_MATRIX` | `X` | キーマトリックスのデバッグの切り替え |
+| `MAGIC_KEY_DEBUG_KBD` | `K` | キーボードのデバッグの切り替え |
+| `MAGIC_KEY_DEBUG_MOUSE` | `M` | マウスのデバッグの切り替え |
+| `MAGIC_KEY_CONSOLE` | `C` | コマンドコンソールを有効にする |
+| `MAGIC_KEY_VERSION` | `V` | コンソールに実行中の QMK バージョンを出力 |
+| `MAGIC_KEY_STATUS` | `S` | コンソールに現在のキーボードの状態を出力 |
+| `MAGIC_KEY_HELP` | `H` | コンソールにコマンドのヘルプを出力 |
+| `MAGIC_KEY_HELP_ALT` | `SLASH` | コンソールにコマンドのヘルプを出力 (代替) |
+| `MAGIC_KEY_LAYER0` | `0` | レイヤー 0 をデフォルトレイヤーにする |
+| `MAGIC_KEY_LAYER0_ALT` | `GRAVE` | レイヤー 0 をデフォルトレイヤーにする (代替) |
+| `MAGIC_KEY_LAYER1` | `1` | レイヤー 1 をデフォルトレイヤーにする |
+| `MAGIC_KEY_LAYER2` | `2` | レイヤー 2 をデフォルトレイヤーにする |
+| `MAGIC_KEY_LAYER3` | `3` | レイヤー 3 をデフォルトレイヤーにする |
+| `MAGIC_KEY_LAYER4` | `4` | レイヤー 4 をデフォルトレイヤーにする |
+| `MAGIC_KEY_LAYER5` | `5` | レイヤー 5 をデフォルトレイヤーにする |
+| `MAGIC_KEY_LAYER6` | `6` | レイヤー 6 をデフォルトレイヤーにする |
+| `MAGIC_KEY_LAYER7` | `7` | レイヤー 7 をデフォルトレイヤーにする |
+| `MAGIC_KEY_LAYER8` | `8` | レイヤー 8 をデフォルトレイヤーにする |
+| `MAGIC_KEY_LAYER9` | `9` | レイヤー 9 をデフォルトレイヤーにする |
+| `MAGIC_KEY_BOOTLOADER` | `B` | ブートローダにジャンプする |
+| `MAGIC_KEY_BOOTLOADER_ALT` | `ESC` | ブートローダにジャンプする (代替) |
+| `MAGIC_KEY_LOCK` | `CAPS` | 何も入力できないようにキーボードをロック |
+| `MAGIC_KEY_EEPROM` | `E` | 保存された EEPROM 設定をコンソールに出力 |
+| `MAGIC_KEY_EEPROM_CLEAR` | `BSPACE` | EEPROM をクリア |
+| `MAGIC_KEY_NKRO` | `N` | N キーロールオーバー (NKRO) の有効・無効を切り替え |
+| `MAGIC_KEY_SLEEP_LED` | `Z` | コンピュータがスリープの時に LED を切り替え |
diff --git a/docs/ja/feature_dip_switch.md b/docs/ja/feature_dip_switch.md
new file mode 100644
index 00000000000..1403485cadd
--- /dev/null
+++ b/docs/ja/feature_dip_switch.md
@@ -0,0 +1,95 @@
+# DIP スイッチ
+
+
+
+DIP スイッチは、以下を `rules.mk` に追加することでサポートされます:
+
+ DIP_SWITCH_ENABLE = yes
+
+さらに、以下を `config.h` に追加します:
+
+```c
+#define DIP_SWITCH_PINS { B14, A15, A10, B9 }
+```
+
+## コールバック
+
+コールバック関数を `.c` に記述することができます:
+
+```c
+void dip_switch_update_kb(uint8_t index, bool active) {
+ dip_switch_update_user(index, active);
+}
+```
+
+
+あるいは `keymap.c` に記述することもできます:
+
+```c
+void dip_switch_update_user(uint8_t index, bool active) {
+ switch (index) {
+ case 0:
+ if(active) { audio_on(); } else { audio_off(); }
+ break;
+ case 1:
+ if(active) { clicky_on(); } else { clicky_off(); }
+ break;
+ case 2:
+ if(active) { music_on(); } else { music_off(); }
+ break;
+ case 3:
+ if (active) {
+ #ifdef AUDIO_ENABLE
+ PLAY_SONG(plover_song);
+ #endif
+ layer_on(_PLOVER);
+ } else {
+ #ifdef AUDIO_ENABLE
+ PLAY_SONG(plover_gb_song);
+ #endif
+ layer_off(_PLOVER);
+ }
+ break;
+ }
+}
+```
+
+更に、より複雑な処理ができるビットマスク関数をサポートします。
+
+
+```c
+void dip_switch_update_mask_kb(uint32_t state) {
+ dip_switch_update_mask_user(state);
+}
+```
+
+
+あるいは `keymap.c` に記述することもできます:
+
+```c
+void dip_switch_update_mask_user(uint32_t state) {
+ if (state & (1UL<<0) && state & (1UL<<1)) {
+ layer_on(_ADJUST); // C on esc
+ } else {
+ layer_off(_ADJUST);
+ }
+ if (state & (1UL<<0)) {
+ layer_on(_TEST_A); // A on ESC
+ } else {
+ layer_off(_TEST_A);
+ }
+ if (state & (1UL<<1)) {
+ layer_on(_TEST_B); // B on esc
+ } else {
+ layer_off(_TEST_B);
+ }
+}
+```
+
+
+## ハードウェア
+
+DIP スイッチの片側は MCU のピンへ直接配線し、もう一方の側はグラウンドに配線する必要があります。機能的に同じであるため、どちら側がどちらに接続されているかは問題にはならないはずです。
diff --git a/docs/ja/feature_dynamic_macros.md b/docs/ja/feature_dynamic_macros.md
new file mode 100644
index 00000000000..ab8ec371374
--- /dev/null
+++ b/docs/ja/feature_dynamic_macros.md
@@ -0,0 +1,71 @@
+# 動的マクロ: ランタイムでのマクロの記録および再生
+
+
+
+QMK はその場で作られた一時的なマクロをサポートします。これらを動的マクロと呼びます。それらはユーザがキーボードから定義し、キーボードのプラグを抜くか再起動すると失われます。
+
+1つまたは2つのマクロに合計128のキー押下を保存できます。RAM をより多く使用してサイズを増やすことができます。
+
+有効にするには、最初に `rules.mk` に `DYNAMIC_MACRO_ENABLE = yes` を記述します。そして、以下のキーをキーマップに追加します:
+
+| キー | Alias | 説明 |
+|------------------|----------|---------------------------------------------------|
+| `DYN_REC_START1` | `DM_REC1` | マクロ 1 の記録を開始します |
+| `DYN_REC_START2` | `DM_REC2` | マクロ 2 の記録を開始します |
+| `DYN_MACRO_PLAY1` | `DM_PLY1` | マクロ 1 を再生します |
+| `DYN_MACRO_PLAY2` | `DM_PLY2` | マクロ 2 を再生します |
+| `DYN_REC_STOP` | `DM_RSTP` | 現在記録中のマクロの記録を終了します。 |
+
+これが必要な全てです。
+
+マクロの記録を開始するには、`DYN_REC_START1` または `DYN_REC_START2` のどちらかを押します。
+
+記録を終了するには、`DYN_REC_STOP` レイヤーボタンを押します。
+
+マクロを再生するには、`DYN_MACRO_PLAY1` あるいは `DYN_MACRO_PLAY2` のどちらかを押します。
+
+マクロの一部としてマクロを再生することができます。マクロ 1 を記録中にマクロ 2 を再生、またはその逆も問題ありません。ただし、再帰的なマクロ、つまりマクロ 1 を再生するマクロ 1 は作成しないでください。もしそうしてキーボードが反応しなくなった場合は、キーボードを取り外し再び接続します。これを完全に無効にするには、`config.h` ファイルで `DYNAMIC_MACRO_NO_NESTING` を定義します。
+
+?> 動的マクロの内部の詳細については、`process_dynamic_macro.h` および `process_dynamic_macro.c` ファイルのコメントを読んでください。
+
+## カスタマイズ
+
+ある程度のカスタマイズを可能にするオプションがいくつか追加されています。
+
+| 定義 | デフォルト | 説明 |
+|----------------------------|----------------|-----------------------------------------------------------------------------------------------------------------|
+| `DYNAMIC_MACRO_SIZE` | 128 | 動的マクロが使用できるメモリ量を設定します。これは限られたリソースであり、コントローラに依存します。 |
+| `DYNAMIC_MACRO_USER_CALL` | *定義なし* | これを定義すると、ユーザの `keymap.c` ファイルを使ってマクロが起動されます。 |
+| `DYNAMIC_MACRO_NO_NESTING` | *定義なし* | これを定義すると、別のマクロからマクロを呼び出す(入れ子になったマクロ)機能を無効にします。 |
+
+
+記録中にキーを押すたびに LED が点滅し始めた場合は、マクロバッファにマクロを入れるスペースがもう無いことを意味します。マクロを入れるには、他のマクロ(それらは同じバッファを共有します)を短くするか、`config.h` に `DYNAMIC_MACRO_SIZE` 定義を追加することでバッファを増やします(デフォルト値: 128; ヘッダ内のコメントを読んでください)。
+
+
+### DYNAMIC_MACRO_USER_CALL
+
+以前のバージョンの動的マクロをお使いの方へ: 専用の `DYN_REC_STOP` キーを使わずに動的マクロキーへのアクセスに使われるレイヤーモディファイアのみを使って、マクロの記録を終了することもまだ可能です。この動作に戻したい場合は、`#define DYNAMIC_MACRO_USER_CALL` を `config.h` に追加し、以下のスニペットを `process_record_user()` 関数の先頭に記述します:
+
+```c
+ uint16_t macro_kc = (keycode == MO(_DYN) ? DYN_REC_STOP : keycode);
+
+ if (!process_record_dynamic_macro(macro_kc, record)) {
+ return false;
+ }
+```
+
+### ユーザフック
+
+カスタム機能とフィードバックオプションを動的マクロ機能に追加するために使うことができるフックが幾つかあります。これによりある程度のカスタマイズが可能になります。
+
+direction がどのマクロであるかを示すことに注意してください。`1` がマクロ 1、`-1` がマクロ 2、0 がマクロ無しです。
+
+* `dynamic_macro_record_start_user(void)` - マクロの記録を開始する時に起動されます。
+* `dynamic_macro_play_user(int8_t direction)` - マクロを再生する時に起動されます。
+* `dynamic_macro_record_key_user(int8_t direction, keyrecord_t *record)` - マクロの記録中に各キー押下で起動されます。
+* `dynamic_macro_record_end_user(int8_t direction)` - マクロの記録を停止した時に起動されます。
+
+さらに、動的マクロ機能が有効な場合にバックライトを点滅させるために `dynamic_macro_led_blink()` を呼び出すことができます。
diff --git a/docs/ja/feature_encoders.md b/docs/ja/feature_encoders.md
new file mode 100644
index 00000000000..7f8922652db
--- /dev/null
+++ b/docs/ja/feature_encoders.md
@@ -0,0 +1,81 @@
+# エンコーダ
+
+
+
+以下を `rules.mk` に追加することで基本的なエンコーダがサポートされます:
+
+```make
+ENCODER_ENABLE = yes
+```
+
+さらに、以下を `config.h` に追加します:
+
+```c
+#define ENCODERS_PAD_A { B12 }
+#define ENCODERS_PAD_B { B13 }
+```
+
+各 PAD_A/B 変数は配列を定義するため、複数のエンコーダを定義することができます。例えば:
+
+```c
+#define ENCODERS_PAD_A { encoder1a, encoder2a }
+#define ENCODERS_PAD_B { encoder1b, encoder2b }
+```
+
+エンコーダの時計回りの方向が間違っている場合は、A と B のパッド定義を交換することができます。define を使って逆にすることもできます:
+
+```c
+#define ENCODER_DIRECTION_FLIP
+```
+
+さらに、解像度を同じファイルで指定することができます (デフォルトかつお勧めは4):
+
+```c
+#define ENCODER_RESOLUTION 4
+```
+
+## 分割キーボード
+
+分割キーボードのそれぞれの側のエンコーダに異なるピン配列を使っている場合、右側のピン配列を以下のように定義することができます:
+
+```c
+#define ENCODERS_PAD_A_RIGHT { encoder1a, encoder2a }
+#define ENCODERS_PAD_B_RIGHT { encoder1b, encoder2b }
+```
+
+## コールバック
+
+コールバック関数を `.c` に記述することができます:
+
+```c
+void encoder_update_kb(uint8_t index, bool clockwise) {
+ encoder_update_user(index, clockwise);
+}
+```
+
+あるいは `keymap.c` に記述することもできます:
+
+```c
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) { /* First encoder */
+ if (clockwise) {
+ tap_code(KC_PGDN);
+ } else {
+ tap_code(KC_PGUP);
+ }
+ } else if (index == 1) { /* Second encoder */
+ if (clockwise) {
+ tap_code(KC_DOWN);
+ } else {
+ tap_code(KC_UP);
+ }
+ }
+}
+```
+
+## ハードウェア
+
+エンコーダの A と B の線は MCU に直接配線し、C/common 線はグランドに配線する必要があります。
diff --git a/docs/ja/feature_grave_esc.md b/docs/ja/feature_grave_esc.md
new file mode 100644
index 00000000000..8c6680d74d7
--- /dev/null
+++ b/docs/ja/feature_grave_esc.md
@@ -0,0 +1,37 @@
+# グレイブエスケープ
+
+
+
+60% キーボード、またはファンクションキー行の無い他のレイアウトを使っている場合、専用の Escape キーが無いことに気付くでしょう。グレイブエスケープは grave キー (`
および `~`) を Escape と共有することができる機能です。
+
+## 使用法
+
+キーマップ内の `KC_GRAVE` キー (通常は`1` キーの左)を `KC_GESC` に置き換えます。ほとんどの場合、このキーは押された時に `KC_ESC` を出力します。ただし、Shift あるいは GUI を押したままにすると、代わりに `KC_GRV` を出力します。
+
+## OS に見えるもの
+
+メアリーがキーボードで GESC を押すと、OS には KC_ESC 文字が見えます。メアリーが Shift を押しながら GESC を押すと、`~` または Shift された時はバッククォートを出力します。彼女が GUI/CMD/WIN を押したままにすると、1つの `
文字を出力します。
+
+## キーコード
+
+| キー | エイリアス | 説明 |
+|---------|-----------|------------------------------------------------------------------|
+| `KC_GESC` | `GRAVE_ESC` | 押された場合に Escape。Shift あるいは GUI が押されたままの場合は `
|
+
+### 注意事項
+
+macOS では、Command+`
はデフォルトで "次のウィンドウを操作対象にする" にマップされます。つまりバッククォートを出力しません。さらに、ショートカットがキーボード環境設定で変更された場合でも、ターミナルは常にこのショートカットを認識してウィンドウを切り替えます。
+
+## 設定
+
+グレイブエスケープが壊す可能性のあるキーの組み合わせが幾つかあります。その中には、Windows では Control+Shift+Escape、macOSでは Command+Option+Escape があります。これを回避するには、`config.h` で以下のオプションを `#define` することができます:
+
+| 定義 | 説明 |
+|--------------------------|-----------------------------------------|
+| `GRAVE_ESC_ALT_OVERRIDE` | Alt が押された場合、常に Escape を送信する |
+| `GRAVE_ESC_CTRL_OVERRIDE` | Control が押された場合、常に Escape を送信する |
+| `GRAVE_ESC_GUI_OVERRIDE` | GUI が押された場合、常に Escape を送信する |
+| `GRAVE_ESC_SHIFT_OVERRIDE` | Shift が押された場合、常に Escape を送信する |
diff --git a/docs/ja/feature_haptic_feedback.md b/docs/ja/feature_haptic_feedback.md
new file mode 100644
index 00000000000..b9b42670147
--- /dev/null
+++ b/docs/ja/feature_haptic_feedback.md
@@ -0,0 +1,163 @@
+# 触覚フィードバック
+
+
+
+## 触覚フィードバック の rules.mk オプション
+
+現在のところ、`rules.mk` で触覚フィードバック用に以下のオプションを利用可能です:
+
+`HAPTIC_ENABLE += DRV2605L`
+
+`HAPTIC_ENABLE += SOLENOID`
+
+## サポートされる既知のハードウェア
+
+| 名前 | 説明 |
+|--------------------|-------------------------------------------------|
+| [LV061228B-L65-A](https://www.digikey.com/product-detail/en/jinlong-machinery-electronics-inc/LV061228B-L65-A/1670-1050-ND/7732325) | z-axis 2v LRA |
+| [Mini Motor Disc](https://www.adafruit.com/product/1201) | small 2-5v ERM |
+
+## 触覚キーコード
+
+以下のキーコードは、選択した触覚メカニズムに依存して動作するかどうか決まります。
+
+| 名前 | 説明 |
+|-----------|-------------------------------------------------------|
+| `HPT_ON` | 触覚フィードバックをオン |
+| `HPT_OFF` | 触覚フィードバックをオフ |
+| `HPT_TOG` | 触覚フィードバックのオン/オフを切り替え |
+| `HPT_RST` | 触覚フィードバック設定をデフォルトに戻す |
+| `HPT_FBK` | キー押下またはリリースまたはその両方でフィードバックを切り替え |
+| `HPT_BUZ` | ソレノイドの振動のオン/オフを切り替え |
+| `HPT_MODI` | 次の DRV2605L 波形に移動 |
+| `HPT_MODD` | 前の DRV2605L 波形に移動 |
+| `HPT_CONT` | 連続触覚モードのオン/オフを切り替え |
+| `HPT_CONI` | DRV2605L の連続触覚強度を増加 |
+| `HPT_COND` | DRV2605L の連続触覚強度を減少 |
+| `HPT_DWLI` | ソレノイドの滞留時間を増加 |
+| `HPT_DWLD` | ソレノイドの滞留時間を減少 |
+
+### ソレノイド
+
+ほとんどの MCU はソレノイドのコイルを駆動するために必要な電流を供給できないため、最初に MOSFET を介してソレノイドを駆動する回路を構築する必要があります。
+
+[Adafruit が提供する配線図](https://playground.arduino.cc/uploads/Learning/solenoid_driver.pdf)
+
+
+| 設定 | デフォルト | 説明 |
+|--------------------------|---------------|-------------------------------------------------------|
+| `SOLENOID_PIN` | *定義なし* | ソレノイドが接続されているピンを設定する。 |
+| `SOLENOID_DEFAULT_DWELL` | `12` ms | ソレノイドのデフォルトの滞留時間を設定する。 |
+| `SOLENOID_MIN_DWELL` | `4` ms | 滞留時間の下限を設定する。 |
+| `SOLENOID_MAX_DWELL` | `100` ms | 滞留時間の上限を設定する。 |
+
+?> 滞留時間とは、「プランジャー」が作動したままになる時間です。滞留時間により、ソレノイドの音が変わります。
+
+ブートローダ実行中に一部のピンが給電されているかもしれず (例えば、STM32F303 チップ上の A13)、そうすると書き込みプロセスの間ずっとソレノイドがオン状態になることに注意してください。これはソレノイドを加熱し損傷を与えるかもしれません。ソレノイドが接続されているピンがブートローダ/DFU 実行中にソレノイドをオンにしていることが分かった場合は、他のピンを選択してください。
+
+### DRV2605L
+
+DRV2605Lは i2c プロトコルで制御され、SDA および SCL ピンに接続する必要があります。これらは使用する MCU によって異なります。
+
+#### フィードバックモータのセットアップ
+
+このドライバは2つの異なるフィードバックモータをサポートします。選択したモータに基づいて、`config.h` で以下を設定します。
+
+##### ERM
+
+偏心回転質量振動モータ (ERM) は偏りのある重りが取り付けられたモータで、駆動信号が取り付けられると偏りのある重りが回転し、正弦波が振動に変換されます。
+
+```
+#define FB_ERM_LRA 0
+#define FB_BRAKEFACTOR 3 /* For 1x:0, 2x:1, 3x:2, 4x:3, 6x:4, 8x:5, 16x:6, Disable Braking:7 */
+#define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */
+
+/* 特定のモータに最適な設定については、データシートを参照してください。*/
+#define RATED_VOLTAGE 3
+#define V_PEAK 5
+```
+##### LRA
+
+線形共振アクチュエータ (LRA、線形バイブレータとしても知られています)は、ERM と異なります。LRA は重りと磁石をバネで吊るしたものとボイスコイルで構成されています。駆動信号が印加されるとされると、重りは単一の軸で振動します (左右または上下)。重りはバネに取り付けられているため、特定の周波数で共振効果があります。この周波数は LRA が最も効率的に動作する箇所です。この周波数の推奨範囲については、モータのデータシートを参照してください。
+
+```
+#define FB_ERM_LRA 1
+#define FB_BRAKEFACTOR 3 /* For 1x:0, 2x:1, 3x:2, 4x:3, 6x:4, 8x:5, 16x:6, Disable Braking:7 */
+#define FB_LOOPGAIN 1 /* For Low:0, Medium:1, High:2, Very High:3 */
+
+/* 特定のモータに最適な設定については、データシートを参照してください。*/
+#define RATED_VOLTAGE 2
+#define V_PEAK 2.8
+#define V_RMS 2.0
+#define V_PEAK 2.1
+#define F_LRA 205 /* 共振周波数 */
+```
+
+#### DRV2605L 波形ライブラリ
+
+DRV2605L には呼び出して再生できる様々な波形シーケンスのプリロードライブラリが同梱されています。マクロを書く場合、これらの波形は `DRV_pulse(*sequence name or number*)` を使って再生することができます
+
+データシートの波形シーケンスのリスト
+
+| seq# | シーケンス名 | seq# | シーケンス名 | seq# | シーケンス名 |
+|-----|---------------------|-----|-----------------------------------|-----|--------------------------------------|
+| 1 | strong_click | 43 | lg_dblclick_med_60 | 85 | transition_rampup_med_smooth2 |
+| 2 | strong_click_60 | 44 | lg_dblsharp_tick | 86 | transition_rampup_short_smooth1 |
+| 3 | strong_click_30 | 45 | lg_dblsharp_tick_80 | 87 | transition_rampup_short_smooth2 |
+| 4 | sharp_click | 46 | lg_dblsharp_tick_60 | 88 | transition_rampup_long_sharp1 |
+| 5 | sharp_click_60 | 47 | buzz | 89 | transition_rampup_long_sharp2 |
+| 6 | sharp_click_30 | 48 | buzz_80 | 90 | transition_rampup_med_sharp1 |
+| 7 | soft_bump | 49 | buzz_60 | 91 | transition_rampup_med_sharp2 |
+| 8 | soft_bump_60 | 50 | buzz_40 | 92 | transition_rampup_short_sharp1 |
+| 9 | soft_bump_30 | 51 | buzz_20 | 93 | transition_rampup_short_sharp2 |
+| 10 | dbl_click | 52 | pulsing_strong | 94 | transition_rampdown_long_smooth1_50 |
+| 11 | dbl_click_60 | 53 | pulsing_strong_80 | 95 | transition_rampdown_long_smooth2_50 |
+| 12 | trp_click | 54 | pulsing_medium | 96 | transition_rampdown_med_smooth1_50 |
+| 13 | soft_fuzz | 55 | pulsing_medium_80 | 97 | transition_rampdown_med_smooth2_50 |
+| 14 | strong_buzz | 56 | pulsing_sharp | 98 | transition_rampdown_short_smooth1_50 |
+| 15 | alert_750ms | 57 | pulsing_sharp_80 | 99 | transition_rampdown_short_smooth2_50 |
+| 16 | alert_1000ms | 58 | transition_click | 100 | transition_rampdown_long_sharp1_50 |
+| 17 | strong_click1 | 59 | transition_click_80 | 101 | transition_rampdown_long_sharp2_50 |
+| 18 | strong_click2_80 | 60 | transition_click_60 | 102 | transition_rampdown_med_sharp1_50 |
+| 19 | strong_click3_60 | 61 | transition_click_40 | 103 | transition_rampdown_med_sharp2_50 |
+| 20 | strong_click4_30 | 62 | transition_click_20 | 104 | transition_rampdown_short_sharp1_50 |
+| 21 | medium_click1 | 63 | transition_click_10 | 105 | transition_rampdown_short_sharp2_50 |
+| 22 | medium_click2_80 | 64 | transition_hum | 106 | transition_rampup_long_smooth1_50 |
+| 23 | medium_click3_60 | 65 | transition_hum_80 | 107 | transition_rampup_long_smooth2_50 |
+| 24 | sharp_tick1 | 66 | transition_hum_60 | 108 | transition_rampup_med_smooth1_50 |
+| 25 | sharp_tick2_80 | 67 | transition_hum_40 | 109 | transition_rampup_med_smooth2_50 |
+| 26 | sharp_tick3_60 | 68 | transition_hum_20 | 110 | transition_rampup_short_smooth1_50 |
+| 27 | sh_dblclick_str | 69 | transition_hum_10 | 111 | transition_rampup_short_smooth2_50 |
+| 28 | sh_dblclick_str_80 | 70 | transition_rampdown_long_smooth1 | 112 | transition_rampup_long_sharp1_50 |
+| 29 | sh_dblclick_str_60 | 71 | transition_rampdown_long_smooth2 | 113 | transition_rampup_long_sharp2_50 |
+| 30 | sh_dblclick_str_30 | 72 | transition_rampdown_med_smooth1 | 114 | transition_rampup_med_sharp1_50 |
+| 31 | sh_dblclick_med | 73 | transition_rampdown_med_smooth2 | 115 | transition_rampup_med_sharp2_50 |
+| 32 | sh_dblclick_med_80 | 74 | transition_rampdown_short_smooth1 | 116 | transition_rampup_short_sharp1_50 |
+| 33 | sh_dblclick_med_60 | 75 | transition_rampdown_short_smooth2 | 117 | transition_rampup_short_sharp2_50 |
+| 34 | sh_dblsharp_tick | 76 | transition_rampdown_long_sharp1 | 118 | long_buzz_for_programmatic_stopping |
+| 35 | sh_dblsharp_tick_80 | 77 | transition_rampdown_long_sharp2 | 119 | smooth_hum1_50 |
+| 36 | sh_dblsharp_tick_60 | 78 | transition_rampdown_med_sharp1 | 120 | smooth_hum2_40 |
+| 37 | lg_dblclick_str | 79 | transition_rampdown_med_sharp2 | 121 | smooth_hum3_30 |
+| 38 | lg_dblclick_str_80 | 80 | transition_rampdown_short_sharp1 | 122 | smooth_hum4_20 |
+| 39 | lg_dblclick_str_60 | 81 | transition_rampdown_short_sharp2 | 123 | smooth_hum5_10 |
+| 40 | lg_dblclick_str_30 | 82 | transition_rampup_long_smooth1 | | |
+| 41 | lg_dblclick_med | 83 | transition_rampup_long_smooth2 | | |
+| 42 | lg_dblclick_med_80 | 84 | transition_rampup_med_smooth1 | | |
+### オプションの DRV2605L の定義
+
+```
+#define DRV_GREETING *sequence name or number*
+```
+触覚フィードバッグが有効な場合、キーボード起動時に特定のシーケンスに合わせて振動します。以下の定義を使って選択することができます:
+
+```
+#define DRV_MODE_DEFAULT *sequence name or number*
+```
+これにより HPT_RST がアクティブモードとして設定するシーケンスを設定します。未定義の場合、HPT_RST が押された時にモードが 1 に設定されます。
+
+### DRV2605L 連続触覚モード
+
+このモードは強さを増減するオプションを使って連続触覚フィードバッグを設定します。
diff --git a/docs/ja/feature_hd44780.md b/docs/ja/feature_hd44780.md
new file mode 100644
index 00000000000..5ca4aade1e4
--- /dev/null
+++ b/docs/ja/feature_hd44780.md
@@ -0,0 +1,62 @@
+# HD44780 LCD ディスプレイ
+
+
+
+これは Peter Fleury の LCD ライブラリの統合です。このページは基本について説明します。[詳細なドキュメントについてはこのページをご覧ください](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html) (訳注)原文のリンク先のページは、サービスの終了に伴って削除されています。移行先は (http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html) と思われます。
+
+HD44780 ディスプレイのサポートを有効にするには、キーボードの `rules.mk` の `HD44780_ENABLE` フラグを yes に設定します。
+
+## 設定
+
+ディスプレイで使用されるピンとディスプレイの行と列の数を、キーボードの `config.h` に設定する必要があります。
+
+
+HD44780 のラベルが付いたセクションのコメントを外し、必要に応じてパラメータを変更します。
+````
+/*
+ * HD44780 LCD ディスプレイ設定
+ */
+
+#define LCD_LINES 2 //< ディスプレイの表示行数
+#define LCD_DISP_LENGTH 16 //< ディスプレイの行ごとの表示文字数
+#define LCD_IO_MODE 1 //< 0: メモリマップモード 1: IO ポートモード
+#if LCD_IO_MODE
+#define LCD_PORT PORTB //< LCD 行のためのポート
+#define LCD_DATA0_PORT LCD_PORT //< 4ビットデータビット 0 のポート
+#define LCD_DATA1_PORT LCD_PORT //< 4ビットデータビット 1 のポート
+#define LCD_DATA2_PORT LCD_PORT //< 4ビットデータビット 2 のポート
+#define LCD_DATA3_PORT LCD_PORT //< 4ビットデータビット 3 のポート
+#define LCD_DATA0_PIN 4 //< 4ビットデータビット 0 のピン
+#define LCD_DATA1_PIN 5 //< 4ビットデータビット 1 のピン
+#define LCD_DATA2_PIN 6 //< 4ビットデータビット 2 のピン
+#define LCD_DATA3_PIN 7 //< 4ビットデータビット 3 のピン
+#define LCD_RS_PORT LCD_PORT //< RS 線のためのポート
+#define LCD_RS_PIN 3 //< RS 線のためのピン
+#define LCD_RW_PORT LCD_PORT //< RW 線のためのポート
+#define LCD_RW_PIN 2 //< RW 線のためのピン
+#define LCD_E_PORT LCD_PORT //< Enable 線のためのポート
+#define LCD_E_PIN 1 //< Enable 線のためのピン
+#endif
+````
+
+他のプロパティを設定する必要がある場合は、それらを `quantum/hd44780.h` からコピーし、`config.h` に設定することができます。(訳注)`quantum/hd44780.h` は `drivers/avr/hd44780.h` の間違いではないかと思われます。
+
+## 使用法
+
+ディスプレイを初期化するには、以下のパラメータのうちの1つを使って `lcd_init()` を呼び出します:
+````
+LCD_DISP_OFF : ディスプレイオフ
+LCD_DISP_ON : ディスプレイオン、カーソルオフ
+LCD_DISP_ON_CURSOR : ディスプレイオン、カーソルオン
+LCD_DISP_ON_CURSOR_BLINK : ディスプレイオン、点滅カーソル
+````
+これはキーボードの `matrix_init_kb` またはキーマップの `matrix_init_user` で行うのが最適です。
+使用前にディスプレイをクリアすることをお勧めします。
+そのためには、`lcd_clrscr()` を呼びます。
+
+ディスプレイに何かを表示するには、最初に `lcd_gotoxy(column, line)` を呼びます。最初の行の先頭に移動するには、`lcd_gotoxy(0, 0)` を呼び出し、その後 `lcd_puts("example string")` を使って文字列を出力します。
+
+ディスプレイを制御することができる、より多くのメソッドがあります。[詳細なドキュメントについてはリンクされたページをご覧ください](http://homepage.hispeed.ch/peterfleury/doxygen/avr-gcc-libraries/group__pfleury__lcd.html) (訳注)原文のリンク先のページは、サービスの終了に伴って削除されています。移行先は (http://www.peterfleury.epizy.com/doxygen/avr-gcc-libraries/group__pfleury__lcd.html) と思われます。
diff --git a/docs/ja/feature_key_lock.md b/docs/ja/feature_key_lock.md
new file mode 100644
index 00000000000..b786fbb048b
--- /dev/null
+++ b/docs/ja/feature_key_lock.md
@@ -0,0 +1,27 @@
+# キーロック
+
+
+
+特定のキーを長時間押すことが必要になる場合があります。キーロックは次に押すキーを押したままにします。もう一度押すと、リリースされます。
+
+いくつかの文を全て大文字で入力する必要があるとしましょう。`KC_LOCK` を押し、次にシフトを押します。これで、シフトは次にタップするまで押していると見なされます。キーロックを Caps Lock と考えることができますが、さらに強力です。
+
+## 使用法
+
+最初に `rules.mk` で `KEY_LOCK_ENABLE = yes` を設定することでキーロックを有効にします。次に、キーマップでキーを選択し、それをキーコード `KC_LOCK` に割り当てます。
+
+## キーコード
+
+| キーコード | 説明 |
+|---------|--------------------------------------------------------------|
+| `KC_LOCK` | キーが再び押されるまで次のキーを押したままにします。 |
+
+## 注意事項
+
+キーロックは、標準アクションキーと[ワンショットモディファイア](ja/one_shot_keys.md)キー (例えば、Shift を `OSM(KC_LSFT)` と定義した場合)のみを押し続けることができます。
+これは、QMK の特殊機能(ワンショットモディファイアを除く)、または `KC_LPRN` のような shift を押されたキーのバージョンは含みません。[基本的なキーコード](ja/keycodes_basic.md)リストにある場合、押したままにすることができます。
+
+レイヤーの切り替えは、キーロックを解除しません。
diff --git a/docs/ja/flashing.md b/docs/ja/flashing.md
index 1118fb5e2f5..713d4fdf9e0 100644
--- a/docs/ja/flashing.md
+++ b/docs/ja/flashing.md
@@ -1,13 +1,13 @@
# 書き込みの手順とブートローダ情報
キーボードが使用するブートローダにはかなり多くの種類があり、ほぼ全てが異なる書き込みの方法を使います。幸いなことに、[QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) のようなプロジェクトは、あまり深く考える必要無しに様々なタイプと互換性を持つことを目指していますが、この文章では様々なタイプのブートローダとそれらを書き込むために利用可能な方法について説明します。
-`rules.mk` の `BOOTLOADER` 変数で選択されたブートローダがある場合、QMK は .hex ファイルがデバイスに書き込むのに適切なサイズかどうかを自動的に計算し、合計サイズをバイト単位で(最大値とともに)出力します。この処理を手動で実行するには、`check-size` を付けてコンパイルします。例えば、`make planck/rev4:default:check-size`。
+`rules.mk` の `BOOTLOADER` 変数で選択されたブートローダがある場合、QMK は .hex ファイルがデバイスに書き込むのに適切なサイズかどうかを自動的に計算し、合計サイズをバイト単位で(最大値とともに)出力します。
## DFU
@@ -31,7 +31,6 @@ BOOTLOADER = atmel-dfu
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases) (推奨の GUI)
* QMK の [dfu-programmer](https://github.com/dfu-programmer/dfu-programmer) / `:dfu` (推奨のコマンドライン)
-* [Atmel の Flip](http://www.microchip.com/developmenttools/productdetails.aspx?partno=flip) (非推奨)
書き込み手順:
@@ -105,7 +104,7 @@ BOOTLOADER = caterina
make ::avrdude
-#### Caterina コマンド
+### Caterina コマンド
ファームウェアを DFU デバイスに書き込むために使用できる DFU コマンドがいくつかあります。
diff --git a/docs/ja/getting_started_build_tools.md b/docs/ja/getting_started_build_tools.md
deleted file mode 100644
index 1f7accb5502..00000000000
--- a/docs/ja/getting_started_build_tools.md
+++ /dev/null
@@ -1,146 +0,0 @@
-# ビルドツールのインストール
-
-
-
-このページは QMK のためのビルド環境のセットアップを説明します。これらの手順は (atmega32u4 のような) AVR プロセッサを対象としてします。
-
-
-
-**注意:** ここが初めての場合は、[QMK 初心者ガイド](ja/newbs.md)ページを調べてください。
-
-続ける前に、`make git-submodule` を実行して、サブモジュール(サードパーティライブラリ)が最新であることを再確認してください。
-
-## Linux
-
-常に最新の状態を保つためには、単に `sudo util/qmk_install.sh` を実行してください。全ての必要な依存関係が常にインストールされるはずです。**これは `apt-get upgrade` を実行します。**
-
-手動でインストールすることもできますが、このドキュメントは常に全ての要件を満たしているとは限りません。
-
-現在の要件は以下の通りですが、何をしようとしているかによっては全てが必要とは限りません。また、一部のシステムではパッケージとして全ての依存関係が利用できるとは限らず、あるいは名前が異なる場合があるかもしれません。
-
-```
-build-essential
-gcc
-unzip
-wget
-zip
-gcc-avr
-binutils-avr
-avr-libc
-dfu-programmer
-dfu-util
-gcc-arm-none-eabi
-binutils-arm-none-eabi
-libnewlib-arm-none-eabi
-git
-```
-
-好みのパッケージマネージャを使って依存関係をインストールします。
-
-Debian / Ubuntu の例:
-
- sudo apt-get update
- sudo apt-get install gcc unzip wget zip gcc-avr binutils-avr avr-libc dfu-programmer dfu-util gcc-arm-none-eabi binutils-arm-none-eabi libnewlib-arm-none-eabi
-
-Fedora / Red Hat の例:
-
- sudo dnf install gcc unzip wget zip dfu-util dfu-programmer avr-gcc avr-libc binutils-avr32-linux-gnu arm-none-eabi-gcc-cs arm-none-eabi-binutils-cs arm-none-eabi-newlib
-
-Arch / Manjaro の例:
-
- pacman -S base-devel gcc unzip wget zip avr-gcc avr-binutils avr-libc dfu-util arm-none-eabi-gcc arm-none-eabi-binutils arm-none-eabi-newlib git dfu-programmer dfu-util
-
-## Nix
-
-[NixOS](https://nixos.org/) の場合、あるいは Linux または MacOS に Nix をインストールした場合は、ビルド環境を取得するためにリポジトリのルートで `nix-shell` を実行します。
-
-デフォルトでは、これは AVR と ARM の両方のためのコンパイラをダウンロードします。両方が必要ではない場合は、`avr` あるいは `arm` 引数を無効にします。例えば:
-
- nix-shell --arg arm false
-
-## macOS
-[Homebrew](http://brew.sh/) を使っている場合は、以下のコマンドを使うことができます:
-
- brew tap osx-cross/avr
- brew tap osx-cross/arm
- brew update
- brew install avr-gcc@8
- brew link --force avr-gcc@8
- brew install dfu-programmer
- brew install dfu-util
- brew install arm-gcc-bin@8
- brew link --force arm-gcc-bin@8
- brew install avrdude
-
-これはお勧めの方法です。homebrew が無い場合は、[インストールしてください!](http://brew.sh/) コマンドラインで作業する人にとってとても価値があります。`avr-gcc@8` の homebrew でのインストール中、`make` と `make install` 部分は20分以上かかり、CPU使用率が高くなることに注意してください。
-
-## msys2 を使った Windows (推奨) :id=windows-with-msys2-recommended
-
-Windows Vista 以降のバージョン(7および10でテスト済み)について、使用するのに最適な環境は [msys2](http://www.msys2.org) です。
-
-* msys2 をダウンロードし、こちらの指示に従ってインストールしてください: http://www.msys2.org
-* ``MSYS2 MingGW 64-bit`` のショートカットを開きます
-* QMK リポジトリに移動します。例えば、c ドライブのルートにある場合:
-* `$ cd /c/qmk_firmware`
-* `util/qmk_install.sh` を実行し、指示に従います
-
-## Windows 10 (非推奨)
-Windows 10 の古い手順です。[上記の概要のように MSYS2](#windows-with-msys2-recommended) を使うことをお勧めします。
-
-### Creators Update
-Creators Update 以降の Windows 10 の場合、ファームウェアを直接ビルドして書き込むことができます。Creators Update の前は、ビルドだけが可能でした。まだそうではないか、不明な場合は、[これらの指示](https://support.microsoft.com/en-us/instantanswers/d4efb316-79f0-1aa1-9ef3-dcada78f3fa0/get-the-windows-10-creators-update)に従ってください。
-
-### Linux 用の Windows Subsystem
-Creators Update に加えて、Linux 用の Windows 10 Subystem が必要ですので、[これらの指示](http://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/)に従ってインストールしてください。Anniversary update からの Linux 用の Windows 10 Subsystem が既にある場合、一部のキーボードは 14.04LTS に含まれるツールチェーンを使ってコンパイルしないため、16.04LTS に[アップグレード](https://betanews.com/2017/04/14/upgrade-windows-subsystem-for-linux/)することをお勧めします。`sudo do-release-upgrade` メソッドを選択した場合は、自分が何をしているかを知る必要があることに注意してください。
-
-### Git
-すでに Windows ファイルシステムにリポジトリをクローンしている場合は、この章を無視することができます。
-
-WSL Git では**なく**、Windows 用の通常の Git を使って Windows ファイルシステムにリポジトリをクローンする必要があります。以前に Git をインストールしたことが無ければ、[ダウンロード](https://git-scm.com/download/win)し、インストールしてください。次に[セットアップします](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup)。特に貢献する予定がある場合は、eメールとユーザ名をセットアップすることが重要です。
-
-Git がインストールされたら、Git Bash コマンドを開き、QMK をクローンしたい場所へディレクトリを変更します: スラッシュを使う必要があり、c ドライブは `/c/path/to/where/you/want/to/go` のようにアクセスされることに注意してください。次に、`git clone --recurse-submodules https://github.com/qmk/qmk_firmware` を実行します。これは現在のフォルダのサブディレクトリとして新しいフォルダ `qmk_firmware` を作成します。
-
-### ツールチェーンのセットアップ
-ツールチェーンのセットアップは Linux 用の Windows サブシステムを介して行われ、手順は完全に自動化されています。全てを手動で行いたい場合は、スクリプト以外の手順はありませんが、常に issue を開いて詳細情報を求めることができます。
-
-1. スタートメニューから "Bash On Ubuntu On Windows" を開いてください。
-2. クローンした `qmk_firmware` ディレクトリに移動します。パスは WSL 内で `/mnt/` から始まることに注意してください。つまり、例えば `cd /mnt/c/path/to/qmk_firmware` と書く必要があります。
-3. `util/wsl_install.sh` を実行し、画面上の手順に従います。
-4. Bash コマンドウィンドウを閉じ、再び開きます。
-5. ファームウェアをコンパイルし書き込む準備ができました!
-
-### 心に留めておくべき幾つかの重要なこと
-* 全ての最新の更新を取得するために `util/wsl_install.sh` を再実行することができます。
-* WSL は外部で実行可能ファイルを実行できないため、QMK リポジトリは Windows ファイルシステム上にある必要があります。
-* WSL Git は Windows の Git と互換性が**無い**ため、全ての Git 操作には、Windows Git Bash あるいは windows Git GUI を使ってください。
-* WSL 内あるいは普通に Windows を使ってファイルを編集できますが、makefile あるいはシェルスクリプトを編集する場合は、行末をUnix形式にしてファイルを保存するエディタを使うようにしてください。そうでなければコンパイルは機能しないかもしれません。
-
-## Docker
-
-これが少し複雑な場合は、Docker があなたが必要とするすぐに使える解決法かもしれません。[Docker CE](https://docs.docker.com/install/#supported-platforms) をインストールした後で、キーボード/キーマップをビルドするために `qmk_firmware` ディレクトリから以下のコマンドを実行します:
-```bash
-util/docker_build.sh keyboard:keymap
-# 例えば: util/docker_build.sh ergodox_ez:steno
-```
-これは目的のキーボード/キーマップをコンパイルし、結果として書き込み用に `.hex` あるいは `.bin` ファイルを QMK ディレクトリの中に残します。`:keymap` が省略された場合は全てのキーマップが使われます。パラメータの形式は、`make` を使ってビルドする時と同じであることに注意してください。
-
-スクリプトをパラメータ無しで開始することもできます。この場合、1つずつビルドパラメータを入力するように求められます。これが使いやすいと思うかもしれません:
-```bash
-util/docker_build.sh
-# パラメータを入力として読み込みます (空白にすると全てのキーボード/キーマップ)
-```
-
-`target` を指定することで Docker から直接キーボードをビルドし_かつ_書き込むためのサポートもあります。
-```bash
-util/docker_build.sh keyboard:keymap:target
-# 例えば: util/docker_build.sh planck/rev6:default:flash
-```
-Linux を使っている場合は、これはそのままで動作するはずです。Windows と macOS では、実行するのに [Docker Machine](http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos/) が必要です。これはセットアップが面倒なので、お勧めではありません: 代わりに [QMK Toolbox](https://github.com/qmk/qmk_toolbox) を使ってください。
-
-!> Docker for Windows は[Hyper-V](https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v) を有効にする必要があります。これは、Windows 7、Windows 8 および **Windows 10 Home** のような Hyper-V を搭載していない Windows のバージョンでは機能しないことを意味します。
-
-## Vagrant
-ファームウェアをビルドするのに問題がある場合は、Vagrant と呼ばれるツールを試してみることができます。それは、ファームウェアをビルドする準備ができた既知の構成を搭載した仮想コンピュータをセットアップします。OLKB はこの仮想コンピュータのためのファイルをホストしません。Vagrant をセットアップする方法の詳細は、[vagrant ガイド](ja/getting_started_vagrant.md)にあります。
diff --git a/docs/ja/getting_started_getting_help.md b/docs/ja/getting_started_getting_help.md
deleted file mode 100644
index 4b5d492faf3..00000000000
--- a/docs/ja/getting_started_getting_help.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# 助けを得る
-
-
-
-QMK に関して助けを得るための多くのリソースがあります。
-
-## リアルタイム チャット
-
-メインの [Discord server](https://discord.gg/Uq7gcHh) で QMK の開発者とユーザを見つけることができます。サーバには、ファームウェア、Toolbox、ハードウェアおよび Configurator についてチャットするための特定のチャンネルがあります。
-
-## OLKB Subreddit
-
-公式の QMK フォーラムは [reddit.com](https://reddit.com) の [/r/olkb](https://reddit.com/r/olkb) です。
-
-## Github Issues
-
-[GitHub で issue](https://github.com/qmk/qmk_firmware/issues) を開くことができます。issue が長期的な議論あるいはデバッグを必要とする場合は、特に便利です。
diff --git a/docs/ja/getting_started_github.md b/docs/ja/getting_started_github.md
index 261f1d39179..5457c1e06e9 100644
--- a/docs/ja/getting_started_github.md
+++ b/docs/ja/getting_started_github.md
@@ -1,8 +1,8 @@
# QMK で Github を使う方法
Github は慣れていない人には少し注意が必要です - このガイドは、QMK におけるフォーク、クローン、プルリクエストのサブミットの各ステップについて説明します。
diff --git a/docs/ja/getting_started_introduction.md b/docs/ja/getting_started_introduction.md
index b4f8b574da7..a55391e0a1c 100644
--- a/docs/ja/getting_started_introduction.md
+++ b/docs/ja/getting_started_introduction.md
@@ -1,8 +1,8 @@
# はじめに
このページでは、QMK プロジェクトで作業するために知っておくべき基本的な情報について説明しようと思います。Unix シェルの操作に精通していることを前提としていますが、C について、または make を使ったコンパイルについて精通しているとは想定していません。
diff --git a/docs/ja/getting_started_vagrant.md b/docs/ja/getting_started_vagrant.md
index 0bc5c4b798b..66fb8951077 100644
--- a/docs/ja/getting_started_vagrant.md
+++ b/docs/ja/getting_started_vagrant.md
@@ -25,7 +25,6 @@ Vagrant 以外に、適切なプロバイダがインストールされ、その
* [QMK Toolbox](https://github.com/qmk/qmk_toolbox) (推奨)
* [Teensy ローダー](https://www.pjrc.com/teensy/loader.html)
-* [Atmel FLIP](http://www.atmel.com/tools/flip.aspx)
コマンドラインでプログラムしたい場合は、Vagranfile の ['modifyvm'] 行のコメントを解除して Linux への USB パススルーを有効にし、dfu-util/dfu-programmer のようなコマンドラインツールを使ってプログラムすることができます。あるいは Teensy CLI バージョンをインストールすることができます。
diff --git a/docs/ja/hardware_avr.md b/docs/ja/hardware_avr.md
new file mode 100644
index 00000000000..6eb86a37867
--- /dev/null
+++ b/docs/ja/hardware_avr.md
@@ -0,0 +1,189 @@
+# AVR マイコンを使ったキーボード
+
+
+
+このページでは QMK における AVR マイコンのサポートについて説明します。AVR マイコンには、Atmel 社製の atmega32u4、atmega32u2、at90usb1286 やその他のマイコンを含みます。AVR マイコンは、簡単に動かせるよう設計された8ビットの MCU です。キーボードでよく使用される AVR マイコンには USB 機能や大きなキーボードマトリックスのためのたくさんの GPIO を搭載しています。これらは、現在、キーボードで使われる最も一般的な MCU です。
+
+まだ読んでない場合は、[キーボードガイドライン](ja/hardware_keyboard_guidelines.md) を読んで、キーボードを QMK にどのように適合させるかを把握する必要があります。
+
+## AVR を使用したキーボードを QMK に追加する
+
+QMK には AVR を使ったキーボードでの作業を簡略化するための機能が多数あります。大体のキーボードでは1行もコードを書く必要がありません。まずはじめに、`util/new_keyboard.sh` スクリプトを実行します。
+
+```
+$ ./util/new_keyboard.sh
+Generating a new QMK keyboard directory
+
+Keyboard Name: mycoolkb
+Keyboard Type [avr]:
+Your Name [John Smith]:
+
+Copying base template files... done
+Copying avr template files... done
+Renaming keyboard files... done
+Replacing %KEYBOARD% with mycoolkb... done
+Replacing %YOUR_NAME% with John Smith... done
+
+Created a new keyboard called mycoolkb.
+
+To start working on things, cd into keyboards/mycoolkb,
+or open the directory in your favourite text editor.
+```
+
+これにより、新しいキーボードをサポートするために必要なすべてのファイルが作成され、デフォルト値で設定が入力されます。あとはあなたのキーボード用にカスタマイズするだけです。
+
+## `readme.md`
+
+このファイルではキーボードに関する説明を記述します。[キーボード Readme テンプレート](ja/documentation_templates.md#keyboard-readmemd-template)に従って `readme.md` を記入して下さい。`readme.md` の上部に画像を配置することをお勧めします。画像は [Imgur](http://imgur.com) のような外部サービスを利用してください。
+
+## `.c`
+
+このファイルではキーボード上で実行される全てのカスタマイズされたロジックを記述します。多くのキーボードの場合、何も書く必要はありません。
+[機能のカスタマイズ](ja/custom_quantum_functions.md)で、カスタマイズされたロジックの記述方法を詳しく学ぶことが出来ます。
+
+## `.h`
+
+このファイルでは、[レイアウト](ja/feature_layouts.md)を定義します。最低限、以下のような `#define LAYOUT` を記述する必要があります。
+
+```c
+#define LAYOUT( \
+ k00, k01, k02, \
+ k10, k11 \
+) { \
+ { k00, k01, k02 }, \
+ { k10, KC_NO, k11 }, \
+}
+```
+
+`LAYOUT` マクロの前半部ではキーの物理的な配置を定義します。後半部ではスイッチが接続されるマトリックスを定義します。これによってマトリックス配線の順とは異なるキーを物理的に配置できます。
+
+それぞれの `k__` 変数はユニークでなければいけません。通常は `k ` というフォーマットに従って記述されます。
+
+物理マトリックス(後半部)では、`MATRIX_ROWS` に等しい行数が必要であり、各行には正確に `MATRIX_COLS` と等しい数の要素が含まれていなければいけません。物理キーが存在しない場合は、`KC_NO` を使用して空白を埋める事ができます。
+
+## `config.h`
+
+`config.h` ファイルには、ハードウェアや機能の設定を記述します。このファイルで設定できるオプションは列挙しきれないほどたくさんあります。利用できるオプションの概要は[設定オプション](ja/config_options.md)を参照して下さい。
+
+### ハードウェアの設定
+
+`config.h` の先頭には USB に関する設定があります。これらはキーボードが OS からどのように見えるかを制御しています。変更する理由がない場合は、`VENDOR_ID` を `0xFEED` のままにしておく必要があります。`PRODUCT_ID` にはまだ使用されていない番号を選ばなければいけません。
+
+`MANUFACTURER`、 `PRODUCT`、 `DESCRIPTION` をキーボードにあった設定に変更します。
+
+```c
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x6060
+#define DEVICE_VER 0x0001
+#define MANUFACTURER You
+#define PRODUCT my_awesome_keyboard
+#define DESCRIPTION A custom keyboard
+```
+
+?> Windows や macOS では、`MANUFACTURER` と `PRODUCT` が USBデバイスのリストに表示されます。Linux 上の `lsusb` では、代わりにデフォルトで [USB ID Repository](http://www.linux-usb.org/usb-ids.html) によって維持されているリストからこれらを取得します。`lsusb -v` を使用するとデバイスから示された値を表示します。また、接続したときのカーネルログにも表示されます。
+
+### キーボードマトリックスの設定
+
+`config.h` ファイルの次のセクションではキーボードのマトリックスを扱います。最初に設定するのはマトリックスのサイズです。これは通常、常にではありませんが、物理キー配置と同じ数の行・列になります。
+
+```c
+#define MATRIX_ROWS 2
+#define MATRIX_COLS 3
+```
+
+マトリックスのサイズを定義したら、MCU のどのピンを行と列に接続するかを定義します。そのためにはピンの名前を指定するだけです。
+
+```c
+#define MATRIX_ROW_PINS { D0, D5 }
+#define MATRIX_COL_PINS { F1, F0, B0 }
+#define UNUSED_PINS
+```
+
+
+`MATRIX_ROW_PINS` の要素の数は `MATRIX_ROWS` に定義した数と同じでなければいけません。同様に `MATRIX_COL_PINS` の要素の数も `MATRIX_COLS` と等しい必要があります。`UNUSED_PINS` は定義しなくても問題ありませんがどのピンが空いているのか記録しておきたい場合は定義できます。
+
+最後にダイオードの方向を定義します。これには `COL2ROW` か `ROW2COL` を設定します。
+
+```c
+#define DIODE_DIRECTION COL2ROW
+```
+
+#### ダイレクトピンマトリックス
+
+各スイッチが、列と行のピンを共有する代わりに、それぞれ個別のピンとグランドに接続されているキーボードを定義するには、`DIRECT_PINS` を使用します。マッピング定義では、列と行の各スイッチのピンを左から右の順に定義します。`MATRIX_ROWS` と `MATRIX_COLS` 内のサイズに準拠する必要があり、空白を埋めるには `NO_PIN` を使用します。これによって `DIODE_DIRECTION`、`MATRIX_ROW_PINS`、`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
+```
+
+### バックライトの設定
+
+QMK では GPIO ピンでのバックライト制御をサポートしています。これらの設定を選択して MCU から制御できます。詳しくは[バックライト](ja/feature_backlight.md)を参照して下さい。
+
+```c
+#define BACKLIGHT_PIN B7
+#define BACKLIGHT_LEVELS 3
+#define BACKLIGHT_BREATHING
+#define BREATHING_PERIOD 6
+```
+
+### その他の設定オプション
+
+`config.h` で設定・調整できる機能はたくさんあります。詳しくは[設定オプション](ja/config_options.md)を参照して下さい。
+
+## `rules.mk`
+
+`rules.mk` ファイルを使用して、ビルドするファイルや有効にする機能をQMKへ指示します。atmega32u4 を使っている場合、これらのオプションはデフォルトのままにしておくことが出来ます。他の MCU を使用している場合はいくつかのパラメータを調整する必要があります。
+
+### MCU オプション
+
+このオプションではビルドする CPU をビルドシステムに指示します。これらの設定を変更する場合は非常に注意して下さい。キーボードを操作不能にしてしまう可能性があります。
+
+```make
+MCU = atmega32u4
+F_CPU = 16000000
+ARCH = AVR8
+F_USB = $(F_CPU)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+```
+
+### ブートローダー
+
+ブートローダーは MCU に保存されているプログラムをアップグレードするための特別なセクションです。キーボードのレスキューパーティションのようなものだと考えて下さい。
+
+#### Teensy Bootloader の例
+
+```make
+BOOTLOADER = halfkay
+```
+
+#### Atmel DFU Loader の例
+
+```make
+BOOTLOADER = atmel-dfu
+```
+
+#### Pro Micro Bootloader の例
+
+```make
+BOOTLOADER = caterina
+```
+
+### ビルドオプション
+
+`rules.mk` にはオン・オフできるたくさんの機能があります。詳細なリストと説明は[設定オプション](ja/config_options.md#feature-options)を参照して下さい。
diff --git a/docs/ja/hardware_drivers.md b/docs/ja/hardware_drivers.md
new file mode 100644
index 00000000000..cc85589e7b2
--- /dev/null
+++ b/docs/ja/hardware_drivers.md
@@ -0,0 +1,45 @@
+# QMK ハードウェアドライバー
+
+
+
+QMK はたくさんの異なるハードウェアで使われています。最も一般的な MCU とマトリックス構成をサポートしていますが、キーボードへ他のハードウェアを追加し制御するためのドライバーもいくつか用意されています。例えば、マウスやポインティングデバイス、分割キーボード用の IO エキスパンダ、Bluetooth モジュール、LCD、OLED、TFT 液晶などがあります。
+
+
+
+# 使用できるドライバー
+
+## ProMicro (AVR のみ)
+
+ProMicro のピンを AVR の名前ではなく、Arduino の名前で指定できます。この部分はより詳しく文書化される必要があります。もしこれを使用したい場合にコードを読んでも分からない場合、[issue を開く](https://github.com/qmk/qmk_firmware/issues/new)を通して助けることができるかもしれません。
+
+## SSD1306 OLED ドライバー
+
+SSD1306 ベースの OLED ディスプレイのサポート。詳しくは[OLED ドライバ](ja/feature_oled_driver.md)を参照して下さい。
+
+## uGFX
+
+QMK 内で uGFX を使用して、キャラクタ LCD やグラフィック LCD、LED アレイ、OLED ディスプレイ、TFT 液晶や他のディスプレイを制御できます。この部分はより詳しく文書化される必要があります。もしこれを使用したい場合にコードを読んでも分からない場合、[issue を開く](https://github.com/qmk/qmk_firmware/issues/new)を通して助けることができるかもしれません。
+
+## WS2812
+
+WS2811/WS2812{a,b,c} LED のサポート。 詳しくは [RGB ライト](ja/feature_rgblight.md)を参照して下さい。
+
+## IS31FL3731
+
+最大2つの LED ドライバーのサポート。各ドライバーは、I2C を使って個別に LED を制御する2つのチャーリープレクスマトリックスを実装しています。最大144個の単色 LED か32個の RGB LED を使用できます。ドライバーの設定方法の詳細は[RGB マトリックス](ja/feature_rgb_matrix.md)を参照して下さい。
+
+## IS31FL3733
+
+拡張の余地がある最大1つの LED ドライバーのサポート。各ドライバーは192個の単色 LED か64個の RGB LED を制御できます。ドライバーの設定方法の詳細は [RGB マトリックス](ja/feature_rgb_matrix.md)を参照して下さい。
+
+## 24xx シリーズ 外部 I2C EEPROM
+
+オンチップ EEPROM の代わりに使用する I2C ベースの外部 EEPROM のサポート。ドライバーの設定方法の詳細は [EEPROM ドライバー](ja/eeprom_driver.md)を参照して下さい。
diff --git a/docs/ja/hardware_keyboard_guidelines.md b/docs/ja/hardware_keyboard_guidelines.md
new file mode 100644
index 00000000000..5a9de52ef42
--- /dev/null
+++ b/docs/ja/hardware_keyboard_guidelines.md
@@ -0,0 +1,155 @@
+# QMK キーボードガイドライン
+
+
+
+QMK は開始以来、コミュニティにおけるキーボードの作成や保守に貢献しているあなたのような人たちのおかげで飛躍的に成長しました。私たちが成長するにつれて、うまくやるためのいくつかのパターンを発見しました。他の人たちがあなたの苦労の恩恵を受けやすくするため、それにあわせてもらえるようお願いします。
+
+## あなたのキーボード/プロジェクトの名前を決める
+
+キーボードの名前は全て小文字で、アルファベット、数字、アンダースコア(`_`)のみで構成されています。アンダースコア(`_`)で始めてはいけません。スラッシュ(`/`)はサブフォルダの区切り文字として使用されます。
+
+`test`、`keyboard`、`all` はmakeコマンド用に予約されており、キーボードまたはサブフォルダ名として使用することは出来ません。
+
+正しい例:
+
+* `412_64`
+* `chimera_ortho`
+* `clueboard/66/rev3`
+* `planck`
+* `v60_type_r`
+
+## サブフォルダ
+
+QMK では、まとめるためや同じキーボードのリビジョン間でコードを共有するためにサブフォルダを使用します。フォルダは最大4階層までネストできます。
+
+ qmk_firmware/keyboards/top_folder/sub_1/sub_2/sub_3/sub_4
+
+サブフォルダ内に `rules.mk` ファイルが存在するとコンパイル可能なキーボードとして見なされます。QMK Configurator から使用できるようになり、`make all` でテストされます。同じメーカーのキーボードをまとめるためにフォルダを使用している場合は `rules.mk` ファイルを置いてはいけません。
+
+例:
+
+Clueboard は、サブフォルダをまとめるためとキーボードのリビジョン管理の両方のために使用しています。
+
+* [`qmk_firmware`](https://github.com/qmk/qmk_firmware/tree/master)
+ * [`keyboards`](https://github.com/qmk/qmk_firmware/tree/master/keyboards)
+ * [`clueboard`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard) ← これはまとめるためのフォルダです。 `rules.mk` ファイルはありません。
+ * [`60`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/60) ← これはコンパイルできるキーボードです。`rules.mk` が存在します。
+ * [`66`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/66) ← これもコンパイルできるキーボードです。 デフォルトのリビジョンとして `DEFAULT_FOLDER` に `rev3` を指定しています。
+ * [`rev1`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/66/rev1) ← コンパイル可能: `make clueboard/66/rev1`
+ * [`rev2`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/66/rev2) ← コンパイル可能: `make clueboard/66/rev2`
+ * [`rev3`](https://github.com/qmk/qmk_firmware/tree/master/keyboards/clueboard/66/rev3) ← コンパイル可能: `make clueboard/66/rev3` もしくは `make clueboard/66`
+
+## キーボードのフォルダ構成
+
+キーボードは `qmk_firmware/keyboards/` 内にあり、前のセクションで説明したようにフォルダ名はキーボードの名前にする必要があります。このフォルダ内にはいくつかのファイルがあります。
+
+* `readme.md`
+* `info.json`
+* `config.h`
+* `rules.mk`
+* `.c`
+* `.h`
+
+### `readme.md`
+
+全てのプロジェクトにはどのようなキーボードなのか、誰が設計したか、どこで入手できるかを説明する `readme.md` ファイルが必要です。もしあれば、メーカーの Web サイトなどの詳しい情報へのリンクも含める必要があります。[キーボード readme テンプレート](ja/documentation_templates.md#keyboard-readmemd-template)を参考にして下さい。
+
+### `info.json`
+
+このファイルは [QMK API](https://github.com/qmk/qmk_api) から使用されます。[QMK Configurator](https://config.qmk.fm/) が必要とするキーボードの情報が含まれています。ここでメタデータを設定することもできます。詳しくは [info.json 形式](ja/reference_info_json.md) を参照して下さい。
+
+### `config.h`
+
+全てのプロジェクトには、マトリックスサイズ、製品名、USB VID/PID、説明、その他の設定などが含まれた `config.h` ファイルが必要です。一般に、このファイルを使用して常に機能するキーボードの重要な情報やデフォルトを設定します。
+
+### `rules.mk`
+
+このファイルが存在するということは、フォルダがキーボードであり、`make` コマンドで使用できることを意味します。ここでキーボードのビルド環境を構築し、デフォルトの機能を設定します。
+
+### ``
+
+ここではキーボードのカスタマイズされたコードを記述します。通常、初期化してキーボードのハードウェアを制御するコードを記述します。キーボードが LED やスピーカー、その他付属ハードウェアのないキーマトリックスのみで構成されている場合は空にできます。
+
+通常、以下の関数がこのファイルで定義されます。
+
+* `void matrix_init_kb(void)`
+* `void matrix_scan_kb(void)`
+* `bool process_record_kb(uint16_t keycode, keyrecord_t *record)`
+* `void led_set_kb(uint8_t usb_led)`
+
+### ``
+
+このファイルはキーボードのマトリックスを定義するために使用されます。配列をキーボードの物理的なスイッチマトリックスに変換する C マクロを最低限1つ定義する必要があります。複数のレイアウトでキーボードを構築出来る場合は、追加のマクロを定義しなければいけません。
+
+レイアウトが1つしかない場合は、このマクロは `LAYOUT` とします。
+
+複数のレイアウトを定義する場合、物理的に構成することが出来なくとも、マトリックス上で全てのスイッチ位置をサポートする `LAYOUT_all` という名前の基本となるレイアウトが必要です。これは `default` キーマップで使用すべきマクロです。次に、他のレイアウトマクロを使用する `default_` といった追加のキーマップを用意します。これによって、他の人が定義されたレイアウトを使いやすくなります。
+
+レイアウトマクロの名前は全て小文字で、先頭の `LAYOUT` だけ大文字です。
+
+例として、ANSI と ISO をサポートする 60% PCB がある場合、以下のようにレイアウトとキーマップを定義出来ます。
+
+| レイアウト名 | キーマップ名 | 説明 |
+|-------------|-------------|-------------|
+| LAYOUT_all | default | ISO と ANSI のどちらもサポートしたレイアウト |
+| LAYOUT_ansi | default_ansi | ANSI レイアウト |
+| LAYOUT_iso | default_iso | ISO レイアウト |
+
+## 画像/ハードウェアのファイル
+
+リポジトリのサイズを小さく保つために、いくつかの例外を除いて、どの形式のバイナリファイルも受け入れないようになりました。外部の場所(など)でホストして、`readme.md` でリンクすることをおすすめします。
+
+ハードウェアのファイル(プレートやケース、PCB など)は [qmk.fm リポジトリ](https://github.com/qmk/qmk.fm)に提供でき、[qmk.fm](http://qmk.fm) で利用可能になります。ダウンロード出来るファイルは `//`(名前は上記と同じ形式)に保存され、`http://qmk.fm//` で提供されます。ページは `/_pages//` から生成されて、同じ場所で提供されます( .mdファイルはJekyllを通して .htmlファイル変換されます)。`lets_split` ファイルを参照して下さい。
+
+## キーボードのデフォルト設定
+
+QMK が提供する機能の量を考えれば、新しいユーザーが混乱するのは当たり前です。キーボードのデフォルトファームウェアをまとめるなら、有効にする機能とオプションをハードウェアのサポートに必要な最低限のセットにすることをおすすめします。特定の機能に関するおすすめは以下の通りです。
+
+### ブートマジックとコマンド
+
+[ブートマジック](ja/feature_bootmagic.md) と[コマンド](ja/feature_command.md)は、ユーザーがキーボードを明白でない方法で制御出来るようにする2つの関連機能です。いずれかの機能を有効にする場合、この機能をどのように提供するかについて、よく考えることをおすすめします。この機能が必要なユーザーは、あなたのキーボードを最初のプログラムできるキーボードとして使用している初心者に影響を与えることなく、個人的なキーマップ内で有効に出来ることを覚えておきましょう。
+
+新規ユーザーが遭遇する最も多い問題は、キーボードを接続している間に間違えてブートマジックをトリガーしてしまうことです。キーボードの下を持っているとき、知らない間に Alt とスペースバーを押して、これらのキーが交換されてしまったことに気づきます。デフォルトではこの機能を無効にすることをおすすめしますが、有効にする場合は、キーボードを接続している間に押し間違えないキーへ `BOOTMAGIC_KEY_SALT` を設定することを検討して下さい。
+
+キーボードに2つの Shift キーがない場合は、`COMMAND_ENABLE = no` を指定していても `IS_COMMAND` が動作するデフォルトを設定しておくべきです。ユーザーがコマンドを有効化したときに使用するデフォルトが与えられます。
+
+## カスタムキーボードプログラミング
+
+[機能のカスタマイズ](ja/custom_quantum_functions.md)にあるようにキーボードのカスタム関数を定義できます。ユーザーも同様にその動作をカスタマイズしたいかもしれないということと、ユーザーにそれを可能にすることを忘れないで下さい。 `process_record_kb()`のようなカスタム関数を提供している場合、関数がその関数の `_user()` 版を呼び出すことを確認して下さい。また、その関数の`_user()` 版の戻り値を確認して、user が `true` を返した場合のみカスタムコードを実行しなければいけません。
+
+## 生産しない/手配線 プロジェクト
+
+プロトタイプや手配線によるものなど QMK を使用するどんなプロジェクトも受け入れますが、`/keyboards/` フォルダが乱雑になるのを防ぐために、`/keyboards/handwired/` を用意しています。いつかプロトタイプのプロジェクトが製品のプロジェクトになった時点でメインの `/keyboards/` フォルダへ移動します!
+
+## エラーとしての警告
+
+キーボードを開発するときは、全ての警告がエラーとして扱われることに注意して下さい。小さな警告が蓄積されて、将来大きなエラーを引き起こす可能性があります。(そして、警告を放っておくのは良くない習慣です)
+
+## 著作権表示
+
+別のプロジェクトを元にしてキーボードの設定をするものの同じコードを使用しない場合は、ファイル上部にある著作権表示を次の形式に従って自分の名前を表示するよう、更新して下さい。
+
+ Copyright 2017 Your Name
+
+
+他の人のコードを修正し、その変更が些細な部分のみであれば、著作権表示の名前をそのままにしておかないといけません。ファイルに対して重要な作業を行った場合、以下のようにあなたの名前を追加します。
+
+ Copyright 2017 Their Name Your Name
+
+年はファイルが作成された最初の年にします。後年にそのファイルに対して作業が行われた場合、次のように2つ目の年を追加して反映することが出来ます。
+
+ Copyright 2015-2017 Your Name
+
+## ライセンス
+
+QMK のコア部分は [GNU General Public License](https://www.gnu.org/licenses/licenses.en.html) でライセンスされます。AVR マイコン用のバイナリを提供する場合は、[GPLv2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.html) か、[GPLv3](https://www.gnu.org/licenses/gpl.html) のどちらかから選択出来ます。ARM マイコン用のバイナリを提供する場合は、 [ChibiOS](http://www.chibios.org) の GPLv3 ライセンスに準拠するため、[GPL Version 3](https://www.gnu.org/licenses/gpl.html) を選択しなければいけません。
+
+[uGFX](https://ugfx.io) を使用している場合は、[uGFX License](https://ugfx.io/license.html) に準拠する必要があります。uGFX を利用したデバイスを販売するには個別に商用ライセンスを取得しなければいけません。
+
+## 技術的な詳細
+
+キーボードを QMK で動作させるための詳細は[ハードウェア](ja/hardware.md)を参照して下さい!
diff --git a/docs/ja/i2c_driver.md b/docs/ja/i2c_driver.md
index 4030da631aa..56425a2fdb1 100644
--- a/docs/ja/i2c_driver.md
+++ b/docs/ja/i2c_driver.md
@@ -1,38 +1,48 @@
-# I2C マスタドライバ
+# I2C マスタドライバ :id=i2c-master-driver
QMK で使われる I2C マスタドライバには、MCU 間のポータビリティを提供するための一連の関数が用意されています。
-## 使用できる関数
+## I2C アドレスについての重要なメモ :id=note-on-i2c-addresses
+
+このドライバが期待する全てのアドレスは、アドレスバイトの上位7ビットにプッシュする必要があります。最下位ビットの設定(読み込み/書き込みを示す)は、それぞれの関数によって行われます。データシートやインターネットで列挙されているほとんど全ての I2C アドレスは、下位7ビットを占める7ビットとして表され、1ビット左(より上位)にシフトする必要があります。これは、ビット単位のシフト演算子 `<< 1` を使用して簡単に実行できます。
+
+これは、呼び出しごとに以下の関数を実行するか、アドレスの定義で1度だけ実行するかどちらかで行うことができます。例えば、デバイスのアドレスが `0x18` の場合:
+
+`#define MY_I2C_ADDRESS (0x18 << 1)`
+
+I2C アドレスと他の技術詳細について、さらなる情報を得るためには https://www.robot-electronics.co.uk/i2c-tutorial を見てください。
+
+## 使用できる関数 :id=available-functions
| 関数 | 説明 |
|-------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `void i2c_init(void);` | I2C ドライバを初期化します。他のあらゆるトランザクションを開始する前に、この関数を一度だけ呼ぶ必要があります。 |
-| `uint8_t i2c_start(uint8_t address, uint16_t timeout);` | I2C トランザクションを開始します。アドレスは方向ビットのない7ビットスレーブアドレスです。 |
-| `uint8_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` | I2C 経由でデータを送信します。アドレスは方向ビットのない7ビットスレーブアドレスです。トランザクションのステータスを返します。 |
-| `uint8_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` | I2C 経由でデータを受信します。アドレスは方向ビットのない7ビットスレーブアドレスです。 `length` で指定した長さのバイト列を `data` に保存し、トランザクションのステータスを返します。 |
-| `uint8_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` | `i2c_transmit` と同様ですが、 `regaddr` でスレーブのデータ書き込み先のレジスタを指定します。 |
-| `uint8_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` | `i2c_receive` と同様ですが、 `regaddr` でスレーブのデータ読み込み先のレジスタを指定します。 |
-| `uint8_t i2c_stop(void);` | I2C トランザクションを終了します。 |
+| `i2c_status_t i2c_start(uint8_t address, uint16_t timeout);` | I2C トランザクションを開始します。アドレスは方向ビットのない7ビットスレーブアドレスです。 |
+| `i2c_status_t i2c_transmit(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` | I2C 経由でデータを送信します。アドレスは方向ビットのない7ビットスレーブアドレスです。トランザクションのステータスを返します。 |
+| `i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout);` | I2C 経由でデータを受信します。アドレスは方向ビットのない7ビットスレーブアドレスです。 `length` で指定した長さのバイト列を `data` に保存し、トランザクションのステータスを返します。 |
+| `i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` | `i2c_transmit` と同様ですが、 `regaddr` でスレーブのデータ書き込み先のレジスタを指定します。 |
+| `i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout);` | `i2c_receive` と同様ですが、 `regaddr` でスレーブのデータ読み込み先のレジスタを指定します。 |
+| `i2c_status_t i2c_stop(void);` | I2C トランザクションを終了します。 |
-### 関数の戻り値
+### 関数の戻り値 :id=function-return
`void i2c_init(void)` を除く上にあるすべての関数は、次の真理値表にある値を返します。
-| 戻り値 | 説明 |
-|--------|------------------------------|
-| 0 | 処理が正常に実行されました。 |
-| -1 | 処理に失敗しました。 |
-| -2 | 処理がタイムアウトしました。 |
+|戻り値の定数 |値 |説明 |
+|--------------------|---|----------------------------|
+|`I2C_STATUS_SUCCESS`|0 |処理が正常に実行されました。|
+|`I2C_STATUS_ERROR` |-1 |処理に失敗しました。 |
+|`I2C_STATUS_TIMEOUT`|-2 |処理がタイムアウトしました。|
-## AVR
+## AVR :id=avr
-### 設定
+### 設定 :id=avr-configuration
I2Cマスタドライバを設定するために、次の定義が使えます。
@@ -43,11 +53,11 @@ I2Cマスタドライバを設定するために、次の定義が使えます
AVR は通常 I2C ピンとして使う GPIO が設定されているので、これ以上の設定は必要ありません。
-## ARM
+## ARM :id=arm
ARM の場合は、内部に ChibiOS I2C HAL ドライバがあります。この節では STM32 MCU を使用していると仮定します。
-### 設定
+### 設定 :id=arm-configuration
ARM MCU 用の設定はしばしば非常に複雑です。これは、多くの場合複数の I2C ドライバをさまざまなポートに対して割り当てられるためです。
@@ -82,7 +92,7 @@ ChibiOS I2C ドライバの設定項目は STM32 MCU の種類に依存します
STM32F1xx, STM32F2xx, STM32F4xx, STM32L0xx, STM32L1xx では I2Cv1 が使われます。
STM32F0xx, STM32F3xx, STM32F7xx, STM32L4xx では I2Cv2 が使われます。
-#### I2Cv1
+#### I2Cv1 :id=i2cv1
STM32 MCU の I2Cv1 では、クロック周波数とデューティ比を次の変数で変更できます。詳しくは を参照してください。
@@ -92,7 +102,7 @@ STM32 MCU の I2Cv1 では、クロック周波数とデューティ比を次の
| `I2C1_CLOCK_SPEED` | `100000` |
| `I2C1_DUTY_CYCLE` | `STD_DUTY_CYCLE` |
-#### I2Cv2
+#### I2Cv2 :id=i2cv2
STM32 MCU の I2Cv2 では、信号のタイミングパラメータを次の変数で変更できます。詳しくは を参照してください。
@@ -111,11 +121,11 @@ STM32 MCU では GPIO ピンを設定するとき、別の「代替機能」モ
| `I2C1_SCL_PAL_MODE` | `4` |
| `I2C1_SDA_PAL_MODE` | `4` |
-#### その他
+#### その他 :id=other
`void i2c_init(void)` 関数は `weak` 属性が付いており、オーバーロードすることができます。この場合、上記で設定した変数は使用されません。可能な GPIO の設定については、 MCU のデータシートを参照してください。次に示すのは初期化関数の例です:
-```C
+```c
void i2c_init(void)
{
setPinInput(B6); // Try releasing special pins for a short time
diff --git a/docs/ja/keymap.md b/docs/ja/keymap.md
index 29eb1adc086..48b2a5cd572 100644
--- a/docs/ja/keymap.md
+++ b/docs/ja/keymap.md
@@ -1,14 +1,14 @@
# キーマップの概要
QMK のキーマップは C のソースファイルの中で定義されます。そのデータ構造は配列の配列です。外側はレイヤーを要素とする配列で、レイヤーはキーを要素とする配列。ほとんどのキーボードは `LAYOUT()` マクロを定義して、この配列の配列を作成しやすくしています。
-## キーマップとレイヤー
+## キーマップとレイヤー :id=keymap-and-layers
QMKでは、**`const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS]`**は、**アクションコード**を保持している **16 bit** データの中でキーマップ情報の複数の**レイヤー**を保持します。最大で**32個のレイヤー**を定義することができます。
普通のキー定義の場合、**アクションコード**の上位8ビットは全て0で、下位8ビットは**キーコード**としてキーによって生成された USB HID usage コードを保持します。
@@ -32,7 +32,8 @@ QMKでは、**`const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS]`**は
TMK の歴史的経緯から、キーマップに保存されたアクションコードは、一部のドキュメントではキーコードと呼ばれる場合があります。
-### キーマップレイヤーステータス
+### キーマップレイヤーステータス :id=keymap-layer-status
+
キーマップレイヤーの状態は、2つの32ビットパラメータによって決定されます。
* **`default_layer_state`** は、常に有効で参照される基本キーマップレイヤー (0-31) を示します (デフォルトレイヤー)。
diff --git a/docs/keycodes.md b/docs/keycodes.md
index f8c8a75ed8b..40a46964a81 100644
--- a/docs/keycodes.md
+++ b/docs/keycodes.md
@@ -175,11 +175,11 @@ See also: [Basic Keycodes](keycodes_basic.md)
|`KC_EXSEL` | |ExSel |
|`KC_LCTRL` |`KC_LCTL` |Left Control |
|`KC_LSHIFT` |`KC_LSFT` |Left Shift |
-|`KC_LALT` | |Left Alt |
+|`KC_LALT` |`KC_LOPT` |Left Alt (Option) |
|`KC_LGUI` |`KC_LCMD`, `KC_LWIN` |Left GUI (Windows/Command/Meta key) |
|`KC_RCTRL` |`KC_RCTL` |Right Control |
|`KC_RSHIFT` |`KC_RSFT` |Right Shift |
-|`KC_RALT` |`KC_ALGR` |Right Alt (AltGr) |
+|`KC_RALT` |`KC_ROPT`, `KC_ALGR` |Right Alt (Option/AltGr) |
|`KC_RGUI` |`KC_RCMD`, `KC_RWIN` |Right GUI (Windows/Command/Meta key) |
|`KC_SYSTEM_POWER` |`KC_PWR` |System Power Down |
|`KC_SYSTEM_SLEEP` |`KC_SLEP` |System Sleep |
@@ -326,7 +326,7 @@ See also: [Key Lock](feature_key_lock.md)
## Layer Switching :id=layer-switching
-See also: [Layer Switching](feature_advanced_keycodes.md#switching-and-toggling-layers)
+See also: [Layer Switching](feature_layers.md#switching-and-toggling-layers)
|Key |Description |
|----------------|----------------------------------------------------------------------------------|
@@ -378,11 +378,11 @@ See also: [Modifier Keys](feature_advanced_keycodes.md#modifier-keys)
|----------|-------------------------------|----------------------------------------------------|
|`LCTL(kc)`|`C(kc)` |Hold Left Control and press `kc` |
|`LSFT(kc)`|`S(kc)` |Hold Left Shift and press `kc` |
-|`LALT(kc)`|`A(kc)` |Hold Left Alt and press `kc` |
+|`LALT(kc)`|`A(kc)`, `LOPT(kc)` |Hold Left Alt and press `kc` |
|`LGUI(kc)`|`G(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)`|`ALGR(kc)` |Hold Right Alt and press `kc` |
+|`RALT(kc)`|`ROPT(kc)`, `ALGR(kc)` |Hold Right Alt and press `kc` |
|`RGUI(kc)`|`RCMD(kc)`, `LWIN(kc)` |Hold Right GUI 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` |
@@ -401,11 +401,11 @@ See also: [Mod-Tap](mod_tap.md)
|`MT(mod, kc)`| |`mod` when held, `kc` when tapped |
|`LCTL_T(kc)` |`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|`LSFT_T(kc)` |`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
-|`LALT_T(kc)` |`ALT_T(kc)` |Left Alt when held, `kc` when tapped |
+|`LALT_T(kc)` |`LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` |Left Alt when held, `kc` when tapped |
|`LGUI_T(kc)` |`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
|`RCTL_T(kc)` | |Right Control when held, `kc` when tapped |
|`RSFT_T(kc)` | |Right Shift when held, `kc` when tapped |
-|`RALT_T(kc)` |`ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
+|`RALT_T(kc)` |`ROPT_T(kc)`, `ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
|`RGUI_T(kc)` |`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|`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 |
@@ -531,6 +531,7 @@ See also: [Swap Hands](feature_swap_hands.md)
|`SH_MOFF` |Momentarily turns off swap. |
|`SH_TG` |Toggles swap on and off with every key press. |
|`SH_TT` |Toggles with a tap; momentary when held. |
+|`SH_OS` |One shot swap hands: toggle while pressed or until next key press. |
## Unicode Support :id=unicode-support
@@ -543,7 +544,7 @@ See also: [Unicode Support](feature_unicode.md)
|`XP(i, j)` | |Send Unicode code point at index `i`, or `j` if Shift/Caps is on|
|`UNICODE_MODE_FORWARD`|`UC_MOD` |Cycle through selected input modes |
|`UNICODE_MODE_REVERSE`|`UC_RMOD`|Cycle through selected input modes in reverse |
-|`UNICODE_MODE_OSX` |`UC_M_OS`|Switch to macOS input |
+|`UNICODE_MODE_MAC` |`UC_M_MA`|Switch to macOS input |
|`UNICODE_MODE_LNX` |`UC_M_LN`|Switch to Linux input |
|`UNICODE_MODE_WIN` |`UC_M_WI`|Switch to Windows input |
|`UNICODE_MODE_BSD` |`UC_M_BS`|Switch to BSD input (not implemented) |
diff --git a/docs/keycodes_basic.md b/docs/keycodes_basic.md
index 75d58c1f1b5..09efc8c9c3d 100644
--- a/docs/keycodes_basic.md
+++ b/docs/keycodes_basic.md
@@ -112,11 +112,11 @@ The basic set of keycodes are based on the [HID Keyboard/Keypad Usage Page (0x07
|-----------|--------------------|------------------------------------|
|`KC_LCTRL` |`KC_LCTL` |Left Control |
|`KC_LSHIFT`|`KC_LSFT` |Left Shift |
-|`KC_LALT` | |Left Alt |
+|`KC_LALT` |`KC_LOPT` |Left Alt (Option) |
|`KC_LGUI` |`KC_LCMD`, `KC_LWIN`|Left GUI (Windows/Command/Meta key) |
|`KC_RCTRL` |`KC_RCTL` |Right Control |
|`KC_RSHIFT`|`KC_RSFT` |Right Shift |
-|`KC_RALT` |`KC_ALGR` |Right Alt (AltGr) |
+|`KC_RALT` |`KC_ROPT`, `KC_ALGR`|Right Alt (Option/AltGr) |
|`KC_RGUI` |`KC_RCMD`, `KC_RWIN`|Right GUI (Windows/Command/Meta key)|
## International
diff --git a/docs/mod_tap.md b/docs/mod_tap.md
index 2b86701ca45..ced0beba99d 100644
--- a/docs/mod_tap.md
+++ b/docs/mod_tap.md
@@ -31,11 +31,11 @@ For convenience, QMK includes some Mod-Tap shortcuts to make common combinations
|------------|-----------------------------------------------------------------|-------------------------------------------------------|
|`LCTL_T(kc)`|`CTL_T(kc)` |Left Control when held, `kc` when tapped |
|`LSFT_T(kc)`|`SFT_T(kc)` |Left Shift when held, `kc` when tapped |
-|`LALT_T(kc)`|`ALT_T(kc)` |Left Alt when held, `kc` when tapped |
+|`LALT_T(kc)`|`LOPT_T(kc)`, `ALT_T(kc)`, `OPT_T(kc)` |Left Alt when held, `kc` when tapped |
|`LGUI_T(kc)`|`LCMD_T(kc)`, `LWIN_T(kc)`, `GUI_T(kc)`, `CMD_T(kc)`, `WIN_T(kc)`|Left GUI when held, `kc` when tapped |
|`RCTL_T(kc)`| |Right Control when held, `kc` when tapped |
|`RSFT_T(kc)`| |Right Shift when held, `kc` when tapped |
-|`RALT_T(kc)`|`ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
+|`RALT_T(kc)`|`ROPT_T(kc)`, `ALGR_T(kc)` |Right Alt when held, `kc` when tapped |
|`RGUI_T(kc)`|`RCMD_T(kc)`, `RWIN_T(kc)` |Right GUI when held, `kc` when tapped |
|`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 |
diff --git a/docs/newbs_getting_started.md b/docs/newbs_getting_started.md
index cb8267de69b..a3022f15e5b 100644
--- a/docs/newbs_getting_started.md
+++ b/docs/newbs_getting_started.md
@@ -42,11 +42,15 @@ We've tried to make QMK as easy to set up as possible. You only have to prepare
You will need to install MSYS2, Git, and the QMK CLI.
* Follow the installation instructions on the [MSYS2 homepage](http://www.msys2.org).
-* Close any open MSYS2 terminals and open a new MSYS2 MinGW 64-bit terminal.
+* Close any open MSYS2 terminals and open a new MSYS2 MinGW 64-bit terminal. NOTE: This is **not** the same as the MSYS terminal that opens when installation is completed.
-After opening a new MSYS2 MinGW 64-bit terminal run these commands:
+After opening a new MSYS2 MinGW 64-bit terminal, make sure `pacman` is up to date with:
- pacman -S git python3-pip
+ pacman -Syu
+
+You may be asked to close and reopen the window. Do this and keep running the above command until it says `there is nothing to do`. Then run the following:
+
+ pacman -S git mingw-w64-x86_64-toolchain mingw-w64-x86_64-python3-pip
python3 -m pip install qmk
### macOS
@@ -62,9 +66,14 @@ After Homebrew is installed run these commands:
You will need to install Git and Python. It's very likely that you already have both, but if not, one of the following commands should install them:
-* Debian / Ubuntu / Devuan: `apt-get install git python3 && python3 -m pip install qmk`
-* Fedora / Red Hat / CentOS: `yum install git python3 && python3 -m pip install qmk`
-* Arch: `pacman -S qmk`
+* Debian / Ubuntu / Devuan: `sudo apt install git python3 python3-pip`
+* Fedora / Red Hat / CentOS: `sudo yum install git python3 python3-pip`
+* Arch / Manjaro: `sudo pacman -S git python python-pip python-setuptools libffi`
+
+
+Install the global CLI to bootstrap your system:
+
+ `python3 -m pip install --user qmk` (on Arch-based distros you can also try the `qmk` package from AUR (**note**: it's maintained by a community member): `yay -S qmk`)
## 3. Run QMK Setup :id=set-up-qmk
@@ -74,7 +83,13 @@ After installing QMK you can set it up with this command:
In most situations you will want to answer Yes to all of the prompts.
-?> If you already know [how to use GitHub](getting_started_github.md), we recommend that you create your own fork and use `qmk setup ` to clone your personal fork. If you don't know what that means you can safely ignore this message.
+?>**Note on Debian, Ubuntu and their derivatives**:
+It's possible, that you will get an error saying something like: `bash: qmk: command not found`.
+This is due to a [bug](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=839155) Debian introduced with their Bash 4.4 release, which removed `$HOME/.local/bin` from the PATH. This bug was later fixed on Debian and Ubuntu.
+Sadly, Ubuntu reitroduced this bug and is [yet to fix it](https://bugs.launchpad.net/ubuntu/+source/bash/+bug/1588562).
+Luckily, the fix is easy. Run this as your user: `echo "PATH=$HOME/.local/bin:$PATH" >> $HOME/.bashrc && source $HOME/.bashrc`
+
+?> If you already know [how to use GitHub](getting_started_github.md), we recommend that you create your own fork and use `qmk setup /qmk_firmware` to clone your personal fork. If you don't know what that means you can safely ignore this message.
## 4. Test Your Build Environment
diff --git a/docs/platformdev_chibios_earlyinit.md b/docs/platformdev_chibios_earlyinit.md
new file mode 100644
index 00000000000..699c223771b
--- /dev/null
+++ b/docs/platformdev_chibios_earlyinit.md
@@ -0,0 +1,53 @@
+# Arm/ChibiOS Early Initialization :id=chibios-early-init
+
+This page describes a part of QMK that is a somewhat advanced concept, and is only relevant to keyboard designers.
+
+QMK uses ChibiOS as the underlying layer to support a multitude of Arm-based devices. Each ChibiOS-supported keyboard has a low-level board definition which is responsible for initializing hardware peripherals such as the clocks, and GPIOs.
+
+Older QMK revisions required duplication of these board definitions inside your keyboard's directory in order to override such early initialization points; this is now abstracted into the following APIs, and allows usage of the board definitions supplied with ChibiOS itself. Check `/lib/chibios/os/hal/boards` for the list of official definitions. If your keyboard needs extra initialization at a very early stage, consider providing keyboard-level overrides of the following APIs:
+
+## `early_hardware_init_pre()` :id=early-hardware-init-pre
+
+The function `early_hardware_init_pre` is the earliest possible code that can be executed by a keyboard firmware. This is intended as a replacement for the ChibiOS board definition's `__early_init` function, and is the equivalent of executing at the start of the function.
+
+This is executed before RAM gets cleared, and before clocks or GPIOs are configured; any delays or preparation using GPIOs is not likely to work at this point. After executing this function, RAM on the MCU may be zero'ed. Assigning values to variables during execution of this function may be overwritten.
+
+As such, if you wish to override this API consider limiting use to writing to low-level registers. The default implementation of this function can be configured to jump to bootloader if a `RESET` key was pressed, by ensuring `#define EARLY_INIT_PERFORM_BOOTLOADER_JUMP TRUE` is in the keyboard's `config.h` file.
+
+To implement your own version of this function, in your keyboard's source files:
+
+```c
+void early_hardware_init_pre(void) {
+ // do things with registers
+}
+```
+
+## `early_hardware_init_post()` :id=early-hardware-init-post
+
+The function `early_hardware_init_post` is the next earliest possible code that can be executed by a keyboard firmware. This is executed after RAM has been cleared, and clocks and GPIOs are configured. This is intended as a replacement for the ChibiOS board definition's `__early_init` function, and is the equivalent of executing at the end of the function.
+
+Much like `early_hardware_init_pre`, ChibiOS has not yet been initialized either, so the same restrictions on delays and timing apply.
+
+If you wish to override this API, consider limiting functionality to register writes, variable initialization, and GPIO toggling. The default implementation of this function is to do nothing.
+
+To implement your own version of this function, in your keyboard's source files:
+
+```c
+void early_hardware_init_post(void) {
+ // toggle GPIO pins and write to variables
+}
+```
+
+## `board_init()` :id=board-init
+
+The function `board_init` is executed directly after the ChibiOS initialization routines have completed. At this stage, all normal low-level functionality should be available for use (including timers and delays), with the restriction that USB is not yet connected. This is intended as a replacement for the ChibiOS board definition's `boardInit` function.
+
+The default implementation of this function is to do nothing.
+
+To implement your own version of this function, in your keyboard's source files:
+
+```c
+void board_init(void) {
+ // initialize anything that requires ChibiOS
+}
+```
\ No newline at end of file
diff --git a/docs/proton_c_conversion.md b/docs/proton_c_conversion.md
index dc0a3f48491..98f1508a9e5 100644
--- a/docs/proton_c_conversion.md
+++ b/docs/proton_c_conversion.md
@@ -1,5 +1,9 @@
# Converting a board to use the Proton C
+Since the Proton C is a drop-in replacement for a Pro Micro we've made it easy to use. This page documents a handy automated process for converting keyboards, as well as documenting the manual process if you'd like to make use of Proton C features that aren't available on Pro Micros.
+
+## Automatic Conversion
+
If a board currently supported in QMK uses a Pro Micro (or compatible board) and you want to use the Proton C, you can generate the firmware by appending `CONVERT_TO_PROTON_C=yes` (or `CTPC=yes`) to your make argument, like this:
make 40percentclub/mf68:default CTPC=yes
@@ -8,13 +12,15 @@ You can add the same argument to your keymap's `rules.mk`, which will accomplish
This exposes the `CONVERT_TO_PROTON_C` flag that you can use in your code with `#ifdef`s, like this:
- #ifdef CONVERT_TO_PROTON_C
- // Proton C code
- #else
- // Pro Micro code
- #endif
+```c
+#ifdef CONVERT_TO_PROTON_C
+ // Proton C code
+#else
+ // Pro Micro code
+#endif
+```
-Before being able to compile, you may get some errors about `PORTB/DDRB`, etc not being defined, so you'll need to convert the keyboard's code to use the [GPIO Controls](internals_gpio_control.md) that will work for both ARM and AVR. This shouldn't affect the AVR builds at all.
+If you get errors about `PORTB/DDRB`, etc not being defined, so you'll need to convert the keyboard's code to use the [GPIO Controls](internals_gpio_control.md) that will work for both ARM and AVR. This shouldn't affect the AVR builds at all.
The Proton C only has one on-board LED (C13), and by default, the TXLED (D5) is mapped to it. If you want the RXLED (B0) mapped to it instead, add this like to your `config.h`:
@@ -31,3 +37,54 @@ These are defaults based on what has been implemented for ARM boards.
| [Backlight](feature_backlight.md) | Forces [task driven PWM](feature_backlight.md#software-pwm-driver) until ARM can provide automatic configuration |
| USB Host (e.g. USB-USB converter) | Not supported (USB host code is AVR specific and is not currently supported on ARM) |
| [Split keyboards](feature_split_keyboard.md) | Not supported yet |
+
+## Manual Conversion
+
+To use the Proton C natively, without having to specify `CTPC=yes`, you need to change the `MCU` line in `rules.mk`:
+
+```
+MCU = STM32F303
+```
+
+Remove these variables if they exist:
+
+* `BOOTLOADER`
+* `EXTRA_FLAGS`
+
+Finally convert all pin assignments in `config.h` to the stm32 equivalents.
+
+| Pro Micro Left | Proton C Left | | Proton C Right | Pro Micro Right |
+|-----------|----------|-|----------|-----------|
+| `D3` | `A9` | | 5v | RAW (5v) |
+| `D2` | `A10` | | GND | GND |
+| GND | GND | | FLASH | RESET |
+| GND | GND | | 3.3v | VCC 1 |
+| `D1` | `B7` | | `A2` | `F4` |
+| `D0` | `B6` | | `A1` | `F5` |
+| `D4` | `B5` | | `A0` | `F6` |
+| `C6` | `B4` | | `B8` | `F7` |
+| `D7` | `B3` | | `B13` | `B1` |
+| `E6` | `B2` | | `B14` | `B3` |
+| `B4` | `B1` | | `B15` | `B2` |
+| `B5` | `B0` | | `B9` | `B6` |
+| `B0` (RX LED) | `C13` 2 | | `C13` 2 | `D5` (TX LED) |
+
+You can also make use of several new pins on the extended portion of the Proton C:
+
+| Left | | Right |
+|------|-|-------|
+| `A4`3 | | `B10` |
+| `A5`4 | | `B11` |
+| `A6` | | `B12` |
+| `A7` | | `A14`5 (SWCLK) |
+| `A8` | | `A13`5 (SWDIO) |
+| `A15` | | RESET6 |
+
+Notes:
+
+1. On a Pro Micro VCC can be 3.3v or 5v.
+2. A Proton C only has one onboard LED, not two like a Pro Micro. The Pro Micro has an RX LED on `D5` and a TX LED on `B0`.
+3. `A4` is shared with the speaker.
+4. `A5` is shared with the speaker.
+5. `A13` and `A14` are used for hardware debugging (SWD). You can also use them for GPIO, but should use them last.
+6. Short RESET to 3.3v (pull high) to reboot the MCU. This does not enter bootloader mode like a Pro Micro, it only resets the MCU.
diff --git a/docs/pt-br/_summary.md b/docs/pt-br/_summary.md
index 9c29c5a3a7b..78b3b202163 100644
--- a/docs/pt-br/_summary.md
+++ b/docs/pt-br/_summary.md
@@ -98,6 +98,7 @@
* [ISP Flashing Guide](pt-br/isp_flashing_guide.md)
* [ARM Debugging Guide](pt-br/arm_debugging.md)
* [I2C Driver](pt-br/i2c_driver.md)
+ * [SPI Driver](pt-br/spi_driver.md)
* [GPIO Controls](pt-br/internals_gpio_control.md)
* [Proton C Conversion](pt-br/proton_c_conversion.md)
diff --git a/docs/ref_functions.md b/docs/ref_functions.md
index 708b0be28f4..57f701d790d 100644
--- a/docs/ref_functions.md
+++ b/docs/ref_functions.md
@@ -8,7 +8,7 @@ There are actually separate functions that you can use there, depending on what
### `update_tri_layer(x, y, z)`
-The first is the `update_tri_layer(x, y, z)` function. This function check to see if layers `x` and `y` are both on. If they are both on, then it runs on layer `z`. Otherwise, if both `x` and `y` are not both on (either only one is, or neither is), then it runs off layer `z`.
+The first is the `update_tri_layer(x, y, z)` function. This function check to see if layers `x` and `y` are both on. If they are both on, then it turns on layer `z`. Otherwise, if both `x` and `y` are not both on (either only one is, or neither is), then it turns off layer `z`.
This function is useful if you want to create specific keys that have this functionality, but other layer keycodes won't do this.
@@ -43,7 +43,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
```
### `update_tri_layer_state(state, x, y, z)`
-The other function is `update_tri_layer_state(state, x, y, z)`. This function is meant to be called from they [`layer_state_set_*` functions](custom_quantum_functions.md#layer-change-code). This means that any time that you use a keycode to change the layer, this will be checked. So you could use `LT(layer, kc)` to change the layer and it will trigger the same layer check.
+The other function is `update_tri_layer_state(state, x, y, z)`. This function is meant to be called from the [`layer_state_set_*` functions](custom_quantum_functions.md#layer-change-code). This means that any time that you use a keycode to change the layer, this will be checked. So you could use `LT(layer, kc)` to change the layer and it will trigger the same layer check.
The caveat to this method is that you cannot access the `z` layer without having `x` and `y` layers on, since if you try to activate just layer `z`, it will run this code and turn off layer `z` before you could use it.
diff --git a/docs/reference_glossary.md b/docs/reference_glossary.md
index 08a22050cf8..4cdba024e46 100644
--- a/docs/reference_glossary.md
+++ b/docs/reference_glossary.md
@@ -46,9 +46,6 @@ An IDE that is popular with many C developers.
## Firmware
The software that controls your MCU.
-## FLIP
-Software provided by Atmel for flashing AVR devices. We generally recommend [QMK Flasher](https://github.com/qmk/qmk_flasher) instead, but for some advanced use cases FLIP is required.
-
## git
Versioning software used at the command line
diff --git a/docs/ru-ru/_summary.md b/docs/ru-ru/_summary.md
index caa7cdd569a..f893be3cfd1 100644
--- a/docs/ru-ru/_summary.md
+++ b/docs/ru-ru/_summary.md
@@ -99,6 +99,7 @@
* [ISP Flashing Guide](ru-ru/isp_flashing_guide.md)
* [ARM Debugging Guide](ru-ru/arm_debugging.md)
* [I2C Driver](ru-ru/i2c_driver.md)
+ * [SPI Driver](ru-ru/spi_driver.md)
* [WS2812 Driver](ru-ru/ws2812_driver.md)
* [GPIO Controls](ru-ru/internals_gpio_control.md)
* [Proton C Conversion](ru-ru/proton_c_conversion.md)
diff --git a/docs/spi_driver.md b/docs/spi_driver.md
new file mode 100644
index 00000000000..c170bf1dfc7
--- /dev/null
+++ b/docs/spi_driver.md
@@ -0,0 +1,138 @@
+# SPI Master Driver
+
+The SPI Master drivers used in QMK have a set of common functions to allow portability between MCUs.
+
+## AVR Configuration
+
+No special setup is required - just connect the `SS`, `SCK`, `MOSI` and `MISO` pins of your SPI devices to the matching pins on the MCU:
+
+|MCU |`SS`|`SCK`|`MOSI`|`MISO`|
+|---------------|----|-----|------|------|
+|ATMega16/32U2/4|`B0`|`B1` |`B2` |`B3` |
+|AT90USB64/128 |`B0`|`B1` |`B2` |`B3` |
+|ATmega32A |`B4`|`B7` |`B5` |`B6` |
+|ATmega328P |`B2`|`B5` |`B3` |`B4` |
+
+You may use more than one slave select pin, not just the `SS` pin. This is useful when you have multiple devices connected and need to communicate with them individually.
+`SPI_SS_PIN` can be passed to `spi_start()` to refer to `SS`.
+
+## ChibiOS/ARM Configuration
+
+You'll need to determine which pins can be used for SPI -- as an example, STM32 parts generally have multiple SPI peripherals, labeled SPI1, SPI2, SPI3 etc.
+
+To enable SPI, modify your board's `halconf.h` to enable SPI - both `HAL_USE_SPI` and `SPI_USE_WAIT` should be `TRUE`, and `SPI_SELECT_MODE` should be `SPI_SELECT_MODE_PAD`.
+Then, modify your board's `mcuconf.h` to enable the SPI peripheral you've chosen -- in the case of using SPI2, modify `STM32_SPI_USE_SPI2` to be `TRUE`.
+
+As per the AVR configuration, you may select any other standard GPIO as a slave select pin, and can be supplied to `spi_start()`.
+
+Configuration-wise, you'll need to set up the peripheral as per your MCU's datasheet -- the defaults match the pins for a Proton-C, i.e. STM32F303.
+
+`config.h` override | Description | Default Value
+----------------------------|---------------------------------------------------------------|--------------
+`#define SPI_DRIVER` | SPI peripheral to use - SPI1 => `SPID1`, SPI2 => `SPID2` etc. | `SPID2`
+`#define SPI_SCK_PIN` | The pin to use for the SCK | `B13`
+`#define SPI_SCK_PAL_MODE` | The alternate function mode for the SCK pin | `5`
+`#define SPI_MOSI_PIN` | The pin to use for the MOSI | `B15`
+`#define SPI_MOSI_PAL_MODE` | The alternate function mode for the MOSI pin | `5`
+`#define SPI_MISO_PIN` | The pin to use for the MISO | `B14`
+`#define SPI_MISO_PAL_MODE` | The alternate function mode for the MISO pin | `5`
+
+## Functions
+
+### `void spi_init(void)`
+
+Initialize the SPI driver. This function must be called only once, before any of the below functions can be called.
+
+---
+
+### `bool spi_start(pin_t slavePin, bool lsbFirst, uint8_t mode, uint16_t divisor)`
+
+Start an SPI transaction.
+
+#### Arguments
+
+ - `pin_t slavePin`
+ The QMK pin to assert as the slave select pin, eg. `B4`.
+ - `bool lsbFirst`
+ Determines the endianness of the transmission. If `true`, the least significant bit of each byte is sent first.
+ - `uint8_t mode`
+ The SPI mode to use:
+
+ |Mode|Clock Polarity |Clock Phase |
+ |----|--------------------|-----------------------|
+ |`0` |Leading edge rising |Sample on leading edge |
+ |`1` |Leading edge rising |Sample on trailing edge|
+ |`2` |Leading edge falling|Sample on leading edge |
+ |`3` |Leading edge falling|Sample on trailing edge|
+
+ - `uint16_t divisor`
+ The SPI clock divisor, will be rounded up to the nearest power of two. This number can be calculated by dividing the MCU's clock speed by the desired SPI clock speed. For example, an MCU running at 8 MHz wanting to talk to an SPI device at 4 MHz would set the divisor to `2`.
+
+#### Return Value
+
+`false` if the supplied parameters are invalid or the SPI peripheral is already in use, or `true`.
+
+---
+
+### `spi_status_t spi_write(uint8_t data)`
+
+Write a byte to the selected SPI device.
+
+#### Arguments
+
+ - `uint8_t data`
+ The byte to write.
+
+#### Return Value
+
+`SPI_STATUS_TIMEOUT` if the timeout period elapses, or `SPI_STATUS_SUCCESS`.
+
+---
+
+### `spi_status_t spi_read(void)`
+
+Read a byte from the selected SPI device.
+
+#### Return Value
+
+`SPI_STATUS_TIMEOUT` if the timeout period elapses, or the byte read from the device.
+
+---
+
+### `spi_status_t spi_transmit(const uint8_t *data, uint16_t length)`
+
+Send multiple bytes to the selected SPI device.
+
+#### Arguments
+
+ - `const uint8_t *data`
+ A pointer to the data to write from.
+ - `uint16_t length`
+ The number of bytes to write. Take care not to overrun the length of `data`.
+
+#### Return Value
+
+`SPI_STATUS_TIMEOUT` if the timeout period elapses, `SPI_STATUS_SUCCESS` on success, or `SPI_STATUS_ERROR` otherwise.
+
+---
+
+### `spi_status_t spi_receive(uint8_t *data, uint16_t length)`
+
+Receive multiple bytes from the selected SPI device.
+
+#### Arguments
+
+ - `uint8_t *data`
+ A pointer to the buffer to read into.
+ - `uint16_t length`
+ The number of bytes to read. Take care not to overrun the length of `data`.
+
+#### Return Value
+
+`SPI_STATUS_TIMEOUT` if the internal transmission timeout period elapses, `SPI_STATUS_SUCCESS` on success, or `SPI_STATUS_ERROR` otherwise.
+
+---
+
+### `void spi_stop(void)`
+
+End the current SPI transaction. This will deassert the slave select pin and reset the endianness, mode and divisor configured by `spi_start()`.
diff --git a/docs/syllabus.md b/docs/syllabus.md
new file mode 100644
index 00000000000..ec7f66ba780
--- /dev/null
+++ b/docs/syllabus.md
@@ -0,0 +1,70 @@
+# QMK Syllabus
+
+This page helps you build up your QMK knowledge by introducing the basics first and guiding you to understanding all the concepts you need to know to be proficient with QMK.
+
+# Beginning Topics
+
+If you read nothing else you should read the documents in this section. After reading the [Tutorial](newbs.md) you should be able to create a basic keymap, compile it, and flash it to your keyboard. The remaining documents will flesh out your knowledge of these basics.
+
+* **Learn How To Use QMK Tools**
+ * [Tutorial](newbs.md)
+ * [CLI](cli.md)
+ * [GIT](newbs_git_best_practices.md)
+* **Learn About Keymaps**
+ * [Layers](feature_layers.md)
+ * [Keycodes](keycodes.md)
+ * The full list of keycodes you can use. Note that some may require knowledge found in the Intermediate or Advanced Topics.
+* **Configuring IDEs** - Optional
+ * [Eclipse](other_eclipse.md)
+ * [VS Code](other_vscode.md)
+
+# Intermediate Topics
+
+These topics start to dig into some of the features that QMK supports. You don't have to read all of these documents, but some of the documents in the Advanced Topics section won't make sense if you skip over some of these.
+
+* **Learn How To Configure Features**
+
+ * [Audio](feature_audio.md)
+ * Lighting
+ * [Backlight](feature_backlight.md)
+ * [LED Matrix](feature_led_matrix.md)
+ * [RGB Lighting](feature_rgblight.md)
+ * [RGB Matrix](feature_rgb_matrix.md)
+ * [Tap-Hold Configuration](tap_hold.md)
+* **Learn More About Keymaps**
+ * [Keymaps](keymap.md)
+ * [Custom Functions and Keycodes](custom_quantum_functions.md)
+ * Macros
+ * [Dynamic Macros](feature_dynamic_macros.md)
+ * [Compiled Macros](feature_macros.md)
+ * [Tap Dance](feature_tap_dance.md)
+ * [Combos](feature_combo.md)
+ * [Userspace](feature_userspace.md)
+
+# Advanced Topics
+
+Everything below here requires a lot of foundational knowledge. Besides being able to create keymaps using advanced features you should be familiar with using both `config.h` and `rules.mk` to configure options for your keyboard.
+
+* **Maintaining Keyboards Within QMK**
+ * [Handwiring a Keyboard](hand_wire.md)
+ * [Keyboard Guidelines](hardware_keyboard_guidelines.md)
+ * [info.json Reference](reference_info_json.md)
+ * [Debounce API](feature_debounce_type.md)
+* **Advanced Features**
+ * [Unicode](feature_unicode.md)
+ * [API](api_overview.md)
+ * [Bootmagic](feature_bootmagic.md)
+* **Hardware**
+ * [How Keyboards Work](how_keyboards_work.md)
+ * [How A Keyboard Matrix Works](how_a_matrix_works.md)
+ * [Split Keyboards](feature_split_keyboard.md)
+ * [Stenography](feature_stenography.md)
+ * [Pointing Devices](feature_pointing_device.md)
+* **Core Development**
+ * [Coding Conventions](coding_conventions_c.md)
+ * [Compatible Microcontrollers](compatible_microcontrollers.md)
+ * [Custom Matrix](custom_matrix.md)
+ * [Understanding QMK](understanding_qmk.md)
+* **CLI Development**
+ * [Coding Conventions](coding_conventions_python.md)
+ * [CLI Development Overview](cli_development.md)
diff --git a/docs/tap_hold.md b/docs/tap_hold.md
index 1719c0bbe5f..a0b648694b9 100644
--- a/docs/tap_hold.md
+++ b/docs/tap_hold.md
@@ -12,7 +12,7 @@ As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new
#define PERMISSIVE_HOLD
```
-This makes tap and hold keys (like Mod Tap) work better for fast typist, or for high `TAPPING_TERM` settings.
+This makes tap and hold keys (like Mod Tap) work better for fast typists, or for high `TAPPING_TERM` settings.
If you press a Mod Tap key, tap another key (press and release) and then release the Mod Tap key, all within the tapping term, it will output the "tapping" function for both keys.
@@ -35,7 +35,7 @@ To enable this setting, add this to your `config.h`:
#define IGNORE_MOD_TAP_INTERRUPT
```
-Similar to Permissive Hold, this alters how the firmware processes input for fast typist. If you press a Mod Tap key, press another key, release the Mod Tap key, and then release the normal key, it would normally output the "tapping" function for both keys. This may not be desirable for rolling combo keys.
+Similar to Permissive Hold, this alters how the firmware processes inputs for fast typists. If you press a Mod Tap key, press another key, release the Mod Tap key, and then release the normal key, it would normally output the "tapping" function for both keys. This may not be desirable for rolling combo keys.
Setting `Ignore Mod Tap Interrupt` requires holding both keys for the `TAPPING_TERM` to trigger the hold function (the mod).
diff --git a/docs/understanding_qmk.md b/docs/understanding_qmk.md
index 81cedfcf53b..93964242582 100644
--- a/docs/understanding_qmk.md
+++ b/docs/understanding_qmk.md
@@ -162,6 +162,15 @@ The `process_record()` function itself is deceptively simple, but hidden within
At any step during this chain of events a function (such as `process_record_kb()`) can `return false` to halt all further processing.
+After this is called, `post_process_record()` is called, which can be used to handle additional cleanup that needs to be run after the keycode is normally handled.
+
+* [`void post_process_record(keyrecord_t *record)`]()
+ * [`void post_process_record_quantum(keyrecord_t *record)`]()
+ * [Map this record to a keycode]()
+ * [`void post_process_clicky(uint16_t keycode, keyrecord_t *record)`]()
+ * [`void post_process_record_kb(uint16_t keycode, keyrecord_t *record)`]()
+ * [`void post_process_record_user(uint16_t keycode, keyrecord_t *record)`]()
+
-
-
- resources/gencfg/processors/boards/stm32f0xx/templates
- ..
- 3.0.x
-
- ST STM32F072B-Discovery
- ST_STM32F072B_DISCOVERY
-
- STM32F072xB
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/keyboards/cannonkeys/an_c/chconf.h b/keyboards/cannonkeys/an_c/chconf.h
index 4640ff5332b..03f63da36a8 100644
--- a/keyboards/cannonkeys/an_c/chconf.h
+++ b/keyboards/cannonkeys/an_c/chconf.h
@@ -331,7 +331,7 @@
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE FALSE
+#define CH_CFG_USE_MEMCORE TRUE
#endif
/**
diff --git a/keyboards/cannonkeys/an_c/config.h b/keyboards/cannonkeys/an_c/config.h
index 7f8d7e8ff6d..0eb1d730f61 100644
--- a/keyboards/cannonkeys/an_c/config.h
+++ b/keyboards/cannonkeys/an_c/config.h
@@ -33,6 +33,10 @@ along with this program. If not, see .
#define MATRIX_ROW_PINS { B1, B0, A7, A5, A4 }
#define DIODE_DIRECTION COL2ROW
+#define BACKLIGHT_PIN A6
+#define BACKLIGHT_PWM_DRIVER PWMD3
+#define BACKLIGHT_PWM_CHANNEL 1
+#define BACKLIGHT_PAL_MODE 1
#define BACKLIGHT_LEVELS 6
#define BACKLIGHT_BREATHING
#define BREATHING_PERIOD 6
@@ -49,22 +53,10 @@ along with this program. If not, see .
#define LOCKING_RESYNC_ENABLE
#define RGBLIGHT_ANIMATIONS
-
-#define WS2812_LED_N 14
-#define RGBLED_NUM WS2812_LED_N
-#define PORT_WS2812 GPIOB
-#define PIN_WS2812 15
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 14
#define WS2812_SPI SPID2
-
-// Backlight config starts after VIA's EEPROM usage,
-// dynamic keymaps start after this.
-#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
-
-// VIA lighting is handled by the keyboard-level code
-#define VIA_CUSTOM_LIGHTING_ENABLE
-
-// Let VIA handle the QMK RGBLIGHT
-#define VIA_QMK_RGBLIGHT_ENABLE
+#define WS2812_SPI_MOSI_PAL_MODE 0
/*
* Feature disable options
diff --git a/keyboards/cannonkeys/an_c/rules.mk b/keyboards/cannonkeys/an_c/rules.mk
index 7ae14c4986f..d97022249ca 100644
--- a/keyboards/cannonkeys/an_c/rules.mk
+++ b/keyboards/cannonkeys/an_c/rules.mk
@@ -1,15 +1,10 @@
# MCU name
MCU = STM32F072
-BOARD = ST_STM32F072B_DISCOVERY
# Build Options
# comment out to disable the options.
#
-# project specific files
-VPATH += keyboards/cannonkeys/stm32f072
-SRC = keyboard.c \
- led.c
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
@@ -19,8 +14,9 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover
CUSTOM_MATRIX = no # Custom matrix file
-# BACKLIGHT_ENABLE = yes # This is broken on 072 for some reason
+BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
+WS2812_DRIVER = spi
LAYOUTS = 60_ansi 60_tsangan_hhkb
diff --git a/keyboards/cannonkeys/atlas/atlas.c b/keyboards/cannonkeys/atlas/atlas.c
new file mode 100644
index 00000000000..8b0b236fe9e
--- /dev/null
+++ b/keyboards/cannonkeys/atlas/atlas.c
@@ -0,0 +1 @@
+#include "atlas.h"
diff --git a/keyboards/cannonkeys/atlas/atlas.h b/keyboards/cannonkeys/atlas/atlas.h
new file mode 100644
index 00000000000..b2f64dab73c
--- /dev/null
+++ b/keyboards/cannonkeys/atlas/atlas.h
@@ -0,0 +1,48 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_ortho_5x12_1x2uC( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \
+ k40, k41, k42, k43, k44, k45 , k47, k48, k49, k4a, k4b \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b }, \
+ { k40, k41, k42, k43, k44, k45, KC_NO, k47, k48, k49, k4a, k4b }, \
+}
+
+#define LAYOUT_ortho_5x12( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b }, \
+}
+
+#define LAYOUT_ortho_5x12_2x2uC( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \
+ k40, k41, k42, k43, k44, k46 , k48, k49, k4a, k4b \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b }, \
+ { k40, k41, k42, k43, k44, KC_NO, k46, KC_NO, k48, k49, k4a, k4b }, \
+}
diff --git a/keyboards/cannonkeys/atlas/chconf.h b/keyboards/cannonkeys/atlas/chconf.h
new file mode 100644
index 00000000000..03f63da36a8
--- /dev/null
+++ b/keyboards/cannonkeys/atlas/chconf.h
@@ -0,0 +1,714 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file rt/templates/chconf.h
+ * @brief Configuration file template.
+ * @details A copy of this file must be placed in each project directory, it
+ * contains the application specific kernel settings.
+ *
+ * @addtogroup config
+ * @details Kernel related settings and hooks.
+ * @{
+ */
+
+#ifndef CHCONF_H
+#define CHCONF_H
+
+#define _CHIBIOS_RT_CONF_
+#define _CHIBIOS_RT_CONF_VER_6_0_
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System time counter resolution.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_ST_RESOLUTION)
+#define CH_CFG_ST_RESOLUTION 32
+#endif
+
+/**
+ * @brief System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ * setting also defines the system tick time unit.
+ */
+#if !defined(CH_CFG_ST_FREQUENCY)
+#define CH_CFG_ST_FREQUENCY 10000
+#endif
+
+/**
+ * @brief Time intervals data size.
+ * @note Allowed values are 16, 32 or 64 bits.
+ */
+#if !defined(CH_CFG_INTERVALS_SIZE)
+#define CH_CFG_INTERVALS_SIZE 32
+#endif
+
+/**
+ * @brief Time types data size.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_TIME_TYPES_SIZE)
+#define CH_CFG_TIME_TYPES_SIZE 32
+#endif
+
+/**
+ * @brief Time delta constant for the tick-less mode.
+ * @note If this value is zero then the system uses the classic
+ * periodic tick. This value represents the minimum number
+ * of ticks that is safe to specify in a timeout directive.
+ * The value one is not valid, timeouts are rounded up to
+ * this value.
+ */
+#if !defined(CH_CFG_ST_TIMEDELTA)
+#define CH_CFG_ST_TIMEDELTA 2
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel parameters and options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Round robin interval.
+ * @details This constant is the number of system ticks allowed for the
+ * threads before preemption occurs. Setting this value to zero
+ * disables the preemption for threads with equal priority and the
+ * round robin becomes cooperative. Note that higher priority
+ * threads can still preempt, the kernel is always preemptive.
+ * @note Disabling the round robin preemption makes the kernel more compact
+ * and generally faster.
+ * @note The round robin preemption is not supported in tickless mode and
+ * must be set to zero in that case.
+ */
+#if !defined(CH_CFG_TIME_QUANTUM)
+#define CH_CFG_TIME_QUANTUM 0
+#endif
+
+/**
+ * @brief Managed RAM size.
+ * @details Size of the RAM area to be managed by the OS. If set to zero
+ * then the whole available RAM is used. The core memory is made
+ * available to the heap allocator and/or can be used directly through
+ * the simplified core memory allocator.
+ *
+ * @note In order to let the OS manage the whole RAM the linker script must
+ * provide the @p __heap_base__ and @p __heap_end__ symbols.
+ * @note Requires @p CH_CFG_USE_MEMCORE.
+ */
+#if !defined(CH_CFG_MEMCORE_SIZE)
+#define CH_CFG_MEMCORE_SIZE 0
+#endif
+
+/**
+ * @brief Idle thread automatic spawn suppression.
+ * @details When this option is activated the function @p chSysInit()
+ * does not spawn the idle thread. The application @p main()
+ * function becomes the idle thread and must implement an
+ * infinite loop.
+ */
+#if !defined(CH_CFG_NO_IDLE_THREAD)
+#define CH_CFG_NO_IDLE_THREAD FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Performance options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief OS optimization.
+ * @details If enabled then time efficient rather than space efficient code
+ * is used when two possible implementations exist.
+ *
+ * @note This is not related to the compiler optimization options.
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_OPTIMIZE_SPEED)
+#define CH_CFG_OPTIMIZE_SPEED FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Subsystem options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Time Measurement APIs.
+ * @details If enabled then the time measurement APIs are included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_TM)
+#define CH_CFG_USE_TM FALSE
+#endif
+
+/**
+ * @brief Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_REGISTRY)
+#define CH_CFG_USE_REGISTRY TRUE
+#endif
+
+/**
+ * @brief Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_WAITEXIT)
+#define CH_CFG_USE_WAITEXIT TRUE
+#endif
+
+/**
+ * @brief Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES)
+#define CH_CFG_USE_SEMAPHORES TRUE
+#endif
+
+/**
+ * @brief Semaphores queuing mode.
+ * @details If enabled then the threads are enqueued on semaphores by
+ * priority rather than in FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY)
+#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MUTEXES)
+#define CH_CFG_USE_MUTEXES TRUE
+#endif
+
+/**
+ * @brief Enables recursive behavior on mutexes.
+ * @note Recursive mutexes are heavier and have an increased
+ * memory footprint.
+ *
+ * @note The default is @p FALSE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE)
+#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
+#endif
+
+/**
+ * @brief Conditional Variables APIs.
+ * @details If enabled then the conditional variables APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_CONDVARS)
+#define CH_CFG_USE_CONDVARS TRUE
+#endif
+
+/**
+ * @brief Conditional Variables APIs with timeout.
+ * @details If enabled then the conditional variables APIs with timeout
+ * specification are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_CONDVARS.
+ */
+#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT)
+#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
+#endif
+
+/**
+ * @brief Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_EVENTS)
+#define CH_CFG_USE_EVENTS TRUE
+#endif
+
+/**
+ * @brief Events Flags APIs with timeout.
+ * @details If enabled then the events APIs with timeout specification
+ * are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_EVENTS.
+ */
+#if !defined(CH_CFG_USE_EVENTS_TIMEOUT)
+#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MESSAGES)
+#define CH_CFG_USE_MESSAGES TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages queuing mode.
+ * @details If enabled then messages are served by priority rather than in
+ * FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_MESSAGES.
+ */
+#if !defined(CH_CFG_USE_MESSAGES_PRIORITY)
+#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mailboxes APIs.
+ * @details If enabled then the asynchronous messages (mailboxes) APIs are
+ * included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_MAILBOXES)
+#define CH_CFG_USE_MAILBOXES TRUE
+#endif
+
+/**
+ * @brief Core Memory Manager APIs.
+ * @details If enabled then the core memory manager APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMCORE)
+#define CH_CFG_USE_MEMCORE TRUE
+#endif
+
+/**
+ * @brief Heap Allocator APIs.
+ * @details If enabled then the memory heap allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
+ * @p CH_CFG_USE_SEMAPHORES.
+ * @note Mutexes are recommended.
+ */
+#if !defined(CH_CFG_USE_HEAP)
+#define CH_CFG_USE_HEAP FALSE
+#endif
+
+/**
+ * @brief Memory Pools Allocator APIs.
+ * @details If enabled then the memory pools allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMPOOLS)
+#define CH_CFG_USE_MEMPOOLS FALSE
+#endif
+
+/**
+ * @brief Objects FIFOs APIs.
+ * @details If enabled then the objects FIFOs APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_OBJ_FIFOS)
+#define CH_CFG_USE_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Pipes APIs.
+ * @details If enabled then the pipes APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_PIPES)
+#define CH_CFG_USE_PIPES FALSE
+#endif
+
+/**
+ * @brief Dynamic Threads APIs.
+ * @details If enabled then the dynamic threads creation APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_WAITEXIT.
+ * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
+ */
+#if !defined(CH_CFG_USE_DYNAMIC)
+#define CH_CFG_USE_DYNAMIC FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Objects factory options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Objects Factory APIs.
+ * @details If enabled then the objects factory APIs are included in the
+ * kernel.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_CFG_USE_FACTORY)
+#define CH_CFG_USE_FACTORY FALSE
+#endif
+
+/**
+ * @brief Maximum length for object names.
+ * @details If the specified length is zero then the name is stored by
+ * pointer but this could have unintended side effects.
+ */
+#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH)
+#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8
+#endif
+
+/**
+ * @brief Enables the registry of generic objects.
+ */
+#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY)
+#define CH_CFG_FACTORY_OBJECTS_REGISTRY FALSE
+#endif
+
+/**
+ * @brief Enables factory for generic buffers.
+ */
+#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)
+#define CH_CFG_FACTORY_GENERIC_BUFFERS FALSE
+#endif
+
+/**
+ * @brief Enables factory for semaphores.
+ */
+#if !defined(CH_CFG_FACTORY_SEMAPHORES)
+#define CH_CFG_FACTORY_SEMAPHORES FALSE
+#endif
+
+/**
+ * @brief Enables factory for mailboxes.
+ */
+#if !defined(CH_CFG_FACTORY_MAILBOXES)
+#define CH_CFG_FACTORY_MAILBOXES FALSE
+#endif
+
+/**
+ * @brief Enables factory for objects FIFOs.
+ */
+#if !defined(CH_CFG_FACTORY_OBJ_FIFOS)
+#define CH_CFG_FACTORY_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Enables factory for Pipes.
+ */
+#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)
+#define CH_CFG_FACTORY_PIPES FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Debug option, kernel statistics.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_STATISTICS)
+#define CH_DBG_STATISTICS FALSE
+#endif
+
+/**
+ * @brief Debug option, system state check.
+ * @details If enabled the correct call protocol for system APIs is checked
+ * at runtime.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_SYSTEM_STATE_CHECK)
+#define CH_DBG_SYSTEM_STATE_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, parameters checks.
+ * @details If enabled then the checks on the API functions input
+ * parameters are activated.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_CHECKS)
+#define CH_DBG_ENABLE_CHECKS FALSE
+#endif
+
+/**
+ * @brief Debug option, consistency checks.
+ * @details If enabled then all the assertions in the kernel code are
+ * activated. This includes consistency checks inside the kernel,
+ * runtime anomalies and port-defined checks.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_ASSERTS)
+#define CH_DBG_ENABLE_ASSERTS FALSE
+#endif
+
+/**
+ * @brief Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_MASK)
+#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
+#endif
+
+/**
+ * @brief Trace buffer entries.
+ * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is
+ * different from @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_BUFFER_SIZE)
+#define CH_DBG_TRACE_BUFFER_SIZE 128
+#endif
+
+/**
+ * @brief Debug option, stack checks.
+ * @details If enabled then a runtime stack check is performed.
+ *
+ * @note The default is @p FALSE.
+ * @note The stack check is performed in a architecture/port dependent way.
+ * It may not be implemented or some ports.
+ * @note The default failure mode is to halt the system with the global
+ * @p panic_msg variable set to @p NULL.
+ */
+#if !defined(CH_DBG_ENABLE_STACK_CHECK)
+#define CH_DBG_ENABLE_STACK_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, stacks initialization.
+ * @details If enabled then the threads working area is filled with a byte
+ * value when a thread is created. This can be useful for the
+ * runtime measurement of the used stack.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_FILL_THREADS)
+#define CH_DBG_FILL_THREADS FALSE
+#endif
+
+/**
+ * @brief Debug option, threads profiling.
+ * @details If enabled then a field is added to the @p thread_t structure that
+ * counts the system ticks occurred while executing the thread.
+ *
+ * @note The default is @p FALSE.
+ * @note This debug option is not currently compatible with the
+ * tickless mode.
+ */
+#if !defined(CH_DBG_THREADS_PROFILING)
+#define CH_DBG_THREADS_PROFILING FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System structure extension.
+ * @details User fields added to the end of the @p ch_system_t structure.
+ */
+#define CH_CFG_SYSTEM_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief System initialization hook.
+ * @details User initialization code added to the @p chSysInit() function
+ * just before interrupts are enabled globally.
+ */
+#define CH_CFG_SYSTEM_INIT_HOOK() { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads descriptor structure extension.
+ * @details User fields added to the end of the @p thread_t structure.
+ */
+#define CH_CFG_THREAD_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief Threads initialization hook.
+ * @details User initialization code added to the @p _thread_init() function.
+ *
+ * @note It is invoked from within @p _thread_init() and implicitly from all
+ * the threads creation APIs.
+ */
+#define CH_CFG_THREAD_INIT_HOOK(tp) { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads finalization hook.
+ * @details User finalization code added to the @p chThdExit() API.
+ */
+#define CH_CFG_THREAD_EXIT_HOOK(tp) { \
+ /* Add threads finalization code here.*/ \
+}
+
+/**
+ * @brief Context switch hook.
+ * @details This hook is invoked just before switching between threads.
+ */
+#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \
+ /* Context switch code here.*/ \
+}
+
+/**
+ * @brief ISR enter hook.
+ */
+#define CH_CFG_IRQ_PROLOGUE_HOOK() { \
+ /* IRQ prologue code here.*/ \
+}
+
+/**
+ * @brief ISR exit hook.
+ */
+#define CH_CFG_IRQ_EPILOGUE_HOOK() { \
+ /* IRQ epilogue code here.*/ \
+}
+
+/**
+ * @brief Idle thread enter hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to activate a power saving mode.
+ */
+#define CH_CFG_IDLE_ENTER_HOOK() { \
+ /* Idle-enter code here.*/ \
+}
+
+/**
+ * @brief Idle thread leave hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to deactivate a power saving mode.
+ */
+#define CH_CFG_IDLE_LEAVE_HOOK() { \
+ /* Idle-leave code here.*/ \
+}
+
+/**
+ * @brief Idle Loop hook.
+ * @details This hook is continuously invoked by the idle thread loop.
+ */
+#define CH_CFG_IDLE_LOOP_HOOK() { \
+ /* Idle loop code here.*/ \
+}
+
+/**
+ * @brief System tick event hook.
+ * @details This hook is invoked in the system tick handler immediately
+ * after processing the virtual timers queue.
+ */
+#define CH_CFG_SYSTEM_TICK_HOOK() { \
+ /* System tick event code here.*/ \
+}
+
+/**
+ * @brief System halt hook.
+ * @details This hook is invoked in case to a system halting error before
+ * the system is halted.
+ */
+#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \
+ /* System halt code here.*/ \
+}
+
+/**
+ * @brief Trace hook.
+ * @details This hook is invoked each time a new record is written in the
+ * trace buffer.
+ */
+#define CH_CFG_TRACE_HOOK(tep) { \
+ /* Trace code here.*/ \
+}
+
+/** @} */
+
+/*===========================================================================*/
+/* Port-specific settings (override port settings defaulted in chcore.h). */
+/*===========================================================================*/
+
+#endif /* CHCONF_H */
+
+/** @} */
diff --git a/keyboards/cannonkeys/atlas/config.h b/keyboards/cannonkeys/atlas/config.h
new file mode 100644
index 00000000000..6cd1d1b6e87
--- /dev/null
+++ b/keyboards/cannonkeys/atlas/config.h
@@ -0,0 +1,71 @@
+/*
+Copyright 2015 Jun Wako
+
+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 .
+*/
+
+#pragma once
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xCA04
+#define PRODUCT_ID 0xA7A5
+#define DEVICE_VER 0x0001
+#define MANUFACTURER CannonKeys
+#define PRODUCT Atlas
+#define DESCRIPTION Atlas Keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 12
+
+#define MATRIX_COL_PINS { A9, A10, A15, B9, C13, C14, C15, F0, F1, A0, A1, A2 }
+#define MATRIX_ROW_PINS { A8, B14, B12, B4, B3 }
+#define DIODE_DIRECTION COL2ROW
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+#define RGBLIGHT_ANIMATIONS
+
+
+#define WS2812_SPI SPID2
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 22
+#define WS2812_SPI_MOSI_PAL_MODE 0
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
diff --git a/keyboards/cannonkeys/atlas/halconf.h b/keyboards/cannonkeys/atlas/halconf.h
new file mode 100644
index 00000000000..adb1a907154
--- /dev/null
+++ b/keyboards/cannonkeys/atlas/halconf.h
@@ -0,0 +1,525 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file templates/halconf.h
+ * @brief HAL configuration header.
+ * @details HAL configuration file, this file allows to enable or disable the
+ * various device drivers from your application. You may also use
+ * this file in order to override the device drivers default settings.
+ *
+ * @addtogroup HAL_CONF
+ * @{
+ */
+
+#ifndef HALCONF_H
+#define HALCONF_H
+
+#define _CHIBIOS_HAL_CONF_
+#define _CHIBIOS_HAL_CONF_VER_7_0_
+
+#include "mcuconf.h"
+
+/**
+ * @brief Enables the PAL subsystem.
+ */
+#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
+#define HAL_USE_PAL TRUE
+#endif
+
+/**
+ * @brief Enables the ADC subsystem.
+ */
+#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
+#define HAL_USE_ADC FALSE
+#endif
+
+/**
+ * @brief Enables the CAN subsystem.
+ */
+#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
+#define HAL_USE_CAN FALSE
+#endif
+
+/**
+ * @brief Enables the cryptographic subsystem.
+ */
+#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__)
+#define HAL_USE_CRY FALSE
+#endif
+
+/**
+ * @brief Enables the DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC FALSE
+#endif
+
+/**
+ * @brief Enables the GPT subsystem.
+ */
+#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
+#define HAL_USE_GPT FALSE
+#endif
+
+/**
+ * @brief Enables the I2C subsystem.
+ */
+#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
+#define HAL_USE_I2C TRUE
+#endif
+
+/**
+ * @brief Enables the I2S subsystem.
+ */
+#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
+#define HAL_USE_I2S FALSE
+#endif
+
+/**
+ * @brief Enables the ICU subsystem.
+ */
+#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)
+#define HAL_USE_ICU FALSE
+#endif
+
+/**
+ * @brief Enables the MAC subsystem.
+ */
+#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)
+#define HAL_USE_MAC FALSE
+#endif
+
+/**
+ * @brief Enables the MMC_SPI subsystem.
+ */
+#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_MMC_SPI FALSE
+#endif
+
+/**
+ * @brief Enables the PWM subsystem.
+ */
+#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
+#define HAL_USE_PWM TRUE
+#endif
+
+/**
+ * @brief Enables the RTC subsystem.
+ */
+#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)
+#define HAL_USE_RTC FALSE
+#endif
+
+/**
+ * @brief Enables the SDC subsystem.
+ */
+#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)
+#define HAL_USE_SDC FALSE
+#endif
+
+/**
+ * @brief Enables the SERIAL subsystem.
+ */
+#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL FALSE
+#endif
+
+/**
+ * @brief Enables the SERIAL over USB subsystem.
+ */
+#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL_USB FALSE
+#endif
+
+/**
+ * @brief Enables the SIO subsystem.
+ */
+#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__)
+#define HAL_USE_SIO FALSE
+#endif
+
+/**
+ * @brief Enables the SPI subsystem.
+ */
+#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_SPI TRUE
+#endif
+
+/**
+ * @brief Enables the TRNG subsystem.
+ */
+#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__)
+#define HAL_USE_TRNG FALSE
+#endif
+
+/**
+ * @brief Enables the UART subsystem.
+ */
+#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)
+#define HAL_USE_UART FALSE
+#endif
+
+/**
+ * @brief Enables the USB subsystem.
+ */
+#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
+#define HAL_USE_USB TRUE
+#endif
+
+/**
+ * @brief Enables the WDG subsystem.
+ */
+#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
+#define HAL_USE_WDG FALSE
+#endif
+
+/**
+ * @brief Enables the WSPI subsystem.
+ */
+#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__)
+#define HAL_USE_WSPI FALSE
+#endif
+
+/*===========================================================================*/
+/* PAL driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define PAL_USE_CALLBACKS FALSE
+#endif
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__)
+#define PAL_USE_WAIT FALSE
+#endif
+
+/*===========================================================================*/
+/* ADC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)
+#define ADC_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define ADC_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* CAN driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Sleep mode related APIs inclusion switch.
+ */
+#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__)
+#define CAN_USE_SLEEP_MODE TRUE
+#endif
+
+/**
+ * @brief Enforces the driver to use direct callbacks rather than OSAL events.
+ */
+#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define CAN_ENFORCE_USE_CALLBACKS FALSE
+#endif
+
+/*===========================================================================*/
+/* CRY driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the SW fall-back of the cryptographic driver.
+ * @details When enabled, this option, activates a fall-back software
+ * implementation for algorithms not supported by the underlying
+ * hardware.
+ * @note Fall-back implementations may not be present for all algorithms.
+ */
+#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_USE_FALLBACK FALSE
+#endif
+
+/**
+ * @brief Makes the driver forcibly use the fall-back implementations.
+ */
+#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_ENFORCE_FALLBACK FALSE
+#endif
+
+/*===========================================================================*/
+/* DAC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__)
+#define DAC_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define DAC_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* I2C driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the mutual exclusion APIs on the I2C bus.
+ */
+#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define I2C_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* MAC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the zero-copy API.
+ */
+#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)
+#define MAC_USE_ZERO_COPY FALSE
+#endif
+
+/**
+ * @brief Enables an event sources for incoming packets.
+ */
+#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__)
+#define MAC_USE_EVENTS TRUE
+#endif
+
+/*===========================================================================*/
+/* MMC_SPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ * This option is recommended also if the SPI driver does not
+ * use a DMA channel and heavily loads the CPU.
+ */
+#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__)
+#define MMC_NICE_WAITING TRUE
+#endif
+
+/*===========================================================================*/
+/* SDC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Number of initialization attempts before rejecting the card.
+ * @note Attempts are performed at 10mS intervals.
+ */
+#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__)
+#define SDC_INIT_RETRY 100
+#endif
+
+/**
+ * @brief Include support for MMC cards.
+ * @note MMC support is not yet implemented so this option must be kept
+ * at @p FALSE.
+ */
+#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__)
+#define SDC_MMC_SUPPORT FALSE
+#endif
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ */
+#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__)
+#define SDC_NICE_WAITING TRUE
+#endif
+
+/**
+ * @brief OCR initialization constant for V20 cards.
+ */
+#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR_V20 0x50FF8000U
+#endif
+
+/**
+ * @brief OCR initialization constant for non-V20 cards.
+ */
+#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR 0x80100000U
+#endif
+
+/*===========================================================================*/
+/* SERIAL driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Default bit rate.
+ * @details Configuration parameter, this is the baud rate selected for the
+ * default configuration.
+ */
+#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)
+#define SERIAL_DEFAULT_BITRATE 38400
+#endif
+
+/**
+ * @brief Serial buffers size.
+ * @details Configuration parameter, you can change the depth of the queue
+ * buffers depending on the requirements of your application.
+ * @note The default is 16 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_BUFFERS_SIZE 16
+#endif
+
+/*===========================================================================*/
+/* SERIAL_USB driver related setting. */
+/*===========================================================================*/
+
+/**
+ * @brief Serial over USB buffers size.
+ * @details Configuration parameter, the buffer size must be a multiple of
+ * the USB data endpoint maximum packet size.
+ * @note The default is 256 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_SIZE 1
+#endif
+
+/**
+ * @brief Serial over USB number of buffers.
+ * @note The default is 2 buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_NUMBER 2
+#endif
+
+/*===========================================================================*/
+/* SPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__)
+#define SPI_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables circular transfers APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__)
+#define SPI_USE_CIRCULAR FALSE
+#endif
+
+
+/**
+ * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define SPI_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/**
+ * @brief Handling method for SPI CS line.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__)
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+#endif
+
+/*===========================================================================*/
+/* UART driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__)
+#define UART_USE_WAIT FALSE
+#endif
+
+/**
+ * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define UART_USE_MUTUAL_EXCLUSION FALSE
+#endif
+
+/*===========================================================================*/
+/* USB driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
+#define USB_USE_WAIT TRUE
+#endif
+
+/*===========================================================================*/
+/* WSPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__)
+#define WSPI_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define WSPI_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+#endif /* HALCONF_H */
+
+/** @} */
diff --git a/keyboards/cannonkeys/atlas/info.json b/keyboards/cannonkeys/atlas/info.json
new file mode 100644
index 00000000000..10d95297300
--- /dev/null
+++ b/keyboards/cannonkeys/atlas/info.json
@@ -0,0 +1,198 @@
+{
+ "keyboard_name": "Atlas",
+ "url": "https://cannonkeys.com",
+ "maintainer": "awkannan",
+ "width": 12,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_ortho_5x12": {
+ "layout": [
+ {"label":"`", "x":0, "y":0},
+ {"label":"1", "x":1, "y":0},
+ {"label":"2", "x":2, "y":0},
+ {"label":"3", "x":3, "y":0},
+ {"label":"4", "x":4, "y":0},
+ {"label":"5", "x":5, "y":0},
+ {"label":"6", "x":6, "y":0},
+ {"label":"7", "x":7, "y":0},
+ {"label":"8", "x":8, "y":0},
+ {"label":"9", "x":9, "y":0},
+ {"label":"0", "x":10, "y":0},
+ {"label":"Backspace", "x":11, "y":0},
+ {"label":"Tab", "x":0, "y":1},
+ {"label":"Q", "x":1, "y":1},
+ {"label":"W", "x":2, "y":1},
+ {"label":"E", "x":3, "y":1},
+ {"label":"R", "x":4, "y":1},
+ {"label":"T", "x":5, "y":1},
+ {"label":"Y", "x":6, "y":1},
+ {"label":"U", "x":7, "y":1},
+ {"label":"I", "x":8, "y":1},
+ {"label":"O", "x":9, "y":1},
+ {"label":"P", "x":10, "y":1},
+ {"label":"Delete", "x":11, "y":1},
+ {"label":"Esc", "x":0, "y":2},
+ {"label":"A", "x":1, "y":2},
+ {"label":"S", "x":2, "y":2},
+ {"label":"D", "x":3, "y":2},
+ {"label":"F", "x":4, "y":2},
+ {"label":"G", "x":5, "y":2},
+ {"label":"H", "x":6, "y":2},
+ {"label":"J", "x":7, "y":2},
+ {"label":"K", "x":8, "y":2},
+ {"label":"L", "x":9, "y":2},
+ {"label":";", "x":10, "y":2},
+ {"label":"'", "x":11, "y":2},
+ {"label":"Shift", "x":0, "y":3},
+ {"label":"Z", "x":1, "y":3},
+ {"label":"X", "x":2, "y":3},
+ {"label":"C", "x":3, "y":3},
+ {"label":"V", "x":4, "y":3},
+ {"label":"B", "x":5, "y":3},
+ {"label":"N", "x":6, "y":3},
+ {"label":"M", "x":7, "y":3},
+ {"label":",", "x":8, "y":3},
+ {"label":".", "x":9, "y":3},
+ {"label":"/", "x":10, "y":3},
+ {"label":"Enter", "x":11, "y":3},
+ {"label":"Fn", "x":0, "y":4},
+ {"label":"Ctrl", "x":1, "y":4},
+ {"label":"Alt", "x":2, "y":4},
+ {"label":"Meta", "x":3, "y":4},
+ {"label":"Lower", "x":4, "y":4},
+ {"label":"Space", "x":5, "y":4},
+ {"label":"Space", "x":6, "y":4},
+ {"label":"Raise", "x":7, "y":4},
+ {"label":"Left", "x":8, "y":4},
+ {"label":"Down", "x":9, "y":4},
+ {"label":"Up", "x":10, "y":4},
+ {"label":"Right", "x":11, "y":4}
+ ]
+ },
+ "LAYOUT_ortho_5x12_1x2uC": {
+ "layout": [
+ {"label":"`", "x":0, "y":0},
+ {"label":"1", "x":1, "y":0},
+ {"label":"2", "x":2, "y":0},
+ {"label":"3", "x":3, "y":0},
+ {"label":"4", "x":4, "y":0},
+ {"label":"5", "x":5, "y":0},
+ {"label":"6", "x":6, "y":0},
+ {"label":"7", "x":7, "y":0},
+ {"label":"8", "x":8, "y":0},
+ {"label":"9", "x":9, "y":0},
+ {"label":"0", "x":10, "y":0},
+ {"label":"Backspace", "x":11, "y":0},
+ {"label":"Tab", "x":0, "y":1},
+ {"label":"Q", "x":1, "y":1},
+ {"label":"W", "x":2, "y":1},
+ {"label":"E", "x":3, "y":1},
+ {"label":"R", "x":4, "y":1},
+ {"label":"T", "x":5, "y":1},
+ {"label":"Y", "x":6, "y":1},
+ {"label":"U", "x":7, "y":1},
+ {"label":"I", "x":8, "y":1},
+ {"label":"O", "x":9, "y":1},
+ {"label":"P", "x":10, "y":1},
+ {"label":"Delete", "x":11, "y":1},
+ {"label":"Esc", "x":0, "y":2},
+ {"label":"A", "x":1, "y":2},
+ {"label":"S", "x":2, "y":2},
+ {"label":"D", "x":3, "y":2},
+ {"label":"F", "x":4, "y":2},
+ {"label":"G", "x":5, "y":2},
+ {"label":"H", "x":6, "y":2},
+ {"label":"J", "x":7, "y":2},
+ {"label":"K", "x":8, "y":2},
+ {"label":"L", "x":9, "y":2},
+ {"label":";", "x":10, "y":2},
+ {"label":"'", "x":11, "y":2},
+ {"label":"Shift", "x":0, "y":3},
+ {"label":"Z", "x":1, "y":3},
+ {"label":"X", "x":2, "y":3},
+ {"label":"C", "x":3, "y":3},
+ {"label":"V", "x":4, "y":3},
+ {"label":"B", "x":5, "y":3},
+ {"label":"N", "x":6, "y":3},
+ {"label":"M", "x":7, "y":3},
+ {"label":",", "x":8, "y":3},
+ {"label":".", "x":9, "y":3},
+ {"label":"/", "x":10, "y":3},
+ {"label":"Enter", "x":11, "y":3},
+ {"label":"Fn", "x":0, "y":4},
+ {"label":"Ctrl", "x":1, "y":4},
+ {"label":"Alt", "x":2, "y":4},
+ {"label":"Meta", "x":3, "y":4},
+ {"label":"Lower", "x":4, "y":4},
+ {"label":"Space", "x":5, "y":4, "w":2},
+ {"label":"Raise", "x":7, "y":4},
+ {"label":"Left", "x":8, "y":4},
+ {"label":"Down", "x":9, "y":4},
+ {"label":"Up", "x":10, "y":4},
+ {"label":"Right", "x":11, "y":4}
+ ]
+ },
+ "LAYOUT_ortho_5x12_2x2uC": {
+ "layout": [
+ {"label":"`", "x":0, "y":0},
+ {"label":"1", "x":1, "y":0},
+ {"label":"2", "x":2, "y":0},
+ {"label":"3", "x":3, "y":0},
+ {"label":"4", "x":4, "y":0},
+ {"label":"5", "x":5, "y":0},
+ {"label":"6", "x":6, "y":0},
+ {"label":"7", "x":7, "y":0},
+ {"label":"8", "x":8, "y":0},
+ {"label":"9", "x":9, "y":0},
+ {"label":"0", "x":10, "y":0},
+ {"label":"Backspace", "x":11, "y":0},
+ {"label":"Tab", "x":0, "y":1},
+ {"label":"Q", "x":1, "y":1},
+ {"label":"W", "x":2, "y":1},
+ {"label":"E", "x":3, "y":1},
+ {"label":"R", "x":4, "y":1},
+ {"label":"T", "x":5, "y":1},
+ {"label":"Y", "x":6, "y":1},
+ {"label":"U", "x":7, "y":1},
+ {"label":"I", "x":8, "y":1},
+ {"label":"O", "x":9, "y":1},
+ {"label":"P", "x":10, "y":1},
+ {"label":"Delete", "x":11, "y":1},
+ {"label":"Esc", "x":0, "y":2},
+ {"label":"A", "x":1, "y":2},
+ {"label":"S", "x":2, "y":2},
+ {"label":"D", "x":3, "y":2},
+ {"label":"F", "x":4, "y":2},
+ {"label":"G", "x":5, "y":2},
+ {"label":"H", "x":6, "y":2},
+ {"label":"J", "x":7, "y":2},
+ {"label":"K", "x":8, "y":2},
+ {"label":"L", "x":9, "y":2},
+ {"label":";", "x":10, "y":2},
+ {"label":"'", "x":11, "y":2},
+ {"label":"Shift", "x":0, "y":3},
+ {"label":"Z", "x":1, "y":3},
+ {"label":"X", "x":2, "y":3},
+ {"label":"C", "x":3, "y":3},
+ {"label":"V", "x":4, "y":3},
+ {"label":"B", "x":5, "y":3},
+ {"label":"N", "x":6, "y":3},
+ {"label":"M", "x":7, "y":3},
+ {"label":",", "x":8, "y":3},
+ {"label":".", "x":9, "y":3},
+ {"label":"/", "x":10, "y":3},
+ {"label":"Enter", "x":11, "y":3},
+ {"label":"Fn", "x":0, "y":4},
+ {"label":"Ctrl", "x":1, "y":4},
+ {"label":"Alt", "x":2, "y":4},
+ {"label":"Meta", "x":3, "y":4},
+ {"label":"Space1", "x":4, "y":4, "w":2},
+ {"label":"Space2", "x":6, "y":4, "w":2},
+ {"label":"Left", "x":8, "y":4},
+ {"label":"Down", "x":9, "y":4},
+ {"label":"Up", "x":10, "y":4},
+ {"label":"Right", "x":11, "y":4}
+ ]
+ }
+ }
+ }
diff --git a/keyboards/cannonkeys/atlas/keymaps/default/keymap.c b/keyboards/cannonkeys/atlas/keymaps/default/keymap.c
new file mode 100644
index 00000000000..705d31a405f
--- /dev/null
+++ b/keyboards/cannonkeys/atlas/keymaps/default/keymap.c
@@ -0,0 +1,93 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_names {
+ _BASE,
+ _RAISE,
+ _LOWER
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_BASE] = LAYOUT_ortho_5x12( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, \
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \
+ BL_TOGG, KC_LCTL, KC_LALT, KC_LGUI, MO(_LOWER), KC_SPC, KC_SPC, MO(_RAISE), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
+),
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = LAYOUT_ortho_5x12( \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_HOME, KC_END, _______, \
+ RESET, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = LAYOUT_ortho_5x12( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, \
+ RGB_TOG, RGB_MOD, BL_INC, BL_DEC, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+)
+};
diff --git a/keyboards/cannonkeys/atlas/keymaps/via/keymap.c b/keyboards/cannonkeys/atlas/keymaps/via/keymap.c
new file mode 100644
index 00000000000..2e72c8f9dc2
--- /dev/null
+++ b/keyboards/cannonkeys/atlas/keymaps/via/keymap.c
@@ -0,0 +1,102 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_names {
+ _BASE,
+ _RAISE,
+ _LOWER,
+ _EXTRA
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_BASE] = LAYOUT_ortho_5x12( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, \
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \
+ BL_TOGG, KC_LCTL, KC_LALT, KC_LGUI, MO(_LOWER), KC_SPC, KC_SPC, MO(_RAISE), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
+),
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = LAYOUT_ortho_5x12( \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_HOME, KC_END, _______, \
+ RESET, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = LAYOUT_ortho_5x12( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, \
+ RGB_TOG, RGB_MOD, BL_INC, BL_DEC, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+[_EXTRA] = LAYOUT_ortho_5x12( \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+)
+};
diff --git a/keyboards/cannonkeys/atlas/keymaps/via/rules.mk b/keyboards/cannonkeys/atlas/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/cannonkeys/atlas/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/cannonkeys/atlas/mcuconf.h b/keyboards/cannonkeys/atlas/mcuconf.h
new file mode 100644
index 00000000000..048eb4df650
--- /dev/null
+++ b/keyboards/cannonkeys/atlas/mcuconf.h
@@ -0,0 +1,176 @@
+/*
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#ifndef _MCUCONF_H_
+#define _MCUCONF_H_
+
+/*
+ * STM32F0xx drivers configuration.
+ * The following settings override the default settings present in
+ * the various device driver implementation headers.
+ * Note that the settings for each driver only have effect if the whole
+ * driver is enabled in halconf.h.
+ *
+ * IRQ priorities:
+ * 3...0 Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3 Lowest...Highest.
+ */
+
+#define STM32F0xx_MCUCONF
+// #define STM32F070xB
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT FALSE
+#define STM32_PVD_ENABLE FALSE
+#define STM32_PLS STM32_PLS_LEV0
+#define STM32_HSI_ENABLED TRUE
+#define STM32_HSI14_ENABLED TRUE
+#define STM32_HSI48_ENABLED FALSE
+#define STM32_LSI_ENABLED TRUE
+#define STM32_HSE_ENABLED FALSE
+#define STM32_LSE_ENABLED FALSE
+#define STM32_SW STM32_SW_PLL
+#define STM32_PLLSRC STM32_PLLSRC_HSI_DIV2
+#define STM32_PREDIV_VALUE 1
+#define STM32_PLLMUL_VALUE 12
+#define STM32_HPRE STM32_HPRE_DIV1
+#define STM32_PPRE STM32_PPRE_DIV1
+#define STM32_ADCSW STM32_ADCSW_HSI14
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_ADCSW STM32_ADCSW_HSI14
+#define STM32_USBSW STM32_USBSW_HSI48
+#define STM32_CECSW STM32_CECSW_HSI
+#define STM32_I2C1SW STM32_I2C1SW_HSI
+#define STM32_USART1SW STM32_USART1SW_PCLK
+#define STM32_RTCSEL STM32_RTCSEL_LSI
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_USE_ADC1 FALSE
+#define STM32_ADC_ADC1_DMA_PRIORITY 2
+#define STM32_ADC_IRQ_PRIORITY 2
+#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2
+
+/*
+ * EXT driver system settings.
+ */
+#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI16_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI17_IRQ_PRIORITY 3
+
+/*
+ * GPT driver system settings.
+ */
+#define STM32_GPT_USE_TIM1 FALSE
+#define STM32_GPT_USE_TIM2 FALSE
+#define STM32_GPT_USE_TIM3 FALSE
+#define STM32_GPT_USE_TIM14 FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY 2
+#define STM32_GPT_TIM2_IRQ_PRIORITY 2
+#define STM32_GPT_TIM3_IRQ_PRIORITY 2
+#define STM32_GPT_TIM14_IRQ_PRIORITY 2
+
+/*
+ * I2C driver system settings.
+ */
+#define STM32_I2C_USE_I2C1 TRUE
+#define STM32_I2C_USE_I2C2 FALSE
+#define STM32_I2C_BUSY_TIMEOUT 50
+#define STM32_I2C_I2C1_IRQ_PRIORITY 3
+#define STM32_I2C_I2C2_IRQ_PRIORITY 3
+#define STM32_I2C_USE_DMA TRUE
+#define STM32_I2C_I2C1_DMA_PRIORITY 1
+#define STM32_I2C_I2C2_DMA_PRIORITY 1
+#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
+#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6)
+#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure")
+
+/*
+ * ICU driver system settings.
+ */
+#define STM32_ICU_USE_TIM1 FALSE
+#define STM32_ICU_USE_TIM2 FALSE
+#define STM32_ICU_USE_TIM3 FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY 3
+#define STM32_ICU_TIM2_IRQ_PRIORITY 3
+#define STM32_ICU_TIM3_IRQ_PRIORITY 3
+
+/*
+ * PWM driver system settings.
+ */
+#define STM32_PWM_USE_ADVANCED FALSE
+#define STM32_PWM_USE_TIM1 FALSE
+#define STM32_PWM_USE_TIM2 FALSE
+#define STM32_PWM_USE_TIM3 TRUE
+#define STM32_PWM_TIM1_IRQ_PRIORITY 3
+#define STM32_PWM_TIM2_IRQ_PRIORITY 3
+#define STM32_PWM_TIM3_IRQ_PRIORITY 3
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1 FALSE
+#define STM32_SERIAL_USE_USART2 FALSE
+#define STM32_SERIAL_USART1_PRIORITY 3
+#define STM32_SERIAL_USART2_PRIORITY 3
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1 FALSE
+#define STM32_SPI_USE_SPI2 TRUE
+#define STM32_SPI_SPI1_DMA_PRIORITY 1
+#define STM32_SPI_SPI2_DMA_PRIORITY 1
+#define STM32_SPI_SPI1_IRQ_PRIORITY 2
+#define STM32_SPI_SPI2_IRQ_PRIORITY 2
+#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5)
+#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY 2
+#define STM32_ST_USE_TIMER 2
+
+/*
+ * UART driver system settings.
+ */
+#define STM32_UART_USE_USART1 FALSE
+#define STM32_UART_USE_USART2 FALSE
+#define STM32_UART_USART1_IRQ_PRIORITY 3
+#define STM32_UART_USART2_IRQ_PRIORITY 3
+#define STM32_UART_USART1_DMA_PRIORITY 0
+#define STM32_UART_USART2_DMA_PRIORITY 0
+#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure")
+
+/*
+ * USB driver system settings.
+ */
+#define STM32_USB_USE_USB1 TRUE
+#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE
+#define STM32_USB_USB1_LP_IRQ_PRIORITY 3
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/cannonkeys/atlas/readme.md b/keyboards/cannonkeys/atlas/readme.md
new file mode 100644
index 00000000000..a11117b8e1a
--- /dev/null
+++ b/keyboards/cannonkeys/atlas/readme.md
@@ -0,0 +1,10 @@
+# CannonKeys Atlas
+
+* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan)
+* Hardware Supported: STM32F072CBT6
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cannonkeys/atlas:default
+
+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).
diff --git a/keyboards/cannonkeys/atlas/rules.mk b/keyboards/cannonkeys/atlas/rules.mk
new file mode 100644
index 00000000000..8037597b5ac
--- /dev/null
+++ b/keyboards/cannonkeys/atlas/rules.mk
@@ -0,0 +1,16 @@
+# MCU Name
+MCU = STM32F072
+
+# Build Options
+# comment out to disable the options.
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover
+CUSTOM_MATRIX = no # Custom matrix file
+BACKLIGHT_ENABLE = no
+RGBLIGHT_ENABLE = yes
+WS2812_DRIVER = spi
diff --git a/keyboards/cannonkeys/bluepill/keyboard.c b/keyboards/cannonkeys/bluepill/keyboard.c
index 7eb30ea132f..c2e5946d454 100644
--- a/keyboards/cannonkeys/bluepill/keyboard.c
+++ b/keyboards/cannonkeys/bluepill/keyboard.c
@@ -1,6 +1,5 @@
#include "ch.h"
#include "hal.h"
-#include "led_custom.h"
#include "util.h"
#include "quantum.h"
@@ -15,20 +14,7 @@
#endif
void matrix_init_kb(void){
- /* MOSI pin*/
- palSetPadMode(GPIOB, 15, PAL_MODE_STM32_ALTERNATE_PUSHPULL);
LED_ON();
wait_ms(500);
LED_OFF();
-
-#ifdef RGBLIGHT_ENABLE
- leds_init();
-#endif
-}
-
-void matrix_scan_kb(void)
-{
- #ifdef RGBLIGHT_ENABLE
- rgblight_task();
- #endif
}
diff --git a/keyboards/cannonkeys/bluepill/led.c b/keyboards/cannonkeys/bluepill/led.c
deleted file mode 100644
index a9ede5bbaa8..00000000000
--- a/keyboards/cannonkeys/bluepill/led.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
-Copyright 2012 Jun Wako
-
-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 .
-*/
-
-#include "hal.h"
-#include "backlight.h"
-#include "led.h"
-#include "led_custom.h"
-#include "printf.h"
-
-static void breathing_callback(PWMDriver *pwmp);
-
-static PWMConfig pwmCFG = {
- 0xFFFF, /* PWM clock frequency */
- 256, /* PWM period (in ticks) 1S (1/10kHz=0.1mS 0.1ms*10000 ticks=1S) */
- NULL, /* No Callback */
- {
- {PWM_OUTPUT_ACTIVE_HIGH, NULL}, /* Enable Channel 0 */
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL}
- },
- 0, /* HW dependent part.*/
- 0
-};
-
-static PWMConfig pwmCFG_breathing = {
- 0xFFFF, /* 10kHz PWM clock frequency */
- 256, /* PWM period (in ticks) 1S (1/10kHz=0.1mS 0.1ms*10000 ticks=1S) */
- breathing_callback, /* Breathing Callback */
- {
- {PWM_OUTPUT_ACTIVE_HIGH, NULL}, /* Enable Channel 0 */
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL}
- },
- 0, /* HW dependent part.*/
- 0
-};
-
-// See http://jared.geek.nz/2013/feb/linear-led-pwm
-static uint16_t cie_lightness(uint16_t v) {
- if (v <= 5243) // if below 8% of max
- return v / 9; // same as dividing by 900%
- else {
- uint32_t y = (((uint32_t) v + 10486) << 8) / (10486 + 0xFFFFUL); // add 16% of max and compare
- // to get a useful result with integer division, we shift left in the expression above
- // and revert what we've done again after squaring.
- y = y * y * y >> 8;
- if (y > 0xFFFFUL) // prevent overflow
- return 0xFFFFU;
- else
- return (uint16_t) y;
- }
-}
-
-
-void backlight_init_ports(void) {
- printf("backlight_init_ports()\n");
- #ifdef BACKLIGHT_ENABLE
-
- palSetPadMode(GPIOA, 8, PAL_MODE_STM32_ALTERNATE_PUSHPULL);
- pwmStart(&PWMD1, &pwmCFG);
- pwmEnableChannel(&PWMD1, 0, PWM_FRACTION_TO_WIDTH(&PWMD1, 0xFFFF,cie_lightness(0xFFFF)));
- #endif
-}
-
-void backlight_set(uint8_t level) {
- printf("backlight_set(%d)\n", level);
- #ifdef BACKLIGHT_ENABLE
- uint32_t duty = (uint32_t)(cie_lightness(0xFFFF * (uint32_t) level / BACKLIGHT_LEVELS));
- printf("duty: (%d)\n", duty);
- if (level == 0) {
- // Turn backlight off
- pwmDisableChannel(&PWMD1, 0);
- } else {
- // Turn backlight on
- if(!is_breathing()){
- pwmEnableChannel(&PWMD1, 0, PWM_FRACTION_TO_WIDTH(&PWMD1,0xFFFF,duty));
- }
- }
- #endif
-}
-
-
-uint8_t backlight_tick = 0;
-
-void backlight_task(void) {
-}
-
-#define BREATHING_NO_HALT 0
-#define BREATHING_HALT_OFF 1
-#define BREATHING_HALT_ON 2
-#define BREATHING_STEPS 128
-
-static uint8_t breathing_period = BREATHING_PERIOD;
-static uint8_t breathing_halt = BREATHING_NO_HALT;
-static uint16_t breathing_counter = 0;
-
-bool is_breathing(void) {
- return PWMD1.config == &pwmCFG_breathing;
-}
-
-#define breathing_min() do {breathing_counter = 0;} while (0)
-#define breathing_max() do {breathing_counter = breathing_period * 256 / 2;} while (0)
-
-
-void breathing_interrupt_enable(void){
- pwmStop(&PWMD1);
- printf("starting with callback\n");
- pwmStart(&PWMD1, &pwmCFG_breathing);
- chSysLockFromISR();
- pwmEnablePeriodicNotification(&PWMD1);
- pwmEnableChannelI(
- &PWMD1,
- 0,
- PWM_FRACTION_TO_WIDTH(
- &PWMD1,
- 0xFFFF,
- 0xFFFF
- )
- );
- chSysUnlockFromISR();
-}
-
-void breathing_interrupt_disable(void){
- pwmStop(&PWMD1);
- printf("starting without callback\n");
- pwmStart(&PWMD1, &pwmCFG);
-}
-
-void breathing_enable(void)
-{
- printf("breathing_enable()\n");
- breathing_counter = 0;
- breathing_halt = BREATHING_NO_HALT;
- breathing_interrupt_enable();
-}
-
-void breathing_pulse(void)
-{
- if (get_backlight_level() == 0)
- breathing_min();
- else
- breathing_max();
- breathing_halt = BREATHING_HALT_ON;
- breathing_interrupt_enable();
-}
-
-void breathing_disable(void)
-{
- printf("breathing_disable()\n");
- breathing_interrupt_disable();
- // Restore backlight level
- backlight_set(get_backlight_level());
-}
-
-void breathing_self_disable(void)
-{
- if (get_backlight_level() == 0)
- breathing_halt = BREATHING_HALT_OFF;
- else
- breathing_halt = BREATHING_HALT_ON;
-}
-
-void breathing_toggle(void) {
- if (is_breathing()){
- printf("disable breathing\n");
- breathing_disable();
- } else {
- printf("enable breathing\n");
- breathing_enable();
- }
-}
-
-void breathing_period_set(uint8_t value)
-{
- if (!value)
- value = 1;
- breathing_period = value;
-}
-
-void breathing_period_default(void) {
- breathing_period_set(BREATHING_PERIOD);
-}
-
-void breathing_period_inc(void)
-{
- breathing_period_set(breathing_period+1);
-}
-
-void breathing_period_dec(void)
-{
- breathing_period_set(breathing_period-1);
-}
-
-/* To generate breathing curve in python:
- * from math import sin, pi; [int(sin(x/128.0*pi)**4*255) for x in range(128)]
- */
-static const uint8_t breathing_table[BREATHING_STEPS] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 17, 20, 24, 28, 32, 36, 41, 46, 51, 57, 63, 70, 76, 83, 91, 98, 106, 113, 121, 129, 138, 146, 154, 162, 170, 178, 185, 193, 200, 207, 213, 220, 225, 231, 235, 240, 244, 247, 250, 252, 253, 254, 255, 254, 253, 252, 250, 247, 244, 240, 235, 231, 225, 220, 213, 207, 200, 193, 185, 178, 170, 162, 154, 146, 138, 129, 121, 113, 106, 98, 91, 83, 76, 70, 63, 57, 51, 46, 41, 36, 32, 28, 24, 20, 17, 15, 12, 10, 8, 6, 5, 4, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-
-// Use this before the cie_lightness function.
-static inline uint16_t scale_backlight(uint16_t v) {
- return v / BACKLIGHT_LEVELS * get_backlight_level();
-}
-
-static void breathing_callback(PWMDriver *pwmp)
-{
- (void)pwmp;
- uint16_t interval = (uint16_t) breathing_period * 256 / BREATHING_STEPS;
- // resetting after one period to prevent ugly reset at overflow.
- breathing_counter = (breathing_counter + 1) % (breathing_period * 256);
- uint8_t index = breathing_counter / interval % BREATHING_STEPS;
-
- if (((breathing_halt == BREATHING_HALT_ON) && (index == BREATHING_STEPS / 2)) ||
- ((breathing_halt == BREATHING_HALT_OFF) && (index == BREATHING_STEPS - 1)))
- {
- breathing_interrupt_disable();
- }
-
- uint32_t duty = cie_lightness(scale_backlight(breathing_table[index] * 256));
-
- chSysLockFromISR();
- pwmEnableChannelI(
- &PWMD1,
- 0,
- PWM_FRACTION_TO_WIDTH(
- &PWMD1,
- 0xFFFF,
- duty
- )
- );
- chSysUnlockFromISR();
-}
-
-
-void led_set(uint8_t usb_led)
-{
- if (usb_led & (1<OTYPER = config->otyper;
- gpiop->OSPEEDR = config->ospeedr;
- gpiop->PUPDR = config->pupdr;
- gpiop->ODR = config->odr;
- gpiop->AFRL = config->afrl;
- gpiop->AFRH = config->afrh;
- gpiop->MODER = config->moder;
-}
-
-static void stm32_gpio_init(void) {
-
- /* Enabling GPIO-related clocks, the mask comes from the
- registry header file.*/
- rccResetAHB(STM32_GPIO_EN_MASK);
- rccEnableAHB(STM32_GPIO_EN_MASK, true);
-
- /* Initializing all the defined GPIO ports.*/
-#if STM32_HAS_GPIOA
- gpio_init(GPIOA, &gpio_default_config.PAData);
-#endif
-#if STM32_HAS_GPIOB
- gpio_init(GPIOB, &gpio_default_config.PBData);
-#endif
-#if STM32_HAS_GPIOC
- gpio_init(GPIOC, &gpio_default_config.PCData);
-#endif
-#if STM32_HAS_GPIOD
- gpio_init(GPIOD, &gpio_default_config.PDData);
-#endif
-#if STM32_HAS_GPIOE
- gpio_init(GPIOE, &gpio_default_config.PEData);
-#endif
-#if STM32_HAS_GPIOF
- gpio_init(GPIOF, &gpio_default_config.PFData);
-#endif
-#if STM32_HAS_GPIOG
- gpio_init(GPIOG, &gpio_default_config.PGData);
-#endif
-#if STM32_HAS_GPIOH
- gpio_init(GPIOH, &gpio_default_config.PHData);
-#endif
-#if STM32_HAS_GPIOI
- gpio_init(GPIOI, &gpio_default_config.PIData);
-#endif
-#if STM32_HAS_GPIOJ
- gpio_init(GPIOJ, &gpio_default_config.PJData);
-#endif
-#if STM32_HAS_GPIOK
- gpio_init(GPIOK, &gpio_default_config.PKData);
-#endif
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Early initialization code.
- * @details GPIO ports and system clocks are initialized before everything
- * else.
- */
-void __early_init(void) {
- extern void enter_bootloader_mode_if_requested(void);
- enter_bootloader_mode_if_requested();
- stm32_gpio_init();
- stm32_clock_init();
-}
-
-#if HAL_USE_SDC || defined(__DOXYGEN__)
-/**
- * @brief SDC card detection.
- */
-bool sdc_lld_is_card_inserted(SDCDriver *sdcp) {
-
- (void)sdcp;
- /* TODO: Fill the implementation.*/
- return true;
-}
-
-/**
- * @brief SDC card write protection detection.
- */
-bool sdc_lld_is_write_protected(SDCDriver *sdcp) {
-
- (void)sdcp;
- /* TODO: Fill the implementation.*/
- return false;
-}
-#endif /* HAL_USE_SDC */
-
-#if HAL_USE_MMC_SPI || defined(__DOXYGEN__)
-/**
- * @brief MMC_SPI card detection.
- */
-bool mmc_lld_is_card_inserted(MMCDriver *mmcp) {
-
- (void)mmcp;
- /* TODO: Fill the implementation.*/
- return true;
-}
-
-/**
- * @brief MMC_SPI card write protection detection.
- */
-bool mmc_lld_is_write_protected(MMCDriver *mmcp) {
-
- (void)mmcp;
- /* TODO: Fill the implementation.*/
- return false;
-}
-#endif
-
-/**
- * @brief Board-specific initialization code.
- * @todo Add your board-specific code, if any.
- */
-void boardInit(void) {
- SYSCFG->CFGR1 |= SYSCFG_CFGR1_I2C1_DMA_RMP;
- SYSCFG->CFGR1 &= ~(SYSCFG_CFGR1_SPI2_DMA_RMP);
-}
diff --git a/keyboards/cannonkeys/chimera65/boards/ST_STM32F072B_DISCOVERY/board.h b/keyboards/cannonkeys/chimera65/boards/ST_STM32F072B_DISCOVERY/board.h
deleted file mode 100644
index 57636d1f12f..00000000000
--- a/keyboards/cannonkeys/chimera65/boards/ST_STM32F072B_DISCOVERY/board.h
+++ /dev/null
@@ -1,940 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/*
- * This file has been automatically generated using ChibiStudio board
- * generator plugin. Do not edit manually.
- */
-
-#ifndef BOARD_H
-#define BOARD_H
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*
- * Setup for ST STM32F072B-Discovery board.
- */
-
-/*
- * Board identifier.
- */
-#define BOARD_ST_STM32F072B_DISCOVERY
-#define BOARD_NAME "ST STM32F072B-Discovery"
-
-/*
- * Board oscillators-related settings.
- * NOTE: HSE not fitted.
- */
-#if !defined(STM32_LSECLK)
-#define STM32_LSECLK 32768
-#endif
-
-#define STM32_LSEDRV (3U << 3U)
-
-#if !defined(STM32_HSECLK)
-#define STM32_HSECLK 0U
-#endif
-
-#define STM32_HSE_BYPASS
-
-/*
- * MCU type as defined in the ST header.
- */
-#define STM32F072xB
-
-/*
- * IO pins assignments.
- */
-#define GPIOA_BUTTON 0U
-#define GPIOA_PIN1 1U
-#define GPIOA_PIN2 2U
-#define GPIOA_PIN3 3U
-#define GPIOA_PIN4 4U
-#define GPIOA_PIN5 5U
-#define GPIOA_PIN6 6U
-#define GPIOA_PIN7 7U
-#define GPIOA_PIN8 8U
-#define GPIOA_PIN9 9U
-#define GPIOA_PIN10 10U
-#define GPIOA_USB_DM 11U
-#define GPIOA_USB_DP 12U
-#define GPIOA_SWDIO 13U
-#define GPIOA_SWCLK 14U
-#define GPIOA_PIN15 15U
-
-#define GPIOB_PIN0 0U
-#define GPIOB_PIN1 1U
-#define GPIOB_PIN2 2U
-#define GPIOB_PIN3 3U
-#define GPIOB_PIN4 4U
-#define GPIOB_PIN5 5U
-#define GPIOB_PIN6 6U
-#define GPIOB_PIN7 7U
-#define GPIOB_PIN8 8U
-#define GPIOB_PIN9 9U
-#define GPIOB_PIN10 10U
-#define GPIOB_PIN11 11U
-#define GPIOB_PIN12 12U
-#define GPIOB_SPI2_SCK 13U
-#define GPIOB_SPI2_MISO 14U
-#define GPIOB_SPI2_MOSI 15U
-
-#define GPIOC_MEMS_CS 0U
-#define GPIOC_PIN1 1U
-#define GPIOC_PIN2 2U
-#define GPIOC_PIN3 3U
-#define GPIOC_PIN4 4U
-#define GPIOC_PIN5 5U
-#define GPIOC_LED_RED 6U
-#define GPIOC_LED_BLUE 7U
-#define GPIOC_LED_ORANGE 8U
-#define GPIOC_LED_GREEN 9U
-#define GPIOC_PIN10 10U
-#define GPIOC_PIN11 11U
-#define GPIOC_PIN12 12U
-#define GPIOC_PIN13 13U
-#define GPIOC_OSC32_IN 14U
-#define GPIOC_OSC32_OUT 15U
-
-#define GPIOD_PIN0 0U
-#define GPIOD_PIN1 1U
-#define GPIOD_PIN2 2U
-#define GPIOD_PIN3 3U
-#define GPIOD_PIN4 4U
-#define GPIOD_PIN5 5U
-#define GPIOD_PIN6 6U
-#define GPIOD_PIN7 7U
-#define GPIOD_PIN8 8U
-#define GPIOD_PIN9 9U
-#define GPIOD_PIN10 10U
-#define GPIOD_PIN11 11U
-#define GPIOD_PIN12 12U
-#define GPIOD_PIN13 13U
-#define GPIOD_PIN14 14U
-#define GPIOD_PIN15 15U
-
-#define GPIOE_PIN0 0U
-#define GPIOE_PIN1 1U
-#define GPIOE_PIN2 2U
-#define GPIOE_PIN3 3U
-#define GPIOE_PIN4 4U
-#define GPIOE_PIN5 5U
-#define GPIOE_PIN6 6U
-#define GPIOE_PIN7 7U
-#define GPIOE_PIN8 8U
-#define GPIOE_PIN9 9U
-#define GPIOE_PIN10 10U
-#define GPIOE_PIN11 11U
-#define GPIOE_PIN12 12U
-#define GPIOE_PIN13 13U
-#define GPIOE_PIN14 14U
-#define GPIOE_PIN15 15U
-
-#define GPIOF_OSC_IN 0U
-#define GPIOF_OSC_OUT 1U
-#define GPIOF_PIN2 2U
-#define GPIOF_PIN3 3U
-#define GPIOF_PIN4 4U
-#define GPIOF_PIN5 5U
-#define GPIOF_PIN6 6U
-#define GPIOF_PIN7 7U
-#define GPIOF_PIN8 8U
-#define GPIOF_PIN9 9U
-#define GPIOF_PIN10 10U
-#define GPIOF_PIN11 11U
-#define GPIOF_PIN12 12U
-#define GPIOF_PIN13 13U
-#define GPIOF_PIN14 14U
-#define GPIOF_PIN15 15U
-
-/*
- * IO lines assignments.
- */
-#define LINE_BUTTON PAL_LINE(GPIOA, 0U)
-#define LINE_USB_DM PAL_LINE(GPIOA, 11U)
-#define LINE_USB_DP PAL_LINE(GPIOA, 12U)
-#define LINE_SWDIO PAL_LINE(GPIOA, 13U)
-#define LINE_SWCLK PAL_LINE(GPIOA, 14U)
-#define LINE_SPI2_SCK PAL_LINE(GPIOB, 13U)
-#define LINE_SPI2_MISO PAL_LINE(GPIOB, 14U)
-#define LINE_SPI2_MOSI PAL_LINE(GPIOB, 15U)
-#define LINE_MEMS_CS PAL_LINE(GPIOC, 0U)
-#define LINE_LED_RED PAL_LINE(GPIOC, 6U)
-#define LINE_LED_BLUE PAL_LINE(GPIOC, 7U)
-#define LINE_LED_ORANGE PAL_LINE(GPIOC, 8U)
-#define LINE_LED_GREEN PAL_LINE(GPIOC, 9U)
-#define LINE_OSC32_IN PAL_LINE(GPIOC, 14U)
-#define LINE_OSC32_OUT PAL_LINE(GPIOC, 15U)
-#define LINE_OSC_IN PAL_LINE(GPIOF, 0U)
-#define LINE_OSC_OUT PAL_LINE(GPIOF, 1U)
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/*
- * I/O ports initial setup, this configuration is established soon after reset
- * in the initialization code.
- * Please refer to the STM32 Reference Manual for details.
- */
-#define PIN_MODE_INPUT(n) (0U << ((n) * 2U))
-#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U))
-#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U))
-#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U))
-#define PIN_ODR_LOW(n) (0U << (n))
-#define PIN_ODR_HIGH(n) (1U << (n))
-#define PIN_OTYPE_PUSHPULL(n) (0U << (n))
-#define PIN_OTYPE_OPENDRAIN(n) (1U << (n))
-#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U))
-#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U))
-#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U))
-#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U))
-#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U))
-#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U))
-#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U))
-#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U))
-
-/*
- * GPIOA setup:
- *
- * PA0 - BUTTON (input floating).
- * PA1 - PIN1 (input pullup).
- * PA2 - PIN2 (input pullup).
- * PA3 - PIN3 (input pullup).
- * PA4 - PIN4 (input pullup).
- * PA5 - PIN5 (input pullup).
- * PA6 - PIN6 (input pullup).
- * PA7 - PIN7 (input pullup).
- * PA8 - PIN8 (input pullup).
- * PA9 - PIN9 (input pullup).
- * PA10 - PIN10 (input pullup).
- * PA11 - USB_DM (input floating).
- * PA12 - USB_DP (input floating).
- * PA13 - SWDIO (alternate 0).
- * PA14 - SWCLK (alternate 0).
- * PA15 - PIN15 (input pullup).
- */
-#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \
- PIN_MODE_INPUT(GPIOA_PIN1) | \
- PIN_MODE_INPUT(GPIOA_PIN2) | \
- PIN_MODE_INPUT(GPIOA_PIN3) | \
- PIN_MODE_INPUT(GPIOA_PIN4) | \
- PIN_MODE_INPUT(GPIOA_PIN5) | \
- PIN_MODE_INPUT(GPIOA_PIN6) | \
- PIN_MODE_INPUT(GPIOA_PIN7) | \
- PIN_MODE_INPUT(GPIOA_PIN8) | \
- PIN_MODE_INPUT(GPIOA_PIN9) | \
- PIN_MODE_INPUT(GPIOA_PIN10) | \
- PIN_MODE_INPUT(GPIOA_USB_DM) | \
- PIN_MODE_INPUT(GPIOA_USB_DP) | \
- PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \
- PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \
- PIN_MODE_INPUT(GPIOA_PIN15))
-#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_BUTTON) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \
- PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \
- PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \
- PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN15))
-#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_BUTTON) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOA_USB_DM) | \
- PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \
- PIN_OSPEED_HIGH(GPIOA_SWDIO) | \
- PIN_OSPEED_HIGH(GPIOA_SWCLK) | \
- PIN_OSPEED_HIGH(GPIOA_PIN15))
-#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN10) | \
- PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \
- PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \
- PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \
- PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN15))
-#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_BUTTON) | \
- PIN_ODR_HIGH(GPIOA_PIN1) | \
- PIN_ODR_HIGH(GPIOA_PIN2) | \
- PIN_ODR_HIGH(GPIOA_PIN3) | \
- PIN_ODR_HIGH(GPIOA_PIN4) | \
- PIN_ODR_HIGH(GPIOA_PIN5) | \
- PIN_ODR_HIGH(GPIOA_PIN6) | \
- PIN_ODR_HIGH(GPIOA_PIN7) | \
- PIN_ODR_HIGH(GPIOA_PIN8) | \
- PIN_ODR_HIGH(GPIOA_PIN9) | \
- PIN_ODR_HIGH(GPIOA_PIN10) | \
- PIN_ODR_HIGH(GPIOA_USB_DM) | \
- PIN_ODR_HIGH(GPIOA_USB_DP) | \
- PIN_ODR_HIGH(GPIOA_SWDIO) | \
- PIN_ODR_HIGH(GPIOA_SWCLK) | \
- PIN_ODR_HIGH(GPIOA_PIN15))
-#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_BUTTON, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN7, 0U))
-#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOA_USB_DM, 0U) | \
- PIN_AFIO_AF(GPIOA_USB_DP, 0U) | \
- PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \
- PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN15, 0U))
-
-/*
- * GPIOB setup:
- *
- * PB0 - PIN0 (input pullup).
- * PB1 - PIN1 (input pullup).
- * PB2 - PIN2 (input pullup).
- * PB3 - PIN3 (input pullup).
- * PB4 - PIN4 (input pullup).
- * PB5 - PIN5 (input pullup).
- * PB6 - PIN6 (input pullup).
- * PB7 - PIN7 (input pullup).
- * PB8 - PIN8 (input pullup).
- * PB9 - PIN9 (input pullup).
- * PB10 - PIN10 (input pullup).
- * PB11 - PIN11 (input pullup).
- * PB12 - PIN12 (input pullup).
- * PB13 - SPI2_SCK (alternate 0).
- * PB14 - SPI2_MISO (alternate 0).
- * PB15 - SPI2_MOSI (alternate 0).
- */
-#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \
- PIN_MODE_INPUT(GPIOB_PIN1) | \
- PIN_MODE_INPUT(GPIOB_PIN2) | \
- PIN_MODE_INPUT(GPIOB_PIN3) | \
- PIN_MODE_INPUT(GPIOB_PIN4) | \
- PIN_MODE_INPUT(GPIOB_PIN5) | \
- PIN_MODE_INPUT(GPIOB_PIN6) | \
- PIN_MODE_INPUT(GPIOB_PIN7) | \
- PIN_MODE_INPUT(GPIOB_PIN8) | \
- PIN_MODE_INPUT(GPIOB_PIN9) | \
- PIN_MODE_INPUT(GPIOB_PIN10) | \
- PIN_MODE_INPUT(GPIOB_PIN11) | \
- PIN_MODE_INPUT(GPIOB_PIN12) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_SCK) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_MISO) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_SCK) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MISO) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \
- PIN_OSPEED_HIGH(GPIOB_PIN2) | \
- PIN_OSPEED_HIGH(GPIOB_PIN3) | \
- PIN_OSPEED_HIGH(GPIOB_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_SCK) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_MISO) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN12) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_SCK) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_MISO) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \
- PIN_ODR_HIGH(GPIOB_PIN1) | \
- PIN_ODR_HIGH(GPIOB_PIN2) | \
- PIN_ODR_HIGH(GPIOB_PIN3) | \
- PIN_ODR_HIGH(GPIOB_PIN4) | \
- PIN_ODR_HIGH(GPIOB_PIN5) | \
- PIN_ODR_HIGH(GPIOB_PIN6) | \
- PIN_ODR_HIGH(GPIOB_PIN7) | \
- PIN_ODR_HIGH(GPIOB_PIN8) | \
- PIN_ODR_HIGH(GPIOB_PIN9) | \
- PIN_ODR_HIGH(GPIOB_PIN10) | \
- PIN_ODR_HIGH(GPIOB_PIN11) | \
- PIN_ODR_HIGH(GPIOB_PIN12) | \
- PIN_ODR_HIGH(GPIOB_SPI2_SCK) | \
- PIN_ODR_HIGH(GPIOB_SPI2_MISO) | \
- PIN_ODR_HIGH(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN7, 0U))
-#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_SCK, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_MISO, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_MOSI, 0U))
-
-/*
- * GPIOC setup:
- *
- * PC0 - MEMS_CS (output pushpull maximum).
- * PC1 - PIN1 (input pullup).
- * PC2 - PIN2 (input pullup).
- * PC3 - PIN3 (input pullup).
- * PC4 - PIN4 (input pullup).
- * PC5 - PIN5 (input pullup).
- * PC6 - LED_RED (output pushpull maximum).
- * PC7 - LED_BLUE (output pushpull maximum).
- * PC8 - LED_ORANGE (output pushpull maximum).
- * PC9 - LED_GREEN (output pushpull maximum).
- * PC10 - PIN10 (input pullup).
- * PC11 - PIN11 (input pullup).
- * PC12 - PIN12 (input pullup).
- * PC13 - PIN13 (input pullup).
- * PC14 - OSC32_IN (input floating).
- * PC15 - OSC32_OUT (input floating).
- */
-#define VAL_GPIOC_MODER (PIN_MODE_OUTPUT(GPIOC_MEMS_CS) | \
- PIN_MODE_INPUT(GPIOC_PIN1) | \
- PIN_MODE_INPUT(GPIOC_PIN2) | \
- PIN_MODE_INPUT(GPIOC_PIN3) | \
- PIN_MODE_INPUT(GPIOC_PIN4) | \
- PIN_MODE_INPUT(GPIOC_PIN5) | \
- PIN_MODE_OUTPUT(GPIOC_LED_RED) | \
- PIN_MODE_OUTPUT(GPIOC_LED_BLUE) | \
- PIN_MODE_OUTPUT(GPIOC_LED_ORANGE) | \
- PIN_MODE_OUTPUT(GPIOC_LED_GREEN) | \
- PIN_MODE_INPUT(GPIOC_PIN10) | \
- PIN_MODE_INPUT(GPIOC_PIN11) | \
- PIN_MODE_INPUT(GPIOC_PIN12) | \
- PIN_MODE_INPUT(GPIOC_PIN13) | \
- PIN_MODE_INPUT(GPIOC_OSC32_IN) | \
- PIN_MODE_INPUT(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_MEMS_CS) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_RED) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_BLUE) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_ORANGE) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_GREEN) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \
- PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_MEMS_CS) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \
- PIN_OSPEED_HIGH(GPIOC_LED_RED) | \
- PIN_OSPEED_HIGH(GPIOC_LED_BLUE) | \
- PIN_OSPEED_HIGH(GPIOC_LED_ORANGE) | \
- PIN_OSPEED_HIGH(GPIOC_LED_GREEN) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \
- PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \
- PIN_OSPEED_HIGH(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_MEMS_CS) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN5) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_RED) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_BLUE) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_ORANGE) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_GREEN) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN13) | \
- PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \
- PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_MEMS_CS) | \
- PIN_ODR_HIGH(GPIOC_PIN1) | \
- PIN_ODR_HIGH(GPIOC_PIN2) | \
- PIN_ODR_HIGH(GPIOC_PIN3) | \
- PIN_ODR_HIGH(GPIOC_PIN4) | \
- PIN_ODR_HIGH(GPIOC_PIN5) | \
- PIN_ODR_LOW(GPIOC_LED_RED) | \
- PIN_ODR_LOW(GPIOC_LED_BLUE) | \
- PIN_ODR_LOW(GPIOC_LED_ORANGE) | \
- PIN_ODR_LOW(GPIOC_LED_GREEN) | \
- PIN_ODR_HIGH(GPIOC_PIN10) | \
- PIN_ODR_HIGH(GPIOC_PIN11) | \
- PIN_ODR_HIGH(GPIOC_PIN12) | \
- PIN_ODR_HIGH(GPIOC_PIN13) | \
- PIN_ODR_HIGH(GPIOC_OSC32_IN) | \
- PIN_ODR_HIGH(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_MEMS_CS, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_RED, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_BLUE, 0U))
-#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_LED_ORANGE, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_GREEN, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \
- PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U))
-
-/*
- * GPIOD setup:
- *
- * PD0 - PIN0 (input pullup).
- * PD1 - PIN1 (input pullup).
- * PD2 - PIN2 (input pullup).
- * PD3 - PIN3 (input pullup).
- * PD4 - PIN4 (input pullup).
- * PD5 - PIN5 (input pullup).
- * PD6 - PIN6 (input pullup).
- * PD7 - PIN7 (input pullup).
- * PD8 - PIN8 (input pullup).
- * PD9 - PIN9 (input pullup).
- * PD10 - PIN10 (input pullup).
- * PD11 - PIN11 (input pullup).
- * PD12 - PIN12 (input pullup).
- * PD13 - PIN13 (input pullup).
- * PD14 - PIN14 (input pullup).
- * PD15 - PIN15 (input pullup).
- */
-#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \
- PIN_MODE_INPUT(GPIOD_PIN1) | \
- PIN_MODE_INPUT(GPIOD_PIN2) | \
- PIN_MODE_INPUT(GPIOD_PIN3) | \
- PIN_MODE_INPUT(GPIOD_PIN4) | \
- PIN_MODE_INPUT(GPIOD_PIN5) | \
- PIN_MODE_INPUT(GPIOD_PIN6) | \
- PIN_MODE_INPUT(GPIOD_PIN7) | \
- PIN_MODE_INPUT(GPIOD_PIN8) | \
- PIN_MODE_INPUT(GPIOD_PIN9) | \
- PIN_MODE_INPUT(GPIOD_PIN10) | \
- PIN_MODE_INPUT(GPIOD_PIN11) | \
- PIN_MODE_INPUT(GPIOD_PIN12) | \
- PIN_MODE_INPUT(GPIOD_PIN13) | \
- PIN_MODE_INPUT(GPIOD_PIN14) | \
- PIN_MODE_INPUT(GPIOD_PIN15))
-#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN15))
-#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN15))
-#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN15))
-#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \
- PIN_ODR_HIGH(GPIOD_PIN1) | \
- PIN_ODR_HIGH(GPIOD_PIN2) | \
- PIN_ODR_HIGH(GPIOD_PIN3) | \
- PIN_ODR_HIGH(GPIOD_PIN4) | \
- PIN_ODR_HIGH(GPIOD_PIN5) | \
- PIN_ODR_HIGH(GPIOD_PIN6) | \
- PIN_ODR_HIGH(GPIOD_PIN7) | \
- PIN_ODR_HIGH(GPIOD_PIN8) | \
- PIN_ODR_HIGH(GPIOD_PIN9) | \
- PIN_ODR_HIGH(GPIOD_PIN10) | \
- PIN_ODR_HIGH(GPIOD_PIN11) | \
- PIN_ODR_HIGH(GPIOD_PIN12) | \
- PIN_ODR_HIGH(GPIOD_PIN13) | \
- PIN_ODR_HIGH(GPIOD_PIN14) | \
- PIN_ODR_HIGH(GPIOD_PIN15))
-#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN7, 0U))
-#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN15, 0U))
-
-/*
- * GPIOE setup:
- *
- * PE0 - PIN0 (input pullup).
- * PE1 - PIN1 (input pullup).
- * PE2 - PIN2 (input pullup).
- * PE3 - PIN3 (input pullup).
- * PE4 - PIN4 (input pullup).
- * PE5 - PIN5 (input pullup).
- * PE6 - PIN6 (input pullup).
- * PE7 - PIN7 (input pullup).
- * PE8 - PIN8 (input pullup).
- * PE9 - PIN9 (input pullup).
- * PE10 - PIN10 (input pullup).
- * PE11 - PIN11 (input pullup).
- * PE12 - PIN12 (input pullup).
- * PE13 - PIN13 (input pullup).
- * PE14 - PIN14 (input pullup).
- * PE15 - PIN15 (input pullup).
- */
-#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \
- PIN_MODE_INPUT(GPIOE_PIN1) | \
- PIN_MODE_INPUT(GPIOE_PIN2) | \
- PIN_MODE_INPUT(GPIOE_PIN3) | \
- PIN_MODE_INPUT(GPIOE_PIN4) | \
- PIN_MODE_INPUT(GPIOE_PIN5) | \
- PIN_MODE_INPUT(GPIOE_PIN6) | \
- PIN_MODE_INPUT(GPIOE_PIN7) | \
- PIN_MODE_INPUT(GPIOE_PIN8) | \
- PIN_MODE_INPUT(GPIOE_PIN9) | \
- PIN_MODE_INPUT(GPIOE_PIN10) | \
- PIN_MODE_INPUT(GPIOE_PIN11) | \
- PIN_MODE_INPUT(GPIOE_PIN12) | \
- PIN_MODE_INPUT(GPIOE_PIN13) | \
- PIN_MODE_INPUT(GPIOE_PIN14) | \
- PIN_MODE_INPUT(GPIOE_PIN15))
-#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN15))
-#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN15))
-#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN15))
-#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \
- PIN_ODR_HIGH(GPIOE_PIN1) | \
- PIN_ODR_HIGH(GPIOE_PIN2) | \
- PIN_ODR_HIGH(GPIOE_PIN3) | \
- PIN_ODR_HIGH(GPIOE_PIN4) | \
- PIN_ODR_HIGH(GPIOE_PIN5) | \
- PIN_ODR_HIGH(GPIOE_PIN6) | \
- PIN_ODR_HIGH(GPIOE_PIN7) | \
- PIN_ODR_HIGH(GPIOE_PIN8) | \
- PIN_ODR_HIGH(GPIOE_PIN9) | \
- PIN_ODR_HIGH(GPIOE_PIN10) | \
- PIN_ODR_HIGH(GPIOE_PIN11) | \
- PIN_ODR_HIGH(GPIOE_PIN12) | \
- PIN_ODR_HIGH(GPIOE_PIN13) | \
- PIN_ODR_HIGH(GPIOE_PIN14) | \
- PIN_ODR_HIGH(GPIOE_PIN15))
-#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN7, 0U))
-#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN15, 0U))
-
-/*
- * GPIOF setup:
- *
- * PF0 - OSC_IN (input floating).
- * PF1 - OSC_OUT (input floating).
- * PF2 - PIN2 (input pullup).
- * PF3 - PIN3 (input pullup).
- * PF4 - PIN4 (input pullup).
- * PF5 - PIN5 (input pullup).
- * PF6 - PIN6 (input pullup).
- * PF7 - PIN7 (input pullup).
- * PF8 - PIN8 (input pullup).
- * PF9 - PIN9 (input pullup).
- * PF10 - PIN10 (input pullup).
- * PF11 - PIN11 (input pullup).
- * PF12 - PIN12 (input pullup).
- * PF13 - PIN13 (input pullup).
- * PF14 - PIN14 (input pullup).
- * PF15 - PIN15 (input pullup).
- */
-#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \
- PIN_MODE_INPUT(GPIOF_OSC_OUT) | \
- PIN_MODE_INPUT(GPIOF_PIN2) | \
- PIN_MODE_INPUT(GPIOF_PIN3) | \
- PIN_MODE_INPUT(GPIOF_PIN4) | \
- PIN_MODE_INPUT(GPIOF_PIN5) | \
- PIN_MODE_INPUT(GPIOF_PIN6) | \
- PIN_MODE_INPUT(GPIOF_PIN7) | \
- PIN_MODE_INPUT(GPIOF_PIN8) | \
- PIN_MODE_INPUT(GPIOF_PIN9) | \
- PIN_MODE_INPUT(GPIOF_PIN10) | \
- PIN_MODE_INPUT(GPIOF_PIN11) | \
- PIN_MODE_INPUT(GPIOF_PIN12) | \
- PIN_MODE_INPUT(GPIOF_PIN13) | \
- PIN_MODE_INPUT(GPIOF_PIN14) | \
- PIN_MODE_INPUT(GPIOF_PIN15))
-#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \
- PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN15))
-#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOF_OSC_IN) | \
- PIN_OSPEED_VERYLOW(GPIOF_OSC_OUT) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN15))
-#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \
- PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN15))
-#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \
- PIN_ODR_HIGH(GPIOF_OSC_OUT) | \
- PIN_ODR_HIGH(GPIOF_PIN2) | \
- PIN_ODR_HIGH(GPIOF_PIN3) | \
- PIN_ODR_HIGH(GPIOF_PIN4) | \
- PIN_ODR_HIGH(GPIOF_PIN5) | \
- PIN_ODR_HIGH(GPIOF_PIN6) | \
- PIN_ODR_HIGH(GPIOF_PIN7) | \
- PIN_ODR_HIGH(GPIOF_PIN8) | \
- PIN_ODR_HIGH(GPIOF_PIN9) | \
- PIN_ODR_HIGH(GPIOF_PIN10) | \
- PIN_ODR_HIGH(GPIOF_PIN11) | \
- PIN_ODR_HIGH(GPIOF_PIN12) | \
- PIN_ODR_HIGH(GPIOF_PIN13) | \
- PIN_ODR_HIGH(GPIOF_PIN14) | \
- PIN_ODR_HIGH(GPIOF_PIN15))
-#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \
- PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN7, 0U))
-#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN15, 0U))
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#if !defined(_FROM_ASM_)
-#ifdef __cplusplus
-extern "C" {
-#endif
- void boardInit(void);
-#ifdef __cplusplus
-}
-#endif
-#endif /* _FROM_ASM_ */
-
-#endif /* BOARD_H */
diff --git a/keyboards/cannonkeys/chimera65/boards/ST_STM32F072B_DISCOVERY/board.mk b/keyboards/cannonkeys/chimera65/boards/ST_STM32F072B_DISCOVERY/board.mk
deleted file mode 100644
index b98dcdd26c6..00000000000
--- a/keyboards/cannonkeys/chimera65/boards/ST_STM32F072B_DISCOVERY/board.mk
+++ /dev/null
@@ -1,5 +0,0 @@
-# List of all the board related files.
-BOARDSRC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY/board.c
-
-# Required include directories
-BOARDINC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY
diff --git a/keyboards/cannonkeys/chimera65/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg b/keyboards/cannonkeys/chimera65/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg
deleted file mode 100644
index 9c7cf4fd76a..00000000000
--- a/keyboards/cannonkeys/chimera65/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg
+++ /dev/null
@@ -1,703 +0,0 @@
-
-
-
-
- resources/gencfg/processors/boards/stm32f0xx/templates
- ..
- 3.0.x
-
- ST STM32F072B-Discovery
- ST_STM32F072B_DISCOVERY
-
- STM32F072xB
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/keyboards/cannonkeys/chimera65/chconf.h b/keyboards/cannonkeys/chimera65/chconf.h
index 4640ff5332b..03f63da36a8 100644
--- a/keyboards/cannonkeys/chimera65/chconf.h
+++ b/keyboards/cannonkeys/chimera65/chconf.h
@@ -331,7 +331,7 @@
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE FALSE
+#define CH_CFG_USE_MEMCORE TRUE
#endif
/**
diff --git a/keyboards/cannonkeys/chimera65/config.h b/keyboards/cannonkeys/chimera65/config.h
index 663d9cca9a5..d4338fb0a0e 100644
--- a/keyboards/cannonkeys/chimera65/config.h
+++ b/keyboards/cannonkeys/chimera65/config.h
@@ -33,6 +33,10 @@ along with this program. If not, see .
#define MATRIX_ROW_PINS { A13, A14, A15, C13, B8 }
#define DIODE_DIRECTION COL2ROW
+#define BACKLIGHT_PIN A6
+#define BACKLIGHT_PWM_DRIVER PWMD3
+#define BACKLIGHT_PWM_CHANNEL 1
+#define BACKLIGHT_PAL_MODE 1
#define BACKLIGHT_LEVELS 6
#define BACKLIGHT_BREATHING
#define BREATHING_PERIOD 6
diff --git a/keyboards/cannonkeys/chimera65/rules.mk b/keyboards/cannonkeys/chimera65/rules.mk
index 795e2baf8d9..4d940da78d8 100644
--- a/keyboards/cannonkeys/chimera65/rules.mk
+++ b/keyboards/cannonkeys/chimera65/rules.mk
@@ -1,15 +1,10 @@
# MCU name
MCU = STM32F072
-BOARD = ST_STM32F072B_DISCOVERY
# Build Options
# comment out to disable the options.
#
-# project specific files
-VPATH += keyboards/cannonkeys/stm32f072
-SRC = keyboard.c \
- led.c
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
@@ -19,7 +14,7 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover
CUSTOM_MATRIX = no # Custom matrix file
-# BACKLIGHT_ENABLE = yes # This is broken on 072 for some reason
+BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = no
diff --git a/keyboards/cannonkeys/db60/chconf.h b/keyboards/cannonkeys/db60/chconf.h
new file mode 100644
index 00000000000..03f63da36a8
--- /dev/null
+++ b/keyboards/cannonkeys/db60/chconf.h
@@ -0,0 +1,714 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file rt/templates/chconf.h
+ * @brief Configuration file template.
+ * @details A copy of this file must be placed in each project directory, it
+ * contains the application specific kernel settings.
+ *
+ * @addtogroup config
+ * @details Kernel related settings and hooks.
+ * @{
+ */
+
+#ifndef CHCONF_H
+#define CHCONF_H
+
+#define _CHIBIOS_RT_CONF_
+#define _CHIBIOS_RT_CONF_VER_6_0_
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System time counter resolution.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_ST_RESOLUTION)
+#define CH_CFG_ST_RESOLUTION 32
+#endif
+
+/**
+ * @brief System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ * setting also defines the system tick time unit.
+ */
+#if !defined(CH_CFG_ST_FREQUENCY)
+#define CH_CFG_ST_FREQUENCY 10000
+#endif
+
+/**
+ * @brief Time intervals data size.
+ * @note Allowed values are 16, 32 or 64 bits.
+ */
+#if !defined(CH_CFG_INTERVALS_SIZE)
+#define CH_CFG_INTERVALS_SIZE 32
+#endif
+
+/**
+ * @brief Time types data size.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_TIME_TYPES_SIZE)
+#define CH_CFG_TIME_TYPES_SIZE 32
+#endif
+
+/**
+ * @brief Time delta constant for the tick-less mode.
+ * @note If this value is zero then the system uses the classic
+ * periodic tick. This value represents the minimum number
+ * of ticks that is safe to specify in a timeout directive.
+ * The value one is not valid, timeouts are rounded up to
+ * this value.
+ */
+#if !defined(CH_CFG_ST_TIMEDELTA)
+#define CH_CFG_ST_TIMEDELTA 2
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel parameters and options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Round robin interval.
+ * @details This constant is the number of system ticks allowed for the
+ * threads before preemption occurs. Setting this value to zero
+ * disables the preemption for threads with equal priority and the
+ * round robin becomes cooperative. Note that higher priority
+ * threads can still preempt, the kernel is always preemptive.
+ * @note Disabling the round robin preemption makes the kernel more compact
+ * and generally faster.
+ * @note The round robin preemption is not supported in tickless mode and
+ * must be set to zero in that case.
+ */
+#if !defined(CH_CFG_TIME_QUANTUM)
+#define CH_CFG_TIME_QUANTUM 0
+#endif
+
+/**
+ * @brief Managed RAM size.
+ * @details Size of the RAM area to be managed by the OS. If set to zero
+ * then the whole available RAM is used. The core memory is made
+ * available to the heap allocator and/or can be used directly through
+ * the simplified core memory allocator.
+ *
+ * @note In order to let the OS manage the whole RAM the linker script must
+ * provide the @p __heap_base__ and @p __heap_end__ symbols.
+ * @note Requires @p CH_CFG_USE_MEMCORE.
+ */
+#if !defined(CH_CFG_MEMCORE_SIZE)
+#define CH_CFG_MEMCORE_SIZE 0
+#endif
+
+/**
+ * @brief Idle thread automatic spawn suppression.
+ * @details When this option is activated the function @p chSysInit()
+ * does not spawn the idle thread. The application @p main()
+ * function becomes the idle thread and must implement an
+ * infinite loop.
+ */
+#if !defined(CH_CFG_NO_IDLE_THREAD)
+#define CH_CFG_NO_IDLE_THREAD FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Performance options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief OS optimization.
+ * @details If enabled then time efficient rather than space efficient code
+ * is used when two possible implementations exist.
+ *
+ * @note This is not related to the compiler optimization options.
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_OPTIMIZE_SPEED)
+#define CH_CFG_OPTIMIZE_SPEED FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Subsystem options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Time Measurement APIs.
+ * @details If enabled then the time measurement APIs are included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_TM)
+#define CH_CFG_USE_TM FALSE
+#endif
+
+/**
+ * @brief Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_REGISTRY)
+#define CH_CFG_USE_REGISTRY TRUE
+#endif
+
+/**
+ * @brief Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_WAITEXIT)
+#define CH_CFG_USE_WAITEXIT TRUE
+#endif
+
+/**
+ * @brief Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES)
+#define CH_CFG_USE_SEMAPHORES TRUE
+#endif
+
+/**
+ * @brief Semaphores queuing mode.
+ * @details If enabled then the threads are enqueued on semaphores by
+ * priority rather than in FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY)
+#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MUTEXES)
+#define CH_CFG_USE_MUTEXES TRUE
+#endif
+
+/**
+ * @brief Enables recursive behavior on mutexes.
+ * @note Recursive mutexes are heavier and have an increased
+ * memory footprint.
+ *
+ * @note The default is @p FALSE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE)
+#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
+#endif
+
+/**
+ * @brief Conditional Variables APIs.
+ * @details If enabled then the conditional variables APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_CONDVARS)
+#define CH_CFG_USE_CONDVARS TRUE
+#endif
+
+/**
+ * @brief Conditional Variables APIs with timeout.
+ * @details If enabled then the conditional variables APIs with timeout
+ * specification are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_CONDVARS.
+ */
+#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT)
+#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
+#endif
+
+/**
+ * @brief Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_EVENTS)
+#define CH_CFG_USE_EVENTS TRUE
+#endif
+
+/**
+ * @brief Events Flags APIs with timeout.
+ * @details If enabled then the events APIs with timeout specification
+ * are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_EVENTS.
+ */
+#if !defined(CH_CFG_USE_EVENTS_TIMEOUT)
+#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MESSAGES)
+#define CH_CFG_USE_MESSAGES TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages queuing mode.
+ * @details If enabled then messages are served by priority rather than in
+ * FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_MESSAGES.
+ */
+#if !defined(CH_CFG_USE_MESSAGES_PRIORITY)
+#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mailboxes APIs.
+ * @details If enabled then the asynchronous messages (mailboxes) APIs are
+ * included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_MAILBOXES)
+#define CH_CFG_USE_MAILBOXES TRUE
+#endif
+
+/**
+ * @brief Core Memory Manager APIs.
+ * @details If enabled then the core memory manager APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMCORE)
+#define CH_CFG_USE_MEMCORE TRUE
+#endif
+
+/**
+ * @brief Heap Allocator APIs.
+ * @details If enabled then the memory heap allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
+ * @p CH_CFG_USE_SEMAPHORES.
+ * @note Mutexes are recommended.
+ */
+#if !defined(CH_CFG_USE_HEAP)
+#define CH_CFG_USE_HEAP FALSE
+#endif
+
+/**
+ * @brief Memory Pools Allocator APIs.
+ * @details If enabled then the memory pools allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMPOOLS)
+#define CH_CFG_USE_MEMPOOLS FALSE
+#endif
+
+/**
+ * @brief Objects FIFOs APIs.
+ * @details If enabled then the objects FIFOs APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_OBJ_FIFOS)
+#define CH_CFG_USE_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Pipes APIs.
+ * @details If enabled then the pipes APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_PIPES)
+#define CH_CFG_USE_PIPES FALSE
+#endif
+
+/**
+ * @brief Dynamic Threads APIs.
+ * @details If enabled then the dynamic threads creation APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_WAITEXIT.
+ * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
+ */
+#if !defined(CH_CFG_USE_DYNAMIC)
+#define CH_CFG_USE_DYNAMIC FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Objects factory options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Objects Factory APIs.
+ * @details If enabled then the objects factory APIs are included in the
+ * kernel.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_CFG_USE_FACTORY)
+#define CH_CFG_USE_FACTORY FALSE
+#endif
+
+/**
+ * @brief Maximum length for object names.
+ * @details If the specified length is zero then the name is stored by
+ * pointer but this could have unintended side effects.
+ */
+#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH)
+#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8
+#endif
+
+/**
+ * @brief Enables the registry of generic objects.
+ */
+#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY)
+#define CH_CFG_FACTORY_OBJECTS_REGISTRY FALSE
+#endif
+
+/**
+ * @brief Enables factory for generic buffers.
+ */
+#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)
+#define CH_CFG_FACTORY_GENERIC_BUFFERS FALSE
+#endif
+
+/**
+ * @brief Enables factory for semaphores.
+ */
+#if !defined(CH_CFG_FACTORY_SEMAPHORES)
+#define CH_CFG_FACTORY_SEMAPHORES FALSE
+#endif
+
+/**
+ * @brief Enables factory for mailboxes.
+ */
+#if !defined(CH_CFG_FACTORY_MAILBOXES)
+#define CH_CFG_FACTORY_MAILBOXES FALSE
+#endif
+
+/**
+ * @brief Enables factory for objects FIFOs.
+ */
+#if !defined(CH_CFG_FACTORY_OBJ_FIFOS)
+#define CH_CFG_FACTORY_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Enables factory for Pipes.
+ */
+#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)
+#define CH_CFG_FACTORY_PIPES FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Debug option, kernel statistics.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_STATISTICS)
+#define CH_DBG_STATISTICS FALSE
+#endif
+
+/**
+ * @brief Debug option, system state check.
+ * @details If enabled the correct call protocol for system APIs is checked
+ * at runtime.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_SYSTEM_STATE_CHECK)
+#define CH_DBG_SYSTEM_STATE_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, parameters checks.
+ * @details If enabled then the checks on the API functions input
+ * parameters are activated.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_CHECKS)
+#define CH_DBG_ENABLE_CHECKS FALSE
+#endif
+
+/**
+ * @brief Debug option, consistency checks.
+ * @details If enabled then all the assertions in the kernel code are
+ * activated. This includes consistency checks inside the kernel,
+ * runtime anomalies and port-defined checks.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_ASSERTS)
+#define CH_DBG_ENABLE_ASSERTS FALSE
+#endif
+
+/**
+ * @brief Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_MASK)
+#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
+#endif
+
+/**
+ * @brief Trace buffer entries.
+ * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is
+ * different from @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_BUFFER_SIZE)
+#define CH_DBG_TRACE_BUFFER_SIZE 128
+#endif
+
+/**
+ * @brief Debug option, stack checks.
+ * @details If enabled then a runtime stack check is performed.
+ *
+ * @note The default is @p FALSE.
+ * @note The stack check is performed in a architecture/port dependent way.
+ * It may not be implemented or some ports.
+ * @note The default failure mode is to halt the system with the global
+ * @p panic_msg variable set to @p NULL.
+ */
+#if !defined(CH_DBG_ENABLE_STACK_CHECK)
+#define CH_DBG_ENABLE_STACK_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, stacks initialization.
+ * @details If enabled then the threads working area is filled with a byte
+ * value when a thread is created. This can be useful for the
+ * runtime measurement of the used stack.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_FILL_THREADS)
+#define CH_DBG_FILL_THREADS FALSE
+#endif
+
+/**
+ * @brief Debug option, threads profiling.
+ * @details If enabled then a field is added to the @p thread_t structure that
+ * counts the system ticks occurred while executing the thread.
+ *
+ * @note The default is @p FALSE.
+ * @note This debug option is not currently compatible with the
+ * tickless mode.
+ */
+#if !defined(CH_DBG_THREADS_PROFILING)
+#define CH_DBG_THREADS_PROFILING FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System structure extension.
+ * @details User fields added to the end of the @p ch_system_t structure.
+ */
+#define CH_CFG_SYSTEM_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief System initialization hook.
+ * @details User initialization code added to the @p chSysInit() function
+ * just before interrupts are enabled globally.
+ */
+#define CH_CFG_SYSTEM_INIT_HOOK() { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads descriptor structure extension.
+ * @details User fields added to the end of the @p thread_t structure.
+ */
+#define CH_CFG_THREAD_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief Threads initialization hook.
+ * @details User initialization code added to the @p _thread_init() function.
+ *
+ * @note It is invoked from within @p _thread_init() and implicitly from all
+ * the threads creation APIs.
+ */
+#define CH_CFG_THREAD_INIT_HOOK(tp) { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads finalization hook.
+ * @details User finalization code added to the @p chThdExit() API.
+ */
+#define CH_CFG_THREAD_EXIT_HOOK(tp) { \
+ /* Add threads finalization code here.*/ \
+}
+
+/**
+ * @brief Context switch hook.
+ * @details This hook is invoked just before switching between threads.
+ */
+#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \
+ /* Context switch code here.*/ \
+}
+
+/**
+ * @brief ISR enter hook.
+ */
+#define CH_CFG_IRQ_PROLOGUE_HOOK() { \
+ /* IRQ prologue code here.*/ \
+}
+
+/**
+ * @brief ISR exit hook.
+ */
+#define CH_CFG_IRQ_EPILOGUE_HOOK() { \
+ /* IRQ epilogue code here.*/ \
+}
+
+/**
+ * @brief Idle thread enter hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to activate a power saving mode.
+ */
+#define CH_CFG_IDLE_ENTER_HOOK() { \
+ /* Idle-enter code here.*/ \
+}
+
+/**
+ * @brief Idle thread leave hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to deactivate a power saving mode.
+ */
+#define CH_CFG_IDLE_LEAVE_HOOK() { \
+ /* Idle-leave code here.*/ \
+}
+
+/**
+ * @brief Idle Loop hook.
+ * @details This hook is continuously invoked by the idle thread loop.
+ */
+#define CH_CFG_IDLE_LOOP_HOOK() { \
+ /* Idle loop code here.*/ \
+}
+
+/**
+ * @brief System tick event hook.
+ * @details This hook is invoked in the system tick handler immediately
+ * after processing the virtual timers queue.
+ */
+#define CH_CFG_SYSTEM_TICK_HOOK() { \
+ /* System tick event code here.*/ \
+}
+
+/**
+ * @brief System halt hook.
+ * @details This hook is invoked in case to a system halting error before
+ * the system is halted.
+ */
+#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \
+ /* System halt code here.*/ \
+}
+
+/**
+ * @brief Trace hook.
+ * @details This hook is invoked each time a new record is written in the
+ * trace buffer.
+ */
+#define CH_CFG_TRACE_HOOK(tep) { \
+ /* Trace code here.*/ \
+}
+
+/** @} */
+
+/*===========================================================================*/
+/* Port-specific settings (override port settings defaulted in chcore.h). */
+/*===========================================================================*/
+
+#endif /* CHCONF_H */
+
+/** @} */
diff --git a/keyboards/cannonkeys/db60/config.h b/keyboards/cannonkeys/db60/config.h
new file mode 100644
index 00000000000..54995c6b2d8
--- /dev/null
+++ b/keyboards/cannonkeys/db60/config.h
@@ -0,0 +1,78 @@
+/*
+Copyright 2015 Jun Wako
+
+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 .
+*/
+
+#pragma once
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xCA04
+#define PRODUCT_ID 0xDB60
+#define DEVICE_VER 0x0001
+
+#define MANUFACTURER CannonKeys
+#define PRODUCT DB60
+#define DESCRIPTION DB60 Keyboard
+
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 15
+
+#define MATRIX_COL_PINS { B11, B10, B2, A9, A15, B3, B4, B5, B6, B7, B8, B9, C13, C14, C15 }
+#define MATRIX_ROW_PINS { B1, B0, A7, A5, A4 }
+#define DIODE_DIRECTION COL2ROW
+
+
+#define BACKLIGHT_PIN A6
+#define BACKLIGHT_PWM_DRIVER PWMD3
+#define BACKLIGHT_PWM_CHANNEL 1
+#define BACKLIGHT_PAL_MODE 1
+#define BACKLIGHT_LEVELS 6
+#define BACKLIGHT_BREATHING
+#define BREATHING_PERIOD 6
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+#define RGBLIGHT_ANIMATIONS
+#define WS2812_SPI SPID2
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 20
+#define WS2812_SPI_MOSI_PAL_MODE 0
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
diff --git a/keyboards/cannonkeys/db60/db60.c b/keyboards/cannonkeys/db60/db60.c
new file mode 100644
index 00000000000..25344360bc4
--- /dev/null
+++ b/keyboards/cannonkeys/db60/db60.c
@@ -0,0 +1 @@
+#include "db60.h"
diff --git a/keyboards/cannonkeys/db60/db60.h b/keyboards/cannonkeys/db60/db60.h
new file mode 100644
index 00000000000..741ab7d0edf
--- /dev/null
+++ b/keyboards/cannonkeys/db60/db60.h
@@ -0,0 +1,61 @@
+#pragma once
+
+#include "quantum.h"
+
+#define KNO KC_NO
+
+#define LAYOUT_60_ansi( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2E, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \
+ K40, K41, K42, K45, K4A, K4B, K4C, K4E \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, KNO}, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, KNO, K1E }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KNO, KNO, K2E }, \
+ { K30, KNO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, KNO, KNO }, \
+ { K40, K41, K42, KNO, KNO, K45, KNO, KNO, KNO, KNO, K4A, K4B, K4C, KNO, K4E } \
+}
+
+#define LAYOUT_60_tsangan_hhkb( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2E, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3E,\
+ K40, K41, K42, K45, K4B, K4C, K4E \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E}, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, KNO, K1E }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KNO, KNO, K2E }, \
+ { K30, KNO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, KNO, K3E }, \
+ { K40, K41, K42, KNO, KNO, K45, KNO, KNO, KNO, KNO, KNO, K4B, K4C, KNO, K4E } \
+}
+
+#define LAYOUT_60_iso( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2E, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \
+ K40, K41, K42, K45, K4A, K4B, K4C, K4E \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, KNO}, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, KNO, KNO }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, KNO, K2E }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, KNO, KNO }, \
+ { K40, K41, K42, KNO, KNO, K45, KNO, KNO, KNO, KNO, K4A, K4B, K4C, KNO, K4E } \
+}
+
+#define LAYOUT_all( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E,\
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2E, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3E,\
+ K40, K41, K42, K45, K4A, K4B, K4C, K4E \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E}, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, KNO, K1E }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, KNO, K2E }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, KNO, K3E }, \
+ { K40, K41, K42, KNO, KNO, K45, KNO, KNO, KNO, KNO, K4A, K4B, K4C, KNO, K4E } \
+}
diff --git a/keyboards/cannonkeys/db60/halconf.h b/keyboards/cannonkeys/db60/halconf.h
new file mode 100644
index 00000000000..adb1a907154
--- /dev/null
+++ b/keyboards/cannonkeys/db60/halconf.h
@@ -0,0 +1,525 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file templates/halconf.h
+ * @brief HAL configuration header.
+ * @details HAL configuration file, this file allows to enable or disable the
+ * various device drivers from your application. You may also use
+ * this file in order to override the device drivers default settings.
+ *
+ * @addtogroup HAL_CONF
+ * @{
+ */
+
+#ifndef HALCONF_H
+#define HALCONF_H
+
+#define _CHIBIOS_HAL_CONF_
+#define _CHIBIOS_HAL_CONF_VER_7_0_
+
+#include "mcuconf.h"
+
+/**
+ * @brief Enables the PAL subsystem.
+ */
+#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
+#define HAL_USE_PAL TRUE
+#endif
+
+/**
+ * @brief Enables the ADC subsystem.
+ */
+#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
+#define HAL_USE_ADC FALSE
+#endif
+
+/**
+ * @brief Enables the CAN subsystem.
+ */
+#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
+#define HAL_USE_CAN FALSE
+#endif
+
+/**
+ * @brief Enables the cryptographic subsystem.
+ */
+#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__)
+#define HAL_USE_CRY FALSE
+#endif
+
+/**
+ * @brief Enables the DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC FALSE
+#endif
+
+/**
+ * @brief Enables the GPT subsystem.
+ */
+#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
+#define HAL_USE_GPT FALSE
+#endif
+
+/**
+ * @brief Enables the I2C subsystem.
+ */
+#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
+#define HAL_USE_I2C TRUE
+#endif
+
+/**
+ * @brief Enables the I2S subsystem.
+ */
+#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
+#define HAL_USE_I2S FALSE
+#endif
+
+/**
+ * @brief Enables the ICU subsystem.
+ */
+#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)
+#define HAL_USE_ICU FALSE
+#endif
+
+/**
+ * @brief Enables the MAC subsystem.
+ */
+#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)
+#define HAL_USE_MAC FALSE
+#endif
+
+/**
+ * @brief Enables the MMC_SPI subsystem.
+ */
+#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_MMC_SPI FALSE
+#endif
+
+/**
+ * @brief Enables the PWM subsystem.
+ */
+#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
+#define HAL_USE_PWM TRUE
+#endif
+
+/**
+ * @brief Enables the RTC subsystem.
+ */
+#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)
+#define HAL_USE_RTC FALSE
+#endif
+
+/**
+ * @brief Enables the SDC subsystem.
+ */
+#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)
+#define HAL_USE_SDC FALSE
+#endif
+
+/**
+ * @brief Enables the SERIAL subsystem.
+ */
+#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL FALSE
+#endif
+
+/**
+ * @brief Enables the SERIAL over USB subsystem.
+ */
+#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL_USB FALSE
+#endif
+
+/**
+ * @brief Enables the SIO subsystem.
+ */
+#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__)
+#define HAL_USE_SIO FALSE
+#endif
+
+/**
+ * @brief Enables the SPI subsystem.
+ */
+#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_SPI TRUE
+#endif
+
+/**
+ * @brief Enables the TRNG subsystem.
+ */
+#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__)
+#define HAL_USE_TRNG FALSE
+#endif
+
+/**
+ * @brief Enables the UART subsystem.
+ */
+#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)
+#define HAL_USE_UART FALSE
+#endif
+
+/**
+ * @brief Enables the USB subsystem.
+ */
+#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
+#define HAL_USE_USB TRUE
+#endif
+
+/**
+ * @brief Enables the WDG subsystem.
+ */
+#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
+#define HAL_USE_WDG FALSE
+#endif
+
+/**
+ * @brief Enables the WSPI subsystem.
+ */
+#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__)
+#define HAL_USE_WSPI FALSE
+#endif
+
+/*===========================================================================*/
+/* PAL driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define PAL_USE_CALLBACKS FALSE
+#endif
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__)
+#define PAL_USE_WAIT FALSE
+#endif
+
+/*===========================================================================*/
+/* ADC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)
+#define ADC_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define ADC_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* CAN driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Sleep mode related APIs inclusion switch.
+ */
+#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__)
+#define CAN_USE_SLEEP_MODE TRUE
+#endif
+
+/**
+ * @brief Enforces the driver to use direct callbacks rather than OSAL events.
+ */
+#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define CAN_ENFORCE_USE_CALLBACKS FALSE
+#endif
+
+/*===========================================================================*/
+/* CRY driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the SW fall-back of the cryptographic driver.
+ * @details When enabled, this option, activates a fall-back software
+ * implementation for algorithms not supported by the underlying
+ * hardware.
+ * @note Fall-back implementations may not be present for all algorithms.
+ */
+#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_USE_FALLBACK FALSE
+#endif
+
+/**
+ * @brief Makes the driver forcibly use the fall-back implementations.
+ */
+#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_ENFORCE_FALLBACK FALSE
+#endif
+
+/*===========================================================================*/
+/* DAC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__)
+#define DAC_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define DAC_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* I2C driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the mutual exclusion APIs on the I2C bus.
+ */
+#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define I2C_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* MAC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the zero-copy API.
+ */
+#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)
+#define MAC_USE_ZERO_COPY FALSE
+#endif
+
+/**
+ * @brief Enables an event sources for incoming packets.
+ */
+#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__)
+#define MAC_USE_EVENTS TRUE
+#endif
+
+/*===========================================================================*/
+/* MMC_SPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ * This option is recommended also if the SPI driver does not
+ * use a DMA channel and heavily loads the CPU.
+ */
+#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__)
+#define MMC_NICE_WAITING TRUE
+#endif
+
+/*===========================================================================*/
+/* SDC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Number of initialization attempts before rejecting the card.
+ * @note Attempts are performed at 10mS intervals.
+ */
+#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__)
+#define SDC_INIT_RETRY 100
+#endif
+
+/**
+ * @brief Include support for MMC cards.
+ * @note MMC support is not yet implemented so this option must be kept
+ * at @p FALSE.
+ */
+#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__)
+#define SDC_MMC_SUPPORT FALSE
+#endif
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ */
+#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__)
+#define SDC_NICE_WAITING TRUE
+#endif
+
+/**
+ * @brief OCR initialization constant for V20 cards.
+ */
+#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR_V20 0x50FF8000U
+#endif
+
+/**
+ * @brief OCR initialization constant for non-V20 cards.
+ */
+#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR 0x80100000U
+#endif
+
+/*===========================================================================*/
+/* SERIAL driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Default bit rate.
+ * @details Configuration parameter, this is the baud rate selected for the
+ * default configuration.
+ */
+#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)
+#define SERIAL_DEFAULT_BITRATE 38400
+#endif
+
+/**
+ * @brief Serial buffers size.
+ * @details Configuration parameter, you can change the depth of the queue
+ * buffers depending on the requirements of your application.
+ * @note The default is 16 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_BUFFERS_SIZE 16
+#endif
+
+/*===========================================================================*/
+/* SERIAL_USB driver related setting. */
+/*===========================================================================*/
+
+/**
+ * @brief Serial over USB buffers size.
+ * @details Configuration parameter, the buffer size must be a multiple of
+ * the USB data endpoint maximum packet size.
+ * @note The default is 256 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_SIZE 1
+#endif
+
+/**
+ * @brief Serial over USB number of buffers.
+ * @note The default is 2 buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_NUMBER 2
+#endif
+
+/*===========================================================================*/
+/* SPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__)
+#define SPI_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables circular transfers APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__)
+#define SPI_USE_CIRCULAR FALSE
+#endif
+
+
+/**
+ * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define SPI_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/**
+ * @brief Handling method for SPI CS line.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__)
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+#endif
+
+/*===========================================================================*/
+/* UART driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__)
+#define UART_USE_WAIT FALSE
+#endif
+
+/**
+ * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define UART_USE_MUTUAL_EXCLUSION FALSE
+#endif
+
+/*===========================================================================*/
+/* USB driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
+#define USB_USE_WAIT TRUE
+#endif
+
+/*===========================================================================*/
+/* WSPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__)
+#define WSPI_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define WSPI_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+#endif /* HALCONF_H */
+
+/** @} */
diff --git a/keyboards/cannonkeys/db60/info.json b/keyboards/cannonkeys/db60/info.json
new file mode 100644
index 00000000000..3576880b46f
--- /dev/null
+++ b/keyboards/cannonkeys/db60/info.json
@@ -0,0 +1,19 @@
+{
+ "keyboard_name": "DB60",
+ "url": "https://cannonkeys.com",
+ "maintainer": "awkannan",
+ "width": 15,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_60_ansi": {
+ "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}]
+ },
+ "LAYOUT_60_tsangan_hhkb": {
+ "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Win", "x":1.5, "y":4}, {"label":"Alt", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Alt", "x":11, "y":4, "w":1.5}, {"label":"Win", "x":12.5, "y":4}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}]
+ },
+ "LAYOUT_60_iso": {
+ "layout": [{"label":"\u00ac", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"\u00a3", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}]
+ }
+ }
+
+ }
diff --git a/keyboards/cannonkeys/db60/keymaps/default/keymap.c b/keyboards/cannonkeys/db60/keymaps/default/keymap.c
new file mode 100644
index 00000000000..9c834aa1370
--- /dev/null
+++ b/keyboards/cannonkeys/db60/keymaps/default/keymap.c
@@ -0,0 +1,45 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_names {
+ _BASE,
+ _FN1
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT_60_ansi(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FN1), KC_RCTL
+ ),
+
+ [_FN1] = LAYOUT_60_ansi(
+ KC_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
+ RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ BL_BRTG, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_GRV, _______, _______, _______, _______, _______, _______, RESET
+ )
+};
diff --git a/keyboards/cannonkeys/db60/keymaps/iso/keymap.c b/keyboards/cannonkeys/db60/keymaps/iso/keymap.c
new file mode 100644
index 00000000000..52fca7d1687
--- /dev/null
+++ b/keyboards/cannonkeys/db60/keymaps/iso/keymap.c
@@ -0,0 +1,45 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_names {
+ _BASE,
+ _FN1
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT_60_iso(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FN1), KC_RCTL
+ ),
+
+ [_FN1] = LAYOUT_60_iso(
+ KC_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
+ RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ BL_BRTG, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ BL_INC, _______, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_GRV, _______, _______, _______, _______, _______, _______, RESET
+ )
+};
diff --git a/keyboards/cannonkeys/db60/keymaps/tsangan/keymap.c b/keyboards/cannonkeys/db60/keymaps/tsangan/keymap.c
new file mode 100644
index 00000000000..996a3d536d0
--- /dev/null
+++ b/keyboards/cannonkeys/db60/keymaps/tsangan/keymap.c
@@ -0,0 +1,46 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_names {
+ _BASE,
+ _FN1
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT_60_tsangan_hhkb(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_DEL,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
+ ),
+
+ [_FN1] = LAYOUT_60_tsangan_hhkb(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, _______,
+ RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ BL_BRTG, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, RESET
+ )
+};
diff --git a/keyboards/cannonkeys/db60/keymaps/via/keymap.c b/keyboards/cannonkeys/db60/keymaps/via/keymap.c
new file mode 100644
index 00000000000..47af39164f5
--- /dev/null
+++ b/keyboards/cannonkeys/db60/keymaps/via/keymap.c
@@ -0,0 +1,63 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_names {
+ _BASE,
+ _FN1,
+ _FN2,
+ _FN3
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT_all(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FN1), KC_RCTL
+ ),
+
+ [_FN1] = LAYOUT_all(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, _______,
+ RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ BL_BRTG, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, RESET
+ ),
+
+ [_FN2] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [_FN3] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/cannonkeys/db60/keymaps/via/rules.mk b/keyboards/cannonkeys/db60/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/cannonkeys/db60/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/cannonkeys/db60/mcuconf.h b/keyboards/cannonkeys/db60/mcuconf.h
new file mode 100644
index 00000000000..048eb4df650
--- /dev/null
+++ b/keyboards/cannonkeys/db60/mcuconf.h
@@ -0,0 +1,176 @@
+/*
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#ifndef _MCUCONF_H_
+#define _MCUCONF_H_
+
+/*
+ * STM32F0xx drivers configuration.
+ * The following settings override the default settings present in
+ * the various device driver implementation headers.
+ * Note that the settings for each driver only have effect if the whole
+ * driver is enabled in halconf.h.
+ *
+ * IRQ priorities:
+ * 3...0 Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3 Lowest...Highest.
+ */
+
+#define STM32F0xx_MCUCONF
+// #define STM32F070xB
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT FALSE
+#define STM32_PVD_ENABLE FALSE
+#define STM32_PLS STM32_PLS_LEV0
+#define STM32_HSI_ENABLED TRUE
+#define STM32_HSI14_ENABLED TRUE
+#define STM32_HSI48_ENABLED FALSE
+#define STM32_LSI_ENABLED TRUE
+#define STM32_HSE_ENABLED FALSE
+#define STM32_LSE_ENABLED FALSE
+#define STM32_SW STM32_SW_PLL
+#define STM32_PLLSRC STM32_PLLSRC_HSI_DIV2
+#define STM32_PREDIV_VALUE 1
+#define STM32_PLLMUL_VALUE 12
+#define STM32_HPRE STM32_HPRE_DIV1
+#define STM32_PPRE STM32_PPRE_DIV1
+#define STM32_ADCSW STM32_ADCSW_HSI14
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_ADCSW STM32_ADCSW_HSI14
+#define STM32_USBSW STM32_USBSW_HSI48
+#define STM32_CECSW STM32_CECSW_HSI
+#define STM32_I2C1SW STM32_I2C1SW_HSI
+#define STM32_USART1SW STM32_USART1SW_PCLK
+#define STM32_RTCSEL STM32_RTCSEL_LSI
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_USE_ADC1 FALSE
+#define STM32_ADC_ADC1_DMA_PRIORITY 2
+#define STM32_ADC_IRQ_PRIORITY 2
+#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2
+
+/*
+ * EXT driver system settings.
+ */
+#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI16_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI17_IRQ_PRIORITY 3
+
+/*
+ * GPT driver system settings.
+ */
+#define STM32_GPT_USE_TIM1 FALSE
+#define STM32_GPT_USE_TIM2 FALSE
+#define STM32_GPT_USE_TIM3 FALSE
+#define STM32_GPT_USE_TIM14 FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY 2
+#define STM32_GPT_TIM2_IRQ_PRIORITY 2
+#define STM32_GPT_TIM3_IRQ_PRIORITY 2
+#define STM32_GPT_TIM14_IRQ_PRIORITY 2
+
+/*
+ * I2C driver system settings.
+ */
+#define STM32_I2C_USE_I2C1 TRUE
+#define STM32_I2C_USE_I2C2 FALSE
+#define STM32_I2C_BUSY_TIMEOUT 50
+#define STM32_I2C_I2C1_IRQ_PRIORITY 3
+#define STM32_I2C_I2C2_IRQ_PRIORITY 3
+#define STM32_I2C_USE_DMA TRUE
+#define STM32_I2C_I2C1_DMA_PRIORITY 1
+#define STM32_I2C_I2C2_DMA_PRIORITY 1
+#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
+#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6)
+#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure")
+
+/*
+ * ICU driver system settings.
+ */
+#define STM32_ICU_USE_TIM1 FALSE
+#define STM32_ICU_USE_TIM2 FALSE
+#define STM32_ICU_USE_TIM3 FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY 3
+#define STM32_ICU_TIM2_IRQ_PRIORITY 3
+#define STM32_ICU_TIM3_IRQ_PRIORITY 3
+
+/*
+ * PWM driver system settings.
+ */
+#define STM32_PWM_USE_ADVANCED FALSE
+#define STM32_PWM_USE_TIM1 FALSE
+#define STM32_PWM_USE_TIM2 FALSE
+#define STM32_PWM_USE_TIM3 TRUE
+#define STM32_PWM_TIM1_IRQ_PRIORITY 3
+#define STM32_PWM_TIM2_IRQ_PRIORITY 3
+#define STM32_PWM_TIM3_IRQ_PRIORITY 3
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1 FALSE
+#define STM32_SERIAL_USE_USART2 FALSE
+#define STM32_SERIAL_USART1_PRIORITY 3
+#define STM32_SERIAL_USART2_PRIORITY 3
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1 FALSE
+#define STM32_SPI_USE_SPI2 TRUE
+#define STM32_SPI_SPI1_DMA_PRIORITY 1
+#define STM32_SPI_SPI2_DMA_PRIORITY 1
+#define STM32_SPI_SPI1_IRQ_PRIORITY 2
+#define STM32_SPI_SPI2_IRQ_PRIORITY 2
+#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5)
+#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY 2
+#define STM32_ST_USE_TIMER 2
+
+/*
+ * UART driver system settings.
+ */
+#define STM32_UART_USE_USART1 FALSE
+#define STM32_UART_USE_USART2 FALSE
+#define STM32_UART_USART1_IRQ_PRIORITY 3
+#define STM32_UART_USART2_IRQ_PRIORITY 3
+#define STM32_UART_USART1_DMA_PRIORITY 0
+#define STM32_UART_USART2_DMA_PRIORITY 0
+#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure")
+
+/*
+ * USB driver system settings.
+ */
+#define STM32_USB_USE_USB1 TRUE
+#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE
+#define STM32_USB_USB1_LP_IRQ_PRIORITY 3
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/cannonkeys/db60/readme.md b/keyboards/cannonkeys/db60/readme.md
new file mode 100644
index 00000000000..c1000ae2ca8
--- /dev/null
+++ b/keyboards/cannonkeys/db60/readme.md
@@ -0,0 +1,12 @@
+# CannonKeys DB60
+
+DB60 "Daughterboard 60" Keyboard
+
+* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan)
+* Hardware Supported: STM32F072CBT6
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cannonkeys/db60:default
+
+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).
diff --git a/keyboards/cannonkeys/db60/rules.mk b/keyboards/cannonkeys/db60/rules.mk
new file mode 100644
index 00000000000..1267286507d
--- /dev/null
+++ b/keyboards/cannonkeys/db60/rules.mk
@@ -0,0 +1,21 @@
+# MCU name
+MCU = STM32F072
+
+# Build Options
+# comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = yes
+RGBLIGHT_ENABLE = yes
+WS2812_DRIVER = spi
+
+LAYOUTS = 60_ansi 60_tsangan_hhkb 60_iso
+
+# Enter lower-power sleep mode when on the ChibiOS idle thread
+OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
diff --git a/keyboards/cannonkeys/devastatingtkl/chconf.h b/keyboards/cannonkeys/devastatingtkl/chconf.h
new file mode 100644
index 00000000000..03f63da36a8
--- /dev/null
+++ b/keyboards/cannonkeys/devastatingtkl/chconf.h
@@ -0,0 +1,714 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file rt/templates/chconf.h
+ * @brief Configuration file template.
+ * @details A copy of this file must be placed in each project directory, it
+ * contains the application specific kernel settings.
+ *
+ * @addtogroup config
+ * @details Kernel related settings and hooks.
+ * @{
+ */
+
+#ifndef CHCONF_H
+#define CHCONF_H
+
+#define _CHIBIOS_RT_CONF_
+#define _CHIBIOS_RT_CONF_VER_6_0_
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System time counter resolution.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_ST_RESOLUTION)
+#define CH_CFG_ST_RESOLUTION 32
+#endif
+
+/**
+ * @brief System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ * setting also defines the system tick time unit.
+ */
+#if !defined(CH_CFG_ST_FREQUENCY)
+#define CH_CFG_ST_FREQUENCY 10000
+#endif
+
+/**
+ * @brief Time intervals data size.
+ * @note Allowed values are 16, 32 or 64 bits.
+ */
+#if !defined(CH_CFG_INTERVALS_SIZE)
+#define CH_CFG_INTERVALS_SIZE 32
+#endif
+
+/**
+ * @brief Time types data size.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_TIME_TYPES_SIZE)
+#define CH_CFG_TIME_TYPES_SIZE 32
+#endif
+
+/**
+ * @brief Time delta constant for the tick-less mode.
+ * @note If this value is zero then the system uses the classic
+ * periodic tick. This value represents the minimum number
+ * of ticks that is safe to specify in a timeout directive.
+ * The value one is not valid, timeouts are rounded up to
+ * this value.
+ */
+#if !defined(CH_CFG_ST_TIMEDELTA)
+#define CH_CFG_ST_TIMEDELTA 2
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel parameters and options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Round robin interval.
+ * @details This constant is the number of system ticks allowed for the
+ * threads before preemption occurs. Setting this value to zero
+ * disables the preemption for threads with equal priority and the
+ * round robin becomes cooperative. Note that higher priority
+ * threads can still preempt, the kernel is always preemptive.
+ * @note Disabling the round robin preemption makes the kernel more compact
+ * and generally faster.
+ * @note The round robin preemption is not supported in tickless mode and
+ * must be set to zero in that case.
+ */
+#if !defined(CH_CFG_TIME_QUANTUM)
+#define CH_CFG_TIME_QUANTUM 0
+#endif
+
+/**
+ * @brief Managed RAM size.
+ * @details Size of the RAM area to be managed by the OS. If set to zero
+ * then the whole available RAM is used. The core memory is made
+ * available to the heap allocator and/or can be used directly through
+ * the simplified core memory allocator.
+ *
+ * @note In order to let the OS manage the whole RAM the linker script must
+ * provide the @p __heap_base__ and @p __heap_end__ symbols.
+ * @note Requires @p CH_CFG_USE_MEMCORE.
+ */
+#if !defined(CH_CFG_MEMCORE_SIZE)
+#define CH_CFG_MEMCORE_SIZE 0
+#endif
+
+/**
+ * @brief Idle thread automatic spawn suppression.
+ * @details When this option is activated the function @p chSysInit()
+ * does not spawn the idle thread. The application @p main()
+ * function becomes the idle thread and must implement an
+ * infinite loop.
+ */
+#if !defined(CH_CFG_NO_IDLE_THREAD)
+#define CH_CFG_NO_IDLE_THREAD FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Performance options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief OS optimization.
+ * @details If enabled then time efficient rather than space efficient code
+ * is used when two possible implementations exist.
+ *
+ * @note This is not related to the compiler optimization options.
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_OPTIMIZE_SPEED)
+#define CH_CFG_OPTIMIZE_SPEED FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Subsystem options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Time Measurement APIs.
+ * @details If enabled then the time measurement APIs are included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_TM)
+#define CH_CFG_USE_TM FALSE
+#endif
+
+/**
+ * @brief Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_REGISTRY)
+#define CH_CFG_USE_REGISTRY TRUE
+#endif
+
+/**
+ * @brief Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_WAITEXIT)
+#define CH_CFG_USE_WAITEXIT TRUE
+#endif
+
+/**
+ * @brief Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES)
+#define CH_CFG_USE_SEMAPHORES TRUE
+#endif
+
+/**
+ * @brief Semaphores queuing mode.
+ * @details If enabled then the threads are enqueued on semaphores by
+ * priority rather than in FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY)
+#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MUTEXES)
+#define CH_CFG_USE_MUTEXES TRUE
+#endif
+
+/**
+ * @brief Enables recursive behavior on mutexes.
+ * @note Recursive mutexes are heavier and have an increased
+ * memory footprint.
+ *
+ * @note The default is @p FALSE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE)
+#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
+#endif
+
+/**
+ * @brief Conditional Variables APIs.
+ * @details If enabled then the conditional variables APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_CONDVARS)
+#define CH_CFG_USE_CONDVARS TRUE
+#endif
+
+/**
+ * @brief Conditional Variables APIs with timeout.
+ * @details If enabled then the conditional variables APIs with timeout
+ * specification are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_CONDVARS.
+ */
+#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT)
+#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
+#endif
+
+/**
+ * @brief Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_EVENTS)
+#define CH_CFG_USE_EVENTS TRUE
+#endif
+
+/**
+ * @brief Events Flags APIs with timeout.
+ * @details If enabled then the events APIs with timeout specification
+ * are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_EVENTS.
+ */
+#if !defined(CH_CFG_USE_EVENTS_TIMEOUT)
+#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MESSAGES)
+#define CH_CFG_USE_MESSAGES TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages queuing mode.
+ * @details If enabled then messages are served by priority rather than in
+ * FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_MESSAGES.
+ */
+#if !defined(CH_CFG_USE_MESSAGES_PRIORITY)
+#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mailboxes APIs.
+ * @details If enabled then the asynchronous messages (mailboxes) APIs are
+ * included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_MAILBOXES)
+#define CH_CFG_USE_MAILBOXES TRUE
+#endif
+
+/**
+ * @brief Core Memory Manager APIs.
+ * @details If enabled then the core memory manager APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMCORE)
+#define CH_CFG_USE_MEMCORE TRUE
+#endif
+
+/**
+ * @brief Heap Allocator APIs.
+ * @details If enabled then the memory heap allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
+ * @p CH_CFG_USE_SEMAPHORES.
+ * @note Mutexes are recommended.
+ */
+#if !defined(CH_CFG_USE_HEAP)
+#define CH_CFG_USE_HEAP FALSE
+#endif
+
+/**
+ * @brief Memory Pools Allocator APIs.
+ * @details If enabled then the memory pools allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMPOOLS)
+#define CH_CFG_USE_MEMPOOLS FALSE
+#endif
+
+/**
+ * @brief Objects FIFOs APIs.
+ * @details If enabled then the objects FIFOs APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_OBJ_FIFOS)
+#define CH_CFG_USE_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Pipes APIs.
+ * @details If enabled then the pipes APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_PIPES)
+#define CH_CFG_USE_PIPES FALSE
+#endif
+
+/**
+ * @brief Dynamic Threads APIs.
+ * @details If enabled then the dynamic threads creation APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_WAITEXIT.
+ * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
+ */
+#if !defined(CH_CFG_USE_DYNAMIC)
+#define CH_CFG_USE_DYNAMIC FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Objects factory options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Objects Factory APIs.
+ * @details If enabled then the objects factory APIs are included in the
+ * kernel.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_CFG_USE_FACTORY)
+#define CH_CFG_USE_FACTORY FALSE
+#endif
+
+/**
+ * @brief Maximum length for object names.
+ * @details If the specified length is zero then the name is stored by
+ * pointer but this could have unintended side effects.
+ */
+#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH)
+#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8
+#endif
+
+/**
+ * @brief Enables the registry of generic objects.
+ */
+#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY)
+#define CH_CFG_FACTORY_OBJECTS_REGISTRY FALSE
+#endif
+
+/**
+ * @brief Enables factory for generic buffers.
+ */
+#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)
+#define CH_CFG_FACTORY_GENERIC_BUFFERS FALSE
+#endif
+
+/**
+ * @brief Enables factory for semaphores.
+ */
+#if !defined(CH_CFG_FACTORY_SEMAPHORES)
+#define CH_CFG_FACTORY_SEMAPHORES FALSE
+#endif
+
+/**
+ * @brief Enables factory for mailboxes.
+ */
+#if !defined(CH_CFG_FACTORY_MAILBOXES)
+#define CH_CFG_FACTORY_MAILBOXES FALSE
+#endif
+
+/**
+ * @brief Enables factory for objects FIFOs.
+ */
+#if !defined(CH_CFG_FACTORY_OBJ_FIFOS)
+#define CH_CFG_FACTORY_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Enables factory for Pipes.
+ */
+#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)
+#define CH_CFG_FACTORY_PIPES FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Debug option, kernel statistics.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_STATISTICS)
+#define CH_DBG_STATISTICS FALSE
+#endif
+
+/**
+ * @brief Debug option, system state check.
+ * @details If enabled the correct call protocol for system APIs is checked
+ * at runtime.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_SYSTEM_STATE_CHECK)
+#define CH_DBG_SYSTEM_STATE_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, parameters checks.
+ * @details If enabled then the checks on the API functions input
+ * parameters are activated.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_CHECKS)
+#define CH_DBG_ENABLE_CHECKS FALSE
+#endif
+
+/**
+ * @brief Debug option, consistency checks.
+ * @details If enabled then all the assertions in the kernel code are
+ * activated. This includes consistency checks inside the kernel,
+ * runtime anomalies and port-defined checks.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_ASSERTS)
+#define CH_DBG_ENABLE_ASSERTS FALSE
+#endif
+
+/**
+ * @brief Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_MASK)
+#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
+#endif
+
+/**
+ * @brief Trace buffer entries.
+ * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is
+ * different from @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_BUFFER_SIZE)
+#define CH_DBG_TRACE_BUFFER_SIZE 128
+#endif
+
+/**
+ * @brief Debug option, stack checks.
+ * @details If enabled then a runtime stack check is performed.
+ *
+ * @note The default is @p FALSE.
+ * @note The stack check is performed in a architecture/port dependent way.
+ * It may not be implemented or some ports.
+ * @note The default failure mode is to halt the system with the global
+ * @p panic_msg variable set to @p NULL.
+ */
+#if !defined(CH_DBG_ENABLE_STACK_CHECK)
+#define CH_DBG_ENABLE_STACK_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, stacks initialization.
+ * @details If enabled then the threads working area is filled with a byte
+ * value when a thread is created. This can be useful for the
+ * runtime measurement of the used stack.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_FILL_THREADS)
+#define CH_DBG_FILL_THREADS FALSE
+#endif
+
+/**
+ * @brief Debug option, threads profiling.
+ * @details If enabled then a field is added to the @p thread_t structure that
+ * counts the system ticks occurred while executing the thread.
+ *
+ * @note The default is @p FALSE.
+ * @note This debug option is not currently compatible with the
+ * tickless mode.
+ */
+#if !defined(CH_DBG_THREADS_PROFILING)
+#define CH_DBG_THREADS_PROFILING FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System structure extension.
+ * @details User fields added to the end of the @p ch_system_t structure.
+ */
+#define CH_CFG_SYSTEM_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief System initialization hook.
+ * @details User initialization code added to the @p chSysInit() function
+ * just before interrupts are enabled globally.
+ */
+#define CH_CFG_SYSTEM_INIT_HOOK() { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads descriptor structure extension.
+ * @details User fields added to the end of the @p thread_t structure.
+ */
+#define CH_CFG_THREAD_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief Threads initialization hook.
+ * @details User initialization code added to the @p _thread_init() function.
+ *
+ * @note It is invoked from within @p _thread_init() and implicitly from all
+ * the threads creation APIs.
+ */
+#define CH_CFG_THREAD_INIT_HOOK(tp) { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads finalization hook.
+ * @details User finalization code added to the @p chThdExit() API.
+ */
+#define CH_CFG_THREAD_EXIT_HOOK(tp) { \
+ /* Add threads finalization code here.*/ \
+}
+
+/**
+ * @brief Context switch hook.
+ * @details This hook is invoked just before switching between threads.
+ */
+#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \
+ /* Context switch code here.*/ \
+}
+
+/**
+ * @brief ISR enter hook.
+ */
+#define CH_CFG_IRQ_PROLOGUE_HOOK() { \
+ /* IRQ prologue code here.*/ \
+}
+
+/**
+ * @brief ISR exit hook.
+ */
+#define CH_CFG_IRQ_EPILOGUE_HOOK() { \
+ /* IRQ epilogue code here.*/ \
+}
+
+/**
+ * @brief Idle thread enter hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to activate a power saving mode.
+ */
+#define CH_CFG_IDLE_ENTER_HOOK() { \
+ /* Idle-enter code here.*/ \
+}
+
+/**
+ * @brief Idle thread leave hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to deactivate a power saving mode.
+ */
+#define CH_CFG_IDLE_LEAVE_HOOK() { \
+ /* Idle-leave code here.*/ \
+}
+
+/**
+ * @brief Idle Loop hook.
+ * @details This hook is continuously invoked by the idle thread loop.
+ */
+#define CH_CFG_IDLE_LOOP_HOOK() { \
+ /* Idle loop code here.*/ \
+}
+
+/**
+ * @brief System tick event hook.
+ * @details This hook is invoked in the system tick handler immediately
+ * after processing the virtual timers queue.
+ */
+#define CH_CFG_SYSTEM_TICK_HOOK() { \
+ /* System tick event code here.*/ \
+}
+
+/**
+ * @brief System halt hook.
+ * @details This hook is invoked in case to a system halting error before
+ * the system is halted.
+ */
+#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \
+ /* System halt code here.*/ \
+}
+
+/**
+ * @brief Trace hook.
+ * @details This hook is invoked each time a new record is written in the
+ * trace buffer.
+ */
+#define CH_CFG_TRACE_HOOK(tep) { \
+ /* Trace code here.*/ \
+}
+
+/** @} */
+
+/*===========================================================================*/
+/* Port-specific settings (override port settings defaulted in chcore.h). */
+/*===========================================================================*/
+
+#endif /* CHCONF_H */
+
+/** @} */
diff --git a/keyboards/cannonkeys/devastatingtkl/config.h b/keyboards/cannonkeys/devastatingtkl/config.h
new file mode 100644
index 00000000000..8f589bf1228
--- /dev/null
+++ b/keyboards/cannonkeys/devastatingtkl/config.h
@@ -0,0 +1,77 @@
+/*
+Copyright 2015 Jun Wako
+
+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 .
+*/
+
+#pragma once
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xCA04
+#define PRODUCT_ID 0xDE57
+#define DEVICE_VER 0x0001
+#define MANUFACTURER CannonKeys
+#define PRODUCT DevastatingTKL
+#define DESCRIPTION Devastating Keyboard
+
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 18
+
+#define MATRIX_COL_PINS { B1, B2, B10, B11, B12, B14, A8, A9, A10, A3, B0, A2, A1, A7, A0, B4, B6, B7 }
+#define MATRIX_ROW_PINS { A15, B3, B5, A4, A5, F1 }
+#define DIODE_DIRECTION COL2ROW
+
+
+#define BACKLIGHT_PIN A6
+#define BACKLIGHT_PWM_DRIVER PWMD3
+#define BACKLIGHT_PWM_CHANNEL 1
+#define BACKLIGHT_PAL_MODE 1
+#define BACKLIGHT_LEVELS 6
+#define BACKLIGHT_BREATHING
+#define BREATHING_PERIOD 6
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+#define RGBLIGHT_ANIMATIONS
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 20
+#define WS2812_SPI SPID2
+#define WS2812_SPI_MOSI_PAL_MODE 0
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
diff --git a/keyboards/cannonkeys/devastatingtkl/devastatingtkl.c b/keyboards/cannonkeys/devastatingtkl/devastatingtkl.c
new file mode 100644
index 00000000000..46072b4090f
--- /dev/null
+++ b/keyboards/cannonkeys/devastatingtkl/devastatingtkl.c
@@ -0,0 +1 @@
+#include "devastatingtkl.h"
diff --git a/keyboards/cannonkeys/devastatingtkl/devastatingtkl.h b/keyboards/cannonkeys/devastatingtkl/devastatingtkl.h
new file mode 100644
index 00000000000..2ad5c2c71fc
--- /dev/null
+++ b/keyboards/cannonkeys/devastatingtkl/devastatingtkl.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_all( \
+ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, K017, \
+ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, \
+ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K215, K216, K217, \
+ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K314, \
+ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K414, K416, \
+ K500, K501, K502, K506, K510, K511, K512, K514, K515, K516, K517 \
+) { \
+ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, KC_NO, K014, K015, K016, K017 }, \
+ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117 }, \
+ { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO, K214, K215, K216, K217 }, \
+ { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, KC_NO, K314, KC_NO, KC_NO, KC_NO }, \
+ { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO, K414, KC_NO, K416, KC_NO }, \
+ { K500, K501, K502, KC_NO, KC_NO, KC_NO, K506, KC_NO, KC_NO, KC_NO, K510, K511, K512, KC_NO, K514, K515, K516, K517 } \
+}
diff --git a/keyboards/cannonkeys/devastatingtkl/halconf.h b/keyboards/cannonkeys/devastatingtkl/halconf.h
new file mode 100644
index 00000000000..adb1a907154
--- /dev/null
+++ b/keyboards/cannonkeys/devastatingtkl/halconf.h
@@ -0,0 +1,525 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file templates/halconf.h
+ * @brief HAL configuration header.
+ * @details HAL configuration file, this file allows to enable or disable the
+ * various device drivers from your application. You may also use
+ * this file in order to override the device drivers default settings.
+ *
+ * @addtogroup HAL_CONF
+ * @{
+ */
+
+#ifndef HALCONF_H
+#define HALCONF_H
+
+#define _CHIBIOS_HAL_CONF_
+#define _CHIBIOS_HAL_CONF_VER_7_0_
+
+#include "mcuconf.h"
+
+/**
+ * @brief Enables the PAL subsystem.
+ */
+#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
+#define HAL_USE_PAL TRUE
+#endif
+
+/**
+ * @brief Enables the ADC subsystem.
+ */
+#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
+#define HAL_USE_ADC FALSE
+#endif
+
+/**
+ * @brief Enables the CAN subsystem.
+ */
+#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
+#define HAL_USE_CAN FALSE
+#endif
+
+/**
+ * @brief Enables the cryptographic subsystem.
+ */
+#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__)
+#define HAL_USE_CRY FALSE
+#endif
+
+/**
+ * @brief Enables the DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC FALSE
+#endif
+
+/**
+ * @brief Enables the GPT subsystem.
+ */
+#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
+#define HAL_USE_GPT FALSE
+#endif
+
+/**
+ * @brief Enables the I2C subsystem.
+ */
+#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
+#define HAL_USE_I2C TRUE
+#endif
+
+/**
+ * @brief Enables the I2S subsystem.
+ */
+#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
+#define HAL_USE_I2S FALSE
+#endif
+
+/**
+ * @brief Enables the ICU subsystem.
+ */
+#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)
+#define HAL_USE_ICU FALSE
+#endif
+
+/**
+ * @brief Enables the MAC subsystem.
+ */
+#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)
+#define HAL_USE_MAC FALSE
+#endif
+
+/**
+ * @brief Enables the MMC_SPI subsystem.
+ */
+#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_MMC_SPI FALSE
+#endif
+
+/**
+ * @brief Enables the PWM subsystem.
+ */
+#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
+#define HAL_USE_PWM TRUE
+#endif
+
+/**
+ * @brief Enables the RTC subsystem.
+ */
+#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)
+#define HAL_USE_RTC FALSE
+#endif
+
+/**
+ * @brief Enables the SDC subsystem.
+ */
+#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)
+#define HAL_USE_SDC FALSE
+#endif
+
+/**
+ * @brief Enables the SERIAL subsystem.
+ */
+#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL FALSE
+#endif
+
+/**
+ * @brief Enables the SERIAL over USB subsystem.
+ */
+#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL_USB FALSE
+#endif
+
+/**
+ * @brief Enables the SIO subsystem.
+ */
+#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__)
+#define HAL_USE_SIO FALSE
+#endif
+
+/**
+ * @brief Enables the SPI subsystem.
+ */
+#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_SPI TRUE
+#endif
+
+/**
+ * @brief Enables the TRNG subsystem.
+ */
+#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__)
+#define HAL_USE_TRNG FALSE
+#endif
+
+/**
+ * @brief Enables the UART subsystem.
+ */
+#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)
+#define HAL_USE_UART FALSE
+#endif
+
+/**
+ * @brief Enables the USB subsystem.
+ */
+#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
+#define HAL_USE_USB TRUE
+#endif
+
+/**
+ * @brief Enables the WDG subsystem.
+ */
+#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
+#define HAL_USE_WDG FALSE
+#endif
+
+/**
+ * @brief Enables the WSPI subsystem.
+ */
+#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__)
+#define HAL_USE_WSPI FALSE
+#endif
+
+/*===========================================================================*/
+/* PAL driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define PAL_USE_CALLBACKS FALSE
+#endif
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__)
+#define PAL_USE_WAIT FALSE
+#endif
+
+/*===========================================================================*/
+/* ADC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)
+#define ADC_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define ADC_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* CAN driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Sleep mode related APIs inclusion switch.
+ */
+#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__)
+#define CAN_USE_SLEEP_MODE TRUE
+#endif
+
+/**
+ * @brief Enforces the driver to use direct callbacks rather than OSAL events.
+ */
+#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define CAN_ENFORCE_USE_CALLBACKS FALSE
+#endif
+
+/*===========================================================================*/
+/* CRY driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the SW fall-back of the cryptographic driver.
+ * @details When enabled, this option, activates a fall-back software
+ * implementation for algorithms not supported by the underlying
+ * hardware.
+ * @note Fall-back implementations may not be present for all algorithms.
+ */
+#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_USE_FALLBACK FALSE
+#endif
+
+/**
+ * @brief Makes the driver forcibly use the fall-back implementations.
+ */
+#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_ENFORCE_FALLBACK FALSE
+#endif
+
+/*===========================================================================*/
+/* DAC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__)
+#define DAC_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define DAC_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* I2C driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the mutual exclusion APIs on the I2C bus.
+ */
+#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define I2C_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* MAC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the zero-copy API.
+ */
+#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)
+#define MAC_USE_ZERO_COPY FALSE
+#endif
+
+/**
+ * @brief Enables an event sources for incoming packets.
+ */
+#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__)
+#define MAC_USE_EVENTS TRUE
+#endif
+
+/*===========================================================================*/
+/* MMC_SPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ * This option is recommended also if the SPI driver does not
+ * use a DMA channel and heavily loads the CPU.
+ */
+#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__)
+#define MMC_NICE_WAITING TRUE
+#endif
+
+/*===========================================================================*/
+/* SDC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Number of initialization attempts before rejecting the card.
+ * @note Attempts are performed at 10mS intervals.
+ */
+#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__)
+#define SDC_INIT_RETRY 100
+#endif
+
+/**
+ * @brief Include support for MMC cards.
+ * @note MMC support is not yet implemented so this option must be kept
+ * at @p FALSE.
+ */
+#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__)
+#define SDC_MMC_SUPPORT FALSE
+#endif
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ */
+#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__)
+#define SDC_NICE_WAITING TRUE
+#endif
+
+/**
+ * @brief OCR initialization constant for V20 cards.
+ */
+#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR_V20 0x50FF8000U
+#endif
+
+/**
+ * @brief OCR initialization constant for non-V20 cards.
+ */
+#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR 0x80100000U
+#endif
+
+/*===========================================================================*/
+/* SERIAL driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Default bit rate.
+ * @details Configuration parameter, this is the baud rate selected for the
+ * default configuration.
+ */
+#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)
+#define SERIAL_DEFAULT_BITRATE 38400
+#endif
+
+/**
+ * @brief Serial buffers size.
+ * @details Configuration parameter, you can change the depth of the queue
+ * buffers depending on the requirements of your application.
+ * @note The default is 16 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_BUFFERS_SIZE 16
+#endif
+
+/*===========================================================================*/
+/* SERIAL_USB driver related setting. */
+/*===========================================================================*/
+
+/**
+ * @brief Serial over USB buffers size.
+ * @details Configuration parameter, the buffer size must be a multiple of
+ * the USB data endpoint maximum packet size.
+ * @note The default is 256 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_SIZE 1
+#endif
+
+/**
+ * @brief Serial over USB number of buffers.
+ * @note The default is 2 buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_NUMBER 2
+#endif
+
+/*===========================================================================*/
+/* SPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__)
+#define SPI_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables circular transfers APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__)
+#define SPI_USE_CIRCULAR FALSE
+#endif
+
+
+/**
+ * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define SPI_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/**
+ * @brief Handling method for SPI CS line.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__)
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+#endif
+
+/*===========================================================================*/
+/* UART driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__)
+#define UART_USE_WAIT FALSE
+#endif
+
+/**
+ * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define UART_USE_MUTUAL_EXCLUSION FALSE
+#endif
+
+/*===========================================================================*/
+/* USB driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
+#define USB_USE_WAIT TRUE
+#endif
+
+/*===========================================================================*/
+/* WSPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__)
+#define WSPI_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define WSPI_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+#endif /* HALCONF_H */
+
+/** @} */
diff --git a/keyboards/cannonkeys/devastatingtkl/info.json b/keyboards/cannonkeys/devastatingtkl/info.json
new file mode 100644
index 00000000000..042410e280a
--- /dev/null
+++ b/keyboards/cannonkeys/devastatingtkl/info.json
@@ -0,0 +1,13 @@
+{
+ "keyboard_name": "DevastatingTKL",
+ "url": "https://cannonkeys.com",
+ "maintainer": "awkannan",
+ "width": 18.25,
+ "height": 6.25,
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":1.25, "y":0}, {"label":"F2", "x":2.25, "y":0}, {"label":"F3", "x":3.25, "y":0}, {"label":"F4", "x":4.25, "y":0}, {"label":"F5", "x":5.5, "y":0}, {"label":"F6", "x":6.5, "y":0}, {"label":"F7", "x":7.5, "y":0}, {"label":"F8", "x":8.5, "y":0}, {"label":"F9", "x":9.75, "y":0}, {"label":"F10", "x":10.75, "y":0}, {"label":"F11", "x":11.75, "y":0}, {"label":"F12", "x":12.75, "y":0}, {"x":14, "y":0}, {"label":"PrtSc", "x":15.25, "y":0}, {"label":"Scroll Lock", "x":16.25, "y":0}, {"label":"Pause", "x":17.25, "y":0}, {"label":"~", "x":0, "y":1.25}, {"label":"!", "x":1, "y":1.25}, {"label":"@", "x":2, "y":1.25}, {"label":"#", "x":3, "y":1.25}, {"label":"$", "x":4, "y":1.25}, {"label":"%", "x":5, "y":1.25}, {"label":"^", "x":6, "y":1.25}, {"label":"&", "x":7, "y":1.25}, {"label":"*", "x":8, "y":1.25}, {"label":"(", "x":9, "y":1.25}, {"label":")", "x":10, "y":1.25}, {"label":"_", "x":11, "y":1.25}, {"label":"+", "x":12, "y":1.25}, {"x":13, "y":1.25}, {"x":14, "y":1.25}, {"label":"Insert", "x":15.25, "y":1.25}, {"label":"Home", "x":16.25, "y":1.25}, {"label":"PgUp", "x":17.25, "y":1.25}, {"label":"Tab", "x":0, "y":2.25, "w":1.5}, {"label":"Q", "x":1.5, "y":2.25}, {"label":"W", "x":2.5, "y":2.25}, {"label":"E", "x":3.5, "y":2.25}, {"label":"R", "x":4.5, "y":2.25}, {"label":"T", "x":5.5, "y":2.25}, {"label":"Y", "x":6.5, "y":2.25}, {"label":"U", "x":7.5, "y":2.25}, {"label":"I", "x":8.5, "y":2.25}, {"label":"O", "x":9.5, "y":2.25}, {"label":"P", "x":10.5, "y":2.25}, {"label":"{", "x":11.5, "y":2.25}, {"label":"}", "x":12.5, "y":2.25}, {"label":"|", "x":13.5, "y":2.25, "w":1.5}, {"label":"Delete", "x":15.25, "y":2.25}, {"label":"End", "x":16.25, "y":2.25}, {"label":"PgDn", "x":17.25, "y":2.25}, {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, {"label":"A", "x":1.75, "y":3.25}, {"label":"S", "x":2.75, "y":3.25}, {"label":"D", "x":3.75, "y":3.25}, {"label":"F", "x":4.75, "y":3.25}, {"label":"G", "x":5.75, "y":3.25}, {"label":"H", "x":6.75, "y":3.25}, {"label":"J", "x":7.75, "y":3.25}, {"label":"K", "x":8.75, "y":3.25}, {"label":"L", "x":9.75, "y":3.25}, {"label":":", "x":10.75, "y":3.25}, {"label":"\"", "x":11.75, "y":3.25}, {"x":12.75, "y":3.25}, {"x":13.75, "y":3.25, "w":1.25}, {"label":"Shift", "x":0, "y":4.25, "w":1.25}, {"x":1.25, "y":4.25}, {"label":"Z", "x":2.25, "y":4.25}, {"label":"X", "x":3.25, "y":4.25}, {"label":"C", "x":4.25, "y":4.25}, {"label":"V", "x":5.25, "y":4.25}, {"label":"B", "x":6.25, "y":4.25}, {"label":"N", "x":7.25, "y":4.25}, {"label":"M", "x":8.25, "y":4.25}, {"label":"<", "x":9.25, "y":4.25}, {"label":">", "x":10.25, "y":4.25}, {"label":"?", "x":11.25, "y":4.25}, {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, {"x":14, "y":4.25}, {"label":"\u2191", "x":16.25, "y":4.25}, {"label":"Ctrl", "x":0, "y":5.25, "w":1.25}, {"label":"Win", "x":1.25, "y":5.25, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.25, "w":1.25}, {"x":3.75, "y":5.25, "w":6.25}, {"label":"Alt", "x":10, "y":5.25, "w":1.25}, {"label":"Fn", "x":11.25, "y":5.25, "w":1.25}, {"label":"Menu", "x":12.5, "y":5.25, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":5.25, "w":1.25}, {"label":"\u2190", "x":15.25, "y":5.25}, {"label":"\u2193", "x":16.25, "y":5.25}, {"label":"\u2192", "x":17.25, "y":5.25}]
+ }
+ }
+
+ }
diff --git a/keyboards/cannonkeys/devastatingtkl/keymaps/default/keymap.c b/keyboards/cannonkeys/devastatingtkl/keymaps/default/keymap.c
new file mode 100644
index 00000000000..6b870b6e12c
--- /dev/null
+++ b/keyboards/cannonkeys/devastatingtkl/keymaps/default/keymap.c
@@ -0,0 +1,41 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+enum layer_names {
+ _BASE,
+ _FN1
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_BASE] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MPLY, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_TRNS, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [_FN1] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, KC_TRNS, BL_TOGG, BL_DEC, BL_INC,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_VOLD,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+};
diff --git a/keyboards/cannonkeys/devastatingtkl/keymaps/via/keymap.c b/keyboards/cannonkeys/devastatingtkl/keymaps/via/keymap.c
new file mode 100644
index 00000000000..33f15901ea5
--- /dev/null
+++ b/keyboards/cannonkeys/devastatingtkl/keymaps/via/keymap.c
@@ -0,0 +1,59 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+enum layer_names {
+ _BASE,
+ _FN1,
+ _FN2,
+ _FN3
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_BASE] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_MPLY, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_TRNS, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [_FN1] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, KC_TRNS, BL_TOGG, BL_DEC, BL_INC,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_VOLD,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [_FN2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [_FN3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
+
+};
diff --git a/keyboards/cannonkeys/devastatingtkl/keymaps/via/rules.mk b/keyboards/cannonkeys/devastatingtkl/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/cannonkeys/devastatingtkl/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/cannonkeys/devastatingtkl/mcuconf.h b/keyboards/cannonkeys/devastatingtkl/mcuconf.h
new file mode 100644
index 00000000000..048eb4df650
--- /dev/null
+++ b/keyboards/cannonkeys/devastatingtkl/mcuconf.h
@@ -0,0 +1,176 @@
+/*
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#ifndef _MCUCONF_H_
+#define _MCUCONF_H_
+
+/*
+ * STM32F0xx drivers configuration.
+ * The following settings override the default settings present in
+ * the various device driver implementation headers.
+ * Note that the settings for each driver only have effect if the whole
+ * driver is enabled in halconf.h.
+ *
+ * IRQ priorities:
+ * 3...0 Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3 Lowest...Highest.
+ */
+
+#define STM32F0xx_MCUCONF
+// #define STM32F070xB
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT FALSE
+#define STM32_PVD_ENABLE FALSE
+#define STM32_PLS STM32_PLS_LEV0
+#define STM32_HSI_ENABLED TRUE
+#define STM32_HSI14_ENABLED TRUE
+#define STM32_HSI48_ENABLED FALSE
+#define STM32_LSI_ENABLED TRUE
+#define STM32_HSE_ENABLED FALSE
+#define STM32_LSE_ENABLED FALSE
+#define STM32_SW STM32_SW_PLL
+#define STM32_PLLSRC STM32_PLLSRC_HSI_DIV2
+#define STM32_PREDIV_VALUE 1
+#define STM32_PLLMUL_VALUE 12
+#define STM32_HPRE STM32_HPRE_DIV1
+#define STM32_PPRE STM32_PPRE_DIV1
+#define STM32_ADCSW STM32_ADCSW_HSI14
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_ADCSW STM32_ADCSW_HSI14
+#define STM32_USBSW STM32_USBSW_HSI48
+#define STM32_CECSW STM32_CECSW_HSI
+#define STM32_I2C1SW STM32_I2C1SW_HSI
+#define STM32_USART1SW STM32_USART1SW_PCLK
+#define STM32_RTCSEL STM32_RTCSEL_LSI
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_USE_ADC1 FALSE
+#define STM32_ADC_ADC1_DMA_PRIORITY 2
+#define STM32_ADC_IRQ_PRIORITY 2
+#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2
+
+/*
+ * EXT driver system settings.
+ */
+#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI16_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI17_IRQ_PRIORITY 3
+
+/*
+ * GPT driver system settings.
+ */
+#define STM32_GPT_USE_TIM1 FALSE
+#define STM32_GPT_USE_TIM2 FALSE
+#define STM32_GPT_USE_TIM3 FALSE
+#define STM32_GPT_USE_TIM14 FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY 2
+#define STM32_GPT_TIM2_IRQ_PRIORITY 2
+#define STM32_GPT_TIM3_IRQ_PRIORITY 2
+#define STM32_GPT_TIM14_IRQ_PRIORITY 2
+
+/*
+ * I2C driver system settings.
+ */
+#define STM32_I2C_USE_I2C1 TRUE
+#define STM32_I2C_USE_I2C2 FALSE
+#define STM32_I2C_BUSY_TIMEOUT 50
+#define STM32_I2C_I2C1_IRQ_PRIORITY 3
+#define STM32_I2C_I2C2_IRQ_PRIORITY 3
+#define STM32_I2C_USE_DMA TRUE
+#define STM32_I2C_I2C1_DMA_PRIORITY 1
+#define STM32_I2C_I2C2_DMA_PRIORITY 1
+#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
+#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6)
+#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure")
+
+/*
+ * ICU driver system settings.
+ */
+#define STM32_ICU_USE_TIM1 FALSE
+#define STM32_ICU_USE_TIM2 FALSE
+#define STM32_ICU_USE_TIM3 FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY 3
+#define STM32_ICU_TIM2_IRQ_PRIORITY 3
+#define STM32_ICU_TIM3_IRQ_PRIORITY 3
+
+/*
+ * PWM driver system settings.
+ */
+#define STM32_PWM_USE_ADVANCED FALSE
+#define STM32_PWM_USE_TIM1 FALSE
+#define STM32_PWM_USE_TIM2 FALSE
+#define STM32_PWM_USE_TIM3 TRUE
+#define STM32_PWM_TIM1_IRQ_PRIORITY 3
+#define STM32_PWM_TIM2_IRQ_PRIORITY 3
+#define STM32_PWM_TIM3_IRQ_PRIORITY 3
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1 FALSE
+#define STM32_SERIAL_USE_USART2 FALSE
+#define STM32_SERIAL_USART1_PRIORITY 3
+#define STM32_SERIAL_USART2_PRIORITY 3
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1 FALSE
+#define STM32_SPI_USE_SPI2 TRUE
+#define STM32_SPI_SPI1_DMA_PRIORITY 1
+#define STM32_SPI_SPI2_DMA_PRIORITY 1
+#define STM32_SPI_SPI1_IRQ_PRIORITY 2
+#define STM32_SPI_SPI2_IRQ_PRIORITY 2
+#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5)
+#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY 2
+#define STM32_ST_USE_TIMER 2
+
+/*
+ * UART driver system settings.
+ */
+#define STM32_UART_USE_USART1 FALSE
+#define STM32_UART_USE_USART2 FALSE
+#define STM32_UART_USART1_IRQ_PRIORITY 3
+#define STM32_UART_USART2_IRQ_PRIORITY 3
+#define STM32_UART_USART1_DMA_PRIORITY 0
+#define STM32_UART_USART2_DMA_PRIORITY 0
+#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure")
+
+/*
+ * USB driver system settings.
+ */
+#define STM32_USB_USE_USB1 TRUE
+#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE
+#define STM32_USB_USB1_LP_IRQ_PRIORITY 3
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/cannonkeys/devastatingtkl/readme.md b/keyboards/cannonkeys/devastatingtkl/readme.md
new file mode 100644
index 00000000000..9d706ab65ec
--- /dev/null
+++ b/keyboards/cannonkeys/devastatingtkl/readme.md
@@ -0,0 +1,12 @@
+# CannonKeys DevastatingTKL
+
+DevastatingTKL Keyboard
+
+* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan)
+* Hardware Supported: STM32F072CBT6
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cannonkeys/devastatingtkl:default
+
+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).
diff --git a/keyboards/cannonkeys/devastatingtkl/rules.mk b/keyboards/cannonkeys/devastatingtkl/rules.mk
new file mode 100644
index 00000000000..9c3d0179f6b
--- /dev/null
+++ b/keyboards/cannonkeys/devastatingtkl/rules.mk
@@ -0,0 +1,20 @@
+# MCU name
+MCU = STM32F072
+
+# Build Options
+# comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover
+CUSTOM_MATRIX = no # Custom matrix file
+BACKLIGHT_ENABLE = yes
+RGBLIGHT_ENABLE = yes
+WS2812_DRIVER = spi
+
+# Enter lower-power sleep mode when on the ChibiOS idle thread
+OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
diff --git a/keyboards/cannonkeys/instant60/boards/ST_STM32F072B_DISCOVERY/board.c b/keyboards/cannonkeys/instant60/boards/ST_STM32F072B_DISCOVERY/board.c
deleted file mode 100644
index 7c09bd997cb..00000000000
--- a/keyboards/cannonkeys/instant60/boards/ST_STM32F072B_DISCOVERY/board.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/*
- * This file has been automatically generated using ChibiStudio board
- * generator plugin. Do not edit manually.
- */
-
-#include "hal.h"
-#include "stm32_gpio.h"
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/**
- * @brief Type of STM32 GPIO port setup.
- */
-typedef struct {
- uint32_t moder;
- uint32_t otyper;
- uint32_t ospeedr;
- uint32_t pupdr;
- uint32_t odr;
- uint32_t afrl;
- uint32_t afrh;
-} gpio_setup_t;
-
-/**
- * @brief Type of STM32 GPIO initialization data.
- */
-typedef struct {
-#if STM32_HAS_GPIOA || defined(__DOXYGEN__)
- gpio_setup_t PAData;
-#endif
-#if STM32_HAS_GPIOB || defined(__DOXYGEN__)
- gpio_setup_t PBData;
-#endif
-#if STM32_HAS_GPIOC || defined(__DOXYGEN__)
- gpio_setup_t PCData;
-#endif
-#if STM32_HAS_GPIOD || defined(__DOXYGEN__)
- gpio_setup_t PDData;
-#endif
-#if STM32_HAS_GPIOE || defined(__DOXYGEN__)
- gpio_setup_t PEData;
-#endif
-#if STM32_HAS_GPIOF || defined(__DOXYGEN__)
- gpio_setup_t PFData;
-#endif
-#if STM32_HAS_GPIOG || defined(__DOXYGEN__)
- gpio_setup_t PGData;
-#endif
-#if STM32_HAS_GPIOH || defined(__DOXYGEN__)
- gpio_setup_t PHData;
-#endif
-#if STM32_HAS_GPIOI || defined(__DOXYGEN__)
- gpio_setup_t PIData;
-#endif
-#if STM32_HAS_GPIOJ || defined(__DOXYGEN__)
- gpio_setup_t PJData;
-#endif
-#if STM32_HAS_GPIOK || defined(__DOXYGEN__)
- gpio_setup_t PKData;
-#endif
-} gpio_config_t;
-
-/**
- * @brief STM32 GPIO static initialization data.
- */
-static const gpio_config_t gpio_default_config = {
-#if STM32_HAS_GPIOA
- {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR,
- VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH},
-#endif
-#if STM32_HAS_GPIOB
- {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR,
- VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH},
-#endif
-#if STM32_HAS_GPIOC
- {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR,
- VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH},
-#endif
-#if STM32_HAS_GPIOD
- {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR,
- VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH},
-#endif
-#if STM32_HAS_GPIOE
- {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR,
- VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH},
-#endif
-#if STM32_HAS_GPIOF
- {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR,
- VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH},
-#endif
-#if STM32_HAS_GPIOG
- {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR,
- VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH},
-#endif
-#if STM32_HAS_GPIOH
- {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR,
- VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH},
-#endif
-#if STM32_HAS_GPIOI
- {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR,
- VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH},
-#endif
-#if STM32_HAS_GPIOJ
- {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR,
- VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH},
-#endif
-#if STM32_HAS_GPIOK
- {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR,
- VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH}
-#endif
-};
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) {
-
- gpiop->OTYPER = config->otyper;
- gpiop->OSPEEDR = config->ospeedr;
- gpiop->PUPDR = config->pupdr;
- gpiop->ODR = config->odr;
- gpiop->AFRL = config->afrl;
- gpiop->AFRH = config->afrh;
- gpiop->MODER = config->moder;
-}
-
-static void stm32_gpio_init(void) {
-
- /* Enabling GPIO-related clocks, the mask comes from the
- registry header file.*/
- rccResetAHB(STM32_GPIO_EN_MASK);
- rccEnableAHB(STM32_GPIO_EN_MASK, true);
-
- /* Initializing all the defined GPIO ports.*/
-#if STM32_HAS_GPIOA
- gpio_init(GPIOA, &gpio_default_config.PAData);
-#endif
-#if STM32_HAS_GPIOB
- gpio_init(GPIOB, &gpio_default_config.PBData);
-#endif
-#if STM32_HAS_GPIOC
- gpio_init(GPIOC, &gpio_default_config.PCData);
-#endif
-#if STM32_HAS_GPIOD
- gpio_init(GPIOD, &gpio_default_config.PDData);
-#endif
-#if STM32_HAS_GPIOE
- gpio_init(GPIOE, &gpio_default_config.PEData);
-#endif
-#if STM32_HAS_GPIOF
- gpio_init(GPIOF, &gpio_default_config.PFData);
-#endif
-#if STM32_HAS_GPIOG
- gpio_init(GPIOG, &gpio_default_config.PGData);
-#endif
-#if STM32_HAS_GPIOH
- gpio_init(GPIOH, &gpio_default_config.PHData);
-#endif
-#if STM32_HAS_GPIOI
- gpio_init(GPIOI, &gpio_default_config.PIData);
-#endif
-#if STM32_HAS_GPIOJ
- gpio_init(GPIOJ, &gpio_default_config.PJData);
-#endif
-#if STM32_HAS_GPIOK
- gpio_init(GPIOK, &gpio_default_config.PKData);
-#endif
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Early initialization code.
- * @details GPIO ports and system clocks are initialized before everything
- * else.
- */
-void __early_init(void) {
- extern void enter_bootloader_mode_if_requested(void);
- enter_bootloader_mode_if_requested();
- stm32_gpio_init();
- stm32_clock_init();
-}
-
-#if HAL_USE_SDC || defined(__DOXYGEN__)
-/**
- * @brief SDC card detection.
- */
-bool sdc_lld_is_card_inserted(SDCDriver *sdcp) {
-
- (void)sdcp;
- /* TODO: Fill the implementation.*/
- return true;
-}
-
-/**
- * @brief SDC card write protection detection.
- */
-bool sdc_lld_is_write_protected(SDCDriver *sdcp) {
-
- (void)sdcp;
- /* TODO: Fill the implementation.*/
- return false;
-}
-#endif /* HAL_USE_SDC */
-
-#if HAL_USE_MMC_SPI || defined(__DOXYGEN__)
-/**
- * @brief MMC_SPI card detection.
- */
-bool mmc_lld_is_card_inserted(MMCDriver *mmcp) {
-
- (void)mmcp;
- /* TODO: Fill the implementation.*/
- return true;
-}
-
-/**
- * @brief MMC_SPI card write protection detection.
- */
-bool mmc_lld_is_write_protected(MMCDriver *mmcp) {
-
- (void)mmcp;
- /* TODO: Fill the implementation.*/
- return false;
-}
-#endif
-
-/**
- * @brief Board-specific initialization code.
- * @todo Add your board-specific code, if any.
- */
-void boardInit(void) {
- SYSCFG->CFGR1 |= SYSCFG_CFGR1_I2C1_DMA_RMP;
- SYSCFG->CFGR1 &= ~(SYSCFG_CFGR1_SPI2_DMA_RMP);
-}
diff --git a/keyboards/cannonkeys/instant60/boards/ST_STM32F072B_DISCOVERY/board.h b/keyboards/cannonkeys/instant60/boards/ST_STM32F072B_DISCOVERY/board.h
deleted file mode 100644
index 57636d1f12f..00000000000
--- a/keyboards/cannonkeys/instant60/boards/ST_STM32F072B_DISCOVERY/board.h
+++ /dev/null
@@ -1,940 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/*
- * This file has been automatically generated using ChibiStudio board
- * generator plugin. Do not edit manually.
- */
-
-#ifndef BOARD_H
-#define BOARD_H
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*
- * Setup for ST STM32F072B-Discovery board.
- */
-
-/*
- * Board identifier.
- */
-#define BOARD_ST_STM32F072B_DISCOVERY
-#define BOARD_NAME "ST STM32F072B-Discovery"
-
-/*
- * Board oscillators-related settings.
- * NOTE: HSE not fitted.
- */
-#if !defined(STM32_LSECLK)
-#define STM32_LSECLK 32768
-#endif
-
-#define STM32_LSEDRV (3U << 3U)
-
-#if !defined(STM32_HSECLK)
-#define STM32_HSECLK 0U
-#endif
-
-#define STM32_HSE_BYPASS
-
-/*
- * MCU type as defined in the ST header.
- */
-#define STM32F072xB
-
-/*
- * IO pins assignments.
- */
-#define GPIOA_BUTTON 0U
-#define GPIOA_PIN1 1U
-#define GPIOA_PIN2 2U
-#define GPIOA_PIN3 3U
-#define GPIOA_PIN4 4U
-#define GPIOA_PIN5 5U
-#define GPIOA_PIN6 6U
-#define GPIOA_PIN7 7U
-#define GPIOA_PIN8 8U
-#define GPIOA_PIN9 9U
-#define GPIOA_PIN10 10U
-#define GPIOA_USB_DM 11U
-#define GPIOA_USB_DP 12U
-#define GPIOA_SWDIO 13U
-#define GPIOA_SWCLK 14U
-#define GPIOA_PIN15 15U
-
-#define GPIOB_PIN0 0U
-#define GPIOB_PIN1 1U
-#define GPIOB_PIN2 2U
-#define GPIOB_PIN3 3U
-#define GPIOB_PIN4 4U
-#define GPIOB_PIN5 5U
-#define GPIOB_PIN6 6U
-#define GPIOB_PIN7 7U
-#define GPIOB_PIN8 8U
-#define GPIOB_PIN9 9U
-#define GPIOB_PIN10 10U
-#define GPIOB_PIN11 11U
-#define GPIOB_PIN12 12U
-#define GPIOB_SPI2_SCK 13U
-#define GPIOB_SPI2_MISO 14U
-#define GPIOB_SPI2_MOSI 15U
-
-#define GPIOC_MEMS_CS 0U
-#define GPIOC_PIN1 1U
-#define GPIOC_PIN2 2U
-#define GPIOC_PIN3 3U
-#define GPIOC_PIN4 4U
-#define GPIOC_PIN5 5U
-#define GPIOC_LED_RED 6U
-#define GPIOC_LED_BLUE 7U
-#define GPIOC_LED_ORANGE 8U
-#define GPIOC_LED_GREEN 9U
-#define GPIOC_PIN10 10U
-#define GPIOC_PIN11 11U
-#define GPIOC_PIN12 12U
-#define GPIOC_PIN13 13U
-#define GPIOC_OSC32_IN 14U
-#define GPIOC_OSC32_OUT 15U
-
-#define GPIOD_PIN0 0U
-#define GPIOD_PIN1 1U
-#define GPIOD_PIN2 2U
-#define GPIOD_PIN3 3U
-#define GPIOD_PIN4 4U
-#define GPIOD_PIN5 5U
-#define GPIOD_PIN6 6U
-#define GPIOD_PIN7 7U
-#define GPIOD_PIN8 8U
-#define GPIOD_PIN9 9U
-#define GPIOD_PIN10 10U
-#define GPIOD_PIN11 11U
-#define GPIOD_PIN12 12U
-#define GPIOD_PIN13 13U
-#define GPIOD_PIN14 14U
-#define GPIOD_PIN15 15U
-
-#define GPIOE_PIN0 0U
-#define GPIOE_PIN1 1U
-#define GPIOE_PIN2 2U
-#define GPIOE_PIN3 3U
-#define GPIOE_PIN4 4U
-#define GPIOE_PIN5 5U
-#define GPIOE_PIN6 6U
-#define GPIOE_PIN7 7U
-#define GPIOE_PIN8 8U
-#define GPIOE_PIN9 9U
-#define GPIOE_PIN10 10U
-#define GPIOE_PIN11 11U
-#define GPIOE_PIN12 12U
-#define GPIOE_PIN13 13U
-#define GPIOE_PIN14 14U
-#define GPIOE_PIN15 15U
-
-#define GPIOF_OSC_IN 0U
-#define GPIOF_OSC_OUT 1U
-#define GPIOF_PIN2 2U
-#define GPIOF_PIN3 3U
-#define GPIOF_PIN4 4U
-#define GPIOF_PIN5 5U
-#define GPIOF_PIN6 6U
-#define GPIOF_PIN7 7U
-#define GPIOF_PIN8 8U
-#define GPIOF_PIN9 9U
-#define GPIOF_PIN10 10U
-#define GPIOF_PIN11 11U
-#define GPIOF_PIN12 12U
-#define GPIOF_PIN13 13U
-#define GPIOF_PIN14 14U
-#define GPIOF_PIN15 15U
-
-/*
- * IO lines assignments.
- */
-#define LINE_BUTTON PAL_LINE(GPIOA, 0U)
-#define LINE_USB_DM PAL_LINE(GPIOA, 11U)
-#define LINE_USB_DP PAL_LINE(GPIOA, 12U)
-#define LINE_SWDIO PAL_LINE(GPIOA, 13U)
-#define LINE_SWCLK PAL_LINE(GPIOA, 14U)
-#define LINE_SPI2_SCK PAL_LINE(GPIOB, 13U)
-#define LINE_SPI2_MISO PAL_LINE(GPIOB, 14U)
-#define LINE_SPI2_MOSI PAL_LINE(GPIOB, 15U)
-#define LINE_MEMS_CS PAL_LINE(GPIOC, 0U)
-#define LINE_LED_RED PAL_LINE(GPIOC, 6U)
-#define LINE_LED_BLUE PAL_LINE(GPIOC, 7U)
-#define LINE_LED_ORANGE PAL_LINE(GPIOC, 8U)
-#define LINE_LED_GREEN PAL_LINE(GPIOC, 9U)
-#define LINE_OSC32_IN PAL_LINE(GPIOC, 14U)
-#define LINE_OSC32_OUT PAL_LINE(GPIOC, 15U)
-#define LINE_OSC_IN PAL_LINE(GPIOF, 0U)
-#define LINE_OSC_OUT PAL_LINE(GPIOF, 1U)
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/*
- * I/O ports initial setup, this configuration is established soon after reset
- * in the initialization code.
- * Please refer to the STM32 Reference Manual for details.
- */
-#define PIN_MODE_INPUT(n) (0U << ((n) * 2U))
-#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U))
-#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U))
-#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U))
-#define PIN_ODR_LOW(n) (0U << (n))
-#define PIN_ODR_HIGH(n) (1U << (n))
-#define PIN_OTYPE_PUSHPULL(n) (0U << (n))
-#define PIN_OTYPE_OPENDRAIN(n) (1U << (n))
-#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U))
-#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U))
-#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U))
-#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U))
-#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U))
-#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U))
-#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U))
-#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U))
-
-/*
- * GPIOA setup:
- *
- * PA0 - BUTTON (input floating).
- * PA1 - PIN1 (input pullup).
- * PA2 - PIN2 (input pullup).
- * PA3 - PIN3 (input pullup).
- * PA4 - PIN4 (input pullup).
- * PA5 - PIN5 (input pullup).
- * PA6 - PIN6 (input pullup).
- * PA7 - PIN7 (input pullup).
- * PA8 - PIN8 (input pullup).
- * PA9 - PIN9 (input pullup).
- * PA10 - PIN10 (input pullup).
- * PA11 - USB_DM (input floating).
- * PA12 - USB_DP (input floating).
- * PA13 - SWDIO (alternate 0).
- * PA14 - SWCLK (alternate 0).
- * PA15 - PIN15 (input pullup).
- */
-#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \
- PIN_MODE_INPUT(GPIOA_PIN1) | \
- PIN_MODE_INPUT(GPIOA_PIN2) | \
- PIN_MODE_INPUT(GPIOA_PIN3) | \
- PIN_MODE_INPUT(GPIOA_PIN4) | \
- PIN_MODE_INPUT(GPIOA_PIN5) | \
- PIN_MODE_INPUT(GPIOA_PIN6) | \
- PIN_MODE_INPUT(GPIOA_PIN7) | \
- PIN_MODE_INPUT(GPIOA_PIN8) | \
- PIN_MODE_INPUT(GPIOA_PIN9) | \
- PIN_MODE_INPUT(GPIOA_PIN10) | \
- PIN_MODE_INPUT(GPIOA_USB_DM) | \
- PIN_MODE_INPUT(GPIOA_USB_DP) | \
- PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \
- PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \
- PIN_MODE_INPUT(GPIOA_PIN15))
-#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_BUTTON) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \
- PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \
- PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \
- PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN15))
-#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_BUTTON) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOA_USB_DM) | \
- PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \
- PIN_OSPEED_HIGH(GPIOA_SWDIO) | \
- PIN_OSPEED_HIGH(GPIOA_SWCLK) | \
- PIN_OSPEED_HIGH(GPIOA_PIN15))
-#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN10) | \
- PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \
- PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \
- PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \
- PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN15))
-#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_BUTTON) | \
- PIN_ODR_HIGH(GPIOA_PIN1) | \
- PIN_ODR_HIGH(GPIOA_PIN2) | \
- PIN_ODR_HIGH(GPIOA_PIN3) | \
- PIN_ODR_HIGH(GPIOA_PIN4) | \
- PIN_ODR_HIGH(GPIOA_PIN5) | \
- PIN_ODR_HIGH(GPIOA_PIN6) | \
- PIN_ODR_HIGH(GPIOA_PIN7) | \
- PIN_ODR_HIGH(GPIOA_PIN8) | \
- PIN_ODR_HIGH(GPIOA_PIN9) | \
- PIN_ODR_HIGH(GPIOA_PIN10) | \
- PIN_ODR_HIGH(GPIOA_USB_DM) | \
- PIN_ODR_HIGH(GPIOA_USB_DP) | \
- PIN_ODR_HIGH(GPIOA_SWDIO) | \
- PIN_ODR_HIGH(GPIOA_SWCLK) | \
- PIN_ODR_HIGH(GPIOA_PIN15))
-#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_BUTTON, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN7, 0U))
-#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOA_USB_DM, 0U) | \
- PIN_AFIO_AF(GPIOA_USB_DP, 0U) | \
- PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \
- PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN15, 0U))
-
-/*
- * GPIOB setup:
- *
- * PB0 - PIN0 (input pullup).
- * PB1 - PIN1 (input pullup).
- * PB2 - PIN2 (input pullup).
- * PB3 - PIN3 (input pullup).
- * PB4 - PIN4 (input pullup).
- * PB5 - PIN5 (input pullup).
- * PB6 - PIN6 (input pullup).
- * PB7 - PIN7 (input pullup).
- * PB8 - PIN8 (input pullup).
- * PB9 - PIN9 (input pullup).
- * PB10 - PIN10 (input pullup).
- * PB11 - PIN11 (input pullup).
- * PB12 - PIN12 (input pullup).
- * PB13 - SPI2_SCK (alternate 0).
- * PB14 - SPI2_MISO (alternate 0).
- * PB15 - SPI2_MOSI (alternate 0).
- */
-#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \
- PIN_MODE_INPUT(GPIOB_PIN1) | \
- PIN_MODE_INPUT(GPIOB_PIN2) | \
- PIN_MODE_INPUT(GPIOB_PIN3) | \
- PIN_MODE_INPUT(GPIOB_PIN4) | \
- PIN_MODE_INPUT(GPIOB_PIN5) | \
- PIN_MODE_INPUT(GPIOB_PIN6) | \
- PIN_MODE_INPUT(GPIOB_PIN7) | \
- PIN_MODE_INPUT(GPIOB_PIN8) | \
- PIN_MODE_INPUT(GPIOB_PIN9) | \
- PIN_MODE_INPUT(GPIOB_PIN10) | \
- PIN_MODE_INPUT(GPIOB_PIN11) | \
- PIN_MODE_INPUT(GPIOB_PIN12) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_SCK) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_MISO) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_SCK) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MISO) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \
- PIN_OSPEED_HIGH(GPIOB_PIN2) | \
- PIN_OSPEED_HIGH(GPIOB_PIN3) | \
- PIN_OSPEED_HIGH(GPIOB_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_SCK) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_MISO) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN12) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_SCK) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_MISO) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \
- PIN_ODR_HIGH(GPIOB_PIN1) | \
- PIN_ODR_HIGH(GPIOB_PIN2) | \
- PIN_ODR_HIGH(GPIOB_PIN3) | \
- PIN_ODR_HIGH(GPIOB_PIN4) | \
- PIN_ODR_HIGH(GPIOB_PIN5) | \
- PIN_ODR_HIGH(GPIOB_PIN6) | \
- PIN_ODR_HIGH(GPIOB_PIN7) | \
- PIN_ODR_HIGH(GPIOB_PIN8) | \
- PIN_ODR_HIGH(GPIOB_PIN9) | \
- PIN_ODR_HIGH(GPIOB_PIN10) | \
- PIN_ODR_HIGH(GPIOB_PIN11) | \
- PIN_ODR_HIGH(GPIOB_PIN12) | \
- PIN_ODR_HIGH(GPIOB_SPI2_SCK) | \
- PIN_ODR_HIGH(GPIOB_SPI2_MISO) | \
- PIN_ODR_HIGH(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN7, 0U))
-#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_SCK, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_MISO, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_MOSI, 0U))
-
-/*
- * GPIOC setup:
- *
- * PC0 - MEMS_CS (output pushpull maximum).
- * PC1 - PIN1 (input pullup).
- * PC2 - PIN2 (input pullup).
- * PC3 - PIN3 (input pullup).
- * PC4 - PIN4 (input pullup).
- * PC5 - PIN5 (input pullup).
- * PC6 - LED_RED (output pushpull maximum).
- * PC7 - LED_BLUE (output pushpull maximum).
- * PC8 - LED_ORANGE (output pushpull maximum).
- * PC9 - LED_GREEN (output pushpull maximum).
- * PC10 - PIN10 (input pullup).
- * PC11 - PIN11 (input pullup).
- * PC12 - PIN12 (input pullup).
- * PC13 - PIN13 (input pullup).
- * PC14 - OSC32_IN (input floating).
- * PC15 - OSC32_OUT (input floating).
- */
-#define VAL_GPIOC_MODER (PIN_MODE_OUTPUT(GPIOC_MEMS_CS) | \
- PIN_MODE_INPUT(GPIOC_PIN1) | \
- PIN_MODE_INPUT(GPIOC_PIN2) | \
- PIN_MODE_INPUT(GPIOC_PIN3) | \
- PIN_MODE_INPUT(GPIOC_PIN4) | \
- PIN_MODE_INPUT(GPIOC_PIN5) | \
- PIN_MODE_OUTPUT(GPIOC_LED_RED) | \
- PIN_MODE_OUTPUT(GPIOC_LED_BLUE) | \
- PIN_MODE_OUTPUT(GPIOC_LED_ORANGE) | \
- PIN_MODE_OUTPUT(GPIOC_LED_GREEN) | \
- PIN_MODE_INPUT(GPIOC_PIN10) | \
- PIN_MODE_INPUT(GPIOC_PIN11) | \
- PIN_MODE_INPUT(GPIOC_PIN12) | \
- PIN_MODE_INPUT(GPIOC_PIN13) | \
- PIN_MODE_INPUT(GPIOC_OSC32_IN) | \
- PIN_MODE_INPUT(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_MEMS_CS) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_RED) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_BLUE) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_ORANGE) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_GREEN) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \
- PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_MEMS_CS) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \
- PIN_OSPEED_HIGH(GPIOC_LED_RED) | \
- PIN_OSPEED_HIGH(GPIOC_LED_BLUE) | \
- PIN_OSPEED_HIGH(GPIOC_LED_ORANGE) | \
- PIN_OSPEED_HIGH(GPIOC_LED_GREEN) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \
- PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \
- PIN_OSPEED_HIGH(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_MEMS_CS) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN5) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_RED) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_BLUE) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_ORANGE) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_GREEN) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN13) | \
- PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \
- PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_MEMS_CS) | \
- PIN_ODR_HIGH(GPIOC_PIN1) | \
- PIN_ODR_HIGH(GPIOC_PIN2) | \
- PIN_ODR_HIGH(GPIOC_PIN3) | \
- PIN_ODR_HIGH(GPIOC_PIN4) | \
- PIN_ODR_HIGH(GPIOC_PIN5) | \
- PIN_ODR_LOW(GPIOC_LED_RED) | \
- PIN_ODR_LOW(GPIOC_LED_BLUE) | \
- PIN_ODR_LOW(GPIOC_LED_ORANGE) | \
- PIN_ODR_LOW(GPIOC_LED_GREEN) | \
- PIN_ODR_HIGH(GPIOC_PIN10) | \
- PIN_ODR_HIGH(GPIOC_PIN11) | \
- PIN_ODR_HIGH(GPIOC_PIN12) | \
- PIN_ODR_HIGH(GPIOC_PIN13) | \
- PIN_ODR_HIGH(GPIOC_OSC32_IN) | \
- PIN_ODR_HIGH(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_MEMS_CS, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_RED, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_BLUE, 0U))
-#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_LED_ORANGE, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_GREEN, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \
- PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U))
-
-/*
- * GPIOD setup:
- *
- * PD0 - PIN0 (input pullup).
- * PD1 - PIN1 (input pullup).
- * PD2 - PIN2 (input pullup).
- * PD3 - PIN3 (input pullup).
- * PD4 - PIN4 (input pullup).
- * PD5 - PIN5 (input pullup).
- * PD6 - PIN6 (input pullup).
- * PD7 - PIN7 (input pullup).
- * PD8 - PIN8 (input pullup).
- * PD9 - PIN9 (input pullup).
- * PD10 - PIN10 (input pullup).
- * PD11 - PIN11 (input pullup).
- * PD12 - PIN12 (input pullup).
- * PD13 - PIN13 (input pullup).
- * PD14 - PIN14 (input pullup).
- * PD15 - PIN15 (input pullup).
- */
-#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \
- PIN_MODE_INPUT(GPIOD_PIN1) | \
- PIN_MODE_INPUT(GPIOD_PIN2) | \
- PIN_MODE_INPUT(GPIOD_PIN3) | \
- PIN_MODE_INPUT(GPIOD_PIN4) | \
- PIN_MODE_INPUT(GPIOD_PIN5) | \
- PIN_MODE_INPUT(GPIOD_PIN6) | \
- PIN_MODE_INPUT(GPIOD_PIN7) | \
- PIN_MODE_INPUT(GPIOD_PIN8) | \
- PIN_MODE_INPUT(GPIOD_PIN9) | \
- PIN_MODE_INPUT(GPIOD_PIN10) | \
- PIN_MODE_INPUT(GPIOD_PIN11) | \
- PIN_MODE_INPUT(GPIOD_PIN12) | \
- PIN_MODE_INPUT(GPIOD_PIN13) | \
- PIN_MODE_INPUT(GPIOD_PIN14) | \
- PIN_MODE_INPUT(GPIOD_PIN15))
-#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN15))
-#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN15))
-#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN15))
-#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \
- PIN_ODR_HIGH(GPIOD_PIN1) | \
- PIN_ODR_HIGH(GPIOD_PIN2) | \
- PIN_ODR_HIGH(GPIOD_PIN3) | \
- PIN_ODR_HIGH(GPIOD_PIN4) | \
- PIN_ODR_HIGH(GPIOD_PIN5) | \
- PIN_ODR_HIGH(GPIOD_PIN6) | \
- PIN_ODR_HIGH(GPIOD_PIN7) | \
- PIN_ODR_HIGH(GPIOD_PIN8) | \
- PIN_ODR_HIGH(GPIOD_PIN9) | \
- PIN_ODR_HIGH(GPIOD_PIN10) | \
- PIN_ODR_HIGH(GPIOD_PIN11) | \
- PIN_ODR_HIGH(GPIOD_PIN12) | \
- PIN_ODR_HIGH(GPIOD_PIN13) | \
- PIN_ODR_HIGH(GPIOD_PIN14) | \
- PIN_ODR_HIGH(GPIOD_PIN15))
-#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN7, 0U))
-#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN15, 0U))
-
-/*
- * GPIOE setup:
- *
- * PE0 - PIN0 (input pullup).
- * PE1 - PIN1 (input pullup).
- * PE2 - PIN2 (input pullup).
- * PE3 - PIN3 (input pullup).
- * PE4 - PIN4 (input pullup).
- * PE5 - PIN5 (input pullup).
- * PE6 - PIN6 (input pullup).
- * PE7 - PIN7 (input pullup).
- * PE8 - PIN8 (input pullup).
- * PE9 - PIN9 (input pullup).
- * PE10 - PIN10 (input pullup).
- * PE11 - PIN11 (input pullup).
- * PE12 - PIN12 (input pullup).
- * PE13 - PIN13 (input pullup).
- * PE14 - PIN14 (input pullup).
- * PE15 - PIN15 (input pullup).
- */
-#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \
- PIN_MODE_INPUT(GPIOE_PIN1) | \
- PIN_MODE_INPUT(GPIOE_PIN2) | \
- PIN_MODE_INPUT(GPIOE_PIN3) | \
- PIN_MODE_INPUT(GPIOE_PIN4) | \
- PIN_MODE_INPUT(GPIOE_PIN5) | \
- PIN_MODE_INPUT(GPIOE_PIN6) | \
- PIN_MODE_INPUT(GPIOE_PIN7) | \
- PIN_MODE_INPUT(GPIOE_PIN8) | \
- PIN_MODE_INPUT(GPIOE_PIN9) | \
- PIN_MODE_INPUT(GPIOE_PIN10) | \
- PIN_MODE_INPUT(GPIOE_PIN11) | \
- PIN_MODE_INPUT(GPIOE_PIN12) | \
- PIN_MODE_INPUT(GPIOE_PIN13) | \
- PIN_MODE_INPUT(GPIOE_PIN14) | \
- PIN_MODE_INPUT(GPIOE_PIN15))
-#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN15))
-#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN15))
-#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN15))
-#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \
- PIN_ODR_HIGH(GPIOE_PIN1) | \
- PIN_ODR_HIGH(GPIOE_PIN2) | \
- PIN_ODR_HIGH(GPIOE_PIN3) | \
- PIN_ODR_HIGH(GPIOE_PIN4) | \
- PIN_ODR_HIGH(GPIOE_PIN5) | \
- PIN_ODR_HIGH(GPIOE_PIN6) | \
- PIN_ODR_HIGH(GPIOE_PIN7) | \
- PIN_ODR_HIGH(GPIOE_PIN8) | \
- PIN_ODR_HIGH(GPIOE_PIN9) | \
- PIN_ODR_HIGH(GPIOE_PIN10) | \
- PIN_ODR_HIGH(GPIOE_PIN11) | \
- PIN_ODR_HIGH(GPIOE_PIN12) | \
- PIN_ODR_HIGH(GPIOE_PIN13) | \
- PIN_ODR_HIGH(GPIOE_PIN14) | \
- PIN_ODR_HIGH(GPIOE_PIN15))
-#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN7, 0U))
-#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN15, 0U))
-
-/*
- * GPIOF setup:
- *
- * PF0 - OSC_IN (input floating).
- * PF1 - OSC_OUT (input floating).
- * PF2 - PIN2 (input pullup).
- * PF3 - PIN3 (input pullup).
- * PF4 - PIN4 (input pullup).
- * PF5 - PIN5 (input pullup).
- * PF6 - PIN6 (input pullup).
- * PF7 - PIN7 (input pullup).
- * PF8 - PIN8 (input pullup).
- * PF9 - PIN9 (input pullup).
- * PF10 - PIN10 (input pullup).
- * PF11 - PIN11 (input pullup).
- * PF12 - PIN12 (input pullup).
- * PF13 - PIN13 (input pullup).
- * PF14 - PIN14 (input pullup).
- * PF15 - PIN15 (input pullup).
- */
-#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \
- PIN_MODE_INPUT(GPIOF_OSC_OUT) | \
- PIN_MODE_INPUT(GPIOF_PIN2) | \
- PIN_MODE_INPUT(GPIOF_PIN3) | \
- PIN_MODE_INPUT(GPIOF_PIN4) | \
- PIN_MODE_INPUT(GPIOF_PIN5) | \
- PIN_MODE_INPUT(GPIOF_PIN6) | \
- PIN_MODE_INPUT(GPIOF_PIN7) | \
- PIN_MODE_INPUT(GPIOF_PIN8) | \
- PIN_MODE_INPUT(GPIOF_PIN9) | \
- PIN_MODE_INPUT(GPIOF_PIN10) | \
- PIN_MODE_INPUT(GPIOF_PIN11) | \
- PIN_MODE_INPUT(GPIOF_PIN12) | \
- PIN_MODE_INPUT(GPIOF_PIN13) | \
- PIN_MODE_INPUT(GPIOF_PIN14) | \
- PIN_MODE_INPUT(GPIOF_PIN15))
-#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \
- PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN15))
-#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOF_OSC_IN) | \
- PIN_OSPEED_VERYLOW(GPIOF_OSC_OUT) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN15))
-#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \
- PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN15))
-#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \
- PIN_ODR_HIGH(GPIOF_OSC_OUT) | \
- PIN_ODR_HIGH(GPIOF_PIN2) | \
- PIN_ODR_HIGH(GPIOF_PIN3) | \
- PIN_ODR_HIGH(GPIOF_PIN4) | \
- PIN_ODR_HIGH(GPIOF_PIN5) | \
- PIN_ODR_HIGH(GPIOF_PIN6) | \
- PIN_ODR_HIGH(GPIOF_PIN7) | \
- PIN_ODR_HIGH(GPIOF_PIN8) | \
- PIN_ODR_HIGH(GPIOF_PIN9) | \
- PIN_ODR_HIGH(GPIOF_PIN10) | \
- PIN_ODR_HIGH(GPIOF_PIN11) | \
- PIN_ODR_HIGH(GPIOF_PIN12) | \
- PIN_ODR_HIGH(GPIOF_PIN13) | \
- PIN_ODR_HIGH(GPIOF_PIN14) | \
- PIN_ODR_HIGH(GPIOF_PIN15))
-#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \
- PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN7, 0U))
-#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN15, 0U))
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#if !defined(_FROM_ASM_)
-#ifdef __cplusplus
-extern "C" {
-#endif
- void boardInit(void);
-#ifdef __cplusplus
-}
-#endif
-#endif /* _FROM_ASM_ */
-
-#endif /* BOARD_H */
diff --git a/keyboards/cannonkeys/instant60/boards/ST_STM32F072B_DISCOVERY/board.mk b/keyboards/cannonkeys/instant60/boards/ST_STM32F072B_DISCOVERY/board.mk
deleted file mode 100644
index b98dcdd26c6..00000000000
--- a/keyboards/cannonkeys/instant60/boards/ST_STM32F072B_DISCOVERY/board.mk
+++ /dev/null
@@ -1,5 +0,0 @@
-# List of all the board related files.
-BOARDSRC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY/board.c
-
-# Required include directories
-BOARDINC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY
diff --git a/keyboards/cannonkeys/instant60/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg b/keyboards/cannonkeys/instant60/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg
deleted file mode 100644
index 9c7cf4fd76a..00000000000
--- a/keyboards/cannonkeys/instant60/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg
+++ /dev/null
@@ -1,703 +0,0 @@
-
-
-
-
- resources/gencfg/processors/boards/stm32f0xx/templates
- ..
- 3.0.x
-
- ST STM32F072B-Discovery
- ST_STM32F072B_DISCOVERY
-
- STM32F072xB
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/keyboards/cannonkeys/instant60/chconf.h b/keyboards/cannonkeys/instant60/chconf.h
index 4640ff5332b..03f63da36a8 100644
--- a/keyboards/cannonkeys/instant60/chconf.h
+++ b/keyboards/cannonkeys/instant60/chconf.h
@@ -331,7 +331,7 @@
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE FALSE
+#define CH_CFG_USE_MEMCORE TRUE
#endif
/**
diff --git a/keyboards/cannonkeys/instant60/config.h b/keyboards/cannonkeys/instant60/config.h
index 6f8f6bd011d..73b2ad533b3 100644
--- a/keyboards/cannonkeys/instant60/config.h
+++ b/keyboards/cannonkeys/instant60/config.h
@@ -33,6 +33,10 @@ along with this program. If not, see .
#define MATRIX_ROW_PINS { B1, B0, A7, A5, A4 }
#define DIODE_DIRECTION COL2ROW
+#define BACKLIGHT_PIN A6
+#define BACKLIGHT_PWM_DRIVER PWMD3
+#define BACKLIGHT_PWM_CHANNEL 1
+#define BACKLIGHT_PAL_MODE 1
#define BACKLIGHT_LEVELS 6
#define BACKLIGHT_BREATHING
#define BREATHING_PERIOD 6
@@ -49,22 +53,10 @@ along with this program. If not, see .
#define LOCKING_RESYNC_ENABLE
#define RGBLIGHT_ANIMATIONS
-
-#define WS2812_LED_N 14
-#define RGBLED_NUM WS2812_LED_N
-#define PORT_WS2812 GPIOB
-#define PIN_WS2812 15
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 14
#define WS2812_SPI SPID2
-
-// Backlight config starts after VIA's EEPROM usage,
-// dynamic keymaps start after this.
-#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
-
-// VIA lighting is handled by the keyboard-level code
-#define VIA_CUSTOM_LIGHTING_ENABLE
-
-// Let VIA handle the QMK RGBLIGHT
-#define VIA_QMK_RGBLIGHT_ENABLE
+#define WS2812_SPI_MOSI_PAL_MODE 0
/*
* Feature disable options
diff --git a/keyboards/cannonkeys/instant60/rules.mk b/keyboards/cannonkeys/instant60/rules.mk
index 7ae14c4986f..b863bfaddd0 100644
--- a/keyboards/cannonkeys/instant60/rules.mk
+++ b/keyboards/cannonkeys/instant60/rules.mk
@@ -1,16 +1,10 @@
# MCU name
MCU = STM32F072
-BOARD = ST_STM32F072B_DISCOVERY
# Build Options
# comment out to disable the options.
#
-# project specific files
-VPATH += keyboards/cannonkeys/stm32f072
-SRC = keyboard.c \
- led.c
-
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
@@ -19,8 +13,9 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover
CUSTOM_MATRIX = no # Custom matrix file
-# BACKLIGHT_ENABLE = yes # This is broken on 072 for some reason
+BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
+WS2812_DRIVER = spi
LAYOUTS = 60_ansi 60_tsangan_hhkb
diff --git a/keyboards/cannonkeys/iron165/boards/ST_STM32F072B_DISCOVERY/board.c b/keyboards/cannonkeys/iron165/boards/ST_STM32F072B_DISCOVERY/board.c
deleted file mode 100644
index 7c09bd997cb..00000000000
--- a/keyboards/cannonkeys/iron165/boards/ST_STM32F072B_DISCOVERY/board.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/*
- * This file has been automatically generated using ChibiStudio board
- * generator plugin. Do not edit manually.
- */
-
-#include "hal.h"
-#include "stm32_gpio.h"
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/**
- * @brief Type of STM32 GPIO port setup.
- */
-typedef struct {
- uint32_t moder;
- uint32_t otyper;
- uint32_t ospeedr;
- uint32_t pupdr;
- uint32_t odr;
- uint32_t afrl;
- uint32_t afrh;
-} gpio_setup_t;
-
-/**
- * @brief Type of STM32 GPIO initialization data.
- */
-typedef struct {
-#if STM32_HAS_GPIOA || defined(__DOXYGEN__)
- gpio_setup_t PAData;
-#endif
-#if STM32_HAS_GPIOB || defined(__DOXYGEN__)
- gpio_setup_t PBData;
-#endif
-#if STM32_HAS_GPIOC || defined(__DOXYGEN__)
- gpio_setup_t PCData;
-#endif
-#if STM32_HAS_GPIOD || defined(__DOXYGEN__)
- gpio_setup_t PDData;
-#endif
-#if STM32_HAS_GPIOE || defined(__DOXYGEN__)
- gpio_setup_t PEData;
-#endif
-#if STM32_HAS_GPIOF || defined(__DOXYGEN__)
- gpio_setup_t PFData;
-#endif
-#if STM32_HAS_GPIOG || defined(__DOXYGEN__)
- gpio_setup_t PGData;
-#endif
-#if STM32_HAS_GPIOH || defined(__DOXYGEN__)
- gpio_setup_t PHData;
-#endif
-#if STM32_HAS_GPIOI || defined(__DOXYGEN__)
- gpio_setup_t PIData;
-#endif
-#if STM32_HAS_GPIOJ || defined(__DOXYGEN__)
- gpio_setup_t PJData;
-#endif
-#if STM32_HAS_GPIOK || defined(__DOXYGEN__)
- gpio_setup_t PKData;
-#endif
-} gpio_config_t;
-
-/**
- * @brief STM32 GPIO static initialization data.
- */
-static const gpio_config_t gpio_default_config = {
-#if STM32_HAS_GPIOA
- {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR,
- VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH},
-#endif
-#if STM32_HAS_GPIOB
- {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR,
- VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH},
-#endif
-#if STM32_HAS_GPIOC
- {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR,
- VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH},
-#endif
-#if STM32_HAS_GPIOD
- {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR,
- VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH},
-#endif
-#if STM32_HAS_GPIOE
- {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR,
- VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH},
-#endif
-#if STM32_HAS_GPIOF
- {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR,
- VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH},
-#endif
-#if STM32_HAS_GPIOG
- {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR,
- VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH},
-#endif
-#if STM32_HAS_GPIOH
- {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR,
- VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH},
-#endif
-#if STM32_HAS_GPIOI
- {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR,
- VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH},
-#endif
-#if STM32_HAS_GPIOJ
- {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR,
- VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH},
-#endif
-#if STM32_HAS_GPIOK
- {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR,
- VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH}
-#endif
-};
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) {
-
- gpiop->OTYPER = config->otyper;
- gpiop->OSPEEDR = config->ospeedr;
- gpiop->PUPDR = config->pupdr;
- gpiop->ODR = config->odr;
- gpiop->AFRL = config->afrl;
- gpiop->AFRH = config->afrh;
- gpiop->MODER = config->moder;
-}
-
-static void stm32_gpio_init(void) {
-
- /* Enabling GPIO-related clocks, the mask comes from the
- registry header file.*/
- rccResetAHB(STM32_GPIO_EN_MASK);
- rccEnableAHB(STM32_GPIO_EN_MASK, true);
-
- /* Initializing all the defined GPIO ports.*/
-#if STM32_HAS_GPIOA
- gpio_init(GPIOA, &gpio_default_config.PAData);
-#endif
-#if STM32_HAS_GPIOB
- gpio_init(GPIOB, &gpio_default_config.PBData);
-#endif
-#if STM32_HAS_GPIOC
- gpio_init(GPIOC, &gpio_default_config.PCData);
-#endif
-#if STM32_HAS_GPIOD
- gpio_init(GPIOD, &gpio_default_config.PDData);
-#endif
-#if STM32_HAS_GPIOE
- gpio_init(GPIOE, &gpio_default_config.PEData);
-#endif
-#if STM32_HAS_GPIOF
- gpio_init(GPIOF, &gpio_default_config.PFData);
-#endif
-#if STM32_HAS_GPIOG
- gpio_init(GPIOG, &gpio_default_config.PGData);
-#endif
-#if STM32_HAS_GPIOH
- gpio_init(GPIOH, &gpio_default_config.PHData);
-#endif
-#if STM32_HAS_GPIOI
- gpio_init(GPIOI, &gpio_default_config.PIData);
-#endif
-#if STM32_HAS_GPIOJ
- gpio_init(GPIOJ, &gpio_default_config.PJData);
-#endif
-#if STM32_HAS_GPIOK
- gpio_init(GPIOK, &gpio_default_config.PKData);
-#endif
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Early initialization code.
- * @details GPIO ports and system clocks are initialized before everything
- * else.
- */
-void __early_init(void) {
- extern void enter_bootloader_mode_if_requested(void);
- enter_bootloader_mode_if_requested();
- stm32_gpio_init();
- stm32_clock_init();
-}
-
-#if HAL_USE_SDC || defined(__DOXYGEN__)
-/**
- * @brief SDC card detection.
- */
-bool sdc_lld_is_card_inserted(SDCDriver *sdcp) {
-
- (void)sdcp;
- /* TODO: Fill the implementation.*/
- return true;
-}
-
-/**
- * @brief SDC card write protection detection.
- */
-bool sdc_lld_is_write_protected(SDCDriver *sdcp) {
-
- (void)sdcp;
- /* TODO: Fill the implementation.*/
- return false;
-}
-#endif /* HAL_USE_SDC */
-
-#if HAL_USE_MMC_SPI || defined(__DOXYGEN__)
-/**
- * @brief MMC_SPI card detection.
- */
-bool mmc_lld_is_card_inserted(MMCDriver *mmcp) {
-
- (void)mmcp;
- /* TODO: Fill the implementation.*/
- return true;
-}
-
-/**
- * @brief MMC_SPI card write protection detection.
- */
-bool mmc_lld_is_write_protected(MMCDriver *mmcp) {
-
- (void)mmcp;
- /* TODO: Fill the implementation.*/
- return false;
-}
-#endif
-
-/**
- * @brief Board-specific initialization code.
- * @todo Add your board-specific code, if any.
- */
-void boardInit(void) {
- SYSCFG->CFGR1 |= SYSCFG_CFGR1_I2C1_DMA_RMP;
- SYSCFG->CFGR1 &= ~(SYSCFG_CFGR1_SPI2_DMA_RMP);
-}
diff --git a/keyboards/cannonkeys/iron165/boards/ST_STM32F072B_DISCOVERY/board.h b/keyboards/cannonkeys/iron165/boards/ST_STM32F072B_DISCOVERY/board.h
deleted file mode 100644
index 57636d1f12f..00000000000
--- a/keyboards/cannonkeys/iron165/boards/ST_STM32F072B_DISCOVERY/board.h
+++ /dev/null
@@ -1,940 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/*
- * This file has been automatically generated using ChibiStudio board
- * generator plugin. Do not edit manually.
- */
-
-#ifndef BOARD_H
-#define BOARD_H
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*
- * Setup for ST STM32F072B-Discovery board.
- */
-
-/*
- * Board identifier.
- */
-#define BOARD_ST_STM32F072B_DISCOVERY
-#define BOARD_NAME "ST STM32F072B-Discovery"
-
-/*
- * Board oscillators-related settings.
- * NOTE: HSE not fitted.
- */
-#if !defined(STM32_LSECLK)
-#define STM32_LSECLK 32768
-#endif
-
-#define STM32_LSEDRV (3U << 3U)
-
-#if !defined(STM32_HSECLK)
-#define STM32_HSECLK 0U
-#endif
-
-#define STM32_HSE_BYPASS
-
-/*
- * MCU type as defined in the ST header.
- */
-#define STM32F072xB
-
-/*
- * IO pins assignments.
- */
-#define GPIOA_BUTTON 0U
-#define GPIOA_PIN1 1U
-#define GPIOA_PIN2 2U
-#define GPIOA_PIN3 3U
-#define GPIOA_PIN4 4U
-#define GPIOA_PIN5 5U
-#define GPIOA_PIN6 6U
-#define GPIOA_PIN7 7U
-#define GPIOA_PIN8 8U
-#define GPIOA_PIN9 9U
-#define GPIOA_PIN10 10U
-#define GPIOA_USB_DM 11U
-#define GPIOA_USB_DP 12U
-#define GPIOA_SWDIO 13U
-#define GPIOA_SWCLK 14U
-#define GPIOA_PIN15 15U
-
-#define GPIOB_PIN0 0U
-#define GPIOB_PIN1 1U
-#define GPIOB_PIN2 2U
-#define GPIOB_PIN3 3U
-#define GPIOB_PIN4 4U
-#define GPIOB_PIN5 5U
-#define GPIOB_PIN6 6U
-#define GPIOB_PIN7 7U
-#define GPIOB_PIN8 8U
-#define GPIOB_PIN9 9U
-#define GPIOB_PIN10 10U
-#define GPIOB_PIN11 11U
-#define GPIOB_PIN12 12U
-#define GPIOB_SPI2_SCK 13U
-#define GPIOB_SPI2_MISO 14U
-#define GPIOB_SPI2_MOSI 15U
-
-#define GPIOC_MEMS_CS 0U
-#define GPIOC_PIN1 1U
-#define GPIOC_PIN2 2U
-#define GPIOC_PIN3 3U
-#define GPIOC_PIN4 4U
-#define GPIOC_PIN5 5U
-#define GPIOC_LED_RED 6U
-#define GPIOC_LED_BLUE 7U
-#define GPIOC_LED_ORANGE 8U
-#define GPIOC_LED_GREEN 9U
-#define GPIOC_PIN10 10U
-#define GPIOC_PIN11 11U
-#define GPIOC_PIN12 12U
-#define GPIOC_PIN13 13U
-#define GPIOC_OSC32_IN 14U
-#define GPIOC_OSC32_OUT 15U
-
-#define GPIOD_PIN0 0U
-#define GPIOD_PIN1 1U
-#define GPIOD_PIN2 2U
-#define GPIOD_PIN3 3U
-#define GPIOD_PIN4 4U
-#define GPIOD_PIN5 5U
-#define GPIOD_PIN6 6U
-#define GPIOD_PIN7 7U
-#define GPIOD_PIN8 8U
-#define GPIOD_PIN9 9U
-#define GPIOD_PIN10 10U
-#define GPIOD_PIN11 11U
-#define GPIOD_PIN12 12U
-#define GPIOD_PIN13 13U
-#define GPIOD_PIN14 14U
-#define GPIOD_PIN15 15U
-
-#define GPIOE_PIN0 0U
-#define GPIOE_PIN1 1U
-#define GPIOE_PIN2 2U
-#define GPIOE_PIN3 3U
-#define GPIOE_PIN4 4U
-#define GPIOE_PIN5 5U
-#define GPIOE_PIN6 6U
-#define GPIOE_PIN7 7U
-#define GPIOE_PIN8 8U
-#define GPIOE_PIN9 9U
-#define GPIOE_PIN10 10U
-#define GPIOE_PIN11 11U
-#define GPIOE_PIN12 12U
-#define GPIOE_PIN13 13U
-#define GPIOE_PIN14 14U
-#define GPIOE_PIN15 15U
-
-#define GPIOF_OSC_IN 0U
-#define GPIOF_OSC_OUT 1U
-#define GPIOF_PIN2 2U
-#define GPIOF_PIN3 3U
-#define GPIOF_PIN4 4U
-#define GPIOF_PIN5 5U
-#define GPIOF_PIN6 6U
-#define GPIOF_PIN7 7U
-#define GPIOF_PIN8 8U
-#define GPIOF_PIN9 9U
-#define GPIOF_PIN10 10U
-#define GPIOF_PIN11 11U
-#define GPIOF_PIN12 12U
-#define GPIOF_PIN13 13U
-#define GPIOF_PIN14 14U
-#define GPIOF_PIN15 15U
-
-/*
- * IO lines assignments.
- */
-#define LINE_BUTTON PAL_LINE(GPIOA, 0U)
-#define LINE_USB_DM PAL_LINE(GPIOA, 11U)
-#define LINE_USB_DP PAL_LINE(GPIOA, 12U)
-#define LINE_SWDIO PAL_LINE(GPIOA, 13U)
-#define LINE_SWCLK PAL_LINE(GPIOA, 14U)
-#define LINE_SPI2_SCK PAL_LINE(GPIOB, 13U)
-#define LINE_SPI2_MISO PAL_LINE(GPIOB, 14U)
-#define LINE_SPI2_MOSI PAL_LINE(GPIOB, 15U)
-#define LINE_MEMS_CS PAL_LINE(GPIOC, 0U)
-#define LINE_LED_RED PAL_LINE(GPIOC, 6U)
-#define LINE_LED_BLUE PAL_LINE(GPIOC, 7U)
-#define LINE_LED_ORANGE PAL_LINE(GPIOC, 8U)
-#define LINE_LED_GREEN PAL_LINE(GPIOC, 9U)
-#define LINE_OSC32_IN PAL_LINE(GPIOC, 14U)
-#define LINE_OSC32_OUT PAL_LINE(GPIOC, 15U)
-#define LINE_OSC_IN PAL_LINE(GPIOF, 0U)
-#define LINE_OSC_OUT PAL_LINE(GPIOF, 1U)
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/*
- * I/O ports initial setup, this configuration is established soon after reset
- * in the initialization code.
- * Please refer to the STM32 Reference Manual for details.
- */
-#define PIN_MODE_INPUT(n) (0U << ((n) * 2U))
-#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U))
-#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U))
-#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U))
-#define PIN_ODR_LOW(n) (0U << (n))
-#define PIN_ODR_HIGH(n) (1U << (n))
-#define PIN_OTYPE_PUSHPULL(n) (0U << (n))
-#define PIN_OTYPE_OPENDRAIN(n) (1U << (n))
-#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U))
-#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U))
-#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U))
-#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U))
-#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U))
-#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U))
-#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U))
-#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U))
-
-/*
- * GPIOA setup:
- *
- * PA0 - BUTTON (input floating).
- * PA1 - PIN1 (input pullup).
- * PA2 - PIN2 (input pullup).
- * PA3 - PIN3 (input pullup).
- * PA4 - PIN4 (input pullup).
- * PA5 - PIN5 (input pullup).
- * PA6 - PIN6 (input pullup).
- * PA7 - PIN7 (input pullup).
- * PA8 - PIN8 (input pullup).
- * PA9 - PIN9 (input pullup).
- * PA10 - PIN10 (input pullup).
- * PA11 - USB_DM (input floating).
- * PA12 - USB_DP (input floating).
- * PA13 - SWDIO (alternate 0).
- * PA14 - SWCLK (alternate 0).
- * PA15 - PIN15 (input pullup).
- */
-#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \
- PIN_MODE_INPUT(GPIOA_PIN1) | \
- PIN_MODE_INPUT(GPIOA_PIN2) | \
- PIN_MODE_INPUT(GPIOA_PIN3) | \
- PIN_MODE_INPUT(GPIOA_PIN4) | \
- PIN_MODE_INPUT(GPIOA_PIN5) | \
- PIN_MODE_INPUT(GPIOA_PIN6) | \
- PIN_MODE_INPUT(GPIOA_PIN7) | \
- PIN_MODE_INPUT(GPIOA_PIN8) | \
- PIN_MODE_INPUT(GPIOA_PIN9) | \
- PIN_MODE_INPUT(GPIOA_PIN10) | \
- PIN_MODE_INPUT(GPIOA_USB_DM) | \
- PIN_MODE_INPUT(GPIOA_USB_DP) | \
- PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \
- PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \
- PIN_MODE_INPUT(GPIOA_PIN15))
-#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_BUTTON) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \
- PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \
- PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \
- PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN15))
-#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_BUTTON) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOA_USB_DM) | \
- PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \
- PIN_OSPEED_HIGH(GPIOA_SWDIO) | \
- PIN_OSPEED_HIGH(GPIOA_SWCLK) | \
- PIN_OSPEED_HIGH(GPIOA_PIN15))
-#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN10) | \
- PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \
- PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \
- PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \
- PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN15))
-#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_BUTTON) | \
- PIN_ODR_HIGH(GPIOA_PIN1) | \
- PIN_ODR_HIGH(GPIOA_PIN2) | \
- PIN_ODR_HIGH(GPIOA_PIN3) | \
- PIN_ODR_HIGH(GPIOA_PIN4) | \
- PIN_ODR_HIGH(GPIOA_PIN5) | \
- PIN_ODR_HIGH(GPIOA_PIN6) | \
- PIN_ODR_HIGH(GPIOA_PIN7) | \
- PIN_ODR_HIGH(GPIOA_PIN8) | \
- PIN_ODR_HIGH(GPIOA_PIN9) | \
- PIN_ODR_HIGH(GPIOA_PIN10) | \
- PIN_ODR_HIGH(GPIOA_USB_DM) | \
- PIN_ODR_HIGH(GPIOA_USB_DP) | \
- PIN_ODR_HIGH(GPIOA_SWDIO) | \
- PIN_ODR_HIGH(GPIOA_SWCLK) | \
- PIN_ODR_HIGH(GPIOA_PIN15))
-#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_BUTTON, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN7, 0U))
-#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOA_USB_DM, 0U) | \
- PIN_AFIO_AF(GPIOA_USB_DP, 0U) | \
- PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \
- PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN15, 0U))
-
-/*
- * GPIOB setup:
- *
- * PB0 - PIN0 (input pullup).
- * PB1 - PIN1 (input pullup).
- * PB2 - PIN2 (input pullup).
- * PB3 - PIN3 (input pullup).
- * PB4 - PIN4 (input pullup).
- * PB5 - PIN5 (input pullup).
- * PB6 - PIN6 (input pullup).
- * PB7 - PIN7 (input pullup).
- * PB8 - PIN8 (input pullup).
- * PB9 - PIN9 (input pullup).
- * PB10 - PIN10 (input pullup).
- * PB11 - PIN11 (input pullup).
- * PB12 - PIN12 (input pullup).
- * PB13 - SPI2_SCK (alternate 0).
- * PB14 - SPI2_MISO (alternate 0).
- * PB15 - SPI2_MOSI (alternate 0).
- */
-#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \
- PIN_MODE_INPUT(GPIOB_PIN1) | \
- PIN_MODE_INPUT(GPIOB_PIN2) | \
- PIN_MODE_INPUT(GPIOB_PIN3) | \
- PIN_MODE_INPUT(GPIOB_PIN4) | \
- PIN_MODE_INPUT(GPIOB_PIN5) | \
- PIN_MODE_INPUT(GPIOB_PIN6) | \
- PIN_MODE_INPUT(GPIOB_PIN7) | \
- PIN_MODE_INPUT(GPIOB_PIN8) | \
- PIN_MODE_INPUT(GPIOB_PIN9) | \
- PIN_MODE_INPUT(GPIOB_PIN10) | \
- PIN_MODE_INPUT(GPIOB_PIN11) | \
- PIN_MODE_INPUT(GPIOB_PIN12) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_SCK) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_MISO) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_SCK) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MISO) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \
- PIN_OSPEED_HIGH(GPIOB_PIN2) | \
- PIN_OSPEED_HIGH(GPIOB_PIN3) | \
- PIN_OSPEED_HIGH(GPIOB_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_SCK) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_MISO) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN12) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_SCK) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_MISO) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \
- PIN_ODR_HIGH(GPIOB_PIN1) | \
- PIN_ODR_HIGH(GPIOB_PIN2) | \
- PIN_ODR_HIGH(GPIOB_PIN3) | \
- PIN_ODR_HIGH(GPIOB_PIN4) | \
- PIN_ODR_HIGH(GPIOB_PIN5) | \
- PIN_ODR_HIGH(GPIOB_PIN6) | \
- PIN_ODR_HIGH(GPIOB_PIN7) | \
- PIN_ODR_HIGH(GPIOB_PIN8) | \
- PIN_ODR_HIGH(GPIOB_PIN9) | \
- PIN_ODR_HIGH(GPIOB_PIN10) | \
- PIN_ODR_HIGH(GPIOB_PIN11) | \
- PIN_ODR_HIGH(GPIOB_PIN12) | \
- PIN_ODR_HIGH(GPIOB_SPI2_SCK) | \
- PIN_ODR_HIGH(GPIOB_SPI2_MISO) | \
- PIN_ODR_HIGH(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN7, 0U))
-#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_SCK, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_MISO, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_MOSI, 0U))
-
-/*
- * GPIOC setup:
- *
- * PC0 - MEMS_CS (output pushpull maximum).
- * PC1 - PIN1 (input pullup).
- * PC2 - PIN2 (input pullup).
- * PC3 - PIN3 (input pullup).
- * PC4 - PIN4 (input pullup).
- * PC5 - PIN5 (input pullup).
- * PC6 - LED_RED (output pushpull maximum).
- * PC7 - LED_BLUE (output pushpull maximum).
- * PC8 - LED_ORANGE (output pushpull maximum).
- * PC9 - LED_GREEN (output pushpull maximum).
- * PC10 - PIN10 (input pullup).
- * PC11 - PIN11 (input pullup).
- * PC12 - PIN12 (input pullup).
- * PC13 - PIN13 (input pullup).
- * PC14 - OSC32_IN (input floating).
- * PC15 - OSC32_OUT (input floating).
- */
-#define VAL_GPIOC_MODER (PIN_MODE_OUTPUT(GPIOC_MEMS_CS) | \
- PIN_MODE_INPUT(GPIOC_PIN1) | \
- PIN_MODE_INPUT(GPIOC_PIN2) | \
- PIN_MODE_INPUT(GPIOC_PIN3) | \
- PIN_MODE_INPUT(GPIOC_PIN4) | \
- PIN_MODE_INPUT(GPIOC_PIN5) | \
- PIN_MODE_OUTPUT(GPIOC_LED_RED) | \
- PIN_MODE_OUTPUT(GPIOC_LED_BLUE) | \
- PIN_MODE_OUTPUT(GPIOC_LED_ORANGE) | \
- PIN_MODE_OUTPUT(GPIOC_LED_GREEN) | \
- PIN_MODE_INPUT(GPIOC_PIN10) | \
- PIN_MODE_INPUT(GPIOC_PIN11) | \
- PIN_MODE_INPUT(GPIOC_PIN12) | \
- PIN_MODE_INPUT(GPIOC_PIN13) | \
- PIN_MODE_INPUT(GPIOC_OSC32_IN) | \
- PIN_MODE_INPUT(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_MEMS_CS) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_RED) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_BLUE) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_ORANGE) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_GREEN) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \
- PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_MEMS_CS) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \
- PIN_OSPEED_HIGH(GPIOC_LED_RED) | \
- PIN_OSPEED_HIGH(GPIOC_LED_BLUE) | \
- PIN_OSPEED_HIGH(GPIOC_LED_ORANGE) | \
- PIN_OSPEED_HIGH(GPIOC_LED_GREEN) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \
- PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \
- PIN_OSPEED_HIGH(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_MEMS_CS) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN5) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_RED) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_BLUE) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_ORANGE) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_GREEN) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN13) | \
- PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \
- PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_MEMS_CS) | \
- PIN_ODR_HIGH(GPIOC_PIN1) | \
- PIN_ODR_HIGH(GPIOC_PIN2) | \
- PIN_ODR_HIGH(GPIOC_PIN3) | \
- PIN_ODR_HIGH(GPIOC_PIN4) | \
- PIN_ODR_HIGH(GPIOC_PIN5) | \
- PIN_ODR_LOW(GPIOC_LED_RED) | \
- PIN_ODR_LOW(GPIOC_LED_BLUE) | \
- PIN_ODR_LOW(GPIOC_LED_ORANGE) | \
- PIN_ODR_LOW(GPIOC_LED_GREEN) | \
- PIN_ODR_HIGH(GPIOC_PIN10) | \
- PIN_ODR_HIGH(GPIOC_PIN11) | \
- PIN_ODR_HIGH(GPIOC_PIN12) | \
- PIN_ODR_HIGH(GPIOC_PIN13) | \
- PIN_ODR_HIGH(GPIOC_OSC32_IN) | \
- PIN_ODR_HIGH(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_MEMS_CS, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_RED, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_BLUE, 0U))
-#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_LED_ORANGE, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_GREEN, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \
- PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U))
-
-/*
- * GPIOD setup:
- *
- * PD0 - PIN0 (input pullup).
- * PD1 - PIN1 (input pullup).
- * PD2 - PIN2 (input pullup).
- * PD3 - PIN3 (input pullup).
- * PD4 - PIN4 (input pullup).
- * PD5 - PIN5 (input pullup).
- * PD6 - PIN6 (input pullup).
- * PD7 - PIN7 (input pullup).
- * PD8 - PIN8 (input pullup).
- * PD9 - PIN9 (input pullup).
- * PD10 - PIN10 (input pullup).
- * PD11 - PIN11 (input pullup).
- * PD12 - PIN12 (input pullup).
- * PD13 - PIN13 (input pullup).
- * PD14 - PIN14 (input pullup).
- * PD15 - PIN15 (input pullup).
- */
-#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \
- PIN_MODE_INPUT(GPIOD_PIN1) | \
- PIN_MODE_INPUT(GPIOD_PIN2) | \
- PIN_MODE_INPUT(GPIOD_PIN3) | \
- PIN_MODE_INPUT(GPIOD_PIN4) | \
- PIN_MODE_INPUT(GPIOD_PIN5) | \
- PIN_MODE_INPUT(GPIOD_PIN6) | \
- PIN_MODE_INPUT(GPIOD_PIN7) | \
- PIN_MODE_INPUT(GPIOD_PIN8) | \
- PIN_MODE_INPUT(GPIOD_PIN9) | \
- PIN_MODE_INPUT(GPIOD_PIN10) | \
- PIN_MODE_INPUT(GPIOD_PIN11) | \
- PIN_MODE_INPUT(GPIOD_PIN12) | \
- PIN_MODE_INPUT(GPIOD_PIN13) | \
- PIN_MODE_INPUT(GPIOD_PIN14) | \
- PIN_MODE_INPUT(GPIOD_PIN15))
-#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN15))
-#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN15))
-#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN15))
-#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \
- PIN_ODR_HIGH(GPIOD_PIN1) | \
- PIN_ODR_HIGH(GPIOD_PIN2) | \
- PIN_ODR_HIGH(GPIOD_PIN3) | \
- PIN_ODR_HIGH(GPIOD_PIN4) | \
- PIN_ODR_HIGH(GPIOD_PIN5) | \
- PIN_ODR_HIGH(GPIOD_PIN6) | \
- PIN_ODR_HIGH(GPIOD_PIN7) | \
- PIN_ODR_HIGH(GPIOD_PIN8) | \
- PIN_ODR_HIGH(GPIOD_PIN9) | \
- PIN_ODR_HIGH(GPIOD_PIN10) | \
- PIN_ODR_HIGH(GPIOD_PIN11) | \
- PIN_ODR_HIGH(GPIOD_PIN12) | \
- PIN_ODR_HIGH(GPIOD_PIN13) | \
- PIN_ODR_HIGH(GPIOD_PIN14) | \
- PIN_ODR_HIGH(GPIOD_PIN15))
-#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN7, 0U))
-#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN15, 0U))
-
-/*
- * GPIOE setup:
- *
- * PE0 - PIN0 (input pullup).
- * PE1 - PIN1 (input pullup).
- * PE2 - PIN2 (input pullup).
- * PE3 - PIN3 (input pullup).
- * PE4 - PIN4 (input pullup).
- * PE5 - PIN5 (input pullup).
- * PE6 - PIN6 (input pullup).
- * PE7 - PIN7 (input pullup).
- * PE8 - PIN8 (input pullup).
- * PE9 - PIN9 (input pullup).
- * PE10 - PIN10 (input pullup).
- * PE11 - PIN11 (input pullup).
- * PE12 - PIN12 (input pullup).
- * PE13 - PIN13 (input pullup).
- * PE14 - PIN14 (input pullup).
- * PE15 - PIN15 (input pullup).
- */
-#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \
- PIN_MODE_INPUT(GPIOE_PIN1) | \
- PIN_MODE_INPUT(GPIOE_PIN2) | \
- PIN_MODE_INPUT(GPIOE_PIN3) | \
- PIN_MODE_INPUT(GPIOE_PIN4) | \
- PIN_MODE_INPUT(GPIOE_PIN5) | \
- PIN_MODE_INPUT(GPIOE_PIN6) | \
- PIN_MODE_INPUT(GPIOE_PIN7) | \
- PIN_MODE_INPUT(GPIOE_PIN8) | \
- PIN_MODE_INPUT(GPIOE_PIN9) | \
- PIN_MODE_INPUT(GPIOE_PIN10) | \
- PIN_MODE_INPUT(GPIOE_PIN11) | \
- PIN_MODE_INPUT(GPIOE_PIN12) | \
- PIN_MODE_INPUT(GPIOE_PIN13) | \
- PIN_MODE_INPUT(GPIOE_PIN14) | \
- PIN_MODE_INPUT(GPIOE_PIN15))
-#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN15))
-#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN15))
-#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN15))
-#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \
- PIN_ODR_HIGH(GPIOE_PIN1) | \
- PIN_ODR_HIGH(GPIOE_PIN2) | \
- PIN_ODR_HIGH(GPIOE_PIN3) | \
- PIN_ODR_HIGH(GPIOE_PIN4) | \
- PIN_ODR_HIGH(GPIOE_PIN5) | \
- PIN_ODR_HIGH(GPIOE_PIN6) | \
- PIN_ODR_HIGH(GPIOE_PIN7) | \
- PIN_ODR_HIGH(GPIOE_PIN8) | \
- PIN_ODR_HIGH(GPIOE_PIN9) | \
- PIN_ODR_HIGH(GPIOE_PIN10) | \
- PIN_ODR_HIGH(GPIOE_PIN11) | \
- PIN_ODR_HIGH(GPIOE_PIN12) | \
- PIN_ODR_HIGH(GPIOE_PIN13) | \
- PIN_ODR_HIGH(GPIOE_PIN14) | \
- PIN_ODR_HIGH(GPIOE_PIN15))
-#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN7, 0U))
-#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN15, 0U))
-
-/*
- * GPIOF setup:
- *
- * PF0 - OSC_IN (input floating).
- * PF1 - OSC_OUT (input floating).
- * PF2 - PIN2 (input pullup).
- * PF3 - PIN3 (input pullup).
- * PF4 - PIN4 (input pullup).
- * PF5 - PIN5 (input pullup).
- * PF6 - PIN6 (input pullup).
- * PF7 - PIN7 (input pullup).
- * PF8 - PIN8 (input pullup).
- * PF9 - PIN9 (input pullup).
- * PF10 - PIN10 (input pullup).
- * PF11 - PIN11 (input pullup).
- * PF12 - PIN12 (input pullup).
- * PF13 - PIN13 (input pullup).
- * PF14 - PIN14 (input pullup).
- * PF15 - PIN15 (input pullup).
- */
-#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \
- PIN_MODE_INPUT(GPIOF_OSC_OUT) | \
- PIN_MODE_INPUT(GPIOF_PIN2) | \
- PIN_MODE_INPUT(GPIOF_PIN3) | \
- PIN_MODE_INPUT(GPIOF_PIN4) | \
- PIN_MODE_INPUT(GPIOF_PIN5) | \
- PIN_MODE_INPUT(GPIOF_PIN6) | \
- PIN_MODE_INPUT(GPIOF_PIN7) | \
- PIN_MODE_INPUT(GPIOF_PIN8) | \
- PIN_MODE_INPUT(GPIOF_PIN9) | \
- PIN_MODE_INPUT(GPIOF_PIN10) | \
- PIN_MODE_INPUT(GPIOF_PIN11) | \
- PIN_MODE_INPUT(GPIOF_PIN12) | \
- PIN_MODE_INPUT(GPIOF_PIN13) | \
- PIN_MODE_INPUT(GPIOF_PIN14) | \
- PIN_MODE_INPUT(GPIOF_PIN15))
-#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \
- PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN15))
-#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOF_OSC_IN) | \
- PIN_OSPEED_VERYLOW(GPIOF_OSC_OUT) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN15))
-#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \
- PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN15))
-#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \
- PIN_ODR_HIGH(GPIOF_OSC_OUT) | \
- PIN_ODR_HIGH(GPIOF_PIN2) | \
- PIN_ODR_HIGH(GPIOF_PIN3) | \
- PIN_ODR_HIGH(GPIOF_PIN4) | \
- PIN_ODR_HIGH(GPIOF_PIN5) | \
- PIN_ODR_HIGH(GPIOF_PIN6) | \
- PIN_ODR_HIGH(GPIOF_PIN7) | \
- PIN_ODR_HIGH(GPIOF_PIN8) | \
- PIN_ODR_HIGH(GPIOF_PIN9) | \
- PIN_ODR_HIGH(GPIOF_PIN10) | \
- PIN_ODR_HIGH(GPIOF_PIN11) | \
- PIN_ODR_HIGH(GPIOF_PIN12) | \
- PIN_ODR_HIGH(GPIOF_PIN13) | \
- PIN_ODR_HIGH(GPIOF_PIN14) | \
- PIN_ODR_HIGH(GPIOF_PIN15))
-#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \
- PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN7, 0U))
-#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN15, 0U))
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#if !defined(_FROM_ASM_)
-#ifdef __cplusplus
-extern "C" {
-#endif
- void boardInit(void);
-#ifdef __cplusplus
-}
-#endif
-#endif /* _FROM_ASM_ */
-
-#endif /* BOARD_H */
diff --git a/keyboards/cannonkeys/iron165/boards/ST_STM32F072B_DISCOVERY/board.mk b/keyboards/cannonkeys/iron165/boards/ST_STM32F072B_DISCOVERY/board.mk
deleted file mode 100644
index b98dcdd26c6..00000000000
--- a/keyboards/cannonkeys/iron165/boards/ST_STM32F072B_DISCOVERY/board.mk
+++ /dev/null
@@ -1,5 +0,0 @@
-# List of all the board related files.
-BOARDSRC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY/board.c
-
-# Required include directories
-BOARDINC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY
diff --git a/keyboards/cannonkeys/iron165/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg b/keyboards/cannonkeys/iron165/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg
deleted file mode 100644
index 9c7cf4fd76a..00000000000
--- a/keyboards/cannonkeys/iron165/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg
+++ /dev/null
@@ -1,703 +0,0 @@
-
-
-
-
- resources/gencfg/processors/boards/stm32f0xx/templates
- ..
- 3.0.x
-
- ST STM32F072B-Discovery
- ST_STM32F072B_DISCOVERY
-
- STM32F072xB
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/keyboards/cannonkeys/iron165/chconf.h b/keyboards/cannonkeys/iron165/chconf.h
index 4640ff5332b..03f63da36a8 100644
--- a/keyboards/cannonkeys/iron165/chconf.h
+++ b/keyboards/cannonkeys/iron165/chconf.h
@@ -331,7 +331,7 @@
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE FALSE
+#define CH_CFG_USE_MEMCORE TRUE
#endif
/**
diff --git a/keyboards/cannonkeys/iron165/config.h b/keyboards/cannonkeys/iron165/config.h
index c8be89da950..a9288391921 100644
--- a/keyboards/cannonkeys/iron165/config.h
+++ b/keyboards/cannonkeys/iron165/config.h
@@ -33,6 +33,10 @@ along with this program. If not, see .
#define MATRIX_ROW_PINS { B12, B13, B14, B15, A1 }
#define DIODE_DIRECTION COL2ROW
+#define BACKLIGHT_PIN A6
+#define BACKLIGHT_PWM_DRIVER PWMD3
+#define BACKLIGHT_PWM_CHANNEL 1
+#define BACKLIGHT_PAL_MODE 1
#define BACKLIGHT_LEVELS 6
#define BACKLIGHT_BREATHING
#define BREATHING_PERIOD 6
@@ -48,12 +52,6 @@ along with this program. If not, see .
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
-// Backlight config starts after VIA's EEPROM usage,
-// dynamic keymaps start after this.
-#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
-
-// VIA lighting is handled by the keyboard-level code
-#define VIA_CUSTOM_LIGHTING_ENABLE
/*
* Feature disable options
diff --git a/keyboards/cannonkeys/iron165/rules.mk b/keyboards/cannonkeys/iron165/rules.mk
index 795e2baf8d9..3925458dda5 100644
--- a/keyboards/cannonkeys/iron165/rules.mk
+++ b/keyboards/cannonkeys/iron165/rules.mk
@@ -1,16 +1,9 @@
# MCU name
MCU = STM32F072
-BOARD = ST_STM32F072B_DISCOVERY
# Build Options
# comment out to disable the options.
#
-
-# project specific files
-VPATH += keyboards/cannonkeys/stm32f072
-SRC = keyboard.c \
- led.c
-
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
@@ -19,7 +12,7 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover
CUSTOM_MATRIX = no # Custom matrix file
-# BACKLIGHT_ENABLE = yes # This is broken on 072 for some reason
+BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = no
diff --git a/keyboards/cannonkeys/obliterated75/chconf.h b/keyboards/cannonkeys/obliterated75/chconf.h
new file mode 100644
index 00000000000..03f63da36a8
--- /dev/null
+++ b/keyboards/cannonkeys/obliterated75/chconf.h
@@ -0,0 +1,714 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file rt/templates/chconf.h
+ * @brief Configuration file template.
+ * @details A copy of this file must be placed in each project directory, it
+ * contains the application specific kernel settings.
+ *
+ * @addtogroup config
+ * @details Kernel related settings and hooks.
+ * @{
+ */
+
+#ifndef CHCONF_H
+#define CHCONF_H
+
+#define _CHIBIOS_RT_CONF_
+#define _CHIBIOS_RT_CONF_VER_6_0_
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System time counter resolution.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_ST_RESOLUTION)
+#define CH_CFG_ST_RESOLUTION 32
+#endif
+
+/**
+ * @brief System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ * setting also defines the system tick time unit.
+ */
+#if !defined(CH_CFG_ST_FREQUENCY)
+#define CH_CFG_ST_FREQUENCY 10000
+#endif
+
+/**
+ * @brief Time intervals data size.
+ * @note Allowed values are 16, 32 or 64 bits.
+ */
+#if !defined(CH_CFG_INTERVALS_SIZE)
+#define CH_CFG_INTERVALS_SIZE 32
+#endif
+
+/**
+ * @brief Time types data size.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_TIME_TYPES_SIZE)
+#define CH_CFG_TIME_TYPES_SIZE 32
+#endif
+
+/**
+ * @brief Time delta constant for the tick-less mode.
+ * @note If this value is zero then the system uses the classic
+ * periodic tick. This value represents the minimum number
+ * of ticks that is safe to specify in a timeout directive.
+ * The value one is not valid, timeouts are rounded up to
+ * this value.
+ */
+#if !defined(CH_CFG_ST_TIMEDELTA)
+#define CH_CFG_ST_TIMEDELTA 2
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel parameters and options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Round robin interval.
+ * @details This constant is the number of system ticks allowed for the
+ * threads before preemption occurs. Setting this value to zero
+ * disables the preemption for threads with equal priority and the
+ * round robin becomes cooperative. Note that higher priority
+ * threads can still preempt, the kernel is always preemptive.
+ * @note Disabling the round robin preemption makes the kernel more compact
+ * and generally faster.
+ * @note The round robin preemption is not supported in tickless mode and
+ * must be set to zero in that case.
+ */
+#if !defined(CH_CFG_TIME_QUANTUM)
+#define CH_CFG_TIME_QUANTUM 0
+#endif
+
+/**
+ * @brief Managed RAM size.
+ * @details Size of the RAM area to be managed by the OS. If set to zero
+ * then the whole available RAM is used. The core memory is made
+ * available to the heap allocator and/or can be used directly through
+ * the simplified core memory allocator.
+ *
+ * @note In order to let the OS manage the whole RAM the linker script must
+ * provide the @p __heap_base__ and @p __heap_end__ symbols.
+ * @note Requires @p CH_CFG_USE_MEMCORE.
+ */
+#if !defined(CH_CFG_MEMCORE_SIZE)
+#define CH_CFG_MEMCORE_SIZE 0
+#endif
+
+/**
+ * @brief Idle thread automatic spawn suppression.
+ * @details When this option is activated the function @p chSysInit()
+ * does not spawn the idle thread. The application @p main()
+ * function becomes the idle thread and must implement an
+ * infinite loop.
+ */
+#if !defined(CH_CFG_NO_IDLE_THREAD)
+#define CH_CFG_NO_IDLE_THREAD FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Performance options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief OS optimization.
+ * @details If enabled then time efficient rather than space efficient code
+ * is used when two possible implementations exist.
+ *
+ * @note This is not related to the compiler optimization options.
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_OPTIMIZE_SPEED)
+#define CH_CFG_OPTIMIZE_SPEED FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Subsystem options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Time Measurement APIs.
+ * @details If enabled then the time measurement APIs are included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_TM)
+#define CH_CFG_USE_TM FALSE
+#endif
+
+/**
+ * @brief Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_REGISTRY)
+#define CH_CFG_USE_REGISTRY TRUE
+#endif
+
+/**
+ * @brief Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_WAITEXIT)
+#define CH_CFG_USE_WAITEXIT TRUE
+#endif
+
+/**
+ * @brief Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES)
+#define CH_CFG_USE_SEMAPHORES TRUE
+#endif
+
+/**
+ * @brief Semaphores queuing mode.
+ * @details If enabled then the threads are enqueued on semaphores by
+ * priority rather than in FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY)
+#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MUTEXES)
+#define CH_CFG_USE_MUTEXES TRUE
+#endif
+
+/**
+ * @brief Enables recursive behavior on mutexes.
+ * @note Recursive mutexes are heavier and have an increased
+ * memory footprint.
+ *
+ * @note The default is @p FALSE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE)
+#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
+#endif
+
+/**
+ * @brief Conditional Variables APIs.
+ * @details If enabled then the conditional variables APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_CONDVARS)
+#define CH_CFG_USE_CONDVARS TRUE
+#endif
+
+/**
+ * @brief Conditional Variables APIs with timeout.
+ * @details If enabled then the conditional variables APIs with timeout
+ * specification are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_CONDVARS.
+ */
+#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT)
+#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
+#endif
+
+/**
+ * @brief Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_EVENTS)
+#define CH_CFG_USE_EVENTS TRUE
+#endif
+
+/**
+ * @brief Events Flags APIs with timeout.
+ * @details If enabled then the events APIs with timeout specification
+ * are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_EVENTS.
+ */
+#if !defined(CH_CFG_USE_EVENTS_TIMEOUT)
+#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MESSAGES)
+#define CH_CFG_USE_MESSAGES TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages queuing mode.
+ * @details If enabled then messages are served by priority rather than in
+ * FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_MESSAGES.
+ */
+#if !defined(CH_CFG_USE_MESSAGES_PRIORITY)
+#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mailboxes APIs.
+ * @details If enabled then the asynchronous messages (mailboxes) APIs are
+ * included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_MAILBOXES)
+#define CH_CFG_USE_MAILBOXES TRUE
+#endif
+
+/**
+ * @brief Core Memory Manager APIs.
+ * @details If enabled then the core memory manager APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMCORE)
+#define CH_CFG_USE_MEMCORE TRUE
+#endif
+
+/**
+ * @brief Heap Allocator APIs.
+ * @details If enabled then the memory heap allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
+ * @p CH_CFG_USE_SEMAPHORES.
+ * @note Mutexes are recommended.
+ */
+#if !defined(CH_CFG_USE_HEAP)
+#define CH_CFG_USE_HEAP FALSE
+#endif
+
+/**
+ * @brief Memory Pools Allocator APIs.
+ * @details If enabled then the memory pools allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMPOOLS)
+#define CH_CFG_USE_MEMPOOLS FALSE
+#endif
+
+/**
+ * @brief Objects FIFOs APIs.
+ * @details If enabled then the objects FIFOs APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_OBJ_FIFOS)
+#define CH_CFG_USE_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Pipes APIs.
+ * @details If enabled then the pipes APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_PIPES)
+#define CH_CFG_USE_PIPES FALSE
+#endif
+
+/**
+ * @brief Dynamic Threads APIs.
+ * @details If enabled then the dynamic threads creation APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_WAITEXIT.
+ * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
+ */
+#if !defined(CH_CFG_USE_DYNAMIC)
+#define CH_CFG_USE_DYNAMIC FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Objects factory options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Objects Factory APIs.
+ * @details If enabled then the objects factory APIs are included in the
+ * kernel.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_CFG_USE_FACTORY)
+#define CH_CFG_USE_FACTORY FALSE
+#endif
+
+/**
+ * @brief Maximum length for object names.
+ * @details If the specified length is zero then the name is stored by
+ * pointer but this could have unintended side effects.
+ */
+#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH)
+#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8
+#endif
+
+/**
+ * @brief Enables the registry of generic objects.
+ */
+#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY)
+#define CH_CFG_FACTORY_OBJECTS_REGISTRY FALSE
+#endif
+
+/**
+ * @brief Enables factory for generic buffers.
+ */
+#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)
+#define CH_CFG_FACTORY_GENERIC_BUFFERS FALSE
+#endif
+
+/**
+ * @brief Enables factory for semaphores.
+ */
+#if !defined(CH_CFG_FACTORY_SEMAPHORES)
+#define CH_CFG_FACTORY_SEMAPHORES FALSE
+#endif
+
+/**
+ * @brief Enables factory for mailboxes.
+ */
+#if !defined(CH_CFG_FACTORY_MAILBOXES)
+#define CH_CFG_FACTORY_MAILBOXES FALSE
+#endif
+
+/**
+ * @brief Enables factory for objects FIFOs.
+ */
+#if !defined(CH_CFG_FACTORY_OBJ_FIFOS)
+#define CH_CFG_FACTORY_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Enables factory for Pipes.
+ */
+#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)
+#define CH_CFG_FACTORY_PIPES FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Debug option, kernel statistics.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_STATISTICS)
+#define CH_DBG_STATISTICS FALSE
+#endif
+
+/**
+ * @brief Debug option, system state check.
+ * @details If enabled the correct call protocol for system APIs is checked
+ * at runtime.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_SYSTEM_STATE_CHECK)
+#define CH_DBG_SYSTEM_STATE_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, parameters checks.
+ * @details If enabled then the checks on the API functions input
+ * parameters are activated.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_CHECKS)
+#define CH_DBG_ENABLE_CHECKS FALSE
+#endif
+
+/**
+ * @brief Debug option, consistency checks.
+ * @details If enabled then all the assertions in the kernel code are
+ * activated. This includes consistency checks inside the kernel,
+ * runtime anomalies and port-defined checks.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_ASSERTS)
+#define CH_DBG_ENABLE_ASSERTS FALSE
+#endif
+
+/**
+ * @brief Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_MASK)
+#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
+#endif
+
+/**
+ * @brief Trace buffer entries.
+ * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is
+ * different from @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_BUFFER_SIZE)
+#define CH_DBG_TRACE_BUFFER_SIZE 128
+#endif
+
+/**
+ * @brief Debug option, stack checks.
+ * @details If enabled then a runtime stack check is performed.
+ *
+ * @note The default is @p FALSE.
+ * @note The stack check is performed in a architecture/port dependent way.
+ * It may not be implemented or some ports.
+ * @note The default failure mode is to halt the system with the global
+ * @p panic_msg variable set to @p NULL.
+ */
+#if !defined(CH_DBG_ENABLE_STACK_CHECK)
+#define CH_DBG_ENABLE_STACK_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, stacks initialization.
+ * @details If enabled then the threads working area is filled with a byte
+ * value when a thread is created. This can be useful for the
+ * runtime measurement of the used stack.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_FILL_THREADS)
+#define CH_DBG_FILL_THREADS FALSE
+#endif
+
+/**
+ * @brief Debug option, threads profiling.
+ * @details If enabled then a field is added to the @p thread_t structure that
+ * counts the system ticks occurred while executing the thread.
+ *
+ * @note The default is @p FALSE.
+ * @note This debug option is not currently compatible with the
+ * tickless mode.
+ */
+#if !defined(CH_DBG_THREADS_PROFILING)
+#define CH_DBG_THREADS_PROFILING FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System structure extension.
+ * @details User fields added to the end of the @p ch_system_t structure.
+ */
+#define CH_CFG_SYSTEM_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief System initialization hook.
+ * @details User initialization code added to the @p chSysInit() function
+ * just before interrupts are enabled globally.
+ */
+#define CH_CFG_SYSTEM_INIT_HOOK() { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads descriptor structure extension.
+ * @details User fields added to the end of the @p thread_t structure.
+ */
+#define CH_CFG_THREAD_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief Threads initialization hook.
+ * @details User initialization code added to the @p _thread_init() function.
+ *
+ * @note It is invoked from within @p _thread_init() and implicitly from all
+ * the threads creation APIs.
+ */
+#define CH_CFG_THREAD_INIT_HOOK(tp) { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads finalization hook.
+ * @details User finalization code added to the @p chThdExit() API.
+ */
+#define CH_CFG_THREAD_EXIT_HOOK(tp) { \
+ /* Add threads finalization code here.*/ \
+}
+
+/**
+ * @brief Context switch hook.
+ * @details This hook is invoked just before switching between threads.
+ */
+#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \
+ /* Context switch code here.*/ \
+}
+
+/**
+ * @brief ISR enter hook.
+ */
+#define CH_CFG_IRQ_PROLOGUE_HOOK() { \
+ /* IRQ prologue code here.*/ \
+}
+
+/**
+ * @brief ISR exit hook.
+ */
+#define CH_CFG_IRQ_EPILOGUE_HOOK() { \
+ /* IRQ epilogue code here.*/ \
+}
+
+/**
+ * @brief Idle thread enter hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to activate a power saving mode.
+ */
+#define CH_CFG_IDLE_ENTER_HOOK() { \
+ /* Idle-enter code here.*/ \
+}
+
+/**
+ * @brief Idle thread leave hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to deactivate a power saving mode.
+ */
+#define CH_CFG_IDLE_LEAVE_HOOK() { \
+ /* Idle-leave code here.*/ \
+}
+
+/**
+ * @brief Idle Loop hook.
+ * @details This hook is continuously invoked by the idle thread loop.
+ */
+#define CH_CFG_IDLE_LOOP_HOOK() { \
+ /* Idle loop code here.*/ \
+}
+
+/**
+ * @brief System tick event hook.
+ * @details This hook is invoked in the system tick handler immediately
+ * after processing the virtual timers queue.
+ */
+#define CH_CFG_SYSTEM_TICK_HOOK() { \
+ /* System tick event code here.*/ \
+}
+
+/**
+ * @brief System halt hook.
+ * @details This hook is invoked in case to a system halting error before
+ * the system is halted.
+ */
+#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \
+ /* System halt code here.*/ \
+}
+
+/**
+ * @brief Trace hook.
+ * @details This hook is invoked each time a new record is written in the
+ * trace buffer.
+ */
+#define CH_CFG_TRACE_HOOK(tep) { \
+ /* Trace code here.*/ \
+}
+
+/** @} */
+
+/*===========================================================================*/
+/* Port-specific settings (override port settings defaulted in chcore.h). */
+/*===========================================================================*/
+
+#endif /* CHCONF_H */
+
+/** @} */
diff --git a/keyboards/cannonkeys/obliterated75/config.h b/keyboards/cannonkeys/obliterated75/config.h
new file mode 100644
index 00000000000..bff3030b511
--- /dev/null
+++ b/keyboards/cannonkeys/obliterated75/config.h
@@ -0,0 +1,78 @@
+/*
+Copyright 2015 Jun Wako
+
+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 .
+*/
+
+#pragma once
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xCA04
+#define PRODUCT_ID 0x0B75
+#define DEVICE_VER 0x0001
+#define MANUFACTURER CannonKeys
+#define PRODUCT Obliterated75
+#define DESCRIPTION Obliterated75 Keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 16
+
+#define MATRIX_COL_PINS { A5, B10, A3, A2, B0, A9, C13, B9, B8, B7, B6, B5, B4, B3, A15, A14 }
+#define MATRIX_ROW_PINS { A13, B12, B11, B14, A8, A1 }
+#define DIODE_DIRECTION COL2ROW
+
+#define BACKLIGHT_PIN A6
+#define BACKLIGHT_PWM_DRIVER PWMD3
+#define BACKLIGHT_PWM_CHANNEL 1
+#define BACKLIGHT_PAL_MODE 1
+#define BACKLIGHT_LEVELS 6
+#define BACKLIGHT_BREATHING
+#define BREATHING_PERIOD 6
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+#define RGBLIGHT_ANIMATIONS
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 20
+#define WS2812_SPI SPID2
+#define WS2812_SPI_MOSI_PAL_MODE 0
+
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
diff --git a/keyboards/cannonkeys/obliterated75/halconf.h b/keyboards/cannonkeys/obliterated75/halconf.h
new file mode 100644
index 00000000000..921803762ea
--- /dev/null
+++ b/keyboards/cannonkeys/obliterated75/halconf.h
@@ -0,0 +1,525 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file templates/halconf.h
+ * @brief HAL configuration header.
+ * @details HAL configuration file, this file allows to enable or disable the
+ * various device drivers from your application. You may also use
+ * this file in order to override the device drivers default settings.
+ *
+ * @addtogroup HAL_CONF
+ * @{
+ */
+
+#ifndef HALCONF_H
+#define HALCONF_H
+
+#define _CHIBIOS_HAL_CONF_
+#define _CHIBIOS_HAL_CONF_VER_7_0_
+
+#include "mcuconf.h"
+
+/**
+ * @brief Enables the PAL subsystem.
+ */
+#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
+#define HAL_USE_PAL TRUE
+#endif
+
+/**
+ * @brief Enables the ADC subsystem.
+ */
+#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
+#define HAL_USE_ADC FALSE
+#endif
+
+/**
+ * @brief Enables the CAN subsystem.
+ */
+#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
+#define HAL_USE_CAN FALSE
+#endif
+
+/**
+ * @brief Enables the cryptographic subsystem.
+ */
+#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__)
+#define HAL_USE_CRY FALSE
+#endif
+
+/**
+ * @brief Enables the DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC FALSE
+#endif
+
+/**
+ * @brief Enables the GPT subsystem.
+ */
+#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
+#define HAL_USE_GPT FALSE
+#endif
+
+/**
+ * @brief Enables the I2C subsystem.
+ */
+#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
+#define HAL_USE_I2C FALSE
+#endif
+
+/**
+ * @brief Enables the I2S subsystem.
+ */
+#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
+#define HAL_USE_I2S FALSE
+#endif
+
+/**
+ * @brief Enables the ICU subsystem.
+ */
+#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)
+#define HAL_USE_ICU FALSE
+#endif
+
+/**
+ * @brief Enables the MAC subsystem.
+ */
+#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)
+#define HAL_USE_MAC FALSE
+#endif
+
+/**
+ * @brief Enables the MMC_SPI subsystem.
+ */
+#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_MMC_SPI FALSE
+#endif
+
+/**
+ * @brief Enables the PWM subsystem.
+ */
+#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
+#define HAL_USE_PWM TRUE
+#endif
+
+/**
+ * @brief Enables the RTC subsystem.
+ */
+#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)
+#define HAL_USE_RTC FALSE
+#endif
+
+/**
+ * @brief Enables the SDC subsystem.
+ */
+#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)
+#define HAL_USE_SDC FALSE
+#endif
+
+/**
+ * @brief Enables the SERIAL subsystem.
+ */
+#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL FALSE
+#endif
+
+/**
+ * @brief Enables the SERIAL over USB subsystem.
+ */
+#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL_USB FALSE
+#endif
+
+/**
+ * @brief Enables the SIO subsystem.
+ */
+#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__)
+#define HAL_USE_SIO FALSE
+#endif
+
+/**
+ * @brief Enables the SPI subsystem.
+ */
+#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_SPI TRUE
+#endif
+
+/**
+ * @brief Enables the TRNG subsystem.
+ */
+#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__)
+#define HAL_USE_TRNG FALSE
+#endif
+
+/**
+ * @brief Enables the UART subsystem.
+ */
+#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)
+#define HAL_USE_UART FALSE
+#endif
+
+/**
+ * @brief Enables the USB subsystem.
+ */
+#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
+#define HAL_USE_USB TRUE
+#endif
+
+/**
+ * @brief Enables the WDG subsystem.
+ */
+#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
+#define HAL_USE_WDG FALSE
+#endif
+
+/**
+ * @brief Enables the WSPI subsystem.
+ */
+#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__)
+#define HAL_USE_WSPI FALSE
+#endif
+
+/*===========================================================================*/
+/* PAL driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define PAL_USE_CALLBACKS FALSE
+#endif
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__)
+#define PAL_USE_WAIT FALSE
+#endif
+
+/*===========================================================================*/
+/* ADC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)
+#define ADC_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define ADC_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* CAN driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Sleep mode related APIs inclusion switch.
+ */
+#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__)
+#define CAN_USE_SLEEP_MODE TRUE
+#endif
+
+/**
+ * @brief Enforces the driver to use direct callbacks rather than OSAL events.
+ */
+#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define CAN_ENFORCE_USE_CALLBACKS FALSE
+#endif
+
+/*===========================================================================*/
+/* CRY driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the SW fall-back of the cryptographic driver.
+ * @details When enabled, this option, activates a fall-back software
+ * implementation for algorithms not supported by the underlying
+ * hardware.
+ * @note Fall-back implementations may not be present for all algorithms.
+ */
+#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_USE_FALLBACK FALSE
+#endif
+
+/**
+ * @brief Makes the driver forcibly use the fall-back implementations.
+ */
+#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_ENFORCE_FALLBACK FALSE
+#endif
+
+/*===========================================================================*/
+/* DAC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__)
+#define DAC_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define DAC_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* I2C driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the mutual exclusion APIs on the I2C bus.
+ */
+#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define I2C_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* MAC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the zero-copy API.
+ */
+#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)
+#define MAC_USE_ZERO_COPY FALSE
+#endif
+
+/**
+ * @brief Enables an event sources for incoming packets.
+ */
+#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__)
+#define MAC_USE_EVENTS TRUE
+#endif
+
+/*===========================================================================*/
+/* MMC_SPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ * This option is recommended also if the SPI driver does not
+ * use a DMA channel and heavily loads the CPU.
+ */
+#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__)
+#define MMC_NICE_WAITING TRUE
+#endif
+
+/*===========================================================================*/
+/* SDC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Number of initialization attempts before rejecting the card.
+ * @note Attempts are performed at 10mS intervals.
+ */
+#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__)
+#define SDC_INIT_RETRY 100
+#endif
+
+/**
+ * @brief Include support for MMC cards.
+ * @note MMC support is not yet implemented so this option must be kept
+ * at @p FALSE.
+ */
+#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__)
+#define SDC_MMC_SUPPORT FALSE
+#endif
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ */
+#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__)
+#define SDC_NICE_WAITING TRUE
+#endif
+
+/**
+ * @brief OCR initialization constant for V20 cards.
+ */
+#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR_V20 0x50FF8000U
+#endif
+
+/**
+ * @brief OCR initialization constant for non-V20 cards.
+ */
+#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR 0x80100000U
+#endif
+
+/*===========================================================================*/
+/* SERIAL driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Default bit rate.
+ * @details Configuration parameter, this is the baud rate selected for the
+ * default configuration.
+ */
+#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)
+#define SERIAL_DEFAULT_BITRATE 38400
+#endif
+
+/**
+ * @brief Serial buffers size.
+ * @details Configuration parameter, you can change the depth of the queue
+ * buffers depending on the requirements of your application.
+ * @note The default is 16 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_BUFFERS_SIZE 16
+#endif
+
+/*===========================================================================*/
+/* SERIAL_USB driver related setting. */
+/*===========================================================================*/
+
+/**
+ * @brief Serial over USB buffers size.
+ * @details Configuration parameter, the buffer size must be a multiple of
+ * the USB data endpoint maximum packet size.
+ * @note The default is 256 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_SIZE 1
+#endif
+
+/**
+ * @brief Serial over USB number of buffers.
+ * @note The default is 2 buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_NUMBER 2
+#endif
+
+/*===========================================================================*/
+/* SPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__)
+#define SPI_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables circular transfers APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__)
+#define SPI_USE_CIRCULAR FALSE
+#endif
+
+
+/**
+ * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define SPI_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/**
+ * @brief Handling method for SPI CS line.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__)
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+#endif
+
+/*===========================================================================*/
+/* UART driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__)
+#define UART_USE_WAIT FALSE
+#endif
+
+/**
+ * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define UART_USE_MUTUAL_EXCLUSION FALSE
+#endif
+
+/*===========================================================================*/
+/* USB driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
+#define USB_USE_WAIT TRUE
+#endif
+
+/*===========================================================================*/
+/* WSPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__)
+#define WSPI_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define WSPI_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+#endif /* HALCONF_H */
+
+/** @} */
diff --git a/keyboards/cannonkeys/obliterated75/info.json b/keyboards/cannonkeys/obliterated75/info.json
new file mode 100644
index 00000000000..b62cee36ca4
--- /dev/null
+++ b/keyboards/cannonkeys/obliterated75/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "Obliterated75",
+ "url": "https://cannonkeys.com",
+ "maintainer": "awkannan",
+ "width": 16,
+ "height": 6.25,
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [{"x":0, "y":0}, {"x":1.5, "y":0}, {"x":2.5, "y":0}, {"x":3.5, "y":0}, {"x":4.5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10.5, "y":0}, {"x":11.5, "y":0}, {"x":12.5, "y":0}, {"x":13.5, "y":0}, {"x":15, "y":0}, {"label":"~", "x":0, "y":1.25}, {"label":"!", "x":1, "y":1.25}, {"label":"@", "x":2, "y":1.25}, {"label":"#", "x":3, "y":1.25}, {"label":"$", "x":4, "y":1.25}, {"label":"%", "x":5, "y":1.25}, {"label":"^", "x":6, "y":1.25}, {"label":"&", "x":7, "y":1.25}, {"label":"*", "x":8, "y":1.25}, {"label":"(", "x":9, "y":1.25}, {"label":")", "x":10, "y":1.25}, {"label":"_", "x":11, "y":1.25}, {"label":"+", "x":12, "y":1.25}, {"x":13, "y":1.25}, {"x":14, "y":1.25}, {"x":15, "y":1.25}, {"label":"Tab", "x":0, "y":2.25, "w":1.5}, {"label":"Q", "x":1.5, "y":2.25}, {"label":"W", "x":2.5, "y":2.25}, {"label":"E", "x":3.5, "y":2.25}, {"label":"R", "x":4.5, "y":2.25}, {"label":"T", "x":5.5, "y":2.25}, {"label":"Y", "x":6.5, "y":2.25}, {"label":"U", "x":7.5, "y":2.25}, {"label":"I", "x":8.5, "y":2.25}, {"label":"O", "x":9.5, "y":2.25}, {"label":"P", "x":10.5, "y":2.25}, {"label":"{", "x":11.5, "y":2.25}, {"label":"}", "x":12.5, "y":2.25}, {"label":"|", "x":13.5, "y":2.25, "w":1.5}, {"x":15, "y":2.25}, {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, {"label":"A", "x":1.75, "y":3.25}, {"label":"S", "x":2.75, "y":3.25}, {"label":"D", "x":3.75, "y":3.25}, {"label":"F", "x":4.75, "y":3.25}, {"label":"G", "x":5.75, "y":3.25}, {"label":"H", "x":6.75, "y":3.25}, {"label":"J", "x":7.75, "y":3.25}, {"label":"K", "x":8.75, "y":3.25}, {"label":"L", "x":9.75, "y":3.25}, {"label":":", "x":10.75, "y":3.25}, {"label":"\"", "x":11.75, "y":3.25}, {"x":12.75, "y":3.25}, {"label":"Enter", "x":13.75, "y":3.25, "w":1.25}, {"x":15, "y":3.25}, {"x":0, "y":4.25, "w":1.25}, {"x":1.25, "y":4.25}, {"label":"Z", "x":2.25, "y":4.25}, {"label":"X", "x":3.25, "y":4.25}, {"label":"C", "x":4.25, "y":4.25}, {"label":"V", "x":5.25, "y":4.25}, {"label":"B", "x":6.25, "y":4.25}, {"label":"N", "x":7.25, "y":4.25}, {"label":"M", "x":8.25, "y":4.25}, {"label":"<", "x":9.25, "y":4.25}, {"label":">", "x":10.25, "y":4.25}, {"label":"?", "x":11.25, "y":4.25}, {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, {"x":14, "y":4.25}, {"x":15, "y":4.25}, {"label":"Ctrl", "x":0, "y":5.25, "w":1.25}, {"label":"Win", "x":1.25, "y":5.25, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.25, "w":1.25}, {"x":3.75, "y":5.25, "w":6.25}, {"label":"Alt", "x":10, "y":5.25, "w":1.25}, {"label":"Ctrl", "x":11.25, "y":5.25, "w":1.25}, {"x":13, "y":5.25}, {"x":14, "y":5.25}, {"x":15, "y":5.25}]
+ }
+ }
+}
diff --git a/keyboards/cannonkeys/obliterated75/keymaps/default/keymap.c b/keyboards/cannonkeys/obliterated75/keymaps/default/keymap.c
new file mode 100644
index 00000000000..2934aae1895
--- /dev/null
+++ b/keyboards/cannonkeys/obliterated75/keymaps/default/keymap.c
@@ -0,0 +1,48 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_names {
+ _BASE,
+ _FN1,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_BASE] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_INS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUBS, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_NUHS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_FN1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [_FN1] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
+ KC_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_TRNS, RGB_TOG,
+ KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD,
+ BL_BRTG, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ BL_INC, BL_DEC, BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS
+ )
+};
diff --git a/keyboards/cannonkeys/obliterated75/keymaps/via/keymap.c b/keyboards/cannonkeys/obliterated75/keymaps/via/keymap.c
new file mode 100644
index 00000000000..68fe4f7885d
--- /dev/null
+++ b/keyboards/cannonkeys/obliterated75/keymaps/via/keymap.c
@@ -0,0 +1,71 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_names {
+ _BASE,
+ _FN1,
+ _FN2,
+ _FN3
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_BASE] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_INS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUBS, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_NUHS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_FN1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [_FN1] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
+ KC_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_TRNS, RGB_TOG,
+ KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD,
+ BL_BRTG, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ BL_INC, BL_DEC, BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS
+ ),
+
+
+ [_FN2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [_FN3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+
+};
diff --git a/keyboards/cannonkeys/obliterated75/keymaps/via/rules.mk b/keyboards/cannonkeys/obliterated75/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/cannonkeys/obliterated75/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/cannonkeys/obliterated75/mcuconf.h b/keyboards/cannonkeys/obliterated75/mcuconf.h
new file mode 100644
index 00000000000..43fe0a462ef
--- /dev/null
+++ b/keyboards/cannonkeys/obliterated75/mcuconf.h
@@ -0,0 +1,176 @@
+/*
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#ifndef _MCUCONF_H_
+#define _MCUCONF_H_
+
+/*
+ * STM32F0xx drivers configuration.
+ * The following settings override the default settings present in
+ * the various device driver implementation headers.
+ * Note that the settings for each driver only have effect if the whole
+ * driver is enabled in halconf.h.
+ *
+ * IRQ priorities:
+ * 3...0 Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3 Lowest...Highest.
+ */
+
+#define STM32F0xx_MCUCONF
+// #define STM32F070xB
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT FALSE
+#define STM32_PVD_ENABLE FALSE
+#define STM32_PLS STM32_PLS_LEV0
+#define STM32_HSI_ENABLED TRUE
+#define STM32_HSI14_ENABLED TRUE
+#define STM32_HSI48_ENABLED FALSE
+#define STM32_LSI_ENABLED TRUE
+#define STM32_HSE_ENABLED FALSE
+#define STM32_LSE_ENABLED FALSE
+#define STM32_SW STM32_SW_PLL
+#define STM32_PLLSRC STM32_PLLSRC_HSI_DIV2
+#define STM32_PREDIV_VALUE 1
+#define STM32_PLLMUL_VALUE 12
+#define STM32_HPRE STM32_HPRE_DIV1
+#define STM32_PPRE STM32_PPRE_DIV1
+#define STM32_ADCSW STM32_ADCSW_HSI14
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_ADCSW STM32_ADCSW_HSI14
+#define STM32_USBSW STM32_USBSW_HSI48
+#define STM32_CECSW STM32_CECSW_HSI
+#define STM32_I2C1SW STM32_I2C1SW_HSI
+#define STM32_USART1SW STM32_USART1SW_PCLK
+#define STM32_RTCSEL STM32_RTCSEL_LSI
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_USE_ADC1 FALSE
+#define STM32_ADC_ADC1_DMA_PRIORITY 2
+#define STM32_ADC_IRQ_PRIORITY 2
+#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2
+
+/*
+ * EXT driver system settings.
+ */
+#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI16_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI17_IRQ_PRIORITY 3
+
+/*
+ * GPT driver system settings.
+ */
+#define STM32_GPT_USE_TIM1 FALSE
+#define STM32_GPT_USE_TIM2 FALSE
+#define STM32_GPT_USE_TIM3 FALSE
+#define STM32_GPT_USE_TIM14 FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY 2
+#define STM32_GPT_TIM2_IRQ_PRIORITY 2
+#define STM32_GPT_TIM3_IRQ_PRIORITY 2
+#define STM32_GPT_TIM14_IRQ_PRIORITY 2
+
+/*
+ * I2C driver system settings.
+ */
+#define STM32_I2C_USE_I2C1 FALSE
+#define STM32_I2C_USE_I2C2 FALSE
+#define STM32_I2C_BUSY_TIMEOUT 50
+#define STM32_I2C_I2C1_IRQ_PRIORITY 3
+#define STM32_I2C_I2C2_IRQ_PRIORITY 3
+#define STM32_I2C_USE_DMA TRUE
+#define STM32_I2C_I2C1_DMA_PRIORITY 1
+#define STM32_I2C_I2C2_DMA_PRIORITY 1
+#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
+#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6)
+#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure")
+
+/*
+ * ICU driver system settings.
+ */
+#define STM32_ICU_USE_TIM1 FALSE
+#define STM32_ICU_USE_TIM2 FALSE
+#define STM32_ICU_USE_TIM3 FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY 3
+#define STM32_ICU_TIM2_IRQ_PRIORITY 3
+#define STM32_ICU_TIM3_IRQ_PRIORITY 3
+
+/*
+ * PWM driver system settings.
+ */
+#define STM32_PWM_USE_ADVANCED FALSE
+#define STM32_PWM_USE_TIM1 FALSE
+#define STM32_PWM_USE_TIM2 FALSE
+#define STM32_PWM_USE_TIM3 TRUE
+#define STM32_PWM_TIM1_IRQ_PRIORITY 3
+#define STM32_PWM_TIM2_IRQ_PRIORITY 3
+#define STM32_PWM_TIM3_IRQ_PRIORITY 3
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1 FALSE
+#define STM32_SERIAL_USE_USART2 FALSE
+#define STM32_SERIAL_USART1_PRIORITY 3
+#define STM32_SERIAL_USART2_PRIORITY 3
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1 FALSE
+#define STM32_SPI_USE_SPI2 TRUE
+#define STM32_SPI_SPI1_DMA_PRIORITY 1
+#define STM32_SPI_SPI2_DMA_PRIORITY 1
+#define STM32_SPI_SPI1_IRQ_PRIORITY 2
+#define STM32_SPI_SPI2_IRQ_PRIORITY 2
+#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5)
+#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY 2
+#define STM32_ST_USE_TIMER 2
+
+/*
+ * UART driver system settings.
+ */
+#define STM32_UART_USE_USART1 FALSE
+#define STM32_UART_USE_USART2 FALSE
+#define STM32_UART_USART1_IRQ_PRIORITY 3
+#define STM32_UART_USART2_IRQ_PRIORITY 3
+#define STM32_UART_USART1_DMA_PRIORITY 0
+#define STM32_UART_USART2_DMA_PRIORITY 0
+#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure")
+
+/*
+ * USB driver system settings.
+ */
+#define STM32_USB_USE_USB1 TRUE
+#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE
+#define STM32_USB_USB1_LP_IRQ_PRIORITY 3
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/cannonkeys/obliterated75/obliterated75.c b/keyboards/cannonkeys/obliterated75/obliterated75.c
new file mode 100644
index 00000000000..347a6438369
--- /dev/null
+++ b/keyboards/cannonkeys/obliterated75/obliterated75.c
@@ -0,0 +1 @@
+#include "obliterated75.h"
diff --git a/keyboards/cannonkeys/obliterated75/obliterated75.h b/keyboards/cannonkeys/obliterated75/obliterated75.h
new file mode 100644
index 00000000000..895223a1fd1
--- /dev/null
+++ b/keyboards/cannonkeys/obliterated75/obliterated75.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_all( \
+ K000, K001, K002, K003, K004, K006, K007, K008, K009, K010, K011, K012, K013, K015, \
+ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, \
+ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K215, \
+ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K315, \
+ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K415, \
+ K500, K501, K502, K506, K510, K511, K512, K513, K515 \
+) { \
+ { K000, K001, K002, K003, K004, KC_NO, K006, K007, K008, K009, K010, K011, K012, K013, KC_NO, K015 }, \
+ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115 }, \
+ { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, KC_NO, K215 }, \
+ { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, KC_NO, K315 }, \
+ { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, KC_NO, K415 }, \
+ { K500, K501, K502, KC_NO, KC_NO, KC_NO, K506, KC_NO, KC_NO, KC_NO, K510, K511, K512, K513, KC_NO, K515 } \
+}
diff --git a/keyboards/cannonkeys/obliterated75/readme.md b/keyboards/cannonkeys/obliterated75/readme.md
new file mode 100644
index 00000000000..372b5500d18
--- /dev/null
+++ b/keyboards/cannonkeys/obliterated75/readme.md
@@ -0,0 +1,10 @@
+# CannonKeys Obliterated75
+
+* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan)
+* Hardware Supported: STM32F072CBT6
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cannonkeys/obliterated75:default
+
+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).
diff --git a/keyboards/cannonkeys/obliterated75/rules.mk b/keyboards/cannonkeys/obliterated75/rules.mk
new file mode 100644
index 00000000000..350b0d53245
--- /dev/null
+++ b/keyboards/cannonkeys/obliterated75/rules.mk
@@ -0,0 +1,24 @@
+# MCU name
+MCU = STM32F072
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+WS2812_DRIVER = spi
+
+# Enter lower-power sleep mode when on the ChibiOS idle thread
+OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
diff --git a/keyboards/cannonkeys/ortho48/config.h b/keyboards/cannonkeys/ortho48/config.h
index 094be01388f..c3b9dee1861 100644
--- a/keyboards/cannonkeys/ortho48/config.h
+++ b/keyboards/cannonkeys/ortho48/config.h
@@ -33,6 +33,9 @@ along with this program. If not, see .
#define MATRIX_ROW_PINS { B12, C13, A2, A1 }
#define DIODE_DIRECTION COL2ROW
+#define BACKLIGHT_PIN A8
+#define BACKLIGHT_PWM_DRIVER PWMD1
+#define BACKLIGHT_PWM_CHANNEL 1
#define BACKLIGHT_LEVELS 6
#define BACKLIGHT_BREATHING
#define BREATHING_PERIOD 6
@@ -49,16 +52,10 @@ along with this program. If not, see .
#define LOCKING_RESYNC_ENABLE
#define RGBLIGHT_ANIMATIONS
-
-#define WS2812_LED_N 9
-#define RGBLED_NUM WS2812_LED_N
-#define PORT_WS2812 GPIOB
-#define PIN_WS2812 15
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 9
#define WS2812_SPI SPID2
-
-
-
/*
* Feature disable options
* These options are also useful to firmware size reduction.
diff --git a/keyboards/cannonkeys/ortho48/rules.mk b/keyboards/cannonkeys/ortho48/rules.mk
index 59c12681cff..f2fc3e128e4 100644
--- a/keyboards/cannonkeys/ortho48/rules.mk
+++ b/keyboards/cannonkeys/ortho48/rules.mk
@@ -11,8 +11,7 @@ DFU_SUFFIX_ARGS = -v 1eaf -p 0003
# project specific files
VPATH += keyboards/cannonkeys/bluepill
-SRC = led.c \
- keyboard.c
+SRC = keyboard.c
#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
@@ -22,8 +21,8 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover
BACKLIGHT_ENABLE = yes
-BACKLIGHT_DRIVER = custom
RGBLIGHT_ENABLE = yes
+WS2812_DRIVER = spi
LAYOUTS = ortho_4x12
diff --git a/keyboards/cannonkeys/ortho60/config.h b/keyboards/cannonkeys/ortho60/config.h
index 412f0df4931..7e3ef879bc2 100644
--- a/keyboards/cannonkeys/ortho60/config.h
+++ b/keyboards/cannonkeys/ortho60/config.h
@@ -33,6 +33,9 @@ along with this program. If not, see .
#define MATRIX_ROW_PINS { B3, B4, B5, B6, B7 }
#define DIODE_DIRECTION COL2ROW
+#define BACKLIGHT_PIN A8
+#define BACKLIGHT_PWM_DRIVER PWMD1
+#define BACKLIGHT_PWM_CHANNEL 1
#define BACKLIGHT_LEVELS 6
#define BACKLIGHT_BREATHING
#define BREATHING_PERIOD 6
@@ -49,14 +52,10 @@ along with this program. If not, see .
#define LOCKING_RESYNC_ENABLE
#define RGBLIGHT_ANIMATIONS
-
-#define WS2812_LED_N 16
-#define RGBLED_NUM WS2812_LED_N
-#define PORT_WS2812 GPIOB
-#define PIN_WS2812 15
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 16
#define WS2812_SPI SPID2
-
/*
* Feature disable options
* These options are also useful to firmware size reduction.
diff --git a/keyboards/cannonkeys/ortho60/rules.mk b/keyboards/cannonkeys/ortho60/rules.mk
index 2077eea66ff..aaa14c2dbef 100644
--- a/keyboards/cannonkeys/ortho60/rules.mk
+++ b/keyboards/cannonkeys/ortho60/rules.mk
@@ -11,8 +11,7 @@ DFU_SUFFIX_ARGS = -v 1eaf -p 0003
# project specific files
VPATH += keyboards/cannonkeys/bluepill
-SRC = led.c \
- keyboard.c
+SRC = keyboard.c
#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
@@ -20,10 +19,10 @@ EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes # USB Nkey Rollover
+NKRO_ENABLE = yes # USB Nkey Rollover
BACKLIGHT_ENABLE = yes
-BACKLIGHT_DRIVER = custom
RGBLIGHT_ENABLE = yes
+WS2812_DRIVER = spi
LAYOUTS = ortho_5x12
diff --git a/keyboards/cannonkeys/ortho75/config.h b/keyboards/cannonkeys/ortho75/config.h
index 95bb0145204..8c1882e65d9 100644
--- a/keyboards/cannonkeys/ortho75/config.h
+++ b/keyboards/cannonkeys/ortho75/config.h
@@ -33,6 +33,9 @@ along with this program. If not, see .
#define MATRIX_ROW_PINS { B12, C13, A2, A1, A3 }
#define DIODE_DIRECTION COL2ROW
+#define BACKLIGHT_PIN A8
+#define BACKLIGHT_PWM_DRIVER PWMD1
+#define BACKLIGHT_PWM_CHANNEL 1
#define BACKLIGHT_LEVELS 6
#define BACKLIGHT_BREATHING
#define BREATHING_PERIOD 6
@@ -52,14 +55,10 @@ along with this program. If not, see .
#define LOCKING_RESYNC_ENABLE
#define RGBLIGHT_ANIMATIONS
-
-#define WS2812_LED_N 16
-#define RGBLED_NUM WS2812_LED_N
-#define PORT_WS2812 GPIOB
-#define PIN_WS2812 15
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 16
#define WS2812_SPI SPID2
-
/*
* Feature disable options
* These options are also useful to firmware size reduction.
diff --git a/keyboards/cannonkeys/ortho75/rules.mk b/keyboards/cannonkeys/ortho75/rules.mk
index 3be309924cf..fe9cec84c18 100644
--- a/keyboards/cannonkeys/ortho75/rules.mk
+++ b/keyboards/cannonkeys/ortho75/rules.mk
@@ -11,8 +11,7 @@ DFU_SUFFIX_ARGS = -v 1eaf -p 0003
# project specific files
VPATH += keyboards/cannonkeys/bluepill
-SRC = led.c \
- keyboard.c
+SRC = keyboard.c
#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
@@ -20,10 +19,10 @@ EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes # USB Nkey Rollover
+NKRO_ENABLE = yes # USB Nkey Rollover
BACKLIGHT_ENABLE = yes
-BACKLIGHT_DRIVER = custom
RGBLIGHT_ENABLE = yes
+WS2812_DRIVER = spi
ENCODER_ENABLE = yes
LAYOUTS = ortho_5x15
diff --git a/keyboards/cannonkeys/practice60/config.h b/keyboards/cannonkeys/practice60/config.h
index af23eff322b..d17b7f04dd0 100644
--- a/keyboards/cannonkeys/practice60/config.h
+++ b/keyboards/cannonkeys/practice60/config.h
@@ -33,6 +33,9 @@ along with this program. If not, see .
#define MATRIX_ROW_PINS { B3, B4, B5, B6, B7 }
#define DIODE_DIRECTION COL2ROW
+#define BACKLIGHT_PIN A8
+#define BACKLIGHT_PWM_DRIVER PWMD1
+#define BACKLIGHT_PWM_CHANNEL 1
#define BACKLIGHT_LEVELS 6
#define BACKLIGHT_BREATHING
#define BREATHING_PERIOD 6
@@ -49,14 +52,10 @@ along with this program. If not, see .
#define LOCKING_RESYNC_ENABLE
#define RGBLIGHT_ANIMATIONS
-
-#define WS2812_LED_N 9
-#define RGBLED_NUM WS2812_LED_N
-#define PORT_WS2812 GPIOB
-#define PIN_WS2812 15
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 9
#define WS2812_SPI SPID2
-
/*
* Feature disable options
* These options are also useful to firmware size reduction.
diff --git a/keyboards/cannonkeys/practice60/rules.mk b/keyboards/cannonkeys/practice60/rules.mk
index be1584d7295..39591373682 100644
--- a/keyboards/cannonkeys/practice60/rules.mk
+++ b/keyboards/cannonkeys/practice60/rules.mk
@@ -11,8 +11,7 @@ DFU_SUFFIX_ARGS = -v 1eaf -p 0003
# project specific files
VPATH += keyboards/cannonkeys/bluepill
-SRC = led.c \
- keyboard.c
+SRC = keyboard.c
#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
@@ -20,10 +19,10 @@ EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes # USB Nkey Rollover
+NKRO_ENABLE = yes # USB Nkey Rollover
BACKLIGHT_ENABLE = yes
-BACKLIGHT_DRIVER = custom
RGBLIGHT_ENABLE = yes
+WS2812_DRIVER = spi
LAYOUTS = 60_ansi
diff --git a/keyboards/cannonkeys/practice65/config.h b/keyboards/cannonkeys/practice65/config.h
index 7ebac8d8e1c..d08d92e4cd3 100644
--- a/keyboards/cannonkeys/practice65/config.h
+++ b/keyboards/cannonkeys/practice65/config.h
@@ -33,6 +33,9 @@ along with this program. If not, see .
#define MATRIX_ROW_PINS { B4, B11, B1, B7, B6 }
#define DIODE_DIRECTION COL2ROW
+#define BACKLIGHT_PIN A8
+#define BACKLIGHT_PWM_DRIVER PWMD1
+#define BACKLIGHT_PWM_CHANNEL 1
#define BACKLIGHT_LEVELS 6
#define BACKLIGHT_BREATHING
#define BREATHING_PERIOD 6
@@ -49,14 +52,10 @@ along with this program. If not, see .
#define LOCKING_RESYNC_ENABLE
#define RGBLIGHT_ANIMATIONS
-
-#define WS2812_LED_N 20
-#define RGBLED_NUM WS2812_LED_N
-#define PORT_WS2812 GPIOB
-#define PIN_WS2812 15
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 20
#define WS2812_SPI SPID2
-
/*
* Feature disable options
* These options are also useful to firmware size reduction.
diff --git a/keyboards/cannonkeys/practice65/rules.mk b/keyboards/cannonkeys/practice65/rules.mk
index d4a396120ae..d6d2b3fe7ef 100644
--- a/keyboards/cannonkeys/practice65/rules.mk
+++ b/keyboards/cannonkeys/practice65/rules.mk
@@ -11,8 +11,7 @@ DFU_SUFFIX_ARGS = -v 1eaf -p 0003
# project specific files
VPATH += keyboards/cannonkeys/bluepill
-SRC = led.c \
- keyboard.c
+SRC = keyboard.c
#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
@@ -20,11 +19,10 @@ EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes # USB Nkey Rollover
+NKRO_ENABLE = yes # USB Nkey Rollover
BACKLIGHT_ENABLE = yes
-BACKLIGHT_DRIVER = custom
RGBLIGHT_ENABLE = yes
-
+WS2812_DRIVER = spi
# Enter lower-power sleep mode when on the ChibiOS idle thread
OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
diff --git a/keyboards/cannonkeys/rekt1800/chconf.h b/keyboards/cannonkeys/rekt1800/chconf.h
new file mode 100644
index 00000000000..03f63da36a8
--- /dev/null
+++ b/keyboards/cannonkeys/rekt1800/chconf.h
@@ -0,0 +1,714 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file rt/templates/chconf.h
+ * @brief Configuration file template.
+ * @details A copy of this file must be placed in each project directory, it
+ * contains the application specific kernel settings.
+ *
+ * @addtogroup config
+ * @details Kernel related settings and hooks.
+ * @{
+ */
+
+#ifndef CHCONF_H
+#define CHCONF_H
+
+#define _CHIBIOS_RT_CONF_
+#define _CHIBIOS_RT_CONF_VER_6_0_
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System time counter resolution.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_ST_RESOLUTION)
+#define CH_CFG_ST_RESOLUTION 32
+#endif
+
+/**
+ * @brief System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ * setting also defines the system tick time unit.
+ */
+#if !defined(CH_CFG_ST_FREQUENCY)
+#define CH_CFG_ST_FREQUENCY 10000
+#endif
+
+/**
+ * @brief Time intervals data size.
+ * @note Allowed values are 16, 32 or 64 bits.
+ */
+#if !defined(CH_CFG_INTERVALS_SIZE)
+#define CH_CFG_INTERVALS_SIZE 32
+#endif
+
+/**
+ * @brief Time types data size.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_TIME_TYPES_SIZE)
+#define CH_CFG_TIME_TYPES_SIZE 32
+#endif
+
+/**
+ * @brief Time delta constant for the tick-less mode.
+ * @note If this value is zero then the system uses the classic
+ * periodic tick. This value represents the minimum number
+ * of ticks that is safe to specify in a timeout directive.
+ * The value one is not valid, timeouts are rounded up to
+ * this value.
+ */
+#if !defined(CH_CFG_ST_TIMEDELTA)
+#define CH_CFG_ST_TIMEDELTA 2
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel parameters and options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Round robin interval.
+ * @details This constant is the number of system ticks allowed for the
+ * threads before preemption occurs. Setting this value to zero
+ * disables the preemption for threads with equal priority and the
+ * round robin becomes cooperative. Note that higher priority
+ * threads can still preempt, the kernel is always preemptive.
+ * @note Disabling the round robin preemption makes the kernel more compact
+ * and generally faster.
+ * @note The round robin preemption is not supported in tickless mode and
+ * must be set to zero in that case.
+ */
+#if !defined(CH_CFG_TIME_QUANTUM)
+#define CH_CFG_TIME_QUANTUM 0
+#endif
+
+/**
+ * @brief Managed RAM size.
+ * @details Size of the RAM area to be managed by the OS. If set to zero
+ * then the whole available RAM is used. The core memory is made
+ * available to the heap allocator and/or can be used directly through
+ * the simplified core memory allocator.
+ *
+ * @note In order to let the OS manage the whole RAM the linker script must
+ * provide the @p __heap_base__ and @p __heap_end__ symbols.
+ * @note Requires @p CH_CFG_USE_MEMCORE.
+ */
+#if !defined(CH_CFG_MEMCORE_SIZE)
+#define CH_CFG_MEMCORE_SIZE 0
+#endif
+
+/**
+ * @brief Idle thread automatic spawn suppression.
+ * @details When this option is activated the function @p chSysInit()
+ * does not spawn the idle thread. The application @p main()
+ * function becomes the idle thread and must implement an
+ * infinite loop.
+ */
+#if !defined(CH_CFG_NO_IDLE_THREAD)
+#define CH_CFG_NO_IDLE_THREAD FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Performance options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief OS optimization.
+ * @details If enabled then time efficient rather than space efficient code
+ * is used when two possible implementations exist.
+ *
+ * @note This is not related to the compiler optimization options.
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_OPTIMIZE_SPEED)
+#define CH_CFG_OPTIMIZE_SPEED FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Subsystem options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Time Measurement APIs.
+ * @details If enabled then the time measurement APIs are included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_TM)
+#define CH_CFG_USE_TM FALSE
+#endif
+
+/**
+ * @brief Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_REGISTRY)
+#define CH_CFG_USE_REGISTRY TRUE
+#endif
+
+/**
+ * @brief Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_WAITEXIT)
+#define CH_CFG_USE_WAITEXIT TRUE
+#endif
+
+/**
+ * @brief Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES)
+#define CH_CFG_USE_SEMAPHORES TRUE
+#endif
+
+/**
+ * @brief Semaphores queuing mode.
+ * @details If enabled then the threads are enqueued on semaphores by
+ * priority rather than in FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY)
+#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MUTEXES)
+#define CH_CFG_USE_MUTEXES TRUE
+#endif
+
+/**
+ * @brief Enables recursive behavior on mutexes.
+ * @note Recursive mutexes are heavier and have an increased
+ * memory footprint.
+ *
+ * @note The default is @p FALSE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE)
+#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
+#endif
+
+/**
+ * @brief Conditional Variables APIs.
+ * @details If enabled then the conditional variables APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_CONDVARS)
+#define CH_CFG_USE_CONDVARS TRUE
+#endif
+
+/**
+ * @brief Conditional Variables APIs with timeout.
+ * @details If enabled then the conditional variables APIs with timeout
+ * specification are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_CONDVARS.
+ */
+#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT)
+#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
+#endif
+
+/**
+ * @brief Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_EVENTS)
+#define CH_CFG_USE_EVENTS TRUE
+#endif
+
+/**
+ * @brief Events Flags APIs with timeout.
+ * @details If enabled then the events APIs with timeout specification
+ * are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_EVENTS.
+ */
+#if !defined(CH_CFG_USE_EVENTS_TIMEOUT)
+#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MESSAGES)
+#define CH_CFG_USE_MESSAGES TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages queuing mode.
+ * @details If enabled then messages are served by priority rather than in
+ * FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_MESSAGES.
+ */
+#if !defined(CH_CFG_USE_MESSAGES_PRIORITY)
+#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mailboxes APIs.
+ * @details If enabled then the asynchronous messages (mailboxes) APIs are
+ * included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_MAILBOXES)
+#define CH_CFG_USE_MAILBOXES TRUE
+#endif
+
+/**
+ * @brief Core Memory Manager APIs.
+ * @details If enabled then the core memory manager APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMCORE)
+#define CH_CFG_USE_MEMCORE TRUE
+#endif
+
+/**
+ * @brief Heap Allocator APIs.
+ * @details If enabled then the memory heap allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
+ * @p CH_CFG_USE_SEMAPHORES.
+ * @note Mutexes are recommended.
+ */
+#if !defined(CH_CFG_USE_HEAP)
+#define CH_CFG_USE_HEAP FALSE
+#endif
+
+/**
+ * @brief Memory Pools Allocator APIs.
+ * @details If enabled then the memory pools allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMPOOLS)
+#define CH_CFG_USE_MEMPOOLS FALSE
+#endif
+
+/**
+ * @brief Objects FIFOs APIs.
+ * @details If enabled then the objects FIFOs APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_OBJ_FIFOS)
+#define CH_CFG_USE_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Pipes APIs.
+ * @details If enabled then the pipes APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_PIPES)
+#define CH_CFG_USE_PIPES FALSE
+#endif
+
+/**
+ * @brief Dynamic Threads APIs.
+ * @details If enabled then the dynamic threads creation APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_WAITEXIT.
+ * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
+ */
+#if !defined(CH_CFG_USE_DYNAMIC)
+#define CH_CFG_USE_DYNAMIC FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Objects factory options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Objects Factory APIs.
+ * @details If enabled then the objects factory APIs are included in the
+ * kernel.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_CFG_USE_FACTORY)
+#define CH_CFG_USE_FACTORY FALSE
+#endif
+
+/**
+ * @brief Maximum length for object names.
+ * @details If the specified length is zero then the name is stored by
+ * pointer but this could have unintended side effects.
+ */
+#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH)
+#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8
+#endif
+
+/**
+ * @brief Enables the registry of generic objects.
+ */
+#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY)
+#define CH_CFG_FACTORY_OBJECTS_REGISTRY FALSE
+#endif
+
+/**
+ * @brief Enables factory for generic buffers.
+ */
+#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)
+#define CH_CFG_FACTORY_GENERIC_BUFFERS FALSE
+#endif
+
+/**
+ * @brief Enables factory for semaphores.
+ */
+#if !defined(CH_CFG_FACTORY_SEMAPHORES)
+#define CH_CFG_FACTORY_SEMAPHORES FALSE
+#endif
+
+/**
+ * @brief Enables factory for mailboxes.
+ */
+#if !defined(CH_CFG_FACTORY_MAILBOXES)
+#define CH_CFG_FACTORY_MAILBOXES FALSE
+#endif
+
+/**
+ * @brief Enables factory for objects FIFOs.
+ */
+#if !defined(CH_CFG_FACTORY_OBJ_FIFOS)
+#define CH_CFG_FACTORY_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Enables factory for Pipes.
+ */
+#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)
+#define CH_CFG_FACTORY_PIPES FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Debug option, kernel statistics.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_STATISTICS)
+#define CH_DBG_STATISTICS FALSE
+#endif
+
+/**
+ * @brief Debug option, system state check.
+ * @details If enabled the correct call protocol for system APIs is checked
+ * at runtime.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_SYSTEM_STATE_CHECK)
+#define CH_DBG_SYSTEM_STATE_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, parameters checks.
+ * @details If enabled then the checks on the API functions input
+ * parameters are activated.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_CHECKS)
+#define CH_DBG_ENABLE_CHECKS FALSE
+#endif
+
+/**
+ * @brief Debug option, consistency checks.
+ * @details If enabled then all the assertions in the kernel code are
+ * activated. This includes consistency checks inside the kernel,
+ * runtime anomalies and port-defined checks.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_ASSERTS)
+#define CH_DBG_ENABLE_ASSERTS FALSE
+#endif
+
+/**
+ * @brief Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_MASK)
+#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
+#endif
+
+/**
+ * @brief Trace buffer entries.
+ * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is
+ * different from @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_BUFFER_SIZE)
+#define CH_DBG_TRACE_BUFFER_SIZE 128
+#endif
+
+/**
+ * @brief Debug option, stack checks.
+ * @details If enabled then a runtime stack check is performed.
+ *
+ * @note The default is @p FALSE.
+ * @note The stack check is performed in a architecture/port dependent way.
+ * It may not be implemented or some ports.
+ * @note The default failure mode is to halt the system with the global
+ * @p panic_msg variable set to @p NULL.
+ */
+#if !defined(CH_DBG_ENABLE_STACK_CHECK)
+#define CH_DBG_ENABLE_STACK_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, stacks initialization.
+ * @details If enabled then the threads working area is filled with a byte
+ * value when a thread is created. This can be useful for the
+ * runtime measurement of the used stack.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_FILL_THREADS)
+#define CH_DBG_FILL_THREADS FALSE
+#endif
+
+/**
+ * @brief Debug option, threads profiling.
+ * @details If enabled then a field is added to the @p thread_t structure that
+ * counts the system ticks occurred while executing the thread.
+ *
+ * @note The default is @p FALSE.
+ * @note This debug option is not currently compatible with the
+ * tickless mode.
+ */
+#if !defined(CH_DBG_THREADS_PROFILING)
+#define CH_DBG_THREADS_PROFILING FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System structure extension.
+ * @details User fields added to the end of the @p ch_system_t structure.
+ */
+#define CH_CFG_SYSTEM_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief System initialization hook.
+ * @details User initialization code added to the @p chSysInit() function
+ * just before interrupts are enabled globally.
+ */
+#define CH_CFG_SYSTEM_INIT_HOOK() { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads descriptor structure extension.
+ * @details User fields added to the end of the @p thread_t structure.
+ */
+#define CH_CFG_THREAD_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief Threads initialization hook.
+ * @details User initialization code added to the @p _thread_init() function.
+ *
+ * @note It is invoked from within @p _thread_init() and implicitly from all
+ * the threads creation APIs.
+ */
+#define CH_CFG_THREAD_INIT_HOOK(tp) { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads finalization hook.
+ * @details User finalization code added to the @p chThdExit() API.
+ */
+#define CH_CFG_THREAD_EXIT_HOOK(tp) { \
+ /* Add threads finalization code here.*/ \
+}
+
+/**
+ * @brief Context switch hook.
+ * @details This hook is invoked just before switching between threads.
+ */
+#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \
+ /* Context switch code here.*/ \
+}
+
+/**
+ * @brief ISR enter hook.
+ */
+#define CH_CFG_IRQ_PROLOGUE_HOOK() { \
+ /* IRQ prologue code here.*/ \
+}
+
+/**
+ * @brief ISR exit hook.
+ */
+#define CH_CFG_IRQ_EPILOGUE_HOOK() { \
+ /* IRQ epilogue code here.*/ \
+}
+
+/**
+ * @brief Idle thread enter hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to activate a power saving mode.
+ */
+#define CH_CFG_IDLE_ENTER_HOOK() { \
+ /* Idle-enter code here.*/ \
+}
+
+/**
+ * @brief Idle thread leave hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to deactivate a power saving mode.
+ */
+#define CH_CFG_IDLE_LEAVE_HOOK() { \
+ /* Idle-leave code here.*/ \
+}
+
+/**
+ * @brief Idle Loop hook.
+ * @details This hook is continuously invoked by the idle thread loop.
+ */
+#define CH_CFG_IDLE_LOOP_HOOK() { \
+ /* Idle loop code here.*/ \
+}
+
+/**
+ * @brief System tick event hook.
+ * @details This hook is invoked in the system tick handler immediately
+ * after processing the virtual timers queue.
+ */
+#define CH_CFG_SYSTEM_TICK_HOOK() { \
+ /* System tick event code here.*/ \
+}
+
+/**
+ * @brief System halt hook.
+ * @details This hook is invoked in case to a system halting error before
+ * the system is halted.
+ */
+#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \
+ /* System halt code here.*/ \
+}
+
+/**
+ * @brief Trace hook.
+ * @details This hook is invoked each time a new record is written in the
+ * trace buffer.
+ */
+#define CH_CFG_TRACE_HOOK(tep) { \
+ /* Trace code here.*/ \
+}
+
+/** @} */
+
+/*===========================================================================*/
+/* Port-specific settings (override port settings defaulted in chcore.h). */
+/*===========================================================================*/
+
+#endif /* CHCONF_H */
+
+/** @} */
diff --git a/keyboards/cannonkeys/rekt1800/config.h b/keyboards/cannonkeys/rekt1800/config.h
new file mode 100644
index 00000000000..1fc60bef973
--- /dev/null
+++ b/keyboards/cannonkeys/rekt1800/config.h
@@ -0,0 +1,74 @@
+/*
+Copyright 2015 Jun Wako
+
+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 .
+*/
+
+#pragma once
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xCA04
+#define PRODUCT_ID 0x2377
+#define DEVICE_VER 0x0001
+#define MANUFACTURER CannonKeys
+#define PRODUCT Rekt1800
+#define DESCRIPTION Rekt1800 Keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 19
+
+#define MATRIX_COL_PINS { B12, A14, A15, B3, B4, B5, B6, B7, B8, B9, A7, B0, B1, B2, B10, A3, A4, A5, C15 }
+#define MATRIX_ROW_PINS { C13, C14, A0, A1, A2, B11 }
+#define DIODE_DIRECTION COL2ROW
+
+#define BACKLIGHT_PIN A6
+#define BACKLIGHT_PWM_DRIVER PWMD3
+#define BACKLIGHT_PWM_CHANNEL 1
+#define BACKLIGHT_PAL_MODE 1
+#define BACKLIGHT_LEVELS 6
+#define BACKLIGHT_BREATHING
+#define BREATHING_PERIOD 6
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
diff --git a/keyboards/cannonkeys/rekt1800/halconf.h b/keyboards/cannonkeys/rekt1800/halconf.h
new file mode 100644
index 00000000000..921803762ea
--- /dev/null
+++ b/keyboards/cannonkeys/rekt1800/halconf.h
@@ -0,0 +1,525 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file templates/halconf.h
+ * @brief HAL configuration header.
+ * @details HAL configuration file, this file allows to enable or disable the
+ * various device drivers from your application. You may also use
+ * this file in order to override the device drivers default settings.
+ *
+ * @addtogroup HAL_CONF
+ * @{
+ */
+
+#ifndef HALCONF_H
+#define HALCONF_H
+
+#define _CHIBIOS_HAL_CONF_
+#define _CHIBIOS_HAL_CONF_VER_7_0_
+
+#include "mcuconf.h"
+
+/**
+ * @brief Enables the PAL subsystem.
+ */
+#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
+#define HAL_USE_PAL TRUE
+#endif
+
+/**
+ * @brief Enables the ADC subsystem.
+ */
+#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
+#define HAL_USE_ADC FALSE
+#endif
+
+/**
+ * @brief Enables the CAN subsystem.
+ */
+#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
+#define HAL_USE_CAN FALSE
+#endif
+
+/**
+ * @brief Enables the cryptographic subsystem.
+ */
+#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__)
+#define HAL_USE_CRY FALSE
+#endif
+
+/**
+ * @brief Enables the DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC FALSE
+#endif
+
+/**
+ * @brief Enables the GPT subsystem.
+ */
+#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
+#define HAL_USE_GPT FALSE
+#endif
+
+/**
+ * @brief Enables the I2C subsystem.
+ */
+#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
+#define HAL_USE_I2C FALSE
+#endif
+
+/**
+ * @brief Enables the I2S subsystem.
+ */
+#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
+#define HAL_USE_I2S FALSE
+#endif
+
+/**
+ * @brief Enables the ICU subsystem.
+ */
+#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)
+#define HAL_USE_ICU FALSE
+#endif
+
+/**
+ * @brief Enables the MAC subsystem.
+ */
+#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)
+#define HAL_USE_MAC FALSE
+#endif
+
+/**
+ * @brief Enables the MMC_SPI subsystem.
+ */
+#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_MMC_SPI FALSE
+#endif
+
+/**
+ * @brief Enables the PWM subsystem.
+ */
+#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
+#define HAL_USE_PWM TRUE
+#endif
+
+/**
+ * @brief Enables the RTC subsystem.
+ */
+#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)
+#define HAL_USE_RTC FALSE
+#endif
+
+/**
+ * @brief Enables the SDC subsystem.
+ */
+#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)
+#define HAL_USE_SDC FALSE
+#endif
+
+/**
+ * @brief Enables the SERIAL subsystem.
+ */
+#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL FALSE
+#endif
+
+/**
+ * @brief Enables the SERIAL over USB subsystem.
+ */
+#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL_USB FALSE
+#endif
+
+/**
+ * @brief Enables the SIO subsystem.
+ */
+#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__)
+#define HAL_USE_SIO FALSE
+#endif
+
+/**
+ * @brief Enables the SPI subsystem.
+ */
+#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_SPI TRUE
+#endif
+
+/**
+ * @brief Enables the TRNG subsystem.
+ */
+#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__)
+#define HAL_USE_TRNG FALSE
+#endif
+
+/**
+ * @brief Enables the UART subsystem.
+ */
+#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)
+#define HAL_USE_UART FALSE
+#endif
+
+/**
+ * @brief Enables the USB subsystem.
+ */
+#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
+#define HAL_USE_USB TRUE
+#endif
+
+/**
+ * @brief Enables the WDG subsystem.
+ */
+#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
+#define HAL_USE_WDG FALSE
+#endif
+
+/**
+ * @brief Enables the WSPI subsystem.
+ */
+#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__)
+#define HAL_USE_WSPI FALSE
+#endif
+
+/*===========================================================================*/
+/* PAL driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define PAL_USE_CALLBACKS FALSE
+#endif
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__)
+#define PAL_USE_WAIT FALSE
+#endif
+
+/*===========================================================================*/
+/* ADC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)
+#define ADC_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define ADC_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* CAN driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Sleep mode related APIs inclusion switch.
+ */
+#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__)
+#define CAN_USE_SLEEP_MODE TRUE
+#endif
+
+/**
+ * @brief Enforces the driver to use direct callbacks rather than OSAL events.
+ */
+#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define CAN_ENFORCE_USE_CALLBACKS FALSE
+#endif
+
+/*===========================================================================*/
+/* CRY driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the SW fall-back of the cryptographic driver.
+ * @details When enabled, this option, activates a fall-back software
+ * implementation for algorithms not supported by the underlying
+ * hardware.
+ * @note Fall-back implementations may not be present for all algorithms.
+ */
+#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_USE_FALLBACK FALSE
+#endif
+
+/**
+ * @brief Makes the driver forcibly use the fall-back implementations.
+ */
+#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_ENFORCE_FALLBACK FALSE
+#endif
+
+/*===========================================================================*/
+/* DAC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__)
+#define DAC_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define DAC_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* I2C driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the mutual exclusion APIs on the I2C bus.
+ */
+#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define I2C_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* MAC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the zero-copy API.
+ */
+#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)
+#define MAC_USE_ZERO_COPY FALSE
+#endif
+
+/**
+ * @brief Enables an event sources for incoming packets.
+ */
+#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__)
+#define MAC_USE_EVENTS TRUE
+#endif
+
+/*===========================================================================*/
+/* MMC_SPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ * This option is recommended also if the SPI driver does not
+ * use a DMA channel and heavily loads the CPU.
+ */
+#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__)
+#define MMC_NICE_WAITING TRUE
+#endif
+
+/*===========================================================================*/
+/* SDC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Number of initialization attempts before rejecting the card.
+ * @note Attempts are performed at 10mS intervals.
+ */
+#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__)
+#define SDC_INIT_RETRY 100
+#endif
+
+/**
+ * @brief Include support for MMC cards.
+ * @note MMC support is not yet implemented so this option must be kept
+ * at @p FALSE.
+ */
+#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__)
+#define SDC_MMC_SUPPORT FALSE
+#endif
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ */
+#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__)
+#define SDC_NICE_WAITING TRUE
+#endif
+
+/**
+ * @brief OCR initialization constant for V20 cards.
+ */
+#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR_V20 0x50FF8000U
+#endif
+
+/**
+ * @brief OCR initialization constant for non-V20 cards.
+ */
+#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR 0x80100000U
+#endif
+
+/*===========================================================================*/
+/* SERIAL driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Default bit rate.
+ * @details Configuration parameter, this is the baud rate selected for the
+ * default configuration.
+ */
+#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)
+#define SERIAL_DEFAULT_BITRATE 38400
+#endif
+
+/**
+ * @brief Serial buffers size.
+ * @details Configuration parameter, you can change the depth of the queue
+ * buffers depending on the requirements of your application.
+ * @note The default is 16 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_BUFFERS_SIZE 16
+#endif
+
+/*===========================================================================*/
+/* SERIAL_USB driver related setting. */
+/*===========================================================================*/
+
+/**
+ * @brief Serial over USB buffers size.
+ * @details Configuration parameter, the buffer size must be a multiple of
+ * the USB data endpoint maximum packet size.
+ * @note The default is 256 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_SIZE 1
+#endif
+
+/**
+ * @brief Serial over USB number of buffers.
+ * @note The default is 2 buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_NUMBER 2
+#endif
+
+/*===========================================================================*/
+/* SPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__)
+#define SPI_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables circular transfers APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__)
+#define SPI_USE_CIRCULAR FALSE
+#endif
+
+
+/**
+ * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define SPI_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/**
+ * @brief Handling method for SPI CS line.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__)
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+#endif
+
+/*===========================================================================*/
+/* UART driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__)
+#define UART_USE_WAIT FALSE
+#endif
+
+/**
+ * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define UART_USE_MUTUAL_EXCLUSION FALSE
+#endif
+
+/*===========================================================================*/
+/* USB driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
+#define USB_USE_WAIT TRUE
+#endif
+
+/*===========================================================================*/
+/* WSPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__)
+#define WSPI_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define WSPI_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+#endif /* HALCONF_H */
+
+/** @} */
diff --git a/keyboards/cannonkeys/rekt1800/info.json b/keyboards/cannonkeys/rekt1800/info.json
new file mode 100644
index 00000000000..32942f1ec44
--- /dev/null
+++ b/keyboards/cannonkeys/rekt1800/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "Rekt1800",
+ "url": "https://cannonkeys.com",
+ "maintainer": "awkannan",
+ "width": 19.5,
+ "height": 6.5,
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":1.25, "y":0}, {"label":"F2", "x":2.25, "y":0}, {"label":"F3", "x":3.25, "y":0}, {"label":"F4", "x":4.25, "y":0}, {"label":"F5", "x":5.5, "y":0}, {"label":"F6", "x":6.5, "y":0}, {"label":"F7", "x":7.5, "y":0}, {"label":"F8", "x":8.5, "y":0}, {"label":"F9", "x":9.75, "y":0}, {"label":"F10", "x":10.75, "y":0}, {"label":"F11", "x":11.75, "y":0}, {"label":"F12", "x":12.75, "y":0}, {"x":14, "y":0}, {"label":"PrtSc", "x":15.5, "y":0}, {"label":"Scroll Lock", "x":16.5, "y":0}, {"label":"Pause", "x":17.5, "y":0}, {"x":18.5, "y":0}, {"label":"~", "x":0, "y":1.25}, {"label":"!", "x":1, "y":1.25}, {"label":"@", "x":2, "y":1.25}, {"label":"#", "x":3, "y":1.25}, {"label":"$", "x":4, "y":1.25}, {"label":"%", "x":5, "y":1.25}, {"label":"^", "x":6, "y":1.25}, {"label":"&", "x":7, "y":1.25}, {"label":"*", "x":8, "y":1.25}, {"label":"(", "x":9, "y":1.25}, {"label":")", "x":10, "y":1.25}, {"label":"_", "x":11, "y":1.25}, {"label":"+", "x":12, "y":1.25}, {"x":13, "y":1.25}, {"x":14, "y":1.25}, {"label":"Insert", "x":15.5, "y":1.25}, {"label":"Home", "x":16.5, "y":1.25}, {"label":"PgUp", "x":17.5, "y":1.25}, {"x":18.5, "y":1.25}, {"label":"Tab", "x":0, "y":2.25, "w":1.5}, {"label":"Q", "x":1.5, "y":2.25}, {"label":"W", "x":2.5, "y":2.25}, {"label":"E", "x":3.5, "y":2.25}, {"label":"R", "x":4.5, "y":2.25}, {"label":"T", "x":5.5, "y":2.25}, {"label":"Y", "x":6.5, "y":2.25}, {"label":"U", "x":7.5, "y":2.25}, {"label":"I", "x":8.5, "y":2.25}, {"label":"O", "x":9.5, "y":2.25}, {"label":"P", "x":10.5, "y":2.25}, {"label":"{", "x":11.5, "y":2.25}, {"label":"}", "x":12.5, "y":2.25}, {"label":"|", "x":13.5, "y":2.25, "w":1.5}, {"label":"Delete", "x":15.5, "y":2.25}, {"label":"End", "x":16.5, "y":2.25}, {"label":"PgDn", "x":17.5, "y":2.25}, {"x":18.5, "y":2.25}, {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, {"label":"A", "x":1.75, "y":3.25}, {"label":"S", "x":2.75, "y":3.25}, {"label":"D", "x":3.75, "y":3.25}, {"label":"F", "x":4.75, "y":3.25}, {"label":"G", "x":5.75, "y":3.25}, {"label":"H", "x":6.75, "y":3.25}, {"label":"J", "x":7.75, "y":3.25}, {"label":"K", "x":8.75, "y":3.25}, {"label":"L", "x":9.75, "y":3.25}, {"label":":", "x":10.75, "y":3.25}, {"label":"\"", "x":11.75, "y":3.25}, {"x":12.75, "y":3.25}, {"label":"Enter", "x":13.75, "y":3.25, "w":1.25}, {"x":15.5, "y":3.25}, {"x":16.5, "y":3.25}, {"x":17.5, "y":3.25}, {"x":18.5, "y":3.25}, {"label":"Shift", "x":0, "y":4.25, "w":1.25}, {"x":1.25, "y":4.25}, {"label":"Z", "x":2.25, "y":4.25}, {"label":"X", "x":3.25, "y":4.25}, {"label":"C", "x":4.25, "y":4.25}, {"label":"V", "x":5.25, "y":4.25}, {"label":"B", "x":6.25, "y":4.25}, {"label":"N", "x":7.25, "y":4.25}, {"label":"M", "x":8.25, "y":4.25}, {"label":"<", "x":9.25, "y":4.25}, {"label":">", "x":10.25, "y":4.25}, {"label":"?", "x":11.25, "y":4.25}, {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, {"label":"\u2191", "x":14.25, "y":4.5}, {"x":15.5, "y":4.25}, {"x":16.5, "y":4.25}, {"x":17.5, "y":4.25}, {"x":18.5, "y":4.25, "h":2}, {"label":"Ctrl", "x":0, "y":5.25, "w":1.25}, {"label":"Alt", "x":1.25, "y":5.25, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.25, "w":1.25}, {"x":3.75, "y":5.25, "w":6.25}, {"label":"Alt", "x":10, "y":5.25, "w":1.5}, {"label":"Ctrl", "x":11.5, "y":5.25, "w":1.5}, {"label":"\u2190", "x":13.25, "y":5.5}, {"label":"\u2193", "x":14.25, "y":5.5}, {"label":"\u2192", "x":15.25, "y":5.5}, {"x":16.5, "y":5.25}, {"x":17.5, "y":5.25}]
+ }
+ }
+}
diff --git a/keyboards/cannonkeys/rekt1800/keymaps/default/keymap.c b/keyboards/cannonkeys/rekt1800/keymaps/default/keymap.c
new file mode 100644
index 00000000000..98e16e7008e
--- /dev/null
+++ b/keyboards/cannonkeys/rekt1800/keymaps/default/keymap.c
@@ -0,0 +1,48 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_names {
+ _BASE,
+ _FN1,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_BASE] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_DEL, KC_INS, KC_PGUP, KC_PGDN,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUBS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_LSFT, KC_NUHS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_FN1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+ ),
+
+ [_FN1] = LAYOUT_all(
+ RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ BL_BRTG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ BL_INC, BL_DEC, BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
diff --git a/keyboards/cannonkeys/rekt1800/keymaps/via/keymap.c b/keyboards/cannonkeys/rekt1800/keymaps/via/keymap.c
new file mode 100644
index 00000000000..d267302b34d
--- /dev/null
+++ b/keyboards/cannonkeys/rekt1800/keymaps/via/keymap.c
@@ -0,0 +1,58 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_names {
+ _BASE,
+ _FN1,
+ _FN2,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_BASE] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_DEL, KC_INS, KC_PGUP, KC_PGDN,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUBS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_LSFT, KC_NUHS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_FN1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+ ),
+
+ [_FN1] = LAYOUT_all(
+ RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ BL_BRTG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ BL_INC, BL_DEC, BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [_FN2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
diff --git a/keyboards/cannonkeys/rekt1800/keymaps/via/rules.mk b/keyboards/cannonkeys/rekt1800/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/cannonkeys/rekt1800/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/cannonkeys/rekt1800/mcuconf.h b/keyboards/cannonkeys/rekt1800/mcuconf.h
new file mode 100644
index 00000000000..43fe0a462ef
--- /dev/null
+++ b/keyboards/cannonkeys/rekt1800/mcuconf.h
@@ -0,0 +1,176 @@
+/*
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#ifndef _MCUCONF_H_
+#define _MCUCONF_H_
+
+/*
+ * STM32F0xx drivers configuration.
+ * The following settings override the default settings present in
+ * the various device driver implementation headers.
+ * Note that the settings for each driver only have effect if the whole
+ * driver is enabled in halconf.h.
+ *
+ * IRQ priorities:
+ * 3...0 Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3 Lowest...Highest.
+ */
+
+#define STM32F0xx_MCUCONF
+// #define STM32F070xB
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT FALSE
+#define STM32_PVD_ENABLE FALSE
+#define STM32_PLS STM32_PLS_LEV0
+#define STM32_HSI_ENABLED TRUE
+#define STM32_HSI14_ENABLED TRUE
+#define STM32_HSI48_ENABLED FALSE
+#define STM32_LSI_ENABLED TRUE
+#define STM32_HSE_ENABLED FALSE
+#define STM32_LSE_ENABLED FALSE
+#define STM32_SW STM32_SW_PLL
+#define STM32_PLLSRC STM32_PLLSRC_HSI_DIV2
+#define STM32_PREDIV_VALUE 1
+#define STM32_PLLMUL_VALUE 12
+#define STM32_HPRE STM32_HPRE_DIV1
+#define STM32_PPRE STM32_PPRE_DIV1
+#define STM32_ADCSW STM32_ADCSW_HSI14
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_ADCSW STM32_ADCSW_HSI14
+#define STM32_USBSW STM32_USBSW_HSI48
+#define STM32_CECSW STM32_CECSW_HSI
+#define STM32_I2C1SW STM32_I2C1SW_HSI
+#define STM32_USART1SW STM32_USART1SW_PCLK
+#define STM32_RTCSEL STM32_RTCSEL_LSI
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_USE_ADC1 FALSE
+#define STM32_ADC_ADC1_DMA_PRIORITY 2
+#define STM32_ADC_IRQ_PRIORITY 2
+#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2
+
+/*
+ * EXT driver system settings.
+ */
+#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI16_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI17_IRQ_PRIORITY 3
+
+/*
+ * GPT driver system settings.
+ */
+#define STM32_GPT_USE_TIM1 FALSE
+#define STM32_GPT_USE_TIM2 FALSE
+#define STM32_GPT_USE_TIM3 FALSE
+#define STM32_GPT_USE_TIM14 FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY 2
+#define STM32_GPT_TIM2_IRQ_PRIORITY 2
+#define STM32_GPT_TIM3_IRQ_PRIORITY 2
+#define STM32_GPT_TIM14_IRQ_PRIORITY 2
+
+/*
+ * I2C driver system settings.
+ */
+#define STM32_I2C_USE_I2C1 FALSE
+#define STM32_I2C_USE_I2C2 FALSE
+#define STM32_I2C_BUSY_TIMEOUT 50
+#define STM32_I2C_I2C1_IRQ_PRIORITY 3
+#define STM32_I2C_I2C2_IRQ_PRIORITY 3
+#define STM32_I2C_USE_DMA TRUE
+#define STM32_I2C_I2C1_DMA_PRIORITY 1
+#define STM32_I2C_I2C2_DMA_PRIORITY 1
+#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
+#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6)
+#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure")
+
+/*
+ * ICU driver system settings.
+ */
+#define STM32_ICU_USE_TIM1 FALSE
+#define STM32_ICU_USE_TIM2 FALSE
+#define STM32_ICU_USE_TIM3 FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY 3
+#define STM32_ICU_TIM2_IRQ_PRIORITY 3
+#define STM32_ICU_TIM3_IRQ_PRIORITY 3
+
+/*
+ * PWM driver system settings.
+ */
+#define STM32_PWM_USE_ADVANCED FALSE
+#define STM32_PWM_USE_TIM1 FALSE
+#define STM32_PWM_USE_TIM2 FALSE
+#define STM32_PWM_USE_TIM3 TRUE
+#define STM32_PWM_TIM1_IRQ_PRIORITY 3
+#define STM32_PWM_TIM2_IRQ_PRIORITY 3
+#define STM32_PWM_TIM3_IRQ_PRIORITY 3
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1 FALSE
+#define STM32_SERIAL_USE_USART2 FALSE
+#define STM32_SERIAL_USART1_PRIORITY 3
+#define STM32_SERIAL_USART2_PRIORITY 3
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1 FALSE
+#define STM32_SPI_USE_SPI2 TRUE
+#define STM32_SPI_SPI1_DMA_PRIORITY 1
+#define STM32_SPI_SPI2_DMA_PRIORITY 1
+#define STM32_SPI_SPI1_IRQ_PRIORITY 2
+#define STM32_SPI_SPI2_IRQ_PRIORITY 2
+#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5)
+#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY 2
+#define STM32_ST_USE_TIMER 2
+
+/*
+ * UART driver system settings.
+ */
+#define STM32_UART_USE_USART1 FALSE
+#define STM32_UART_USE_USART2 FALSE
+#define STM32_UART_USART1_IRQ_PRIORITY 3
+#define STM32_UART_USART2_IRQ_PRIORITY 3
+#define STM32_UART_USART1_DMA_PRIORITY 0
+#define STM32_UART_USART2_DMA_PRIORITY 0
+#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure")
+
+/*
+ * USB driver system settings.
+ */
+#define STM32_USB_USE_USB1 TRUE
+#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE
+#define STM32_USB_USB1_LP_IRQ_PRIORITY 3
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/cannonkeys/rekt1800/readme.md b/keyboards/cannonkeys/rekt1800/readme.md
new file mode 100644
index 00000000000..5daf03b9a79
--- /dev/null
+++ b/keyboards/cannonkeys/rekt1800/readme.md
@@ -0,0 +1,10 @@
+# CannonKeys Rekt1800
+
+* Keyboard Maintainer: [Andrew Kannan](https://github.com/awkannan)
+* Hardware Supported: STM32F072CBT6
+
+Make example for this keyboard (after setting up your build environment):
+
+ make cannonkeys/rekt1800:default
+
+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).
diff --git a/keyboards/cannonkeys/rekt1800/rekt1800.c b/keyboards/cannonkeys/rekt1800/rekt1800.c
new file mode 100644
index 00000000000..3a8673b9553
--- /dev/null
+++ b/keyboards/cannonkeys/rekt1800/rekt1800.c
@@ -0,0 +1 @@
+#include "rekt1800.h"
diff --git a/keyboards/cannonkeys/rekt1800/rekt1800.h b/keyboards/cannonkeys/rekt1800/rekt1800.h
new file mode 100644
index 00000000000..18d72dfdf4c
--- /dev/null
+++ b/keyboards/cannonkeys/rekt1800/rekt1800.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#include "quantum.h"
+#define K_NO KC_NO
+
+#define LAYOUT_all( \
+ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, K017, K018, \
+ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, K118, \
+ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K215, K216, K217, K218, \
+ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K314, K315, K316, K317, K318, \
+ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K414, K415, K416, K417, K418, \
+ K500, K501, K502, K506, K510, K511, K512, K514, K515, K516, K517 \
+) { \
+ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K_NO, K014, K015, K016, K017, K018 }, \
+ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, K118 }, \
+ { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K_NO, K214, K215, K216, K217, K218 }, \
+ { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K_NO, K314, K315, K316, K317, K318 }, \
+ { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K_NO, K414, K415, K416, K417, K418 }, \
+ { K500, K501, K502, K_NO, K_NO, K_NO, K506, K_NO, K_NO, K_NO, K510, K511, K512, K_NO, K514, K515, K516, K517, K_NO } \
+}
diff --git a/keyboards/cannonkeys/rekt1800/rules.mk b/keyboards/cannonkeys/rekt1800/rules.mk
new file mode 100644
index 00000000000..c8f75b7dd93
--- /dev/null
+++ b/keyboards/cannonkeys/rekt1800/rules.mk
@@ -0,0 +1,19 @@
+# MCU name
+MCU = STM32F072
+
+# Build Options
+# comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover
+CUSTOM_MATRIX = no # Custom matrix file
+BACKLIGHT_ENABLE = yes
+RGBLIGHT_ENABLE = no
+
+# Enter lower-power sleep mode when on the ChibiOS idle thread
+OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
diff --git a/keyboards/cannonkeys/satisfaction75/chconf.h b/keyboards/cannonkeys/satisfaction75/chconf.h
index 4640ff5332b..03f63da36a8 100644
--- a/keyboards/cannonkeys/satisfaction75/chconf.h
+++ b/keyboards/cannonkeys/satisfaction75/chconf.h
@@ -331,7 +331,7 @@
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE FALSE
+#define CH_CFG_USE_MEMCORE TRUE
#endif
/**
diff --git a/keyboards/cannonkeys/satisfaction75/rules.mk b/keyboards/cannonkeys/satisfaction75/rules.mk
index 6584bb5ff3f..80f57181a93 100644
--- a/keyboards/cannonkeys/satisfaction75/rules.mk
+++ b/keyboards/cannonkeys/satisfaction75/rules.mk
@@ -10,7 +10,7 @@ SRC += led.c \
satisfaction_encoder.c \
satisfaction_oled.c
-#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
diff --git a/keyboards/cannonkeys/savage65/boards/ST_STM32F072B_DISCOVERY/board.c b/keyboards/cannonkeys/savage65/boards/ST_STM32F072B_DISCOVERY/board.c
deleted file mode 100644
index 7c09bd997cb..00000000000
--- a/keyboards/cannonkeys/savage65/boards/ST_STM32F072B_DISCOVERY/board.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/*
- * This file has been automatically generated using ChibiStudio board
- * generator plugin. Do not edit manually.
- */
-
-#include "hal.h"
-#include "stm32_gpio.h"
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/**
- * @brief Type of STM32 GPIO port setup.
- */
-typedef struct {
- uint32_t moder;
- uint32_t otyper;
- uint32_t ospeedr;
- uint32_t pupdr;
- uint32_t odr;
- uint32_t afrl;
- uint32_t afrh;
-} gpio_setup_t;
-
-/**
- * @brief Type of STM32 GPIO initialization data.
- */
-typedef struct {
-#if STM32_HAS_GPIOA || defined(__DOXYGEN__)
- gpio_setup_t PAData;
-#endif
-#if STM32_HAS_GPIOB || defined(__DOXYGEN__)
- gpio_setup_t PBData;
-#endif
-#if STM32_HAS_GPIOC || defined(__DOXYGEN__)
- gpio_setup_t PCData;
-#endif
-#if STM32_HAS_GPIOD || defined(__DOXYGEN__)
- gpio_setup_t PDData;
-#endif
-#if STM32_HAS_GPIOE || defined(__DOXYGEN__)
- gpio_setup_t PEData;
-#endif
-#if STM32_HAS_GPIOF || defined(__DOXYGEN__)
- gpio_setup_t PFData;
-#endif
-#if STM32_HAS_GPIOG || defined(__DOXYGEN__)
- gpio_setup_t PGData;
-#endif
-#if STM32_HAS_GPIOH || defined(__DOXYGEN__)
- gpio_setup_t PHData;
-#endif
-#if STM32_HAS_GPIOI || defined(__DOXYGEN__)
- gpio_setup_t PIData;
-#endif
-#if STM32_HAS_GPIOJ || defined(__DOXYGEN__)
- gpio_setup_t PJData;
-#endif
-#if STM32_HAS_GPIOK || defined(__DOXYGEN__)
- gpio_setup_t PKData;
-#endif
-} gpio_config_t;
-
-/**
- * @brief STM32 GPIO static initialization data.
- */
-static const gpio_config_t gpio_default_config = {
-#if STM32_HAS_GPIOA
- {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR,
- VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH},
-#endif
-#if STM32_HAS_GPIOB
- {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR,
- VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH},
-#endif
-#if STM32_HAS_GPIOC
- {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR,
- VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH},
-#endif
-#if STM32_HAS_GPIOD
- {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR,
- VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH},
-#endif
-#if STM32_HAS_GPIOE
- {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR,
- VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH},
-#endif
-#if STM32_HAS_GPIOF
- {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR,
- VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH},
-#endif
-#if STM32_HAS_GPIOG
- {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR,
- VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH},
-#endif
-#if STM32_HAS_GPIOH
- {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR,
- VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH},
-#endif
-#if STM32_HAS_GPIOI
- {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR,
- VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH},
-#endif
-#if STM32_HAS_GPIOJ
- {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR,
- VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH},
-#endif
-#if STM32_HAS_GPIOK
- {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR,
- VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH}
-#endif
-};
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) {
-
- gpiop->OTYPER = config->otyper;
- gpiop->OSPEEDR = config->ospeedr;
- gpiop->PUPDR = config->pupdr;
- gpiop->ODR = config->odr;
- gpiop->AFRL = config->afrl;
- gpiop->AFRH = config->afrh;
- gpiop->MODER = config->moder;
-}
-
-static void stm32_gpio_init(void) {
-
- /* Enabling GPIO-related clocks, the mask comes from the
- registry header file.*/
- rccResetAHB(STM32_GPIO_EN_MASK);
- rccEnableAHB(STM32_GPIO_EN_MASK, true);
-
- /* Initializing all the defined GPIO ports.*/
-#if STM32_HAS_GPIOA
- gpio_init(GPIOA, &gpio_default_config.PAData);
-#endif
-#if STM32_HAS_GPIOB
- gpio_init(GPIOB, &gpio_default_config.PBData);
-#endif
-#if STM32_HAS_GPIOC
- gpio_init(GPIOC, &gpio_default_config.PCData);
-#endif
-#if STM32_HAS_GPIOD
- gpio_init(GPIOD, &gpio_default_config.PDData);
-#endif
-#if STM32_HAS_GPIOE
- gpio_init(GPIOE, &gpio_default_config.PEData);
-#endif
-#if STM32_HAS_GPIOF
- gpio_init(GPIOF, &gpio_default_config.PFData);
-#endif
-#if STM32_HAS_GPIOG
- gpio_init(GPIOG, &gpio_default_config.PGData);
-#endif
-#if STM32_HAS_GPIOH
- gpio_init(GPIOH, &gpio_default_config.PHData);
-#endif
-#if STM32_HAS_GPIOI
- gpio_init(GPIOI, &gpio_default_config.PIData);
-#endif
-#if STM32_HAS_GPIOJ
- gpio_init(GPIOJ, &gpio_default_config.PJData);
-#endif
-#if STM32_HAS_GPIOK
- gpio_init(GPIOK, &gpio_default_config.PKData);
-#endif
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Early initialization code.
- * @details GPIO ports and system clocks are initialized before everything
- * else.
- */
-void __early_init(void) {
- extern void enter_bootloader_mode_if_requested(void);
- enter_bootloader_mode_if_requested();
- stm32_gpio_init();
- stm32_clock_init();
-}
-
-#if HAL_USE_SDC || defined(__DOXYGEN__)
-/**
- * @brief SDC card detection.
- */
-bool sdc_lld_is_card_inserted(SDCDriver *sdcp) {
-
- (void)sdcp;
- /* TODO: Fill the implementation.*/
- return true;
-}
-
-/**
- * @brief SDC card write protection detection.
- */
-bool sdc_lld_is_write_protected(SDCDriver *sdcp) {
-
- (void)sdcp;
- /* TODO: Fill the implementation.*/
- return false;
-}
-#endif /* HAL_USE_SDC */
-
-#if HAL_USE_MMC_SPI || defined(__DOXYGEN__)
-/**
- * @brief MMC_SPI card detection.
- */
-bool mmc_lld_is_card_inserted(MMCDriver *mmcp) {
-
- (void)mmcp;
- /* TODO: Fill the implementation.*/
- return true;
-}
-
-/**
- * @brief MMC_SPI card write protection detection.
- */
-bool mmc_lld_is_write_protected(MMCDriver *mmcp) {
-
- (void)mmcp;
- /* TODO: Fill the implementation.*/
- return false;
-}
-#endif
-
-/**
- * @brief Board-specific initialization code.
- * @todo Add your board-specific code, if any.
- */
-void boardInit(void) {
- SYSCFG->CFGR1 |= SYSCFG_CFGR1_I2C1_DMA_RMP;
- SYSCFG->CFGR1 &= ~(SYSCFG_CFGR1_SPI2_DMA_RMP);
-}
diff --git a/keyboards/cannonkeys/savage65/boards/ST_STM32F072B_DISCOVERY/board.h b/keyboards/cannonkeys/savage65/boards/ST_STM32F072B_DISCOVERY/board.h
deleted file mode 100644
index 57636d1f12f..00000000000
--- a/keyboards/cannonkeys/savage65/boards/ST_STM32F072B_DISCOVERY/board.h
+++ /dev/null
@@ -1,940 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/*
- * This file has been automatically generated using ChibiStudio board
- * generator plugin. Do not edit manually.
- */
-
-#ifndef BOARD_H
-#define BOARD_H
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*
- * Setup for ST STM32F072B-Discovery board.
- */
-
-/*
- * Board identifier.
- */
-#define BOARD_ST_STM32F072B_DISCOVERY
-#define BOARD_NAME "ST STM32F072B-Discovery"
-
-/*
- * Board oscillators-related settings.
- * NOTE: HSE not fitted.
- */
-#if !defined(STM32_LSECLK)
-#define STM32_LSECLK 32768
-#endif
-
-#define STM32_LSEDRV (3U << 3U)
-
-#if !defined(STM32_HSECLK)
-#define STM32_HSECLK 0U
-#endif
-
-#define STM32_HSE_BYPASS
-
-/*
- * MCU type as defined in the ST header.
- */
-#define STM32F072xB
-
-/*
- * IO pins assignments.
- */
-#define GPIOA_BUTTON 0U
-#define GPIOA_PIN1 1U
-#define GPIOA_PIN2 2U
-#define GPIOA_PIN3 3U
-#define GPIOA_PIN4 4U
-#define GPIOA_PIN5 5U
-#define GPIOA_PIN6 6U
-#define GPIOA_PIN7 7U
-#define GPIOA_PIN8 8U
-#define GPIOA_PIN9 9U
-#define GPIOA_PIN10 10U
-#define GPIOA_USB_DM 11U
-#define GPIOA_USB_DP 12U
-#define GPIOA_SWDIO 13U
-#define GPIOA_SWCLK 14U
-#define GPIOA_PIN15 15U
-
-#define GPIOB_PIN0 0U
-#define GPIOB_PIN1 1U
-#define GPIOB_PIN2 2U
-#define GPIOB_PIN3 3U
-#define GPIOB_PIN4 4U
-#define GPIOB_PIN5 5U
-#define GPIOB_PIN6 6U
-#define GPIOB_PIN7 7U
-#define GPIOB_PIN8 8U
-#define GPIOB_PIN9 9U
-#define GPIOB_PIN10 10U
-#define GPIOB_PIN11 11U
-#define GPIOB_PIN12 12U
-#define GPIOB_SPI2_SCK 13U
-#define GPIOB_SPI2_MISO 14U
-#define GPIOB_SPI2_MOSI 15U
-
-#define GPIOC_MEMS_CS 0U
-#define GPIOC_PIN1 1U
-#define GPIOC_PIN2 2U
-#define GPIOC_PIN3 3U
-#define GPIOC_PIN4 4U
-#define GPIOC_PIN5 5U
-#define GPIOC_LED_RED 6U
-#define GPIOC_LED_BLUE 7U
-#define GPIOC_LED_ORANGE 8U
-#define GPIOC_LED_GREEN 9U
-#define GPIOC_PIN10 10U
-#define GPIOC_PIN11 11U
-#define GPIOC_PIN12 12U
-#define GPIOC_PIN13 13U
-#define GPIOC_OSC32_IN 14U
-#define GPIOC_OSC32_OUT 15U
-
-#define GPIOD_PIN0 0U
-#define GPIOD_PIN1 1U
-#define GPIOD_PIN2 2U
-#define GPIOD_PIN3 3U
-#define GPIOD_PIN4 4U
-#define GPIOD_PIN5 5U
-#define GPIOD_PIN6 6U
-#define GPIOD_PIN7 7U
-#define GPIOD_PIN8 8U
-#define GPIOD_PIN9 9U
-#define GPIOD_PIN10 10U
-#define GPIOD_PIN11 11U
-#define GPIOD_PIN12 12U
-#define GPIOD_PIN13 13U
-#define GPIOD_PIN14 14U
-#define GPIOD_PIN15 15U
-
-#define GPIOE_PIN0 0U
-#define GPIOE_PIN1 1U
-#define GPIOE_PIN2 2U
-#define GPIOE_PIN3 3U
-#define GPIOE_PIN4 4U
-#define GPIOE_PIN5 5U
-#define GPIOE_PIN6 6U
-#define GPIOE_PIN7 7U
-#define GPIOE_PIN8 8U
-#define GPIOE_PIN9 9U
-#define GPIOE_PIN10 10U
-#define GPIOE_PIN11 11U
-#define GPIOE_PIN12 12U
-#define GPIOE_PIN13 13U
-#define GPIOE_PIN14 14U
-#define GPIOE_PIN15 15U
-
-#define GPIOF_OSC_IN 0U
-#define GPIOF_OSC_OUT 1U
-#define GPIOF_PIN2 2U
-#define GPIOF_PIN3 3U
-#define GPIOF_PIN4 4U
-#define GPIOF_PIN5 5U
-#define GPIOF_PIN6 6U
-#define GPIOF_PIN7 7U
-#define GPIOF_PIN8 8U
-#define GPIOF_PIN9 9U
-#define GPIOF_PIN10 10U
-#define GPIOF_PIN11 11U
-#define GPIOF_PIN12 12U
-#define GPIOF_PIN13 13U
-#define GPIOF_PIN14 14U
-#define GPIOF_PIN15 15U
-
-/*
- * IO lines assignments.
- */
-#define LINE_BUTTON PAL_LINE(GPIOA, 0U)
-#define LINE_USB_DM PAL_LINE(GPIOA, 11U)
-#define LINE_USB_DP PAL_LINE(GPIOA, 12U)
-#define LINE_SWDIO PAL_LINE(GPIOA, 13U)
-#define LINE_SWCLK PAL_LINE(GPIOA, 14U)
-#define LINE_SPI2_SCK PAL_LINE(GPIOB, 13U)
-#define LINE_SPI2_MISO PAL_LINE(GPIOB, 14U)
-#define LINE_SPI2_MOSI PAL_LINE(GPIOB, 15U)
-#define LINE_MEMS_CS PAL_LINE(GPIOC, 0U)
-#define LINE_LED_RED PAL_LINE(GPIOC, 6U)
-#define LINE_LED_BLUE PAL_LINE(GPIOC, 7U)
-#define LINE_LED_ORANGE PAL_LINE(GPIOC, 8U)
-#define LINE_LED_GREEN PAL_LINE(GPIOC, 9U)
-#define LINE_OSC32_IN PAL_LINE(GPIOC, 14U)
-#define LINE_OSC32_OUT PAL_LINE(GPIOC, 15U)
-#define LINE_OSC_IN PAL_LINE(GPIOF, 0U)
-#define LINE_OSC_OUT PAL_LINE(GPIOF, 1U)
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/*
- * I/O ports initial setup, this configuration is established soon after reset
- * in the initialization code.
- * Please refer to the STM32 Reference Manual for details.
- */
-#define PIN_MODE_INPUT(n) (0U << ((n) * 2U))
-#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U))
-#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U))
-#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U))
-#define PIN_ODR_LOW(n) (0U << (n))
-#define PIN_ODR_HIGH(n) (1U << (n))
-#define PIN_OTYPE_PUSHPULL(n) (0U << (n))
-#define PIN_OTYPE_OPENDRAIN(n) (1U << (n))
-#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U))
-#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U))
-#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U))
-#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U))
-#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U))
-#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U))
-#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U))
-#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U))
-
-/*
- * GPIOA setup:
- *
- * PA0 - BUTTON (input floating).
- * PA1 - PIN1 (input pullup).
- * PA2 - PIN2 (input pullup).
- * PA3 - PIN3 (input pullup).
- * PA4 - PIN4 (input pullup).
- * PA5 - PIN5 (input pullup).
- * PA6 - PIN6 (input pullup).
- * PA7 - PIN7 (input pullup).
- * PA8 - PIN8 (input pullup).
- * PA9 - PIN9 (input pullup).
- * PA10 - PIN10 (input pullup).
- * PA11 - USB_DM (input floating).
- * PA12 - USB_DP (input floating).
- * PA13 - SWDIO (alternate 0).
- * PA14 - SWCLK (alternate 0).
- * PA15 - PIN15 (input pullup).
- */
-#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \
- PIN_MODE_INPUT(GPIOA_PIN1) | \
- PIN_MODE_INPUT(GPIOA_PIN2) | \
- PIN_MODE_INPUT(GPIOA_PIN3) | \
- PIN_MODE_INPUT(GPIOA_PIN4) | \
- PIN_MODE_INPUT(GPIOA_PIN5) | \
- PIN_MODE_INPUT(GPIOA_PIN6) | \
- PIN_MODE_INPUT(GPIOA_PIN7) | \
- PIN_MODE_INPUT(GPIOA_PIN8) | \
- PIN_MODE_INPUT(GPIOA_PIN9) | \
- PIN_MODE_INPUT(GPIOA_PIN10) | \
- PIN_MODE_INPUT(GPIOA_USB_DM) | \
- PIN_MODE_INPUT(GPIOA_USB_DP) | \
- PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \
- PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \
- PIN_MODE_INPUT(GPIOA_PIN15))
-#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_BUTTON) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \
- PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \
- PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \
- PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN15))
-#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_BUTTON) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOA_USB_DM) | \
- PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \
- PIN_OSPEED_HIGH(GPIOA_SWDIO) | \
- PIN_OSPEED_HIGH(GPIOA_SWCLK) | \
- PIN_OSPEED_HIGH(GPIOA_PIN15))
-#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN10) | \
- PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \
- PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \
- PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \
- PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN15))
-#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_BUTTON) | \
- PIN_ODR_HIGH(GPIOA_PIN1) | \
- PIN_ODR_HIGH(GPIOA_PIN2) | \
- PIN_ODR_HIGH(GPIOA_PIN3) | \
- PIN_ODR_HIGH(GPIOA_PIN4) | \
- PIN_ODR_HIGH(GPIOA_PIN5) | \
- PIN_ODR_HIGH(GPIOA_PIN6) | \
- PIN_ODR_HIGH(GPIOA_PIN7) | \
- PIN_ODR_HIGH(GPIOA_PIN8) | \
- PIN_ODR_HIGH(GPIOA_PIN9) | \
- PIN_ODR_HIGH(GPIOA_PIN10) | \
- PIN_ODR_HIGH(GPIOA_USB_DM) | \
- PIN_ODR_HIGH(GPIOA_USB_DP) | \
- PIN_ODR_HIGH(GPIOA_SWDIO) | \
- PIN_ODR_HIGH(GPIOA_SWCLK) | \
- PIN_ODR_HIGH(GPIOA_PIN15))
-#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_BUTTON, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN7, 0U))
-#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOA_USB_DM, 0U) | \
- PIN_AFIO_AF(GPIOA_USB_DP, 0U) | \
- PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \
- PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN15, 0U))
-
-/*
- * GPIOB setup:
- *
- * PB0 - PIN0 (input pullup).
- * PB1 - PIN1 (input pullup).
- * PB2 - PIN2 (input pullup).
- * PB3 - PIN3 (input pullup).
- * PB4 - PIN4 (input pullup).
- * PB5 - PIN5 (input pullup).
- * PB6 - PIN6 (input pullup).
- * PB7 - PIN7 (input pullup).
- * PB8 - PIN8 (input pullup).
- * PB9 - PIN9 (input pullup).
- * PB10 - PIN10 (input pullup).
- * PB11 - PIN11 (input pullup).
- * PB12 - PIN12 (input pullup).
- * PB13 - SPI2_SCK (alternate 0).
- * PB14 - SPI2_MISO (alternate 0).
- * PB15 - SPI2_MOSI (alternate 0).
- */
-#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \
- PIN_MODE_INPUT(GPIOB_PIN1) | \
- PIN_MODE_INPUT(GPIOB_PIN2) | \
- PIN_MODE_INPUT(GPIOB_PIN3) | \
- PIN_MODE_INPUT(GPIOB_PIN4) | \
- PIN_MODE_INPUT(GPIOB_PIN5) | \
- PIN_MODE_INPUT(GPIOB_PIN6) | \
- PIN_MODE_INPUT(GPIOB_PIN7) | \
- PIN_MODE_INPUT(GPIOB_PIN8) | \
- PIN_MODE_INPUT(GPIOB_PIN9) | \
- PIN_MODE_INPUT(GPIOB_PIN10) | \
- PIN_MODE_INPUT(GPIOB_PIN11) | \
- PIN_MODE_INPUT(GPIOB_PIN12) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_SCK) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_MISO) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_SCK) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MISO) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \
- PIN_OSPEED_HIGH(GPIOB_PIN2) | \
- PIN_OSPEED_HIGH(GPIOB_PIN3) | \
- PIN_OSPEED_HIGH(GPIOB_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_SCK) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_MISO) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN12) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_SCK) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_MISO) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \
- PIN_ODR_HIGH(GPIOB_PIN1) | \
- PIN_ODR_HIGH(GPIOB_PIN2) | \
- PIN_ODR_HIGH(GPIOB_PIN3) | \
- PIN_ODR_HIGH(GPIOB_PIN4) | \
- PIN_ODR_HIGH(GPIOB_PIN5) | \
- PIN_ODR_HIGH(GPIOB_PIN6) | \
- PIN_ODR_HIGH(GPIOB_PIN7) | \
- PIN_ODR_HIGH(GPIOB_PIN8) | \
- PIN_ODR_HIGH(GPIOB_PIN9) | \
- PIN_ODR_HIGH(GPIOB_PIN10) | \
- PIN_ODR_HIGH(GPIOB_PIN11) | \
- PIN_ODR_HIGH(GPIOB_PIN12) | \
- PIN_ODR_HIGH(GPIOB_SPI2_SCK) | \
- PIN_ODR_HIGH(GPIOB_SPI2_MISO) | \
- PIN_ODR_HIGH(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN7, 0U))
-#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_SCK, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_MISO, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_MOSI, 0U))
-
-/*
- * GPIOC setup:
- *
- * PC0 - MEMS_CS (output pushpull maximum).
- * PC1 - PIN1 (input pullup).
- * PC2 - PIN2 (input pullup).
- * PC3 - PIN3 (input pullup).
- * PC4 - PIN4 (input pullup).
- * PC5 - PIN5 (input pullup).
- * PC6 - LED_RED (output pushpull maximum).
- * PC7 - LED_BLUE (output pushpull maximum).
- * PC8 - LED_ORANGE (output pushpull maximum).
- * PC9 - LED_GREEN (output pushpull maximum).
- * PC10 - PIN10 (input pullup).
- * PC11 - PIN11 (input pullup).
- * PC12 - PIN12 (input pullup).
- * PC13 - PIN13 (input pullup).
- * PC14 - OSC32_IN (input floating).
- * PC15 - OSC32_OUT (input floating).
- */
-#define VAL_GPIOC_MODER (PIN_MODE_OUTPUT(GPIOC_MEMS_CS) | \
- PIN_MODE_INPUT(GPIOC_PIN1) | \
- PIN_MODE_INPUT(GPIOC_PIN2) | \
- PIN_MODE_INPUT(GPIOC_PIN3) | \
- PIN_MODE_INPUT(GPIOC_PIN4) | \
- PIN_MODE_INPUT(GPIOC_PIN5) | \
- PIN_MODE_OUTPUT(GPIOC_LED_RED) | \
- PIN_MODE_OUTPUT(GPIOC_LED_BLUE) | \
- PIN_MODE_OUTPUT(GPIOC_LED_ORANGE) | \
- PIN_MODE_OUTPUT(GPIOC_LED_GREEN) | \
- PIN_MODE_INPUT(GPIOC_PIN10) | \
- PIN_MODE_INPUT(GPIOC_PIN11) | \
- PIN_MODE_INPUT(GPIOC_PIN12) | \
- PIN_MODE_INPUT(GPIOC_PIN13) | \
- PIN_MODE_INPUT(GPIOC_OSC32_IN) | \
- PIN_MODE_INPUT(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_MEMS_CS) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_RED) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_BLUE) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_ORANGE) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_GREEN) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \
- PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_MEMS_CS) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \
- PIN_OSPEED_HIGH(GPIOC_LED_RED) | \
- PIN_OSPEED_HIGH(GPIOC_LED_BLUE) | \
- PIN_OSPEED_HIGH(GPIOC_LED_ORANGE) | \
- PIN_OSPEED_HIGH(GPIOC_LED_GREEN) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \
- PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \
- PIN_OSPEED_HIGH(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_MEMS_CS) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN5) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_RED) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_BLUE) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_ORANGE) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_GREEN) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN13) | \
- PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \
- PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_MEMS_CS) | \
- PIN_ODR_HIGH(GPIOC_PIN1) | \
- PIN_ODR_HIGH(GPIOC_PIN2) | \
- PIN_ODR_HIGH(GPIOC_PIN3) | \
- PIN_ODR_HIGH(GPIOC_PIN4) | \
- PIN_ODR_HIGH(GPIOC_PIN5) | \
- PIN_ODR_LOW(GPIOC_LED_RED) | \
- PIN_ODR_LOW(GPIOC_LED_BLUE) | \
- PIN_ODR_LOW(GPIOC_LED_ORANGE) | \
- PIN_ODR_LOW(GPIOC_LED_GREEN) | \
- PIN_ODR_HIGH(GPIOC_PIN10) | \
- PIN_ODR_HIGH(GPIOC_PIN11) | \
- PIN_ODR_HIGH(GPIOC_PIN12) | \
- PIN_ODR_HIGH(GPIOC_PIN13) | \
- PIN_ODR_HIGH(GPIOC_OSC32_IN) | \
- PIN_ODR_HIGH(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_MEMS_CS, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_RED, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_BLUE, 0U))
-#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_LED_ORANGE, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_GREEN, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \
- PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U))
-
-/*
- * GPIOD setup:
- *
- * PD0 - PIN0 (input pullup).
- * PD1 - PIN1 (input pullup).
- * PD2 - PIN2 (input pullup).
- * PD3 - PIN3 (input pullup).
- * PD4 - PIN4 (input pullup).
- * PD5 - PIN5 (input pullup).
- * PD6 - PIN6 (input pullup).
- * PD7 - PIN7 (input pullup).
- * PD8 - PIN8 (input pullup).
- * PD9 - PIN9 (input pullup).
- * PD10 - PIN10 (input pullup).
- * PD11 - PIN11 (input pullup).
- * PD12 - PIN12 (input pullup).
- * PD13 - PIN13 (input pullup).
- * PD14 - PIN14 (input pullup).
- * PD15 - PIN15 (input pullup).
- */
-#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \
- PIN_MODE_INPUT(GPIOD_PIN1) | \
- PIN_MODE_INPUT(GPIOD_PIN2) | \
- PIN_MODE_INPUT(GPIOD_PIN3) | \
- PIN_MODE_INPUT(GPIOD_PIN4) | \
- PIN_MODE_INPUT(GPIOD_PIN5) | \
- PIN_MODE_INPUT(GPIOD_PIN6) | \
- PIN_MODE_INPUT(GPIOD_PIN7) | \
- PIN_MODE_INPUT(GPIOD_PIN8) | \
- PIN_MODE_INPUT(GPIOD_PIN9) | \
- PIN_MODE_INPUT(GPIOD_PIN10) | \
- PIN_MODE_INPUT(GPIOD_PIN11) | \
- PIN_MODE_INPUT(GPIOD_PIN12) | \
- PIN_MODE_INPUT(GPIOD_PIN13) | \
- PIN_MODE_INPUT(GPIOD_PIN14) | \
- PIN_MODE_INPUT(GPIOD_PIN15))
-#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN15))
-#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN15))
-#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN15))
-#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \
- PIN_ODR_HIGH(GPIOD_PIN1) | \
- PIN_ODR_HIGH(GPIOD_PIN2) | \
- PIN_ODR_HIGH(GPIOD_PIN3) | \
- PIN_ODR_HIGH(GPIOD_PIN4) | \
- PIN_ODR_HIGH(GPIOD_PIN5) | \
- PIN_ODR_HIGH(GPIOD_PIN6) | \
- PIN_ODR_HIGH(GPIOD_PIN7) | \
- PIN_ODR_HIGH(GPIOD_PIN8) | \
- PIN_ODR_HIGH(GPIOD_PIN9) | \
- PIN_ODR_HIGH(GPIOD_PIN10) | \
- PIN_ODR_HIGH(GPIOD_PIN11) | \
- PIN_ODR_HIGH(GPIOD_PIN12) | \
- PIN_ODR_HIGH(GPIOD_PIN13) | \
- PIN_ODR_HIGH(GPIOD_PIN14) | \
- PIN_ODR_HIGH(GPIOD_PIN15))
-#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN7, 0U))
-#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN15, 0U))
-
-/*
- * GPIOE setup:
- *
- * PE0 - PIN0 (input pullup).
- * PE1 - PIN1 (input pullup).
- * PE2 - PIN2 (input pullup).
- * PE3 - PIN3 (input pullup).
- * PE4 - PIN4 (input pullup).
- * PE5 - PIN5 (input pullup).
- * PE6 - PIN6 (input pullup).
- * PE7 - PIN7 (input pullup).
- * PE8 - PIN8 (input pullup).
- * PE9 - PIN9 (input pullup).
- * PE10 - PIN10 (input pullup).
- * PE11 - PIN11 (input pullup).
- * PE12 - PIN12 (input pullup).
- * PE13 - PIN13 (input pullup).
- * PE14 - PIN14 (input pullup).
- * PE15 - PIN15 (input pullup).
- */
-#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \
- PIN_MODE_INPUT(GPIOE_PIN1) | \
- PIN_MODE_INPUT(GPIOE_PIN2) | \
- PIN_MODE_INPUT(GPIOE_PIN3) | \
- PIN_MODE_INPUT(GPIOE_PIN4) | \
- PIN_MODE_INPUT(GPIOE_PIN5) | \
- PIN_MODE_INPUT(GPIOE_PIN6) | \
- PIN_MODE_INPUT(GPIOE_PIN7) | \
- PIN_MODE_INPUT(GPIOE_PIN8) | \
- PIN_MODE_INPUT(GPIOE_PIN9) | \
- PIN_MODE_INPUT(GPIOE_PIN10) | \
- PIN_MODE_INPUT(GPIOE_PIN11) | \
- PIN_MODE_INPUT(GPIOE_PIN12) | \
- PIN_MODE_INPUT(GPIOE_PIN13) | \
- PIN_MODE_INPUT(GPIOE_PIN14) | \
- PIN_MODE_INPUT(GPIOE_PIN15))
-#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN15))
-#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN15))
-#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN15))
-#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \
- PIN_ODR_HIGH(GPIOE_PIN1) | \
- PIN_ODR_HIGH(GPIOE_PIN2) | \
- PIN_ODR_HIGH(GPIOE_PIN3) | \
- PIN_ODR_HIGH(GPIOE_PIN4) | \
- PIN_ODR_HIGH(GPIOE_PIN5) | \
- PIN_ODR_HIGH(GPIOE_PIN6) | \
- PIN_ODR_HIGH(GPIOE_PIN7) | \
- PIN_ODR_HIGH(GPIOE_PIN8) | \
- PIN_ODR_HIGH(GPIOE_PIN9) | \
- PIN_ODR_HIGH(GPIOE_PIN10) | \
- PIN_ODR_HIGH(GPIOE_PIN11) | \
- PIN_ODR_HIGH(GPIOE_PIN12) | \
- PIN_ODR_HIGH(GPIOE_PIN13) | \
- PIN_ODR_HIGH(GPIOE_PIN14) | \
- PIN_ODR_HIGH(GPIOE_PIN15))
-#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN7, 0U))
-#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN15, 0U))
-
-/*
- * GPIOF setup:
- *
- * PF0 - OSC_IN (input floating).
- * PF1 - OSC_OUT (input floating).
- * PF2 - PIN2 (input pullup).
- * PF3 - PIN3 (input pullup).
- * PF4 - PIN4 (input pullup).
- * PF5 - PIN5 (input pullup).
- * PF6 - PIN6 (input pullup).
- * PF7 - PIN7 (input pullup).
- * PF8 - PIN8 (input pullup).
- * PF9 - PIN9 (input pullup).
- * PF10 - PIN10 (input pullup).
- * PF11 - PIN11 (input pullup).
- * PF12 - PIN12 (input pullup).
- * PF13 - PIN13 (input pullup).
- * PF14 - PIN14 (input pullup).
- * PF15 - PIN15 (input pullup).
- */
-#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \
- PIN_MODE_INPUT(GPIOF_OSC_OUT) | \
- PIN_MODE_INPUT(GPIOF_PIN2) | \
- PIN_MODE_INPUT(GPIOF_PIN3) | \
- PIN_MODE_INPUT(GPIOF_PIN4) | \
- PIN_MODE_INPUT(GPIOF_PIN5) | \
- PIN_MODE_INPUT(GPIOF_PIN6) | \
- PIN_MODE_INPUT(GPIOF_PIN7) | \
- PIN_MODE_INPUT(GPIOF_PIN8) | \
- PIN_MODE_INPUT(GPIOF_PIN9) | \
- PIN_MODE_INPUT(GPIOF_PIN10) | \
- PIN_MODE_INPUT(GPIOF_PIN11) | \
- PIN_MODE_INPUT(GPIOF_PIN12) | \
- PIN_MODE_INPUT(GPIOF_PIN13) | \
- PIN_MODE_INPUT(GPIOF_PIN14) | \
- PIN_MODE_INPUT(GPIOF_PIN15))
-#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \
- PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN15))
-#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOF_OSC_IN) | \
- PIN_OSPEED_VERYLOW(GPIOF_OSC_OUT) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN15))
-#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \
- PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN15))
-#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \
- PIN_ODR_HIGH(GPIOF_OSC_OUT) | \
- PIN_ODR_HIGH(GPIOF_PIN2) | \
- PIN_ODR_HIGH(GPIOF_PIN3) | \
- PIN_ODR_HIGH(GPIOF_PIN4) | \
- PIN_ODR_HIGH(GPIOF_PIN5) | \
- PIN_ODR_HIGH(GPIOF_PIN6) | \
- PIN_ODR_HIGH(GPIOF_PIN7) | \
- PIN_ODR_HIGH(GPIOF_PIN8) | \
- PIN_ODR_HIGH(GPIOF_PIN9) | \
- PIN_ODR_HIGH(GPIOF_PIN10) | \
- PIN_ODR_HIGH(GPIOF_PIN11) | \
- PIN_ODR_HIGH(GPIOF_PIN12) | \
- PIN_ODR_HIGH(GPIOF_PIN13) | \
- PIN_ODR_HIGH(GPIOF_PIN14) | \
- PIN_ODR_HIGH(GPIOF_PIN15))
-#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \
- PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN7, 0U))
-#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN15, 0U))
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#if !defined(_FROM_ASM_)
-#ifdef __cplusplus
-extern "C" {
-#endif
- void boardInit(void);
-#ifdef __cplusplus
-}
-#endif
-#endif /* _FROM_ASM_ */
-
-#endif /* BOARD_H */
diff --git a/keyboards/cannonkeys/savage65/boards/ST_STM32F072B_DISCOVERY/board.mk b/keyboards/cannonkeys/savage65/boards/ST_STM32F072B_DISCOVERY/board.mk
deleted file mode 100644
index b98dcdd26c6..00000000000
--- a/keyboards/cannonkeys/savage65/boards/ST_STM32F072B_DISCOVERY/board.mk
+++ /dev/null
@@ -1,5 +0,0 @@
-# List of all the board related files.
-BOARDSRC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY/board.c
-
-# Required include directories
-BOARDINC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY
diff --git a/keyboards/cannonkeys/savage65/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg b/keyboards/cannonkeys/savage65/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg
deleted file mode 100644
index 9c7cf4fd76a..00000000000
--- a/keyboards/cannonkeys/savage65/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg
+++ /dev/null
@@ -1,703 +0,0 @@
-
-
-
-
- resources/gencfg/processors/boards/stm32f0xx/templates
- ..
- 3.0.x
-
- ST STM32F072B-Discovery
- ST_STM32F072B_DISCOVERY
-
- STM32F072xB
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/keyboards/cannonkeys/savage65/chconf.h b/keyboards/cannonkeys/savage65/chconf.h
index 4640ff5332b..03f63da36a8 100644
--- a/keyboards/cannonkeys/savage65/chconf.h
+++ b/keyboards/cannonkeys/savage65/chconf.h
@@ -331,7 +331,7 @@
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE FALSE
+#define CH_CFG_USE_MEMCORE TRUE
#endif
/**
diff --git a/keyboards/cannonkeys/savage65/config.h b/keyboards/cannonkeys/savage65/config.h
index 0839c0111ee..79931cdde82 100644
--- a/keyboards/cannonkeys/savage65/config.h
+++ b/keyboards/cannonkeys/savage65/config.h
@@ -33,6 +33,10 @@ along with this program. If not, see .
#define MATRIX_ROW_PINS { B12, B11, B14, A8, A1 }
#define DIODE_DIRECTION COL2ROW
+#define BACKLIGHT_PIN A6
+#define BACKLIGHT_PWM_DRIVER PWMD3
+#define BACKLIGHT_PWM_CHANNEL 1
+#define BACKLIGHT_PAL_MODE 1
#define BACKLIGHT_LEVELS 6
#define BACKLIGHT_BREATHING
#define BREATHING_PERIOD 6
@@ -49,22 +53,11 @@ along with this program. If not, see .
#define LOCKING_RESYNC_ENABLE
#define RGBLIGHT_ANIMATIONS
-
-#define WS2812_LED_N 20
-#define RGBLED_NUM WS2812_LED_N
-#define PORT_WS2812 GPIOB
-#define PIN_WS2812 15
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 20
#define WS2812_SPI SPID2
+#define WS2812_SPI_MOSI_PAL_MODE 0
-// Backlight config starts after VIA's EEPROM usage,
-// dynamic keymaps start after this.
-#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
-
-// VIA lighting is handled by the keyboard-level code
-#define VIA_CUSTOM_LIGHTING_ENABLE
-
-// Let VIA handle the QMK RGBLIGHT
-#define VIA_QMK_RGBLIGHT_ENABLE
/*
* Feature disable options
diff --git a/keyboards/cannonkeys/savage65/rules.mk b/keyboards/cannonkeys/savage65/rules.mk
index bf4b9a2897b..dc7f59ae4ae 100644
--- a/keyboards/cannonkeys/savage65/rules.mk
+++ b/keyboards/cannonkeys/savage65/rules.mk
@@ -1,15 +1,10 @@
# MCU name
MCU = STM32F072
-BOARD = ST_STM32F072B_DISCOVERY
# Build Options
# comment out to disable the options.
#
-# project specific files
-VPATH += keyboards/cannonkeys/stm32f072
-SRC = keyboard.c \
- led.c
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
@@ -19,9 +14,9 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover
CUSTOM_MATRIX = no # Custom matrix file
-# BACKLIGHT_ENABLE = yes # This is broken on 072 for some reason
+BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
-
+WS2812_DRIVER = spi
# Enter lower-power sleep mode when on the ChibiOS idle thread
OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
diff --git a/keyboards/cannonkeys/stm32f072/keyboard.c b/keyboards/cannonkeys/stm32f072/keyboard.c
deleted file mode 100644
index fdda018fc4e..00000000000
--- a/keyboards/cannonkeys/stm32f072/keyboard.c
+++ /dev/null
@@ -1,257 +0,0 @@
-#include "keyboard.h"
-#include "ch.h"
-#include "hal.h"
-#include "led_custom.h"
-#include "util.h"
-#include "quantum.h"
-
-#include "ws2812.h"
-
-#include "raw_hid.h"
-#include "dynamic_keymap.h"
-#include "tmk_core/common/eeprom.h"
-#include "version.h" // for QMK_BUILDDATE used in EEPROM magic
-
-#include "via.h"
-#define EEPROM_CUSTOM_BACKLIGHT (VIA_EEPROM_CUSTOM_CONFIG_ADDR)
-
-backlight_config_t kb_backlight_config = {
- .enable = true,
- .breathing = true,
- .level = BACKLIGHT_LEVELS
-};
-
-void backlight_config_save(){
- eeprom_update_byte((uint8_t*)EEPROM_CUSTOM_BACKLIGHT, kb_backlight_config.raw);
-}
-
-void backlight_config_load(){
- kb_backlight_config.raw = eeprom_read_byte((uint8_t*)EEPROM_CUSTOM_BACKLIGHT);
-}
-
-// Called from via_init() if VIA_ENABLE
-// Called from matrix_init_kb() if not VIA_ENABLE
-void via_init_kb(void)
-{
- // If the EEPROM has the magic, the data is good.
- // OK to load from EEPROM.
- if (via_eeprom_is_valid()) {
- backlight_config_load();
- } else {
- // If the EEPROM has not been saved before, or is out of date,
- // save the default values to the EEPROM. Default values
- // come from construction of the backlight_config instance.
- backlight_config_save();
-
- // DO NOT set EEPROM valid here, let caller do this
- }
-}
-
-__attribute__ ((weak))
-void matrix_init_board(void);
-
-void matrix_init_kb(void){
- // If VIA is disabled, we still need to load backlight settings.
- // Call via_init_kb() the same way as via_init(), with setting
- // EEPROM valid afterwards.
-#ifndef VIA_ENABLE
- via_init_kb();
- via_eeprom_set_valid(true);
-#endif // VIA_ENABLE
- /* MOSI pin*/
-#ifdef RGBLIGHT_ENABLE
- palSetPadMode(PORT_WS2812, PIN_WS2812, PAL_MODE_ALTERNATE(0));
- wait_ms(500);
- leds_init();
-#endif
- backlight_init_ports();
-
- matrix_init_board();
-}
-
-void matrix_scan_kb(void)
-{
- #ifdef RGBLIGHT_ENABLE
- rgblight_task();
- #endif
- matrix_scan_user();
-}
-
-bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
- switch (keycode) {
- case BL_INC:
- if (record->event.pressed) {
- kb_backlight_config.level = kb_backlight_config.level + 1;
- if(kb_backlight_config.level > BACKLIGHT_LEVELS){
- kb_backlight_config.level = BACKLIGHT_LEVELS;
- }
- backlight_set(kb_backlight_config.level);
- backlight_config_save();
- }
- return false;
- case BL_TOGG:
- if (record->event.pressed) {
- kb_backlight_config.enable = !kb_backlight_config.enable;
- if(kb_backlight_config.enable){
- backlight_set(kb_backlight_config.level);
- } else {
- backlight_set(0);
- }
- backlight_config_save();
- }
- return false;
-
- case BL_DEC:
- if (record->event.pressed) {
- if(kb_backlight_config.level <= 1){
- kb_backlight_config.level = 0;
- } else {
- kb_backlight_config.level = kb_backlight_config.level - 1;
- }
- backlight_set(kb_backlight_config.level);
- backlight_config_save();
- }
- return false;
- case BL_BRTG:
- if (record->event.pressed) {
- kb_backlight_config.breathing = !kb_backlight_config.breathing;
- breathing_toggle();
- backlight_config_save();
- }
- return false;
- default:
- break;
- }
-
- return process_record_user(keycode, record);;
-}
-
-#ifdef VIA_ENABLE
-
-void backlight_get_value( uint8_t *data )
-{
- uint8_t *value_id = &(data[0]);
- uint8_t *value_data = &(data[1]);
- switch (*value_id)
- {
- case id_qmk_backlight_brightness:
- {
- // level / BACKLIGHT_LEVELS * 255
- value_data[0] = ((uint16_t)kb_backlight_config.level) * 255 / BACKLIGHT_LEVELS;
- break;
- }
- case id_qmk_backlight_effect:
- {
- value_data[0] = kb_backlight_config.breathing ? 1 : 0;
- break;
- }
- }
-}
-
-void backlight_set_value( uint8_t *data )
-{
- uint8_t *value_id = &(data[0]);
- uint8_t *value_data = &(data[1]);
- switch (*value_id)
- {
- case id_qmk_backlight_brightness:
- {
- // level / 255 * BACKLIGHT_LEVELS
- kb_backlight_config.level = ((uint16_t)value_data[0]) * BACKLIGHT_LEVELS / 255;
- backlight_set(kb_backlight_config.level);
- break;
- }
- case id_qmk_backlight_effect:
- {
- if ( value_data[0] == 0 ) {
- kb_backlight_config.breathing = false;
- breathing_disable();
- } else {
- kb_backlight_config.breathing = true;
- breathing_enable();
- }
- break;
- }
- }
-}
-
-void raw_hid_receive_kb( uint8_t *data, uint8_t length )
-{
- uint8_t *command_id = &(data[0]);
- uint8_t *command_data = &(data[1]);
- switch ( *command_id )
- {
- case id_lighting_set_value:
- {
- backlight_set_value(command_data);
- break;
- }
- case id_lighting_get_value:
- {
- backlight_get_value(command_data);
- break;
- }
- case id_lighting_save:
- {
- backlight_config_save();
- break;
- }
- default:
- {
- // Unhandled message.
- *command_id = id_unhandled;
- break;
- }
- }
- // DO NOT call raw_hid_send(data,length) here, let caller do this
-}
-#endif
-
-//
-// In the case of VIA being disabled, we still need to check if
-// keyboard level EEPROM memory is valid before loading.
-// Thus these are copies of the same functions in VIA, since
-// the backlight settings reuse VIA's EEPROM magic/version,
-// and the ones in via.c won't be compiled in.
-//
-// Yes, this is sub-optimal, and is only here for completeness
-// (i.e. catering to the 1% of people that want wilba.tech LED bling
-// AND want persistent settings BUT DON'T want to use dynamic keymaps/VIA).
-//
-#ifndef VIA_ENABLE
-
-bool via_eeprom_is_valid(void)
-{
- char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
- uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F );
- uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F );
- uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F );
-
- return (eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0 ) == magic0 &&
- eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1 ) == magic1 &&
- eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2 ) == magic2 );
-}
-
-// Sets VIA/keyboard level usage of EEPROM to valid/invalid
-// Keyboard level code (eg. via_init_kb()) should not call this
-void via_eeprom_set_valid(bool valid)
-{
- char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
- uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F );
- uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F );
- uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F );
-
- eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0, valid ? magic0 : 0xFF);
- eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1, valid ? magic1 : 0xFF);
- eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2, valid ? magic2 : 0xFF);
-}
-
-void via_eeprom_reset(void)
-{
- // Set the VIA specific EEPROM state as invalid.
- via_eeprom_set_valid(false);
- // Set the TMK/QMK EEPROM state as invalid.
- eeconfig_disable();
-}
-
-#endif // VIA_ENABLE
diff --git a/keyboards/cannonkeys/stm32f072/keyboard.h b/keyboards/cannonkeys/stm32f072/keyboard.h
deleted file mode 100644
index 81dd1b704ef..00000000000
--- a/keyboards/cannonkeys/stm32f072/keyboard.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#pragma once
-
-#include "quantum.h"
-
-typedef union {
- uint8_t raw;
- struct {
- bool enable :1;
- bool breathing : 1;
- uint8_t level :6;
- };
-} backlight_config_t;
-
-// Backlighting
-extern backlight_config_t kb_backlight_config;
-extern bool kb_backlight_breathing;
-void backlight_init_ports(void);
-void backlight_set(uint8_t level);
-bool is_breathing(void);
-void breathing_enable(void);
-void breathing_disable(void);
-void backlight_config_load(void);
-void backlight_config_save(void);
diff --git a/keyboards/cannonkeys/stm32f072/led.c b/keyboards/cannonkeys/stm32f072/led.c
deleted file mode 100644
index 5c7df47da75..00000000000
--- a/keyboards/cannonkeys/stm32f072/led.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
-Copyright 2012 Jun Wako
-
-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 .
-*/
-
-#include "hal.h"
-#include "led_custom.h"
-#include "keyboard.h"
-#include "printf.h"
-
-static void breathing_callback(PWMDriver *pwmp);
-
-static PWMConfig pwmCFG = {
- 0xFFFF, /* PWM clock frequency */
- 256, /* PWM period (in ticks) 1S (1/10kHz=0.1mS 0.1ms*10000 ticks=1S) */
- NULL, /* No Callback */
- {
- {PWM_OUTPUT_ACTIVE_HIGH, NULL}, /* Enable Channel 0 */
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL}
- },
- 0, /* HW dependent part.*/
- 0
-};
-
-static PWMConfig pwmCFG_breathing = {
- 0xFFFF, /* 10kHz PWM clock frequency */
- 256, /* PWM period (in ticks) 1S (1/10kHz=0.1mS 0.1ms*10000 ticks=1S) */
- breathing_callback, /* Breathing Callback */
- {
- {PWM_OUTPUT_ACTIVE_HIGH, NULL}, /* Enable Channel 0 */
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL},
- {PWM_OUTPUT_DISABLED, NULL}
- },
- 0, /* HW dependent part.*/
- 0
-};
-
-// See http://jared.geek.nz/2013/feb/linear-led-pwm
-static uint16_t cie_lightness(uint16_t v) {
- if (v <= 5243) // if below 8% of max
- return v / 9; // same as dividing by 900%
- else {
- uint32_t y = (((uint32_t) v + 10486) << 8) / (10486 + 0xFFFFUL); // add 16% of max and compare
- // to get a useful result with integer division, we shift left in the expression above
- // and revert what we've done again after squaring.
- y = y * y * y >> 8;
- if (y > 0xFFFFUL) // prevent overflow
- return 0xFFFFU;
- else
- return (uint16_t) y;
- }
-}
-
-
-uint8_t get_backlight_level(void){
- return kb_backlight_config.level;
-}
-
-void backlight_init_ports(void) {
- printf("backlight_init_ports()\n");
- palSetPadMode(GPIOA, 6, PAL_MODE_ALTERNATE(1));
- pwmStart(&PWMD3, &pwmCFG);
- // pwmEnableChannel(&PWMD3, 0, PWM_FRACTION_TO_WIDTH(&PWMD3, 0xFFFF,cie_lightness(0xFFFF)));
- if(kb_backlight_config.enable){
- backlight_set(kb_backlight_config.level);
- if(kb_backlight_config.breathing){
- breathing_enable();
- }
- } else {
- backlight_set(0);
- }
-
-}
-
-void backlight_set(uint8_t level) {
- printf("backlight_set(%d)\n", level);
- uint32_t duty = (uint32_t)(cie_lightness(0xFFFF * (uint32_t) level / BACKLIGHT_LEVELS));
- printf("duty: (%d)\n", duty);
- if (level == 0) {
- // Turn backlight off
- pwmDisableChannel(&PWMD3, 0);
- } else {
- // Turn backlight on
- if(!is_breathing()){
- pwmEnableChannel(&PWMD3, 0, PWM_FRACTION_TO_WIDTH(&PWMD3,0xFFFF,duty));
- }
- }
-}
-
-
-uint8_t backlight_tick = 0;
-
-void backlight_task(void) {
-}
-
-#define BREATHING_NO_HALT 0
-#define BREATHING_HALT_OFF 1
-#define BREATHING_HALT_ON 2
-#define BREATHING_STEPS 128
-
-static uint8_t breathing_period = BREATHING_PERIOD;
-static uint8_t breathing_halt = BREATHING_NO_HALT;
-static uint16_t breathing_counter = 0;
-
-bool is_breathing(void) {
- return PWMD3.config == &pwmCFG_breathing;
-}
-
-#define breathing_min() do {breathing_counter = 0;} while (0)
-#define breathing_max() do {breathing_counter = breathing_period * 256 / 2;} while (0)
-
-
-void breathing_interrupt_enable(void){
- pwmStop(&PWMD3);
- pwmStart(&PWMD3, &pwmCFG_breathing);
- chSysLockFromISR();
- pwmEnablePeriodicNotification(&PWMD3);
- pwmEnableChannelI(
- &PWMD3,
- 0,
- PWM_FRACTION_TO_WIDTH(
- &PWMD3,
- 0xFFFF,
- 0xFFFF
- )
- );
- chSysUnlockFromISR();
-}
-
-void breathing_interrupt_disable(void){
- pwmStop(&PWMD3);
- pwmStart(&PWMD3, &pwmCFG);
-}
-
-void breathing_enable(void)
-{
- breathing_counter = 0;
- breathing_halt = BREATHING_NO_HALT;
- breathing_interrupt_enable();
-}
-
-void breathing_pulse(void)
-{
- if (get_backlight_level() == 0)
- breathing_min();
- else
- breathing_max();
- breathing_halt = BREATHING_HALT_ON;
- breathing_interrupt_enable();
-}
-
-void breathing_disable(void)
-{
- printf("breathing_disable()\n");
- breathing_interrupt_disable();
- // Restore backlight level
- backlight_set(get_backlight_level());
-}
-
-void breathing_self_disable(void)
-{
- if (get_backlight_level() == 0)
- breathing_halt = BREATHING_HALT_OFF;
- else
- breathing_halt = BREATHING_HALT_ON;
-}
-
-void breathing_toggle(void) {
- if (is_breathing()){
- printf("disable breathing\n");
- breathing_disable();
- } else {
- printf("enable breathing\n");
- breathing_enable();
- }
-}
-
-void breathing_period_set(uint8_t value)
-{
- if (!value)
- value = 1;
- breathing_period = value;
-}
-
-void breathing_period_default(void) {
- breathing_period_set(BREATHING_PERIOD);
-}
-
-void breathing_period_inc(void)
-{
- breathing_period_set(breathing_period+1);
-}
-
-void breathing_period_dec(void)
-{
- breathing_period_set(breathing_period-1);
-}
-
-/* To generate breathing curve in python:
- * from math import sin, pi; [int(sin(x/128.0*pi)**4*255) for x in range(128)]
- */
-static const uint8_t breathing_table[BREATHING_STEPS] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 17, 20, 24, 28, 32, 36, 41, 46, 51, 57, 63, 70, 76, 83, 91, 98, 106, 113, 121, 129, 138, 146, 154, 162, 170, 178, 185, 193, 200, 207, 213, 220, 225, 231, 235, 240, 244, 247, 250, 252, 253, 254, 255, 254, 253, 252, 250, 247, 244, 240, 235, 231, 225, 220, 213, 207, 200, 193, 185, 178, 170, 162, 154, 146, 138, 129, 121, 113, 106, 98, 91, 83, 76, 70, 63, 57, 51, 46, 41, 36, 32, 28, 24, 20, 17, 15, 12, 10, 8, 6, 5, 4, 3, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-
-// Use this before the cie_lightness function.
-static inline uint16_t scale_backlight(uint16_t v) {
- return v / BACKLIGHT_LEVELS * get_backlight_level();
-}
-
-static void breathing_callback(PWMDriver *pwmp)
-{
- (void)pwmp;
- uint16_t interval = (uint16_t) breathing_period * 256 / BREATHING_STEPS;
- // resetting after one period to prevent ugly reset at overflow.
- breathing_counter = (breathing_counter + 1) % (breathing_period * 256);
- uint8_t index = breathing_counter / interval % BREATHING_STEPS;
-
- if (((breathing_halt == BREATHING_HALT_ON) && (index == BREATHING_STEPS / 2)) ||
- ((breathing_halt == BREATHING_HALT_OFF) && (index == BREATHING_STEPS - 1)))
- {
- breathing_interrupt_disable();
- }
-
- uint32_t duty = cie_lightness(scale_backlight(breathing_table[index] * 256));
-
- chSysLockFromISR();
- pwmEnableChannelI(
- &PWMD3,
- 0,
- PWM_FRACTION_TO_WIDTH(
- &PWMD3,
- 0xFFFF,
- duty
- )
- );
- chSysUnlockFromISR();
-}
diff --git a/keyboards/cannonkeys/stm32f072/led_custom.h b/keyboards/cannonkeys/stm32f072/led_custom.h
deleted file mode 100644
index 550d5b84ccb..00000000000
--- a/keyboards/cannonkeys/stm32f072/led_custom.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#pragma once
-
-void backlight_task(void);
-void breathing_interrupt_disable(void);
-void breathing_interrupt_enable(void);
-void breathing_toggle(void);
-void breathing_enable(void);
-void breathing_disable(void);
diff --git a/keyboards/cannonkeys/stm32f072/ws2812.c b/keyboards/cannonkeys/stm32f072/ws2812.c
deleted file mode 100644
index b2f2384f2ce..00000000000
--- a/keyboards/cannonkeys/stm32f072/ws2812.c
+++ /dev/null
@@ -1,151 +0,0 @@
-#include "ch.h"
-#include "hal.h"
-
-#include "ws2812.h"
-
-#define BYTES_FOR_LED_BYTE 4
-#define NB_COLORS 3
-#define BYTES_FOR_LED BYTES_FOR_LED_BYTE*NB_COLORS
-#define DATA_SIZE BYTES_FOR_LED*NB_LEDS
-#define RESET_SIZE 200
-
-// Define the spi your LEDs are plugged to here
-#define LEDS_SPI WS2812_SPI
-// Define the number of LEDs you wish to control in your LED strip
-#define NB_LEDS RGBLED_NUM
-
-#define LED_SPIRAL 0
-
-static uint8_t txbuf[DATA_SIZE + RESET_SIZE];
-static uint8_t get_protocol_eq(uint8_t data, int pos);
-
-/*
- * This lib is meant to be used asynchronously, thus the colors contained in
- * the txbuf will be sent in loop, so that the colors are always the ones you
- * put in the table (the user thus have less to worry about)
- *
- * Since the data are sent via DMA, and the call to spiSend is a blocking one,
- * the processor ressources are not used to much, if you see your program being
- * too slow, simply add a:
- * chThdSleepMilliseconds(x);
- * after the spiSend, where you increment x untill you are satisfied with your
- * program speed, another trick may be to lower this thread priority : your call
- */
-static THD_WORKING_AREA(LEDS_THREAD_WA, 128);
-static THD_FUNCTION(ledsThread, arg) {
- (void) arg;
- while(1){
- spiSend(&LEDS_SPI, DATA_SIZE + RESET_SIZE, txbuf);
- }
-}
-
-#if LED_SPIRAL
-/*
- * 'Led spiral' is a simple demo in which we put all the leds to the same
- * color, where this color does all the hsv circle in loop.
- * If you want to launch the thread that will chage the led colors to the
- * appropriate value, simply set LED_SPIRAL to 1.
- */
-
-static THD_WORKING_AREA(HSVTRANS_WA, 128);
-static THD_FUNCTION(hsv_transThread, arg) {
- (void) arg;
- hsv_color color = {0, 255, 255};
- while(1){
- color.h += 1;
- color.h %= 256;
- set_leds_color_hsv(color);
- chThdSleepMilliseconds(50);
- }
-}
-#endif
-
-static const SPIConfig spicfg = {
- false,
- NULL,
- GPIOB,
- 15,
- SPI_CR1_BR_1|SPI_CR1_BR_0 // baudrate : fpclk / 8 => 1tick is 0.32us
-};
-
-/*
- * Function used to initialize the driver.
- *
- * Starts by shutting off all the LEDs.
- * Then gets access on the LED_SPI driver.
- * May eventually launch an animation on the LEDs (e.g. a thread setting the
- * txbuff values)
- */
-void leds_init(void){
- for(int i = 0; i < RESET_SIZE; i++)
- txbuf[DATA_SIZE+i] = 0x00;
- spiAcquireBus(&LEDS_SPI); /* Acquire ownership of the bus. */
- spiStart(&LEDS_SPI, &spicfg); /* Setup transfer parameters. */
- spiSelect(&LEDS_SPI); /* Slave Select assertion. */
- chThdCreateStatic(LEDS_THREAD_WA, sizeof(LEDS_THREAD_WA),NORMALPRIO, ledsThread, NULL);
-#if LED_SPIRAL
- chThdCreateStatic(HSVTRANS_WA, sizeof(HSVTRANS_WA),
- NORMALPRIO, hsv_transThread, NULL);
-#endif
-}
-
-/*
- * As the trick here is to use the SPI to send a huge pattern of 0 and 1 to
- * the ws2812b protocol, we use this helper function to translate bytes into
- * 0s and 1s for the LED (with the appropriate timing).
- */
-static uint8_t get_protocol_eq(uint8_t data, int pos){
- uint8_t eq = 0;
- if (data & (1 << (2*(3-pos))))
- eq = 0b1110;
- else
- eq = 0b1000;
- if (data & (2 << (2*(3-pos))))
- eq += 0b11100000;
- else
- eq += 0b10000000;
- return eq;
-}
-
-//
-///*
-// * If you want to set a LED's color in the RGB color space, simply call this
-// * function with a hsv_color containing the desired color and the index of the
-// * led on the LED strip (starting from 0, the first one being the closest the
-// * first plugged to the board)
-// *
-// * Only set the color of the LEDs through the functions given by this API
-// * (unless you really know what you are doing)
-// */
-void set_led_color_rgb(LED_TYPE color, int pos){
- for(int j = 0; j < 4; j++)
- txbuf[BYTES_FOR_LED*pos + j] = get_protocol_eq(color.g, j);
- for(int j = 0; j < 4; j++)
- txbuf[BYTES_FOR_LED*pos + BYTES_FOR_LED_BYTE+j] = get_protocol_eq(color.r, j);
- for(int j = 0; j < 4; j++)
- txbuf[BYTES_FOR_LED*pos + BYTES_FOR_LED_BYTE*2+j] = get_protocol_eq(color.b, j);
-}
-
-
-void WS2812_init(void) {
- leds_init();
-}
-
-void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds) {
- uint8_t i = 0;
- while (i < number_of_leds) {
- set_led_color_rgb(ledarray[i], i);
- i++;
- }
-}
-
-
-void set_leds_color_rgb(LED_TYPE color){
- for(int i = 0; i < NB_LEDS; i++)
- set_led_color_rgb(color, i);
-}
-
-
-void ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds) {
-
-}
diff --git a/keyboards/cannonkeys/stm32f072/ws2812.h b/keyboards/cannonkeys/stm32f072/ws2812.h
deleted file mode 100644
index 9b545fcd533..00000000000
--- a/keyboards/cannonkeys/stm32f072/ws2812.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#pragma once
-
-#include "hal.h"
-#include "color.h"
-
-void set_leds_color_rgb(LED_TYPE color);
-void set_led_color_rgb(LED_TYPE color, int pos);
-void leds_init(void);
-
-
- // This is what users will use to interface with this
-void ws2812_setleds(LED_TYPE *ledarray, uint16_t number_of_leds);
-void ws2812_setleds_rgbw(LED_TYPE *ledarray, uint16_t number_of_leds);
-
-
-void WS2812_init(void);
-void WS2812_set_color( uint8_t index, uint8_t red, uint8_t green, uint8_t blue );
-void WS2812_set_color_all( uint8_t red, uint8_t green, uint8_t blue );
-void WS2812_send_colors(void);
diff --git a/keyboards/cannonkeys/tmov2/boards/ST_STM32F072B_DISCOVERY/board.c b/keyboards/cannonkeys/tmov2/boards/ST_STM32F072B_DISCOVERY/board.c
deleted file mode 100644
index 7c09bd997cb..00000000000
--- a/keyboards/cannonkeys/tmov2/boards/ST_STM32F072B_DISCOVERY/board.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/*
- * This file has been automatically generated using ChibiStudio board
- * generator plugin. Do not edit manually.
- */
-
-#include "hal.h"
-#include "stm32_gpio.h"
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/**
- * @brief Type of STM32 GPIO port setup.
- */
-typedef struct {
- uint32_t moder;
- uint32_t otyper;
- uint32_t ospeedr;
- uint32_t pupdr;
- uint32_t odr;
- uint32_t afrl;
- uint32_t afrh;
-} gpio_setup_t;
-
-/**
- * @brief Type of STM32 GPIO initialization data.
- */
-typedef struct {
-#if STM32_HAS_GPIOA || defined(__DOXYGEN__)
- gpio_setup_t PAData;
-#endif
-#if STM32_HAS_GPIOB || defined(__DOXYGEN__)
- gpio_setup_t PBData;
-#endif
-#if STM32_HAS_GPIOC || defined(__DOXYGEN__)
- gpio_setup_t PCData;
-#endif
-#if STM32_HAS_GPIOD || defined(__DOXYGEN__)
- gpio_setup_t PDData;
-#endif
-#if STM32_HAS_GPIOE || defined(__DOXYGEN__)
- gpio_setup_t PEData;
-#endif
-#if STM32_HAS_GPIOF || defined(__DOXYGEN__)
- gpio_setup_t PFData;
-#endif
-#if STM32_HAS_GPIOG || defined(__DOXYGEN__)
- gpio_setup_t PGData;
-#endif
-#if STM32_HAS_GPIOH || defined(__DOXYGEN__)
- gpio_setup_t PHData;
-#endif
-#if STM32_HAS_GPIOI || defined(__DOXYGEN__)
- gpio_setup_t PIData;
-#endif
-#if STM32_HAS_GPIOJ || defined(__DOXYGEN__)
- gpio_setup_t PJData;
-#endif
-#if STM32_HAS_GPIOK || defined(__DOXYGEN__)
- gpio_setup_t PKData;
-#endif
-} gpio_config_t;
-
-/**
- * @brief STM32 GPIO static initialization data.
- */
-static const gpio_config_t gpio_default_config = {
-#if STM32_HAS_GPIOA
- {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR,
- VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH},
-#endif
-#if STM32_HAS_GPIOB
- {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR,
- VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH},
-#endif
-#if STM32_HAS_GPIOC
- {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR,
- VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH},
-#endif
-#if STM32_HAS_GPIOD
- {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR,
- VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH},
-#endif
-#if STM32_HAS_GPIOE
- {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR,
- VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH},
-#endif
-#if STM32_HAS_GPIOF
- {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR,
- VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH},
-#endif
-#if STM32_HAS_GPIOG
- {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR,
- VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH},
-#endif
-#if STM32_HAS_GPIOH
- {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR,
- VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH},
-#endif
-#if STM32_HAS_GPIOI
- {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR,
- VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH},
-#endif
-#if STM32_HAS_GPIOJ
- {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR,
- VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH},
-#endif
-#if STM32_HAS_GPIOK
- {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR,
- VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH}
-#endif
-};
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) {
-
- gpiop->OTYPER = config->otyper;
- gpiop->OSPEEDR = config->ospeedr;
- gpiop->PUPDR = config->pupdr;
- gpiop->ODR = config->odr;
- gpiop->AFRL = config->afrl;
- gpiop->AFRH = config->afrh;
- gpiop->MODER = config->moder;
-}
-
-static void stm32_gpio_init(void) {
-
- /* Enabling GPIO-related clocks, the mask comes from the
- registry header file.*/
- rccResetAHB(STM32_GPIO_EN_MASK);
- rccEnableAHB(STM32_GPIO_EN_MASK, true);
-
- /* Initializing all the defined GPIO ports.*/
-#if STM32_HAS_GPIOA
- gpio_init(GPIOA, &gpio_default_config.PAData);
-#endif
-#if STM32_HAS_GPIOB
- gpio_init(GPIOB, &gpio_default_config.PBData);
-#endif
-#if STM32_HAS_GPIOC
- gpio_init(GPIOC, &gpio_default_config.PCData);
-#endif
-#if STM32_HAS_GPIOD
- gpio_init(GPIOD, &gpio_default_config.PDData);
-#endif
-#if STM32_HAS_GPIOE
- gpio_init(GPIOE, &gpio_default_config.PEData);
-#endif
-#if STM32_HAS_GPIOF
- gpio_init(GPIOF, &gpio_default_config.PFData);
-#endif
-#if STM32_HAS_GPIOG
- gpio_init(GPIOG, &gpio_default_config.PGData);
-#endif
-#if STM32_HAS_GPIOH
- gpio_init(GPIOH, &gpio_default_config.PHData);
-#endif
-#if STM32_HAS_GPIOI
- gpio_init(GPIOI, &gpio_default_config.PIData);
-#endif
-#if STM32_HAS_GPIOJ
- gpio_init(GPIOJ, &gpio_default_config.PJData);
-#endif
-#if STM32_HAS_GPIOK
- gpio_init(GPIOK, &gpio_default_config.PKData);
-#endif
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Early initialization code.
- * @details GPIO ports and system clocks are initialized before everything
- * else.
- */
-void __early_init(void) {
- extern void enter_bootloader_mode_if_requested(void);
- enter_bootloader_mode_if_requested();
- stm32_gpio_init();
- stm32_clock_init();
-}
-
-#if HAL_USE_SDC || defined(__DOXYGEN__)
-/**
- * @brief SDC card detection.
- */
-bool sdc_lld_is_card_inserted(SDCDriver *sdcp) {
-
- (void)sdcp;
- /* TODO: Fill the implementation.*/
- return true;
-}
-
-/**
- * @brief SDC card write protection detection.
- */
-bool sdc_lld_is_write_protected(SDCDriver *sdcp) {
-
- (void)sdcp;
- /* TODO: Fill the implementation.*/
- return false;
-}
-#endif /* HAL_USE_SDC */
-
-#if HAL_USE_MMC_SPI || defined(__DOXYGEN__)
-/**
- * @brief MMC_SPI card detection.
- */
-bool mmc_lld_is_card_inserted(MMCDriver *mmcp) {
-
- (void)mmcp;
- /* TODO: Fill the implementation.*/
- return true;
-}
-
-/**
- * @brief MMC_SPI card write protection detection.
- */
-bool mmc_lld_is_write_protected(MMCDriver *mmcp) {
-
- (void)mmcp;
- /* TODO: Fill the implementation.*/
- return false;
-}
-#endif
-
-/**
- * @brief Board-specific initialization code.
- * @todo Add your board-specific code, if any.
- */
-void boardInit(void) {
- SYSCFG->CFGR1 |= SYSCFG_CFGR1_I2C1_DMA_RMP;
- SYSCFG->CFGR1 &= ~(SYSCFG_CFGR1_SPI2_DMA_RMP);
-}
diff --git a/keyboards/cannonkeys/tmov2/boards/ST_STM32F072B_DISCOVERY/board.h b/keyboards/cannonkeys/tmov2/boards/ST_STM32F072B_DISCOVERY/board.h
deleted file mode 100644
index 57636d1f12f..00000000000
--- a/keyboards/cannonkeys/tmov2/boards/ST_STM32F072B_DISCOVERY/board.h
+++ /dev/null
@@ -1,940 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/*
- * This file has been automatically generated using ChibiStudio board
- * generator plugin. Do not edit manually.
- */
-
-#ifndef BOARD_H
-#define BOARD_H
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*
- * Setup for ST STM32F072B-Discovery board.
- */
-
-/*
- * Board identifier.
- */
-#define BOARD_ST_STM32F072B_DISCOVERY
-#define BOARD_NAME "ST STM32F072B-Discovery"
-
-/*
- * Board oscillators-related settings.
- * NOTE: HSE not fitted.
- */
-#if !defined(STM32_LSECLK)
-#define STM32_LSECLK 32768
-#endif
-
-#define STM32_LSEDRV (3U << 3U)
-
-#if !defined(STM32_HSECLK)
-#define STM32_HSECLK 0U
-#endif
-
-#define STM32_HSE_BYPASS
-
-/*
- * MCU type as defined in the ST header.
- */
-#define STM32F072xB
-
-/*
- * IO pins assignments.
- */
-#define GPIOA_BUTTON 0U
-#define GPIOA_PIN1 1U
-#define GPIOA_PIN2 2U
-#define GPIOA_PIN3 3U
-#define GPIOA_PIN4 4U
-#define GPIOA_PIN5 5U
-#define GPIOA_PIN6 6U
-#define GPIOA_PIN7 7U
-#define GPIOA_PIN8 8U
-#define GPIOA_PIN9 9U
-#define GPIOA_PIN10 10U
-#define GPIOA_USB_DM 11U
-#define GPIOA_USB_DP 12U
-#define GPIOA_SWDIO 13U
-#define GPIOA_SWCLK 14U
-#define GPIOA_PIN15 15U
-
-#define GPIOB_PIN0 0U
-#define GPIOB_PIN1 1U
-#define GPIOB_PIN2 2U
-#define GPIOB_PIN3 3U
-#define GPIOB_PIN4 4U
-#define GPIOB_PIN5 5U
-#define GPIOB_PIN6 6U
-#define GPIOB_PIN7 7U
-#define GPIOB_PIN8 8U
-#define GPIOB_PIN9 9U
-#define GPIOB_PIN10 10U
-#define GPIOB_PIN11 11U
-#define GPIOB_PIN12 12U
-#define GPIOB_SPI2_SCK 13U
-#define GPIOB_SPI2_MISO 14U
-#define GPIOB_SPI2_MOSI 15U
-
-#define GPIOC_MEMS_CS 0U
-#define GPIOC_PIN1 1U
-#define GPIOC_PIN2 2U
-#define GPIOC_PIN3 3U
-#define GPIOC_PIN4 4U
-#define GPIOC_PIN5 5U
-#define GPIOC_LED_RED 6U
-#define GPIOC_LED_BLUE 7U
-#define GPIOC_LED_ORANGE 8U
-#define GPIOC_LED_GREEN 9U
-#define GPIOC_PIN10 10U
-#define GPIOC_PIN11 11U
-#define GPIOC_PIN12 12U
-#define GPIOC_PIN13 13U
-#define GPIOC_OSC32_IN 14U
-#define GPIOC_OSC32_OUT 15U
-
-#define GPIOD_PIN0 0U
-#define GPIOD_PIN1 1U
-#define GPIOD_PIN2 2U
-#define GPIOD_PIN3 3U
-#define GPIOD_PIN4 4U
-#define GPIOD_PIN5 5U
-#define GPIOD_PIN6 6U
-#define GPIOD_PIN7 7U
-#define GPIOD_PIN8 8U
-#define GPIOD_PIN9 9U
-#define GPIOD_PIN10 10U
-#define GPIOD_PIN11 11U
-#define GPIOD_PIN12 12U
-#define GPIOD_PIN13 13U
-#define GPIOD_PIN14 14U
-#define GPIOD_PIN15 15U
-
-#define GPIOE_PIN0 0U
-#define GPIOE_PIN1 1U
-#define GPIOE_PIN2 2U
-#define GPIOE_PIN3 3U
-#define GPIOE_PIN4 4U
-#define GPIOE_PIN5 5U
-#define GPIOE_PIN6 6U
-#define GPIOE_PIN7 7U
-#define GPIOE_PIN8 8U
-#define GPIOE_PIN9 9U
-#define GPIOE_PIN10 10U
-#define GPIOE_PIN11 11U
-#define GPIOE_PIN12 12U
-#define GPIOE_PIN13 13U
-#define GPIOE_PIN14 14U
-#define GPIOE_PIN15 15U
-
-#define GPIOF_OSC_IN 0U
-#define GPIOF_OSC_OUT 1U
-#define GPIOF_PIN2 2U
-#define GPIOF_PIN3 3U
-#define GPIOF_PIN4 4U
-#define GPIOF_PIN5 5U
-#define GPIOF_PIN6 6U
-#define GPIOF_PIN7 7U
-#define GPIOF_PIN8 8U
-#define GPIOF_PIN9 9U
-#define GPIOF_PIN10 10U
-#define GPIOF_PIN11 11U
-#define GPIOF_PIN12 12U
-#define GPIOF_PIN13 13U
-#define GPIOF_PIN14 14U
-#define GPIOF_PIN15 15U
-
-/*
- * IO lines assignments.
- */
-#define LINE_BUTTON PAL_LINE(GPIOA, 0U)
-#define LINE_USB_DM PAL_LINE(GPIOA, 11U)
-#define LINE_USB_DP PAL_LINE(GPIOA, 12U)
-#define LINE_SWDIO PAL_LINE(GPIOA, 13U)
-#define LINE_SWCLK PAL_LINE(GPIOA, 14U)
-#define LINE_SPI2_SCK PAL_LINE(GPIOB, 13U)
-#define LINE_SPI2_MISO PAL_LINE(GPIOB, 14U)
-#define LINE_SPI2_MOSI PAL_LINE(GPIOB, 15U)
-#define LINE_MEMS_CS PAL_LINE(GPIOC, 0U)
-#define LINE_LED_RED PAL_LINE(GPIOC, 6U)
-#define LINE_LED_BLUE PAL_LINE(GPIOC, 7U)
-#define LINE_LED_ORANGE PAL_LINE(GPIOC, 8U)
-#define LINE_LED_GREEN PAL_LINE(GPIOC, 9U)
-#define LINE_OSC32_IN PAL_LINE(GPIOC, 14U)
-#define LINE_OSC32_OUT PAL_LINE(GPIOC, 15U)
-#define LINE_OSC_IN PAL_LINE(GPIOF, 0U)
-#define LINE_OSC_OUT PAL_LINE(GPIOF, 1U)
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/*
- * I/O ports initial setup, this configuration is established soon after reset
- * in the initialization code.
- * Please refer to the STM32 Reference Manual for details.
- */
-#define PIN_MODE_INPUT(n) (0U << ((n) * 2U))
-#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U))
-#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U))
-#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U))
-#define PIN_ODR_LOW(n) (0U << (n))
-#define PIN_ODR_HIGH(n) (1U << (n))
-#define PIN_OTYPE_PUSHPULL(n) (0U << (n))
-#define PIN_OTYPE_OPENDRAIN(n) (1U << (n))
-#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U))
-#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U))
-#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U))
-#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U))
-#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U))
-#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U))
-#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U))
-#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U))
-
-/*
- * GPIOA setup:
- *
- * PA0 - BUTTON (input floating).
- * PA1 - PIN1 (input pullup).
- * PA2 - PIN2 (input pullup).
- * PA3 - PIN3 (input pullup).
- * PA4 - PIN4 (input pullup).
- * PA5 - PIN5 (input pullup).
- * PA6 - PIN6 (input pullup).
- * PA7 - PIN7 (input pullup).
- * PA8 - PIN8 (input pullup).
- * PA9 - PIN9 (input pullup).
- * PA10 - PIN10 (input pullup).
- * PA11 - USB_DM (input floating).
- * PA12 - USB_DP (input floating).
- * PA13 - SWDIO (alternate 0).
- * PA14 - SWCLK (alternate 0).
- * PA15 - PIN15 (input pullup).
- */
-#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \
- PIN_MODE_INPUT(GPIOA_PIN1) | \
- PIN_MODE_INPUT(GPIOA_PIN2) | \
- PIN_MODE_INPUT(GPIOA_PIN3) | \
- PIN_MODE_INPUT(GPIOA_PIN4) | \
- PIN_MODE_INPUT(GPIOA_PIN5) | \
- PIN_MODE_INPUT(GPIOA_PIN6) | \
- PIN_MODE_INPUT(GPIOA_PIN7) | \
- PIN_MODE_INPUT(GPIOA_PIN8) | \
- PIN_MODE_INPUT(GPIOA_PIN9) | \
- PIN_MODE_INPUT(GPIOA_PIN10) | \
- PIN_MODE_INPUT(GPIOA_USB_DM) | \
- PIN_MODE_INPUT(GPIOA_USB_DP) | \
- PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \
- PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \
- PIN_MODE_INPUT(GPIOA_PIN15))
-#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_BUTTON) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \
- PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \
- PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \
- PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN15))
-#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_BUTTON) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOA_USB_DM) | \
- PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \
- PIN_OSPEED_HIGH(GPIOA_SWDIO) | \
- PIN_OSPEED_HIGH(GPIOA_SWCLK) | \
- PIN_OSPEED_HIGH(GPIOA_PIN15))
-#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN10) | \
- PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \
- PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \
- PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \
- PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN15))
-#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_BUTTON) | \
- PIN_ODR_HIGH(GPIOA_PIN1) | \
- PIN_ODR_HIGH(GPIOA_PIN2) | \
- PIN_ODR_HIGH(GPIOA_PIN3) | \
- PIN_ODR_HIGH(GPIOA_PIN4) | \
- PIN_ODR_HIGH(GPIOA_PIN5) | \
- PIN_ODR_HIGH(GPIOA_PIN6) | \
- PIN_ODR_HIGH(GPIOA_PIN7) | \
- PIN_ODR_HIGH(GPIOA_PIN8) | \
- PIN_ODR_HIGH(GPIOA_PIN9) | \
- PIN_ODR_HIGH(GPIOA_PIN10) | \
- PIN_ODR_HIGH(GPIOA_USB_DM) | \
- PIN_ODR_HIGH(GPIOA_USB_DP) | \
- PIN_ODR_HIGH(GPIOA_SWDIO) | \
- PIN_ODR_HIGH(GPIOA_SWCLK) | \
- PIN_ODR_HIGH(GPIOA_PIN15))
-#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_BUTTON, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN7, 0U))
-#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOA_USB_DM, 0U) | \
- PIN_AFIO_AF(GPIOA_USB_DP, 0U) | \
- PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \
- PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN15, 0U))
-
-/*
- * GPIOB setup:
- *
- * PB0 - PIN0 (input pullup).
- * PB1 - PIN1 (input pullup).
- * PB2 - PIN2 (input pullup).
- * PB3 - PIN3 (input pullup).
- * PB4 - PIN4 (input pullup).
- * PB5 - PIN5 (input pullup).
- * PB6 - PIN6 (input pullup).
- * PB7 - PIN7 (input pullup).
- * PB8 - PIN8 (input pullup).
- * PB9 - PIN9 (input pullup).
- * PB10 - PIN10 (input pullup).
- * PB11 - PIN11 (input pullup).
- * PB12 - PIN12 (input pullup).
- * PB13 - SPI2_SCK (alternate 0).
- * PB14 - SPI2_MISO (alternate 0).
- * PB15 - SPI2_MOSI (alternate 0).
- */
-#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \
- PIN_MODE_INPUT(GPIOB_PIN1) | \
- PIN_MODE_INPUT(GPIOB_PIN2) | \
- PIN_MODE_INPUT(GPIOB_PIN3) | \
- PIN_MODE_INPUT(GPIOB_PIN4) | \
- PIN_MODE_INPUT(GPIOB_PIN5) | \
- PIN_MODE_INPUT(GPIOB_PIN6) | \
- PIN_MODE_INPUT(GPIOB_PIN7) | \
- PIN_MODE_INPUT(GPIOB_PIN8) | \
- PIN_MODE_INPUT(GPIOB_PIN9) | \
- PIN_MODE_INPUT(GPIOB_PIN10) | \
- PIN_MODE_INPUT(GPIOB_PIN11) | \
- PIN_MODE_INPUT(GPIOB_PIN12) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_SCK) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_MISO) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_SCK) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MISO) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \
- PIN_OSPEED_HIGH(GPIOB_PIN2) | \
- PIN_OSPEED_HIGH(GPIOB_PIN3) | \
- PIN_OSPEED_HIGH(GPIOB_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_SCK) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_MISO) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN12) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_SCK) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_MISO) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \
- PIN_ODR_HIGH(GPIOB_PIN1) | \
- PIN_ODR_HIGH(GPIOB_PIN2) | \
- PIN_ODR_HIGH(GPIOB_PIN3) | \
- PIN_ODR_HIGH(GPIOB_PIN4) | \
- PIN_ODR_HIGH(GPIOB_PIN5) | \
- PIN_ODR_HIGH(GPIOB_PIN6) | \
- PIN_ODR_HIGH(GPIOB_PIN7) | \
- PIN_ODR_HIGH(GPIOB_PIN8) | \
- PIN_ODR_HIGH(GPIOB_PIN9) | \
- PIN_ODR_HIGH(GPIOB_PIN10) | \
- PIN_ODR_HIGH(GPIOB_PIN11) | \
- PIN_ODR_HIGH(GPIOB_PIN12) | \
- PIN_ODR_HIGH(GPIOB_SPI2_SCK) | \
- PIN_ODR_HIGH(GPIOB_SPI2_MISO) | \
- PIN_ODR_HIGH(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN7, 0U))
-#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_SCK, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_MISO, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_MOSI, 0U))
-
-/*
- * GPIOC setup:
- *
- * PC0 - MEMS_CS (output pushpull maximum).
- * PC1 - PIN1 (input pullup).
- * PC2 - PIN2 (input pullup).
- * PC3 - PIN3 (input pullup).
- * PC4 - PIN4 (input pullup).
- * PC5 - PIN5 (input pullup).
- * PC6 - LED_RED (output pushpull maximum).
- * PC7 - LED_BLUE (output pushpull maximum).
- * PC8 - LED_ORANGE (output pushpull maximum).
- * PC9 - LED_GREEN (output pushpull maximum).
- * PC10 - PIN10 (input pullup).
- * PC11 - PIN11 (input pullup).
- * PC12 - PIN12 (input pullup).
- * PC13 - PIN13 (input pullup).
- * PC14 - OSC32_IN (input floating).
- * PC15 - OSC32_OUT (input floating).
- */
-#define VAL_GPIOC_MODER (PIN_MODE_OUTPUT(GPIOC_MEMS_CS) | \
- PIN_MODE_INPUT(GPIOC_PIN1) | \
- PIN_MODE_INPUT(GPIOC_PIN2) | \
- PIN_MODE_INPUT(GPIOC_PIN3) | \
- PIN_MODE_INPUT(GPIOC_PIN4) | \
- PIN_MODE_INPUT(GPIOC_PIN5) | \
- PIN_MODE_OUTPUT(GPIOC_LED_RED) | \
- PIN_MODE_OUTPUT(GPIOC_LED_BLUE) | \
- PIN_MODE_OUTPUT(GPIOC_LED_ORANGE) | \
- PIN_MODE_OUTPUT(GPIOC_LED_GREEN) | \
- PIN_MODE_INPUT(GPIOC_PIN10) | \
- PIN_MODE_INPUT(GPIOC_PIN11) | \
- PIN_MODE_INPUT(GPIOC_PIN12) | \
- PIN_MODE_INPUT(GPIOC_PIN13) | \
- PIN_MODE_INPUT(GPIOC_OSC32_IN) | \
- PIN_MODE_INPUT(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_MEMS_CS) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_RED) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_BLUE) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_ORANGE) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_GREEN) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \
- PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_MEMS_CS) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \
- PIN_OSPEED_HIGH(GPIOC_LED_RED) | \
- PIN_OSPEED_HIGH(GPIOC_LED_BLUE) | \
- PIN_OSPEED_HIGH(GPIOC_LED_ORANGE) | \
- PIN_OSPEED_HIGH(GPIOC_LED_GREEN) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \
- PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \
- PIN_OSPEED_HIGH(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_MEMS_CS) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN5) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_RED) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_BLUE) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_ORANGE) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_GREEN) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN13) | \
- PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \
- PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_MEMS_CS) | \
- PIN_ODR_HIGH(GPIOC_PIN1) | \
- PIN_ODR_HIGH(GPIOC_PIN2) | \
- PIN_ODR_HIGH(GPIOC_PIN3) | \
- PIN_ODR_HIGH(GPIOC_PIN4) | \
- PIN_ODR_HIGH(GPIOC_PIN5) | \
- PIN_ODR_LOW(GPIOC_LED_RED) | \
- PIN_ODR_LOW(GPIOC_LED_BLUE) | \
- PIN_ODR_LOW(GPIOC_LED_ORANGE) | \
- PIN_ODR_LOW(GPIOC_LED_GREEN) | \
- PIN_ODR_HIGH(GPIOC_PIN10) | \
- PIN_ODR_HIGH(GPIOC_PIN11) | \
- PIN_ODR_HIGH(GPIOC_PIN12) | \
- PIN_ODR_HIGH(GPIOC_PIN13) | \
- PIN_ODR_HIGH(GPIOC_OSC32_IN) | \
- PIN_ODR_HIGH(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_MEMS_CS, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_RED, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_BLUE, 0U))
-#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_LED_ORANGE, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_GREEN, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \
- PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U))
-
-/*
- * GPIOD setup:
- *
- * PD0 - PIN0 (input pullup).
- * PD1 - PIN1 (input pullup).
- * PD2 - PIN2 (input pullup).
- * PD3 - PIN3 (input pullup).
- * PD4 - PIN4 (input pullup).
- * PD5 - PIN5 (input pullup).
- * PD6 - PIN6 (input pullup).
- * PD7 - PIN7 (input pullup).
- * PD8 - PIN8 (input pullup).
- * PD9 - PIN9 (input pullup).
- * PD10 - PIN10 (input pullup).
- * PD11 - PIN11 (input pullup).
- * PD12 - PIN12 (input pullup).
- * PD13 - PIN13 (input pullup).
- * PD14 - PIN14 (input pullup).
- * PD15 - PIN15 (input pullup).
- */
-#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \
- PIN_MODE_INPUT(GPIOD_PIN1) | \
- PIN_MODE_INPUT(GPIOD_PIN2) | \
- PIN_MODE_INPUT(GPIOD_PIN3) | \
- PIN_MODE_INPUT(GPIOD_PIN4) | \
- PIN_MODE_INPUT(GPIOD_PIN5) | \
- PIN_MODE_INPUT(GPIOD_PIN6) | \
- PIN_MODE_INPUT(GPIOD_PIN7) | \
- PIN_MODE_INPUT(GPIOD_PIN8) | \
- PIN_MODE_INPUT(GPIOD_PIN9) | \
- PIN_MODE_INPUT(GPIOD_PIN10) | \
- PIN_MODE_INPUT(GPIOD_PIN11) | \
- PIN_MODE_INPUT(GPIOD_PIN12) | \
- PIN_MODE_INPUT(GPIOD_PIN13) | \
- PIN_MODE_INPUT(GPIOD_PIN14) | \
- PIN_MODE_INPUT(GPIOD_PIN15))
-#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN15))
-#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN15))
-#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN15))
-#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \
- PIN_ODR_HIGH(GPIOD_PIN1) | \
- PIN_ODR_HIGH(GPIOD_PIN2) | \
- PIN_ODR_HIGH(GPIOD_PIN3) | \
- PIN_ODR_HIGH(GPIOD_PIN4) | \
- PIN_ODR_HIGH(GPIOD_PIN5) | \
- PIN_ODR_HIGH(GPIOD_PIN6) | \
- PIN_ODR_HIGH(GPIOD_PIN7) | \
- PIN_ODR_HIGH(GPIOD_PIN8) | \
- PIN_ODR_HIGH(GPIOD_PIN9) | \
- PIN_ODR_HIGH(GPIOD_PIN10) | \
- PIN_ODR_HIGH(GPIOD_PIN11) | \
- PIN_ODR_HIGH(GPIOD_PIN12) | \
- PIN_ODR_HIGH(GPIOD_PIN13) | \
- PIN_ODR_HIGH(GPIOD_PIN14) | \
- PIN_ODR_HIGH(GPIOD_PIN15))
-#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN7, 0U))
-#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN15, 0U))
-
-/*
- * GPIOE setup:
- *
- * PE0 - PIN0 (input pullup).
- * PE1 - PIN1 (input pullup).
- * PE2 - PIN2 (input pullup).
- * PE3 - PIN3 (input pullup).
- * PE4 - PIN4 (input pullup).
- * PE5 - PIN5 (input pullup).
- * PE6 - PIN6 (input pullup).
- * PE7 - PIN7 (input pullup).
- * PE8 - PIN8 (input pullup).
- * PE9 - PIN9 (input pullup).
- * PE10 - PIN10 (input pullup).
- * PE11 - PIN11 (input pullup).
- * PE12 - PIN12 (input pullup).
- * PE13 - PIN13 (input pullup).
- * PE14 - PIN14 (input pullup).
- * PE15 - PIN15 (input pullup).
- */
-#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \
- PIN_MODE_INPUT(GPIOE_PIN1) | \
- PIN_MODE_INPUT(GPIOE_PIN2) | \
- PIN_MODE_INPUT(GPIOE_PIN3) | \
- PIN_MODE_INPUT(GPIOE_PIN4) | \
- PIN_MODE_INPUT(GPIOE_PIN5) | \
- PIN_MODE_INPUT(GPIOE_PIN6) | \
- PIN_MODE_INPUT(GPIOE_PIN7) | \
- PIN_MODE_INPUT(GPIOE_PIN8) | \
- PIN_MODE_INPUT(GPIOE_PIN9) | \
- PIN_MODE_INPUT(GPIOE_PIN10) | \
- PIN_MODE_INPUT(GPIOE_PIN11) | \
- PIN_MODE_INPUT(GPIOE_PIN12) | \
- PIN_MODE_INPUT(GPIOE_PIN13) | \
- PIN_MODE_INPUT(GPIOE_PIN14) | \
- PIN_MODE_INPUT(GPIOE_PIN15))
-#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN15))
-#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN15))
-#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN15))
-#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \
- PIN_ODR_HIGH(GPIOE_PIN1) | \
- PIN_ODR_HIGH(GPIOE_PIN2) | \
- PIN_ODR_HIGH(GPIOE_PIN3) | \
- PIN_ODR_HIGH(GPIOE_PIN4) | \
- PIN_ODR_HIGH(GPIOE_PIN5) | \
- PIN_ODR_HIGH(GPIOE_PIN6) | \
- PIN_ODR_HIGH(GPIOE_PIN7) | \
- PIN_ODR_HIGH(GPIOE_PIN8) | \
- PIN_ODR_HIGH(GPIOE_PIN9) | \
- PIN_ODR_HIGH(GPIOE_PIN10) | \
- PIN_ODR_HIGH(GPIOE_PIN11) | \
- PIN_ODR_HIGH(GPIOE_PIN12) | \
- PIN_ODR_HIGH(GPIOE_PIN13) | \
- PIN_ODR_HIGH(GPIOE_PIN14) | \
- PIN_ODR_HIGH(GPIOE_PIN15))
-#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN7, 0U))
-#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN15, 0U))
-
-/*
- * GPIOF setup:
- *
- * PF0 - OSC_IN (input floating).
- * PF1 - OSC_OUT (input floating).
- * PF2 - PIN2 (input pullup).
- * PF3 - PIN3 (input pullup).
- * PF4 - PIN4 (input pullup).
- * PF5 - PIN5 (input pullup).
- * PF6 - PIN6 (input pullup).
- * PF7 - PIN7 (input pullup).
- * PF8 - PIN8 (input pullup).
- * PF9 - PIN9 (input pullup).
- * PF10 - PIN10 (input pullup).
- * PF11 - PIN11 (input pullup).
- * PF12 - PIN12 (input pullup).
- * PF13 - PIN13 (input pullup).
- * PF14 - PIN14 (input pullup).
- * PF15 - PIN15 (input pullup).
- */
-#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \
- PIN_MODE_INPUT(GPIOF_OSC_OUT) | \
- PIN_MODE_INPUT(GPIOF_PIN2) | \
- PIN_MODE_INPUT(GPIOF_PIN3) | \
- PIN_MODE_INPUT(GPIOF_PIN4) | \
- PIN_MODE_INPUT(GPIOF_PIN5) | \
- PIN_MODE_INPUT(GPIOF_PIN6) | \
- PIN_MODE_INPUT(GPIOF_PIN7) | \
- PIN_MODE_INPUT(GPIOF_PIN8) | \
- PIN_MODE_INPUT(GPIOF_PIN9) | \
- PIN_MODE_INPUT(GPIOF_PIN10) | \
- PIN_MODE_INPUT(GPIOF_PIN11) | \
- PIN_MODE_INPUT(GPIOF_PIN12) | \
- PIN_MODE_INPUT(GPIOF_PIN13) | \
- PIN_MODE_INPUT(GPIOF_PIN14) | \
- PIN_MODE_INPUT(GPIOF_PIN15))
-#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \
- PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN15))
-#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOF_OSC_IN) | \
- PIN_OSPEED_VERYLOW(GPIOF_OSC_OUT) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN15))
-#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \
- PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN15))
-#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \
- PIN_ODR_HIGH(GPIOF_OSC_OUT) | \
- PIN_ODR_HIGH(GPIOF_PIN2) | \
- PIN_ODR_HIGH(GPIOF_PIN3) | \
- PIN_ODR_HIGH(GPIOF_PIN4) | \
- PIN_ODR_HIGH(GPIOF_PIN5) | \
- PIN_ODR_HIGH(GPIOF_PIN6) | \
- PIN_ODR_HIGH(GPIOF_PIN7) | \
- PIN_ODR_HIGH(GPIOF_PIN8) | \
- PIN_ODR_HIGH(GPIOF_PIN9) | \
- PIN_ODR_HIGH(GPIOF_PIN10) | \
- PIN_ODR_HIGH(GPIOF_PIN11) | \
- PIN_ODR_HIGH(GPIOF_PIN12) | \
- PIN_ODR_HIGH(GPIOF_PIN13) | \
- PIN_ODR_HIGH(GPIOF_PIN14) | \
- PIN_ODR_HIGH(GPIOF_PIN15))
-#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \
- PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN7, 0U))
-#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN15, 0U))
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#if !defined(_FROM_ASM_)
-#ifdef __cplusplus
-extern "C" {
-#endif
- void boardInit(void);
-#ifdef __cplusplus
-}
-#endif
-#endif /* _FROM_ASM_ */
-
-#endif /* BOARD_H */
diff --git a/keyboards/cannonkeys/tmov2/boards/ST_STM32F072B_DISCOVERY/board.mk b/keyboards/cannonkeys/tmov2/boards/ST_STM32F072B_DISCOVERY/board.mk
deleted file mode 100644
index b98dcdd26c6..00000000000
--- a/keyboards/cannonkeys/tmov2/boards/ST_STM32F072B_DISCOVERY/board.mk
+++ /dev/null
@@ -1,5 +0,0 @@
-# List of all the board related files.
-BOARDSRC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY/board.c
-
-# Required include directories
-BOARDINC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY
diff --git a/keyboards/cannonkeys/tmov2/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg b/keyboards/cannonkeys/tmov2/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg
deleted file mode 100644
index 9c7cf4fd76a..00000000000
--- a/keyboards/cannonkeys/tmov2/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg
+++ /dev/null
@@ -1,703 +0,0 @@
-
-
-
-
- resources/gencfg/processors/boards/stm32f0xx/templates
- ..
- 3.0.x
-
- ST STM32F072B-Discovery
- ST_STM32F072B_DISCOVERY
-
- STM32F072xB
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/keyboards/cannonkeys/tmov2/chconf.h b/keyboards/cannonkeys/tmov2/chconf.h
index 4640ff5332b..03f63da36a8 100644
--- a/keyboards/cannonkeys/tmov2/chconf.h
+++ b/keyboards/cannonkeys/tmov2/chconf.h
@@ -331,7 +331,7 @@
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE FALSE
+#define CH_CFG_USE_MEMCORE TRUE
#endif
/**
diff --git a/keyboards/cannonkeys/tmov2/config.h b/keyboards/cannonkeys/tmov2/config.h
index d8d95ae5524..c3c07bea1ad 100644
--- a/keyboards/cannonkeys/tmov2/config.h
+++ b/keyboards/cannonkeys/tmov2/config.h
@@ -33,6 +33,10 @@ along with this program. If not, see .
#define MATRIX_ROW_PINS { A10, A9, A8, B12 }
#define DIODE_DIRECTION COL2ROW
+#define BACKLIGHT_PIN A6
+#define BACKLIGHT_PWM_DRIVER PWMD3
+#define BACKLIGHT_PWM_CHANNEL 1
+#define BACKLIGHT_PAL_MODE 1
#define BACKLIGHT_LEVELS 6
#define BACKLIGHT_BREATHING
#define BREATHING_PERIOD 6
@@ -49,22 +53,10 @@ along with this program. If not, see .
#define LOCKING_RESYNC_ENABLE
#define RGBLIGHT_ANIMATIONS
-
-#define WS2812_LED_N 22
-#define RGBLED_NUM WS2812_LED_N
-#define PORT_WS2812 GPIOB
-#define PIN_WS2812 15
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 22
#define WS2812_SPI SPID2
-
-// Backlight config starts after VIA's EEPROM usage,
-// dynamic keymaps start after this.
-#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
-
-// VIA lighting is handled by the keyboard-level code
-#define VIA_CUSTOM_LIGHTING_ENABLE
-
-// Let VIA handle the QMK RGBLIGHT
-#define VIA_QMK_RGBLIGHT_ENABLE
+#define WS2812_SPI_MOSI_PAL_MODE 0
/*
* Feature disable options
diff --git a/keyboards/cannonkeys/tmov2/rules.mk b/keyboards/cannonkeys/tmov2/rules.mk
index 7d29079c37c..dc7f59ae4ae 100644
--- a/keyboards/cannonkeys/tmov2/rules.mk
+++ b/keyboards/cannonkeys/tmov2/rules.mk
@@ -1,15 +1,10 @@
# MCU name
MCU = STM32F072
-BOARD = ST_STM32F072B_DISCOVERY
# Build Options
# comment out to disable the options.
#
-# project specific files
-VPATH += keyboards/cannonkeys/stm32f072
-SRC = keyboard.c \
- led.c
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
@@ -19,9 +14,9 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
NKRO_ENABLE = yes # USB Nkey Rollover
CUSTOM_MATRIX = no # Custom matrix file
-# BACKLIGHT_ENABLE = yes # This is broken on 072 right now
+BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
-
+WS2812_DRIVER = spi
# Enter lower-power sleep mode when on the ChibiOS idle thread
OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
diff --git a/keyboards/centromere/keymaps/mini/keymap.c b/keyboards/centromere/keymaps/mini/keymap.c
new file mode 100644
index 00000000000..3d6de56f221
--- /dev/null
+++ b/keyboards/centromere/keymaps/mini/keymap.c
@@ -0,0 +1,118 @@
+#include QMK_KEYBOARD_H
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum centromere_layers
+{
+ _QWERTY,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+// Defines for layer movement
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+// Defines for task manager
+#define CALTDEL LCTL(LALT(KC_DEL))
+#define TSKMGR LCTL(LSFT(KC_ESC))
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ *
+ * ,----------------------------------. ,----------------------------------.
+ * | Q | W | E | R | T | | Y | U | I | O | P |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | A | S | D | F | G | | H | J | K | L | ; |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | Z | X | C | V | B | | N | M | , | . | / |
+ * `----------------------------------' `----------------------------------'
+ * ,--------------------. ,------,-------------.
+ * | Ctrl | LOWER| | | | RAISE| Shift|
+ * `-------------| Space| |BckSpc|------+------.
+ * | | | |
+ * `------' `------'
+ */
+[_QWERTY] = LAYOUT(
+ KC_NO, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_NO,
+ KC_NO, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_NO,
+ KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO,
+ KC_LCTL, LOWER, KC_SPC, KC_BSPC, RAISE, OSM(MOD_LSFT)
+),
+
+/* Raise
+ *
+ * ,----------------------------------. ,----------------------------------.
+ * | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | Tab | Left | Down | Up | Right| | | - | = | [ | ] |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | Ctrl| ` | GUI | Alt | | | | | | \ | ' |
+ * `----------------------------------' `----------------------------------'
+ * ,--------------------. ,------,-------------.
+ * | | LOWER| | | | RAISE| |
+ * `-------------| | | |------+------.
+ * | | | |
+ * `------' `------'
+ */
+[_RAISE] = LAYOUT(
+ KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NO,
+ KC_NO, KC_TAB, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_NO,
+ KC_NO, KC_LCTL, KC_GRV, KC_LGUI, KC_LALT, _______, _______, _______, _______, KC_BSLS, KC_QUOT, KC_NO,
+ _______, _______, _______, _______, _______, _______
+),
+
+/* Lower
+ *
+ * ,----------------------------------. ,----------------------------------.
+ * | ! | @ | # | $ | % | | ^ | & | * | ( | ) |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | Esc | | | | | | | _ | + | { | } |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | Caps| ~ | | | | | | | | | | " |
+ * `----------------------------------' `----------------------------------'
+ * ,--------------------. ,------,-------------.
+ * | | LOWER| | | | RAISE| Del |
+ * `-------------| | | Enter|------+------.
+ * | | | |
+ * `------' `------'
+ */
+[_LOWER] = LAYOUT(
+ KC_NO, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_NO,
+ KC_NO, KC_ESC, _______, _______, _______, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_NO,
+ KC_NO, KC_CAPS, KC_TILD, _______, _______, _______, _______, _______, _______, KC_PIPE, KC_DQT, KC_NO,
+ _______, _______, _______, KC_ENT, _______, KC_DEL
+),
+
+/* Adjust (Lower + Raise)
+ *
+ * ,----------------------------------. ,----------------------------------.
+ * | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | F11 | F12 | | | | | | | |Taskmg|caltde|
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | Reset| | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,--------------------. ,------,-------------.
+ * | | LOWER| | | | RAISE| |
+ * `-------------| | | |------+------.
+ * | | | |
+ * `------' `------'
+ */
+[_ADJUST] = LAYOUT(
+ KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_NO,
+ KC_NO, KC_F11, KC_F12, _______, _______, _______, _______, _______, _______, TSKMGR, CALTDEL, KC_NO,
+ KC_NO, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_NO,
+ _______, _______, _______, _______, _______, _______
+)
+};
+
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+}
diff --git a/keyboards/cheshire/curiosity/chconf.h b/keyboards/cheshire/curiosity/chconf.h
index 8d66b51d235..85c1c9b3b9e 100644
--- a/keyboards/cheshire/curiosity/chconf.h
+++ b/keyboards/cheshire/curiosity/chconf.h
@@ -331,7 +331,7 @@
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE FALSE
+#define CH_CFG_USE_MEMCORE TRUE
#endif
/**
diff --git a/keyboards/chidori/keymaps/oled_sample/keymap.c b/keyboards/chidori/keymaps/oled_sample/keymap.c
new file mode 100644
index 00000000000..6c9b7869ba2
--- /dev/null
+++ b/keyboards/chidori/keymaps/oled_sample/keymap.c
@@ -0,0 +1,217 @@
+/* Copyright 2019 ENDO Katsuhiro
+ * Copyright 2020 Masaya Uno
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+#include "board.h"
+
+enum layer_number {
+ _QWERTY,
+ _COLEMAK,
+ _DVORAK,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+// Defines the keycodes used by our macros in process_record_user
+enum custom_keycodes {
+ QWERTY = SAFE_RANGE,
+ COLEMAK,
+ DVORAK,
+};
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+#define ADJUST MO(_ADJUST)
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Qwerty
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * |ADJUST| Esc | Alt | GUI |LOWER |Space | | Space| RAISE| Left | Down | Up | Right|
+ * `-----------------------------------------' `-----------------------------------------'
+ */
+ [_QWERTY] = LAYOUT(
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ ADJUST, KC_ESC, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+ /* Colemak
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * |ADJUST| Esc | Alt | GUI |LOWER |Space | | Space| RAISE| Left | Down | Up | Right|
+ * `-----------------------------------------' `-----------------------------------------'
+ */
+ [_COLEMAK] = LAYOUT(
+ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
+ KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ ADJUST, KC_ESC, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+
+ /* Dvorak
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | Tab | ' | , | . | P | Y | | F | G | C | R | L | Bksp |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Ctrl | A | O | E | U | I | | D | H | T | N | S | / |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * |ADJUST| Esc | Alt | GUI |LOWER |Space | | Space| RAISE| Left | Down | Up | Right|
+ * `-----------------------------------------' `-----------------------------------------'
+ */
+ [_DVORAK] = LAYOUT(
+ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC,
+ KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH,
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT,
+ ADJUST, KC_ESC, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+
+ /* Lower
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | | | | | - | _ | + | { | } | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | | | | | | | | Home | End | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------' `-----------------------------------------'
+ */
+ [_LOWER] = LAYOUT(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______,
+ _______, _______, _______, _______, _______, _______, KC_MINS, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_END, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+
+ /* Raise
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | | F12 | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------' `-----------------------------------------'
+ */
+ [_RAISE] = LAYOUT(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL,
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+
+ /* Adjust (Lower + Raise)
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | | Reset| | | | | | |Qwerty|Colemk|Dvorak| | Ins |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Caps | | | | | Mac | | Win | - | = |Print |ScLock|Pause |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | | | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | | | | | KANA | | Home |PageDn|PageUp| End |
+ * `-----------------------------------------' `-----------------------------------------'
+ */
+ [_ADJUST] = LAYOUT(
+ _______, RESET, _______, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, KC_INS,
+ KC_CAPS, _______, _______, _______, _______, AG_NORM, AG_SWAP, KC_MINS, KC_EQL, KC_PSCR, KC_SLCK, KC_PAUS,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
+ )
+};
+// clang-format on
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case QWERTY:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_QWERTY);
+ }
+ return false;
+ case COLEMAK:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_COLEMAK);
+ }
+ return false;
+ case DVORAK:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_DVORAK);
+ }
+ return false;
+ }
+ return true;
+}
+
+bool led_update_user(led_t led_state) {
+ board_set_led_by_index(0, LED_YELLOW, led_state.caps_lock);
+ board_set_led_by_index(1, LED_YELLOW, led_state.scroll_lock);
+
+ return false;
+}
+
+#ifdef OLED_DRIVER_ENABLE
+
+void oled_write_layer_state(void) {
+ oled_write_P(PSTR("Layer: "), false);
+ switch (get_highest_layer(layer_state | default_layer_state)) {
+ case _QWERTY:
+ oled_write_ln_P(PSTR("Qwerty"), false);
+ break;
+ case _COLEMAK:
+ oled_write_ln_P(PSTR("Colemak"), false);
+ break;
+ case _DVORAK:
+ oled_write_ln_P(PSTR("Dvorak"), false);
+ break;
+ case _LOWER:
+ oled_write_ln_P(PSTR("Lower"), false);
+ break;
+ case _RAISE:
+ oled_write_ln_P(PSTR("Raise"), false);
+ break;
+ case _ADJUST:
+ oled_write_ln_P(PSTR("Adjust"), false);
+ break;
+ default:
+ oled_write_ln_P(PSTR("Undef"), false);
+ break;
+ }
+}
+
+void oled_task_user(void) {
+ // If you want to change the display of OLED, you need to change here
+ oled_write_layer_state();
+}
+#endif
diff --git a/keyboards/chidori/keymaps/oled_sample/readme.md b/keyboards/chidori/keymaps/oled_sample/readme.md
new file mode 100644
index 00000000000..38f8a146a5c
--- /dev/null
+++ b/keyboards/chidori/keymaps/oled_sample/readme.md
@@ -0,0 +1 @@
+# An OLED enabled keymap based on the default keymap for chidori
diff --git a/keyboards/chidori/keymaps/oled_sample/rules.mk b/keyboards/chidori/keymaps/oled_sample/rules.mk
new file mode 100644
index 00000000000..cc60236cac9
--- /dev/null
+++ b/keyboards/chidori/keymaps/oled_sample/rules.mk
@@ -0,0 +1,2 @@
+# Enable SSD1306 OLED
+OLED_DRIVER_ENABLE = yes
diff --git a/keyboards/chidori/usbconfig.h b/keyboards/chidori/usbconfig.h
deleted file mode 100644
index 48b72de93b9..00000000000
--- a/keyboards/chidori/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 0
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'K','a','g','i','z','a','r','a','y','a'
-#define USB_CFG_VENDOR_NAME_LEN 10
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'C', 'h', 'i', 'd', 'o', 'r', 'i'
-#define USB_CFG_DEVICE_NAME_LEN 7
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-// #define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-// /* #define USB_INTR_CFG_CLR 0 */
-// /* #define USB_INTR_ENABLE EIMSK */
-// #define USB_INTR_ENABLE_BIT INT1
-// /* #define USB_INTR_PENDING EIFR */
-// #define USB_INTR_PENDING_BIT INTF1
-// #define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/choco60/keymaps/default/keymap.c b/keyboards/choco60/keymaps/default/keymap.c
index ab3f2c6a2bc..c906fef7799 100644
--- a/keyboards/choco60/keymaps/default/keymap.c
+++ b/keyboards/choco60/keymaps/default/keymap.c
@@ -25,17 +25,17 @@ enum layer_names {
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT(
- KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL, KC_BSLASH, KC_GRAVE,
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRACKET, KC_RBRACKET, KC_BSPACE,
- KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOTE, KC_ENTER,
- KC_LSHIFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSHIFT, KC_FN,
- KC_LALT, KC_LGUI, KC_SPACE, KC_SPACE, KC_SPACE, KC_RGUI, KC_RALT
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_FN,
+ KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, KC_RALT
),
[_FN] = LAYOUT(
- _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INSERT, KC_DELETE,
- _______, _______, _______, _______, _______, _______, _______, _______, KC_PSCREEN, KC_SCROLLLOCK, KC_PAUSE, KC_UP, KC_RBRACKET, KC_BSPACE,
- _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, KC_ENTER,
- RESET, _______, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDOWN, KC_DOWN, KC_RSHIFT, KC_FN,
- _______, _______, _______, _______, _______, KC_STOP, _______
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, KC_DOWN, _______, _______,
+ _______, _______, _______, _______, _______, KC_STOP, RESET
)
};
diff --git a/keyboards/ckeys/washington/config.h b/keyboards/ckeys/washington/config.h
index 419e35e3be6..9a9b69d3235 100644
--- a/keyboards/ckeys/washington/config.h
+++ b/keyboards/ckeys/washington/config.h
@@ -193,10 +193,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/claw44/rev1/info.json b/keyboards/claw44/rev1/info.json
new file mode 100644
index 00000000000..3132ca817f7
--- /dev/null
+++ b/keyboards/claw44/rev1/info.json
@@ -0,0 +1,57 @@
+{
+ "keyboard_name": "Claw44 rev1",
+ "url": "",
+ "maintainer": "yfuku",
+ "width": 17.5,
+ "height": 4.5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"L00", "x":0, "y":1.18},
+ {"label":"L01", "x":1, "y":1.03},
+ {"label":"L02", "x":2, "y":0.35},
+ {"label":"L03", "x":3, "y":0},
+ {"label":"L04", "x":4, "y":0.05},
+ {"label":"L05", "x":5, "y":0.10},
+ {"label":"R00", "x":11.5, "y":0.10},
+ {"label":"R01", "x":12.5, "y":0.05},
+ {"label":"R02", "x":13.5, "y":0},
+ {"label":"R03", "x":14.5, "y":0.35},
+ {"label":"R04", "x":15.5, "y":1.08},
+ {"label":"R05", "x":16.5, "y":1.18},
+ {"label":"L10", "x":0, "y":2.18},
+ {"label":"L11", "x":1, "y":2.03},
+ {"label":"L12", "x":2, "y":1.35},
+ {"label":"L13", "x":3, "y":1},
+ {"label":"L14", "x":4, "y":1.05},
+ {"label":"L15", "x":5, "y":1.10},
+ {"label":"R10", "x":11.5, "y":1.10},
+ {"label":"R11", "x":12.5, "y":1.05},
+ {"label":"R12", "x":13.5, "y":1},
+ {"label":"R13", "x":14.5, "y":1.35},
+ {"label":"R14", "x":15.5, "y":2.03},
+ {"label":"R15", "x":16.5, "y":2.18},
+ {"label":"L20", "x":0, "y":3.18},
+ {"label":"L21", "x":1, "y":3.03},
+ {"label":"L22", "x":2, "y":2.35},
+ {"label":"L23", "x":3, "y":2},
+ {"label":"L24", "x":4, "y":2.05},
+ {"label":"L25", "x":5, "y":2.10},
+ {"label":"R20", "x":11.5, "y":2.10},
+ {"label":"R21", "x":12.5, "y":2.05},
+ {"label":"R22", "x":13.5, "y":2},
+ {"label":"R23", "x":14.5, "y":2.35},
+ {"label":"R24", "x":15.5, "y":3.03},
+ {"label":"R25", "x":16.5, "y":3.18},
+ {"label":"L30", "x":4, "y":3.05},
+ {"label":"L31", "x":5, "y":3.10},
+ {"label":"L32", "x":6, "y":3.20, "w":1.25},
+ {"label":"L33", "x":7.25, "y":3.50},
+ {"label":"R30", "x":9.25, "y":3.50},
+ {"label":"R31", "x":10.25, "y":3.20, "w":1.25},
+ {"label":"R32", "x":11.5, "y":3.10},
+ {"label":"R33", "x":12.5, "y":3.05}
+ ]
+ }
+ }
+}
diff --git a/keyboards/claw44/ssd1306.h b/keyboards/claw44/ssd1306.h
index ea8c9232805..0ca093093a1 100644
--- a/keyboards/claw44/ssd1306.h
+++ b/keyboards/claw44/ssd1306.h
@@ -2,7 +2,6 @@
#include
#include
-#include "pincontrol.h"
#include "action.h"
enum ssd1306_cmds {
@@ -88,4 +87,4 @@ void matrix_write_ln(struct CharacterMatrix *matrix, const char *data);
void matrix_write_P(struct CharacterMatrix *matrix, const char *data);
void matrix_render(struct CharacterMatrix *matrix);
-bool process_record_gfx(uint16_t keycode, keyrecord_t *record);
\ No newline at end of file
+bool process_record_gfx(uint16_t keycode, keyrecord_t *record);
diff --git a/keyboards/clueboard/2x1800/2018/2018.c b/keyboards/clueboard/2x1800/2018/2018.c
new file mode 100644
index 00000000000..1745309ff22
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2018/2018.c
@@ -0,0 +1,57 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#include "2018.h"
+
+void matrix_init_kb(void) {
+ // Set our LED pins as output
+ DDRB |= (1<<4); // Numlock
+ DDRB |= (1<<5); // Capslock
+ DDRB |= (1<<6); // Scroll Lock
+
+ // Run the keymap level init
+ matrix_init_user();
+}
+
+void matrix_scan_kb(void) {
+ matrix_scan_user();
+}
+
+bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
+ return process_record_user(keycode, record);
+}
+
+void led_set_kb(uint8_t usb_led) {
+ // Toggle numlock as needed
+ if (usb_led & (1<
+
+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 .
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xC1ED
+#define PRODUCT_ID 0x23A0
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Clueboard
+#define PRODUCT 2x1800 2018
+#define DESCRIPTION What does it mean?
+
+/* key matrix size */
+#define MATRIX_ROWS 12
+#define MATRIX_COLS 11
+
+/*
+ * 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 { C0, C1, C2, C3, C7, F7, B1, F2, F3, F4, F5, F6 }
+#define MATRIX_COL_PINS { D2, D3, D4, D5, D7, E0, E1, B0, E6, B3, B2 }
+#define UNUSED_PINS { D0, D1, D6, C5, C6, E4, E5, E7, F0, F1, A0, A1, A2, A3, A4, A5, A6, A7 }
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION ROW2COL
+
+/* 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
+
+/* audio support */
+#define B7_AUDIO
+#define C4_AUDIO
+#define AUDIO_CLICKY
+
+/* number of backlight levels */
+// #define BACKLIGHT_PIN B7
+// #define BACKLIGHT_BREATHING
+// #define BACKLIGHT_LEVELS 3
+
+/* 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
+
+#define RGB_DI_PIN C6
+#define RGBLIGHT_ANIMATIONS
+#define RGBLED_NUM 16
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+
+/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
+ * This is userful 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
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP1 H
+//#define MAGIC_KEY_HELP2 SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0_ALT1 ESC
+//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER PAUSE
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+/*
+ * MIDI options
+ */
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+//#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 1
+
+#endif
diff --git a/keyboards/clueboard/2x1800/2018/info.json b/keyboards/clueboard/2x1800/2018/info.json
new file mode 100644
index 00000000000..0e3bb36a9d8
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2018/info.json
@@ -0,0 +1,42 @@
+{
+ "keyboard_name": "Clueboard 2x1800",
+ "url": "",
+ "maintainer": "skullydazed",
+ "width": 24,
+ "height": 6.5,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 127,
+ "layout": [
+ {"label":"Home", "x":0, "y":0}, {"label":"End", "x":1, "y":0}, {"label":"PgUp", "x":2, "y":0}, {"label":"PgDn", "x":3, "y":0}, {"label":"Esc", "x":4.75, "y":0}, {"label":"F1", "x":6.25, "y":0}, {"label":"F2", "x":7.25, "y":0}, {"label":"F3", "x":8.25, "y":0}, {"label":"F4", "x":9.25, "y":0}, {"label":"F5", "x":10.75, "y":0}, {"label":"F6", "x":11.75, "y":0}, {"label":"F7", "x":12.75, "y":0}, {"label":"F8", "x":13.75, "y":0}, {"label":"F9", "x":15.25, "y":0}, {"label":"F10", "x":16.25, "y":0}, {"label":"F11", "x":17.25, "y":0}, {"label":"F12", "x":18.25, "y":0}, {"label":"PrtSc", "x":20, "y":0}, {"label":"Scroll Lock", "x":21, "y":0}, {"label":"Pause", "x":22, "y":0}, {"label":"Insert", "x":23, "y":0},
+ {"label":"-", "x":0, "y":1.25}, {"label":"Num Lock", "x":1, "y":1.25}, {"label":"/", "x":2, "y":1.25}, {"label":"*", "x":3, "y":1.25}, {"label":"~", "x":4.5, "y":1.25}, {"label":"!", "x":5.5, "y":1.25}, {"label":"@", "x":6.5, "y":1.25}, {"label":"#", "x":7.5, "y":1.25}, {"label":"$", "x":8.5, "y":1.25}, {"label":"%", "x":9.5, "y":1.25}, {"label":"^", "x":10.5, "y":1.25}, {"label":"&", "x":11.5, "y":1.25}, {"label":"*", "x":12.5, "y":1.25}, {"label":"(", "x":13.5, "y":1.25}, {"label":")", "x":14.5, "y":1.25}, {"label":"_", "x":15.5, "y":1.25}, {"label":"+", "x":16.5, "y":1.25}, {"label":"Backspace", "x":17.5, "y":1.25, "w":2}, {"label":"Num Lock", "x":20, "y":1.25}, {"label":"/", "x":21, "y":1.25}, {"label":"*", "x":22, "y":1.25}, {"label":"-", "x":23, "y":1.25},
+ {"label":"+", "x":0, "y":2.25, "h":2}, {"label":"7", "x":1, "y":2.25}, {"label":"8", "x":2, "y":2.25}, {"label":"9", "x":3, "y":2.25}, {"label":"Tab", "x":4.5, "y":2.25, "w":1.5}, {"label":"Q", "x":6, "y":2.25}, {"label":"W", "x":7, "y":2.25}, {"label":"E", "x":8, "y":2.25}, {"label":"R", "x":9, "y":2.25}, {"label":"T", "x":10, "y":2.25}, {"label":"Y", "x":11, "y":2.25}, {"label":"U", "x":12, "y":2.25}, {"label":"I", "x":13, "y":2.25}, {"label":"O", "x":14, "y":2.25}, {"label":"P", "x":15, "y":2.25}, {"label":"{", "x":16, "y":2.25}, {"label":"}", "x":17, "y":2.25}, {"label":"|", "x":18, "y":2.25, "w":1.5}, {"label":"7", "x":20, "y":2.25}, {"label":"8", "x":21, "y":2.25}, {"label":"9", "x":22, "y":2.25}, {"label":"+", "x":23, "y":2.25, "h":2},
+ {"label":"4", "x":1, "y":3.25}, {"label":"5", "x":2, "y":3.25}, {"label":"6", "x":3, "y":3.25}, {"label":"Caps Lock", "x":4.5, "y":3.25, "w":1.75}, {"label":"A", "x":6.25, "y":3.25}, {"label":"S", "x":7.25, "y":3.25}, {"label":"D", "x":8.25, "y":3.25}, {"label":"F", "x":9.25, "y":3.25}, {"label":"G", "x":10.25, "y":3.25}, {"label":"H", "x":11.25, "y":3.25}, {"label":"J", "x":12.25, "y":3.25}, {"label":"K", "x":13.25, "y":3.25}, {"label":"L", "x":14.25, "y":3.25}, {"label":":", "x":15.25, "y":3.25}, {"label":"\"", "x":16.25, "y":3.25}, {"label":"Enter", "x":17.25, "y":3.25, "w":2.25}, {"label":"4", "x":20, "y":3.25}, {"label":"5", "x":21, "y":3.25}, {"label":"6", "x":22, "y":3.25},
+ {"label":"Enter", "x":0, "y":4.25, "h":2}, {"label":"1", "x":1, "y":4.25}, {"label":"2", "x":2, "y":4.25}, {"label":"3", "x":3, "y":4.25}, {"label":"\\u2191", "x":4.25, "y":4.5}, {"label":"Shift", "x":5.5, "y":4.25, "w":1.25}, {"label":"Z", "x":6.75, "y":4.25}, {"label":"X", "x":7.75, "y":4.25}, {"label":"C", "x":8.75, "y":4.25}, {"label":"V", "x":9.75, "y":4.25}, {"label":"B", "x":10.75, "y":4.25}, {"label":"N", "x":11.75, "y":4.25}, {"label":"M", "x":12.75, "y":4.25}, {"label":"<", "x":13.75, "y":4.25}, {"label":">", "x":14.75, "y":4.25}, {"label":"?", "x":15.75, "y":4.25}, {"label":"Shift", "x":16.75, "y":4.25, "w":1.75}, {"label":"\\u2191", "x":18.75, "y":4.5}, {"label":"1", "x":20, "y":4.25}, {"label":"2", "x":21, "y":4.25}, {"label":"3", "x":22, "y":4.25}, {"label":"Enter", "x":23, "y":4.25, "h":2},
+ {"label":"0", "x":1, "y":5.25}, {"label":".", "x":2, "y":5.25}, {"label":"\\u2190", "x":3.25, "y":5.5}, {"label":"\\u2193", "x":4.25, "y":5.5}, {"label":"\\u2192", "x":5.25, "y":5.5}, {"label":"Ctrl", "x":6.5, "y":5.25}, {"label":"Win", "x":7.5, "y":5.25}, {"label":"Alt", "x":8.5, "y":5.25}, {"label":"1u", "x":9.5, "y":5.25}, {"label":"1u", "x":10.5, "y":5.25}, {"label":"1u", "x":11.5, "y":5.25}, {"label":"1u", "x":12.5, "y":5.25}, {"label":"Alt", "x":13.5, "y":5.25}, {"label":"Win", "x":14.5, "y":5.25}, {"label":"Menu", "x":15.5, "y":5.25}, {"label":"Ctrl", "x":16.5, "y":5.25}, {"label":"\\u2190", "x":17.75, "y":5.5}, {"label":"\\u2193", "x":18.75, "y":5.5}, {"label":"\\u2192", "x":19.75, "y":5.5}, {"label":"0", "x":21, "y":5.25}, {"label":".", "x":22, "y":5.25}
+ ]
+ },
+ "LAYOUT_7u_space": {
+ "key_count": 121,
+ "layout": [
+ {"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, {"label":"k03", "x":3, "y":0}, {"label":"k04", "x":4.75, "y":0}, {"label":"k06", "x":6.25, "y":0}, {"label":"k07", "x":7.25, "y":0}, {"label":"k08", "x":8.25, "y":0}, {"label":"k09", "x":9.25, "y":0}, {"label":"k0a", "x":10.75, "y":0}, {"label":"k60", "x":11.75, "y":0}, {"label":"k61", "x":12.75, "y":0}, {"label":"k62", "x":13.75, "y":0}, {"label":"k63", "x":15.25, "y":0}, {"label":"k64", "x":16.25, "y":0}, {"label":"k65", "x":17.25, "y":0}, {"label":"k66", "x":18.25, "y":0}, {"label":"k67", "x":20, "y":0}, {"label":"k68", "x":21, "y":0}, {"label":"k69", "x":22, "y":0}, {"label":"k6a", "x":23, "y":0},
+ {"label":"k10", "x":0, "y":1.25}, {"label":"k11", "x":1, "y":1.25}, {"label":"k12", "x":2, "y":1.25}, {"label":"k13", "x":3, "y":1.25}, {"label":"k14", "x":4.5, "y":1.25}, {"label":"k15", "x":5.5, "y":1.25}, {"label":"k16", "x":6.5, "y":1.25}, {"label":"k17", "x":7.5, "y":1.25}, {"label":"k18", "x":8.5, "y":1.25}, {"label":"k19", "x":9.5, "y":1.25}, {"label":"k0a", "x":10.5, "y":1.25}, {"label":"k70", "x":11.5, "y":1.25}, {"label":"k71", "x":12.5, "y":1.25}, {"label":"k72", "x":13.5, "y":1.25}, {"label":"k73", "x":14.5, "y":1.25}, {"label":"k74", "x":15.5, "y":1.25}, {"label":"k75", "x":16.5, "y":1.25}, {"label":"k76", "x":17.5, "y":1.25, "w":2}, {"label":"k77", "x":20, "y":1.25}, {"label":"k78", "x":21, "y":1.25}, {"label":"k79", "x":22, "y":1.25}, {"label":"k7a", "x":23, "y":1.25},
+ {"label":"k20", "x":0, "y":2.25, "h":2}, {"label":"k21", "x":1, "y":2.25}, {"label":"k22", "x":2, "y":2.25}, {"label":"k23", "x":3, "y":2.25}, {"label":"k24", "x":4.5, "y":2.25, "w":1.5}, {"label":"k25", "x":6, "y":2.25}, {"label":"k26", "x":7, "y":2.25}, {"label":"k27", "x":8, "y":2.25}, {"label":"k28", "x":9, "y":2.25}, {"label":"k29", "x":10, "y":2.25}, {"label":"k2a", "x":11, "y":2.25}, {"label":"k80", "x":12, "y":2.25}, {"label":"k81", "x":13, "y":2.25}, {"label":"k82", "x":14, "y":2.25}, {"label":"k83", "x":15, "y":2.25}, {"label":"k84", "x":16, "y":2.25}, {"label":"k85", "x":17, "y":2.25}, {"label":"k86", "x":18, "y":2.25, "w":1.5}, {"label":"k87", "x":20, "y":2.25}, {"label":"k88", "x":21, "y":2.25}, {"label":"k89", "x":22, "y":2.25}, {"label":"k8a", "x":23, "y":2.25, "h":2},
+ {"label":"k31", "x":1, "y":3.25}, {"label":"k32", "x":2, "y":3.25}, {"label":"k33", "x":3, "y":3.25}, {"label":"k34", "x":4.5, "y":3.25, "w":1.75}, {"label":"k35", "x":6.25, "y":3.25}, {"label":"k36", "x":7.25, "y":3.25}, {"label":"k37", "x":8.25, "y":3.25}, {"label":"k38", "x":9.25, "y":3.25}, {"label":"k39", "x":10.25, "y":3.25}, {"label":"k3a", "x":11.25, "y":3.25}, {"label":"k90", "x":12.25, "y":3.25}, {"label":"k91", "x":13.25, "y":3.25}, {"label":"k92", "x":14.25, "y":3.25}, {"label":"k93", "x":15.25, "y":3.25}, {"label":"k94", "x":16.25, "y":3.25}, {"label":"k95", "x":17.25, "y":3.25, "w":2.25}, {"label":"k97", "x":20, "y":3.25}, {"label":"k98", "x":21, "y":3.25}, {"label":"k99", "x":22, "y":3.25},
+ {"label":"k40", "x":0, "y":4.25, "h":2}, {"label":"k41", "x":1, "y":4.25}, {"label":"k42", "x":2, "y":4.25}, {"label":"k43", "x":3, "y":4.25}, {"label":"k45", "x":5.5, "y":4.25, "w":1.25}, {"label":"k46", "x":6.75, "y":4.25}, {"label":"k47", "x":7.75, "y":4.25}, {"label":"k48", "x":8.75, "y":4.25}, {"label":"k49", "x":9.75, "y":4.25}, {"label":"k4a", "x":10.75, "y":4.25}, {"label":"ka0", "x":11.75, "y":4.25}, {"label":"ka1", "x":12.75, "y":4.25}, {"label":"ka2", "x":13.75, "y":4.25}, {"label":"ka3", "x":14.75, "y":4.25}, {"label":"ka4", "x":15.75, "y":4.25}, {"label":"ka5", "x":16.75, "y":4.25, "w":1.75}, {"label":"ka7", "x":20, "y":4.25}, {"label":"ka8", "x":21, "y":4.25}, {"label":"ka9", "x":22, "y":4.25}, {"label":"kaa", "x":23, "y":4.25, "h":2}, {"label":"k44", "x":4.25, "y":4.5}, {"label":"k96", "x":18.75, "y":4.5},
+ {"label":"k51", "x":1, "y":5.25}, {"label":"k52", "x":2, "y":5.25}, {"label":"k56", "x":6.5, "y":5.25}, {"label":"k57", "x":7.5, "y":5.25}, {"label":"kb0", "x":8.5, "y":5.25, "w":7}, {"label":"kb4", "x":15.5, "y":5.25}, {"label":"kb5", "x":16.5, "y":5.25}, {"label":"kb8", "x":21, "y":5.25}, {"label":"kb9", "x":22, "y":5.25}, {"label":"k53", "x":3.25, "y":5.5}, {"label":"k54", "x":4.25, "y":5.5}, {"label":"k55", "x":5.25, "y":5.5}, {"label":"ka6", "x":17.75, "y":5.5}, {"label":"kb6", "x":18.75, "y":5.5}, {"label":"kb7", "x":19.75, "y":5.5}
+ ]
+ },
+ "LAYOUT_4u_space": {
+ "key_count": 124,
+ "layout": [
+ {"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, {"label":"k03", "x":3, "y":0}, {"label":"k04", "x":4.75, "y":0}, {"label":"k06", "x":6.25, "y":0}, {"label":"k07", "x":7.25, "y":0}, {"label":"k08", "x":8.25, "y":0}, {"label":"k09", "x":9.25, "y":0}, {"label":"k0a", "x":10.75, "y":0}, {"label":"k60", "x":11.75, "y":0}, {"label":"k61", "x":12.75, "y":0}, {"label":"k62", "x":13.75, "y":0}, {"label":"k63", "x":15.25, "y":0}, {"label":"k64", "x":16.25, "y":0}, {"label":"k65", "x":17.25, "y":0}, {"label":"k66", "x":18.25, "y":0}, {"label":"k67", "x":20, "y":0}, {"label":"k68", "x":21, "y":0}, {"label":"k69", "x":22, "y":0}, {"label":"k6a", "x":23, "y":0},
+ {"label":"k10", "x":0, "y":1.25}, {"label":"k11", "x":1, "y":1.25}, {"label":"k12", "x":2, "y":1.25}, {"label":"k13", "x":3, "y":1.25}, {"label":"k14", "x":4.5, "y":1.25}, {"label":"k15", "x":5.5, "y":1.25}, {"label":"k16", "x":6.5, "y":1.25}, {"label":"k17", "x":7.5, "y":1.25}, {"label":"k18", "x":8.5, "y":1.25}, {"label":"k19", "x":9.5, "y":1.25}, {"label":"k0a", "x":10.5, "y":1.25}, {"label":"k70", "x":11.5, "y":1.25}, {"label":"k71", "x":12.5, "y":1.25}, {"label":"k72", "x":13.5, "y":1.25}, {"label":"k73", "x":14.5, "y":1.25}, {"label":"k74", "x":15.5, "y":1.25}, {"label":"k75", "x":16.5, "y":1.25}, {"label":"k76", "x":17.5, "y":1.25, "w":2}, {"label":"k77", "x":20, "y":1.25}, {"label":"k78", "x":21, "y":1.25}, {"label":"k79", "x":22, "y":1.25}, {"label":"k7a", "x":23, "y":1.25},
+ {"label":"k20", "x":0, "y":2.25, "h":2}, {"label":"k21", "x":1, "y":2.25}, {"label":"k22", "x":2, "y":2.25}, {"label":"k23", "x":3, "y":2.25}, {"label":"k24", "x":4.5, "y":2.25, "w":1.5}, {"label":"k25", "x":6, "y":2.25}, {"label":"k26", "x":7, "y":2.25}, {"label":"k27", "x":8, "y":2.25}, {"label":"k28", "x":9, "y":2.25}, {"label":"k29", "x":10, "y":2.25}, {"label":"k2a", "x":11, "y":2.25}, {"label":"k80", "x":12, "y":2.25}, {"label":"k81", "x":13, "y":2.25}, {"label":"k82", "x":14, "y":2.25}, {"label":"k83", "x":15, "y":2.25}, {"label":"k84", "x":16, "y":2.25}, {"label":"k85", "x":17, "y":2.25}, {"label":"k86", "x":18, "y":2.25, "w":1.5}, {"label":"k87", "x":20, "y":2.25}, {"label":"k88", "x":21, "y":2.25}, {"label":"k89", "x":22, "y":2.25}, {"label":"k8a", "x":23, "y":2.25, "h":2},
+ {"label":"k31", "x":1, "y":3.25}, {"label":"k32", "x":2, "y":3.25}, {"label":"k33", "x":3, "y":3.25}, {"label":"k34", "x":4.5, "y":3.25, "w":1.75}, {"label":"k35", "x":6.25, "y":3.25}, {"label":"k36", "x":7.25, "y":3.25}, {"label":"k37", "x":8.25, "y":3.25}, {"label":"k38", "x":9.25, "y":3.25}, {"label":"k39", "x":10.25, "y":3.25}, {"label":"k3a", "x":11.25, "y":3.25}, {"label":"k90", "x":12.25, "y":3.25}, {"label":"k91", "x":13.25, "y":3.25}, {"label":"k92", "x":14.25, "y":3.25}, {"label":"k93", "x":15.25, "y":3.25}, {"label":"k94", "x":16.25, "y":3.25}, {"label":"k95", "x":17.25, "y":3.25, "w":2.25}, {"label":"k97", "x":20, "y":3.25}, {"label":"k98", "x":21, "y":3.25}, {"label":"k99", "x":22, "y":3.25},
+ {"label":"k40", "x":0, "y":4.25, "h":2}, {"label":"k41", "x":1, "y":4.25}, {"label":"k42", "x":2, "y":4.25}, {"label":"k43", "x":3, "y":4.25}, {"label":"k45", "x":5.5, "y":4.25, "w":1.25}, {"label":"k46", "x":6.75, "y":4.25}, {"label":"k47", "x":7.75, "y":4.25}, {"label":"k48", "x":8.75, "y":4.25}, {"label":"k49", "x":9.75, "y":4.25}, {"label":"k4a", "x":10.75, "y":4.25}, {"label":"ka0", "x":11.75, "y":4.25}, {"label":"ka1", "x":12.75, "y":4.25}, {"label":"ka2", "x":13.75, "y":4.25}, {"label":"ka3", "x":14.75, "y":4.25}, {"label":"ka4", "x":15.75, "y":4.25}, {"label":"ka5", "x":16.75, "y":4.25, "w":1.75}, {"label":"ka7", "x":20, "y":4.25}, {"label":"ka8", "x":21, "y":4.25}, {"label":"ka9", "x":22, "y":4.25}, {"label":"kaa", "x":23, "y":4.25, "h":2}, {"label":"k44", "x":4.25, "y":4.5}, {"label":"k96", "x":18.75, "y":4.5},
+ {"label":"k51", "x":1, "y":5.25}, {"label":"k52", "x":2, "y":5.25}, {"label":"k56", "x":6.5, "y":5.25}, {"label":"k57", "x":7.5, "y":5.25}, {"label":"k58", "x":8.5, "y":5.25}, {"label":"kb0", "x":9.5, "y":5.25, "w":4}, {"label":"kb2", "x":13.5, "y":5.25}, {"label":"kb3", "x":14.5, "y":5.25}, {"label":"kb4", "x":15.5, "y":5.25}, {"label":"kb5", "x":16.5, "y":5.25}, {"label":"kb8", "x":21, "y":5.25}, {"label":"kb9", "x":22, "y":5.25}, {"label":"k53", "x":3.25, "y":5.5}, {"label":"k54", "x":4.25, "y":5.5}, {"label":"k55", "x":5.25, "y":5.5}, {"label":"ka6", "x":17.75, "y":5.5}, {"label":"kb6", "x":18.75, "y":5.5}, {"label":"kb7", "x":19.75, "y":5.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/clueboard/2x1800/keymaps/default/config.h b/keyboards/clueboard/2x1800/2018/keymaps/default/config.h
similarity index 100%
rename from keyboards/clueboard/2x1800/keymaps/default/config.h
rename to keyboards/clueboard/2x1800/2018/keymaps/default/config.h
diff --git a/keyboards/clueboard/2x1800/2018/keymaps/default/keymap.json b/keyboards/clueboard/2x1800/2018/keymaps/default/keymap.json
new file mode 100644
index 00000000000..f7316001c36
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2018/keymaps/default/keymap.json
@@ -0,0 +1,11 @@
+{
+ "keyboard":"clueboard/2x1800/2018",
+ "keymap":"default",
+ "layout":"LAYOUT",
+ "layers":[
+ ["KC_HOME","KC_END","KC_PGUP","KC_PGDN","KC_ESC","KC_F1","KC_F2","KC_F3","KC_F4","KC_F5","KC_F6","KC_F7","KC_F8","KC_F9","KC_F10","KC_F11","KC_F12","KC_PSCR","KC_SLCK","KC_PAUS","KC_INS","KC_PMNS","KC_NLCK","KC_PSLS","KC_PAST","KC_GRV","KC_1","KC_2","KC_3","KC_4","KC_5","KC_6","KC_7","KC_8","KC_9","KC_0","KC_MINS","KC_EQL","KC_BSPC","KC_NLCK","KC_PSLS","KC_PAST","KC_PMNS","KC_PPLS","KC_P7","KC_P8","KC_P9","KC_TAB","KC_Q","KC_W","KC_E","KC_R","KC_T","KC_Y","KC_U","KC_I","KC_O","KC_P","KC_LBRC","KC_RBRC","KC_BSLS","KC_P7","KC_P8","KC_P9","KC_PSLS","KC_P4","KC_P5","KC_P6","KC_CAPS","KC_A","KC_S","KC_D","KC_F","KC_G","KC_H","KC_J","KC_K","KC_L","KC_SCLN","KC_QUOT","KC_ENT","KC_P4","KC_P5","KC_P6","KC_PENT","KC_P1","KC_P2","KC_P3","KC_UP","KC_LSFT","KC_Z","KC_X","KC_C","KC_V","KC_B","KC_N","KC_M","KC_SLSH","KC_COMM","KC_DOT","KC_RSFT","KC_UP","KC_P1","KC_P2","KC_P3","KC_PENT","KC_P0","KC_PDOT","KC_LEFT","KC_DOWN","KC_RGHT","KC_LCTL","KC_LGUI","KC_LALT","KC_SPC","KC_SPC","KC_SPC","KC_SPC","KC_RALT","KC_RGUI","KC_APP","KC_RCTL","KC_LEFT","KC_DOWN","KC_RGHT","KC_P0","KC_PDOT"]
+ ],
+ "author":"skullydazed",
+ "notes":"",
+ "version":1
+}
diff --git a/keyboards/clueboard/2x1800/keymaps/default/readme.md b/keyboards/clueboard/2x1800/2018/keymaps/default/readme.md
similarity index 100%
rename from keyboards/clueboard/2x1800/keymaps/default/readme.md
rename to keyboards/clueboard/2x1800/2018/keymaps/default/readme.md
diff --git a/keyboards/clueboard/2x1800/2018/keymaps/default_4u/keymap.c b/keyboards/clueboard/2x1800/2018/keymaps/default_4u/keymap.c
new file mode 100644
index 00000000000..04fa371b09a
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2018/keymaps/default_4u/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_4u_space(
+ KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS, \
+ \
+ KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
+ KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PSLS, \
+ KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \
+ KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \
+ KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \
+)
+};
diff --git a/keyboards/clueboard/2x1800/keymaps/default_4u/readme.md b/keyboards/clueboard/2x1800/2018/keymaps/default_4u/readme.md
similarity index 100%
rename from keyboards/clueboard/2x1800/keymaps/default_4u/readme.md
rename to keyboards/clueboard/2x1800/2018/keymaps/default_4u/readme.md
diff --git a/keyboards/clueboard/2x1800/keymaps/default_7u/keymap.c b/keyboards/clueboard/2x1800/2018/keymaps/default_7u/keymap.c
similarity index 100%
rename from keyboards/clueboard/2x1800/keymaps/default_7u/keymap.c
rename to keyboards/clueboard/2x1800/2018/keymaps/default_7u/keymap.c
diff --git a/keyboards/clueboard/2x1800/keymaps/default_7u/readme.md b/keyboards/clueboard/2x1800/2018/keymaps/default_7u/readme.md
similarity index 100%
rename from keyboards/clueboard/2x1800/keymaps/default_7u/readme.md
rename to keyboards/clueboard/2x1800/2018/keymaps/default_7u/readme.md
diff --git a/keyboards/clueboard/2x1800/2018/keymaps/macroboard/keymap.c b/keyboards/clueboard/2x1800/2018/keymaps/macroboard/keymap.c
new file mode 100644
index 00000000000..ca6be8326e8
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2018/keymaps/macroboard/keymap.c
@@ -0,0 +1,123 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+enum custom_keycodes {
+ MACRO01 = SAFE_RANGE,
+ MACRO02,
+ MACRO03,
+ MACRO04,
+ MACRO05,
+ MACRO06,
+ MACRO07,
+ MACRO08,
+ MACRO09,
+ MACRO10,
+ MACRO11,
+ MACRO12,
+ MACRO13,
+ MACRO14,
+ MACRO15,
+ MACRO16,
+ MACRO17,
+ MACRO18,
+ MACRO19,
+ MACRO20,
+ MACRO21,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT(
+ MACRO01, MACRO02, MACRO03, MACRO04, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS, \
+ \
+ MACRO05, MACRO06, MACRO07, MACRO08, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
+ MACRO09, MACRO10, MACRO11, MACRO12, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PSLS, \
+ MACRO13, MACRO14, MACRO15, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \
+ MACRO16, MACRO17, MACRO18, MACRO19, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \
+ MACRO20, MACRO21, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \
+)
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ switch(keycode) {
+ case MACRO01:
+ SEND_STRING("This is macro 01");
+ return false;
+ case MACRO02:
+ SEND_STRING("This is macro 02");
+ return false;
+ case MACRO03:
+ SEND_STRING("This is macro 03");
+ return false;
+ case MACRO04:
+ SEND_STRING("This is macro 04");
+ return false;
+ case MACRO05:
+ SEND_STRING("This is macro 05");
+ return false;
+ case MACRO06:
+ SEND_STRING("This is macro 06");
+ return false;
+ case MACRO07:
+ SEND_STRING("This is macro 07");
+ return false;
+ case MACRO08:
+ SEND_STRING("This is macro 08");
+ return false;
+ case MACRO09:
+ SEND_STRING("This is macro 09");
+ return false;
+ case MACRO10:
+ SEND_STRING("This is macro 10");
+ return false;
+ case MACRO11:
+ SEND_STRING("This is macro 11");
+ return false;
+ case MACRO12:
+ SEND_STRING("This is macro 12");
+ return false;
+ case MACRO13:
+ SEND_STRING("This is macro 13");
+ return false;
+ case MACRO14:
+ SEND_STRING("This is macro 14");
+ return false;
+ case MACRO15:
+ SEND_STRING("This is macro 15");
+ return false;
+ case MACRO16:
+ SEND_STRING("This is macro 16");
+ return false;
+ case MACRO17:
+ SEND_STRING("This is macro 17");
+ return false;
+ case MACRO18:
+ SEND_STRING("This is macro 18");
+ return false;
+ case MACRO19:
+ SEND_STRING("This is macro 19");
+ return false;
+ case MACRO20:
+ SEND_STRING("This is macro 20");
+ return false;
+ case MACRO21:
+ SEND_STRING("This is macro 21");
+ return false;
+ }
+ }
+ return true;
+};
diff --git a/keyboards/clueboard/2x1800/keymaps/macroboard/readme.md b/keyboards/clueboard/2x1800/2018/keymaps/macroboard/readme.md
similarity index 100%
rename from keyboards/clueboard/2x1800/keymaps/macroboard/readme.md
rename to keyboards/clueboard/2x1800/2018/keymaps/macroboard/readme.md
diff --git a/keyboards/clueboard/2x1800/2018/keymaps/mouseboard_left/keymap.c b/keyboards/clueboard/2x1800/2018/keymaps/mouseboard_left/keymap.c
new file mode 100644
index 00000000000..15c5f6ebb46
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2018/keymaps/mouseboard_left/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT(
+ KC_NO, KC_ACL0, KC_ACL1, KC_ACL2, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS, \
+ \
+ KC_NO, KC_NO, KC_BTN4, KC_BTN5, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
+ KC_WH_U, KC_NO, KC_MS_U, KC_NO, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PSLS, \
+ KC_MS_L, KC_BTN3, KC_MS_R, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \
+ KC_WH_D, KC_BTN1, KC_MS_D, KC_BTN2, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \
+ KC_WH_L, KC_WH_R, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \
+)
+};
diff --git a/keyboards/clueboard/2x1800/keymaps/mouseboard_left/readme.md b/keyboards/clueboard/2x1800/2018/keymaps/mouseboard_left/readme.md
similarity index 100%
rename from keyboards/clueboard/2x1800/keymaps/mouseboard_left/readme.md
rename to keyboards/clueboard/2x1800/2018/keymaps/mouseboard_left/readme.md
diff --git a/keyboards/clueboard/2x1800/2018/keymaps/mouseboard_right/keymap.c b/keyboards/clueboard/2x1800/2018/keymaps/mouseboard_right/keymap.c
new file mode 100644
index 00000000000..3e66342499d
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2018/keymaps/mouseboard_right/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT(
+ KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS, \
+ \
+ KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NO, KC_ACL0, KC_ACL1, KC_ACL2, \
+ KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_NO, KC_MS_U, KC_NO, KC_WH_U, \
+ KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_MS_L, KC_BTN3, KC_MS_R, \
+ KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_BTN1, KC_MS_D, KC_BTN2, KC_WH_D, \
+ KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_WH_L, KC_WH_R \
+)
+};
diff --git a/keyboards/clueboard/2x1800/keymaps/mouseboard_right/readme.md b/keyboards/clueboard/2x1800/2018/keymaps/mouseboard_right/readme.md
similarity index 100%
rename from keyboards/clueboard/2x1800/keymaps/mouseboard_right/readme.md
rename to keyboards/clueboard/2x1800/2018/keymaps/mouseboard_right/readme.md
diff --git a/keyboards/clueboard/2x1800/2018/readme.md b/keyboards/clueboard/2x1800/2018/readme.md
new file mode 100644
index 00000000000..df4412de4d3
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2018/readme.md
@@ -0,0 +1,13 @@
+# Clueboard 2x1800
+
+Clueboard Double 1800 All The Way
+
+* Keyboard Maintainer: [Zach White](https://github.com/skullydazed)
+* Hardware Supported: Clueboard 2x1800 PCB
+* Hardware Availability: 2018 Apr 1 Group Buy
+
+Make example for this keyboard:
+
+ make clueboard/2x1800/2018:default
+
+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).
diff --git a/keyboards/clueboard/2x1800/rules.mk b/keyboards/clueboard/2x1800/2018/rules.mk
similarity index 100%
rename from keyboards/clueboard/2x1800/rules.mk
rename to keyboards/clueboard/2x1800/2018/rules.mk
diff --git a/keyboards/clueboard/2x1800/2019/2019.c b/keyboards/clueboard/2x1800/2019/2019.c
new file mode 100644
index 00000000000..29f7a4901ce
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/2019.c
@@ -0,0 +1,182 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#include "2019.h"
+
+void matrix_init_kb(void) {
+ // Set our LED pins as output
+ setPinOutput(D6);
+ setPinOutput(B4);
+ setPinOutput(B5);
+ setPinOutput(B6);
+
+ // Set our Tilt Sensor pins as input
+ setPinInputHigh(SHAKE_PIN_A);
+ setPinInputHigh(SHAKE_PIN_B);
+
+ // Run the keymap level init
+ matrix_init_user();
+}
+
+#ifdef DRAWING_ENABLE
+bool drawing_mode = false;
+bool btn1_pressed = false;
+bool btn2_pressed = false;
+bool btn3_pressed = false;
+bool btn4_pressed = false;
+
+void check_encoder_buttons(void) {
+ if (btn1_pressed && btn2_pressed && btn3_pressed && btn4_pressed) {
+ // All 4 buttons pressed, toggle drawing mode
+ if (drawing_mode) {
+ dprintf("Turning drawing mode off.\n");
+ drawing_mode = false;
+ writePinLow(D6);
+ unregister_code(KC_BTN1);
+ } else {
+ dprintf("Turning drawing mode on.\n");
+ drawing_mode = true;
+ writePinHigh(D6);
+ register_code(KC_BTN1);
+ }
+ }
+}
+#endif
+
+#ifdef SHAKE_ENABLE
+uint8_t tilt_state = 0x11;
+uint8_t detected_shakes = 0;
+static uint16_t shake_timer;
+#endif
+
+void matrix_scan_kb(void) {
+#ifdef SHAKE_ENABLE
+ // Read the current state of the tilt sensor. It is physically
+ // impossible for both pins to register a low state at the same time.
+ uint8_t tilt_read = (readPin(SHAKE_PIN_A) << 4) | readPin(SHAKE_PIN_B);
+
+ // Check to see if the tilt sensor has changed state since our last read
+ if (tilt_state != tilt_read) {
+ shake_timer = timer_read();
+ detected_shakes++;
+ tilt_state = tilt_read;
+ }
+
+ if ((detected_shakes > 0) && (timer_elapsed(shake_timer) > SHAKE_TIMEOUT)) {
+ if (detected_shakes > SHAKE_COUNT) {
+ dprintf("Shake triggered! We detected %d shakes.\n", detected_shakes);
+ tap_code16(SHAKE_KEY);
+ } else {
+ dprintf("Shake not triggered! We detected %d shakes.\n", detected_shakes);
+ }
+ detected_shakes = 0;
+ }
+#endif
+
+ matrix_scan_user();
+}
+
+bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
+#ifdef DRAWING_ENABLE
+ if (keycode == ENC_BTN1) {
+ if (record->event.pressed) {
+ btn1_pressed = true;
+ register_code(KC_BTN1);
+ } else {
+ btn1_pressed = false;
+ unregister_code(KC_BTN1);
+ }
+ }
+ if (keycode == ENC_BTN2) {
+ if (record->event.pressed) {
+ btn2_pressed = true;
+ register_code(KC_BTN2);
+ } else {
+ btn2_pressed = false;
+ unregister_code(KC_BTN2);
+ }
+ }
+ if (keycode == ENC_BTN3) {
+ if (record->event.pressed) {
+ btn3_pressed = true;
+ register_code(KC_BTN3);
+ } else {
+ btn3_pressed = false;
+ unregister_code(KC_BTN3);
+ }
+ }
+ if (keycode == ENC_BTN4) {
+ if (record->event.pressed) {
+ btn4_pressed = true;
+ register_code(KC_BTN4);
+ } else {
+ btn4_pressed = false;
+ unregister_code(KC_BTN4);
+ }
+ }
+
+ check_encoder_buttons();
+#endif
+
+ return process_record_user(keycode, record);
+}
+
+bool led_update_kb(led_t led_state) {
+ bool res = led_update_user(led_state);
+ if(res) {
+ writePin(B4, !led_state.num_lock);
+ writePin(B5, !led_state.caps_lock);
+ writePin(B6, !led_state.scroll_lock);
+ }
+
+ return res;
+}
+
+__attribute__ ((weak))
+bool encoder_update_keymap(int8_t index, bool clockwise) {
+ return false;
+}
+
+void encoder_update_kb(int8_t index, bool clockwise) {
+ if (!encoder_update_keymap(index, clockwise)) {
+ // Encoder 1, outside left
+ if (index == 0 && clockwise) {
+ tap_code(KC_MS_U); // turned right
+ } else if (index == 0) {
+ tap_code(KC_MS_D); // turned left
+ }
+
+ // Encoder 2, inside left
+ else if (index == 1 && clockwise) {
+ tap_code(KC_WH_D); // turned right
+ } else if (index == 1) {
+ tap_code(KC_WH_U); // turned left
+ }
+
+ // Encoder 3, inside right
+ else if (index == 2 && clockwise) {
+ tap_code(KC_VOLU); // turned right
+ } else if (index == 2) {
+ tap_code(KC_VOLD); // turned left
+ }
+
+ // Encoder 4, outside right
+ else if (index == 3 && clockwise) {
+ tap_code(KC_MS_R); // turned right
+ } else if (index == 3) {
+ tap_code(KC_MS_L); // turned left
+ }
+ }
+}
diff --git a/keyboards/clueboard/2x1800/2019/2019.h b/keyboards/clueboard/2x1800/2019/2019.h
new file mode 100644
index 00000000000..b9151071fdc
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/2019.h
@@ -0,0 +1,257 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "quantum.h"
+
+enum TWOx1800_keycodes {
+ ENC_BTN1 = SAFE_RANGE,
+ ENC_BTN2,
+ ENC_BTN3,
+ ENC_BTN4,
+ NEW_SAFE_RANGE
+};
+
+#undef SAFE_RANGE
+#define SAFE_RANGE NEW_SAFE_RANGE
+
+// This a shortcut to help you visually see your layout.
+// The first section contains all of the arguments
+// The second converts the arguments into a two-dimensional array
+#define LAYOUT_all( \
+ e00, e01, e02, e03, \
+ k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
+ k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k9a, k95, k97, k98, k99, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
+ k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a, kb0, kb1, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
+) { \
+ { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
+ { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
+ { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a }, \
+ { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
+ { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
+ { k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
+ { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, k9a }, \
+ { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
+ { kb0, kb1, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
+ { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
+}
+
+#define LAYOUT_1u_ansi( \
+ e00, e01, e02, e03, \
+ k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
+ k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k95, k97, k98, k99, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
+ k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a, kb0, kb1, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
+) { \
+ { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
+ { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
+ { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a }, \
+ { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
+ { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
+ { k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
+ { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, KC_NO }, \
+ { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
+ { kb0, kb1, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
+ { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
+}
+
+#define LAYOUT_1u_iso( \
+ e00, e01, e02, e03, \
+ k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k87, k88, k89, k8a, \
+ k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k9a, k95, k97, k98, k99, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
+ k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a, kb0, kb1, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
+) { \
+ { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
+ { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
+ { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a }, \
+ { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
+ { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
+ { k80, k81, k82, k83, k84, k85, KC_NO, k87, k88, k89, k8a }, \
+ { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, k9a }, \
+ { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
+ { kb0, kb1, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
+ { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
+}
+
+#define LAYOUT_2u_ansi( \
+ e00, e01, e02, e03, \
+ k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
+ k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k95, k97, k98, k99, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
+ k51, k52, k53, k54, k55, k56, k57, k58, k59, kb0, kb1, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
+) { \
+ { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
+ { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
+ { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, k59, KC_NO }, \
+ { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
+ { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
+ { k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
+ { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, KC_NO }, \
+ { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
+ { kb0, kb1, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
+ { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
+}
+
+#define LAYOUT_2u_iso( \
+ e00, e01, e02, e03, \
+ k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k87, k88, k89, k8a, \
+ k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k9a, k95, k97, k98, k99, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
+ k51, k52, k53, k54, k55, k56, k57, k58, k59, kb0, kb1, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
+) { \
+ { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
+ { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
+ { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, k59, KC_NO }, \
+ { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
+ { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
+ { k80, k81, k82, k83, k84, k85, KC_NO, k87, k88, k89, k8a }, \
+ { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, k9a }, \
+ { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
+ { kb0, kb1, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
+ { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
+}
+
+#define LAYOUT_4u_ansi( \
+ e00, e01, e02, e03, \
+ k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
+ k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k95, k97, k98, k99, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
+ k51, k52, k53, k54, k55, k56, k57, k58, kb0, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
+) { \
+ { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
+ { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
+ { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, KC_NO, KC_NO }, \
+ { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
+ { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
+ { k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
+ { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, KC_NO }, \
+ { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
+ { kb0, KC_NO, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
+ { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
+}
+
+#define LAYOUT_4u_iso( \
+ e00, e01, e02, e03, \
+ k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k87, k88, k89, k8a, \
+ k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k9a, k95, k97, k98, k99, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
+ k51, k52, k53, k54, k55, k56, k57, k58, kb0, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
+) { \
+ { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
+ { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
+ { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, KC_NO, KC_NO }, \
+ { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
+ { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
+ { k80, k81, k82, k83, k84, k85, KC_NO, k87, k88, k89, k8a }, \
+ { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, k9a }, \
+ { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
+ { kb0, KC_NO, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
+ { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
+}
+
+#define LAYOUT_7u_ansi( \
+ e00, e01, e02, e03, \
+ k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
+ k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k95, k97, k98, k99, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
+ k51, k52, k53, k54, k55, k56, k57, kb0, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
+) { \
+ { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
+ { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
+ { KC_NO, k51, k52, k53, k54, k55, k56, k57, KC_NO, KC_NO, KC_NO }, \
+ { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
+ { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
+ { k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
+ { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, KC_NO }, \
+ { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
+ { kb0, KC_NO, KC_NO, KC_NO, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
+ { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
+}
+
+#define LAYOUT_7u_iso( \
+ e00, e01, e02, e03, \
+ k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k87, k88, k89, k8a, \
+ k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k9a, k95, k97, k98, k99, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
+ k51, k52, k53, k54, k55, k56, k57, kb0, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
+) { \
+ { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
+ { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
+ { KC_NO, k51, k52, k53, k54, k55, k56, k57, KC_NO, KC_NO, KC_NO }, \
+ { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
+ { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
+ { k80, k81, k82, k83, k84, k85, KC_NO, k87, k88, k89, k8a }, \
+ { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, k9a }, \
+ { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
+ { kb0, KC_NO, KC_NO, KC_NO, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
+ { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
+}
+
+#define LAYOUT LAYOUT_all
+
+// Encoder update function that returns true/false
+__attribute__ ((weak))
+bool encoder_update_keymap(int8_t index, bool clockwise);
+
+// Encoder button combo check
+void check_encoder_buttons(void);
diff --git a/keyboards/clueboard/2x1800/2019/config.h b/keyboards/clueboard/2x1800/2019/config.h
new file mode 100644
index 00000000000..b9e087f62ad
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/config.h
@@ -0,0 +1,214 @@
+/*
+Copyright 2017 Zach White
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xC1ED
+#define PRODUCT_ID 0x23A0
+#define DEVICE_VER 0x0002
+#define MANUFACTURER Clueboard
+#define PRODUCT 2x1800 2019
+#define DESCRIPTION Mechanical Drawing Toy Edition
+
+/* key matrix size */
+#define MATRIX_ROWS 13
+#define MATRIX_COLS 11
+
+/*
+ * 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 { C0, C1, C2, C3, C7, F7, B1, F2, F3, F4, F5, F6, C6 }
+#define MATRIX_COL_PINS { D2, D3, D4, D5, D7, E0, E1, B0, E6, B3, B2 }
+#define UNUSED_PINS { D0, D1, D6, C5, E7, F0, F1 }
+
+#define ENCODERS_PAD_A { A5, A4, A2, A1 }
+#define ENCODERS_PAD_B { A6, A7, A3, A0 }
+#define ENCODER_RESOLUTION 4
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION ROW2COL
+
+/* 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
+
+/* audio support */
+#define B7_AUDIO
+#define C4_AUDIO
+#define AUDIO_CLICKY
+
+/* number of backlight levels */
+// #define BACKLIGHT_PIN B7
+// #define BACKLIGHT_BREATHING
+// #define BACKLIGHT_LEVELS 3
+
+/* 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
+
+#define RGB_DI_PIN C5
+#define RGBLIGHT_ANIMATIONS
+#define RGBLED_NUM 16
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+
+/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
+ * This is userful 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
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP1 H
+//#define MAGIC_KEY_HELP2 SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0_ALT1 ESC
+//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER PAUSE
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+/*
+ * MIDI options
+ */
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+//#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 1
+
+/*
+ * Drawing mode
+ */
+#define DRAWING_ENABLE
+//#define UNDO_KEY LGUI(KC_Z) // What key to send for undo
+//#define UNDO_KEY LCTL(KC_Z)
+#define UNDO_KEY LGUI(KC_SLSH)
+
+/*
+ * Shake to undo configuration
+ */
+#define SHAKE_ENABLE
+#define SHAKE_PIN_A E4
+#define SHAKE_PIN_B E5
+#define SHAKE_TIMEOUT 500 // How long after shaking stops before we register it
+#define SHAKE_COUNT 8 // How many shakes it takes to activate
+#define SHAKE_KEY UNDO_KEY // What key to send after a shake
diff --git a/keyboards/clueboard/2x1800/2019/info.json b/keyboards/clueboard/2x1800/2019/info.json
new file mode 100644
index 00000000000..0e3bb36a9d8
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/info.json
@@ -0,0 +1,42 @@
+{
+ "keyboard_name": "Clueboard 2x1800",
+ "url": "",
+ "maintainer": "skullydazed",
+ "width": 24,
+ "height": 6.5,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 127,
+ "layout": [
+ {"label":"Home", "x":0, "y":0}, {"label":"End", "x":1, "y":0}, {"label":"PgUp", "x":2, "y":0}, {"label":"PgDn", "x":3, "y":0}, {"label":"Esc", "x":4.75, "y":0}, {"label":"F1", "x":6.25, "y":0}, {"label":"F2", "x":7.25, "y":0}, {"label":"F3", "x":8.25, "y":0}, {"label":"F4", "x":9.25, "y":0}, {"label":"F5", "x":10.75, "y":0}, {"label":"F6", "x":11.75, "y":0}, {"label":"F7", "x":12.75, "y":0}, {"label":"F8", "x":13.75, "y":0}, {"label":"F9", "x":15.25, "y":0}, {"label":"F10", "x":16.25, "y":0}, {"label":"F11", "x":17.25, "y":0}, {"label":"F12", "x":18.25, "y":0}, {"label":"PrtSc", "x":20, "y":0}, {"label":"Scroll Lock", "x":21, "y":0}, {"label":"Pause", "x":22, "y":0}, {"label":"Insert", "x":23, "y":0},
+ {"label":"-", "x":0, "y":1.25}, {"label":"Num Lock", "x":1, "y":1.25}, {"label":"/", "x":2, "y":1.25}, {"label":"*", "x":3, "y":1.25}, {"label":"~", "x":4.5, "y":1.25}, {"label":"!", "x":5.5, "y":1.25}, {"label":"@", "x":6.5, "y":1.25}, {"label":"#", "x":7.5, "y":1.25}, {"label":"$", "x":8.5, "y":1.25}, {"label":"%", "x":9.5, "y":1.25}, {"label":"^", "x":10.5, "y":1.25}, {"label":"&", "x":11.5, "y":1.25}, {"label":"*", "x":12.5, "y":1.25}, {"label":"(", "x":13.5, "y":1.25}, {"label":")", "x":14.5, "y":1.25}, {"label":"_", "x":15.5, "y":1.25}, {"label":"+", "x":16.5, "y":1.25}, {"label":"Backspace", "x":17.5, "y":1.25, "w":2}, {"label":"Num Lock", "x":20, "y":1.25}, {"label":"/", "x":21, "y":1.25}, {"label":"*", "x":22, "y":1.25}, {"label":"-", "x":23, "y":1.25},
+ {"label":"+", "x":0, "y":2.25, "h":2}, {"label":"7", "x":1, "y":2.25}, {"label":"8", "x":2, "y":2.25}, {"label":"9", "x":3, "y":2.25}, {"label":"Tab", "x":4.5, "y":2.25, "w":1.5}, {"label":"Q", "x":6, "y":2.25}, {"label":"W", "x":7, "y":2.25}, {"label":"E", "x":8, "y":2.25}, {"label":"R", "x":9, "y":2.25}, {"label":"T", "x":10, "y":2.25}, {"label":"Y", "x":11, "y":2.25}, {"label":"U", "x":12, "y":2.25}, {"label":"I", "x":13, "y":2.25}, {"label":"O", "x":14, "y":2.25}, {"label":"P", "x":15, "y":2.25}, {"label":"{", "x":16, "y":2.25}, {"label":"}", "x":17, "y":2.25}, {"label":"|", "x":18, "y":2.25, "w":1.5}, {"label":"7", "x":20, "y":2.25}, {"label":"8", "x":21, "y":2.25}, {"label":"9", "x":22, "y":2.25}, {"label":"+", "x":23, "y":2.25, "h":2},
+ {"label":"4", "x":1, "y":3.25}, {"label":"5", "x":2, "y":3.25}, {"label":"6", "x":3, "y":3.25}, {"label":"Caps Lock", "x":4.5, "y":3.25, "w":1.75}, {"label":"A", "x":6.25, "y":3.25}, {"label":"S", "x":7.25, "y":3.25}, {"label":"D", "x":8.25, "y":3.25}, {"label":"F", "x":9.25, "y":3.25}, {"label":"G", "x":10.25, "y":3.25}, {"label":"H", "x":11.25, "y":3.25}, {"label":"J", "x":12.25, "y":3.25}, {"label":"K", "x":13.25, "y":3.25}, {"label":"L", "x":14.25, "y":3.25}, {"label":":", "x":15.25, "y":3.25}, {"label":"\"", "x":16.25, "y":3.25}, {"label":"Enter", "x":17.25, "y":3.25, "w":2.25}, {"label":"4", "x":20, "y":3.25}, {"label":"5", "x":21, "y":3.25}, {"label":"6", "x":22, "y":3.25},
+ {"label":"Enter", "x":0, "y":4.25, "h":2}, {"label":"1", "x":1, "y":4.25}, {"label":"2", "x":2, "y":4.25}, {"label":"3", "x":3, "y":4.25}, {"label":"\\u2191", "x":4.25, "y":4.5}, {"label":"Shift", "x":5.5, "y":4.25, "w":1.25}, {"label":"Z", "x":6.75, "y":4.25}, {"label":"X", "x":7.75, "y":4.25}, {"label":"C", "x":8.75, "y":4.25}, {"label":"V", "x":9.75, "y":4.25}, {"label":"B", "x":10.75, "y":4.25}, {"label":"N", "x":11.75, "y":4.25}, {"label":"M", "x":12.75, "y":4.25}, {"label":"<", "x":13.75, "y":4.25}, {"label":">", "x":14.75, "y":4.25}, {"label":"?", "x":15.75, "y":4.25}, {"label":"Shift", "x":16.75, "y":4.25, "w":1.75}, {"label":"\\u2191", "x":18.75, "y":4.5}, {"label":"1", "x":20, "y":4.25}, {"label":"2", "x":21, "y":4.25}, {"label":"3", "x":22, "y":4.25}, {"label":"Enter", "x":23, "y":4.25, "h":2},
+ {"label":"0", "x":1, "y":5.25}, {"label":".", "x":2, "y":5.25}, {"label":"\\u2190", "x":3.25, "y":5.5}, {"label":"\\u2193", "x":4.25, "y":5.5}, {"label":"\\u2192", "x":5.25, "y":5.5}, {"label":"Ctrl", "x":6.5, "y":5.25}, {"label":"Win", "x":7.5, "y":5.25}, {"label":"Alt", "x":8.5, "y":5.25}, {"label":"1u", "x":9.5, "y":5.25}, {"label":"1u", "x":10.5, "y":5.25}, {"label":"1u", "x":11.5, "y":5.25}, {"label":"1u", "x":12.5, "y":5.25}, {"label":"Alt", "x":13.5, "y":5.25}, {"label":"Win", "x":14.5, "y":5.25}, {"label":"Menu", "x":15.5, "y":5.25}, {"label":"Ctrl", "x":16.5, "y":5.25}, {"label":"\\u2190", "x":17.75, "y":5.5}, {"label":"\\u2193", "x":18.75, "y":5.5}, {"label":"\\u2192", "x":19.75, "y":5.5}, {"label":"0", "x":21, "y":5.25}, {"label":".", "x":22, "y":5.25}
+ ]
+ },
+ "LAYOUT_7u_space": {
+ "key_count": 121,
+ "layout": [
+ {"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, {"label":"k03", "x":3, "y":0}, {"label":"k04", "x":4.75, "y":0}, {"label":"k06", "x":6.25, "y":0}, {"label":"k07", "x":7.25, "y":0}, {"label":"k08", "x":8.25, "y":0}, {"label":"k09", "x":9.25, "y":0}, {"label":"k0a", "x":10.75, "y":0}, {"label":"k60", "x":11.75, "y":0}, {"label":"k61", "x":12.75, "y":0}, {"label":"k62", "x":13.75, "y":0}, {"label":"k63", "x":15.25, "y":0}, {"label":"k64", "x":16.25, "y":0}, {"label":"k65", "x":17.25, "y":0}, {"label":"k66", "x":18.25, "y":0}, {"label":"k67", "x":20, "y":0}, {"label":"k68", "x":21, "y":0}, {"label":"k69", "x":22, "y":0}, {"label":"k6a", "x":23, "y":0},
+ {"label":"k10", "x":0, "y":1.25}, {"label":"k11", "x":1, "y":1.25}, {"label":"k12", "x":2, "y":1.25}, {"label":"k13", "x":3, "y":1.25}, {"label":"k14", "x":4.5, "y":1.25}, {"label":"k15", "x":5.5, "y":1.25}, {"label":"k16", "x":6.5, "y":1.25}, {"label":"k17", "x":7.5, "y":1.25}, {"label":"k18", "x":8.5, "y":1.25}, {"label":"k19", "x":9.5, "y":1.25}, {"label":"k0a", "x":10.5, "y":1.25}, {"label":"k70", "x":11.5, "y":1.25}, {"label":"k71", "x":12.5, "y":1.25}, {"label":"k72", "x":13.5, "y":1.25}, {"label":"k73", "x":14.5, "y":1.25}, {"label":"k74", "x":15.5, "y":1.25}, {"label":"k75", "x":16.5, "y":1.25}, {"label":"k76", "x":17.5, "y":1.25, "w":2}, {"label":"k77", "x":20, "y":1.25}, {"label":"k78", "x":21, "y":1.25}, {"label":"k79", "x":22, "y":1.25}, {"label":"k7a", "x":23, "y":1.25},
+ {"label":"k20", "x":0, "y":2.25, "h":2}, {"label":"k21", "x":1, "y":2.25}, {"label":"k22", "x":2, "y":2.25}, {"label":"k23", "x":3, "y":2.25}, {"label":"k24", "x":4.5, "y":2.25, "w":1.5}, {"label":"k25", "x":6, "y":2.25}, {"label":"k26", "x":7, "y":2.25}, {"label":"k27", "x":8, "y":2.25}, {"label":"k28", "x":9, "y":2.25}, {"label":"k29", "x":10, "y":2.25}, {"label":"k2a", "x":11, "y":2.25}, {"label":"k80", "x":12, "y":2.25}, {"label":"k81", "x":13, "y":2.25}, {"label":"k82", "x":14, "y":2.25}, {"label":"k83", "x":15, "y":2.25}, {"label":"k84", "x":16, "y":2.25}, {"label":"k85", "x":17, "y":2.25}, {"label":"k86", "x":18, "y":2.25, "w":1.5}, {"label":"k87", "x":20, "y":2.25}, {"label":"k88", "x":21, "y":2.25}, {"label":"k89", "x":22, "y":2.25}, {"label":"k8a", "x":23, "y":2.25, "h":2},
+ {"label":"k31", "x":1, "y":3.25}, {"label":"k32", "x":2, "y":3.25}, {"label":"k33", "x":3, "y":3.25}, {"label":"k34", "x":4.5, "y":3.25, "w":1.75}, {"label":"k35", "x":6.25, "y":3.25}, {"label":"k36", "x":7.25, "y":3.25}, {"label":"k37", "x":8.25, "y":3.25}, {"label":"k38", "x":9.25, "y":3.25}, {"label":"k39", "x":10.25, "y":3.25}, {"label":"k3a", "x":11.25, "y":3.25}, {"label":"k90", "x":12.25, "y":3.25}, {"label":"k91", "x":13.25, "y":3.25}, {"label":"k92", "x":14.25, "y":3.25}, {"label":"k93", "x":15.25, "y":3.25}, {"label":"k94", "x":16.25, "y":3.25}, {"label":"k95", "x":17.25, "y":3.25, "w":2.25}, {"label":"k97", "x":20, "y":3.25}, {"label":"k98", "x":21, "y":3.25}, {"label":"k99", "x":22, "y":3.25},
+ {"label":"k40", "x":0, "y":4.25, "h":2}, {"label":"k41", "x":1, "y":4.25}, {"label":"k42", "x":2, "y":4.25}, {"label":"k43", "x":3, "y":4.25}, {"label":"k45", "x":5.5, "y":4.25, "w":1.25}, {"label":"k46", "x":6.75, "y":4.25}, {"label":"k47", "x":7.75, "y":4.25}, {"label":"k48", "x":8.75, "y":4.25}, {"label":"k49", "x":9.75, "y":4.25}, {"label":"k4a", "x":10.75, "y":4.25}, {"label":"ka0", "x":11.75, "y":4.25}, {"label":"ka1", "x":12.75, "y":4.25}, {"label":"ka2", "x":13.75, "y":4.25}, {"label":"ka3", "x":14.75, "y":4.25}, {"label":"ka4", "x":15.75, "y":4.25}, {"label":"ka5", "x":16.75, "y":4.25, "w":1.75}, {"label":"ka7", "x":20, "y":4.25}, {"label":"ka8", "x":21, "y":4.25}, {"label":"ka9", "x":22, "y":4.25}, {"label":"kaa", "x":23, "y":4.25, "h":2}, {"label":"k44", "x":4.25, "y":4.5}, {"label":"k96", "x":18.75, "y":4.5},
+ {"label":"k51", "x":1, "y":5.25}, {"label":"k52", "x":2, "y":5.25}, {"label":"k56", "x":6.5, "y":5.25}, {"label":"k57", "x":7.5, "y":5.25}, {"label":"kb0", "x":8.5, "y":5.25, "w":7}, {"label":"kb4", "x":15.5, "y":5.25}, {"label":"kb5", "x":16.5, "y":5.25}, {"label":"kb8", "x":21, "y":5.25}, {"label":"kb9", "x":22, "y":5.25}, {"label":"k53", "x":3.25, "y":5.5}, {"label":"k54", "x":4.25, "y":5.5}, {"label":"k55", "x":5.25, "y":5.5}, {"label":"ka6", "x":17.75, "y":5.5}, {"label":"kb6", "x":18.75, "y":5.5}, {"label":"kb7", "x":19.75, "y":5.5}
+ ]
+ },
+ "LAYOUT_4u_space": {
+ "key_count": 124,
+ "layout": [
+ {"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, {"label":"k03", "x":3, "y":0}, {"label":"k04", "x":4.75, "y":0}, {"label":"k06", "x":6.25, "y":0}, {"label":"k07", "x":7.25, "y":0}, {"label":"k08", "x":8.25, "y":0}, {"label":"k09", "x":9.25, "y":0}, {"label":"k0a", "x":10.75, "y":0}, {"label":"k60", "x":11.75, "y":0}, {"label":"k61", "x":12.75, "y":0}, {"label":"k62", "x":13.75, "y":0}, {"label":"k63", "x":15.25, "y":0}, {"label":"k64", "x":16.25, "y":0}, {"label":"k65", "x":17.25, "y":0}, {"label":"k66", "x":18.25, "y":0}, {"label":"k67", "x":20, "y":0}, {"label":"k68", "x":21, "y":0}, {"label":"k69", "x":22, "y":0}, {"label":"k6a", "x":23, "y":0},
+ {"label":"k10", "x":0, "y":1.25}, {"label":"k11", "x":1, "y":1.25}, {"label":"k12", "x":2, "y":1.25}, {"label":"k13", "x":3, "y":1.25}, {"label":"k14", "x":4.5, "y":1.25}, {"label":"k15", "x":5.5, "y":1.25}, {"label":"k16", "x":6.5, "y":1.25}, {"label":"k17", "x":7.5, "y":1.25}, {"label":"k18", "x":8.5, "y":1.25}, {"label":"k19", "x":9.5, "y":1.25}, {"label":"k0a", "x":10.5, "y":1.25}, {"label":"k70", "x":11.5, "y":1.25}, {"label":"k71", "x":12.5, "y":1.25}, {"label":"k72", "x":13.5, "y":1.25}, {"label":"k73", "x":14.5, "y":1.25}, {"label":"k74", "x":15.5, "y":1.25}, {"label":"k75", "x":16.5, "y":1.25}, {"label":"k76", "x":17.5, "y":1.25, "w":2}, {"label":"k77", "x":20, "y":1.25}, {"label":"k78", "x":21, "y":1.25}, {"label":"k79", "x":22, "y":1.25}, {"label":"k7a", "x":23, "y":1.25},
+ {"label":"k20", "x":0, "y":2.25, "h":2}, {"label":"k21", "x":1, "y":2.25}, {"label":"k22", "x":2, "y":2.25}, {"label":"k23", "x":3, "y":2.25}, {"label":"k24", "x":4.5, "y":2.25, "w":1.5}, {"label":"k25", "x":6, "y":2.25}, {"label":"k26", "x":7, "y":2.25}, {"label":"k27", "x":8, "y":2.25}, {"label":"k28", "x":9, "y":2.25}, {"label":"k29", "x":10, "y":2.25}, {"label":"k2a", "x":11, "y":2.25}, {"label":"k80", "x":12, "y":2.25}, {"label":"k81", "x":13, "y":2.25}, {"label":"k82", "x":14, "y":2.25}, {"label":"k83", "x":15, "y":2.25}, {"label":"k84", "x":16, "y":2.25}, {"label":"k85", "x":17, "y":2.25}, {"label":"k86", "x":18, "y":2.25, "w":1.5}, {"label":"k87", "x":20, "y":2.25}, {"label":"k88", "x":21, "y":2.25}, {"label":"k89", "x":22, "y":2.25}, {"label":"k8a", "x":23, "y":2.25, "h":2},
+ {"label":"k31", "x":1, "y":3.25}, {"label":"k32", "x":2, "y":3.25}, {"label":"k33", "x":3, "y":3.25}, {"label":"k34", "x":4.5, "y":3.25, "w":1.75}, {"label":"k35", "x":6.25, "y":3.25}, {"label":"k36", "x":7.25, "y":3.25}, {"label":"k37", "x":8.25, "y":3.25}, {"label":"k38", "x":9.25, "y":3.25}, {"label":"k39", "x":10.25, "y":3.25}, {"label":"k3a", "x":11.25, "y":3.25}, {"label":"k90", "x":12.25, "y":3.25}, {"label":"k91", "x":13.25, "y":3.25}, {"label":"k92", "x":14.25, "y":3.25}, {"label":"k93", "x":15.25, "y":3.25}, {"label":"k94", "x":16.25, "y":3.25}, {"label":"k95", "x":17.25, "y":3.25, "w":2.25}, {"label":"k97", "x":20, "y":3.25}, {"label":"k98", "x":21, "y":3.25}, {"label":"k99", "x":22, "y":3.25},
+ {"label":"k40", "x":0, "y":4.25, "h":2}, {"label":"k41", "x":1, "y":4.25}, {"label":"k42", "x":2, "y":4.25}, {"label":"k43", "x":3, "y":4.25}, {"label":"k45", "x":5.5, "y":4.25, "w":1.25}, {"label":"k46", "x":6.75, "y":4.25}, {"label":"k47", "x":7.75, "y":4.25}, {"label":"k48", "x":8.75, "y":4.25}, {"label":"k49", "x":9.75, "y":4.25}, {"label":"k4a", "x":10.75, "y":4.25}, {"label":"ka0", "x":11.75, "y":4.25}, {"label":"ka1", "x":12.75, "y":4.25}, {"label":"ka2", "x":13.75, "y":4.25}, {"label":"ka3", "x":14.75, "y":4.25}, {"label":"ka4", "x":15.75, "y":4.25}, {"label":"ka5", "x":16.75, "y":4.25, "w":1.75}, {"label":"ka7", "x":20, "y":4.25}, {"label":"ka8", "x":21, "y":4.25}, {"label":"ka9", "x":22, "y":4.25}, {"label":"kaa", "x":23, "y":4.25, "h":2}, {"label":"k44", "x":4.25, "y":4.5}, {"label":"k96", "x":18.75, "y":4.5},
+ {"label":"k51", "x":1, "y":5.25}, {"label":"k52", "x":2, "y":5.25}, {"label":"k56", "x":6.5, "y":5.25}, {"label":"k57", "x":7.5, "y":5.25}, {"label":"k58", "x":8.5, "y":5.25}, {"label":"kb0", "x":9.5, "y":5.25, "w":4}, {"label":"kb2", "x":13.5, "y":5.25}, {"label":"kb3", "x":14.5, "y":5.25}, {"label":"kb4", "x":15.5, "y":5.25}, {"label":"kb5", "x":16.5, "y":5.25}, {"label":"kb8", "x":21, "y":5.25}, {"label":"kb9", "x":22, "y":5.25}, {"label":"k53", "x":3.25, "y":5.5}, {"label":"k54", "x":4.25, "y":5.5}, {"label":"k55", "x":5.25, "y":5.5}, {"label":"ka6", "x":17.75, "y":5.5}, {"label":"kb6", "x":18.75, "y":5.5}, {"label":"kb7", "x":19.75, "y":5.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default/keymap.json b/keyboards/clueboard/2x1800/2019/keymaps/default/keymap.json
new file mode 100644
index 00000000000..f5d901ab61b
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default/keymap.json
@@ -0,0 +1,11 @@
+{
+ "keyboard":"clueboard/2x1800/2019",
+ "keymap":"default",
+ "layout":"LAYOUT",
+ "layers":[
+ ["ENC_BTN1","ENC_BTN2","ENC_BTN3","ENC_BTN4","KC_HOME","KC_END","KC_PGUP","KC_PGDN","KC_ESC","KC_F1","KC_F2","KC_F3","KC_F4","KC_F5","KC_F6","KC_F7","KC_F8","KC_F9","KC_F10","KC_F11","KC_F12","KC_PSCR","KC_SLCK","KC_PAUS","KC_INS","KC_PMNS","KC_NLCK","KC_PSLS","KC_PAST","KC_GRV","KC_1","KC_2","KC_3","KC_4","KC_5","KC_6","KC_7","KC_8","KC_9","KC_0","KC_MINS","KC_EQL","KC_BSPC","KC_NLCK","KC_PSLS","KC_PAST","KC_PMNS","KC_PPLS","KC_P7","KC_P8","KC_P9","KC_TAB","KC_Q","KC_W","KC_E","KC_R","KC_T","KC_Y","KC_U","KC_I","KC_O","KC_P","KC_LBRC","KC_RBRC","KC_BSLS","KC_P7","KC_P8","KC_P9","KC_PSLS","KC_P4","KC_P5","KC_P6","KC_CAPS","KC_A","KC_S","KC_D","KC_F","KC_G","KC_H","KC_J","KC_K","KC_L","KC_SCLN","KC_QUOT","KC_NUHS","KC_ENT","KC_P4","KC_P5","KC_P6","KC_PENT","KC_P1","KC_P2","KC_P3","KC_UP","KC_LSFT","KC_Z","KC_X","KC_C","KC_V","KC_B","KC_N","KC_M","KC_SLSH","KC_COMM","KC_DOT","KC_RSFT","KC_UP","KC_P1","KC_P2","KC_P3","KC_PENT","KC_P0","KC_PDOT","KC_LEFT","KC_DOWN","KC_RGHT","KC_LCTL","KC_LGUI","KC_LALT","KC_SPC","KC_SPC","KC_SPC","KC_SPC","KC_RALT","KC_RGUI","KC_APP","KC_RCTL","KC_LEFT","KC_DOWN","KC_RGHT","KC_P0","KC_PDOT"]
+ ],
+ "author":"skullydazed",
+ "notes":"",
+ "version":1
+}
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default/readme.md b/keyboards/clueboard/2x1800/2019/keymaps/default/readme.md
new file mode 100644
index 00000000000..4e3457efce6
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for 2x1800
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_1u_ansi/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_1u_ansi/keymap.c
new file mode 100644
index 00000000000..3c504930da8
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_1u_ansi/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_1u_ansi(
+ KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4,
+ KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS,
+ KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PSLS,
+ KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6,
+ KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+)
+};
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_1u_ansi/readme.md b/keyboards/clueboard/2x1800/2019/keymaps/default_1u_ansi/readme.md
new file mode 100644
index 00000000000..4e3457efce6
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_1u_ansi/readme.md
@@ -0,0 +1 @@
+# The default keymap for 2x1800
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_1u_iso/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_1u_iso/keymap.c
new file mode 100644
index 00000000000..17cb57abe74
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_1u_iso/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_1u_iso(
+ KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4,
+ KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS,
+ KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_P7, KC_P8, KC_P9, KC_PSLS,
+ KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6,
+ KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+)
+};
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_1u_iso/readme.md b/keyboards/clueboard/2x1800/2019/keymaps/default_1u_iso/readme.md
new file mode 100644
index 00000000000..4e3457efce6
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_1u_iso/readme.md
@@ -0,0 +1 @@
+# The default keymap for 2x1800
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_2u_ansi/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_2u_ansi/keymap.c
new file mode 100644
index 00000000000..2bd91000b64
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_2u_ansi/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_2u_ansi(
+ KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4,
+ KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS,
+ KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PSLS,
+ KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6,
+ KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+)
+};
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_2u_ansi/readme.md b/keyboards/clueboard/2x1800/2019/keymaps/default_2u_ansi/readme.md
new file mode 100644
index 00000000000..c933ee3edb7
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_2u_ansi/readme.md
@@ -0,0 +1 @@
+# The default keymap for 2x1800 with 2u spacebar
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_2u_iso/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_2u_iso/keymap.c
new file mode 100644
index 00000000000..5e1c96d1448
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_2u_iso/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_2u_iso(
+ KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4,
+ KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS,
+ KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_P7, KC_P8, KC_P9, KC_PSLS,
+ KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6,
+ KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+)
+};
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_2u_iso/readme.md b/keyboards/clueboard/2x1800/2019/keymaps/default_2u_iso/readme.md
new file mode 100644
index 00000000000..c933ee3edb7
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_2u_iso/readme.md
@@ -0,0 +1 @@
+# The default keymap for 2x1800 with 2u spacebar
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_4u_ansi/config.h b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_ansi/config.h
new file mode 100644
index 00000000000..dd48c69e36e
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_ansi/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+
+#pragma once
+
+// place overrides here
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_4u_ansi/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_ansi/keymap.c
new file mode 100644
index 00000000000..9e1c211a84b
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_ansi/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_4u_ansi(
+ KC_1, KC_2, KC_3, KC_4,
+ KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS,
+ KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PSLS,
+ KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6,
+ KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+)
+};
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_4u_ansi/readme.md b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_ansi/readme.md
new file mode 100644
index 00000000000..a696972e8c4
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_ansi/readme.md
@@ -0,0 +1 @@
+# The default keymap for 2x1800 with 4u Spacebar
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/config.h b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/config.h
new file mode 100644
index 00000000000..dd48c69e36e
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+
+#pragma once
+
+// place overrides here
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/keymap.c
new file mode 100644
index 00000000000..261f578cdfe
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_4u_iso(
+ KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4,
+ KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS,
+ KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_P7, KC_P8, KC_P9, KC_PSLS,
+ KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6,
+ KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+)
+};
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/readme.md b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/readme.md
new file mode 100644
index 00000000000..a696972e8c4
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/readme.md
@@ -0,0 +1 @@
+# The default keymap for 2x1800 with 4u Spacebar
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/config.h b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/config.h
new file mode 100644
index 00000000000..dd48c69e36e
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+
+#pragma once
+
+// place overrides here
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/keymap.c
new file mode 100644
index 00000000000..f8f9d820dfd
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_7u_ansi(
+ KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4,
+ KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_DEL,
+ KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PSLS,
+ KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6,
+ KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LALT, KC_SPC, KC_LGUI, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+)
+};
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/readme.md b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/readme.md
new file mode 100644
index 00000000000..f5718e842dc
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/readme.md
@@ -0,0 +1 @@
+# The default keymap for 2x1800 with 7u spacebar
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/config.h b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/config.h
new file mode 100644
index 00000000000..dd48c69e36e
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+
+#pragma once
+
+// place overrides here
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/keymap.c b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/keymap.c
new file mode 100644
index 00000000000..88ea3fb850d
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_7u_iso(
+ KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4,
+ KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_DEL,
+ KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_P7, KC_P8, KC_P9, KC_PSLS,
+ KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6,
+ KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LALT, KC_SPC, KC_LGUI, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+)
+};
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/readme.md b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/readme.md
new file mode 100644
index 00000000000..f5718e842dc
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/readme.md
@@ -0,0 +1 @@
+# The default keymap for 2x1800 with 7u spacebar
diff --git a/keyboards/clueboard/2x1800/2019/readme.md b/keyboards/clueboard/2x1800/2019/readme.md
new file mode 100644
index 00000000000..538c1532493
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/readme.md
@@ -0,0 +1,13 @@
+# Clueboard 2x1800
+
+Clueboard 2x1800 Mechanical Drawing Toy Edition
+
+* Keyboard Maintainer: [Zach White](https://github.com/skullydazed)
+* Hardware Supported: Clueboard 2x1800 2019 PCB
+* Hardware Availability: 2019 Apr 1 Group Buy
+
+Make example for this keyboard:
+
+ make clueboard/2x1800/2019:default
+
+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).
diff --git a/keyboards/clueboard/2x1800/2019/rules.mk b/keyboards/clueboard/2x1800/2019/rules.mk
new file mode 100644
index 00000000000..dcad3ec90e8
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/rules.mk
@@ -0,0 +1,25 @@
+# MCU name
+MCU = at90usb1286
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = halfkay
+
+# Build Options
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+ENCODER_ENABLE = yes # Rotary encoder (knob) support
+NKRO_ENABLE = yes # USB Nkey Rollover
+MIDI_ENABLE = no # MIDI support
+UNICODE_ENABLE = no # Unicode
+RGBLIGHT_ENABLE = yes # RGB on pin C5
+AUDIO_ENABLE = yes # Audio output on pin C4 and B7
diff --git a/keyboards/clueboard/2x1800/2x1800.c b/keyboards/clueboard/2x1800/2x1800.c
deleted file mode 100644
index 09c90adbcf6..00000000000
--- a/keyboards/clueboard/2x1800/2x1800.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Copyright 2017 Zach White
- *
- * 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 .
- */
-#include "2x1800.h"
-
-void matrix_init_kb(void) {
- // Set our LED pins as output
- DDRB |= (1<<4); // Numlock
- DDRB |= (1<<5); // Capslock
- DDRB |= (1<<6); // Scroll Lock
-
- // Run the keymap level init
- matrix_init_user();
-}
-
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
- return process_record_user(keycode, record);
-}
-
-void led_set_kb(uint8_t usb_led) {
- // Toggle numlock as needed
- if (usb_led & (1<
-
-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 .
-*/
-
-#ifndef CONFIG_H
-#define CONFIG_H
-
-#include "config_common.h"
-
-/* USB Device descriptor parameter */
-#define VENDOR_ID 0xC1ED
-#define PRODUCT_ID 0x23A0
-#define DEVICE_VER 0x0001
-#define MANUFACTURER Clueboard
-#define PRODUCT Double 1800
-#define DESCRIPTION What does it mean?
-
-/* key matrix size */
-#define MATRIX_ROWS 12
-#define MATRIX_COLS 11
-
-/*
- * 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 { C0, C1, C2, C3, C7, F7, B1, F2, F3, F4, F5, F6 }
-#define MATRIX_COL_PINS { D2, D3, D4, D5, D7, E0, E1, B0, E6, B3, B2 }
-#define UNUSED_PINS { D0, D1, D6, C5, C6, E4, E5, E7, F0, F1, A0, A1, A2, A3, A4, A5, A6, A7 }
-
-/* COL2ROW, ROW2COL*/
-#define DIODE_DIRECTION ROW2COL
-
-/* 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
-
-/* audio support */
-#define B7_AUDIO
-#define C4_AUDIO
-#define AUDIO_CLICKY
-
-/* number of backlight levels */
-// #define BACKLIGHT_PIN B7
-// #define BACKLIGHT_BREATHING
-// #define BACKLIGHT_LEVELS 3
-
-/* 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
-
-#define RGB_DI_PIN C6
-#define RGBLIGHT_ANIMATIONS
-#define RGBLED_NUM 16
-#define RGBLIGHT_HUE_STEP 8
-#define RGBLIGHT_SAT_STEP 8
-#define RGBLIGHT_VAL_STEP 8
-
-/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
- * This is userful 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
-
-/*
- * Magic Key Options
- *
- * Magic keys are hotkey commands that allow control over firmware functions of
- * the keyboard. They are best used in combination with the HID Listen program,
- * found here: https://www.pjrc.com/teensy/hid_listen.html
- *
- * The options below allow the magic key functionality to be changed. This is
- * useful if your keyboard/keypad is missing keys and you want magic key support.
- *
- */
-
-/* control how magic key switches layers */
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
-
-/* override magic key keymap */
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
-//#define MAGIC_KEY_HELP1 H
-//#define MAGIC_KEY_HELP2 SLASH
-//#define MAGIC_KEY_DEBUG D
-//#define MAGIC_KEY_DEBUG_MATRIX X
-//#define MAGIC_KEY_DEBUG_KBD K
-//#define MAGIC_KEY_DEBUG_MOUSE M
-//#define MAGIC_KEY_VERSION V
-//#define MAGIC_KEY_STATUS S
-//#define MAGIC_KEY_CONSOLE C
-//#define MAGIC_KEY_LAYER0_ALT1 ESC
-//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
-//#define MAGIC_KEY_LAYER0 0
-//#define MAGIC_KEY_LAYER1 1
-//#define MAGIC_KEY_LAYER2 2
-//#define MAGIC_KEY_LAYER3 3
-//#define MAGIC_KEY_LAYER4 4
-//#define MAGIC_KEY_LAYER5 5
-//#define MAGIC_KEY_LAYER6 6
-//#define MAGIC_KEY_LAYER7 7
-//#define MAGIC_KEY_LAYER8 8
-//#define MAGIC_KEY_LAYER9 9
-//#define MAGIC_KEY_BOOTLOADER PAUSE
-//#define MAGIC_KEY_LOCK CAPS
-//#define MAGIC_KEY_EEPROM E
-//#define MAGIC_KEY_NKRO N
-//#define MAGIC_KEY_SLEEP_LED Z
-
-/*
- * 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
-//#define NO_ACTION_MACRO
-//#define NO_ACTION_FUNCTION
-
-/*
- * MIDI options
- */
-
-/* Prevent use of disabled MIDI features in the keymap */
-//#define MIDI_ENABLE_STRICT 1
-
-/* enable basic MIDI features:
- - MIDI notes can be sent when in Music mode is on
-*/
-//#define MIDI_BASIC
-
-/* enable advanced MIDI features:
- - MIDI notes can be added to the keymap
- - Octave shift and transpose
- - Virtual sustain, portamento, and modulation wheel
- - etc.
-*/
-//#define MIDI_ADVANCED
-
-/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
-//#define MIDI_TONE_KEYCODE_OCTAVES 1
-
-#endif
diff --git a/keyboards/clueboard/2x1800/info.json b/keyboards/clueboard/2x1800/info.json
index 0e3bb36a9d8..785743a3074 100644
--- a/keyboards/clueboard/2x1800/info.json
+++ b/keyboards/clueboard/2x1800/info.json
@@ -1,42 +1,5 @@
{
"keyboard_name": "Clueboard 2x1800",
"url": "",
- "maintainer": "skullydazed",
- "width": 24,
- "height": 6.5,
- "layouts": {
- "LAYOUT": {
- "key_count": 127,
- "layout": [
- {"label":"Home", "x":0, "y":0}, {"label":"End", "x":1, "y":0}, {"label":"PgUp", "x":2, "y":0}, {"label":"PgDn", "x":3, "y":0}, {"label":"Esc", "x":4.75, "y":0}, {"label":"F1", "x":6.25, "y":0}, {"label":"F2", "x":7.25, "y":0}, {"label":"F3", "x":8.25, "y":0}, {"label":"F4", "x":9.25, "y":0}, {"label":"F5", "x":10.75, "y":0}, {"label":"F6", "x":11.75, "y":0}, {"label":"F7", "x":12.75, "y":0}, {"label":"F8", "x":13.75, "y":0}, {"label":"F9", "x":15.25, "y":0}, {"label":"F10", "x":16.25, "y":0}, {"label":"F11", "x":17.25, "y":0}, {"label":"F12", "x":18.25, "y":0}, {"label":"PrtSc", "x":20, "y":0}, {"label":"Scroll Lock", "x":21, "y":0}, {"label":"Pause", "x":22, "y":0}, {"label":"Insert", "x":23, "y":0},
- {"label":"-", "x":0, "y":1.25}, {"label":"Num Lock", "x":1, "y":1.25}, {"label":"/", "x":2, "y":1.25}, {"label":"*", "x":3, "y":1.25}, {"label":"~", "x":4.5, "y":1.25}, {"label":"!", "x":5.5, "y":1.25}, {"label":"@", "x":6.5, "y":1.25}, {"label":"#", "x":7.5, "y":1.25}, {"label":"$", "x":8.5, "y":1.25}, {"label":"%", "x":9.5, "y":1.25}, {"label":"^", "x":10.5, "y":1.25}, {"label":"&", "x":11.5, "y":1.25}, {"label":"*", "x":12.5, "y":1.25}, {"label":"(", "x":13.5, "y":1.25}, {"label":")", "x":14.5, "y":1.25}, {"label":"_", "x":15.5, "y":1.25}, {"label":"+", "x":16.5, "y":1.25}, {"label":"Backspace", "x":17.5, "y":1.25, "w":2}, {"label":"Num Lock", "x":20, "y":1.25}, {"label":"/", "x":21, "y":1.25}, {"label":"*", "x":22, "y":1.25}, {"label":"-", "x":23, "y":1.25},
- {"label":"+", "x":0, "y":2.25, "h":2}, {"label":"7", "x":1, "y":2.25}, {"label":"8", "x":2, "y":2.25}, {"label":"9", "x":3, "y":2.25}, {"label":"Tab", "x":4.5, "y":2.25, "w":1.5}, {"label":"Q", "x":6, "y":2.25}, {"label":"W", "x":7, "y":2.25}, {"label":"E", "x":8, "y":2.25}, {"label":"R", "x":9, "y":2.25}, {"label":"T", "x":10, "y":2.25}, {"label":"Y", "x":11, "y":2.25}, {"label":"U", "x":12, "y":2.25}, {"label":"I", "x":13, "y":2.25}, {"label":"O", "x":14, "y":2.25}, {"label":"P", "x":15, "y":2.25}, {"label":"{", "x":16, "y":2.25}, {"label":"}", "x":17, "y":2.25}, {"label":"|", "x":18, "y":2.25, "w":1.5}, {"label":"7", "x":20, "y":2.25}, {"label":"8", "x":21, "y":2.25}, {"label":"9", "x":22, "y":2.25}, {"label":"+", "x":23, "y":2.25, "h":2},
- {"label":"4", "x":1, "y":3.25}, {"label":"5", "x":2, "y":3.25}, {"label":"6", "x":3, "y":3.25}, {"label":"Caps Lock", "x":4.5, "y":3.25, "w":1.75}, {"label":"A", "x":6.25, "y":3.25}, {"label":"S", "x":7.25, "y":3.25}, {"label":"D", "x":8.25, "y":3.25}, {"label":"F", "x":9.25, "y":3.25}, {"label":"G", "x":10.25, "y":3.25}, {"label":"H", "x":11.25, "y":3.25}, {"label":"J", "x":12.25, "y":3.25}, {"label":"K", "x":13.25, "y":3.25}, {"label":"L", "x":14.25, "y":3.25}, {"label":":", "x":15.25, "y":3.25}, {"label":"\"", "x":16.25, "y":3.25}, {"label":"Enter", "x":17.25, "y":3.25, "w":2.25}, {"label":"4", "x":20, "y":3.25}, {"label":"5", "x":21, "y":3.25}, {"label":"6", "x":22, "y":3.25},
- {"label":"Enter", "x":0, "y":4.25, "h":2}, {"label":"1", "x":1, "y":4.25}, {"label":"2", "x":2, "y":4.25}, {"label":"3", "x":3, "y":4.25}, {"label":"\\u2191", "x":4.25, "y":4.5}, {"label":"Shift", "x":5.5, "y":4.25, "w":1.25}, {"label":"Z", "x":6.75, "y":4.25}, {"label":"X", "x":7.75, "y":4.25}, {"label":"C", "x":8.75, "y":4.25}, {"label":"V", "x":9.75, "y":4.25}, {"label":"B", "x":10.75, "y":4.25}, {"label":"N", "x":11.75, "y":4.25}, {"label":"M", "x":12.75, "y":4.25}, {"label":"<", "x":13.75, "y":4.25}, {"label":">", "x":14.75, "y":4.25}, {"label":"?", "x":15.75, "y":4.25}, {"label":"Shift", "x":16.75, "y":4.25, "w":1.75}, {"label":"\\u2191", "x":18.75, "y":4.5}, {"label":"1", "x":20, "y":4.25}, {"label":"2", "x":21, "y":4.25}, {"label":"3", "x":22, "y":4.25}, {"label":"Enter", "x":23, "y":4.25, "h":2},
- {"label":"0", "x":1, "y":5.25}, {"label":".", "x":2, "y":5.25}, {"label":"\\u2190", "x":3.25, "y":5.5}, {"label":"\\u2193", "x":4.25, "y":5.5}, {"label":"\\u2192", "x":5.25, "y":5.5}, {"label":"Ctrl", "x":6.5, "y":5.25}, {"label":"Win", "x":7.5, "y":5.25}, {"label":"Alt", "x":8.5, "y":5.25}, {"label":"1u", "x":9.5, "y":5.25}, {"label":"1u", "x":10.5, "y":5.25}, {"label":"1u", "x":11.5, "y":5.25}, {"label":"1u", "x":12.5, "y":5.25}, {"label":"Alt", "x":13.5, "y":5.25}, {"label":"Win", "x":14.5, "y":5.25}, {"label":"Menu", "x":15.5, "y":5.25}, {"label":"Ctrl", "x":16.5, "y":5.25}, {"label":"\\u2190", "x":17.75, "y":5.5}, {"label":"\\u2193", "x":18.75, "y":5.5}, {"label":"\\u2192", "x":19.75, "y":5.5}, {"label":"0", "x":21, "y":5.25}, {"label":".", "x":22, "y":5.25}
- ]
- },
- "LAYOUT_7u_space": {
- "key_count": 121,
- "layout": [
- {"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, {"label":"k03", "x":3, "y":0}, {"label":"k04", "x":4.75, "y":0}, {"label":"k06", "x":6.25, "y":0}, {"label":"k07", "x":7.25, "y":0}, {"label":"k08", "x":8.25, "y":0}, {"label":"k09", "x":9.25, "y":0}, {"label":"k0a", "x":10.75, "y":0}, {"label":"k60", "x":11.75, "y":0}, {"label":"k61", "x":12.75, "y":0}, {"label":"k62", "x":13.75, "y":0}, {"label":"k63", "x":15.25, "y":0}, {"label":"k64", "x":16.25, "y":0}, {"label":"k65", "x":17.25, "y":0}, {"label":"k66", "x":18.25, "y":0}, {"label":"k67", "x":20, "y":0}, {"label":"k68", "x":21, "y":0}, {"label":"k69", "x":22, "y":0}, {"label":"k6a", "x":23, "y":0},
- {"label":"k10", "x":0, "y":1.25}, {"label":"k11", "x":1, "y":1.25}, {"label":"k12", "x":2, "y":1.25}, {"label":"k13", "x":3, "y":1.25}, {"label":"k14", "x":4.5, "y":1.25}, {"label":"k15", "x":5.5, "y":1.25}, {"label":"k16", "x":6.5, "y":1.25}, {"label":"k17", "x":7.5, "y":1.25}, {"label":"k18", "x":8.5, "y":1.25}, {"label":"k19", "x":9.5, "y":1.25}, {"label":"k0a", "x":10.5, "y":1.25}, {"label":"k70", "x":11.5, "y":1.25}, {"label":"k71", "x":12.5, "y":1.25}, {"label":"k72", "x":13.5, "y":1.25}, {"label":"k73", "x":14.5, "y":1.25}, {"label":"k74", "x":15.5, "y":1.25}, {"label":"k75", "x":16.5, "y":1.25}, {"label":"k76", "x":17.5, "y":1.25, "w":2}, {"label":"k77", "x":20, "y":1.25}, {"label":"k78", "x":21, "y":1.25}, {"label":"k79", "x":22, "y":1.25}, {"label":"k7a", "x":23, "y":1.25},
- {"label":"k20", "x":0, "y":2.25, "h":2}, {"label":"k21", "x":1, "y":2.25}, {"label":"k22", "x":2, "y":2.25}, {"label":"k23", "x":3, "y":2.25}, {"label":"k24", "x":4.5, "y":2.25, "w":1.5}, {"label":"k25", "x":6, "y":2.25}, {"label":"k26", "x":7, "y":2.25}, {"label":"k27", "x":8, "y":2.25}, {"label":"k28", "x":9, "y":2.25}, {"label":"k29", "x":10, "y":2.25}, {"label":"k2a", "x":11, "y":2.25}, {"label":"k80", "x":12, "y":2.25}, {"label":"k81", "x":13, "y":2.25}, {"label":"k82", "x":14, "y":2.25}, {"label":"k83", "x":15, "y":2.25}, {"label":"k84", "x":16, "y":2.25}, {"label":"k85", "x":17, "y":2.25}, {"label":"k86", "x":18, "y":2.25, "w":1.5}, {"label":"k87", "x":20, "y":2.25}, {"label":"k88", "x":21, "y":2.25}, {"label":"k89", "x":22, "y":2.25}, {"label":"k8a", "x":23, "y":2.25, "h":2},
- {"label":"k31", "x":1, "y":3.25}, {"label":"k32", "x":2, "y":3.25}, {"label":"k33", "x":3, "y":3.25}, {"label":"k34", "x":4.5, "y":3.25, "w":1.75}, {"label":"k35", "x":6.25, "y":3.25}, {"label":"k36", "x":7.25, "y":3.25}, {"label":"k37", "x":8.25, "y":3.25}, {"label":"k38", "x":9.25, "y":3.25}, {"label":"k39", "x":10.25, "y":3.25}, {"label":"k3a", "x":11.25, "y":3.25}, {"label":"k90", "x":12.25, "y":3.25}, {"label":"k91", "x":13.25, "y":3.25}, {"label":"k92", "x":14.25, "y":3.25}, {"label":"k93", "x":15.25, "y":3.25}, {"label":"k94", "x":16.25, "y":3.25}, {"label":"k95", "x":17.25, "y":3.25, "w":2.25}, {"label":"k97", "x":20, "y":3.25}, {"label":"k98", "x":21, "y":3.25}, {"label":"k99", "x":22, "y":3.25},
- {"label":"k40", "x":0, "y":4.25, "h":2}, {"label":"k41", "x":1, "y":4.25}, {"label":"k42", "x":2, "y":4.25}, {"label":"k43", "x":3, "y":4.25}, {"label":"k45", "x":5.5, "y":4.25, "w":1.25}, {"label":"k46", "x":6.75, "y":4.25}, {"label":"k47", "x":7.75, "y":4.25}, {"label":"k48", "x":8.75, "y":4.25}, {"label":"k49", "x":9.75, "y":4.25}, {"label":"k4a", "x":10.75, "y":4.25}, {"label":"ka0", "x":11.75, "y":4.25}, {"label":"ka1", "x":12.75, "y":4.25}, {"label":"ka2", "x":13.75, "y":4.25}, {"label":"ka3", "x":14.75, "y":4.25}, {"label":"ka4", "x":15.75, "y":4.25}, {"label":"ka5", "x":16.75, "y":4.25, "w":1.75}, {"label":"ka7", "x":20, "y":4.25}, {"label":"ka8", "x":21, "y":4.25}, {"label":"ka9", "x":22, "y":4.25}, {"label":"kaa", "x":23, "y":4.25, "h":2}, {"label":"k44", "x":4.25, "y":4.5}, {"label":"k96", "x":18.75, "y":4.5},
- {"label":"k51", "x":1, "y":5.25}, {"label":"k52", "x":2, "y":5.25}, {"label":"k56", "x":6.5, "y":5.25}, {"label":"k57", "x":7.5, "y":5.25}, {"label":"kb0", "x":8.5, "y":5.25, "w":7}, {"label":"kb4", "x":15.5, "y":5.25}, {"label":"kb5", "x":16.5, "y":5.25}, {"label":"kb8", "x":21, "y":5.25}, {"label":"kb9", "x":22, "y":5.25}, {"label":"k53", "x":3.25, "y":5.5}, {"label":"k54", "x":4.25, "y":5.5}, {"label":"k55", "x":5.25, "y":5.5}, {"label":"ka6", "x":17.75, "y":5.5}, {"label":"kb6", "x":18.75, "y":5.5}, {"label":"kb7", "x":19.75, "y":5.5}
- ]
- },
- "LAYOUT_4u_space": {
- "key_count": 124,
- "layout": [
- {"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, {"label":"k03", "x":3, "y":0}, {"label":"k04", "x":4.75, "y":0}, {"label":"k06", "x":6.25, "y":0}, {"label":"k07", "x":7.25, "y":0}, {"label":"k08", "x":8.25, "y":0}, {"label":"k09", "x":9.25, "y":0}, {"label":"k0a", "x":10.75, "y":0}, {"label":"k60", "x":11.75, "y":0}, {"label":"k61", "x":12.75, "y":0}, {"label":"k62", "x":13.75, "y":0}, {"label":"k63", "x":15.25, "y":0}, {"label":"k64", "x":16.25, "y":0}, {"label":"k65", "x":17.25, "y":0}, {"label":"k66", "x":18.25, "y":0}, {"label":"k67", "x":20, "y":0}, {"label":"k68", "x":21, "y":0}, {"label":"k69", "x":22, "y":0}, {"label":"k6a", "x":23, "y":0},
- {"label":"k10", "x":0, "y":1.25}, {"label":"k11", "x":1, "y":1.25}, {"label":"k12", "x":2, "y":1.25}, {"label":"k13", "x":3, "y":1.25}, {"label":"k14", "x":4.5, "y":1.25}, {"label":"k15", "x":5.5, "y":1.25}, {"label":"k16", "x":6.5, "y":1.25}, {"label":"k17", "x":7.5, "y":1.25}, {"label":"k18", "x":8.5, "y":1.25}, {"label":"k19", "x":9.5, "y":1.25}, {"label":"k0a", "x":10.5, "y":1.25}, {"label":"k70", "x":11.5, "y":1.25}, {"label":"k71", "x":12.5, "y":1.25}, {"label":"k72", "x":13.5, "y":1.25}, {"label":"k73", "x":14.5, "y":1.25}, {"label":"k74", "x":15.5, "y":1.25}, {"label":"k75", "x":16.5, "y":1.25}, {"label":"k76", "x":17.5, "y":1.25, "w":2}, {"label":"k77", "x":20, "y":1.25}, {"label":"k78", "x":21, "y":1.25}, {"label":"k79", "x":22, "y":1.25}, {"label":"k7a", "x":23, "y":1.25},
- {"label":"k20", "x":0, "y":2.25, "h":2}, {"label":"k21", "x":1, "y":2.25}, {"label":"k22", "x":2, "y":2.25}, {"label":"k23", "x":3, "y":2.25}, {"label":"k24", "x":4.5, "y":2.25, "w":1.5}, {"label":"k25", "x":6, "y":2.25}, {"label":"k26", "x":7, "y":2.25}, {"label":"k27", "x":8, "y":2.25}, {"label":"k28", "x":9, "y":2.25}, {"label":"k29", "x":10, "y":2.25}, {"label":"k2a", "x":11, "y":2.25}, {"label":"k80", "x":12, "y":2.25}, {"label":"k81", "x":13, "y":2.25}, {"label":"k82", "x":14, "y":2.25}, {"label":"k83", "x":15, "y":2.25}, {"label":"k84", "x":16, "y":2.25}, {"label":"k85", "x":17, "y":2.25}, {"label":"k86", "x":18, "y":2.25, "w":1.5}, {"label":"k87", "x":20, "y":2.25}, {"label":"k88", "x":21, "y":2.25}, {"label":"k89", "x":22, "y":2.25}, {"label":"k8a", "x":23, "y":2.25, "h":2},
- {"label":"k31", "x":1, "y":3.25}, {"label":"k32", "x":2, "y":3.25}, {"label":"k33", "x":3, "y":3.25}, {"label":"k34", "x":4.5, "y":3.25, "w":1.75}, {"label":"k35", "x":6.25, "y":3.25}, {"label":"k36", "x":7.25, "y":3.25}, {"label":"k37", "x":8.25, "y":3.25}, {"label":"k38", "x":9.25, "y":3.25}, {"label":"k39", "x":10.25, "y":3.25}, {"label":"k3a", "x":11.25, "y":3.25}, {"label":"k90", "x":12.25, "y":3.25}, {"label":"k91", "x":13.25, "y":3.25}, {"label":"k92", "x":14.25, "y":3.25}, {"label":"k93", "x":15.25, "y":3.25}, {"label":"k94", "x":16.25, "y":3.25}, {"label":"k95", "x":17.25, "y":3.25, "w":2.25}, {"label":"k97", "x":20, "y":3.25}, {"label":"k98", "x":21, "y":3.25}, {"label":"k99", "x":22, "y":3.25},
- {"label":"k40", "x":0, "y":4.25, "h":2}, {"label":"k41", "x":1, "y":4.25}, {"label":"k42", "x":2, "y":4.25}, {"label":"k43", "x":3, "y":4.25}, {"label":"k45", "x":5.5, "y":4.25, "w":1.25}, {"label":"k46", "x":6.75, "y":4.25}, {"label":"k47", "x":7.75, "y":4.25}, {"label":"k48", "x":8.75, "y":4.25}, {"label":"k49", "x":9.75, "y":4.25}, {"label":"k4a", "x":10.75, "y":4.25}, {"label":"ka0", "x":11.75, "y":4.25}, {"label":"ka1", "x":12.75, "y":4.25}, {"label":"ka2", "x":13.75, "y":4.25}, {"label":"ka3", "x":14.75, "y":4.25}, {"label":"ka4", "x":15.75, "y":4.25}, {"label":"ka5", "x":16.75, "y":4.25, "w":1.75}, {"label":"ka7", "x":20, "y":4.25}, {"label":"ka8", "x":21, "y":4.25}, {"label":"ka9", "x":22, "y":4.25}, {"label":"kaa", "x":23, "y":4.25, "h":2}, {"label":"k44", "x":4.25, "y":4.5}, {"label":"k96", "x":18.75, "y":4.5},
- {"label":"k51", "x":1, "y":5.25}, {"label":"k52", "x":2, "y":5.25}, {"label":"k56", "x":6.5, "y":5.25}, {"label":"k57", "x":7.5, "y":5.25}, {"label":"k58", "x":8.5, "y":5.25}, {"label":"kb0", "x":9.5, "y":5.25, "w":4}, {"label":"kb2", "x":13.5, "y":5.25}, {"label":"kb3", "x":14.5, "y":5.25}, {"label":"kb4", "x":15.5, "y":5.25}, {"label":"kb5", "x":16.5, "y":5.25}, {"label":"kb8", "x":21, "y":5.25}, {"label":"kb9", "x":22, "y":5.25}, {"label":"k53", "x":3.25, "y":5.5}, {"label":"k54", "x":4.25, "y":5.5}, {"label":"k55", "x":5.25, "y":5.5}, {"label":"ka6", "x":17.75, "y":5.5}, {"label":"kb6", "x":18.75, "y":5.5}, {"label":"kb7", "x":19.75, "y":5.5}
- ]
- }
- }
+ "maintainer": "skullydazed"
}
diff --git a/keyboards/clueboard/2x1800/keymaps/default/keymap.c b/keyboards/clueboard/2x1800/keymaps/default/keymap.c
deleted file mode 100644
index 2e4b75924d9..00000000000
--- a/keyboards/clueboard/2x1800/keymaps/default/keymap.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright 2017 Zach White
- *
- * 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 .
- */
-#include QMK_KEYBOARD_H
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = LAYOUT(
- KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS, \
- \
- KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
- KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PSLS, \
- KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \
- KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_SLSH, KC_COMM, KC_DOT, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \
- KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \
-)
-};
diff --git a/keyboards/clueboard/2x1800/keymaps/default_4u/config.h b/keyboards/clueboard/2x1800/keymaps/default_4u/config.h
deleted file mode 100644
index 152e2f14875..00000000000
--- a/keyboards/clueboard/2x1800/keymaps/default_4u/config.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright 2017 Zach White
- *
- * 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 .
- */
-
-#pragma once
-
-#include "config_common.h"
-
-// place overrides here
diff --git a/keyboards/clueboard/2x1800/keymaps/default_4u/keymap.c b/keyboards/clueboard/2x1800/keymaps/default_4u/keymap.c
deleted file mode 100644
index c33dfd31e65..00000000000
--- a/keyboards/clueboard/2x1800/keymaps/default_4u/keymap.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright 2017 Zach White
- *
- * 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 .
- */
-#include QMK_KEYBOARD_H
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = LAYOUT_4u_space(
- KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS, \
- \
- KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
- KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PSLS, \
- KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \
- KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_SLSH, KC_COMM, KC_DOT, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \
- KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \
-)
-};
diff --git a/keyboards/clueboard/2x1800/keymaps/default_7u/config.h b/keyboards/clueboard/2x1800/keymaps/default_7u/config.h
deleted file mode 100644
index 152e2f14875..00000000000
--- a/keyboards/clueboard/2x1800/keymaps/default_7u/config.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright 2017 Zach White
- *
- * 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 .
- */
-
-#pragma once
-
-#include "config_common.h"
-
-// place overrides here
diff --git a/keyboards/clueboard/2x1800/keymaps/macroboard/config.h b/keyboards/clueboard/2x1800/keymaps/macroboard/config.h
deleted file mode 100644
index 152e2f14875..00000000000
--- a/keyboards/clueboard/2x1800/keymaps/macroboard/config.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright 2017 Zach White
- *
- * 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 .
- */
-
-#pragma once
-
-#include "config_common.h"
-
-// place overrides here
diff --git a/keyboards/clueboard/2x1800/keymaps/macroboard/keymap.c b/keyboards/clueboard/2x1800/keymaps/macroboard/keymap.c
deleted file mode 100644
index f69ed801e76..00000000000
--- a/keyboards/clueboard/2x1800/keymaps/macroboard/keymap.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/* Copyright 2017 Zach White
- *
- * 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 .
- */
-#include QMK_KEYBOARD_H
-
-enum custom_keycodes {
- MACRO01 = SAFE_RANGE,
- MACRO02,
- MACRO03,
- MACRO04,
- MACRO05,
- MACRO06,
- MACRO07,
- MACRO08,
- MACRO09,
- MACRO10,
- MACRO11,
- MACRO12,
- MACRO13,
- MACRO14,
- MACRO15,
- MACRO16,
- MACRO17,
- MACRO18,
- MACRO19,
- MACRO20,
- MACRO21,
-};
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = LAYOUT(
- MACRO01, MACRO02, MACRO03, MACRO04, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS, \
- \
- MACRO05, MACRO06, MACRO07, MACRO08, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
- MACRO09, MACRO10, MACRO11, MACRO12, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PSLS, \
- MACRO13, MACRO14, MACRO15, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \
- MACRO16, MACRO17, MACRO18, MACRO19, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_SLSH, KC_COMM, KC_DOT, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \
- MACRO20, MACRO21, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \
-)
-};
-
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- if (record->event.pressed) {
- switch(keycode) {
- case MACRO01:
- SEND_STRING("This is macro 01");
- return false;
- case MACRO02:
- SEND_STRING("This is macro 02");
- return false;
- case MACRO03:
- SEND_STRING("This is macro 03");
- return false;
- case MACRO04:
- SEND_STRING("This is macro 04");
- return false;
- case MACRO05:
- SEND_STRING("This is macro 05");
- return false;
- case MACRO06:
- SEND_STRING("This is macro 06");
- return false;
- case MACRO07:
- SEND_STRING("This is macro 07");
- return false;
- case MACRO08:
- SEND_STRING("This is macro 08");
- return false;
- case MACRO09:
- SEND_STRING("This is macro 09");
- return false;
- case MACRO10:
- SEND_STRING("This is macro 10");
- return false;
- case MACRO11:
- SEND_STRING("This is macro 11");
- return false;
- case MACRO12:
- SEND_STRING("This is macro 12");
- return false;
- case MACRO13:
- SEND_STRING("This is macro 13");
- return false;
- case MACRO14:
- SEND_STRING("This is macro 14");
- return false;
- case MACRO15:
- SEND_STRING("This is macro 15");
- return false;
- case MACRO16:
- SEND_STRING("This is macro 16");
- return false;
- case MACRO17:
- SEND_STRING("This is macro 17");
- return false;
- case MACRO18:
- SEND_STRING("This is macro 18");
- return false;
- case MACRO19:
- SEND_STRING("This is macro 19");
- return false;
- case MACRO20:
- SEND_STRING("This is macro 20");
- return false;
- case MACRO21:
- SEND_STRING("This is macro 21");
- return false;
- }
- }
- return true;
-};
diff --git a/keyboards/clueboard/2x1800/keymaps/mouseboard_left/config.h b/keyboards/clueboard/2x1800/keymaps/mouseboard_left/config.h
deleted file mode 100644
index 152e2f14875..00000000000
--- a/keyboards/clueboard/2x1800/keymaps/mouseboard_left/config.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright 2017 Zach White
- *
- * 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 .
- */
-
-#pragma once
-
-#include "config_common.h"
-
-// place overrides here
diff --git a/keyboards/clueboard/2x1800/keymaps/mouseboard_left/keymap.c b/keyboards/clueboard/2x1800/keymaps/mouseboard_left/keymap.c
deleted file mode 100644
index e0c97aadac0..00000000000
--- a/keyboards/clueboard/2x1800/keymaps/mouseboard_left/keymap.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright 2017 Zach White
- *
- * 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 .
- */
-#include QMK_KEYBOARD_H
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = LAYOUT(
- KC_NO, KC_ACL0, KC_ACL1, KC_ACL2, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS, \
- \
- KC_NO, KC_NO, KC_BTN4, KC_BTN5, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
- KC_WH_U, KC_NO, KC_MS_U, KC_NO, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PSLS, \
- KC_MS_L, KC_BTN3, KC_MS_R, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, \
- KC_WH_D, KC_BTN1, KC_MS_D, KC_BTN2, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_SLSH, KC_COMM, KC_DOT, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT, \
- KC_WH_L, KC_WH_R, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT \
-)
-};
diff --git a/keyboards/clueboard/2x1800/keymaps/mouseboard_right/config.h b/keyboards/clueboard/2x1800/keymaps/mouseboard_right/config.h
deleted file mode 100644
index 152e2f14875..00000000000
--- a/keyboards/clueboard/2x1800/keymaps/mouseboard_right/config.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright 2017 Zach White
- *
- * 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 .
- */
-
-#pragma once
-
-#include "config_common.h"
-
-// place overrides here
diff --git a/keyboards/clueboard/2x1800/keymaps/mouseboard_right/keymap.c b/keyboards/clueboard/2x1800/keymaps/mouseboard_right/keymap.c
deleted file mode 100644
index d140f5d74ef..00000000000
--- a/keyboards/clueboard/2x1800/keymaps/mouseboard_right/keymap.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright 2017 Zach White
- *
- * 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 .
- */
-#include QMK_KEYBOARD_H
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = LAYOUT(
- KC_HOME, KC_END, KC_PGUP, KC_PGDN, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS, \
- \
- KC_PMNS, KC_NLCK, KC_PSLS, KC_PAST, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NO, KC_ACL0, KC_ACL1, KC_ACL2, \
- KC_PPLS, KC_P7, KC_P8, KC_P9, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_NO, KC_MS_U, KC_NO, KC_WH_U, \
- KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_MS_L, KC_BTN3, KC_MS_R, \
- KC_PENT, KC_P1, KC_P2, KC_P3, KC_UP, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_SLSH, KC_COMM, KC_DOT, KC_RSFT, KC_UP, KC_BTN1, KC_MS_D, KC_BTN2, KC_WH_D, \
- KC_P0, KC_PDOT, KC_LEFT, KC_DOWN, KC_RGHT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_WH_L, KC_WH_R \
-)
-};
diff --git a/keyboards/clueboard/2x1800/readme.md b/keyboards/clueboard/2x1800/readme.md
index 7e2c206ede7..01b975695dc 100644
--- a/keyboards/clueboard/2x1800/readme.md
+++ b/keyboards/clueboard/2x1800/readme.md
@@ -1,6 +1,11 @@
# Clueboard 2x1800
-Clueboard Double 1800 All The Way
+Clueboard 2x1800
+
+This is a keyboard that Clueboard releases for a 1-day group buy every Apr 1. Each year has a different theme.
+
+* [2018:](2018/) Double 1800 All The Way
+* [2019:](2019/) Mechanical Drawing Toy Edition
* Keyboard Maintainer: [Zach White](https://github.com/skullydazed)
* Hardware Supported: Clueboard 2x1800 PCB
diff --git a/keyboards/comet46/ssd1306.h b/keyboards/comet46/ssd1306.h
index ea8c9232805..0ca093093a1 100644
--- a/keyboards/comet46/ssd1306.h
+++ b/keyboards/comet46/ssd1306.h
@@ -2,7 +2,6 @@
#include
#include
-#include "pincontrol.h"
#include "action.h"
enum ssd1306_cmds {
@@ -88,4 +87,4 @@ void matrix_write_ln(struct CharacterMatrix *matrix, const char *data);
void matrix_write_P(struct CharacterMatrix *matrix, const char *data);
void matrix_render(struct CharacterMatrix *matrix);
-bool process_record_gfx(uint16_t keycode, keyrecord_t *record);
\ No newline at end of file
+bool process_record_gfx(uint16_t keycode, keyrecord_t *record);
diff --git a/keyboards/converter/palm_usb/matrix.c b/keyboards/converter/palm_usb/matrix.c
index 49212f2ef14..590b5eea32f 100644
--- a/keyboards/converter/palm_usb/matrix.c
+++ b/keyboards/converter/palm_usb/matrix.c
@@ -20,7 +20,6 @@ along with this program. If not, see .
#include QMK_KEYBOARD_H
#include "protocol/serial.h"
#include "timer.h"
-#include "pincontrol.h"
/*
@@ -96,27 +95,27 @@ void pins_init(void) {
// set pins for pullups, Rts , power &etc.
//print ("pins setup\n");
- pinMode(VCC_PIN, PinDirectionOutput);
- digitalWrite(VCC_PIN, PinLevelLow);
+ setPinOutput(VCC_PIN);
+ writePinLow(VCC_PIN);
#if ( HANDSPRING == 0)
#ifdef CY835
- pinMode(GND_PIN, PinDirectionOutput);
- digitalWrite(GND_PIN, PinLevelLow);
+ setPinOutput(GND_PIN);
+ writePinLow(GND_PIN);
- pinMode(PULLDOWN_PIN, PinDirectionOutput);
- digitalWrite(PULLDOWN_PIN, PinLevelLow);
+ setPinOutput(PULLDOWN_PIN);
+ writePinLow(PULLDOWN_PIN);
#endif
- pinMode(DCD_PIN, PinDirectionInput);
- pinMode(RTS_PIN, PinDirectionInput);
+ setPinInput(DCD_PIN);
+ setPinInput(RTS_PIN);
#endif
/* check that the other side isn't powered up.
- test=digitalRead(DCD_PIN);
+ test=readPin(DCD_PIN);
xprintf("b%02X:", test);
- test=digitalRead(RTS_PIN);
+ test=readPin(RTS_PIN);
xprintf("%02X\n", test);
*/
@@ -129,20 +128,20 @@ uint8_t rts_reset(void) {
// On boot, we keep rts as input, then switch roles here
// on leaving sleep, we toggle the same way
- firstread=digitalRead(RTS_PIN);
+ firstread=readPin(RTS_PIN);
// printf("r%02X:", firstread);
- pinMode(RTS_PIN, PinDirectionOutput);
+ setPinOutput(RTS_PIN);
- if (firstread == PinLevelHigh) {
- digitalWrite(RTS_PIN, PinLevelLow);
+ if (firstread) {
+ writePinLow(RTS_PIN);
}
_delay_ms(10);
- digitalWrite(RTS_PIN, PinLevelHigh);
+ writePinHigh(RTS_PIN);
/* the future is Arm
- if (palReadPad(RTS_PIN_IOPRT) == PinLevelLow)
+ if (!palReadPad(RTS_PIN_IOPRT))
{
_delay_ms(10);
palSetPadMode(RTS_PINn_IOPORT, PinDirectionOutput_PUSHPULL);
@@ -224,9 +223,9 @@ uint8_t handspring_handshake(void) {
}
uint8_t handspring_reset(void) {
- digitalWrite(VCC_PIN, PinLevelLow);
+ writePinLow(VCC_PIN);
_delay_ms(5);
- digitalWrite(VCC_PIN, PinLevelHigh);
+ writePinHigh(VCC_PIN);
if ( handspring_handshake() ) {
last_activity = timer_read();
@@ -250,7 +249,7 @@ void matrix_init(void)
#endif
print("power up\n");
- digitalWrite(VCC_PIN, PinLevelHigh);
+ writePinHigh(VCC_PIN);
// wait for DCD strobe from keyboard - it will do this
// up to 3 times, then the board needs the RTS toggled to try again
@@ -265,7 +264,7 @@ void matrix_init(void)
}
#else /// Palm / HP device with DCD
- while( digitalRead(DCD_PIN) != PinLevelHigh ) {;}
+ while( !readPin(DCD_PIN) ) {;}
print("dcd\n");
rts_reset(); // at this point the keyboard should think all is well.
diff --git a/keyboards/converter/usb_usb/hasu/rules.mk b/keyboards/converter/usb_usb/hasu/rules.mk
index c2ee0bc86f9..2538a0edd9f 100644
--- a/keyboards/converter/usb_usb/hasu/rules.mk
+++ b/keyboards/converter/usb_usb/hasu/rules.mk
@@ -1,2 +1,5 @@
# Processor frequency
F_CPU = 16000000
+
+# Bootloader selection
+BOOTLOADER = atmel-dfu
diff --git a/keyboards/converter/usb_usb/keymaps/chriskopher/combo.c b/keyboards/converter/usb_usb/keymaps/chriskopher/combo.c
new file mode 100644
index 00000000000..c0a354eb55b
--- /dev/null
+++ b/keyboards/converter/usb_usb/keymaps/chriskopher/combo.c
@@ -0,0 +1,54 @@
+/* Copyright 2020 Christopher Ko
+ *
+ * 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 .
+ */
+
+#include "shared_enum.h"
+
+#include "quantum.h"
+
+enum combo_event {
+ SD_LAYER_COMBO,
+ KL_MEH_COMBO,
+};
+
+const uint16_t PROGMEM sd_combo[] = {KC_S, KC_D, COMBO_END}; // Combo: S + D for SuperDuper mode
+const uint16_t PROGMEM kl_combo[] = {KC_K, KC_L, COMBO_END}; // Combo: K + L for Meh modifier
+
+// Register the combo action
+combo_t key_combos[COMBO_COUNT] = {
+ [SD_LAYER_COMBO] = COMBO_ACTION(sd_combo),
+ [KL_MEH_COMBO] = COMBO_ACTION(kl_combo),
+};
+
+// Called after a combo event is triggered
+void process_combo_event(uint8_t combo_index, bool pressed) {
+ switch (combo_index) {
+ case SD_LAYER_COMBO:
+ if (pressed) {
+ layer_on(_SUPERDUPER);
+ } else {
+ layer_off(_SUPERDUPER);
+ }
+ break;
+
+ case KL_MEH_COMBO:
+ if (pressed) {
+ register_mods(MOD_MEH);
+ } else {
+ unregister_mods(MOD_MEH);
+ }
+ break;
+ }
+}
diff --git a/keyboards/converter/usb_usb/keymaps/chriskopher/config.h b/keyboards/converter/usb_usb/keymaps/chriskopher/config.h
new file mode 100644
index 00000000000..7714f713bd8
--- /dev/null
+++ b/keyboards/converter/usb_usb/keymaps/chriskopher/config.h
@@ -0,0 +1,25 @@
+/* Copyright 2020 Christopher Ko
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#define TAPPING_TERM 200 // Delay for tap modifiers until it is considered a hold
+
+#define IGNORE_MOD_TAP_INTERRUPT // Enable ignore mod tap interrupt: https://docs.qmk.fm/#/tap_hold?id=ignore-mod-tap-interrupt
+#define IGNORE_MOD_TAP_INTERRUPT_PER_KEY // Allows configuration of ignore mod tap interrupt per key in keymap.c
+
+#define COMBO_COUNT 2 // Number of defined combos
+#define COMBO_TERM 20 // Delay for combo keys to be chained together
diff --git a/keyboards/converter/usb_usb/keymaps/chriskopher/keymap.c b/keyboards/converter/usb_usb/keymaps/chriskopher/keymap.c
new file mode 100644
index 00000000000..c472f78b7de
--- /dev/null
+++ b/keyboards/converter/usb_usb/keymaps/chriskopher/keymap.c
@@ -0,0 +1,186 @@
+/* Copyright 2020 Christopher Ko
+ *
+ * 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 .
+ */
+
+#include "shared_enum.h"
+
+#include QMK_KEYBOARD_H
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Modified Qwerty for chriskopher: base default layer
+ * ,---. ,---------------. ,---------------. ,---------------. ,-----------.
+ * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau|
+ * `---' `---------------' `---------------' `---------------' `-----------'
+ * ,-----------------------------------------------------------. ,-----------. ,---------------.
+ * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \ | |Ins|Hom|PgU| |NmL| /| *| -|
+ * |-----------------------------------------------------------| |-----------| |---------------|
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Bsp| |Del|End|PgD| | 7| 8| 9| |
+ * |-----------------------------------------------------------| `-----------' |-----------| |
+ * |Ctl/Esc| A| S| D| F| G| H| J| K| L|;/:| ' | Return| | 4| 5| 6| +|
+ * |-----------------------------------------------------------| ,---. |---------------|
+ * |Shift/( |Dev/Z| X| C| V| B| N| M| ,| .| /| Shift/)| | ↑ | | 1| 2| 3| |
+ * |-----------------------------------------------------------| ,-----------. |-----------| |
+ * |Meh/CapsL|Gui|Alt| Space |Alt|Adjust/Gui|App| Ctl| | ← | ↓ | → | | 0| .|Ent|
+ * `-----------------------------------------------------------' `-----------' `---------------'
+ */
+ [_CKO] = LAYOUT_ansi(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9,
+ LCTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, TD(SCLN_CLN), KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ TD(ESPC_L), LT(_DEV,KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, TD(ESPC_R), KC_UP, KC_P1, KC_P2, KC_P3,
+ MEH_T(KC_CAPS), KC_LGUI, KC_LALT, KC_SPC, KC_RALT, LT(_ADJUST,KC_RGUI), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
+ ),
+
+ /* Regular Qwerty: default layer
+ * ,---. ,---------------. ,---------------. ,---------------. ,-----------.
+ * |Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau|
+ * `---' `---------------' `---------------' `---------------' `-----------'
+ * ,-----------------------------------------------------------. ,-----------. ,---------------.
+ * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Bsp| |Ins|Hom|PgU| |NmL| /| *| -|
+ * |-----------------------------------------------------------| |-----------| |---------------|
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| |
+ * |-----------------------------------------------------------| `-----------' |-----------| |
+ * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| Return| | 4| 5| 6| +|
+ * |-----------------------------------------------------------| ,---. |---------------|
+ * |Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | ↑ | | 1| 2| 3| |
+ * |-----------------------------------------------------------| ,-----------. |-----------| |
+ * |Ctl|Gui|Alt| Space |Alt|Adjust/Gui|App|Ctl| | ← | ↓ | → | | 0| .|Ent|
+ * `-----------------------------------------------------------' `-----------' `---------------'
+ */
+ [_QWERTY] = LAYOUT_ansi(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, LT(_ADJUST,KC_RGUI), KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
+ ),
+
+ /* SuperDuper
+ * ,---. ,---------------. ,---------------. ,---------------. ,-----------.
+ * | | | | | | | | | | | | | | | | | | | | |
+ * `---' `---------------' `---------------' `---------------' `-----------'
+ * ,-----------------------------------------------------------. ,-----------. ,---------------.
+ * | | | | | | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| |-----------| |---------------|
+ * | | | | | | | |1T |T← |T→ |9T | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| `-----------' |-----------| |
+ * | |Alt|[SuperDuper]|Bksp|Ctl| ← | ↓ | ↑ | → |Del| | | | | | | |
+ * |-----------------------------------------------------------| ,---. |---------------|
+ * | | | | | | | | | | |ToggleSD| | | | | | | | |
+ * |-----------------------------------------------------------| ,-----------. |-----------| |
+ * | | | | Shift | | | | | | | | | | | | |
+ * `-----------------------------------------------------------' `-----------' `---------------'
+ */
+ [_SUPERDUPER] = LAYOUT_ansi(
+ ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
+ ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
+ ______, ______, ______, ______, ______, ______, ______, C(KC_1), C(S(KC_TAB)), C(KC_TAB), C(KC_9), ______, ______, ______, ______, ______, ______, ______, ______, ______,
+ ______, KC_LALT, ______, ______, KC_BSPC, KC_LCTL, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_DEL, ______, ______, ______, ______, ______, ______,
+ ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, TG(_SUPERDUPER), ______, ______, ______, ______, ______,
+ ______, ______, ______, KC_LSFT, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______
+ ),
+
+ /* Dev
+ * ,---. ,---------------. ,---------------. ,---------------. ,-----------.
+ * | | | | | | | | | | | | | | | | | | | | |
+ * `---' `---------------' `---------------' `---------------' `-----------'
+ * ,-----------------------------------------------------------. ,-----------. ,---------------.
+ * | | | | | | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| |-----------| |---------------|
+ * | | | | | | | | - | + | ( | ) | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| `-----------' |-----------| |
+ * | | | | | | | _ | [ | ] | { | } | | | | | | | |
+ * |-----------------------------------------------------------| ,---. |---------------|
+ * | | | | | | | = | | | < | > | ? | | | | | | | | |
+ * |-----------------------------------------------------------| ,-----------. |-----------| |
+ * | | | | | | | | | | | | | | | | |
+ * `-----------------------------------------------------------' `-----------' `---------------'
+ */
+ [_DEV] = LAYOUT_ansi(
+ ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
+ ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
+ ______, ______, ______, ______, ______, ______, ______, KC_MINS, S(KC_EQL), S(KC_9), S(KC_0), ______, ______, ______, ______, ______, ______, ______, ______, ______,
+ ______, ______, ______, ______, ______, ______, S(KC_MINS), KC_LBRC, KC_RBRC, S(KC_LBRC), S(KC_RBRC), ______, ______, ______, ______, ______, ______,
+ ______, ______, ______, ______, ______, ______, KC_EQL, S(KC_BSLASH), S(KC_COMM), S(KC_DOT), S(KC_SLSH), ______, ______, ______, ______, ______,
+ ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______
+ ),
+
+ /* Adjust
+ * ,---. ,---------------. ,---------------. ,---------------. ,-----------.
+ * | | | | | | | | | | | | | | | | | | | | |
+ * `---' `---------------' `---------------' `---------------' `-----------'
+ * ,-----------------------------------------------------------. ,--------------. ,---------------.
+ * | | | | | | | | | | | | | | | |Play|Next|VolU| | | | | |
+ * |-----------------------------------------------------------| |--------------| |---------------|
+ * | |QWERTY| | | | | | | | | | | | | |Stop|Prev|VolD| | | | | |
+ * |-----------------------------------------------------------| `--------------' |-----------| |
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,---. |---------------|
+ * | | | |CKO| | | |Play|Mute|VolD|VolU| SD| | | | | | | | |
+ * |-----------------------------------------------------------| ,-----------. |-----------| |
+ * | | | | | | | | | | | | | | | | |
+ * `-----------------------------------------------------------' `-----------' `---------------'
+ */
+ [_ADJUST] = LAYOUT_ansi(
+ ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
+ ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, KC_MPLY, KC_MNXT, KC_VOLU, ______, ______, ______, ______,
+ ______, DF(_QWERTY), ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, KC_MSTP, KC_MPRV, KC_VOLD, ______, ______, ______,
+ ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
+ ______, ______, ______, DF(_CKO), ______, ______, KC_MPLY, KC_MUTE, KC_VOLD, KC_VOLU, TG(_SUPERDUPER), ______, ______, ______, ______, ______,
+ ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______
+ )
+
+/* Empty layout for future reference
+ * ,---. ,---------------. ,---------------. ,---------------. ,-----------.
+ * | | | | | | | | | | | | | | | | | | | | |
+ * `---' `---------------' `---------------' `---------------' `-----------'
+ * ,-----------------------------------------------------------. ,-----------. ,---------------.
+ * | | | | | | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| |-----------| |---------------|
+ * | | | | | | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| `-----------' |-----------| |
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,---. |---------------|
+ * | | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| ,-----------. |-----------| |
+ * | | | | | | | | | | | | | | | | |
+ * `-----------------------------------------------------------' `-----------' `---------------'
+ */
+ /*
+ * [_EMPTY] = LAYOUT_ansi(
+ * ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
+ * ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
+ * ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
+ * ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
+ * ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______,
+ * ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, ______
+ * ),
+ */
+};
+// clang-format on
+
+// Configure ignore mod tap interrupt per key
+bool get_ignore_mod_tap_interrupt(uint16_t keycode) {
+ switch (keycode) {
+ // I don't like how mod tap interrupt feels with these keys specifically when I'm typing
+ case LCTL_T(KC_ESC):
+ return false;
+ default:
+ return true;
+ }
+}
diff --git a/keyboards/converter/usb_usb/keymaps/chriskopher/readme.md b/keyboards/converter/usb_usb/keymaps/chriskopher/readme.md
new file mode 100644
index 00000000000..59f70716aed
--- /dev/null
+++ b/keyboards/converter/usb_usb/keymaps/chriskopher/readme.md
@@ -0,0 +1,193 @@
+# chriskopher's QMK Config
+Currently designed for the use of an ANSI tenkeyless keyboard on Windows 10. Although many of the ideas can be applied agnostically across operating systems.
+
+## Hardware
+- [Hasu USB to USB Controller Converter](https://www.1upkeyboards.com/shop/controllers/usb-to-usb-converter/)
+ - Limitations include:
+ - 6KRO
+ - Media/System control keys and Fn key are not recognized by the converter
+ - Max firmware size of 28K and a lot of it is taken up by the USB keyboard support, so not all QMK features can be enabled
+ - No mouse or other pointing device support
+- A regular ANSI QWERTY USB Type B keyboard
+
+## Layer Overview
+### Base Layers
+#### 0. [My personal modified QWERTY layout](#chriskopher-qwerty-layout)
+This is the default base layer that is used for most of my typing and where the intermediate layers are stacked onto. It is loaded by default on keyboard power up.
+- Apply this base layer with [Adjust](#adjust-layer) + c , or by powering on the keyboard
+- Swapped CapsLock and LCtrl for ergonomics with often performed LCtrl keyboard shortcuts
+- Swapped \\ and Backspace to minimize hand movement, inspired by the [HHKB](https://happyhackingkb.com/) layout
+- Overloaded modifier keys, inspired by Steve Losh's [A Modern Space Cadet](https://stevelosh.com/blog/2012/10/a-modern-space-cadet/)
+ - Tap LShift for ( , hold for LShift
+ - Tap RShift for ) , hold for RShift
+ - Tap LCtrl for Esc , hold for LCtrl (remember that LCtrl is swapped with CapsLock )
+- Tap Dances that allow different functionality based on the number of key presses within the `TAPPING_TERM` of 200 ms
+ - Extended space cadet shifting:
+ - Two taps of LShift sends { , and three taps send [
+ - Two taps of RShift sends } , and three taps send ]
+ - One tap of ; will send ; , two taps of ; will send :
+- Combos that allow for different functionality based on custom chorded key presses within the `COMBO_TERM` of 20 ms
+ - Press and hold s and d to momentarily activate the [(S)uper(D)uper](#superduper-layer) layer
+ - Press and hold k and l to momentarily activate Meh modifier key
+ - Meh key (Ctrl + Shift + Alt ) is useful for binding unique hotkeys on the OS that won't collide with or override other existing hotkeys
+ - Tap CapsLock for CapsLock , hold CapsLock to momentarily activate Meh modifier key while held (remember that LCtrl is swapped with CapsLock )
+- Tap/Hold actions for layer switching
+ - Similar to the overloaded modifier keys
+ - Tap z for z , hold z to momentarily activate [Dev](#dev-layer) layer while held
+ - Tap RGui for RGui , hold RGui to momentarily activate [Adjust](#adjust-layer) layer while held
+
+```
+,---. ,---------------. ,---------------. ,---------------. ,-----------.
+|Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau|
+`---' `---------------' `---------------' `---------------' `-----------'
+,-----------------------------------------------------------. ,-----------. ,---------------.
+| `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \ | |Ins|Hom|PgU| |NmL| /| *| -|
+|-----------------------------------------------------------| |-----------| |---------------|
+|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| Bsp| |Del|End|PgD| | 7| 8| 9| |
+|-----------------------------------------------------------| `-----------' |-----------| |
+|Ctl/Esc| A| S| D| F| G| H| J| K| L|;/:| ' | Return| | 4| 5| 6| +|
+|-----------------------------------------------------------| ,---. |---------------|
+|Shift/( |Dev/Z| X| C| V| B| N| M| ,| .| /| Shift/)| | ↑ | | 1| 2| 3| |
+|-----------------------------------------------------------| ,-----------. |-----------| |
+|Meh/CapsL|Gui|Alt| Space |Alt|Adjust/Gui|App| Ctl| | ← | ↓ | → | | 0| .|Ent|
+`-----------------------------------------------------------' `-----------' `---------------'
+```
+
+Note: can't use Hyper key (Ctrl + Shift + Alt + Gui ) instead of Meh reliably on Windows 10 because pressing Hyper opens Microsoft Office, Hyper + t opens Microsoft Teams, Hyper + d opens Microsoft OneDrive, Hyper + y Yammer, etc. And I couldn't find a clean way to disable this without needing to modify the host computer.
+
+#### 1. [A regular QWERTY layout](#regular-qwerty-layout)
+This layer is for when other people need to type on my keyboard.
+- Apply this base layer with [Adjust](#adjust-layer) + q
+- The only modification is the addition of the tap/hold action for switching back to the [Adjust](#adjust-layer) layer while held
+ - Tap RGui for RGui , hold RGui to momentarily activate [Adjust](#adjust-layer) layer while held
+
+```
+,---. ,---------------. ,---------------. ,---------------. ,-----------.
+|Esc| |F1 |F2 |F3 |F4 | |F5 |F6 |F7 |F8 | |F9 |F10|F11|F12| |PrS|ScL|Pau|
+`---' `---------------' `---------------' `---------------' `-----------'
+,-----------------------------------------------------------. ,-----------. ,---------------.
+| `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| Bsp| |Ins|Hom|PgU| |NmL| /| *| -|
+|-----------------------------------------------------------| |-----------| |---------------|
+|Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|End|PgD| | 7| 8| 9| |
+|-----------------------------------------------------------| `-----------' |-----------| |
+|CapsL | A| S| D| F| G| H| J| K| L| ;| '| Return| | 4| 5| 6| +|
+|-----------------------------------------------------------| ,---. |---------------|
+|Shift | Z| X| C| V| B| N| M| ,| ,| /|Shift | | ↑ | | 1| 2| 3| |
+|-----------------------------------------------------------| ,-----------. |-----------| |
+|Ctl|Gui|Alt| Space |Alt|Adjust/Gui|App|Ctl| | ← | ↓ | → | | 0| .|Ent|
+`-----------------------------------------------------------' `-----------' `---------------'
+```
+
+### Intermediate Layers
+#### 2. [(S)uper(D)uper Mode](#superduper-layer)
+Inspired by [narze](https://github.com/qmk/qmk_firmware/tree/master/keyboards/planck/keymaps/narze) via [jasonrudolph](https://github.com/jasonrudolph/keyboard#super-duper-mode). It's designed to help with navigation while keeping you on the home row, or very close to it.
+
+- To activate this layer, press s + d simultaneously and hold from the base layer
+ - Alternatively, hold / to activate the layer. This method is slower because the layer toggle uses a `TAPPING_TERM` of 200 ms but s + d uses a `COMBO_TERM` of only 20 ms (can be changed within `config.h`).
+- Use h / j / k / l
+ for ← / ↓ / ↑ / → , respectively
+- Use a for Alt
+- Use f for Backspace
+- Use g for Ctrl
+- Use Space for Shift
+- Use ; for Delete
+- Use i / o to move to the previous/next tab
+- Use u / p to go to the first/last tab (in most apps)
+- Use / to toggle [(S)uper(D)uper](#superduper-layer) layer
+
+```
+,---. ,---------------. ,---------------. ,---------------. ,-----------.
+| | | | | | | | | | | | | | | | | | | | |
+`---' `---------------' `---------------' `---------------' `-----------'
+,-----------------------------------------------------------. ,-----------. ,---------------.
+| | | | | | | | | | | | | | | | | | | | | | | |
+|-----------------------------------------------------------| |-----------| |---------------|
+| | | | | | | |1T |T← |T→ |9T | | | | | | | | | | | | |
+|-----------------------------------------------------------| `-----------' |-----------| |
+| |Alt|[SuperDuper]|Bksp|Ctl| ← | ↓ | ↑ | → |Del| | | | | | | |
+|-----------------------------------------------------------| ,---. |---------------|
+| | | | | | | | | | |ToggleSD| | | | | | | | |
+|-----------------------------------------------------------| ,-----------. |-----------| |
+| | | | Shift | | | | | | | | | | | | |
+`-----------------------------------------------------------' `-----------' `---------------'
+```
+
+#### 3. [Dev](#dev-layer)
+This layer is for easy access to symbols commonly used during development.
+- To activate this layer, press and hold z from the base layer
+- Use u / i / o / p
+ for - / + / ( / ) , respectively
+- Use h / j / k / l / ;
+ for _ / [ / ] / { / } , respectively
+- Use n / m / , / . / /
+ for = / | / < / > / ? , respectively
+
+```
+,---. ,---------------. ,---------------. ,---------------. ,-----------.
+| | | | | | | | | | | | | | | | | | | | |
+`---' `---------------' `---------------' `---------------' `-----------'
+,-----------------------------------------------------------. ,-----------. ,---------------.
+| | | | | | | | | | | | | | | | | | | | | | | |
+|-----------------------------------------------------------| |-----------| |---------------|
+| | | | | | | | - | + | ( | ) | | | | | | | | | | | | |
+|-----------------------------------------------------------| `-----------' |-----------| |
+| | | | | | | _ | [ | ] | { | } | | | | | | | |
+|-----------------------------------------------------------| ,---. |---------------|
+| | | | | | | = | | | < | > | ? | | | | | | | | |
+|-----------------------------------------------------------| ,-----------. |-----------| |
+| | | | | | | | | | | | | | | | |
+`-----------------------------------------------------------' `-----------' `---------------'
+```
+
+### Top Layer
+#### 4. [Adjust](#adjust-layer)
+This layer is applied at the top so that it will override all other layers and as a result it will always be possible to change which base layer is applied as a default. It is also used for media controls.
+- To activate this layer, press and hold RGui from the base layer
+- Switch to [chriskopher modified QWERTY layout](#chriskopher-qwerty-layout) with c
+- Switch to [regular QWERTY layout](#regular-qwerty-layout) with q
+- Use n / m / , / . / /
+ for Play/Pause / Mute / Volume Down / Volume Up / Toggle [(S)uper(D)uper](#superduper-layer) layer, respectively
+- Use Insert / Home / Page Up
+ for Play/Pause / Next Track / Volume Up , respectively
+- Use Delete / End / Page Down
+for Stop / Previous Track / Volume Down , respectively
+
+```
+,---. ,---------------. ,---------------. ,---------------. ,-----------.
+| | | | | | | | | | | | | | | | | | | | |
+`---' `---------------' `---------------' `---------------' `-----------'
+,-----------------------------------------------------------. ,--------------. ,---------------.
+| | | | | | | | | | | | | | | |Play|Next|VolU| | | | | |
+|-----------------------------------------------------------| |--------------| |---------------|
+| |QWERTY| | | | | | | | | | | | | |Stop|Prev|VolD| | | | | |
+|-----------------------------------------------------------| `--------------' |-----------| |
+| | | | | | | | | | | | | | | | | | |
+|-----------------------------------------------------------| ,---. |---------------|
+| | | |CKO| | | |Play|Mute|VolD|VolU| SD| | | | | | | | |
+|-----------------------------------------------------------| ,-----------. |-----------| |
+| | | | | | | | | | | | | | | | |
+`-----------------------------------------------------------' `-----------' `---------------'
+```
+
+## Build Instructions
+To compile and flash the config onto the USB to USB converter:
+```sh
+cd /path/to/qmk_firmware
+qmk config user.keyboard=converter/usb_usb/hasu
+qmk config user.keymap=chriskopher
+qmk compile
+qmk flash
+```
+
+Alternatively:
+```sh
+cd /path/to/qmk_firmware
+qmk compile -kb converter/usb_usb/hasu -km chriskopher
+qmk flash -kb converter/usb_usb/hasu -km chriskopher
+```
+
+To modify the config:
+```sh
+cd /path/to/qmk_firmware/keyboards/converter/usb_usb/keymaps/chriskopher
+```
+and edit `keymap.c`, `config.h`, and `rules.mk`.
diff --git a/keyboards/converter/usb_usb/keymaps/chriskopher/rules.mk b/keyboards/converter/usb_usb/keymaps/chriskopher/rules.mk
new file mode 100644
index 00000000000..d80022853b1
--- /dev/null
+++ b/keyboards/converter/usb_usb/keymaps/chriskopher/rules.mk
@@ -0,0 +1,24 @@
+# Copyright 2020 Christopher Ko
+#
+# 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 .
+
+COMMAND_ENABLE = no # Not being used, and can cause conflicts with space cadet shifting
+SPACE_CADET_ENABLE = no # Not using special built in space cadet keys, using custom tap dance instead
+EXTRAKEY_ENABLE = yes # Used for audio control and system control keys
+COMBO_ENABLE = yes # Used to allow chording of keys to trigger an action
+TAP_DANCE_ENABLE = yes # Used to allow multiple taps of a key to perform different actions
+
+LINK_TIME_OPTIMIZATION_ENABLE = yes # Reduces the compiled firmware size
+
+SRC += combo.c tap_dance.c
diff --git a/keyboards/converter/usb_usb/keymaps/chriskopher/shared_enum.h b/keyboards/converter/usb_usb/keymaps/chriskopher/shared_enum.h
new file mode 100644
index 00000000000..f83bfa3c490
--- /dev/null
+++ b/keyboards/converter/usb_usb/keymaps/chriskopher/shared_enum.h
@@ -0,0 +1,36 @@
+/* Copyright 2020 Christopher Ko
+ *
+ * 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 .
+ */
+
+#pragma once
+
+enum keyboard_layer {
+ // Base layers
+ _CKO,
+ _QWERTY,
+ // Intermediate layers
+ _SUPERDUPER,
+ _DEV,
+ // Adjust layer at the end
+ _ADJUST
+};
+
+enum tap_dance_key_event {
+ // Extended space cadet shift tap dance
+ ESPC_L,
+ ESPC_R,
+ // Semicolon-Colon tap dance
+ SCLN_CLN
+};
diff --git a/keyboards/converter/usb_usb/keymaps/chriskopher/tap_dance.c b/keyboards/converter/usb_usb/keymaps/chriskopher/tap_dance.c
new file mode 100644
index 00000000000..8600d839968
--- /dev/null
+++ b/keyboards/converter/usb_usb/keymaps/chriskopher/tap_dance.c
@@ -0,0 +1,164 @@
+/* Copyright 2020 Christopher Ko
+ *
+ * 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 .
+ */
+
+#include "shared_enum.h"
+
+#include "quantum.h"
+
+enum tap_dance_state {
+ SINGLE_HOLD = 1,
+ SINGLE_TAP,
+ DOUBLE_TAP,
+ TRIPLE_TAP,
+};
+
+// Record current state of a tap dance
+static int espc_l_tap_state = 0;
+static int espc_r_tap_state = 0;
+static int scln_cln_tap_state = 0;
+
+// Watch the state of the tap dance
+int cur_dance(qk_tap_dance_state_t *state) {
+ if (state->pressed) {
+ return SINGLE_HOLD;
+ }
+ if (state->count == 1) {
+ return SINGLE_TAP;
+ }
+ if (state->count == 2) {
+ return DOUBLE_TAP;
+ }
+ if (state->count == 3) {
+ return TRIPLE_TAP;
+ }
+
+ return -1;
+}
+
+// Extended Space Cadet Shift - Left ==================================
+void espc_l_finished(qk_tap_dance_state_t *state, void *user_data) {
+ espc_l_tap_state = cur_dance(state);
+ switch (espc_l_tap_state) {
+ case SINGLE_TAP: // (
+ register_code16(LSFT(KC_9));
+ break;
+ case DOUBLE_TAP: // {
+ unregister_code16(LSFT(KC_9));
+ register_code16(LSFT(KC_LBRC));
+ break;
+ case TRIPLE_TAP: // [
+ unregister_code16(LSFT(KC_LBRC));
+ register_code16(KC_LBRC);
+ break;
+ case SINGLE_HOLD: // LShift
+ register_code16(KC_LSFT);
+ break;
+ }
+}
+
+void espc_l_reset(qk_tap_dance_state_t *state, void *user_data) {
+ switch (espc_l_tap_state) {
+ case SINGLE_TAP: // (
+ unregister_code16(LSFT(KC_9));
+ break;
+ case DOUBLE_TAP: // {
+ unregister_code16(LSFT(KC_LBRC));
+ break;
+ case TRIPLE_TAP: // [
+ unregister_code16(KC_LBRC);
+ break;
+ case SINGLE_HOLD: // LShift
+ unregister_code16(KC_LSFT);
+ break;
+ }
+ espc_l_tap_state = 0;
+}
+// ====================================================================//
+
+// Extended Space Cadet Shift - Right ==================================
+void espc_r_finished(qk_tap_dance_state_t *state, void *user_data) {
+ espc_r_tap_state = cur_dance(state);
+ switch (espc_r_tap_state) {
+ case SINGLE_TAP: // )
+ register_code16(LSFT(KC_0));
+ break;
+ case DOUBLE_TAP: // }
+ unregister_code16(LSFT(KC_0));
+ register_code16(LSFT(KC_RBRC));
+ break;
+ case TRIPLE_TAP: // ]
+ unregister_code16(LSFT(KC_RBRC));
+ register_code16(KC_RBRC);
+ break;
+ case SINGLE_HOLD: // RShift
+ register_code16(KC_RSFT);
+ break;
+ }
+}
+
+void espc_r_reset(qk_tap_dance_state_t *state, void *user_data) {
+ switch (espc_r_tap_state) {
+ case SINGLE_TAP: // )
+ unregister_code16(LSFT(KC_0));
+ break;
+ case DOUBLE_TAP: // }
+ unregister_code16(LSFT(KC_RBRC));
+ break;
+ case TRIPLE_TAP: // ]
+ unregister_code16(KC_RBRC);
+ break;
+ case SINGLE_HOLD: // RShift
+ unregister_code16(KC_RSFT);
+ break;
+ }
+ espc_r_tap_state = 0;
+}
+// ====================================================================//
+
+// Semicolon - Colon ==================================================
+void scln_cln_finished(qk_tap_dance_state_t *state, void *user_data) {
+ scln_cln_tap_state = cur_dance(state);
+ switch (scln_cln_tap_state) {
+ case SINGLE_TAP: // ;
+ register_code16(KC_SCLN);
+ break;
+ default: // :
+ register_code16(LSFT(KC_SCLN));
+ break;
+ }
+}
+
+void scln_cln_reset(qk_tap_dance_state_t *state, void *user_data) {
+ switch (scln_cln_tap_state) {
+ case SINGLE_TAP: // ;
+ unregister_code16(KC_SCLN);
+ break;
+ default: // :
+ unregister_code16(LSFT(KC_SCLN));
+ break;
+ }
+}
+// ====================================================================//
+
+// Associate tap dance with defined functionality
+qk_tap_dance_action_t tap_dance_actions[] = {
+ // Extended space cadet shift left: Hold - Shift, One - (, Two - {, Three - [
+ [ESPC_L] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, espc_l_finished, espc_l_reset),
+ // Extended space cadet shift right: Hold - Shift, One - ), Two - }, Three - ]
+ [ESPC_R] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, espc_r_finished, espc_r_reset),
+ // Semicolon - Colon: One - ;, Two - :
+ [SCLN_CLN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, scln_cln_finished, scln_cln_reset),
+};
diff --git a/keyboards/coseyfannitutti/discipad/config.h b/keyboards/coseyfannitutti/discipad/config.h
index 55033bd9d06..34776fcbdd6 100644
--- a/keyboards/coseyfannitutti/discipad/config.h
+++ b/keyboards/coseyfannitutti/discipad/config.h
@@ -19,7 +19,7 @@ along with this program. If not, see .
#include "config_common.h"
-#define VENDOR_ID 0xFEED
+#define VENDOR_ID 0x6B62
#define PRODUCT_ID 0x1769
#define DEVICE_VER 0x0001
#define MANUFACTURER coseyfannitutti
@@ -243,7 +243,7 @@ along with this program. If not, see .
#endif
*/
-/* Bootmagic Lite key configuration
+/* Bootmagic Lite key configuration */
#define BOOTMAGIC_LITE_ROW 0
#define BOOTMAGIC_LITE_COLUMN 0
-*/
+
diff --git a/keyboards/coseyfannitutti/discipad/keymaps/via/keymap.c b/keyboards/coseyfannitutti/discipad/keymaps/via/keymap.c
new file mode 100644
index 00000000000..d47c2ce75c5
--- /dev/null
+++ b/keyboards/coseyfannitutti/discipad/keymaps/via/keymap.c
@@ -0,0 +1,43 @@
+/* Copyright 2019 COSEYFANNITUTTI
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_numpad_5x4(
+ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_P1, KC_P2, KC_P3,
+ KC_P0, KC_PDOT, KC_PENT ),
+ [1] = LAYOUT_numpad_5x4(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS ),
+ [2] = LAYOUT_numpad_5x4(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS ),
+ [3] = LAYOUT_numpad_5x4(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS ),
+};
diff --git a/keyboards/coseyfannitutti/discipad/keymaps/via/rules.mk b/keyboards/coseyfannitutti/discipad/keymaps/via/rules.mk
new file mode 100644
index 00000000000..00c11acccda
--- /dev/null
+++ b/keyboards/coseyfannitutti/discipad/keymaps/via/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+EXTRAKEY_ENABLE = no
+MOUSEKEY_ENABLE = no
diff --git a/keyboards/coseyfannitutti/discipad/usbconfig.h b/keyboards/coseyfannitutti/discipad/usbconfig.h
deleted file mode 100644
index 510658b447a..00000000000
--- a/keyboards/coseyfannitutti/discipad/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 0
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'c','o','s','e','y','f','a','n','n','i','t','u','t','t','i'
-#define USB_CFG_VENDOR_NAME_LEN 15
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'D','I','S','C','I','P','A','D'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-#define USB_CFG_SERIAL_NUMBER '0'
-#define USB_CFG_SERIAL_NUMBER_LEN 1
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-// #define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-// /* #define USB_INTR_CFG_CLR 0 */
-// /* #define USB_INTR_ENABLE EIMSK */
-// #define USB_INTR_ENABLE_BIT INT1
-// /* #define USB_INTR_PENDING EIFR */
-// #define USB_INTR_PENDING_BIT INTF1
-// #define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/coseyfannitutti/discipline/config.h b/keyboards/coseyfannitutti/discipline/config.h
index 0a005ab0ddc..5d243090804 100644
--- a/keyboards/coseyfannitutti/discipline/config.h
+++ b/keyboards/coseyfannitutti/discipline/config.h
@@ -18,7 +18,7 @@ along with this program. If not, see .
#include "config_common.h"
-#define VENDOR_ID 0xFEED
+#define VENDOR_ID 0x6B62
#define PRODUCT_ID 0x6869
#define DEVICE_VER 0x0001
#define MANUFACTURER coseyfannitutti
diff --git a/keyboards/coseyfannitutti/discipline/discipline.h b/keyboards/coseyfannitutti/discipline/discipline.h
index 1703a61284d..3369d7efb41 100644
--- a/keyboards/coseyfannitutti/discipline/discipline.h
+++ b/keyboards/coseyfannitutti/discipline/discipline.h
@@ -76,3 +76,58 @@
{ K40, _x_, K42, _x_, _x_, _x_, K46, _x_, _x_, K49, K4A, K4B, K4C, K4D, K4E} \
}
+#define LAYOUT_65_iso( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, K1D, K2E, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \
+ K40, K41, K42, K46, K49, K4A, K4B, K4C, K4D, K4E \
+) { \
+{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \
+{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \
+{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, _x_, K2D, K2E }, \
+{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \
+{ K40, K41, K42, _x_, _x_, _x_, K46, _x_, _x_, K49, K4A, K4B, K4C, K4D, K4E} \
+}
+
+#define LAYOUT_65_iso_2_right_mods( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, K1D, K2E, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \
+ K40, K41, K42, K46, K49, K4A, K4C, K4D, K4E \
+) { \
+{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \
+{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \
+{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, _x_, K2D, K2E }, \
+{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \
+{ K40, K41, K42, _x_, _x_, _x_, K46, _x_, _x_, K49, K4A, _x_, K4C, K4D, K4E} \
+}
+
+#define LAYOUT_wkl_iso_2_right_mods( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, K1D, K2E, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \
+ K40, K42, K46, K49, K4A, K4C, K4D, K4E \
+) { \
+{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \
+{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \
+{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, _x_, K2D, K2E }, \
+{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \
+{ K40, _x_, K42, _x_, _x_, _x_, K46, _x_, _x_, K49, K4A, _x_, K4C, K4D, K4E} \
+}
+
+#define LAYOUT_wkl_iso_3_right_mods( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, K1D, K2E, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \
+ K40, K42, K46, K49, K4A, K4B, K4C, K4D, K4E \
+) { \
+{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \
+{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \
+{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, _x_, K2D, K2E }, \
+{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \
+{ K40, _x_, K42, _x_, _x_, _x_, K46, _x_, _x_, K49, K4A, K4B, K4C, K4D, K4E} \
+}
diff --git a/keyboards/coseyfannitutti/discipline/info.json b/keyboards/coseyfannitutti/discipline/info.json
index 522e8006789..80828982412 100644
--- a/keyboards/coseyfannitutti/discipline/info.json
+++ b/keyboards/coseyfannitutti/discipline/info.json
@@ -16,6 +16,18 @@
},
"LAYOUT_wkl_ansi_3_right_mods": {
"layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"~", "x":15, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Delete", "x":15, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"PgUp", "x":15, "y":2}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"\u2191", "x":14, "y":3}, {"label":"PgDn", "x":15, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.5}, {"label":"Alt", "x":1.5, "y":4, "w":1.5}, {"x":3, "y":4, "w":7}, {"label":"Alt", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Ctrl", "x":12, "y":4}, {"label":"\u2190", "x":13, "y":4}, {"label":"\u2193", "x":14, "y":4}, {"label":"\u2192", "x":15, "y":4}]
+ },
+ "LAYOUT_65_iso": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2}, {"x":13.75, "y":1, "w":1.25, "h":2}, {"x":15, "y":2}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}]
+ },
+ "LAYOUT_65_iso_2_right_mods": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2}, {"x":13.75, "y":1, "w":1.25, "h":2}, {"x":15, "y":2}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.5}, {"x":11.5, "y":4, "w":1.5}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}]
+ },
+ "LAYOUT_wkl_iso_2_right_mods": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2}, {"x":13.75, "y":1, "w":1.25, "h":2}, {"x":15, "y":2}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.5}, {"x":1.5, "y":4, "w":1.5}, {"x":3, "y":4, "w":7}, {"x":10, "y":4, "w":1.5}, {"x":11.5, "y":4, "w":1.5}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}]
+ },
+ "LAYOUT_wkl_iso_3_right_mods": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2}, {"x":13.75, "y":1, "w":1.25, "h":2}, {"x":15, "y":2}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.5}, {"x":1.5, "y":4, "w":1.5}, {"x":3, "y":4, "w":7}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}]
}
}
}
diff --git a/keyboards/coseyfannitutti/discipline/keymaps/67_ansi/keymap.c b/keyboards/coseyfannitutti/discipline/keymaps/67_ansi/keymap.c
deleted file mode 100644
index 34410d54af9..00000000000
--- a/keyboards/coseyfannitutti/discipline/keymaps/67_ansi/keymap.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Copyright 2019 COSEYFANNITUTTI
- *
- * 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 .
- */
-#include QMK_KEYBOARD_H
-
-#define _BL 0
-#define _FL 1
-
- /* Qwerty
- * .---------------------------------------------------------------------------------------------.
- * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | Ins |
- * |---------------------------------------------------------------------------------------------+
- * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | Del |
- * |---------------------------------------------------------------------------------------------+
- * | Caps | A | S | D | F | G | H | J | K | L | ; | ' | Enter | PgUp|
- * |---------------------------------------------------------------------------------------------+
- * | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | U | Pgdn|
- * |---------------------------------------------------------------------------------------------+
- * | Ctrl | Win | Alt | Space | RAlt | FN ||||||| L | D | R |
- * '---------------------------------------------------------------------------------------------'
- */
-
- /* FnLayer
- * .---------------------------------------------------------------------------------------------.
- * | ` ~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DELETE |PNTSC|
- * |---------------------------------------------------------------------------------------------+
- * | Tab | | | |RESET| | | | | | |PAUSE| | \ | |
- * |---------------------------------------------------------------------------------------------+
- * | Caps | | | | | | | | | | | INS | Enter | HOME|
- * |---------------------------------------------------------------------------------------------+
- * | Shift | | | | | | | | | | | Shift |VOLUP| END |
- * |---------------------------------------------------------------------------------------------+
- * | Ctrl | Win | Alt | | RAlt| FN ||||||| L |VOLDN| R |
- * '---------------------------------------------------------------------------------------------'
- */
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [_BL] = LAYOUT_65_ansi_2_right_mods(
- KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV,
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
- KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_LEFT, KC_DOWN, KC_RIGHT),
-
- [_FL] = LAYOUT_65_ansi_2_right_mods(
- /* esc 1 2 3 4 5 6 7 8 9 0 - = bkspc `~ */
- KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR,
- /* tab Q W E R T Y U I O P [ ] \ delete*/
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_INS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS, KC_TRNS, KC_TRNS,
- /* caps A S D F G H J K L ; ' enter pg up*/
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME,
- /* shift Z X C V B N M , . / shift up pg dn*/
- KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_RSFT, KC_VOLU, KC_END,
- /* ctrl win alt space alt fn ctrl left down right*/
- KC_LCTL, KC_LGUI, KC_LALT, KC_TRNS, KC_RALT, KC_TRNS, KC_TRNS, KC_VOLD, KC_TRNS)
-};
diff --git a/keyboards/coseyfannitutti/discipline/keymaps/coseyfannitutti/keymap.c b/keyboards/coseyfannitutti/discipline/keymaps/coseyfannitutti/keymap.c
deleted file mode 100644
index cb14d23f103..00000000000
--- a/keyboards/coseyfannitutti/discipline/keymaps/coseyfannitutti/keymap.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/* Copyright 2019 COSEYFANNITUTTI
- *
- * 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 .
- */
-#include QMK_KEYBOARD_H
-
-#define _BL 0
-#define _FL 1
-
- /* Qwerty
- * .---------------------------------------------------------------------------------------------.
- * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | Ins |
- * |---------------------------------------------------------------------------------------------+
- * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | Del |
- * |---------------------------------------------------------------------------------------------+
- * | Caps | A | S | D | F | G | H | J | K | L | ; | ' | Enter | PgUp|
- * |---------------------------------------------------------------------------------------------+
- * | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | U | Pgdn|
- * |---------------------------------------------------------------------------------------------+
- * | Ctrl | Win | Alt | Space | RAlt | FN ||||||| L | D | R |
- * '---------------------------------------------------------------------------------------------'
- */
-
- /* FnLayer
- * .---------------------------------------------------------------------------------------------.
- * | ` ~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DELETE |PNTSC|
- * |---------------------------------------------------------------------------------------------+
- * | Tab | | | |RESET| | | | | | |PAUSE| | \ | |
- * |---------------------------------------------------------------------------------------------+
- * | Caps | | | | | | | | | | | INS | Enter | HOME|
- * |---------------------------------------------------------------------------------------------+
- * | Shift | | | | | | | | | | | Shift |VOLUP| END |
- * |---------------------------------------------------------------------------------------------+
- * | Ctrl | Win | Alt | | RAlt| FN ||||||| L |VOLDN| R |
- * '---------------------------------------------------------------------------------------------'
- */
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [_BL] = LAYOUT_65_ansi_2_right_mods(
- KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
- KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(_FL),
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_LEFT, KC_DOWN, KC_RIGHT),
-
- [_FL] = LAYOUT_65_ansi_2_right_mods(
- /* esc 1 2 3 4 5 6 7 8 9 0 - = bkspc `~ */
- KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR,
- /* tab Q W E R T Y U I O P [ ] \ delete*/
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_INS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS, KC_TRNS, KC_TRNS,
- /* caps A S D F G H J K L ; ' enter pg up*/
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME,
- /* shift Z X C V B N M , . / shift up pg dn*/
- KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_RSFT, KC_VOLU, KC_END,
- /* ctrl win alt space alt fn left down right*/
- KC_LCTL, KC_LGUI, KC_LALT, KC_TRNS, KC_RALT, KC_TRNS, KC_TRNS, KC_VOLD, KC_TRNS)
-};
-
diff --git a/keyboards/coseyfannitutti/discipline/keymaps/default/keymap.c b/keyboards/coseyfannitutti/discipline/keymaps/default/keymap.c
index da433c1a6b3..1fdfce67eae 100644
--- a/keyboards/coseyfannitutti/discipline/keymaps/default/keymap.c
+++ b/keyboards/coseyfannitutti/discipline/keymaps/default/keymap.c
@@ -15,46 +15,15 @@
*/
#include QMK_KEYBOARD_H
-#define _BL 0
-#define _FL 1
-
- /* Qwerty
- * .---------------------------------------------------------------------------------------------.
- * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | Ins |
- * |---------------------------------------------------------------------------------------------+
- * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | Del |
- * |---------------------------------------------------------------------------------------------+
- * | Caps | A | S | D | F | G | H | J | K | L | ; | ' | Enter | PgUp|
- * |---------------------------------------------------------------------------------------------+
- * | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | U | Pgdn|
- * |---------------------------------------------------------------------------------------------+
- * | Ctrl | Win | Alt | Space | RAlt | FN |RCtrl| L | D | R |
- * '---------------------------------------------------------------------------------------------'
- */
-
- /* FnLayer
- * .---------------------------------------------------------------------------------------------.
- * | ` ~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DELETE |PNTSC|
- * |---------------------------------------------------------------------------------------------+
- * | Tab | | | |RESET| | | | | | |PAUSE| | \ | |
- * |---------------------------------------------------------------------------------------------+
- * | Caps | | | | | | | | | | | INS | Enter | HOME|
- * |---------------------------------------------------------------------------------------------+
- * | Shift | | | | | | | | | | | Shift |VOLUP| END |
- * |---------------------------------------------------------------------------------------------+
- * | Ctrl | Win | Alt | | RAlt| FN |RCtrl| L |VOLDN| R |
- * '---------------------------------------------------------------------------------------------'
- */
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [_BL] = LAYOUT_65_ansi(
+ [0] = LAYOUT_65_ansi(
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
- [_FL] = LAYOUT_65_ansi(
+ [1] = LAYOUT_65_ansi(
/* esc 1 2 3 4 5 6 7 8 9 0 - = bkspc `~ */
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR,
/* tab Q W E R T Y U I O P [ ] \ delete*/
diff --git a/keyboards/coseyfannitutti/discipline/keymaps/iso/keymap.c b/keyboards/coseyfannitutti/discipline/keymaps/iso/keymap.c
new file mode 100644
index 00000000000..7f4c2403781
--- /dev/null
+++ b/keyboards/coseyfannitutti/discipline/keymaps/iso/keymap.c
@@ -0,0 +1,37 @@
+/* Copyright 2019 COSEYFANNITUTTI
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_65_iso(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+ [1] = LAYOUT_65_iso(
+ /* esc 1 2 3 4 5 6 7 8 9 0 - = bkspc `~ */
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR,
+ /* tab Q W E R T Y U I O P [ ] delete*/
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_INS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS, KC_TRNS,
+ /* caps A S D F G H J K L ; ' # enter pg up*/
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_HOME,
+ /* shift \ Z X C V B N M , . / shift up pg dn*/
+ KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_RSFT, KC_VOLU, KC_END,
+ /* ctrl win alt space alt fn ctrl left down right*/
+ KC_LCTL, KC_LGUI, KC_LALT, KC_TRNS, KC_RALT, KC_TRNS, KC_RCTL, KC_TRNS, KC_VOLD, KC_TRNS)
+};
diff --git a/keyboards/coseyfannitutti/discipline/keymaps/via/keymap.c b/keyboards/coseyfannitutti/discipline/keymaps/via/keymap.c
new file mode 100644
index 00000000000..365b06dbf0c
--- /dev/null
+++ b/keyboards/coseyfannitutti/discipline/keymaps/via/keymap.c
@@ -0,0 +1,61 @@
+/* Copyright 2019 COSEYFANNITUTTI
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_65_iso(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_BSLS, KC_PGUP,
+ KC_LSFT, KC_TRNS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+ [1] = LAYOUT_65_iso(
+ /* esc 1 2 3 4 5 6 7 8 9 0 - = bkspc `~ */
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR,
+ /* tab Q W E R T Y U I O P [ ] \ delete*/
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_INS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS, KC_TRNS,
+ /* caps A S D F G H J K L ; ' enter pg up*/
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_HOME,
+ /* shift Z X C V B N M , . / shift up pg dn*/
+ KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_RSFT, KC_VOLU, KC_END,
+ /* ctrl win alt space alt fn ctrl left down right*/
+ KC_LCTL, KC_LGUI, KC_LALT, KC_TRNS, KC_RALT, KC_TRNS, KC_RCTL, KC_TRNS, KC_VOLD, KC_TRNS),
+
+ [2] = LAYOUT_65_iso(
+ /* esc 1 2 3 4 5 6 7 8 9 0 - = bkspc `~ */
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /* tab Q W E R T Y U I O P [ ] \ delete*/
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS, KC_TRNS,
+ /* caps A S D F G H J K L ; ' enter pg up*/
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /* shift Z X C V B N M , . / shift up pg dn*/
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /* ctrl win alt space alt fn ctrl left down right*/
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [3] = LAYOUT_65_iso(
+ /* esc 1 2 3 4 5 6 7 8 9 0 - = bkspc `~ */
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /* tab Q W E R T Y U I O P [ ] \ delete*/
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS, KC_TRNS,
+ /* caps A S D F G H J K L ; ' enter pg up*/
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /* shift Z X C V B N M , . / shift up pg dn*/
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ /* ctrl win alt space alt fn ctrl left down right*/
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
+};
diff --git a/keyboards/coseyfannitutti/discipline/keymaps/via/rules.mk b/keyboards/coseyfannitutti/discipline/keymaps/via/rules.mk
new file mode 100644
index 00000000000..d0e4977b849
--- /dev/null
+++ b/keyboards/coseyfannitutti/discipline/keymaps/via/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+EXTRAKEY_ENABLE = no
+MOUSEKEY_ENABLE = no
\ No newline at end of file
diff --git a/keyboards/coseyfannitutti/discipline/keymaps/wkl_ansi_2_right_mods/keymap.c b/keyboards/coseyfannitutti/discipline/keymaps/wkl_ansi_2_right_mods/keymap.c
deleted file mode 100644
index 01b1e21f110..00000000000
--- a/keyboards/coseyfannitutti/discipline/keymaps/wkl_ansi_2_right_mods/keymap.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Copyright 2019 COSEYFANNITUTTI
- *
- * 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 .
- */
-#include QMK_KEYBOARD_H
-
-#define _BL 0
-#define _FL 1
-
- /* Qwerty
- * .---------------------------------------------------------------------------------------------.
- * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | Ins |
- * |---------------------------------------------------------------------------------------------+
- * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | Del |
- * |---------------------------------------------------------------------------------------------+
- * | Caps | A | S | D | F | G | H | J | K | L | ; | ' | Enter | PgUp|
- * |---------------------------------------------------------------------------------------------+
- * | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | U | Pgdn|
- * |---------------------------------------------------------------------------------------------+
- * | Ctrl | Alt | Space | RAlt | FN | L | D | R |
- * '---------------------------------------------------------------------------------------------'
- */
-
- /* FnLayer
- * .---------------------------------------------------------------------------------------------.
- * | ` ~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DELETE |PNTSC|
- * |---------------------------------------------------------------------------------------------+
- * | Tab | | | |RESET| | | | | | |PAUSE| | \ | |
- * |---------------------------------------------------------------------------------------------+
- * | Caps | | | | | | | | | | | INS | Enter | HOME|
- * |---------------------------------------------------------------------------------------------+
- * | Shift | | | | | | | | | | | Shift |VOLUP| END |
- * |---------------------------------------------------------------------------------------------+
- * | Ctrl | Alt | | RAlt | FN | L |VOLDN| R |
- * '---------------------------------------------------------------------------------------------'
- */
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [_BL] = LAYOUT_wkl_ansi_2_right_mods(
- KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV,
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
- KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
- KC_LCTL, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_LEFT, KC_DOWN, KC_RIGHT),
-
- [_FL] = LAYOUT_wkl_ansi_2_right_mods(
- /* esc 1 2 3 4 5 6 7 8 9 0 - = bkspc `~ */
- KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR,
- /* tab Q W E R T Y U I O P [ ] \ delete*/
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_INS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS, KC_TRNS, KC_TRNS,
- /* caps A S D F G H J K L ; ' enter pg up*/
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME,
- /* shift Z X C V B N M , . / shift up pg dn*/
- KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_RSFT, KC_VOLU, KC_END,
- /* ctrl alt space alt fn left down right*/
- KC_LCTL, KC_LALT, KC_TRNS, KC_RALT, KC_TRNS, KC_TRNS, KC_VOLD, KC_TRNS)
-};
diff --git a/keyboards/coseyfannitutti/discipline/keymaps/wkl_ansi_3_right_mods/keymap.c b/keyboards/coseyfannitutti/discipline/keymaps/wkl_ansi_3_right_mods/keymap.c
deleted file mode 100644
index 05f8810e6cf..00000000000
--- a/keyboards/coseyfannitutti/discipline/keymaps/wkl_ansi_3_right_mods/keymap.c
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Copyright 2019 COSEYFANNITUTTI
- *
- * 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 .
- */
-#include QMK_KEYBOARD_H
-
-#define _BL 0
-#define _FL 1
-
- /* Qwerty
- * .---------------------------------------------------------------------------------------------.
- * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Bkspc | Ins |
- * |---------------------------------------------------------------------------------------------+
- * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | Del |
- * |---------------------------------------------------------------------------------------------+
- * | Caps | A | S | D | F | G | H | J | K | L | ; | ' | Enter | PgUp|
- * |---------------------------------------------------------------------------------------------+
- * | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | U | Pgdn|
- * |---------------------------------------------------------------------------------------------+
- * | Ctrl | Alt | Space | RAlt | FN |RCtrl| L | D | R |
- * '---------------------------------------------------------------------------------------------'
- */
-
- /* FnLayer
- * .---------------------------------------------------------------------------------------------.
- * | ` ~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DELETE |PNTSC|
- * |---------------------------------------------------------------------------------------------+
- * | Tab |STATC|BRTHE|RNBOW|RESET| | | | | | |PAUSE| | \ | |
- * |---------------------------------------------------------------------------------------------+
- * | Caps |RGBH+|RGBS+|RGBB+| | | | | | | | INS | Enter | HOME|
- * |---------------------------------------------------------------------------------------------+
- * | Shift |RGBH-|RGBS-|RGBB-| | | | |RGBM-|RGBM+|RGBTG| Shift |VOLUP| END |
- * |---------------------------------------------------------------------------------------------+
- * | Ctrl | Alt | | RAlt| FN |RCtrl| L |VOLDN| R |
- * '---------------------------------------------------------------------------------------------'
- */
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [_BL] = LAYOUT_wkl_ansi_3_right_mods(
- KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV,
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
- KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
- KC_LCTL, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
-
- [_FL] = LAYOUT_wkl_ansi_3_right_mods(
- /* esc 1 2 3 4 5 6 7 8 9 0 - = bkspc `~ */
- KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR,
- /* tab Q W E R T Y U I O P [ ] \ delete*/
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_INS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PAUS, KC_TRNS, KC_TRNS,
- /* caps A S D F G H J K L ; ' enter pg up*/
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_HOME,
- /* shift Z X C V B N M , . / shift up pg dn*/
- KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_RSFT, KC_VOLU, KC_END,
- /* ctrl alt space alt fn ctrl left down right*/
- KC_LCTL, KC_LALT, KC_TRNS, KC_RALT, KC_TRNS, KC_RCTL, KC_TRNS, KC_VOLD, KC_TRNS)
-};
diff --git a/keyboards/coseyfannitutti/discipline/rules.mk b/keyboards/coseyfannitutti/discipline/rules.mk
index ce71857a949..33a0b07ddfb 100644
--- a/keyboards/coseyfannitutti/discipline/rules.mk
+++ b/keyboards/coseyfannitutti/discipline/rules.mk
@@ -38,4 +38,4 @@ AUDIO_ENABLE = no # Audio output on port C6
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
-LAYOUTS = 65_ansi
+LAYOUTS = 65_ansi 65_iso
diff --git a/keyboards/coseyfannitutti/discipline/usbconfig.h b/keyboards/coseyfannitutti/discipline/usbconfig.h
deleted file mode 100644
index da3ed46079a..00000000000
--- a/keyboards/coseyfannitutti/discipline/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 0
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'c','o','s','e','y','f','a','n','n','i','t','u','t','t','i'
-#define USB_CFG_VENDOR_NAME_LEN 15
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'D','I','S','C','I','P','L','I','N','E'
-#define USB_CFG_DEVICE_NAME_LEN 10
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-#define USB_CFG_SERIAL_NUMBER '0'
-#define USB_CFG_SERIAL_NUMBER_LEN 1
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-// #define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-// /* #define USB_INTR_CFG_CLR 0 */
-// /* #define USB_INTR_ENABLE EIMSK */
-// #define USB_INTR_ENABLE_BIT INT1
-// /* #define USB_INTR_PENDING EIFR */
-// #define USB_INTR_PENDING_BIT INTF1
-// #define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/coseyfannitutti/mysterium/config.h b/keyboards/coseyfannitutti/mysterium/config.h
index 1d0094b8b88..968794da99e 100644
--- a/keyboards/coseyfannitutti/mysterium/config.h
+++ b/keyboards/coseyfannitutti/mysterium/config.h
@@ -18,7 +18,7 @@ along with this program. If not, see .
#include "config_common.h"
-#define VENDOR_ID 0xFEED
+#define VENDOR_ID 0x6B62
#define PRODUCT_ID 0x8769
#define DEVICE_VER 0x0001
#define MANUFACTURER coseyfannitutti
@@ -237,4 +237,8 @@ along with this program. If not, see .
#define LCD_E_PORT LCD_PORT //< port for Enable line
#define LCD_E_PIN 1 //< pin for Enable line
#endif
-*/
\ No newline at end of file
+*/
+
+/* Bootmagic Lite key configuration */
+#define BOOTMAGIC_LITE_ROW 0
+#define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/coseyfannitutti/mysterium/keymaps/via/keymap.c b/keyboards/coseyfannitutti/mysterium/keymaps/via/keymap.c
new file mode 100644
index 00000000000..bd8de69a04a
--- /dev/null
+++ b/keyboards/coseyfannitutti/mysterium/keymaps/via/keymap.c
@@ -0,0 +1,50 @@
+/* Copyright 2019 COSEYFANNITUTTI
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_tkl_ansi(
+ KC_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+ [1] = LAYOUT_tkl_ansi(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_TRNS),
+
+ [2] = LAYOUT_tkl_ansi(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [3] = LAYOUT_tkl_ansi(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
+};
diff --git a/keyboards/coseyfannitutti/mysterium/keymaps/via/rules.mk b/keyboards/coseyfannitutti/mysterium/keymaps/via/rules.mk
new file mode 100644
index 00000000000..d0e4977b849
--- /dev/null
+++ b/keyboards/coseyfannitutti/mysterium/keymaps/via/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+EXTRAKEY_ENABLE = no
+MOUSEKEY_ENABLE = no
\ No newline at end of file
diff --git a/keyboards/coseyfannitutti/mysterium/usbconfig.h b/keyboards/coseyfannitutti/mysterium/usbconfig.h
deleted file mode 100644
index 809b9124568..00000000000
--- a/keyboards/coseyfannitutti/mysterium/usbconfig.h
+++ /dev/null
@@ -1,384 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-// max power draw with maxed white underglow measured at 120 mA (peaks)
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 0
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'c','o','s','e','y','f','a','n','n','i','t','u','t','t','i'
-#define USB_CFG_VENDOR_NAME_LEN 15
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'M','Y','S','T','E','R','I','U','M'
-#define USB_CFG_DEVICE_NAME_LEN 9
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-#define USB_CFG_SERIAL_NUMBER '0'
-#define USB_CFG_SERIAL_NUMBER_LEN 1
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-// #define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-// /* #define USB_INTR_CFG_CLR 0 */
-// /* #define USB_INTR_ENABLE EIMSK */
-// #define USB_INTR_ENABLE_BIT INT1
-// /* #define USB_INTR_PENDING EIFR */
-// #define USB_INTR_PENDING_BIT INTF1
-// #define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/coseyfannitutti/romeo/config.h b/keyboards/coseyfannitutti/romeo/config.h
index aa54ce250d6..49226ebfaf7 100644
--- a/keyboards/coseyfannitutti/romeo/config.h
+++ b/keyboards/coseyfannitutti/romeo/config.h
@@ -19,7 +19,7 @@ along with this program. If not, see .
#include "config_common.h"
-#define VENDOR_ID 0xFEED
+#define VENDOR_ID 0x6B62
#define PRODUCT_ID 0x4069
#define DEVICE_VER 0x0001
#define MANUFACTURER coseyfannitutti
@@ -50,8 +50,6 @@ along with this program. If not, see .
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
-#define NO_UART 1
-
/*
* Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
*/
diff --git a/keyboards/coseyfannitutti/romeo/keymaps/via/keymap.c b/keyboards/coseyfannitutti/romeo/keymaps/via/keymap.c
new file mode 100644
index 00000000000..951acdca5b3
--- /dev/null
+++ b/keyboards/coseyfannitutti/romeo/keymaps/via/keymap.c
@@ -0,0 +1,43 @@
+/* Copyright 2019 COSEYFANNITUTTI
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_all(
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT,
+ KC_LSFT, KC_SLSH, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_RSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(1), KC_RCTL ),
+
+ [1] = LAYOUT_all(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, RESET,
+ KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_ENT,
+ KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_SLSH, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ),
+
+ [2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ),
+
+ [3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS )
+};
diff --git a/keyboards/coseyfannitutti/romeo/keymaps/via/rules.mk b/keyboards/coseyfannitutti/romeo/keymaps/via/rules.mk
new file mode 100644
index 00000000000..d0e4977b849
--- /dev/null
+++ b/keyboards/coseyfannitutti/romeo/keymaps/via/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+EXTRAKEY_ENABLE = no
+MOUSEKEY_ENABLE = no
\ No newline at end of file
diff --git a/keyboards/coseyfannitutti/romeo/romeo.h b/keyboards/coseyfannitutti/romeo/romeo.h
index d834dbe6fb2..971a391b433 100644
--- a/keyboards/coseyfannitutti/romeo/romeo.h
+++ b/keyboards/coseyfannitutti/romeo/romeo.h
@@ -67,7 +67,7 @@
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1B, \
K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
- K30, K31, K32, K36, K39, K3A, K3B \
+ K30, K31, K32, K34, K36, K37, K39, K3A, K3B \
) { \
{ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, }, \
{ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, _x_, K1B, }, \
diff --git a/keyboards/coseyfannitutti/romeo/usbconfig.h b/keyboards/coseyfannitutti/romeo/usbconfig.h
deleted file mode 100644
index 36926d9a7e6..00000000000
--- a/keyboards/coseyfannitutti/romeo/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 0
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'c','o','s','e','y','f','a','n','n','i','t','u','t','t','i'
-#define USB_CFG_VENDOR_NAME_LEN 15
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'R','O','M','E','O'
-#define USB_CFG_DEVICE_NAME_LEN 5
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-#define USB_CFG_SERIAL_NUMBER '0'
-#define USB_CFG_SERIAL_NUMBER_LEN 1
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-// #define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-// /* #define USB_INTR_CFG_CLR 0 */
-// /* #define USB_INTR_ENABLE EIMSK */
-// #define USB_INTR_ENABLE_BIT INT1
-// /* #define USB_INTR_PENDING EIFR */
-// #define USB_INTR_PENDING_BIT INTF1
-// #define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/cospad/config.h b/keyboards/cospad/config.h
index cfc2d59f60c..362f6c38b18 100644
--- a/keyboards/cospad/config.h
+++ b/keyboards/cospad/config.h
@@ -65,7 +65,7 @@ along with this program. If not, see .
// #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 */
+#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 ==*/
@@ -193,10 +193,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/cospad/cospad.h b/keyboards/cospad/cospad.h
index fc52204edaf..f5ae8961f1d 100644
--- a/keyboards/cospad/cospad.h
+++ b/keyboards/cospad/cospad.h
@@ -125,6 +125,70 @@
{ k50, ___, k52, ___ } \
}
+
+/* 6x4 numpad with split Plus and 0 keys
+ * ,-------------------.
+ * | 00 | 01 | 02 | 03 |
+ * |----|----|----|----|
+ * | 10 | 11 | 12 | 13 |
+ * |----|----|----|----|
+ * | 20 | 21 | 22 | 23 |
+ * |----|----|----|----|
+ * | 30 | 31 | 32 | 33 |
+ * |----|----|----|----|
+ * | 40 | 41 | 42 | |
+ * |----|----|----| 43 |
+ * | 50 | 51 | 52 | |
+ * `-------------------'
+ */
+#define LAYOUT_numpad_6x4_split_plus_zero( \
+ k00, k01, k02, k03, \
+ k10, k11, k12, k13, \
+ k20, k21, k22, k23, \
+ k30, k31, k32, k33, \
+ k40, k41, k42, \
+ k50, k51, k52, k43 \
+) \
+{ \
+ { k00, k01, k02, k03 }, \
+ { k10, k11, k12, k13 }, \
+ { k20, k21, k22, k23 }, \
+ { k30, k31, k32, k33 }, \
+ { k40, k41, k42, k43 }, \
+ { k50, k51, k52, ___ } \
+}
+
+/* 6x4 numpad with split 0 key
+ * ,-------------------.
+ * | 00 | 01 | 02 | 03 |
+ * |----|----|----|----|
+ * | 10 | 11 | 12 | 13 |
+ * |----|----|----|----|
+ * | 20 | 21 | 22 | |
+ * |----|----|----| 23 |
+ * | 30 | 31 | 32 | |
+ * |----|----|----|----|
+ * | 40 | 41 | 42 | |
+ * |----|----|----| 43 |
+ * | 50 | 51 | 52 | |
+ * `-------------------'
+ */
+#define LAYOUT_numpad_6x4_split_zero( \
+ k00, k01, k02, k03, \
+ k10, k11, k12, k13, \
+ k20, k21, k22, \
+ k30, k31, k32, k23, \
+ k40, k41, k42, \
+ k50, k51, k52, k43 \
+) \
+{ \
+ { k00, k01, k02, k03 }, \
+ { k10, k11, k12, k13 }, \
+ { k20, k21, k22, k23 }, \
+ { k30, k31, k32, ___ }, \
+ { k40, k41, k42, k43 }, \
+ { k50, k51, k52, ___ } \
+}
// Add backwards compatibility for existing keymaps
#define cospad_bl_led_on backlight_enable
#define cospad_bl_led_off backlight_disable
diff --git a/keyboards/cospad/info.json b/keyboards/cospad/info.json
index 83bf81c14df..1cd197d3fdd 100644
--- a/keyboards/cospad/info.json
+++ b/keyboards/cospad/info.json
@@ -102,6 +102,71 @@
{"x":2, "y":5},
{"x":3, "y":5}
]
- }
+ },
+ "LAYOUT_numpad_6x4_split_plus_zero": {
+ "key_count": 23,
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+
+ {"x":0, "y":1},
+ {"x":1, "y":1},
+ {"x":2, "y":1},
+ {"x":3, "y":1},
+
+ {"x":0, "y":2},
+ {"x":1, "y":2},
+ {"x":2, "y":2},
+ {"x":3, "y":2},
+
+ {"x":0, "y":3},
+ {"x":1, "y":3},
+ {"x":2, "y":3},
+ {"x":3, "y":3},
+
+ {"x":0, "y":4},
+ {"x":1, "y":4},
+ {"x":2, "y":4},
+
+ {"x":0, "y":5},
+ {"x":1, "y":5},
+ {"x":2, "y":5},
+ {"x":3, "y":4, "h":2}
+ ]
+ },
+ "LAYOUT_numpad_6x4_split_zero": {
+ "key_count": 22,
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+
+ {"x":0, "y":1},
+ {"x":1, "y":1},
+ {"x":2, "y":1},
+ {"x":3, "y":1},
+
+ {"x":0, "y":2},
+ {"x":1, "y":2},
+ {"x":2, "y":2},
+
+ {"x":0, "y":3},
+ {"x":1, "y":3},
+ {"x":2, "y":3},
+ {"x":3, "y":2, "h":2},
+
+ {"x":0, "y":4},
+ {"x":1, "y":4},
+ {"x":2, "y":4},
+
+ {"x":0, "y":5},
+ {"x":1, "y":5},
+ {"x":2, "y":5},
+ {"x":3, "y":4, "h":2}
+ ]
+ }
}
}
diff --git a/keyboards/cospad/keymaps/split_plus_and_zero/keymap.c b/keyboards/cospad/keymaps/split_plus_and_zero/keymap.c
new file mode 100644
index 00000000000..dd2ff00cd1f
--- /dev/null
+++ b/keyboards/cospad/keymaps/split_plus_and_zero/keymap.c
@@ -0,0 +1,81 @@
+#include QMK_KEYBOARD_H
+
+/*
+ * This keymap is based on the default keymap for the cospad.
+ * It was adapted for the split Plus and split 0 layout focusing on the "00" key.
+ */
+
+enum custom_keycodes {
+ DBL_ZRO = SAFE_RANGE,
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case DBL_ZRO:
+ if (record->event.pressed) {
+ // when keycode DBL_ZRO is pressed
+ SEND_STRING("00");
+ } else {
+ // when keycode DBL_ZRO is released
+ }
+ break;
+
+ }
+ return true;
+};
+
+// Defines names for use in layer keycodes and the keymap
+enum layer_names {
+ _BL,
+ _FL
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Keymap _BL: (Base Layer) Default Layer
+ * ,-------------------.
+ * |Esc |TAB | FN | BS |
+ * |----|----|----|----|
+ * | NL | / | * | - |
+ * |----|----|----|----|
+ * | 7 | 8 | 9 | ~ |
+ * |----|----|----|----|
+ * | 4 | 5 | 6 | + |
+ * |----|----|----|----|
+ * | 1 | 2 | 3 | |
+ * |----|----|----| En |
+ * | 0 | 00 | . | |
+ * `-------------------'
+ */
+ [_BL] = LAYOUT_numpad_6x4_split_plus_zero(
+ KC_ESC, KC_TAB, MO(_FL), KC_BSPC,
+ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9, KC_TILD,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_P1, KC_P2, KC_P3,
+ KC_P0, DBL_ZRO, KC_PDOT, KC_PENT
+ ),
+
+ /* Keymap _FL: Function Layer
+ * ,-------------------.
+ * |RGBT| | | |
+ * |----|----|----|----|
+ * |RGBM|RGBP|BTOG| |
+ * |----|----|----|----|
+ * |HUD |HUI |BON | |
+ * |----|----|----|----|
+ * |SAD |SAI |BOFF| |
+ * |----|----|----|----|
+ * |VAD |VAS |BSTP| |
+ * |----|----|----| |
+ * | | |RST | |
+ * `-------------------'
+ */
+ [_FL] = LAYOUT_numpad_6x4_split_plus_zero(
+ RGB_TOG, _______, _______, _______,
+ RGB_MOD, RGB_M_P, BL_TOGG, _______,
+ RGB_HUD, RGB_HUI, BL_ON, _______,
+ RGB_SAD, RGB_SAI, BL_OFF, _______,
+ RGB_VAD, RGB_VAI, BL_STEP,
+ _______, _______, RESET, _______
+ )
+};
diff --git a/keyboards/cospad/keymaps/split_zero/keymap.c b/keyboards/cospad/keymaps/split_zero/keymap.c
new file mode 100644
index 00000000000..3a0c7d6e4ef
--- /dev/null
+++ b/keyboards/cospad/keymaps/split_zero/keymap.c
@@ -0,0 +1,81 @@
+#include QMK_KEYBOARD_H
+
+/*
+ * This keymap is based on the default keymap for the cospad.
+ * It was adapted for the split 0 layout focusing on the "00" key.
+ */
+
+enum custom_keycodes {
+ DBL_ZRO = SAFE_RANGE,
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case DBL_ZRO:
+ if (record->event.pressed) {
+ // when keycode DBL_ZRO is pressed
+ SEND_STRING("00");
+ } else {
+ // when keycode DBL_ZRO is released
+ }
+ break;
+
+ }
+ return true;
+};
+
+// Defines names for use in layer keycodes and the keymap
+enum layer_names {
+ _BL,
+ _FL
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Keymap _BL: (Base Layer) Default Layer
+ * ,-------------------.
+ * |Esc |TAB | FN | BS |
+ * |----|----|----|----|
+ * | NL | / | * | - |
+ * |----|----|----|----|
+ * | 7 | 8 | 9 | |
+ * |----|----|----| + |
+ * | 4 | 5 | 6 | |
+ * |----|----|----|----|
+ * | 1 | 2 | 3 | |
+ * |----|----|----| En |
+ * | 0 | 00 | . | |
+ * `-------------------'
+ */
+ [_BL] = LAYOUT_numpad_6x4_split_zero(
+ KC_ESC, KC_TAB, MO(_FL), KC_BSPC,
+ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_P1, KC_P2, KC_P3,
+ KC_P0, DBL_ZRO, KC_PDOT, KC_PENT
+ ),
+
+ /* Keymap _FL: Function Layer
+ * ,-------------------.
+ * |RGBT| | | |
+ * |----|----|----|----|
+ * |RGBM|RGBP|BTOG| |
+ * |----|----|----|----|
+ * |HUD |HUI |BON | |
+ * |----|----|----| |
+ * |SAD |SAI |BOFF| |
+ * |----|----|----|----|
+ * |VAD |VAS |BSTP| |
+ * |----|----|----| |
+ * | | |RST | |
+ * `-------------------'
+ */
+ [_FL] = LAYOUT_numpad_6x4_split_zero(
+ RGB_TOG, _______, _______, _______,
+ RGB_MOD, RGB_M_P, BL_TOGG, _______,
+ RGB_HUD, RGB_HUI, BL_ON,
+ RGB_SAD, RGB_SAI, BL_OFF, _______,
+ RGB_VAD, RGB_VAI, BL_STEP,
+ _______, _______, RESET, _______
+ )
+};
diff --git a/keyboards/crkbd/config.h b/keyboards/crkbd/config.h
index 4357a218d4a..fb1cdf3962a 100644
--- a/keyboards/crkbd/config.h
+++ b/keyboards/crkbd/config.h
@@ -24,11 +24,5 @@ along with this program. If not, see .
#define USE_I2C
#define USE_SERIAL
-#ifdef USE_Link_Time_Optimization
- // LTO has issues with macros (action_get_macro) and "functions" (fn_actions),
- // so just disable them
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-
- #define DISABLE_LEADER
-#endif // USE_Link_Time_Optimization
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
diff --git a/keyboards/crkbd/keymaps/bcat/keymap.c b/keyboards/crkbd/keymaps/bcat/keymap.c
index 57fd2606565..b4c347181f5 100644
--- a/keyboards/crkbd/keymaps/bcat/keymap.c
+++ b/keyboards/crkbd/keymaps/bcat/keymap.c
@@ -25,7 +25,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[LAYER_LOWER] = LAYOUT(
KC_CAPS, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______,
_______, _______, _______, _______, _______, _______, KC_PIPE, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_TILD,
- _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_APP, KC_BSLS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_GRV,
+ _______, KC_APP, KC_PSCR, KC_SLCK, KC_PAUS, _______, KC_BSLS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_GRV,
_______, _______, _______, _______, _______, _______
),
diff --git a/keyboards/crkbd/keymaps/bcat/readme.md b/keyboards/crkbd/keymaps/bcat/readme.md
index 71a9d93c954..fa6b5af37fa 100644
--- a/keyboards/crkbd/keymaps/bcat/readme.md
+++ b/keyboards/crkbd/keymaps/bcat/readme.md
@@ -1,9 +1,24 @@
# bcat's Corne layout
-This split ergo layout mirrors
-[my Lily58 layout](https://github.com/qmk/qmk_firmware/tree/master/keyboards/lily58/keymaps/bcat)
-with the number row removed and RGB controls added. See that layout's docs for
-more details on the principles that went into the layout.
+This is my favorite split ergo layout for typing, featuring the traditional
+four ortho/ergo layers (Default, Lower, Raise, Adjust). It is loosely inspired
+by the default Planck (numbers on Lower, symbols on Raise) and Crkbd (Space on
+left, Enter on right) layouts, but has since been redesigned heavily according
+to the principles described below:
+
+* Since most of the modifiers are on the left half, keys frequently pressed
+together with mods (e.g., numbers, function keys, etc.) are on the Raise layer
+activated by the right thumb.
+
+* Navigation can be done on the right half alone, to enable simultaneous
+left-handed mousing. Additionally, Web pages can be scrolled with Space or
+Shift+Space on the left half alone, to enable taking notes with the right hand
+at the same time.
+
+* Other than Right Shift (which I seldom use), mods aren't rebound on layers.
+
+* Likewise, Backspace is not rebound on layers to avoid having to let go of
+layer-switch keys to correct mistakes.
## Default layer
@@ -11,20 +26,97 @@ more details on the principles that went into the layout.
([KLE](http://www.keyboard-layout-editor.com/#/gists/08d9827d916662a9414f48805aa895a5))
+* The alpha keys are a standard QWERTY layout, no funny business there.
+
+* Tab and Backspace are in familiar locations from my row-staggered boards
+(almost all of which use HHKB-style split backspace).
+
+* Likewise, the Ctrl key is in the same place as on my row-staggered boards
+(where I've been remapping Caps Lock as Ctrl since before even using QMK).
+
+* There are two Shift keys, because I do use Right Shift on occasion (even
+though I'm predominately a Left Shift-er).
+
+* Lower and Raise layer-switch keys are below the left and right thumb,
+respectively, when resting my fingers on the home row.
+
+* Space and Enter are on the big thumb keys so they're easy to press.
+
+* Alt is on the left so I can navigate back (Alt+Raise+H) and forward
+(Alt+Raise+L) without having to uncomfortably hit two thumb keys on the same
+half. This puts Super on the right by the process of elimination.
+
+* Escape shares a mod-tap key with Ctrl, which is convenient for Vim, but not
+something I'm totally in love with, as even after tweaking `TAPPING_TERM` I
+still get occasional spurious Esc taps. (I might move Esc up a key and put Tab
+on a layer, but that'd take some getting used to....)
+
## Lower layer
-
+
([KLE](http://www.keyboard-layout-editor.com/#/gists/c3fba5eaa2cd70fdfbdbc0f9e34d3bc0))
+* This could also be called the "symbol layer".
+
+* Shifted numbers are bound in their usual positions on the top row.
+
+* Hyphen/Underscore and Equals/Plus are in the right index- and middle-finger
+columns for easy reach. They share the same relative position as on a
+row-staggered keyboard, and the shifted versions are physically above the
+unshifted versions as a mnemonic device.
+
+* Brackets and braces are placed below the parens for easy recall. Once again,
+the shifted versions are on the home row and the unshifted versions are on the
+bottom row.
+
+* Forward Slash/Pipe and Backtick/Tilde fill out the remaining positions on the
+right half, with the same relative positions as on a row-staggered HHKB layout.
+And yup, the shifted versions are above the unshifted versions.
+
+* Caps Lock is bound in the same position as on an HHKB, for lack of an obvious
+better location.
+
+* Some extra keys are placed on the bottom row of the left half, ensuring every
+key on a TKL has a binding.
+
+* The left-half home row is reversed for future use. (It's free real estate.)
+
## Raise layer

([KLE](http://www.keyboard-layout-editor.com/#/gists/08b44355d4ca85d294bad9e2821f91d7))
+* This could also be called the "number layer".
+
+* Unshifted numbers are bound in their usual positions on the top row.
+
+* Arrow keys are on VIM-style HJKL keys.
+
+* Home/End and Page Up/Page Down are in the same column as the arrow keys, but
+translated down one row. (This means that the comma and period keys are not
+bound on the number layer, which makes data entry a bit funky. I might add a
+dedicated numpad layer to compensate.)
+
+* Function keys F1–F10 take up most of remaining space on the left half, with
+F11 and F12 spilling over to the right half. (This puts the most used function
+keys (F1–F5) on the home row.)
+
+* Insert and Delete are on the rightmost column, because there didn't seem to
+be a better place to put them.
+
## Adjust layer

([KLE](http://www.keyboard-layout-editor.com/#/gists/77e7572e077b36a23eb2086017e16fee))
+
+* Media keys are centered around the ESDF cluster, just like I arrange them on
+row-staggered keyboards. (It's even more sensible with columnar stagger.)
+
+* The navigation keys are replaced by RGB controls. Again, this mirrors the
+positioning I use on my row-staggered keyboards.
+
+* Finally, reset keys live at the top-left corner of the right half where it's
+reasonably hard to press them by accident.
diff --git a/keyboards/crkbd/keymaps/drashna/keymap.c b/keyboards/crkbd/keymaps/drashna/keymap.c
index 9a1beeb74b8..55d51eb08ac 100644
--- a/keyboards/crkbd/keymaps/drashna/keymap.c
+++ b/keyboards/crkbd/keymaps/drashna/keymap.c
@@ -6,34 +6,6 @@ extern uint8_t is_master;
// Following line allows macro to read current RGB settings
extern rgblight_config_t rgblight_config;
#endif
-#ifdef OLED_DRIVER_ENABLE
-# define KEYLOGGER_LENGTH 5
-static uint32_t oled_timer = 0;
-static char keylog_str[KEYLOGGER_LENGTH + 1] = {"\n"};
-static uint16_t log_timer = 0;
-// clang-format off
-static const char PROGMEM code_to_name[0xFF] = {
-// 0 1 2 3 4 5 6 7 8 9 A B c D E F
- ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', // 0x
- 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', // 1x
- '3', '4', '5', '6', '7', '8', '9', '0', 20, 19, 27, 26, 22, '-', '=', '[', // 2x
- ']','\\', '#', ';','\'', '`', ',', '.', '/', 128, ' ', ' ', ' ', ' ', ' ', ' ', // 3x
- ' ', ' ', ' ', ' ', ' ', ' ', 'P', 'S', ' ', ' ', ' ', ' ', 16, ' ', ' ', ' ', // 4x
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 5x
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 6x
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 7x
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 8x
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 9x
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Ax
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Bx
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Cx
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Dx
- 'C', 'S', 'A', 'C', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Ex
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' // Fx
-};
-
-void add_keylog(uint16_t keycode);
-#endif
enum crkbd_keycodes { RGBRST = NEW_SAFE_RANGE };
@@ -139,10 +111,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
-#ifdef OLED_DRIVER_ENABLE
- oled_timer = timer_read32();
- add_keylog(keycode);
-#endif
#ifndef SPLIT_KEYBOARD
if (keycode == RESET && !is_master) {
return false;
@@ -154,151 +122,6 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
#ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_270; }
-
-void add_keylog(uint16_t keycode) {
- if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX) || (keycode >= QK_MODS && keycode <= QK_MODS_MAX)) {
- keycode = keycode & 0xFF;
- } else if (keycode > 0xFF) {
- keycode = 0;
- }
-
- for (uint8_t i = (KEYLOGGER_LENGTH - 1); i > 0; --i) {
- keylog_str[i] = keylog_str[i - 1];
- }
-
- if (keycode < (sizeof(code_to_name) / sizeof(char))) {
- keylog_str[0] = pgm_read_byte(&code_to_name[keycode]);
- }
-
- log_timer = timer_read();
-}
-
-void update_log(void) {
- if (timer_elapsed(log_timer) > 750) {
- // add_keylog(0);
- }
-}
-
-void render_keylogger_status(void) {
- oled_write_P(PSTR("KLogr"), false);
- oled_write(keylog_str, false);
-}
-
-void render_default_layer_state(void) {
- oled_write_P(PSTR("Lyout"), false);
- switch (get_highest_layer(default_layer_state)) {
- case _QWERTY:
- oled_write_P(PSTR(" QRTY"), false);
- break;
- case _COLEMAK:
- oled_write_P(PSTR(" COLE"), false);
- break;
- case _DVORAK:
- oled_write_P(PSTR(" DVRK"), false);
- break;
- case _WORKMAN:
- oled_write_P(PSTR(" WKMN"), false);
- break;
- case _NORMAN:
- oled_write_P(PSTR(" NORM"), false);
- break;
- case _MALTRON:
- oled_write_P(PSTR(" MLTN"), false);
- break;
- case _EUCALYN:
- oled_write_P(PSTR(" ECLN"), false);
- break;
- case _CARPLAX:
- oled_write_P(PSTR(" CRPX"), false);
- break;
- }
-}
-
-void render_layer_state(void) {
- oled_write_P(PSTR("LAYER"), false);
- oled_write_P(PSTR("Lower"), layer_state_is(_LOWER));
- oled_write_P(PSTR("Raise"), layer_state_is(_RAISE));
- oled_write_P(PSTR(" Mods"), layer_state_is(_MODS));
-}
-
-void render_keylock_status(uint8_t led_usb_state) {
- oled_write_P(PSTR("Lock:"), false);
- oled_write_P(PSTR(" "), false);
- oled_write_P(PSTR("N"), led_usb_state & (1 << USB_LED_NUM_LOCK));
- oled_write_P(PSTR("C"), led_usb_state & (1 << USB_LED_CAPS_LOCK));
- oled_write_ln_P(PSTR("S"), led_usb_state & (1 << USB_LED_SCROLL_LOCK));
-}
-
-void render_mod_status(uint8_t modifiers) {
- oled_write_P(PSTR("Mods:"), false);
- oled_write_P(PSTR(" "), false);
- oled_write_P(PSTR("S"), (modifiers & MOD_MASK_SHIFT));
- oled_write_P(PSTR("C"), (modifiers & MOD_MASK_CTRL));
- oled_write_P(PSTR("A"), (modifiers & MOD_MASK_ALT));
- oled_write_P(PSTR("G"), (modifiers & MOD_MASK_GUI));
-}
-
-void render_bootmagic_status(void) {
- /* Show Ctrl-Gui Swap options */
- static const char PROGMEM logo[][2][3] = {
- {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}},
- {{0x95, 0x96, 0}, {0xb5, 0xb6, 0}},
- };
- oled_write_P(PSTR("BTMGK"), false);
- oled_write_P(PSTR(" "), false);
- oled_write_P(logo[0][0], !keymap_config.swap_lctl_lgui);
- oled_write_P(logo[1][0], keymap_config.swap_lctl_lgui);
- oled_write_P(PSTR(" "), false);
- oled_write_P(logo[0][1], !keymap_config.swap_lctl_lgui);
- oled_write_P(logo[1][1], keymap_config.swap_lctl_lgui);
- oled_write_P(PSTR(" NKRO"), keymap_config.nkro);
-}
-
-void render_user_status(void) {
- oled_write_P(PSTR("USER:"), false);
- oled_write_P(PSTR(" Anim"), userspace_config.rgb_matrix_idle_anim);
- oled_write_P(PSTR(" Layr"), userspace_config.rgb_layer_change);
- oled_write_P(PSTR(" Nuke"), userspace_config.nuke_switch);
-}
-
-void render_status_main(void) {
- /* Show Keyboard Layout */
- render_default_layer_state();
- render_keylock_status(host_keyboard_leds());
- render_bootmagic_status();
- render_user_status();
-
- render_keylogger_status();
-}
-
-void render_status_secondary(void) {
- /* Show Keyboard Layout */
- render_default_layer_state();
- render_layer_state();
- render_mod_status(get_mods() | get_oneshot_mods());
-
- render_keylogger_status();
-}
-
-void oled_task_user(void) {
- if (timer_elapsed32(oled_timer) > 30000) {
- oled_off();
- return;
- }
-# ifndef SPLIT_KEYBOARD
- else {
- oled_on();
- }
-# endif
-
- update_log();
- if (is_master) {
- render_status_main(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
- } else {
- render_status_secondary();
- }
-}
-
#endif
uint16_t get_tapping_term(uint16_t keycode) {
diff --git a/keyboards/crkbd/ssd1306.c b/keyboards/crkbd/ssd1306.c
index 20c2738db77..622e44e35f5 100644
--- a/keyboards/crkbd/ssd1306.c
+++ b/keyboards/crkbd/ssd1306.c
@@ -15,6 +15,14 @@
extern const unsigned char font[] PROGMEM;
+#ifndef OLED_BLANK_CHAR
+#define OLED_BLANK_CHAR ' '
+#endif
+
+#ifndef OLED_BITS_FILTER
+#define OLED_BITS_FILTER
+#endif
+
// Set this to 1 to help diagnose early startup problems
// when testing power-on with ble. Turn it off otherwise,
// as the latency of printing most of the debug info messes
@@ -26,8 +34,11 @@ extern const unsigned char font[] PROGMEM;
//#define BatteryUpdateInterval 10000 /* milliseconds */
// 'last_flush' is declared as uint16_t,
-// so this must be less than 65535
+// so this must be less than 65535
+#ifndef ScreenOffInterval
#define ScreenOffInterval 60000 /* milliseconds */
+#endif
+
#if DEBUG_TO_SCREEN
static uint8_t displaying;
#endif
@@ -61,38 +72,32 @@ done:
return res;
}
-// Write 2-byte command sequence.
-// Returns true on success
-static inline bool _send_cmd2(uint8_t cmd, uint8_t opr) {
- if (!_send_cmd1(cmd)) {
- return false;
- }
- return _send_cmd1(opr);
-}
-
-// Write 3-byte command sequence.
-// Returns true on success
-static inline bool _send_cmd3(uint8_t cmd, uint8_t opr1, uint8_t opr2) {
- if (!_send_cmd1(cmd)) {
- return false;
- }
- if (!_send_cmd1(opr1)) {
- return false;
- }
- return _send_cmd1(opr2);
-}
-
#define send_cmd1(c) if (!_send_cmd1(c)) {goto done;}
-#define send_cmd2(c,o) if (!_send_cmd2(c,o)) {goto done;}
-#define send_cmd3(c,o1,o2) if (!_send_cmd3(c,o1,o2)) {goto done;}
+#define send_cmds(c) if (!_send_cmds(c,sizeof(c))) {goto done;}
+#define cmd1(X) X
+#define cmd2(X,Y) X,Y
+#define cmd3(X,Y,Z) X,Y,Z
+
+static bool _send_cmds(const uint8_t* p,uint8_t sz) {
+ for(uint8_t i=sz;i;i--) {
+ send_cmd1( pgm_read_byte(p++) );
+ }
+ return true;
+done:
+ return false;
+}
+
+#define SEND_CMDS(...) {static const uint8_t _cmds[] PROGMEM = { __VA_ARGS__,0 };send_cmds(_cmds);}
static void clear_display(void) {
matrix_clear(&display);
// Clear all of the display bits (there can be random noise
// in the RAM on startup)
- send_cmd3(PageAddr, 0, (DisplayHeight / 8) - 1);
- send_cmd3(ColumnAddr, 0, DisplayWidth - 1);
+ SEND_CMDS(
+ cmd3(PageAddr, 0, (DisplayHeight / 8) - 1),
+ cmd3(ColumnAddr, 0, DisplayWidth - 1)
+ );
if (i2c_start_write(SSD1306_ADDRESS)) {
goto done;
@@ -101,8 +106,8 @@ static void clear_display(void) {
// Data mode
goto done;
}
- for (uint8_t row = 0; row < MatrixRows; ++row) {
- for (uint8_t col = 0; col < DisplayWidth; ++col) {
+ for (uint8_t row = MatrixRows;row; row--) {
+ for (uint8_t col = DisplayWidth; col; col--) {
i2c_master_write(0);
}
}
@@ -130,38 +135,47 @@ bool iota_gfx_init(bool rotate) {
bool success = false;
i2c_master_init();
- send_cmd1(DisplayOff);
- send_cmd2(SetDisplayClockDiv, 0x80);
- send_cmd2(SetMultiPlex, DisplayHeight - 1);
-
- send_cmd2(SetDisplayOffset, 0);
-
-
- send_cmd1(SetStartLine | 0x0);
- send_cmd2(SetChargePump, 0x14 /* Enable */);
- send_cmd2(SetMemoryMode, 0 /* horizontal addressing */);
+ SEND_CMDS(
+ cmd1(DisplayOff),
+ cmd2(SetDisplayClockDiv, 0x80),
+ cmd2(SetMultiPlex, DisplayHeight - 1),
+ cmd2(SetDisplayOffset, 0),
+ cmd1(SetStartLine | 0x0),
+ cmd2(SetChargePump, 0x14 /* Enable */),
+ cmd2(SetMemoryMode, 0 /* horizontal addressing */)
+ );
if(rotate){
// the following Flip the display orientation 180 degrees
- send_cmd1(SegRemap);
- send_cmd1(ComScanInc);
+ SEND_CMDS(
+ cmd1(SegRemap),
+ cmd1(ComScanInc)
+ );
}else{
// Flips the display orientation 0 degrees
- send_cmd1(SegRemap | 0x1);
- send_cmd1(ComScanDec);
+ SEND_CMDS(
+ cmd1(SegRemap | 0x1),
+ cmd1(ComScanDec)
+ );
}
- send_cmd2(SetComPins, 0x2);
- send_cmd2(SetContrast, 0x8f);
- send_cmd2(SetPreCharge, 0xf1);
- send_cmd2(SetVComDetect, 0x40);
- send_cmd1(DisplayAllOnResume);
- send_cmd1(NormalDisplay);
- send_cmd1(DeActivateScroll);
- send_cmd1(DisplayOn);
-
- send_cmd2(SetContrast, 0); // Dim
-
+ SEND_CMDS(
+#ifdef SSD1306_128X64
+ cmd2(SetComPins, 0x12),
+#else
+ cmd2(SetComPins, 0x2),
+#endif
+ cmd2(SetContrast, 0x8f),
+ cmd2(SetPreCharge, 0xf1),
+ cmd2(SetVComDetect, 0x40),
+ cmd1(DisplayAllOnResume),
+ cmd1(NormalDisplay),
+ cmd1(DeActivateScroll),
+ cmd1(DisplayOn),
+
+ cmd2(SetContrast, 0) // Dim
+ );
+
clear_display();
success = true;
@@ -205,7 +219,7 @@ void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) {
memmove(&matrix->display[0], &matrix->display[1],
MatrixCols * (MatrixRows - 1));
matrix->cursor = &matrix->display[MatrixRows - 1][0];
- memset(matrix->cursor, ' ', MatrixCols);
+ memset(matrix->cursor, OLED_BLANK_CHAR, MatrixCols);
}
}
@@ -218,7 +232,7 @@ void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) {
uint8_t cursor_col = (matrix->cursor - &matrix->display[0][0]) % MatrixCols;
while (cursor_col++ < MatrixCols) {
- matrix_write_char_inner(matrix, ' ');
+ matrix_write_char_inner(matrix, OLED_BLANK_CHAR);
}
return;
}
@@ -231,17 +245,15 @@ void iota_gfx_write_char(uint8_t c) {
}
void matrix_write(struct CharacterMatrix *matrix, const char *data) {
- const char *end = data + strlen(data);
- while (data < end) {
+ while (*data) {
matrix_write_char(matrix, *data);
++data;
}
}
void matrix_write_ln(struct CharacterMatrix *matrix, const char *data) {
- char data_ln[strlen(data)+2];
- snprintf(data_ln, sizeof(data_ln), "%s\n", data);
- matrix_write(matrix, data_ln);
+ matrix_write(matrix, data);
+ matrix_write(matrix, "\n");
}
void iota_gfx_write(const char *data) {
@@ -264,7 +276,7 @@ void iota_gfx_write_P(const char *data) {
}
void matrix_clear(struct CharacterMatrix *matrix) {
- memset(matrix->display, ' ', sizeof(matrix->display));
+ memset(matrix->display, OLED_BLANK_CHAR, sizeof(matrix->display));
matrix->cursor = &matrix->display[0][0];
matrix->dirty = true;
}
@@ -281,8 +293,10 @@ void matrix_render(struct CharacterMatrix *matrix) {
#endif
// Move to the home position
- send_cmd3(PageAddr, 0, MatrixRows - 1);
- send_cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1);
+ SEND_CMDS(
+ cmd3(PageAddr, 0, MatrixRows - 1),
+ cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1)
+ );
if (i2c_start_write(SSD1306_ADDRESS)) {
goto done;
@@ -298,7 +312,7 @@ void matrix_render(struct CharacterMatrix *matrix) {
for (uint8_t glyphCol = 0; glyphCol < FontWidth; ++glyphCol) {
uint8_t colBits = pgm_read_byte(glyph + glyphCol);
- i2c_master_write(colBits);
+ i2c_master_write(colBits OLED_BITS_FILTER);
}
// 1 column of space between chars (it's not included in the glyph)
@@ -331,7 +345,7 @@ void iota_gfx_task(void) {
force_dirty = false;
}
- if (timer_elapsed(last_flush) > ScreenOffInterval) {
+ if (ScreenOffInterval !=0 && timer_elapsed(last_flush) > ScreenOffInterval) {
iota_gfx_off();
}
}
diff --git a/keyboards/crkbd/ssd1306.h b/keyboards/crkbd/ssd1306.h
index ea8c9232805..0ca093093a1 100644
--- a/keyboards/crkbd/ssd1306.h
+++ b/keyboards/crkbd/ssd1306.h
@@ -2,7 +2,6 @@
#include
#include
-#include "pincontrol.h"
#include "action.h"
enum ssd1306_cmds {
@@ -88,4 +87,4 @@ void matrix_write_ln(struct CharacterMatrix *matrix, const char *data);
void matrix_write_P(struct CharacterMatrix *matrix, const char *data);
void matrix_render(struct CharacterMatrix *matrix);
-bool process_record_gfx(uint16_t keycode, keyrecord_t *record);
\ No newline at end of file
+bool process_record_gfx(uint16_t keycode, keyrecord_t *record);
diff --git a/keyboards/daisy/config.h b/keyboards/daisy/config.h
index 4ee4d242fc0..ea03d116bda 100644
--- a/keyboards/daisy/config.h
+++ b/keyboards/daisy/config.h
@@ -192,10 +192,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/db/db63/config.h b/keyboards/db/db63/config.h
index 4247840173c..85625b72003 100644
--- a/keyboards/db/db63/config.h
+++ b/keyboards/db/db63/config.h
@@ -20,8 +20,6 @@ along with this program. If not, see .
#define VENDOR_ID 0xFAAD
#define PRODUCT_ID 0x422D
#define DEVICE_VER 0x0200
-// You can edit those at usbconfig.h about line 250. These values will
-// unforunatly be ignored so far
#define MANUFACTURER HNB
#define PRODUCT DB63v1 Hotswap
diff --git a/keyboards/db/db63/usbconfig.h b/keyboards/db/db63/usbconfig.h
deleted file mode 100644
index 0dfe8b3baf9..00000000000
--- a/keyboards/db/db63/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'H', 'N', 'B'
-#define USB_CFG_VENDOR_NAME_LEN 3
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'D', 'B', '6', '3', 'H', 'S'
-#define USB_CFG_DEVICE_NAME_LEN 6
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/dmqdesign/spin/config.h b/keyboards/dmqdesign/spin/config.h
new file mode 100644
index 00000000000..63a3aa94b87
--- /dev/null
+++ b/keyboards/dmqdesign/spin/config.h
@@ -0,0 +1,58 @@
+/*
+Copyright 2019-2020 DMQ Design
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xA455
+#define PRODUCT_ID 0x0001
+#define DEVICE_VER 0x0001
+#define MANUFACTURER DMQ Design
+#define PRODUCT SPIN
+#define DESCRIPTION The SPIN Macro Pad is a 12 key Macro Pad by DMQ Design with 3 rotary encoders, inspired by the Plaid & RoMac.
+
+/* key matrix size */
+#define MATRIX_ROWS 3
+#define MATRIX_COLS 5
+//Matrix is 3x5 instead of 3x4, as the 3 encoders are wired into the matrix
+
+#define MATRIX_ROW_PINS { F0, F1, F4 }
+#define MATRIX_COL_PINS { F5, F6, F7, C7, C6 }
+#define UNUSED_PINS { D5, D2, D1, D0, B7, B3, B2, B0, E6 }
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+//rotary encoder setup
+#define ENCODERS_PAD_A { B6, B4, D6 }
+#define ENCODERS_PAD_B { B5, D7, D4 }
+#define ENCODER_RESOLUTION 4
+
+//Data pin for the 3 RGB LEDs
+#define RGB_DI_PIN D3
+//Number of RGB LEDs
+#define RGBLED_NUM 3
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+/* 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
diff --git a/keyboards/dmqdesign/spin/info.json b/keyboards/dmqdesign/spin/info.json
new file mode 100644
index 00000000000..032ff39908b
--- /dev/null
+++ b/keyboards/dmqdesign/spin/info.json
@@ -0,0 +1,28 @@
+{
+ "keyboard_name": "SPIN",
+ "url": "https://www.DMQdesign.com",
+ "maintainer": "Quarren42",
+ "width": 4.5,
+ "height": 4,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3.5, "y":0},
+ {"x":0, "y":1},
+ {"x":1, "y":1},
+ {"x":2, "y":1},
+ {"x":3.5, "y":1.5},
+ {"x":0, "y":2},
+ {"x":1, "y":2},
+ {"x":2, "y":2},
+ {"x":3.5, "y":3},
+ {"x":0, "y":3},
+ {"x":1, "y":3},
+ {"x":2, "y":3}
+ ]
+ }
+ }
+}
diff --git a/keyboards/dmqdesign/spin/keymaps/default/config.h b/keyboards/dmqdesign/spin/keymaps/default/config.h
new file mode 100644
index 00000000000..a6d4ee43198
--- /dev/null
+++ b/keyboards/dmqdesign/spin/keymaps/default/config.h
@@ -0,0 +1,21 @@
+/* Copyright 2019-2020 DMQ Design
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#define RGBLIGHT_HUE_STEP 8
+
+// place overrides here
diff --git a/keyboards/dmqdesign/spin/keymaps/default/keymap.c b/keyboards/dmqdesign/spin/keymaps/default/keymap.c
new file mode 100644
index 00000000000..0b5e6bd0b90
--- /dev/null
+++ b/keyboards/dmqdesign/spin/keymaps/default/keymap.c
@@ -0,0 +1,47 @@
+/* Copyright 2019-2020 DMQ Design
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(/* Base */
+ KC_7, KC_8, KC_9, KC_TRNS,
+ KC_4, KC_5, KC_6, KC_TRNS,
+ KC_1, KC_2, KC_3, KC_TRNS,
+ KC_0, RGB_TOG, KC_ENTER
+ ),
+};
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) { /* First encoder */
+ if (clockwise) {
+ rgblight_increase_hue(); //Cycle through the RGB hue
+ } else {
+ rgblight_decrease_hue();
+ }
+ } else if (index == 1) { /* Second encoder */
+ if (clockwise) {
+ tap_code(KC_VOLU); //Example of using tap_code which lets you use keycodes outside of the keymap
+ } else {
+ tap_code(KC_VOLD);
+ }
+ } else if (index == 2) { /* Third encoder */
+ if (clockwise) {
+ rgblight_increase_val(); //Change brightness on the RGB LEDs
+ } else {
+ rgblight_decrease_val();
+ }
+ }
+}
diff --git a/keyboards/dmqdesign/spin/keymaps/default/readme.md b/keyboards/dmqdesign/spin/keymaps/default/readme.md
new file mode 100644
index 00000000000..384b1a7d8af
--- /dev/null
+++ b/keyboards/dmqdesign/spin/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for the SPIN Macro Pad, it includes basic encoder & rgb functionality.
\ No newline at end of file
diff --git a/keyboards/dmqdesign/spin/keymaps/encoderlayers/config.h b/keyboards/dmqdesign/spin/keymaps/encoderlayers/config.h
new file mode 100644
index 00000000000..feedd68eb44
--- /dev/null
+++ b/keyboards/dmqdesign/spin/keymaps/encoderlayers/config.h
@@ -0,0 +1,23 @@
+/* Copyright 2019-2020 DMQ Design
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#define RGBLIGHT_EFFECT_RAINBOW_MOOD
+#define RGBLIGHT_HUE_STEP 8
+#define MIDI_ENABLE_STRICT 1
+#define MIDI_ADVANCED
+
diff --git a/keyboards/dmqdesign/spin/keymaps/encoderlayers/keymap.c b/keyboards/dmqdesign/spin/keymaps/encoderlayers/keymap.c
new file mode 100644
index 00000000000..cb2a21f5575
--- /dev/null
+++ b/keyboards/dmqdesign/spin/keymaps/encoderlayers/keymap.c
@@ -0,0 +1,151 @@
+/* Copyright 2019-2020 DMQ Design
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+#include "midi.h"
+#include "qmk_midi.h"
+
+enum layers
+{
+ _BL,
+ _FL,
+ _TL
+};
+
+uint8_t currentLayer;
+
+//The below layers are intentionally empty in order to give a good starting point for how to configure multiple layers.
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BL] = LAYOUT(/* Base */
+ KC_KP_7, KC_KP_8, KC_KP_9, TO(_BL),
+ KC_KP_4, KC_KP_5, KC_KP_6, TO(_FL),
+ KC_KP_1, KC_KP_2, KC_KP_3, TO(_TL),
+ KC_KP_0, RGB_TOG, RGB_MOD
+ ),
+
+ [_FL] = LAYOUT(/* Base */
+ KC_NO, KC_NO, KC_NO, KC_TRNS,
+ KC_NO, KC_NO, KC_NO, KC_TRNS,
+ KC_NO, KC_NO, KC_NO, KC_TRNS,
+ KC_MS_BTN1, KC_NO, KC_MS_BTN2
+ ),
+
+ [_TL] = LAYOUT(/* Base */
+ KC_NO, KC_NO, KC_NO, KC_TRNS,
+ KC_NO, KC_NO, KC_NO, KC_TRNS,
+ KC_NO, KC_NO, KC_NO, KC_TRNS,
+ KC_NO, KC_NO, KC_NO
+ )
+};
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) { /* First encoder */
+ switch (currentLayer) { //break each encoder update into a switch statement for the current layer
+ case _BL:
+ if (clockwise) {
+ rgblight_increase_hue();
+ } else {
+ rgblight_decrease_hue();
+ }
+ break;
+ case _FL:
+ if (clockwise) {
+ midi_send_cc(&midi_device, 0, 0x14, 1);
+ } else {
+ midi_send_cc(&midi_device, 0, 0x15, 1);
+ }
+ break;
+ case _TL:
+ if (clockwise) {
+ midi_send_cc(&midi_device, 0, 0x1A, 1);
+ } else {
+ midi_send_cc(&midi_device, 0, 0x1B, 1);
+ }
+ break;
+ }
+ } else if (index == 1) { /* Second encoder */
+ switch (currentLayer) {
+ case _BL:
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ break;
+ case _FL:
+ if (clockwise) {
+ midi_send_cc(&midi_device, 0, 0x16, 1);
+ } else {
+ midi_send_cc(&midi_device, 0, 0x17, 1);
+ }
+ break;
+ case _TL:
+ if (clockwise) {
+ midi_send_cc(&midi_device, 0, 0x1C, 1);
+ } else {
+ midi_send_cc(&midi_device, 0, 0x1D, 1);
+ }
+ break;
+ }
+ } else if (index == 2) { /* Third encoder */
+ switch (currentLayer) {
+ case _BL:
+ if (clockwise) {
+ rgblight_increase_val();
+ } else {
+ rgblight_decrease_val();
+ }
+ break;
+ case _FL:
+ if (clockwise) {
+ midi_send_cc(&midi_device, 0, 0x18, 1);
+ } else {
+ midi_send_cc(&midi_device, 0, 0x19, 1);
+ }
+ break;
+ case _TL:
+ if (clockwise) {
+ midi_send_cc(&midi_device, 0, 0x1E, 1);
+ } else {
+ midi_send_cc(&midi_device, 0, 0x1F, 1);
+ }
+ break;
+ }
+ }
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) { //This will run every time the layer is updated
+ currentLayer = get_highest_layer(state);
+
+ switch (currentLayer) {
+ case _BL:
+ setrgb(RGB_WHITE, &led[0]); //Set the top LED to white for the bottom layer
+ setrgb(0, 0, 0, &led[1]);
+ setrgb(0, 0, 0, &led[2]);
+ break;
+ case _FL:
+ setrgb(0, 0, 0, &led[0]); //Set the middle LED to white for the middle layer
+ setrgb(RGB_WHITE, &led[1]);
+ setrgb(0, 0, 0, &led[2]);
+ break;
+ case _TL:
+ setrgb(0, 0, 0, &led[0]);
+ setrgb(0, 0, 0, &led[1]);
+ setrgb(RGB_WHITE, &led[2]); //Set the bottom LED to white for the top layer
+ break;
+ }
+ rgblight_set();
+ return state;
+}
diff --git a/keyboards/dmqdesign/spin/keymaps/encoderlayers/readme.md b/keyboards/dmqdesign/spin/keymaps/encoderlayers/readme.md
new file mode 100644
index 00000000000..256fb16d47c
--- /dev/null
+++ b/keyboards/dmqdesign/spin/keymaps/encoderlayers/readme.md
@@ -0,0 +1 @@
+# This keymap is intended to demonstrate how to implement different encoder functions dependent on layer, and on how to implement MIDI control with encoders.
\ No newline at end of file
diff --git a/keyboards/dmqdesign/spin/readme.md b/keyboards/dmqdesign/spin/readme.md
new file mode 100644
index 00000000000..8f856a81d90
--- /dev/null
+++ b/keyboards/dmqdesign/spin/readme.md
@@ -0,0 +1,17 @@
+# SPIN
+
+
+
+The SPIN Macro Pad is a USB-C, hotswappable Macro Pad with 3 encoders designed by Nick from DMQ Design.
+
+* Keyboard Maintainer: [Nicholas Junker](https://github.com/Quarren42)
+* Hardware Supported: SPIN Macro Pad PCB/kit
+* Hardware Availability: The macro pad is available at [DMQdesign.com](www.dmqdesign.com)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make dmqdesign/spin:default
+
+I have two example keymaps available, both the default and the encoderlayers keymap which demonstrates using different encoder functions based on the layer chosen.
+
+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).
diff --git a/keyboards/dmqdesign/spin/rules.mk b/keyboards/dmqdesign/spin/rules.mk
new file mode 100644
index 00000000000..f8dc59afaa7
--- /dev/null
+++ b/keyboards/dmqdesign/spin/rules.mk
@@ -0,0 +1,34 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = yes # MIDI support
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+ENCODER_ENABLE = yes # Enable rotary encoder support
diff --git a/keyboards/dmqdesign/spin/spin.c b/keyboards/dmqdesign/spin/spin.c
new file mode 100644
index 00000000000..fe3f267d1a9
--- /dev/null
+++ b/keyboards/dmqdesign/spin/spin.c
@@ -0,0 +1,16 @@
+/* Copyright 2019-2020 DMQ Design
+ *
+ * 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 .
+ */
+#include "spin.h"
diff --git a/keyboards/dmqdesign/spin/spin.h b/keyboards/dmqdesign/spin/spin.h
new file mode 100644
index 00000000000..d60dbe82fb6
--- /dev/null
+++ b/keyboards/dmqdesign/spin/spin.h
@@ -0,0 +1,29 @@
+/* Copyright 2019-2020 DMQ Design
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ k00, k01, k02, k03, \
+ k10, k11, k12, k13, \
+ k20, k21, k22, k23, \
+ k30, k31, k32 \
+) { \
+ {k00, k10, k20, k30, k23}, \
+ {k01, k11, k21, k31, k13}, \
+ {k02, k12, k22, k32, k03} \
+}
diff --git a/keyboards/donutcables/budget96/usbconfig.h b/keyboards/donutcables/budget96/usbconfig.h
deleted file mode 100644
index 03ec48972e8..00000000000
--- a/keyboards/donutcables/budget96/usbconfig.h
+++ /dev/null
@@ -1,384 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'D', 'o', 'n', 'u', 't', 'C', 'a', 'b', 'l', 'e', 's'
-#define USB_CFG_VENDOR_NAME_LEN 11
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'b', 'u', 'd', 'g', 'e', 't', '9', '6'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
diff --git a/keyboards/doro67/multi/keymaps/konstantin/rules.mk b/keyboards/doro67/multi/keymaps/konstantin/rules.mk
index 041d3211459..c3a73fd8450 100644
--- a/keyboards/doro67/multi/keymaps/konstantin/rules.mk
+++ b/keyboards/doro67/multi/keymaps/konstantin/rules.mk
@@ -3,6 +3,7 @@ BOOTMAGIC_ENABLE = no
COMMAND_ENABLE = yes
CONSOLE_ENABLE = yes
EXTRAKEY_ENABLE = yes
+GRAVE_ESC_ENABLE = no
MOUSEKEY_ENABLE = yes
NKRO_ENABLE = yes
SPACE_CADET_ENABLE = no
diff --git a/keyboards/dp60/config.h b/keyboards/dp60/config.h
index 29d5e3c2a4a..3875d303ea4 100644
--- a/keyboards/dp60/config.h
+++ b/keyboards/dp60/config.h
@@ -16,7 +16,7 @@
/* key matrix size */
#define MATRIX_ROWS 5
-#define MATRIX_COLS 14
+#define MATRIX_COLS 15
#define UNUSED_PINS
#define DIODE_DIRECTION COL2ROW
@@ -49,7 +49,3 @@
#define DRIVER_1_LED_TOTAL 36
#define DRIVER_2_LED_TOTAL 36
#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
-
-#if defined(VIA_ENABLE)
-# define DYNAMIC_KEYMAP_LAYER_COUNT 2
-#endif
diff --git a/keyboards/dp60/keymaps/via/keymap.c b/keyboards/dp60/keymaps/via/keymap.c
index 2e2694326c3..8227055766e 100644
--- a/keyboards/dp60/keymaps/via/keymap.c
+++ b/keyboards/dp60/keymaps/via/keymap.c
@@ -14,4 +14,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______,_______,_______,_______,_______,KC_LEFT,KC_DOWN, KC_UP,KC_RIGHT,KC_HOME,KC_END,_______,
_______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
_______,_______,_______, _______, _______,_______,TG(0),_______),
+
+ [2] = LAYOUT_60_ansi_split_bs_rshift(
+ _______, _______,_______, _______,_______, _______,_______, _______,_______, _______,_______, _______,_______,_______,_______,
+ _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
+ _______, _______,_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,
+ _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
+ _______,_______,_______, _______, _______,_______,_______,_______),
+
+ [3] = LAYOUT_60_ansi_split_bs_rshift(
+ _______, _______,_______, _______,_______, _______,_______, _______,_______, _______,_______, _______,_______,_______,_______,
+ _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
+ _______, _______,_______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,
+ _______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,
+ _______,_______,_______, _______, _______,_______,_______,_______)
};
\ No newline at end of file
diff --git a/keyboards/dp60/keymaps/via/rules.mk b/keyboards/dp60/keymaps/via/rules.mk
index 036bd6d1c3e..36b7ba9cbc9 100644
--- a/keyboards/dp60/keymaps/via/rules.mk
+++ b/keyboards/dp60/keymaps/via/rules.mk
@@ -1 +1,2 @@
-VIA_ENABLE = yes
\ No newline at end of file
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/duck/orion/v3/config.h b/keyboards/duck/orion/v3/config.h
index b04729712ee..ce64431afca 100644
--- a/keyboards/duck/orion/v3/config.h
+++ b/keyboards/duck/orion/v3/config.h
@@ -43,7 +43,6 @@ along with this program. If not, see .
#define BACKLIGHT_PINS { B1, B2, B3, E6 }
#define BACKLIGHT_LED_COUNT 4
#define BACKLIGHT_LEVELS 10
-#define BACKLIGHT_ON_STATE 1
#define RGBLIGHT_ANIMATIONS
#define RGB_DI_PIN D6
diff --git a/keyboards/dz60/keymaps/mpstewart/config.h b/keyboards/dz60/keymaps/mpstewart/config.h
new file mode 100644
index 00000000000..92d4cfb50a3
--- /dev/null
+++ b/keyboards/dz60/keymaps/mpstewart/config.h
@@ -0,0 +1,6 @@
+#pragma once
+
+// Turn off RGB when computer goes to sleep
+#ifdef RGBLIGHT_ENABLE
+#define RGBLIGHT_SLEEP
+#endif // RGBLIGHT_ENABLE
diff --git a/keyboards/dz60/keymaps/mpstewart/keymap.c b/keyboards/dz60/keymaps/mpstewart/keymap.c
new file mode 100644
index 00000000000..6e8ccb19343
--- /dev/null
+++ b/keyboards/dz60/keymaps/mpstewart/keymap.c
@@ -0,0 +1,90 @@
+#include QMK_KEYBOARD_H
+#define C_ESC CTL_T(KC_ESC)
+
+
+// Layers
+#define _BASE 0
+#define _FN 1
+#define _LIGHTS 2
+
+/* Layout designed primarily around replicating the ergonomics of an HHKB, with
+ * a standard 60% spacebar row to be more compatible with conveniently
+ * available parts. The feature most shamelessly ripped off from the HHKB is
+ * the split right shift and backspace.
+ *
+ * This keymap is macOS-oriented by default, but pressing the AG_TOGG key on
+ * the _FN layer will swap alt and gui, making this layout also functional for
+ * Linux and PC.
+ */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* _BASE layer
+ * Looks like this Arranged like this
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+ * │Esc│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ \ │ ` │ │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤
+ * │Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ { │ } │Bksp │ │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │esc/^ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤
+ * │lshift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │rshift│fn │ │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │3e │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬┴───┤ ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬┴───┤
+ * │ctrl│alt │win │ │win │alt │menu│ctrl│ │40 │41 │43 │46 │4a │4b │4d │4e │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+*/
+ [_BASE] = LAYOUT_60_ansi_split_bs_rshift(
+ // _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _A _B _C _D _E
+/*0_*/ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
+/*1_*/ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
+/*2_*/ C_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+/*3_*/ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN),
+/*4_*/ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, MO(_LIGHTS), KC_RCTL
+ ),
+
+/* _FN layer, where blank keys indicates transparency to the base layer
+ * Looks like this Arranged like this (as above)
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+ * │slp│F1 │F2 │F3 │F4 │F5 │F6 │F7 │F8 │F9 │F10│F11│F12│ins│del│ │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0a │0b │0c │0d │0e │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤
+ * │caps │bup│bdn│ │XXX│ │ │ │prt│scl│pus│ ↑ │ │ │ │10 │12 │13 │14 │15 │16 │17 │18 │19 │1a │1b │1c │1d │1e │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │vup│vdn│vmt│ │ │ │ │hme│pup│ ← │ → │ Return │ │20 │22 │23 │24 │25 │26 │27 │28 │29 │2a │2b │2c │2d │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤
+ * │lshift │ │ │ │ │ │ │ │end│pdn│ ↓ │rshift│ │ │30 │32 │33 │34 │35 │36 │37 │38 │39 │3a │3b │3d │3e │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬┴───┤ ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬┴───┤
+ * │ctrl│lalt│lgui│ S P A C E │rgui│ralt│menu│ctrl│ │40 │41 │43 │46 │4a │4b │4d │4e │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ * XXX = RESET (dfu mode)
+*/
+ [_FN] = LAYOUT_60_ansi_split_bs_rshift(
+ // _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _A _B _C _D _E
+/*0_*/ KC_SLEP, KC_F1, KC_F2 , KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
+/*1_*/ KC_CAPS, KC_BRID, KC_BRIU, KC_NO, RESET, KC_NO, KC_NO, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_NO, KC_NO,
+/*2_*/ KC_NO, KC_VOLD, KC_VOLU, KC_MUTE, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_RGHT, KC_RETURN,
+/*3_*/ KC_LSPO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_END, KC_PGDN, KC_DOWN, KC_RSPC, KC_TRNS,
+/*4_*/ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_APP, AG_TOGG
+ ),
+
+/* _LIGHTS LAYER (stolen shamelessly from 256k_HHKB
+ *
+ * ,---------------------------------------------------------------------------------------------------------------------+
+ * | RGB_TOGGLE | STATIC | BREATHE | RAINBOW | SWIRL | SNAKE | KNIGHTRIDER | XMAS | STATIC_GRAD | _ | _ | _ | _ | _ | _ |
+ * |----------------------------------------------------------------------------------------------------------------------+
+ * | RBG_MOD | HUE_INC | SATURATION_INC | BRIGHT_INC | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ |
+ * |----------------------------------------------------------------------------------------------------------------------+
+ * | CTRL | HUE_DEC | SATURATION_DEC | BRIGHT_DEC | _ | _ | _ | _ | _ | _ | _ | _ | _ |
+ * |----------------------------------------------------------------------------------------------------------------------+
+ * | Shift | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ | _ |
+ * |----------------------------------------------------------------------------------------------------------------------+
+ * | _ | _ | _ | _ | _ |
+ * `----------------------------------------------------------------------------------------------------------------------'
+ */
+ [_LIGHTS] = LAYOUT_60_ansi_split_bs_rshift(
+// _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _A _B _C _D _E
+/*0_*/ RGB_TOG, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+/*1_*/ RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+/*2_*/ KC_NO, RGB_HUD, RGB_SAD, RGB_VAD, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+/*3_*/ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+/*4_*/ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
+ )
+};
diff --git a/keyboards/dz60/keymaps/mpstewart/rules.mk b/keyboards/dz60/keymaps/mpstewart/rules.mk
new file mode 100644
index 00000000000..176a650c933
--- /dev/null
+++ b/keyboards/dz60/keymaps/mpstewart/rules.mk
@@ -0,0 +1,10 @@
+EXTRAKEY_ENABLE = yes
+NKRO_ENABLE = yes
+
+BACKLIGHT_ENABLE = yes
+MOUSEKEY_ENABLE = no
+AUDIO_ENABLE = no
+RGBLIGHT_ENABLE = yes
+LEADER_ENABLE = no
+MIDI_ENABLE = no
+BLUETOOTH_ENABLE = no
diff --git a/keyboards/dz60/rules.mk b/keyboards/dz60/rules.mk
index e5e9b846576..73b1d2ecb96 100644
--- a/keyboards/dz60/rules.mk
+++ b/keyboards/dz60/rules.mk
@@ -25,4 +25,4 @@ BACKLIGHT_ENABLE = yes # Enable per-key backlight LEDs
AUDIO_ENABLE = no # There is no speaker on this PCB
RGBLIGHT_ENABLE = yes # Enable the RGB underglow LEDs
-LAYOUTS = 60_ansi 60_ansi_split_bs_rshift 60_hhkb 60_iso 60_abnt2
+LAYOUTS = 60_ansi 60_ansi_split_bs_rshift 60_hhkb 60_iso 60_abnt2 60_tsangan_hhkb
diff --git a/keyboards/dztech/dz60rgb/v1/config.h b/keyboards/dztech/dz60rgb/v1/config.h
index d6f46242597..fb4e6224582 100644
--- a/keyboards/dztech/dz60rgb/v1/config.h
+++ b/keyboards/dztech/dz60rgb/v1/config.h
@@ -33,10 +33,8 @@
#define DEBOUNCE 3
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
-# define NO_ACTION_MACRO
-# define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
#ifdef RGB_MATRIX_ENABLE
# define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
diff --git a/keyboards/dztech/dz60rgb/v2/config.h b/keyboards/dztech/dz60rgb/v2/config.h
index b344e34b37a..6c5484fc8ad 100644
--- a/keyboards/dztech/dz60rgb/v2/config.h
+++ b/keyboards/dztech/dz60rgb/v2/config.h
@@ -33,10 +33,8 @@
#define DEBOUNCE 3
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
-# define NO_ACTION_MACRO
-# define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
#ifdef RGB_MATRIX_ENABLE
# define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
diff --git a/keyboards/dztech/dz60rgb_ansi/v1/config.h b/keyboards/dztech/dz60rgb_ansi/v1/config.h
index fb76ee7df9a..f34226efc65 100644
--- a/keyboards/dztech/dz60rgb_ansi/v1/config.h
+++ b/keyboards/dztech/dz60rgb_ansi/v1/config.h
@@ -33,10 +33,8 @@
#define DEBOUNCE 3
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
-# define NO_ACTION_MACRO
-# define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
#ifdef RGB_MATRIX_ENABLE
# define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
diff --git a/keyboards/dztech/dz60rgb_ansi/v2/config.h b/keyboards/dztech/dz60rgb_ansi/v2/config.h
index 3bd287b5f24..b9710805a69 100644
--- a/keyboards/dztech/dz60rgb_ansi/v2/config.h
+++ b/keyboards/dztech/dz60rgb_ansi/v2/config.h
@@ -33,10 +33,8 @@
#define DEBOUNCE 3
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
-# define NO_ACTION_MACRO
-# define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
#ifdef RGB_MATRIX_ENABLE
# define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
diff --git a/keyboards/dztech/dz60rgb_wkl/v1/config.h b/keyboards/dztech/dz60rgb_wkl/v1/config.h
index b5d267640bc..49ce1123604 100644
--- a/keyboards/dztech/dz60rgb_wkl/v1/config.h
+++ b/keyboards/dztech/dz60rgb_wkl/v1/config.h
@@ -33,10 +33,8 @@
#define DEBOUNCE 3
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
-# define NO_ACTION_MACRO
-# define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
#ifdef RGB_MATRIX_ENABLE
# define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
diff --git a/keyboards/dztech/dz60rgb_wkl/v2/config.h b/keyboards/dztech/dz60rgb_wkl/v2/config.h
index 4ae9b939511..e46495d73b7 100644
--- a/keyboards/dztech/dz60rgb_wkl/v2/config.h
+++ b/keyboards/dztech/dz60rgb_wkl/v2/config.h
@@ -33,10 +33,8 @@
#define DEBOUNCE 3
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
-# define NO_ACTION_MACRO
-# define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
#ifdef RGB_MATRIX_ENABLE
# define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
diff --git a/keyboards/dztech/dz65rgb/keymaps/drootz/config.h b/keyboards/dztech/dz65rgb/keymaps/drootz/config.h
new file mode 100644
index 00000000000..5810507975a
--- /dev/null
+++ b/keyboards/dztech/dz65rgb/keymaps/drootz/config.h
@@ -0,0 +1,52 @@
+#pragma once
+
+#define LEADER_PER_KEY_TIMING
+#define LEADER_TIMEOUT 425
+#define TAP_HOLD_CAPS_DELAY 80
+
+#ifdef RGB_MATRIX_ENABLE
+/* Reset default from dz65rgb/v2 config.h */
+# undef DISABLE_RGB_MATRIX_SPLASH
+# undef DISABLE_RGB_MATRIX_SOLID_SPLASH
+# undef RGB_MATRIX_LED_FLUSH_LIMIT
+# undef RGB_MATRIX_STARTUP_MODE
+# undef RGB_MATRIX_MAXIMUM_BRIGHTNESS
+# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 255
+# define RGB_MATRIX_LED_FLUSH_LIMIT 16 // default: 26
+# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_TYPING_HEATMAP
+# define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+# define RGB_MATRIX_STARTUP_HUE 10
+# define RGB_MATRIX_STARTUP_SAT 255
+# define RGB_MATRIX_STARTUP_VAL 200
+# define RGB_MATRIX_STARTUP_SPD 75
+/* Active RBG Modes */
+/* # define DISABLE_RGB_MATRIX_TYPING_HEATMAP // How hot is your WPM! */
+/* # define DISABLE_RGB_MATRIX_SPLASH // Full gradient & value pulse away from a single key hit then fades value out */
+/* # define DISABLE_RGB_MATRIX_SOLID_SPLASH // Hue & value pulse away from a single key hit then fades value out */
+/* Disabling to optimize firmware size */
+# define DISABLE_RGB_MATRIX_ALPHAS_MODS // Static dual hue, speed is hue for secondary hue
+# define DISABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT // Static gradient left to right, speed controls how much gradient changes
+# define DISABLE_RGB_MATRIX_BREATHING // Single hue brightness cycling animation
+# define DISABLE_RGB_MATRIX_BAND_VAL // Single hue band fading brightness scrolling left to right
+# define DISABLE_RGB_MATRIX_BAND_PINWHEEL_VAL // Single hue 3 blade spinning pinwheel fades brightness
+# define DISABLE_RGB_MATRIX_BAND_SPIRAL_VAL // Single hue spinning spiral fades brightness
+# define DISABLE_RGB_MATRIX_CYCLE_ALL // Full keyboard solid hue cycling through full gradient
+# define DISABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT // Full gradient scrolling left to right
+# define DISABLE_RGB_MATRIX_CYCLE_UP_DOWN // Full gradient scrolling top to bottom
+# define DISABLE_RGB_MATRIX_CYCLE_OUT_IN // Full gradient scrolling out to in
+# define DISABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL // Full dual gradients scrolling out to in
+# define DISABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON // Full gradent Chevron shapped scrolling left to right
+# define DISABLE_RGB_MATRIX_CYCLE_PINWHEEL // Full gradient spinning pinwheel around center of keyboard
+# define DISABLE_RGB_MATRIX_CYCLE_SPIRAL // Full gradient spinning spiral around center of keyboard
+# define DISABLE_RGB_MATRIX_DUAL_BEACON // Full gradient spinning around center of keyboard
+# define DISABLE_RGB_MATRIX_RAINBOW_BEACON // Full tighter gradient spinning around center of keyboard
+# define DISABLE_RGB_MATRIX_RAINBOW_PINWHEELS // Full dual gradients spinning two halfs of keyboard
+# define DISABLE_RGB_MATRIX_RAINDROPS // Randomly changes a single key's hue
+# define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS // Randomly changes a single key's hue and saturation
+# define DISABLE_RGB_MATRIX_SOLID_REACTIVE // Static single hue, pulses keys hit to shifted hue then fades to current hue
+#endif /* RBG MATRIX */
+
+/* Firmware size Optimizations */
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+#define NO_ACTION_ONESHOT
diff --git a/keyboards/dztech/dz65rgb/keymaps/drootz/keymap.c b/keyboards/dztech/dz65rgb/keymaps/drootz/keymap.c
new file mode 100644
index 00000000000..c313f467e3d
--- /dev/null
+++ b/keyboards/dztech/dz65rgb/keymaps/drootz/keymap.c
@@ -0,0 +1,757 @@
+#include QMK_KEYBOARD_H
+
+/**************** SOME GLOBALS *********************/
+
+bool onMac = false;
+bool isLeader = false;
+bool isBlinking = false;
+bool isRecording = false;
+bool isPlaying = false;
+const float led_dim_ratio = 0.50;
+static uint16_t blink_cycle_timer,
+ blink_fade_in_timer,
+ blink_fade_out_timer,
+ macro_one_play_timer,
+ macro_two_play_timer,
+ macro_play_blink_timer = 2000;
+static uint8_t fade_in_step_counter,
+ fade_out_step_counter,
+ blink_hsv_value;
+
+/**************** LED BLINK HELPER FUNCTIONS *********************/
+
+/*
+Function to set color with hsv arguments
+- "hue", "sat" and "val" arguments above 255 will get value from rgb matrix config
+- "val_ratio" is used to adjust brightness ratio
+*/
+void rgb_matrix_set_color_hsv(uint8_t led, uint16_t hue, uint16_t sat, uint16_t val, float val_ratio) {
+ const uint8_t h = hue <= 255 ? hue : rgb_matrix_config.hsv.h;
+ const uint8_t s = sat <= 255 ? sat : rgb_matrix_config.hsv.s;
+ const uint8_t v = val <= 255 ? val * val_ratio : rgb_matrix_config.hsv.v * val_ratio;
+ HSV hsv_in = {h, s, v};
+ RGB rgb_out = hsv_to_rgb(hsv_in);
+ rgb_matrix_set_color(led, rgb_out.r, rgb_out.g, rgb_out.b);
+}
+
+void reset_blink_cycle(void) {
+ blink_cycle_timer = timer_read();
+ blink_fade_in_timer = timer_read();
+ blink_fade_out_timer = timer_read();
+ blink_hsv_value = 0;
+ fade_in_step_counter = 0;
+ fade_out_step_counter = 0;
+}
+
+void reset_blink_status(void) {
+ isRecording = false;
+ isPlaying = false;
+ isBlinking = false;
+}
+
+void get_this_led_blinking(uint8_t led_index, bool speed, uint8_t hue, uint8_t sat) {
+ const uint16_t static_on_time = speed ? 200 : 500;
+ const uint16_t static_off_time = speed ? 200 : 500;
+ const uint8_t fade_timing = speed ? 100 : 150;
+ const uint8_t fade_step = speed ? 10 : 15;
+ const uint8_t fade_value_step_size = rgb_matrix_config.hsv.v / fade_step;
+ const uint8_t fade_cycle_time_elapsed = fade_timing / fade_step;
+ if (timer_elapsed(blink_cycle_timer) < static_on_time) {
+ if (timer_elapsed(blink_fade_in_timer) > fade_cycle_time_elapsed && fade_in_step_counter < fade_step) {
+ blink_hsv_value = blink_hsv_value + fade_value_step_size;
+ fade_in_step_counter = fade_in_step_counter + 1;
+ blink_fade_in_timer = timer_read();
+ }
+ } else {
+ if (timer_elapsed(blink_fade_out_timer) > fade_cycle_time_elapsed && fade_out_step_counter < fade_step) {
+ blink_hsv_value = blink_hsv_value - fade_value_step_size;
+ fade_out_step_counter = fade_out_step_counter + 1;
+ blink_fade_out_timer = timer_read();
+ }
+ }
+
+ rgb_matrix_set_color_hsv(led_index, hue, sat, blink_hsv_value, 0.75);
+
+ if (timer_elapsed(blink_cycle_timer) > static_on_time + static_off_time) {
+ reset_blink_cycle();
+ }
+}
+
+
+/**************** LAYOUT *********************/
+
+/*
+[LEDS]
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
+15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29
+30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43
+44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57
+58, 59, 60, 61, 62, 63, 64, 65, 66, 67
+
+[KEYS]
+ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, =, BCK, INS
+TAB, Q, W, E, R, T, Y, U, I, O, P, [, ], \,PGUP
+CPS, A, S, D, F, G, H, J, K, L, COL, QOT, RETURN,PGDN
+SFT, Z, X, C, V, B, N, M, COM, DOT, SLS, SHIFT, UP, DEL
+CTL, GUI, ALT, SPACEBAR, ALT, FN, CTL, LFT, DWN, RIT
+*/
+
+enum layers {
+ _MAIN,
+ _MAC,
+ _FN
+}
+
+const layers_leds_map[] = {
+ [_MAIN] = 45,
+ [_MAC] = 46,
+ [_FN] = 63
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_MAIN] = LAYOUT_65_ansi(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_LEAD, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_DEL,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [_MAC] = LAYOUT_65_ansi(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_LALT, KC_LGUI, KC_TRNS, KC_TRNS, MO(_FN), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [_FN] = LAYOUT_65_ansi(
+ DYN_REC_STOP, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO,
+ KC_TRNS, KC_MUTE, KC_VOLU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_SAD, RGB_SAI, DYN_MACRO_PLAY2, DYN_REC_START2,
+ KC_TRNS, KC_BRID, KC_VOLD, KC_BRIU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_HUD, RGB_HUI, DYN_MACRO_PLAY1, DYN_REC_START1,
+ KC_TRNS, TO(_MAIN), TO(_MAC), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RGB_SPD, RGB_SPI, KC_TRNS, RGB_VAI, KC_NO,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_RMOD, RGB_VAD, RGB_MOD
+ ),
+};
+
+//**************** MATRIX SCANS *********************//
+
+void rgb_matrix_indicators_user(void) {
+
+ #ifdef RGB_MATRIX_ENABLE
+
+ /*Ensure some leds don't completeley turn off if hsv value setting is below 100 in the rgb matrix config */
+ const uint8_t led_constant_val = rgb_matrix_config.hsv.v < 100 ? 100 : rgb_matrix_config.hsv.v;
+
+ /* CapsLock LED indicator */
+ if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) {
+ rgb_matrix_set_color_hsv(30, 999, 0, led_constant_val, 0.75); // WHITE
+ }
+
+ /* Current layer LED indicator */
+ rgb_matrix_set_color_hsv(layers_leds_map[get_highest_layer(layer_state)], 999, 0, led_constant_val, led_dim_ratio); // WHITE
+
+ /* Leader Key LED under-glow */
+ if (isLeader) {
+ rgb_matrix_set_color_hsv(14, 999, 999, 999, 1); // CONFIG
+ rgb_matrix_set_color_hsv(30, 999, 999, 999, 1); // CONFIG
+ } else {
+ rgb_matrix_set_color_hsv(14, 999, 999, 999, led_dim_ratio); // CONFIG
+ }
+
+ /* Blinking LED indicator when recording Dynamic Macro */
+ if (isRecording && isBlinking) {
+ get_this_led_blinking(0, false, 0, 255);
+ }
+
+ /* Blinking LED indicator when playing Dynamic Macro */
+ if (isPlaying && isBlinking) {
+ if (timer_elapsed(macro_one_play_timer) < macro_play_blink_timer || timer_elapsed(macro_two_play_timer) < macro_play_blink_timer) {
+ get_this_led_blinking(0, true, 85, 255);
+ } else {
+ if (isBlinking && isPlaying) {
+ reset_blink_status();
+ reset_blink_cycle();
+ }
+ }
+ }
+
+ switch (biton32(layer_state)) {
+ case _FN:
+ /* Dynamic Macro LED indicator */
+ if (isRecording) {
+ rgb_matrix_set_color_hsv(0, 0, 999, 999, 1); /* RED macro stop */
+ } else {
+ rgb_matrix_set_color_hsv(43, 0, 999, 999, led_dim_ratio); /* RED macro 1 record */
+ rgb_matrix_set_color_hsv(29, 0, 999, 999, led_dim_ratio); /* RED macro 2 record */
+ rgb_matrix_set_color_hsv(42, 85, 999, 999, led_dim_ratio); /* GREEN macro 1 play */
+ rgb_matrix_set_color_hsv(28, 85, 999, 999, led_dim_ratio); /* GREEN macro 2 play */
+ }
+ /* Layer LED indicators */
+ rgb_matrix_set_color_hsv(45, 999, 0, led_constant_val, led_dim_ratio); /* WHITE Layer _MAIN */
+ rgb_matrix_set_color_hsv(46, 999, 0, led_constant_val, led_dim_ratio); /* WHITE Layer _MAC */
+ break;
+ }
+
+ #endif /* RGB_MATRIX */
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ bool pressed = record->event.pressed;
+ if (pressed) {
+ switch (keycode) {
+ case TO(_MAC):
+ onMac = true;
+ break;
+ case TO(_MAIN):
+ onMac = false;
+ break;
+ }
+ }
+ return true;
+}
+
+//**************** LEADER *********************//
+
+#ifdef LEADER_ENABLE
+
+/******* FRENCH ACCENT HELPER FUNCTIONS & DECLARATIONS *************/
+/*Most comonly used accents only*/
+
+enum french_letter {
+ _A,
+ _E,
+ _I,
+ _O,
+ _U
+};
+
+const uint8_t french_letter_index[5] = {
+ [_A] = 0,
+ [_E] = 1,
+ [_I] = 2,
+ [_O] = 3,
+ [_U] = 4
+};
+
+enum french_accent {
+ _CIRCUMFLEX,
+ _GRAVE,
+ _ACUTE
+};
+
+const uint8_t french_accent_index[3] = {
+ [_CIRCUMFLEX] = 0,
+ [_GRAVE] = 1,
+ [_ACUTE] = 2
+};
+
+/*
+This represent unicode decimal values
+Each index will be mapped to numpad keycode to out put the correct sequence
+All codes in this array should be of size 3
+All accent codes have the same index position as in the french_accent_index Array
+*/
+const uint8_t french_decimal_unicodes[5][3][2] = { /*[Letter][Accent][Case]*/
+ {
+ {
+ 131, // â
+ 194 // Â
+ },{
+ 133, // à
+ 192 // À
+ }
+ },{
+ {
+ 136, // ê
+ 202 // Ê
+ },{
+ 138, // è
+ 200 // È
+ },{
+ 130, // é
+ 201 // É
+ }
+ },{
+ {
+ 140, // î
+ 206 // Î
+ }
+ },{
+ {
+ 147, // ô
+ 212 // Ô
+ }
+ },{
+ {
+ 150, // û
+ 219 // Û
+ },{
+ 151, // ù
+ 217 // Ù
+ }
+ }
+};
+
+void break_int_in_array(uint8_t int_code, uint8_t size, uint8_t *array) {
+ uint8_t i;
+ i = size;
+ while (i--) {
+ array[i] = int_code%10;
+ int_code /= 10;
+ }
+}
+
+/*
+Function meant to be used in Leader Key macros to output most commonly used french accents
+This is designed and work on an English language keyboard setting on both Windows and Mac
+=> accept french_letter and french_accent enum's as argument
+*/
+void send_french_accent(uint8_t letter, uint8_t accent) {
+
+ bool isCaps;
+ uint8_t decimal_unicode_in;
+ uint8_t decimal_unicode_size = 3;
+ uint8_t decimal_unicode_out[decimal_unicode_size];
+
+ /*Map to numpad keycodes*/
+ const uint16_t numpad_key_map[10] = {
+ KC_P0, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, KC_P7, KC_P8, KC_P9
+ };
+
+ /*Map to letter keycodes*/
+ const uint16_t french_letter_key_map[5] = {
+ KC_A, KC_E, KC_I, KC_O, KC_U
+ };
+
+ /*Map to mod keys for French Mac shortcuts*/
+ const uint16_t osx_mod_key_map[3] = {
+ KC_I, // _CIRCUMFLEX
+ KC_GRAVE, // _GRAVE
+ KC_E // _ACUTE
+ };
+
+ /*
+ Function to tap the correct keycodes in sequence for the
+ "Windows Alt Code" requested, aka Decimal Unicodes
+ */
+ void tap_win_alt_code(void) {
+ if (isCaps) {
+ tap_code(numpad_key_map[0]); // Leading 0 on all upper case "Windows alt codes"
+ }
+ for (int i = 0; i < decimal_unicode_size; ++i) {
+ tap_code(numpad_key_map[decimal_unicode_out[i]]);
+ }
+ }
+
+ isCaps = IS_HOST_LED_ON(USB_LED_CAPS_LOCK) ? true : false;
+
+ if (onMac) {
+ if (isCaps) {
+ SEND_STRING(SS_TAP(X_CAPSLOCK));
+ register_code(KC_LALT);
+ tap_code(osx_mod_key_map[accent]);
+ unregister_code(KC_LALT);
+ register_code(KC_LSFT);
+ tap_code(french_letter_key_map[letter]);
+ unregister_code(KC_LSFT);
+ tap_code(KC_CAPS);
+ } else {
+ register_code(KC_LALT);
+ tap_code(osx_mod_key_map[accent]);
+ unregister_code(KC_LALT);
+ tap_code(french_letter_key_map[letter]);
+ }
+ } else {
+ /*get the correct decimal unicode*/
+ decimal_unicode_in = isCaps ? french_decimal_unicodes[letter][accent][1] : french_decimal_unicodes[letter][accent][0];
+ break_int_in_array(decimal_unicode_in, decimal_unicode_size, decimal_unicode_out);
+ register_code(KC_LALT);
+ tap_win_alt_code();
+ unregister_code(KC_LALT);
+ }
+}
+
+/*Couple functions used to output the same macro on two different sequences*/
+
+/* (|) */
+void ldrkey_send_paranthesis_wrap_ini(void) {
+ SEND_STRING("()" SS_TAP(X_LEFT));
+}
+
+/* (X) */
+void ldrkey_send_paranthesis_wrap_word(void) {
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_LEFT)) "(" SS_LALT(SS_TAP(X_RIGHT)) ")") : SEND_STRING(SS_LCTL(SS_TAP(X_LEFT)) "(" SS_LCTL(SS_TAP(X_RIGHT)) ")");
+}
+
+/* (selection) */
+void ldrkey_send_paranthesis_wrap_selection(void) {
+ onMac ? SEND_STRING(SS_LGUI(SS_TAP(X_X)) "()" SS_TAP(X_LEFT) SS_LGUI(SS_TAP(X_V)) SS_TAP(X_RIGHT)) : SEND_STRING(SS_LCTL(SS_TAP(X_X)) "()" SS_TAP(X_LEFT) SS_LCTL(SS_TAP(X_V)) SS_TAP(X_RIGHT));
+}
+
+/* [|] */
+void ldrkey_send_bracket_wrap_ini(void) {
+ SEND_STRING("[]" SS_TAP(X_LEFT));
+}
+
+/* [X] */
+void ldrkey_send_bracket_wrap_word(void) {
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_LEFT)) "[" SS_LALT(SS_TAP(X_RIGHT)) "]") : SEND_STRING(SS_LCTL(SS_TAP(X_LEFT)) "[" SS_LCTL(SS_TAP(X_RIGHT)) "]");
+}
+
+/* [selection] */
+void ldrkey_send_bracket_wrap_selection(void) {
+ onMac ? SEND_STRING(SS_LGUI(SS_TAP(X_X)) "[]" SS_TAP(X_LEFT) SS_LGUI(SS_TAP(X_V)) SS_TAP(X_RIGHT)) : SEND_STRING(SS_LCTL(SS_TAP(X_X)) "[]" SS_TAP(X_LEFT) SS_LCTL(SS_TAP(X_V)) SS_TAP(X_RIGHT));
+}
+
+/* {|} */
+void ldrkey_send_curlybrace_wrap_ini(void) {
+ SEND_STRING("{}" SS_TAP(X_LEFT));
+}
+
+/* {X} */
+void ldrkey_send_curlybrace_wrap_word(void) {
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_LEFT)) "{" SS_LALT(SS_TAP(X_RIGHT)) "}") : SEND_STRING(SS_LCTL(SS_TAP(X_LEFT)) "{" SS_LCTL(SS_TAP(X_RIGHT)) "}");
+}
+
+/* {selection} */
+void ldrkey_send_curlybrace_wrap_selection(void) {
+ onMac ? SEND_STRING(SS_LGUI(SS_TAP(X_X)) "{}" SS_TAP(X_LEFT) SS_LGUI(SS_TAP(X_V)) SS_TAP(X_RIGHT)) : SEND_STRING(SS_LCTL(SS_TAP(X_X)) "{}" SS_TAP(X_LEFT) SS_LCTL(SS_TAP(X_V)) SS_TAP(X_RIGHT));
+}
+
+LEADER_EXTERNS();
+
+void matrix_scan_user(void)
+{
+ LEADER_DICTIONARY()
+ {
+ leading = false;
+ leader_end();
+
+ /* Sequences on layer _MAIN & _MAC */
+ /* éÉ => LdrKey > / */
+ SEQ_ONE_KEY(KC_SLSH) {
+ send_french_accent(_E, _ACUTE);
+ }
+ /* àÀ => LdrKey > A */
+ SEQ_ONE_KEY(KC_A) {
+ send_french_accent(_A, _GRAVE);
+ }
+ /* èÈ => LdrKey > E */
+ SEQ_ONE_KEY(KC_E) {
+ send_french_accent(_E, _GRAVE);
+ }
+ /* ùÙ => LdrKey > U */
+ SEQ_ONE_KEY(KC_U) {
+ send_french_accent(_U, _GRAVE);
+ }
+ /* â => LdrKey > A > A */
+ SEQ_TWO_KEYS(KC_A, KC_A) {
+ send_french_accent(_A, _CIRCUMFLEX);
+ }
+ /* êÊ => LdrKey > E > E */
+ SEQ_TWO_KEYS(KC_E, KC_E) {
+ send_french_accent(_E, _CIRCUMFLEX);
+ }
+ /* îÎ => LdrKey > I > I */
+ SEQ_TWO_KEYS(KC_I, KC_I) {
+ send_french_accent(_I, _CIRCUMFLEX);
+ }
+ /* ôÔ => LdrKey > O > O */
+ SEQ_TWO_KEYS(KC_O, KC_O) {
+ send_french_accent(_O, _CIRCUMFLEX);
+ }
+ /* ûÛ => LdrKey > U > U */
+ SEQ_TWO_KEYS(KC_U, KC_U) {
+ send_french_accent(_U, _CIRCUMFLEX);
+ }
+ /* çÇ => LdrKey > C */
+ SEQ_ONE_KEY(KC_C) {
+ if (onMac) {
+ SEND_STRING(SS_LALT("c"));
+ } else {
+ IS_HOST_LED_ON(USB_LED_CAPS_LOCK) ? SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_P1) SS_TAP(X_P2) SS_TAP(X_P8) SS_UP(X_LALT)) : SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_P1) SS_TAP(X_P3) SS_TAP(X_P5) SS_UP(X_LALT));
+ }
+ }
+ /* CapsLock */
+ SEQ_ONE_KEY(KC_LEAD) {
+ tap_code(KC_CAPS);
+ }
+ /* ± => LdrKey > = > - */
+ SEQ_TWO_KEYS(KC_EQL, KC_MINS) {
+ onMac ? SEND_STRING(SS_LALT(SS_LSFT(SS_TAP(X_EQL)))) : SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_P2) SS_TAP(X_P4) SS_TAP(X_P1) SS_UP(X_LALT));
+ }
+ /* ≤ => LdrKey > - > = */
+ SEQ_TWO_KEYS(KC_MINS, KC_EQL) {
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_COMM))) : SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_P2) SS_TAP(X_P4) SS_TAP(X_P3) SS_UP(X_LALT));
+ }
+ /* ≥ => LdrKey > = > = */
+ SEQ_TWO_KEYS(KC_EQL, KC_EQL) {
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_DOT))) : SEND_STRING(SS_DOWN(X_LALT) SS_TAP(X_P2) SS_TAP(X_P4) SS_TAP(X_P2) SS_UP(X_LALT));
+ }
+ /* <= => LdrKey > , > , */
+ SEQ_TWO_KEYS(KC_COMM, KC_COMM) {
+ SEND_STRING(SS_LSFT(SS_TAP(X_COMM)) SS_TAP(X_SPC) SS_TAP(X_EQL) SS_TAP(X_LEFT) SS_TAP(X_BSPC) SS_TAP(X_RIGHT));
+ }
+ /* => => LdrKey > . > . */
+ SEQ_TWO_KEYS(KC_DOT, KC_DOT) {
+ SEND_STRING("=>");
+ }
+ /* ", " => LdrKey > " " */
+ SEQ_ONE_KEY(KC_SPC) {
+ SEND_STRING(", ");
+ }
+ /* ". " => LdrKey > " " > " " */
+ SEQ_TWO_KEYS(KC_SPC, KC_SPC) {
+ SEND_STRING(". ");
+ }
+ /* Backward delete current word (on cursor) */
+ SEQ_TWO_KEYS(KC_BSPC, KC_BSPC) {
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_RIGHT)) SS_LALT(SS_LSFT(SS_TAP(X_LEFT))) SS_TAP(X_BSPC)) : SEND_STRING(SS_LCTL(SS_TAP(X_RIGHT)) SS_LCTL(SS_LSFT(SS_TAP(X_LEFT))) SS_TAP(X_BSPC));
+ }
+ /* Previous word delete */
+ SEQ_ONE_KEY(KC_BSPC) {
+ onMac ? SEND_STRING(SS_LALT(SS_LSFT(SS_TAP(X_LEFT))) SS_TAP(X_BSPC)) : SEND_STRING(SS_LCTL(SS_LSFT(SS_TAP(X_LEFT))) SS_TAP(X_BSPC));
+ }
+ /* Forward delete current word (on cursor) */
+ SEQ_TWO_KEYS(KC_DEL, KC_DEL) {
+
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_LEFT)) SS_LALT(SS_LSFT(SS_TAP(X_RIGHT))) SS_TAP(X_DEL)) : SEND_STRING(SS_LCTL(SS_TAP(X_LEFT)) SS_LCTL(SS_LSFT(SS_TAP(X_RIGHT))) SS_TAP(X_DEL));
+ }
+ /* Next word delete */
+ SEQ_ONE_KEY(KC_DEL) {
+ onMac ? SEND_STRING(SS_LALT(SS_LSFT(SS_TAP(X_RIGHT))) SS_TAP(X_DEL)): SEND_STRING(SS_LCTL(SS_LSFT(SS_TAP(X_RIGHT))) SS_TAP(X_DEL));
+ }
+ /* ` => LdrKey > Escape */
+ SEQ_ONE_KEY(KC_GESC) {
+ SEND_STRING("`");
+ }
+ /* ``` => LdrKey > Escape > Escape > Escape */
+ SEQ_THREE_KEYS(KC_GESC, KC_GESC, KC_GESC) {
+ SEND_STRING("```");
+ }
+ /* Printscreen => LdrKey > Insert */
+ SEQ_ONE_KEY(KC_INS) {
+ onMac ? SEND_STRING(SS_LGUI(SS_LSFT(SS_TAP(X_4)))) : SEND_STRING(SS_TAP(X_PSCR));
+ }
+ /* Home => LdrKey > Page Up */
+ SEQ_ONE_KEY(KC_PGUP) {
+ onMac ? SEND_STRING(SS_TAP(X_HOME)) : SEND_STRING(SS_LCTL(SS_TAP(X_HOME)));
+ }
+ /* End => LdrKey > Page Down */
+ SEQ_ONE_KEY(KC_PGDN) {
+ onMac ? SEND_STRING(SS_TAP(X_END)) : SEND_STRING(SS_LCTL(SS_TAP(X_END)));
+ }
+ /* Close Curernt File/Tab => LdrKey > W */
+ SEQ_ONE_KEY(KC_W) {
+ onMac ? SEND_STRING(SS_LGUI(SS_TAP(X_W))) : SEND_STRING(SS_LCTL(SS_TAP(X_W)));
+ }
+ /* Close Current App => LdrKey > Q */
+ SEQ_ONE_KEY(KC_Q) {
+ onMac ? SEND_STRING(SS_LGUI(SS_TAP(X_Q))) : SEND_STRING(SS_LALT(SS_TAP(X_F4)));
+ }
+ /* " => LdrKey > ' */
+ SEQ_ONE_KEY(KC_QUOT) {
+ SEND_STRING("\"");
+ }
+ /* "|" => LdrKey > ' > ' */
+ SEQ_TWO_KEYS(KC_QUOT, KC_QUOT) {
+ SEND_STRING("\"\"" SS_TAP(X_LEFT));
+ }
+ /* "X" wrap => LdrKey > ' > ' > ' */
+ SEQ_THREE_KEYS(KC_QUOT, KC_QUOT, KC_QUOT) {
+ onMac ? SEND_STRING(SS_LALT(SS_TAP(X_LEFT)) "\"" SS_LALT(SS_TAP(X_RIGHT)) "\"") : SEND_STRING(SS_LCTL(SS_TAP(X_LEFT)) "\"" SS_LCTL(SS_TAP(X_RIGHT)) "\"");
+ }
+ /* ( => LdrKey > Left Shift */
+ SEQ_ONE_KEY(KC_LSFT) {
+ SEND_STRING("(");
+ }
+ /* ) => LdrKey > Right Shift */
+ SEQ_ONE_KEY(KC_RSFT) {
+ SEND_STRING(")");
+ }
+ /* (|) => LdrKey > Left Shift > Left Shift */
+ SEQ_TWO_KEYS(KC_LSFT, KC_LSFT) {
+ ldrkey_send_paranthesis_wrap_ini();
+ }
+ /* (|) => LdrKey > Right Shift > Right Shift */
+ SEQ_TWO_KEYS(KC_RSFT, KC_RSFT) {
+ ldrkey_send_paranthesis_wrap_ini();
+ }
+ /* (X) wrap => LdrKey > Left Shift > W */
+ SEQ_TWO_KEYS(KC_LSFT, KC_W) {
+ ldrkey_send_paranthesis_wrap_word();
+ }
+ /* (X) wrap => LdrKey > Right Shift > W */
+ SEQ_TWO_KEYS(KC_RSFT, KC_W) {
+ ldrkey_send_paranthesis_wrap_word();
+ }
+ /* (X) wrap selection => LdrKey > Left Shift > W > W */
+ SEQ_THREE_KEYS(KC_LSFT, KC_W, KC_W) {
+ ldrkey_send_paranthesis_wrap_selection();
+ }
+ /* (X) wrap selection => LdrKey > Right Shift > W > W */
+ SEQ_THREE_KEYS(KC_RSFT, KC_W, KC_W) {
+ ldrkey_send_paranthesis_wrap_selection();
+ }
+ /* [ => LdrKey > Left CTL */
+ SEQ_ONE_KEY(KC_LCTL) {
+ SEND_STRING("[");
+ }
+ /* ] => LdrKey > Right CTL */
+ SEQ_ONE_KEY(KC_RCTL) {
+ SEND_STRING("]");
+ }
+ /* [|] => LdrKey > Left CTL > Left CTL */
+ SEQ_TWO_KEYS(KC_LCTL, KC_LCTL) {
+ ldrkey_send_bracket_wrap_ini();
+ }
+ /* [|] => LdrKey > Right CTL > Right CTL */
+ SEQ_TWO_KEYS(KC_RCTL, KC_RCTL) {
+ ldrkey_send_bracket_wrap_ini();
+ }
+ /* [X] wrap => LdrKey > Left CTL > W */
+ SEQ_TWO_KEYS(KC_LCTL, KC_W) {
+ ldrkey_send_bracket_wrap_word();
+ }
+ /* [X] wrap => LdrKey > Right CTL > W */
+ SEQ_TWO_KEYS(KC_RCTL, KC_W) {
+ ldrkey_send_bracket_wrap_word();
+ }
+ /* [X] wrap selection => LdrKey > Left CTL > W > W */
+ SEQ_THREE_KEYS(KC_LCTL, KC_W, KC_W) {
+ ldrkey_send_bracket_wrap_selection();
+ }
+ /* [X] wrap selection => LdrKey > Right CTL > W > W */
+ SEQ_THREE_KEYS(KC_RCTL, KC_W, KC_W) {
+ ldrkey_send_bracket_wrap_selection();
+ }
+ /* { => LdrKey > Left ALT */
+ SEQ_ONE_KEY(KC_LALT) {
+ SEND_STRING("{");
+ }
+ /* } => LdrKey > Right ALT */
+ SEQ_ONE_KEY(KC_RALT) {
+ SEND_STRING("}");
+ }
+ /* {|} => LdrKey > Left ALT > Left ALT */
+ SEQ_TWO_KEYS(KC_LALT, KC_LALT) {
+ ldrkey_send_curlybrace_wrap_ini();
+ }
+ /* {|} => LdrKey > Right ALT > Right ALT */
+ SEQ_TWO_KEYS(KC_RALT, KC_RALT) {
+ ldrkey_send_curlybrace_wrap_ini();
+ }
+ /* {X} wrap => LdrKey > Left ALT > W */
+ SEQ_TWO_KEYS(KC_LALT, KC_W) {
+ ldrkey_send_curlybrace_wrap_word();
+ }
+ /* {X} wrap => LdrKey > Right ALT > W */
+ SEQ_TWO_KEYS(KC_RALT, KC_W) {
+ ldrkey_send_curlybrace_wrap_word();
+ }
+ /* {X} wrap selection => LdrKey > Left ALT > W > W */
+ SEQ_THREE_KEYS(KC_LALT, KC_W, KC_W) {
+ ldrkey_send_curlybrace_wrap_selection();
+ }
+ /* {X} wrap selection => LdrKey > Right ALT > W > W */
+ SEQ_THREE_KEYS(KC_RALT, KC_W, KC_W) {
+ ldrkey_send_curlybrace_wrap_selection();
+ }
+ /* Select everything on this line before cursor => LdrKey > Left */
+ SEQ_ONE_KEY(KC_LEFT) {
+ onMac ? SEND_STRING(SS_LSFT(SS_LGUI(SS_TAP(X_LEFT)))) : SEND_STRING(SS_LSFT(SS_TAP(X_HOME)));
+ }
+ /* Select everything on this line after cursor => LdrKey > Right */
+ SEQ_ONE_KEY(KC_RIGHT) {
+ onMac ? SEND_STRING(SS_LSFT(SS_LGUI(SS_TAP(X_RIGHT)))) : SEND_STRING(SS_LSFT(SS_TAP(X_END)));
+ }
+ /* Select everything on this line before cursor and bring on previous line => LdrKey > Left > Left */
+ SEQ_TWO_KEYS(KC_LEFT, KC_LEFT) {
+ onMac ? SEND_STRING(SS_LSFT(SS_TAP(X_UP) SS_LGUI(SS_TAP(X_RIGHT)))) : SEND_STRING(SS_LSFT(SS_TAP(X_UP) SS_TAP(X_END)));
+ }
+ /* Select everything on this line => LdrKey > Right > Left */
+ SEQ_TWO_KEYS(KC_RIGHT, KC_LEFT) {
+ onMac ? SEND_STRING(SS_LGUI(SS_TAP(X_RIGHT) SS_LSFT(SS_LGUI(SS_TAP(X_LEFT))))) : SEND_STRING(SS_TAP(X_END) SS_LSFT(SS_TAP(X_HOME)));
+ }
+ /* Select 1x Page Up on the page before the cursor => LdrKey > Up */
+ SEQ_ONE_KEY(KC_UP) {
+ SEND_STRING(SS_LSFT(SS_TAP(X_PGUP)));
+ }
+ /* Select 1x Page Down on the page after the cursor => LdrKey > Down */
+ SEQ_ONE_KEY(KC_DOWN) {
+ SEND_STRING(SS_LSFT(SS_TAP(X_PGDN)));
+ }
+ /* Select everything on the page before the cursor => LdrKey > Up > Up */
+ SEQ_TWO_KEYS(KC_UP, KC_UP) {
+ onMac ? SEND_STRING(SS_LSFT(SS_LGUI(SS_TAP(X_UP)))) : SEND_STRING(SS_LSFT(SS_LCTL(SS_TAP(X_HOME))));
+ }
+ /* Select everything on the page after the cursor => LdrKey > Down > Down */
+ SEQ_TWO_KEYS(KC_DOWN, KC_DOWN) {
+ onMac ? SEND_STRING(SS_LSFT(SS_LGUI(SS_TAP(X_DOWN)))) : SEND_STRING(SS_LSFT(SS_LCTL(SS_TAP(X_END))));
+ }
+ /* HELPER => spit out the url of the layout description page on github */
+ SEQ_FIVE_KEYS(KC_GESC, KC_GESC, KC_GESC, KC_GESC, KC_GESC) {
+ SEND_STRING("https://github.com/qmk/qmk_firmware/tree/master/keyboards/dztech/dz65rgb/keymaps/drootz");
+ }
+ /* google.ca => LdrKey > G > G */
+ SEQ_TWO_KEYS(KC_G, KC_G) {
+ SEND_STRING("https://google.ca" SS_TAP(X_ENT));
+ }
+ /* @gmail => LdrKey > M > L > T */
+ SEQ_THREE_KEYS(KC_M, KC_L, KC_T) {
+ SEND_STRING("mailto." SS_TAP(X_D) SS_TAP(X_A) SS_TAP(X_N) SS_TAP(X_I) SS_TAP(X_E) SS_TAP(X_L) SS_TAP(X_R) SS_TAP(X_A) SS_TAP(X_C) SS_TAP(X_I) SS_TAP(X_N) SS_TAP(X_E) "@gmail.com");
+ }
+ /* Show Desktop => LdrKey > D */
+ SEQ_ONE_KEY(KC_D) {
+ onMac ? SEND_STRING(SS_LGUI(SS_TAP(X_SPC)) "Mission" SS_TAP(X_ENT)) : SEND_STRING(SS_LGUI(SS_TAP(X_D)));
+ }
+ }
+}
+
+void leader_start(void) {
+ isLeader = true;
+}
+
+void leader_end(void) {
+ isLeader = false;
+}
+
+#endif /* LEADER */
+
+/**************** DYNAMIC MACRO *********************/
+
+void dynamic_macro_record_start_user(void) {
+ onMac = false; /* reset layer bool as dynamic macro clear the keyboard and reset layers. */
+ if (!isBlinking && !isRecording) {
+ reset_blink_cycle();
+ isBlinking = true;
+ isRecording = true;
+ }
+}
+
+void dynamic_macro_record_end_user(int8_t direction) {
+ if (isBlinking && isRecording) {
+ reset_blink_status();
+ reset_blink_cycle();
+ }
+}
+
+void dynamic_macro_play_user(int8_t direction) {
+ switch (direction) {
+ case 1:
+ if (!isBlinking && !isPlaying) {
+ reset_blink_cycle();
+ isBlinking = true;
+ isPlaying = true;
+ macro_one_play_timer = timer_read();
+ }
+ break;
+ case -1:
+ if (!isBlinking && !isPlaying) {
+ reset_blink_cycle();
+ isBlinking = true;
+ isPlaying = true;
+ macro_two_play_timer = timer_read();
+ }
+ break;
+ }
+}
diff --git a/keyboards/dztech/dz65rgb/keymaps/drootz/readme.md b/keyboards/dztech/dz65rgb/keymaps/drootz/readme.md
new file mode 100644
index 00000000000..15f15d752be
--- /dev/null
+++ b/keyboards/dztech/dz65rgb/keymaps/drootz/readme.md
@@ -0,0 +1,210 @@
+
+
+# Drootz's DZ65RGBv2 ANSI Layout
+
+This layout fit best people who mainly type in English but regularly need to type in French _(using an English keyboard in OS setting)_. There are also some cool LED indicator effects and tons of Leader Key bindings/macros designed to work on both Mac and Windows OS. I tried to keep things as simple as possible from a usability perspective. Enjoy!
+
+- [LAYERS](#LAYERS)
+- [LEADER KEY BINDINGS:](#LEADER-KEY-BINDINGS)
+ - [OS and Keyboard Macros](#OS-and-Keyboard-Macros)
+ - [French Accents](#French-Accents)
+ - [Special Characters and Punctuation](#Special-Characters-and-Punctuation)
+ - [Text Selection Macros](#Text-Selection-Macros)
+ - [Expanded Space Cadet Macros](#Expanded-Space-Cadet-Macros)
+ - [Text Expanders](#Text-Expanders)
+- [STEP BY STEP FLASH INSTRUCTIONS](#STEP-BY-STEP-FLASH-INSTRUCTIONS)
+
+## HIGH LEVEL DESCRIPTION
+
+#### Dual function Capslock key
+- Single tap to trigger the Leader Key
+- Double tap to toggle Capslock ON/OFF
+
+#### 70+ useful Leader Key bindings and macros
+- "Designed" to work on both Mac and Windows OS with an English keyboard OS setting
+- Per key timing set at 425ms. Never a key sequence!
+- 20+ Punctuation, ASCII, System shortcuts and macros
+- 15+ French accents (è, é, ê, È, É, Ê, à, etc.)
+ - No need to switch to a French keyboard OS setting!
+ - Preserve Capslock if enabled
+- 8 Text "selection" shortcuts
+- 20+ Expanded "Space Cadet" feature with Shift, Ctrl, Alt and DoubleQuote for (), [], {} and ""
+- Few useful strings output for my workflow (You may want to change or remove them...)
+
+#### Dynamic Macros enabled
+- Record/Play up to 2 Macros
+- Nesting allowed
+
+#### Kept only 4 RGB matrix animations due to size of firmware
+- Typing Heatmap => How hot is your WPM! (preferred animation because of LED indicators)
+- Matrix Splash => Full gradient & value pulse away from a single key hit then fades value out
+- Solid Splash => Hue & value pulse away from a single key hit then fades value out
+- Solid Color => Static single hue, no speed support
+
+#### LED indicators and animations
+- White led when Capslock toggle ON
+- The brightness of all the other indicator can be adjusted globally with the RGB matrix brightness setting on layer \_FN
+- White LED indicator for layer selection and current layer identification
+- Red and green blinking indicator when "recording" or "playing" Dynamic Macros
+- Leader Key LED indicator:
+ - Persistent 50% dimmed under-glow on top right corner key
+ - Light up at 100% for the duration of the Leader Key timeout when activated
+ - Hue, saturation and brightness can be globally adjusted with the RGB matrix settings on layer \_FN
+
+#### 3 Layers
+- \_MAIN: Default layer for Windows OS
+- \_MAC: Transparent layer that switch left hand modifier KC_LALT and KC_LGUI keys for MacOS
+- \_FN: Functions & settings layer:
+ - Macro 1 & 2 keycodes (Record, Stop, Play) with LED indicators
+ - F Keys (F1...F12) on number row
+ - RGB matrix & animation settings
+ - Screen brightness & volume system controls
+ - Layer selection
+
+## LAYERS
+
+- Colored keys on the layout visuals below represent the position of the LED indicators on each layer.
+- Press down and hold the MO(\_FN) key to access the \_FN layer
+- Double tap on the Capslock key to toggle Capslock ON/OFF
+- \_TRNS keys use the next lowest non-transparent key (on lower layers)
+- \_NO keys are ignored (nothing happens)
+
+### [Layer 0: \_MAIN](http://www.keyboard-layout-editor.com/#/gists/67c22220856a927766bd3e0331ed782a)
+
+
+### [Layer 1: \_MAC](http://www.keyboard-layout-editor.com/#/gists/4a32d80c67c778658febf28524fb5000)
+
+
+### [Layer 2: \_FN](http://www.keyboard-layout-editor.com/#/gists/b583bd7cc5b0a75b4610bbda18fba65e)
+
+
+## LEADER KEY BINDINGS
+
+The Leader Key on this layout is triggered by tapping the Capslock key once. Once triggered, we have 450ms between each key press to type any one of the sequences listed below. All sequences are designed to work on both Mac and Windows with an English keyboard OS setting.
+
+- [OS and Keyboard Macros](#OS-and-Keyboard-Macros)
+- [French Accents](#French-Accents)
+- [Special Characters and Ponctuation](#Special-Characters-and-Ponctuation)
+- [Text Selection Macros](#Text-Selection-Macros)
+- [Expanded Space Cadet Macros](#Expanded-Space-Cadet-Macros)
+- [Text Expanders](#Text-Expanders)
+
+#### Legend:
+
+| Acronym | Description |
+| :--- | :--- |
+| LDR | Leader Key |
+| SFT | Shift key |
+| CTL | Control key |
+| ESC | Escape key |
+| ¶ | Text cursor position |
+
+### OS and Keyboard Macros
+
+| Output | Sequence | Description
+| :--- | :--- | :--- |
+| Toggle Capslock | `LDR LDR` | Single tap Capslock to trigger the LDR key |
+| Delete all previous characters in word on cursor OR; | `LDR BACKSPACE` | n/a |
+| => Delete previous word if triggered repeatedly | `LDR BACKSPACE` | n/a |
+| Delete all forward characters in word on cursor OR; | `LDR DEL` | n/a |
+| => Delete next word if triggered repeatedly | `LDR DEL` | n/a |
+| Backward Delete whole word on cursor | `LDR BACKSPACE BACKSPACE` | n/a |
+| Forward Delete whole word on cursor | `LDR DEL DEL` | n/a |
+| Printscreen | `LDR INSERT` | n/a |
+| Home | `LDR PAGE-UP` | n/a |
+| End | `LDR PAGE-DOWN` | n/a |
+| OS: Close current file/tab | `LDR W` | n/a |
+| OS: Close current application | `LDR Q` | n/a |
+| OS: Show Desktop(Win) or Mission Control(Mac) | `LDR D` | The Mac sequence will work with LaunchBar (Cmd+Space) |
+
+### French Accents
+
+| Output | Sequence | Description
+| :--- | :--- | :--- |
+| `à`¶ or `À`¶ | `LDR A` | Will output upper character if Capslock enabled. |
+| `â`¶ or `Â`¶ | `LDR A A` | Will output upper character if Capslock enabled. |
+| `ç`¶ or `Ç`¶ | `LDR C` | Will output upper character if Capslock enabled. |
+| `è`¶ or `È`¶ | `LDR E` | Will output upper character if Capslock enabled. |
+| `ê`¶ or `Ê`¶ | `LDR E E` | Will output upper character if Capslock enabled. |
+| `é`¶ or `É`¶ | `LDR /` | Will output upper character if Capslock enabled |
+| `î`¶ or `Î`¶ | `LDR I I` | Will output upper character if Capslock enabled. |
+| `ô`¶ or `Ô`¶ | `LDR O O` | Will output upper character if Capslock enabled. |
+| `ù`¶ or `Ù`¶ | `LDR U` | Will output upper character if Capslock enabled. |
+| `û`¶ or `Û`¶ | `LDR U U` | Will output upper character if Capslock enabled. |
+
+### Special Characters and Punctuation
+
+| Output | Sequence | Description |
+| :--- | :--- | :--- |
+| `±`¶ | `LDR = -` | n/a |
+| `≤`¶ | `LDR - =` | n/a |
+| `≥`¶ | `LDR = =` | n/a |
+| `=>`¶ | `LDR , ,` | n/a |
+| `<=`¶ | `LDR . .` | n/a |
+| ``` ` ``` ¶ | `LDR ESC` | n/a |
+| \`\`\` ¶ | `LDR ESC ESC ESC` | n/a |
+| `,` space ¶ | `LDR SPACE` | n/a |
+| `.` space ¶ | `LDR SPACE SPACE` | n/a |
+
+### Text Selection Macros
+
+| Output | Sequence |
+| :--- | :--- |
+| Select everything on this line before cursor | `LDR LEFT-ARROW` |
+| Select everything on this line after cursor | `LDR RIGHT-ARROW` |
+| Select everything on this line before cursor up to end of previous line | `LDR LEFT-ARROW LEFT-ARROW` | n/a |
+| Select everything on this line | `LDR RIGHT-ARROW LEFT-ARROW` |
+| Select 1x Page Up on the page before the cursor | `LDR UP-ARROW` |
+| Select 1x Page Down on the page after the cursor | `LDR DOWN-ARROW` |
+| Select everything on the page before the cursor | `LDR UP-ARROW UP-ARROW` |
+| Select everything on the page after the cursor | `LDR DOWN-ARROW DOWN-ARROW` |
+
+### Expanded Space Cadet Macros
+
+| Output | Sequence | Description |
+| :--- | :--- | :--- |
+| `"`¶ | `LDR '` | Will output single double-quote |
+| `"`¶`"` | `LDR ' '` | Will wrap cursor between two double-quotes |
+| `"`WORD`"`¶ | `LDR ' ' '` | Will wrap word on cursor between two double-quotes |
+| `(`¶ | `LDR LEFT-SFT` | Will output single left parenthesis |
+| `)`¶ | `LDR RIGHT-SFT` | Will output single right parenthesis |
+| `(`¶`)` | `LDR LEFT-SFT LEFT-SFT` | Will wrap cursor between two parenthesis' |
+| `(`¶`)` | `LDR RIGHT-SFT RIGHT-SFT` | Will wrap cursor between two parenthesis' |
+| `(`WORD`)`¶ | `LDR LEFT-SFT W` | Will wrap word on cursor between two parenthesis' |
+| `(`WORD`)`¶ | `LDR RIGHT-SFT W` | Will wrap word on cursor between two parenthesis' |
+| `(`SELECTION`)`¶ | `LDR LEFT-SFT W W` | Will wrap selection between two parenthesis' |
+| `(`SELECTION`)`¶ | `LDR RIGHT-SFT W W` | Will wrap selection between two parenthesis' |
+| `[`¶ | `LDR LEFT-CTL` | Will output single left bracket |
+| `]`¶ | `LDR RIGHT-CTL` | Will output single right bracket |
+| `[`¶`]` | `LDR LEFT-CTL LEFT-CTL` | Will wrap cursor between two brackets' |
+| `[`¶`]` | `LDR RIGHT-CTL RIGHT-CTL` | Will wrap cursor between two brackets' |
+| `[`WORD`]`¶ | `LDR LEFT-CTL W` | Will wrap word on cursor between two brackets' |
+| `[`WORD`]`¶ | `LDR RIGHT-CTL W` | Will wrap word on cursor between two brackets' |
+| `[`SELECTION`]`¶ | `LDR LEFT-CTL W W` | Will wrap selection between two brackets' |
+| `[`SELECTION`]`¶ | `LDR RIGHT-CTL W W` | Will wrap selection between two brackets' |
+| `{`¶ | `LDR LEFT-ALT` | Will output single left curly brace |
+| `}`¶ | `LDR RIGHT-ALT` | Will output single right curly brace |
+| `{`¶`}` | `LDR LEFT-ALT LEFT-ALT` | Will wrap cursor between two curly braces' |
+| `{`¶`}` | `LDR RIGHT-ALT RIGHT-ALT` | Will wrap cursor between two curly braces' |
+| `{`WORD`}`¶ | `LDR LEFT-ALT W` | Will wrap word on cursor between two curly braces' |
+| `{`WORD`}`¶ | `LDR RIGHT-ALT W` | Will wrap word on cursor between two curly braces' |
+| `{`SELECTION`}`¶ | `LDR LEFT-ALT W W` | Will wrap selection between two curly braces' |
+| `{`SELECTION`}`¶ | `LDR RIGHT-ALT W W` | Will wrap selection between two curly braces' |
+
+### Text Expanders
+
+| Output | Sequence | Description |
+| :--- | :--- | :--- |
+| https://google.ca | `LDR G G` | n/a |
+| Layout Help URL | `LDR ESC ESC ESC ESC ESC` | URL to this readme.md page |
+| My Gmail | `LDR M L T` | You may want to update this before compiling the firmware |
+
+## STEP BY STEP FLASH INSTRUCTIONS
+1. Build the Firmware. Run build command in directory: `make dztech/dz65rgb/v2:drootz`
+ - Approximate firmware size: 27302/28672 (95%, 1370 bytes free)
+2. Flash the Firmware:
+ - Open QMK Toolbox Application
+ - Open firmware file: dztech_dz65rgb_v2_drootz.hex
+ - Unplug keyboard USB, and hold the ESC key while plugging it back in
+ - Check that QMK Toolbox displays: *** DFU device connected.
+ - Hit the flash button!
diff --git a/keyboards/dztech/dz65rgb/keymaps/drootz/rules.mk b/keyboards/dztech/dz65rgb/keymaps/drootz/rules.mk
new file mode 100644
index 00000000000..24a765ab9a0
--- /dev/null
+++ b/keyboards/dztech/dz65rgb/keymaps/drootz/rules.mk
@@ -0,0 +1,11 @@
+DYNAMIC_MACRO_ENABLE = yes
+LEADER_ENABLE = yes
+
+# Firmware size Optimizations
+EXTRAFLAGS += -flto
+MOUSEKEY_ENABLE = no
+NKRO_ENABLE = no
+SPACE_CADET_ENABLE = no
+TAP_DANCE_ENABLE = no
+UNICODEMAP_ENABLE = no
+SPLIT_KEYBOARD = no
diff --git a/keyboards/dztech/dz65rgb/v1/config.h b/keyboards/dztech/dz65rgb/v1/config.h
index bf700a2384a..9cd7d293ce4 100644
--- a/keyboards/dztech/dz65rgb/v1/config.h
+++ b/keyboards/dztech/dz65rgb/v1/config.h
@@ -29,10 +29,8 @@
#define DIODE_DIRECTION COL2ROW
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
-# define NO_ACTION_MACRO
-# define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
#ifdef RGB_MATRIX_ENABLE
# define RGB_MATRIX_LED_PROCESS_LIMIT 4
diff --git a/keyboards/dztech/dz65rgb/v2/config.h b/keyboards/dztech/dz65rgb/v2/config.h
index 6a55f876674..83cf0110abe 100644
--- a/keyboards/dztech/dz65rgb/v2/config.h
+++ b/keyboards/dztech/dz65rgb/v2/config.h
@@ -29,10 +29,8 @@
#define DIODE_DIRECTION COL2ROW
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
-# define NO_ACTION_MACRO
-# define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
#ifdef RGB_MATRIX_ENABLE
# define RGB_MATRIX_LED_PROCESS_LIMIT 4
diff --git a/keyboards/eniigmakeyboards/ek87/config.h b/keyboards/eniigmakeyboards/ek87/config.h
new file mode 100644
index 00000000000..2f20a159482
--- /dev/null
+++ b/keyboards/eniigmakeyboards/ek87/config.h
@@ -0,0 +1,250 @@
+/*
+Copyright 2020 adamws
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x454B
+#define PRODUCT_ID 0x0001
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Eniigma Keyboards
+#define PRODUCT Eniigma Keyboards ek87
+#define DESCRIPTION Eniigma Keyboards ek87
+
+/* key matrix size */
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 18
+
+/*
+ * 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, B7, D0 }
+#define MATRIX_COL_PINS { F4, F5, F6, F7, C7, C6, B6, B5, B4, D7, D6, D4, F0, F1, E6, D3, D2, D1 }
+#define UNUSED_PINS { D5 }
+
+/* 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 BACKLIGHT_PIN B7
+// #define BACKLIGHT_BREATHING
+// #define BACKLIGHT_LEVELS 3
+
+// #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 userful 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
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+/* defined by default; to change, uncomment and set to the combination you want */
+// #define IS_COMMAND() (get_mods() == MOD_MASK_SHIFT)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP H
+//#define MAGIC_KEY_HELP_ALT SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER0_ALT GRAVE
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER B
+//#define MAGIC_KEY_BOOTLOADER_ALT ESC
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_EEPROM_CLEAR BSPACE
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+
+/* disable these deprecated features by default */
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+/*
+ * MIDI options
+ */
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+//#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 1
+
+/*
+ * 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
+*/
+
+/* Bootmagic Lite key configuration */
+// #define BOOTMAGIC_LITE_ROW 0
+// #define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/eniigmakeyboards/ek87/ek87.c b/keyboards/eniigmakeyboards/ek87/ek87.c
new file mode 100644
index 00000000000..0101d679d98
--- /dev/null
+++ b/keyboards/eniigmakeyboards/ek87/ek87.c
@@ -0,0 +1,17 @@
+/* Copyright 2020 adamws
+ *
+ * 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 .
+ */
+
+#include "ek87.h"
diff --git a/keyboards/eniigmakeyboards/ek87/ek87.h b/keyboards/eniigmakeyboards/ek87/ek87.h
new file mode 100644
index 00000000000..121365d596c
--- /dev/null
+++ b/keyboards/eniigmakeyboards/ek87/ek87.h
@@ -0,0 +1,150 @@
+/* Copyright 2020 adamws
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+#define XXX KC_NO
+
+/* 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_all( \
+ k00, k02, k03, k04, k05, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, k0h, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k1g, k1h, \
+ k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2h, \
+ k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4d, k4e, k4g, \
+ k50, k51, k53, k56, k5a, k5b, k5d, k5e, k5f, k5g, k5h \
+) \
+{ \
+ { k00, XXX, k02, k03, k04, k05, XXX, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, k0h }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k1g, k1h }, \
+ { k20, XXX, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2h }, \
+ { k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, XXX, XXX, XXX, XXX }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, XXX, k4d, k4e, XXX, k4g, XXX }, \
+ { k50, k51, XXX, k53, XXX, XXX, k56, XXX, XXX, XXX, k5a, k5b, XXX, k5d, k5e, k5f, k5g, k5h } \
+}
+
+#define LAYOUT_tkl_ansi( \
+ k00, k02, k03, k04, k05, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, k0h, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1f, k1g, k1h, \
+ k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2h, \
+ k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, \
+ k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4d, k4g, \
+ k50, k51, k53, k56, k5a, k5b, k5d, k5e, k5f, k5g, k5h \
+) \
+{ \
+ { k00, XXX, k02, k03, k04, k05, XXX, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, k0h }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, XXX, k1f, k1g, k1h }, \
+ { k20, XXX, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2h }, \
+ { k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, XXX, XXX, XXX, XXX }, \
+ { XXX, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, XXX, k4d, XXX, XXX, k4g, XXX }, \
+ { k50, k51, XXX, k53, XXX, XXX, k56, XXX, XXX, XXX, k5a, k5b, XXX, k5d, k5e, k5f, k5g, k5h } \
+}
+
+#define LAYOUT_tkl_ansi_tsangan( \
+ k00, k02, k03, k04, k05, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, k0h, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1f, k1g, k1h, \
+ k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2h, \
+ k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, \
+ k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4d, k4g, \
+ k50, k51, k53, k56, k5b, k5d, k5e, k5f, k5g, k5h \
+) \
+{ \
+ { k00, XXX, k02, k03, k04, k05, XXX, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, k0h }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, XXX, k1f, k1g, k1h }, \
+ { k20, XXX, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2h }, \
+ { k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, XXX, XXX, XXX, XXX }, \
+ { XXX, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, XXX, k4d, XXX, XXX, k4g, XXX }, \
+ { k50, k51, XXX, k53, XXX, XXX, k56, XXX, XXX, XXX, XXX, k5b, XXX, k5d, k5e, k5f, k5g, k5h } \
+}
+
+#define LAYOUT_tkl_iso( \
+ k00, k02, k03, k04, k05, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, k0h, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1f, k1g, k1h, \
+ k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2h, \
+ k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4d, k4g, \
+ k50, k51, k53, k56, k5a, k5b, k5d, k5e, k5f, k5g, k5h \
+) \
+{ \
+ { k00, XXX, k02, k03, k04, k05, XXX, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, k0h }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, XXX, k1f, k1g, k1h }, \
+ { k20, XXX, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2h }, \
+ { k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, XXX, XXX, XXX, XXX }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, XXX, k4d, XXX, XXX, k4g, XXX }, \
+ { k50, k51, XXX, k53, XXX, XXX, k56, XXX, XXX, XXX, k5a, k5b, XXX, k5d, k5e, k5f, k5g, k5h } \
+}
+
+#define LAYOUT_tkl_iso_tsangan( \
+ k00, k02, k03, k04, k05, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, k0h, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1f, k1g, k1h, \
+ k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2h, \
+ k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4d, k4g, \
+ k50, k51, k53, k56, k5b, k5d, k5e, k5f, k5g, k5h \
+) \
+{ \
+ { k00, XXX, k02, k03, k04, k05, XXX, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, k0h }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, XXX, k1f, k1g, k1h }, \
+ { k20, XXX, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2h }, \
+ { k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, XXX, XXX, XXX, XXX }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, XXX, k4d, XXX, XXX, k4g, XXX }, \
+ { k50, k51, XXX, k53, XXX, XXX, k56, XXX, XXX, XXX, XX, k5b, XXX, k5d, k5e, k5f, k5g, k5h } \
+}
+
+#define LAYOUT_tkl_iso_split_bs( \
+ k00, k02, k03, k04, k05, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, k0h, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k1g, k1h, \
+ k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2h, \
+ k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4d, k4g, \
+ k50, k51, k53, k56, k5a, k5b, k5d, k5e, k5f, k5g, k5h \
+) \
+{ \
+ { k00, XXX, k02, k03, k04, k05, XXX, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, k0h }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k1g, k1h }, \
+ { k20, XXX, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2h }, \
+ { k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, XXX, XXX, XXX, XXX }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, XXX, k4d, XXX, XXX, k4g, XXX }, \
+ { k50, k51, XXX, k53, XXX, XXX, k56, XXX, XXX, XXX, k5a, k5b, XXX, k5d, k5e, k5f, k5g, k5h } \
+}
+
+#define LAYOUT_tkl_iso_split_rshift( \
+ k00, k02, k03, k04, k05, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, k0h, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1f, k1g, k1h, \
+ k20, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2h, \
+ k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4d, k4e, k4g, \
+ k50, k51, k53, k56, k5a, k5b, k5d, k5e, k5f, k5g, k5h \
+) \
+{ \
+ { k00, XXX, k02, k03, k04, k05, XXX, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k0g, k0h }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, XXX, k1f, k1g, k1h }, \
+ { k20, XXX, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2h }, \
+ { k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, XXX, XXX, XXX, XXX }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, XXX, k4d, k4e, XXX, k4g, XXX }, \
+ { k50, k51, XXX, k53, XXX, XXX, k56, XXX, XXX, XXX, k5a, k5b, XXX, k5d, k5e, k5f, k5g, k5h } \
+}
+
+
diff --git a/keyboards/eniigmakeyboards/ek87/info.json b/keyboards/eniigmakeyboards/ek87/info.json
new file mode 100644
index 00000000000..d8e622ca90d
--- /dev/null
+++ b/keyboards/eniigmakeyboards/ek87/info.json
@@ -0,0 +1,72 @@
+{
+ "keyboard_name": "ek87",
+ "url": "",
+ "maintainer": "adamws",
+ "width": 18.25,
+ "height": 6.25,
+ "layouts": {
+ "LAYOUT_all": {
+ "layout":[
+ {"label":"k00","x":0,"y":0},{"label":"k02","x":2,"y":0},{"label":"k03","x":3,"y":0},{"label":"k04","x":4,"y":0},{"label":"k05","x":5,"y":0},{"label":"k07","x":6.5,"y":0},{"label":"k08","x":7.5,"y":0},{"label":"k09","x":8.5,"y":0},{"label":"k0a","x":9.5,"y":0},{"label":"k0b","x":11,"y":0},{"label":"k0c","x":12,"y":0},{"label":"k0d","x":13,"y":0},{"label":"k0e","x":14,"y":0},{"label":"k0f","x":15.25,"y":0},{"label":"k0g","x":16.25,"y":0},{"label":"k0h","x":17.25,"y":0},
+ {"label":"k10","x":0,"y":1.25},{"label":"k11","x":1,"y":1.25},{"label":"k12","x":2,"y":1.25},{"label":"k13","x":3,"y":1.25},{"label":"k14","x":4,"y":1.25},{"label":"k15","x":5,"y":1.25},{"label":"k16","x":6,"y":1.25},{"label":"k17","x":7,"y":1.25},{"label":"k18","x":8,"y":1.25},{"label":"k19","x":9,"y":1.25},{"label":"k1a","x":10,"y":1.25},{"label":"k1b","x":11,"y":1.25},{"label":"k1c","x":12,"y":1.25},{"label":"k1d","x":13,"y":1.25},{"label":"k1e","x":14,"y":1.25},{"label":"k1f","x":15.25,"y":1.25},{"label":"k1g","x":16.25,"y":1.25},{"label":"k1h","x":17.25,"y":1.25},
+ {"label":"k20","x":0,"y":2.25,"w":1.5},{"label":"k22","x":1.5,"y":2.25},{"label":"k23","x":2.5,"y":2.25},{"label":"k24","x":3.5,"y":2.25},{"label":"k25","x":4.5,"y":2.25},{"label":"k26","x":5.5,"y":2.25},{"label":"k27","x":6.5,"y":2.25},{"label":"k28","x":7.5,"y":2.25},{"label":"k29","x":8.5,"y":2.25},{"label":"k2a","x":9.5,"y":2.25},{"label":"k2b","x":10.5,"y":2.25},{"label":"k2c","x":11.5,"y":2.25},{"label":"k2d","x":12.5,"y":2.25},{"label":"k2e","x":13.5,"y":2.25,"w":1.5},{"label":"k2f","x":15.25,"y":2.25},{"label":"k2g","x":16.25,"y":2.25},{"label":"k2h","x":17.25,"y":2.25},
+ {"label":"k30","x":0,"y":3.25,"w":1.75},{"label":"k32","x":1.75,"y":3.25},{"label":"k33","x":2.75,"y":3.25},{"label":"k34","x":3.75,"y":3.25},{"label":"k35","x":4.75,"y":3.25},{"label":"k36","x":5.75,"y":3.25},{"label":"k37","x":6.75,"y":3.25},{"label":"k38","x":7.75,"y":3.25},{"label":"k39","x":8.75,"y":3.25},{"label":"k3a","x":9.75,"y":3.25},{"label":"k3b","x":10.75,"y":3.25},{"label":"k3c","x":11.75,"y":3.25},{"label":"k3d","x":12.75,"y":3.25,"w":2.25},
+ {"label":"k40","x":0,"y":4.25,"w":1.25},{"label":"k41","x":1.25,"y":4.25},{"label":"k42","x":2.25,"y":4.25},{"label":"k43","x":3.25,"y":4.25},{"label":"k44","x":4.25,"y":4.25},{"label":"k45","x":5.25,"y":4.25},{"label":"k46","x":6.25,"y":4.25},{"label":"k47","x":7.25,"y":4.25},{"label":"k48","x":8.25,"y":4.25},{"label":"k49","x":9.25,"y":4.25},{"label":"k4a","x":10.25,"y":4.25},{"label":"k4b","x":11.25,"y":4.25},{"label":"k4d","x":12.25,"y":4.25,"w":1.75},{"label":"k4e","x":14,"y":4.25},{"label":"k4g","x":16.25,"y":4.25},
+ {"label":"k50","x":0,"y":5.25,"w":1.25},{"label":"k51","x":1.25,"y":5.25,"w":1.25},{"label":"k53","x":2.5,"y":5.25,"w":1.25},{"label":"k56","x":3.75,"y":5.25,"w":6.25},{"label":"k5a","x":10,"y":5.25,"w":1.25},{"label":"k5b","x":11.25,"y":5.25,"w":1.25},{"label":"k5d","x":12.5,"y":5.25,"w":1.25},{"label":"k5e","x":13.75,"y":5.25,"w":1.25},{"label":"5f","x":15.25,"y":5.25},{"label":"k5g","x":16.25,"y":5.25},{"label":"k5h","x":17.25,"y":5.25}]
+ },
+ "LAYOUT_tkl_ansi": {
+ "layout":[
+ {"label":"k00","x":0,"y":0},{"label":"k02","x":2,"y":0},{"label":"k03","x":3,"y":0},{"label":"k04","x":4,"y":0},{"label":"k05","x":5,"y":0},{"label":"k07","x":6.5,"y":0},{"label":"k08","x":7.5,"y":0},{"label":"k09","x":8.5,"y":0},{"label":"k0a","x":9.5,"y":0},{"label":"k0b","x":11,"y":0},{"label":"k0c","x":12,"y":0},{"label":"k0d","x":13,"y":0},{"label":"k0e","x":14,"y":0},{"label":"k0f","x":15.25,"y":0},{"label":"k0g","x":16.25,"y":0},{"label":"k0h","x":17.25,"y":0},
+ {"label":"k10","x":0,"y":1.25},{"label":"k11","x":1,"y":1.25},{"label":"k12","x":2,"y":1.25},{"label":"k13","x":3,"y":1.25},{"label":"k14","x":4,"y":1.25},{"label":"k15","x":5,"y":1.25},{"label":"k16","x":6,"y":1.25},{"label":"k17","x":7,"y":1.25},{"label":"k18","x":8,"y":1.25},{"label":"k19","x":9,"y":1.25},{"label":"k1a","x":10,"y":1.25},{"label":"k1b","x":11,"y":1.25},{"label":"k1c","x":12,"y":1.25},{"label":"k1d","x":13,"y":1.25,"w":2},{"label":"k1f","x":15.25,"y":1.25},{"label":"k1g","x":16.25,"y":1.25},{"label":"k1h","x":17.25,"y":1.25},
+ {"label":"k20","x":0,"y":2.25,"w":1.5},{"label":"k22","x":1.5,"y":2.25},{"label":"k23","x":2.5,"y":2.25},{"label":"k24","x":3.5,"y":2.25},{"label":"k25","x":4.5,"y":2.25},{"label":"k26","x":5.5,"y":2.25},{"label":"k27","x":6.5,"y":2.25},{"label":"k28","x":7.5,"y":2.25},{"label":"k29","x":8.5,"y":2.25},{"label":"k2a","x":9.5,"y":2.25},{"label":"k2b","x":10.5,"y":2.25},{"label":"k2c","x":11.5,"y":2.25},{"label":"k2d","x":12.5,"y":2.25},{"label":"k2e","x":13.5,"y":2.25,"w":1.5},{"label":"k2f","x":15.25,"y":2.25},{"label":"k2g","x":16.25,"y":2.25},{"label":"k2h","x":17.25,"y":2.25},
+ {"label":"k30","x":0,"y":3.25,"w":1.75},{"label":"k32","x":1.75,"y":3.25},{"label":"k33","x":2.75,"y":3.25},{"label":"k34","x":3.75,"y":3.25},{"label":"k35","x":4.75,"y":3.25},{"label":"k36","x":5.75,"y":3.25},{"label":"k37","x":6.75,"y":3.25},{"label":"k38","x":7.75,"y":3.25},{"label":"k39","x":8.75,"y":3.25},{"label":"k3a","x":9.75,"y":3.25},{"label":"k3b","x":10.75,"y":3.25},{"label":"k3c","x":11.75,"y":3.25},{"label":"k3d","x":12.75,"y":3.25,"w":2.25},
+ {"label":"k41","x":0,"y":4.25,"w":2.25},{"label":"k42","x":2.25,"y":4.25},{"label":"k43","x":3.25,"y":4.25},{"label":"k44","x":4.25,"y":4.25},{"label":"k45","x":5.25,"y":4.25},{"label":"k46","x":6.25,"y":4.25},{"label":"k47","x":7.25,"y":4.25},{"label":"k48","x":8.25,"y":4.25},{"label":"k49","x":9.25,"y":4.25},{"label":"k4a","x":10.25,"y":4.25},{"label":"k4b","x":11.25,"y":4.25},{"label":"k4d","x":12.25,"y":4.25,"w":2.75},{"label":"k4g","x":16.25,"y":4.25},
+ {"label":"k50","x":0,"y":5.25,"w":1.25},{"label":"k51","x":1.25,"y":5.25,"w":1.25},{"label":"k53","x":2.5,"y":5.25,"w":1.25},{"label":"k56","x":3.75,"y":5.25,"w":6.25},{"label":"k5a","x":10,"y":5.25,"w":1.25},{"label":"k5b","x":11.25,"y":5.25,"w":1.25},{"label":"k5d","x":12.5,"y":5.25,"w":1.25},{"label":"k5e","x":13.75,"y":5.25,"w":1.25},{"label":"5f","x":15.25,"y":5.25},{"label":"k5g","x":16.25,"y":5.25},{"label":"k5h","x":17.25,"y":5.25}]
+ },
+ "LAYOUT_tkl_ansi_tsangan": {
+ "layout":[
+ {"label":"k00","x":0,"y":0},{"label":"k02","x":2,"y":0},{"label":"k03","x":3,"y":0},{"label":"k04","x":4,"y":0},{"label":"k05","x":5,"y":0},{"label":"k07","x":6.5,"y":0},{"label":"k08","x":7.5,"y":0},{"label":"k09","x":8.5,"y":0},{"label":"k0a","x":9.5,"y":0},{"label":"k0b","x":11,"y":0},{"label":"k0c","x":12,"y":0},{"label":"k0d","x":13,"y":0},{"label":"k0e","x":14,"y":0},{"label":"k0f","x":15.25,"y":0},{"label":"k0g","x":16.25,"y":0},{"label":"k0h","x":17.25,"y":0},
+ {"label":"k10","x":0,"y":1.25},{"label":"k11","x":1,"y":1.25},{"label":"k12","x":2,"y":1.25},{"label":"k13","x":3,"y":1.25},{"label":"k14","x":4,"y":1.25},{"label":"k15","x":5,"y":1.25},{"label":"k16","x":6,"y":1.25},{"label":"k17","x":7,"y":1.25},{"label":"k18","x":8,"y":1.25},{"label":"k19","x":9,"y":1.25},{"label":"k1a","x":10,"y":1.25},{"label":"k1b","x":11,"y":1.25},{"label":"k1c","x":12,"y":1.25},{"label":"k1d","x":13,"y":1.25,"w":2},{"label":"k1f","x":15.25,"y":1.25},{"label":"k1g","x":16.25,"y":1.25},{"label":"k1h","x":17.25,"y":1.25},
+ {"label":"k20","x":0,"y":2.25,"w":1.5},{"label":"k22","x":1.5,"y":2.25},{"label":"k23","x":2.5,"y":2.25},{"label":"k24","x":3.5,"y":2.25},{"label":"k25","x":4.5,"y":2.25},{"label":"k26","x":5.5,"y":2.25},{"label":"k27","x":6.5,"y":2.25},{"label":"k28","x":7.5,"y":2.25},{"label":"k29","x":8.5,"y":2.25},{"label":"k2a","x":9.5,"y":2.25},{"label":"k2b","x":10.5,"y":2.25},{"label":"k2c","x":11.5,"y":2.25},{"label":"k2d","x":12.5,"y":2.25},{"label":"k2e","x":13.5,"y":2.25,"w":1.5},{"label":"k2f","x":15.25,"y":2.25},{"label":"k2g","x":16.25,"y":2.25},{"label":"k2h","x":17.25,"y":2.25},
+ {"label":"k30","x":0,"y":3.25,"w":1.75},{"label":"k32","x":1.75,"y":3.25},{"label":"k33","x":2.75,"y":3.25},{"label":"k34","x":3.75,"y":3.25},{"label":"k35","x":4.75,"y":3.25},{"label":"k36","x":5.75,"y":3.25},{"label":"k37","x":6.75,"y":3.25},{"label":"k38","x":7.75,"y":3.25},{"label":"k39","x":8.75,"y":3.25},{"label":"k3a","x":9.75,"y":3.25},{"label":"k3b","x":10.75,"y":3.25},{"label":"k3c","x":11.75,"y":3.25},{"label":"k3d","x":12.75,"y":3.25,"w":2.25},
+ {"label":"k41","x":0,"y":4.25,"w":2.25},{"label":"k42","x":2.25,"y":4.25},{"label":"k43","x":3.25,"y":4.25},{"label":"k44","x":4.25,"y":4.25},{"label":"k45","x":5.25,"y":4.25},{"label":"k46","x":6.25,"y":4.25},{"label":"k47","x":7.25,"y":4.25},{"label":"k48","x":8.25,"y":4.25},{"label":"k49","x":9.25,"y":4.25},{"label":"k4a","x":10.25,"y":4.25},{"label":"k4b","x":11.25,"y":4.25},{"label":"k4d","x":12.25,"y":4.25,"w":2.75},{"label":"k4g","x":16.25,"y":4.25},
+ {"label":"k50","x":0,"y":5.25,"w":1.5},{"label":"k51","x":1.5,"y":5.25},{"label":"k53","x":2.5,"y":5.25,"w":1.5},{"label":"k56","x":4,"y":5.25,"w":7},{"label":"k5b","x":11,"y":5.25,"w":1.5},{"label":"k5d","x":12.5,"y":5.25},{"label":"k5e","x":13.5,"y":5.25,"w":1.5},{"label":"5f","x":15.25,"y":5.25},{"label":"k5g","x":16.25,"y":5.25},{"label":"k5h","x":17.25,"y":5.25}]
+ },
+ "LAYOUT_tkl_iso": {
+ "layout":[
+ {"label":"k00","x":0,"y":0},{"label":"k02","x":2,"y":0},{"label":"k03","x":3,"y":0},{"label":"k04","x":4,"y":0},{"label":"k05","x":5,"y":0},{"label":"k07","x":6.5,"y":0},{"label":"k08","x":7.5,"y":0},{"label":"k09","x":8.5,"y":0},{"label":"k0a","x":9.5,"y":0},{"label":"k0b","x":11,"y":0},{"label":"k0c","x":12,"y":0},{"label":"k0d","x":13,"y":0},{"label":"k0e","x":14,"y":0},{"label":"k0f","x":15.25,"y":0},{"label":"k0g","x":16.25,"y":0},{"label":"k0h","x":17.25,"y":0},
+ {"label":"k10","x":0,"y":1.25},{"label":"k11","x":1,"y":1.25},{"label":"k12","x":2,"y":1.25},{"label":"k13","x":3,"y":1.25},{"label":"k14","x":4,"y":1.25},{"label":"k15","x":5,"y":1.25},{"label":"k16","x":6,"y":1.25},{"label":"k17","x":7,"y":1.25},{"label":"k18","x":8,"y":1.25},{"label":"k19","x":9,"y":1.25},{"label":"k1a","x":10,"y":1.25},{"label":"k1b","x":11,"y":1.25},{"label":"k1c","x":12,"y":1.25},{"label":"k1d","x":13,"y":1.25,"w":2},{"label":"k1f","x":15.25,"y":1.25},{"label":"k1g","x":16.25,"y":1.25},{"label":"k1h","x":17.25,"y":1.25},
+ {"label":"k20","x":0,"y":2.25,"w":1.5},{"label":"k22","x":1.5,"y":2.25},{"label":"k23","x":2.5,"y":2.25},{"label":"k24","x":3.5,"y":2.25},{"label":"k25","x":4.5,"y":2.25},{"label":"k26","x":5.5,"y":2.25},{"label":"k27","x":6.5,"y":2.25},{"label":"k28","x":7.5,"y":2.25},{"label":"k29","x":8.5,"y":2.25},{"label":"k2a","x":9.5,"y":2.25},{"label":"k2b","x":10.5,"y":2.25},{"label":"k2c","x":11.5,"y":2.25},{"label":"k2d","x":12.5,"y":2.25},{"label":"k2e","x":13.75,"y":2.25,"w":1.25,"h":2},{"label":"k2f","x":15.25,"y":2.25},{"label":"k2g","x":16.25,"y":2.25},{"label":"k2h","x":17.25,"y":2.25},
+ {"label":"k30","x":0,"y":3.25,"w":1.75},{"label":"k32","x":1.75,"y":3.25},{"label":"k33","x":2.75,"y":3.25},{"label":"k34","x":3.75,"y":3.25},{"label":"k35","x":4.75,"y":3.25},{"label":"k36","x":5.75,"y":3.25},{"label":"k37","x":6.75,"y":3.25},{"label":"k38","x":7.75,"y":3.25},{"label":"k39","x":8.75,"y":3.25},{"label":"k3a","x":9.75,"y":3.25},{"label":"k3b","x":10.75,"y":3.25},{"label":"k3c","x":11.75,"y":3.25},{"label":"k3d","x":12.75,"y":3.25},
+ {"label":"k40","x":0,"y":4.25,"w":1.25},{"label":"k41","x":1.24,"y":4.25},{"label":"k42","x":2.25,"y":4.25},{"label":"k43","x":3.25,"y":4.25},{"label":"k44","x":4.25,"y":4.25},{"label":"k45","x":5.25,"y":4.25},{"label":"k46","x":6.25,"y":4.25},{"label":"k47","x":7.25,"y":4.25},{"label":"k48","x":8.25,"y":4.25},{"label":"k49","x":9.25,"y":4.25},{"label":"k4a","x":10.25,"y":4.25},{"label":"k4b","x":11.25,"y":4.25},{"label":"k4d","x":12.25,"y":4.25,"w":2.75},{"label":"k4g","x":16.25,"y":4.25},
+ {"label":"k50","x":0,"y":5.25,"w":1.25},{"label":"k51","x":1.25,"y":5.25,"w":1.25},{"label":"k53","x":2.5,"y":5.25,"w":1.25},{"label":"k56","x":3.75,"y":5.25,"w":6.25},{"label":"k5a","x":10,"y":5.25,"w":1.25},{"label":"k5b","x":11.25,"y":5.25,"w":1.25},{"label":"k5d","x":12.5,"y":5.25,"w":1.25},{"label":"k5e","x":13.75,"y":5.25,"w":1.25},{"label":"5f","x":15.25,"y":5.25},{"label":"k5g","x":16.25,"y":5.25},{"label":"k5h","x":17.25,"y":5.25}]
+ },
+ "LAYOUT_tkl_iso_tsangan": {
+ "layout":[
+ {"label":"k00","x":0,"y":0},{"label":"k02","x":2,"y":0},{"label":"k03","x":3,"y":0},{"label":"k04","x":4,"y":0},{"label":"k05","x":5,"y":0},{"label":"k07","x":6.5,"y":0},{"label":"k08","x":7.5,"y":0},{"label":"k09","x":8.5,"y":0},{"label":"k0a","x":9.5,"y":0},{"label":"k0b","x":11,"y":0},{"label":"k0c","x":12,"y":0},{"label":"k0d","x":13,"y":0},{"label":"k0e","x":14,"y":0},{"label":"k0f","x":15.25,"y":0},{"label":"k0g","x":16.25,"y":0},{"label":"k0h","x":17.25,"y":0},
+ {"label":"k10","x":0,"y":1.25},{"label":"k11","x":1,"y":1.25},{"label":"k12","x":2,"y":1.25},{"label":"k13","x":3,"y":1.25},{"label":"k14","x":4,"y":1.25},{"label":"k15","x":5,"y":1.25},{"label":"k16","x":6,"y":1.25},{"label":"k17","x":7,"y":1.25},{"label":"k18","x":8,"y":1.25},{"label":"k19","x":9,"y":1.25},{"label":"k1a","x":10,"y":1.25},{"label":"k1b","x":11,"y":1.25},{"label":"k1c","x":12,"y":1.25},{"label":"k1d","x":13,"y":1.25,"w":2},{"label":"k1f","x":15.25,"y":1.25},{"label":"k1g","x":16.25,"y":1.25},{"label":"k1h","x":17.25,"y":1.25},
+ {"label":"k20","x":0,"y":2.25,"w":1.5},{"label":"k22","x":1.5,"y":2.25},{"label":"k23","x":2.5,"y":2.25},{"label":"k24","x":3.5,"y":2.25},{"label":"k25","x":4.5,"y":2.25},{"label":"k26","x":5.5,"y":2.25},{"label":"k27","x":6.5,"y":2.25},{"label":"k28","x":7.5,"y":2.25},{"label":"k29","x":8.5,"y":2.25},{"label":"k2a","x":9.5,"y":2.25},{"label":"k2b","x":10.5,"y":2.25},{"label":"k2c","x":11.5,"y":2.25},{"label":"k2d","x":12.5,"y":2.25},{"label":"k2e","x":13.75,"y":2.25,"w":1.25,"h":2},{"label":"k2f","x":15.25,"y":2.25},{"label":"k2g","x":16.25,"y":2.25},{"label":"k2h","x":17.25,"y":2.25},
+ {"label":"k30","x":0,"y":3.25,"w":1.75},{"label":"k32","x":1.75,"y":3.25},{"label":"k33","x":2.75,"y":3.25},{"label":"k34","x":3.75,"y":3.25},{"label":"k35","x":4.75,"y":3.25},{"label":"k36","x":5.75,"y":3.25},{"label":"k37","x":6.75,"y":3.25},{"label":"k38","x":7.75,"y":3.25},{"label":"k39","x":8.75,"y":3.25},{"label":"k3a","x":9.75,"y":3.25},{"label":"k3b","x":10.75,"y":3.25},{"label":"k3c","x":11.75,"y":3.25},{"label":"k3d","x":12.75,"y":3.25},
+ {"label":"k40","x":0,"y":4.25,"w":1.25},{"label":"k41","x":1.24,"y":4.25},{"label":"k42","x":2.25,"y":4.25},{"label":"k43","x":3.25,"y":4.25},{"label":"k44","x":4.25,"y":4.25},{"label":"k45","x":5.25,"y":4.25},{"label":"k46","x":6.25,"y":4.25},{"label":"k47","x":7.25,"y":4.25},{"label":"k48","x":8.25,"y":4.25},{"label":"k49","x":9.25,"y":4.25},{"label":"k4a","x":10.25,"y":4.25},{"label":"k4b","x":11.25,"y":4.25},{"label":"k4d","x":12.25,"y":4.25,"w":2.75},{"label":"k4g","x":16.25,"y":4.25},
+ {"label":"k50","x":0,"y":5.25,"w":1.5},{"label":"k51","x":1.5,"y":5.25},{"label":"k53","x":2.5,"y":5.25,"w":1.5},{"label":"k56","x":4,"y":5.25,"w":7},{"label":"k5b","x":11,"y":5.25,"w":1.5},{"label":"k5d","x":12.5,"y":5.25},{"label":"k5e","x":13.5,"y":5.25,"w":1.5},{"label":"5f","x":15.25,"y":5.25},{"label":"k5g","x":16.25,"y":5.25},{"label":"k5h","x":17.25,"y":5.25}]
+ },
+ "LAYOUT_tkl_iso_split_bs": {
+ "layout":[
+ {"label":"k00","x":0,"y":0},{"label":"k02","x":2,"y":0},{"label":"k03","x":3,"y":0},{"label":"k04","x":4,"y":0},{"label":"k05","x":5,"y":0},{"label":"k07","x":6.5,"y":0},{"label":"k08","x":7.5,"y":0},{"label":"k09","x":8.5,"y":0},{"label":"k0a","x":9.5,"y":0},{"label":"k0b","x":11,"y":0},{"label":"k0c","x":12,"y":0},{"label":"k0d","x":13,"y":0},{"label":"k0e","x":14,"y":0},{"label":"k0f","x":15.25,"y":0},{"label":"k0g","x":16.25,"y":0},{"label":"k0h","x":17.25,"y":0},
+ {"label":"k10","x":0,"y":1.25},{"label":"k11","x":1,"y":1.25},{"label":"k12","x":2,"y":1.25},{"label":"k13","x":3,"y":1.25},{"label":"k14","x":4,"y":1.25},{"label":"k15","x":5,"y":1.25},{"label":"k16","x":6,"y":1.25},{"label":"k17","x":7,"y":1.25},{"label":"k18","x":8,"y":1.25},{"label":"k19","x":9,"y":1.25},{"label":"k1a","x":10,"y":1.25},{"label":"k1b","x":11,"y":1.25},{"label":"k1c","x":12,"y":1.25},{"label":"k1d","x":13,"y":1.25},{"label":"k1e","x":14,"y":1.25},{"label":"k1f","x":15.25,"y":1.25},{"label":"k1g","x":16.25,"y":1.25},{"label":"k1h","x":17.25,"y":1.25},
+ {"label":"k20","x":0,"y":2.25,"w":1.5},{"label":"k22","x":1.5,"y":2.25},{"label":"k23","x":2.5,"y":2.25},{"label":"k24","x":3.5,"y":2.25},{"label":"k25","x":4.5,"y":2.25},{"label":"k26","x":5.5,"y":2.25},{"label":"k27","x":6.5,"y":2.25},{"label":"k28","x":7.5,"y":2.25},{"label":"k29","x":8.5,"y":2.25},{"label":"k2a","x":9.5,"y":2.25},{"label":"k2b","x":10.5,"y":2.25},{"label":"k2c","x":11.5,"y":2.25},{"label":"k2d","x":12.5,"y":2.25},{"label":"k2e","x":13.75,"y":2.25,"w":1.25,"h":2},{"label":"k2f","x":15.25,"y":2.25},{"label":"k2g","x":16.25,"y":2.25},{"label":"k2h","x":17.25,"y":2.25},
+ {"label":"k30","x":0,"y":3.25,"w":1.75},{"label":"k32","x":1.75,"y":3.25},{"label":"k33","x":2.75,"y":3.25},{"label":"k34","x":3.75,"y":3.25},{"label":"k35","x":4.75,"y":3.25},{"label":"k36","x":5.75,"y":3.25},{"label":"k37","x":6.75,"y":3.25},{"label":"k38","x":7.75,"y":3.25},{"label":"k39","x":8.75,"y":3.25},{"label":"k3a","x":9.75,"y":3.25},{"label":"k3b","x":10.75,"y":3.25},{"label":"k3c","x":11.75,"y":3.25},{"label":"k3d","x":12.75,"y":3.25},
+ {"label":"k40","x":0,"y":4.25,"w":1.25},{"label":"k41","x":1.24,"y":4.25},{"label":"k42","x":2.25,"y":4.25},{"label":"k43","x":3.25,"y":4.25},{"label":"k44","x":4.25,"y":4.25},{"label":"k45","x":5.25,"y":4.25},{"label":"k46","x":6.25,"y":4.25},{"label":"k47","x":7.25,"y":4.25},{"label":"k48","x":8.25,"y":4.25},{"label":"k49","x":9.25,"y":4.25},{"label":"k4a","x":10.25,"y":4.25},{"label":"k4b","x":11.25,"y":4.25},{"label":"k4d","x":12.25,"y":4.25,"w":2.75},{"label":"k4g","x":16.25,"y":4.25},
+ {"label":"k50","x":0,"y":5.25,"w":1.25},{"label":"k51","x":1.25,"y":5.25,"w":1.25},{"label":"k53","x":2.5,"y":5.25,"w":1.25},{"label":"k56","x":3.75,"y":5.25,"w":6.25},{"label":"k5a","x":10,"y":5.25,"w":1.25},{"label":"k5b","x":11.25,"y":5.25,"w":1.25},{"label":"k5d","x":12.5,"y":5.25,"w":1.25},{"label":"k5e","x":13.75,"y":5.25,"w":1.25},{"label":"5f","x":15.25,"y":5.25},{"label":"k5g","x":16.25,"y":5.25},{"label":"k5h","x":17.25,"y":5.25}]
+ },
+ "LAYOUT_tkl_iso_split_rshift": {
+ "layout":[
+ {"label":"k00","x":0,"y":0},{"label":"k02","x":2,"y":0},{"label":"k03","x":3,"y":0},{"label":"k04","x":4,"y":0},{"label":"k05","x":5,"y":0},{"label":"k07","x":6.5,"y":0},{"label":"k08","x":7.5,"y":0},{"label":"k09","x":8.5,"y":0},{"label":"k0a","x":9.5,"y":0},{"label":"k0b","x":11,"y":0},{"label":"k0c","x":12,"y":0},{"label":"k0d","x":13,"y":0},{"label":"k0e","x":14,"y":0},{"label":"k0f","x":15.25,"y":0},{"label":"k0g","x":16.25,"y":0},{"label":"k0h","x":17.25,"y":0},
+ {"label":"k10","x":0,"y":1.25},{"label":"k11","x":1,"y":1.25},{"label":"k12","x":2,"y":1.25},{"label":"k13","x":3,"y":1.25},{"label":"k14","x":4,"y":1.25},{"label":"k15","x":5,"y":1.25},{"label":"k16","x":6,"y":1.25},{"label":"k17","x":7,"y":1.25},{"label":"k18","x":8,"y":1.25},{"label":"k19","x":9,"y":1.25},{"label":"k1a","x":10,"y":1.25},{"label":"k1b","x":11,"y":1.25},{"label":"k1c","x":12,"y":1.25},{"label":"k1d","x":13,"y":1.25,"w":2},{"label":"k1f","x":15.25,"y":1.25},{"label":"k1g","x":16.25,"y":1.25},{"label":"k1h","x":17.25,"y":1.25},
+ {"label":"k20","x":0,"y":2.25,"w":1.5},{"label":"k22","x":1.5,"y":2.25},{"label":"k23","x":2.5,"y":2.25},{"label":"k24","x":3.5,"y":2.25},{"label":"k25","x":4.5,"y":2.25},{"label":"k26","x":5.5,"y":2.25},{"label":"k27","x":6.5,"y":2.25},{"label":"k28","x":7.5,"y":2.25},{"label":"k29","x":8.5,"y":2.25},{"label":"k2a","x":9.5,"y":2.25},{"label":"k2b","x":10.5,"y":2.25},{"label":"k2c","x":11.5,"y":2.25},{"label":"k2d","x":12.5,"y":2.25},{"label":"k2e","x":13.75,"y":2.25,"w":1.25,"h":2},{"label":"k2f","x":15.25,"y":2.25},{"label":"k2g","x":16.25,"y":2.25},{"label":"k2h","x":17.25,"y":2.25},
+ {"label":"k30","x":0,"y":3.25,"w":1.75},{"label":"k32","x":1.75,"y":3.25},{"label":"k33","x":2.75,"y":3.25},{"label":"k34","x":3.75,"y":3.25},{"label":"k35","x":4.75,"y":3.25},{"label":"k36","x":5.75,"y":3.25},{"label":"k37","x":6.75,"y":3.25},{"label":"k38","x":7.75,"y":3.25},{"label":"k39","x":8.75,"y":3.25},{"label":"k3a","x":9.75,"y":3.25},{"label":"k3b","x":10.75,"y":3.25},{"label":"k3c","x":11.75,"y":3.25},{"label":"k3d","x":12.75,"y":3.25},
+ {"label":"k40","x":0,"y":4.25,"w":1.25},{"label":"k41","x":1.25,"y":4.25},{"label":"k42","x":2.25,"y":4.25},{"label":"k43","x":3.25,"y":4.25},{"label":"k44","x":4.25,"y":4.25},{"label":"k45","x":5.25,"y":4.25},{"label":"k46","x":6.25,"y":4.25},{"label":"k47","x":7.25,"y":4.25},{"label":"k48","x":8.25,"y":4.25},{"label":"k49","x":9.25,"y":4.25},{"label":"k4a","x":10.25,"y":4.25},{"label":"k4b","x":11.25,"y":4.25},{"label":"k4d","x":12.25,"y":4.25,"w":1.75},{"label":"k4e","x":14,"y":4.25},{"label":"k4g","x":16.25,"y":4.25},
+ {"label":"k50","x":0,"y":5.25,"w":1.25},{"label":"k51","x":1.25,"y":5.25,"w":1.25},{"label":"k53","x":2.5,"y":5.25,"w":1.25},{"label":"k56","x":3.75,"y":5.25,"w":6.25},{"label":"k5a","x":10,"y":5.25,"w":1.25},{"label":"k5b","x":11.25,"y":5.25,"w":1.25},{"label":"k5d","x":12.5,"y":5.25,"w":1.25},{"label":"k5e","x":13.75,"y":5.25,"w":1.25},{"label":"5f","x":15.25,"y":5.25},{"label":"k5g","x":16.25,"y":5.25},{"label":"k5h","x":17.25,"y":5.25}]
+ }
+ }
+}
diff --git a/keyboards/eniigmakeyboards/ek87/keymaps/default/keymap.c b/keyboards/eniigmakeyboards/ek87/keymaps/default/keymap.c
new file mode 100644
index 00000000000..563bb818a8b
--- /dev/null
+++ b/keyboards/eniigmakeyboards/ek87/keymaps/default/keymap.c
@@ -0,0 +1,12 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_tkl_ansi(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/keyboards/eniigmakeyboards/ek87/keymaps/via/keymap.c b/keyboards/eniigmakeyboards/ek87/keymaps/via/keymap.c
new file mode 100644
index 00000000000..1a69d050235
--- /dev/null
+++ b/keyboards/eniigmakeyboards/ek87/keymaps/via/keymap.c
@@ -0,0 +1,36 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_TRNS, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_TRNS, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
diff --git a/keyboards/eniigmakeyboards/ek87/keymaps/via/rules.mk b/keyboards/eniigmakeyboards/ek87/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/eniigmakeyboards/ek87/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/eniigmakeyboards/ek87/readme.md b/keyboards/eniigmakeyboards/ek87/readme.md
new file mode 100644
index 00000000000..49966ba3b84
--- /dev/null
+++ b/keyboards/eniigmakeyboards/ek87/readme.md
@@ -0,0 +1,17 @@
+# Eniigma Keyboards ek87
+
+
+
+A highly compatible TKL PCB with JST daughterboard support, designed for use with all tenkeyless Eniigma Keyboards products.
+
+
+
+* Keyboard Maintainer: [eniigmakeyboards](https://github.com/eniigmakeyboards) and [adamws](https://github.com/adamws)
+* Hardware Supported: Infinitum PCB/case, all future Eniigma Keyboards TKL products
+* Hardware Availability: On the [Eniigma Keyboards website](https://eniigmakeyboards.com/collections/infinitum/products/ek87-pcb-preorder)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make eniigmakeyboards/ek87:default
+
+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).
diff --git a/keyboards/eniigmakeyboards/ek87/rules.mk b/keyboards/eniigmakeyboards/ek87/rules.mk
new file mode 100644
index 00000000000..dfe300fae00
--- /dev/null
+++ b/keyboards/eniigmakeyboards/ek87/rules.mk
@@ -0,0 +1,32 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
diff --git a/keyboards/ergodash/rev1/keymaps/333fred/config.h b/keyboards/ergodash/rev1/keymaps/333fred/config.h
index e48702fd6b0..862f306d015 100644
--- a/keyboards/ergodash/rev1/keymaps/333fred/config.h
+++ b/keyboards/ergodash/rev1/keymaps/333fred/config.h
@@ -1,7 +1,6 @@
#pragma once
#include QMK_KEYBOARD_CONFIG_H
-#include "333fred_config.h"
#define USE_SERIAL
#define MASTER_LEFT
diff --git a/keyboards/ergodash/rev1/keymaps/333fred/rules.mk b/keyboards/ergodash/rev1/keymaps/333fred/rules.mk
index 9d8ff37e11d..2a91ad3ba48 100644
--- a/keyboards/ergodash/rev1/keymaps/333fred/rules.mk
+++ b/keyboards/ergodash/rev1/keymaps/333fred/rules.mk
@@ -1,7 +1,5 @@
BACKLIGHT_ENABLE = no
RGBLIGHT_ENABLE = yes
AUDIO_ENABLE = no
-NKRO_ENABLE = yes
KEY_LOCK_ENABLE = yes
-TAP_DANCE_ENABLE = yes
CONSOLE_ENABLE = no
diff --git a/keyboards/ergodash/rev1/keymaps/shadowprogr/config.h b/keyboards/ergodash/rev1/keymaps/shadowprogr/config.h
new file mode 100644
index 00000000000..4dcefdbcc61
--- /dev/null
+++ b/keyboards/ergodash/rev1/keymaps/shadowprogr/config.h
@@ -0,0 +1,36 @@
+/*
+This is the c configuration file for the keymap
+
+Copyright 2012 Jun Wako
+Copyright 2015 Jack Humbert
+
+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 .
+*/
+
+#pragma once
+
+
+/* Use I2C or Serial, not both */
+
+#define USE_SERIAL
+// #define USE_I2C
+
+/* Select hand configuration */
+
+#define MASTER_LEFT
+// #define MASTER_RIGHT
+// #define EE_HANDS
+
+#define LEADER_PER_KEY_TIMING
+#define LEADER_TIMEOUT 250
\ No newline at end of file
diff --git a/keyboards/ergodash/rev1/keymaps/shadowprogr/keymap.c b/keyboards/ergodash/rev1/keymaps/shadowprogr/keymap.c
new file mode 100644
index 00000000000..9c450bca973
--- /dev/null
+++ b/keyboards/ergodash/rev1/keymaps/shadowprogr/keymap.c
@@ -0,0 +1,199 @@
+#include QMK_KEYBOARD_H
+
+
+enum layers {
+ _WINDOWS,
+ _LINUX,
+ _NUMPAD,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+enum custom_keycodes {
+ WINDOWS = SAFE_RANGE,
+ LINUX,
+ NUMPAD,
+ LOWER,
+ RAISE,
+ ADJUST
+};
+
+#define CTL_ENT MT(MOD_RCTL, KC_PENT)
+#define NUMPAD MO(_NUMPAD)
+#define SHELL LCA(KC_T)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* Windows Qwerty
+ * .---------------------------------------------------------------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 |BSpace |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | Esc | A | S | D | F | G | Home | | Del | H | J | K | L | : | ' |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | Shift | Z | X | C | V | B | - | | = | N | M | , | . | / | Shift |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | LCtrl | LGUI | LAlt |Numpad ||||||||| Space | Lower | Enter ||||||||| Enter | Raise |BSpace ||||||||| F5 | RAlt | RGui |Ctl/Ent|
+ * .---------------------------------------------------------------------------------------------------------------------------------------.
+ */
+ [_WINDOWS] = LAYOUT( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, \
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_HOME, KC_DEL, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MINS, KC_EQL, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
+ KC_LCTL, KC_LGUI, KC_LALT, NUMPAD, KC_SPC, LOWER, KC_ENT, KC_ENT, RAISE, KC_BSPC, KC_F5, KC_RALT, KC_RGUI, CTL_ENT \
+ ),
+
+ /* Linux Qwerty
+ * .---------------------------------------------------------------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 |BSpace |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | Esc | A | S | D | F | G | Home | | Del | H | J | K | L | : | ' |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | Shift | Z | X | C | V | B | - | | = | N | M | , | . | / | Shift |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | LCtrl | LGUI | LAlt |Numpad ||||||||| Space | Lower | Enter ||||||||| Enter | Raise |BSpace ||||||||| Shell | RAlt | RGui |Ctl/Ent|
+ * .---------------------------------------------------------------------------------------------------------------------------------------.
+ */
+ [_LINUX] = LAYOUT( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MINS, KC_EQL, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC, KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS, \
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_HOME, KC_DEL, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MINS, KC_EQL, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
+ KC_LCTL, KC_LGUI, KC_LALT, NUMPAD, KC_SPC, LOWER, KC_ENT, KC_ENT, RAISE, KC_BSPC, SHELL, KC_RALT, KC_RGUI, CTL_ENT \
+ ),
+
+ /* Numpad
+ * .---------------------------------------------------------------------------------------------------------------------------------------.
+ * |XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX|NumLock| / | * | - |XXXXXXX|
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * |XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX| 7 | 8 | 9 | |XXXXXXX|
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+ + +-------|
+ * |XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX| 4 | 5 | 6 | |XXXXXXX|
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * |XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX| 1 | 2 | 3 | |XXXXXXX|
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+ Enter +-------|
+ * |XXXXXXX|XXXXXXX|XXXXXXX|Numpad |||||||||XXXXXXX|XXXXXXX|XXXXXXX|||||||||XXXXXXX|XXXXXXX|XXXXXXX||||||||| 0 | . | | Enter |
+ * .---------------------------------------------------------------------------------------------------------------------------------------.
+ */
+ [_NUMPAD] = LAYOUT( \
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_BSPC, \
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, XXXXXXX, \
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, KC_PPLS, XXXXXXX, \
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, KC_PENT, XXXXXXX, \
+ XXXXXXX, XXXXXXX, XXXXXXX, NUMPAD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_0, KC_PDOT, KC_PENT, KC_PENT \
+ ),
+
+ /* Lower
+ * .---------------------------------------------------------------------------------------------------------------------------------------.
+ * | F11 | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F12 |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | | | | ( | { | [ | | | | ] | } | ) | | | |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | | | | | |PageUp | | | | | | | | | |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | |VolDown| VolUp | | |PageDwn| | | | | | | | | |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | | | | ||||||||| | Lower | ||||||||| | Raise | ||||||||| | | | |
+ * .---------------------------------------------------------------------------------------------------------------------------------------.
+ */
+ [_LOWER] = LAYOUT( \
+ KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12, \
+ _______, _______, _______, KC_LPRN, KC_LCBR, KC_LBRC, _______, _______, KC_RBRC, KC_RCBR, KC_RPRN, _______, _______, _______, \
+ _______, _______, _______, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, \
+ KC_CAPS, KC_VOLD, KC_VOLU, _______, _______, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, KC_CAPS, \
+ _______, _______, _______, _______, _______, LOWER, _______, _______, RAISE, _______, _______, _______, _______, _______ \
+ ),
+
+ /* Raise
+ * .---------------------------------------------------------------------------------------------------------------------------------------.
+ * | F11 | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F12 |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | | | | ( | { | [ | | | | ] | } | ) | | | |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | | | | | | | End | | | Left | Down | Up | Right | | |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | | | | | | | | | | | | | | | |
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | | | | ||||||||| | Lower | ||||||||| | Raise | ||||||||| | | | |
+ * .---------------------------------------------------------------------------------------------------------------------------------------.
+ */
+ [_RAISE] = LAYOUT( \
+ KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12, \
+ _______, _______, _______, KC_LPRN, KC_LCBR, KC_LBRC, _______, _______, KC_RBRC, KC_RCBR, KC_RPRN, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, KC_END, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, \
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_MPLY, KC_CAPS, \
+ _______, _______, _______, _______, _______, LOWER, _______, _______, RAISE, _______, _______, _______, _______, _______ \
+ ),
+
+ /* Adjust
+ * .---------------------------------------------------------------------------------------------------------------------------------------.
+ * |XXXXXXX|Windows| Linux |XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * |XXXXXXX|XXXXXXX|XXXXXXX| Cycle |On/Off |XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX|On/Off | Cycle |XXXXXXX|XXXXXXX|XXXXXXX|
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * | Reset |XXXXXXX|XXXXXXX|Breathe| Inc |XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX|Hue inc|Sat inc| Inc |XXXXXXX|XXXXXXX|
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * |XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX| Dec |XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX|Hue dec|Sat dec| Dec |XXXXXXX|XXXXXXX|
+ * |-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+ * |XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|||||||||XXXXXXX| Lower |XXXXXXX|||||||||XXXXXXX| Raise |XXXXXXX|||||||||XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|
+ * .---------------------------------------------------------------------------------------------------------------------------------------.
+ */
+ [_ADJUST] = LAYOUT( \
+ XXXXXXX, WINDOWS, LINUX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
+ XXXXXXX, XXXXXXX, XXXXXXX, BL_STEP, BL_TOGG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, XXXXXXX, XXXXXXX, XXXXXXX, \
+ RESET, XXXXXXX, XXXXXXX, BL_BRTG, BL_INC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, \
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, BL_DEC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, \
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, LOWER, XXXXXXX, XXXXXXX, RAISE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \
+ )
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case WINDOWS:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_WINDOWS);
+ }
+ return false;
+ break;
+ case LINUX:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_LINUX);
+ }
+ return false;
+ break;
+ case LOWER:
+ if (record->event.pressed) {
+ layer_on(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ return false;
+ break;
+ case RAISE:
+ if (record->event.pressed) {
+ layer_on(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ return false;
+ break;
+ case ADJUST:
+ if (record->event.pressed) {
+ layer_on(_ADJUST);
+ } else {
+ layer_off(_ADJUST);
+ }
+ return false;
+ break;
+ }
+ return true;
+}
diff --git a/keyboards/ergodash/rev1/keymaps/shadowprogr/readme.md b/keyboards/ergodash/rev1/keymaps/shadowprogr/readme.md
new file mode 100644
index 00000000000..7ab665a8d41
--- /dev/null
+++ b/keyboards/ergodash/rev1/keymaps/shadowprogr/readme.md
@@ -0,0 +1,89 @@
+# ShadowProgr's layout for ErgoDash
+
+There are 2 different QWERTY base layers for use with Windows and Linux OSes. Beside those 2 there are also a numpad layer and 3 modifier layers (lower, raise and adjust).
+
+## Layouts
+### Windows
+```
+.---------------------------------------------------------------------------------------------------------------------------------------.
+| ` | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 |BSpace |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| Esc | A | S | D | F | G | Home | | Del | H | J | K | L | : | ' |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| Shift | Z | X | C | V | B | - | | = | N | M | , | . | / | Shift |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| LCtrl | LGUI | LAlt |Numpad ||||||||| Space | Lower | Enter ||||||||| Enter | Raise |BSpace ||||||||| F5 | RAlt | RGui |Ctl/Ent|
+.---------------------------------------------------------------------------------------------------------------------------------------.
+```
+### Linux
+```
+.---------------------------------------------------------------------------------------------------------------------------------------.
+| ` | 1 | 2 | 3 | 4 | 5 | - | | = | 6 | 7 | 8 | 9 | 0 |BSpace |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| Tab | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| Esc | A | S | D | F | G | Home | | Del | H | J | K | L | : | ' |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| Shift | Z | X | C | V | B | - | | = | N | M | , | . | / | Shift |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| LCtrl | LGUI | LAlt |Numpad ||||||||| Space | Lower | Enter ||||||||| Enter | Raise |BSpace ||||||||| Shell | RAlt | RGui |Ctl/Ent|
+.---------------------------------------------------------------------------------------------------------------------------------------.
+```
+### Numpad
+```
+.---------------------------------------------------------------------------------------------------------------------------------------.
+|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX|NumLock| / | * | - |XXXXXXX|
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX| 7 | 8 | 9 | |XXXXXXX|
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+ + +-------|
+|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX| 4 | 5 | 6 | |XXXXXXX|
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX| 1 | 2 | 3 | |XXXXXXX|
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+ Enter +-------|
+|XXXXXXX|XXXXXXX|XXXXXXX|Numpad |||||||||XXXXXXX|XXXXXXX|XXXXXXX|||||||||XXXXXXX|XXXXXXX|XXXXXXX||||||||| 0 | . | | Enter |
+.---------------------------------------------------------------------------------------------------------------------------------------.
+```
+### Lower
+```
+.---------------------------------------------------------------------------------------------------------------------------------------.
+| F11 | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F12 |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| | | | ( | { | [ | | | | ] | } | ) | | | |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| | | | | |PageUp | | | | | | | | | |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| |VolDown| VolUp | | |PageDwn| | | | | | | | | |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| | | | ||||||||| | Lower | ||||||||| | Raise | ||||||||| | | | |
+.---------------------------------------------------------------------------------------------------------------------------------------.
+```
+### Raise
+```
+.---------------------------------------------------------------------------------------------------------------------------------------.
+| F11 | F1 | F2 | F3 | F4 | F5 | | | | F6 | F7 | F8 | F9 | F10 | F12 |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| | | | ( | { | [ | | | | ] | } | ) | | | |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| | | | | | | End | | | Left | Down | Up | Right | | |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| | | | | | | | | | | | | | | |
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| | | | ||||||||| | Lower | ||||||||| | Raise | ||||||||| | | | |
+.---------------------------------------------------------------------------------------------------------------------------------------.
+```
+### Adjust
+```
+.---------------------------------------------------------------------------------------------------------------------------------------.
+|XXXXXXX|Windows| Linux |XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+|XXXXXXX|XXXXXXX|XXXXXXX| Cycle |On/Off |XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX|On/Off | Cycle |XXXXXXX|XXXXXXX|XXXXXXX|
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+| Reset |XXXXXXX|XXXXXXX|Breathe| Inc |XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX|Hue inc|Sat inc| Inc |XXXXXXX|XXXXXXX|
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX| Dec |XXXXXXX|XXXXXXX| |XXXXXXX|XXXXXXX|Hue dec|Sat dec| Dec |XXXXXXX|XXXXXXX|
+|-------+-------+-------+-------+-------+-------+-------+-----------------------+-------+-------+-------+-------+-------+-------+-------|
+|XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|||||||||XXXXXXX| Lower |XXXXXXX|||||||||XXXXXXX| Raise |XXXXXXX|||||||||XXXXXXX|XXXXXXX|XXXXXXX|XXXXXXX|
+.---------------------------------------------------------------------------------------------------------------------------------------.
+```
\ No newline at end of file
diff --git a/keyboards/ergodash/rev1/keymaps/shadowprogr/rules.mk b/keyboards/ergodash/rev1/keymaps/shadowprogr/rules.mk
new file mode 100644
index 00000000000..30d8419904e
--- /dev/null
+++ b/keyboards/ergodash/rev1/keymaps/shadowprogr/rules.mk
@@ -0,0 +1,3 @@
+BACKLIGHT_ENABLE = yes
+RGBLIGHT_ENABLE = yes
+AUDIO_ENABLE = no
\ No newline at end of file
diff --git a/keyboards/ergodash/rev1/keymaps/tw1t611/config.h b/keyboards/ergodash/rev1/keymaps/tw1t611/config.h
new file mode 100644
index 00000000000..df04873a97e
--- /dev/null
+++ b/keyboards/ergodash/rev1/keymaps/tw1t611/config.h
@@ -0,0 +1,33 @@
+/*
+This is the c configuration file for the keymap
+
+Copyright 2012 Jun Wako
+Copyright 2015 Jack Humbert
+
+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 .
+*/
+
+#pragma once
+
+
+/* Use I2C or Serial, not both */
+
+#define USE_SERIAL
+// #define USE_I2C
+
+/* Select hand configuration */
+
+#define MASTER_LEFT
+// #define MASTER_RIGHT
+// #define EE_HANDS
diff --git a/keyboards/ergodash/rev1/keymaps/tw1t611/keymap.c b/keyboards/ergodash/rev1/keymaps/tw1t611/keymap.c
new file mode 100644
index 00000000000..6d080f2af1e
--- /dev/null
+++ b/keyboards/ergodash/rev1/keymaps/tw1t611/keymap.c
@@ -0,0 +1,24 @@
+#include QMK_KEYBOARD_H
+#include "keymap_german.h"
+
+enum layers {
+ _QWERTZ,
+ _MOD,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTZ] = LAYOUT(
+ _______ ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,_______ , KC_RSFT ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,_______ ,
+ KC_ESC ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_BSPC , KC_DEL ,KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,DE_ADIA ,
+ KC_TAB ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,DE_UNDS , KC_LALT ,KC_H ,KC_J ,KC_K ,KC_L ,DE_EQL ,DE_ODIA ,
+ _______ ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_SPC , KC_ENT ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,DE_SS ,DE_UDIA ,
+ _______ ,_______ ,_______ ,_______ , KC_LCTL ,KC_SPC ,KC_LSFT , MO(_MOD),KC_ENT ,KC_LGUI , _______ ,_______ ,_______ ,_______
+ ),
+ [_MOD] = LAYOUT(
+ KC_F11 ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,RGB_MOD , RESET ,KC_F6 ,KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F12 ,
+ DE_CIRC ,DE_QUOT ,DE_DQUO ,DE_LCBR ,DE_RCBR ,DE_GRV ,RGB_TOG , _______ ,DE_PERC ,DE_PLUS ,DE_MINS ,DE_ASTR ,DE_SLSH ,DE_BSLS ,
+ DE_TILD ,DE_EXLM ,DE_DLR ,DE_LPRN ,DE_RPRN ,DE_AMPR ,RGB_M_P , _______ ,KC_LEFT ,KC_DOWN ,KC_UP ,KC_RGHT ,DE_QUES ,DE_PIPE ,
+ _______ ,DE_AT ,DE_EURO ,DE_LBRC ,DE_RBRC ,_______ ,_______ , _______ ,DE_HASH ,DE_LABK ,DE_SCLN ,DE_COLN ,DE_RABK ,DE_SECT ,
+ _______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ , _______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______
+ ),
+};
\ No newline at end of file
diff --git a/keyboards/ergodash/rev1/keymaps/tw1t611/readme.md b/keyboards/ergodash/rev1/keymaps/tw1t611/readme.md
new file mode 100644
index 00000000000..54ee4d4f1fa
--- /dev/null
+++ b/keyboards/ergodash/rev1/keymaps/tw1t611/readme.md
@@ -0,0 +1,4 @@
+# Tw1t611 Ergodash Layout
+
+This is a german layout for the ergodash keyboard. The Umlauts are placed on the right side.
+It uses two layers and has vim like aligned arrow keys.
diff --git a/keyboards/ergodash/rev1/keymaps/tw1t611/rules.mk b/keyboards/ergodash/rev1/keymaps/tw1t611/rules.mk
new file mode 100644
index 00000000000..bb9e33b0829
--- /dev/null
+++ b/keyboards/ergodash/rev1/keymaps/tw1t611/rules.mk
@@ -0,0 +1,3 @@
+BACKLIGHT_ENABLE = no
+RGBLIGHT_ENABLE = no
+AUDIO_ENABLE = no
diff --git a/keyboards/ergodox_ez/keymaps/danielo515/config.h b/keyboards/ergodox_ez/keymaps/danielo515/config.h
index 8982e765361..ff201caa908 100644
--- a/keyboards/ergodox_ez/keymaps/danielo515/config.h
+++ b/keyboards/ergodox_ez/keymaps/danielo515/config.h
@@ -25,9 +25,7 @@
# define NO_PRINT
#endif
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
-# define NO_ACTION_MACRO
-# define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
#undef RGBLIGHT_ANIMATIONS
diff --git a/keyboards/ergodox_ez/keymaps/ericgebhart/keymap.c b/keyboards/ergodox_ez/keymaps/ericgebhart/keymap.c
index 3b1bdb6fb15..dc33e4e0a9b 100644
--- a/keyboards/ergodox_ez/keymaps/ericgebhart/keymap.c
+++ b/keyboards/ergodox_ez/keymaps/ericgebhart/keymap.c
@@ -21,268 +21,298 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[DVORAK] = LAYOUT_ergodox_wrapper(
- // left hand
- KC_GRV, ___NUMBER_L___, DEF_OS_LAYER_SW,
- KC_LOCK, ___DVORAK_L1___, KC_LBRC,
- TAB_BKTAB, ___DVORAK_L2___,
- KC_LSFT, ___DVORAK_L3___, KC_LPRN,
+ // left hand
+ KC_GRV, ___NUMBER_L___, OSL(LAYERS),
+ KC_LOCK, ___DVORAK_L1___, LCTL(KC_C),
+ TAB_BKTAB, ___DVORAK_L2___,
+ KC_LSFT, ___DVORAK_L3___, TO(MDIA),
- ___ERGODOX_BOTTOM_LEFT___,
- ___ERGODOX_THUMB_LEFT___,
+ ___BOTTOM_LEFT___,
+ ___ERGODOX_THUMB_LEFT___,
- // right hand
- MDIA_SYMB, ___NUMBER_R___, KC_EQL,
- KC_RBRC, ___DVORAK_R1___, KC_SLASH,
- /* */ ___DVORAK_R2___, KC_MINUS,
- KC_RPRN, ___DVORAK_R3___, KC_RSFT,
+ // right hand
+ MDIA_SYMB_KP_LAYERS, ___NUMBER_R___, KC_EQL,
+ LCTL(KC_V), ___DVORAK_R1___, KC_SLASH,
+ /* */ ___DVORAK_R2___, KC_MINUS,
+ TO(KEYPAD), ___DVORAK_R3___, KC_RSFT,
- ___ERGODOX_BOTTOM_RIGHT___,
- ___ERGODOX_THUMB_RIGHT___
- ),
+ ___BOTTOM_RIGHT___,
+ ___ERGODOX_THUMB_RIGHT___
+ ),
[XMONAD] = LAYOUT_ergodox_wrapper(
- // left hand
- ___, ___FUNC_L___, ___,
- ___, ___DVORAK_L1___, ___,
- ___, ___DVORAK_L2___,
- ___, ___DVORAK_L3___, ___,
+ // left hand
+ ___, ___FUNC_L___, ___,
+ ___, ___DVORAK_L1___, ___,
+ ___, ___DVORAK_L2___,
+ ___, ___DVORAK_L3___, ___,
- ___ERGODOX_BOTTOM_LEFT___,
- ___ERGODOX_THUMB_LEFT___,
+ ___BOTTOM_LEFT___,
+ ___ERGODOX_THUMB_LEFT___,
- // right hand
- ___, ___FUNC_R___, ___,
- ___, ___DVORAK_R1___, ___,
- /**/ ___DVORAK_R2___, ___,
- ___, ___DVORAK_R3___, ___,
+ // right hand
+ ___, ___FUNC_R___, ___,
+ ___, ___DVORAK_R1___, ___,
+ /**/ ___DVORAK_R2___, ___,
+ ___, ___DVORAK_R3___, ___,
- ___ERGODOX_BOTTOM_RIGHT___,
- ___ERGODOX_THUMB_RIGHT___
- ),
+ ___BOTTOM_RIGHT___,
+ ___ERGODOX_THUMB_RIGHT___
+ ),
[QWERTY] = LAYOUT_ergodox_wrapper(
// left hand
- KC_GRV, ___NUMBER_L___, DEF_OS_LAYER_SW,
- KC_LOCK, ___QWERTY_L1___, KC_LBRC,
- TAB_BKTAB, ___QWERTY_L2___,
- KC_LSFT, ___QWERTY_L3___, KC_LPRN,
+ KC_GRV, ___NUMBER_L___, OSL(LAYERS),
+ KC_LOCK, ___QWERTY_L1___, LCTL(KC_C),
+ TAB_BKTAB, ___QWERTY_L2___,
+ KC_LSFT, ___QWERTY_L3___, TO(MDIA),
- ___ERGODOX_BOTTOM_LEFT___,
- ___ERGODOX_THUMB_LEFT___,
+ ___BOTTOM_LEFT___,
+ ___ERGODOX_THUMB_LEFT___,
- // right hand
- MDIA_SYMB, ___NUMBER_R___, KC_EQL,
- KC_RBRC, ___QWERTY_R1___, KC_SLASH,
- /* */ ___QWERTY_R2___, KC_MINUS,
- KC_RPRN, ___QWERTY_R3___, KC_RSFT,
+ // right hand
+ MDIA_SYMB_KP_LAYERS, ___NUMBER_R___, KC_EQL,
+ LCTL(KC_V), ___QWERTY_R1___, KC_SLASH,
+ /* */ ___QWERTY_R2___, KC_MINUS,
+ TO(KEYPAD), ___QWERTY_R3___, KC_RSFT,
- ___ERGODOX_BOTTOM_RIGHT___,
- ___ERGODOX_THUMB_RIGHT___
- ),
+ ___BOTTOM_RIGHT___,
+ ___ERGODOX_THUMB_RIGHT___
+ ),
[COLEMAK] = LAYOUT_ergodox_wrapper(
- // left hand
- KC_GRV, ___NUMBER_L___, DEF_OS_LAYER_SW,
- KC_LOCK, ___COLEMAK_L1___, KC_LBRC,
- TAB_BKTAB, ___COLEMAK_L2___,
- KC_LSFT, ___COLEMAK_L3___, KC_LPRN,
+ // left hand
+ KC_GRV, ___NUMBER_L___, OSL(LAYERS),
+ KC_LOCK, ___COLEMAK_L1___, LCTL(KC_C),
+ TAB_BKTAB, ___COLEMAK_L2___,
+ KC_LSFT, ___COLEMAK_L3___, TO(MDIA),
- ___ERGODOX_BOTTOM_LEFT___,
- ___ERGODOX_THUMB_LEFT___,
+ ___BOTTOM_LEFT___,
+ ___ERGODOX_THUMB_LEFT___,
- // right hand
- MDIA_SYMB, ___NUMBER_R___, KC_EQL,
- KC_RBRC, ___COLEMAK_R1___, KC_SLASH,
- /* */ ___COLEMAK_R2___, KC_MINUS,
- KC_RPRN, ___COLEMAK_R3___, KC_RSFT,
+ // right hand
+ MDIA_SYMB_KP_LAYERS, ___NUMBER_R___, KC_EQL,
+ LCTL(KC_V), ___COLEMAK_R1___, KC_SLASH,
+ /* */ ___COLEMAK_R2___, KC_MINUS,
+ TO(KEYPAD), ___COLEMAK_R3___, KC_RSFT,
- ___ERGODOX_BOTTOM_RIGHT___,
- ___ERGODOX_THUMB_RIGHT___
- ),
+ ___BOTTOM_RIGHT___,
+ ___ERGODOX_THUMB_RIGHT___
+ ),
[WORKMAN] = LAYOUT_ergodox_wrapper(
- // left hand
- KC_GRV, ___NUMBER_L___, DEF_OS_LAYER_SW,
- KC_LOCK, ___WORKMAN_L1___, KC_LBRC,
- TAB_BKTAB, ___WORKMAN_L2___,
- KC_LSFT, ___WORKMAN_L3___, KC_LPRN,
+ // left hand
+ KC_GRV, ___NUMBER_L___, OSL(LAYERS),
+ KC_LOCK, ___WORKMAN_L1___, LCTL(KC_C),
+ TAB_BKTAB, ___WORKMAN_L2___,
+ KC_LSFT, ___WORKMAN_L3___, TO(MDIA),
- ___ERGODOX_BOTTOM_LEFT___,
- ___ERGODOX_THUMB_LEFT___,
+ ___BOTTOM_LEFT___,
+ ___ERGODOX_THUMB_LEFT___,
- // right hand
- MDIA_SYMB, ___NUMBER_R___, KC_EQL,
- KC_RBRC, ___WORKMAN_R1___, KC_SLASH,
- /* */ ___WORKMAN_R2___, KC_MINUS,
- KC_RPRN, ___WORKMAN_R3___, KC_RSFT,
+ // right hand
+ MDIA_SYMB_KP_LAYERS, ___NUMBER_R___, KC_EQL,
+ LCTL(KC_V), ___WORKMAN_R1___, KC_SLASH,
+ /* */ ___WORKMAN_R2___, KC_MINUS,
+ TO(KEYPAD), ___WORKMAN_R3___, KC_RSFT,
- ___ERGODOX_BOTTOM_RIGHT___,
- ___ERGODOX_THUMB_RIGHT___
- ),
+ ___BOTTOM_RIGHT___,
+ ___ERGODOX_THUMB_RIGHT___
+ ),
[NORMAN] = LAYOUT_ergodox_wrapper(
- // left hand
- KC_GRV, ___NUMBER_L___, DEF_OS_LAYER_SW,
- KC_LOCK, ___NORMAN_L1___, KC_LBRC,
- TAB_BKTAB, ___NORMAN_L2___,
- KC_LSFT, ___NORMAN_L3___, KC_LPRN,
+ // left hand
+ KC_GRV, ___NUMBER_L___, OSL(LAYERS),
+ KC_LOCK, ___NORMAN_L1___, LCTL(KC_C),
+ TAB_BKTAB, ___NORMAN_L2___,
+ KC_LSFT, ___NORMAN_L3___, TO(MDIA),
- ___ERGODOX_BOTTOM_LEFT___,
- ___ERGODOX_THUMB_LEFT___,
+ ___BOTTOM_LEFT___,
+ ___ERGODOX_THUMB_LEFT___,
- // right hand
- MDIA_SYMB, ___NUMBER_R___, KC_EQL,
- KC_RBRC, ___NORMAN_R1___, KC_SLASH,
- /* */ ___NORMAN_R2___, KC_MINUS,
- KC_RPRN, ___NORMAN_R3___, KC_RSFT,
+ // right hand
+ MDIA_SYMB_KP_LAYERS, ___NUMBER_R___, KC_EQL,
+ LCTL(KC_V), ___NORMAN_R1___, KC_SLASH,
+ /* */ ___NORMAN_R2___, KC_MINUS,
+ TO(KEYPAD), ___NORMAN_R3___, KC_RSFT,
- ___ERGODOX_BOTTOM_RIGHT___,
- ___ERGODOX_THUMB_RIGHT___
- ),
+ ___BOTTOM_RIGHT___,
+ ___ERGODOX_THUMB_RIGHT___
+ ),
[DVORAK_ON_BEPO] = LAYOUT_ergodox_wrapper(
- // left hand
- DB_GRV, ___NUMBER_BEPO_L___, DEF_OS_LAYER_SW,
- KC_LOCK, ___DVORAK_FR_L1___, DB_LBRC,
- TAB_BKTAB, ___DVORAK_FR_L2___,
- KC_LSFT, ___DVORAK_FR_L3___, DB_LPRN,
+ // left hand
+ DB_GRV, ___NUMBER_BEPO_L___, OSL(LAYERS),
+ KC_LOCK, ___DVORAK_FR_L1___, DB_LBRC,
+ TAB_BKTAB, ___DVORAK_FR_L2___,
+ KC_LSFT, ___DVORAK_FR_L3___, DB_LPRN,
- ___ERGODOX_BOTTOM_LEFT___,
- ___ERGODOX_THUMB_LEFT___,
+ ___BOTTOM_LEFT_FR___,
+ ___ERGODOX_THUMB_LEFT_BP___,
- // right hand
- MDIA_SYMB, ___NUMBER_BEPO_R___, DB_EQL,
- DB_RBRC, ___DVORAK_FR_R1___, DB_SLASH,
+ // right hand
+ MDIA_SYMB_KP_LAYERS, ___NUMBER_BEPO_R___, DB_EQL,
+ DB_RBRC, ___DVORAK_FR_R1___, DB_SLASH,
- /* */ ___DVORAK_FR_R2___, DB_MINUS,
- DB_RPRN, ___DVORAK_FR_R3___, KC_RSFT,
+ /* */ ___DVORAK_FR_R2___, DB_MINUS,
+ DB_RPRN, ___DVORAK_FR_R3___, KC_RSFT,
- ___ERGODOX_BOTTOM_RIGHT_FR___,
- ___ERGODOX_THUMB_RIGHT___
- ),
-
- [XMONAD_FR] = LAYOUT_ergodox_wrapper(
- // left hand
- ___, ___FUNC_L___, ___,
- ___, ___DVORAK_FR_L1___, ___,
- ___, ___DVORAK_FR_L2___,
- ___, ___DVORAK_FR_L3___, ___,
-
- ___ERGODOX_BOTTOM_LEFT___,
- ___ERGODOX_THUMB_LEFT___,
-
-
- // right hand
- ___, ___FUNC_R___, ___,
- ___, ___DVORAK_FR_R1___, ___,
- /**/ ___DVORAK_FR_R2___, ___,
- ___, ___DVORAK_FR_R3___, ___,
-
- ___ERGODOX_BOTTOM_RIGHT_FR___,
- ___ERGODOX_THUMB_RIGHT___
- ),
+ ___BOTTOM_RIGHT_FR___,
+ ___ERGODOX_THUMB_RIGHT_BP___
+ ),
[BEPO] = LAYOUT_ergodox_wrapper(
- // Left hand
- BP_DLR, ___SYMBOL_BEPO_L___, DEF_OS_LAYER_SW,
- KC_LOCK, ___BEPO_FR_L1___, DB_LBRC,
- TAB_BKTAB, ___BEPO_FR_L2___,
- BP_SFT_T_ECRC, ___BEPO_FR_L3___, DB_RBRC,
+ // Left hand
+ BP_DLR, ___SYMBOL_BEPO_L___, OSL(LAYERS),
+ KC_LOCK, ___BEPO_FR_L1___, DB_LBRC,
+ TAB_BKTAB, ___BEPO_FR_L2___,
+ BP_SFT_T_ECRC, ___BEPO_FR_L3___, DB_RBRC,
- ___ERGODOX_BOTTOM_LEFT___,
- ___ERGODOX_THUMB_LEFT___,
+ ___5___,
+ ___6___,
- // Right hand
- MDIA_SYMB, ___SYMBOL_BEPO_R___, BP_EQL,
- BP_DCRC, ___BEPO_FR_R1___, BP_W,
- /* */ ___BEPO_FR_R2___, BP_CCED,
- BP_C, ___BEPO_FR_R3___, KC_RSFT,
+ // Right hand
+ MDIA_SYMB_KP_LAYERS, ___SYMBOL_BEPO_R___, BP_EQL,
+ BP_DCRC, ___BEPO_FR_R1___, BP_W,
+ /* */ ___BEPO_FR_R2___, BP_CCED,
+ BP_C, ___BEPO_FR_R3___, KC_RSFT,
- ___ERGODOX_BOTTOM_RIGHT___,
- ___ERGODOX_THUMB_RIGHT___
- ),
+ ___5___,
+ ___6___
+ ),
+
+ [XMONAD_FR] = LAYOUT_ergodox_wrapper(
+ // left hand
+ ___, ___FUNC_L___, ___,
+ ___, ___DVORAK_FR_L1___, ___,
+ ___, ___DVORAK_FR_L2___,
+ ___, ___DVORAK_FR_L3___, ___,
+
+ ___BOTTOM_LEFT_FR___,
+ ___ERGODOX_THUMB_LEFT_BP___,
+
+
+ // right hand
+ ___, ___FUNC_R___, ___,
+ ___, ___DVORAK_FR_R1___, ___,
+ /**/ ___DVORAK_FR_R2___, ___,
+ ___, ___DVORAK_FR_R3___, ___,
+
+ ___BOTTOM_RIGHT_FR___,
+ ___ERGODOX_THUMB_RIGHT_BP___
+ ),
// SYMBOLS
[SYMB] = LAYOUT_ergodox_wrapper(
// left hand
- ___, ___FUNC_L___, ___,
- ___, ___SYMBOLS_1___, ___,
- ___, ___SYMBOLS_2___,
- ___, ___SYMBOLS_3___, ___,
-
- ___ERGODOX_TRANS_BOTTOM___,
- ___ERGODOX_TRANS_THUMBS___,
+ ___FUNC_1_6___, ___,
+ ___SYMBOLS6_1___, ___,
+ ___SYMBOLS6_2___,
+ ___SYMBOLS6_3___, ___,
+ ___SYMBOLS5_4___,
+ ___6___,
- // right hand
- ___, ___FUNC_R___, KC_F11,
- ___, KC_UP, ___KEYPAD_1___, KC_F12,
- /**/ KC_DOWN, ___KEYPAD_2___, KC_TRNS,
- ___, KC_AMPR, ___KEYPAD_3___, KC_PENT,
- /* */ ___KEYPAD_4___, ___,
-
- ___ERGODOX_TRANS_THUMBS___
- ),
+ // right hand
+ ___, ___FUNC_7_12___,
+ ___, ___SYMPAD_1___,
+ /**/ ___SYMPAD_2___,
+ ___, ___SYMPAD_3___,
+ /**/ ___5_SYMPAD_4___,
+ ___6___
+ ),
[SYMB_ON_BEPO] = LAYOUT_ergodox_wrapper(
- // left hand
- ___, ___FUNC_L___, ___,
- ___, ___SYMBOLS_1_BP___, ___,
- ___, ___SYMBOLS_2_BP___,
- ___, ___SYMBOLS_3_BP___, ___,
-
- ___ERGODOX_TRANS_BOTTOM___,
- ___ERGODOX_TRANS_THUMBS___,
+ // left hand
+ ___FUNC_1_6___, ___,
+ ___SYMBOLS6_1_BP___, ___,
+ ___SYMBOLS6_2_BP___,
+ ___SYMBOLS6_3_BP___, ___,
+ ___SYMBOLS5_4_BP___,
+ ___6___,
- // right hand
- ___, ___FUNC_R___, KC_F11,
- ___, KC_UP, ___KEYPAD_1_BP___, KC_F12,
- /**/ KC_DOWN, ___KEYPAD_2_BP___, KC_TRNS,
- ___, KC_AMPR, ___KEYPAD_3_BP___, KC_PENT,
- /* */ ___KEYPAD_4_BP___, ___,
+ // right hand
+ ___, ___FUNC_7_12___,
+ ___, ___SYMPAD_1_BP___,
+ /**/ ___SYMPAD_2_BP___,
+ ___, ___SYMPAD_3_BP___,
+ /**/ ___5_SYMPAD_4_BP___,
+ ___6___
+ ),
- ___ERGODOX_TRANS_THUMBS___
- ),
+ [KEYPAD] = LAYOUT_ergodox_wrapper(
+ ___FUNC_1_6___, ___,
+ ___2___, ___FUNCPAD_T___, ___, ___,
+ ___2___, ___FUNCPAD_1___, ___,
+ ___2___, ___FUNCPAD_2___, ___, ___,
+ ___2___, ___FUNCPAD_3___,
+ ___6___,
+
+ // right hand
+ ___, ___FUNC_7_12___,
+ ___, ___, ___KEYPAD_1___, ___,
+ /**/ ___, ___KEYPAD_2___, ___,
+ ___, ___, ___KEYPAD_3___, ___,
+ /* */ ___KEYPAD_4___, ___,
+ ___6___
+ ),
+
+ [KEYPAD_ON_BEPO] = LAYOUT_ergodox_wrapper(
+ ___FUNC_1_6___, ___,
+ ___2___, ___FUNCPAD_T___, ___, ___,
+ ___2___, ___FUNCPAD_1___, ___,
+ ___2___, ___FUNCPAD_2___, ___, ___,
+ ___2___, ___FUNCPAD_3___,
+ ___6___,
+
+ // right hand
+ ___, ___FUNC_7_12___,
+ ___, ___, ___KEYPAD_1_BP___, ___,
+ /**/ ___, ___KEYPAD_2_BP___, ___,
+ ___, ___, ___KEYPAD_3_BP___, ___,
+ /* */ ___KEYPAD_4_BP___, ___,
+ ___6___
+ ),
// MEDIA AND MOUSE
[MDIA] = LAYOUT_ergodox_wrapper(
- // left hand
- ___, ___FUNC_L___, ___,
- ___MOUSE_BTNS_L___, ___, ___,
- ___, ___MOUSE_LDUR___, ___,
- ___, ___MWHEEL_LDUR___, XXX, ___,
- ___, ___, ___MOUSE_ACCL_012___,
- ___ERGODOX_TRANS_THUMBS___,
+ // left hand
+ ___FUNC_1_6___, ___,
+ ___MOUSE_BTNS_L___, ___, ___,
+ ___, ___MOUSE_LDUR___, ___,
+ ___, ___MWHEEL_LDUR___, XXX, ___,
+ ___, ___, ___MOUSE_ACCL_012___,
+ ___6___,
- // right hand
- ___, ___FUNC_R___, KC_F11,
- KC_VOLU, ___, ___MUTE_PLAY_STOP___, ___, KC_F12,
- /* */ KC_PGUP, ___VI_ARROWS___, ___,
- KC_VOLD, KC_PGDN, ___MOUSE_BTNS_R___,
- ___ERGODOX_TRANS_BOTTOM___,
- ___ERGODOX_TRANS_THUMBS___
- ),
+ // right hand
+ ___, ___FUNC_7_12___,
+ ___, KC_VOLU, ___MUTE_PRV_PLAY_NXT_STOP___,
+ /**/ KC_VOLD, ___VI_ARROWS___, ___,
+ ___, ___, ___MOUSE_BTNS_R___,
+ /* */ KC_PGDN, KC_PGUP, ___3___,
+ ___6___
+ ),
[LAYERS] = LAYOUT_ergodox_wrapper(
- // left hand
- ___, ___FUNC_L___, ___,
- XXX, XXX, XXX, ___LAYERS_L1___, XXX, XXX,
- XXX, XXX, XXX, ___LAYERS_L2___, XXX,
- XXX, XXX, ___LAYERS_L3___, XXX, XXX,
- ___, ___, ___LAYERS_L4___,
- ___ERGODOX_TRANS_THUMBS___,
+ // left hand
+ ___FUNC_1_6___, ___,
+ XXX, XXX, XXX, ___2_LAYERS_B1___, XXX, ___,
+ XXX, XXX, XXX, ___2_LAYERS_B2___, XXX,
+ XXX, XXX, ___3_LAYERS_B3___, XXX, ___,
+ ___5___,
+ ___6___,
- // right hand
- ___, ___FUNC_R___, KC_F11,
- KC_VOLU, ___, ___MUTE_PLAY_STOP___, ___, KC_F12,
- /* */ KC_PGUP, ___VI_ARROWS___, ___,
- KC_VOLD, KC_PGDN, ___MOUSE_BTNS_R___,
- ___ERGODOX_TRANS_BOTTOM___,
- ___ERGODOX_TRANS_THUMBS___
- ),
+ // right hand
+ ___, ___FUNC_7_12___,
+ ___, XXX, ___3_LAYERS_T_BP___, ___2___,
+ /**/ XXX, ___3_LAYERS_T___, ___2___,
+ ___, XXX, ___3_LAYERS_T_CTL___, ___2___,
+ ___5___,
+ ___6___
+ ),
};
diff --git a/keyboards/ergodox_ez/keymaps/pvinis/keymap.c b/keyboards/ergodox_ez/keymaps/pvinis/keymap.c
index dc804d632c5..c4b1b3b82c4 100644
--- a/keyboards/ergodox_ez/keymaps/pvinis/keymap.c
+++ b/keyboards/ergodox_ez/keymaps/pvinis/keymap.c
@@ -1,38 +1,36 @@
// pvinis ergodox ez
-// ,------------------------------------. ,------------------------------------.
-// | | | | | | | | | | | | | | | |
-// |------+----+----+----+----+---------| |----+----+----+----+----+----+------|
-// | | | | | | | | | | | | | | | |
-// |------+----+----+----x----x----| | | |----x----x----+----+----+------|
-// | | | | | | |----| |----| | | | | | |
-// |------+----+----+----x----x----| | | |----x----x----+----+----+------|
-// | | | | | | | | | | | | | | | |
-// `------+----+----+----+----+---------' `---------+----+----+----+----+------'
-// | | | | | | | | | | | |
-// `------------------------' `------------------------'
-// ,---------. ,---------.
-// | | | | | |
-// ,----+----+----| |----+----+----.
-// | | | | | | | |
-// | | |----| |----| | |
-// | | | | | | | |
-// `--------------' `--------------'
-
+// ,------------------------------------. ┌────┬────┬────┬────┬────┬────┬──────┐
+// | | | | | | | | │ │ │ │ │ │ │ │
+// |------+----+----+----+----+---------| ├────┼────┼────┼────┼────┼────┼──────┤
+// | | | | | | | | │ │ │ │ │ │ │ │
+// |------+----+----+----x----x----| | │ ├────╆━━━━╅────┼────┼────┼──────┤
+// | | | | | | |----| ├────┤ ┃ ┃ │ │ │ │
+// |------+----+----+----x----x----| | │ ├────╄━━━━╃────┼────┼────┼──────┤
+// | | | | | | | | │ │ │ │ │ │ │ │
+// `------+----+----+----+----+---------' └────┴────┼────┼────┼────┼────┼────┬─┘
+// | | | | | | │ │ │ │ │ │
+// `------------------------' └────┴────┴────┴────┴────┘
+// ,---------. ┌────┬────┐
+// | | | │ │ │
+// ,----+----+----| ├────┼────┼────┐
+// | | | | │ │ │ │
+// | | |----| ├────┤ │ │
+// | | | | │ │ │ │
+// `--------------' └────┴────┴────┘
#include QMK_KEYBOARD_H
#include "pvinis.h"
#include "mousekey.h"
-
// layers
enum {
- MOUSE = 8,
+ MOUSE = 8,
};
// extra keys
enum {
- NONE = 30,
- TD_LAYR, // SYSCTL and MOUSE layer switch
+ NONE = 30,
+ TD_LAYR, // SYSCTL and MOUSE layer switch
};
// application selection
@@ -41,158 +39,170 @@ enum {
#define AP_XCOD ALLM(KC_X)
#define AP_MSGR ALLM(KC_M)
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- // ,------------------------------------. ,------------------------------------.
- // |4xFLSH| | | | | |Opt | | | | | | | | |
- // |------+----+----+----+----+---------| |----+----+----+----+----+----+------|
- // | Tab | | | | | | | | | | | | | | |
- // |------+----+----+----x----x----| | | |----x----x----+----+----+------|
- // |EscCtl| | | | | |----| |----| | | | | | Ent |
- // |------+----+----+----x----x----| | | |----x----x----+----+----+------|
- // |LShift| | | | | | | | | | | | | |RShift|
- // `------+----+----+----+----+---------' `---------+----+----+----+----+------'
- // | | | | |Cmd | | | | | | |
- // `------------------------' `------------------------'
- // ,---------. ,---------.
- // |QWER| | | | |
- // ,----+----+----| |----+----+----.
- // | Ba | L | | | | | |
- // | ck |Shi |----| |----| |Spc |
- // | spc| ft | | | | | |
- // `--------------' `--------------'
- [LR_BASE] = LAYOUT_ergodox_pretty_wrapper(
- TD_3FLS, _______, _______, _______, _______, _______, KC_LALT, _______, _______, _______, _______, _______, _______, _______,
- KC_TAB , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- PV_ESCC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_ENT ,
- KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RSFT,
- _______, _______, _______, KC_LGUI, SYMBOL , SYSCTL , KC_RALT, _______, _______, _______,
- QWERTY , CARPALX, _______, _______,
- _______, _______,
- KC_BSPC, _______, _______, _______, _______, KC_SPC
+ // ,------------------------------------. ,------------------------------------.
+ // |4xFLSH| | | | | |Opt | | | | | | | | |
+ // |------+----+----+----+----+---------| |----+----+----+----+----+----+------|
+ // | Tab | | | | | | | | | | | | | | |
+ // |------+----+----+----x----x----| | | |----x----x----+----+----+------|
+ // |EscCtl| | | | | |----| |----| | | | | | Ent |
+ // |------+----+----+----x----x----| | | |----x----x----+----+----+------|
+ // |LShift| | | | | | | | | | | | | |RShift|
+ // `------+----+----+----+----+---------' `---------+----+----+----+----+------'
+ // | | | |Cmd |LOWR| |RASE|RAlt| | | |
+ // `------------------------' `------------------------'
+ // ,---------. ,---------.
+ // |QWER| | | | |
+ // ,----+----+----| |----+----+----.
+ // | Ba | L | | | | | |
+ // | ck |Shi |----| |----| |Spc |
+ // | spc| ft | | | | | |
+ // `--------------' `--------------'
+ [LR_BASE] = LAYOUT_ergodox_pretty_wrapper(
+ // clang-format off
+ TD_3FLS, _______, _______, _______, _______, _______, KC_LALT, _______, _______, _______, _______, _______, _______, _______,
+ KC_TAB , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ PV_ESCC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_ENT ,
+ KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RSFT,
+ _______, _______, _______, KC_LGUI, SYMBOL , SYSCTL , KC_RALT, _______, _______, _______,
+ QWERTY , CARPALX, _______, _______,
+ _______, _______,
+ KC_BSPC, _______, _______, _______, _______, KC_SPC
+ // clang-format on
+ ),
+
+ // ,------------------------------------. ,------------------------------------.
+ // | | NUMBERS_L | | | - | NUMBERS_R | = |
+ // |------+----+----+----+----+---------| |----+----+----+----+----+----+------|
+ // | | | [ | | ] | | |
+ // |------+ | | | | +------|
+ // | | QWERTY_L |----| |----| QWERTY_R | |
+ // |------+ | ( | | ) | +------|
+ // | | | | | | | |
+ // `------+----+----+----+----+---------' `---------+----+----+----+----+------'
+ // | | ` | | | | | | | | ' | |
+ // `------------------------' `------------------------'
+ // ,---------. ,---------.
+ // | | | | | |
+ // ,----+----+----| |----+----+----.
+ // | | | | | | | |
+ // | | |----| |----| | |
+ // | | | | | | | |
+ // `--------------' `--------------'
+ // See `users/pvinis/pvinis.h`
+ [LR_QWERTY] = LAYOUT_ergodox_pretty_wrapper(
+ // clang-format off
+ _______, ________________NUMBERS_L__________________, _______, KC_MINS, ________________NUMBERS_R__________________, KC_EQL ,
+ _______, _________________QWERTY_L1_________________, KC_LBRC, KC_RBRC, _________________QWERTY_R1_________________, _______,
+ _______, _____________MOD_QWERTY_L2_________________, _____________MOD_QWERTY_R2_________________, _______,
+ _______, _________________QWERTY_L3_________________, KC_LPRN, KC_RPRN, _________________QWERTY_R3_________________, _______,
+ _______, KC_GRV, _______, _______, _______, _______, _______, _______, KC_QUOT , _______,
+ _______, _______, _______, _______,
+ _______, _______,
+ _______, _______, _______, _______, _______, _______
+ // clang-format off
),
- // ,------------------------------------. ,------------------------------------.
- // | | NUMBERS_L | | | - | NUMBERS_R | = |
- // |------+----+----+----+----+---------| |----+----+----+----+----+----+------|
- // | | | [ | | ] | | |
- // |------+ | | | | +------|
- // | | QWERTY_L |----| |----| QWERTY_R | |
- // |------+ | ( | | ) | +------|
- // | | | | | | | |
- // `------+----+----+----+----+---------' `---------+----+----+----+----+------'
- // | | ` | | | | | | | | ' | |
- // `------------------------' `------------------------'
- // ,---------. ,---------.
- // | | | | | |
- // ,----+----+----| |----+----+----.
- // | | | | | | | |
- // | | |----| |----| | |
- // | | | | | | | |
- // `--------------' `--------------'
- // See `users/pvinis/pvinis.h`
- [LR_QWERTY] = LAYOUT_ergodox_pretty_wrapper(
- _______, ________________NUMBERS_L__________________, _______, KC_MINS, ________________NUMBERS_R__________________, KC_EQL ,
- _______, _________________QWERTY_L1_________________, KC_LBRC, KC_RBRC, _________________QWERTY_R1_________________, _______,
- _______, _____________MOD_QWERTY_L2_________________, _____________MOD_QWERTY_R2_________________, _______,
- _______, _________________QWERTY_L3_________________, KC_LPRN, KC_RPRN, _________________QWERTY_R3_________________, _______,
- _______, KC_GRV, _______, _______, _______, _______, _______, _______, KC_QUOT , _______,
- _______, _______, _______, _______,
- _______, _______,
- _______, _______, _______, _______, _______, _______
- ),
-
- // ,------------------------------------. ,------------------------------------.
- // | | NUMBERS_L | | | | NUMBERS_R | |
- // |------+----+----+----+----+---------| |----+----+----+----+----+----+------|
- // | | | | | | | |
- // |------+ | | | | +------|
- // | | CARPALX_L |----| |----| CARPALX_R | |
- // |------+ | | | | +------|
- // | | | | | | | |
- // `------+----+----+----+----+---------' `---------+----+----+----+----+------'
- // | | | | | | | | | | | |
- // `------------------------' `------------------------'
- // ,---------. ,---------.
- // | | | | | |
- // ,----+----+----| |----+----+----.
- // | | | | | | | |
- // | | |----| |----| | |
- // | | | | | | | |
- // `--------------' `--------------'
- // See `users/pvinis/pvinis.h`
+ // ,------------------------------------. ,------------------------------------.
+ // | | NUMBERS_L | | | | NUMBERS_R | |
+ // |------+----+----+----+----+---------| |----+----+----+----+----+----+------|
+ // | | | | | | | |
+ // |------+ | | | | +------|
+ // | | CARPALX_L |----| |----| CARPALX_R | |
+ // |------+ | | | | +------|
+ // | | | | | | | |
+ // `------+----+----+----+----+---------' `---------+----+----+----+----+------'
+ // | | | | | | | | | | | |
+ // `------------------------' `------------------------'
+ // ,---------. ,---------.
+ // | | | | | |
+ // ,----+----+----| |----+----+----.
+ // | | | | | | | |
+ // | | |----| |----| | |
+ // | | | | | | | |
+ // `--------------' `--------------'
+ // See `users/pvinis/pvinis.h`
[LR_CARPALX] = LAYOUT_ergodox_pretty_wrapper(
- _______, ________________NUMBERS_L__________________, _______, _______, ________________NUMBERS_R__________________, _______,
- _______, ________________CARPALX_L1_________________, _______, _______, ________________CARPALX_R1_________________, _______,
- _______, ________________CARPALX_L2_________________, ________________CARPALX_R2_________________, _______,
- _______, ________________CARPALX_L3_________________, _______, _______, ________________CARPALX_R3_________________, _______,
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______,
- _______, _______,
- _______, _______, _______, _______, _______, _______
+ // clang-format off
+ _______, ________________NUMBERS_L__________________, _______, _______, ________________NUMBERS_R__________________, _______,
+ _______, ________________CARPALX_L1_________________, _______, _______, ________________CARPALX_R1_________________, _______,
+ _______, ________________CARPALX_L2_________________, ________________CARPALX_R2_________________, _______,
+ _______, ________________CARPALX_L3_________________, _______, _______, ________________CARPALX_R3_________________, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______,
+ _______, _______, _______, _______, _______, _______
+ // clang-format on
+ ),
+
+ // See `users/pvinis/pvinis.h`
+ [LR_SYMBOL] = LAYOUT_ergodox_pretty_wrapper(
+ // clang-format off
+ _______, ______________________F_L__________________, KC_F11 , KC_F12 , ______________________F_R__________________, _______,
+ _______, _________________SYMBOL_L1_________________, _______, _______, _________________SYMBOL_R1_________________, _______,
+ _______, _________________SYMBOL_L2_________________, _________________SYMBOL_R2_________________, _______,
+ _______, _________________SYMBOL_L3_________________, _______, _______, _________________SYMBOL_R3_________________, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______,
+ _______, _______, _______, _______, _______, _______
+ // clang-format off
),
- // See `users/pvinis/pvinis.h`
- [LR_SYMBOL] = LAYOUT_ergodox_pretty_wrapper(
- _______, ______________________F_L__________________, KC_F11 , KC_F12 , ______________________F_R__________________, _______,
- _______, _________________SYMBOL_L1_________________, _______, _______, _________________SYMBOL_R1_________________, _______,
- _______, _________________SYMBOL_L2_________________, _________________SYMBOL_R2_________________, _______,
- _______, _________________SYMBOL_L3_________________, _______, _______, _________________SYMBOL_R3_________________, _______,
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______,
- _______, _______,
- _______, _______, _______, _______, _______, _______
- ),
-
- // See `users/pvinis/pvinis.h`
+ // See `users/pvinis/pvinis.h`
[LR_SYSCTL] = LAYOUT_ergodox_pretty_wrapper(
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______, _______, _______, _______, _______, _________________SYSCTL_R1_________________, _______,
- _______, _______, _______, _______, _______, _______, _________________SYSCTL_R2_________________, _______,
- _______, _______, _______, _______, _______, _______, _______, _______, _________________SYSCTL_R3_________________, _______,
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ // clang-format off
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _________________SYSCTL_R1_________________, _______,
+ _______, _______, _______, _______, _______, _______, _________________SYSCTL_R2_________________, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _________________SYSCTL_R3_________________, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______,
- _______, _______,
- _______, _______, _______, _______, _______, _______
- ),
+ _______, _______, _______, _______,
+ _______, _______,
+ _______, _______, _______, _______, _______, _______
+ // clang-format on
+ ),
- // See `users/pvinis/pvinis.h`
- [LR_KBCTL] = LAYOUT_ergodox_pretty_wrapper(
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, __________________KBCTL_R1_________________, XXXXXXX,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, __________________KBCTL_R2_________________, XXXXXXX,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, __________________KBCTL_R3_________________, XXXXXXX,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // See `users/pvinis/pvinis.h`
+ [LR_KBCTL] = LAYOUT_ergodox_pretty_wrapper(
+ // clang-format off
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, __________________KBCTL_R1_________________, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, __________________KBCTL_R2_________________, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, __________________KBCTL_R3_________________, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- XXXXXXX, XXXXXXX,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
- ),
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+ // clang-format on
+ ),
-/* MOUSE
- * a keymap to control my system.
- *
- * ,--------------------------------------------------. ,--------------------------------------------------.
- * | ^ | | | | | | | | | | | | | | |
- * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
- * | | | | | | | | | | | | MsUp | | | |
- * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
- * | | | | | | |------| |------| |MsLeft| MsDn |MsRght| | |
- * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
- * | | | | | | | | | | | | | | | |
- * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
- * | | | | | | | | | | | |
- * `----------------------------------' `----------------------------------'
- * ,-------------. ,-------------.
- * | | | | |MidClk|
- * ,------|------|------| |------+------+------.
- * | | | | | |Left |Right |
- * | | |------| |------| Click| Click|
- * | | | ^ | | | | |
- * `--------------------' `--------------------'
- */
- [MOUSE] = LAYOUT_ergodox_pretty(
+ /* MOUSE
+ * a keymap to control my system.
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ^ | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | | | | | | | | | | | MsUp | | | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | | | | | |------| |------| |MsLeft| MsDn |MsRght| | |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | | | | | | | | | | | | | | | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,-------------.
+ * | | | | |MidClk|
+ * ,------|------|------| |------+------+------.
+ * | | | | | |Left |Right |
+ * | | |------| |------| Click| Click|
+ * | | | ^ | | | | |
+ * `--------------------' `--------------------'
+ */
+ [MOUSE] = LAYOUT_ergodox_pretty(
+ // clang-format off
KC_TRNS ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO ,KC_NO
@@ -212,53 +222,54 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
,KC_NO ,KC_NO
,KC_NO
,KC_NO ,KC_NO ,KC_NO
- ),
+ // clang-format on
+ ),
};
-
// keyboard initialization
-void keyboard_post_init_user_local(void) {
- ergodox_led_all_on();
- for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) {
- ergodox_led_all_set(i);
- wait_ms(5);
- }
- wait_ms(1000);
- for (int i = LED_BRIGHTNESS_LO; i > 0; i--) {
- ergodox_led_all_set(i);
- wait_ms(10);
- }
- ergodox_led_all_off();
+void keyboard_post_init_user_keymap(void) {
+ ergodox_led_all_on();
+ for (int i = LED_BRIGHTNESS_HI; i > LED_BRIGHTNESS_LO; i--) {
+ ergodox_led_all_set(i);
+ wait_ms(5);
+ }
+ wait_ms(1000);
+ for (int i = LED_BRIGHTNESS_LO; i > 0; i--) {
+ ergodox_led_all_set(i);
+ wait_ms(10);
+ }
+ ergodox_led_all_off();
- // restore default brightness for future use
- ergodox_led_all_set(LED_BRIGHTNESS_HI);
+ // restore default brightness for future use
+ ergodox_led_all_set(LED_BRIGHTNESS_HI);
}
// light up leds based on the layer
-uint32_t layer_state_set_user_local(uint32_t state) {
- ergodox_right_led_1_off();
- ergodox_right_led_2_off();
- ergodox_right_led_3_off();
- switch (biton32(state)) {
- case LR_SYSCTL:
- ergodox_right_led_3_on(); // blue
- break;
- case LR_KBCTL:
- ergodox_right_led_1_on(); // red
- break;
- case LR_SYMBOL:
- ergodox_right_led_2_on(); // green
- break;
- default: break;
- }
- return state;
+uint32_t layer_state_set_user_keymap(uint32_t state) {
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (biton32(state)) {
+ case LR_SYSCTL:
+ ergodox_right_led_3_on(); // blue
+ break;
+ case LR_KBCTL:
+ ergodox_right_led_1_on(); // red
+ break;
+ case LR_SYMBOL:
+ ergodox_right_led_2_on(); // green
+ break;
+ default:
+ break;
+ }
+ return state;
}
// extra keys
// const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
- // switch (id) {
- // }
- // return MACRO_NONE;
+// switch (id) {
+// }
+// return MACRO_NONE;
// }
// tap dances
@@ -325,6 +336,6 @@ uint32_t layer_state_set_user_local(uint32_t state) {
// }
// qk_tap_dance_action_t tap_dance_actions[] = {
- // [TD_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED( flash_each_tap, flash_dance_finished, flash_dance_reset ),
- // [TD_LAYR] = ACTION_TAP_DANCE_FN_ADVANCED( NULL, layers_dance_finished, NULL ),
+// [TD_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED( flash_each_tap, flash_dance_finished, flash_dance_reset ),
+// [TD_LAYR] = ACTION_TAP_DANCE_FN_ADVANCED( NULL, layers_dance_finished, NULL ),
// };
diff --git a/keyboards/ergodox_ez/keymaps/toshi0383/keymap.c b/keyboards/ergodox_ez/keymaps/toshi0383/keymap.c
new file mode 100644
index 00000000000..77242596d2c
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/toshi0383/keymap.c
@@ -0,0 +1,98 @@
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+ _BASE,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+#define ADJUST MO(_ADJUST)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT_ergodox(
+ // left hand
+ _______, _______, _______, _______, _______, _______, _______,
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, LGUI(KC_LCTL),
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G,
+ KC_SPC, KC_Z, KC_X, KC_C, KC_V, KC_B, LGUI(KC_LALT),
+ _______, _______, _______, _______, LOWER,
+ KC_LGUI, _______,
+ _______,
+ KC_ENT, RGUI(KC_RCTL), _______,
+ // right hand
+ _______, _______, _______, _______, _______, _______, _______,
+ RGUI(KC_RCTL), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_H, KC_J, KC_K, KC_L, KC_RSFT, KC_RGUI,
+ RGUI(KC_RALT), KC_N, KC_M, KC_RCTL, KC_DOT, KC_RALT, RGUI(KC_RSFT),
+ RAISE, _______, _______, _______, _______,
+ _______, KC_RGUI,
+ _______,
+ _______, KC_BSPC, KC_ENT
+ ),
+
+ [_LOWER] = LAYOUT_ergodox(
+ // left hand
+ _______, _______, _______, _______, _______, _______, _______,
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, _______,
+ _______, KC_LT, KC_GT, KC_LPRN, KC_RPRN, KC_GRV,
+ KC_LALT, _______, _______, _______, KC_EQL, KC_QUES, _______,
+ _______, _______, _______, _______, _______,
+ _______, _______,
+ _______,
+ KC_NO, KC_NO, _______,
+ // right hand
+ _______, _______, _______, _______, _______, _______, _______,
+ KC_NO, KC_CIRC, KC_AMPR, KC_ASTR, _______, _______, _______,
+ KC_MINS, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_PIPE,
+ KC_NO, KC_UNDS, KC_PLUS, KC_COMM, _______, KC_SLSH, _______,
+ KC_RGUI, _______, _______, _______, _______,
+ _______, KC_NO,
+ _______,
+ _______, KC_NO, KC_NO
+ ),
+
+ [_RAISE] = LAYOUT_ergodox(
+ // left hand
+ _______, _______, _______, _______, _______, _______, _______,
+ KC_NO, KC_1, KC_2, KC_3, KC_4, KC_5, _______,
+ KC_NO, KC_COLN, KC_SCLN, KC_DQT, KC_QUOT, KC_BSLS,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, KC_LGUI,
+ _______, _______,
+ _______,
+ KC_NO, KC_NO, _______,
+ // right hand
+ _______, _______, _______, _______, _______, _______, KC_NO,
+ KC_NO, KC_6, KC_7, KC_8, KC_9, KC_0, KC_NO,
+ KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, KC_NO,
+ _______, ADJUST, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+ _______, KC_NO,
+ _______,
+ _______, KC_NO, KC_NO
+ ),
+
+ [_ADJUST] = LAYOUT_ergodox(
+ // left hand
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ KC_MUTE, KC_VOLD, KC_VOLU, KC_BRID, KC_BRIU, RESET, _______,
+ _______, _______, _______, _______, KC_LGUI,
+ _______, _______,
+ _______,
+ KC_NO, KC_NO, _______,
+ // right hand
+ _______, _______, _______, _______, _______, _______, _______,
+ KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______,
+ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______,
+ _______, _______, _______, _______, _______, KC_LANG1, KC_LANG2,
+ _______, _______, _______, _______, _______,
+ _______, KC_NO,
+ _______,
+ _______, KC_NO, KC_NO
+ )
+};
diff --git a/keyboards/ergodox_ez/led_i2c.c b/keyboards/ergodox_ez/led_i2c.c
index 4a7a02f468a..f5553a8b619 100644
--- a/keyboards/ergodox_ez/led_i2c.c
+++ b/keyboards/ergodox_ez/led_i2c.c
@@ -22,44 +22,11 @@
*/
#ifdef RGBLIGHT_ENABLE
-# include "ws2812.c"
# include "ergodox_ez.h"
extern rgblight_config_t rgblight_config;
-/*
- * Forward declare internal functions
- *
- * The functions take a byte-array and send to the data output as WS2812 bitstream.
- * The length is the number of bytes to send - three per LED.
- */
-
-void ws2812_sendarray(uint8_t *array, uint16_t length);
-void ws2812_sendarray_mask(uint8_t *array, uint16_t length, uint8_t pinmask);
-
-
-
-
-void rgblight_set(void) {
- if (!rgblight_config.enable) {
- for (uint8_t i = 0; i < RGBLED_NUM; i++) {
- led[i].r = 0;
- led[i].g = 0;
- led[i].b = 0;
-#ifdef RGBW
- led[i].w = 0;
-#endif
- }
- }
-#ifdef RGBW
- else {
- for (uint8_t i = 0; i < RGBLED_NUM; i++) {
- convert_rgb_to_rgbw(&led[i]);
- }
- }
-#endif
-
- uint8_t led_num = RGBLED_NUM;
+void rgblight_call_driver(LED_TYPE *led, uint8_t led_num) {
i2c_init();
i2c_start(0x84, ERGODOX_EZ_I2C_TIMEOUT);
int i = 0;
@@ -67,8 +34,8 @@ void rgblight_set(void) {
// prevent right-half code from trying to bitbang all 30
// so with 30 LEDs, we count from 29 to 15 here, and the
// other half does 0 to 14.
- led_num = RGBLED_NUM / 2;
- for (i = led_num + led_num - 1; i >= led_num; --i)
+ uint8_t half_led_num = RGBLED_NUM / 2;
+ for (i = half_led_num + half_led_num - 1; i >= half_led_num; --i)
# elif defined(ERGODOX_LED_15_MIRROR)
for (i = 0; i < led_num; ++i)
# else // ERGDOX_LED_15 non-mirrored
@@ -85,7 +52,7 @@ void rgblight_set(void) {
}
i2c_stop();
- ws2812_setleds(led, RGBLED_NUM);
+ ws2812_setleds(led, led_num);
}
diff --git a/keyboards/ergodox_ez/rules.mk b/keyboards/ergodox_ez/rules.mk
index 617ffea8579..579e4f59de5 100644
--- a/keyboards/ergodox_ez/rules.mk
+++ b/keyboards/ergodox_ez/rules.mk
@@ -31,7 +31,6 @@ SWAP_HANDS_ENABLE= yes # Allow swapping hands of keyboard
SLEEP_LED_ENABLE = no
API_SYSEX_ENABLE = no
RGBLIGHT_ENABLE = yes
-RGBLIGHT_CUSTOM_DRIVER = yes
RGB_MATRIX_ENABLE = no # enable later
DEBOUNCE_TYPE = eager_pr
diff --git a/keyboards/ergodox_stm32/rules.mk b/keyboards/ergodox_stm32/rules.mk
index ab7b853f5d4..cd1f2d97c4d 100644
--- a/keyboards/ergodox_stm32/rules.mk
+++ b/keyboards/ergodox_stm32/rules.mk
@@ -1,24 +1,11 @@
-SRC += matrix.c
-QUANTUM_LIB_SRC += i2c_master.c
-
-CFLAGS += "-Wno-error=deprecated"
-
-MCU_FAMILY = STM32
-MCU_SERIES = STM32F1xx
+# MCU name
+MCU = STM32F103
MCU_LDSCRIPT = stm32f103_bootloader
-
-MCU_STARTUP = stm32f1xx
-
BOARD = ERGODOX_STM32_BOARD
-MCU = cortex-m3
-
-ARMV = 7
-
-OPT_DEFS =
-
-EXTRAFLAGS=-O0 -g
+CFLAGS += "-Wno-error=deprecated"
+EXTRAFLAGS = -O0 -g
BOOTMAGIC_ENABLE = no
MOUSEKEY_ENABLE = no # Mouse keys
@@ -31,6 +18,8 @@ CUSTOM_MATRIX = yes # Custom matrix file
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
UNICODE_ENABLE = yes # Unicode
-
# Enter lower-power sleep mode when on the ChibiOS idle thread
OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
+
+SRC += matrix.c
+QUANTUM_LIB_SRC += i2c_master.c
diff --git a/keyboards/eve/meteor/rules.mk b/keyboards/eve/meteor/rules.mk
index e57c21c856b..a0ffab29015 100644
--- a/keyboards/eve/meteor/rules.mk
+++ b/keyboards/eve/meteor/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = no
MOUSEKEY_ENABLE = yes
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = no
diff --git a/keyboards/eve/meteor/usbconfig.h b/keyboards/eve/meteor/usbconfig.h
deleted file mode 100644
index 9b045607f1d..00000000000
--- a/keyboards/eve/meteor/usbconfig.h
+++ /dev/null
@@ -1,373 +0,0 @@
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/exclusive/e6v2/le_bmc/config.h b/keyboards/exclusive/e6v2/le_bmc/config.h
index ca680f5029e..198e73265d9 100644
--- a/keyboards/exclusive/e6v2/le_bmc/config.h
+++ b/keyboards/exclusive/e6v2/le_bmc/config.h
@@ -21,8 +21,8 @@ along with this program. If not, see .
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x0000
#define DEVICE_VER 0x0001
-#define MANUFACTURER exclusive
-#define PRODUCT e6v2 le bmc
+#define MANUFACTURER Exclusive / E-Team
+#define PRODUCT E6-V2 LE BMC
#define DESCRIPTION A custom 60% keyboard
/* key matrix size */
diff --git a/keyboards/exclusive/e6v2/le_bmc/info.json b/keyboards/exclusive/e6v2/le_bmc/info.json
index aa6d171ba87..413db8abcaa 100644
--- a/keyboards/exclusive/e6v2/le_bmc/info.json
+++ b/keyboards/exclusive/e6v2/le_bmc/info.json
@@ -6,7 +6,7 @@
"height": 5,
"layouts": {
"LAYOUT_all": {
- "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.26}, {"x":10.0, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":13.75, "y":4, "w":1.25}]
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10.0, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":13.75, "y":4, "w":1.25}]
},
"LAYOUT_60_ansi": {
@@ -21,4 +21,4 @@
"layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.5}, {"x":1.5, "y":4}, {"x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"x":11, "y":4, "w":1.5}, {"x":12.5, "y":4}, {"x":13.5, "y":4, "w":1.5}]
}
}
-}
\ No newline at end of file
+}
diff --git a/keyboards/exclusive/e6v2/le_bmc/usbconfig.h b/keyboards/exclusive/e6v2/le_bmc/usbconfig.h
deleted file mode 100644
index 7a1471a06f9..00000000000
--- a/keyboards/exclusive/e6v2/le_bmc/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'E', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e'
-#define USB_CFG_VENDOR_NAME_LEN 9
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'E', '6', 'V', '2'
-#define USB_CFG_DEVICE_NAME_LEN 4
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/exclusive/e6v2/oe_bmc/config.h b/keyboards/exclusive/e6v2/oe_bmc/config.h
index a6b56ba0033..c26006b6a96 100644
--- a/keyboards/exclusive/e6v2/oe_bmc/config.h
+++ b/keyboards/exclusive/e6v2/oe_bmc/config.h
@@ -21,8 +21,8 @@ along with this program. If not, see .
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x0000
#define DEVICE_VER 0x0001
-#define MANUFACTURER exclusive
-#define PRODUCT e6v2 oe bmc
+#define MANUFACTURER Exclusive / E-Team
+#define PRODUCT E6-V2 OE BMC
#define DESCRIPTION A custom 60% keyboard
/* key matrix size */
diff --git a/keyboards/exclusive/e6v2/oe_bmc/info.json b/keyboards/exclusive/e6v2/oe_bmc/info.json
index aa6d171ba87..413db8abcaa 100644
--- a/keyboards/exclusive/e6v2/oe_bmc/info.json
+++ b/keyboards/exclusive/e6v2/oe_bmc/info.json
@@ -6,7 +6,7 @@
"height": 5,
"layouts": {
"LAYOUT_all": {
- "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.26}, {"x":10.0, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":13.75, "y":4, "w":1.25}]
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10.0, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":13.75, "y":4, "w":1.25}]
},
"LAYOUT_60_ansi": {
@@ -21,4 +21,4 @@
"layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.5}, {"x":1.5, "y":4}, {"x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"x":11, "y":4, "w":1.5}, {"x":12.5, "y":4}, {"x":13.5, "y":4, "w":1.5}]
}
}
-}
\ No newline at end of file
+}
diff --git a/keyboards/exclusive/e6v2/oe_bmc/usbconfig.h b/keyboards/exclusive/e6v2/oe_bmc/usbconfig.h
deleted file mode 100644
index 7a1471a06f9..00000000000
--- a/keyboards/exclusive/e6v2/oe_bmc/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'E', 'x', 'c', 'l', 'u', 's', 'i', 'v', 'e'
-#define USB_CFG_VENDOR_NAME_LEN 9
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'E', '6', 'V', '2'
-#define USB_CFG_DEVICE_NAME_LEN 4
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/exclusive/e7v1se/config.h b/keyboards/exclusive/e7v1se/config.h
index f11a7009204..8784828ed82 100644
--- a/keyboards/exclusive/e7v1se/config.h
+++ b/keyboards/exclusive/e7v1se/config.h
@@ -192,10 +192,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/exent/rules.mk b/keyboards/exent/rules.mk
index 0ea425ac7e9..4f412573267 100644
--- a/keyboards/exent/rules.mk
+++ b/keyboards/exent/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = no
MOUSEKEY_ENABLE = no
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
diff --git a/keyboards/exent/usbconfig.h b/keyboards/exent/usbconfig.h
deleted file mode 100644
index 83ad06544dc..00000000000
--- a/keyboards/exent/usbconfig.h
+++ /dev/null
@@ -1,373 +0,0 @@
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU / 1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/facew/config.h b/keyboards/facew/config.h
index be442548d04..ab9130b8049 100644
--- a/keyboards/facew/config.h
+++ b/keyboards/facew/config.h
@@ -22,8 +22,8 @@ along with this program. If not, see .
#define VENDOR_ID 0x20A0
#define PRODUCT_ID 0x422D
#define DEVICE_VER 0x0200
-#define MANUFACTURER NotActuallyWinkeyless
-#define PRODUCT facew
+#define MANUFACTURER SPRiT
+#define PRODUCT FaceW
#define RGBLED_NUM 16
diff --git a/keyboards/facew/usbconfig.h b/keyboards/facew/usbconfig.h
deleted file mode 100644
index 47755fa8c1d..00000000000
--- a/keyboards/facew/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'S', 'p', 'r', 'i', 't'
-#define USB_CFG_VENDOR_NAME_LEN 5
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'F', 'a', 'c', 'e', 'W'
-#define USB_CFG_DEVICE_NAME_LEN 5
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/flx/lodestone/config.h b/keyboards/flx/lodestone/config.h
new file mode 100644
index 00000000000..b2a1022a45f
--- /dev/null
+++ b/keyboards/flx/lodestone/config.h
@@ -0,0 +1,70 @@
+/* Copyright 2020 Shaun Mitchell (Flex)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x4658 //FX
+#define PRODUCT_ID 0x4C53 //LS
+#define DEVICE_VER 0x0001
+#define MANUFACTURER FLX
+#define PRODUCT Lodestone
+#define DESCRIPTION FLX Lodestone
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 16
+
+/*
+ * 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 { B3, B7, F0, F1, F4 }
+#define MATRIX_COL_PINS { B2, F5, F6, D0, D1, D2, D3, D5, D4, D6, D7, B4, B5, B6, C6, C7 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+// #define BACKLIGHT_PIN B7
+// #define BACKLIGHT_BREATHING
+// #define BACKLIGHT_LEVELS 3
+
+/* 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
+
+/* number of backlight levels */
+
+/* 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 userful for the Windows task manager shortcut (ctrl+shift+esc).
+ */
+// #define GRAVE_ESC_CTRL_OVERRIDE
diff --git a/keyboards/flx/lodestone/info.json b/keyboards/flx/lodestone/info.json
new file mode 100644
index 00000000000..4d32bf37ca8
--- /dev/null
+++ b/keyboards/flx/lodestone/info.json
@@ -0,0 +1,371 @@
+{
+ "keyboard_name": "lodestone",
+ "url": "https://prototypist.net/",
+ "maintainer": "Flexerm",
+ "width": 16,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [
+ {"label":"K00 (B3,B2)", "x":0, "y":0},
+ {"label":"K01 (B3,F5)", "x":1, "y":0},
+ {"label":"K02 (B3,F6)", "x":2, "y":0},
+ {"label":"K03 (B3,D0)", "x":3, "y":0},
+ {"label":"K04 (B3,D1)", "x":4, "y":0},
+ {"label":"K05 (B3,D2)", "x":5, "y":0},
+ {"label":"K06 (B3,D3)", "x":6, "y":0},
+ {"label":"K07 (B3,D5)", "x":7, "y":0},
+ {"label":"K08 (B3,D4)", "x":8, "y":0},
+ {"label":"K09 (B3,D6)", "x":9, "y":0},
+ {"label":"K0A (B3,D7)", "x":10, "y":0},
+ {"label":"K0B (B3,B4)", "x":11, "y":0},
+ {"label":"K0C (B3,B5)", "x":12, "y":0},
+ {"label":"K0D (B3,B6)", "x":13, "y":0},
+ {"label":"K0E (B3,C6)", "x":14, "y":0},
+ {"label":"K0F (B3,C7)", "x":15, "y":0},
+ {"label":"K10 (B7,B2)", "x":0, "y":1, "w":1.5},
+ {"label":"K11 (B7,F5)", "x":1.5, "y":1},
+ {"label":"K12 (B7,F6)", "x":2.5, "y":1},
+ {"label":"K13 (B7,D0)", "x":3.5, "y":1},
+ {"label":"K14 (B7,D1)", "x":4.5, "y":1},
+ {"label":"K15 (B7,D2)", "x":5.5, "y":1},
+ {"label":"K16 (B7,D3)", "x":6.5, "y":1},
+ {"label":"K17 (B7,D5)", "x":7.5, "y":1},
+ {"label":"K18 (B7,D4)", "x":8.5, "y":1},
+ {"label":"K19 (B7,D6)", "x":9.5, "y":1},
+ {"label":"K1A (B7,D7)", "x":10.5, "y":1},
+ {"label":"K1B (B7,B4)", "x":11.5, "y":1},
+ {"label":"K1C (B7,B5)", "x":12.5, "y":1},
+ {"label":"K1D (B7,B6)", "x":13.5, "y":1, "w":1.5},
+ {"label":"K1F (B7,C7)", "x":15, "y":1},
+ {"label":"K20 (F0,B2)", "x":0, "y":2, "w":1.75},
+ {"label":"K21 (F0,F5)", "x":1.75, "y":2},
+ {"label":"K22 (F0,F6)", "x":2.75, "y":2},
+ {"label":"K23 (F0,D0)", "x":3.75, "y":2},
+ {"label":"K24 (F0,D1)", "x":4.75, "y":2},
+ {"label":"K25 (F0,D2)", "x":5.75, "y":2},
+ {"label":"K26 (F0,D3)", "x":6.75, "y":2},
+ {"label":"K27 (F0,D5)", "x":7.75, "y":2},
+ {"label":"K28 (F0,D4)", "x":8.75, "y":2},
+ {"label":"K29 (F0,D6)", "x":9.75, "y":2},
+ {"label":"K2A (F0,D7)", "x":10.75, "y":2},
+ {"label":"K2B (F0,B4)", "x":11.75, "y":2},
+ {"label":"K2C (F0,B5)", "x":12.75, "y":2},
+ {"label":"K2D (F0,B6)", "x":13.75, "y":2, "w":1.25},
+ {"label":"K2F (F0,C7)", "x":15, "y":2},
+ {"label":"K30 (F1,B2)", "x":0, "y":3, "w":1.25},
+ {"label":"K31 (F1,F5)", "x":1.25, "y":3},
+ {"label":"K32 (F1,F6)", "x":2.25, "y":3},
+ {"label":"K33 (F1,D0)", "x":3.25, "y":3},
+ {"label":"K34 (F1,D1)", "x":4.25, "y":3},
+ {"label":"K35 (F1,D2)", "x":5.25, "y":3},
+ {"label":"K36 (F1,D3)", "x":6.25, "y":3},
+ {"label":"K37 (F1,D5)", "x":7.25, "y":3},
+ {"label":"K38 (F1,D4)", "x":8.25, "y":3},
+ {"label":"K39 (F1,D6)", "x":9.25, "y":3},
+ {"label":"K3A (F1,D7)", "x":10.25, "y":3},
+ {"label":"K3B (F1,B4)", "x":11.25, "y":3},
+ {"label":"K3C (F1,B5)", "x":12.25, "y":3, "w":1.75},
+ {"label":"K3E (F1,C6)", "x":14, "y":3},
+ {"label":"K3F (F1,C7)", "x":15, "y":3},
+ {"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.25},
+ {"label":"K41 (F4,F5)", "x":1.25, "y":4, "w":1.25},
+ {"label":"K42 (F4,F6)", "x":2.5, "y":4, "w":1.25},
+ {"label":"K46 (F4,D3)", "x":3.75, "y":4, "w":6.25},
+ {"label":"K4A (F4,D7)", "x":10, "y":4, "w":1.25},
+ {"label":"K4B (F4,B4)", "x":11.25, "y":4, "w":1.25},
+ {"label":"K4D (F4,B6)", "x":13, "y":4},
+ {"label":"K4E (F4,C6)", "x":14, "y":4},
+ {"label":"K4F (F4,C7)", "x":15, "y":4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker": {
+ "layout": [
+ {"label":"K00 (B3,B2)", "x":0, "y":0},
+ {"label":"K01 (B3,F5)", "x":1, "y":0},
+ {"label":"K02 (B3,F6)", "x":2, "y":0},
+ {"label":"K03 (B3,D0)", "x":3, "y":0},
+ {"label":"K04 (B3,D1)", "x":4, "y":0},
+ {"label":"K05 (B3,D2)", "x":5, "y":0},
+ {"label":"K06 (B3,D3)", "x":6, "y":0},
+ {"label":"K07 (B3,D5)", "x":7, "y":0},
+ {"label":"K08 (B3,D4)", "x":8, "y":0},
+ {"label":"K09 (B3,D6)", "x":9, "y":0},
+ {"label":"K0A (B3,D7)", "x":10, "y":0},
+ {"label":"K0B (B3,B4)", "x":11, "y":0},
+ {"label":"K0C (B3,B5)", "x":12, "y":0},
+ {"label":"K0D (B3,B6)", "x":13, "y":0, "w":2},
+ {"label":"K0F (B3,C7)", "x":15, "y":0},
+ {"label":"K10 (B7,B2)", "x":0, "y":1, "w":1.5},
+ {"label":"K11 (B7,F5)", "x":1.5, "y":1},
+ {"label":"K12 (B7,F6)", "x":2.5, "y":1},
+ {"label":"K13 (B7,D0)", "x":3.5, "y":1},
+ {"label":"K14 (B7,D1)", "x":4.5, "y":1},
+ {"label":"K15 (B7,D2)", "x":5.5, "y":1},
+ {"label":"K16 (B7,D3)", "x":6.5, "y":1},
+ {"label":"K17 (B7,D5)", "x":7.5, "y":1},
+ {"label":"K18 (B7,D4)", "x":8.5, "y":1},
+ {"label":"K19 (B7,D6)", "x":9.5, "y":1},
+ {"label":"K1A (B7,D7)", "x":10.5, "y":1},
+ {"label":"K1B (B7,B4)", "x":11.5, "y":1},
+ {"label":"K1C (B7,B5)", "x":12.5, "y":1},
+ {"label":"K1D (B7,B6)", "x":13.5, "y":1, "w":1.5},
+ {"label":"K1F (B7,C7)", "x":15, "y":1},
+ {"label":"K20 (F0,B2)", "x":0, "y":2, "w":1.75},
+ {"label":"K21 (F0,F5)", "x":1.75, "y":2},
+ {"label":"K22 (F0,F6)", "x":2.75, "y":2},
+ {"label":"K23 (F0,D0)", "x":3.75, "y":2},
+ {"label":"K24 (F0,D1)", "x":4.75, "y":2},
+ {"label":"K25 (F0,D2)", "x":5.75, "y":2},
+ {"label":"K26 (F0,D3)", "x":6.75, "y":2},
+ {"label":"K27 (F0,D5)", "x":7.75, "y":2},
+ {"label":"K28 (F0,D4)", "x":8.75, "y":2},
+ {"label":"K29 (F0,D6)", "x":9.75, "y":2},
+ {"label":"K2A (F0,D7)", "x":10.75, "y":2},
+ {"label":"K2B (F0,B4)", "x":11.75, "y":2},
+ {"label":"K2D (F0,B6)", "x":12.75, "y":2, "w":2.25},
+ {"label":"K2F (F0,C7)", "x":15, "y":2},
+ {"label":"K30 (F1,B2)", "x":0, "y":3, "w":2.25},
+ {"label":"K32 (F1,F6)", "x":2.25, "y":3},
+ {"label":"K33 (F1,D0)", "x":3.25, "y":3},
+ {"label":"K34 (F1,D1)", "x":4.25, "y":3},
+ {"label":"K35 (F1,D2)", "x":5.25, "y":3},
+ {"label":"K36 (F1,D3)", "x":6.25, "y":3},
+ {"label":"K37 (F1,D5)", "x":7.25, "y":3},
+ {"label":"K38 (F1,D4)", "x":8.25, "y":3},
+ {"label":"K39 (F1,D6)", "x":9.25, "y":3},
+ {"label":"K3A (F1,D7)", "x":10.25, "y":3},
+ {"label":"K3B (F1,B4)", "x":11.25, "y":3},
+ {"label":"K3C (F1,B5)", "x":12.25, "y":3, "w":1.75},
+ {"label":"K3E (F1,C6)", "x":14, "y":3},
+ {"label":"K3F (F1,C7)", "x":15, "y":3},
+ {"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.25},
+ {"label":"K41 (F4,F5)", "x":1.25, "y":4, "w":1.25},
+ {"label":"K42 (F4,F6)", "x":2.5, "y":4, "w":1.25},
+ {"label":"K46 (F4,D3)", "x":3.75, "y":4, "w":6.25},
+ {"label":"K4A (F4,D7)", "x":10, "y":4, "w":1.25},
+ {"label":"K4B (F4,B4)", "x":11.25, "y":4, "w":1.25},
+ {"label":"K4D (F4,B6)", "x":13, "y":4},
+ {"label":"K4E (F4,C6)", "x":14, "y":4},
+ {"label":"K4F (F4,C7)", "x":15, "y":4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker_split_bs": {
+ "layout": [
+ {"label":"K00 (B3,B2)", "x":0, "y":0},
+ {"label":"K01 (B3,F5)", "x":1, "y":0},
+ {"label":"K02 (B3,F6)", "x":2, "y":0},
+ {"label":"K03 (B3,D0)", "x":3, "y":0},
+ {"label":"K04 (B3,D1)", "x":4, "y":0},
+ {"label":"K05 (B3,D2)", "x":5, "y":0},
+ {"label":"K06 (B3,D3)", "x":6, "y":0},
+ {"label":"K07 (B3,D5)", "x":7, "y":0},
+ {"label":"K08 (B3,D4)", "x":8, "y":0},
+ {"label":"K09 (B3,D6)", "x":9, "y":0},
+ {"label":"K0A (B3,D7)", "x":10, "y":0},
+ {"label":"K0B (B3,B4)", "x":11, "y":0},
+ {"label":"K0C (B3,B5)", "x":12, "y":0},
+ {"label":"K0D (B3,B6)", "x":13, "y":0},
+ {"label":"K0E (B3,C6)", "x":14, "y":0},
+ {"label":"K0F (B3,C7)", "x":15, "y":0},
+ {"label":"K10 (B7,B2)", "x":0, "y":1, "w":1.5},
+ {"label":"K11 (B7,F5)", "x":1.5, "y":1},
+ {"label":"K12 (B7,F6)", "x":2.5, "y":1},
+ {"label":"K13 (B7,D0)", "x":3.5, "y":1},
+ {"label":"K14 (B7,D1)", "x":4.5, "y":1},
+ {"label":"K15 (B7,D2)", "x":5.5, "y":1},
+ {"label":"K16 (B7,D3)", "x":6.5, "y":1},
+ {"label":"K17 (B7,D5)", "x":7.5, "y":1},
+ {"label":"K18 (B7,D4)", "x":8.5, "y":1},
+ {"label":"K19 (B7,D6)", "x":9.5, "y":1},
+ {"label":"K1A (B7,D7)", "x":10.5, "y":1},
+ {"label":"K1B (B7,B4)", "x":11.5, "y":1},
+ {"label":"K1C (B7,B5)", "x":12.5, "y":1},
+ {"label":"K1D (B7,B6)", "x":13.5, "y":1, "w":1.5},
+ {"label":"K1F (B7,C7)", "x":15, "y":1},
+ {"label":"K20 (F0,B2)", "x":0, "y":2, "w":1.75},
+ {"label":"K21 (F0,F5)", "x":1.75, "y":2},
+ {"label":"K22 (F0,F6)", "x":2.75, "y":2},
+ {"label":"K23 (F0,D0)", "x":3.75, "y":2},
+ {"label":"K24 (F0,D1)", "x":4.75, "y":2},
+ {"label":"K25 (F0,D2)", "x":5.75, "y":2},
+ {"label":"K26 (F0,D3)", "x":6.75, "y":2},
+ {"label":"K27 (F0,D5)", "x":7.75, "y":2},
+ {"label":"K28 (F0,D4)", "x":8.75, "y":2},
+ {"label":"K29 (F0,D6)", "x":9.75, "y":2},
+ {"label":"K2A (F0,D7)", "x":10.75, "y":2},
+ {"label":"K2B (F0,B4)", "x":11.75, "y":2},
+ {"label":"K2D (F0,B6)", "x":12.75, "y":2, "w":2.25},
+ {"label":"K2F (F0,C7)", "x":15, "y":2},
+ {"label":"K30 (F1,B2)", "x":0, "y":3, "w":2.25},
+ {"label":"K32 (F1,F6)", "x":2.25, "y":3},
+ {"label":"K33 (F1,D0)", "x":3.25, "y":3},
+ {"label":"K34 (F1,D1)", "x":4.25, "y":3},
+ {"label":"K35 (F1,D2)", "x":5.25, "y":3},
+ {"label":"K36 (F1,D3)", "x":6.25, "y":3},
+ {"label":"K37 (F1,D5)", "x":7.25, "y":3},
+ {"label":"K38 (F1,D4)", "x":8.25, "y":3},
+ {"label":"K39 (F1,D6)", "x":9.25, "y":3},
+ {"label":"K3A (F1,D7)", "x":10.25, "y":3},
+ {"label":"K3B (F1,B4)", "x":11.25, "y":3},
+ {"label":"K3C (F1,B5)", "x":12.25, "y":3, "w":1.75},
+ {"label":"K3E (F1,C6)", "x":14, "y":3},
+ {"label":"K3F (F1,C7)", "x":15, "y":3},
+ {"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.25},
+ {"label":"K41 (F4,F5)", "x":1.25, "y":4, "w":1.25},
+ {"label":"K42 (F4,F6)", "x":2.5, "y":4, "w":1.25},
+ {"label":"K46 (F4,D3)", "x":3.75, "y":4, "w":6.25},
+ {"label":"K4A (F4,D7)", "x":10, "y":4, "w":1.25},
+ {"label":"K4B (F4,B4)", "x":11.25, "y":4, "w":1.25},
+ {"label":"K4D (F4,B6)", "x":13, "y":4},
+ {"label":"K4E (F4,C6)", "x":14, "y":4},
+ {"label":"K4F (F4,C7)", "x":15, "y":4}
+ ]
+ },
+ "LAYOUT_65_iso_blocker": {
+ "layout": [
+ {"label":"K00 (B3,B2)", "x":0, "y":0},
+ {"label":"K01 (B3,F5)", "x":1, "y":0},
+ {"label":"K02 (B3,F6)", "x":2, "y":0},
+ {"label":"K03 (B3,D0)", "x":3, "y":0},
+ {"label":"K04 (B3,D1)", "x":4, "y":0},
+ {"label":"K05 (B3,D2)", "x":5, "y":0},
+ {"label":"K06 (B3,D3)", "x":6, "y":0},
+ {"label":"K07 (B3,D5)", "x":7, "y":0},
+ {"label":"K08 (B3,D4)", "x":8, "y":0},
+ {"label":"K09 (B3,D6)", "x":9, "y":0},
+ {"label":"K0A (B3,D7)", "x":10, "y":0},
+ {"label":"K0B (B3,B4)", "x":11, "y":0},
+ {"label":"K0C (B3,B5)", "x":12, "y":0},
+ {"label":"K0D (B3,B6)", "x":13, "y":0, "w":2},
+ {"label":"K0F (B3,C7)", "x":15, "y":0},
+ {"label":"K10 (B7,B2)", "x":0, "y":1, "w":1.5},
+ {"label":"K11 (B7,F5)", "x":1.5, "y":1},
+ {"label":"K12 (B7,F6)", "x":2.5, "y":1},
+ {"label":"K13 (B7,D0)", "x":3.5, "y":1},
+ {"label":"K14 (B7,D1)", "x":4.5, "y":1},
+ {"label":"K15 (B7,D2)", "x":5.5, "y":1},
+ {"label":"K16 (B7,D3)", "x":6.5, "y":1},
+ {"label":"K17 (B7,D5)", "x":7.5, "y":1},
+ {"label":"K18 (B7,D4)", "x":8.5, "y":1},
+ {"label":"K19 (B7,D6)", "x":9.5, "y":1},
+ {"label":"K1A (B7,D7)", "x":10.5, "y":1},
+ {"label":"K1B (B7,B4)", "x":11.5, "y":1},
+ {"label":"K1C (B7,B5)", "x":12.5, "y":1},
+ {"label":"K1F (B7,C7)", "x":15, "y":1},
+ {"label":"K20 (F0,B2)", "x":0, "y":2, "w":1.75},
+ {"label":"K21 (F0,F5)", "x":1.75, "y":2},
+ {"label":"K22 (F0,F6)", "x":2.75, "y":2},
+ {"label":"K23 (F0,D0)", "x":3.75, "y":2},
+ {"label":"K24 (F0,D1)", "x":4.75, "y":2},
+ {"label":"K25 (F0,D2)", "x":5.75, "y":2},
+ {"label":"K26 (F0,D3)", "x":6.75, "y":2},
+ {"label":"K27 (F0,D5)", "x":7.75, "y":2},
+ {"label":"K28 (F0,D4)", "x":8.75, "y":2},
+ {"label":"K29 (F0,D6)", "x":9.75, "y":2},
+ {"label":"K2A (F0,D7)", "x":10.75, "y":2},
+ {"label":"K2B (F0,B4)", "x":11.75, "y":2},
+ {"label":"K2C (F0,B5)", "x":12.75, "y":2},
+ {"label":"K2D (F0,B6)", "x":13.75, "y":1, "w":1.25, "h":2},
+ {"label":"K2F (F0,C7)", "x":15, "y":2},
+ {"label":"K30 (F1,B2)", "x":0, "y":3, "w":1.25},
+ {"label":"K31 (F1,F5)", "x":1.25, "y":3},
+ {"label":"K32 (F1,F6)", "x":2.25, "y":3},
+ {"label":"K33 (F1,D0)", "x":3.25, "y":3},
+ {"label":"K34 (F1,D1)", "x":4.25, "y":3},
+ {"label":"K35 (F1,D2)", "x":5.25, "y":3},
+ {"label":"K36 (F1,D3)", "x":6.25, "y":3},
+ {"label":"K37 (F1,D5)", "x":7.25, "y":3},
+ {"label":"K38 (F1,D4)", "x":8.25, "y":3},
+ {"label":"K39 (F1,D6)", "x":9.25, "y":3},
+ {"label":"K3A (F1,D7)", "x":10.25, "y":3},
+ {"label":"K3B (F1,B4)", "x":11.25, "y":3},
+ {"label":"K3C (F1,B5)", "x":12.25, "y":3, "w":1.75},
+ {"label":"K3E (F1,C6)", "x":14, "y":3},
+ {"label":"K3F (F1,C7)", "x":15, "y":3},
+ {"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.25},
+ {"label":"K41 (F4,F5)", "x":1.25, "y":4, "w":1.25},
+ {"label":"K42 (F4,F6)", "x":2.5, "y":4, "w":1.25},
+ {"label":"K46 (F4,D3)", "x":3.75, "y":4, "w":6.25},
+ {"label":"K4A (F4,D7)", "x":10, "y":4, "w":1.25},
+ {"label":"K4B (F4,B4)", "x":11.25, "y":4, "w":1.25},
+ {"label":"K4D (F4,B6)", "x":13, "y":4},
+ {"label":"K4E (F4,C6)", "x":14, "y":4},
+ {"label":"K4F (F4,C7)", "x":15, "y":4}
+ ]
+ },
+ "LAYOUT_65_iso_blocker_split_bs": {
+ "layout": [
+ {"label":"K00 (B3,B2)", "x":0, "y":0},
+ {"label":"K01 (B3,F5)", "x":1, "y":0},
+ {"label":"K02 (B3,F6)", "x":2, "y":0},
+ {"label":"K03 (B3,D0)", "x":3, "y":0},
+ {"label":"K04 (B3,D1)", "x":4, "y":0},
+ {"label":"K05 (B3,D2)", "x":5, "y":0},
+ {"label":"K06 (B3,D3)", "x":6, "y":0},
+ {"label":"K07 (B3,D5)", "x":7, "y":0},
+ {"label":"K08 (B3,D4)", "x":8, "y":0},
+ {"label":"K09 (B3,D6)", "x":9, "y":0},
+ {"label":"K0A (B3,D7)", "x":10, "y":0},
+ {"label":"K0B (B3,B4)", "x":11, "y":0},
+ {"label":"K0C (B3,B5)", "x":12, "y":0},
+ {"label":"K0D (B3,B6)", "x":13, "y":0},
+ {"label":"K0E (B3,C6)", "x":14, "y":0},
+ {"label":"K0F (B3,C7)", "x":15, "y":0},
+ {"label":"K10 (B7,B2)", "x":0, "y":1, "w":1.5},
+ {"label":"K11 (B7,F5)", "x":1.5, "y":1},
+ {"label":"K12 (B7,F6)", "x":2.5, "y":1},
+ {"label":"K13 (B7,D0)", "x":3.5, "y":1},
+ {"label":"K14 (B7,D1)", "x":4.5, "y":1},
+ {"label":"K15 (B7,D2)", "x":5.5, "y":1},
+ {"label":"K16 (B7,D3)", "x":6.5, "y":1},
+ {"label":"K17 (B7,D5)", "x":7.5, "y":1},
+ {"label":"K18 (B7,D4)", "x":8.5, "y":1},
+ {"label":"K19 (B7,D6)", "x":9.5, "y":1},
+ {"label":"K1A (B7,D7)", "x":10.5, "y":1},
+ {"label":"K1B (B7,B4)", "x":11.5, "y":1},
+ {"label":"K1C (B7,B5)", "x":12.5, "y":1},
+ {"label":"K1F (B7,C7)", "x":15, "y":1},
+ {"label":"K20 (F0,B2)", "x":0, "y":2, "w":1.75},
+ {"label":"K21 (F0,F5)", "x":1.75, "y":2},
+ {"label":"K22 (F0,F6)", "x":2.75, "y":2},
+ {"label":"K23 (F0,D0)", "x":3.75, "y":2},
+ {"label":"K24 (F0,D1)", "x":4.75, "y":2},
+ {"label":"K25 (F0,D2)", "x":5.75, "y":2},
+ {"label":"K26 (F0,D3)", "x":6.75, "y":2},
+ {"label":"K27 (F0,D5)", "x":7.75, "y":2},
+ {"label":"K28 (F0,D4)", "x":8.75, "y":2},
+ {"label":"K29 (F0,D6)", "x":9.75, "y":2},
+ {"label":"K2A (F0,D7)", "x":10.75, "y":2},
+ {"label":"K2B (F0,B4)", "x":11.75, "y":2},
+ {"label":"K2C (F0,B5)", "x":12.75, "y":2},
+ {"label":"K2D (F0,B6)", "x":13.75, "y":1, "w":1.25, "h":2},
+ {"label":"K2F (F0,C7)", "x":15, "y":2},
+ {"label":"K30 (F1,B2)", "x":0, "y":3, "w":1.25},
+ {"label":"K31 (F1,F5)", "x":1.25, "y":3},
+ {"label":"K32 (F1,F6)", "x":2.25, "y":3},
+ {"label":"K33 (F1,D0)", "x":3.25, "y":3},
+ {"label":"K34 (F1,D1)", "x":4.25, "y":3},
+ {"label":"K35 (F1,D2)", "x":5.25, "y":3},
+ {"label":"K36 (F1,D3)", "x":6.25, "y":3},
+ {"label":"K37 (F1,D5)", "x":7.25, "y":3},
+ {"label":"K38 (F1,D4)", "x":8.25, "y":3},
+ {"label":"K39 (F1,D6)", "x":9.25, "y":3},
+ {"label":"K3A (F1,D7)", "x":10.25, "y":3},
+ {"label":"K3B (F1,B4)", "x":11.25, "y":3},
+ {"label":"K3C (F1,B5)", "x":12.25, "y":3, "w":1.75},
+ {"label":"K3E (F1,C6)", "x":14, "y":3},
+ {"label":"K3F (F1,C7)", "x":15, "y":3},
+ {"label":"K40 (F4,B2)", "x":0, "y":4, "w":1.25},
+ {"label":"K41 (F4,F5)", "x":1.25, "y":4, "w":1.25},
+ {"label":"K42 (F4,F6)", "x":2.5, "y":4, "w":1.25},
+ {"label":"K46 (F4,D3)", "x":3.75, "y":4, "w":6.25},
+ {"label":"K4A (F4,D7)", "x":10, "y":4, "w":1.25},
+ {"label":"K4B (F4,B4)", "x":11.25, "y":4, "w":1.25},
+ {"label":"K4D (F4,B6)", "x":13, "y":4},
+ {"label":"K4E (F4,C6)", "x":14, "y":4},
+ {"label":"K4F (F4,C7)", "x":15, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/flx/lodestone/keymaps/default/keymap.c b/keyboards/flx/lodestone/keymaps/default/keymap.c
new file mode 100644
index 00000000000..7ddaceaa7de
--- /dev/null
+++ b/keyboards/flx/lodestone/keymaps/default/keymap.c
@@ -0,0 +1,20 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ // Default layer
+ [0] = LAYOUT_all(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT),
+
+ // Fn1 Layer
+ [1] = LAYOUT_all(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL, KC_TRNS,
+ KC_CAPS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+};
diff --git a/keyboards/flx/lodestone/keymaps/default/readme.md b/keyboards/flx/lodestone/keymaps/default/readme.md
new file mode 100644
index 00000000000..55aeb57eaca
--- /dev/null
+++ b/keyboards/flx/lodestone/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for Lodestone
diff --git a/keyboards/flx/lodestone/keymaps/default_ansi/keymap.c b/keyboards/flx/lodestone/keymaps/default_ansi/keymap.c
new file mode 100644
index 00000000000..0526591e17a
--- /dev/null
+++ b/keyboards/flx/lodestone/keymaps/default_ansi/keymap.c
@@ -0,0 +1,20 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ // Default layer
+ [0] = LAYOUT_65_ansi_blocker_split_bs(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT),
+
+ // Fn1 Layer
+ [1] = LAYOUT_65_ansi_blocker_split_bs(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL, KC_TRNS,
+ KC_CAPS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+};
diff --git a/keyboards/flx/lodestone/keymaps/default_ansi/readme.md b/keyboards/flx/lodestone/keymaps/default_ansi/readme.md
new file mode 100644
index 00000000000..94cff2f42f5
--- /dev/null
+++ b/keyboards/flx/lodestone/keymaps/default_ansi/readme.md
@@ -0,0 +1 @@
+# The default ANSI keymap for Lodestone
diff --git a/keyboards/flx/lodestone/keymaps/default_iso/keymap.c b/keyboards/flx/lodestone/keymaps/default_iso/keymap.c
new file mode 100644
index 00000000000..d25a2a9ffb1
--- /dev/null
+++ b/keyboards/flx/lodestone/keymaps/default_iso/keymap.c
@@ -0,0 +1,20 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ // Default layer
+ [0] = LAYOUT_65_iso_blocker_split_bs(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT),
+
+ // Fn1 Layer
+ [1] = LAYOUT_65_iso_blocker_split_bs(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL, KC_TRNS,
+ KC_CAPS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+};
diff --git a/keyboards/flx/lodestone/keymaps/default_iso/readme.md b/keyboards/flx/lodestone/keymaps/default_iso/readme.md
new file mode 100644
index 00000000000..b1e45987796
--- /dev/null
+++ b/keyboards/flx/lodestone/keymaps/default_iso/readme.md
@@ -0,0 +1 @@
+# The default ISO keymap for Lodestone
diff --git a/keyboards/flx/lodestone/keymaps/via/keymap.c b/keyboards/flx/lodestone/keymaps/via/keymap.c
new file mode 100644
index 00000000000..669d7fc44e9
--- /dev/null
+++ b/keyboards/flx/lodestone/keymaps/via/keymap.c
@@ -0,0 +1,37 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ // Default layer
+ [0] = LAYOUT_all(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT),
+
+ // Fn1 Layer
+ [1] = LAYOUT_all(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL, KC_TRNS,
+ KC_CAPS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_END, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ // Fn2 Layer
+ [2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ // Fn3 Layer
+ [3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+};
+
diff --git a/keyboards/flx/lodestone/keymaps/via/readme.md b/keyboards/flx/lodestone/keymaps/via/readme.md
new file mode 100644
index 00000000000..9ee2c477bc1
--- /dev/null
+++ b/keyboards/flx/lodestone/keymaps/via/readme.md
@@ -0,0 +1 @@
+# The default VIA keymap for Lodestone
\ No newline at end of file
diff --git a/keyboards/flx/lodestone/keymaps/via/rules.mk b/keyboards/flx/lodestone/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/flx/lodestone/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/flx/lodestone/lodestone.c b/keyboards/flx/lodestone/lodestone.c
new file mode 100644
index 00000000000..bb0df70cc77
--- /dev/null
+++ b/keyboards/flx/lodestone/lodestone.c
@@ -0,0 +1,17 @@
+/* Copyright 2020 Shaun Mitchell (Flex)
+ *
+ * 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 .
+ */
+
+#include "lodestone.h"
diff --git a/keyboards/flx/lodestone/lodestone.h b/keyboards/flx/lodestone/lodestone.h
new file mode 100644
index 00000000000..2e05b67deb1
--- /dev/null
+++ b/keyboards/flx/lodestone/lodestone.h
@@ -0,0 +1,93 @@
+/* Copyright 2020 Shaun Mitchell (Flex)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+#define ___ KC_NO
+
+// standard 65% layout ANSI + ISO
+
+#define LAYOUT_all( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1F, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3E, K3F, \
+ K40, K41, K42, K46, K4A, K4B, K4D, K4E, K4F \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, ___, K1F }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, ___, K2F }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, ___, K3E, K3F }, \
+ { K40, K41, K42, ___, ___, ___, K46, ___, ___, ___, K4A, K4B, ___, K4D, K4E, K4F }, \
+}
+
+#define LAYOUT_65_ansi_blocker( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0F, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1F, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, K2F, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3E, K3F, \
+ K40, K41, K42, K46, K4A, K4B, K4D, K4E, K4F \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, ___, K0F }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, ___, K1F }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, ___, K2D, ___, K2F }, \
+ { K30, ___, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, ___, K3E, K3F }, \
+ { K40, K41, K42, ___, ___, ___, K46, ___, ___, ___, K4A, K4B, ___, K4D, K4E, K4F }, \
+}
+
+#define LAYOUT_65_ansi_blocker_split_bs( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1F, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, K2F, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3E, K3F, \
+ K40, K41, K42, K46, K4A, K4B, K4D, K4E, K4F \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, ___, K1F }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, ___, K2D, ___, K2F }, \
+ { K30, ___, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, ___, K3E, K3F }, \
+ { K40, K41, K42, ___, ___, ___, K46, ___, ___, ___, K4A, K4B, ___, K4D, K4E, K4F }, \
+}
+
+#define LAYOUT_65_iso_blocker( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0F, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1F, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3E, K3F, \
+ K40, K41, K42, K46, K4A, K4B, K4D, K4E, K4F \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, ___, K0F }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, ___, ___, K1F }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, ___, K2F }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, ___, K3E, K3F }, \
+ { K40, K41, K42, ___, ___, ___, K46, ___, ___, ___, K4A, K4B, ___, K4D, K4E, K4F }, \
+}
+
+#define LAYOUT_65_iso_blocker_split_bs( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1F, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3E, K3F, \
+ K40, K41, K42, K46, K4A, K4B, K4D, K4E, K4F \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, ___, ___, K1F }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, ___, K2F }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, ___, K3E, K3F }, \
+ { K40, K41, K42, ___, ___, ___, K46, ___, ___, ___, K4A, K4B, ___, K4D, K4E, K4F }, \
+}
diff --git a/keyboards/flx/lodestone/readme.md b/keyboards/flx/lodestone/readme.md
new file mode 100644
index 00000000000..e52d8d0c69f
--- /dev/null
+++ b/keyboards/flx/lodestone/readme.md
@@ -0,0 +1,13 @@
+# FLX & proto[Typist] Lodestone
+
+Lodestone is a keyboard PCB supporting 65% layout with one bottom row blocker, designed by Flex of FLX Keyboards. [More info at proto[Typist]](https://prototypist.net/)
+
+* Keyboard Maintainer: [Flexerm](https://github.com/Flexerm)
+* Hardware Supported: FLX - Lodestone (LS65) PCB
+* Hardware Availability: [proto[Typist]](https://prototypist.net/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make flx/lodestone:default
+
+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).
diff --git a/keyboards/flx/lodestone/rules.mk b/keyboards/flx/lodestone/rules.mk
new file mode 100644
index 00000000000..47af00e0a2e
--- /dev/null
+++ b/keyboards/flx/lodestone/rules.mk
@@ -0,0 +1,35 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+MIDI_ENABLE = no # MIDI support
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+LTO_ENABLE = yes
+
+LAYOUTS = 65_ansi_blocker 65_iso_blocker
diff --git a/keyboards/fortitude60/keymaps/default/config.h b/keyboards/fortitude60/keymaps/default/config.h
index b6c6273d927..ac47978baba 100644
--- a/keyboards/fortitude60/keymaps/default/config.h
+++ b/keyboards/fortitude60/keymaps/default/config.h
@@ -18,16 +18,3 @@ along with this program. If not, see .
#pragma once
#define USE_SERIAL
-
-/* Select hand configuration */
-
-// #define MASTER_LEFT
-// #define MASTER_RIGHT
-#define EE_HANDS
-
-/* #undef RGBLED_NUM */
-/* #define RGBLIGHT_ANIMATIONS */
-/* #define RGBLED_NUM 12 */
-/* #define RGBLIGHT_HUE_STEP 8 */
-/* #define RGBLIGHT_SAT_STEP 8 */
-/* #define RGBLIGHT_VAL_STEP 8 */
diff --git a/keyboards/fortitude60/rev1/config.h b/keyboards/fortitude60/rev1/config.h
index aa5a6f3b0f4..f87c141ce9d 100644
--- a/keyboards/fortitude60/rev1/config.h
+++ b/keyboards/fortitude60/rev1/config.h
@@ -44,6 +44,11 @@ along with this program. If not, see .
*/
#define SOFT_SERIAL_PIN D2
+#define EE_HANDS
+
+#define SPLIT_USB_DETECT
+#define SPLIT_USB_TIMEOUT 1000
+
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
@@ -65,7 +70,6 @@ along with this program. If not, see .
/* ws2812 RGB LED */
#ifdef RGBLIGHT_ENABLE
#define RGB_DI_PIN B5
-
#define RGBLED_NUM 18 // Number of LEDs */
#endif
/*
diff --git a/keyboards/foxlab/leaf60/hotswap/config.h b/keyboards/foxlab/leaf60/hotswap/config.h
index 752b403c509..c78ad5425c8 100644
--- a/keyboards/foxlab/leaf60/hotswap/config.h
+++ b/keyboards/foxlab/leaf60/hotswap/config.h
@@ -20,11 +20,11 @@ along with this program. If not, see .
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x0000
+#define VENDOR_ID 0x464C // "FL"
+#define PRODUCT_ID 0x0001
#define DEVICE_VER 0x0001
#define MANUFACTURER Fox Lab
-#define PRODUCT Leaf60 Hotswap
+#define PRODUCT Leaf 60 Hotswap
#define DESCRIPTION A custom hotswap 60% keyboard
/* key matrix size */
diff --git a/keyboards/foxlab/leaf60/hotswap/keymaps/via/keymap.c b/keyboards/foxlab/leaf60/hotswap/keymaps/via/keymap.c
new file mode 100644
index 00000000000..14d82004555
--- /dev/null
+++ b/keyboards/foxlab/leaf60/hotswap/keymaps/via/keymap.c
@@ -0,0 +1,48 @@
+/* Copyright 2019 Fox Lab
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ LAYOUT_60_tsangan_hhkb(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSLS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_DEL,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_RALT, KC_RCTL),
+
+ LAYOUT_60_tsangan_hhkb(
+ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS,
+ KC_TRNS, BL_TOGG, BL_DEC, BL_INC, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ LAYOUT_60_tsangan_hhkb(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ LAYOUT_60_tsangan_hhkb(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
+
+};
diff --git a/keyboards/foxlab/leaf60/hotswap/keymaps/via/rules.mk b/keyboards/foxlab/leaf60/hotswap/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/foxlab/leaf60/hotswap/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/foxlab/leaf60/universal/config.h b/keyboards/foxlab/leaf60/universal/config.h
index f038430f931..4b32d27393b 100644
--- a/keyboards/foxlab/leaf60/universal/config.h
+++ b/keyboards/foxlab/leaf60/universal/config.h
@@ -20,11 +20,11 @@ along with this program. If not, see .
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x0000
+#define VENDOR_ID 0x464C // "FL"
+#define PRODUCT_ID 0x0002
#define DEVICE_VER 0x0001
#define MANUFACTURER Fox Lab
-#define PRODUCT Leaf60 Universal
+#define PRODUCT Leaf 60 Universal
#define DESCRIPTION A custom 60% keyboard
/* key matrix size */
diff --git a/keyboards/foxlab/leaf60/universal/keymaps/via/keymap.c b/keyboards/foxlab/leaf60/universal/keymaps/via/keymap.c
new file mode 100644
index 00000000000..c6e40ca4ea3
--- /dev/null
+++ b/keyboards/foxlab/leaf60/universal/keymaps/via/keymap.c
@@ -0,0 +1,48 @@
+/* Copyright 2019 Fox Lab
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ LAYOUT_all(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_DEL,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL),
+
+ LAYOUT_all(
+ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS,
+ KC_TRNS, BL_TOGG, BL_DEC, BL_INC, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
+
+};
diff --git a/keyboards/foxlab/leaf60/universal/keymaps/via/rules.mk b/keyboards/foxlab/leaf60/universal/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/foxlab/leaf60/universal/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/ft/mars80/rules.mk b/keyboards/ft/mars80/rules.mk
index de85d62c8e0..e3f2c93ce3c 100644
--- a/keyboards/ft/mars80/rules.mk
+++ b/keyboards/ft/mars80/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = no
MOUSEKEY_ENABLE = no
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
diff --git a/keyboards/ft/mars80/usbconfig.h b/keyboards/ft/mars80/usbconfig.h
deleted file mode 100644
index 4430d9e67d7..00000000000
--- a/keyboards/ft/mars80/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'f', 't'
-#define USB_CFG_VENDOR_NAME_LEN 2
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'm', 'a', 'r', 's', '8', '0'
-#define USB_CFG_DEVICE_NAME_LEN 6
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/funky40/config.h b/keyboards/funky40/config.h
new file mode 100644
index 00000000000..d044d42274d
--- /dev/null
+++ b/keyboards/funky40/config.h
@@ -0,0 +1,48 @@
+/* Copyright 2020 /u/TheFourthCow
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0xC4B5
+#define DEVICE_VER 0x0001
+#define MANUFACTURER TheFourthCow
+#define PRODUCT Funky40
+#define DESCRIPTION Ortholinear 40 percent keyboard
+
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 12
+
+/* key matrix pins */
+#define MATRIX_ROW_PINS { D4, C6, B4, B5 }
+#define MATRIX_COL_PINS { D3, F5, F4, F7, B1, B6, B2, B3, D2, F6, E6, D7 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
\ No newline at end of file
diff --git a/keyboards/funky40/funky40.c b/keyboards/funky40/funky40.c
new file mode 100644
index 00000000000..1ecc25143d0
--- /dev/null
+++ b/keyboards/funky40/funky40.c
@@ -0,0 +1 @@
+#include "funky40.h"
diff --git a/keyboards/funky40/funky40.h b/keyboards/funky40/funky40.h
new file mode 100644
index 00000000000..f82a731b31e
--- /dev/null
+++ b/keyboards/funky40/funky40.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \
+ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \
+ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \
+ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309 \
+) { \
+ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \
+ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \
+ { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \
+ { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, KC_NO, KC_NO } \
+}
diff --git a/keyboards/funky40/info.json b/keyboards/funky40/info.json
new file mode 100644
index 00000000000..13ecd97bbe4
--- /dev/null
+++ b/keyboards/funky40/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "funky40",
+ "url": "",
+ "maintainer": "TheFourthCow",
+ "width": 12,
+ "height": 4,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"Q", "x":1, "y":0}, {"label":"W", "x":2, "y":0}, {"label":"E", "x":3, "y":0}, {"label":"R", "x":4, "y":0}, {"label":"T", "x":5, "y":0}, {"label":"Y", "x":6, "y":0}, {"label":"U", "x":7, "y":0}, {"label":"I", "x":8, "y":0}, {"label":"O", "x":9, "y":0}, {"label":"P", "x":10, "y":0}, {"label":"Back Space", "x":11, "y":0}, {"label":"Tab", "x":0, "y":1}, {"label":"A", "x":1, "y":1}, {"label":"S", "x":2, "y":1}, {"label":"D", "x":3, "y":1}, {"label":"F", "x":4, "y":1}, {"label":"G", "x":5, "y":1}, {"label":"H", "x":6, "y":1}, {"label":"J", "x":7, "y":1}, {"label":"K", "x":8, "y":1}, {"label":"L", "x":9, "y":1}, {"label":":", "x":10, "y":1}, {"label":"\"", "x":11, "y":1}, {"label":"Shift", "x":0, "y":2}, {"label":"Z", "x":1, "y":2}, {"label":"X", "x":2, "y":2}, {"label":"C", "x":3, "y":2}, {"label":"V", "x":4, "y":2}, {"label":"B", "x":5, "y":2}, {"label":"N", "x":6, "y":2}, {"label":"M", "x":7, "y":2}, {"label":"<", "x":8, "y":2}, {"label":">", "x":9, "y":2}, {"label":"?", "x":10, "y":2}, {"label":"Shift", "x":11, "y":2}, {"label":"Ctrl", "x":0, "y":3}, {"label":"Super", "x":1, "y":3}, {"label":"Alt", "x":2, "y":3}, {"x":3, "y":3, "w":2}, {"label":"Del", "x":5, "y":3}, {"x":6, "y":3, "w":2}, {"label":"Left", "x":8, "y":3}, {"label":"Up", "x":9, "y":3}, {"label":"Down", "x":10, "y":3}, {"label":"Right", "x":11, "y":3}]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/funky40/keymaps/default/keymap.c b/keyboards/funky40/keymaps/default/keymap.c
new file mode 100644
index 00000000000..7fbdb7f00dc
--- /dev/null
+++ b/keyboards/funky40/keymaps/default/keymap.c
@@ -0,0 +1,32 @@
+/* Copyright 2020 /u/TheFourthCow
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ LAYOUT(
+ KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_SFTENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, LT(1, KC_DEL), KC_SPC, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT),
+
+ LAYOUT(
+ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL,
+ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_UNDS, KC_PLUS,
+ KC_CAPS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_LBRC, KC_RBRC,
+ RESET, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_MPLY, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT),
+};
diff --git a/keyboards/funky40/keymaps/default/readme.md b/keyboards/funky40/keymaps/default/readme.md
new file mode 100644
index 00000000000..122732376d0
--- /dev/null
+++ b/keyboards/funky40/keymaps/default/readme.md
@@ -0,0 +1,6 @@
+# Default Funky40 Layout
+
+
+
+
+This is the default Funky40 layout, it is currently a work in progress. The right shift key is setup to be enter when tapped and right shift when held. The centered delete key is delete when tapped but a momentary layer modifier when held, use this to access the number and function keys and more as the map progresses.
diff --git a/keyboards/funky40/readme.md b/keyboards/funky40/readme.md
new file mode 100644
index 00000000000..ed83be877be
--- /dev/null
+++ b/keyboards/funky40/readme.md
@@ -0,0 +1,15 @@
+# Funky40
+
+
+
+A compact 40% (12x4) ortholinear keyboard kit made and sold by /u/TheFourthCow
+
+* Keyboard Maintainer: [TheFourthCow](https://github.com/TheFourthCow)
+* Hardware Supported: Funky40 with Pro Micro or Elite C
+* Hardware Availability: TBD - Currently from /u/TheFourthCow - [pm me on reddit](https://www.reddit.com/user/TheFourthCow/)!
+
+Make example for this keyboard (after setting up your build environment):
+
+ make funky40:default
+
+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).
diff --git a/keyboards/funky40/rules.mk b/keyboards/funky40/rules.mk
new file mode 100644
index 00000000000..c8c2b74e44d
--- /dev/null
+++ b/keyboards/funky40/rules.mk
@@ -0,0 +1,32 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+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 - this may disable space cadet right shift/enter
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
\ No newline at end of file
diff --git a/keyboards/gboards/combos/_generator/input.json b/keyboards/gboards/combos/_generator/input.json
new file mode 100644
index 00000000000..022c4690e77
--- /dev/null
+++ b/keyboards/gboards/combos/_generator/input.json
@@ -0,0 +1,99 @@
+{
+"the ":"TH",
+"of ":"OF",
+"and ":"ND",
+"to ":"TO",
+"in ":"IN",
+"for ":"FR",
+"is ":"IS",
+"on ":"ON",
+"that ":"TA",
+"by ":"BY",
+"this ":"TS",
+"with ":"WT",
+"you ":"YU",
+"it ":"IT",
+"not ":"NT",
+"or ":"OR",
+"be ":"BE",
+"are ":"AR",
+"from ":"FE",
+"at ":"AD",
+"as ":"AS",
+"your ":"UR",
+"all ":"AL",
+"have ":"HV",
+"new ":"NU",
+"more ":"MR",
+"an ":"AN",
+"was ":"WS",
+"we ":"WI",
+"will ":"WL",
+"home ":"HM",
+"can ":"CN",
+"us ":"US",
+"about ":"AB",
+"if ":"IF",
+"page ":"PG",
+"my ":"MK",
+"has ":"HS",
+"search ":"SR",
+"free ":"FH",
+"but ":"BU",
+"our ":"OU",
+"one ":"WU",
+"other ":"OH",
+"do ":"DO",
+"no ":"NK",
+"information ":"IR",
+"time ":"TM",
+"they ":"TY",
+"site ":"SY",
+"he ":"HE",
+"up ":"UP",
+"may ":"MA",
+"what ":"WA",
+"which ":"WH",
+"their ":"TR",
+"news ":"NS",
+"out ":"OG",
+"use ":"UE",
+"any ":"NE",
+"there ":"TE",
+"see ":"SE",
+"only ":"LY",
+"so ":"SO",
+"his ":"HI",
+"when ":"WN",
+"contact ":"KT",
+"here ":"HR",
+"business ":"BS",
+"who ":"WO",
+"web ":"WB",
+"also ":"LS",
+"now ":"NQ",
+"help ":"HL",
+"get ":"GT",
+"view ":"VU",
+"online ":"LN",
+"first ":"FS",
+"been ":"BN",
+"would ":"WD",
+"how ":"HU",
+"were ":"WR",
+"me ":"ME",
+"some ":"SM",
+"these ":"TZ",
+"click ":"CL",
+"its ":"IZ",
+"like ":"LK",
+"service ":"SV",
+"than ":"HN",
+"find ":"FN",
+"price ":"PR",
+"date ":"DT",
+"back ":"BK",
+"top ":"TP",
+"people ":"PE",
+"had ":"HD"
+}
diff --git a/keyboards/gboards/combos/_generator/main.go b/keyboards/gboards/combos/_generator/main.go
new file mode 100644
index 00000000000..043c8b78c77
--- /dev/null
+++ b/keyboards/gboards/combos/_generator/main.go
@@ -0,0 +1,60 @@
+// Package for taking a mapping of words to keys and outputing a
+// combo engine commpatible def
+
+package main
+
+import (
+ "io/ioutil"
+ "fmt"
+ "encoding/json"
+ "os"
+ "sort"
+ "strings"
+ "hash/crc64"
+ //"encoding/base64"
+)
+
+func main() {
+ // Show Usage
+ if len(os.Args) < 3 {
+ fmt.Println("Usage: ./keymap-gen inputfile outfile")
+ fmt.Println("Outputs dict in current dir")
+ return
+ }
+
+ // Read the source
+ data, err := ioutil.ReadFile(os.Args[1])
+ if err != nil {
+ panic(err)
+ }
+
+ // Unbundle Data
+ var FullDict map[string]string
+ var output []string
+ json.Unmarshal(data, &FullDict)
+
+ // Loop over entries and store
+ for i,v := range FullDict {
+ // This checks for colllisions, Generates hash
+ hash := crc64.Checksum([]byte(v), crc64.MakeTable(crc64.ECMA))
+ hashStr := fmt.Sprintf("txt_%x", hash)[:10]
+
+ // Format keys into combo
+ var keys string
+ for _, k := range(v) {
+ keys += fmt.Sprintf("KC_%v, ", string(k))
+
+ }
+ keys = keys[:len(keys)-2]
+
+ // Append to output
+ spacer := strings.Repeat(" ", 15-len(i))
+ output = append(output, fmt.Sprintf("SUBS(%v, %v\"%v\", %v)\n", hashStr, spacer, i, keys))
+ }
+
+
+ sort.Slice(output, func (i,j int) bool {
+ return strings.Count(output[i], " ") > strings.Count(output[j], " ")
+ })
+ ioutil.WriteFile(os.Args[2], []byte(strings.Join(output, "")), 0555)
+}
diff --git a/keyboards/gboards/combos/eng-combos.def b/keyboards/gboards/combos/eng-combos.def
new file mode 100644
index 00000000000..6f4a8a91e62
--- /dev/null
+++ b/keyboards/gboards/combos/eng-combos.def
@@ -0,0 +1,97 @@
+SUBS(txt_eaff0b, "me ", KC_M, KC_E)
+SUBS(txt_c96f2b, "as ", KC_A, KC_S)
+SUBS(txt_ff3afa, "we ", KC_W, KC_I)
+SUBS(txt_d94d16, "is ", KC_I, KC_S)
+SUBS(txt_7f6b3b, "he ", KC_H, KC_E)
+SUBS(txt_377110, "by ", KC_B, KC_Y)
+SUBS(txt_8d5585, "to ", KC_T, KC_O)
+SUBS(txt_888e33, "at ", KC_A, KC_D)
+SUBS(txt_ad11fe, "do ", KC_D, KC_O)
+SUBS(txt_285619, "us ", KC_U, KC_S)
+SUBS(txt_e537af, "it ", KC_I, KC_T)
+SUBS(txt_9b89bf, "in ", KC_I, KC_N)
+SUBS(txt_b11346, "so ", KC_S, KC_O)
+SUBS(txt_8bab82, "an ", KC_A, KC_N)
+SUBS(txt_6f31f3, "no ", KC_N, KC_K)
+SUBS(txt_f32605, "on ", KC_O, KC_N)
+SUBS(txt_2cce07, "or ", KC_O, KC_R)
+SUBS(txt_48782c, "of ", KC_O, KC_F)
+SUBS(txt_c69bf5, "be ", KC_B, KC_E)
+SUBS(txt_6c2838, "if ", KC_I, KC_F)
+SUBS(txt_6ffc63, "up ", KC_U, KC_P)
+SUBS(txt_920a79, "my ", KC_M, KC_K)
+SUBS(txt_f31a7f, "his ", KC_H, KC_I)
+SUBS(txt_da994d, "use ", KC_U, KC_E)
+SUBS(txt_b12f3c, "the ", KC_T, KC_H)
+SUBS(txt_4607a4, "for ", KC_F, KC_R)
+SUBS(txt_a4eacd, "and ", KC_N, KC_D)
+SUBS(txt_6a5f20, "new ", KC_N, KC_U)
+SUBS(txt_bb0054, "but ", KC_B, KC_U)
+SUBS(txt_7a4167, "are ", KC_A, KC_R)
+SUBS(txt_765d98, "you ", KC_Y, KC_U)
+SUBS(txt_ed01f2, "one ", KC_W, KC_U)
+SUBS(txt_b236f7, "see ", KC_S, KC_E)
+SUBS(txt_3eb659, "our ", KC_O, KC_U)
+SUBS(txt_2f09ac, "how ", KC_H, KC_U)
+SUBS(txt_706e0f, "who ", KC_W, KC_O)
+SUBS(txt_9dba28, "get ", KC_G, KC_T)
+SUBS(txt_3b151a, "top ", KC_T, KC_P)
+SUBS(txt_17c481, "any ", KC_N, KC_E)
+SUBS(txt_227971, "can ", KC_C, KC_N)
+SUBS(txt_4f3107, "web ", KC_W, KC_B)
+SUBS(txt_7f2fb4, "all ", KC_A, KC_L)
+SUBS(txt_8184ea, "was ", KC_W, KC_S)
+SUBS(txt_8da46f, "has ", KC_H, KC_S)
+SUBS(txt_cc4577, "had ", KC_H, KC_D)
+SUBS(txt_b7a9ce, "out ", KC_O, KC_G)
+SUBS(txt_9dc2dd, "its ", KC_I, KC_Z)
+SUBS(txt_d9716c, "not ", KC_N, KC_T)
+SUBS(txt_118fe3, "now ", KC_N, KC_Q)
+SUBS(txt_912fc8, "may ", KC_M, KC_A)
+SUBS(txt_769008, "been ", KC_B, KC_N)
+SUBS(txt_43dc12, "site ", KC_S, KC_Y)
+SUBS(txt_c6e300, "like ", KC_L, KC_K)
+SUBS(txt_bdfe53, "with ", KC_W, KC_T)
+SUBS(txt_c34043, "when ", KC_W, KC_N)
+SUBS(txt_b7ed41, "find ", KC_F, KC_N)
+SUBS(txt_f5a0f7, "that ", KC_T, KC_A)
+SUBS(txt_3be4f0, "help ", KC_H, KC_L)
+SUBS(txt_32aaa6, "were ", KC_W, KC_R)
+SUBS(txt_4cd926, "also ", KC_L, KC_S)
+SUBS(txt_be6e87, "back ", KC_B, KC_K)
+SUBS(txt_5a3966, "view ", KC_V, KC_U)
+SUBS(txt_89b7d9, "what ", KC_W, KC_A)
+SUBS(txt_4ffc97, "only ", KC_L, KC_Y)
+SUBS(txt_e50bd5, "news ", KC_N, KC_S)
+SUBS(txt_7cbf60, "this ", KC_T, KC_S)
+SUBS(txt_ab1e13, "more ", KC_M, KC_R)
+SUBS(txt_459770, "some ", KC_S, KC_M)
+SUBS(txt_37c475, "will ", KC_W, KC_L)
+SUBS(txt_88cabc, "home ", KC_H, KC_M)
+SUBS(txt_38b9b4, "free ", KC_F, KC_H)
+SUBS(txt_7f9ad1, "they ", KC_T, KC_Y)
+SUBS(txt_79d1b3, "time ", KC_T, KC_M)
+SUBS(txt_6081a2, "date ", KC_D, KC_T)
+SUBS(txt_bb894b, "page ", KC_P, KC_G)
+SUBS(txt_455ae0, "have ", KC_H, KC_V)
+SUBS(txt_cf60c6, "than ", KC_H, KC_N)
+SUBS(txt_3e8a23, "here ", KC_H, KC_R)
+SUBS(txt_9b7855, "your ", KC_U, KC_R)
+SUBS(txt_7e6bc5, "from ", KC_F, KC_E)
+SUBS(txt_d6fd47, "click ", KC_C, KC_L)
+SUBS(txt_7c72f0, "other ", KC_O, KC_H)
+SUBS(txt_f529e8, "first ", KC_F, KC_S)
+SUBS(txt_c065f2, "would ", KC_W, KC_D)
+SUBS(txt_3830ab, "these ", KC_T, KC_Z)
+SUBS(txt_cf912c, "their ", KC_T, KC_R)
+SUBS(txt_4c14b6, "which ", KC_W, KC_H)
+SUBS(txt_eec659, "price ", KC_P, KC_R)
+SUBS(txt_7dac6e, "about ", KC_A, KC_B)
+SUBS(txt_8e7034, "there ", KC_T, KC_E)
+SUBS(txt_e1d8f7, "online ", KC_L, KC_N)
+SUBS(txt_4f0d7d, "people ", KC_P, KC_E)
+SUBS(txt_f3d7ef, "search ", KC_S, KC_R)
+SUBS(txt_4ce55c, "contact ", KC_K, KC_T)
+SUBS(txt_88072c, "service ", KC_S, KC_V)
+SUBS(txt_3454a1, "business ", KC_B, KC_S)
+SUBS(txt_6a635a, "information ", KC_I, KC_R)
diff --git a/keyboards/gboards/combos/germ-mouse-keys.def b/keyboards/gboards/combos/germ-mouse-keys.def
new file mode 100644
index 00000000000..c0aff412e52
--- /dev/null
+++ b/keyboards/gboards/combos/germ-mouse-keys.def
@@ -0,0 +1,2 @@
+COMB(gbClick, KC_BTN1, KC_G, KC_B)
+COMB(fvClick, KC_BTN2, KC_F, KC_V)
diff --git a/keyboards/gboards/combos/germ-vim-helpers.def b/keyboards/gboards/combos/germ-vim-helpers.def
new file mode 100644
index 00000000000..3e2b45db167
--- /dev/null
+++ b/keyboards/gboards/combos/germ-vim-helpers.def
@@ -0,0 +1,10 @@
+// Vim-Mode combos
+
+COMB(weEsc, KC_ESC, KC_W, KC_E)
+COMB(sdBspc, KC_BSPC, KC_S, KC_D)
+COMB(dfTab, KC_TAB, KC_D, KC_F)
+COMB(cvEnt, KC_ENT, KC_C, KC_V)
+COMB(uiEsc, KC_ESC, KC_U, KC_I)
+COMB(jkCol, KC_COLN, KC_J, KC_K)
+COMB(hnEnt, KC_ENT, KC_H, KC_N)
+
diff --git a/keyboards/gboards/combos/readme.md b/keyboards/gboards/combos/readme.md
new file mode 100644
index 00000000000..ca4b169c1de
--- /dev/null
+++ b/keyboards/gboards/combos/readme.md
@@ -0,0 +1,7 @@
+# Combo library!
+
+This is a list of all the currently available dictionaries that are available for inclusion.
+Please submit a PR with yours! If you have a bunch prepend your username to the front. i.e.
+`germ-vim-helpers`
+
+Thanks!
diff --git a/keyboards/gboards/dicts/aset/_generator/main.go b/keyboards/gboards/dicts/aset/_generator/main.go
new file mode 100644
index 00000000000..ae7e15c8be9
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/main.go
@@ -0,0 +1,298 @@
+package main
+
+import (
+ "io/ioutil"
+ "fmt"
+ "encoding/json"
+ "os"
+ "path/filepath"
+ "strings"
+ "sort"
+ "hash/crc64"
+ //"encoding/base64"
+)
+
+func main() {
+ // Show Usage
+ if len(os.Args) < 3 {
+ fmt.Println("Usage: ./keymap-gen src-dir out-dir")
+ fmt.Println("Outputs c files in out-dir")
+ fmt.Println("Make sure the dirs exist.")
+ return
+ }
+
+ files, err := filepath.Glob(os.Args[1] + "/*.json")
+ if err != nil {
+ fmt.Printf("Could not open src-dir: %v\n", err)
+ return
+ }
+
+ for _, fname := range(files) {
+ fmt.Println("Processing: ", fname)
+ // Read the source
+ data, err := ioutil.ReadFile(fname)
+ if err != nil {
+ panic(err)
+ }
+
+ // Unbundle Data
+ var FullDict map[string]Entry
+ json.Unmarshal(data, &FullDict)
+
+ // Loop over entries and store
+ var output []string
+ for i,v := range FullDict {
+ if i == "0" {
+ continue
+ }
+
+ // Special handling for numbermap
+ var entry string
+ if strings.Contains(fname, "num") {
+ entry = v.toKeymap("NUM|")
+ } else {
+ entry = v.toKeymap("")
+ }
+
+ if entry != "" {
+ output = append(output, entry)
+ }
+ }
+
+ // Sort by length, then amount of whitespace lol
+ sort.Slice(output, func (i,j int) bool {
+ var maxLen int
+ if len(output[i]) > len(output[j]) {
+ maxLen = len(output[i])
+ } else {
+ maxLen = len(output[j])
+ }
+
+ return maxLen-strings.Count(output[i][:40], " ") < maxLen-strings.Count(output[j][:40], " ")
+ })
+
+ // Whack a disclaimer
+ output = append([]string{"// This file is automatically generated. Do not edit it!\n\n"}, output...)
+
+ // Write all data out
+ outName := filepath.Base(fname)
+ outName = os.Args[2] + outName[:len(outName)-5]+".def"
+ fmt.Println("Saving: ", outName)
+ ioutil.WriteFile(outName, []byte(strings.Join(output, "")), 0755)
+ }
+}
+
+func (e Entry) toKeymap(prefix string) (string) {
+ // storage for parts
+ var command, chord, arg string
+ wordInfo := parseWords(e)
+
+ // Handle prefix
+ if prefix != "" {
+ chord = prefix
+ }
+
+ // Format the chord
+ keys := []string{"AA", "AS", "AE", "AT", "AN", "AI", "AO", "AP"}
+ for i, v := range e.Input {
+ chord += keys[v-1]
+
+ if i != len(e.Input)-1 {
+ chord += "|"
+ }
+ }
+
+ // Handle specials/base first
+ var ok bool
+ var v []string
+
+ if e.Special != "" {
+ v, ok = QMKLookup[e.Special]
+ }
+ if !ok && e.Base != "" {
+ v, ok = QMKLookup[e.Base]
+ }
+
+ if ok {
+ // Determine way to send key
+ if len(v) == 1 {
+ command = "PRES("
+ } else {
+ command = "KEYS("
+ }
+ }
+
+ if ok {
+ if len(v) > 1 {
+ arg += "{"
+ }
+
+ // String together args
+ for ii, vv := range(v) {
+ arg += vv
+ if ii == len(v)-1 && len(v) > 1 {
+ arg += ", COMBO_END}"
+ } else if ii != len(v)-1 {
+ arg += ", "
+ }
+ }
+
+
+ hash := crc64.Checksum([]byte(fmt.Sprintf("%v%v", arg, chord)), crc64.MakeTable(crc64.ECMA))
+ hashStr := fmt.Sprintf("cmb_%x", hash)
+ wordSpacer := strings.Repeat(" ", 42-len(arg))
+ if command == "KEYS(" {
+ arg = fmt.Sprintf("%v, %v %v", hashStr, wordSpacer, arg)
+ } else {
+ arg = fmt.Sprintf("%65v", arg)
+ }
+
+ goto Found
+ }
+
+ // Parse out word info
+ if wordInfo.LRank == 0 && wordInfo.RRank == 0 {
+ goto Blank
+ }
+
+ if wordInfo.LRank != 0 || wordInfo.RRank != 0 {
+ if wordInfo.LRank != 0 && wordInfo.RRank != 0 {
+ // Just blank the structure and recall
+ left, right := e, e
+ left.Trw = nil
+ right.Tlw = nil
+ return fmt.Sprintf("%v%v", left.toKeymap("LFT|"), right.toKeymap("RGT|"))
+ }
+
+ var word string
+ if wordInfo.LRank > wordInfo.RRank {
+ word = wordInfo.LWord
+ } else {
+ word = wordInfo.RWord
+ }
+
+ // Add in thumb
+ chord = "AR|" + chord
+
+
+ // generate function name
+ hash := crc64.Checksum([]byte(word), crc64.MakeTable(crc64.ECMA))
+ hashStr := fmt.Sprintf("str_%016X", hash)
+ command = "SUBS("
+ wordSpacer := strings.Repeat(" ", 40-len(word))
+ arg = fmt.Sprintf("%v, %v \"%v \"", hashStr, wordSpacer, word)
+ goto Found
+ }
+
+ panic(e.String())
+
+ Found:
+ chord += ","
+ return fmt.Sprintf("%v%-35v%v)\n", command, chord, arg)
+
+ Blank:
+ return ""
+}
+
+type Entry struct {
+ Input []int
+ Base string
+ Tlw []interface{}
+ Trw []interface{}
+ Special string
+}
+type Word struct {
+ LWord string
+ LRank float64
+ RWord string
+ RRank float64
+}
+
+func parseWords(e Entry) (ret Word) {
+ if len(e.Tlw) > 0 {
+ ret.LWord = e.Tlw[0].(string)
+ ret.LRank= e.Tlw[1].(float64)
+ }
+ if len(e.Trw) > 0 {
+ ret.RWord = e.Trw[0].(string)
+ ret.RRank= e.Trw[1].(float64)
+ }
+ return ret
+}
+func (e Entry) String() (ret string) {
+ ret = fmt.Sprintln("Input: ", e.Input)
+ ret += fmt.Sprintln("Base: ", e.Base)
+ ret += fmt.Sprintln("Left: ", e.Tlw)
+ ret += fmt.Sprintln("Right: ", e.Trw)
+ ret += fmt.Sprintln("Special: ", e.Special)
+
+ return ret
+}
+
+var QMKLookup = map[string][]string {
+"!":[]string{"KC_LSFT", "KC_1"},
+"'":[]string{"KC_QUOT"},
+"(":[]string{"KC_LSFT", "KC_9"},
+")":[]string{"KC_LSFT", "KC_0"},
+",":[]string{"KC_COMM"},
+"-":[]string{"KC_MINS"},
+".":[]string{"KC_DOT"},
+";":[]string{"KC_SCLN"},
+"?":[]string{"KC_QUOT"},
+"a":[]string{"KC_A"},
+"b":[]string{"KC_B"},
+"c":[]string{"KC_C"},
+"d":[]string{"KC_D"},
+"e":[]string{"KC_E"},
+"f":[]string{"KC_F"},
+"g":[]string{"KC_G"},
+"h":[]string{"KC_H"},
+"i":[]string{"KC_I"},
+"j":[]string{"KC_J"},
+"k":[]string{"KC_K"},
+"l":[]string{"KC_L"},
+"m":[]string{"KC_M"},
+"n":[]string{"KC_N"},
+"o":[]string{"KC_O"},
+"p":[]string{"KC_P"},
+"q":[]string{"KC_Q"},
+"r":[]string{"KC_R"},
+"s":[]string{"KC_S"},
+"t":[]string{"KC_T"},
+"u":[]string{"KC_U"},
+"v":[]string{"KC_V"},
+"w":[]string{"KC_W"},
+"x":[]string{"KC_X"},
+"y":[]string{"KC_Y"},
+"z":[]string{"KC_Z"},
+
+//specials
+"bksp":[]string{"KC_BSPC"},
+"enter":[]string{"KC_ENT"},
+//"numsym":[]string{"NUM)"}, //TODO: Sticky
+//"LETTERS":[]string{"KC_SPC"},
+
+//symbols
+"[":[]string{"KC_LBRC"},
+"]":[]string{"KC_RBRC"},
+" ":[]string{"KC_SPC"},
+"1":[]string{"KC_1"},
+"2":[]string{"KC_2"},
+"3":[]string{"KC_3"},
+"4":[]string{"KC_4"},
+"5":[]string{"KC_5"},
+"6":[]string{"KC_6"},
+"7":[]string{"KC_7"},
+"8":[]string{"KC_8"},
+"9":[]string{"KC_9"},
+"0":[]string{"KC_0"},
+"=":[]string{"KC_EQL"},
+"Fn":[]string{"KC_NO"},
+"SPACE":[]string{"KC_SPC"},
+"Home":[]string{"KC_HOME"},
+"End":[]string{"KC_END"},
+" ":[]string{"KC_TAB"},
+" ":[]string{"KC_TAB"},
+"\t":[]string{"KC_TAB"},
+"`":[]string{"KC_GRV"},
+}
diff --git a/keyboards/gboards/dicts/aset/_generator/src/da-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/da-keymap.json
new file mode 100644
index 00000000000..5bc62f4bcae
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/da-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",70938],"tlw":["a",1885],"lp":["aa"],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",6312],"tlw":["s",729],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["sa",51462],"tlw":["saa",14038],"lp":["sa","saa","as","ass","wa","aas","ssa","sas","ww","aw","saas","www","assa","ssaa","ws"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",2647],"tlw":["e",88],"lp":["ee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ae",65201],"tlw":["ae",1518],"lp":["ae","aae","ex","ea","ax","aee","xe","xa","exa","exe","axe","aex","eae"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["de",283077],"tlw":["de",23660],"lp":["de","ed","es","se","ede","ds","des","sse","dd","dse","ess","dde","eds","edes","ese","sed","ded","see","dede","sede"],"rp":[]},"7":{"input":[1,2,3],"tlp":["ad",24996],"tlw":["da",8071],"lp":["ad","da","ade","aes","aad","sae","aed","ada","sad","aede","aade","saad","aada","ads","asse","aese","dae","dda","esa","we"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",16147],"tlw":["t",62],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["at",52505],"tlw":["at",39486],"lp":["at","ta","af","fa","ft","att","taa","faa","aft","aat","ff","aatt","fat","fatt","aff","tat","tf","ata","fta","afta"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["st",66160],"tlw":["c",179],"lp":["st","ts","sc","sst","ct","cc","tc","cs","cst","tst","tsc","tts","sts"],"rp":[]},"11":{"input":[1,2,4],"tlp":["sta",9134],"tlw":["fast",485],"lp":["sta","ast","sat","staa","ca","satt","tsa","fas","fast","fs","afs","ac","asta","sf","tas","tsaa","fst","afst","stat","tsat"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["er",200106],"tlw":["er",24396],"lp":["er","et","te","re","ere","rt","ter","tr","tte","ret","ett","ette","rte","ert","rr","tet","tter","rer","rre","eret"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ar",71256],"tlw":["fra",7354],"lp":["ar","ra","aer","fr","aar","aere","fte","fra","ef","tra","rae","are","fter","tae","eft","atte","efte","aet","fre","rf"],"rp":[]},"14":{"input":[2,3,4],"tlp":["det",50507],"tlw":["det",40064],"lp":["det","der","dt","ste","rd","dr","rs","est","dre","red","res","este","rde","ted","dere","rst","dte","rede","dst","str"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["aest",3267],"tlw":["satte",874],"lp":["aest","stra","stae","ader","ard","aerd","ared","rsta","saet","rda","derf","aard","fes","tad","stad","raad","dra","fred","fess","raed"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",12763],"trw":["n",53],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",107331],"trp":["na",18738],"tlw":["an",271],"trw":["naa",705],"lp":["an","aan","ann","anna","ana"],"rp":["na","naa","nan","nna","naan"]},"18":{"input":[2,5],"base":"j","baseshift":"J","tlp":["sn",2823],"trp":["ns",25305],"trw":["j",68],"lp":["sn","sj"],"rp":["ns","jn","js","nj","nss","jj"]},"19":{"input":[1,2,5],"tlp":["ans",12498],"trp":["ja",8744],"tlw":["sans",47],"trw":["ja",3506],"lp":["ans","san","sna","sja","aj","ajn","ssan","ansa","aaj","sans","snaa","wan","wn","asn","aasn"],"rp":["ja","nsa","jan","nas","nsaa"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",215951],"trp":["ne",54829],"tlw":["en",31130],"trw":["nye",787],"lp":["en","ene","enn","enne","enen","een","ey","eny"],"rp":["ne","nne","yn","nen","ny","ye","nene","yne","nye","yen","nnen","nee"]},"21":{"input":[1,3,5],"tlp":["aen",11318],"trp":["nae",4921],"tlw":["anne",45],"trw":["nae",24],"lp":["aen","anne","ane","aene","aane","aaen","anen","ay","ena","any","aany","ean","eann","aenn","xen"],"rp":["nae","naae","ya","yan","naee"]},"22":{"input":[2,3,5],"tlp":["den",50813],"trp":["nd",90348],"tlw":["den",24655],"trw":["ned",3104],"lp":["den","end","ende","ens","ej","sen","sy","dn","syn"],"rp":["nd","nde","je","nden","ned","ys","ndes","jen","nes","yd","nds"]},"23":{"input":[1,2,3,5],"tlp":["and",24671],"trp":["jae",3560],"tlw":["anden",1960],"trw":["naade",237],"lp":["and","ande","dan","aend","aand","adan","ands","aden","dann","sand","anse","sjae","dans","aned"],"rp":["jae","naes","nand","nda","naad","ndda"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["tn",1655],"trp":["nt",13043],"tlw":["b",55],"lp":["tn","bt","bn","bb","tb"],"rp":["nt","nb","ntn"]},"25":{"input":[1,4,5],"tlp":["ba",11045],"trp":["nat",1917],"tlw":["tabt",109],"trw":["nat",438],"lp":["ba","ab","tan","ant","aab","fan","ban","baa","abt","abn","aabn","aabt","anta","tab","tabt","fb"],"rp":["nat","nf","nta","natt"]},"26":{"input":[2,4,5],"tlp":["tj",1039],"trp":["nst",1524],"lp":["tj","bj","sb","stj","stn","bs","tsj","sbj"],"rp":["nst","nc","jst","jt","nsb","nstn","ncs","ncst","nct","jnb","nbj","jnbj"]},"27":{"input":[1,2,4,5],"tlp":["stan",1647],"trp":["nsta",463],"tlw":["satan",75],"lp":["stan","fj","anc","bac","taj","abs","tja","stja","tajn","sant","bja","anst","asb","asbj","bas","tans"],"rp":["nsta","ntas","nsat","jac"]},"28":{"input":[3,4,5],"tlp":["be",22658],"trp":["nte",7013],"tlw":["byen",409],"trw":["nyt",305],"lp":["be","rn","ren","ten","br","rne","ern","erne","ent","ry","ty","eb","rb","ber","eren","bet","ente"],"rp":["nte","ner","net"]},"29":{"input":[1,3,4,5],"tlp":["ran",3013],"trp":["naar",3178],"tlw":["bare",1165],"trw":["naar",3077],"lp":["ran","taen","bar","abe","ante","ften","arb","arbe","bra","raen","bare","fy","arn","aeb","bae","barn"],"rp":["naar","nar","naer","nart"]},"30":{"input":[2,3,4,5],"tlp":["sten",3731],"trp":["nder",8663],"tlw":["syntes",800],"trw":["jer",433],"lp":["sten","endt","bes","bed","rden","rej","bej","rejs","rbej","bejd","best","dern"],"rp":["nder","ndt","ndr","ndre","ndet","jer","ndte","yst"]},"31":{"input":[1,2,3,4,5],"tlw":["andre",1970],"trw":["naesten",941],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",246],"trw":["i",43365],"lp":[],"rp":["ii","iii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["ai",419],"trp":["ia",2518],"lp":["ai","za","zi","az"],"rp":["ia","iz"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["si",39075],"trp":["ik",32997],"tlw":["si",156],"trw":["is",201],"lp":["si","sk","ski","sik","ssi","sikk","sis","skik"],"rp":["ik","kk","ikk","is","ki","ks","isk","iss","kik","ksi","ksis","kikk"]},"35":{"input":[1,2,6],"tlp":["ska",8476],"trp":["ka",23048],"tlw":["zak",168],"trw":["ka",248],"lp":["ska","ak","akk","ask","wi","aks","aask","aksi","asi","zak","aka","skaa","assi","aak"],"rp":["ka","kas","kaa","isa","ika","kass"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",2228],"trp":["ie",6094],"tlw":["ei",448],"lp":["ei","eie"],"rp":["ie"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["ze",48],"trp":["ix",31],"trw":["ix",31],"lp":["ze","xi","axi","aie","eiz","aei","aze"],"rp":["ix","iae"]},"38":{"input":[2,3,6],"tlp":["di",14167],"trp":["ke",57169],"tlw":["disse",1266],"trw":["ikke",20180],"lp":["di","ske","ek","sid","side","esk","ekk","ekke","eske"],"rp":["ke","kke","id","ikke","ide","ked","kede","ids","ise","kked","iske"]},"39":{"input":[1,2,3,6],"tlp":["aek",2798],"trp":["kae",1766],"tlw":["skade",99],"trw":["ida",70],"lp":["aek","akke","aekk","aske","skae","adi","dska","daek","adsk","eka","skad","aesk","eska","aeks"],"rp":["kae","idda","isae","ida","kad","kade"]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",51178],"trp":["iv",10524],"tlw":["vi",7341],"trw":["it",23],"lp":["ti","vi","vt","tv","tvi","tiv","viv","tti","tviv","tit","vit","vv","vitt","tivt"],"rp":["iv","it","iti","itt","itti","ivt"]},"41":{"input":[1,4,6],"tlp":["va",50676],"trp":["if",1405],"tlw":["tav",135],"lp":["va","av","fi","ati","tav","avi","vaa","fti","tia","vf","avt","atti","tva","afti","tz"],"rp":["if","ift","iva","ita","itz"]},"42":{"input":[2,4,6],"tlp":["vis",7341],"trp":["ist",4703],"tlw":["sit",2281],"lp":["vis","sti","sv","sit","vist","vs","tis","tisk","ci","svi","visk","vik","tik"],"rp":["ist","kt","kv","kvi","isti","ic","kti"]},"43":{"input":[1,2,4,6],"tlp":["sva",3328],"trp":["kast",607],"tlw":["fik",1865],"trw":["kat",43],"lp":["sva","fik","akt","tak","avs","stak","takk","akti","tavs","fak","stia","fakt","fis","fisk","sav"],"rp":["kast","kat","kaf","kaff","kva"]},"44":{"input":[3,4,6],"tlp":["ve",58500],"trp":["ive",7238],"tlw":["rev",144],"trw":["iver",59],"lp":["ve","ri","ver","ev","eve","vet","eri","rv","rti","rev","vir","evet","rve","rie","vr"],"rp":["ive","ir","iver","ivet","ier"]},"45":{"input":[1,3,4,6],"tlp":["var",27429],"trp":["ifte",524],"tlw":["var",23713],"trw":["ivar",148],"lp":["var","vae","vaer","ave","vare","aev","eva","ari","fri","evae","rav","aeve","arv","arve","avet","farv","aver","verf","arie"],"rp":["ifte"]},"46":{"input":[2,3,4,6],"tlp":["ved",13008],"trp":["kr",7446],"tlw":["ved",9023],"trw":["idet",571],"lp":["ved","vd","vde","rk","tid","rke","vid","erk","dri","skr","vede","vide","erke"],"rp":["kr","ker","idt","ket","kri","idst","kker"]},"47":{"input":[1,2,3,4,6],"tlw":["svarede",1115],"trw":["kastede",275],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["in",55966],"trw":["h",182],"lp":[],"rp":["in","ni","nin","hi","nh","hin","inn","ih","nni","ini","hn","nnin","hinn","hini","hii","iin","hiin"]},"49":{"input":[1,5,6],"tlp":["ani",433],"trp":["ha",84475],"tlw":["zina",155],"trw":["han",28303],"lp":["ani","ah","anz","anni","zin","zina","ania"],"rp":["ha","han","haa","ina","haan","hina","inan","nha","ian","hann","nia","nz","nina"]},"50":{"input":[2,5,6],"tlp":["sin",8509],"trp":["nk",7187],"tlw":["sin",5448],"trw":["nik",30],"lp":["sin","skj","sni","sh","skin","snin"],"rp":["nk","hj","kn","nsk","kj","nsi","nik","kin","his","kni","ink","knin","nikk","nis"]},"51":{"input":[1,2,5,6],"tlp":["ansk",2386],"trp":["kan",8041],"tlw":["sank",149],"trw":["kan",7261],"lp":["ansk","ank","ansi","snak","skja","sha","sank","win"],"rp":["kan","hans","hja","kja","kna","hw","nak","nakk","nska","has","hwa","jak"]},"52":{"input":[3,5,6],"tlp":["enh",1378],"trp":["he",30604],"trw":["hen",2065],"lp":["enh","eh","eni","enin","enhe","ein"],"rp":["he","hen","ine","ien","hy","nie","nei","nhe","inne","inen","henn","ihe","hei","hein"]},"53":{"input":[1,3,5,6],"tlp":["enha",462],"trp":["hae",2302],"tlw":["annie",37],"trw":["hanne",108],"lp":["enha","eha","anie","ehan","einz","zen","enia","ahy","ehaa"],"rp":["hae","haen","nhae","hea","hena","hane","iane","haie"]},"54":{"input":[2,3,5,6],"tlp":["enk",3299],"trp":["ind",17207],"tlw":["sine",1896],"trw":["ind",4197],"lp":["enk","din","sky","ekn","enke","sine"],"rp":["ind","inde","hend","hed","ken","nke","iden","yk","nske","ky","hje","ykk","ykke","kend"]},"55":{"input":[1,2,3,5,6],"tlw":["danske",357],"trw":["hinanden",807],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["vin",3191],"trp":["hv",22271],"tlw":["thi",704],"trw":["int",55],"lp":["vin","vn","bi","th","tin","tni","tnin","thi","bin","vint"],"rp":["hv","hvi","int","ib","nv","nti","nhv","ntin","nit","niv"]},"57":{"input":[1,4,5,6],"tlp":["van",3040],"trp":["hav",16151],"tlw":["tania",150],"trw":["navn",505],"lp":["van","fin","avn","anv","tian","tha","avni","tani","vant","bav"],"rp":["hav","hva","nav","navn","havn","haf","haft","haab","nhav","hat"]},"58":{"input":[2,4,5,6],"tlp":["ch",2279],"trp":["hvis",2968],"tlw":["skib",43],"trw":["hvis",2525],"lp":["ch","svin","stin","visn","sch","sth","skib","vsh","chs","vink"],"rp":["hvis","nkt","kvin","hist","ich","kib","inst","istn","nist","nsv"]},"59":{"input":[1,2,4,5,6],"tlw":["skabt",80],"trw":["kant",116],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["ven",8299],"trp":["her",6089],"tlw":["ven",504],"trw":["her",3645],"lp":["ven","rin","rh","bev","vent","vne","the","erh","even","beh","evn","rbi","erin","etni"],"rp":["her","hve","hver","inte","hr","herr"]},"61":{"input":[1,3,4,5,6],"tlw":["fine",167],"trw":["har",10914],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["vendte",689],"trw":["hvide",710],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["finde",734],"trw":["havde",11721],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",54],"trw":["o",656],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","tlp":["ao",60],"trp":["oa",43],"lp":["ao"],"rp":["oa"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",30717],"trp":["os",7769],"tlw":["so",193],"trw":["os",2349],"lp":["so","sos","sso"],"rp":["os","oss","oso"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["wo",536],"trp":["ow",474],"tlw":["wos",58],"lp":["wo","aso","sow","wos","aaso","saso","aos"],"rp":["ow","osa"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["eo",700],"trp":["oe",2132],"trw":["-",3902],"lp":["eo","e-"],"rp":["oe","-o","-e","-e-"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["a-",13],"trp":["ox",139],"trw":["-aa",53],"lp":["a-","aa-","a-e","aa-e","a-e-"],"rp":["ox","oxe","-a","-aa"]},"70":{"input":[2,3,7],"tlp":["do",7429],"trp":["od",24132],"tlw":["dod",445],"trw":["ode",82],"lp":["do","eso","dod","dode","soe","esso","sod","dso","sode"],"rp":["od","ode","ods","oed","ose","oede","osse","odd","-d","odde","-de"]},"71":{"input":[1,2,3,7],"tlp":["ado",19],"trp":["odsa",172],"trw":["-saa",39],"lp":["ado"],"rp":["odsa","owe","-sa","-saa","odda","oda"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["gt",20766],"trp":["og",89433],"tlw":["to",2228],"trw":["og",64213],"lp":["gt","to","go","gg","tog","tot","tott","gtt","tto","gtto","ttog","tg","tgo","ggo"],"rp":["og","ot","ogt","ott","oot","oto"]},"73":{"input":[1,4,7],"tlp":["fo",49386],"trp":["of",4123],"tlw":["gaa",1197],"trw":["of",77],"lp":["fo","ag","ga","gaa","agt","tag","aag","tfo","fg","afg","agg","fag","tof","taag","fgo","afgo"],"rp":["of","oft","off","ofa"]},"74":{"input":[2,4,7],"tlp":["sto",10153],"trp":["ogs",3950],"tlw":["sogt",61],"trw":["ost",168],"lp":["sto","gs","sog","sogt","gst","sg","co","gso","sost","stot","tos","soc","toss","gts","sgo","gc"],"rp":["ogs","ost","oc","ogst"]},"75":{"input":[1,2,4,7],"tlp":["sag",7763],"trp":["ogsa",3841],"tlw":["sagt",613],"trw":["ogsaa",2370],"lp":["sag","gsa","gsaa","sagt","ags","sof","sga","asto","sgaa","sofa","sfo","stof","wot","tow","sfag","fos","foss"],"rp":["ogsa","ofas","osof"]},"76":{"input":[3,4,7],"tlp":["ge",73298],"trp":["or",91756],"tlw":["gore",1137],"trw":["ore",158],"lp":["ge","eg","ro","ger","get","ege","gr","tor","gte","rg","gge","tro","eget"],"rp":["or","ore","ort","oge","oget","org","orte"]},"77":{"input":[1,3,4,7],"tlp":["for",43517],"trp":["orf",1741],"tlw":["for",18700],"trw":["ofte",682],"lp":["for","age","aeg","tage","fort","rfo","rfor","gra","rag","gaar","fore","fora","ager","agte","aget","erfo","rof"],"rp":["orf","ofte","ora"]},"78":{"input":[2,3,4,7],"tlp":["gd",7202],"trp":["ord",8900],"tlw":["dog",2587],"trw":["ord",1092],"lp":["gd","gde","stor","god","tod","dog","stod","rod","godt","ges","sor","rso","dor","ged"],"rp":["ord","ors","orst","odt","orde","oder"]},"79":{"input":[1,2,3,4,7],"tlw":["sagde",5844],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["un",38415],"trw":["nu",6214],"lp":[],"rp":["un","no","on","nu","unn","onn","ou","uu","ono","nun","non","uo"]},"81":{"input":[1,5,7],"tlp":["au",1436],"trp":["ua",639],"tlw":["au",12],"lp":["au","anu","anua","ano","qu","anon"],"rp":["ua","ona","uan","nua","una","nuan","uana","oan"]},"82":{"input":[2,5,7],"tlp":["su",1821],"trp":["jo",11635],"tlw":["son",331],"trw":["jo",3858],"lp":["su","son","sun","sus","sonn"],"rp":["jo","oj","us","ojn","ju","ons","jon","noj","uns","nus","jus","jun","nso","nsu","onsu"]},"83":{"input":[1,2,5,7],"tlp":["aus",420],"trp":["usa",143],"trw":["jow",70],"lp":["aus","anus","sona","ajo","asou","ajon","sua"],"rp":["usa","jow","uans","janu","oja","noja","own","onsa","joa","joan","uja","jona","onas"]},"84":{"input":[3,5,7],"tlp":["eu",269],"trp":["ue",3024],"trw":["nue",32],"lp":["eu","eno","eun","en-"],"rp":["ue","one","unne","uen","onne","oen","onen","une","oy","-n","n-","nue","-ne","yo","oye","u-"]},"85":{"input":[1,3,5,7],"tlp":["eau",73],"trp":["ux",95],"trw":["-naa",21],"lp":["eau","anue","xu","xue","que","aue","eaue","aoy","aoye","aeu"],"rp":["ux","-na","-naa","oxen","unae","-au","uxe","oux"]},"86":{"input":[2,3,5,7],"tlp":["du",10932],"trp":["ud",16891],"tlw":["du",8921],"trw":["ud",5540],"lp":["du","dnu","due"],"rp":["ud","und","unde","ude","oje","uden","uds","ndnu","ojne","ond","udse","use","nod","oden","-j","ndu","ndue"]},"87":{"input":[1,2,3,5,7],"tlw":["aa-e-ja",13],"trw":["-ja",333],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["bo",7356],"trp":["ng",36020],"tlw":["bog",542],"trw":["ung",427],"lp":["bo","tu","gn","gu","bu","bog","tun","ton","tung"],"rp":["ng","nog","ob","ug","ut","ung","ngt","ub","ugt","ont","utt"]},"89":{"input":[1,4,5,7],"tlp":["ang",11845],"trp":["uf",1211],"tlw":["gang",1991],"trw":["nabo",19],"lp":["ang","gan","gang","bag","fu","atu","angt","agn","fun","fang","fug","tau","bang","gna"],"rp":["uf","natu","nga","uft","nfo","ngan"]},"90":{"input":[2,4,5,7],"tlp":["gj",4375],"trp":["ngs",1845],"tlw":["sgu",306],"trw":["just",195],"lp":["gj","gjo","stu","boj","bjo","tus","sgu","toj","stun","goj","gnus"],"rp":["ngs","ust","ojt","ngst","ngso","unst","job","just","jont"]},"91":{"input":[1,2,4,5,7],"tlw":["sang",347],"trw":["jagt",44],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["gen",17731],"trp":["nge",16467],"tlw":["bort",849],"trw":["noget",4194],"lp":["gen","ru","eng","bor","enge","beg","gne","run","gy","egy","bru"],"rp":["nge","noge","ur","ngen","yg","nger","ogen","orn","oren"]},"93":{"input":[1,3,4,5,7],"tlw":["foran",718],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["gjorde",1269],"trw":["jeg",26496],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["dagen",378],"trw":["udenfor",361],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["il",52340],"trw":["lo",488],"lp":[],"rp":["il","li","ll","ol","lo","ill","lli","io","illi","olo","oli","lil","lill","oi","oll","ili","iol","ioli","lio","llio"]},"97":{"input":[1,6,7],"tlp":["al",35773],"trp":["la",34392],"tlw":["al",773],"trw":["laa",896],"lp":["al","all","aal","alli","ali","ala","aall","zo","ail","alo","aala"],"rp":["la","laa","lia","llia","lla","ola","ial","illa","olla"]},"98":{"input":[2,6,7],"tlp":["sl",6546],"trp":["ko",17253],"tlw":["sol",272],"trw":["los",173],"lp":["sl","sko","sol","slo","sio"],"rp":["ko","ls","ok","kl","lk","lik","kol","lsk","olk","ilk","okk","ils","lok","klo","los"]},"99":{"input":[1,2,6,7],"tlp":["skal",4331],"trp":["kal",5704],"tlw":["skal",4257],"trw":["las",152],"lp":["skal","sla","wil","will","saal","sal","als","slaa","alk","wol","woll"],"rp":["kal","kla","las","kola","lska","oka","lass","okal","kalk"]},"100":{"input":[3,6,7],"tlp":["el",52483],"trp":["le",62636],"tlw":["el",13],"trw":["lille",1799],"lp":["el","ell","elle","eli","ele","elli","elo","eol"],"rp":["le","lle","ille","ole","ile","olle","lie","iel","oie","ilie","lel","olel"]},"101":{"input":[1,3,6,7],"tlp":["ale",5962],"trp":["lae",8065],"tlw":["alle",3178],"trw":["lae",133],"lp":["ale","ael","alle","aale","aell","ela","aele","ella","elae","alie","alae","eal"],"rp":["lae","iale","laae","lox","lela","lea","i-a","li-a"]},"102":{"input":[2,3,6,7],"tlp":["els",7813],"trp":["ld",24257],"tlw":["del",897],"trw":["lod",1333],"lp":["els","sel","del","else","deli","eld","dl"],"rp":["ld","lde","lse","old","led","ild","kel","lede","ilde","lid","lod","keli","olde"]},"103":{"input":[1,2,3,6,7],"tlw":["saaledes",615],"trw":["lad",680],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["til",31908],"trp":["ig",74754],"tlw":["til",24015],"trw":["liv",1247],"lp":["til","vo","vil","gi","gl","tig","till"],"rp":["ig","lig","ov","lt","igt","lv","liv","ligt","log","lg","ogi","logi","olog"]},"105":{"input":[1,4,6,7],"tlp":["alt",7650],"trp":["lag",2904],"tlw":["alt",2353],"trw":["lagt",315],"lp":["alt","fl","tal","fol","fal","talt","gla","alti","alv","gav","fla","folg","atio","flo","folt"],"rp":["lag","lav","lof","loft","lf"]},"106":{"input":[2,4,6,7],"tlp":["sig",18329],"trp":["lst",1082],"tlw":["sig",13498],"trw":["livs",105],"lp":["sig","gik","stil","sigt","vilk","stol","gvis","skov","slog","sov","tils","stig","vok","vikl","voks"],"rp":["lst","kov","lts","isto","ilst"]},"107":{"input":[1,2,4,6,7],"tlw":["folk",871],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["vor",11354],"trp":["ige",17245],"tlw":["eller",3955],"trw":["over",5694],"lp":["vor","elig","rl","elv","rig","rli","rlig","vel","elt","gle"],"rp":["ige","ove","ler","lige","over","lev","ller","live","let","lte"]},"109":{"input":[1,3,4,6,7],"tlw":["tale",1118],"trw":["lave",376],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["selv",3736],"trw":["lidt",2473],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["aldrig",1646],"trw":["lagde",628],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["hu",19153],"trw":["hun",14886],"lp":[],"rp":["hu","ho","hun","ul","lu","hol","lin","ion","nl","nol","nolo","nli","uli","ull","llin","lun","oh","hoi","hul","uh"]},"113":{"input":[1,5,6,7],"tlp":["anl",545],"trp":["lan",8187],"tlw":["alanzo",70],"trw":["hal",31],"lp":["anl","anli","anal","alin","alan","anla"],"rp":["lan","hal","lau","nal","llan","oha","ohan","nla","olau","laan","lina","hali","onal","nzo"]},"114":{"input":[2,5,6,7],"tlp":["sku",5017],"trp":["ku",16083],"tlw":["suk",140],"trw":["kun",2632],"lp":["sku","skul","slu"],"rp":["ku","kun","kul","uk","nok","hoj","kon","kunn","kno","hus","knol","ukk","hos","kjo","jl","luk","lukk"]},"115":{"input":[1,2,5,6,7],"tlw":["slank",25],"trw":["nikola",431],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["eho",625],"trp":["ly",6399],"tlw":["ellen",583],"trw":["hele",1963],"lp":["eho","enl","elen","enli"],"rp":["ly","hel","len","yl","hele","llen","hell","ulle","ule","ione","olen","lene","nel","niel","line","lyn"]},"117":{"input":[1,3,5,6,7],"tlw":["alene",617],"trw":["hallen",39],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["skulde",2683],"trw":["kunde",4358],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["sjael",328],"trw":["land",483],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["bl",19380],"trp":["ing",14039],"tlw":["blot",846],"trw":["lob",434],"lp":["bl","bli","bliv","blo","gh","tilb","ting","bil"],"rp":["ing","hvo","ning","lb","igh","hov","ilb","ligh","nlig","nogl","ling","hvil"]},"121":{"input":[1,4,5,6,7],"tlw":["blaa",246],"trw":["langt",805],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["blik",653],"trw":["hojt",407],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["ansigt",951],"trw":["langs",456],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["blev",4782],"trw":["hvor",4842],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["tilbage",1940],"trw":["laenge",871],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["teknologi",565],"trw":["holdt",1084],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["ganske",1214],"trw":["hvordan",1085],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trp":["pp",3391],"trw":["p",397],"lp":[],"rp":["pp"]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",2081],"trp":["pa",29683],"trw":["paa",14960],"lp":["ap","app","apa"],"rp":["pa","paa","pap","papa"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",6812],"trp":["ps",284],"lp":["sp","ssp"],"rp":["ps"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["spa",699],"trp":["pas",1008],"trw":["pas",96],"lp":["spa","asp","aspa","aps","spaa"],"rp":["pas","pass","psa","paas"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",1393],"trp":["pe",8158],"trw":["'",36],"lp":["ep","epp","eppe","e'","epe"],"rp":["pe","ppe","'e","pee","pep"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["a'",769],"trp":["pae",506],"tlw":["a'",18],"trw":["pae'",18],"lp":["a'","appe","aep","aepp","aa'","a'e","ae'"],"rp":["pae","pae'"]},"134":{"input":[2,3,8],"tlp":["spe",642],"trp":["ped",539],"lp":["spe","dsp","esp","espe","sep","s'","dp","es'","dep","depe","edp","dpe","edpe","desp"],"rp":["ped","pede","pd","pped","pes","pess"]},"135":{"input":[1,2,3,8],"tlp":["spae",341],"trp":["pda",378],"tlw":["saa'",120],"trw":["passe",116],"lp":["spae","saa'","spad","sa'","aspe","wes'","da'","da'e"],"rp":["pda","pad","paed","pads","peda","pda'","pade","psae"]},"136":{"input":[4,8],"trp":["pt",1019],"trw":["pt",16],"lp":[],"rp":["pt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["apt",205],"trp":["pf",375],"lp":["apt","apta","tap","tapp"],"rp":["pf","pta","pfa","pfat","pat","paat","paaf","paf","pafa"]},"138":{"input":[2,4,8],"trp":["pst",120],"lp":[],"rp":["pst"]},"139":{"input":[1,2,4,8],"tlp":["casp",50],"trp":["past",205],"lp":["casp","cap","fsp","afsp"],"rp":["past","psta"]},"140":{"input":[3,4,8],"tlp":["rp",670],"trp":["pr",5960],"tlw":["er'et",22],"trw":["per",374],"lp":["rp","erp","rep","rpt","epr","ept","tep","rpe"],"rp":["pr","per","pper","pet","pre","'r","ppet","pete","'er","pere","ptr","pte"]},"141":{"input":[1,3,4,8],"tlp":["rap",388],"trp":["pra",1908],"tlw":["ta'r",85],"trw":["par",1154],"lp":["rap","rapp","rpa","trap","rpaa","taep","arp","erpa","a'r","ta'","apr","arpt","ta'r"],"rp":["pra","par","prae","part","pare","para","ptra"]},"142":{"input":[2,3,4,8],"tlp":["spr",1019],"trp":["pers",530],"tlw":["spredte",60],"trw":["peder",77],"lp":["spr","derp","sper","spre","spec","step","sept","resp","dspr","rsp","ersp","rspe","cep","ccep","cept"],"rp":["pers","pres","pred","pec","pdr"]},"143":{"input":[1,2,3,4,8],"tlw":["derpaa",245],"trw":["praest",184],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["mm",16277],"trw":["m",548],"lp":[],"rp":["mm","mp","nm","mn","pm","np","pn"]},"145":{"input":[1,5,8],"tlp":["am",21010],"trp":["ma",29964],"tlw":["anm",32],"trw":["man",5955],"lp":["am","amm","amp","anm","anma","ama","aam","aama"],"rp":["ma","man","maa","nma","pan","maan","nap","pma","paan","mann","mma","mman"]},"146":{"input":[2,5,8],"tlp":["sm",5093],"trp":["ms",1840],"tlw":["sms",12],"lp":["sm","sms"],"rp":["ms","nsp","msp","jm","jsp","mps","pj","nsm"]},"147":{"input":[1,2,5,8],"tlp":["sam",5398],"trp":["mas",938],"tlw":["smaa",567],"trw":["maj",88],"lp":["sam","samm","sma","smaa","saam","sman","ams","span","asm","sama","sams","amsp","ansp"],"rp":["mas","maas","mass","maj","jam","mans","jamm"]},"148":{"input":[3,5,8],"tlp":["em",22268],"trp":["me",73368],"tlw":["emne",22],"trw":["men",13807],"lp":["em","emm","emme","emp","empe","eme"],"rp":["me","men","mme","mmen","nem","nnem","menn","pen","mpe","mene","ppen","my","nemm","yp"]},"149":{"input":[1,3,5,8],"tlp":["amme",5549],"trp":["mae",3778],"tlw":["examen",40],"trw":["mae",475],"lp":["amme","ame","ema","aem","ampe","aemp","amen","emae","amae","eman","aemm","emma","aame","enpa"],"rp":["mae","maen","paen","pmae","naep","mane"]},"150":{"input":[2,3,5,8],"tlp":["dem",5798],"trp":["med",23442],"tlw":["dem",5668],"trw":["med",20679],"lp":["dem","sme","dm","sem","semp","spej","ems","smed"],"rp":["med","mens","jem","mede","mes","mmed","jemm","mend","pej","jdsp","mped","medd"]},"151":{"input":[1,2,3,5,8],"tlw":["samme",1733],"trw":["mand",1898],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["tm",86],"trp":["mt",4208],"lp":["tm","bm"],"rp":["mt","mb","pb","ptb"]},"153":{"input":[1,4,5,8],"tlp":["amt",793],"trp":["maat",1392],"trw":["mat",54],"lp":["amt","fam","amta","tam","tamm","amf","amb","fm","afm","fma"],"rp":["maat","mat","mf","matt","mta","mfa","mant","napt","mfan","mfat"],"special":"numsym"},"154":{"input":[2,4,5,8],"tlp":["cm",207],"trp":["mst",1374],"tlw":["cm",207],"lp":["cm","bsm"],"rp":["mst","mc","mtj","mcn"]},"155":{"input":[1,2,4,5,8],"tlw":["samt",115],"trw":["pjat",14],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["rm",5355],"trp":["mer",8012],"tlw":["type",59],"trw":["mere",2523],"lp":["rm","rem","rme","tem","emt","erm","erme","temm","rmen","rmer","temt","remm"],"rp":["mer","mmer","mere","met","mte","mr","mmet","ment"]},"157":{"input":[1,3,4,5,8],"tlw":["frem",1987],"trw":["maatte",1220],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["stemme",569],"trw":["mest",560],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["fremmede",219],"trw":["praesten",235],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"|","trp":["pi",3860],"lp":[],"rp":["pi","ip","ipp","ppi"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["api",492],"trp":["papi",191],"lp":["api"],"rp":["papi","ipa"]},"162":{"input":[2,6,8],"tlp":["spi",1676],"trp":["pis",540],"trw":["pis",22],"lp":["spi","spis","skip","sspi"],"rp":["pis","pisk","isp","kip","kipp","ips","ksp","pik","psi"]},"163":{"input":[1,2,6,8],"trp":["kap",494],"trw":["pak",15],"lp":[],"rp":["kap","kapi","pak","pakk","kapp","paak","ipas"]},"164":{"input":[3,6,8],"tlp":["epi",89],"trp":["ippe",551],"lp":["epi"],"rp":["ippe","i'","i'e","ipe"]},"165":{"input":[1,3,6,8],"tlp":["zep",15],"trp":["paei",16],"lp":["zep","azep","zepi","z'"],"rp":["paei"]},"166":{"input":[2,3,6,8],"tlp":["spid",136],"trp":["pise",257],"tlw":["spise",140],"trw":["piskede",12],"lp":["spid","spek","espi","eksp","si'","si'e"],"rp":["pise","pek","idsp","pid","pids","peki","ispe","ksep","kep","kkep","kspe","kepe","kepi"]},"167":{"input":[1,2,3,6,8],"tlw":["ska'",27],"trw":["pakke",52],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["vip",54],"trp":["pit",385],"lp":["vip","vipp"],"rp":["pit","pti","ipt"]},"169":{"input":[1,4,6,8],"tlp":["apit",301],"trp":["pav",149],"tlw":["fip",43],"lp":["apit","fip"],"rp":["pav","pati","pita","pavi","pfi"]},"170":{"input":[2,4,6,8],"tlp":["spit",84],"trp":["pist",182],"tlw":["spist",45],"lp":["spit","cip","vsp","scip","tisp"],"rp":["pist"]},"171":{"input":[1,2,4,6,8],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["rip",58],"trp":["pri",1094],"tlw":["vipper",20],"trw":["itt'",73],"lp":["rip","repi","ript","trip","ripp","vep","rvep","vepr"],"rp":["pri","pir","pite","peri","pire","priv","i'r","itt'","piri","i'er","prie","ipte"]},"173":{"input":[1,3,4,6,8],"tlw":["appetit",14],"trw":["papir",90],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["spiste",89],"trw":["pris",129],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["skarpt",108],"trw":["praksis",264],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["mi",24076],"trw":["min",4554],"lp":[],"rp":["mi","min","im","imi","him","mh","ph","imm","pin","imp","mni","mnin","himm","hm","phi","mpi","mini","nim","mim","imim"]},"177":{"input":[1,5,6,8],"tlp":["ami",472],"trp":["ham",8353],"trw":["ham",8026],"lp":["ami","aim","amin"],"rp":["ham","iam","ima","hamm","mia","mai","pha","iman","phan","pani","imia","mian","hamp","mha","hima","pina","mani"]},"178":{"input":[2,5,6,8],"tlp":["smi",1181],"trp":["mis",825],"trw":["km",70],"lp":["smi","sim","simp","spin","ssim","simi"],"rp":["mis","mk","imis","msi","miss","km","misk","ism","phis","pink","kim","mspi","mism","msk"]},"179":{"input":[1,2,5,6,8],"tlw":["skam",117],"trw":["knap",168],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["emni",182],"trp":["ime",1615],"trw":["mine",1330],"lp":["emni","eph","empi","ephi"],"rp":["ime","mine","mhe","meni","imme","imen","hem","hemm","impe","menh","phe","mhy","hyp","hypp","yppi","meph"]},"181":{"input":[1,3,5,6,8],"trw":["ha'",99],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["spidsen",62],"trw":["hjem",1079],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["eksamen",41],"trw":["maske",618],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tim",1144],"trp":["mit",1681],"trw":["mit",1681],"lp":["tim","timi","tmi","tmin","vim","vimm","vm","timm"],"rp":["mit","mti","ptim","imt","pib","mv","ntim","pint","itim","mvi","mvit","nvip"]},"185":{"input":[1,4,5,6,8],"tlw":["timian",19],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["capitain",20],"trw":["knapt",41],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["timer",267],"trw":["hvem",785],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["varme",252],"trw":["marie",351],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["derhjemme",61],"trw":["mennesker",759],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["danmark",309],"trw":["maerke",366],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["op",11049],"trw":["op",5000],"lp":[],"rp":["op","po","opp","ppo","pop"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["appo",13],"trp":["opa",178],"lp":["appo","apo"],"rp":["opa"]},"194":{"input":[2,7,8],"tlp":["spo",1107],"trp":["pos",203],"lp":["spo","sop"],"rp":["pos","ops","osp","pso","opso"]},"195":{"input":[1,2,7,8],"trp":["opsa",25],"lp":[],"rp":["opsa","opas"]},"196":{"input":[3,7,8],"trp":["oppe",1153],"trw":["oppe",424],"lp":[],"rp":["oppe","o'","p-","poe","-p","o'e","p-p","ope"]},"197":{"input":[1,3,7,8],"trp":["opae",16],"lp":[],"rp":["opae"]},"198":{"input":[2,3,7,8],"tlp":["dsop",23],"trp":["opd",408],"trw":["pose",26],"lp":["dsop"],"rp":["opd","pose","poes"]},"199":{"input":[1,2,3,7,8],"trw":["opad",89],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["top",1156],"trp":["opt",558],"tlw":["top",127],"trw":["optog",47],"lp":["top","topp","gp","gpo"],"rp":["opt","pg","opg","pog","pto","opto","ptog","pot","pott"]},"201":{"input":[1,4,7,8],"tlp":["gpa",17],"trp":["opf",375],"lp":["gpa"],"rp":["opf","pga","opga","opta","ptag","opfa","pfo","opfo","pag","pagt","paga"]},"202":{"input":[2,4,7,8],"tlp":["stop",344],"trp":["opst",120],"tlw":["spog",51],"trw":["post",48],"lp":["stop","spog","gsp","spot","sopg","cop"],"rp":["opst","post","psto","psog"]},"203":{"input":[1,2,4,7,8],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["rop",646],"trp":["pro",2431],"tlw":["toppe",42],"trw":["port",82],"lp":["rop","etop","ropp","gep","erop","epro"],"rp":["pro","por","porg","port","opr","peg","pege","prog","orp","o'r","optr","pore","opro","opre"]},"205":{"input":[1,3,4,7,8],"tlw":["fo'r",122],"trw":["proft",123],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["spor",199],"trw":["pegede",119],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"trw":["pastor",153],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["om",50261],"trw":["om",12169],"lp":[],"rp":["om","mo","omm","mu","um","pu","mun","up","umm","pun","mon","ump","omp","opm","umu","upp","pou","mum","mpu","ompu"]},"209":{"input":[1,5,7,8],"tlp":["amo",42],"trp":["opma",262],"trw":["opnaa",32],"lp":["amo","aamo","anmo","apon"],"rp":["opma","oma","uma","manu","oman","pau","opna","uman","umaa","omma","upa","upaa"]},"210":{"input":[2,5,7,8],"tlp":["som",21760],"trp":["oms",1497],"tlw":["som",18932],"trw":["moj",60],"lp":["som","spu","smu","somm","spun","smo","sum","smus","summ"],"rp":["oms","mus","nsom","jom","mos","moj","pus","ums","mons","usm","nspo"]},"211":{"input":[1,2,5,7,8],"tlw":["saasom",34],"trw":["mansson",22],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["en-m",111],"trp":["omme",6327],"trw":["-men",116],"lp":["en-m","emo","epu"],"rp":["omme","umme","-m","uppe","ume","umen","-me","-men","n-m","umpe","omne","ome","mue","pone","u-m","-mo","u-mo"]},"213":{"input":[1,3,5,7,8],"trw":["-man",13],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["dom",83],"trw":["mod",3477],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["somand",13],"trw":["pause",61],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["tom",486],"trp":["omt",1489],"tlw":["tom",108],"trw":["omt",46],"lp":["tom","tum","tomm","tomt","gm","gmo"],"rp":["omt","mog","mg","omg","pub","munt","put","mbo","mput","mob","omb","ombo","umt","mut"]},"217":{"input":[1,4,5,7,8],"tlw":["afmagt",13],"trw":["magt",215],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["stum",33],"trw":["pust",33],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["smag",71],"trw":["magnus",156],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["gennem",1130],"trw":["meget",3368],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["form",246],"trw":["mange",1787],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["spurgte",1168],"trw":["mogens",519],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["sprang",316],"trw":["professoren",159],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["pl",5364],"trw":["pol",19],"lp":[],"rp":["pl","pil","lp","pill","pol","opl","lip","poli","lipp","pli","poll","plo","oplo","ilp","opi","pio","poi","lop","lpi","ipl"]},"225":{"input":[1,6,7,8],"tlp":["alp",194],"trp":["pla",2683],"lp":["alp","alop","alpi"],"rp":["pla","lap","lapp","pal","opla","lpa","ilpa","pall","pala"]},"226":{"input":[2,6,7,8],"tlp":["spil",933],"trp":["klip",214],"tlw":["spil",117],"trw":["kop",75],"lp":["spil","slip","spl","skop","sopi","spio"],"rp":["klip","kop","kopp","ospi","posi","pok","pokk","lips","plos","plik","opsi","lsp","lspo","kopi"]},"227":{"input":[1,2,6,7,8],"tlw":["slap",211],"trw":["klap",35],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["elp",717],"trp":["ple",1132],"trw":["pille",26],"lp":["elp","elpe","epl","eple","epli"],"rp":["ple","lpe","pel","ople","plei","li'","lpel","pelo","-pl","p-pl","lpep","pepl","li'e","pole","p-i"]},"229":{"input":[1,3,6,7,8],"trw":["la'",18],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["spillede",190],"trw":["poesi",41],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["slappe",19],"trw":["plads",674],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["tilp",30],"trp":["pig",945],"trw":["pligt",89],"lp":["tilp"],"rp":["pig","opti","plig","pgi","opgi","pgiv","ppig","pov","povl","plov","plot","pigt","pitl"]},"233":{"input":[1,4,6,7,8],"tlw":["galop",20],"trw":["opgav",49],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"trw":["politik",54],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["tilpas",30],"trw":["plastisk",14],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"trw":["pige",386],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"tlw":["april",92],"trw":["opgave",78],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["spiller",111],"trw":["krop",196],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["vokseplads",34],"trw":["kapitel",248],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["ml",3277],"trw":["poul",218],"lp":[],"rp":["ml","mil","lm","lom","mul","imo","muli","plu","olm","holm","omh","lmi","lmin","mili","mli","iml","himl","oph","minu","lim"],"special":"enter"},"241":{"input":[1,5,6,7,8],"tlw":["alpina",16],"trw":["plan",125],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["smil",414],"trw":["kom",3720],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["william",837],"trw":["hjalp",126],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"trw":["mellem",1362],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["emmanuelo",70],"trw":["lampen",77],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["smilede",325],"trw":["komme",1447],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["samlede",209],"trw":["hjaelp",283],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"tlw":["glimt",79],"trw":["mig",8747],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["film",34],"trw":["pollnitz",127],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["smukt",214],"trw":["punkt",116],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["samling",60],"trw":["langsomt",369],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["glemt",197],"trw":["norholm",521],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["gamle",1533],"trw":["planter",359],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["blomster",490],"trw":["kommer",1590],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["samtidig",195],"trw":["plantes",218],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/de-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/de-keymap.json
new file mode 100644
index 00000000000..c85c9213e34
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/de-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",9644],"tlw":["a",672],"lp":["aa"],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",161786],"tlw":["s",320],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["as",267481],"tlw":["was",33174],"lp":["as","wa","sa","ass","was","wass","ssa","sw","asa","assa","saa","aw","swa","awa","sas","ssas","asw","saw","sawa"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",14304],"tlw":["e",8272],"lp":["ee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ea",6426],"lp":["ea","ex","ae","xa","ax","xe","exe","exa"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["de",603509],"tlw":["es",81182],"lp":["de","es","se","ed","sse","ese","ede","des","ess","esse","ses","eses","ds","dess","see","edes","sd","dee","dd","sess"],"rp":[]},"7":{"input":[1,2,3],"tlp":["da",270688],"tlw":["das",100677],"lp":["da","we","das","dass","ew","ad","asse","ewe","wes","ade","wese","ewes","esa","eda","dw","ewa","ase","essa","dwa","wed"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",129965],"tlw":["t",4870],"lp":["tt","ttt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["at",159129],"tlw":["tat",2050],"lp":["at","att","ta","fa","ft","ff","af","tat","aft","aff","tf","fft","tatt","tta","afft","fta","ffa","ata","ttf","taa"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["st",329949],"tlw":["st",194],"lp":["st","sc","ts","sst","tsc","ssc","tst","tts","tc","sts","ttst","ssts","stst","ct","cc","stc","cs"],"rp":[]},"11":{"input":[1,2,4],"tlp":["ac",129940],"tlw":["fast",4605],"lp":["ac","sta","tw","ast","twa","twas","asc","fas","fac","wac","sac","tsa","ca","fast","ats","asst","stat","fs","tas","atsa"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["er",1062516],"tlw":["er",139320],"lp":["er","te","re","rt","et","tte","ter","rte","tr","ere","ert","ete","tet","rr","erte","tete","rer","err","tter","tre"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ar",236202],"tlw":["trat",2331],"lp":["ar","ra","atte","fe","fr","ef","are","tra","fra","era","art","rf","ate","ffe","fre","arte","fer","ara","rat","ater"],"rp":[]},"14":{"input":[2,3,4],"tlp":["der",234317],"tlw":["der",139944],"lp":["der","ste","rd","rs","ers","rde","est","ec","rst","dr","erst","eder","ser","erd","ster","rc","dere","erde","sste","rsc"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["war",130034],"tlw":["war",76994],"lp":["war","wer","ware","rac","dar","etw","etwa","rw","werd","erw","dac","dara","dra","wart","star","rad","stra","fes","rwa","ras"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",160994],"trw":["n",114],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",368610],"trp":["na",94964],"tlw":["an",48407],"trw":["na",1852],"lp":["an","ann","ana","anna","aq","qq","aqq"],"rp":["na","nan","nna","nann","nq"]},"18":{"input":[2,5],"base":"j","baseshift":"J","tlp":["sn",476],"trp":["ns",79641],"trw":["j",60],"lp":["sn"],"rp":["ns","nns","nj"]},"19":{"input":[1,2,5],"tlp":["wan",16048],"trp":["ja",26608],"tlw":["wann",1025],"trw":["ja",12041],"lp":["wan","ans","san","anns","wann","ssan","anw","ansa","sna","aj"],"rp":["ja","nw","nas","nsa","jan","nwa","nass","nja","jann","jans"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",1123066],"trp":["ne",372242],"tlw":["en",15361],"trw":["nennen",573],"lp":["en","enn","ene","enen","enne","ey","een","eyn"],"rp":["ne","nen","nne","nnen","yn","ny","nee","nenn","nny","ye","ney","yen"]},"21":{"input":[1,3,5],"tlp":["ena",8169],"trp":["ya",3585],"trw":["nyx",188],"lp":["ena","anne","ane","ay","ean","anen","anny","enan","any","enna","xan","eq","aya","xen","exen"],"rp":["ya","yan","nea","yx","nyx"]},"22":{"input":[2,3,5],"tlp":["den",182183],"trp":["nd",429334],"tlw":["den",92856],"trw":["jeden",2171],"lp":["den","sen","end","ssen","ens","esen","ende","denn","eden","dene"],"rp":["nd","nde","je","nden","nes","jed","nse","jede","ndes","jen"]},"23":{"input":[1,2,3,5],"tlp":["and",91655],"trp":["ndw",5333],"tlw":["wenn",26017],"trw":["nase",1633],"lp":["and","ande","wen","dan","wenn","dann","wand","endw","edan","aden","sand","wend","dana","anda"],"rp":["ndw","nand","nwe","nda","nase","ndwa"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["bt",17983],"trp":["nt",123340],"tlw":["b",133],"lp":["bt","tb","tn","bb","bn","ttn"],"rp":["nt","nnt","nb","ntt","ntn","nntn","ntb","nnb"]},"25":{"input":[1,4,5],"tlp":["ab",110601],"trp":["nf",19807],"tlw":["ab",6161],"lp":["ab","ba","tan","ant","annt","fan","fn","anf","ffn","abt","ban","anft"],"rp":["nf","nfa","nat","nft","ntf","nab","nba","nta"]},"26":{"input":[2,4,5],"tlp":["bs",13819],"trp":["nst",18313],"lp":["bs","bst","bsc","sb","tj","stb","bj","bc","bstb"],"rp":["nst","nsc","nc","nts","ntsc","nnst","ntst","nnsc","nstb","nsb","nnts"]},"27":{"input":[1,2,4,5],"tlp":["stan",16933],"trp":["nac",40467],"tlw":["sanft",880],"lp":["stan","antw","bw","anc","abs","bac","anac","ansc","sanf","anst","absc","abw","stab","sab","abst"],"rp":["nac","ntw","nfac","jac","nsta"]},"28":{"input":[3,4,5],"tlp":["be",315569],"trp":["nte",72977],"tlw":["bett",2066],"trw":["neben",3915],"lp":["be","ten","ber","ren","ben","eb","rn","ern","br","ebe","ent","eben","rb","eren","tten","tern"],"rp":["nte","ner","nnte","nter"]},"29":{"input":[1,3,4,5],"tlp":["abe",79213],"tlw":["aber",39696],"lp":["abe","aber","fen","ran","aren","aben","bra","ffen","bar","arb","arbe","bef","aten","aran","fern","fne","enf","ffne","ary","arry"],"rp":[]},"30":{"input":[2,3,4,5],"tlp":["rden",23780],"trp":["nder",38861],"tlw":["ersten",3262],"trw":["jeder",2456],"lp":["rden","bes","sten","rend","ensc","best","dern","ents","bed","enst","bess","bend","enc"],"rp":["nder","jet","nser","nste","ndet","nce","ndt"]},"31":{"input":[1,2,3,4,5],"tlw":["waren",18283],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",157],"trw":["i",123],"lp":[],"rp":["ii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["zi",20813],"trp":["ia",9362],"tlw":["z",118],"lp":["zi","za","ai","az","zz","azi","aza","zzi","aia","zza","azz"],"rp":["ia","iz","izi","izz","izzi","izza"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["si",316897],"trp":["is",130177],"trw":["is",168],"lp":["si","ssi","sk","sik","sis","ski"],"rp":["is","iss","ki","ik","ks","kk","isi","isk","kis","isik","kiss","issi","iski","ksi"]},"35":{"input":[1,2,6],"tlp":["wi",167420],"trp":["ka",56299],"trw":["kai",169],"lp":["wi","zw","wis","zwi","wiss","zwis","ak","zwa","assi","sz","zis","asi","zs","ais"],"rp":["ka","ksa","kw","kz","isa","kas"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",652619],"trp":["ie",651532],"tlw":["ei",176],"lp":["ei","eie","eei","eiei"],"rp":["ie","iei"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["ze",61436],"trp":["ize",965],"lp":["ze","zei","zie","ez","eze","ezei","xi","eza","exi","ezi","eiz","axi","ezie","zzie","azie","eize"],"rp":["ize","izie","izei","ix"]},"38":{"input":[2,3,6],"tlp":["di",276515],"trp":["ke",89577],"tlw":["die",198925],"trw":["idee",1017],"lp":["di","die","sie","sei","dies","eis","eid","ek","esi","dei","eide"],"rp":["ke","ies","kei","id","iese","ied","iede","ide","ise"]},"39":{"input":[1,2,3,6],"tlp":["wie",72674],"tlw":["wie",48051],"trw":["kase",144],"lp":["wie","wei","wied","zwe","zwei","weis","wid","wide","ewi","daz","eka","wies","zd","zde","dwi","ewis","ake","dwie","zes","ewei"],"rp":[]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",64747],"trp":["it",174613],"tlw":["v",67],"lp":["ti","vi","tti","tit","tv","tiv","viv","vivi","vt","vit"],"rp":["it","itt","iti","iv","ivi","itiv"]},"41":{"input":[1,4,6],"tlp":["tz",57975],"trp":["if",14792],"tlw":["fitz",198],"lp":["tz","zt","tzt","fi","va","atz","av","vat","fz","ati","fti","afti","fzt","tia","zit"],"rp":["if","itz","iff","ita","ift"]},"42":{"input":[2,4,6],"tlp":["sic",113216],"trp":["ic",528821],"tlw":["vick",133],"trw":["ist",43418],"lp":["sic","ck","sti","ckt","tis","tisc","sit","cks","ckk","ci"],"rp":["ic","ist","kt","ick","isc","ickt","its","kti","issc","isti"]},"43":{"input":[1,2,4,6],"tlp":["wisc",7325],"trp":["kat",4899],"tlw":["satz",590],"trw":["katsa",541],"lp":["wisc","ack","wic","sitz","ackt","akt","satz","tak","wit","stia","asti","akti","cksa","twi","sack","fis","fisc"],"rp":["kat","katz","kaf"]},"44":{"input":[3,4,6],"tlp":["ri",94871],"trp":["ir",113010],"tlw":["vier",1685],"lp":["ri","ve","ver","eit","rei","eite","vie","rie","eri","tie","tei","reit","rit","tri"],"rp":["ir","ier","ite","itte","iter","iert"]},"45":{"input":[1,3,4,6],"tlp":["rz",29091],"trp":["ief",12679],"tlw":["zeit",6744],"lp":["rz","etz","etzt","erz","zte","tze","tzte","zeit","rze","eif","vate","tief","rif","arz","rief","riff","fie","eife"],"rp":["ief","ife"]},"46":{"input":[2,3,4,6],"tlp":["rk",34305],"trp":["kte",27132],"tlw":["dir",10511],"lp":["rk","eic","vers","erk","cke","ckte","eck","dic","ric","dir","seit","esic","eckt","ris","reic"],"rp":["kte","kr","ird","irk","iste"]},"47":{"input":[1,2,3,4,6],"tlw":["wir",29431],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["in",659187],"trw":["in",95638],"lp":[],"rp":["in","ni","ih","hi","hn","ihn","hin","inn","ini","nh","hni","hh","nni","nin","nih","inh","inni","hnh","inin","hinn"]},"49":{"input":[1,5,6],"tlp":["ah",76442],"trp":["ha",235199],"tlw":["ah",759],"trw":["nah",453],"lp":["ah","anz","zah","ahn","ani","ahi"],"rp":["ha","nz","han","nah","inz","ina","nzi","inzi","haa","hina","inan","ian","hna","hz"]},"50":{"input":[2,5,6],"tlp":["sin",16409],"trp":["nk",38114],"tlw":["sinn",805],"trw":["ins",5955],"lp":["sin","sh","shi","sinn"],"rp":["nk","ins","hs","kin","kn","nis","ink","nsi","kni","hk","ish","nks","nik","kh","niss","hns"]},"51":{"input":[1,2,5,6],"tlp":["wah",16237],"trp":["hw",26859],"tlw":["sah",11589],"trw":["kann",10392],"lp":["wah","sah","ank","win","sha","wanz"],"rp":["hw","kan","kann","has","hwa","jah","hwi","hwan","hwin","insa","inw","nzw","inzw","nzwi"]},"52":{"input":[3,5,6],"tlp":["ein",403963],"trp":["ine",235416],"tlw":["ein",66637],"trw":["ihnen",10635],"lp":["ein","eine","eh","ehe","ehen","eni"],"rp":["ine","he","hen","inen","hie","hne","hei","nie","ien","hnen","ihne","inne","nei","nein"]},"53":{"input":[1,3,5,6],"tlp":["zen",18592],"trp":["nze",12641],"tlw":["zehn",1114],"trw":["nahe",2024],"lp":["zen","ahe","anze","eha","einz","eina","zeh","zieh","zehn","ahne","ahen","enz","enze","anie"],"rp":["nze","nahe","nzen","inze","hze","hzei"]},"54":{"input":[2,3,5,6],"tlp":["sein",76189],"trp":["ind",34029],"tlw":["sein",25372],"trw":["keine",11161],"lp":["sein","seh","sehe","sind","dein","enk","din","denk","eseh","eins","enke"],"rp":["ind","ken","kein","nke","inde","ines","nken","iden","kenn"]},"55":{"input":[1,2,3,5,6],"tlw":["wissen",4749],"trw":["hand",7972],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["bi",40682],"trp":["ht",252865],"tlw":["bin",8228],"lp":["bi","bin","th","bit","bitt","tin","thi"],"rp":["ht","int","ib","hint","hti","ibt","hnt","nit","nti","nv","htb","hnit","nitt"]},"57":{"input":[1,4,5,6],"tlp":["fin",11249],"trp":["hat",98724],"tlw":["zantini",146],"trw":["hat",19760],"lp":["fin","fah","tha","fh","ahnt","tian"],"rp":["hat","hatt","hab","haf","inf","infa","haft","habt","haff","hif","hiff","htba","nzt","hatz"]},"58":{"input":[2,4,5,6],"tlp":["ch",1037218],"trp":["ich",501099],"tlw":["sich",92744],"trw":["ich",126388],"lp":["ch","cht","sch","sich","chi","bis","schi","chts","chn","chs","schn","chti"],"rp":["ich","icht","nic","nich","isch","hts","nsch","hst"]},"59":{"input":[1,2,4,5,6],"tlw":["ach",1398],"trw":["nach",23041],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["bei",38768],"trp":["hr",166493],"tlw":["einer",16300],"trw":["ihr",34974],"lp":["bei","ehr","rin","rh","erh","eht","teh"],"rp":["hr","ihr","hre","hte","her","ihre","iner","hren","ieb","hier","inte","hrer","hten"]},"61":{"input":[1,3,4,5,6],"tlw":["arbeit",1479],"trw":["hatte",62837],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["dich",11521],"trw":["nickte",3237],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["wahrend",7160],"trw":["jetzt",12900],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",2552],"trw":["o",417],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","tlp":["ao",544],"trp":["oa",1055],"lp":["ao"],"rp":["oa"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",96770],"trp":["os",26972],"tlw":["so",35536],"lp":["so","sso","sos"],"rp":["os","oss","oos"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["wo",62062],"trp":["ow",3659],"tlw":["wo",7187],"lp":["wo","sow","woo","sowo","aos","swo","wow","aso","soa","woa","awo","sao"],"rp":["ow","osa","owa","owo","osw","osas"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["eo",4452],"trp":["oe",1221],"trw":["-",5881],"lp":["eo","e-"],"rp":["oe","-o","-e"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["a-",546],"trp":["ox",233],"lp":["a-"],"rp":["ox","-a","oxa","oxe"]},"70":{"input":[2,3,7],"tlp":["do",34031],"trp":["od",27025],"tlw":["dose",88],"lp":["do","eso","edo","sod","esso","deo","ddo","s-","s-o","soe","dos"],"rp":["od","ode","ose","osse","ood","-s","odes","ods","odo"]},"71":{"input":[1,2,3,7],"tlp":["ewo",5402],"trp":["oda",1427],"tlw":["sodass",1096],"lp":["ewo","dwo","soda","wood","sowe","ado","wod"],"rp":["oda","odas","owe","-w","-we","oswe","owes"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["gt",75665],"trp":["ot",33072],"tlw":["tot",1524],"trw":["otto",56],"lp":["gt","to","go","tot","tg","got","gott","gg","tto","gto","ttg"],"rp":["ot","og","ott","oot","oto","otto","ogo","ogg","ottt"]},"73":{"input":[1,4,7],"tlp":["ag",98104],"trp":["of",22112],"tlw":["tag",3421],"trw":["oft",1577],"lp":["ag","ga","agt","fo","tag","fg","fot","ago","fga","ttag","foto","tof","foa","gf"],"rp":["of","off","oga","ofo","oft","offt"]},"74":{"input":[2,4,7],"tlp":["gs",15827],"trp":["oc",76156],"tlw":["sto",607],"lp":["gs","sto","gst","sg","sog","co","toc","stoc","tos","gc","sgc","gos","goss"],"rp":["oc","ost","ots","osc","oots","otsc","otos"]},"75":{"input":[1,2,4,7],"tlp":["sag",41908],"tlw":["sagt",3037],"lp":["sag","sagt","two","sof","soga","sofo","gsa","wag","woc","gas","ags","gast","gw","agst","wagt","stof","aco","asto","stag","sags"],"rp":[]},"76":{"input":[3,4,7],"tlp":["ge",417472],"trp":["or",139857],"tlw":["gro",12824],"trw":["ort",1465],"lp":["ge","eg","ro","gte","gr","ger","rg","ege","rge","geg","gro","erg","gege","egt","tro"],"rp":["or","ort","orte","ote","org"]},"77":{"input":[1,3,4,7],"tlp":["agte",36381],"trp":["offe",6976],"tlw":["fragte",8751],"lp":["agte","age","rag","gef","frag","ragt","gar","for","gera","rage","gefa","ega","fort","gra","fge","tage","fote","trag"],"rp":["offe","ogar"]},"78":{"input":[2,3,4,7],"tlp":["ges",52897],"trp":["oder",15264],"tlw":["dort",4958],"trw":["oder",15082],"lp":["ges","doc","gesc","gest","gese","ged","dor","roc","dort","sor","sorg","sge","ros","stor","tod","rges"],"rp":["oder","ord","orde","ors"]},"79":{"input":[1,2,3,4,7],"tlw":["sagte",25887],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["un",390483],"trw":["nun",5974],"lp":[],"rp":["un","on","nu","no","onn","nun","unn","ou","nno","non","nnu","nnun","ono","onno","uo","unno","uu","uun","unu","unun"]},"81":{"input":[1,5,7],"tlp":["au",303972],"trp":["nau",10174],"tlw":["au",5558],"lp":["au","aun","qu","qua","anu","annu","ano","quo"],"rp":["nau","ona","ua","una","oan","unan","onna","unna","uan","unau","oann","oana"]},"82":{"input":[2,5,7],"tlp":["su",18391],"trp":["us",129755],"tlw":["su",647],"trw":["uns",13571],"lp":["su","son","sons","sonn","sun","sus","ssu"],"rp":["us","uss","uns","ju","jun","ons","jo","nso","uso","jon","jus","ous","nos"]},"83":{"input":[1,2,5,7],"tlp":["aus",69449],"trp":["usa",6060],"tlw":["aus",34379],"trw":["jason",129],"lp":["aus","wu","wus","wuss","wun","auss","wuns","auso","sau","won","saus","assu","ausw","asu"],"rp":["usa","naus","ussa","unw","uw","usw"]},"84":{"input":[3,5,7],"tlp":["eu",55225],"trp":["ue",28283],"trw":["neue",1471],"lp":["eu","eue","enu","eun","eno","euen","enno"],"rp":["ue","onne","uen","neu","one","une","neue","onen","unen","n-","unne","oy","yo"]},"85":{"input":[1,3,5,7],"tlp":["aue",12361],"trp":["ux",957],"lp":["aue","enau","auen","aune","que","equ","eque","an-","ean-","eau","equa","eona"],"rp":["ux","uxa","onea","na-","nna-","naue","oya","uya"]},"86":{"input":[2,3,5,7],"tlp":["du",75774],"trp":["und",249565],"tlw":["du",44764],"trw":["und",220198],"lp":["du","dun","deu","eund","sond","esu","seu","edeu","don"],"rp":["und","unde","ud","ond","ude","use","usse","unse","onde","oden","jedo"]},"87":{"input":[1,2,3,5,7],"tlw":["sonea",505],"trw":["nasuada",322],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["tu",42893],"trp":["ng",148258],"tlw":["gut",8191],"trw":["ob",5684],"lp":["tu","gu","tun","bo","gut","bu","tung","gn","gun"],"rp":["ng","ut","ub","ung","ug","ob","onnt","unt","utt","nung","ngt"]},"89":{"input":[1,4,5,7],"tlp":["auf",98105],"trp":["uf",112428],"tlw":["auf",72050],"trw":["offnung",187],"lp":["auf","fu","ang","gan","aug","aut","aub","gab","tau","fun","gang","bau","aufg","atu"],"rp":["uf","uft","ufg","offn","unf","natu"]},"90":{"input":[2,4,5,7],"tlp":["stu",13806],"trp":["uc",97659],"tlw":["sonst",2451],"trw":["jung",472],"lp":["stu","suc","stun","buc","tuc","stuc"],"rp":["uc","noc","usst","ust","ngs","jung","ngst","usc","usg","onst","unsc","uts","ubs","utsc"]},"91":{"input":[1,2,4,5,7],"tlw":["angst",3094],"trw":["jacob",437],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["gen",136399],"trp":["ur",167807],"tlw":["gegen",5275],"trw":["nur",23303],"lp":["gen","ru","egen","geb","eut","rgen","run","tur"],"rp":["ur","nge","ube","uber","ute","ngen","nur","uge","unte","ugen","unge","uer"]},"93":{"input":[1,3,4,5,7],"tlw":["fur",24293],"trw":["offnete",1687],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["boden",4242],"trw":["junge",3404],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["wurde",25182],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["li",151710],"trw":["ol",121],"lp":[],"rp":["li","ll","ol","il","oll","lo","ill","io","lli","ili","llo","illi","olli","oli","lio","lil","ilo","oi","lili","olo"]},"97":{"input":[1,6,7],"tlp":["al",191580],"trp":["la",130568],"tlw":["all",2129],"trw":["lilia",446],"lp":["al","all","zo","zl","zli","ali","alli","ala","allz"],"rp":["la","lz","olz","lia","ola","liz","ila","oz","oliz","lla","llz"]},"98":{"input":[2,6,7],"tlp":["sol",18755],"trp":["ko",75943],"tlw":["soll",3129],"trw":["los",2861],"lp":["sol","soll","sl","sil"],"rp":["ko","ls","kl","los","kli","lls","lso","loss","lk","ok","olk","ills","klo","llk","lko","llko"]},"99":{"input":[1,2,6,7],"tlp":["als",59443],"trp":["las",17376],"tlw":["als",47093],"trw":["lass",1226],"lp":["als","wol","woll","wil","will","also","wal","alls","wolk","sal","sola","sowi","alas"],"rp":["las","lass","kla","kal","oka","owi","low"]},"100":{"input":[3,6,7],"tlp":["el",169112],"trp":["le",200448],"tlw":["eile",168],"trw":["lie",7334],"lp":["el","ell","eil","elle","ele","eile","eli"],"rp":["le","lle","lei","lie","iel","llei","olle","iell","iele","ile","ille","ilie","lee"]},"101":{"input":[1,3,6,7],"tlp":["alle",36348],"trp":["lze",595],"tlw":["alle",9095],"trw":["lizzie",239],"lp":["alle","ale","ela","zel","elz","ezo","ziel","zoe","ael","zell","ella","alee","eal"],"rp":["lze","lize","iela","oze","lzei","-al","-ali"]},"102":{"input":[2,3,6,7],"tlp":["sel",17287],"trp":["ld",21588],"tlw":["seele",607],"trw":["leise",2478],"lp":["sel","dl","eko","dli","del","eld","els"],"rp":["ld","kle","les","klei","lles","kel","lde","ild","leid","leis","old","ilde","lke"]},"103":{"input":[1,2,3,6,7],"tlw":["alles",9526],"trw":["lasse",483],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["vo",111639],"trp":["lt",103510],"tlw":["vollig",1315],"trw":["ig",1168],"lp":["vo","gl","gi","tig","tl","tli","gli","vol","voll"],"rp":["lt","ig","llt","ollt","igt","lg","olg","lig","ogl","lot","ogli"]},"105":{"input":[1,4,6,7],"tlp":["alt",26083],"trp":["lag",11095],"tlw":["zog",4180],"trw":["lag",3548],"lp":["alt","fl","fal","fall","gla","zog","zig","fol","folg","avo","tzl","fla","tzli","agi"],"rp":["lag","lf","lat","otz","latt","lotz"]},"106":{"input":[2,4,6,7],"tlp":["tlic",10135],"trp":["lic",83791],"tlw":["still",966],"trw":["lost",108],"lp":["tlic","cl","glic","ckl","gk","sig","solc","ckli","stil"],"rp":["lic","lick","klic","lc","ock","lst","olc","llst","igk","lsc","igs"]},"107":{"input":[1,2,4,6,7],"tlw":["willst",2074],"trw":["lasst",1485],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["vor",42281],"trp":["lte",70997],"tlw":["vor",22128],"trw":["legte",3034],"lp":["vor","elt","rl","erl","gel","viel","tel","elte","eig","rli","tell","eige","verl"],"rp":["lte","ige","llte","ler","ieg","leg","irg"]},"109":{"input":[1,3,4,6,7],"tlw":["fiel",2565],"trw":["letzte",1489],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["sollte",5278],"trw":["krieger",1798],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["wollte",8491],"trw":["klar",2511],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["hl",69806],"trw":["oh",1758],"lp":[],"rp":["hl","ho","lu","oh","uh","hu","ul","hon","ohn","hli","ln","uhl","ohl","hul","lin","nl","hol","hun","hlu","ion"]},"113":{"input":[1,5,6,7],"tlp":["zu",171648],"trp":["lan",36595],"tlw":["zu",106187],"trw":["hinzu",1319],"lp":["zu","ahl","zahl","azu","zun","zau","aul","anzu"],"rp":["lan","lau","hau","hal","hla","nzu","inau","hall","inzu","unz","hlan","iau"]},"114":{"input":[2,5,6,7],"tlp":["soh",2201],"trp":["kon",39622],"tlw":["sohn",1591],"trw":["john",638],"lp":["soh","sohn"],"rp":["kon","konn","ku","unk","lus","hlos","kun","koni","luss","uk","nkl","unkl","kus","klin","hos","link","kuss","luk"]},"115":{"input":[1,2,5,6,7],"tlw":["wohl",3262],"trw":["haus",3123],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["eln",9970],"trp":["len",34944],"trw":["ohne",6453],"lp":["eln","eho","elen"],"rp":["len","llen","lein","hel","hle","ohne","hiel","hlie","leu","nel","uhe","hlen","heu","ly","hnel","nell","ohe"]},"117":{"input":[1,3,5,6,7],"tlw":["allein",3101],"trw":["luxa",831],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["sollen",1705],"trw":["konnen",8192],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["dazu",3106],"trw":["lassen",4737],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["von",54263],"trp":["ing",35552],"tlw":["von",48992],"trw":["hob",2725],"lp":["von","bl","bli","gin","ging","bil","blu"],"rp":["ing","lb","nig","htig","hlt","hut","hob","lug","ntl","hig","onig","lut","ult"]},"121":{"input":[1,4,5,6,7],"tlw":["ganz",8095],"trw":["luft",3854],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["schon",15769],"trw":["noch",31550],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["auch",23263],"trw":["obwohl",3157],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["gehen",3878],"trw":["leben",6005],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["zur",7461],"trw":["lange",4757],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["doch",19379],"trw":["konnte",19700],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["zuruck",7484],"trw":["naturlich",3611],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trp":["pp",10101],"trw":["p",276],"lp":[],"rp":["pp"]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",9189],"trp":["pa",25493],"trw":["papa",249],"lp":["ap","app","apa","appa"],"rp":["pa","paa","pap","papa","ppa"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",35230],"trp":["ps",471],"lp":["sp","ssp"],"rp":["ps"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["spa",6529],"trp":["pas",4544],"tlw":["spa",543],"trw":["pass",277],"lp":["spa","sap","wap","wapp","aps","asp"],"rp":["pas","pass"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",4107],"trp":["pe",21955],"lp":["ep","epp","eppe","e'"],"rp":["pe","ppe","pee","'e"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["appe",1127],"trp":["px",233],"trw":["px",233],"lp":["appe","ape","epa","xp","exp","a'","eap"],"rp":["px"]},"134":{"input":[2,3,8],"tlp":["esp",4229],"trp":["'s",1830],"lp":["esp","spe","espe","sep","spee","s'","dsp","dspe","e's","dep","es'"],"rp":["'s","pes","peed"]},"135":{"input":[1,2,3,8],"tlp":["espa",426],"trw":["passe",61],"lp":["espa","dap"],"rp":[]},"136":{"input":[4,8],"tlp":["tp",1024],"trp":["pt",8640],"trw":["pt",821],"lp":["tp","ttp"],"rp":["pt","ppt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["appt",1143],"trp":["pf",28238],"trw":["pat",81],"lp":["appt","tap","apf","tpf","attp","ttpf","fp","tapf","apt","tapp","fpa","apft","apta","ffp"],"rp":["pf","pat","pft","pfa","pta"]},"138":{"input":[2,4,8],"tlp":["tsp",820],"trp":["pts",393],"lp":["tsp","stp"],"rp":["pts","ptst","pst"]},"139":{"input":[1,2,4,8],"tlp":["spat",3485],"trp":["pac",1868],"tlw":["spat",894],"trw":["passt",223],"lp":["spat","stap","cap","tspa","fpas","capt","fsp"],"rp":["pac","pfs","pfsc","ptsa","past"]},"140":{"input":[3,4,8],"tlp":["rp",4472],"trp":["pr",23900],"tlw":["treppe",1030],"trw":["peter",275],"lp":["rp","rpe","rper","rep","trep","repp","erp","ept","t'","r'"],"rp":["pr","per","pre","pte","ppte","pet","pert","peet","pete","ptet"]},"141":{"input":[1,3,4,8],"tlp":["rpf",493],"trp":["pra",7549],"tlw":["tapfer",173],"trw":["paar",4977],"lp":["rpf","erpf","apfe","rpa","erpa","apr","rap","tape","ar'","ra'"],"rp":["pra","pfe","paar","pfte","pate","pfer","par","patr","perf","part"]},"142":{"input":[2,3,4,8],"tlp":["spr",13156],"trp":["prec",3135],"tlw":["speer",150],"trw":["presste",522],"lp":["spr","spre","rsp","espr","ersp","rspr","t's","sper","sept","tspr","resp","r's","ce'"],"rp":["prec","pers","pres","pred","perc","perd","pec"]},"143":{"input":[1,2,3,4,8],"tlw":["spater",2320],"trw":["pferd",730],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["mm",75202],"lp":[],"rp":["mm","nm","mp","np","mn"]},"145":{"input":[1,5,8],"tlp":["am",75203],"trp":["ma",116805],"tlw":["am",13314],"trw":["man",13524],"lp":["am","amm","amp","ama","aman","anm"],"rp":["ma","man","mann","nma","nam","pan","nap","napp","pann","mma","mman","mam","mama","mna"]},"146":{"input":[2,5,8],"tlp":["sm",2006],"trp":["ms",3988],"tlw":["sms",84],"lp":["sm","ssm","sms"],"rp":["ms","mms","nsp","mj","nsm"]},"147":{"input":[1,2,5,8],"tlp":["sam",18083],"trp":["nsam",1490],"tlw":["sam",1544],"trw":["japan",53],"lp":["sam","samm","span","sma","asam","ams","ansp","sams","wam","wamm","ssam"],"rp":["nsam","mas","jam","mass","maj","mw","nspa","mja","mjan"]},"148":{"input":[3,5,8],"tlp":["em",142396],"trp":["me",172798],"tlw":["em",427],"trw":["'ne",199],"lp":["em","eme","emp","enp","enem","enpe"],"rp":["me","mme","men","nem","mmen","pen","ppen","mpe","my","mee","yp","npe","ym","mmy"]},"149":{"input":[1,3,5,8],"tlp":["ema",15399],"trp":["name",3654],"tlw":["amy",168],"trw":["namen",2293],"lp":["ema","ame","eman","amme","amen","ampe","aym","ampy","xem","eam","amy","enma","anme","emna","xeme"],"rp":["name","max","mae","may","maya"]},"150":{"input":[2,3,5,8],"tlp":["dem",54438],"trp":["mens",6613],"tlw":["dem",45085],"trw":["jedem",1143],"lp":["dem","sem","esem","emd","edem","emde","esm","djem","dm"],"rp":["mens","jem","md","mes","ndem","mde","mess","mden","mend","med","mmes"]},"151":{"input":[1,2,3,5,8],"tlw":["wem",425],"trw":["jemand",3073],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["tm",2485],"trp":["mt",14056],"lp":["tm","bm"],"rp":["mt","mmt","mb","ptm","mpt"]},"153":{"input":[1,4,5,8],"tlp":["ampf",3371],"trp":["mpf",5070],"tlw":["amt",94],"trw":["matt",200],"lp":["ampf","tam","amt","fam","ammt","tamm","atm","fm","tama","tma","tman"],"rp":["mpf","mat","mpft","npf","matt","mant","mpfa","pfan","ptma"],"special":"numsym"},"154":{"input":[2,4,5,8],"tlp":["stm",109],"trp":["mst",1918],"lp":["stm","bstm"],"rp":["mst","mmst","ntsp","msc","mmsc","mc","nstm"]},"155":{"input":[1,2,4,5,8],"tlw":["stamm",309],"trw":["mats",101],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["rm",24866],"trp":["mer",37720],"tlw":["typ",417],"trw":["mr",1767],"lp":["rm","rem","rme","tem","erm","emer","bem","beme","rmen","teme"],"rp":["mer","mmer","mte","ment","mmte","mr","met","mete","mbe","mert"]},"157":{"input":[1,3,4,5,8],"tlw":["arm",2393],"trw":["manner",2823],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["erdem",1712],"trw":["mrs",981],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["warme",548],"trw":["mandred",237],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"!","trp":["pi",11374],"lp":[],"rp":["pi","ip","ipp","ppi"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["api",2458],"trp":["papi",842],"trw":["pia",152],"lp":["api","aip","zip","zp","zap","zapp"],"rp":["papi","paz","pazi","pia","piz","pizz"]},"162":{"input":[2,6,8],"tlp":["spi",7019],"trp":["isp",965],"lp":["spi"],"rp":["isp","ispi","pis","kp","kip","kipp","ksp","kspi","ips"]},"163":{"input":[1,2,6,8],"tlp":["spaz",195],"trp":["kap",1913],"lp":["spaz","zsp","zspi","wisp","szip","szap"],"rp":["kap","kapi","kapp"]},"164":{"input":[3,6,8],"tlp":["eppi",167],"trp":["pie",5917],"lp":["eppi","eip"],"rp":["pie","ippe","pei","peie","ie'","ipe"]},"165":{"input":[1,3,6,8],"tlp":["apie",1000],"trp":["'z",210],"lp":["apie","zep","a'z","a'za","z'"],"rp":["'z","'za"]},"166":{"input":[2,3,6,8],"tlp":["spie",4741],"trp":["pek",382],"tlw":["spie",186],"lp":["spie","eisp","spek","spei","espi","skep","disp","sie'"],"rp":["pek","peis","kep","ispe","is'","ie's","idep","k'","k'e"]},"167":{"input":[1,2,3,6,8],"trw":["kappe",55],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["tip",377],"trp":["pit",3051],"tlw":["tippt",50],"lp":["tip","tipp"],"rp":["pit","pti","ippt","itp","ipt","piv"]},"169":{"input":[1,4,6,8],"tlp":["apit",1458],"trp":["pitz",1593],"trw":["pfiff",129],"lp":["apit","zpf","tzp","zapf"],"rp":["pitz","pfi","pita","pati","ipf","ptai","pfif","pav","pavi","patz"]},"170":{"input":[2,4,6,8],"tlp":["spit",1593],"trp":["pist",286],"lp":["spit","cksp"],"rp":["pist","pisc","pic","ppic","ptis","ktp"]},"171":{"input":[1,2,4,6,8],"tlw":["spitz",113],"trw":["packt",105],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["rip",838],"trp":["pri",3830],"tlw":["tippte",195],"lp":["rip","epti","ripr","verp","eitp","ripp","epri","ript"],"rp":["pri","pier","pite","prie","ipr","ipre","prei","ptie","peit","pir","prit","peti"]},"173":{"input":[1,3,4,6,8],"tlw":["appetit",109],"trw":["papier",621],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["ripred",581],"trw":["preis",373],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["spitze",616],"trw":["passiert",1606],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["mi",156924],"trw":["im",27050],"lp":[],"rp":["mi","im","hm","imm","ihm","inm","min","ph","him","himm","phi","hmi","nim","nimm","imn","mni","imni","mh","pin","nmi"]},"177":{"input":[1,5,6,8],"tlp":["ami",10941],"trp":["inma",7220],"tlw":["ahm",221],"trw":["nahm",4064],"lp":["ami","ahm","zim","zimm","aph","aphi"],"rp":["inma","nahm","hma","mia","mah","ham","ima","mani","pha","hnap","iam","pani","hamm","mz"]},"178":{"input":[2,5,6,8],"tlp":["sim",1838],"trp":["mis",4451],"tlw":["sims",60],"trw":["miss",415],"lp":["sim","sph","spin","smi"],"rp":["mis","miss","mk","mnis","imms","imk","mik","jim","jimm","ims","mij","mmis","nspi","hms","issm","mmk"]},"179":{"input":[1,2,5,6,8],"tlw":["asami",402],"trw":["kam",6230],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["einm",7220],"trp":["mei",39849],"tlw":["einem",21852],"trw":["meine",11395],"lp":["einm","eim","ehm","ehme","emei","emi"],"rp":["mei","mein","inem","imme","meh","hme","iem","nehm","niem","hmen","heim","mie","hem","mien"]},"181":{"input":[1,3,5,6,8],"tlw":["annehmen",189],"trw":["nahmen",491],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["seinem",7860],"trw":["meines",844],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["damien",281],"trw":["niemand",3087],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tim",12361],"trp":["mit",82241],"tlw":["tim",137],"trw":["mit",65945],"lp":["tim","timm","thm","thim"],"rp":["mit","mitt","immt","htm","nmit","hmit","hmt","ptim","mith","mitn","mitb","ntim","htip","itm","hitm","htp"]},"185":{"input":[1,4,5,6,8],"tlw":["tamani",796],"trw":["mattia",102],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"tlw":["stimmt",967],"trw":["mich",27002],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["wachmann",161],"trw":["macht",2965],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["beim",2845],"trw":["mir",28421],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["zimmer",2340],"trw":["prinz",511],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["stimme",5685],"trw":["menschen",4046],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["damit",7217],"trw":["machte",4587],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["op",16041],"lp":[],"rp":["op","po","opp"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["apo",54],"trp":["opa",519],"lp":["apo"],"rp":["opa"]},"194":{"input":[2,7,8],"tlp":["spo",569],"trp":["pos",794],"lp":["spo","sop"],"rp":["pos","osp","pso","ops"]},"195":{"input":[1,2,7,8],"lp":[],"rp":[]},"196":{"input":[3,7,8],"tlp":["eop",243],"trp":["oppe",220],"lp":["eop","epo"],"rp":["oppe","-p","ope"]},"197":{"input":[1,3,7,8],"tlp":["eopa",185],"lp":["eopa","xpo","expo"],"rp":[]},"198":{"input":[2,3,7,8],"tlp":["dop",158],"trp":["odsp",102],"lp":["dop","dopp"],"rp":["odsp","pose"]},"199":{"input":[1,2,3,7,8],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["top",1390],"trp":["pot",525],"lp":["top","topp","tpo"],"rp":["pot","pott","pto","ptop"]},"201":{"input":[1,4,7,8],"tlp":["tpfo",466],"trp":["opf",13450],"tlw":["topf",130],"lp":["tpfo","topf","apto"],"rp":["opf","pfo","pfot","opft","pag","pagg"]},"202":{"input":[2,4,7,8],"tlp":["stop",653],"trp":["post",447],"tlw":["spott",92],"trw":["post",110],"lp":["stop","spot","tpos"],"rp":["post","poc"]},"203":{"input":[1,2,4,7,8],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["rop",949],"trp":["pro",5714],"tlw":["reporter",63],"trw":["potter",173],"lp":["rop","gep","trop","gepr","g'","repo","epor","geop","tpro"],"rp":["pro","orp","orpe","por","port","-top","prot","prop","prog","pero","perg"]},"205":{"input":[1,3,4,7,8],"tlw":["tropfte",104],"trw":["pfote",449],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["gepresst",119],"trw":["perdor",186],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"tlw":["stopfte",111],"trw":["professor",480],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["um",81208],"trw":["um",30478],"lp":[],"rp":["um","mu","om","mo","omm","pu","up","mon","mom","umm","mun","nom","nomm","upp","pun","ump","unm","omp","nmo","unmo"]},"209":{"input":[1,5,7,8],"tlp":["aum",11931],"trp":["mau",2979],"trw":["mona",273],"lp":["aum","aup","amo","amon","amu","apu","ammo","aom","anmu"],"rp":["mau","pau","mona","oma","uma","omma","manu","naom","oman","pua","mano"]},"210":{"input":[2,5,7,8],"tlp":["spu",5447],"trp":["mus",23962],"trw":["muss",5445],"lp":["spu","som","sum","somm","summ","sup","smu","supp"],"rp":["mus","muss","ums","usp","mons","omms","mso","umso","mos","usm","moos","ussp"]},"211":{"input":[1,2,5,7,8],"tlw":["amos",143],"trw":["maus",230],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["enom",2575],"trp":["omme",15487],"trw":["neuem",121],"lp":["enom","emu","empo","emo","emon","epu","eum"],"rp":["omme","ome","omen","mome","ume","umme","umen","uppe","umpe","omy","uem","mone","pony"]},"213":{"input":[1,3,5,7,8],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["dumm",400],"trw":["mussen",4744],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["damon",348],"trw":["pause",441],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["tum",1365],"trp":["mut",9353],"tlw":["tom",616],"trw":["mut",548],"lp":["tum","tom","tumm","ttom"],"rp":["mut","mutt","mog","upt","ommt","mg","umg","omb","ummt","mung","nmog","mot","umb","umt","put","mott"]},"217":{"input":[1,4,5,7,8],"tlw":["baum",788],"trw":["mag",837],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["stumm",329],"trw":["musst",1824],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["anspannung",163],"trw":["magnus",226],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["genommen",1020],"trw":["mutter",5624],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["raum",1894],"trw":["magen",753],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["spurte",2360],"trw":["musste",7028],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["warum",5314],"trw":["umstanden",254],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["pl",9042],"lp":[],"rp":["pl","plo","lip","lipp","pol","poli","lop","lp","ilip","olp","pil","pli","pio","pilo","ipl","ipli","pill","opi","poll","ppl"]},"225":{"input":[1,6,7,8],"tlp":["zop",139],"trp":["pla",4483],"tlw":["apollo",54],"trw":["opal",202],"lp":["zop","zipl","apol","appl"],"rp":["pla","pal","lap","lapp","pala","opal","pliz","pilz","pila","ppla"]},"226":{"input":[2,6,7,8],"tlp":["spio",245],"trp":["kop",10195],"trw":["klops",60],"lp":["spio","spl","spli"],"rp":["kop","klop","posi","klip","kpl","ispl","plos","lops","kopi"]},"227":{"input":[1,2,6,7,8],"trw":["klaps",56],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["elp",361],"trp":["piel",3820],"trw":["lippe",146],"lp":["elp","epl"],"rp":["piel","pel","lpe","olpe","ppel","leop","ple","lep","lepp","-pi","-pie","l'","ll'","oll'","pell","'el","lpel","opie"]},"229":{"input":[1,3,6,7,8],"trw":["pelz",894],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["spiel",618],"trw":["klippe",159],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["speisesaal",104],"trw":["klappe",167],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["tolp",465],"trp":["plot",3683],"trw":["pilot",82],"lp":["tolp","gip","tpl"],"rp":["plot","pito","pig","ppig","plit"]},"233":{"input":[1,4,6,7,8],"tlw":["zopf",91],"trw":["platz",1840],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"trw":["politik",180],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["spalt",238],"trw":["kopf",9064],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"trw":["prior",72],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"tlw":["rappelte",154],"trw":["pfeil",312],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["spielte",526],"trw":["korper",2392],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["distelpfote",300],"trw":["kapitel",832],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["ml",4691],"trw":["philip",527],"lp":[],"rp":["ml","mli","mil","lm","lim","muh","imo","limm","mili","imon","hlim","minu","oph","umi","umin","hop","hmu","lum","llm","phil"],"special":"enter"},"241":{"input":[1,5,6,7,8],"tlw":["zum",13031],"trw":["mal",9722],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["simon",1611],"trw":["komm",1435],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["william",287],"trw":["kaum",3695],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"trw":["himmel",2108],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["einmal",7220],"trw":["plane",315],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["spielen",619],"trw":["kommen",3154],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["zusammen",3969],"trw":["niemals",1641],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"tlw":["vom",5596],"trw":["html",387],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["film",198],"trw":["umhang",262],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["schlimm",464],"trw":["kommt",2302],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["allmahlich",712],"trw":["plotzlich",3426],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["gemeint",376],"trw":["herum",2872],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["familie",1680],"trw":["uberhaupt",2569],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["gekommen",2443],"trw":["mochte",2710],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["gemacht",2597],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/en-colemak-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/en-colemak-keymap.json
new file mode 100644
index 00000000000..2e8c2b1431c
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/en-colemak-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",410],"tlw":["a",211837],"lp":["aa"],"rp":[]},"2":{"input":[2],"base":"r","baseshift":"R","tlp":["rr",29445],"tlw":["r",211],"lp":["rr"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["ar",265629],"tlw":["war",4160],"lp":["ar","wa","ra","aw","war","arr","wr","awa","ara","rw","raw","rar","rwa","rra","rwar","arra","awar","wra","warr","ww"],"rp":[]},"4":{"input":[3],"base":"s","baseshift":"S","tlp":["ss",89478],"tlw":["s",2993],"lp":["ss"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["as",286499],"tlw":["as",63759],"lp":["as","sa","ass","xa","ssa","ax","assa","asa","sas","saa","xas","ssas","sass","sax"],"rp":[]},"6":{"input":[2,3],"base":"f","baseshift":"F","tlp":["rs",105128],"tlw":["f",277],"lp":["rs","fr","ff","rf","sf","ssf","fs","sr","ssr","ffr","ffs"],"rp":[]},"7":{"input":[1,2,3],"tlp":["was",117615],"tlw":["was",112330],"lp":["was","fa","af","ars","ws","sw","far","fra","saw","aff","ras","fas","sar","rsa","ssar","saf","afr","aws","raf","rass"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",55910],"tlw":["t",670],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"p","baseshift":"P","tlp":["at",371419],"tlw":["at",51085],"lp":["at","ta","pa","ap","pp","app","pt","att","tat","pat","apt","apa","tta","atta","pap","pta","apta","patt","ppa","appa"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["rt",81050],"tlw":["c",872],"lp":["rt","tr","ct","cr","rc","cc","tc","ttr","ctr","rtr","rcr","rct"],"rp":[]},"11":{"input":[1,2,4],"tlp":["ca",118675],"tlw":["part",4589],"lp":["ca","ac","pr","art","par","act","tra","tw","rat","car","part","tar","rac","rta","cat","acc","rp","wat","ract","atc"],"rp":[]},"12":{"input":[3,4],"base":"d","baseshift":"D","tlp":["st",260669],"tlw":["st",798],"lp":["st","ts","ds","dd","sts","sd","dds","dst","tst","tts"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ad",140314],"tlw":["past",2353],"lp":["ad","da","sta","sp","ast","xp","ps","xt","pas","stat","sat","pass","add","spa","aps","dat","tas","past","ads","ats"],"rp":[]},"14":{"input":[2,3,4],"tlp":["rd",48242],"tlw":["dr",852],"lp":["rd","ft","dr","sc","str","rst","rds","rts","scr","cts","cs","tf","ddr","df","fts","cd","dsc","rsd","cst","fc"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["ard",26043],"tlw":["fact",3233],"lp":["ard","aft","fac","ward","star","stra","cas","fat","rad","fact","xc","dar","dra","sca","ards","rsta","draw","xtr","spr","fast"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",20957],"trw":["n",169],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"j","baseshift":"J","tlp":["an",578917],"trp":["na",51349],"tlw":["an",29559],"trw":["j",365],"lp":["an","ann","ana","aj","anna","aan"],"rp":["na","ja","nan","nj","nna","jan","nann"]},"18":{"input":[2,5],"base":"k","baseshift":"K","tlp":["rn",39425],"trp":["kn",27363],"trw":["k",182],"lp":["rn","rk","rkn"],"rp":["kn","nk","nr","nkn","kr","nkr"]},"19":{"input":[1,2,5],"tlp":["ak",39732],"trp":["ka",3991],"tlw":["ran",1611],"trw":["jr",190],"lp":["ak","wn","ran","wan","ark","ank","arn","rna","rank","rran","awn","aran","wak","warn","rawn","rka"],"rp":["ka","nar","nw","narr"]},"20":{"input":[3,5],"base":"m","baseshift":"M","tlp":["sm",13242],"trp":["ns",85305],"trw":["m",1273],"lp":["sm","sn","ssm"],"rp":["ns","ms","mm","nm","mn","nsm","nns","mns","mms"]},"21":{"input":[1,3,5],"tlp":["am",72035],"trp":["ma",137500],"tlw":["am",4235],"trw":["man",9572],"lp":["am","ans","sam","san","sma","asn","xam","ama","ams","xan"],"rp":["ma","man","nam","mas","mana","mma","mann","mman","maj","mass"]},"22":{"input":[2,3,5],"tlp":["rm",33028],"trp":["ks",14097],"trw":["mr",4133],"lp":["rm","sk","rms","rns","rks","rnm","sks","rkf","rkm"],"rp":["ks","nf","mr","mrs","nks","mf","kf","nsf","km","nfr","msf"]},"23":{"input":[1,2,3,5],"tlp":["ask",11409],"trp":["mar",15017],"tlw":["ask",2497],"trw":["mark",882],"lp":["ask","rma","arm","fam","rman","answ","wasn","ram","fran","fan","rans","arms","anks","warm","asks"],"rp":["mar","mak","mark","nsw","marr"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["bt",3003],"trp":["nt",218499],"tlw":["b",695],"lp":["bt","tn","bb","tb"],"rp":["nt","nb"]},"25":{"input":[1,4,5],"tlp":["ab",55519],"trp":["nat",11510],"tlw":["pan",150],"trw":["japan",279],"lp":["ab","ba","ant","tan","pan","tant","tab","ban","bab","bj","bat","batt","anta","apan","abb"],"rp":["nat","nta","nab","jap","japa"]},"26":{"input":[2,4,5],"tlp":["ck",51278],"trp":["nc",79565],"tlw":["bc",95],"lp":["ck","br","rb","rtn","ckn","rnt","bc","tk","ckb","tbr","ckt","cn","cb"],"rp":["nc","ntr","ncr","nct","kt","kb"]},"27":{"input":[1,2,4,5],"tlp":["can",27607],"trp":["ntra",2857],"tlw":["can",15149],"trw":["jack",1623],"lp":["can","ack","anc","tak","bac","back","want","bra","ranc","tanc","tran","bar","rtan","rab","cann","rant","tack"],"rp":["ntra","jac","jack"]},"28":{"input":[3,4,5],"tlp":["dn",14682],"trp":["nd",415919],"trw":["nd",119],"lp":["dn","bs","tm","dm","sb","stm","bst","db","bm","bts"],"rp":["nd","mb","nts","nds","nst","mst","ntm","mbs","ndm","ndn"]},"29":{"input":[1,3,4,5],"tlp":["and",307129],"trp":["mp",43386],"tlw":["and",266855],"trw":["mad",373],"lp":["and","stan","tand","ands","amp","dan","bas","ants","band","bad"],"rp":["mp","mat","mad","mpa","mpan","nda","matt","mpt","mand","nsta"]},"30":{"input":[2,3,4,5],"tlp":["cks",2772],"trp":["ndr",3159],"tlw":["cbs",76],"trw":["kd",65],"lp":["cks","rtm","ckm","rnst","fb","rmt","rdb","dk","bstr"],"rp":["ndr","nstr","nsc","mbr","ndf","mc","mcd","ndsc","mcc","ndk","ncts"]},"31":{"input":[1,2,3,4,5],"tlw":["dark",1865],"lp":[],"rp":[]},"32":{"input":[6],"base":"e","baseshift":"E","trp":["ee",129154],"trw":["e",471],"lp":[],"rp":["ee"]},"33":{"input":[1,6],"base":"q","baseshift":"Q","tlp":["ae",810],"trp":["ea",216643],"tlw":["q",103],"lp":["ae","aq"],"rp":["ea","eq","eea"]},"34":{"input":[2,6],"base":"z","baseshift":"Z","tlp":["re",464927],"trp":["er",558051],"tlw":["re",63],"trw":["er",80],"lp":["re","ree","ze","rre","reer","zz","rer","zer","reez"],"rp":["er","ere","err","eer","erre","ez","eez","eze","eeze","eere","erer"]},"35":{"input":[1,2,6],"tlp":["we",135334],"trp":["ear",54836],"tlw":["were",34909],"trw":["ear",427],"lp":["we","rea","are","wer","were","wee","wea","rew","az","req","za","wear","ware","area"],"rp":["ear","ew","era","eare","erw","ewe"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["se",231764],"trp":["es",259811],"tlw":["see",9997],"lp":["se","see","sse","ses","sses","sess","sees"],"rp":["es","ess","ese","esse","ees","eese"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["ase",11581],"trp":["ex",43940],"tlw":["sea",1374],"trw":["ease",378],"lp":["ase","sea","asse","xe","sq","ases","sex","seq","seas","axe","xes"],"rp":["ex","eas","exa","ease","essa","exe","esea","easa","exas"]},"38":{"input":[2,3,6],"tlp":["fe",67683],"trp":["ers",54211],"tlw":["free",1788],"lp":["fe","res","ffe","rse","ser","fer","fee","ress","ffer","fere","rese","fre","ref"],"rp":["ers","ef","erf","eff","erse","efe","eres"]},"39":{"input":[1,2,3,6],"tlp":["reas",7091],"trp":["ears",10248],"tlw":["few",5711],"trw":["ears",565],"lp":["reas","few","swe","fea","swer","fear","sear","wes","afe","wers","safe","aref","affe","werf","swee","xer"],"rp":["ears","ews","ersa","exer"]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["te",259049],"trp":["et",117117],"tlw":["tv",551],"trw":["et",324],"lp":["te","ve","tte","tee","tev","teve","teet","tv","vet","ttee"],"rp":["et","ev","eve","ett","eet","ette","ete","etee","eev","eeve"]},"41":{"input":[1,4,6],"tlp":["pe",115056],"trp":["ep",39298],"tlw":["tea",508],"trw":["eat",1112],"lp":["pe","av","ate","ave","va","ppe","pea","atte","appe","tea","tate","ape","ppea"],"rp":["ep","eat","eep","ept","eate","eav","epa"]},"42":{"input":[2,4,6],"tlp":["ce",144944],"trp":["ec",91763],"tlw":["tree",670],"trw":["ever",4714],"lp":["ce","ver","ter","rec","tter","cre","rv","tre","ret","cer","rce","cte","rte","cce"],"rp":["ec","ever","ect","erv","ert","ece"]},"43":{"input":[1,2,4,6],"tlp":["per",37369],"trp":["eca",14464],"tlw":["water",2519],"lp":["per","pre","ace","reat","pec","rep","ater","twe","rate","crea","pect","care","pare","twee","cep"],"rp":["eca","eac","etw","erat","etwe"]},"44":{"input":[3,4,6],"tlp":["de",167797],"trp":["ed",326541],"tlw":["set",3472],"trw":["ed",253],"lp":["de","ted","ste","sed","ded","des","ved","ves","tes","ssed","set","sted","dde","sev","seve","dee","dv"],"rp":["ed","est","eed"]},"45":{"input":[1,3,4,6],"tlp":["spe",18659],"trp":["ead",29380],"tlw":["state",2221],"trw":["east",920],"lp":["spe","ade","dea","ated","xpe","ped","pped","ates","aste","dep","adv","stea","step"],"rp":["ead","exp","expe","ext","esp","east","espe"]},"46":{"input":[2,3,4,6],"tlp":["red",36139],"trp":["ered",12958],"tlw":["street",2374],"trw":["effect",1185],"lp":["red","der","fte","ces","fter","dre","ced","ster","rest","sec","rde","cess","serv","ders","dec","cted","stre","ters","rder"],"rp":["ered"]},"47":{"input":[1,2,3,4,6],"tlw":["after",12071],"trw":["except",1180],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["he",1036192],"trw":["he",92135],"lp":[],"rp":["he","en","ne","hen","een","ene","nee","nne","eh","hn","hee","enn","nh","nen","enne","hene","ehe","nhe","ehen","enh"]},"49":{"input":[1,5,6],"tlp":["ane",5091],"trp":["ha",357027],"tlw":["anne",519],"trw":["jane",336],"lp":["ane","ah","anne","ahe","ahea"],"rp":["ha","han","hea","ean","je","nea","ena","eha","enj","jea","nha","eah","eane","jean","nq"]},"50":{"input":[2,5,6],"tlp":["ren",22668],"trp":["her",160213],"tlw":["zen",79],"trw":["her",47940],"lp":["ren","rne","rke","rh"],"rp":["her","ke","here","hr","ner","ern","hre","eren","kne","ek","eek","ener","ken","hree","kee","nner"]},"51":{"input":[1,2,5,6],"tlp":["wh",148489],"trp":["new",18090],"tlw":["when",27718],"trw":["new",10172],"lp":["wh","whe","wha","when","ake","wher","wen","ween","aren","week","arke","aken"],"rp":["new","har","hear","eak","knew","earn","nera","near"]},"52":{"input":[3,5,6],"tlp":["sh",119750],"trp":["me",235102],"tlw":["she",45928],"trw":["me",30278],"lp":["sh","she","sen","seem"],"rp":["me","em","men","hem","nes","eme","hes","mes","ens","ness","hese","eem","nse","mse","mem","emen"]},"53":{"input":[1,3,5,6],"tlp":["ame",34012],"trp":["has",13193],"tlw":["same",6718],"trw":["has",11125],"lp":["ame","sha","same","ash","ames","anes","sham"],"rp":["has","mea","mean","ema","name","eam","nex","exam","ham","eman","eans","exan","hame"]},"54":{"input":[2,3,5,6],"tlp":["rem",11660],"trp":["mer",13928],"tlw":["fresh",618],"trw":["mere",523],"lp":["rem","ske","reme","rme","fren","fen","rsh","rmer","rnme"],"rp":["mer","hers","erm","kes","eks","eeks","ners","mmer","ernm","efen","mere"]},"55":{"input":[1,2,3,5,6],"tlw":["answer",1929],"trw":["make",9390],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["th",1104883],"trp":["ent",104826],"tlw":["the",506536],"trw":["even",12216],"lp":["th","the","be","ven","ten","bee","been","then","bet","tten"],"rp":["ent","ht","nte","even","eth","nev","nv","neve","ethe","ente"]},"57":{"input":[1,4,5,6],"tlp":["tha",132122],"trp":["hat",148416],"tlw":["that",110865],"trw":["have",35739],"lp":["tha","that","ath","pen","than","ph","athe","bea","ante","ppen","van","pene","bje"],"rp":["hat","hav","have","hap","happ","eath","enta"]},"58":{"input":[2,4,5,6],"tlp":["ch",138742],"trp":["nce",54473],"tlw":["there",23867],"trw":["never",9168],"lp":["ch","ther","thr","bec","che","ber","tch","cen","rth","rent","cent","thre","rch","cke","bre"],"rp":["nce","enc","ence","nter","nch"]},"59":{"input":[1,2,4,5,6],"tlw":["what",26770],"trw":["each",6050],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["them",24753],"trp":["ned",28030],"tlw":["them",21593],"trw":["need",4397],"lp":["them","den","thes","dent","tem","sent"],"rp":["ned","ment","nde","end","med","hed","met","ents","mbe","nted","emb","meth","need","nded"]},"61":{"input":[1,3,4,5,6],"tlw":["death",2323],"trw":["had",63389],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["remember",2277],"trw":["members",1108],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["came",6889],"trw":["heard",3016],"lp":[],"rp":[]},"64":{"input":[7],"base":"i","baseshift":"I","trp":["ii",1762],"trw":["i",117501],"lp":[],"rp":["ii","iii"]},"65":{"input":[1,7],"base":"(","baseshift":"[","tlp":["ai",104869],"trp":["ia",38456],"lp":["ai"],"rp":["ia","iai"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["ri",146328],"trp":["ir",91496],"lp":["ri","rri"],"rp":["ir","iri","irr","irri"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["wi",119378],"trp":["ira",1826],"tlw":["air",2428],"trw":["ira",59],"lp":["wi","rai","air","ari","arri","ria","wri","wai","rria","aria","rwi","awi","rawi","wir","rari","awai","rrai","arwi"],"rp":["ira","iar"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["si",120170],"trp":["is",263616],"trw":["is",60295],"lp":["si","ssi","sis","ssis","siss"],"rp":["is","isi","iss","issi","-s","isis","-si","-i"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["sai",25354],"trp":["ix",4876],"tlw":["six",1928],"trw":["ix",80],"lp":["sai","asi","assi","xi","six","ais","sia","xis","ssia","asis","sias","asia","axi","aisi"],"rp":["ix","isa","ias","isas","isaa","issa"]},"70":{"input":[2,3,7],"tlp":["fi",67126],"trp":["if",58122],"tlw":["sir",1984],"trw":["if",25154],"lp":["fi","fir","ris","firs","ffi","fri","sir","rsi","fif","rif","risi","fis","rifi"],"rp":["if","irs","iff","ifi","iffi","isf","-f"]},"71":{"input":[1,2,3,7],"tlp":["fai",5226],"trp":["isfa",500],"tlw":["fair",842],"lp":["fai","wis","wif","aris","fair","rais","airs","swi","frai","fix","ffai","rwis","sari","afri","affi","rsia","swif","wais","fia"],"rp":["isfa"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["ti",213739],"trp":["it",311028],"tlw":["g",298],"trw":["it",92474],"lp":["ti","gi","tti","gg","tit","gt","tig","titi","ttit","ggi","git","gig","tg"],"rp":["it","ig","iti","itt","igi","itti","igg"]},"73":{"input":[1,4,7],"tlp":["ag",47829],"trp":["ip",16613],"tlw":["tip",221],"lp":["ag","ati","ga","pi","tai","aga","gai","agai","pai","ait","tia","tati","pti","agi","pit","ppi","gat"],"rp":["ip","ita","iat"]},"74":{"input":[2,4,7],"tlp":["ci",45417],"trp":["ic",118179],"tlw":["critic",79],"lp":["ci","gr","cti","tic","rg","rit","ric","tri","rig","rti","cri","cit","gir","riti","rtic","tir"],"rp":["ic","ici","ict","irt"]},"75":{"input":[1,2,4,7],"tlp":["wit",77056],"trp":["ica",19163],"tlw":["wait",1256],"lp":["wit","pri","gra","cia","acti","arg","rati","arti","rica","trai","pic","rtai","writ","gar","rag","wait","tica","cati"],"rp":["ica","icat"]},"76":{"input":[3,4,7],"tlp":["di",96016],"trp":["id",100069],"tlw":["did",12252],"trw":["its",10155],"lp":["di","sti","did","sid","gs","sit","dis","sig","dg","sist","dit","tis","siti","dist","diti"],"rp":["id","ist","its","isti","idd"]},"77":{"input":[1,3,4,7],"tlp":["aid",27860],"trp":["ista",3836],"tlw":["said",23960],"trw":["ida",198],"lp":["aid","said","spi","adi","dia","sati","spit","xist","diat","disa","sag","ssag","stai","atis","disp"],"rp":["ista","ips","isp","ida","isap"]},"78":{"input":[2,3,4,7],"tlp":["fic",12500],"trp":["irst",11403],"tlw":["first",11244],"lp":["fic","ffic","dif","diff","sic","dri","fig","sci","dir","disc","dic","cis","rid","tif","cid","rdi","stri"],"rp":["irst","ift","isc"]},"79":{"input":[1,2,3,4,7],"tlw":["paris",1353],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"y","baseshift":"Y","trp":["in",644105],"trw":["in",155002],"lp":[],"rp":["in","ni","ny","nin","yi","yin","ini","inn","nni","inin","nnin","inni","yn","nny","iny","nyi","nyin","inny","ynn"]},"81":{"input":[1,5,7],"tlp":["ay",87083],"trp":["ina",10155],"tlw":["any",10758],"trw":["nay",83],"lp":["ay","ain","any","ani","ayi","ayin","aini","anin","anni"],"rp":["ina","ian","ya","nia","inan","nai","ji","yan","inj","nian","iann"]},"82":{"input":[2,5,7],"tlp":["ry",67816],"trp":["ki",42462],"trw":["ink",130],"lp":["ry","rin","rni","rnin","rry","ryi","ryin","rki","rkin","rink","rik"],"rp":["ki","kin","ik","ink","nki","nkin","inki","ky","nry"]},"83":{"input":[1,2,5,7],"tlp":["way",28360],"trp":["yw",1970],"tlw":["way",11339],"trw":["iran",85],"lp":["way","win","ary","aki","akin","away","rain","arin","arry","ray","rian","arni","rary","anyw","wy"],"rp":["yw","nary","inar","nyw","kay"]},"84":{"input":[3,5,7],"tlp":["sin",21536],"trp":["im",93559],"tlw":["sin",306],"trw":["my",40423],"lp":["sin","sy","sim","smi","ssin"],"rp":["im","mi","my","ys","min","ins","nsi","mis","ims","nis","miss","mys","imi","insi","mmi"]},"85":{"input":[1,3,5,7],"tlp":["ays",16554],"trp":["may",9648],"tlw":["say",7781],"trw":["many",8068],"lp":["ays","say","ami","ains","says","asy","aim","sayi","amin","sian","anis","asin"],"rp":["may","many","ima","mai","main","iam","ians","mina"]},"86":{"input":[2,3,5,7],"tlp":["fin",16231],"trp":["inf",5607],"tlw":["firm",690],"trw":["kiss",443],"lp":["fin","ski","rim","rmi","fini","rmy","rmin","skin","firm","risk"],"rp":["inf","mir","nfi","nif","irm","isk","kis","kiss","nifi","mik"]},"87":{"input":[1,2,3,5,7],"tlw":["army",2073],"trw":["mary",586],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["ty",42717],"trp":["ng",301290],"tlw":["by",35333],"lp":["ty","by","tin","ting","bi","gin","gn","ttin"],"rp":["ng","ing","int","nti","ning","ity","ib","ying","ign","nit","yt","nig"]},"89":{"input":[1,4,5,7],"tlp":["ang",16987],"trp":["nati",5202],"tlw":["again",7165],"lp":["ang","gain","tain","gan","pin","ping","aint","anyt","atin","abi","py","pain","pany","ppin","agin","tay","anag"],"rp":["nati","nag","ntai"]},"90":{"input":[2,4,5,7],"tlp":["ring",17926],"trp":["king",26881],"tlw":["city",2930],"trw":["king",2321],"lp":["ring","bri","try","rty","cy","rib","city","cin","ryt","rity","cing","tryi","rinc","brin"],"rp":["king","inc","ick","nci","nic","ntry"]},"91":{"input":[1,2,4,5,7],"tlw":["taking",1995],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["tim",28120],"trp":["ind",31046],"tlw":["sitting",1409],"trw":["mind",4439],"lp":["tim","din","ding","dy","sing","didn","sib","sign"],"rp":["ind","ngs","ndi","ings","inst","idn","mig","ndin","ming","mind","mit","nsid"]},"93":{"input":[1,3,4,5,7],"tlw":["day",8306],"trw":["instant",472],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["find",4695],"trw":["kind",3481],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["asking",940],"trw":["making",2931],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"u","baseshift":"U","trp":["ie",85987],"trw":["u",744],"lp":[],"rp":["ie","ei","ue","ui","eu","uie","iu","uee","eei","ieu","uu"]},"97":{"input":[1,6,7],"tlp":["au",32369],"trp":["ua",23498],"tlw":["que",92],"trw":["iq",115],"lp":["au","qu","qui","que","qua","quie","quee","quai"],"rp":["ua","equ","equi","eau","eque","iq","equa","iqu","ique","uai","iqui","iae"]},"98":{"input":[2,6,7],"tlp":["ru",29549],"trp":["ur",136165],"tlw":["rue",170],"lp":["ru","rie","rrie","rue","zi","rei"],"rp":["ur","eir","ure","eri","ire","iz","uri","ize","ier","erie","urr","uir","uire","eur"]},"99":{"input":[1,2,6,7],"tlp":["requ",3277],"trp":["ura",5813],"tlw":["require",420],"trw":["iraq",73],"lp":["requ","quir","quar","azi","wei","arie","aur","aura","wire","aire"],"rp":["ura","uar","iew","eari","iza","eria","ewi","uare","erwi","iewe"]},"100":{"input":[3,6,7],"tlp":["su",62257],"trp":["us",124701],"tlw":["sue",76],"trw":["us",10609],"lp":["su","ssu","sus","sui","sue","sie"],"rp":["us","use","ies","ise","usi","esi","ues","essi","esu","uss","usu","uis","ussi","uses"]},"101":{"input":[1,3,6,7],"tlp":["aus",14032],"trp":["exi",2803],"trw":["usa",134],"lp":["aus","ause","ques","sua","asu","aise","assu","squ","sequ","squa","xu","asie"],"rp":["exi","usa","usua","easi","easu","exis","ixe","isea"]},"102":{"input":[2,3,6,7],"tlp":["fu",24057],"trp":["urs",13334],"tlw":["sure",3684],"trw":["users",252],"lp":["fu","sur","sure","frie","ries","rus","resi","fie","rise","resu","refu"],"rp":["urs","ife","urse","iffe","ief","efu","uf","uff","ures"]},"103":{"input":[1,2,3,6,7],"tlw":["wife",2078],"trw":["easier",513],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["ge",97282],"trp":["ut",147044],"tlw":["get",10986],"trw":["iv",292],"lp":["ge","vi","tu","get","gu","tiv","tive","giv","tie","give"],"rp":["ut","iv","ug","ive","eg","ite","ivi","ute","eti","uti"]},"105":{"input":[1,4,6,7],"tlp":["pu",22528],"trp":["up",44081],"tlw":["put",5210],"trw":["up",23594],"lp":["pu","age","put","avi","aug","tua","atu","aut","ativ","pie","quit","gav","gave"],"rp":["up","ega","upp","iva","iate","eati","uat"]},"106":{"input":[2,4,6,7],"tlp":["tur",27983],"trp":["uc",39944],"tlw":["true",2254],"trw":["ice",574],"lp":["tur","cu","gre","ger","ture","tru","rge","riv","cur","ctu","vic","gree","rive","ctiv"],"rp":["uc","ice","eci","ecti","iver","uct"]},"107":{"input":[1,2,4,6,7],"tlw":["great",6807],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["du",19747],"trp":["ide",35753],"tlw":["side",3662],"trw":["used",3487],"lp":["du","side","stu","ges","die","ged","vid","tud","vis","ties"],"rp":["ide","ust","ud","ied","iste","edi","esti","used","uest","ude"]},"109":{"input":[1,3,4,6,7],"tlw":["despite",946],"trw":["idea",2885],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["five",2604],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["arrived",1258],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["hi",274759],"trw":["eye",1504],"lp":[],"rp":["hi","un","ey","hin","hey","ye","ine","hei","hu","ien","nu","hy","uni","ein","eye","eni","inu","hun","ney","enin"]},"113":{"input":[1,5,6,7],"tlp":["aine",5046],"trp":["ju",21952],"tlw":["queen",763],"trw":["yeah",918],"lp":["aine","aye","quen","aun","anie","anu"],"rp":["ju","yea","hai","una","eani","jun","nua","yeah","niq","niqu","nqu","hain","june","hani"]},"114":{"input":[2,5,6,7],"tlp":["rien",11605],"trp":["ery",27793],"tlw":["run",1998],"trw":["henry",1546],"lp":["rien","run","zin"],"rp":["ery","heir","ike","urn","hink","urne","erin","hir","urin","hur","niz","yer","urni","hri","ury","key","enry"]},"115":{"input":[1,2,5,6,7],"tlw":["why",6090],"trw":["year",3064],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["shi",11339],"trp":["his",109386],"tlw":["sun",1066],"trw":["his",69304],"lp":["shi","sum","sine"],"rp":["his","him","ime","mu","um","ish","mus","ines","yes","usin","imes","hims","imse","eyes","ishe","hus","ume"]},"117":{"input":[1,3,5,6,7],"tlw":["assume",344],"trw":["human",2178],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["fine",1422],"trw":["mike",918],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["wish",1198],"trw":["years",7833],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["gh",90668],"trp":["ith",80740],"tlw":["but",49620],"trw":["night",4461],"lp":["gh","thi","bu","ght","but","thin","they","thei","vin","ving"],"rp":["ith","igh","ugh","ight","hing","nge","ught","unt","inte","ub"]},"121":{"input":[1,4,5,6,7],"tlw":["anything",3884],"trw":["having",3594],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["their",26687],"trw":["every",7264],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["with",67032],"trw":["nature",1587],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["this",36089],"trw":["might",6921],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["game",1331],"trw":["just",14589],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["such",8032],"trw":["much",10233],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["because",9879],"trw":["experience",2559],"lp":[],"rp":[]},"128":{"input":[8],"base":"o","baseshift":"O","trp":["oo",93108],"trw":["o",531],"lp":[],"rp":["oo"]},"129":{"input":[1,8],"tlp":["ao",915],"trp":["oa",14939],"lp":["ao"],"rp":["oa"],"special":"bksp","base":"ao"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["ro",170933],"trp":["or",314634],"trw":["or",34654],"lp":["ro","roo","rro","ror","rror"],"rp":["or","oor","orr","orro","oro"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["wo",92580],"trp":["ow",122368],"tlw":["row",380],"lp":["wo","wor","row","aro","roa","wro","rrow","woo","worr","arro","rao","aor"],"rp":["ow","ora","owa","owar","oar","orw","orwa","orar"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["so",117437],"trp":["os",70799],"tlw":["so",27040],"trw":["'",14271],"lp":["so","soo","sso","s'","s's","ss'","ss's"],"rp":["os","'s","oss","oos","o'","oso","''","o's","'o","oss'"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["aso",4273],"trp":["ox",1874],"lp":["aso","asso","a'","xo","a's","soa","aos","a'a","x'","ax'","x's","ax's","axo","saxo"],"rp":["ox","oas","osa","'a","ossa"]},"134":{"input":[2,3,8],"tlp":["fo",133745],"trp":["of",272457],"tlw":["for",70927],"trw":["of",245539],"lp":["fo","for","fro","rso","ros","sor","ross","foo","r'","r's","rof","ffo","ffor","rfo","rfor","sof"],"rp":["of","off","ors","'r"]},"135":{"input":[1,2,3,8],"tlp":["wors",1678],"trp":["ows",4674],"tlw":["sofa",209],"lp":["wors","forw","rows","swo","swor","affo","wso","awso","frow","sofa","rox","aros","ar'","ar's","w'"],"rp":["ows","'w","ofa","oars","ow'"]},"136":{"input":[4,8],"base":"?","baseshift":"/","tlp":["to",350815],"trp":["ot",133805],"tlw":["to",249163],"trw":["otto",67],"lp":["to","too","tto","tot","toot","toto"],"rp":["ot","ott","oot","oto","otto"],"special":"punc"},"137":{"input":[1,4,8],"tlp":["po",68607],"trp":["op",53305],"tlw":["top",1822],"lp":["po","ppo","top","pot","poo","ato","pop","topp","apo","appo","tota","pto"],"rp":["op","opp","oppo","oat","ota","oop","opt","opo"]},"138":{"input":[2,4,8],"tlp":["co",161789],"trp":["ort",28140],"tlw":["root",179],"lp":["co","tor","tro","cor","cro","rot","cto","cco","ctor","roc","ccor","coo","corr","cot"],"rp":["ort","oc","orc","occ","oct","octo"]},"139":{"input":[1,2,4,8],"tlp":["pro",33640],"trp":["orta",4717],"tlw":["two",11667],"lp":["pro","por","two","port","tow","rop","pow","acco","ppor","towa","prop","proc","acro","ppro","coa","crow","wrot"],"rp":["orta","oac","oca"]},"140":{"input":[3,4,8],"tlp":["do",77376],"trp":["od",44403],"tlw":["do",18689],"trw":["odd",416],"lp":["do","sto","t'","t's","doo","stoo","tood","tod","d'","d's"],"rp":["od","'t","ost","ood","'d","odd","ots","ods","oods","oots"]},"141":{"input":[1,3,4,8],"tlp":["pos",16560],"trp":["oad",3493],"tlw":["stop",1798],"lp":["pos","spo","at'","at's","poss","stop","ppos","ado","toda","post","spot","sop"],"rp":["oad","osp","oda","ops","oast","oops","opos","osop"]},"142":{"input":[2,3,4,8],"tlp":["stor",8576],"trp":["ord",17538],"tlw":["door",3713],"lp":["stor","fort","rod","soc","door","sco","cros","forc","stro","dro","cord","doc","sort","tors","food","dor"],"rp":["ord","oft","ords","orts"]},"143":{"input":[1,2,3,4,8],"tlw":["words",3228],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"l","baseshift":"L","trp":["on",380429],"trw":["on",61313],"lp":[],"rp":["on","ll","no","lo","ol","nl","loo","lon","onl","oll","llo","ool","oon","olo","ollo","nno","ono","onn","non","noo"]},"145":{"input":[1,5,8],"tlp":["al",228009],"trp":["la",103279],"tlw":["all",30772],"trw":["la",689],"lp":["al","all","ano","alo","alon","anno","allo","ala"],"rp":["la","jo","lan","nal","ona","onal","lla","nall","olla","oal","njo","ola"]},"146":{"input":[2,5,8],"tlp":["rl",25465],"trp":["ok",35246],"tlw":["roll",381],"trw":["look",5477],"lp":["rl","ron","rol","roll","rok","rno"],"rp":["ok","ook","kno","ork","look","lk","nor","orn","orl","lor","lr","kl","loor","olor"]},"147":{"input":[1,2,5,8],"tlp":["work",16534],"trp":["now",32603],"tlw":["work",8749],"trw":["now",13343],"lp":["work","ral","arl","alk","wal","worl","alw","alwa","won","walk","wl","alr"],"rp":["now","own","know","low","lar","llow","lw","lwa"]},"148":{"input":[3,5,8],"tlp":["som",32033],"trp":["om",158331],"tlw":["soon",3191],"trw":["mom",1398],"lp":["som","son","sl","sn'","sol"],"rp":["om","mo","n'","ons","ls","mos","mon","on'","los","omm","lso","oom","'m","lm","mom"]},"149":{"input":[1,3,5,8],"tlp":["als",13163],"trp":["las",11287],"tlw":["also",7989],"trw":["man's",744],"lp":["als","also","alm","amo","an'","smal","ason","almo","asn'","sona","amon","sla","sal","alls"],"rp":["las","mal","oma","oman","mall","lass"]},"150":{"input":[2,3,5,8],"tlp":["rom",40627],"trp":["mor",29841],"tlw":["from",35952],"trw":["looks",1175],"lp":["rom","from","fl","form","rson","room","fol","flo","foll","fron","floo"],"rp":["mor","lf","orm","onf","nfo","nfor","morn","oks","ooks"]},"151":{"input":[1,2,3,5,8],"tlw":["woman",3590],"trw":["major",1113],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["bo",64448],"trp":["not",62064],"tlw":["bob",306],"trw":["not",43106],"lp":["bo","bl","tl","ttl","bot","ton","tol","boo","blo","bloo"],"rp":["not","lt","ob","nto","ont","ntl","lot","obl","nnot","nob"]},"153":{"input":[1,4,5,8],"tlp":["pl",68379],"trp":["lat",15533],"tlw":["plan",1335],"trw":["job",3249],"lp":["pl","abo","pla","abl","tal","pon","alt","anot","pol","tabl","plan","bla","plo","ppl","bal"],"rp":["lat","opl","lp","job","oba"],"special":"numsym"},"154":{"input":[2,4,5,8],"tlp":["con",43239],"trp":["onc",10039],"tlw":["took",5513],"lp":["con","cl","cont","bro","col","clo","rob","took","bor","book","conc","coll","ctl","ront"],"rp":["onc","ock","loc","ncl","ontr","ntro"]},"155":{"input":[1,2,4,5,8],"tlw":["call",2856],"trw":["local",1100],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["don",16568],"trp":["ld",104617],"tlw":["don't",9569],"trw":["most",10396],"lp":["don","dn'","dn't","don'","dl","sn't","bod","told","tom"],"rp":["ld","n't","old","most","ond","on't","mot","ldn","ldn'","ndo","obs"]},"157":{"input":[1,3,4,5,8],"tlw":["almost",3784],"trw":["last",4981],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["front",2573],"trw":["lord",1049],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["down",11247],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"@","trp":["eo",22601],"lp":[],"rp":["eo","oe"],"special":"punc"},"161":{"input":[1,6,8],"trp":["oq",59],"lp":[],"rp":["oq"]},"162":{"input":[2,6,8],"tlp":["zo",557],"trp":["ore",43307],"tlw":["zero",137],"trw":["error",228],"lp":["zo","reo","roe","roz","roze","zero"],"rp":["ore","ero","eor","oz","oze","erro","orre","oreo","eror","eroe","oore","orer","ooz","ooze"]},"163":{"input":[1,2,6,8],"tlp":["wore",857],"trp":["owe",15537],"tlw":["wore",747],"trw":["owe",137],"lp":["wore","rowe","woe","azo"],"rp":["owe","ower","ewo","ewor","orea","erwo","oare"]},"164":{"input":[3,6,8],"tlp":["soe",138],"trp":["ose",25993],"lp":["soe","se'","se's"],"rp":["ose","e'","e's","oes","osse","oose","eso","esso","oses","'e","es'","eos","es's","oe'","oe's"]},"165":{"input":[1,3,6,8],"trp":["easo",4023],"lp":[],"rp":["easo","oxe","oxes","exo"]},"166":{"input":[2,3,6,8],"tlp":["fore",14026],"trp":["efo",11759],"tlw":["rose",1049],"trw":["offer",1014],"lp":["fore","re'","re's","rose","rofe"],"rp":["efo","efor","erso","'re","offe","er'","er's","ere'","orse","erfo","ofe","ofes","e'r","e're","effo"]},"167":{"input":[1,2,3,6,8],"tlw":["we're",1513],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["vo",13509],"trp":["ov",46618],"tlw":["vote",203],"lp":["vo","vot","vote","toe","tov","tove"],"rp":["ov","ove","ote","evo","otte","oet","evot","eov","eove","eto","oev","oeve","ovo","oote"]},"169":{"input":[1,4,6,8],"tlp":["peo",15223],"trp":["eop",15223],"tlw":["pope",239],"lp":["peo","peop","avo","poe","pote","poet","vato","pov","pove","pope"],"rp":["eop","ope","oppe","epo","ova","eapo","ovat","opea","opte","oope"]},"170":{"input":[2,4,6,8],"tlp":["rov",6005],"trp":["over",21892],"tlw":["cover",700],"trw":["over",12910],"lp":["rov","cov","cove","reco","rote","rove","roce","vor","tore","revo","core","rvo"],"rp":["over","eco","orce","oce","orte","ecor","otec","ecto"]},"171":{"input":[1,2,4,6,8],"tlw":["power",3130],"trw":["operate",192],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["doe",5478],"trp":["e'd",4775],"tlw":["does",3360],"lp":["doe","does","sov"],"rp":["e'd","'v","'ve","oved","ode","osed","oted","otes","edo","esto","et'","et's","odde","oves","e'v","e've","eedo"]},"173":{"input":[1,3,4,6,8],"tlw":["stopped",1419],"trw":["exposed",267],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["force",1513],"trw":["order",2602],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["process",1455],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["le",213808],"trw":["one",30730],"lp":[],"rp":["le","ho","el","one","ell","lle","hel","hol","eel","len","ele","hoo","ole","eno","oh","elo","hool","olle","hole","hon"]},"177":{"input":[1,5,6,8],"tlp":["alle",8964],"trp":["lea",26849],"tlw":["alone",2184],"trw":["john",1863],"lp":["alle","ale","alen"],"rp":["lea","eal","hal","ela","eall","hall","lean","joh","john","enjo","oje","heal","lane","joe","eale","elea","llea"]},"178":{"input":[2,5,6,8],"tlp":["rel",11908],"trp":["hro",12209],"tlw":["role",950],"trw":["honor",325],"lp":["rel","roke","rle","role","rele"],"rp":["hro","oke","hor","ooke","ler","lre","lke","orke","erl","kel","orne","ller","oken","erno","hook"]},"179":{"input":[1,2,5,6,8],"tlw":["who",23669],"trw":["how",14162],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["some",31924],"trp":["ome",63421],"tlw":["some",15162],"trw":["home",4865],"lp":["some","sel","sho"],"rp":["ome","les","hos","hose","hom","omen","less","he'","msel","els","emo","home","lose","lem","mome","lse","mone"]},"181":{"input":[1,3,5,6,8],"tlw":["shall",1999],"trw":["male",440],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["feel",4278],"trw":["more",21171],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["women",3612],"trw":["half",2504],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tho",36998],"trp":["oth",46489],"tlw":["both",5084],"trw":["let",4207],"lp":["tho","ble","tle","tel","ttle","bel","vel","tell","both"],"rp":["oth","othe","noth","let","lv","lve","lov","love","entl","elt","elv"]},"185":{"input":[1,4,5,6,8],"tlw":["people",14668],"trw":["help",3633],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"tlw":["brother",1465],"trw":["other",13909],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["another",6638],"trw":["later",4588],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["those",7914],"trw":["moment",3684],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["that's",4282],"trw":["least",2856],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["before",10203],"trw":["left",5159],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["called",4581],"trw":["learned",1609],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["io",113622],"lp":[],"rp":["io","oi"],"special":"punc"},"193":{"input":[1,7,8],"lp":[],"rp":[]},"194":{"input":[2,7,8],"tlp":["rio",7327],"trp":["ori",8551],"lp":["rio","rior","rrio","roi","rori"],"rp":["ori","ior","iro","orri","irro","orio","iori","oir","oiro"]},"195":{"input":[1,2,7,8],"tlp":["ario",1160],"trp":["owi",4542],"tlw":["warrior",125],"lp":["ario","rowi","airo"],"rp":["owi","oria","iora","oari"]},"196":{"input":[3,7,8],"tlp":["sio",15825],"trp":["i'",14185],"trw":["'i",461],"lp":["sio","ssio","soi","so-"],"rp":["i'","osi","ossi","isio","iso","ois","o-","'i","ios","iosi","oosi","osio","oiso","-o","isso"]},"197":{"input":[1,3,7,8],"tlp":["asio",1897],"trp":["oxi",253],"lp":["asio","xio","aiso"],"rp":["oxi","ixo"]},"198":{"input":[2,3,7,8],"tlp":["riso",1574],"trp":["offi",5584],"trw":["'if",72],"lp":["riso","rofi","rsio","rios","rosi"],"rp":["offi","ifo","ifor","ofi","iors","oris","-fo","isor","-ro","-roo","oirs","isfo","'if","iff'","o-f"]},"199":{"input":[1,2,3,7,8],"tlw":["warriors",145],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["tio",72429],"trp":["og",14040],"tlw":["go",9032],"lp":["tio","go","goo","got","goi","tog","gio","gott","gto","goti"],"rp":["og","itio","oti","otio","ito","ogi","igio","iot","oog","otog"]},"201":{"input":[1,4,7,8],"tlp":["atio",33167],"trp":["opi",2391],"tlw":["ago",1471],"lp":["atio","poi","ptio","ago","goa","ppoi","topi","pio","aigo","goat","gapo"],"rp":["opi","opti","oppi","otia","oga","oati","opag","ogat","ipo"]},"202":{"input":[2,4,7,8],"tlp":["ctio",12347],"trp":["org",5456],"tlw":["torrio",94],"trw":["org",99],"lp":["ctio","gro","cio","tori","rog","rogr","cog","rgo","gor"],"rp":["org","oic","oci","ogr","otic","orit","orti","itor","orig","icio","icto"]},"203":{"input":[1,2,4,7,8],"tlw":["grow",678],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["good",10385],"trp":["it'",8789],"tlw":["good",9480],"trw":["it's",8558],"lp":["good","stio","god","doi","dog","dio","gdo","g'","g's","to-","gods"],"rp":["it'","it's","osit","isto","i'd","oid","odi","iod","isdo"]},"205":{"input":[1,3,4,7,8],"tlw":["gossip",164],"trw":["ipod",68],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["forgot",261],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"tlw":["radio",638],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["li",155342],"trw":["only",13824],"lp":[],"rp":["li","ly","yo","il","ion","ill","lly","lin","oin","nly","only","lli","oy","ili","ily","oli","llin","yon","illi","nio"]},"209":{"input":[1,5,7,8],"tlp":["ally",22338],"trp":["ial",13366],"tlw":["ally",126],"trw":["lay",1482],"lp":["ally","ali","ail","alli","ainl","anyo"],"rp":["ial","lay","iona","lai","lia","inal","lain","iall","joy","ila","njoy","lian","joi","join"]},"210":{"input":[2,5,7,8],"tlp":["rly",8446],"trp":["lik",24097],"tlw":["roy",83],"trw":["york",1727],"lp":["rly","ril","rli","ryo","ryon"],"rp":["lik","ory","irl","oki","okin","kil","kill","orni","ooki","lki","lkin","orki","kly","yor","orry"]},"211":{"input":[1,2,5,7,8],"tlw":["will",14271],"trw":["okay",1081],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["sion",15757],"trp":["ions",18292],"tlw":["sly",561],"trw":["i'm",6537],"lp":["sion","sil","sly","smil","sli"],"rp":["ions","mil","lis","i'm","omi","y'","onsi","mily","mili","omin","lim","y's","i'l","i'll","ison"]},"213":{"input":[1,3,5,7,8],"tlw":["animal",491],"trw":["mail",328],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["sorry",899],"trw":["mirror",461],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["always",6467],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["tion",71969],"trp":["lit",22460],"tlw":["going",6947],"trw":["into",18343],"lp":["tion","gl","tly","til","till","goin","bli"],"rp":["lit","ong","into","long","ling","lig","oing","litt","ittl","ibl","ngl","oint","ntly"]},"217":{"input":[1,4,5,7,8],"tlw":["point",3165],"trw":["national",867],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["girl",2370],"trw":["looking",3174],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["working",2448],"trw":["knowing",919],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["still",7621],"trw":["isn't",1565],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["among",2526],"trw":["lady",1132],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["story",2254],"trw":["morning",2986],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["company",2711],"trw":["important",2765],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["ou",377630],"lp":[],"rp":["ou","iou","uo","oui","eou","uou","oue"]},"225":{"input":[1,6,7,8],"tlp":["quo",328],"trp":["iquo",129],"lp":["quo"],"rp":["iquo","oqu","oque"]},"226":{"input":[2,6,7,8],"tlp":["rou",33045],"trp":["our",59933],"trw":["our",14347],"lp":["rou","riou","rrou","rizo"],"rp":["our","erio","orie","uro","erou","euro","urio","orei","urro","orou","ouri","oure","izo","oriz","iour","orru"]},"227":{"input":[1,2,6,7,8],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["sou",7964],"trp":["ous",26493],"lp":["sou","siou"],"rp":["ous","ious","u'","ou'","ouse","usio","esou","oise","ouis","ousi","eous","uous","osu","ouss","us'","usso","ies'"]},"229":{"input":[1,3,6,7,8],"tlw":["sioux",68],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["four",2961],"trw":["ours",177],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["wife's",127],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["vio",4502],"trp":["out",63916],"trw":["out",24396],"lp":["vio","voi","toge","tou","viou","gov","gove","geo","vou","goe"],"rp":["out","oug","ovi","oge","oget","utio","ovie","ego","oute","otiv"]},"233":{"input":[1,4,6,7,8],"tlw":["quote",89],"trw":["output",75],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"tlw":["voice",2628],"trw":["occur",235],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["group",2351],"trw":["europe",720],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"tlw":["goes",995],"trw":["i've",2219],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"tlw":["positive",1027],"trw":["opposite",687],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["course",3730],"trw":["office",2363],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["support",1196],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["you",104946],"trw":["you",68463],"lp":[],"rp":["you","ul","oul","hou","oun","lu","ile","hil","ely","eli","lie","houl","ull","hile","nou","elie","line","youn","enou","lue"],"special":"enter"},"241":{"input":[1,5,6,7,8],"tlw":["anyone",1715],"trw":["enjoy",693],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["rule",725],"trw":["your",20504],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["while",7024],"trw":["early",2452],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"tlw":["smile",1413],"trw":["house",4935],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["anxious",432],"trw":["usually",1445],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["full",2345],"trw":["life",8740],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["families",960],"trw":["meanwhile",361],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"tlw":["thought",7112],"trw":["little",9495],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["about",23108],"trw":["upon",4442],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["through",8798],"trw":["everyone",2219],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["without",5841],"trw":["large",2557],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["something",7615],"trw":["lives",1641],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["possible",2350],"trw":["immediately",1263],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["could",18061],"trw":["itself",2205],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["would",27522],"trw":["especially",1737],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/en-dvorak-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/en-dvorak-keymap.json
new file mode 100644
index 00000000000..d7301ac637a
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/en-dvorak-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",410],"tlw":["a",211837],"lp":["aa"],"rp":[]},"2":{"input":[2],"base":"o","baseshift":"O","trp":["oo",93108],"trw":["o",531],"lp":[],"rp":["oo"]},"3":{"input":[1,2],"base":",","baseshift":"<","tlp":["ao",915],"trp":["oa",14939],"lp":["ao"],"rp":["oa"],"special":"punc"},"4":{"input":[3],"base":"e","baseshift":"E","trp":["ee",129154],"trw":["e",471],"lp":[],"rp":["ee"]},"5":{"input":[1,3],"base":"!","baseshift":"@","tlp":["ae",810],"trp":["ea",216643],"lp":["ae"],"rp":["ea","eea"],"special":"punc"},"6":{"input":[2,3],"base":".","baseshift":">","trp":["eo",22601],"lp":[],"rp":["eo","oe"],"special":"punc"},"7":{"input":[1,2,3],"lp":[],"rp":[]},"8":{"input":[4],"base":"i","baseshift":"I","trp":["ii",1762],"trw":["i",117501],"lp":[],"rp":["ii","iii"]},"9":{"input":[1,4],"base":"p","baseshift":"P","tlp":["ai",104869],"trp":["ia",38456],"tlw":["p",765],"lp":["ai","pa","ap","pp","pi","app","pai","apa","ppi","pap","appi","api","ppa","appa","pip"],"rp":["ia","ip","ipp","ipa","ippi"]},"10":{"input":[2,4],"base":"y","baseshift":"Y","trp":["io",113622],"trw":["y",176],"lp":[],"rp":["io","yo","oi","oy","yi","oyi","oyo"]},"11":{"input":[1,2,4],"tlp":["ay",87083],"trp":["op",53305],"tlw":["pay",1548],"trw":["ya",68],"lp":["ay","po","ppo","poi","ayi","py","pay","ppy","poo","appy","pop","apo"],"rp":["op","opp","ya","oppo","opi","yp","oya","oop"]},"12":{"input":[3,4],"base":"u","baseshift":"U","trp":["ie",85987],"trw":["u",744],"lp":[],"rp":["ie","ei","ue","ui","eu","uie","iu","uee","eei","ieu","uu"]},"13":{"input":[1,3,4],"tlp":["pe",115056],"trp":["up",44081],"tlw":["pipe",229],"trw":["up",23594],"lp":["pe","au","pu","ppe","pea","appe","ape","ppea","pie","pape","pee"],"rp":["up","ep","ua","eep","upp","epa","epe","eau","epi"]},"14":{"input":[2,3,4],"trp":["ou",377630],"trw":["you",68463],"lp":[],"rp":["ou","you","ey","ye","iou","eye","uy","oye","eyo","yee","oyee","uo","oui","eou","uou","uyi","yie","uye","oue","oyou"]},"15":{"input":[1,2,3,4],"tlp":["peo",15223],"trp":["eop",15223],"tlw":["pope",239],"lp":["peo","peop","aye","pou","popu","poe"],"rp":["eop","ope","yea","oup","upo","uppo","oppe","epo","ype","opu","eapo","opea","oope","opie"]},"16":{"input":[5],"base":"h","baseshift":"H","trw":["h",335],"lp":[],"rp":[]},"17":{"input":[1,5],"base":";","baseshift":":","tlp":["ah",3197],"trp":["ha",357027],"tlw":["ah",458],"trw":["ha",121],"lp":["ah","aha"],"rp":["ha"],"special":"punc"},"18":{"input":[2,5],"base":"b","baseshift":"B","tlp":["bo",64448],"trp":["ho",160810],"tlw":["b",695],"trw":["oh",2847],"lp":["bo","boo","bb","bob","bobb","bbo"],"rp":["ho","ob","hoo","oh","hb","hbo","obo","obb","oho"]},"19":{"input":[1,2,5],"tlp":["ab",55519],"trp":["oba",3176],"lp":["ab","ba","abo","bab","boa","abb","aba","aboa","aho"],"rp":["oba","obab","hab","hao","oah","habb"]},"20":{"input":[3,5],"base":"j","baseshift":"J","trp":["he",1036192],"trw":["he",92135],"lp":[],"rp":["he","je","eh","hee","ehe","ej","eje"]},"21":{"input":[1,3,5],"tlp":["aj",1718],"trp":["hea",22882],"lp":["aj","ahe","ahea","aje"],"rp":["hea","ja","eha","jea","eah","hae","ehea"]},"22":{"input":[2,3,5],"tlp":["be",175052],"trp":["jo",17794],"tlw":["be",44932],"trw":["job",3249],"lp":["be","bee","beh","bj","bje","bbe"],"rp":["jo","job","eb","joh","obe","obj","obje","oj","oje","eho","hoe","joe","ebo","heo"]},"23":{"input":[1,2,3,5],"tlp":["bea",5725],"trp":["joa",569],"tlw":["abee",97],"lp":["bea","beha","ajo","abe","abbe","abea","abee"],"rp":["joa","eba","eab","eeab","habe"]},"24":{"input":[4,5],"base":"f","baseshift":"F","tlp":["fi",67126],"trp":["hi",274759],"tlw":["f",277],"trw":["if",25154],"lp":["fi","ff","ffi","fif"],"rp":["hi","if","iff","ifi","iffi","hif","hf","ih"]},"25":{"input":[1,4,5],"tlp":["fa",47251],"trp":["hap",14305],"trw":["hip",126],"lp":["fa","af","ph","fai","aff","phi","aph","pha","ffa","affa","ffai","affi","pf","fia"],"rp":["hap","happ","hip","hai","hia","hipp"]},"26":{"input":[2,4,5],"tlp":["fo",133745],"trp":["of",272457],"tlw":["by",35333],"trw":["of",245539],"lp":["fo","by","bi","foo","boy","ffo","fy"],"rp":["of","off","ib","hy","offi","yb","ibi","hoi","ybo","ifo","hio","ofi","oof"]},"27":{"input":[1,2,4,5],"tlp":["abi",3591],"trp":["hop",4723],"tlw":["baby",848],"trw":["happy",1895],"lp":["abi","pho","ayb","phy","aby","baby","pab","apab","affo","bay","babi","aphy","bai"],"rp":["hop","habi","oph","iab","hopi","ophy","hopp"]},"28":{"input":[3,4,5],"tlp":["fe",67683],"trp":["ef",36973],"tlw":["fee",65],"trw":["huh",118],"lp":["fe","fu","ffe","fee","fie"],"rp":["ef","hei","ju","hu","ife","iffe","eff","ief","efu","uf","uff","efe","ehi","hie","effe"]},"29":{"input":[1,3,4,5],"tlp":["fea",4050],"trp":["eph",1305],"trw":["heap",97],"lp":["fea","afe","phe","affe","fau","pfu","pef"],"rp":["eph","jap","japa","hape","hau","heap","ephe","efea","eaf","ufa","jai","heep","uph"]},"30":{"input":[2,3,4,5],"tlp":["bu",70306],"trp":["hou",45889],"tlw":["buy",1026],"trw":["joy",650],"lp":["bu","bou","fou","bef","befo","bei","bui","behi"],"rp":["hou","hey","ub","efo","offe","oub","ibe","joy","ybe","joi","ubj","ubje"]},"31":{"input":[1,2,3,4,5],"tlw":["pub",80],"trw":["hope",1489],"lp":[],"rp":[]},"32":{"input":[6],"base":"t","baseshift":"T","tlp":["tt",55910],"tlw":["t",670],"lp":["tt"],"rp":[]},"33":{"input":[1,6],"base":"(","baseshift":"[","tlp":["at",371419],"tlw":["at",51085],"lp":["at","ta","att","tat","tta","atta","ata","taa","ataa"],"rp":[],"special":"punc"},"34":{"input":[2,6],"base":"w","baseshift":"W","tlp":["to",350815],"trp":["ot",133805],"tlw":["to",249163],"trw":["otto",67],"lp":["to","wo","tw","too","two","tow","woo","tto","tot","wt","ww","www","wow"],"rp":["ot","ow","ott","oot","oto","otto","owt"]},"35":{"input":[1,2,6],"tlp":["wa",198379],"trp":["owa",3731],"lp":["wa","aw","awa","wat","towa","ato","tota","twa","atto","tato","atoo","awo","toa","aot"],"rp":["owa","oat","ota","otta","otat"]},"36":{"input":[3,6],"base":"c","baseshift":"C","tlp":["te",259049],"trp":["et",117117],"tlw":["c",872],"trw":["et",324],"lp":["te","ce","ct","tte","cc","tc","cte","cce","tee","tec","tect"],"rp":["et","ec","ect","ett","eet","ece","ette","ete","ecte"]},"37":{"input":[1,3,6],"tlp":["ca",118675],"trp":["eat",31678],"tlw":["act",1387],"trw":["eat",1112],"lp":["ca","ac","ate","act","ace","atte","tea","cat","acc","atc","tate","tac","cate","acte","acce"],"rp":["eat","eca","eac","eate","eta"]},"38":{"input":[2,3,6],"tlp":["co",161789],"trp":["ew",37100],"tlw":["we",33258],"trw":["owe",137],"lp":["co","we","wee","twe","twee","cto","cco","coo"],"rp":["ew","oc","owe","eco","ote","etw","etwe","oce","occ","oct","octo","otte"]},"39":{"input":[1,2,3,6],"tlp":["wea",5512],"trp":["oac",2483],"tlw":["coat",590],"lp":["wea","acco","watc","wate","coa","acto","weat","coat","coac","awe","aco","coca","cato"],"rp":["oac","oca","occa","ewa","ocat","ocea","eato"]},"40":{"input":[4,6],"base":"k","baseshift":"K","tlp":["ti",213739],"trp":["it",311028],"trw":["it",92474],"lp":["ti","tti","tit","titi","ttit","tk"],"rp":["it","ki","ik","iti","itt","itti","kit","iki","kitt","kt"]},"41":{"input":[1,4,6],"tlp":["ati",45742],"trp":["ita",7797],"tlw":["tip",221],"trw":["kaa",57],"lp":["ati","ak","pt","tak","tai","aki","pat","ait","tia","tati","apt","pti","pit","taki","pati","pta"],"rp":["ita","iat","ka","itat"]},"42":{"input":[2,4,6],"tlp":["wi",119378],"trp":["ok",35246],"tlw":["took",5513],"trw":["kitty",157],"lp":["wi","wit","tio","ty","took","tty","twi"],"rp":["ok","ook","ity","itio","yt","oti","owi","oki","ooki","otio","yw","ky","ito"]},"43":{"input":[1,2,4,6],"tlp":["atio",33167],"trp":["opt",1183],"tlw":["way",11339],"trw":["okay",1081],"lp":["atio","way","away","top","pow","wai","wait","ptio","tay","pot","typ","pok","topp","wak","pty"],"rp":["opt","oka","kay","okay","ywa"]},"44":{"input":[3,4,6],"tlp":["tu",53060],"trp":["ut",147044],"tlw":["cut",1451],"trw":["ice",574],"lp":["tu","ck","ci","cu","cti","tic","tie"],"rp":["ut","ic","ke","uc","ike","ice","ite","ick","eci","ecti","ute","eti","ici"]},"45":{"input":[1,3,4,6],"tlp":["ake",27987],"trp":["ica",19163],"tlw":["take",7122],"trw":["keep",3496],"lp":["ake","ack","cau","take","pec","cia","acti","put","tua","pect","atu","pic","cap","aut","cep","cept"],"rp":["ica","ecau","ept","eak"]},"46":{"input":[2,3,4,6],"tlp":["cou",38026],"trp":["out",63916],"tlw":["city",2930],"trw":["out",24396],"lp":["cou","wou","ctio","cy","city","week","cio","ciou","tou"],"rp":["out","oke","ock","ooke","yet","oic","oice","oci","iew","utio","ety"]},"47":{"input":[1,2,3,4,6],"tlw":["type",863],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"d","baseshift":"D","tlp":["th",1104883],"trp":["ht",56378],"tlw":["th",802],"lp":["th","dd","dh","thd","ddh","tth"],"rp":["ht","hd","hth","htt"]},"49":{"input":[1,5,6],"tlp":["ad",140314],"trp":["hat",148416],"tlw":["that",110865],"trw":["had",63389],"lp":["ad","tha","that","da","ath","add","dat","dad","ada","data","atth","dha","ddha","thda","dadd"],"rp":["hat","had","hatt","hda","hath"]},"50":{"input":[2,5,6],"tlp":["wh",148489],"trp":["oth",46489],"tlw":["who",23669],"trw":["how",14162],"lp":["wh","do","tho","who","dow","bot","bod","both","doo","tood","bt","wd","tod"],"rp":["oth","od","how","ood","hot","odd","owd"]},"51":{"input":[1,2,5,6],"tlp":["wha",30534],"trp":["oad",3493],"tlw":["what",26770],"trw":["oath",137],"lp":["wha","what","tab","bat","bad","ado","batt","toda","boat","adow","dwa","daw","bath","bta","tba","atho"],"rp":["oad","oda","hado","obta"]},"52":{"input":[3,5,6],"tlp":["the",718961],"trp":["ed",326541],"tlw":["the",506536],"trw":["ed",253],"lp":["the","de","ch","ted","ded","che","tch","ced","dec","cted","ched","dde","dee"],"rp":["ed","eth","eed","hed","ethe","jec","ject"]},"53":{"input":[1,3,5,6],"tlp":["cha",21540],"trp":["ead",29380],"tlw":["death",2323],"trw":["each",6050],"lp":["cha","ach","ade","dea","athe","ated","atch","ache","tead","deat","aced","dead","date"],"rp":["ead","each","head","eath","eade","jac","hate"]},"54":{"input":[2,3,5,6],"tlp":["whe",44709],"trp":["othe",34663],"tlw":["bed",1960],"trw":["object",689],"lp":["whe","bec","bet","cho","wed","doe","choo","betw","bed","beco","bett","bjec","whet","doc","doct"],"rp":["othe","howe","owed","ode","ojec"]},"55":{"input":[1,2,3,5,6],"tlw":["watch",1263],"trw":["jaw",167],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["di",96016],"trp":["id",100069],"tlw":["did",12252],"trw":["hit",1079],"lp":["di","thi","ft","did","dif","diff","dit","tif","diti","fit","ddi","fift"],"rp":["id","ith","hit","ift","idd","ithi","kid","idi"]},"57":{"input":[1,4,5,6],"tlp":["aid",27860],"trp":["hapt",2000],"tlw":["paid",1096],"trw":["ida",198],"lp":["aid","aft","fat","adi","fath","dia","path","diat","taf","taff","addi","paid","pid","dai","adit","fait","aith"],"rp":["hapt","ida","hak"]},"58":{"input":[2,4,5,6],"tlp":["with",75749],"trp":["yth",7557],"tlw":["with",67032],"lp":["with","whi","dy","why","body","book","bit","whit","doi","thy","wif","food","wid","foot"],"rp":["yth","ythi","itho","ody","othi","oft"]},"59":{"input":[1,2,4,5,6],"tlw":["day",8306],"trw":["habit",454],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["thei",26847],"trp":["ide",35753],"tlw":["feet",2131],"trw":["effect",1185],"lp":["thei","du","fte","chi","fic","ffic","die","duc","tud"],"rp":["ide","ich","hic","ked","hich","uch","ud","ied","edi","ethi","uth"]},"61":{"input":[1,3,4,5,6],"tlw":["face",4765],"trw":["idea",2885],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["but",49620],"trw":["office",2363],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["about",23108],"trw":["hoped",506],"lp":[],"rp":[]},"64":{"input":[7],"base":"n","baseshift":"N","trp":["nn",20957],"trw":["n",169],"lp":[],"rp":["nn"]},"65":{"input":[1,7],"base":"'","baseshift":"\"","tlp":["an",578917],"trp":["na",51349],"tlw":["an",29559],"trw":["'",14271],"lp":["an","ann","an'","ana","anna","a'","a'a","aan"],"rp":["na","n'","nan","nna","''","'a","nann","'an","'n"],"special":"punc"},"66":{"input":[2,7],"base":"q","baseshift":"Q","trp":["on",380429],"tlw":["q",103],"trw":["on",61313],"lp":[],"rp":["on","no","oon","nno","ono","onn","non","noo","noon","nq","onq","nnon","oq"]},"67":{"input":[1,2,7],"tlp":["ano",7268],"trp":["on'",11539],"trw":["o'",138],"lp":["ano","anno","aq","anon","anq"],"rp":["on'","ona","o'","oan","onna","onan","noa","'no","oan'","'o"]},"68":{"input":[3,7],"base":"v","baseshift":"V","tlp":["ve",240401],"trp":["en",361122],"tlw":["v",386],"trw":["even",12216],"lp":["ve","ven"],"rp":["en","ne","ev","eve","een","even","ene","nev","nv","neve","nee","nne","nve","enn","nen","nven","enne","env"]},"69":{"input":[1,3,7],"tlp":["av",63772],"trp":["e'",16794],"tlw":["van",633],"lp":["av","ave","va","ane","van","anne","aven","ava"],"rp":["e'","ean","eav","nea","'v","'ve","eave","en'","ena","eva","ne'","nav"]},"70":{"input":[2,3,7],"tlp":["vo",13509],"trp":["one",63385],"tlw":["von",319],"trw":["one",30730],"lp":["vo","von"],"rp":["one","ov","ove","eq","eno","onv","eon","eone","onve","onne","evo","nov","nvo","none","nove","nnov","onen","eov"]},"71":{"input":[1,2,3,7],"tlp":["avo",2634],"trp":["one'",1039],"lp":["avo","aneo"],"rp":["one'","ova","nova","eano","eavo","oe'","eona","oane","ovna"]},"72":{"input":[4,7],"base":"x","baseshift":"X","tlp":["xi",4595],"trp":["in",644105],"tlw":["x",233],"trw":["in",155002],"lp":["xi","xin","xii","xiii"],"rp":["in","ni","nin","ini","inn","ix","nni","inin","nnin","inni","nx","nxi","nix","ixi","ixin"]},"73":{"input":[1,4,7],"tlp":["ain",43995],"trp":["i'",14185],"tlw":["pain",1250],"trw":["'i",461],"lp":["ain","xp","ani","pan","pin","xa","pain","ppin","pani","aini","ax","anin","xan","apan","anx"],"rp":["i'","ina","ian","nia","inan"]},"74":{"input":[2,4,7],"trp":["ion",94353],"trw":["nixon",129],"lp":[],"rp":["ion","ny","oin","yin","yon","nio","oni","nion","ox","nyo","nyon","yn","iq","ony","nny","inno","iny","inio","ino","niq"]},"75":{"input":[1,2,4,7],"tlp":["any",30867],"trp":["iona",6976],"tlw":["any",10758],"trw":["opinion",667],"lp":["any","pon","poin","ayin","pany","anyo","apon","anio","xpo","any'","ay'","ppon"],"rp":["iona","y'","opin","yan","onia","ny'","iano","yna"]},"76":{"input":[3,4,7],"tlp":["vi",54014],"trp":["un",97406],"tlw":["vi",155],"trw":["nine",768],"lp":["vi","vin","vie"],"rp":["un","iv","ive","ex","ine","ien","nu","ivi","uni","ein","eni","inu","iev","inv","evi","ieve","nex"]},"77":{"input":[1,3,4,7],"tlp":["pen",17197],"trp":["exp",16071],"tlw":["avenue",408],"trw":["i've",2219],"lp":["pen","xpe","avi","avin","aine","ppen","pene","pine","aun"],"rp":["exp","expe","u'","exa","iva","i'v","i've","epen","una","eani","eavi"]},"78":{"input":[2,3,4,7],"tlp":["qu",27187],"trp":["oun",39137],"tlw":["queen",763],"trw":["union",600],"lp":["qu","qui","que","vio","voi","viou","quen"],"rp":["oun","equ","nou","ovi","youn","ney","enou","yone","oney","equi","eque","ovin","ovie"]},"79":{"input":[1,2,3,4,7],"tlw":["anyone",1715],"trw":["upon",4442],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"g","baseshift":"G","tlp":["gh",90668],"trp":["ng",301290],"tlw":["g",298],"lp":["gh","gn","gg"],"rp":["ng","hn","nh","ngn","ngh","hnn"]},"81":{"input":[1,5,7],"tlp":["ag",47829],"trp":["han",36890],"tlw":["gang",279],"trw":["hang",373],"lp":["ag","ga","ang","aga","gan","anag","gna","gag","agg","g'","agn","agan","gang"],"rp":["han","hang","nag","nha","nga","ngag","ng'"]},"82":{"input":[2,5,7],"tlp":["go",53049],"trp":["ong",22252],"tlw":["go",9032],"lp":["go","goo","gon","bon","gno","gho","ghb","ghbo","goog"],"rp":["ong","og","hon","ohn","ogn","nob","hono","nobo","oog","nb","hno"]},"83":{"input":[1,2,5,7],"tlp":["ban",5102],"trp":["nab",1526],"tlw":["ago",1471],"trw":["noah",100],"lp":["ban","ago","goa","bag","aban","agon","gab","bona","bagh"],"rp":["nab","ho'","onab","oga","nhab","ogan","onag","'b","noah","ohn'","'oh"]},"84":{"input":[3,5,7],"tlp":["ge",97282],"trp":["hen",50214],"tlw":["gene",85],"trw":["egg",150],"lp":["ge","gen","gene","gge","ghe","gne","veh"],"rp":["hen","eg","nge","eng","ege","nj","enj","enge","neg","hene","egg","egen","nhe"]},"85":{"input":[1,3,5,7],"tlp":["age",21698],"trp":["hav",41867],"tlw":["gave",3038],"trw":["have",35739],"lp":["age","ange","gav","gave","agen","gage","vag"],"rp":["hav","have","he'","ega","egan","nage","heav","eag","ehav","jan","enga","jean","jane"]},"86":{"input":[2,3,5,7],"tlp":["been",20749],"trp":["oge",4232],"tlw":["been",20749],"trw":["john",1863],"lp":["been","beg","ben","gone","gov","bov","bove","gove","bene","geo","bv","goe"],"rp":["oge","onge","hone","john","njo","enjo","ego","obv"]},"87":{"input":[1,2,3,5,7],"tlw":["began",3725],"trw":["joan",332],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["gi",33313],"trp":["ing",245338],"tlw":["fig",732],"trw":["high",3405],"lp":["gi","fin","gin","fig","ging"],"rp":["ing","ig","hin","igh","hing","ning","nf","ign","nig","nigh","hig","high","inf","ngi","ngin"]},"89":{"input":[1,4,5,7],"tlp":["gai",12716],"trp":["iga",1887],"tlw":["again",7165],"trw":["hanging",518],"lp":["gai","gain","agai","ping","fina","agi","agin","aig","gani","fan","gina","aigh","pag","angi","gia","aign"],"rp":["iga","iag","igna","nfa"]},"90":{"input":[2,4,5,7],"tlp":["goi",7117],"trp":["ying",10969],"tlw":["going",6947],"trw":["ongoing",108],"lp":["goi","goin","big","gy","bin","gio","bing","box"],"rp":["ying","oing","onf","nfo","info","onfi","ogni","ogi","igio","igno","ogy","ighb"]},"91":{"input":[1,2,4,5,7],"tlw":["paying",444],"trw":["hoping",381],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["gu",19194],"trp":["ug",51619],"tlw":["give",3971],"trw":["evening",1505],"lp":["gu","ving","giv","give","gue","fiv","five","fun","gine"],"rp":["ug","ugh","eing","ung","eig","hun","egi","eigh","ugg","ehin","egin"]},"93":{"input":[1,3,4,5,7],"tlw":["page",587],"trw":["having",3594],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["being",7746],"trw":["enough",4614],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["phone",1178],"trw":["heavy",1152],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"r","baseshift":"R","tlp":["rt",81050],"trp":["nt",218499],"tlw":["r",211],"lp":["rt","tr","rn","rr","tn","ttr","rtn","rtr","rnt"],"rp":["nt","ntr","nr"]},"97":{"input":[1,6,7],"tlp":["ar",265629],"trp":["'t",37625],"tlw":["ran",1611],"lp":["ar","ra","ant","art","tra","tan","rat","ran","t'","arr","tar","rta","arn","tant","ara"],"rp":["'t","n't","nat","nta","'r"]},"98":{"input":[2,6,7],"tlp":["ro",170933],"trp":["or",314634],"tlw":["town",2110],"trw":["not",43106],"lp":["ro","wor","wn","tor","ron","tro","row","roo","wr","ton"],"rp":["or","not","now","own","ort","nto","ont","oor","nor","orn"]},"99":{"input":[1,2,6,7],"tlp":["war",17594],"trp":["on't",11002],"tlw":["want",6609],"trw":["narrow",524],"lp":["war","wan","want","aro","anot","roa","raw","rwa","rwar","awar","won'","awn"],"rp":["on't","orta","ora","owar","onta","oar","orwa","orat"]},"100":{"input":[3,6,7],"tlp":["re",464927],"trp":["er",558051],"tlw":["ten",1916],"trw":["never",9168],"lp":["re","ver","ter","cr","ten","rc","ren","ree","rec","tter"],"rp":["er","ere","ent","nc","nce","ever","nte","enc","ence","ner"]},"101":{"input":[1,3,6,7],"tlp":["rea",59674],"trp":["ear",54836],"tlw":["are",29172],"trw":["near",2012],"lp":["rea","are","can","anc","reat","ance","car","rac","ater","rate","crea","ract","arc","care","ante"],"rp":["ear","era","'re","erat","earn"]},"102":{"input":[2,3,6,7],"tlp":["wer",47082],"trp":["ore",43307],"tlw":["were",34909],"trw":["over",12910],"lp":["wer","con","were","cont","wen","went","cor","cro","rov","ween","conc","rew"],"rp":["ore","over","new","onc","once","ower","orc","econ"]},"103":{"input":[1,2,3,6,7],"tlw":["water",2519],"trw":["ocean",381],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["ri",146328],"trp":["ir",91496],"tlw":["tin",227],"trw":["ink",130],"lp":["ri","tin","rk","rin","rit","tri","rri","xt","rti","rni","ttin","rnin"],"rp":["ir","int","kin","kn","nti","nk","ink","nit"]},"105":{"input":[1,4,6,7],"tlp":["pr",76723],"trp":["it'",8789],"tlw":["part",4589],"lp":["pr","par","part","pri","rai","air","ari","tain","ark","arri","rati","rp","arti","ria","akin","ank","rain","trai"],"rp":["it'","nati"]},"106":{"input":[2,4,6,7],"tlp":["tion",71969],"trp":["kno",19117],"tlw":["work",8749],"trw":["into",18343],"lp":["tion","ry","work","win","try","rio","rry","tory","rty","wri","writ"],"rp":["kno","into","ork","know","ori","ory","oint","ntio","owin"]},"107":{"input":[1,2,4,6,7],"tlw":["point",3165],"trw":["nation",393],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["ru",29549],"trp":["ur",136165],"tlw":["turn",2317],"trw":["next",4617],"lp":["ru","tur","rie","tiv","ric","ture","rien","tru","tive","turn"],"rp":["ur","eir","ure","eri","unt","ire","inc","inte","urn","enti"]},"109":{"input":[1,3,4,6,7],"tlw":["taken",2592],"trw":["experience",2559],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["very",10569],"trw":["your",20504],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["power",3130],"trw":["you're",4043],"lp":[],"rp":[]},"112":{"input":[5,6,7],"tlp":["ght",56087],"trp":["nd",415919],"tlw":["dr",852],"trw":["nd",119],"lp":["ght","rd","gr","dr","thr","rg","dn","rth","dg","rh","gt","gth","ddr"],"rp":["nd","hr","nth","ndr","ngt","ngr","ngth"]},"113":{"input":[1,5,6,7],"tlp":["and",307129],"trp":["har",16333],"tlw":["and",266855],"trw":["hand",5168],"lp":["and","ard","than","dn'","dn't","gra","arg","tand","rad","dar","dan","gar","dra","rang"],"rp":["har","hand","'d","hat'","hard","nda"]},"114":{"input":[2,5,6,7],"tlp":["br",30536],"trp":["ord",17538],"tlw":["down",11247],"trw":["north",1391],"lp":["br","don","thro","down","good","bro","gro","got","rob","word","bor","rod","door"],"rp":["ord","ond","hro","noth","hor","org","ndo"]},"115":{"input":[1,2,5,6,7],"tlw":["don't",9569],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["ther",83716],"trp":["her",160213],"tlw":["there",23867],"trw":["her",47940],"lp":["ther","red","der","get","then","gre","den","ger","ved","dre","rge","rned"],"rp":["her","here","ned","nde","end","nder","ered","nted"]},"117":{"input":[1,3,5,6,7],"tlw":["great",6807],"trw":["heard",3016],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["when",27718],"trw":["other",13909],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["another",6638],"trw":["edward",463],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["fr",62589],"trp":["ight",39009],"tlw":["think",7751],"trw":["night",4461],"lp":["fr","thin","ting","din","ding","ring","fir","rig","righ","fri","rf","didn","find"],"rp":["ight","ind","king","ndi","hink","idn","ndin"]},"121":{"input":[1,4,5,6,7],"tlw":["didn't",7051],"trw":["i'd",3142],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["for",70927],"trw":["nothing",5093],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["anything",3884],"trw":["ordinary",614],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["their",26687],"trw":["under",4429],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["after",12071],"trw":["happened",1976],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["before",10203],"trw":["often",3952],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["around",6455],"trw":["opened",1401],"lp":[],"rp":[]},"128":{"input":[8],"base":"s","baseshift":"S","tlp":["ss",89478],"tlw":["s",2993],"lp":["ss"],"rp":[]},"129":{"input":[1,8],"base":"-","baseshift":"_","tlp":["as",286499],"trp":["-s",481],"tlw":["as",63759],"trw":["-",1362],"lp":["as","sa","ass","ssa","assa","asa","sas","saa","ssas","sass"],"rp":["-s","-a"],"special":"punc"},"130":{"input":[2,8],"tlp":["so",117437],"trp":["os",70799],"tlw":["so",27040],"lp":["so","soo","sso"],"rp":["os","oss","oos","oso"],"special":"bksp","base":"os"},"131":{"input":[1,2,8],"tlp":["aso",4273],"trp":["oas",835],"lp":["aso","asso","soa","aos","so-"],"rp":["oas","o-","osa","ossa","-o"]},"132":{"input":[3,8],"base":")","baseshift":"]","tlp":["se",231764],"trp":["es",259811],"tlw":["see",9997],"lp":["se","see","sse","ses","sses","sess","sees"],"rp":["es","ess","ese","esse","ees","eese"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["ase",11581],"trp":["eas",23956],"tlw":["sea",1374],"trw":["ease",378],"lp":["ase","sea","asse","ases","seas"],"rp":["eas","ease","essa","esea","easa","e-","-e","eass","-se","e-a","-es"]},"134":{"input":[2,3,8],"tlp":["soe",138],"trp":["ose",25993],"lp":["soe"],"rp":["ose","oes","osse","oose","eso","esso","oses","eos"]},"135":{"input":[1,2,3,8],"trp":["easo",4023],"lp":[],"rp":["easo"]},"136":{"input":[4,8],"base":"?","baseshift":"/","tlp":["si",120170],"trp":["is",263616],"trw":["is",60295],"lp":["si","ssi","sis","ssis","siss"],"rp":["is","isi","iss","issi","isis"],"special":"punc"},"137":{"input":[1,4,8],"tlp":["sp",40374],"trp":["ips",2652],"tlw":["pass",1068],"lp":["sp","sai","ps","pas","asi","pass","spi","assi","spa","aps","ais","sia","sap","asp","sapp","ssia"],"rp":["ips","isa","isp","isap"]},"138":{"input":[2,4,8],"tlp":["sio",15825],"trp":["ys",27984],"lp":["sio","sy","ssio","sys","ssy"],"rp":["ys","osi","ossi","isio","iso","ysi","oys","ois","ios","ysis","iosi","yos","yoss","oosi","osio"]},"139":{"input":[1,2,4,8],"tlp":["pos",16560],"trp":["osp",1974],"tlw":["say",7781],"lp":["pos","ays","say","spo","poss","posi","says","ppos","asy","asio","sayi","psy","sop"],"rp":["osp","ops","y-","ospi","oops","opos","osop"]},"140":{"input":[3,4,8],"tlp":["su",62257],"trp":["us",124701],"tlw":["sue",76],"trw":["us",10609],"lp":["su","ssu","sus","sui","sue","sie"],"rp":["us","use","ies","ise","usi","esi","ues","essi","esu","uss","usu","uis","ussi","uses"]},"141":{"input":[1,3,4,8],"tlp":["spe",18659],"trp":["esp",8233],"tlw":["pause",378],"trw":["usa",134],"lp":["spe","aus","ause","sup","supp","sua","spea","asu","sep","aise","assu","spee","pus"],"rp":["esp","espe","usa","usua","easi","easu","ups"]},"142":{"input":[2,3,4,8],"tlp":["sou",7964],"trp":["ous",26493],"trw":["eyes",5472],"lp":["sou","sey"],"rp":["ous","ious","yes","ouse","eyes","yse","usio","usy","uys","esou","yees","oise","ouis","ousi","eous","eys","uous","osu"]},"143":{"input":[1,2,3,4,8],"tlw":["suppose",803],"trw":["easy",1561],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","tlp":["sh",119750],"trp":["ms",20491],"trw":["m",1273],"lp":["sh","sm","shm","ssm","ssh"],"rp":["ms","mm","hs","hm","mms"]},"145":{"input":[1,5,8],"tlp":["am",72035],"trp":["ma",137500],"tlw":["am",4235],"trw":["has",11125],"lp":["am","sha","sam","sma","ash","ama","ams","sham","amm","aham","asm","asha"],"rp":["ma","has","mas","ham","mma","mass","-m","-ma"]},"146":{"input":[2,5,8],"tlp":["som",32033],"trp":["om",158331],"tlw":["boss",848],"trw":["mom",1398],"lp":["som","sho","bs","sb","bos","smo"],"rp":["om","mo","mb","mos","hos","omm","hom","oom","mom","obs","mmo","ommo","omb","moo"]},"147":{"input":[1,2,5,8],"tlp":["amo",4702],"trp":["oma",6690],"tlw":["bass",106],"trw":["obama",363],"lp":["amo","bas","amb","abs","sba","abso","bass","bam","bama","amba"],"rp":["oma","omma","mba","mbas","homa","omas","obam","hamb","-b","omba"]},"148":{"input":[3,5,8],"tlp":["she",58316],"trp":["me",235102],"tlw":["she",45928],"trw":["me",30278],"lp":["she","seem"],"rp":["me","em","hem","eme","hes","mes","hese","eem","mse","mem","ems","mme","eeme","emem","mee","hems","emse","eems"]},"149":{"input":[1,3,5,8],"tlp":["ame",34012],"trp":["mea",9606],"tlw":["same",6718],"trw":["james",771],"lp":["ame","same","ames","ashe","amme"],"rp":["mea","ema","eam","maj","hame","jam","meas","eams","hase","jame","eame","emma","e-m","e-ma","mae"]},"150":{"input":[2,3,5,8],"tlp":["some",31924],"trp":["ome",63421],"tlw":["some",15162],"trw":["home",4865],"lp":["some","bes","bse","semb"],"rp":["ome","hose","mbe","emb","embe","emo","home","memb","mome","meo","omeo","omes","obse","memo","omme","jobs"]},"151":{"input":[1,2,3,5,8],"tlw":["base",538],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["shi",11339],"trp":["his",109386],"tlw":["fish",451],"trw":["his",69304],"lp":["shi","sim","smi","sf","fis"],"rp":["his","im","mi","him","ish","mis","ims","hims","miss","imi","mmi","imm","mf","ism","isf"]},"153":{"input":[1,4,5,8],"tlp":["ami",8211],"trp":["mp",43386],"tlw":["ship",877],"trw":["map",280],"lp":["ami","fam","fami","ship","amp","simp","fas","aim","ashi","saf","pm"],"rp":["mp","imp","mpa","ima","mai","haps","iam","hips","-f"],"special":"numsym"},"154":{"input":[2,4,5,8],"tlp":["sib",6869],"trp":["my",49697],"tlw":["boys",1175],"trw":["my",40423],"lp":["sib","ssib","sof","sibi","boys","sym","shio"],"rp":["my","omi","mys","ym","mbi","omis","hys","ommi","hysi","omf","mfo","omfo","imb"]},"155":{"input":[1,2,4,5,8],"tlw":["shop",667],"trw":["may",6928],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["sum",4274],"trp":["ime",28758],"tlw":["sum",220],"trw":["jim",446],"lp":["sum","fes","suf","suff"],"rp":["ime","mu","um","jus","mus","imes","imse","ishe","hus","ume","ush","hum","emi","mmu","umm","imme"]},"157":{"input":[1,3,4,5,8],"tlw":["safe",789],"trw":["jump",350],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["busy",647],"trw":["house",4935],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["famous",816],"trw":["maybe",2276],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"z","baseshift":"Z","tlp":["st",260669],"tlw":["st",798],"lp":["st","ts","sts","zz","tst","tz","tts"],"rp":[]},"161":{"input":[1,6,8],"tlp":["sta",40389],"trp":["-t",1205],"tlw":["sat",2253],"lp":["sta","ast","stat","sat","az","tas","za","ats","zat","tast","t-","sast","asta","asts","t-s","t-t","azz","zza","tsta"],"rp":["-t"]},"162":{"input":[2,6,8],"tlp":["sto",21671],"trp":["ost",21248],"tlw":["toss",85],"trw":["oz",100],"lp":["sto","ws","sw","stoo","tos","swo","zo","wso","toss","tso","stot"],"rp":["ost","ows","ots","oz","oots","osts","osto","otos","otst"]},"163":{"input":[1,2,6,8],"tlp":["was",117615],"trp":["oast",835],"tlw":["was",112330],"lp":["was","saw","aws","to-","swa","wast","awso","asto","atso","wats","toas","sota"],"rp":["oast","oats","-tw","-two","-to","-to-","-w","-wo"]},"164":{"input":[3,6,8],"tlp":["ste",30114],"trp":["est",36800],"tlw":["set",3472],"lp":["ste","sc","ces","tes","ze","sec","cess","set","cts","cces","test","cs","tse","sett"],"rp":["est","esc","ets","este","ects","eces"]},"165":{"input":[1,3,6,8],"tlp":["cas",7637],"trp":["east",4973],"tlw":["case",2870],"trw":["east",920],"lp":["cas","ates","aste","case","sca","stea","aces","ccas","seat","sac","cast","aze","acts","stac","asc"],"rp":["east","esta","esca","-c","eats"]},"166":{"input":[2,3,6,8],"tlp":["swe",5581],"trp":["ews",3282],"tlw":["west",1068],"lp":["swe","soc","sco","seco","wes","west","cos","cost","ssoc","stoc","swee","scot","sew"],"rp":["ews","oces","otes","oze","esto","oste","osc"]},"167":{"input":[1,2,3,6,8],"tlw":["coast",540],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["sti",24448],"trp":["ist",28091],"tlw":["sit",1264],"trw":["its",10155],"lp":["sti","sk","sit","sist","tis","siti","ski","zi","tsi","tist","sitt","stit"],"rp":["ist","its","ks","iz","isti","isit","ists","itis"]},"169":{"input":[1,4,6,8],"tlp":["ask",11409],"trp":["ista",3836],"tlw":["ask",2497],"lp":["ask","sati","past","spit","azi","zati","stai","stak","atis","task","asti","asks","aski","stia","sak","pts","sita"],"rp":["ista","iza","izat"]},"170":{"input":[2,4,6,8],"tlp":["wis",5185],"trp":["osit",4706],"tlw":["sky",622],"lp":["wis","stio","syst","sity","sty","swi","sky","zy","swit","sito","twis","wist"],"rp":["osit","isto","yst","oks","ooks","izo","osti","isky"]},"171":{"input":[1,2,4,6,8],"tlw":["stop",1798],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["suc",11912],"trp":["ust",31229],"tlw":["success",1485],"lp":["suc","stu","ske","ties","cus","sic","sci","cis","succ","stic","cks"],"rp":["ust","iste","esti","ize","uest","kes","isc","uts","ices"]},"173":{"input":[1,3,4,6,8],"tlw":["speak",1583],"trw":["escape",642],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["weeks",1328],"trw":["keys",254],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["spoke",1285],"trw":["opposite",687],"lp":[],"rp":[]},"176":{"input":[5,6,8],"tlp":["ds",32521],"trp":["hts",3276],"lp":["ds","tm","ths","dm","sd","stm","dsh","dds","dst","thm","thst","sht","sth"],"rp":["hts","mst","mt","mth","htm","hst"]},"177":{"input":[1,5,6,8],"tlp":["adm",2373],"trp":["mat",11909],"tlw":["sad",457],"trw":["mad",373],"lp":["adm","dam","ads","sad","shad","tma","adam","amaz","sda","atm","stma","tmas","d-"],"rp":["mat","mad","matt","mast","msta","maz","hast"]},"178":{"input":[2,5,6,8],"tlp":["thos",7914],"trp":["most",15009],"tlw":["show",2474],"trw":["most",10396],"lp":["thos","wom","show","tom","dom","whom","whos","stom","shot","dows","bst","doz","ttom"],"rp":["most","mot","moth","mod","ods","host","oods"]},"179":{"input":[1,2,5,6,8],"tlw":["thomas",561],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["them",24753],"trp":["med",15366],"tlw":["them",21593],"trw":["met",1822],"lp":["them","sed","des","thes","tem","ssed","shed","sch","sted","tme","ches","dem","zed","desc","stem"],"rp":["med","met","meth","emed","meet"]},"181":{"input":[1,3,5,6,8],"tlw":["came",6889],"trw":["made",9696],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["those",7914],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["became",2829],"trw":["matthew",262],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["this",36089],"trp":["mit",4914],"tlw":["this",36089],"trw":["kids",1451],"lp":["this","tim","sid","dis","dist","dmi","tsid","tish","tisf"],"rp":["mit","hist","mid","mist","ids","mitt","midd","kids","mmit","imit","mik"]},"185":{"input":[1,4,5,6,8],"tlw":["said",23960],"trw":["maid",197],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"tlw":["books",1442],"trw":["myth",226],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["days",3754],"trw":["habits",317],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["time",17984],"trw":["just",14589],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["asked",5484],"trw":["make",9390],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["sometimes",2685],"trw":["outside",2061],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["because",9879],"trw":["empty",823],"lp":[],"rp":[]},"192":{"input":[7,8],"base":"l","baseshift":"L","tlp":["sl",14047],"trp":["ll",183975],"trw":["l",235],"lp":["sl","sn","ssl"],"rp":["ll","ns","ls","nl","lls","ln","lln","nsl","nns"]},"193":{"input":[1,7,8],"tlp":["al",228009],"trp":["la",103279],"tlw":["all",30772],"trw":["la",689],"lp":["al","all","als","ans","sn'","san","asn","asn'","sla"],"rp":["la","'s","lan","nal","las","'l","'ll","lla","lass","nall","n's"]},"194":{"input":[2,7,8],"tlp":["son",18915],"trp":["lo",103908],"tlw":["soon",3191],"trw":["loss",625],"lp":["son","sol","soon","slo","sons","sq"],"rp":["lo","ol","ons","loo","lon","onl","oll","los","llo","lso","ool","olo","ollo","ols"]},"195":{"input":[1,2,7,8],"tlp":["also",7989],"trp":["onal",8944],"tlw":["also",7989],"trw":["loan",120],"lp":["also","alo","alon","ason","sona","allo","sola","son'"],"rp":["onal","olla","oal","ola","loa","oals","on's","o's","osal","olan","loan","o-n"]},"196":{"input":[3,7,8],"tlp":["sel",25483],"trp":["le",213808],"tlw":["seen",3375],"trw":["less",3333],"lp":["sel","sen","ves","vel"],"rp":["le","el","ell","lle","les","nes","ens","ness","eel","len","less","ele","lv","nse","lve","els"]},"197":{"input":[1,3,7,8],"tlp":["alle",8964],"trp":["lea",26849],"tlw":["save",729],"trw":["leave",2148],"lp":["alle","ale","val","sav","avel","vas","aves"],"rp":["lea","eal","e's","leas","ela","eall","leav","eans","lean","esn'","e'l","e'll","lane"]},"198":{"input":[2,3,7,8],"tlp":["vol",4101],"trp":["ole",7645],"tlw":["solve",211],"trw":["love",3654],"lp":["vol","velo","volv","sov"],"rp":["ole","lov","love","lose","elo","olle","lone","ones","olv","olve","ello","oesn","onse","nvol","olen","evol"]},"199":{"input":[1,2,3,7,8],"tlw":["alone",2184],"trw":["one's",680],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["sin",21536],"trp":["li",155342],"tlw":["six",1928],"trw":["ill",512],"lp":["sin","sil","ssin","six","sli","xis"],"rp":["li","il","ill","lin","ins","lli","nsi","ili","lis","llin","nis","illi","insi","inis"]},"201":{"input":[1,4,7,8],"tlp":["pl",68379],"trp":["ial",13366],"tlw":["plan",1335],"trw":["i'll",2287],"lp":["pl","pla","ali","ail","ains","plan","pli","xpl","plai","ppl","xpla"],"rp":["ial","lp","lai","lia","inal","lain","iall","lip","ila"]},"202":{"input":[2,4,7,8],"tlp":["sion",15757],"trp":["ly",122921],"tlw":["sly",561],"trw":["only",13824],"lp":["sion","sly"],"rp":["ly","lly","ions","nly","only","ily","oli","onsi","loy","lio","lion","ison","llio","ilo","oil","yl","inly","lyi"]},"203":{"input":[1,2,4,7,8],"tlw":["play",1696],"trw":["lay",1482],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["vis",5954],"trp":["ul",100189],"tlw":["sun",1066],"trw":["live",2131],"lp":["vis","visi","sine"],"rp":["ul","lu","ile","eli","lie","liv","ines","ull","live","usin","elie","line","lue","uil","elli","liev","elin"]},"205":{"input":[1,3,4,7,8],"tlw":["value",1339],"trw":["explain",790],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["soul",950],"trw":["louis",534],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"tlw":["people",14668],"trw":["usually",1445],"lp":[],"rp":[]},"208":{"input":[5,7,8],"tlp":["gs",15960],"trp":["ngs",13154],"lp":["gs","gl","ghl","ggl","gm","gns","sg","ghs","gnm","ggs"],"rp":["ngs","ngl","lm","nm","hl","nsh","mn","lg","ml","lsh"]},"209":{"input":[1,5,7,8],"tlp":["alm",5014],"trp":["man",42306],"tlw":["small",3786],"trw":["man",9572],"lp":["alm","gla","smal","shal","gam","glan","sag","glas"],"rp":["man","mal","hal","'m","nam","mag","mall","hall","mana","mann","mman","lang"]},"210":{"input":[2,5,7,8],"tlp":["bl",48180],"trp":["mon",15025],"tlw":["song",454],"trw":["long",7506],"lp":["bl","blo","bloo","gol","glo"],"rp":["mon","long","hol","hool","lmo","lmos","obl","log","mong","mbl","mmon","olog","nom","onsh","onom"]},"211":{"input":[1,2,5,7,8],"tlw":["along",3060],"trw":["lab",187],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["ges",7464],"trp":["men",40378],"tlw":["smell",549],"trw":["men",6294],"lp":["ges","gle","vem","gges","veme"],"rp":["men","hel","msel","emen","lem","leg","engl","nme","nmen","ngle","lege","mel","hell","leng","lleg"]},"213":{"input":[1,3,5,7,8],"tlw":["game",1331],"trw":["name",3325],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["someone",3001],"trw":["move",1750],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["able",2600],"trw":["ebola",147],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["fl",14707],"trp":["min",22065],"tlw":["sign",979],"trw":["hill",676],"lp":["fl","sing","sig","sign","fil"],"rp":["min","lf","hil","mil","ling","ings","lif","lig","ligh","mig","migh","ming","lish","mili","nish"]},"217":{"input":[1,4,5,7,8],"tlw":["fall",1195],"trw":["i'm",6537],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["bill",951],"trw":["million",900],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["family",3955],"trw":["many",8068],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["feel",4278],"trw":["life",8740],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["simple",1385],"trw":["help",3633],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["business",3695],"trw":["money",3556],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["possible",2350],"trw":["impossible",978],"lp":[],"rp":[]},"224":{"input":[6,7,8],"tlp":["rs",105128],"trp":["lt",24155],"lp":["rs","tl","str","rl","rst","ttl","rts","rns","rls","stl","rtl","sr"],"rp":["lt","nts","nst","ntl","lr","nstr","lts","nz"]},"225":{"input":[1,6,7,8],"tlp":["t's",15472],"trp":["lat",15533],"tlw":["start",1979],"trw":["last",4981],"lp":["t's","tal","ars","stan","ral","arl","star","stra","sn't","alt","at's","alr","r's","rsta","ants","ras"],"rp":["lat","lar","last","nsta"]},"226":{"input":[2,6,7,8],"tlp":["stor",8576],"trp":["low",16681],"tlw":["sort",1672],"trw":["lot",2713],"lp":["stor","rso","rson","worl","ros","tol","rol","sor","ross","wl","stro"],"rp":["low","llow","ors","orl","lw","lot","lor","nsw","owl"]},"227":{"input":[1,2,6,7,8],"tlw":["wasn't",3475],"trw":["law",1217],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["res",45093],"trp":["ers",54211],"tlw":["tell",4528],"trw":["let",4207],"lp":["res","cl","tle","tel","rse","ser","ttle","rel","ress","cle","ster","rest","tell","serv","sent","rese","stre"],"rp":["ers","ents","let"]},"229":{"input":[1,3,6,7,8],"tlw":["call",2856],"trw":["later",4588],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["well",8952],"trw":["news",1412],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["across",2659],"trw":["local",1100],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["til",13601],"trp":["lik",24097],"tlw":["still",7621],"trw":["list",991],"lp":["til","ris","till","stil","stin","sir"],"rp":["lik","lit","irs","irst","lk","inst","litt","ittl","ilit","irl","list","kil","ntil","kill"]},"233":{"input":[1,4,6,7,8],"tlw":["talk",2625],"trw":["it's",8558],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"tlw":["will",14271],"trw":["look",5477],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["always",6467],"trw":["national",867],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"tlw":["since",3793],"trw":["like",19390],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"tlw":["place",5268],"trw":["natural",1235],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["course",3730],"trw":["likely",1530],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["really",4931],"trw":["years",7833],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"tlp":["rm",33028],"trp":["ld",104617],"trw":["mr",4133],"lp":["rm","dl","rds","rld","rms","ghts","rsh","ddl","rtm","rnm"],"rp":["ld","nds","mr","ldn","lth","ldr","ndl","mrs","nths","htl"],"special":"enter"},"241":{"input":[1,5,6,7,8],"tlw":["that's",4282],"trw":["hands",3247],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["world",6250],"trw":["old",6168],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["almost",3784],"trw":["normal",610],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"tlw":["themselves",2651],"trw":["held",2063],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["called",4581],"trw":["large",2557],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["school",3844],"trw":["more",21171],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["table",2154],"trw":["major",1113],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"tlw":["first",11244],"trw":["might",6921],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["against",4423],"trw":["making",2931],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["from",35952],"trw":["looking",3174],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["probably",2197],"trw":["important",2765],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["felt",4669],"trw":["left",5159],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["perhaps",2737],"trw":["instead",2310],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["would",27522],"trw":["looked",5103],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["already",3329],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/en-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/en-keymap.json
new file mode 100644
index 00000000000..054183678a2
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/en-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",410],"tlw":["a",211837],"lp":["aa"],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",89478],"tlw":["s",2993],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["as",286499],"tlw":["was",112330],"lp":["as","wa","was","sa","aw","ass","ws","awa","sw","ssa","saw","assa","aws","asa","swa","sas","ww","saa","www","ssas"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",129154],"tlw":["e",471],"lp":["ee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ea",216643],"tlw":["x",233],"lp":["ea","ex","xa","exa","xe","exe","ax","ae","axe","eea"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["ed",326541],"tlw":["see",9997],"lp":["ed","es","se","de","ess","ds","see","sed","ese","ded","des","eed","sse","dd","ses","ssed","esse","dde","dee","sses"],"rp":[]},"7":{"input":[1,2,3],"tlp":["ad",140314],"tlw":["we",33258],"lp":["ad","we","da","ew","ead","eas","ade","dea","ase","wee","sea","wed","swe","wea","asse","ease","add","ews","eade","essa"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",55910],"tlw":["t",670],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["at",371419],"tlw":["at",51085],"lp":["at","ta","fa","ff","ft","af","att","aft","tat","fat","aff","tta","atta","tf","taf","taff","ata","ffa","affa","atf"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["st",260669],"tlw":["c",872],"lp":["st","ct","ts","sc","cc","tc","sts","cts","cs","tst","cst","tts","stc"],"rp":[]},"11":{"input":[1,2,4],"tlp":["ca",118675],"tlw":["fact",3233],"lp":["ca","ac","sta","act","tw","ast","fac","cat","acc","cas","stat","wat","sat","atc","fact","tac","sca","watc","sf","fas"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["er",558051],"tlw":["tree",670],"lp":["er","re","te","et","ere","rt","tr","ter","rr","tte","ree","ett","tter","tre","ret","eet","ert","ette","ete","rte"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ar",265629],"tlw":["are",29172],"lp":["ar","ra","fe","fr","rea","ear","are","ate","ef","art","eat","tra","rat","fte","reat","era","ffe","arr","afte","fter"],"rp":[]},"14":{"input":[2,3,4],"tlp":["ce",144944],"tlw":["set",3472],"lp":["ce","rs","ec","ers","ted","rd","res","est","red","der","cr","ect","ste","dr","str","rc","ces","rst","rec","rse"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["wer",47082],"tlw":["were",34909],"lp":["wer","were","ard","ace","war","car","eca","ars","eac","read","rac","ears","ated","wr","ward","star","twe","stra","crea","reas"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",20957],"trw":["n",169],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",578917],"trp":["na",51349],"tlw":["an",29559],"lp":["an","ann","ana","anna","aq","aan","anq"],"rp":["na","nan","nna","nq","nann"]},"18":{"input":[2,5],"base":"j","baseshift":"J","tlp":["sn",9321],"trp":["ns",85305],"trw":["j",365],"lp":["sn"],"rp":["ns","nj","nns"]},"19":{"input":[1,2,5],"tlp":["wn",31110],"trp":["ja",7328],"tlw":["san",544],"trw":["jaw",167],"lp":["wn","ans","wan","san","asn","answ","wasn","aj","sq","awn","asan","sna","wns","anw"],"rp":["ja","nsw","jan","nw","nsa","nwa"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",361122],"trp":["ne",208843],"tlw":["eye",1504],"trw":["ye",442],"lp":["en","ey","een","ene","eye","enn","enne","eny","enny"],"rp":["ne","ye","ny","nee","nne","ney","yn","nen","nny","yee","yne"]},"21":{"input":[1,3,5],"tlp":["ay",87083],"trp":["yea",12043],"tlw":["any",10758],"trw":["nay",83],"lp":["ay","any","ean","eq","ane","aye","anne","ena","xan","exan","anx","eane","enan","enea"],"rp":["yea","nea","nex","ya","nx","yan"]},"22":{"input":[2,3,5],"tlp":["end",27020],"trp":["nd",415919],"tlw":["eyes",5472],"trw":["need",4397],"lp":["end","dy","den","sen","dn","ens","sy","ense"],"rp":["nd","ned","ys","nde","nes","nds","ness","je","yes","nse","need","nded"]},"23":{"input":[1,2,3,5],"tlp":["and",307129],"trp":["new",18090],"tlw":["and",266855],"trw":["new",10172],"lp":["and","way","day","ays","say","wen","ways","ady","ands","away","eady","ween","dan","days","ande","says","sand"],"rp":["new","nda","nswe"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["bt",3003],"trp":["nt",218499],"tlw":["b",695],"lp":["bt","tn","bb","tb"],"rp":["nt","nb"]},"25":{"input":[1,4,5],"tlp":["ab",55519],"trp":["nat",11510],"tlw":["fan",245],"lp":["ab","ba","ant","tan","tant","tab","ban","bab","bat","fan","batt","anta","fant","abb"],"rp":["nat","nf","nta","nab","nfa","nant"]},"26":{"input":[2,4,5],"tlp":["bs",6980],"trp":["nc",79565],"tlw":["bc",95],"lp":["bs","bj","sb","bst","bts","bc","bsc","bbs","cn","cb","cbs","stn"],"rp":["nc","nts","nst","nsc","nct","ncts"]},"27":{"input":[1,2,4,5],"tlp":["can",27607],"trp":["nsta",3211],"tlw":["can",15149],"lp":["can","anc","stan","bac","want","tanc","bas","ants","cann","abs","sba","sban","stab","sant","cq","acq","cans"],"rp":["nsta","jac","nanc"]},"28":{"input":[3,4,5],"tlp":["be",175052],"trp":["nte",31075],"tlw":["be",44932],"trw":["yet",4449],"lp":["be","ent","ry","ty","rn","by","br","ery","ten","ren","bee","been","ber","rne","ern","bet"],"rp":["nte","ner","nter","ntr"]},"29":{"input":[1,3,4,5],"tlp":["ran",19074],"trp":["year",11125],"tlw":["ran",1611],"trw":["next",4617],"lp":["ran","ary","bef","arn","bea","ante","earn","bra","brea","aren","tran","ften","anyt","bar","rtan","req"],"rp":["year","nera","next","near"]},"30":{"input":[2,3,4,5],"tlp":["enc",25606],"trp":["nce",54473],"tlw":["best",3733],"lp":["enc","ence","bec","ents","cen","cent","rned","dent","sent","bes","renc","bed","cy","tend"],"rp":["nce","nder","nted","jec","ject","nces"]},"31":{"input":[1,2,3,4,5],"tlw":["went",6413],"trw":["years",7833],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",1762],"trw":["i",117501],"lp":[],"rp":["ii","iii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["ai",104869],"trp":["ia",38456],"tlw":["aziz",61],"lp":["ai","az","za","zi","azi","zz","azz","zza","ziz","aziz"],"rp":["ia","iz","iza","izi","izz","izza","iai"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["si",120170],"trp":["is",263616],"trw":["is",60295],"lp":["si","ssi","sk","sis","ski","sks","ssis"],"rp":["is","ki","ik","ks","isi","iss","issi","isk","kis","kiss","iki","isis","isks"]},"35":{"input":[1,2,6],"tlp":["wi",119378],"trp":["ka",3991],"tlw":["ask",2497],"trw":["kaa",57],"lp":["wi","ak","sai","ask","asi","aki","wis","assi","wai","ais","sia","swi","ssia","wak","asks","aski","siz","asis"],"rp":["ka","isa"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",51232],"trp":["ie",85987],"lp":["ei","eei"],"rp":["ie"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["ze",9545],"trp":["ize",5603],"tlw":["xiii",65],"trw":["ix",80],"lp":["ze","xi","exi","aze","ez","eez","eiz","eze","eeze","eize","xie","axi","zei","ezi","eezi","eizi"],"rp":["ize","ix","ixe","ixi"]},"38":{"input":[2,3,6],"tlp":["di",96016],"trp":["id",100069],"tlw":["did",12252],"trw":["kids",1451],"lp":["di","did","sid","side","dis","esi","edi","die","ek","eek","ske","essi"],"rp":["id","ke","ide","ike","ked","ies","ied","ise"]},"39":{"input":[1,2,3,6],"tlp":["ake",27987],"trp":["idea",4816],"tlw":["said",23960],"trw":["idea",2885],"lp":["ake","aid","said","eak","aske","adi","dia","akes","week","six","zed","eadi","easi","edia","xis","aise"],"rp":["idea","iew","ized","ida"]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",213739],"trp":["it",311028],"tlw":["tv",551],"trw":["it",92474],"lp":["ti","vi","tiv","tti","tit","vit","tivi","viv","titi","ttit","viti","tv"],"rp":["it","iv","iti","itt","ivi","itti","itiv","ivit"]},"41":{"input":[1,4,6],"tlp":["fi",67126],"trp":["if",58122],"tlw":["fit",689],"trw":["if",25154],"lp":["fi","av","ati","va","tai","ffi","avi","ait","fai","tia","tati","ativ","vat","tif"],"rp":["if","iff","ita","ift","iat","ifi"]},"42":{"input":[2,4,6],"tlp":["ck",51278],"trp":["ic",118179],"tlw":["sit",1264],"trw":["its",10155],"lp":["ck","ci","sti","cti","tic","sit","cit","vis","vic","sist","sic","ctiv","visi","tis"],"rp":["ic","ist","its","ick","ici","ict"]},"43":{"input":[1,2,4,6],"tlp":["wit",77056],"trp":["ica",19163],"tlw":["wait",1256],"trw":["isaac",209],"lp":["wit","ack","tak","fic","cia","acti","ffic","wait","tica","sati","cati","wif","taki","fici","aci"],"rp":["ica","ista","icat","ific","icia"]},"44":{"input":[3,4,6],"tlp":["ve",240401],"trp":["ir",91496],"tlw":["ever",4714],"trw":["ive",85],"lp":["ve","ri","ver","ev","eve","ever","eir","rie","eri","rit","rv","tri","rri","tive","erv","rti"],"rp":["ir","ive","ite","ire"]},"45":{"input":[1,3,4,6],"tlp":["ave",49806],"trp":["ife",12017],"tlw":["five",2604],"lp":["ave","fir","rai","air","ari","fri","arri","frie","rati","arti","ria","eav","trai","rtai","fie","eave"],"rp":["ife","iffe","ief","iate"]},"46":{"input":[2,3,4,6],"tlp":["rk",28978],"trp":["ice",25015],"tlw":["tried",2205],"lp":["rk","ved","ves","ric","ris","eci","ecti","serv","esti","ried","cri","rke","cke","vid","ties","vers"],"rp":["ice","irs","irst","iste"]},"47":{"input":[1,2,3,4,6],"tlw":["first",11244],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["in",644105],"trw":["in",155002],"lp":[],"rp":["in","hi","ni","hin","nin","ini","inn","nni","inin","hn","nnin","inni","nh","hni","inh","hini","hnn","ih"]},"49":{"input":[1,5,6],"tlp":["ain",43995],"trp":["ha",357027],"tlw":["ah",458],"trw":["han",268],"lp":["ain","ani","ah","aini","zin","anin","aniz","azin"],"rp":["ha","han","ina","ian","hai","niz","nia","iq","inan","niza","nha","niq"]},"50":{"input":[2,5,6],"tlp":["sh",119750],"trp":["his",109386],"tlw":["skin",661],"trw":["his",69304],"lp":["sh","sin","shi","ssin"],"rp":["his","kin","kn","nk","ins","ish","ink","nsi","hink","nis","nki","nkin","hs","nish","inki","insi"]},"51":{"input":[1,2,5,6],"tlp":["wh",148489],"trp":["has",13193],"tlw":["wish",1198],"trw":["has",11125],"lp":["wh","whi","wha","win","sha","ains","akin","ank","ash","wish","ashi","anks","wash","sian","anis","asin","whis"],"rp":["has","hank","ians"]},"52":{"input":[3,5,6],"tlp":["ein",10146],"trp":["he",1036192],"tlw":["eh",128],"trw":["he",92135],"lp":["ein","eh","eni","enin","ehi","ehin"],"rp":["he","hen","hey","ine","hei","ien","hy","yi","yin","hee","hie","nie","nei","inne"]},"53":{"input":[1,3,5,6],"tlp":["aine",5046],"trp":["hea",22882],"tlw":["annie",159],"trw":["yeah",918],"lp":["aine","ayi","ayin","eha","eani","zen","anie","ahe","anxi","ahea","eah","zy","zine","azy","xh","exh"],"rp":["hea","nize","nxi","yeah"]},"54":{"input":[2,3,5,6],"tlp":["she",58316],"trp":["ind",31046],"tlw":["she",45928],"trw":["kind",3481],"lp":["she","din","didn","shed"],"rp":["ind","hes","hed","ndi","hese","ines","ined","iend","iden","idn","kne","ndin","ken","nsid","ishe","indi"]},"55":{"input":[1,2,3,5,6],"tlw":["when",27718],"trw":["had",63389],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["th",1104883],"trp":["ith",80740],"tlw":["bit",1490],"trw":["hit",1079],"lp":["th","thi","thin","tin","bi","vin","ttin","bit"],"rp":["ith","ht","int","nti","ib","nv","nit","hit","inv","ntin","nth","ivin"]},"57":{"input":[1,4,5,6],"tlp":["tha",132122],"trp":["hat",148416],"tlw":["that",110865],"trw":["hat",521],"lp":["tha","that","ath","fin","than","tain","avin","fath","aint","van","fina","atin","abi","fini"],"rp":["hat","hav","inf","nati","havi","ntai"]},"58":{"input":[2,4,5,6],"tlp":["ch",138742],"trp":["ich",25423],"tlw":["this",36089],"trw":["nick",237],"lp":["ch","this","chi","tch","sib","chin","sch","ssib","stin","sinc","cin"],"rp":["ich","hic","hich","inc","inst","nch","nci","nic","hts"]},"59":{"input":[1,2,4,5,6],"tlw":["with",67032],"trw":["jack",1623],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["the",718961],"trp":["her",160213],"tlw":["the",506536],"trw":["her",47940],"lp":["the","ther","they","ven","thei","very","rin","thr","even","then","eth","enti","rien"],"rp":["her","here","heir","hr","ity","inte","nev"]},"61":{"input":[1,3,4,5,6],"tlw":["father",3696],"trw":["have",35739],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["these",9773],"trw":["interest",1336],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["where",9655],"trw":["heard",3016],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",93108],"trw":["o",531],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","tlp":["ao",915],"trp":["oa",14939],"lp":["ao"],"rp":["oa"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",117437],"trp":["os",70799],"tlw":["so",27040],"lp":["so","soo","sso"],"rp":["os","oss","oos","oso"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["wo",92580],"trp":["ow",122368],"tlw":["wow",113],"lp":["wo","aso","woo","asso","swo","wso","awso","soa","aos","wow","awo","sow"],"rp":["ow","ows","owa","oas","osa","ossa","owo"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["eo",22601],"trp":["oe",10755],"trw":["-",1362],"lp":["eo","e-"],"rp":["oe","o-","-e","-o"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["xo",296],"trp":["ox",1874],"lp":["xo","exo","e-a","axo"],"rp":["ox","oxe","-a"]},"70":{"input":[2,3,7],"tlp":["do",77376],"trp":["od",44403],"tlw":["do",18689],"trw":["odd",416],"lp":["do","doe","does","doo","eso","esso","edo"],"rp":["od","ose","ood","oes","ode","osed","odd","osse","ods","oose","oods","odde","oses"]},"71":{"input":[1,2,3,7],"tlp":["dow",14691],"trp":["owe",15537],"tlw":["wood",515],"trw":["owed",149],"lp":["dow","easo","ado","wood","dows","adow","sado","ewo"],"rp":["owe","owed","oad","owd","oda","owde","owds","-da","o-da","oads","oade","oxes"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["to",350815],"trp":["ot",133805],"tlw":["to",249163],"trw":["otto",67],"lp":["to","go","too","goo","got","gg","tog","gt","tto","gott","tot","gto"],"rp":["ot","og","ott","oot","oto","otto","oog","otog"]},"73":{"input":[1,4,7],"tlp":["fo",133745],"trp":["of",272457],"tlw":["ago",1471],"trw":["of",245539],"lp":["fo","ag","ga","aga","foo","gat","tag","ago","ato","ffo","goa","foot","gag","agg","tota"],"rp":["of","off","oft","oat","ota"]},"74":{"input":[2,4,7],"tlp":["co",161789],"trp":["oc",25929],"tlw":["cost",675],"lp":["co","sto","gs","cto","soc","sco","cco","stoo","cog","coo","cos","cost","cot","ssoc"],"rp":["oc","ost","occ","oct","ots","octo"]},"75":{"input":[1,2,4,7],"tlp":["two",12798],"trp":["oac",2483],"tlw":["two",11667],"lp":["two","tow","acco","towa","coa","sag","foc","sof","ssag","soft","acto","stag","cof","coff","coat"],"rp":["oac","oca","occa","oast","ocat"]},"76":{"input":[3,4,7],"tlp":["ro",170933],"trp":["or",314634],"tlw":["get",10986],"trw":["or",34654],"lp":["ro","ge","gr","eg","get","gre","rg","tor","ger","tro","roo","rge","gro","rot"],"rp":["or","ore","ort","ote","oor","orr"]},"77":{"input":[1,3,4,7],"tlp":["for",111436],"trp":["orta",4717],"tlw":["for",70927],"trw":["offer",1014],"lp":["for","fro","age","fore","efo","efor","gra","grea","arg","aro","ega","fort","arge","roa","gar","rag"],"rp":["orta","ora","offe","ofte"]},"78":{"input":[2,3,4,7],"tlp":["eco",13557],"trp":["ord",17538],"tlw":["good",9480],"trw":["order",2602],"lp":["eco","good","cor","stor","ges","rso","erso","cro","ged","ros","dg","rod","dge","door","sor","ross"],"rp":["ord","ors","orde","orc"]},"79":{"input":[1,2,3,4,7],"tlw":["words",3228],"trw":["offered",1121],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["on",380429],"trw":["on",61313],"lp":[],"rp":["on","ou","no","un","oun","nu","nou","oon","nno","unn","ono","onn","non","noo","noon","noun","uo","nnou","onou","unu"]},"81":{"input":[1,5,7],"tlp":["au",32369],"trp":["ua",23498],"lp":["au","qu","ano","qua","anno","aun","anu","anua","quan","quo"],"rp":["ua","ona","una","nua","oan","nqu","onna","uan","onq","onqu"]},"82":{"input":[2,5,7],"tlp":["su",62257],"trp":["us",124701],"tlw":["soon",3191],"trw":["us",10609],"lp":["su","son","sou","ssu","soon","soun","sun","sus","sons"],"rp":["us","ons","ous","ju","jo","jus","uss","usu","nsu","njo","oj"]},"83":{"input":[1,2,5,7],"tlp":["wou",29932],"trp":["now",32603],"tlw":["won",495],"trw":["now",13343],"lp":["wou","aus","won","ason","sua","sona","asu","assu","ajo","squ","squa","woun"],"rp":["now","own","nown","usa","usua","usan","ousa","nows"]},"84":{"input":[3,5,7],"tlp":["eno",5765],"trp":["yo",112940],"trw":["you",68463],"lp":["eno","enou","eu","eon","eone"],"rp":["yo","you","one","ue","oy","yon","youn","yone","oney","uy","uen","oye","nue","une","onne"]},"85":{"input":[1,3,5,7],"tlp":["que",9630],"trp":["oya",1710],"tlw":["anyone",1715],"lp":["que","equ","eau","eque","quen","anyo","quee","equa","xu","exu","xua","exua","aneo","xon"],"rp":["oya","unex","ux","nque","uxu","unea"]},"86":{"input":[2,3,5,7],"tlp":["du",19747],"trp":["und",37128],"tlw":["done",3602],"trw":["use",3572],"lp":["du","don","done","esu"],"rp":["und","use","ound","ud","ond","unde","ues","ouse","used","ody","ude","ndo","odu","onde","udd","ones"]},"87":{"input":[1,2,3,5,7],"tlw":["down",11247],"trw":["owned",326],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["bu",70306],"trp":["ng",301290],"tlw":["but",49620],"trw":["not",43106],"lp":["bu","bo","tu","but","bou","bout","gu","gn"],"rp":["ng","ut","out","not","ug","oug","ong","ob","nto","ont","unt","ub"]},"89":{"input":[1,4,5,7],"tlp":["abo",26472],"trp":["uf",3979],"tlw":["about",23108],"lp":["abo","fu","abou","ang","fou","gan","aug","tua","atu","anot","foun","aut"],"rp":["uf","onf","uff","natu","nfo","nag","oba","uat"]},"90":{"input":[2,4,5,7],"tlp":["con",43239],"trp":["uc",39944],"tlw":["cut",1451],"trw":["just",14589],"lp":["con","cou","cu","suc","cons","cont","stu","coun","bus","cus","ctu","conc"],"rp":["uc","ust","just","ngs","onc","unc","uct","job"]},"91":{"input":[1,2,4,5,7],"tlw":["town",2110],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["rou",33045],"trp":["ur",136165],"tlw":["turn",2317],"trw":["your",20504],"lp":["rou","ru","tur","roug","gen","ture","roun","tru","turn","ron","bro","eng"],"rp":["ur","our","ure","your","nge","urn","ute","nger"]},"93":{"input":[1,3,4,5,7],"tlw":["before",10203],"trw":["often",3952],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["course",3730],"trw":["once",5524],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["because",9879],"trw":["understand",2238],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["ll",183975],"trw":["oil",657],"lp":[],"rp":["ll","li","io","il","lo","ol","ill","oi","loo","oll","lli","ili","llo","oli","ool","illi","olo","ollo","lio","llio"]},"97":{"input":[1,6,7],"tlp":["al",228009],"trp":["la",103279],"tlw":["all",30772],"trw":["la",689],"lp":["al","all","ali","ail","alo","allo","ala","aliz","alli"],"rp":["la","ial","lai","lia","lla","liz","iall","ila","olla","oal","ola"]},"98":{"input":[2,6,7],"tlp":["sio",15825],"trp":["ok",35246],"tlw":["skills",834],"trw":["look",5477],"lp":["sio","sl","ssio","sol","sil"],"rp":["ok","ls","ook","lik","look","lk","los","lis","lso","osi","ossi","lls","oki","kil","isio"]},"99":{"input":[1,2,6,7],"tlp":["wil",18445],"trp":["low",16681],"tlw":["will",14271],"trw":["low",1274],"lp":["wil","will","als","alk","also","wal","alw","alwa","walk","wl","wall"],"rp":["low","las","llow","lw","lwa","owi","lass","owl","law"]},"100":{"input":[3,6,7],"tlp":["el",142952],"trp":["le",213808],"tlw":["el",99],"trw":["lie",725],"lp":["el","ell","eli","eel","ele","elie","elo","elli","eeli","ello","elle"],"rp":["le","lle","ile","lie","ole","olle","ille","lee","iel"]},"101":{"input":[1,3,6,7],"tlp":["eal",18892],"trp":["lea",26849],"tlw":["alex",152],"lp":["eal","alle","ale","ela","eall","eali","aile","alex","eale","eliz","xio","elea","ael"],"rp":["lea","lex","lize","lexa","oze","llea","lexi"]},"102":{"input":[2,3,6,7],"tlp":["sel",25483],"trp":["ld",104617],"tlw":["else",2789],"trw":["like",19390],"lp":["sel","dl","els","eld","del","dle"],"rp":["ld","like","old","led","les","oke","lled","ild","less","oked","ooke","lose","ldi","lde"]},"103":{"input":[1,2,3,6,7],"tlw":["well",8952],"trw":["lead",1050],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["tio",72429],"trp":["ig",72061],"tlw":["till",1036],"trw":["lot",2713],"lp":["tio","gi","tl","gl","til","vo","ttl","till","giv"],"rp":["ig","ov","lt","lit","lig","liv","litt","ittl","lv","itio","oti"]},"105":{"input":[1,4,6,7],"tlp":["atio",33167],"trp":["lf",21773],"tlw":["fall",1195],"lp":["atio","tal","fl","gai","agai","alt","val","fol","gla","fig","flo","foll","agi","fil","alit"],"rp":["lf","lat","lif","offi","lati"]},"106":{"input":[2,4,6,7],"tlp":["cl",31724],"trp":["lic",9087],"tlw":["still",7621],"trw":["lost",2029],"lp":["cl","ctio","col","stil","sig","clo","took","clos","stio","cov","coll","soci","ctl"],"rp":["lic","ock","osit","loc","oic","oci","list"]},"107":{"input":[1,2,4,6,7],"tlw":["call",2856],"trw":["last",4981],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["rl",25465],"trp":["ove",39462],"tlw":["tell",4528],"trw":["over",12910],"lp":["rl","tle","tel","ttle","rel","rig","vel","tell","give","rio","elt","rov"],"rp":["ove","over","let","ori","lve","live","orl","love"]},"109":{"input":[1,3,4,6,7],"tlw":["felt",4669],"trw":["life",8740],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["told",5605],"trw":["lives",1641],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["work",8749],"trw":["least",2856],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["ho",160810],"trw":["oh",2847],"lp":[],"rp":["ho","ul","ion","oul","hou","ui","lin","lu","nl","hu","lon","oin","hil","onl","hol","iou","uni","houl","ull","hoo"]},"113":{"input":[1,5,6,7],"tlp":["qui",11723],"trp":["lan",16797],"tlw":["annual",207],"trw":["hall",950],"lp":["qui","alon","alu","qual","ainl","aul"],"rp":["lan","nal","ual","onal","hal","iona","uall","ula","hall","inal","lain","lau","nall","lian"]},"114":{"input":[2,5,6,7],"tlp":["sho",24544],"trp":["kno",19117],"tlw":["soul",950],"trw":["john",1863],"lp":["sho","sion","shou","sul"],"rp":["kno","ions","hos","ious","usi","hous","usin","onsi","lish","hus","okin","ush","lus","lkin","usl","ousl"]},"115":{"input":[1,2,5,6,7],"tlw":["who",23669],"trw":["how",14162],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["ely",17170],"trp":["ly",122921],"trw":["only",13824],"lp":["ely","elin","enl"],"rp":["ly","lly","nly","only","hel","ily","len","hile","line","lue","hole","lone","loy","hone","ully","llen","ule"]},"117":{"input":[1,3,5,6,7],"tlw":["alone",2184],"trw":["lay",1482],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["should",7178],"trw":["house",4935],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["would",27522],"trw":["usually",1445],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["gh",90668],"trp":["ing",245338],"tlw":["thought",7112],"trw":["into",18343],"lp":["gh","tion","ght","bl","tho","ting","thou"],"rp":["ing","igh","oth","ugh","ight","hing","ough","ning","into","ught","houg","long","ling"]},"121":{"input":[1,4,5,6,7],"tlw":["again",7165],"trw":["having",3594],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["such",8032],"trw":["looking",3174],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["without",5841],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["through",8798],"trw":["other",13909],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["another",6638],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["could",18061],"trw":["others",3864],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["already",3329],"trw":["however",3319],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trp":["pp",37015],"trw":["p",765],"lp":[],"rp":["pp"]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",46764],"trp":["pa",72065],"trw":["pa",273],"lp":["ap","app","apa","appa"],"rp":["pa","pap","ppa","papa"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",40374],"trp":["ps",13734],"lp":["sp","ssp"],"rp":["ps"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["spa",3930],"trp":["pas",8500],"tlw":["sap",81],"trw":["pass",1068],"lp":["spa","aps","sap","asp","sapp","wsp","wspa","spap","assp"],"rp":["pas","pass","pw","pwa","paw","paws"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",39298],"trp":["pe",115056],"trw":["'",14271],"lp":["ep","e'","eep","epe","epp","eppe","eepe"],"rp":["pe","ppe","pee","''","'e","p'"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["xp",16071],"trp":["pea",10889],"lp":["xp","exp","appe","xpe","expe","ape","epa","eap","epea","xpa","expa","a'","eape","a'a","x'","ax'"],"rp":["pea","ppea","pape","'a"]},"134":{"input":[2,3,8],"tlp":["spe",18659],"trp":["'s",36901],"tlw":["deep",1465],"trw":["'s",213],"lp":["spe","e's","esp","e'd","dep","espe","deep","sep","desp","depe","spee","eps","d'","d's"],"rp":["'s","'d","ped","pped","pes","pse"]},"135":{"input":[1,2,3,8],"tlp":["we'",3765],"trp":["'w",281],"tlw":["we'd",695],"trw":["passed",1693],"lp":["we'","spea","depa","sepa","aspe","ewsp","we'd","weap","aped","weep","wep","apes","apse","swep","a's","xped","espa","dpa"],"rp":["'w","peas"]},"136":{"input":[4,8],"tlp":["tp",256],"trp":["pt",19963],"lp":["tp","ttp"],"rp":["pt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["apt",4201],"trp":["pat",6411],"tlw":["tap",153],"trw":["pat",193],"lp":["apt","apta","tap","tapp"],"rp":["pat","pta","patt","pf","ptat"]},"138":{"input":[2,4,8],"trp":["pts",388],"lp":[],"rp":["pts","pst","ptc","pc"]},"139":{"input":[1,2,4,8],"tlp":["cap",5240],"trp":["pac",3604],"tlw":["cap",258],"trw":["past",2353],"lp":["cap","capt","spac","scap","capa","apac","spat","fsp","ffsp","caps"],"rp":["pac","past","pact","patc","psta","pats"]},"140":{"input":[3,4,8],"tlp":["t'",15643],"trp":["pr",76723],"trw":["per",611],"lp":["t'","rep","ept","rp","tep","r'","er'","rpr","re'","ere'"],"rp":["pr","'t","per","pre","'r","'re","pte","ppr","pet","pret"]},"141":{"input":[1,3,4,8],"tlp":["at'",5623],"trp":["par",26731],"tlw":["appear",816],"trw":["part",4589],"lp":["at'","xper","epar","rap","appr","aper","apte","repa","xpr","expr","xpre","apar"],"rp":["par","part","pare","pear","pra","perf","pera","para"]},"142":{"input":[2,3,4,8],"tlp":["t's",15472],"trp":["pres",13007],"tlw":["step",1154],"trw":["press",708],"lp":["t's","spec","cep","cept","resp","step","r's","er's","re's","spr","sper","ccep","teps"],"rp":["pres","pec","pers","pect","perc","prec","pted"]},"143":{"input":[1,2,3,4,8],"tlw":["we're",1513],"trw":["perfect",1065],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["mp",43386],"trw":["m",1273],"lp":[],"rp":["mp","mm","nm","mn","pm","np"]},"145":{"input":[1,5,8],"tlp":["am",72035],"trp":["ma",137500],"tlw":["am",4235],"trw":["man",9572],"lp":["am","amp","ama","apan","amm","ampa","amn","aman"],"rp":["ma","man","pan","mpa","nam","mpan","mana","mma","mann","mman","nap","map"]},"146":{"input":[2,5,8],"tlp":["sm",13242],"trp":["ms",20491],"trw":["ms",185],"lp":["sm","ssm"],"rp":["ms","nsp","mps","nsm","mns","mms"]},"147":{"input":[1,2,5,8],"tlp":["sam",7005],"trp":["mas",4399],"tlw":["sam",133],"trw":["mass",521],"lp":["sam","sma","ams","span","ansp","amps","snap","asm","assm","ssma"],"rp":["mas","maj","mass","jap","japa","mans","jam","mw","mpas","pans"]},"148":{"input":[3,5,8],"tlp":["em",87362],"trp":["me",235102],"tlw":["enemy",1028],"trw":["my",40423],"lp":["em","eme","eem","emp","emen","eeme","emem"],"rp":["me","my","n'","men","pen","mem","'m","y'","mme","ppen","pene","py","mee"]},"149":{"input":[1,3,5,8],"tlp":["ame",34012],"trp":["may",9648],"tlw":["an'",417],"trw":["many",8068],"lp":["ame","ema","eam","an'","xam","exam","eman","appy","xamp","amen","xpen"],"rp":["may","mea","many","mean","name","pany","pay","pane","man'"]},"150":{"input":[2,3,5,8],"tlp":["dn'",13235],"trp":["med",15366],"tlw":["seemed",4232],"trw":["jem",320],"lp":["dn'","seem","sn'","ems","emed","spen","dem","dm","emse","esn'"],"rp":["med","mes","mse","mys","pend","myse","y's","n's","mmed","pens"]},"151":{"input":[1,2,3,5,8],"tlw":["same",6718],"trw":["made",9696],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["tm",4765],"trp":["mb",19208],"lp":["tm","bm"],"rp":["mb","mpt","ntm","pb","mt","mpb"]},"153":{"input":[1,4,5,8],"tlp":["fam",7099],"trp":["mat",11909],"trw":["mba",123],"lp":["fam","amb","tma","tnam","atm","apab","amat","bam","bama","amba","tam"],"rp":["mat","matt","mf","mba","mpat","pant","pab","mant","mbat"],"special":"numsym"},"154":{"input":[2,4,5,8],"tlp":["stm",1138],"trp":["mst",943],"lp":["stm"],"rp":["mst","mc","mbs","mpts","mcc","mcs"]},"155":{"input":[1,2,4,5,8],"tlw":["camp",660],"trw":["pants",299],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["rm",33028],"trp":["n't",37419],"tlw":["remember",2277],"trw":["mr",4133],"lp":["rm","rem","emb","erm","tem","embe","reme","rme","temp","tme","tmen"],"rp":["n't","ment","met","mer","mbe","mber","mr","memb","meet"]},"157":{"input":[1,3,4,5,8],"tlw":["army",2073],"trw":["matter",2479],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["spent",1640],"trw":["mrs",2541],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["came",6889],"trw":["parents",2027],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"!","trp":["pi",28303],"lp":[],"rp":["pi","ip","ppi","ipp","ippi","pip","ipi"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["appi",2174],"trp":["pai",6465],"trw":["pizza",143],"lp":["appi","api"],"rp":["pai","ipa","pia","piz","pizz","iap","ippa"]},"162":{"input":[2,6,8],"tlp":["spi",5949],"trp":["ips",2652],"tlw":["sip",104],"trw":["piss",63],"lp":["spi","sip","ssip","sipp","skip","spis"],"rp":["ips","isp","pis","kp","pk","pki","piss","kip","psi","kipp"]},"163":{"input":[1,2,6,8],"tlp":["spai",637],"trp":["isap",1148],"lp":["spai","wip","aspi","apk","apki","wipi","apis"],"rp":["isap","ispa","kpa"]},"164":{"input":[3,6,8],"tlp":["epi",1744],"trp":["i'",14185],"trw":["'i",461],"lp":["epi","eepi","eppi"],"rp":["i'","pie","ippe","ipe","'i","pipe","ppie","ip'"]},"165":{"input":[1,3,6,8],"tlp":["epai",321],"trp":["iz'",67],"lp":["epai","z'","eapi"],"rp":["iz'"]},"166":{"input":[2,3,6,8],"tlp":["disp",1152],"trp":["keep",4608],"tlw":["spies",180],"trw":["keep",3496],"lp":["disp","espi","dip","spie","epis"],"rp":["keep","i'd","kep","pid","ispe","pied","pies","pedi","iped","ip's","k'","k's","ipes","kesp","psid"]},"167":{"input":[1,2,3,6,8],"tlw":["speak",1583],"trw":["paid",1096],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["tip",610],"trp":["pti",3889],"tlw":["tip",221],"trw":["pit",127],"lp":["tip","tipp"],"rp":["pti","pit","ipt","ipti"]},"169":{"input":[1,4,6,8],"tlp":["apit",605],"trp":["pati",1779],"lp":["apit"],"rp":["pati","pita","ptai","ipat","pav","ptia"]},"170":{"input":[2,4,6,8],"tlp":["cip",2669],"trp":["pic",5474],"tlw":["tips",128],"trw":["pick",801],"lp":["cip","spit","spic","scip","tips","ckp"],"rp":["pic","pick","pict","icip","pici","pitc","pist","pics","ptic"]},"171":{"input":[1,2,4,6,8],"trw":["pack",385],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["rip",2627],"trp":["pri",13942],"tlw":["trip",647],"trw":["i've",2219],"lp":["rip","rpri","epti","trip","ript","e'v","e've"],"rp":["pri","it'","peri","'v","'ve","pir","i'v","i've","priv","piri","prev","pite","peti"]},"173":{"input":[1,3,4,6,8],"tlw":["repair",185],"trw":["private",1010],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["despite",946],"trw":["it's",8558],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["we've",750],"trw":["paris",1353],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["im",93559],"trw":["him",28423],"lp":[],"rp":["im","mi","him","min","ph","imp","pin","hip","imi","ppin","mmi","imm","phi","mini","hm","nim","mmin","imin","pini","mpi"]},"177":{"input":[1,5,6,8],"tlp":["ami",8211],"trp":["hap",14305],"tlw":["aim",231],"trw":["pain",1250],"lp":["ami","aim","amin","aph","anim","amaz"],"rp":["hap","happ","ima","mai","main","pain","ham","pani","iam","mina","nima","pha","maz","impa"]},"178":{"input":[2,5,6,8],"tlp":["ship",5146],"trp":["mis",8985],"tlw":["ship",877],"trw":["miss",1642],"lp":["ship","sim","smi","simp","simi","shm","spin"],"rp":["mis","ims","hims","miss","hips","ism","mik","insp","ishm","hisp","nspi","jim","km"]},"179":{"input":[1,2,5,6,8],"tlw":["spanish",469],"trw":["mask",160],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["emi",2800],"trp":["ime",28758],"trw":["i'm",6537],"lp":["emi","emin","epin","eph"],"rp":["ime","hem","he'","i'm","mine","hey'","phy","imme","pine","imen","phe","peni","hme","in'","hmen","meh"]},"181":{"input":[1,3,5,6,8],"tlw":["examine",179],"trw":["happy",1895],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["she'd",1495],"trw":["mind",4439],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["shame",796],"trw":["make",9390],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tim",28120],"trp":["mit",4914],"tlw":["tim",128],"trw":["ibm",109],"lp":["tim","timi","bmi"],"rp":["mit","mbi","mitt","mmit","imit","mbin","ntim","imb","mpti","ptin","mbit","intm","mith","itm","mitm","ptim","pth"]},"185":{"input":[1,4,5,6,8],"trw":["path",946],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"tlw":["smith",320],"trw":["pitch",164],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["captain",1078],"trw":["match",450],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["them",21593],"trw":["prevent",380],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["remain",740],"trw":["haven't",641],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["didn't",7051],"trw":["isn't",1565],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["that's",4282],"trw":["perhaps",2737],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["po",68607],"trw":["pop",223],"lp":[],"rp":["po","op","ppo","opp","oppo","poo","pop","oop","opo","popp"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["apo",1508],"trp":["opa",186],"lp":["apo","appo"],"rp":["opa","oap"]},"194":{"input":[2,7,8],"tlp":["spo",7683],"trp":["pos",16560],"lp":["spo","sop","spos","sspo","spoo"],"rp":["pos","poss","ppos","osp","ops","oops","opos","osop","pso"]},"195":{"input":[1,2,7,8],"tlp":["soap",132],"trp":["pow",4845],"tlw":["soap",132],"lp":["soap"],"rp":["pow","posa"]},"196":{"input":[3,7,8],"tlp":["eop",15223],"trp":["peo",15223],"trw":["pope",239],"lp":["eop","epo"],"rp":["peo","peop","ope","oppe","o'","poe","oope","pope","oe'","'o","-p"]},"197":{"input":[1,3,7,8],"tlp":["eapo",649],"trp":["opea",428],"lp":["eapo","xpo","expo"],"rp":["opea","-pa"]},"198":{"input":[2,3,7,8],"tlp":["espo",3005],"trp":["pose",4757],"trw":["possessed",333],"lp":["espo","dop"],"rp":["pose","oped","ospe","o's","osep","opes","od'","od's","o'd","oe's","pod","oss'"]},"199":{"input":[1,2,3,7,8],"tlw":["exposed",267],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["top",6183],"trp":["pot",2394],"tlw":["top",1822],"trw":["pot",221],"lp":["top","topp","toop"],"rp":["pot","opt","pto","pott","ptop"]},"201":{"input":[1,4,7,8],"tlp":["gap",376],"trp":["pag",1322],"tlw":["gap",204],"trw":["potato",74],"lp":["gap","apto","gapo","atop"],"rp":["pag","pota","opag","paga"]},"202":{"input":[2,4,7,8],"tlp":["stop",3680],"trp":["post",1282],"tlw":["stop",1798],"trw":["post",644],"lp":["stop","cop","spot","tops","cops","coop","copp","gosp","copt","scop"],"rp":["post","poc","pots","pco"]},"203":{"input":[1,2,4,7,8],"tlw":["gaps",71],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["rop",6404],"trp":["pro",33640],"tlw":["report",778],"trw":["poor",1596],"lp":["rop","rope","repo","epor","rpo","ropo","ropp","rpor","roop"],"rp":["pro","por","port","oper","ppor","prop","ppro","prog","poor","prot","orp"]},"205":{"input":[1,3,4,7,8],"tlw":["rapport",98],"trw":["page",587],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["stopped",1419],"trw":["process",1455],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"tlw":["corporate",363],"trw":["power",3130],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["om",158331],"trw":["up",23594],"lp":[],"rp":["om","mo","up","mu","pu","um","omp","mon","omm","pon","oom","mom","mpo","mou","upp","oup","upo","upon","uppo","num"]},"209":{"input":[1,5,7,8],"tlp":["amo",4702],"trp":["oma",6690],"trw":["mao",108],"lp":["amo","amon","amou","apon","amu","ampu"],"rp":["oma","ompa","oman","uma","uman","omma","pau","manu","mona","mau","upa","napo","mao","opam"]},"210":{"input":[2,5,7,8],"tlp":["som",32033],"trp":["mos",15768],"tlw":["sum",220],"trw":["jump",350],"lp":["som","sup","supp","sum","spon","summ","smo","susp","ssum"],"rp":["mos","mus","pons","mous","mpos","pus","ups","usp","ums","mons","oms"]},"211":{"input":[1,2,5,7,8],"tlw":["woman",3590],"trw":["mason",79],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["emo",6070],"trp":["ome",63421],"trw":["money",3556],"lp":["emo","epu"],"rp":["ome","on'","omen","u'","ou'","you'","open","mome","ume","mone","meo","omeo","meon","memo","omme","umen","ompe","umme"]},"213":{"input":[1,3,5,7,8],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["some",15162],"trw":["opened",1401],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["women",3612],"trw":["paused",403],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["tom",5301],"trp":["mot",10460],"tlw":["tom",762],"trw":["put",5210],"lp":["tom","tum","gm","bom","bomb","tup","ttom"],"rp":["mot","put","umb","pub","mont","numb","mong","omb","mout","mput","upt","putt","ptu"]},"217":{"input":[1,4,5,7,8],"tlw":["among",2526],"trw":["obama",363],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["common",1407],"trw":["most",10396],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["famous",816],"trw":["moscow",341],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["room",5055],"trw":["more",21171],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["from",35952],"trw":["program",634],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["don't",9569],"trw":["person",3411],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["company",2711],"trw":["major",1113],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["pl",68379],"trw":["pool",330],"lp":[],"rp":["pl","opl","lp","poi","pol","pli","poli","plo","ppl","lip","lop","opi","pil","ipl","ppli","ppoi","lipp","oppi","pill","pilo"]},"225":{"input":[1,6,7,8],"tlp":["appl",2216],"trp":["pla",24558],"tlw":["apollo",82],"trw":["lap",242],"lp":["appl","apol","alp"],"rp":["pla","plai","pal","lap","pala","ipal","llap","pola","lapp","ppal","pall","ppla","palo"]},"226":{"input":[2,6,7,8],"tlp":["spok",1763],"trp":["posi",4502],"tlw":["slip",260],"trw":["lips",930],"lp":["spok","spl","slip","spli","spoi","spio"],"rp":["posi","pok","lips","ospi","plis","ispl","ispo","lps","plos","pois","piso","kpl","opk","opki"]},"227":{"input":[1,2,6,7,8],"tlw":["slap",95],"trw":["pillow",134],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["eopl",15223],"trp":["ple",30676],"trw":["people",14668],"lp":["eopl","elp","epl","elop","e'l","e'll","epli"],"rp":["ple","ople","'l","'ll","plie","i'l","i'll","leep","iple","lope","pel","pple","lep"]},"229":{"input":[1,3,6,7,8],"tlw":["apple",631],"trw":["pale",447],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["spoke",1285],"trw":["people's",449],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["we'll",807],"trw":["please",985],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["topi",337],"trp":["ptio",2778],"trw":["pilot",266],"lp":["topi","tipl","tpl"],"rp":["ptio","opti","ptl","pig","plit","pov","pilg","plot","ltip","lpt","lpit"]},"233":{"input":[1,4,6,7,8],"tlw":["flip",108],"trw":["plato",120],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"tlw":["split",254],"trw":["politics",443],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["capital",544],"trw":["political",1085],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"tlw":["grip",165],"trw":["prove",546],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"tlw":["april",549],"trw":["plate",447],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["replied",1257],"trw":["police",1092],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["special",1059],"trw":["place",5268],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["mil",16287],"trw":["million",900],"lp":[],"rp":["mil","mpl","hom","lm","omi","poin","ompl","impo","hop","mili","pul","impl","lmo","hum","omin","pho","minu","lim","muni","pull"],"special":"enter"},"241":{"input":[1,5,6,7,8],"tlw":["animal",491],"trw":["human",2178],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["shop",667],"trw":["mission",568],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["small",3786],"trw":["plans",687],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"tlw":["employee",275],"trw":["home",4865],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["example",1694],"trw":["play",1696],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["simply",1710],"trw":["pulled",1252],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["explained",950],"trw":["played",975],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"trw":["might",6921],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["film",366],"trw":["imagination",438],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["coming",1985],"trw":["much",10233],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["almost",3784],"trw":["making",2931],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["government",1285],"trw":["mother",4253],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["family",3955],"trw":["important",2765],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["something",7615],"trw":["possible",2350],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["especially",1737],"trw":["himself",5632],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/es-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/es-keymap.json
new file mode 100644
index 00000000000..81395368b85
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/es-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",68],"tlw":["a",207382],"lp":["aa"],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",1790],"tlw":["s",277],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["as",412461],"lp":["as","sa","asa","sas","asas","wa","ass","ssa","was","saa","aw"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",4724],"tlw":["e",5916],"lp":["ee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ea",27380],"tlw":["ex",477],"lp":["ea","ex","ae","xa","exa","ax","axa","xx"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["de",743538],"tlw":["de",453446],"lp":["de","es","se","ed","des","ese","ede","sd","esd","desd","sde","esde","ses","ded","dese","eses","edes","eded","sed","ees"],"rp":[]},"7":{"input":[1,2,3],"tlp":["ad",219474],"tlw":["esa",8099],"lp":["ad","da","dad","ada","esa","eda","ade","das","ase","sad","edad","sea","dea","dade","esas","asad","ades","desa","adas","ases"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",782],"tlw":["t",90],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["ta",307672],"tlw":["f",113],"lp":["ta","at","fa","ata","af","afa","tat","fat","fata","att","taf","ft","atat","tata","ff","ataf","tf","atf"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["st",235201],"tlw":["c",615],"lp":["st","sc","ct","cc","tc"],"rp":[]},"11":{"input":[1,2,4],"tlp":["ca",200066],"tlw":["casa",9057],"lp":["ca","ac","sta","cas","ast","tas","asta","casa","sca","aca","act","sac","stas","tac","cta","acc","sf","fac","cat","cast"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["er",499829],"tlw":["te",14709],"lp":["er","re","te","tr","rt","rr","et","ert","ter","tre","ere","err","rte","rre","ete","erte","ret","rer","etr","terr"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ra",416643],"tlw":["era",32659],"lp":["ra","ar","era","tra","ara","tar","are","fe","rta","art","fr","rar","rra","erra","ef","erta","atr","eta","arr","rat"],"rp":[]},"14":{"input":[2,3,4],"tlp":["est",139908],"tlw":["ser",12211],"lp":["est","ec","ce","res","rec","rd","cer","cr","dr","ste","rs","ser","tes","str","ces","rc","esc","der","erd","ece"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["esta",69315],"tlw":["esta",18675],"lp":["esta","ras","ace","car","rad","tad","tras","acer","adr","arec","sar","cad","ard","rac","rda","adre","dar","stra","rca","erda"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",1348],"trw":["n",91],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",382423],"trp":["na",233186],"tlw":["ana",597],"lp":["an","ana","aq","anan","anq","ann","anna"],"rp":["na","nq","nan","nana","nna"]},"18":{"input":[2,5],"base":"j","baseshift":"J","tlp":["sn",1069],"trp":["ns",48331],"trw":["j",166],"lp":["sn"],"rp":["ns","nj"]},"19":{"input":[1,2,5],"tlp":["aj",27458],"trp":["ja",36319],"tlw":["san",1894],"trw":["ja",145],"lp":["aj","san","aja","anas","ans","sq","saj","anj","ansa","asan","ajas","ajan"],"rp":["ja","nas","nsa","jan","jas","naj","nsan","nsaj"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",684719],"trp":["ne",94467],"tlw":["en",194129],"trw":["y",254303],"lp":["en","ene","ey","enen","eye","eyen","een","enn","enne"],"rp":["ne","ye","nen","yen","ny","nne","nny","yn","yene","yne"]},"21":{"input":[1,3,5],"tlp":["ena",25795],"trp":["ya",27580],"tlw":["ay",587],"trw":["ya",19283],"lp":["ena","ay","ane","eq","aya","ean","aye","aen","enan","ayan","enea","anen","ayen","anea","xq","exq"],"rp":["ya","nea","yan","nex"]},"22":{"input":[2,3,5],"tlp":["ej",40475],"trp":["nd",141755],"tlw":["deje",506],"lp":["ej","end","sen","ens","den","dej","ende","esen","eje","enes","ense"],"rp":["nd","je","nes","nde","nse","ndes","jes","nden","yend"]},"23":{"input":[1,2,3,5],"tlp":["and",60909],"trp":["nad",25609],"tlw":["deja",806],"trw":["nada",10498],"lp":["and","eja","ensa","aje","deja","dan","enas","ande","anda","ejan","sena","enda","anad","dena","dand"],"rp":["nad","nda","nada","jad","jand"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["bt",656],"trp":["nt",349002],"tlw":["b",221],"lp":["bt","tb","bn"],"rp":["nt"]},"25":{"input":[1,4,5],"tlp":["ab",230416],"trp":["nta",49640],"tlw":["tan",12045],"lp":["ab","ba","aba","ant","tan","tab","taba","ban","tant","aban","anta","bat","tana"],"rp":["nta","nf","ntan","nat","ntab","nab","naba"]},"26":{"input":[2,4,5],"tlp":["bs",5233],"trp":["nc",100151],"lp":["bs","bj","bst","cn","sb","bc","tj"],"rp":["nc","nst","nsc"]},"27":{"input":[1,2,4,5],"tlp":["stab",23089],"trp":["nca",10670],"tlw":["santa",1043],"lp":["stab","cab","sab","anc","baj","can","stan","caba","abaj","bas","acab","baja","saba","sant","tanc","bast"],"rp":["nca","ntas","nac","nsta"]},"28":{"input":[3,4,5],"tlp":["ent",186144],"trp":["nte",139591],"tlw":["entre",11695],"lp":["ent","br","ente","ten","bre","be","entr","eb","ren","rn","ber","ener","ern","tene"],"rp":["nte","ntr","ner","ntre","nter","nten"]},"29":{"input":[1,3,4,5],"tlp":["ran",49950],"trp":["ntra",26185],"tlw":["eran",5913],"trw":["yabran",492],"lp":["ran","ante","abe","enta","bra","abr","rab","rq","raba","bar","eran","aber","trab","abra","tran","rant"],"rp":["ntra","nar","nera","ntar"]},"30":{"input":[2,3,4,5],"tlp":["enc",41323],"trp":["ntes",22621],"tlw":["debe",1755],"lp":["enc","sent","cen","deb","dent","bres","tend","rend","rden","tenc","debe","cent"],"rp":["ntes","nce","jer","nces","nec","nece","ndr","nder"]},"31":{"input":[1,2,3,4,5],"tlw":["estaba",15906],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",1864],"trw":["i",432],"lp":[],"rp":["ii","iii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["za",46428],"trp":["ia",302035],"lp":["za","az","ai","aza","aia","zi","azi","zz","aiz","azz"],"rp":["ia","iz","iza","izz","iaz"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["si",193578],"trp":["is",104027],"tlw":["si",37389],"lp":["si","sis","sk","ssi"],"rp":["is","isi","ki","iss","isis","ik","iki","kis","ikis","kiss","isk","issi"]},"35":{"input":[1,2,6],"tlp":["asi",27185],"trp":["ias",18810],"tlw":["asi",11044],"trw":["kazz",77],"lp":["asi","sia","asia","zas","ais","sias","wi","asis","aisa","wis","wiss","azas","ak"],"rp":["ias","isa","izas","isas","ka","ika","issa"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",15743],"trp":["ie",233722],"lp":["ei","eei"],"rp":["ie"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["ez",37550],"trp":["iez",3157],"tlw":["xii",131],"trw":["ix",78],"lp":["ez","eza","xi","exi","eia","axi","xii","zie","azie","xix","xiii","ze"],"rp":["iez","ieza","ix"]},"38":{"input":[2,3,6],"tlp":["di",175458],"trp":["id",129921],"tlw":["seis",1304],"trw":["kid",113],"lp":["di","edi","sie","esi","die","sid","dis","did","side","eis","esid","edid","sei"],"rp":["id","ide","ies","ied","idi","iese","ise"]},"39":{"input":[1,2,3,6],"tlp":["dia",37584],"trp":["ida",49293],"tlw":["dia",8188],"trw":["idea",2311],"lp":["dia","adi","edia","dias","adie","dida","siad","zad","sida","xis","exis","esia","aid","diez"],"rp":["ida","idad","iad","idea","idas","ieda"]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",133369],"trp":["it",63123],"tlw":["ti",1888],"trw":["iv",187],"lp":["ti","vi","viv","tiv","tit","vivi","vit","tti","tivi","vii","viii"],"rp":["it","iv","iti","ivi","itiv"]},"41":{"input":[1,4,6],"tlp":["va",51609],"trp":["ita",23108],"tlw":["va",3371],"lp":["va","fi","av","via","tia","avi","ati","avia","ava","fia","vita","tiva","afi","fav","ativ"],"rp":["ita","if","ifi","iva","iat"]},"42":{"input":[2,4,6],"tlp":["ci",238810],"trp":["ic",95632],"lp":["ci","sti","vis","tic","sit","cci","vist","cis","cti","sic","vic","visi","sist","cit","tici"],"rp":["ic","ist","ici","isti","isc"]},"43":{"input":[1,2,4,6],"tlp":["cia",69052],"trp":["ica",24474],"tlw":["casi",5393],"lp":["cia","aci","acia","fic","fici","casi","cias","tica","stia","taci","vas","sita","asti","saci","acti","acci"],"rp":["ica","ista","icia","ific"]},"44":{"input":[3,4,6],"tlp":["ri",190312],"trp":["ir",83670],"tlw":["ver",6228],"trw":["ir",2754],"lp":["ri","ve","ev","eri","ver","tie","vie","rti","rri","rit","rv","rie","tir","erv","tri","teri"],"rp":["ir","ier","iert","ire"]},"45":{"input":[1,3,4,6],"tlp":["ria",49114],"trp":["ira",16443],"tlw":["vez",12860],"trw":["ira",503],"lp":["ria","ari","eva","eria","vez","aria","raz","ave","var","zar","arti","rz","erz","rav","rza","fie"],"rp":["ira","iera","itar","iar"]},"46":{"input":[2,3,4,6],"tlp":["eci",43130],"trp":["ice",8339],"tlw":["decir",4827],"trw":["irse",431],"lp":["eci","cie","reci","dic","vid","deci","cid","rid","ris","cri","tid","dir","cier","cir","esti","rdi","dri","ves"],"rp":["ice","iste"]},"47":{"input":[1,2,3,4,6],"tlw":["vida",8817],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["in",187273],"trw":["ni",13944],"lp":[],"rp":["in","ni","hi","nin","ini","hin","hn","inn","nh","hnn"]},"49":{"input":[1,5,6],"tlp":["ah",14690],"trp":["ha",179890],"tlw":["ahi",2676],"trw":["ha",13606],"lp":["ah","ani","anz","anza","ahi","ania","zan","zq"],"rp":["ha","ian","ina","nia","nz","nza","han","hiz","iq","nian","iana","nina"]},"50":{"input":[2,5,6],"tlp":["sin",33228],"trp":["ij",25903],"tlw":["sin",21600],"lp":["sin","sini","sh","shi"],"rp":["ij","nsi","hij","ins","his","nis","ji","nsis","inis","insi","jin","nk","hisi","iji","inj","nins"]},"51":{"input":[1,2,5,6],"tlp":["siq",2408],"trp":["has",20672],"tlw":["ansia",145],"trw":["has",2554],"lp":["siq","ansi","sina","asin","anis","ash"],"rp":["has","ija","iaj","inas","hija","nzas","jai","nias","iaja","nsia","ijas","isaj","hans","isan"]},"52":{"input":[3,5,6],"tlp":["eni",26205],"trp":["ien",107409],"tlw":["eh",468],"trw":["he",7264],"lp":["eni","ein","enie","eh","enin","ehi","enei"],"rp":["ien","he","iene","ine","nie","nien","hie","inie","hen","inen","nei","nhe","nine"]},"53":{"input":[1,3,5,6],"tlp":["enia",16307],"trp":["hay",9090],"trw":["hay",7403],"lp":["enia","enz","enza","eina","enaz","eian","ezan","anie","eniz","aine"],"rp":["hay","haya","inea","ienz","hae","nez","hez","iena","yah","inez"]},"54":{"input":[2,3,5,6],"tlp":["dij",16709],"trp":["ndi",19946],"tlw":["dije",1690],"trw":["ines",410],"lp":["dij","endi","enid","sien","din","dien","dine","dije","ensi"],"rp":["ndi","iend","nid","ind","iden","ndid","indi","iej","ije","nsid","iens"]},"55":{"input":[1,2,3,5,6],"tlw":["ansiedad",269],"trw":["nadie",5526],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["bi",119303],"trp":["ib",32479],"trw":["ibn",155],"lp":["bi","tin","vin","bit","th","tint"],"rp":["ib","int","nti","nv","ibi","nvi","ntin","inti","inv","nit","invi","niv","init","nvit"]},"57":{"input":[1,4,5,6],"tlp":["abi",63989],"trp":["hab",72658],"tlw":["fin",4343],"trw":["habia",39290],"lp":["abi","bia","abia","fin","bian","van","anti","fina","vant","vab","vaba","abit","zab"],"rp":["hab","habi","iba","inf","nfi","itan","ntia"]},"58":{"input":[2,4,5,6],"tlp":["ch",74839],"trp":["nci",46192],"lp":["ch","cin","sib","chi","stin","cinc","cib","chic","sint","cibi"],"rp":["nci","inc","nic","hic","ich","inci","inst","hist","nch","hici"]},"59":{"input":[1,2,4,5,6],"tlw":["sabia",3858],"trw":["hasta",13934],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["bie",35373],"trp":["ient",36355],"tlw":["bien",10956],"lp":["bie","bien","ven","teni","bri","enti","tien","bier","rin","rib","ebi","rien","vien","vent"],"rp":["ient","inte","her","nve","ibr","nri"]},"61":{"input":[1,3,4,5,6],"tlw":["tenia",10650],"trw":["haber",3961],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["tienes",1622],"trw":["interes",873],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["cabeza",5567],"trw":["hacer",6941],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",993],"trw":["o",22465],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","tlp":["ao",736],"trp":["oa",1039],"lp":["ao"],"rp":["oa"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",149815],"trp":["os",465150],"tlw":["sos",79],"trw":["os",2177],"lp":["so","sos","sso"],"rp":["os","oso","osos","oss","oos"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["aso",13706],"trp":["osa",17222],"lp":["aso","asos","aos","saso","wo"],"rp":["osa","osas","ow","oas"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["eo",16208],"trp":["oe",2284],"trw":["-",992],"lp":["eo"],"rp":["oe"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["xo",492],"trp":["ox",1396],"lp":["xo","exo"],"rp":["ox"]},"70":{"input":[2,3,7],"tlp":["do",328036],"trp":["od",79897],"tlw":["dos",13303],"lp":["do","dos","eso","edo","esos","dedo","seo","eseo","dose","edos","deo","eos","seos"],"rp":["od","odo","odos","ode","ose","oses","oes"]},"71":{"input":[1,2,3,7],"tlp":["ado",89938],"trp":["oda",15354],"tlw":["dado",2055],"lp":["ado","ados","dado","sado","eado","aseo","sexo","adeo","dosa","dox","adox"],"rp":["oda","odas","odea","osad","owe"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["to",261028],"trp":["ot",48115],"tlw":["g",93],"lp":["to","go","tot","got","goo","goog","tog","gt","gto","gg","goto","tto"],"rp":["ot","og","oto","oog","otog","ogo","ogg"]},"73":{"input":[1,4,7],"tlp":["ga",53335],"trp":["of",10649],"tlw":["foto",316],"trw":["of",213],"lp":["ga","ag","fo","ato","ago","aga","tota","fot","foto","gat","tag","afo","gota","gato","tago","gaf"],"rp":["of","ota","oga","ofo"]},"74":{"input":[2,4,7],"tlp":["co",351806],"trp":["oc",68424],"tlw":["toco",325],"lp":["co","sto","tos","cos","cto","sco","gos","stos","sot","cost","coc","cog","soc","sg"],"rp":["oc","oco","ost","osot","osc","oct"]},"75":{"input":[1,2,4,7],"tlp":["cosa",9340],"trp":["oca",11672],"tlw":["cosas",5443],"lp":["cosa","aco","caso","gas","acto","atos","gac","sof","toca","saco","asto","cato","sag","asco","acos"],"rp":["oca","ocas","osta","otas","osof"]},"76":{"input":[3,4,7],"tlp":["ro",246584],"trp":["or",270405],"tlw":["error",581],"trw":["otro",8826],"lp":["ro","ero","eg","tro","gr","ge","rg","tor","ego","rto","reg","erto","rro","rgo"],"rp":["or","otr","otro","ort","ore","orr"]},"77":{"input":[1,3,4,7],"tlp":["gra",22435],"trp":["ora",27567],"tlw":["rato",1491],"trw":["otra",7718],"lp":["gra","aro","gar","ega","arg","for","argo","rga","egar","atro","arga","rato","rof","agr","age","arro","arto"],"rp":["ora","otra","orta"]},"78":{"input":[2,3,4,7],"tlp":["tod",44574],"trp":["ord",10842],"tlw":["todo",18934],"trw":["otros",4846],"lp":["tod","ros","todo","esto","seg","cor","tros","dor","stro","rso","rdo","erso","ecto","eco","eros","corr","reco"],"rp":["ord","ores","oce"]},"79":{"input":[1,2,3,4,7],"tlw":["toda",5491],"trw":["otras",3010],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["on",376567],"trw":["no",116565],"lp":[],"rp":["on","no","un","nu","uno","ono","nun","uo","nuo","non","ou","onu","onun","uu","oun","nou","nnu","nuno","onn"]},"81":{"input":[1,5,7],"tlp":["qu",432873],"trp":["una",93404],"tlw":["aun",5685],"trw":["una",79449],"lp":["qu","ano","aqu","au","aun","aunq","anu","anqu"],"rp":["una","ua","uan","ona","nqu","unq","unqu","nua","oq","oqu","uq","uqu"]},"82":{"input":[2,5,7],"tlp":["su",160644],"trp":["us",78931],"tlw":["su",81749],"trw":["nos",11959],"lp":["su","sus","son","sun"],"rp":["us","jo","nos","ju","jos","ons","oj","uj","unos","ojo","uso","ojos","jun","nso","noso","jus"]},"83":{"input":[1,2,5,7],"tlp":["anos",18802],"trp":["unas",5230],"tlw":["anos",8719],"trw":["unas",3324],"lp":["anos","ajo","sona","aus","asu","sua","ausa","squ","asun"],"rp":["unas","usa","jua","juan","onas","oja","uas","onaj","onsa","osq","osqu"]},"84":{"input":[3,5,7],"tlp":["eno",33962],"trp":["ue",565691],"trw":["yo",19966],"lp":["eno","eu","enu","eon","eun","eyo"],"rp":["ue","yo","uen","one","uy","nue","oy","ueno","uyo","yu","oye","une","oyo","yun"]},"85":{"input":[1,3,5,7],"tlp":["que",383802],"trp":["nque",7839],"tlw":["que",312514],"lp":["que","aque","ayo","equ","eque","quen","ayu","anue","ayun","aneo","xu","exu","xua","exua"],"rp":["nque","uena","uya","oya","uque","oque"]},"86":{"input":[2,3,5,7],"tlp":["du",23000],"trp":["ndo",74158],"tlw":["donde",10101],"trw":["jose",1204],"lp":["du","don","ejo","endo","dond","enos","seno","sue"],"rp":["ndo","ues","ud","ond","ued","ones","onde","und","uje","nues","undo","uede"]},"87":{"input":[1,2,3,5,7],"tlw":["quedo",2301],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["gu",90299],"trp":["nto",80019],"tlw":["tu",10629],"trw":["noto",316],"lp":["gu","tu","gun","bo","bu","ton","gunt"],"rp":["nto","ob","ont","ng","unt","ub","ut","unto","nton","ug","ngu","uto","ngo"]},"89":{"input":[1,4,5,7],"tlp":["fu",44220],"trp":["uga",7270],"tlw":["tanto",6066],"trw":["nota",486],"lp":["fu","anto","gua","gan","guna","tua","agu","ang","agua","fun","abo","atu","fon"],"rp":["uga","unta","uant","onta","onf","uta","oba"]},"90":{"input":[2,4,5,7],"tlp":["con",167856],"trp":["uc",36702],"tlw":["con",92933],"trw":["junto",3143],"lp":["con","cu","cont","sob","cons","scu","cono","stu","tonc"],"rp":["uc","noc","ust","nco","onc","ntos","unc","ocu","onoc","ncon","nunc"]},"91":{"input":[1,2,4,5,7],"tlw":["bajo",4396],"trw":["nunca",6044],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["ento",40726],"trp":["ur",54620],"tlw":["gente",4061],"trw":["negro",1571],"lp":["ento","ron","egu","ru","gen","egun","eron","enor","tur","bue","buen"],"rp":["ur","uer","obr","obre","nor","uert","ontr","uro","uent"]},"93":{"input":[1,3,4,5,7],"tlw":["fue",13323],"trw":["obra",1151],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["sobre",15089],"trw":["usted",6039],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["cuando",21007],"trw":["nuestra",3160],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["lo",300357],"trw":["lo",69406],"lp":[],"rp":["lo","io","ll","li","ol","il","llo","olo","ill","ili","oli","lli","illo","lio","oi","ilo","oll","iol","ollo","ilio"]},"97":{"input":[1,6,7],"tlp":["al",268424],"trp":["la",523649],"tlw":["al",55586],"trw":["la",292004],"lp":["al","zo","all","ali","ala","azo","alo","alli","alla","allo"],"rp":["la","lla","lia","illa","ial","oz","ola","izo","ilia","ila"]},"98":{"input":[2,6,7],"tlp":["sol",26132],"trp":["los",142568],"tlw":["solo",13145],"trw":["los",122255],"lp":["sol","sio","solo","sil","sill","sl","soli"],"rp":["los","ios","llos","osi","iso","isio","ls","ioso","lis","ols","lso","loso","isl"]},"99":{"input":[1,2,6,7],"tlp":["sal",19326],"trp":["las",90934],"tlw":["salio",1704],"trw":["las",76432],"lp":["sal","sali","zos","asio","sola","sala","azos","sla","alas","salo","asil","als","alis"],"rp":["las","llas","iosa","lsa","olas","isla","olsa"]},"100":{"input":[3,6,7],"tlp":["el",426668],"trp":["le",198463],"tlw":["el",234850],"trw":["le",48083],"lp":["el","ell","ello","elo","ele","eli","elle","elli"],"rp":["le","lle","ole","ile","iel","lie","ielo","leo","lee","iole","lei","ille"]},"101":{"input":[1,3,6,7],"tlp":["ella",27778],"trp":["lez",2228],"tlw":["ella",14508],"trw":["leia",238],"lp":["ella","ale","ela","alle","eal","eali","ezo","alie","alez","eliz","elia","ael","xio","exio"],"rp":["lez","leza","lea","iale","oxi","llez"]},"102":{"input":[2,3,6,7],"tlp":["del",76844],"trp":["ido",57544],"tlw":["del",70196],"trw":["les",7650],"lp":["del","dio","dios","dido","sido","edio","esio","dol","sile","eles"],"rp":["ido","les","odi","lid","ld","idos","ilid","oles","idio","iles"]},"103":{"input":[1,2,3,6,7],"tlw":["ellas",1912],"trw":["lado",4590],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["vo",45659],"trp":["ig",52962],"tlw":["volvio",2823],"trw":["oigo",95],"lp":["vo","gi","vio","vol","tio","volv","gl"],"rp":["ig","lt","lg","lv","ito","ov","igo","olv","lgo","lvi","olvi","lto","lig"]},"105":{"input":[1,4,6,7],"tlp":["alg",26073],"trp":["lta",13054],"tlw":["algo",9338],"trw":["italia",381],"lp":["alg","tal","alt","algo","fl","alta","val","agi","voz","fal","alto","tall","avo","alv","gia"],"rp":["lta","iga","lat","ofi","lav"]},"106":{"input":[2,4,6,7],"tlp":["cio",75669],"trp":["ico",18875],"tlw":["visto",3153],"trw":["loco",681],"lp":["cio","cl","sig","col","ccio","cil","vos","cios","colo"],"rp":["ico","lic","icio","oci","isto","lc","loc","icos","lici","lico","igos"]},"107":{"input":[1,2,4,6,7],"tlw":["facil",1160],"trw":["oficial",985],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["rio",36719],"trp":["leg",18029],"tlw":["rio",1831],"trw":["llego",2460],"lp":["rio","rl","erio","evo","gri","tori","tel","erl","rlo","rig"],"rp":["leg","ori","lev","lleg","iero","lor","llev","ove","ler","iro"]},"109":{"input":[1,3,4,6,7],"tlw":["favor",1408],"trw":["llegar",2630],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["cierto",3067],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["todavia",3269],"trw":["llegado",1772],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["ui",77353],"trw":["nino",1684],"lp":[],"rp":["ui","ion","ho","lu","ul","ino","hu","uni","oni","nio","lin","lon","ulo","iu","inu","olu","onio","uin","nino","uil"]},"113":{"input":[1,5,6,7],"tlp":["qui",49071],"trp":["lan",19182],"tlw":["aqui",6351],"trw":["hizo",5133],"lp":["qui","aho","aqui","zon","azon","alq","alqu"],"rp":["lan","ual","nal","uz","iona","hizo","ula","iqu","lq","lqu","lqui","inal","ualq"]},"114":{"input":[2,5,6,7],"tlp":["sion",15408],"trp":["ijo",20150],"tlw":["sino",5212],"trw":["hijo",3480],"lp":["sion","sino","sul","solu"],"rp":["ijo","hos","hijo","usi","uis","lus","inos","onsi","luso","ijos","usio","ulos","nsio","luis","jul","juli"]},"115":{"input":[1,2,5,6,7],"tlw":["quiso",1107],"trw":["julia",613],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["elen",1805],"trp":["uel",35859],"trw":["hoy",2254],"lp":["elen","euni"],"rp":["uel","uie","uien","len","uell","ione","lue","uelo","llen","ilen","lien","hoy","ley","hue","lone","line","leno","nel"]},"117":{"input":[1,3,5,6,7],"tlw":["quien",8560],"trw":["linea",925],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["dijo",13944],"trw":["lejos",1983],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["aquellos",2619],"trw":["juez",487],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["bl",44167],"trp":["lgu",15861],"tlw":["tuvo",2452],"trw":["ningun",2097],"lp":["bl","gui","tuv","bio","vu"],"rp":["lgu","ult","igu","lgun","uv","ubi","itu","ing","ibl","hub","onv","lib","hubi","ulti","obl"]},"121":{"input":[1,4,5,6,7],"tlw":["alguna",3442],"trw":["ninguna",2180],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["cinco",2085],"trw":["incluso",2762],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["cual",3860],"trw":["habitacion",1620],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["voy",2278],"trw":["luego",6071],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["ahora",9282],"trw":["lugar",4548],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["dicho",3458],"trw":["noche",5939],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["ciudad",3866],"trw":["historia",2737],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trp":["pp",273],"trw":["p",308],"lp":[],"rp":["pp"]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",34091],"trp":["pa",189321],"trw":["papa",1263],"lp":["ap","apa"],"rp":["pa","pap","papa","ppa"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",58765],"trp":["ps",612],"lp":["sp"],"rp":["ps"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["spa",11453],"trp":["pas",22840],"trw":["pasa",1406],"lp":["spa","asp","sap","sapa","apas","spas"],"rp":["pas","pasa"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",17553],"trp":["pe",152316],"tlw":["ep",67],"trw":["pepe",388],"lp":["ep","epe","epp"],"rp":["pe","pep","pepe"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["xp",7112],"trp":["pape",1900],"trw":["pa'",77],"lp":["xp","exp","ape","epa","xpe","expe","a'","xpa","expa"],"rp":["pape","pea","pa'","pepa"]},"134":{"input":[2,3,8],"tlp":["esp",48661],"trp":["pes",7009],"trw":["pese",726],"lp":["esp","spe","espe","desp","sep","dep","sesp","depe","sped","spes"],"rp":["pes","ped","pese","pede"]},"135":{"input":[1,2,3,8],"tlp":["espa",10359],"trp":["pad",10546],"tlw":["espada",1195],"trw":["pase",469],"lp":["espa","esap","aspe","spad","sepa","xped","apad","epas","depa","spea"],"rp":["pad","pesa","pada","pase","peda","pade","pead"]},"136":{"input":[4,8],"trp":["pt",3066],"lp":[],"rp":["pt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["tap",602],"trp":["pat",4693],"tlw":["tapa",136],"trw":["pata",128],"lp":["tap","apat","tapa","apt","apta"],"rp":["pat","pta","pata"]},"138":{"input":[2,4,8],"trp":["pc",1379],"lp":[],"rp":["pc"]},"139":{"input":[1,2,4,8],"tlp":["cap",8573],"trp":["pac",6048],"tlw":["capa",378],"trw":["patas",294],"lp":["cap","capa","spac","apac","scap","capt"],"rp":["pac","past","pact"]},"140":{"input":[3,4,8],"tlp":["rp",9074],"trp":["pr",105517],"trw":["peter",135],"lp":["rp","rep","erp","rpr","rpre","ept","repe","epr","epre","repr","rpe"],"rp":["pr","per","pre","pet","pert","pret","prep","perr","pete"]},"141":{"input":[1,3,4,8],"tlp":["apar",7464],"trp":["par",95147],"tlw":["aparte",525],"trw":["para",50839],"lp":["apar","apr","epar","rap","apre","repa","xper","xpr","expr","xpre","epta"],"rp":["par","para","pare","part","pera","pra","perf","patr","pref"]},"142":{"input":[2,3,4,8],"tlp":["resp",9516],"trp":["pres",14702],"tlw":["espere",155],"trw":["perder",971],"lp":["resp","sper","spec","cep","cept","spet","epc","cepc","spr","espr","spre"],"rp":["pres","pec","pers","perd","prec","pect","pedr","perc","pece"]},"143":{"input":[1,2,3,4,8],"tlw":["espera",1024],"trw":["padre",6018],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["mp",72228],"trw":["m",171],"lp":[],"rp":["mp","nm","mn","mpp"]},"145":{"input":[1,5,8],"tlp":["am",111190],"trp":["ma",217996],"tlw":["ama",379],"trw":["manana",3399],"lp":["am","ama","amp","aman","ampa"],"rp":["ma","man","pan","mpa","mana","mpan","pana","mam","nam","mama","mna","maq","pam","mpam","nap"]},"146":{"input":[2,5,8],"tlp":["sm",16472],"trp":["nsp",1139],"lp":["sm"],"rp":["nsp","mps","nsm"]},"147":{"input":[1,2,5,8],"tlp":["span",4757],"trp":["mas",62981],"tlw":["sam",202],"trw":["mas",42217],"lp":["span","sma","sam","amas","asm","smas","asma","asam","ansp"],"rp":["mas","jam","jama","nsam","paj","paja","masa","maj","mpas","mnas","mans"]},"148":{"input":[3,5,8],"tlp":["em",88958],"trp":["me",181753],"trw":["me",47087],"lp":["em","emp","eme","emen","empe","enem","epen","emn"],"rp":["me","men","pen","mpe","nem","nme","mem","mene","nmen","mpen","pene","pey"]},"149":{"input":[1,3,5,8],"tlp":["ame",24574],"trp":["mane",7021],"tlw":["examen",171],"trw":["pena",1009],"lp":["ame","amen","ema","eman","apen","enam","eam","eame","xam"],"rp":["mane","may","peq","pena","pane","mae","mena","max","name","mame","mex"]},"150":{"input":[2,3,5,8],"tlp":["dem",13584],"trp":["med",13820],"tlw":["depende",152],"trw":["meses",1727],"lp":["dem","sem","ejem","dm","seme","emej","spej","emed"],"rp":["med","pens","mej","mes","mens","jem","jemp","mese","nmed","pend","mend","pej"]},"151":{"input":[1,2,3,5,8],"tlw":["ademas",3394],"trw":["mesa",2367],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["tm",622],"trp":["mb",53887],"lp":["tm","bm"],"rp":["mb"]},"153":{"input":[1,4,5,8],"tlp":["tam",22247],"trp":["mba",6413],"tlw":["fama",385],"trw":["mata",229],"lp":["tam","amb","tamb","fam","tamp","amab","bam","atam","abam","amba"],"rp":["mba","mat","mant","mab","maba","mata","pant","pab","ntam","mbat"],"special":"numsym"},"154":{"input":[2,4,5,8],"lp":[],"rp":[]},"155":{"input":[1,2,4,5,8],"tlw":["cama",1722],"trw":["pasaba",1017],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["rm",44145],"trp":["ment",47484],"tlw":["repente",849],"trw":["mente",1213],"lp":["rm","erm","empr","tem","rme","emb","rem","term","temp"],"rp":["ment","mbr","mbre","mer","mpr","mpre","pren","met","perm","ntem","mper"]},"157":{"input":[1,3,4,5,8],"tlw":["tema",888],"trw":["manera",3467],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["empece",256],"trw":["presente",701],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["armas",1351],"trw":["madre",4699],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"!","trp":["pi",45492],"lp":[],"rp":["pi","ip","ipi","pip"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["api",5901],"trp":["pia",3578],"trw":["paz",1186],"lp":["api","apaz","zap","zapa","apia","apiz"],"rp":["pia","paz","pai","ipa","piz","pipa","ppai"]},"162":{"input":[2,6,8],"tlp":["spi",5706],"trp":["isp",4720],"lp":["spi"],"rp":["isp","pis","psi","ispi"]},"163":{"input":[1,2,6,8],"tlp":["spia",239],"trp":["pais",2619],"trw":["pais",1820],"lp":["spia","aspi"],"rp":["pais","pasi","ispa","pias","pisa","psia","ipas"]},"164":{"input":[3,6,8],"tlp":["epi",1192],"trp":["pie",14289],"trw":["pie",2140],"lp":["epi"],"rp":["pie","ipe","ipie","pei"]},"165":{"input":[1,3,6,8],"trp":["pez",4584],"trw":["pieza",377],"lp":[],"rp":["pez","peza","piez"]},"166":{"input":[2,3,6,8],"tlp":["espi",3579],"trp":["pid",4842],"trw":["pies",1461],"lp":["espi","disp","dip","epis","spie","spid"],"rp":["pid","pedi","pied","pies","pidi","pide","pesi","ispe","ipes","k'","kesp"]},"167":{"input":[1,2,3,6,8],"tlw":["despedida",172],"trw":["paises",358],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["tip",2633],"trp":["pit",4928],"lp":["tip","tipi"],"rp":["pit","piti","pti","ipt","ipit"]},"169":{"input":[1,4,6,8],"tlp":["apit",3167],"trp":["pita",2814],"tlw":["tapia",110],"lp":["apit","tapi","vap"],"rp":["pita","pati","pav"]},"170":{"input":[2,4,6,8],"tlp":["cip",5255],"trp":["pci",1379],"lp":["cip","cipi","spit","scip","visp"],"rp":["pci","pist","icip","pic","ipc","ipci","ipic","psic","pisc","ptic"]},"171":{"input":[1,2,4,6,8],"tlw":["capaz",1523],"trw":["pista",305],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["repi",892],"trp":["pri",18110],"tlw":["repetir",243],"trw":["pierre",163],"lp":["repi","epit","epti","rip","rpi","trip","epri","erpi"],"rp":["pri","peri","pir","pier","piri","peti","priv","prev","ptie","piet","perv","pite"]},"173":{"input":[1,3,4,6,8],"tlw":["repetia",185],"trw":["partir",944],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["especie",1047],"trw":["pedir",513],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["capacidad",547],"trw":["parecia",4070],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["mi",147074],"trw":["mi",29966],"lp":[],"rp":["mi","im","min","imp","imi","nim","inm","pin","mpi","mini","nmi","impi","pini","imin","inim","hip","him","imn","ph","phi"]},"177":{"input":[1,5,6,8],"tlp":["ami",19873],"trp":["ima",14150],"tlw":["anima",95],"trw":["mia",816],"lp":["ami","amin","anim","aim"],"rp":["ima","mina","iam","mia","mani","nima","pani","impa","ham","mpia","niam","mai","nami","mian","inam","imam"]},"178":{"input":[2,5,6,8],"tlp":["sim",4131],"trp":["mis",25550],"trw":["mis",5514],"lp":["sim","simp","simi","spin","smi","smis","sism"],"rp":["mis","ism","mism","misi","isim","insp","nspi","jim","nism","imis","hisp","ismi","jimi"]},"179":{"input":[1,2,5,6,8],"tlw":["animas",76],"trw":["misma",3576],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["emi",4450],"trp":["mie",21370],"lp":["emi","empi","emin"],"rp":["mie","iem","iemp","mien","ime","imie","hem","inme","imen","pien","nemi","impe","miem","mpie","meni","heme","mine"]},"181":{"input":[1,3,5,6,8],"tlw":["empieza",396],"trw":["maxima",192],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["dime",307],"trw":["impide",99],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["demasiadas",229],"trw":["media",1745],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tim",9690],"trp":["mbi",15416],"lp":["tim","vim","timi","vimi","timb"],"rp":["mbi","mit","miti","ntim","pint","imit","imb","itm","pib","mbit","itim","ivim","mbin","mib","ptib"]},"185":{"input":[1,4,5,6,8],"trw":["pinta",126],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"tlw":["smith",64],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["capitan",1308],"trw":["incapaz",452],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["verme",274],"trw":["primer",2357],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["tambien",10237],"trw":["primera",3631],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["siempre",8021],"trw":["presidente",1129],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["encima",2175],"trw":["mientras",7333],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["po",202728],"trw":["pop",64],"lp":[],"rp":["po","op","opo","pop","ppo"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["apo",2962],"trp":["opa",4287],"trw":["popa",199],"lp":["apo"],"rp":["opa","popa"]},"194":{"input":[2,7,8],"tlp":["spo",8366],"trp":["pos",15078],"trw":["pos",130],"lp":["spo","spos","sop","sosp","sopo"],"rp":["pos","osp","opos","poso","pso","ops"]},"195":{"input":[1,2,7,8],"tlp":["apos",275],"trp":["paso",5668],"tlw":["sopa",128],"trw":["paso",4414],"lp":["apos","sopa"],"rp":["paso","opas","posa","pow"]},"196":{"input":[3,7,8],"tlp":["epo",1772],"trp":["ope",2726],"lp":["epo","eppo"],"rp":["ope","peo","poe","opeo","pope"]},"197":{"input":[1,3,7,8],"tlp":["xpo",209],"trp":["opea",131],"lp":["xpo","expo"],"rp":["opea"]},"198":{"input":[2,3,7,8],"tlp":["espo",6435],"trp":["pod",19770],"tlw":["esposo",391],"trw":["peso",623],"lp":["espo","epos","depo","dop","speo","dope"],"rp":["pod","pode","pose","ospe","peso","poes","psoe","peos","podo"]},"199":{"input":[1,2,3,7,8],"tlw":["esposa",926],"trw":["pasado",2726],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["top",143],"trp":["pto",1342],"trw":["opto",99],"lp":["top"],"rp":["pto","pot","opt","opto"]},"201":{"input":[1,4,7,8],"tlp":["apag",394],"trp":["pag",2930],"tlw":["apago",137],"trw":["pago",329],"lp":["apag","tapo"],"rp":["pag","paga","pago","pato","opag","opta"]},"202":{"input":[2,4,7,8],"tlp":["cop",1471],"trp":["poc",14176],"trw":["poco",8226],"lp":["cop","scop","copo","tops"],"rp":["poc","poco","post","opc","ptos"]},"203":{"input":[1,2,4,7,8],"tlw":["copa",496],"trw":["pocas",752],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["rop",11433],"trp":["por",105551],"tlw":["torpe",134],"trw":["por",82819],"lp":["rop","rpo","erpo","trop","ropo","epto"],"rp":["por","pero","pro","preg","prop","port","orp","orpr","preo","prot","opor","peor","oper","peg"]},"205":{"input":[1,3,4,7,8],"tlw":["ropa",972],"trw":["pagar",556],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["espero",808],"trw":["poder",3232],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"tlw":["aspecto",1030],"trw":["profesor",509],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["mo",151250],"trw":["puno",277],"lp":[],"rp":["mo","om","pu","mu","omo","mpo","um","omp","up","pon","mon","mun","mom","pun","upo","nom","omu","omun","num","umo"]},"209":{"input":[1,5,7,8],"tlp":["amo",19266],"trp":["mano",16278],"tlw":["amo",786],"trw":["mano",5872],"lp":["amo","ampo","apu","amon","aum"],"rp":["mano","oma","ompa","uma","pano","upa","uman","oman","manu","pau","mona","maqu","namo","umna","uap"]},"210":{"input":[2,5,7,8],"tlp":["spu",13016],"trp":["mos",30677],"tlw":["somos",935],"trw":["puso",2090],"lp":["spu","smo","sup","spon","som","supo","supu","sum","somo","smos"],"rp":["mos","muj","pus","puso","mpos","mus","moso","omos","pons","usp"]},"211":{"input":[1,2,5,7,8],"tlw":["suma",280],"trw":["manos",4296],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["emo",15453],"trp":["pue",46340],"tlw":["empeno",236],"trw":["muy",14472],"lp":["emo","empo","emon","epu"],"rp":["pue","ome","muy","omen","mue","meno","mome","ume","pone","upe","umen","nume","nemo","upue","poy","memo"]},"213":{"input":[1,3,5,7,8],"tlw":["apoyo",685],"trw":["pequeno",1827],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["despues",9579],"trw":["menos",6628],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["amado",313],"trw":["mando",1140],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["tom",6546],"trp":["omb",23704],"tlw":["tomo",1241],"trw":["punto",3190],"lp":["tom","tum","tumb","tomo","tup","bom","tmo"],"rp":["omb","punt","nomb","umb","pub","mont","pob","mbo","mot","pong","put","moto","umbo"]},"217":{"input":[1,4,5,7,8],"tlw":["toma",528],"trw":["punta",577],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["como",50874],"trw":["puntos",421],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["tampoco",2231],"trw":["montanas",596],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["grupo",2081],"trw":["momento",6711],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["forma",3330],"trw":["porque",13945],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["cuerpo",3541],"trw":["mujer",5923],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["respuesta",1354],"trw":["personas",2316],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["pl",26745],"trw":["pollo",147],"lp":[],"rp":["pl","opi","pli","pio","pol","poli","lp","ipo","olp","plo","opio","ipio","pil","lip","lop","plio","ipl","pill","ilip","lipo"]},"225":{"input":[1,6,7,8],"tlp":["apl",391],"trp":["pal",11994],"tlw":["apolo",118],"trw":["plaza",1014],"lp":["apl","apol","apil","apli","alop","apla"],"rp":["pal","pla","pala","opia","ipal","lpa","plaz","palo","pali","plia","pila","poz","pozo","lap"]},"226":{"input":[2,6,7,8],"tlp":["spl",427],"trp":["posi",7976],"tlw":["soplo",116],"trw":["piso",796],"lp":["spl","sopl","spio"],"rp":["posi","ispo","pios","piso","ospi","ipos","plos","lpis","opsi"]},"227":{"input":[1,2,6,7,8],"trw":["pasillo",584],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["epl",1170],"trp":["pel",8010],"trw":["piel",1315],"lp":["epl","epli","elip","eple"],"rp":["pel","ple","lpe","olpe","peli","pelo","piel","pele","opie","pell","lipe","lope","pole","lpeo","pleo","opel"]},"229":{"input":[1,3,6,7,8],"trw":["papel",1409],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["episodio",202],"trw":["podido",1018],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["espalda",1291],"trw":["podia",6502],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["golp",2796],"trp":["polv",730],"tlw":["tipo",2063],"trw":["polvo",512],"lp":["golp","tipo","gip","gipt","tipl"],"rp":["polv","pito","ipto","ipot","ltip","plit"]},"233":{"input":[1,4,6,7,8],"tlw":["filipo",307],"trw":["patio",737],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"tlw":["tipos",271],"trw":["politicos",569],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["capital",627],"trw":["politica",1189],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"tlw":["golpe",1615],"trw":["propio",2058],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"tlw":["felipe",457],"trw":["propia",1864],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["replico",777],"trw":["perdido",1215],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["especial",896],"trw":["podria",2740],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["hom",15529],"trw":["mil",2026],"lp":[],"rp":["hom","mil","lm","mpl","imo","omi","mili","impo","mino","hum","lim","moni","ompl","mio","mpli","lum","poni","pul","mplo","impl"],"special":"enter"},"241":{"input":[1,5,6,7,8],"tlw":["alma",1817],"trw":["mal",3264],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"trw":["mismo",8546],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["suponia",297],"trw":["humanos",580],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"tlw":["empleo",215],"trw":["pleno",336],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["empezo",1641],"trw":["manuel",722],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["ejemplo",1285],"trw":["medio",3051],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["demasiado",2974],"trw":["podian",1303],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"trw":["ultimo",2103],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["amigo",2622],"trw":["ultima",1629],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["conmigo",1217],"trw":["mucho",7468],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["camino",3366],"trw":["muchas",2632],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["tiempo",9492],"trw":["hombre",8282],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["finalmente",1135],"trw":["hermano",2152],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["respondio",2029],"trw":["hombres",5292],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["comenzo",1401],"trw":["palabras",3233],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/fn-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/fn-keymap.json
new file mode 100644
index 00000000000..24e357aa161
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/fn-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",258251],"tlw":["a",455],"lp":["aa","aaa"],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",66466],"tlw":["s",731],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["sa",177484],"tlw":["saa",2123],"lp":["sa","as","ssa","saa","ass","assa","aas","ssaa","aass","sas","sass","asa","saas","aaas","wa","ssas","aasa","asas"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",59327],"tlw":["e",519],"lp":["ee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ea",19583],"tlw":["x",52],"lp":["ea","ae","eaa","ex","ax","aae"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["se",143967],"tlw":["se",27105],"lp":["se","es","de","ess","ed","ses","see","des","ede","dess","edes","ees","sess","eess","ese","eese","esee","sse","ssee","eed"],"rp":[]},"7":{"input":[1,2,3],"tlp":["da",33895],"tlw":["saada",1657],"lp":["da","essa","ad","ase","eda","aad","ada","eas","aada","ade","saad","sea","esa","aase","ades","seaa","das","daa","eass","asee"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",182756],"tlw":["t",129],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["ta",443960],"tlw":["tata",2224],"lp":["ta","at","tta","taa","att","ttaa","aat","ata","atta","aatt","tat","aata","tata","ataa","fa","ff","ft","af","tatt","aff"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["st",131877],"tlw":["st",145],"lp":["st","ts","sc","tc"],"rp":[]},"11":{"input":[1,2,4],"tlp":["sta",78874],"tlw":["taas",3738],"lp":["sta","ast","asta","staa","tas","ats","aast","taas","saat","tass","tsa","stas","sat","tast","satt","ac","stat","sata","tsas","sast"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["et",120310],"tlw":["te",3216],"lp":["et","te","ett","er","tte","re","rt","rr","tee","err","eet","ette","ert","tet","ete","tett","ter","rte","ere","etee"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ar",56709],"tlw":["etta",32564],"lp":["ar","ra","etta","tar","rra","era","erra","raa","eta","rta","aar","art","ara","ate","are","atte","rat","etaa","eraa","erta"],"rp":[]},"14":{"input":[2,3,4],"tlp":["est",21714],"tlw":["ester",156],"lp":["est","tse","ste","set","sest","rs","det","ets","res","dest","ress","tsee","este","sett","dett","rd","rest","ster","tses","der"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["esta",12314],"tlw":["eras",1057],"lp":["esta","ras","ars","eras","atse","dat","rast","aste","east","aras","tsea","etsa","rass","aset","sar","seta","ard","edat","sef","datt"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",48589],"trw":["n",1456],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",427381],"trp":["na",121169],"tlw":["anna",1340],"trw":["na",532],"lp":["an","aan","ana","ann","anna","anaa","aana","anan","aann","anq"],"rp":["na","nna","naa","naan","nan","nnan","nnaa","nq"]},"18":{"input":[2,5],"base":"j","baseshift":"J","tlp":["sn",381],"trp":["ns",47964],"trw":["j",621],"lp":["sn"],"rp":["ns","nss","nj"]},"19":{"input":[1,2,5],"tlp":["san",29730],"trp":["ja",188698],"tlw":["ajan",1077],"trw":["ja",138817],"lp":["san","ans","ansa","aj","saan","aja","anss","sana","aans","ajan","ssan"],"rp":["ja","nsa","jaa","jan","nssa","jas","jaan","nas","nsan"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",297363],"trp":["ne",120612],"tlw":["en",8035],"trw":["ne",8601],"lp":["en","een","enn","ene","enne","enen","ey","enee"],"rp":["ne","nen","ny","nne","yy","nee","yn","nnen","yny","neen","nny","yyn"]},"21":{"input":[1,3,5],"tlp":["ane",47273],"trp":["nay",5887],"tlw":["enaa",3363],"trw":["naen",437],"lp":["ane","anen","ay","ena","any","anne","enaa","aen","anee","aane","enna","ean","ayn","eaan","eena","ayny"],"rp":["nay","ya","nae","ynna"]},"22":{"input":[2,3,5],"tlp":["sen",43375],"trp":["ys",15306],"tlw":["sen",18097],"lp":["sen","ens","sy","den","seen","eens","sens","syn","syd","syy"],"rp":["ys","je","yd","ysy","nes","jen","yde","yys","nd","nnes"]},"23":{"input":[1,2,3,5],"tlp":["dan",14539],"trp":["yda",4761],"tlw":["sydan",458],"trw":["jaada",316],"lp":["dan","ensa","syda","anes","sena","ayd","asen","ayde","edan","daan","sean","and","ande","ays","ayda","assy","esan"],"rp":["yda","ydan","ysa"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["bb",82],"trp":["nt",46733],"tlw":["b",145],"lp":["bb","tn"],"rp":["nt","ntt","nb"]},"25":{"input":[1,4,5],"tlp":["taan",23917],"trp":["nta",24277],"tlw":["antaa",1443],"lp":["taan","ant","tan","anta","ttan","tann","aant","tana","ba","antt","anat","atan","bat","ab"],"rp":["nta","ntaa","nat","ntan","nnat","natt"]},"26":{"input":[2,4,5],"tlp":["bj",117],"trp":["nc",817],"lp":["bj","sb","sbj"],"rp":["nc","nst"]},"27":{"input":[1,2,4,5],"tlp":["ajat",5379],"trp":["jat",10551],"tlw":["sanat",714],"trw":["jattaa",503],"lp":["ajat","stan","taj","taja","tans","ttaj","sant","tsan","anc","cq","acq","staj"],"rp":["jat","jatt","jast","nast","jac","jacq","jata","ntas"]},"28":{"input":[3,4,5],"tlp":["ten",35400],"trp":["yt",52934],"tlw":["eteen",754],"trw":["nyt",14068],"lp":["ten","ty","tten","ent","teen","ren","tyy","tyt","tytt"],"rp":["yt","nyt","ytt","net","nte","yty","neet","ynyt","nty","nett","nnet"]},"29":{"input":[1,3,4,5],"tlp":["ayt",12824],"trp":["nayt",5724],"tlw":["taytyy",2000],"trw":["naet",1065],"lp":["ayt","ran","tay","aytt","tayt","anyt","anet","tany","rran","ayty","enta","raan","taen","aten","tya","aren","rann"],"rp":["nayt","ytta","yta"]},"30":{"input":[2,3,4,5],"tlp":["rj",9328],"trp":["yst",5033],"tlw":["syntynyt",298],"lp":["rj","sten","sty","tys","rje","tens","tsen","sent","tyst","esty","synt","etys","syt","rjee","syyt","stys"],"rp":["yst","nest","jet","jest"]},"31":{"input":[1,2,3,4,5],"tlw":["sentaan",644],"trw":["jaanyt",372],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",103087],"trw":["i",313],"lp":[],"rp":["ii","iii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["ai",154264],"trp":["ia",39589],"tlw":["z",67],"lp":["ai","aai","zi","az","zz","zzi","za","aza"],"rp":["ia","iaa","iia","iai","iz","izz","izzi"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["si",217633],"trp":["is",146392],"tlw":["siis",3048],"trw":["k",311],"lp":["si","sk","sii","ski","sis"],"rp":["is","ki","ik","ks","kk","isi","ksi","ikk","kki","ikki","iss","iis","kii","iks","iksi"]},"35":{"input":[1,2,6],"tlp":["ak",50178],"trp":["ka",233392],"tlw":["sai",2457],"trw":["kaikki",9023],"lp":["ak","aik","ais","asi","aikk","sia","aks","aka","aki","ska","aisi"],"rp":["ka","kaa","ika","kai","kaik","kas","kka","issa","isa"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",107437],"trp":["ie",70245],"tlw":["ei",34289],"lp":["ei"],"rp":["ie"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["ez",677],"trp":["ix",36],"tlw":["xii",62],"trw":["ix",36],"lp":["ez","xi","ezi","exi","ze","xii","aie","eia"],"rp":["ix"]},"38":{"input":[2,3,6],"tlp":["ek",18980],"trp":["ke",62524],"tlw":["die",61],"trw":["keksi",101],"lp":["ek","eid","eik","eis","sie","sei","esi","eks","ske","sek"],"rp":["ke","ise","id","kse","ike","ies","ide","ises","kei","kes"]},"39":{"input":[1,2,3,6],"tlp":["eida",12497],"trp":["ida",14485],"tlw":["eika",6048],"trw":["kaikkea",823],"lp":["eida","aise","eika","eka","aike","seka","ake","akse","aske","aid","aide","dak"],"rp":["ida","kea","ikea","ieda","kad","kade","keas","kkea"]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",98241],"trp":["it",143226],"tlw":["v",870],"trw":["iv",91],"lp":["ti","vi","tti","tii","vii","ttii","vit","tiv","ttiv","vitt","viit"],"rp":["it","iv","itt","iit","iti","itti","ivi","iitt","ivit"]},"41":{"input":[1,4,6],"tlp":["va",182750],"trp":["ita",65115],"tlw":["tai",4545],"lp":["va","vat","av","vai","ava","vaa","tai","aiv","aiva","tav","tava","ait","aav","avat"],"rp":["ita","iva","ivat","iita","itta","itaa"]},"42":{"input":[2,4,6],"tlp":["sit",26898],"trp":["ist",39998],"tlw":["viisi",327],"trw":["itki",255],"lp":["sit","sti","tk","sitt","siit","siv","tki","tsi","sv","vis","tis"],"rp":["ist","its","itk","isti","itsi","itki","kiv","iist","kiit"]},"43":{"input":[1,2,4,6],"tlp":["vas",19036],"trp":["ista",23491],"tlw":["sita",11781],"trw":["kavi",1357],"lp":["vas","vast","tka","sita","asti","tak","vaik","aist","atk","taka","siva","asv","tais","tasi","atka"],"rp":["ista","kat","kats","kasv","kav"]},"44":{"input":[3,4,6],"tlp":["ri",43375],"trp":["ir",15903],"tlw":["ettei",3147],"trw":["irti",421],"lp":["ri","ve","vie","tie","ev","tei","eit","rv","eri","eiv","etti","tiet","eti","ttei","vet"],"rp":["ir","itte","ite","iet","ier"]},"45":{"input":[1,3,4,6],"tlp":["ari",10391],"trp":["ieta",3954],"tlw":["eivat",3839],"lp":["ari","eva","var","eita","arv","eiva","ria","evat","arvi","tarv","vaar","vart","rva","raav","tari","veta","rai"],"rp":["ieta","ira","iera"]},"46":{"input":[2,3,4,6],"tlp":["rk",13550],"trp":["itse",13494],"tlw":["teki",1489],"trw":["itse",3766],"lp":["rk","esti","tek","etk","rkk","rsi","tied","ris","tke","rke","teid"],"rp":["itse","ker","kir","iste","iset","kert","kerr","irk","kirk"]},"47":{"input":[1,2,3,4,6],"tlw":["tieda",1175],"trw":["kertaa",1619],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["in",333976],"trw":["niin",26801],"lp":[],"rp":["in","ni","iin","nii","niin","ih","hi","inn","nh","nin","iih","hin","nni","hn","ihi","ihin","ini","iinn","inni","nhi"]},"49":{"input":[1,5,6],"tlp":["ah",50528],"trp":["ha",155587],"tlw":["aina",4737],"trw":["han",60727],"lp":["ah","ain","aha","ani","ahan","aina","anh","anha"],"rp":["ha","han","ina","nai","iina","nah","ian","nha","haa","iha","nain","ihan"]},"50":{"input":[2,5,6],"tlp":["sin",32954],"trp":["nk",49072],"tlw":["sikin",37],"trw":["kiinni",1175],"lp":["sin","siin","siih","skin"],"rp":["nk","kin","ink","nki","nkin","nsi","isin","iink","ij","hk","inki","ksin","nis","kiin","ins","ikin"]},"51":{"input":[1,2,5,6],"tlp":["akin",7540],"trp":["kaan",25562],"tlw":["sina",5798],"trw":["kanssa",4169],"lp":["akin","sina","ank"],"rp":["kaan","nka","kan","inka","kans","nak","nkaa","nais","naki","kana","ija","inak","kah","ikan","hka","jai","isan"]},"52":{"input":[3,5,6],"tlp":["eh",17793],"trp":["he",62964],"tlw":["enin",79],"trw":["he",9072],"lp":["eh","eni","ein","ehe"],"rp":["he","ine","inen","hy","yh","hei","ien","yi","hen","ieh","ihe","iihe","ihen","iehe","hny","inne"]},"53":{"input":[1,3,5,6],"tlp":["aine",8961],"trp":["hane",41802],"tlw":["eihan",834],"trw":["hanen",25783],"lp":["aine","ahe","ahny","eiha","eha","eina","ehia","ehan","enia","anhe","aihe","enha","ahne","eani"],"rp":["hane","yha","yhan","hea","hena","inay"]},"54":{"input":[2,3,5,6],"tlp":["enk",14707],"trp":["hd",22326],"tlw":["siihen",4304],"trw":["niiden",2381],"lp":["enk","enki","ensi","ehd"],"rp":["hd","ky","isen","ken","hde","yk","yks","heid","ksen","iden","hden","kein","yksi","kys","kysy","keen"]},"55":{"input":[1,2,3,5,6],"tlw":["ehka",1532],"trw":["heidan",5518],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["tiin",8421],"trp":["ht",36404],"tlw":["viini",52],"trw":["nti",182],"lp":["tiin","vin","tin","vih","th","viin"],"rp":["ht","hti","niit","nti","int","hit","ntti","nit","init","nv","iint","nitt","hv","itin"]},"57":{"input":[1,4,5,6],"tlp":["van",24884],"trp":["hta",10602],"tlw":["vaan",7099],"trw":["hanta",8388],"lp":["van","aht","tah","vaan","vain","vah","vanh","taht","ahti","vaha","avan","tain","taha","vana"],"rp":["hta","hant","ivan","htaa","hat","inta"]},"58":{"input":[2,4,5,6],"tlp":["tkin",2359],"trp":["ntis",951],"tlw":["viisin",90],"trw":["kiinnitti",90],"lp":["tkin","ch","tsin","tins","stin","tij","vink","tsh","tsij","tch"],"rp":["ntis","nist","hist","nci","hits","ncis","nsiv","itsh","nits","htik"]},"59":{"input":[1,2,4,5,6],"tlw":["vastaan",3099],"trw":["niista",1303],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["rin",8705],"trp":["yv",14540],"tlw":["tehnyt",1374],"trw":["hyvin",4061],"lp":["rin","teh","tyi","eht","ven","rh"],"rp":["yv","hyv","het","iten","her","yht","hte","yvi","herr","hyvi","yvin","ytti","heit","hnyt"]},"61":{"input":[1,3,4,5,6],"tlw":["taytyi",1362],"trw":["hanet",4513],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["sitten",8039],"trw":["kenties",944],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["teidan",2121],"trw":["kerran",2976],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",9026],"trw":["o",542],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","tlp":["ao",201],"trp":["oa",14352],"lp":["ao"],"rp":["oa","oaa"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",15574],"trp":["os",54094],"tlw":["so",36],"lp":["so","soo","sso","sos","soss"],"rp":["os","oss","oso","oos","ooss"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["soa",566],"trp":["ossa",8151],"trw":["osaa",838],"lp":["soa","aso","sao","ssao"],"rp":["ossa","osa","oas","osaa","osas","ow"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["eo",536],"trp":["oe",3004],"trw":["-",534],"lp":["eo"],"rp":["oe"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["a-",142],"trp":["ox",358],"lp":["a-","a-a","xo"],"rp":["ox","-a","oxo"]},"70":{"input":[2,3,7],"tlp":["do",12063],"trp":["od",8394],"lp":["do","dos","edo","sod","soe","doss","esso","eos","eoss","edos"],"rp":["od","ode","odo","ose","odos","oose","oses","odes","oes","oess"]},"71":{"input":[1,2,3,7],"tlp":["ado",599],"trp":["oda",1130],"tlw":["sodassa",75],"lp":["ado","soda","aado","dow","eado","adow"],"rp":["oda","odas","odaa"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["to",61617],"trp":["ot",51834],"tlw":["g",128],"trw":["ogoot",161],"lp":["to","tto","tot","too","tott","go","gt","goo","goot","gto","ttoo","gg"],"rp":["ot","ott","oto","otto","oot","og","ogo","ogoo"]},"73":{"input":[1,4,7],"tlp":["ato",2846],"trp":["ota",12728],"tlw":["totta",1107],"trw":["ottaa",1121],"lp":["ato","toa","ga","atto","ag","gat","gata","aato","ttoa","ago","gatt","toaa","fo"],"rp":["ota","otta","otaa","of","oat","oata","otoa"]},"74":{"input":[2,4,7],"tlp":["sto",3632],"trp":["ost",9527],"lp":["sto","tso","tos","sot","co","toss","tost","sott","stos","tsoo","stot","stoo","tsos","tsot","gs"],"rp":["ost","ots","oc","osto","osot"]},"75":{"input":[1,2,4,7],"tlp":["atso",3515],"trp":["osta",6277],"tlw":["sota",171],"trw":["ostaa",147],"lp":["atso","asto","gas","sota","atos","tsoa","sato","stoa","gast","sof","aggs","asot"],"rp":["osta","oast","otsa","osat","osof","owc"]},"76":{"input":[3,4,7],"tlp":["ro",11439],"trp":["or",16598],"tlw":["eero",648],"lp":["ro","ero","rto","tor","erto","ge","eto","rot","rg","erg","rro","erro","etto"],"rp":["or","ote","ort","ore","oet","oett","otte"]},"77":{"input":[1,3,4,7],"tlp":["rag",1424],"trp":["ora",1253],"tlw":["erottaa",195],"lp":["rag","aro","rtoa","rof","atro","rota","etoa","rofe","gra","aroo","roa","eroa","for"],"rp":["ora","oraa","orta","ofe","oeta","orea","otar"]},"78":{"input":[2,3,4,7],"tlp":["dot",4568],"trp":["odot",2046],"tlw":["god",157],"lp":["dot","dott","tod","tode","dost","ros","stor","sor","doto","cor","cort","roc","serg","ssor","tsoe","tros","ross"],"rp":["odot","oste","ors"]},"79":{"input":[1,2,3,4,7],"tlw":["grace",80],"trw":["odottaa",481],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["on",111283],"trw":["on",43019],"lp":[],"rp":["on","un","uu","uo","nu","no","ou","uon","nun","unn","onn","uun","unu","nnu","nuo","oon","nno","non","nou","onu"]},"81":{"input":[1,5,7],"tlp":["au",31984],"trp":["ua",18997],"lp":["au","ano","anu","aun","annu","aanu","aua","anoa","anon","auan"],"rp":["ua","nua","noa","ona","una","nau","uan","uona","onaa","unna"]},"82":{"input":[2,5,7],"tlp":["su",33737],"trp":["jo",99696],"tlw":["sun",387],"trw":["jos",9131],"lp":["su","suu","suo"],"rp":["jo","us","jos","ju","jon","oj","uus","jou","juu","uos","joss","ous","uns","nous","nus","ons","uss"]},"83":{"input":[1,2,5,7],"tlp":["sano",17998],"trp":["oja",7593],"tlw":["sanoa",1500],"trw":["jossa",2870],"lp":["sano","aus","asu","ausu","ajo","anoj","aju","sua"],"rp":["oja","noas","onsa","ussa","uja","noja","unsa","ojan","osan","uas","uoja","ojaa"]},"84":{"input":[3,5,7],"tlp":["eu",8909],"trp":["yo",14437],"tlw":["eno",84],"trw":["yon",465],"lp":["eu","enu","eno","ennu"],"rp":["yo","one","onne","unne","oy","ue","uone","yon","onee","une","oen","neu","unee","onen","noe","noen"]},"85":{"input":[1,3,5,7],"tlp":["que",622],"trp":["yona",396],"trw":["yona",396],"lp":["que","anoe","aune","aue","enoa","euna","xon","aneu","aeu"],"rp":["yona","nox","oxon","-na","-nay","nque","naeu","unay"]},"86":{"input":[2,3,5,7],"tlp":["seu",5113],"trp":["ud",9289],"tlw":["syo",106],"trw":["uuden",713],"lp":["seu","don","du","suud","syo"],"rp":["ud","ude","uud","uude","yos","use","uden","uod","oje","ojen","udes","uode","oyd","ues","oden"]},"87":{"input":[1,2,3,5,7],"tlw":["sanoen",554],"trw":["juoda",134],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["tu",97385],"trp":["ut",111271],"tlw":["tuo",4127],"trw":["outo",170],"lp":["tu","tun","tuo","ttu","ton","tunt","tuu"],"rp":["ut","utt","nut","uut","ng","unt","uot","unut","nnut","nto","uutt","utu","ont"]},"89":{"input":[1,4,5,7],"tlp":["anut",9016],"trp":["utta",36184],"tlw":["tuota",1414],"trw":["uutta",628],"lp":["anut","tanu","aut","tua","atu","autt","anto","attu","ttua","anot","tau","agn","ang"],"rp":["utta","uta","uuta","nga","onta","uota","unta"]},"90":{"input":[2,4,5,7],"tlp":["stu",9987],"trp":["jot",16587],"tlw":["totuus",204],"trw":["joutunut",411],"lp":["stu","tus","tuns","tuos","suut","toj","tust","stun","tsu","stus","sut"],"rp":["jot","ust","nust","jost","jout","nost","jott","uost","uots"]},"91":{"input":[1,2,4,5,7],"tlw":["saanut",2403],"trw":["jota",3761],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["ru",10641],"trp":["ur",27188],"tlw":["tytto",1225],"trw":["nuoren",497],"lp":["ru","eur","ettu","tyo","rou","ruu","tur","eut"],"rp":["ur","uur","uor","ure","uure","ute","nuor","uten","unte","yot","uute","ytto"]},"93":{"input":[1,3,4,5,7],"tlw":["tyota",814],"trw":["yota",359],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["suuren",1116],"trw":["joten",283],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["suurta",798],"trw":["uudestaan",554],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["ll",180531],"trw":["oli",55295],"lp":[],"rp":["ll","ol","li","oi","oli","il","ill","lo","oll","lli","loi","llo","lloi","illo","lii","io","olli","ilo","oil","oill"]},"97":{"input":[1,6,7],"tlp":["al",103204],"trp":["la",161361],"tlw":["alla",1156],"trw":["olla",4699],"lp":["al","all","alla","ala","aal","aall","ali","alli","alo","ail","alai"],"rp":["la","lla","illa","lai","olla","laa","ila","llai","llaa"]},"98":{"input":[2,6,7],"tlp":["sil",23278],"trp":["ko",79476],"tlw":["soi",379],"trw":["olisi",9034],"lp":["sil","sill"],"rp":["ko","ok","lis","ois","lk","lisi","olis","koi","oik","llis","osk","oko","kok","kos","koko","iko","oisi","lko"]},"99":{"input":[1,2,6,7],"tlp":["alk",11320],"trp":["oka",22378],"tlw":["silla",7800],"trw":["koska",1773],"lp":["alk","sal","alko","alka","alas","aiko","ako","sala","sall"],"rp":["oka","lais","las","kal","lka","oska","kall","lak","oika","lkaa","laki"]},"100":{"input":[3,6,7],"tlp":["el",107523],"trp":["le",115183],"tlw":["eli",822],"trw":["ole",10027],"lp":["el","ell","elle","eli","ele","eil","eill","elli"],"rp":["le","lle","ole","iel","lee","ille","llee","iell","olle","iele","lei","lel"]},"101":{"input":[1,3,6,7],"tlp":["ella",24479],"trp":["iela",9775],"tlw":["elaa",782],"trw":["lea",62],"lp":["ella","ela","alle","ale","eal","elaa","eall","elia","aile","elai","alee","alel","a-al","aale","alea","elal"],"rp":["iela","lea","-al","lae"]},"102":{"input":[2,3,6,7],"tlp":["sel",13503],"trp":["oise",7642],"tlw":["eiko",1404],"trw":["kello",600],"lp":["sel","sell","siel","del","dell","elk","eiso","seli","skel"],"rp":["oise","lke","oike","lise","les","kel","lkee","kell","okse","isel","oid"]},"103":{"input":[1,2,3,6,7],"tlw":["siella",4520],"trw":["keskella",829],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["vo",29749],"trp":["lt",22549],"tlw":["voi",5384],"trw":["otti",1283],"lp":["vo","toi","voi","til","toiv","gi","voit"],"rp":["lt","oit","ov","liv","oliv","oitt","oiv","lit","lv","ilt","otti","oti","ito"]},"105":{"input":[1,4,6,7],"tlp":["val",18640],"trp":["lta",17662],"tlw":["taalla",3001],"trw":["olivat",8509],"lp":["val","tal","alt","vall","alta","vali","taal","talo","aval","tila","tall","valt"],"rp":["lta","liva","ova","ovat","oita","oiva","ilta","lat"]},"106":{"input":[2,4,6,7],"tlp":["tois",11857],"trp":["otk",7732],"tlw":["voisi",1258],"trw":["kiitos",454],"lp":["tois","tko","svo","vois","tosi","tok","soit","vos","tsoi","tkoi","svoi","stoi"],"rp":["otk","oist","list","kot","kov","isto","koti","osti"]},"107":{"input":[1,2,4,6,7],"tlw":["saattoi",861],"trw":["katsoi",951],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["tel",10931],"trp":["lev",8000],"tlw":["teille",1239],"trw":["olet",1963],"lp":["tel","viel","elt","vel","teli","tell","ttel","ril","rill","evo","elv"],"rp":["lev","let","ori","olet","olev","ielt","lett","ove","leet"]},"109":{"input":[1,3,4,6,7],"tlw":["viela",8600],"trw":["oleva",577],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["toiset",990],"trw":["kertoi",658],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["sielta",1053],"trw":["katseli",846],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["ui",66193],"trw":["olin",2657],"lp":[],"rp":["ui","ul","lu","uin","inu","oin","hu","oh","ull","llu","uh","uol","noi","uul","lin","ollu","loin","uli","huo","luo"]},"113":{"input":[1,5,6,7],"tlp":["anoi",9266],"trp":["lah",8966],"tlw":["ainoa",772],"trw":["liian",1614],"lp":["anoi","aino","auh","alan","aul","auni","alu"],"rp":["lah","ulla","lan","inua","laan","hal","inoa","lain","lau","uha","nal","hall","ula"]},"114":{"input":[2,5,6,7],"tlp":["sinu",6349],"trp":["ku",115005],"tlw":["silloin",5497],"trw":["kuin",22585],"lp":["sinu"],"rp":["ku","kui","kuin","kun","uk","jok","kuu","onk","lj","joi","nku","kuul","koh","uks","jonk","usk","nkui","kul","usi"]},"115":{"input":[1,2,5,6,7],"tlw":["sanoi",7087],"trw":["joka",18978],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["elu",3144],"trp":["len",16714],"tlw":["eilen",316],"trw":["olen",5653],"lp":["elu","elen"],"rp":["len","yl","nel","ule","nell","leen","olen","uole","ulle","yll","hel","oine","line","ulee","llen","uule","yli","ly"]},"117":{"input":[1,3,5,6,7],"tlw":["aanella",765],"trw":["hanelle",4619],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["ennenkuin",1410],"trw":["oikein",2049],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["sellainen",739],"trw":["kylla",3839],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["tul",21501],"trp":["lut",16706],"tlw":["tuli",4747],"trw":["ollut",10662],"lp":["tul","tui","vu","tuli","vuo","voin","tull","toin"],"rp":["lut","llut","uv","oht","uit","inut","hto","ing","ult","htu","itu","utti"]},"121":{"input":[1,4,5,6,7],"tlw":["tulla",1527],"trw":["lahti",967],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["tunsi",1344],"trw":["istui",1253],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["ainoastaan",2528],"trw":["jotka",7436],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["tulee",3128],"trw":["nuori",1213],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["rouva",1878],"trw":["olevan",1792],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["suuri",2189],"trw":["kuitenkin",3603],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["tahdon",933],"trw":["kuitenkaan",984],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trp":["pp",8308],"trw":["p",1108],"lp":[],"rp":["pp"]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",22497],"trp":["pa",77545],"trw":["paa",544],"lp":["ap","apa","app","apaa","aap","appa","aapa"],"rp":["pa","paa","pap","ppa","papp","ppaa","paaa"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",2110],"trp":["ps",4292],"lp":["sp"],"rp":["ps"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["aps",4165],"trp":["paas",5700],"trw":["paassa",773],"lp":["aps","spa","saap","apas","asp","aspa","sap","saps","apsa"],"rp":["paas","pas","ppas","psa"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",2526],"trp":["pe",16376],"trw":["'",576],"lp":["ep","epp","e'","eep"],"rp":["pe","'e","pee","ppe"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["epa",1849],"trp":["pea",2103],"tlw":["aape",205],"lp":["epa","ape","aape","apea","eppa","appe","epaa"],"rp":["pea","'a","pape","pae","peaa","paae"]},"134":{"input":[2,3,8],"tlp":["s'",618],"trp":["pse",2270],"lp":["s'","sep","esp","sepp","d'","spe","ss'","s'e","es'"],"rp":["pse","pes","psee","ped","pede","pses","pees"]},"135":{"input":[1,2,3,8],"tlp":["apse",2143],"trp":["peas",737],"tlw":["sepa",189],"trw":["paase",202],"lp":["apse","espa","sepa","epas","d'a","d'as"],"rp":["peas","pesa","'as"]},"136":{"input":[4,8],"tlp":["tp",203],"trp":["pt",207],"lp":["tp"],"rp":["pt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["tap",6856],"trp":["paat",3775],"tlw":["tapa",257],"trw":["paata",312],"lp":["tap","tapa","tapp","apt","taap","tpa","apat"],"rp":["paat","pat"]},"138":{"input":[2,4,8],"lp":[],"rp":[]},"139":{"input":[1,2,4,8],"tlp":["stap",241],"trp":["past",383],"trw":["paasta",1393],"lp":["stap","spat"],"rp":["past"]},"140":{"input":[3,4,8],"tlp":["t'",2289],"trp":["per",3933],"tlw":["ett'",217],"lp":["t'","tt'","ett'","t'e","tt'e","rp","rpe","rpee","r'","rr'","rep","err'"],"rp":["per","pet","pett","pr","pte","ptee","pere","pre"]},"141":{"input":[1,3,4,8],"tlp":["arp",756],"trp":["par",8411],"trw":["paeta",156],"lp":["arp","tarp","arpe","aper","t'a","rap","rapa","apte","epat","arr'","rapp","fe'"],"rp":["par","pera","pare","para","paet","pate","part","peat"]},"142":{"input":[2,3,4,8],"tlp":["spr",153],"trp":["pset",690],"lp":["spr","spre","tsep","st'"],"rp":["pset"]},"143":{"input":[1,2,3,4,8],"tlw":["d'astarac",81],"trw":["perasta",769],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["mm",28094],"trw":["m",905],"lp":[],"rp":["mm","mp","np","nm","mpp"]},"145":{"input":[1,5,8],"tlp":["am",46002],"trp":["ma",123834],"trw":["nama",1502],"lp":["am","ama","amaa","aman","aam","amm","aama","amp"],"rp":["ma","maa","man","maan","mma","pan","mpa","mman","npa","paan","nam","nama"]},"146":{"input":[2,5,8],"tlp":["sm",505],"lp":["sm"],"rp":[]},"147":{"input":[1,2,5,8],"tlp":["sam",8343],"trp":["mas",10187],"tlw":["samassa",1358],"trw":["paansa",590],"lp":["sam","sama","amas","span","saam","samm","ssam","sma","sanm","asm"],"rp":["mas","mass","mans","maas","mmas","panj","maj","pans","mpas","jam"]},"148":{"input":[3,5,8],"tlp":["em",30930],"trp":["me",55008],"tlw":["emme",1059],"trw":["me",4210],"lp":["em","emm","emp","emme","enem"],"rp":["me","men","my","mme","ym","py","nem","mene","menn","ymm","nemm","ymp","ymy","pyy","mee"]},"149":{"input":[1,3,5,8],"tlp":["ema",9490],"trp":["ympa",2574],"tlw":["enemman",2199],"trw":["menna",1245],"lp":["ema","emma","emaa","ame","amme","eman","empa","amen","enpa","eam","eamm","eamp"],"rp":["ympa","ymma","mea","pane","yma","nema","ymaa","mpea"]},"150":{"input":[2,3,5,8],"tlp":["sem",3594],"trp":["mes",2527],"tlw":["esm",37],"trw":["pysyy",153],"lp":["sem","semm","sym","symy","spen","dem","demm"],"rp":["mes","pys","ysym","psen","pysy","mess","mens","pyys","mys","ymys","pyyd","meyd","pend"]},"151":{"input":[1,2,3,5,8],"tlw":["sydamensa",387],"trw":["pyydan",244],"lp":[],"rp":[]},"152":{"input":[4,5,8],"trp":["mb",336],"lp":[],"rp":["mb","mmb"]},"153":{"input":[1,4,5,8],"tlp":["tam",18925],"trp":["mat",13373],"tlw":["tama",6514],"trw":["maata",654],"lp":["tam","tama","amat","ttam","tamm","ammb","atam","taam","tamp","amb"],"rp":["mat","matt","mmat","maat","mant","pant","mata","ntam","ntap"],"special":"numsym"},"154":{"input":[2,4,5,8],"lp":[],"rp":[]},"155":{"input":[1,2,4,5,8],"tlw":["samat",179],"trw":["maasta",321],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["rm",5379],"trp":["mer",3161],"tlw":["ett'en",165],"trw":["mr",635],"lp":["rm","rem","tem","remp","remm","temm","rme","ttem","temp"],"rp":["mer","met","mr","pent","ment","mere","pyyt","ntem","pyr","myr","metr"]},"157":{"input":[1,3,4,5,8],"tlw":["emanta",515],"trw":["ymmarra",345],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"trw":["mrs",279],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["armas",161],"trw":["paassyt",507],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"|","trp":["pi",36935],"lp":[],"rp":["pi","ip","ppi","pii","iip","ipp","ipi","iipp","iipi","piip","ipii","ppii"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["api",2247],"trp":["pai",17547],"trw":["pappi",810],"lp":["api","appi","apai","aip","aipa","aapi","aipp"],"rp":["pai","pia","ipa","papi","ppia","ipaa","ippa","piaa"]},"162":{"input":[2,6,8],"tlp":["sip",134],"trp":["pik",1832],"lp":["sip","siip"],"rp":["pik","psi","pis","pikk","isp","piis","iisp","pisi","piki","kip","ksip","kkip","kipi","piik","psis","piks","isip","kiip"]},"163":{"input":[1,2,6,8],"tlp":["apsi",1759],"trp":["paik",2876],"tlw":["saapi",132],"trw":["paasi",542],"lp":["apsi","spai","apis","sipa"],"rp":["paik","pak","kap","pasi","ispa","kapa","pais","kapp","paak","pakk","psia","paks","kaip","kkap","ipas","pias"]},"164":{"input":[3,6,8],"tlp":["eip",817],"trp":["pie",5244],"lp":["eip","epi","eppi","eipp","e'i","eepi"],"rp":["pie","'ei","pei","ipe","'i","iep","ppie","iepp","iepi","iipe","ipie"]},"165":{"input":[1,3,6,8],"tlp":["epai",1133],"trp":["'ai",235],"tlw":["eipa",378],"lp":["epai","eipa","epia","apei"],"rp":["'ai","ipea"]},"166":{"input":[2,3,6,8],"tlp":["siep",69],"trp":["pid",1813],"trw":["kiipesi",44],"lp":["siep"],"rp":["pid","pesi","pide","k'","peek","kk'","ikk'","pek","pike","pekk","kipe","pidi","is'","ksep","k'e","kk'e","k'ei","ipid","iss'"]},"167":{"input":[1,2,3,6,8],"tlw":["sieppasi",69],"trw":["pida",405],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["viip",485],"trp":["pit",11493],"trw":["piti",1713],"lp":["viip"],"rp":["pit","piti","piv","ipit","ppiv","pitt","ipiv"]},"169":{"input":[1,4,6,8],"tlp":["vap",1883],"trp":["paiv",6732],"tlw":["vapaa",269],"trw":["pitaa",1916],"lp":["vap","vapa","vaip","vapi","apit","taip","tapi"],"rp":["paiv","pita","pait","itap","piva","paav"]},"170":{"input":[2,4,6,8],"trp":["pitk",4224],"trw":["pisti",361],"lp":[],"rp":["pitk","pist"]},"171":{"input":[1,2,4,6,8],"tlw":["sitapaitsi",428],"trw":["pitaisi",756],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["t'ei",979],"trp":["peri",1054],"tlw":["ett'ei",867],"trw":["peitti",175],"lp":["t'ei","riip","reip","repi","viep","t'i","rip"],"rp":["peri","peit","piet","pite","piir","pir","it'","pier","pri","pirt","'eiv","iit'","irip"]},"173":{"input":[1,3,4,6,8],"tlw":["ett'eivat",74],"trw":["pari",989],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["sit'",100],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["tarpeeksi",310],"trw":["parka",244],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["mi",120870],"trw":["mihin",694],"lp":[],"rp":["mi","min","im","hm","ihm","mmi","hmi","ihmi","mmin","imm","imi","nim","iim","mpi","mii","nimi","miin","pin","pim","hmin"]},"177":{"input":[1,5,6,8],"tlp":["aim",2568],"trp":["mina",17633],"trw":["mina",16504],"lp":["aim","ami","apah","amia"],"rp":["mina","mai","ima","pain","pah","mia","main","mah","maai","imma","pian","paha","ham","imaa","maah","imai"]},"178":{"input":[2,5,6,8],"tlp":["sim",3768],"trp":["mis",12062],"trw":["miksi",1344],"lp":["sim","simm","smi"],"rp":["mis","mik","hmis","miss","mink","nsim","misi","miks","imis","kim","isim","jim","mpik","ism","mk","kimp","ismi"]},"179":{"input":[1,2,5,6,8],"trw":["mika",3480],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["emmi",3536],"trp":["mie",19226],"tlw":["ennemmin",163],"trw":["meni",1459],"lp":["emmi","empi","emi"],"rp":["mie","mei","ime","mieh","pien","iime","meni","hem","imei","imme","hemm","nime","hym","mein","hymy","hme","mine"]},"181":{"input":[1,3,5,6,8],"trw":["miehia",566],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["esim",379],"trw":["mies",3388],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["ensimainen",403],"trw":["meidan",2780],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["viim",3133],"trp":["mit",21696],"trw":["nimitti",52],"lp":["viim","tim","ttim","vim","vimm","timm","tinp"],"rp":["mit","mitt","imit","mint","htim","miit","mmit","npit","pint","miv","imiv"]},"185":{"input":[1,4,5,6,8],"trw":["mita",10059],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"trw":["pitkin",1130],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"trw":["mista",982],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["viimein",718],"trw":["miten",2370],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["eteenpain",770],"trw":["meita",1361],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["sittemmin",355],"trw":["ihmiset",1045],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["varmaankin",428],"trw":["miesta",877],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["po",17061],"lp":[],"rp":["po","op","opp","ppo","oop","oopp","poo"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["apo",392],"trp":["opa",760],"lp":["apo","appo","aapo"],"rp":["opa","poa","ppoa","oopa","opaa"]},"194":{"input":[2,7,8],"tlp":["sop",886],"trp":["pos",648],"lp":["sop"],"rp":["pos","osp"]},"195":{"input":[1,2,7,8],"trp":["ospa",434],"lp":[],"rp":["ospa"]},"196":{"input":[3,7,8],"tlp":["epo",141],"trp":["ope",2399],"lp":["epo","epoo"],"rp":["ope","'o","oppe"]},"197":{"input":[1,3,7,8],"tlp":["epoa",105],"trp":["opea",620],"lp":["epoa"],"rp":["opea"]},"198":{"input":[2,3,7,8],"tlp":["s'o",328],"trp":["osep",102],"lp":["s'o"],"rp":["osep"]},"199":{"input":[1,2,3,7,8],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["gtp",153],"trp":["pot",295],"lp":["gtp","tpo","gtpo","top"],"rp":["pot","pott"]},"201":{"input":[1,4,7,8],"tlp":["apot",165],"trp":["pato",255],"lp":["apot","tapo","topa"],"rp":["pato","pota","otap"]},"202":{"input":[2,4,7,8],"trp":["post",449],"lp":[],"rp":["post"]},"203":{"input":[1,2,4,7,8],"trw":["paatos",82],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["tpor",153],"trp":["opet",1620],"trw":["peto",55],"lp":["tpor","tope","roop"],"rp":["opet","por","port","pro","poro","peto"]},"205":{"input":[1,3,4,7,8],"trw":["opettaa",197],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"trw":["petosta",39],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["mu",58870],"trw":["muu",588],"lp":[],"rp":["mu","pu","om","mo","muu","um","uom","puo","up","mon","pun","puu","upu","upun","opu","umm","ppu","nom","uum","mmo"]},"209":{"input":[1,5,7,8],"tlp":["aup",2791],"trp":["oma",16400],"tlw":["apua",470],"trw":["oman",1021],"lp":["aup","apu","aupu","amo","amu","apau","aamu","aapu","anom"],"rp":["oma","uma","uoma","omaa","oman","pau","noma","upa","umaa","umma","panu"]},"210":{"input":[2,5,7,8],"tlp":["suom",4018],"trp":["jum",4241],"tlw":["suom",417],"lp":["suom","som","sum"],"rp":["jum","mus","poj","jop","mons","muus","pus","moj","opus","moos","josp","puss","omus","mos","npoj","psu","psuu"]},"211":{"input":[1,2,5,7,8],"tlw":["sanomaan",203],"trw":["pojan",607],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["emmo",1235],"trp":["myo",6382],"tlw":["emo",86],"trw":["monen",273],"lp":["emmo","emu"],"rp":["myo","ome","uome","omen","poy","mone","upe","nope","pue","myon","ume","uem","yom","meno","pyo","omme","uemm","pune"]},"213":{"input":[1,3,5,7,8],"trw":["myonnan",82],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["suomen",1322],"trw":["myos",1706],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["suomessa",236],"trw":["poydan",440],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["tom",3714],"trp":["mut",29213],"tlw":["tom",275],"trw":["muut",992],"lp":["tom","ttom","tum","tuom","tomu","bom","gbom","tup","ttum"],"rp":["mut","mutt","muut","pung","mont","puut","muot","put","mbo","mmbo","puto"]},"217":{"input":[1,4,5,7,8],"trw":["mutta",28564],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"trw":["muutos",112],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["tuomas",244],"trw":["pojat",604],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["bergbom",465],"trw":["muuten",1081],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["tuntemaan",300],"trw":["poytaan",161],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["sprengtport",116],"trw":["prudence",171],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["etupaassa",239],"trw":["opettaja",379],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["poi",8488],"trw":["oppi",180],"lp":[],"rp":["poi","lop","lp","oppi","opi","pil","pol","lpo","lopp","ppil","lip","iop","liop","ilp","lpp","lppo","ippo","ppol","poli","pio"]},"225":{"input":[1,6,7,8],"tlp":["alp",476],"trp":["pal",8702],"trw":["lapi",904],"lp":["alp","alap"],"rp":["pal","lap","pala","paal","lapi","pail","pila","ppal","lapa","lipa","lpa","palo","lpaa","llap","lapp","iopa","opai","ilpa"]},"226":{"input":[2,6,7,8],"tlp":["sopi",829],"trp":["poik",4206],"tlw":["sopii",210],"trw":["pois",3248],"lp":["sopi"],"rp":["poik","pois","lpos","kop","lkop","opis","polk","posk","losp","psil","pilk","oisp","kilp","pios"]},"227":{"input":[1,2,6,7,8],"trw":["poika",1648],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["elp",1235],"trp":["pel",3429],"tlw":["ell'ei",70],"trw":["piilee",68],"lp":["elp","elpo","elpp","elip","ell'"],"rp":["pel","lpe","l'","lep","ll'","pelo","peli","leip","ppel","lope","peel","pell","'ol","'oli","ill'"]},"229":{"input":[1,3,6,7,8],"tlw":["epailla",102],"trw":["paalle",747],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["s'oli",178],"trw":["pelko",234],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["sill'aikaa",122],"trw":["pelkaa",283],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["voip",114],"trp":["pilv",391],"tlw":["voipi",114],"trw":["ippolit",287],"lp":["voip","vilp","tiop"],"rp":["pilv","opiv","polv","polt","lpit","lpot","pito"]},"233":{"input":[1,4,6,7,8],"tlw":["apotti",165],"trw":["palata",236],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"trw":["potki",36],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["sopiva",101],"trw":["palasivat",135],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"tlw":["viel'",99],"trw":["perille",288],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"tlw":["vielapa",360],"trw":["portaita",183],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["tok'",38],"trw":["posket",92],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["tarpeellista",75],"trw":["lapset",690],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["lm",22428],"trw":["minun",5382],"lp":[],"rp":["lm","minu","ilm","puh","puol","mui","oim","mil","puhu","huom","lmi","omi","mill","moi","olm","ilmi","imo","pui","mol","moin"],"special":"enter"},"241":{"input":[1,5,6,7,8],"tlw":["aamulla",431],"trw":["minua",4742],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["silmin",342],"trw":["pikku",1155],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["samalla",1927],"trw":["paljon",3194],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"trw":["minulle",3318],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["elaman",1008],"trw":["meilla",1051],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["semmoinen",325],"trw":["myoskin",2227],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["suomalaisen",431],"trw":["kallem",1117],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"tlw":["toimi",174],"trw":["minut",1928],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["tapahtunut",602],"trw":["muutamia",1006],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["sopinut",80],"trw":["muutkin",289],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["silmat",1184],"trw":["minusta",1102],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["toimeen",479],"trw":["miltei",281],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["epailematta",384],"trw":["molemmat",921],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["rupesi",652],"trw":["helposti",449],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["tapauksessa",366],"trw":["puolesta",598],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/fr-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/fr-keymap.json
new file mode 100644
index 00000000000..9613ba92b6c
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/fr-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlw":["a",186860],"lp":[],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",130131],"tlw":["s",189],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["as",154012],"tlw":["sa",35710],"lp":["as","sa","ass","ssa","assa","wa","asa","sas","ssas","sass","aw","was","sw"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",43082],"tlw":["e",648],"lp":["ee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ea",45510],"tlw":["x",164],"lp":["ea","ex","xe","xa","exa","exe","ae","ax","xee"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["es",647732],"tlw":["de",329573],"lp":["es","de","se","des","sse","ses","ess","ed","esse","ds","ese","ees","dess","see","dee","ede","sses","eds","ssee","dese"],"rp":[]},"7":{"input":[1,2,3],"tlp":["da",113149],"tlw":["sexe",325],"lp":["da","asse","ad","essa","ade","ada","sea","dea","eda","ase","we","deda","das","sex","ew","ades","esa","ssea","adea","dex"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",56643],"tlw":["t",179],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["ta",168893],"tlw":["ta",2612],"lp":["ta","fa","at","ff","att","af","tat","tta","aff","ffa","affa","ata","atta","fat","tf","ttf","ft","fata","tata"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["st",141218],"tlw":["c",294],"lp":["st","ts","ct","sc","cc","cs","tc","cts","sts"],"rp":[]},"11":{"input":[1,2,4],"tlp":["ca",78160],"tlw":["ca",22002],"lp":["ca","ac","sta","fac","act","acc","cas","sac","tac","cat","tas","sat","ats","ast","aca","sca","cac","cca","fs","sf"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["re",583533],"tlw":["et",174550],"lp":["re","et","er","te","tr","tre","rt","ere","rr","ete","ter","tte","etr","ett","rte","ret","etre","ette","err","rre"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ar",199557],"tlw":["frere",1316],"lp":["ar","ra","eta","fe","tra","art","fr","arr","era","ef","rta","fer","are","atte","ara","ate","rra","fra","ref","rea"],"rp":[]},"14":{"input":[2,3,4],"tlp":["ce",214983],"tlw":["ce",47447],"lp":["ce","ec","est","res","rs","rd","dr","ser","rc","tes","cr","ers","dre","ste","ces","tres","cet","der","cett","rec"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["ard",29774],"tlw":["tard",3213],"lp":["ard","ace","arc","car","ras","sera","arde","rac","rda","arda","dra","arce","cra","tard","face","esta","rsa","xc","exc","acte"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",57349],"trw":["n",242],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",332256],"trp":["na",60823],"tlw":["anna",1043],"trw":["na",258],"lp":["an","ann","aq","anq","anna","ana","anan"],"rp":["na","nna","nan","nq","nnan","nann","nana"]},"18":{"input":[2,5],"base":"j","baseshift":"J","tlp":["sn",130],"trp":["ns",191473],"trw":["j",225],"lp":["sn"],"rp":["ns","nj"]},"19":{"input":[1,2,5],"tlp":["ans",94605],"trp":["ja",25027],"tlw":["sans",15580],"trw":["jan",70],"lp":["ans","san","sq","sans","ssan","aj","asq","ansa","wn","wan"],"rp":["ja","nsa","jan","nsan","nas","jas","nja","nw","nwa"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",547626],"trp":["ne",292024],"tlw":["en",90753],"trw":["ne",63131],"lp":["en","ene","enn","enne","ey","enny","eye"],"rp":["ne","nne","ye","nee","ny","nnee","nny","nen","yen","nnen","yn","yne","ney"]},"21":{"input":[1,3,5],"tlp":["ena",18722],"trp":["ya",10697],"tlw":["annee",430],"trw":["nanny",98],"lp":["ena","ay","enan","anne","ane","eq","ean","aye","aya","ayan","any","xan","anny","enq","exan"],"rp":["ya","yan","nea","nnea","nean"]},"22":{"input":[2,3,5],"tlp":["end",46705],"trp":["nd",127339],"tlw":["sens",2477],"trw":["je",94389],"lp":["end","ens","sen","ense","ej","den","dej","esen","sens","ends","ende"],"rp":["nd","je","nde","nse","nes","nds","ys","nees","ndes"]},"23":{"input":[1,2,3,5],"tlp":["dan",83378],"trp":["nda",18852],"tlw":["dans",69810],"trw":["jean",744],"lp":["dan","dans","and","ande","enda","anda","eja","deja","esq","say","ssay","ensa","ands","ays","saye","saya"],"rp":["nda","ndan","jea","jean"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["bb",863],"trp":["nt",395069],"tlw":["b",429],"lp":["bb","bt","tn"],"rp":["nt","nb"]},"25":{"input":[1,4,5],"tlp":["ant",99116],"trp":["nf",14856],"tlw":["tant",2815],"lp":["ant","ab","ba","tan","tant","tab","fan","bat","fant","ban","anta","batt","aba","bab"],"rp":["nf","nta","nant","nfa","nfan","nat"]},"26":{"input":[2,4,5],"tlp":["bs",4870],"trp":["nc",84806],"lp":["bs","bj","bsc","bst","sb"],"rp":["nc","nts","nst","nsc","ncs","nct"]},"27":{"input":[1,2,4,5],"tlp":["anc",29956],"trp":["nca",8089],"tlw":["bas",1760],"lp":["anc","sant","stan","bas","ants","can","anca","tanc","sanc","abs","sab","cab","bass","ancs","cq","acq"],"rp":["nca","nsta","jac","ntac"]},"28":{"input":[3,4,5],"tlp":["ent",205997],"trp":["nte",52433],"tlw":["entre",6016],"lp":["ent","ten","ren","be","br","rn","ente","entr","bre","rent","ern","rne","tent","tten"],"rp":["nte","ntr","ntre","ner","nten","nter"]},"29":{"input":[1,3,4,5],"tlp":["ran",32995],"trp":["ntra",4859],"tlw":["enfant",1479],"lp":["ran","rq","enf","tena","ante","bra","rna","bea","enta","rant","tran","enfa","rtan","fran","arq","bar","arb","fen","rena"],"rp":["ntra"]},"30":{"input":[2,3,4,5],"tlp":["enc",33290],"trp":["nce",37449],"tlw":["cent",1511],"trw":["jeter",658],"lp":["enc","endr","tend","ence","rend","sent","cen","ents","cent","bes","dern","dent","scen","renc","deb"],"rp":["nce","ndr","ndre","jet","ncer"]},"31":{"input":[1,2,3,4,5],"tlw":["bras",4531],"trw":["jeta",1297],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",352],"trw":["ii",352],"lp":[],"rp":["ii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["ai",540051],"trp":["ia",19364],"tlw":["ai",3119],"lp":["ai","za","zi","zai","az","zz","azi","zzi","aza","zza","ziz","aziz","ziza"],"rp":["ia","iz","iza","iai","izai","izz","izzi"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["si",117702],"trp":["is",301576],"tlw":["si",24030],"trw":["k",204],"lp":["si","ssi","sis","ssis","sk","ski","sisk"],"rp":["is","iss","isi","ki","ik","issi","ks","isk","kk","isis","kis","iski","kiss"]},"35":{"input":[1,2,6],"tlp":["ais",132120],"trp":["isa",17988],"tlw":["sais",5940],"lp":["ais","sai","aiss","sais","ssai","assi","aisa","aisi","asi","wi","ak","sia","sias"],"rp":["isa","issa","isai","ka","ias","kw","iais"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",36481],"trp":["ie",241794],"lp":["ei"],"rp":["ie","iei","iee"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["ez",35534],"trp":["ix",16144],"tlw":["aie",130],"lp":["ez","aie","xi","ze","exi","xie","eai","aix","axi","zie","eiz","eize","eze","eez","xai"],"rp":["ix","iez","ixe","ixa","ize"]},"38":{"input":[2,3,6],"tlp":["di",97853],"trp":["id",28086],"tlw":["dis",1668],"trw":["idee",1596],"lp":["di","dis","sie","die","essi","esi","sei","edi","ssie"],"rp":["id","ide","ise","isse","ke","ied","ies","idee","idi","ieds","ises"]},"39":{"input":[1,2,3,6],"tlp":["dai",9749],"trp":["ida",1007],"tlw":["assez",2893],"lp":["dai","sez","aise","ssez","aid","dix","saie","dia","aide","disa","adi","xis","exis","six","dez","edia","adie","daie"],"rp":["ida","idea"]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",116014],"trp":["it",399129],"tlw":["vit",2136],"lp":["ti","vi","tit","vit","viv","tiv","tti","ttit","vivi","tivi","titi"],"rp":["it","iv","iti","ivi","itt","ivit","itiv","itti"]},"41":{"input":[1,4,6],"tlp":["ait",223936],"trp":["if",12313],"tlw":["avait",34178],"trw":["if",198],"lp":["ait","av","va","tai","vai","ava","avai","tait","vait","fai","fi","ati","fait","fit","ffi","avi"],"rp":["if","ita","iva","iff"]},"42":{"input":[2,4,6],"tlp":["ci",50221],"trp":["ic",35688],"tlw":["vis",479],"trw":["ici",5070],"lp":["ci","vis","sit","sti","cti","ck","visi","vic","cit","ssit","tis","tic","sci","cis"],"rp":["ic","ist","ici","its","isit","ict"]},"43":{"input":[1,2,4,6],"tlp":["sait",14527],"trp":["ica",3062],"tlw":["vais",3612],"lp":["sait","vais","sav","fais","visa","tais","fic","cai","sava","ffic","aci","sati","vas","fici","cia","acti","stai","ack"],"rp":["ica","ista"]},"44":{"input":[3,4,6],"tlp":["ve",170346],"trp":["ir",150486],"tlw":["vie",6638],"lp":["ve","ri","ev","ver","rie","vr","vie","rit","eve","rri","eti","rti","eri","tie"],"rp":["ir","ire","ier","ite","iere","ive"]},"45":{"input":[1,3,4,6],"tlp":["etai",66155],"tlw":["etait",29101],"lp":["etai","rai","ave","air","aire","rait","eva","fair","rav","taie","vra","arri","arti","vrai","ari","vaie","erai","vez","trai","trav"],"rp":[]},"46":{"input":[2,3,4,6],"tlp":["dit",34652],"trp":["ice",6888],"tlw":["dit",17108],"lp":["dit","vec","ris","dev","vers","dir","cie","dire","cri","eci","serv","esti","sir","rci","vid","rise"],"rp":["ice","iste","ites","iers"]},"47":{"input":[1,2,3,4,6],"tlw":["avec",32748],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["in",206097],"trw":["ni",4413],"lp":[],"rp":["in","ni","hi","ini","nni","hin","inn","hn","nh","inni","nin","hni","inin","ih","hnn"]},"49":{"input":[1,5,6],"tlp":["ain",53875],"trp":["ha",60789],"tlw":["ah",2082],"trw":["hanna",151],"lp":["ain","ani","ah","aha","zain"],"rp":["ha","nai","iq","han","nnai","ina","hai","ian","inq","haq","niq","hain","nz","inai","nia"]},"50":{"input":[2,5,6],"tlp":["sin",6536],"trp":["ins",29943],"tlw":["siskin",137],"lp":["sin","sh","ssin","sins","shi","sini"],"rp":["ins","nsi","his","insi","nis","ji","isin","kin","inis","nk","nsis","ish","ij","nnis"]},"51":{"input":[1,2,5,6],"tlp":["ains",11321],"trp":["nais",6028],"tlw":["ainsi",3447],"trw":["jai",619],"lp":["ains","siq","sha","shan","ash","sain","anis","win","asin"],"rp":["nais","isan","isq","has","nsai","kah","kaha","hais","hass","jai","hasa"]},"52":{"input":[3,5,6],"tlp":["ein",12287],"trp":["he",90853],"tlw":["eh",1812],"trw":["hein",876],"lp":["ein","eni","eine","eh"],"rp":["he","ien","ine","nie","ienn","hie","nnie","hee","hen","hien","inee","nei","hei","hein","hine","hy"]},"53":{"input":[1,3,5,6],"tlp":["aien",30150],"trp":["hez",5597],"tlw":["ayez",139],"trw":["nez",1504],"lp":["aien","aine","enai","anie","enez","ayai","enia","zy"],"rp":["hez","nez","yai","yez","naie","nze","inze","heq","hae","hany","ixan","iane"]},"54":{"input":[2,3,5,6],"tlp":["endi",4399],"trp":["ndi",15037],"tlw":["sein",422],"trw":["indiens",185],"lp":["endi","din","sine","ensi","sien","deh","dien"],"rp":["ndi","hes","ind","iens","ines","ndis","iden","indi","nsie","ky","nsei","hesi","nsid"]},"55":{"input":[1,2,3,5,6],"tlw":["whisky",263],"trw":["jadis",260],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["bi",37344],"trp":["int",28711],"tlw":["vin",885],"lp":["bi","tin","th","vin","vint","bit","bin","thi"],"rp":["int","nti","ib","nv","nvi","ntin","nit","ntit","niv","inv","init","invi"]},"57":{"input":[1,4,5,6],"tlp":["van",25237],"trp":["nait",11496],"tlw":["avant",8624],"trw":["navait",354],"lp":["van","vant","avan","fin","tain","aint","tiq","abi","bai","fini","atin","abit"],"rp":["nait","nfi","ntai","nfin","hab","habi","hant","ivan"]},"58":{"input":[2,4,5,6],"tlp":["ch",136528],"trp":["nch",8814],"tlw":["chic",138],"trw":["instinct",141],"lp":["ch","chi","cin","sib","ssib","stin","chin","tch"],"rp":["nch","inc","inst","nci","hist","ich","nic","nsci","isib","inci","nist","nsti"]},"59":{"input":[1,2,4,5,6],"tlw":["cinq",2262],"trw":["instant",2350],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["ven",26666],"trp":["ient",38518],"tlw":["bien",22012],"trw":["hier",848],"lp":["ven","bie","bien","enti","rien","enir","vent","vien","rin","env","rni","even","veni","erni"],"rp":["ient","her","inte","nir","nier","hev"]},"61":{"input":[1,3,4,5,6],"tlw":["etaient",7356],"trw":["navire",568],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["dernier",2102],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["devant",6605],"trw":["jardin",804],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",3036],"trw":["o",368],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","tlp":["ao",1455],"trp":["oa",938],"lp":["ao"],"rp":["oa"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",164552],"trp":["os",50157],"trw":["os",408],"lp":["so","sso"],"rp":["os","oss","oso"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["wo",820],"trp":["osa",3212],"lp":["wo","woo","asso","aso","aos","sao","wao","swo"],"rp":["osa","ow","owa","ossa","oas"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["e-",5380],"trp":["-e",12923],"trw":["-",5238],"lp":["e-","eo","ee-","e-o"],"rp":["-e","oe","-o"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["a-",8193],"trp":["-a",862],"lp":["a-","x-","xo","exo","ea-","axo","a-a"],"rp":["-a","-a-","ox","oxe"]},"70":{"input":[2,3,7],"tlp":["do",52067],"trp":["ose",20090],"tlw":["dos",2170],"trw":["ose",204],"lp":["do","s-","eso","dos","es-","deso","soe","d-","esso","doss"],"rp":["ose","od","-d","-de","ode","oses","osse","-des","-s","ood"]},"71":{"input":[1,2,3,7],"tlp":["a-d",1260],"trp":["owe",807],"trw":["owe",223],"lp":["a-d","da-","ado","as-","a-de","wood","sa-","x-s","x-se","dexo","s-a","s-a-","saxo"],"rp":["owe","-a-d","-w","-we","oad","odw","oodw"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["to",128509],"trp":["ot",47901],"tlw":["tot",1188],"lp":["to","go","gt","tot","tto","gg","tog","gto","goo","got"],"rp":["ot","ott","og","oto","otto","otog"]},"73":{"input":[1,4,7],"tlp":["ag",49385],"trp":["of",7071],"trw":["ota",208],"lp":["ag","fo","ga","tag","gag","ffo","gat","aga","ato","tota","ago","afo","agg","atto","gato"],"rp":["of","off","ota","ofo","otta"]},"74":{"input":[2,4,7],"tlp":["co",202727],"trp":["oc",21912],"tlw":["scott",175],"lp":["co","cot","sto","cco","gts","soc","gs","cos","cost","cto","sco","coo","tos","coc"],"rp":["oc","occ","ots","ost","oct","otos"]},"75":{"input":[1,2,4,7],"tlp":["sag",9331],"trp":["oca",927],"tlw":["costas",502],"lp":["sag","aco","acco","faco","ssag","gas","sfo","agas","cag","cof","coff","fos","foss","gac","gats","gatc"],"rp":["oca","occa","osta","ocat"]},"76":{"input":[3,4,7],"tlp":["ro",122176],"trp":["or",127784],"tlw":["gorge",1040],"trw":["or",770],"lp":["ro","ge","t-","tro","gr","eg","reg","rg","t-e","ger","rge","eto"],"rp":["or","ort","orte","ore","otr","otre","ote","-t"]},"77":{"input":[1,3,4,7],"tlp":["age",30406],"trp":["orta",6654],"tlw":["fort",2164],"trw":["offert",256],"lp":["age","gar","ega","gra","egar","for","rega","arg","arge","a-t","a-t-","fort","fro","gea","rof","rag","tage","aro","rage"],"rp":["orta"]},"78":{"input":[2,3,4,7],"tlp":["cor",18700],"trp":["ors",18331],"tlw":["cote",5418],"trw":["orc",491],"lp":["cor","eco","cro","sor","core","sort","st-","est-","roc","t-c","t-ce","ges","st-c","dro","rso","erso"],"rp":["ors","ord","-c","-ce"]},"79":{"input":[1,2,3,4,7],"tlw":["regard",4785],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["ou",485081],"trw":["un",105377],"lp":[],"rp":["ou","on","un","no","nou","onn","nu","non","uo","nnu","onnu","nno","nnon","ono","oon","onon","uu","uun","uon","unn"]},"81":{"input":[1,5,7],"tlp":["qu",374405],"trp":["ua",32749],"tlw":["au",38456],"trw":["noua",61],"lp":["qu","au","qua","quan","quo","aqu","anqu","anno"],"rp":["ua","uan","onna","nqu","oq","oqu","oua","nua","uq","uqu","nqua","ona"]},"82":{"input":[2,5,7],"tlp":["su",105459],"trp":["us",202802],"tlw":["son",49965],"trw":["nous",27592],"lp":["su","son","sou","sonn","sous","ssu"],"rp":["us","ous","jo","ons","jou","nous","uss","ju","jus","uj","ujo","ujou","ouj","oujo"]},"83":{"input":[1,2,5,7],"tlp":["squ",20943],"trp":["usq",8393],"tlw":["sonna",267],"trw":["joanna",329],"lp":["squ","aus","auss","sau","ajo","ajou","auj","aujo","assu","asqu","squa"],"rp":["usq","usqu","jusq","ussa","onsa","usa","jau","jaun","joua"]},"84":{"input":[3,5,7],"tlp":["eu",220654],"trp":["ue",233945],"tlw":["eu",4099],"trw":["une",73318],"lp":["eu","enu","eun","eune","eno"],"rp":["ue","une","onne","oy","yeu","oue","oeu","oye","nue","neu","one","ueu","u-","n-","uy"]},"85":{"input":[1,3,5,7],"tlp":["que",190819],"trp":["ux",83482],"tlw":["que",98515],"trw":["yeux",10617],"lp":["que","eux","eau","aux","aque","eaux","equ","au-","eque","quen","eux-"],"rp":["ux","yeux","oya","nque","oque","oux","uque","ux-","noux"]},"86":{"input":[2,3,5,7],"tlp":["du",78771],"trp":["ond",27438],"tlw":["du",57769],"trw":["jeune",4462],"lp":["du","don","deu","seu","dou","donn","eus","euse","endu","essu"],"rp":["ond","ues","ud","use","onde","ndu","jeu","jeun","-j","-je"]},"87":{"input":[1,2,3,5,7],"tlw":["deux",15643],"trw":["judas",547],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["tou",80480],"trp":["ut",149891],"tlw":["tout",29188],"trw":["ont",5688],"lp":["tou","tu","tout","bo","gn","gu","bou","bon","ton","bu"],"rp":["ut","out","ont","ng","ob","ong","ub","uto","ug","not"]},"89":{"input":[1,4,5,7],"tlp":["aut",41481],"trp":["uf",8214],"tlw":["fut",4720],"lp":["aut","ang","fu","fon","fau","agn","faut","fou","fut","auto","atu","quat","font"],"rp":["uf","uta","uff","uat","onta","ouf","ouff"]},"90":{"input":[2,4,5,7],"tlp":["con",57360],"trp":["uc",26771],"tlw":["sont",9987],"lp":["con","cou","cu","cont","sont","conn","tous","cons","touj","cun","bouc"],"rp":["uc","nco","onc","ouc","ust","just","ucu","ucun","uco"]},"91":{"input":[1,2,4,5,7],"tlw":["facon",2654],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["eur",78762],"trp":["ur",328352],"tlw":["toute",6285],"trw":["notre",4935],"lp":["eur","rou","ru","tour","eut","gen","trou","gne","eure","gue"],"rp":["ur","our","ure","ute","oute","utr","utre","nge","ontr","urn"]},"93":{"input":[1,3,4,5,7],"tlw":["autre",5877],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["sur",51346],"trw":["jour",4530],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["grand",4887],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["il",274962],"trw":["il",109781],"lp":[],"rp":["il","oi","ll","li","lo","io","ill","ol","loi","ili","oli","lli","oil","oll","llo","illi","olo","iol","ilo","lio"]},"97":{"input":[1,6,7],"tlp":["al",90167],"trp":["la",335135],"tlw":["alla",769],"trw":["la",216676],"lp":["al","all","alo","ail","aill","ali","alla","ala","allo","alai"],"rp":["la","lai","lla","llai","illa","ila","oila","ial","olla","ola"]},"98":{"input":[2,6,7],"tlp":["soi",15762],"trp":["ois",37730],"tlw":["sol",2016],"trw":["ils",17730],"lp":["soi","sio","sol","ssio","sil"],"rp":["ois","ls","ils","iso","lis","ossi","oisi","liss","osi","isio","los","isso","oiss","ok","ilis"]},"99":{"input":[1,2,6,7],"tlp":["aiso",9482],"trp":["lais",13196],"tlw":["siloa",232],"trw":["laissa",1173],"lp":["aiso","sal","sall","alis","salo","asio","ails","sali","sala","wil","wal","slow","will"],"rp":["lais","las","lass","lisa","low","osai","oisa"]},"100":{"input":[3,6,7],"tlp":["el",190433],"trp":["le",657856],"tlw":["elle",59054],"trw":["le",177879],"lp":["el","ell","elle","eil","ele","eill","elo","eli"],"rp":["le","lle","ille","lie","ile","ole","-i","-il","-el","-ell","i-","lei"]},"101":{"input":[1,3,6,7],"tlp":["ale",15620],"trp":["oix",8324],"tlw":["allez",1376],"trw":["lizzie",89],"lp":["ale","ela","alle","z-","ez-","alie","eal","eali","elai","ai-"],"rp":["oix","lez","-la","la-","laie","llez","lex","lea","iale","lez-"]},"102":{"input":[2,3,6,7],"tlp":["doi",7114],"trp":["les",154394],"tlw":["elles",3562],"trw":["les",123647],"lp":["doi","sel","sile","esoi","sole","del","dis-","els","dois","ssel","dol"],"rp":["les","lles","is-","oid","lise","oise","iles","ld","less"]},"103":{"input":[1,2,3,6,7],"tlw":["salle",2270],"trw":["laisse",2177],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["vo",127497],"trp":["ig",30369],"tlw":["toi",4595],"trw":["lit",2373],"lp":["vo","voi","tio","gi","toi","gl","vot","vil","vol","vill","voit"],"rp":["ig","oit","lit","oig","liv","lt","lig","itio","lot"]},"105":{"input":[1,4,6,7],"tlp":["avo",15975],"trp":["lait",13889],"tlw":["voila",2492],"trw":["livia",632],"lp":["avo","foi","atio","avoi","fil","fl","tal","fill","agi","val","vail","tail","fal","fall","fla","gal"],"rp":["lait","lat","lag","iga"]},"106":{"input":[2,4,6,7],"tlp":["cl",21798],"trp":["lic",7092],"tlw":["soit",3898],"trw":["kotko",169],"lp":["cl","col","ctio","sig","cil","stio","soit","stoi","vois","coi","coll","cli","glis","vos"],"rp":["lic","isto","olic","igts","osit","loc"]},"107":{"input":[1,2,4,6,7],"tlw":["fois",9209],"trw":["lac",564],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["roi",25378],"trp":["oir",45550],"tlw":["votre",6708],"trw":["livre",1128],"lp":["roi","voir","rl","t-i","t-il","tel","rle","troi","roit","votr"],"rp":["oir","ler","lor","lev","it-","oire","let","it-i","lier","ller"]},"109":{"input":[1,3,4,6,7],"tlw":["voix",6714],"trw":["leva",2445],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["trois",5530],"trw":["levres",1891],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["alors",9986],"trw":["laisser",1893],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["ui",198698],"trw":["lui",41038],"lp":[],"rp":["ui","lu","ul","ion","lui","ho","oin","lon","oul","uoi","uil","oui","hu","inu","noi","hon","uill","nui","lou","uni"]},"113":{"input":[1,5,6,7],"tlp":["qui",72449],"trp":["lan",19838],"tlw":["qui",60034],"trw":["hall",554],"lp":["qui","quoi","quil","aul"],"rp":["lan","iqu","lq","lqu","hau","ula","oula","ulai","liq","liqu","nal","uai","haqu","laq","laqu","niqu"]},"114":{"input":[2,5,6,7],"tlp":["sui",21452],"trp":["lus",40230],"tlw":["suis",11506],"trw":["john",694],"lp":["sui","suis","sion","soin"],"rp":["lus","uis","ussi","ison","hos","ions","oins","usi","onsi","uiss","uk","luk","lusi","lons","joi","nsui"]},"115":{"input":[1,2,5,6,7],"tlw":["aussi",11177],"trw":["ouais",603],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["eul",11197],"trp":["leu",32420],"tlw":["euh",642],"trw":["lieu",1585],"lp":["eul","eule","elu","elui","eui","euil"],"rp":["leu","uel","ieu","ule","len","heu","oule","uell","lieu","lleu","ilen","nel","lein","ly"]},"117":{"input":[1,3,5,6,7],"tlw":["quelque",6947],"trw":["laquelle",1557],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["seul",3625],"trw":["luke",3101],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["quelques",6336],"trw":["la-dedans",355],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["vou",60021],"trp":["uv",57671],"tlw":["vu",3991],"trw":["nuit",3923],"lp":["vou","bl","tion","vu","voul","von","gin"],"rp":["uv","ouv","uit","ign","long","itu","ibl","nouv","ing","oint","lut","uiv","ubl"]},"121":{"input":[1,4,5,6,7],"tlw":["voulait",2213],"trw":["haut",2023],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["vous",46221],"trw":["longs",581],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["avons",2442],"trw":["lanca",1051],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["trouve",3189],"trw":["leur",13514],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["veux",4192],"trw":["nouveau",4416],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["chose",7901],"trw":["leurs",6620],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["chaque",3120],"trw":["lorsque",2306],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trp":["pp",26335],"trw":["p",553],"lp":[],"rp":["pp"]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",48180],"trp":["pa",224861],"tlw":["ap",72],"trw":["papa",974],"lp":["ap","app","appa","apa"],"rp":["pa","ppa","pap","papa"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",20685],"trp":["ps",18522],"lp":["sp"],"rp":["ps"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["spa",4429],"trp":["pas",100009],"tlw":["saps",129],"trw":["pas",84383],"lp":["spa","asp","sap","aps","sapp","saps"],"rp":["pas","pass"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",48775],"trp":["pe",136807],"tlw":["epee",266],"trw":["'",318],"lp":["ep","epe","epee","e'"],"rp":["pe","'e","ppe","'ep","pee","ppee","pep","pepe","p'","'epe"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["epa",8854],"trp":["'a",123917],"trw":["pape",116],"lp":["epa","appe","xp","exp","ape","xpe","expe","apea"],"rp":["'a","'ap","'app","'ex","'ea","pea","'exp","'epa","'ape","'exa","'exe","pape"]},"134":{"input":[2,3,8],"tlp":["d'",72817],"trp":["'es",50133],"tlw":["epees",70],"trw":["pdd",99],"lp":["d'","s'","s'e","d'e","esp","dep","spe","s'es","espe","sep","sesp","depe","d'es","eps"],"rp":["'es","'esp","pes","'ess","ped","pese"]},"135":{"input":[1,2,3,8],"tlp":["d'a",18719],"trp":["'as",4949],"tlw":["depasse",270],"trw":["passe",4560],"lp":["d'a","s'a","s'ap","depa","epas","s'as","d'ap","d'ea","espa","s'ex","sepa","aspe","s'ad","d'ad","d'ex","xped"],"rp":["'as","'ass","'ad","pesa"]},"136":{"input":[4,8],"trp":["pt",10944],"trw":["pt",1183],"lp":[],"rp":["pt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["tap",1491],"trp":["pat",3801],"tlw":["tapa",68],"lp":["tap","apt","tapa"],"rp":["pat","patt","pta","pf"]},"138":{"input":[2,4,8],"trp":["pc",625],"lp":[],"rp":["pc"]},"139":{"input":[1,2,4,8],"tlp":["cap",4228],"trp":["pac",1260],"tlw":["cap",326],"lp":["cap","capa","spac","apac","apc","capt"],"rp":["pac","pats","past"]},"140":{"input":[3,4,8],"tlp":["rep",21795],"trp":["pr",118408],"tlw":["repete",469],"trw":["pere",4207],"lp":["rep","epr","rp","repr","ept","t'","epre","rpr","repe"],"rp":["pr","pre","per","'et","pet","pere","pte","ppr","'etr","pret","pete"]},"141":{"input":[1,3,4,8],"tlp":["apr",9449],"trp":["par",86969],"tlw":["frappe",557],"trw":["par",27661],"lp":["apr","apre","rap","rapp","appr","epar","repa","t'a","aper"],"rp":["par","'eta","part","'ar","pare","para","ppar","'arr","parf","'at","'att"]},"142":{"input":[2,3,4,8],"tlp":["c'",37695],"trp":["'est",44521],"tlw":["c'est",27418],"trw":["pres",4017],"lp":["c'","c'e","c'es","c'et","s'et","spec","cep","rps","d'et","resp","cept","spr"],"rp":["'est","pres","pers","pec","prec","perd","'ec","pect"]},"143":{"input":[1,2,3,4,8],"tlw":["apres",7671],"trw":["parce",4758],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["mm",78967],"trw":["m",2037],"lp":[],"rp":["mm","mp","nm","mn","pn","np"]},"145":{"input":[1,5,8],"tlp":["am",51798],"trp":["ma",187703],"trw":["ma",11423],"lp":["am","ama","amp","aman","amm","ampa","anm","anap"],"rp":["ma","man","mpa","mma","pan","mam","mama","manq","mman","paq","nap","pann"]},"146":{"input":[2,5,8],"tlp":["sm",1338],"trp":["mps",12697],"trw":["ms",179],"lp":["sm"],"rp":["mps","nsp","ms","nsm"]},"147":{"input":[1,2,5,8],"tlp":["sam",1341],"trp":["jam",12043],"tlw":["sam",363],"trw":["pans",80],"lp":["sam","amas","samm","ansp","asm","amps","ansm","span","sma"],"rp":["jam","jama","mas","mass","masq","maj","mpas","mw","njam","mans","nsma"]},"148":{"input":[3,5,8],"tlp":["em",168013],"trp":["me",306012],"tlw":["emmene",192],"trw":["me",28601],"lp":["em","eme","emen","emp","emm","emme"],"rp":["me","men","mme","n'","mem","pen","'en","meme","n'e","mmen","m'","'y","mpe","n'y"]},"149":{"input":[1,3,5,8],"tlp":["ema",18574],"trp":["n'a",19043],"tlw":["ame",424],"trw":["m'a",4088],"lp":["ema","eman","ame","amme","amen","xem","exem","xemp","ampe","xam","exam"],"rp":["n'a","m'a","pay","'an","'am","mena","paye","'ann","mane"]},"150":{"input":[2,3,5,8],"tlp":["dem",20176],"trp":["j'",30702],"tlw":["s'en",2720],"trw":["mes",6170],"lp":["dem","sem","emps","s'en","deme","d'en","seme","ssem","emes"],"rp":["j'","mes","pens","mmes","n'es","pend","j'e","med","j'en","mess","ndem"]},"151":{"input":[1,2,3,5,8],"tlw":["demande",3741],"trw":["pays",1471],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["tm",463],"trp":["mb",31529],"lp":["tm","bm","ttm"],"rp":["mb","mpt","mt"]},"153":{"input":[1,4,5,8],"tlp":["amb",5301],"trp":["mat",6196],"tlw":["amant",146],"trw":["mat",200],"lp":["amb","fam","apab","tam","tamm","atm","amat","bap","bapt"],"rp":["mat","pab","mba","mant","mbat","pant","mpat","mpta","matt","mab","mban"],"special":"numsym"},"154":{"input":[2,4,5,8],"tlp":["cm",1559],"trp":["mc",93],"tlw":["cm",1559],"lp":["cm"],"rp":["mc"]},"155":{"input":[1,2,4,5,8],"tlw":["camp",691],"trw":["passant",523],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["rm",29998],"trp":["ment",81650],"tlw":["type",1817],"trw":["mere",4432],"lp":["rm","tem","rem","rme","temp","teme","emb","erm","reme"],"rp":["ment","mer","pren","met","mbr","mbre","mpr","prem","n'et","mpre","mbe"]},"157":{"input":[1,3,4,5,8],"tlw":["femme",6271],"trw":["payer",631],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["temps",9524],"trw":["n'est",6536],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["femmes",2197],"trw":["pendant",4274],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"!","trp":["pi",30694],"lp":[],"rp":["pi","ip","ipp","ipi","pip","ppi"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["api",6237],"trp":["pai",4095],"trw":["pizza",69],"lp":["api","apai"],"rp":["pai","papi","ipa","pia","ppai","piz","pizz","ippa","piaz"]},"162":{"input":[2,6,8],"tlp":["spi",1730],"trp":["isp",3645],"trw":["pis",282],"lp":["spi"],"rp":["isp","pis"]},"163":{"input":[1,2,6,8],"tlp":["apis",563],"trp":["ispa",2356],"trw":["passai",91],"lp":["apis","spai"],"rp":["ispa","pais"]},"164":{"input":[3,6,8],"tlp":["epi",615],"trp":["'i",49129],"trw":["pipe",239],"lp":["epi"],"rp":["'i","pie","pei","ipe","ippe","pipe","ie'"]},"165":{"input":[1,3,6,8],"tlp":["apie",1594],"trp":["'ai",30601],"trw":["paix",638],"lp":["apie","epai"],"rp":["'ai","'exi","paix","'aie","paie"]},"166":{"input":[2,3,6,8],"tlp":["s'i",6660],"trp":["pied",4225],"tlw":["d'idees",66],"trw":["pieds",2197],"lp":["s'i","disp","d'i","espi","depi","d'id","epis","dip"],"rp":["pied","pid","pide","'id","'ide","ispe","ipes","pedi","'k","'ke","'kee","pidi"]},"167":{"input":[1,2,3,6,8],"tlw":["epais",338],"trw":["peake",83],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["tip",158],"trp":["pit",5509],"trw":["pitt",410],"lp":["tip"],"rp":["pit","pti","ipit","pitt","piti","ipt","ipti","piv"]},"169":{"input":[1,4,6,8],"tlp":["apit",2174],"trp":["pita",2057],"tlw":["tapait",66],"lp":["apit","tapi","vap","apti"],"rp":["pita","pati","pait","pav","ptai","pavi","ipat"]},"170":{"input":[2,4,6,8],"tlp":["cip",2146],"trp":["pist",956],"trw":["pic",121],"lp":["cip","cipi","scip"],"rp":["pist","icip","pic","pisc","pick","ptis"]},"171":{"input":[1,2,4,6,8],"tlw":["tapis",563],"trw":["passait",777],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["epri",3352],"trp":["pri",24618],"tlw":["reprit",1215],"trw":["petit",6366],"lp":["epri","rpri","epti","rip","epit"],"rp":["pri","peti","prit","pier","pir","peri","pire","prie","prev","ppri","pitr","priv","'ev","pite","'evi"]},"173":{"input":[1,3,4,6,8],"tlw":["t'ai",504],"trw":["partie",2466],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["esprit",982],"trw":["pris",3067],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["c'etait",9128],"trw":["paris",1112],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["mi",66310],"trw":["pin",80],"lp":[],"rp":["mi","im","min","imp","ph","imm","phi","nim","pin","imi","mpi","mmi","mini","hm","minn","imin","inim","pini","nip","mih"]},"177":{"input":[1,5,6,8],"tlp":["ami",10224],"trp":["mai",88086],"tlw":["ami",1414],"trw":["main",8212],"lp":["ami","amai","aim","amin","anim","aima"],"rp":["mai","main","ima","ham","hap","mani","iam","hamp","mina","nima","pain","hapi","happ","imai"]},"178":{"input":[2,5,6,8],"tlp":["sim",4174],"trp":["mis",9740],"trw":["mis",1921],"lp":["sim","simp","sph","smi","ssim","snip"],"rp":["mis","jim","miss","insp","mmis","mik","mins","nspi","ism","nism","jimm","pins","ijim","misi"]},"179":{"input":[1,2,5,6,8],"tlw":["amis",1180],"trw":["mais",42478],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["emi",15514],"trp":["mie",15315],"tlw":["ennemi",205],"trw":["peine",2455],"lp":["emi","emie","emin","eph"],"rp":["mie","ime","'h","imen","'in","hem","'im","mine","hemi","pein","'imp","iem","ieme","mei","imme","'he"]},"181":{"input":[1,3,5,6,8],"tlw":["aime",856],"trw":["n'ai",2898],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["demi",438],"trw":["mise",705],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["semaine",1154],"trw":["j'ai",15346],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tim",5445],"trp":["mit",5727],"tlw":["tim",73],"trw":["mit",2329],"lp":["tim","thm","timi","bim","timb"],"rp":["mit","ntim","mbi","imb","imit","mpit","ptib","mbin","miti","mith","itim","mv","mvi"]},"185":{"input":[1,4,5,6,8],"tlw":["faim",558],"trw":["matin",2422],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"tlw":["smith",155],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["champ",458],"trw":["massif",152],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["termine",610],"trw":["premiere",3206],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["vraiment",3840],"trw":["n'etait",4972],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["chemin",1720],"trw":["merci",1888],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["chambre",2756],"trw":["j'avais",3059],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["po",155941],"trw":["pop",58],"lp":[],"rp":["po","op","ppo","opo","opp","pop","oppo"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["appo",2216],"trp":["opa",340],"lp":["appo","apo"],"rp":["opa"]},"194":{"input":[2,7,8],"tlp":["spo",3643],"trp":["pos",17016],"lp":["spo","spos","sop"],"rp":["pos","poss","opos","ppos","osop","osp","pso"]},"195":{"input":[1,2,7,8],"trp":["posa",2884],"trw":["posa",1155],"lp":[],"rp":["posa","pow"]},"196":{"input":[3,7,8],"tlp":["epo",13316],"trp":["'o",22659],"lp":["epo"],"rp":["'o","'oe","ope","oppe","'epo","-p","poe","-pe","o'","'op","'ope","-po"]},"197":{"input":[1,3,7,8],"tlp":["xpo",114],"trp":["-pa",135],"lp":["xpo","expo"],"rp":["-pa","'a-"]},"198":{"input":[2,3,7,8],"tlp":["d'o",3873],"trp":["pose",6350],"tlw":["depose",222],"trw":["pose",1409],"lp":["d'o","espo","epos","d'oe","s'o","depo","d-p","d-pe","epso","dop","d'os"],"rp":["pose","'od","'ode","'os","-sep","osep","poes","ps-","'ose"]},"199":{"input":[1,2,3,7,8],"tlw":["deposa",185],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["top",1434],"trp":["pot",1385],"tlw":["top",89],"trw":["pot",240],"lp":["top"],"rp":["pot","pto","opt"]},"201":{"input":[1,4,7,8],"tlp":["apot",365],"trp":["pag",5377],"tlw":["tapota",134],"lp":["apot","tapo"],"rp":["pag","pota"]},"202":{"input":[2,4,7,8],"tlp":["cop",842],"trp":["poc",1602],"tlw":["stop",73],"trw":["pots",103],"lp":["cop","copt","stop"],"rp":["poc","post","pco","pots"]},"203":{"input":[1,2,4,7,8],"tlw":["capot",86],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["rop",11883],"trp":["pro",26938],"tlw":["trop",6088],"trw":["porte",7561],"lp":["rop","repo","trop","ropr","ropo","epro"],"rp":["pro","por","port","prop","orp","opr","'or","ppor","opre","ppro","prot","-top","'ore","prog"]},"205":{"input":[1,3,4,7,8],"tlw":["rapport",803],"trw":["page",1683],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["corps",3633],"trw":["propos",951],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"tlw":["d'accord",1426],"trw":["passage",1091],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["om",114832],"trw":["mon",15902],"lp":[],"rp":["om","mo","pou","omm","mon","pu","up","omp","oup","um","mu","pon","nom","mou","mpo","mom","upp","mun","uppo","mmu"]},"209":{"input":[1,5,7,8],"tlp":["amo",2232],"trp":["pau",6517],"trw":["mona",153],"lp":["amo","amou","aup","aum","appu","amu","aupa","anmo"],"rp":["pau","oma","mau","ompa","upa","uma","omma","poq","poqu","oman","oupa","paqu"]},"210":{"input":[2,5,7,8],"tlp":["som",5403],"trp":["pous",4373],"trw":["noms",472],"lp":["som","somm","sup","soup","supp","spon","susp"],"rp":["pous","mons","mus","pons","mpos","ups","oups","mos","oms","noms","usp","mous","jup"]},"211":{"input":[1,2,5,7,8],"trw":["poussa",827],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["epon",8146],"trp":["u'",72122],"tlw":["emu",95],"trw":["peu",10328],"lp":["epon","epu"],"rp":["u'","omme","'u","'un","peu","u'e","'une","'on","ome","u'u","u'un","ume","upe","-m","omen","u'o","u'on","mome"]},"213":{"input":[1,3,5,7,8],"tlw":["qu'on",6252],"trw":["peux",3366],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["d'un",18560],"trw":["monde",5892],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["d'eau",1024],"trw":["jusqu'a",4050],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["tom",8498],"trp":["omb",12802],"tlw":["tom",1064],"trw":["mot",1938],"lp":["tom","tomb","ttom","tup","tum","tmo"],"rp":["omb","mont","mot","ompt","nomb","put","pub","mbo","mob","pont","mmob","mout","omt","mpto"]},"217":{"input":[1,4,5,7,8],"tlw":["tomba",500],"trw":["monta",334],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["coup",5443],"trw":["mots",1844],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["combat",528],"trw":["poussant",233],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["tomber",1545],"trw":["pour",54806],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["forme",1597],"trw":["pourtant",2127],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["comme",26616],"trw":["personne",4398],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["qu'est-ce",3758],"trw":["presque",3280],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["pl",81861],"trw":["poil",237],"lp":[],"rp":["pl","poi","pli","pol","poli","plo","lip","ilip","lop","lopp","opi","pil","lipp","lp","ppl","ipl","poil","ppli","ploi","pilo"]},"225":{"input":[1,6,7,8],"tlp":["alp",231],"trp":["pla",16627],"trw":["plaza",92],"lp":["alp","alop","apil","apol","appl"],"rp":["pla","plai","pal","ipal","pala","opai","lpa","pali","pail","lap","lapi","plaz","plia","opla"]},"226":{"input":[2,6,7,8],"tlp":["spoi",1196],"trp":["posi",1139],"trw":["poils",186],"lp":["spoi","spl"],"rp":["posi","ispo","pois","plis","plos","piso","pok"]},"227":{"input":[1,2,6,7,8],"trw":["palais",478],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["elep",2381],"trp":["l'",88780],"trw":["l'oeil",749],"lp":["elep","epl","elop"],"rp":["l'","'il","l'e","'el","'ell","ple","l'o","l'i","pel","ppel","plei","pele","lep","pell","'oei","l'ep","l'oe"]},"229":{"input":[1,3,6,7,8],"tlw":["appele",632],"trw":["l'a",2169],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["s'il",4703],"trw":["l'idee",964],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["s'appelle",386],"trw":["l'aide",479],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["tipl",158],"trp":["ptio",1479],"lp":["tipl"],"rp":["ptio","poig","poit","opit","ptoi","pig","pivo","plit","ltip","lpt","lpit","pito","pilt","plot"]},"233":{"input":[1,4,6,7,8],"tlw":["galop",145],"trw":["plait",891],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["capital",85],"trw":["posait",183],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"tlw":["reprit-il",188],"trw":["l'oreille",587],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"tlw":["appeler",517],"trw":["l'air",3916],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["desespoir",393],"trw":["police",1783],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["d'avoir",1685],"trw":["place",3372],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["plu",43647],"trw":["moi",12680],"lp":[],"rp":["plu","moi","pui","hom","homm","mpl","mil","moin","mill","poin","lum","impo","pho","impl","minu","umi","hum","upi","ompl","mili"],"special":"enter"},"241":{"input":[1,5,6,7,8],"tlw":["animal",319],"trw":["mal",4543],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["simon",341],"trw":["plus",37565],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["salim",412],"trw":["maison",4491],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"trw":["homme",5277],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["qu'il",23610],"trw":["mieux",3375],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["depuis",5560],"trw":["hommes",4084],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["qu'ils",4873],"trw":["musique",825],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"tlw":["bulpitt",89],"trw":["point",3139],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["film",348],"trw":["pouvait",3877],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["commis",274],"trw":["jimbo",666],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["thomas",448],"trw":["mauvais",894],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["telephone",2027],"trw":["lumiere",2031],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["famille",1962],"trw":["pourquoi",6282],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["repondit",2783],"trw":["longtemps",2380],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["semblait",1934],"trw":["larmes",1018],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/hu-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/hu-keymap.json
new file mode 100644
index 00000000000..ec03cb59891
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/hu-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",383],"tlw":["a",307731],"lp":["aa"],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",24364],"tlw":["s",39563],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["as",66595],"tlw":["was",3404],"lp":["as","sa","ass","wa","asa","was","sas","ssa","assa","sass","aw","sasa","awa","ws","saw","sw","ww","asas","aws","www"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",3291],"tlw":["e",6340],"lp":["ee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ea",12313],"tlw":["x",109],"lp":["ea","ex","ae","xa","exa","xe","exe","xx"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["es",161633],"tlw":["es",60379],"lp":["es","de","se","ed","ese","des","ede","ess","dd","sse","edes","ds","esse","edd","dese","ses","sed","sd","eed","ded"],"rp":[]},"7":{"input":[1,2,3],"tlp":["ad",36504],"tlw":["we",1547],"lp":["ad","da","ada","we","das","add","sad","sada","ase","ead","dasa","ew","ade","adas","ads","dea","eas","asd","esa","desa"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",111811],"tlw":["t",315],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["ta",110634],"tlw":["at",3435],"lp":["ta","at","att","tta","ata","fa","tat","atta","tata","af","ft","ff","tatt","aft","fat","atat","tf","aff","afa","ffa"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["cs",52385],"tlw":["c",503],"lp":["cs","st","ts","ct","cc","tc","sc","scs","tts","sts","csc","cscs","cts","stt"],"rp":[]},"11":{"input":[1,2,4],"tlp":["csa",25323],"tlw":["fact",237],"lp":["csa","ac","ca","ast","tas","acs","sta","ats","atas","sat","csas","cas","tw","act","tsa","cat","stat","cast","tasa","asta"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["er",141919],"tlw":["te",4722],"lp":["er","et","te","re","rt","ett","ere","ert","ete","tet","tte","ette","rr","ter","tett","rte","etet","ret","erte","eret"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ar",117406],"tlw":["arra",2662],"lp":["ar","ra","fe","ara","art","tar","rta","tart","rat","arr","fr","rra","fer","arta","ef","ate","arra","arat","tra","rea"],"rp":[]},"14":{"input":[2,3,4],"tlp":["rs",15788],"tlw":["este",960],"lp":["rs","dt","rd","res","ste","est","tes","erd","ce","rde","ec","rc","erde","ers","eres","set","cse","det","etes","este"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["dta",9305],"tlw":["were",1692],"lp":["dta","adt","rad","arad","ars","rsa","arc","adta","sar","tars","arsa","wer","ras","radt","dar","ard","were","dat","dra","rsad"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",30933],"trw":["n",210],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",171406],"trp":["na",74976],"tlw":["an",1125],"trw":["na",433],"lp":["an","ann","ana","anna","anan"],"rp":["na","nna","nan","nnan","nana","nq"]},"18":{"input":[2,5],"base":"j","baseshift":"J","tlp":["sn",2399],"trp":["ns",7890],"trw":["j",225],"lp":["sn"],"rp":["ns","jj","nj","js","jn"]},"19":{"input":[1,2,5],"tlp":["aj",26099],"trp":["ja",44839],"tlw":["aj",46],"trw":["jaj",1254],"lp":["aj","aja","san","ans","saj","saja","sna","asn","asna","wn","ajan","ssan","ajn","ajna"],"rp":["ja","jan","jaj","nas","jna","jana"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",192896],"trp":["ne",139773],"tlw":["en",13217],"trw":["ne",6355],"lp":["en","enn","eny","ene","enne","enye","ey","enny","een"],"rp":["ne","ny","ye","yen","nne","nye","nny","yn","yne","nen","nyn"]},"21":{"input":[1,3,5],"tlp":["any",20653],"trp":["ya",37836],"tlw":["any",460],"lp":["any","ane","ean","anya","eany","anny","ay","anyn","ena","enna","eq"],"rp":["ya","yan","nya","yna","yana","yany","nyna","yea","ynya"]},"22":{"input":[2,3,5],"tlp":["den",14339],"trp":["nd",76373],"tlw":["ej",386],"trw":["need",144],"lp":["den","dj","ej","sen","end","eje","esen","dn","ende"],"rp":["nd","nde","je","nden","ys","ndj","jd","yes","yj","nse","jen"]},"23":{"input":[1,2,3,5],"tlp":["and",17737],"trp":["ndja",5958],"tlw":["and",12896],"trw":["new",369],"lp":["and","dja","ajd","adj","dan","adn","adja","dna","sand","anyj","day","way","ande"],"rp":["ndja","nda","yas","yja","ndan","nyja","ysa"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["bb",33278],"trp":["nt",65227],"tlw":["b",333],"lp":["bb","tn","tb","bn","bbn","bt"],"rp":["nt","nb","ntb","nnt","ntt"]},"25":{"input":[1,4,5],"tlp":["ba",46116],"trp":["nat",3727],"tlw":["abban",1391],"lp":["ba","ab","ban","tan","aba","abb","ant","aban","bba","bban","abba","bat","tana","anat","atn"],"rp":["nat","nta","nba","nban","nf"]},"26":{"input":[2,4,5],"tlp":["tj",4670],"trp":["nc",13855],"tlw":["stb",576],"lp":["tj","sb","bs","stb","bbs","cb","bj","sbb","csb","csn"],"rp":["nc","ncs","jt","nst","nts","jb","nbs","ntj","jts","jtj"]},"27":{"input":[1,2,4,5],"tlp":["ajt",5087],"trp":["jat",5127],"tlw":["sajat",1345],"lp":["ajt","tja","ajta","anc","ajat","atj","atja","baj","can","ancs","faj","fj","sab","sba","bac","sabb"],"rp":["jat","jta","jab","jaba"]},"28":{"input":[3,4,5],"tlp":["be",65601],"trp":["nte",8707],"tlw":["be",6609],"lp":["be","ben","ent","ten","eb","ber","rn","ebe","ren","ebb","ty","bbe","eben","ry","bet","rten"],"rp":["nte","yet","yt","yer"]},"29":{"input":[1,3,4,5],"tlp":["ran",8885],"trp":["yar",8550],"tlw":["bar",1464],"trw":["natty",172],"lp":["ran","bar","aran","arn","rany","tya","aty","rna","fen","rab","atya","bara","rba","arna","ary","rant"],"rp":["yar","yat","yf","yta"]},"30":{"input":[2,3,4,5],"tlp":["sten",4933],"trp":["ndt",3578],"tlw":["esetben",368],"lp":["sten","rj","bes","rend","enc","seb","renc","csen","dent","sebb","bec","ejet","erj","tend","encs"],"rp":["ndt","ncse","nce","jet","jr"]},"31":{"input":[1,2,3,4,5],"tlw":["rajta",1591],"trw":["jart",812],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",2593],"trw":["i",2017],"lp":[],"rp":["ii","iii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["az",158164],"trp":["ia",19708],"tlw":["az",99800],"lp":["az","za","zi","ai","zz","aza","zza","zaz","azz","azza","azi","zaza","zia","azaz","zai"],"rp":["ia","iz","iai","iza","izi"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["si",22088],"trp":["is",89346],"tlw":["si",71],"trw":["is",40982],"lp":["si","sk","sik","sis","ssi","ski"],"rp":["is","ki","ik","kk","kis","kik","iss","ks","isk","kiss","isi","iki","ksi","ikk"]},"35":{"input":[1,2,6],"tlp":["sz",176990],"trp":["ka",44404],"tlw":["aki",3851],"trw":["iszik",209],"lp":["sz","ak","sza","sak","ssz","szi","aka","asz","aki","zs","akk","assz","zik","wi","asi","ssza","szik","zsa"],"rp":["ka","isz"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",6348],"trp":["ie",7511],"lp":["ei","eei"],"rp":["ie","iei"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["ze",100252],"trp":["ize",2949],"tlw":["ez",13097],"trw":["ize",69],"lp":["ze","ez","eze","aze","zze","ezz","ezze","ezi","eza","xi","zei","ezei","zez","zeze","ezai","xix","xii"],"rp":["ize","ix","izze"]},"38":{"input":[2,3,6],"tlp":["ek",80676],"trp":["ke",88251],"tlw":["did",582],"trw":["ide",1572],"lp":["ek","di","eke","eki","edi","dik","dek","ddi","ekk","sek","ske","sid"],"rp":["ke","id","ide","ked","kes","ike","ise","kek"]},"39":{"input":[1,2,3,6],"tlp":["sze",62411],"trp":["kez",11007],"tlw":["ezek",1919],"trw":["kezd",305],"lp":["sze","esz","esze","zd","zek","ezd","ezek","ssze","azd","zda","azda","szek","dez","adi","zeke","zes"],"rp":["kez","keze","kezd","isze"]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",26187],"trp":["it",48328],"tlw":["ti",467],"trw":["itt",6106],"lp":["ti","vi","tv","vit","tit","tiv","vitt","vv","tti","vt","vii","viii"],"rp":["it","iv","itt","iti","ivi","itv","ivt","itiv"]},"41":{"input":[1,4,6],"tlp":["va",85476],"trp":["if",3685],"tlw":["azt",15369],"trw":["if",856],"lp":["va","zt","azt","fi","zta","av","ava","fia","azta","ati","ziv","vat","zat","viz","tva","tiz","fiat"],"rp":["if","iat","iva"]},"42":{"input":[2,4,6],"tlp":["csi",6831],"trp":["ic",8214],"tlw":["cit",131],"trw":["kit",1125],"lp":["csi","ci","vis","tk","viss","tis","sti","stv","sit","tik"],"rp":["ic","ist","kiv","ics","kit","kt","kic","kics","its","icsi"]},"43":{"input":[1,2,4,6],"tlp":["csak",20970],"trp":["kat",7650],"tlw":["csak",17322],"lp":["csak","szt","tak","cz","wit","tsz","vas","aszt","szta","sziv","tisz","atsz","czi","ttak","visz","cia"],"rp":["kat","iszt","kiva","kta"]},"44":{"input":[3,4,6],"tlp":["ve",74884],"trp":["ir",33168],"tlw":["vette",950],"trw":["irt",530],"lp":["ve","ri","ev","eve","vet","ver","rv","eri","eti","vett","tve","eir","rve","evet"],"rp":["ir","ive","ire","irt","ite","itte"]},"45":{"input":[1,3,4,6],"tlp":["zer",25432],"trp":["ira",15949],"tlw":["ezt",5966],"lp":["zer","zet","ezt","zere","var","zte","ezet","zett","ari","zert","ezte","vez","ria","zar","ezer","azer","rva","veze","zeri"],"rp":["ira"]},"46":{"input":[2,3,4,6],"tlp":["tek",13729],"trp":["ket",19030],"tlw":["vers",850],"trw":["ket",6195],"lp":["tek","ves","dv","rk","eket","rek","erek","dve","edv","edve","ttek","vid"],"rp":["ket","ker","kir","kere","iste","kerd","kedv","kr"]},"47":{"input":[1,2,3,4,6],"tlw":["akar",1873],"trw":["kezet",1015],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["in",100465],"trw":["in",9209],"lp":[],"rp":["in","ni","hi","nin","nni","hin","inn","ih","hh","ini","nh","inni","inh","hn","hinn","nii","hni","nini","hih","nnin"]},"49":{"input":[1,5,6],"tlp":["ah",5695],"trp":["ha",99222],"tlw":["ah",347],"trw":["ha",15507],"lp":["ah","zn","ani","zin","zan","zni","zna","ain","azan","aha"],"rp":["ha","han","haz","haza","ian","ina","nz","hia","nia","hazi"]},"50":{"input":[2,5,6],"tlp":["sin",3147],"trp":["nk",18980],"trw":["his",3359],"lp":["sin","sh","sni"],"rp":["nk","his","kin","nki","kn","ink","nik","nis","ij","kh","ins","ish","ikn","nkin","kikn","nsi","jh"]},"51":{"input":[1,2,5,6],"tlp":["wh",5945],"trp":["nak",17010],"tlw":["annak",3112],"trw":["hisz",637],"lp":["wh","szin","anak","szn","zaj","ank","whi","sina","aszn","szaj"],"rp":["nak","nka","nnak","has","haj","jak","hisz","kan","inka","hasz"]},"52":{"input":[3,5,6],"tlp":["eh",18062],"trp":["he",78848],"tlw":["enni",263],"trw":["he",3277],"lp":["eh","ehe","enni","eni","enyi","ein"],"rp":["he","yi","nyi","nnyi","ine","neh","hey","hen","hei","yh","nehe","inne","ien","nyh"]},"53":{"input":[1,3,5,6],"tlp":["zen",10585],"trp":["hane",4811],"tlw":["ezen",1479],"trw":["nehany",1282],"lp":["zen","eha","ezen","enz","ehan","ehez","zne","ezn","ezni"],"rp":["hane","nez","neha","hany","hez","yha","izen","neze","yz","yze","yez"]},"54":{"input":[2,3,5,6],"tlp":["enk",5048],"trp":["nek",29850],"tlw":["ennek",2112],"trw":["neki",6003],"lp":["enk","enek","enki","dni","senk"],"rp":["nek","ind","inde","neki","yek","neke","ken","yik","nnek","ndi","indi","inek","kine","nke","kne"]},"55":{"input":[1,2,3,5,6],"tlw":["when",993],"trw":["had",1905],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["th",71797],"trp":["int",32779],"tlw":["th",242],"trw":["hit",168],"lp":["th","bi","thi","bbi","tni","tth","vin","thin"],"rp":["int","ith","nth","inth","ib","ht","nti","hiv","hit","nv","hitt","nit"]},"57":{"input":[1,4,5,6],"tlp":["van",18634],"trp":["hat",22178],"tlw":["van",11948],"trw":["hat",6837],"lp":["van","tha","that","biz","ztan","zb","zab","ath","vab","vabb","zaba","zint","tvan","vann"],"rp":["hat","hata","ntha","hav","ivan","hab"]},"58":{"input":[2,4,5,6],"tlp":["ch",5920],"trp":["inc",7312],"tlw":["this",2307],"trw":["nincs",3085],"lp":["ch","this","csin","sinc","chi","bis"],"rp":["inc","incs","ninc","kb","kint","ich","hic","hich","nci","hist","nsti","inst","itj","nkit"]},"59":{"input":[1,2,4,5,6],"tlw":["with",3691],"trw":["inkabb",1478],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["the",47933],"trp":["het",10465],"tlw":["the",34738],"trw":["het",978],"lp":["the","ehet","ven","rin","ther","they","rint","teh","erin","thei","bir"],"rp":["het","her","inte","nev","neve","hete","hir","heir","yv"]},"61":{"input":[1,3,4,5,6],"tlw":["tehat",2571],"trw":["have",1230],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["these",599],"trw":["isten",2805],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["szerint",2186],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",1820],"trw":["o",10573],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","trp":["oa",760],"lp":[],"rp":["oa"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",41762],"trp":["os",59448],"tlw":["so",930],"trw":["os",131],"lp":["so","sos","soso","sso","soo"],"rp":["os","oss","oso","oos"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["aso",4417],"trp":["osa",3764],"lp":["aso","wo","asos","swo","woo","asso"],"rp":["osa","ow","ossa","owa","ows"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["eo",1230],"trp":["-e",3142],"trw":["-",1439],"lp":["eo","e-","e-o"],"rp":["-e","oe","o-","-o","o-o"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["a-",237],"trp":["-a",532],"trw":["-a",180],"lp":["a-","a-e","xo"],"rp":["-a","ox"]},"70":{"input":[2,3,7],"tlp":["do",41052],"trp":["od",15802],"tlw":["eso",376],"trw":["-es",254],"lp":["do","sod","dos","eso","dod","edo","d-","d-e","sose"],"rp":["od","ose","odo","ode","od-","od-e","odes","ood","osse","-d","-es"]},"71":{"input":[1,2,3,7],"tlp":["ado",4227],"trp":["oda",6077],"tlw":["ado",161],"trw":["oda",2095],"lp":["ado","soda","asod","dow","easo","doa","dosa","as-","ados","wood","adod","ewo"],"rp":["oda","owe","odas","-as","odaa","owed","-oda","odae"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["to",78142],"trp":["og",80035],"tlw":["to",11182],"trw":["ott",6355],"lp":["to","go","tot","tott","got","gt","gg","tto","gott","gto","tog"],"rp":["og","ot","ott","ogo","ogt","ogot","oto","ogto","otot"]},"73":{"input":[1,4,7],"tlp":["ag",87943],"trp":["of",19703],"tlw":["fog",1642],"trw":["of",16836],"lp":["ag","ga","fo","aga","ato","fog","ago","gat","agat","atot","agot","gta","foga","gf","fogo","agg"],"rp":["of","otta","oga","ota"]},"74":{"input":[2,4,7],"tlp":["cso",6549],"trp":["ost",9595],"tlw":["sot",1437],"lp":["cso","co","tos","gs","sot","gos","sto","sg","csos","csot","soc","cco","cto","ttos","sog"],"rp":["ost","oc","ocs","ogs","osto"]},"75":{"input":[1,2,4,7],"tlp":["sag",7512],"trp":["osag",1075],"tlw":["two",477],"lp":["sag","agos","sago","gas","atos","asag","agas","tosa","acso","ssag","tsag","gosa","two","saga","sga","gsa","ags"],"rp":["osag","oca","ocsa"]},"76":{"input":[3,4,7],"tlp":["eg",183750],"trp":["or",88200],"tlw":["eg",697],"trw":["oreg",2917],"lp":["eg","ro","ge","ege","reg","tor","gr","get","ero","tort","eget","rto","teg","rg","ger"],"rp":["or","ore","oro","ort","oreg"]},"77":{"input":[1,3,4,7],"tlp":["aro",14078],"trp":["ora",5234],"tlw":["for",3067],"trw":["ora",808],"lp":["aro","for","gar","rag","arto","fro","ega","rof","grof","egf","gra","arg","aror","taro","forr","rga","efo","arag"],"rp":["ora","orra"]},"78":{"input":[2,3,4,7],"tlp":["seg",14126],"trp":["ors",6702],"tlw":["eros",707],"trw":["ordog",649],"lp":["seg","ges","eges","ros","sege","dot","dott","rdo","deg","sor","dor","dog","ged","eseg","ross","tseg","egs","eros"],"rp":["ors","ord"]},"79":{"input":[1,2,3,4,7],"tlw":["adott",1280],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["on",101004],"trw":["on",3707],"lp":[],"rp":["on","un","no","ou","onn","nu","ono","oun","non","uno","nno","nnu","unn","nnon","nun","nnun","uo","onu","nou","oon"]},"81":{"input":[1,5,7],"tlp":["ano",4244],"trp":["ona",5750],"tlw":["au",143],"trw":["onnan",503],"lp":["ano","au","anu","qu","anno","anon","qua","anua"],"rp":["ona","onna","ua","una","uan","oan","unan","onan","nua","onq","nqu","onqu"]},"82":{"input":[2,5,7],"tlp":["su",6983],"trp":["jo",26548],"tlw":["son",366],"trw":["jo",6226],"lp":["su","son","ssu"],"rp":["jo","us","ju","uj","nos","jon","ons","onos","jos","oj","ous","jonn","jus","jjo","jjon","joj","jun"]},"83":{"input":[1,2,5,7],"tlp":["anos",2908],"trp":["jano",2283],"tlw":["sajnos",113],"trw":["janos",2073],"lp":["anos","ajo","ason","wou","aus","ajos","aju","asu","ajjo"],"rp":["jano","osan","own","now","uja","usa","onas","ujsa","oja","ujja","jua"]},"84":{"input":[3,5,7],"tlp":["eu",1868],"trp":["yo",25659],"tlw":["eu",103],"trw":["one",972],"lp":["eu","enu"],"rp":["yo","ony","yu","nyo","yon","nyu","onyo","one","ue","y-","onny","y-e","onne","yun","uny","you","yony","oen"]},"85":{"input":[1,3,5,7],"tlp":["anyo",2334],"trp":["unya",473],"tlw":["que",241],"trw":["-an",97],"lp":["anyo","que","an-","an-e","equ","equa","anyu","aux","eque","quee"],"rp":["unya","onya","-na","yano","oya","yanu","yona","-an","nque","ux"]},"86":{"input":[2,3,5,7],"tlp":["du",7212],"trp":["ond",20755],"tlw":["du",322],"trw":["und",201],"lp":["du","don","endo","edu"],"rp":["ond","ud","ndo","ondo","udo","ondj","yos","und","nyos","udj","udn","ndu","osen","use","yedu","unde"]},"87":{"input":[1,2,3,5,7],"tlw":["adjon",401],"trw":["odaadja",48],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["tu",26336],"trp":["ut",29088],"tlw":["tobb",2199],"trw":["not",2568],"lp":["tu","bo","tob","tobb","gon","bu","gu","ton","gn"],"rp":["ut","ob","ng","ug","obb","ont","uto","not","onb","nto","ung"]},"89":{"input":[1,4,5,7],"tlp":["ang",4181],"trp":["nag",18488],"tlw":["about",409],"trw":["utan",3611],"lp":["ang","fu","abo","gan","gab","gna","aton","tona","ango","agu","gaba"],"rp":["nag","uta","utan","oba","nga","unga","onba","utat","obba"]},"90":{"input":[2,4,5,7],"tlp":["gj",3961],"trp":["job",3981],"tlw":["bus",289],"trw":["jott",1407],"lp":["gj","csu","cou","sob","con","cson","sobb"],"rp":["job","jobb","jot","jott","jto","ntos","ust","uc","jut","ogj","ujt","jtot","juto"]},"91":{"input":[1,2,4,5,7],"tlw":["fogja",947],"trw":["jobban",1258],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["gy",213097],"trp":["ogy",60410],"tlw":["egy",31147],"trw":["ugy",8993],"lp":["gy","egy","gye","gyo","egye","ru","gen","egen","gyon","geny","gyu","eng","gyen","enge","bor"],"rp":["ogy","ur","ugy","oru","nge"]},"93":{"input":[1,3,4,5,7],"tlw":["baro",394],"trw":["nagy",10563],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["tudott",1092],"trw":["ures",337],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["tudja",1421],"trw":["ujra",1374],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["ol",117661],"trw":["l",1029],"lp":[],"rp":["ol","lo","ll","il","li","io","ill","llo","olo","lol","oi","oll","oli","lli","ili","illi","ilo","ollo","iol","lio"]},"97":{"input":[1,6,7],"tlp":["al",141761],"trp":["la",89690],"tlw":["all",2554],"trw":["la",881],"lp":["al","zo","ala","all","alo","azo","zol","alal","alla","zal","ali","allo"],"rp":["la","oz","ozo","lal","lla","ila","ola","ozz"]},"98":{"input":[2,6,7],"tlp":["sok",10043],"trp":["ko",67727],"tlw":["sok",3390],"trw":["ok",1198],"lp":["sok","sol","sko"],"rp":["ko","ok","lk","ls","iko","kko","lso","oko","kol","los","lko","lok","kos","lis","lik","kl","ols"]},"99":{"input":[1,2,6,7],"tlp":["szo",28916],"trp":["koz",17882],"tlw":["azok",1917],"trw":["law",597],"lp":["szo","zok","akko","szol","sszo","alk","azok","ako","soka","szok"],"rp":["koz","osz","oka","las","ossz","kozo","lak","kal","ozs","lasz"]},"100":{"input":[3,6,7],"tlp":["el",185226],"trp":["le",131988],"tlw":["el",11925],"trw":["le",3722],"lp":["el","ele","ell","elo","elle","eli","elel","elol"],"rp":["le","lle","lel","ole","ille","lole","lele","ile","lelo","olle","-i","lei"]},"101":{"input":[1,3,6,7],"tlp":["zel",9993],"trp":["lea",5723],"tlw":["ezzel",1164],"trw":["lexi",93],"lp":["zel","ezo","zele","ela","zzel","zle","zelo","zell","ale","alle","zeli","eal","ezel","elz","ezal","azel","elal"],"rp":["lea","oze","ozel"]},"102":{"input":[2,3,6,7],"tlp":["dol",7310],"trp":["ld",13454],"tlw":["elso",2743],"trw":["kell",5494],"lp":["dol","elk","els","elso","del","eles","elke","dok"],"rp":["ld","kel","les","kell","old","ido","oke","lek","lke","ldo","led","lese"]},"103":{"input":[1,2,3,6,7],"tlw":["szel",525],"trw":["lesz",3740],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["vo",40145],"trp":["lt",63226],"tlw":["volt",20311],"trw":["ivott",154],"lp":["vo","vol","volt","gi","tl","tol","vil","tio","gl"],"rp":["lt","ig","olt","ov","lot","lott","lv","lg","olg","lto","lit"]},"105":{"input":[1,4,6,7],"tlp":["val",23257],"trp":["lat",20885],"tlw":["alatt",3368],"trw":["igaz",1408],"lp":["val","tal","vag","alt","fol","vala","zot","tala","zott","gaz","alat","alta","valo"],"rp":["lat","lta","latt","ova","lag","ozot","olta"]},"106":{"input":[2,4,6,7],"tlp":["tok",4349],"trp":["kot",3836],"tlw":["titkos",290],"trw":["kolto",379],"lp":["tok","gis","gok","tko","gk","tols"],"rp":["kot","kov","lc","olc","okt","lcs","kolt","loc","olcs","koc","icso","kott","okot","oci"]},"107":{"input":[1,2,4,6,7],"tlw":["voltak",2244],"trw":["kozott",2109],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["vel",12822],"trp":["let",20248],"tlw":["elott",2567],"trw":["lett",3000],"lp":["vel","tel","egi","elt","veg","elet","vele","rol","tle","elot","tele"],"rp":["let","leg","lett","llet","ove","lte","lete","lev","iro"]},"109":{"input":[1,3,4,6,7],"tlw":["fel",5055],"trw":["left",288],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["ekkor",1030],"trw":["kellett",2170],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["akkor",5794],"trw":["orszag",966],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["ho",91631],"trw":["hol",3321],"lp":[],"rp":["ho","ul","ln","oln","hol","hu","lu","lon","oh","ulo","ion","hun","ulon","lni","iu","hon","nl","nul","oul","uh"]},"113":{"input":[1,5,6,7],"tlp":["zon",17866],"trp":["lan",11536],"tlw":["azon",1845],"trw":["hozza",2127],"lp":["zon","zu","azon","alan","aho","zul","alu"],"rp":["lan","hal","lna","olna","hoz","nal","hall","hozz","oha","uz","izon","hala","llan"]},"114":{"input":[2,5,6,7],"tlp":["soh",2706],"trp":["ku",14889],"trw":["jol",2741],"lp":["soh","sul","sho"],"rp":["ku","kul","unk","uk","lj","kon","kulo","hos","jol","lku","lkul","juk","hus","hoss","konn","uks","nok"]},"115":{"input":[1,2,5,6,7],"tlw":["soha",1668],"trw":["kozul",1472],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["ely",25178],"trp":["ly",62035],"tlw":["ellen",1350],"trw":["oly",2731],"lp":["ely","elye","elen"],"rp":["ly","len","lye","oly","leh","lehe","ily","lyen","hel","hely","ilye","llen","nel","ule","lyi","yel","lyn"]},"117":{"input":[1,3,5,6,7],"tlw":["equal",129],"trw":["olyan",5589],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["ejjel",683],"trw":["nelkul",2214],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["asszony",2441],"trw":["kisasszony",460],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["voln",8076],"trp":["hog",60062],"tlw":["tobbi",901],"trw":["otthon",874],"lp":["voln","bol","gh","tion","bl","tho","tul","gin","vu","ght","gint"],"rp":["hog","ult","ing","hung","oth","obbi","lonb","lob","ivu"]},"121":{"input":[1,4,5,6,7],"tlw":["volna",7681],"trw":["hova",947],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["such",497],"trw":["king",1415],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["viszont",558],"trw":["ifju",760],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["bele",1164],"trw":["hogy",55048],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["vagy",8524],"trw":["horvath",1175],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["egyik",2647],"trw":["korul",1156],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["vagyok",3023],"trw":["kiraly",5259],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trp":["pp",4972],"trw":["p",636],"lp":[],"rp":["pp"]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",22391],"trp":["pa",18427],"tlw":["apa",231],"trw":["pap",604],"lp":["ap","apa","app","appa"],"rp":["pa","pap","ppa","papa"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",1610],"trp":["ps",1710],"lp":["sp"],"rp":["ps"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["sap",895],"trp":["pas",1331],"trw":["pas",147],"lp":["sap","sapa","spa","aps","apas","asp","aspa","apsa"],"rp":["pas","pass","pasa","psa","paps"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",23212],"trp":["pe",28344],"tlw":["epp",420],"trw":["'",39],"lp":["ep","epe","epp","eppe","eep","e'"],"rp":["pe","ppe","pee"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["ape",1036],"trp":["pea",574],"tlw":["a'",897],"lp":["ape","a'","xp","exp","appe","xpe","expe","eap","epa"],"rp":["pea","ppea","pape"]},"134":{"input":[2,3,8],"tlp":["epes",1628],"trp":["ped",6768],"trw":["'s",163],"lp":["epes","eps","spe","esp","sep","sepp","epse","espe","desp","s'","s's","epd","dep"],"rp":["ped","pes","'s","pess","pse","pese","pd"]},"135":{"input":[1,2,3,8],"tlp":["dap",867],"trp":["pad",901],"tlw":["apad",98],"trw":["passed",66],"lp":["dap","dape","apes","apad","esap","weap","spea","as'","as's","aped"],"rp":["pad","peda","peas"]},"136":{"input":[4,8],"tlp":["tp",115],"trp":["pt",1949],"lp":["tp","ttp"],"rp":["pt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["apt",1138],"trp":["pta",935],"tlw":["apat",58],"trw":["papat",43],"lp":["apt","apta","apat","tap","tapa","apf"],"rp":["pta","pat","pf","pata"]},"138":{"input":[2,4,8],"trp":["pc",781],"lp":[],"rp":["pc","pcs"]},"139":{"input":[1,2,4,8],"tlp":["apc",704],"trp":["past",91],"tlw":["csapat",159],"trw":["past",91],"lp":["apc","apcs","csap","cap","sapt","capt","scap","spac"],"rp":["past","pcsa","pac"]},"140":{"input":[3,4,8],"tlp":["epet",1843],"trp":["pr",5345],"trw":["peter",932],"lp":["epet","rep","rp","erep","ept","repe","tep","epte","epr","epre"],"rp":["pr","per","pet","pete","pre","pett","pte","pere","ppet","ppr"]},"141":{"input":[1,3,4,8],"tlp":["apr",954],"trp":["par",5757],"tlw":["expert",89],"trw":["par",1156],"lp":["apr","arp","rpa","arpa","apra","rap","xper","appr","aper","apte","erap"],"rp":["par","part","para","pera","pra","pfe","pear","perf","pate"]},"142":{"input":[2,3,4,8],"tlp":["step",391],"trp":["pest",1888],"tlw":["csepp",134],"trw":["pest",218],"lp":["step","spec","csep","resp","cep","cept","epc","epcs","r's","er's","rdep","spr"],"rp":["pest","pers","perc","pres","pec","pecs","pect","pted"]},"143":{"input":[1,2,3,4,8],"tlw":["arpad",569],"trw":["peace",107],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["mm",5907],"trw":["m",703],"lp":[],"rp":["mm","mp","pn","nm","mn","pm","np","nnm"]},"145":{"input":[1,5,8],"tlp":["am",53502],"trp":["ma",92967],"tlw":["am",1222],"trw":["ma",3061],"lp":["am","ama","apam","amp","apn","amn","amna"],"rp":["ma","nap","man","pan","nam","mma","pam","mpa","napp","mam","nnap","mna","nma"]},"146":{"input":[2,5,8],"tlp":["sm",4467],"trp":["pj",2668],"lp":["sm"],"rp":["pj","ms","mj","mps"]},"147":{"input":[1,2,5,8],"tlp":["apj",2668],"trp":["mas",14915],"tlw":["apja",679],"trw":["mas",3210],"lp":["apj","apja","sam","snap","sma","amas","span"],"rp":["mas","maj","pja","masn","pjan","napj","mass","jam","paj","mpas","mans","maja","masa"]},"148":{"input":[3,5,8],"tlp":["em",127947],"trp":["me",140514],"tlw":["eppen",1670],"trw":["nem",50476],"lp":["em","eme","emm","epen","emen","emp","enem"],"rp":["me","nem","men","pen","menn","nep","ym","neme","ppen","meny","my","nepe","mem"]},"149":{"input":[1,3,5,8],"tlp":["ame",9265],"trp":["yma",2568],"tlw":["anyam",835],"trw":["many",675],"lp":["ame","anem","amen","ema","xam","exam","xamp","eman","eam"],"rp":["yma","many","yam","nyam","name","may","yama","mea","mean","nema","pean"]},"150":{"input":[2,3,5,8],"tlp":["sem",13924],"trp":["mes",7145],"tlw":["sem",8470],"trw":["nemes",571],"lp":["sem","sme","semm","emes","dem","ems","dnem","esem","deme","ejem","dm","edm"],"rp":["mes","mess","menj","med","mese","mse","jem","nems"]},"151":{"input":[1,2,3,5,8],"tlw":["adam",721],"trw":["majd",4082],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["bp",213],"trp":["mb",15442],"tlw":["bp",213],"lp":["bp","tm"],"rp":["mb","mt","pb","mpt"]},"153":{"input":[1,4,5,8],"tlp":["tam",7013],"trp":["mat",4622],"tlw":["babam",244],"trw":["mta",69],"lp":["tam","amb","ttam","amat","tama","bam","amba","abam","fam"],"rp":["mat","mba","mban","mab","maba","pant","matt","mta","ptam","mbat","mant"],"special":"numsym"},"154":{"input":[2,4,5,8],"tlp":["csm",290],"trp":["mc",1065],"tlw":["cm",129],"lp":["csm","cm"],"rp":["mc","mcs","mts"]},"155":{"input":[1,2,4,5,8],"tlw":["tamas",235],"trw":["mast",389],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["emb",12508],"trp":["mer",17137],"tlw":["ember",5090],"trw":["mert",10572],"lp":["emb","embe","rm","tem","erm","rme","erme","emet","rem","term","ttem","erem"],"rp":["mer","mbe","mert","mber","ment","met","yerm","mere"]},"157":{"input":[1,3,4,5,8],"tlw":["ram",766],"trw":["mar",14439],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["erdemes",264],"trw":["mester",269],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["tamadt",304],"trw":["matyas",1445],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"|","trp":["pi",6058],"lp":[],"rp":["pi","ip","pip"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["api",1249],"trp":["pai",741],"tlw":["apai",47],"trw":["papi",72],"lp":["api","zp","apai","zap"],"rp":["pai","ipa","pz","pia","papi","pipa"]},"162":{"input":[2,6,8],"tlp":["spi",214],"trp":["pis",406],"tlw":["sip",39],"lp":["spi","sip"],"rp":["pis","isp","pk"]},"163":{"input":[1,2,6,8],"tlp":["szp",99],"trp":["kap",3878],"trw":["kap",330],"lp":["szp","apsz","szap"],"rp":["kap","pasz","psz","kapi","ispa","pszi","pisz","pak","paks","kaps","psza"]},"164":{"input":[3,6,8],"tlp":["epi",405],"trp":["pie",218],"lp":["epi","epie"],"rp":["pie"]},"165":{"input":[1,3,6,8],"tlp":["zep",7772],"trp":["pze",497],"lp":["zep","zepe","epz","epze","z'","zepi","epez"],"rp":["pze","iz'","pez","pezi"]},"166":{"input":[2,3,6,8],"tlp":["epek",443],"trp":["pedi",6445],"trw":["kepes",493],"lp":["epek","skep","epk","espi"],"rp":["pedi","kep","kepe","kepp","pek","ikep","keep","pies","pied"]},"167":{"input":[1,2,3,6,8],"tlw":["szep",5043],"trw":["kepzes",85],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["tip",62],"trp":["pit",714],"lp":["tip"],"rp":["pit","pv","pvi","pti"]},"169":{"input":[1,4,6,8],"tlp":["apit",393],"trp":["pita",305],"trw":["pava",90],"lp":["apit","apv"],"rp":["pita","ipat","pati","pav","pava","pitz","pva"]},"170":{"input":[2,4,6,8],"tlp":["cip",416],"trp":["pist",271],"lp":["cip","spit"],"rp":["pist","pic","icip","pvis","pict","pics"]},"171":{"input":[1,2,4,6,8],"tlw":["csaptak",83],"trw":["kapta",303],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["epit",176],"trp":["pri",1125],"tlw":["epitett",92],"lp":["epit","rip","epv","epvi","epve","epir"],"rp":["pri","pir","pve","pite","pvet","piri","peri","prev","petv","pire"]},"173":{"input":[1,3,4,6,8],"trw":["ipari",85],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["despite",105],"trw":["kepet",297],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["szerepet",241],"trw":["persze",601],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["mi",105379],"trw":["mi",6559],"lp":[],"rp":["mi","min","im","mmi","him","mih","imp","ph","pin","hm","imm","mini","pni","mpi","mh","phi","pih","inp","pini","nim"]},"177":{"input":[1,5,6,8],"tlp":["ami",13718],"trp":["mz",2071],"tlw":["ami",1585],"trw":["mai",619],"lp":["ami","zam","amin","zama","zm","zzam","zma"],"rp":["mz","mia","mai","iam","ham","hama","maz","napi","ima","izm","miha","izma","miai"]},"178":{"input":[2,5,6,8],"tlp":["sim",317],"trp":["mik",10073],"trw":["mik",271],"lp":["sim","smi","smin","simp","simi","ship"],"rp":["mik","ism","mis","kim","mink","km","mk","ims","hims","miss","misk","mikn","mmik"]},"179":{"input":[1,2,5,6,8],"tlw":["szama",327],"trw":["masik",2051],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["emmi",3676],"trp":["mie",2185],"tlw":["enyim",109],"trw":["menni",726],"lp":["emmi","emi","emei","eph","ephe","empi"],"rp":["mie","ime","hem","mine","nemi","imen","mei","meh","phe","phen","mehe","mihe","yim","nepi"]},"181":{"input":[1,3,5,6,8],"tlw":["amennyi",66],"trw":["hanem",4711],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["semmi",1966],"trw":["minden",7752],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["szepen",924],"trw":["messze",712],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tim",1125],"trp":["mint",20757],"trw":["mint",15155],"lp":["tim"],"rp":["mint","mit","miv","mmit","mib","http","mitt","ptim","mmiv","imb","mitv","mmib","nmit","pith"]},"185":{"input":[1,4,5,6,8],"tlw":["amit",1691],"trw":["mintha",2774],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"tlw":["cim",39],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["szamat",111],"trw":["masikat",211],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["them",1440],"trw":["miert",1425],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["ereztem",268],"trw":["nemzeti",722],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["semmit",1211],"trw":["mindent",1246],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["szamara",1197],"trw":["mindjart",1584],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["po",11623],"trw":["op",133],"lp":[],"rp":["po","op","opo","opp","oop","ppo","oppo","pop"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["apo",4028],"trp":["opa",952],"lp":["apo","appo"],"rp":["opa","oppa","papo","opap"]},"194":{"input":[2,7,8],"tlp":["spo",489],"trp":["pos",929],"lp":["spo","sop","sopo","sopp"],"rp":["pos","ops","pso","oops","poss","ppos"]},"195":{"input":[1,2,7,8],"tlp":["apos",470],"trp":["pow",266],"lp":["apos","sapo","apso"],"rp":["pow","posa","opas"]},"196":{"input":[3,7,8],"tlp":["eop",677],"trp":["ope",1301],"trw":["pope",55],"lp":["eop","epo","ep-","ep-e","eopo"],"rp":["ope","peo","peop","-op","o-op","-ope","oope","-p","o-p","poe","p-","p-e","pope","oppe"]},"197":{"input":[1,3,7,8],"tlp":["eapo",51],"trp":["opea",193],"lp":["eapo"],"rp":["opea"]},"198":{"input":[2,3,7,8],"tlp":["dop",118],"trp":["pose",49],"lp":["dop","epso","espo","epos"],"rp":["pose","oped","osep"]},"199":{"input":[1,2,3,7,8],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["gp",235],"trp":["pot",2175],"lp":["gp","top"],"rp":["pot","pott","pog","opt","opot","pto","poto"]},"201":{"input":[1,4,7,8],"tlp":["apot",1897],"trp":["poga",242],"tlw":["fopap",36],"trw":["papot",116],"lp":["apot","apto","gpa","fop","fopa"],"rp":["poga","pag","pota","pato","paga","opf","pfo","opta"]},"202":{"input":[2,4,7,8],"tlp":["csop",415],"trp":["pcso",700],"tlw":["csopp",40],"lp":["csop","coop"],"rp":["pcso","post"]},"203":{"input":[1,2,4,7,8],"tlw":["csapott",121],"trw":["papsag",47],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["rop",1475],"trp":["pro",2619],"tlw":["gep",120],"trw":["por",106],"lp":["rop","rope","ropp","gep","egp","g'","roop","ro-p","gepe","gpe"],"rp":["pro","por","port","oper","opor","prog","pero","prot","ppor","ppro"]},"205":{"input":[1,3,4,7,8],"tlw":["apro",445],"trw":["poeta",81],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["troops",160],"trw":["process",152],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"tlw":["gaspar",102],"trw":["power",166],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["mo",35377],"trw":["up",463],"lp":[],"rp":["mo","om","mon","mu","mun","pu","up","omo","pon","nom","omm","oup","um","mpo","omp","onom","mpon","num","pom","upo"]},"209":{"input":[1,5,7,8],"tlp":["amo",1826],"trp":["oma",2710],"trw":["napon",471],"lp":["amo","amu","apon","apu","amon","anom","apun"],"rp":["oma","napo","oman","upa","upan","onap","omma","ompa","uma","uman","omam","onma","mano"]},"210":{"input":[2,5,7,8],"tlp":["sup",1243],"trp":["mos",10693],"tlw":["sum",38],"trw":["mos",122],"lp":["sup","som","somo","spon","supp"],"rp":["mos","pus","moso","oms","mus","ups","oups","usp","mso","pusp","uspo","pons","omj","osm","pson"]},"211":{"input":[1,2,5,7,8],"tlw":["samu",63],"trw":["pompas",221],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["epu",963],"trp":["yom",2209],"trw":["unnep",70],"lp":["epu","empo","emu","emo","emon"],"rp":["yom","ome","nyom","yomo","-m","omme","opme","ompe","mue","ymu","onym","nymu","memo","omen","ume"]},"213":{"input":[1,3,5,7,8],"trw":["nyoman",158],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["some",472],"trw":["modon",602],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["adom",249],"trw":["mondja",3298],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["tom",2250],"trp":["mut",1499],"tlw":["gomb",66],"trw":["mogott",467],"lp":["tom","gm","gom","gmo","gmon","bom"],"rp":["mut","pont","omb","mog","mbo","mogo","mong","mot","pub","put","mbom","ogom","umb","numb"]},"217":{"input":[1,4,5,7,8],"tlw":["among",360],"trw":["maga",4082],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["common",147],"trw":["most",8125],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["csupan",725],"trw":["magas",697],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["engem",1555],"trw":["meg",36148],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["from",2513],"trw":["magyar",4376],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["tudom",1658],"trw":["mondott",476],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["egymast",707],"trw":["mondta",2475],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["pl",3315],"trw":["pl",264],"lp":[],"rp":["pl","pil","pill","pol","plo","poli","opl","lop","lp","opi","poi","ipo","ipl","lip","ilip","lopo","pipo","lipo","lpi","opol"]},"225":{"input":[1,6,7,8],"tlp":["alap",1705],"trp":["lap",2645],"tlw":["alap",49],"trw":["pal",363],"lp":["alap","zpo","alp","zapo","apol"],"rp":["lap","pal","palo","lapo","pla","opai","ppal","llap","pala","ozp","ozpo","poz","pozi","lapi","pali"]},"226":{"input":[2,6,7,8],"tlp":["spok",377],"trp":["pok",1363],"trw":["pokol",157],"lp":["spok","sipo"],"rp":["pok","poko","kop","kopo","pko","posi","lisp","ipok","pkol","plok","oisp"]},"227":{"input":[1,2,6,7,8],"tlw":["alapos",56],"trw":["papok",148],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["eopl",632],"trp":["lep",2067],"trw":["people",540],"lp":["eopl","elep","elop","elp","epel","epl","eplo"],"rp":["lep","ple","pel","lepe","ople","iple","-pi","o-pi","pole","lepo","ppel","ilep","leop"]},"229":{"input":[1,3,6,7,8],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["spoke",44],"trw":["peoples",92],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["eposz",50],"trw":["kozepso",112],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["topi",149],"trp":["pig",452],"trw":["lopott",92],"lp":["topi","gpi","gpil"],"rp":["pig","polg","ipot","ptol","opti","lpig","pito","lopt","opv","lopv"]},"233":{"input":[1,4,6,7,8],"tlw":["allapot",76],"trw":["palota",179],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"tlw":["topic",99],"trw":["kopott",78],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["csapatok",70],"trw":["kapott",697],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"trw":["lepett",361],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"tlw":["alapveto",130],"trw":["polgari",178],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["csoportok",138],"trw":["pedig",6327],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["co-operative",438],"trw":["pasztor",331],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["lm",13260],"trw":["mino",264],"lp":[],"rp":["lm","lom","mil","mul","lmi","ml","lmo","mpl","mol","pul","hom","miu","mplo","plom","omol","mli","lmu","hop","lmon","oml"],"special":"enter"},"241":{"input":[1,5,6,7,8],"tlw":["alom",310],"trw":["hozzam",615],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["simon",66],"trw":["miklos",345],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["alapjan",546],"trw":["munka",592],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"tlw":["elem",115],"trw":["mely",4580],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["amely",1640],"trw":["mihaly",309],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["selyem",203],"trw":["midon",1554],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["amelyek",644],"trw":["masodik",891],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"trw":["mig",2990],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["valami",3022],"trw":["lattam",817],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["cimu",318],"trw":["much",250],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"trw":["maganak",843],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["velem",847],"trw":["mellett",2095],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["amelyet",615],"trw":["harom",3127],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["gyermek",947],"trw":["mikor",6075],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["amikor",2030],"trw":["magyarok",775],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/it-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/it-keymap.json
new file mode 100644
index 00000000000..56265a35724
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/it-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",76],"tlw":["a",134646],"lp":["aa"],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",181781],"tlw":["s",689],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["sa",147177],"tlw":["sa",4372],"lp":["sa","as","ssa","ass","assa","asa","sas","wa","sass","ssas","aw","saw","was","awa","ws"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",2590],"tlw":["e",285768],"lp":["ee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ea",16928],"tlw":["ex",571],"lp":["ea","ae","ex","ax","xe"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["de",299367],"tlw":["se",42825],"lp":["de","se","es","ess","sse","ed","esse","ede","ese","des","dd","sed","edd","dess","sede","edes","ses","sess","dde","dee"],"rp":[]},"7":{"input":[1,2,3],"tlp":["da",161213],"tlw":["da",50742],"lp":["da","ad","essa","esa","ade","ada","asse","ase","aes","add","dea","ades","eda","we","aese","seda","ew","sea","adde","aesa"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",206553],"tlw":["t",2430],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["ta",338700],"tlw":["fa",5357],"lp":["ta","at","fa","att","tta","tat","ata","ff","fat","fatt","af","atta","tata","aff","ffa","affa","ttat","ffat","tatt","taf"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["st",249453],"tlw":["c",1986],"lp":["st","sc","cc","ts","ct","tc"],"rp":[]},"11":{"input":[1,2,4],"tlp":["ca",149612],"tlw":["casa",7589],"lp":["ca","sta","ac","acc","stat","cas","asc","fac","cat","cca","ast","sat","sca","casa","facc","sf","acca","asta","tas","ssat"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["er",504768],"tlw":["te",8282],"lp":["er","re","te","tr","et","rt","ere","ett","ter","rr","tre","tte","rte","ert","err","ret","ette","rre","etr","tere"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ra",368409],"tlw":["era",57211],"lp":["ra","ar","era","are","tra","fe","rat","art","rta","fr","tar","far","ara","eta","etta","fer","tare","arte","ratt","fra"],"rp":[]},"14":{"input":[2,3,4],"tlp":["ce",118940],"tlw":["essere",13580],"lp":["ce","est","ec","rs","str","rc","res","ser","rd","ste","ers","tes","erc","cr","der","cer","sser","tess","dere","ece"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["sar",25172],"tlw":["testa",5675],"lp":["sar","esta","stra","ard","car","sare","ace","rad","dar","dat","rda","rac","adr","racc","rca","ars","dare","ssar","face","erca"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",46289],"trw":["n",1203],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",351085],"trp":["na",191784],"tlw":["an",861],"trw":["na",3153],"lp":["an","ann","ana","anna","anq","anan"],"rp":["na","nq","nna","nan","nnan"]},"18":{"input":[2,5],"base":"j","baseshift":"J","trp":["ns",40629],"trw":["j",428],"lp":[],"rp":["ns","nj","jn"]},"19":{"input":[1,2,5],"tlp":["san",10754],"trp":["nsa",10125],"tlw":["san",820],"lp":["san","ssan","sann","ans","sq","wn","asq","aj","sana","anj","anja","aja"],"rp":["nsa","nas","ja","nsan","nja","nasa","nsas","nass"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",325999],"trp":["ne",240032],"tlw":["en",427],"trw":["ne",18897],"lp":["en","ene","enn","enne","ey","enen","eyn","een","enny","eyne"],"rp":["ne","nne","ny","yn","nny","nen","yne","ye","nyn","nee"]},"21":{"input":[1,3,5],"tlp":["ena",10474],"trp":["nea",2742],"tlw":["aye",382],"lp":["ena","ane","ay","ean","ayn","ayne","enna","eq","anne","anea","aye","aen","eann"],"rp":["nea","nean","yna","nae","nyna","ynae","ya"]},"22":{"input":[2,3,5],"tlp":["sen",39413],"trp":["nd",129982],"tlw":["sen",952],"trw":["nes",163],"lp":["sen","end","ens","den","ende","sens","esen","eden","dend","ssen","dy"],"rp":["nd","nde","nes","ness","nse","nden","je","nsen","nese"]},"23":{"input":[1,2,3,5],"tlp":["and",60721],"trp":["nda",24205],"tlw":["and",382],"trw":["new",833],"lp":["and","anda","ensa","ande","dan","enda","sand","dand","dann","wen","esan","wene","dena","sean","anes","andy"],"rp":["nda","ndan","new","nand"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["bb",46376],"trp":["nt",291380],"tlw":["b",526],"lp":["bb","tn"],"rp":["nt"]},"25":{"input":[1,4,5],"tlp":["ant",64341],"trp":["nta",37477],"tlw":["tanta",636],"trw":["nata",204],"lp":["ant","tan","ba","ab","tant","abb","ban","anta","fan","bba","bat","abba","batt"],"rp":["nta","nat","nf","ntan","ntat","nata","nfa"]},"26":{"input":[2,4,5],"tlp":["sb",2201],"trp":["nc",80441],"lp":["sb","cn","tsb"],"rp":["nc","nst","nsc"]},"27":{"input":[1,2,4,5],"tlp":["anc",55675],"trp":["nca",4603],"tlw":["basta",1053],"lp":["anc","can","stan","bas","cant","bast","anca","cq","acq","sant","bbas","bass","ccan","sab","sba","banc"],"rp":["nca","nasc","jac","ntas"]},"28":{"input":[3,4,5],"tlp":["ent",152199],"trp":["nte",100114],"tlw":["bene",6300],"trw":["nere",364],"lp":["ent","ente","be","rn","eb","br","ebb","ten","bbe","ebbe","reb","rebb","entr","ren","ber","ben","ener"],"rp":["nte","ntr","ner"]},"29":{"input":[1,3,4,5],"tlp":["ran",45980],"trp":["nar",8583],"tlw":["entrare",873],"trw":["nera",1031],"lp":["ran","eran","ante","bra","enta","areb","rna","tran","bar","rtan","rant","fran","abbr","erna"],"rp":["nar","ntra","nare","nera","ntar","nfe"]},"30":{"input":[2,3,4,5],"tlp":["sent",16908],"trp":["nce",6484],"tlw":["sebbene",761],"lp":["sent","cen","dent","rend","cent","cend","tend","scen","sten","deb","ecen","cenn","ccen"],"rp":["nce","nder","nec","nece","nest","nces","ncer"]},"31":{"input":[1,2,3,4,5],"tlw":["sarebbe",7398],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",3469],"trw":["i",56666],"lp":[],"rp":["ii","iii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["zi",77724],"trp":["ia",200353],"tlw":["ai",8188],"lp":["zi","za","ai","az","zz","azi","zza","azz","zia","zzi","azza","azzi","aia","azia"],"rp":["ia","iz","izi","izia","izz","iaz"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["si",267038],"trp":["is",117042],"tlw":["si",95698],"trw":["k",250],"lp":["si","ssi","sis","sk","siss","ssis","sii","sisi","ski"],"rp":["is","iss","isi","issi","ki","ik","isk","ks","kik"]},"35":{"input":[1,2,6],"tlp":["sia",18324],"trp":["issa",4411],"tlw":["sia",7163],"trw":["ka",126],"lp":["sia","asi","assi","sai","ak","siz","sizi","ssia","saz","sazi","sias","ssai","aki","wi","asia"],"rp":["issa","isa","ias","iasi","ka"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",64002],"trp":["ie",107111],"lp":["ei"],"rp":["ie","iei"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["ez",20251],"trp":["ize",737],"tlw":["zie",189],"trw":["ix",82],"lp":["ez","ezz","ezza","ze","ezi","zie","azie","zze","ezzi","azze","xi","eaz","eazi","aie","ezze","eez","eze"],"rp":["ize","ix","izie"]},"38":{"input":[2,3,6],"tlp":["di",428636],"trp":["id",39251],"tlw":["di",272620],"trw":["idee",923],"lp":["di","dis","dei","esi","edi","diss","essi","die","sie","sid","side","sei","ddi"],"rp":["id","ide","isse","ied","ise","ies","idi"]},"39":{"input":[1,2,3,6],"tlp":["dia",9487],"trp":["ida",5456],"tlw":["dai",4684],"trw":["idea",948],"lp":["dia","dai","adi","diz","dizi","edia","esia","addi","ake","edai","adiz","aid","disa","aesi","aida","ediz"],"rp":["ida","idea","iesa","idia"]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",201674],"trp":["it",120823],"tlw":["ti",13315],"trw":["ivi",381],"lp":["ti","vi","tti","vit","tiv","vv","tit","viv","vvi","ttiv","tivi","vitt"],"rp":["it","iv","itt","iti","ivi","itti","ivit","itiv"]},"41":{"input":[1,4,6],"tlp":["va",190389],"trp":["ita",47351],"tlw":["vita",7521],"lp":["va","av","fi","ava","tav","ati","tava","via","atti","vita","avi","avv","ffi","vat"],"rp":["ita","iva","if","iat","ifi","itta"]},"42":{"input":[2,4,6],"tlp":["ci",164338],"trp":["ic",121416],"tlw":["ci",18525],"lp":["ci","sci","sti","tic","vis","cci","cit","sic","vist","sit","sist","vic","cis","vici"],"rp":["ic","ist","ici","icc","isc","isti"]},"43":{"input":[1,2,4,6],"tlp":["cia",31011],"trp":["ica",28164],"tlw":["stava",5638],"lp":["cia","fic","acci","stav","asci","ccia","tica","fici","scia","cav","ffic","cita","aci","cava","ciat","fica"],"rp":["ica","ista","iac","ific"]},"44":{"input":[3,4,6],"tlp":["ri",271321],"trp":["ir",53396],"tlw":["ri",3645],"trw":["ieri",513],"lp":["ri","ve","ev","ver","vev","eri","rit","tri","riv","rri","vr","rti","vre","rv","rie"],"rp":["ir","ire","ive","ier","iet"]},"45":{"input":[1,3,4,6],"tlp":["eva",73289],"trp":["iar",12328],"tlw":["aveva",25419],"lp":["eva","ave","veva","avev","ari","ria","rav","avr","aver","avre","arti","raz","riva","teva","rava","rz","razi","aria","var"],"rp":["iar"]},"46":{"input":[2,3,4,6],"tlp":["ris",22044],"trp":["ice",15501],"tlw":["dire",5876],"lp":["ris","ric","vers","dic","dir","dev","rsi","div","esti","cri","eci","cie","ved","dire","vec","cev","rdi","dive","ves"],"rp":["ice"]},"47":{"input":[1,2,3,4,6],"tlw":["avesse",3478],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["in",320519],"trw":["in",109997],"lp":[],"rp":["in","ni","hi","ini","nni","hin","hn","inn","hnn","nin","inni","nh","iin","hini"]},"49":{"input":[1,5,6],"tlp":["ani",19586],"trp":["nz",54632],"tlw":["anni",5707],"trw":["ha",18022],"lp":["ani","anz","anza","anni","anzi","ah"],"rp":["nz","nza","ha","ina","ian","hia","nzi","han","hann","hai","nia","niz","naz","nizi"]},"50":{"input":[2,5,6],"tlp":["sin",7946],"trp":["nsi",15035],"tlw":["sin",309],"lp":["sin","sh","sini","ssin","shi","shin","sinn"],"rp":["nsi","nis","ins","inis","insi","niss","his","nsis","hiss","nk","kn","nkn","hisk"]},"51":{"input":[1,2,5,6],"tlp":["sian",1135],"trp":["nsaz",1239],"tlw":["assassini",163],"trw":["hans",173],"lp":["sian","sha","shai","ansi","ash","anis","ank","wh","whi","whis","shak","sina","asha"],"rp":["nsaz","jak","kan","nsai","nsia","hak","hans"]},"52":{"input":[3,5,6],"tlp":["eni",10691],"trp":["he",257312],"tlw":["eh",464],"trw":["nei",6212],"lp":["eni","eh","ein","enni"],"rp":["he","ien","ine","hie","nie","nei","iene","nien","hnny","hien","ieni","hen","iy","hei","nhe","nhei"]},"53":{"input":[1,3,5,6],"tlp":["enz",33789],"trp":["ienz",3732],"tlw":["annie",76],"trw":["haze",116],"lp":["enz","enza","enzi","anie","enze","anze","zien","aine","anei","enez","enia"],"rp":["ienz","nze","iena","inea","hez","hezz","iane","nez","nezz"]},"54":{"input":[2,3,5,6],"tlp":["din",9601],"trp":["ndi",18448],"tlw":["sensi",395],"trw":["jessie",395],"lp":["din","ensi","dine","dini","enis","endi"],"rp":["ndi","ind","indi","nsie","iden","hies","ines","nsid","hied","ndie","inse","hes","hese","iend"]},"55":{"input":[1,2,3,5,6],"tlw":["senza",11519],"trw":["jake",1119],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["bi",59544],"trp":["nti",54757],"tlw":["bi",1153],"lp":["bi","tin","bbi","bit","vin","th","bin"],"rp":["nti","int","ib","nv","ibi","inv","nit","ntin","niv","init","nvi","ntit","ntiv"]},"57":{"input":[1,4,5,6],"tlp":["van",36986],"trp":["inf",7482],"tlw":["avanti",2333],"trw":["infatti",1929],"lp":["van","fin","anti","avan","bia","abi","tanz","bbia","vant","abbi","fini","bian","tina"],"rp":["inf","ivan","nfi","nif","nita","nav","inat"]},"58":{"input":[2,4,5,6],"tlp":["ch",325862],"trp":["nch",30760],"tlw":["chi",6236],"trw":["nisci",250],"lp":["ch","chi","cch","cchi","cin","sib","sibi","sch","ssib","bis","schi"],"rp":["nch","inc","nci","inci","ich","nic","icin","ntic","nist"]},"59":{"input":[1,2,4,5,6],"tlw":["stanza",2031],"trw":["jack",1501],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["enti",29283],"trp":["inte",12868],"tlw":["viene",2680],"trw":["niente",4357],"lp":["enti","ven","vreb","vent","rin","veni","rni","vien","bri","venn"],"rp":["inte","ient","nve","iven","inve","ibe","iber","nev","ibr","nir"]},"61":{"input":[1,3,4,5,6],"tlw":["avrebbe",7187],"trw":["infine",1261],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["che",190983],"trw":["invece",4329],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["anche",22478],"trw":["neanche",898],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",538],"trw":["o",24888],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","tlp":["ao",1339],"trp":["oa",935],"lp":["ao"],"rp":["oa"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",207940],"trp":["os",147196],"tlw":["so",6170],"trw":["oso",79],"lp":["so","sso","sos"],"rp":["os","oss","osso","oso","oos"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["asso",6821],"trp":["osa",24654],"tlw":["sasso",152],"trw":["ossa",382],"lp":["asso","aso","aos","wo","sao"],"rp":["osa","ossa","ow","ows"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["eo",5232],"trp":["oe",8136],"trw":["-",14856],"lp":["eo"],"rp":["oe","o-"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["xo",67],"lp":["xo"],"rp":[]},"70":{"input":[2,3,7],"tlp":["do",158471],"trp":["od",22403],"tlw":["do",2723],"trw":["od",70],"lp":["do","esso","eso","edo","dos","doss","ddo","eddo","sod","ddos","sodd","seo"],"rp":["od","osse","odo","ose","ode","oes","odd","odes"]},"71":{"input":[1,2,3,7],"tlp":["ado",4250],"trp":["oda",1104],"tlw":["adesso",3039],"lp":["ado","addo","aseo","ados","dado"],"rp":["oda","oad","owd","owde","osea"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["to",401592],"trp":["ot",65714],"tlw":["to",7313],"trw":["otto",700],"lp":["to","tto","gg","go","tog","tot","gog","got","gott","gt","gto","ggo"],"rp":["ot","og","ott","otto","ogg","oto","ogo","otog"]},"73":{"input":[1,4,7],"tlp":["ato",73996],"trp":["of",9885],"tlw":["fatto",10159],"trw":["of",731],"lp":["ato","ag","fo","ga","atto","tato","agg","aga","tag","gat","ago","fog","fot","gato","foto"],"rp":["of","ota","off","ofo","otta"]},"74":{"input":[2,4,7],"tlp":["co",390163],"trp":["oc",56253],"tlw":["sotto",6145],"trw":["oc",194],"lp":["co","sto","cos","cco","sco","sog","sot","sott","cost","soc","sg","tos","ttos","tost"],"rp":["oc","ost","occ","osc","osto","oco"]},"75":{"input":[1,2,4,7],"tlp":["cosa",19547],"trp":["osta",6879],"tlw":["cosa",13626],"lp":["cosa","fos","foss","acco","cato","sato","asco","caso","sag","sagg","sof","sfo","aco","asto","soff","ssag","asfo"],"rp":["osta","occa","oca"]},"76":{"input":[3,4,7],"tlp":["ro",227920],"trp":["or",269472],"tlw":["ero",2296],"trw":["ore",1264],"lp":["ro","eg","tro","ero","ge","gr","tor","etto","rto","rg","erto","gge","egg","ttor"],"rp":["or","ore","ort","oro","ote","orr"]},"77":{"input":[1,3,4,7],"tlp":["for",26973],"trp":["ora",39990],"tlw":["forte",2002],"trw":["ora",7824],"lp":["for","gra","aro","rag","rato","ega","raga","rof","gar","fort","fro","arg","ator","ragg","rofo","egat","efo"],"rp":["ora","orta","orat"]},"78":{"input":[2,3,4,7],"tlp":["cor",38804],"trp":["ors",15158],"tlw":["stesso",6792],"lp":["cor","esto","rso","erso","seg","sor","rdo","ros","eco","deg","seco","stro","cord","stor","cors"],"rp":["ors","ostr","ord","orse","oce"]},"79":{"input":[1,2,3,4,7],"tlw":["fosse",8373],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["on",433832],"trw":["un",115533],"lp":[],"rp":["on","no","un","non","uo","ono","nu","uno","nno","nuo","onn","uon","nun","uono","nono","nnu","onno","ou","onu","nuno"]},"81":{"input":[1,5,7],"tlp":["qu",190328],"trp":["ua",132700],"tlw":["qua",1585],"trw":["una",79579],"lp":["qu","qua","ano","quan","anno","au","anqu","annu","quo"],"rp":["ua","una","uan","ona","nqu","unq","unqu","onna","nua","uona","uann"]},"82":{"input":[2,5,7],"tlp":["su",132637],"trp":["us",36612],"tlw":["sono",21614],"trw":["uso",357],"lp":["su","son","suo","sono","ssu","sun","ssun","suno","sus","suon","sson"],"rp":["us","nos","ons","nso","onos","uss","jo","uso","uns"]},"83":{"input":[1,2,5,7],"tlp":["sua",24168],"trp":["uas",6999],"tlw":["sua",23065],"trw":["naso",1168],"lp":["sua","quas","sona","aus","ausa","suna","susa","assu","squ","sano","squa","ssua"],"rp":["uas","usa","usan","onsa","naso","ussa","own","jona"]},"84":{"input":[3,5,7],"tlp":["eno",16301],"trp":["ue",125676],"trw":["oy",212],"lp":["eno","enu","eu","enno","eon","eone"],"rp":["ue","one","onne","une","uen","yo","n-","oy","neo","uone","onen","nue","uy","noe"]},"85":{"input":[1,3,5,7],"tlp":["que",97787],"trp":["nque",9338],"tlw":["que",683],"lp":["que","equ","eque","quen","aneo","enua","aone","eau","aneu","anue"],"rp":["nque","yoa","uane"]},"86":{"input":[2,3,5,7],"tlp":["du",34768],"trp":["ndo",56462],"tlw":["due",12347],"trw":["nessuno",3678],"lp":["du","due","don","endo","donn","essu","enso","sue","edu","dun","sone"],"rp":["ndo","ues","ond","ondo","ud","onde","ude","use","onse"]},"87":{"input":[1,2,3,5,7],"tlw":["quando",17079],"trw":["nessuna",1517],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["tu",92522],"trp":["ut",89032],"tlw":["tutto",14989],"trw":["noto",633],"lp":["tu","tut","gn","tutt","gu","gno","bo"],"rp":["ut","nto","utt","ont","ng","uto","utto","ogn","ob","ub","ngo","not","ung"]},"89":{"input":[1,4,5,7],"tlp":["anto",26642],"trp":["onta",14073],"tlw":["quanto",9498],"trw":["nota",688],"lp":["anto","fu","gua","fon","atu","gna","ang","tua","agn","fuo","bano","aut"],"rp":["onta","uant","uta","utta","nato","natu","onf","uat"]},"90":{"input":[2,4,5,7],"tlp":["con",129147],"trp":["nco",21375],"tlw":["con",65735],"trw":["jung",428],"lp":["con","cu","cont","cun","cono","cons","sogn","scu","stu","cuo","sub","conc"],"rp":["nco","uc","usc","nost","ucc","nosc","ust","onc"]},"91":{"input":[1,2,4,5,7],"tlw":["bocca",2528],"trw":["nascosto",446],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["ento",24735],"trp":["ur",55498],"tlw":["tutte",5259],"trw":["notte",3456],"lp":["ento","rno","ru","tur","ron","gen","torn","gnor","gue","egn"],"rp":["ur","orn","nor","ntro","orno","uro","ontr","ure","onte","uor"]},"93":{"input":[1,3,4,5,7],"tlw":["erano",13650],"trw":["natura",2226],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["contro",4167],"trw":["nostro",2381],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["questo",17502],"trw":["nostra",2563],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["ll",292163],"trw":["il",150399],"lp":[],"rp":["ll","io","li","il","ol","lo","llo","olo","oi","lio","lli","oli","ili","oll","ill","ilo","ollo","iol","olli","oio"]},"97":{"input":[1,6,7],"tlp":["al",306120],"trp":["la",389912],"tlw":["al",34419],"trw":["la",169844],"lp":["al","all","zio","alla","azio","ali","zo","allo","zzo","ala","alo","azzo","alz"],"rp":["la","lla","ola","lia","ial","izio","lz"]},"98":{"input":[2,6,7],"tlp":["sol",35720],"trp":["osi",21430],"tlw":["solo",15660],"trw":["los",154],"lp":["sol","solo","sio","ssio","soli","sil","ssol","soll"],"rp":["osi","iso","ossi","ios","ls","lis","isio","ioso","los","ols","lsi","loso"]},"99":{"input":[1,2,6,7],"tlp":["sal",7582],"trp":["las",8686],"tlw":["sola",1804],"trw":["ossia",438],"lp":["sal","sola","als","sali","alsi","alis","zios","sala","asio","wil","wal","salo","will"],"rp":["las","osiz","lass","lsia","iosa","oak","oaki"]},"100":{"input":[3,6,7],"tlp":["el",300307],"trp":["le",283237],"tlw":["el",414],"trw":["le",75413],"lp":["el","ell","elle","ello","elli","ele","eli","elo"],"rp":["le","lle","ile","ole","lei","lie","iel","olle","ielo","ioe","ille","liel"]},"101":{"input":[1,3,6,7],"tlp":["ella",86423],"trp":["iale",6102],"tlw":["alle",8523],"lp":["ella","ale","alle","ela","eal","ezzo","ezio","eale","elai","elaz","eali","aile","alie"],"rp":["iale","lez","lezz","llez","lea","lezi","olez"]},"102":{"input":[2,3,6,7],"tlp":["del",145198],"trp":["ido",5517],"tlw":["del",59660],"trw":["les",352],"lp":["del","dell","dio","dol","sole","sile","dolo","deli","sold"],"rp":["ido","ld","les","odi","oesi","less","old","lid","lse","iod","olse"]},"103":{"input":[1,2,3,6,7],"tlw":["della",49783],"trw":["ideale",372],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["gi",98127],"trp":["lt",89489],"tlw":["gli",38211],"trw":["oggi",2072],"lp":["gi","gl","gli","vo","gio","vol","ggi","volt","glio","ggio"],"rp":["lt","ov","olt","ig","ito","lto","igl","igli","lit","olto"]},"105":{"input":[1,4,6,7],"tlp":["alt",36637],"trp":["lta",24023],"tlw":["volta",7909],"trw":["lato",1361],"lp":["alt","tal","gia","aggi","agi","avo","glia","agl","agli","gaz","val","fig","agaz"],"rp":["lta","olta","ova","lita","iato","lat","lav"]},"106":{"input":[2,4,6,7],"tlp":["col",38715],"trp":["ico",29735],"tlw":["cosi",14686],"lp":["col","cio","cosi","sig","colo","voc","ccol","tico","soci","cl","coll"],"rp":["ico","lc","lic","oci","lco","isto","icol","lcos","icco"]},"107":{"input":[1,2,4,6,7],"tlw":["cavallo",1015],"trw":["lasciato",1193],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["rio",23501],"trp":["lor",31885],"tlw":["vero",3849],"trw":["loro",17911],"lp":["rio","egl","egli","rl","rov","gior","evo","tori","rol","trov"],"rp":["lor","ltr","ori","ove","ior","loro","let","lett","ltro","leg"]},"109":{"input":[1,3,4,6,7],"tlw":["allora",5910],"trw":["lavoro",2692],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["dove",7905],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["storia",3176],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["iu",69600],"trw":["lui",16197],"lp":[],"rp":["iu","ion","ui","lu","ul","ino","oni","ull","lui","ho","ioni","uoi","lin","uni","lun","hio","inu","lon","noi","iun"]},"113":{"input":[1,5,6,7],"tlp":["zion",44305],"trp":["ual",34744],"tlw":["qui",6480],"trw":["hanno",4870],"lp":["zion","qual","qui","quin","alu"],"rp":["ual","ulla","nal","lan","nzio","uz","uali","iano","uzi","uzio","onal","iona","inua","inqu","nzo"]},"114":{"input":[2,5,6,7],"tlp":["sul",27914],"trp":["ius",9576],"tlw":["sul",12074],"trw":["john",422],"lp":["sul","sull","sion","suoi","sui","sino","solu"],"rp":["ius","usi","onsi","lus","joh","john","isu","hius","uis","nsio","ussi","usio","isul"]},"115":{"input":[1,2,5,6,7],"tlw":["sulla",9250],"trw":["unknown",242],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"trp":["nel",55639],"tlw":["ellen",168],"trw":["nel",25842],"lp":[],"rp":["nel","ione","uel","uell","nell","len","ulle","uei","ilen","uole","olen","line","ieno","ly","lly","llen","hel","iyo","onie","lien"]},"117":{"input":[1,3,5,6,7],"tlw":["quella",13048],"trw":["nella",18121],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["sulle",3574],"trw":["johnny",2025],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["quindi",2988],"trw":["honda",1391],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["bil",19308],"trp":["ing",11351],"tlw":["tutti",11017],"trw":["ogni",9891],"lp":["bil","gni","vu","giu","gin","bl"],"rp":["ing","utti","ign","ogni","uov","ibil","nuov","ult","igno","lib","onti","itu","iut","lung"]},"121":{"input":[1,4,5,6,7],"tlw":["fino",4978],"trw":["lingua",2263],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["cui",15060],"trw":["occhi",7963],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["qualcosa",5921],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["giorno",5009],"trw":["intorno",2138],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["avevano",4836],"trw":["labbra",1521],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["vecchio",2836],"trw":["luce",3993],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["qualche",7372],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trp":["pp",38074],"trw":["p",2856],"lp":[],"rp":["pp"]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",53641],"trp":["pa",113853],"tlw":["ap",277],"trw":["pa",1374],"lp":["ap","app","appa","apa"],"rp":["pa","ppa","pap","papa","papp"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",57528],"trp":["ps",391],"lp":["sp"],"rp":["ps"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["sap",10722],"trp":["pas",13080],"tlw":["spa",392],"trw":["passa",483],"lp":["sap","spa","asp","sapp","aspa","asap","spas"],"rp":["pas","pass","ppas"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",9203],"trp":["pe",210895],"tlw":["e'",746],"trw":["'",1162],"lp":["ep","epp","e'","eppe","epe"],"rp":["pe","'e","ppe","'ep","pep","pepe","pee"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["ape",12996],"trp":["'a",34981],"tlw":["a'",123],"trw":["pae",158],"lp":["ape","appe","epa","a'","epap","a'a","eppa"],"rp":["'a","pae","pea","'ap","'ape","pape","'app","'ex"]},"134":{"input":[2,3,8],"tlp":["spe",21318],"trp":["pes",6844],"tlw":["de'",420],"lp":["spe","d'","esp","spes","s'","espe","s'e","sep","sepp","d'e","sped","d'es","de'"],"rp":["pes","'es","pess","'ess","'esp","ped","ppes"]},"135":{"input":[1,2,3,8],"tlp":["sape",7738],"trp":["pad",5524],"tlw":["spada",415],"trw":["paese",1433],"lp":["sape","d'a","aspe","sepa","spad","dap","dapp","s'a","apes","spea","s'as"],"rp":["pad","paes","pesa","'as","'ass","pada","pade","peda","'asp"]},"136":{"input":[4,8],"tlp":["tp",67],"trp":["pt",593],"trw":["pt",593],"lp":["tp"],"rp":["pt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["tap",444],"trp":["pat",3422],"tlw":["tappa",74],"trw":["pat",105],"lp":["tap","tapp"],"rp":["pat","pata","patt","ppat"]},"138":{"input":[2,4,8],"lp":[],"rp":[]},"139":{"input":[1,2,4,8],"tlp":["cap",16620],"trp":["pac",3619],"tlw":["cap",137],"trw":["passata",399],"lp":["cap","capa","apac","capp","scap"],"rp":["pac","past","pasc","pacc","paca"]},"140":{"input":[3,4,8],"tlp":["rp",6335],"trp":["pr",145579],"trw":["per",80117],"lp":["rp","t'","rep","rpr","rpre","rpe"],"rp":["pr","per","pre","pet","'er","pett","pert","pere","ppr","ppre","pete","perr","pret","prep"]},"141":{"input":[1,3,4,8],"tlp":["rap",5944],"trp":["par",50789],"tlw":["aperta",930],"trw":["parte",8500],"lp":["rap","aper","rapp","apr","appr","epar","t'a"],"rp":["par","part","'era","pra","pare","pera","'ar","ppar","perf","prat","para","'art","'at"]},"142":{"input":[2,3,4,8],"tlp":["c'",13326],"trp":["pres",21493],"tlw":["c'e",5387],"trw":["prese",1400],"lp":["c'","c'e","spet","c'er","sper","spec","spr","espr","spre","resp","st'"],"rp":["pres","perc","pers","pec","prec","perd","pecc","'est","pesc"]},"143":{"input":[1,2,3,4,8],"tlw":["c'era",5795],"trw":["padre",3195],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["mp",63764],"trw":["m",580],"lp":[],"rp":["mp","mm","pn","pm"]},"145":{"input":[1,5,8],"tlp":["am",93470],"trp":["ma",209998],"tlw":["ama",245],"trw":["ma",53590],"lp":["am","ama","amm","amp","amma","ampa","aman","anam"],"rp":["ma","man","mma","mpa","pan","mana","mam","nam","mamm","nap","mpan","pann"]},"146":{"input":[2,5,8],"tlp":["sm",3714],"lp":["sm"],"rp":[]},"147":{"input":[1,2,5,8],"tlp":["sam",2868],"trp":["mas",6926],"tlw":["sam",230],"trw":["massa",628],"lp":["sam","asm","sma","asma","ssam"],"rp":["mas","mass","nsap","jam","mpas","njam","pasq","mmas","nasp","nsam"]},"148":{"input":[3,5,8],"tlp":["em",69499],"trp":["me",205039],"trw":["me",9600],"lp":["em","emp","eme","emen","emm","emme"],"rp":["me","men","pen","n'","mme","nem","ppen","mmen","mpe","nemm","nep","m'","mem","nepp"]},"149":{"input":[1,3,5,8],"tlp":["ame",31411],"trp":["pena",4673],"tlw":["appena",3899],"trw":["'na",1029],"lp":["ame","amen","ema","amme","eam","eame","emma"],"rp":["pena","'an","n'a","mane","'am","mae","'ann","nema","'na","name","pane","neam","mame"]},"150":{"input":[2,3,5,8],"tlp":["sem",25705],"trp":["pens",14000],"tlw":["sem",596],"trw":["mese",638],"lp":["sem","semp","esem","spen","sme","dem","ssem"],"rp":["pens","mes","mess","med","pend","mmed","mens","n'es","mese","mped","mede","mmes","mend"]},"151":{"input":[1,2,3,5,8],"tlw":["damane",190],"trw":["pensa",920],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["tm",759],"trp":["mb",24935],"lp":["tm"],"rp":["mb"]},"153":{"input":[1,4,5,8],"tlp":["tam",11090],"trp":["mat",11944],"tlw":["fama",205],"trw":["mat",965],"lp":["tam","amb","fam","bam","bamb","ttam","amat","atam","tamp","amba"],"rp":["mat","matt","mant","mba","ntam","mata","mpat","mmat","pant","mbat"],"special":"numsym"},"154":{"input":[2,4,5,8],"lp":[],"rp":[]},"155":{"input":[1,2,4,5,8],"tlw":["stampa",344],"trw":["manca",395],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["rm",30451],"trp":["ment",73144],"tlw":["be'",1001],"trw":["mentre",7346],"lp":["rm","tem","temp","empr","erm","emb","embr","rme","rem","term","trem"],"rp":["ment","mpr","mpre","mer","mbr","met","mett","pren","ntem"]},"157":{"input":[1,3,4,5,8],"tlw":["entrambe",518],"trw":["mare",1575],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["sempre",11019],"trw":["prendere",1451],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["sembra",1918],"trw":["madre",2851],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"!","trp":["pi",115591],"trw":["pi",1894],"lp":[],"rp":["pi","ip","ipi","ppi","pii","pip","ipp"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["api",10470],"trp":["pia",13275],"trw":["piazza",530],"lp":["api","appi","apii"],"rp":["pia","paz","pazi","ipa","ppia","pai","pazz","piaz","iap","iapi","ipaz","iapp","pipa","piz","pizz","ppai"]},"162":{"input":[2,6,8],"tlp":["spi",10357],"trp":["isp",11667],"tlw":["spi",83],"lp":["spi"],"rp":["isp","pis","psi","ispi"]},"163":{"input":[1,2,6,8],"tlp":["spia",1284],"trp":["ispa",273],"tlw":["sappia",270],"trw":["passi",1081],"lp":["spia","apis","spaz","sapi","aspi"],"rp":["ispa","pais","isap","pias"]},"164":{"input":[3,6,8],"tlp":["epi",750],"trp":["pie",14120],"trw":["pie",288],"lp":["epi","eppi"],"rp":["pie","'i","ipe","i'","'ip","iep","pei","ppie","iepi","iepe"]},"165":{"input":[1,3,6,8],"tlp":["apie",832],"trp":["pez",2090],"trw":["pezzi",621],"lp":["apie","z'","zz'","ezz'","z'a","ai'"],"rp":["pez","pezz","'az","'azi","'ai"]},"166":{"input":[2,3,6,8],"tlp":["disp",3751],"trp":["pied",3956],"tlw":["spie",208],"trw":["piedi",2995],"lp":["disp","spie","dip","dipe","espi","d'i","dipi","s'i"],"rp":["pied","ispe","pid","'id","'ide","pedi","'esi","'is","pidi","ipes","'edi","kesp"]},"167":{"input":[1,2,3,6,8],"tlw":["appesi",112],"trw":["paesi",504],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["tip",2675],"trp":["pit",7247],"tlw":["tipi",332],"lp":["tip","tipi"],"rp":["pit","piv","piti","pitt","ipit"]},"169":{"input":[1,4,6,8],"tlp":["apit",4239],"trp":["pita",2661],"trw":["piatti",270],"lp":["apit","apiv","vap"],"rp":["pita","pav","piat","pavi","piva","pati","pava","ipat"]},"170":{"input":[2,4,6,8],"tlp":["cip",5282],"trp":["pic",6757],"tlw":["tipici",78],"lp":["cip","cipi","spit","scip","stip","tisp"],"rp":["pic","picc","pisc","pist","ipic","psic","icip","pick","pici"]},"171":{"input":[1,2,4,6,8],"tlw":["capi",635],"trw":["passava",443],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["rip",3818],"trp":["pri",41676],"tlw":["ripete",508],"trw":["pri",723],"lp":["rip","ripr","ripe","v'","v'e"],"rp":["pri","pir","peri","pev","piri","priv","piet","pire","prie","ipr","ipet","ipre","prir","prev","pier"]},"173":{"input":[1,3,4,6,8],"tlw":["apri",920],"trw":["parti",1322],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["specie",1573],"trw":["presi",303],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["sapeva",2346],"trw":["piacere",1214],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["mi",125525],"trw":["mi",29736],"lp":[],"rp":["mi","im","min","imp","imi","mini","mpi","mmi","imm","nim","mmin","pin","inim","immi","mim","mimi","impi","pini","ph","ipin"]},"177":{"input":[1,5,6,8],"tlp":["ami",11196],"trp":["ima",27754],"tlw":["anima",623],"trw":["mai",10502],"lp":["ami","anim","ammi","ampi"],"rp":["ima","iam","mai","mia","mani","mina","hiam","pian","imma","iama","nima","iman","maz","impa","mazi","manz"]},"178":{"input":[2,5,6,8],"tlp":["sim",7979],"trp":["mis",8876],"tlw":["spin",81],"trw":["misi",410],"lp":["sim","ssim","simi","spin","smi","simp","smis","sism"],"rp":["mis","miss","mmis","ism","pins","misi","nism","imis","jim","mk"]},"179":{"input":[1,2,5,6,8],"tlw":["spina",102],"trw":["massima",364],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["empi",4592],"trp":["ime",13962],"tlw":["ehm",84],"trw":["miei",2459],"lp":["empi","emi"],"rp":["ime","imen","'in","mie","'h","iem","'im","pien","ieme","miei","'imp","impe","imme","h'","mine","ipen","inem","'imm"]},"181":{"input":[1,3,5,6,8],"tlw":["zampe",282],"trw":["piena",963],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["dimmi",325],"trw":["insieme",2565],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["assieme",502],"trw":["pensai",375],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tim",12886],"trp":["mbi",7548],"tlw":["tim",512],"trw":["miti",105],"lp":["tim","ttim","vim","timi","bim","bimb"],"rp":["mbi","mit","mbin","imit","ntim","imb","pint","mpit","miti","itm","mbit","miv","mith","mpiv"]},"185":{"input":[1,4,5,6,8],"tlw":["bambini",1251],"trw":["mattina",971],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"tlw":["smith",194],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["amici",1446],"trw":["macchina",1679],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["tempi",1297],"trw":["perrin",1178],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["veramente",1194],"trw":["prima",12710],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["sentimenti",600],"trw":["perche",14386],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["sembrava",3174],"trw":["presenza",1054],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["po",170696],"trw":["po",1713],"lp":[],"rp":["po","op","opo","ppo","opp","oppo","pop","popo","oop","ppop"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["appo",3603],"trp":["opa",1076],"lp":["appo","apo"],"rp":["opa","oppa","pao"]},"194":{"input":[2,7,8],"tlp":["spo",12332],"trp":["pos",30275],"tlw":["spo",162],"trw":["posso",2175],"lp":["spo","spos","sop","sosp","sopp"],"rp":["pos","poss","osp","opos","poso","ppos"]},"195":{"input":[1,2,7,8],"tlp":["sapo",395],"trp":["posa",1234],"tlw":["sposa",181],"trw":["passo",2265],"lp":["sapo","aspo","apos"],"rp":["posa"]},"196":{"input":[3,7,8],"tlp":["epo",996],"trp":["'o",10586],"trw":["po'",5326],"lp":["epo","eop","eppo"],"rp":["'o","ope","o'","poe","po'","'op","'ope","peo","'epo","oppe","oope","opeo","'opp","opee"]},"197":{"input":[1,3,7,8],"tlp":["eopa",82],"trp":["opea",192],"lp":["eopa"],"rp":["opea"]},"198":{"input":[2,3,7,8],"tlp":["dop",11237],"trp":["pose",2787],"tlw":["dopo",9632],"trw":["peso",740],"lp":["dop","dopo","d'o","espo","dopp","depo","epos"],"rp":["pose","poes","ospe","peso","os'","os'e","'od","'os","'odo","pod","opod","pode","'osp"]},"199":{"input":[1,2,3,7,8],"tlw":["appeso",230],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["top",650],"trp":["pot",22315],"tlw":["topo",171],"lp":["top","topo","ttop"],"rp":["pot","pog","ppog","pogg","pott","opot","ppot","opog"]},"201":{"input":[1,4,7,8],"trp":["pag",5925],"trw":["patto",180],"lp":[],"rp":["pag","paga","pato","opag","pago","ppag"]},"202":{"input":[2,4,7,8],"tlp":["cop",6022],"trp":["post",9448],"tlw":["scopo",742],"trw":["poco",4741],"lp":["cop","scop","copp","copo","coop","spog","cosp"],"rp":["post","poc","poco"]},"203":{"input":[1,2,4,7,8],"tlw":["capo",2162],"trw":["passato",1802],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["rop",21378],"trp":["pro",42777],"tlw":["troppo",4434],"trw":["pero",4668],"lp":["rop","ropr","trop","ropp","rpo","ropo"],"rp":["pro","por","opr","port","pote","prop","oper","pero","'or","orp","potr","ppor","orpo","poet"]},"205":{"input":[1,3,4,7,8],"tlw":["rapporto",1150],"trw":["porta",4253],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["corpo",2667],"trw":["presto",1698],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"tlw":["sopra",3357],"trw":["peccato",398],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["mo",124534],"trw":["puo",6756],"lp":[],"rp":["mo","om","pu","mpo","um","mon","omp","up","uom","mu","omo","puo","pun","uomo","omm","mom","nom","ppu","pon","mun"]},"209":{"input":[1,5,7,8],"tlp":["amo",18506],"trp":["oma",10024],"tlw":["amo",246],"trw":["mano",6828],"lp":["amo","ampo","appu","apu","aum","amon"],"rp":["oma","mano","oman","ompa","uma","uman","pau","upa","munq","omma","napo","mona","uam","nuam"]},"210":{"input":[2,5,7,8],"tlp":["sup",3910],"trp":["mos",4879],"tlw":["sommo",127],"trw":["possono",1433],"lp":["sup","spon","som","smo","somm","sum","spu","ssum","supp","spun"],"rp":["mos","mus","mpos","nsom","moss","pons","moso","nsum","mous","moos"]},"211":{"input":[1,2,5,7,8],"tlw":["somma",313],"trw":["pausa",424],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["empo",10444],"trp":["ome",58690],"trw":["meno",4910],"lp":["empo","emo","eppu"],"rp":["ome","'u","meno","omen","un'","ume","mome","'un","'uo","'uom","nome","upe","nume","umen","omme","n'o","un'o"]},"213":{"input":[1,3,5,7,8],"trw":["umane",290],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["d'un",897],"trw":["modo",7852],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["domanda",1306],"trw":["pensando",468],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["tom",2271],"trp":["punt",7081],"tlw":["tom",318],"trw":["punto",4093],"lp":["tom","tup","gom"],"rp":["punt","mont","omb","potu","pub","pubb","mot","mog","mbo","put","mob","pug","mut","pugn","moto","puto","pont"]},"217":{"input":[1,4,5,7,8],"tlw":["appunto",879],"trw":["punta",775],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["com",539],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["campo",1259],"trw":["manco",711],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["tempo",9244],"trw":["momento",5714],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["forma",2605],"trw":["paura",1888],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["come",44183],"trw":["persone",2066],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["comunque",2203],"trw":["persona",1755],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["poi",14737],"trw":["poi",13201],"lp":[],"rp":["poi","pl","pol","pio","pli","lp","poli","olp","ipo","opol","lpo","olpo","oppi","lpi","olpi","opi","polo","ipio","ppio","ipl"]},"225":{"input":[1,6,7,8],"tlp":["alp",617],"trp":["pal",8270],"trw":["paio",1036],"lp":["alp","apol","alap"],"rp":["pal","pall","pola","paio","pala","ipal","pla","lpa","olpa","poz","pozz","palp","pali","pila","opia","lap","paol"]},"226":{"input":[2,6,7,8],"tlp":["spl",884],"trp":["ispo",7900],"tlw":["spio",684],"trw":["polso",267],"lp":["spl","spio","splo","spli"],"rp":["ispo","posi","ospi","pols","ipos","piso","lpis","plos"]},"227":{"input":[1,2,6,7,8],"tlw":["spazio",928],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["ell'",11381],"trp":["l'",63315],"trw":["pelle",1317],"lp":["ell'","epl","epli"],"rp":["l'","ll'","l'i","l'o","l'e","pel","ll'i","pell","ple","ll'e","ll'o","lpe","'io","l'op","ppel","pelo","olpe"]},"229":{"input":[1,3,6,7,8],"tlw":["appello",93],"trw":["pezzo",996],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["doppio",286],"trw":["poesie",742],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["spalle",2219],"trw":["poesia",1881],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["tipo",1710],"trp":["pito",3299],"tlw":["tipo",1710],"trw":["piglio",445],"lp":["tipo","topi","volp"],"rp":["pito","pov","pig","pigl","piog","ipot","polv","polt","lpit","poti","ipig","pogl","piov","lpiv"]},"233":{"input":[1,4,6,7,8],"tlw":["appoggio",268],"trw":["pioggia",738],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"tlw":["colpo",1583],"trw":["piccolo",2047],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["capito",1303],"trw":["piccola",1514],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"trw":["proprio",7247],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"trw":["poteva",4863],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["rispose",2477],"trw":["percio",1506],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["capelli",2276],"trw":["particolare",1528],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["piu",40881],"trw":["piu",38322],"lp":[],"rp":["piu","lm","imo","omi","mol","omin","mio","mpl","mil","uomi","impo","ilm","mpli","lim","ompl","ommi","mili","mpio","imil","umi"],"special":"enter"},"241":{"input":[1,5,6,7,8],"tlw":["animali",640],"trw":["piano",2006],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["simili",901],"trw":["luminoso",184],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["siamo",2506],"trw":["possiamo",953],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"trw":["l'uomo",2192],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["almeno",2906],"trw":["mezzo",2952],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["esempio",1778],"trw":["modi",645],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["domani",713],"trw":["posizione",1014],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"trw":["molto",8286],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["abbiamo",2561],"trw":["montalbano",3474],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["comincio",1412],"trw":["piuttosto",1744],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["amico",1691],"trw":["possibilita",1220],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"trw":["meglio",3762],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["finalmente",1303],"trw":["ormai",2373],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["semplice",1455],"trw":["possibile",2609],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["commissario",2277],"trw":["l'unica",795],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/nl-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/nl-keymap.json
new file mode 100644
index 00000000000..2869e8f77cb
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/nl-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",565178],"tlw":["a",1899],"lp":["aa"],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",31510],"tlw":["s",593],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["wa",249084],"tlw":["was",91211],"lp":["wa","as","was","waa","sa","aas","ass","ssa","ws","wass","assa","sw","aw","saa","swa","swaa","ww","awa","awaa","waas"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",595701],"tlw":["e",445],"lp":["ee","eee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ea",9134],"tlw":["x",171],"lp":["ea","ex","ax","ae","xe","xa","eaa","exa","axe","exe"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["de",835524],"tlw":["de",381576],"lp":["de","es","ed","se","ede","dd","dde","ds","eed","ees","sse","dee","eds","eeds","deed","ess","sd","ese","dse","eede"],"rp":[]},"7":{"input":[1,2,3],"tlp":["da",270505],"tlw":["we",27843],"lp":["da","we","ad","wee","daa","ew","ewe","ade","add","adde","eda","wees","ewee","wd","dw","aad","edaa","wde","asse","ada"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",33524],"tlw":["t",381],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["at",290899],"tlw":["af",9932],"lp":["at","ta","aat","af","ft","taa","fa","ff","taat","taf","att","tat","aaf","aatt","ata","aff","fat","tf","tta","aft"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["st",260352],"tlw":["c",381],"lp":["st","sc","ts","ct","tst","ssc","cc","stt","tsc","tc","sts","stst","sst","stsc"],"rp":[]},"11":{"input":[1,2,4],"tlp":["ac",73946],"tlw":["wat",36195],"lp":["ac","wat","sta","tw","ast","staa","ats","aats","fs","wac","ca","aast","atst","act","afs","tas","fst","twa","fac","tac"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["er",710975],"tlw":["te",105276],"lp":["er","et","te","re","eer","ter","ere","rt","tr","ete","tte","ert","ree","eet","rte","tre","tee","ett","rr","ette"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ar",396560],"tlw":["extra",700],"lp":["ar","aar","ra","ef","raa","eef","are","ate","eft","eeft","fe","art","tra","era","ater","fr","rat","ara","afe","ffe"],"rp":[]},"14":{"input":[2,3,4],"tlp":["rd",138895],"tlw":["eerste",6507],"lp":["rd","der","ste","rs","erd","rde","ers","est","dr","ec","erde","dere","ets","rst","eder","erst","eest","eerd","ster","str"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["dat",155858],"tlw":["dat",136467],"lp":["dat","waar","wer","daar","war","fd","ard","weer","ware","werd","rw","erw","twe","twee","dac","aard","dra","fde","weet","ader"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",51105],"trw":["n",1346],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",559245],"trp":["na",127869],"tlw":["aan",55690],"trw":["na",10653],"lp":["an","aan","ann","ana","anna","aann","anaa","aq"],"rp":["na","naa","nna","nan","naan","nnaa"]},"18":{"input":[2,5],"base":"j","baseshift":"J","tlp":["sn",9856],"trp":["jn",169981],"trw":["j",357],"lp":["sn","sj"],"rp":["jn","ns","js","nj","jns"]},"19":{"input":[1,2,5],"tlp":["wan",14017],"trp":["ja",31023],"tlw":["san",173],"trw":["ja",6777],"lp":["wan","ans","wann","aans","anw","sna","san","aanw","anj","aj","asj"],"rp":["ja","jaa","jna","nw","naas","jan","jas","jw","nja"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",1522448],"trp":["ne",132761],"tlw":["en",225891],"trw":["nee",4568],"lp":["en","een","ene","enen","enn","enne","enee","ey","eene","eeen"],"rp":["ne","nen","nne","nnen","nee","nnee","neen","ny","nny","yn"]},"21":{"input":[1,3,5],"tlp":["anne",10606],"trp":["ya",413],"tlw":["anne",219],"lp":["anne","ena","ane","enaa","anen","ean","ay","anee","eaan","enan","xan","exan","anny","xy","exy","eq","eena"],"rp":["ya","yan","nane"]},"22":{"input":[2,3,5],"tlp":["den",130605],"trp":["nd",254142],"tlw":["eens",9370],"trw":["je",69369],"lp":["den","ens","end","sen","ende","eden","eens","dden","ssen","ense","sje"],"rp":["nd","nde","je","jd","nden","nse","nsen","jde","jes"]},"23":{"input":[1,2,3,5],"tlp":["and",86982],"trp":["nda",7813],"tlw":["dan",33270],"trw":["new",907],"lp":["and","dan","ande","wen","aand","anda","daan","anse","ands","aden","wens","anwe","wend"],"rp":["nda","nad","ndaa","nwe","nada","nade","ndan"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["bb",17696],"trp":["nt",98660],"tlw":["b",387],"lp":["bb","bt","tb","tn"],"rp":["nt","nb","ntb","ntt"]},"25":{"input":[1,4,5],"tlp":["ant",32323],"trp":["nat",8926],"tlw":["baan",878],"trw":["nat",410],"lp":["ant","ba","taan","tan","baa","ban","ab","anta","aant","tba","anaf","tant","fan","baan","fant"],"rp":["nat","nta","naf","nf","nba"]},"26":{"input":[2,4,5],"tlp":["tj",16496],"trp":["nst",10582],"lp":["tj","bs","sb","stj","stb","tsn"],"rp":["nst","nc","jt","nts","nsc","ntj","jst","jnt","ntst","ntsn","nct","jntj","ntsc","jb"]},"27":{"input":[1,2,4,5],"tlp":["want",6670],"trp":["jf",10865],"tlw":["want",6458],"trw":["naast",3850],"lp":["want","antw","stan","baas","anc","atj","fj","abs","bas","aatj","anst"],"rp":["jf","ntw","nac","jft","jac","nsta","ntac","nanc","ntas"]},"28":{"input":[3,4,5],"tlp":["be",171694],"trp":["nte",12846],"tlw":["ben",10919],"trw":["net",7100],"lp":["be","ten","ren","eb","ben","br","eren","ent","eten","bbe","bben","ebb","ebbe","rb","bee","rn","tten","bet","ber"],"rp":["nte"]},"29":{"input":[1,3,4,5],"tlp":["aren",23808],"trp":["naar",55710],"tlw":["eraan",1152],"trw":["naar",52688],"lp":["aren","aten","ran","rna","bra","arn","aarn","arna","baar","ante","bar","rba","erba","fran","eran","arb","fen","raan","rant"],"rp":["naar"]},"30":{"input":[2,3,4,5],"tlp":["rden",25498],"trp":["nder",65247],"tlw":["beetje",4094],"lp":["rden","bes","tje","bed","sten","best","etj","etje","eetj","tend","cen","rend","besc","cent","enst","tjes"],"rp":["nder","nste","ntje","ndr"]},"31":{"input":[1,2,3,4,5],"tlw":["waren",17010],"trw":["jaar",7230],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",416],"trw":["i",704],"lp":[],"rp":["ii","iii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["zi",217546],"trp":["ia",10521],"tlw":["z",113],"lp":["zi","za","ai","zaa","aai","az","azi","zz","zia","azia","zaai","zzi"],"rp":["ia","iz","iaa","iza","izi","izaa","izz","izzi"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["si",19356],"trp":["ik",185103],"trw":["ik",149098],"lp":["si","ssi","sk","sis","ssis"],"rp":["ik","is","kk","ki","iss","ks","ikk","kki","iks","isi","isk","issi","kis","ikki","isis"]},"35":{"input":[1,2,6],"tlp":["wi",80880],"trp":["ka",52225],"tlw":["zaak",1687],"trw":["kaas",199],"lp":["wi","ak","aak","zw","wis","zwa","akk","zak","zaak","wak","zwaa","wakk","zwi"],"rp":["ka","kw","kwa","kaa","ika","kas","kwaa"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",112497],"trp":["ie",427576],"tlw":["ei",126],"trw":["ie",333],"lp":["ei","eie","eei"],"rp":["ie","iee"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["ze",250139],"trp":["ize",3585],"tlw":["ze",116542],"lp":["ze","ez","zei","eze","zie","ezi","ezie","zee","aze","aie","eiz","aaie","eza","eize","xi","axi","eiza"],"rp":["ize","iez","ieze"]},"38":{"input":[2,3,6],"tlp":["di",156986],"trp":["ke",180090],"tlw":["die",84576],"trw":["keek",10339],"lp":["di","ek","die","eke","eek","eid","ekk","ekke"],"rp":["ke","id","kke","kee","ide","keek","ied","idd","iede","iek","ies","idde"]},"39":{"input":[1,2,3,6],"tlp":["ake",15537],"tlw":["deze",10880],"trw":["kwaad",950],"lp":["ake","dez","deze","wie","akke","zek","zeke","aid","wei","aaid","aide","wez","wek","ziek","week","zes","zwe","ewi","zake","adi"],"rp":[]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",92155],"trp":["it",127567],"tlw":["tv",365],"trw":["it",435],"lp":["ti","vi","tv","tti","tit","vit","titi","tiv","tivi","viv","tvi","vivi"],"rp":["it","itt","iti","iv","ivi","itv","ivit","itti"]},"41":{"input":[1,4,6],"tlp":["va",224506],"trp":["if",3864],"tlw":["zat",6137],"trw":["if",78],"lp":["va","zit","av","ati","zat","fi","zitt","vaa","tz","fti","ffi","via","tzi","avi","vat","tai"],"rp":["if","ita","itz","ift"]},"42":{"input":[2,4,6],"tlp":["sti",15829],"trp":["ic",74589],"tlw":["vis",333],"trw":["kist",358],"lp":["sti","ci","ck","cti","tis","sit","tisc","vis","tk","tik","sv"],"rp":["ic","kt","ist","issc","ikt","isc","its","ici","kst"]},"43":{"input":[1,2,4,6],"tlp":["zic",46006],"trp":["kat",1851],"tlw":["wist",7236],"trw":["kast",575],"lp":["zic","akt","aakt","wist","vas","vast","twi","wit","vaak","zac","tak","stak","witt","asti","acti","vak","cia","ack"],"rp":["kat","kast"]},"44":{"input":[3,4,6],"tlp":["ve",223463],"trp":["iet",126034],"tlw":["vier",2544],"lp":["ve","ver","ri","ev","vr","eve","tie","rie","eri","vee","rv","vert","erv","vri","rei","vie"],"rp":["iet","ier","ite","itte"]},"45":{"input":[1,3,4,6],"tlp":["ari",10534],"trp":["ief",8550],"tlw":["zette",2378],"lp":["ari","zet","rz","vra","eva","rva","atie","vraa","zett","erz","raai","vera","erva","arv","aarv","ave","verz","aari","var"],"rp":["ief"]},"46":{"input":[2,3,4,6],"tlp":["rk",33984],"trp":["iets",24709],"tlw":["dit",13642],"trw":["iets",14243],"lp":["rk","erk","dit","verd","rek","dri","vers","rke","erke","eker","ric","tek","drie"],"rp":["iets","kte","ker","kr","keer","iste","kri"]},"47":{"input":[1,2,3,4,6],"tlw":["vader",6824],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["in",343391],"trw":["in",146093],"lp":[],"rp":["in","hi","ni","inn","nin","nh","ini","nni","hin","hn","nnin","inni","inh","hni","hnn","ih","nhi","inin","inhi"]},"49":{"input":[1,5,6],"tlp":["zin",7282],"trp":["ha",212677],"tlw":["zin",2379],"trw":["hanna",165],"lp":["zin","ani","ah","anz","anni","zinn","anh","zan","aanz"],"rp":["ha","haa","han","nz","hz","ina","nzi","ian","inz","nza","nzin"]},"50":{"input":[2,5,6],"trp":["ij",550946],"trw":["hij",131508],"lp":[],"rp":["ij","ijn","hij","jk","ijk","nk","kin","kij","kijk","ji","kn","ink","jij","nis","ins","nik","ijs","kni","hijn","isj"]},"51":{"input":[1,2,5,6],"tlp":["zij",124236],"trp":["kan",22915],"tlw":["zijn",106271],"trw":["kan",12791],"lp":["zij","zijn","wij","ank","win","wijz","wijn","wijs","anks","aank","zwij","wink"],"rp":["kan","jz","ijz","ijna","kans","haas","kaan","kwij"]},"52":{"input":[3,5,6],"tlp":["ein",21712],"trp":["he",426236],"tlw":["eh",524],"trw":["hen",5498],"lp":["ein","eh","eni","eine","ehe","enin","eini","enh"],"rp":["he","nie","ien","hee","hie","inne","hei","ine","hen","heen","hien","nhe"]},"53":{"input":[1,3,5,6],"tlp":["zien",14842],"trp":["nze",8382],"tlw":["zien",8781],"trw":["inzien",116],"lp":["zien","zen","eha","ezen","anie","enz","azen","ezin","ehan","aien","anze","ehaa","enza","eenz","enzi"],"rp":["nze","hze","izen","nzen","hae"]},"54":{"input":[2,3,5,6],"tlp":["eken",22412],"trp":["ken",85243],"tlw":["denk",3418],"trw":["kijken",4068],"lp":["eken","enk","din","denk","enke"],"rp":["ken","ind","ijd","nke","jke","ijke","inde","kken","heid","kind","iend","ndi","nken","kend","ijde"]},"55":{"input":[1,2,3,5,6],"tlw":["weken",1635],"trw":["had",55453],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["bi",59526],"trp":["ht",123626],"tlw":["bh",81],"lp":["bi","th","vin","bin","binn","tin","ttin"],"rp":["ht","hti","int","nti","nv","htt","htin","inti","htb","hit","ntv","ib","nth"]},"57":{"input":[1,4,5,6],"tlp":["van",189387],"trp":["hat",1531],"tlw":["van",171860],"trw":["haat",432],"lp":["van","vana","anti","tha","anv","aanv","anva","fin","ath","anav","abi","fh"],"rp":["hat","nva","nati","htba","inf","nav","hav","haat"]},"58":{"input":[2,4,5,6],"tlp":["ch",268567],"trp":["ich",66755],"tlw":["bij",29299],"trw":["kijkt",1607],"lp":["ch","cht","sch","bij","tij","chi","schi","chti","ssch","vij","bijn","chij"],"rp":["ich","icht","jv","ijv","isch","jkt","ijkt","hts"]},"59":{"input":[1,2,4,5,6],"tlw":["zich",32148],"trw":["kant",2963],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["ven",53110],"trp":["het",230522],"tlw":["even",9723],"trw":["het",226716],"lp":["ven","even","rin","rh","erh","erin","rien","the","verb"],"rp":["het","niet","hte","heb","hter","hebb","her","hten","hier","hr","iten"]},"61":{"input":[1,3,4,5,6],"tlw":["zitten",5880],"trw":["haar",73072],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["tijd",8288],"trw":["niets",8728],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["achter",7426],"trw":["hard",1821],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",285058],"trw":["o",2376],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","tlp":["ao",407],"trp":["oa",7486],"lp":["ao"],"rp":["oa","ooa"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",27187],"trp":["os",19065],"tlw":["so",132],"lp":["so","soo","sso"],"rp":["os","oos","oss","oso","osoo"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["wo",53022],"trp":["ow",2105],"lp":["wo","woo","aso","aos","sow","woa"],"rp":["ow","owa","osa","owaa","ossa"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["eo",2682],"trp":["oe",232725],"trw":["-",7439],"lp":["eo","e-","eoo","eoe"],"rp":["oe","o-","-o","-oo"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["xo",189],"trp":["-a",938],"lp":["xo","exo","a-","x-","ex-"],"rp":["-a","o-a","ox","oea"]},"70":{"input":[2,3,7],"tlp":["do",77681],"trp":["oed",31676],"tlw":["dood",3509],"lp":["do","doo","doe","dood","edo","so-","edoe","dod","dode","se-"],"rp":["oed","od","oes","oede","ood","ode","-s","ods","ose","oods"]},"71":{"input":[1,2,3,7],"tlp":["ewo",10898],"trp":["oda",3201],"tlw":["woede",613],"lp":["ewo","ewoo","woe","woed","dwo","woes","edwo","ado","so-a","d-a","dow","ados","wod"],"rp":["oda","oew","oewe","owe","-w","-we","oad"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["to",114612],"trp":["og",71340],"tlw":["tot",16339],"trw":["oog",1205],"lp":["to","go","tot","gt","gg","tg","too","goo","tto","toot","got"],"rp":["og","ot","oot","oog","ott","oto","otto","ogt","oogt"]},"73":{"input":[1,4,7],"tlp":["ag",68842],"trp":["of",61079],"tlw":["gaat",6123],"trw":["of",29931],"lp":["ag","ga","gaa","fo","aag","gaat","gaf","fg","afg","foo","fot","foto","gat","tof","agt","aagt"],"rp":["of","oof","off","oga"]},"74":{"input":[2,4,7],"tlp":["sto",24832],"trp":["oc",27927],"tlw":["stoot",131],"trw":["oogst",77],"lp":["sto","co","toc","gs","gst","sg","stoo","gc","sgc","soc","cto"],"rp":["oc","ots","ost","oots","otst","oost","ogs","oogs","ogst"]},"75":{"input":[1,2,4,7],"tlp":["sof",6578],"trp":["oca",652],"tlw":["stof",570],"lp":["sof","two","twoo","gas","wag","gast","stof","woog","wsg","gw","aco","ags","wog","astg","sag","ssag","twag"],"rp":["oca","ocaa","osof"]},"76":{"input":[3,4,7],"tlp":["ge",441497],"trp":["or",220309],"tlw":["toe",7828],"trw":["oor",713],"lp":["ge","ro","eg","ege","gr","toe","rg","gee","roe","gro","ger","teg","tege","rge","erg"],"rp":["or","oor","oet","oge","oeg"]},"77":{"input":[1,3,4,7],"tlp":["age",21589],"trp":["-f",7172],"tlw":["graag",2369],"lp":["age","aro","aaro","raag","gra","rag","rage","t-f","t-fa","ega","fge","afge","for","graa","arg"],"rp":["-f","-fa","oef","ora","-fo"]},"78":{"input":[2,3,4,7],"tlp":["door",33484],"trp":["ord",50515],"tlw":["door",27762],"lp":["door","gd","ges","goed","ged","gde","egd","dro","gest","rdo","gesc","god","egde"],"rp":["ord","orde","oord","oest","ordt","ors","orst"]},"79":{"input":[1,2,3,4,7],"tlw":["weg",9038],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["on",217953],"trw":["nu",18377],"lp":[],"rp":["on","ou","no","un","nu","uu","oon","unn","noo","nou","onn","non","ono","nno","nuu","oun","onno","uno","nnu","oonn"]},"81":{"input":[1,5,7],"tlp":["au",17538],"trp":["nau",2224],"tlw":["qua",92],"trw":["oan",54],"lp":["au","ano","anu","qu","qua","anon","anua","aou"],"rp":["nau","ua","ona","onaa","oan","nua","uan","onna","oq","oqu","nao","noa"]},"82":{"input":[2,5,7],"tlp":["su",4221],"trp":["us",37357],"tlw":["suus",122],"trw":["ons",10726],"lp":["su","soon","son","sno"],"rp":["us","jo","ons","ju","jon","uss","jou","nos","ous","joo","uns","usj","jos","oj","osj","jus"]},"83":{"input":[1,2,5,7],"tlp":["woon",7683],"trp":["uw",53486],"tlw":["wou",586],"trw":["uw",2686],"lp":["woon","auw","won","wu","wus","anos","wou","aus","wonn"],"rp":["uw","ouw","nauw","uws","jouw","nwo","nwoo","onw","nuw","uwa","nuwa"]},"84":{"input":[3,5,7],"tlp":["eu",50132],"trp":["oen",39532],"trw":["you",472],"lp":["eu","eno","enoe","eeu","eun","enu","enoo"],"rp":["oen","unne","noe","one","onne","oene","neu","ue","n-","onen","yo","onee","you"]},"85":{"input":[1,3,5,7],"tlp":["eau",2046],"trp":["ux",203],"lp":["eau","que","e-na","equ","eque","enau","xon","an-","ean-","quen","ena-"],"rp":["ux","uxe","-na","oya","-an","o-an","na-","oyaa"]},"86":{"input":[2,3,5,7],"tlp":["du",25835],"trp":["ond",80377],"tlw":["doen",9594],"trw":["oude",3893],"lp":["du","doen","dus","deu","don","eus","edu"],"rp":["ond","onde","ud","oud","ude","oude","uden","usse","nod","udd","udde","oden","oond"]},"87":{"input":[1,2,3,5,7],"tlw":["wonen",867],"trw":["ouwe",411],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["bo",35213],"trp":["ng",141175],"tlw":["boog",1018],"trw":["nog",33780],"lp":["bo","tu","ton","bu","tuu","gon","boo","gu","bou"],"rp":["ng","nog","ont","ong","ut","ug","ob","unt","uto","ub","out"]},"89":{"input":[1,4,5,7],"tlp":["ang",42251],"trp":["natu",6022],"tlw":["gaan",11291],"trw":["nota",126],"lp":["ang","gaan","fon","font","atu","atuu","gan","aut","auto","aang","gang","foon","bang","anto","tua"],"rp":["natu","uf","onta","uff","noga"]},"90":{"input":[2,4,5,7],"tlp":["ston",12659],"trp":["uc",9757],"tlw":["boos",682],"trw":["jong",894],"lp":["ston","stu","tus","tuss","con","cont","stuu","cu","bos","conc"],"rp":["uc","ust","jong","jg","ngs","ngst","onts","jgt","onc","noc"]},"91":{"input":[1,2,4,5,7],"tlw":["angst",1249],"trw":["jacob",378],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["gen",143754],"trp":["ur",56772],"tlw":["toen",23218],"trw":["ogen",8241],"lp":["gen","ru","egen","toen","geen","eur","geb","rou","beg","ron","eru","rug","geno","ggen"],"rp":["ur","nge","ngen","uur","onge","ogen"]},"93":{"input":[1,3,4,5,7],"tlw":["gegaan",1465],"trw":["naartoe",554],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["stond",8649],"trw":["onder",8950],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["worden",11389],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["li",171979],"trw":["l",236],"lp":[],"rp":["li","ll","lo","il","ol","oi","ooi","loo","ill","lli","ili","oll","io","oli","ool","ilo","olo","illi","llo","oil"]},"97":{"input":[1,6,7],"tlp":["al",225980],"trp":["la",129950],"tlw":["zo",26684],"trw":["la",525],"lp":["al","zo","all","aal","zal","zoa","zoal","ali","zoo","zoi"],"rp":["la","laa","oal","oz","lla","olla","ola","ial","laz","lia"]},"98":{"input":[2,6,7],"tlp":["sl",31416],"trp":["ls",78404],"tlw":["slok",358],"trw":["ook",30107],"lp":["sl","slo","sli","sloo"],"rp":["ls","ko","ok","ook","kl","lk","lik","lso","klo","okk","los","lis","olk","loos","kli","koo"]},"99":{"input":[1,2,6,7],"tlp":["als",67283],"trp":["lka",8548],"tlw":["als",51537],"trw":["las",791],"lp":["als","wil","sla","also","will","slaa","wal","wol","alis","zow"],"rp":["lka","lkaa","kla","oals","las","lak","klaa","lw","kal","klas"]},"100":{"input":[3,6,7],"tlp":["el",334993],"trp":["le",209513],"tlw":["el",147],"trw":["leo",319],"lp":["el","eli","ele","eel","ell","elle","elo","eil","eloo"],"rp":["le","lle","lee","lie","oel","lei","iel","llee","ille","loe","oei"]},"101":{"input":[1,3,6,7],"tlp":["alle",39915],"trp":["lez",2818],"tlw":["alle",6909],"trw":["lizzie",74],"lp":["alle","zel","ale","ela","zoe","ezel","ezo","ezoe","zoie","elaa","eal","ziel","ael"],"rp":["lez","oze","leze","laze","iale","oez","lezi"]},"102":{"input":[2,3,6,7],"tlp":["eld",44452],"trp":["ld",72634],"tlw":["elke",2943],"trw":["leek",4071],"lp":["eld","del","elde","elk","deli","els","esl"],"rp":["ld","lde","kel","oek","kle","ild","ilde","les","lles","keli","klei","led","lke"]},"103":{"input":[1,2,3,6,7],"tlw":["wel",21511],"trw":["kale",288],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["vo",141909],"trp":["ig",90099],"tlw":["vol",3408],"trw":["ooit",2846],"lp":["vo","voo","gi","vol","tig","volg","vl","gl","gli"],"rp":["ig","ov","lt","lg","oit","ooit","olg","lig","lti","lot","lit"]},"105":{"input":[1,4,6,7],"tlp":["alt",12700],"trp":["lf",27918],"tlw":["zag",8836],"trw":["laat",4912],"lp":["alt","val","zag","alti","tal","fl","avo","vall","zig","gla","alf","zov","vla","taal","gz"],"rp":["lf","laat","lat","lag","loof"]},"106":{"input":[2,4,6,7],"tlp":["stig",5578],"trp":["lic",9686],"tlw":["stil",1726],"trw":["kost",381],"lp":["stig","slot","stil","col","gis","cl","sig","volk","voc","gist","tok","stok"],"rp":["lic","kig","kkig","okt","lots","kost","koc","lst"]},"107":{"input":[1,2,4,6,7],"tlw":["alsof",6162],"trw":["last",650],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["voor",79011],"trp":["ove",54444],"tlw":["voor",54531],"trw":["over",27647],"lp":["voor","gel","rl","tel","gev","vro","voe","erl","veel","rli","voel","eig","vroe","evo","eige"],"rp":["ove","over","ige","lev","leve"]},"109":{"input":[1,3,4,6,7],"tlw":["zelf",5574],"trw":["later",4901],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["voelde",4707],"trw":["kreeg",3295],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["elkaar",7935],"trw":["laatste",4077],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["ui",114860],"trw":["hun",16526],"lp":[],"rp":["ui","ho","hu","hoo","lu","ul","hui","hou","hun","lin","nl","nooi","lui","nli","ull","hon","lon","ulli","hul","uin"]},"113":{"input":[1,5,6,7],"tlp":["zou",30976],"trp":["lan",39246],"tlw":["zou",25914],"trw":["hal",496],"lp":["zou","zon","zu","zul","zull","zoon","anui"],"rp":["lan","hal","onz","haal","uz","lau","uiz","nal","uzi","nla","nlan","llan","laan"]},"114":{"input":[2,5,6,7],"trp":["lij",77650],"trw":["kon",15534],"lp":[],"rp":["lij","lijk","uis","uk","kon","ku","kun","huis","kunn","jl","ijl","nlij","onk","uik","luk","ukk","jul","luis","jull","link"]},"115":{"input":[1,2,5,6,7],"tlw":["zus",901],"trw":["hals",521],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["elen",11125],"trp":["len",43428],"tlw":["ellen",353],"trw":["hoe",13915],"lp":["elen","eho","elu","enl","elin","enli"],"rp":["len","hoe","llen","hel","hele","leen","heel","ieu","nieu","nel","lein","leu","hiel","ly"]},"117":{"input":[1,3,5,6,7],"tlw":["alleen",11766],"trw":["onze",5956],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["snel",4364],"trw":["kunnen",11536],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["zouden",4749],"trw":["nieuwe",3839],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["bl",35668],"trp":["ing",72541],"tlw":["ging",11015],"trw":["uit",32730],"lp":["bl","gin","ging","bli","von","bov","bui","buit","ting","blo","tui","ving","gh"],"rp":["ing","uit","ling","nig","ning","htig","hoog"]},"121":{"input":[1,4,5,6,7],"tlw":["vanuit",1383],"trw":["lang",5446],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["toch",11105],"trw":["kunt",2792],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["blijft",1361],"trw":["langs",3708],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["eigen",5173],"trw":["leven",7694],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["zeggen",6400],"trw":["laten",6557],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["vond",4220],"trw":["krijgen",3495],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["altijd",8787],"trw":["hoofd",7271],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trp":["pp",12540],"trw":["p",961],"lp":[],"rp":["pp"]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",30480],"trp":["pa",44369],"tlw":["aap",260],"trw":["papa",882],"lp":["ap","app","aap","apa","appa"],"rp":["pa","paa","pap","ppa","papa","papp"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",30385],"trp":["ps",2263],"lp":["sp"],"rp":["ps","psp"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["spa",3276],"trp":["pas",6100],"trw":["pas",3162],"lp":["spa","wap","asp","spaa","aps","wsp","wapp"],"rp":["pas","pass","pw","pasp","ppas"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",32631],"trp":["pe",64915],"trw":["'",114697],"lp":["ep","epe","eep","epp","eppe","e'","ee'"],"rp":["pe","ppe","pee","'e","'ee","''","pep","pepe","'p"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["appe",4414],"trp":["'a",772],"trw":["px",303],"lp":["appe","ape","epa","epaa","a'","xp","exp","xpe","expe","apa'"],"rp":["'a","px","pape","pa'"]},"134":{"input":[2,3,8],"tlp":["spe",7419],"trp":["'s",4942],"trw":["'s",2281],"lp":["spe","esp","spee","dp","espe","sep","d'","dep","eps","dpe","d's","epse"],"rp":["'s","'d","pd","'de","pes","pese","pse","ped"]},"135":{"input":[1,2,3,8],"tlp":["wape",918],"trp":["'w",3268],"tlw":["da's",142],"trw":["'we",656],"lp":["wape","a's","aspe","espa","dap","dapp","epas","dpa","da'","ewap"],"rp":["'w","'wa","'da","pad","'we","'waa","pda","padd","'daa","'wee"]},"136":{"input":[4,8],"tlp":["tp",294],"trp":["pt",17059],"trw":["pt",3175],"lp":["tp"],"rp":["pt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["tap",4643],"trp":["pat",1164],"trw":["pat",62],"lp":["tap","apt","tapt","tapp","aapt","tpa","tpaa","fp","afp","aafp"],"rp":["pat","patt"]},"138":{"input":[2,4,8],"tlp":["tsp",813],"trp":["pst",986],"lp":["tsp"],"rp":["pst","psc"]},"139":{"input":[1,2,4,8],"tlp":["stap",4318],"trp":["past",1080],"tlw":["stap",923],"trw":["past",219],"lp":["stap","fsp","afsp","tspa","cap","capa","apst","spac","spat"],"rp":["past","psta","pac","pats"]},"140":{"input":[3,4,8],"tlp":["rp",6434],"trp":["pr",39150],"trw":["'t",3159],"lp":["rp","erp","reep","ept","rpe","erpe","rep","epr","epte","repe","eper"],"rp":["pr","per","pre","pte","'t","pet","pper","pete","pree"]},"141":{"input":[1,3,4,8],"tlp":["rap",4098],"trp":["pra",9631],"tlw":["trap",1366],"trw":["paar",6885],"lp":["rap","apte","trap","rapp","tape","rapt","apar","epar","epra"],"rp":["pra","paar","par","prat","praa","part","ppar","para","perf","pera","patr"]},"142":{"input":[2,3,4,8],"tlp":["spr",12727],"trp":["pers",3101],"tlw":["respect",322],"trw":["pers",244],"lp":["spr","spre","espr","spec","rsp","rspr","sper","ersp","cep","cept","tspr","sept"],"rp":["pers","prec","pec","pect","pres","pdr","perd","pste"]},"143":{"input":[1,2,3,4,8],"tlw":["stapte",1114],"trw":["'dat",1386],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["mm",11785],"trw":["m",364],"lp":[],"rp":["mm","mp","nm","pn","pm","np","mn"]},"145":{"input":[1,5,8],"tlp":["am",70985],"trp":["ma",173379],"trw":["man",11151],"lp":["am","aam","amp","ama","amm"],"rp":["ma","maa","man","nam","pan","naam","mann","maan","nap","pann","nma","mam","nmaa","mma","mama"]},"146":{"input":[2,5,8],"tlp":["sm",4193],"trp":["ms",12782],"trw":["ms",164],"lp":["sm","sms"],"rp":["ms","jp","pj","nsp","mpj","nsm","jsm","jm","mps"]},"147":{"input":[1,2,5,8],"tlp":["wam",13717],"trp":["jam",1619],"tlw":["span",501],"trw":["massa",211],"lp":["wam","sam","span","sma","ams","snap","apj","smaa","aams","asm"],"rp":["jam","mas","jasp","jamm","mans","maj","mw","panj","jap","mass"]},"148":{"input":[3,5,8],"tlp":["em",102948],"trp":["me",272103],"tlw":["em",708],"trw":["me",29423],"lp":["em","eme","emen","eem","epen","enm","emm"],"rp":["me","men","mee","pen","'n","mme","ppen","nem","neme","mpe","mene","meen","neem"]},"149":{"input":[1,3,5,8],"tlp":["ema",26711],"trp":["name",3318],"tlw":["aannemen",185],"trw":["mannen",3680],"lp":["ema","ame","emaa","eman","amen","apen","enma","amme","ampe","eam","eema","emma","enam","eaam"],"rp":["name","'ma","'maa","max","pame","'na"]},"150":{"input":[2,3,5,8],"tlp":["emd",5986],"trp":["md",17766],"tlw":["sms'je",55],"trw":["mensen",8143],"lp":["emd","emde","dem","eemd","sme"],"rp":["md","mens","mde","mees","'j","pje","med","mes","pend","jpe","jpen","'je","mede","mend","mden"]},"151":{"input":[1,2,3,5,8],"tlw":["samen",3346],"trw":["maanden",1720],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["tm",3132],"trp":["mt",9354],"trw":["mt",93],"lp":["tm","bm"],"rp":["mt","mb","ntm","mpt","pb","mbt","ntp"]},"153":{"input":[1,4,5,8],"tlp":["fam",4992],"trp":["mat",3403],"tlw":["tam",57],"trw":["maat",316],"lp":["fam","tam","amb","tma","fm","tmaa","amt","aamt","ambt","afm","amat"],"rp":["mat","maat","mant","napt","mba","mf","matt","mfa","mfan"],"special":"numsym"},"154":{"input":[2,4,5,8],"tlp":["cm",234],"trp":["mst",4009],"tlw":["cm",234],"lp":["cm","stm"],"rp":["mst","jpt","ntsp","msc","nstm"]},"155":{"input":[1,2,4,5,8],"tlw":["stam",199],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["rm",26544],"trp":["met",89793],"tlw":["ermee",749],"trw":["met",82919],"lp":["rm","rme","erm","tem","rmee","rmen","reem","bep","erme","temm","emt"],"rp":["met","mer","meer","ment","mete","mmer","mte","mbe","mber"]},"157":{"input":[1,3,4,5,8],"tlw":["armen",1959],"trw":["maar",65784],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["stem",3280],"trw":["meeste",1332],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["waarmee",1313],"trw":["jasper",582],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"!","trp":["pi",15794],"lp":[],"rp":["pi","ip","ipp","ppi","pip"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["api",2645],"trp":["pz",1834],"trw":["pizza",62],"lp":["api","appi"],"rp":["pz","papi","pzi","pai","pia","pza","pzaa","piz","pizz"]},"162":{"input":[2,6,8],"tlp":["spi",2906],"trp":["pk",1286],"trw":["pik",322],"lp":["spi"],"rp":["pk","pis","pik","kip","isp","ips","kipp","pikk","kp","ksp","kspi","pki"]},"163":{"input":[1,2,6,8],"tlp":["apk",775],"trp":["pak",6092],"trw":["pak",881],"lp":["apk","aapk","apka","wip"],"rp":["pak","kap","pakk","kapi","pka","pwi","kaps","kapp","ppak","kaap","paki","pkw","pkwa"]},"164":{"input":[3,6,8],"tlp":["epi",821],"trp":["iep",14334],"lp":["epi","eppi"],"rp":["iep","pie","'i","iepe","ippe","ipe","iepi","ppie","pipe","pei","piep","i'"]},"165":{"input":[1,3,6,8],"tlp":["apie",1574],"trp":["'z",1130],"tlw":["appie",556],"trw":["'ze",578],"lp":["apie","z'","zeep","zi'","azi'"],"rp":["'z","'ze","pze","'zi"]},"166":{"input":[2,3,6,8],"tlp":["diep",3859],"trp":["'ik",3806],"tlw":["diep",1774],"trw":["'ik",3806],"lp":["diep","spie","disp","dpi","espi","epk"],"rp":["'ik","'k","'di","'die","'is","pike","ieps","'ki","i's","pke","pkee","peek","piek","iepk"]},"167":{"input":[1,2,3,6,8],"tlw":["zweep",76],"trw":["'wie",183],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["tip",323],"trp":["pit",1634],"tlw":["tip",80],"trw":["pitt",114],"lp":["tip"],"rp":["pit","pv","ipt","pti","pitt","pvi","itp"]},"169":{"input":[1,4,6,8],"tlp":["apit",813],"trp":["pva",678],"lp":["apit","tapi"],"rp":["pva","pati","pvat","pita","itpa"]},"170":{"input":[2,4,6,8],"tlp":["cip",273],"trp":["pitc",623],"tlw":["spits",84],"lp":["cip","stip","spit","scip","tips"],"rp":["pitc","pist","itsp","pisc","ptis","pits","pikt","pic","pick","psti"]},"171":{"input":[1,2,4,6,8],"trw":["pakt",384],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["riep",2691],"trp":["pri",3982],"tlw":["riep",2470],"trw":["piper",395],"lp":["riep","verp","rip","epti","ript"],"rp":["pri","pier","ierp","peri","pite","piet","prei","iper","iept","prie","ipte","perv","ptie","'v","priv"]},"173":{"input":[1,3,4,6,8],"trw":["papier",791],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["spreekt",454],"trw":["precies",2555],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["sprak",1554],"trw":["pakte",1998],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["mi",99056],"trw":["min",402],"lp":[],"rp":["mi","im","min","nmi","mmi","mh","ph","pni","imm","hip","nmin","pin","imp","inm","inmi","mmin","nip","mini","hm","phi"]},"177":{"input":[1,5,6,8],"tlp":["ami",5412],"trp":["hap",4798],"trw":["hap",187],"lp":["ami","zaam","zam","anmi"],"rp":["hap","mani","haam","ham","happ","ima","iam","pha","inam","mai","pani","mah","hamm","hamp","mha","mz"]},"178":{"input":[2,5,6,8],"tlp":["sim",1232],"trp":["mij",56462],"tlw":["spin",52],"trw":["mijn",42155],"lp":["sim","spij","simp","smi"],"rp":["mij","mijn","mis","miss","pij","ijp","pijn","mins","insp","knip","jim","mik","mmis","jimm","pijp","pijk"]},"179":{"input":[1,2,5,6,8],"tlw":["smaak",381],"trw":["kwam",9677],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["emi",1479],"trp":["hem",38924],"tlw":["eph",104],"trw":["hem",36783],"lp":["emi","eim","enmi","emmi","epin"],"rp":["hem","iem","mei","niem","'h","ime","pnie","'he","imme","heim","heme","hep","mhe","impe","meni"]},"181":{"input":[1,3,5,6,8],"tlw":["z'n",1280],"trw":["maxima",176],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"trw":["meisje",3089],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["zwemmen",284],"trw":["maken",6874],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tim",1065],"trp":["imt",1214],"tlw":["tim",122],"trw":["htm",71],"lp":["tim","tmi","timi"],"rp":["imt","mit","itm","ntim","htm","mbi","nipt","mv","mbin","imit","htp","miti","mith","mbit","mitt"]},"185":{"input":[1,4,5,6,8],"tlw":["fatima",79],"trw":["mattia",98],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"tlw":["schip",1068],"trw":["minst",275],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["tapijt",196],"trw":["maakt",1930],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["evenmin",310],"trw":["'het",1331],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"trw":["manier",3158],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["spreken",1283],"trw":["misschien",7594],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["amerikaanse",726],"trw":["maakte",4198],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["op",166993],"trw":["op",103035],"lp":[],"rp":["op","po","oop","opp","poo","pop","ppo","popp","opo"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["apo",574],"trp":["opa",966],"trw":["opa",532],"lp":["apo","appo"],"rp":["opa","oppa"]},"194":{"input":[2,7,8],"tlp":["spo",2653],"trp":["pos",1438],"trw":["poos",89],"lp":["spo","spoo","sop"],"rp":["pos","ops","poos","oops","pso","opsp","pspo"]},"195":{"input":[1,2,7,8],"tlp":["aspo",191],"trp":["opw",535],"trw":["oppas",51],"lp":["aspo"],"rp":["opw","pow"]},"196":{"input":[3,7,8],"tlp":["eop",278],"trp":["ope",17147],"trw":["'o",439],"lp":["eop","eope","eopo"],"rp":["ope","o'","oep","oppe","oepe","opee","poe","'o","-p","'op","-'","oo'","o-p","pope"]},"197":{"input":[1,3,7,8],"trp":["oepa",84],"lp":[],"rp":["oepa","-pa","o-pa"]},"198":{"input":[2,3,7,8],"tlp":["spoe",469],"trp":["o's",1470],"tlw":["soep",218],"trw":["poes",128],"lp":["spoe","dop","soep","so-p","dope","doop"],"rp":["o's","opd","poed","pod","opes","osep","poes","'do","'doe","oesp","'so","-sp"]},"199":{"input":[1,2,3,7,8],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["top",4647],"trp":["pg",6426],"tlw":["top",406],"trw":["pot",229],"lp":["top","topt","topp","gp","gop"],"rp":["pg","opg","opt","oopt","pot","pog","pott","poot","poog","pto","ptop","ogop"]},"201":{"input":[1,4,7,8],"tlp":["apot",426],"trp":["pag",1681],"trw":["pag",94],"lp":["apot","apto","gpa","gaap"],"rp":["pag","pga","opga","pgaa"]},"202":{"input":[2,4,7,8],"tlp":["stop",2723],"trp":["opst",808],"tlw":["stop",253],"trw":["post",353],"lp":["stop","spot","coop","sopg","gops","gsp"],"rp":["opst","post","psto","opsc"]},"203":{"input":[1,2,4,7,8],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["rop",6839],"trp":["pro",15569],"tlw":["erop",1554],"trw":["poort",291],"lp":["rop","roep","gep","erop","to'","gepr","grep","rope"],"rp":["pro","pge","opge","opte","por","port","orp","poor","oto'","oper","-top","opr"]},"205":{"input":[1,3,4,7,8],"tlw":["gepraat",288],"trw":["page",694],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["dorp",866],"trw":["proces",337],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"tlw":["waarop",2183],"trw":["professor",384],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["om",134142],"trw":["om",51031],"lp":[],"rp":["om","mo","moo","mon","pu","mom","um","mu","omm","nom","oom","opn","omp","onm","pun","up","num","muu","umm","numm"]},"209":{"input":[1,5,7,8],"tlp":["amo",374],"trp":["oma",3325],"trw":["oma",579],"lp":["amo","amon","anmo","aup","amu","aom"],"rp":["oma","pano","oman","pau","omaa","omma","opna","mau","opma","moa","onma","napo","naom","mano"]},"210":{"input":[2,5,7,8],"tlp":["som",5660],"trp":["oms",6883],"tlw":["soms",3682],"trw":["joop",104],"lp":["som","soms","somm","spu","sup","smo","spon","spun","sum"],"rp":["oms","mso","opj","mons","mos","mus","joop","nspo","ooms","nopj","pus"]},"211":{"input":[1,2,5,7,8],"trw":["mouw",188],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["enom",3098],"trp":["moe",46854],"trw":["open",4188],"lp":["enom","emo","emoe","epu"],"rp":["moe","ome","omen","open","oem","mome","o'n","noem","nome","omme","oeme","umme","ompe","ume","opme","umen"]},"213":{"input":[1,3,5,7,8],"trw":["opnamen",87],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["dom",313],"trw":["mond",3010],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["samenwonen",65],"trw":["panose-",1128],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["tom",2789],"trp":["mog",5827],"tlw":["boom",593],"trw":["punt",1157],"lp":["tom","tmo","bom","ttom","boom"],"rp":["mog","omt","punt","mot","mg","omg","ontm","ntmo","put","pub","nmog","moto","mob","omb","mput"]},"217":{"input":[1,4,5,7,8],"tlw":["tatum",76],"trw":["mag",2733],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["stom",368],"trw":["muts",127],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["spontaan",128],"trw":["opstaan",213],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["genomen",1400],"trw":["moet",11124],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["roman",605],"trw":["magere",261],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["sprong",808],"trw":["moest",9460],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["waarom",5384],"trw":["omdat",8221],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["pl",22888],"trw":["loop",1091],"lp":[],"rp":["pl","lop","lp","pol","poli","plo","loop","lip","lipp","opl","opi","pli","oplo","pil","lopi","olp","lopp","ipo","pill","ilip"]},"225":{"input":[1,6,7,8],"tlp":["alp",160],"trp":["pla",12933],"trw":["paal",163],"lp":["alp","appl","apl","apol"],"rp":["pla","plaa","lap","laap","opz","paal","opzi","pal","lapp","pzo","opzo","pala","opla","lpla","lpz","lpza"]},"226":{"input":[2,6,7,8],"tlp":["spl",351],"trp":["kop",4373],"tlw":["sloop",153],"trw":["kop",1414],"lp":["spl","slip"],"rp":["kop","klop","koop","posi","plos","opk","pols","kopp","ispl","pko","opko","ikop","kopl","kpl","kopi","pkl","lsp","ilsp"]},"227":{"input":[1,2,6,7,8],"tlw":["slaap",1052],"trw":["klap",617],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["elp",2649],"trp":["liep",7656],"trw":["liep",5744],"lp":["elp","elop","elpe","epl","epel"],"rp":["liep","pel","lope","ple","lpe","peel","pele","ppel","plee","peli","-pi","plei","ielp","ople","pell"]},"229":{"input":[1,3,6,7,8],"tlw":["appel",103],"trw":["'zo",172],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["speelde",689],"trw":["plek",1535],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["slappe",172],"trw":["'als",569],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["glip",148],"trp":["plot",2109],"tlw":["volop",111],"trw":["loopt",1197],"lp":["glip","glop","gpl"],"rp":["plot","pig","opv","lopt","pogi","opig","ppig","pvo","opvo","lpt","pvol","oopv","lipt","opti","potl","igp","ligp"]},"233":{"input":[1,4,6,7,8],"tlw":["afloop",252],"trw":["plat",242],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"trw":["pistool",468],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["slaapt",181],"trw":["plaats",3721],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"tlw":["voorlopig",401],"trw":["politie",1676],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"tlw":["april",288],"trw":["plezier",573],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["gesprek",1386],"trw":["periode",563],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["collega's",441],"trw":["opgewekt",248],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["mil",7222],"trw":["mooi",1931],"lp":[],"rp":["mil","lim","ml","mooi","iml","liml","lm","hoop","mili","uim","minu","omh","opni","ommi","lom","mho","omho","mhoo","hop","ulp"],"special":"enter"},"241":{"input":[1,5,6,7,8],"trw":["plan",1394],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["simon",579],"trw":["kom",2728],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["wanhoop",258],"trw":["opzij",767],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"trw":["lopen",2578],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["allemaal",4589],"trw":["helemaal",5218],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["spelen",1140],"trw":["komen",7764],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["slapen",1278],"trw":["opnieuw",2178],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"tlw":["glimp",157],"trw":["omhoog",1619],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["film",493],"trw":["langzaam",2034],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["schuim",127],"trw":["komt",4942],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["glimlach",1179],"trw":["lichaam",2366],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["ruimte",1214],"trw":["minuten",1824],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["familie",1891],"trw":["mezelf",1423],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["gekomen",2342],"trw":["mogelijk",2546],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["gemaakt",2371],"trw":["mevrouw",2250],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/num-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/num-keymap.json
new file mode 100644
index 00000000000..55ab69fca89
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/num-keymap.json
@@ -0,0 +1,2830 @@
+{
+ "0": {
+ "value": 0,
+ "notes": [
+ "Developer : Zack Dennis (zack@asetniop.com)",
+ "Date : 12/12/2014",
+ "All code (c) 2014 Pointesa, LLC all rights reserved",
+ "Abbreviations : ",
+ "tlp = top left partial",
+ "lp = left partials",
+ "trp = top right partial",
+ "rp = right partials",
+ "tlw = top left word",
+ "lw = left words",
+ "trw = top right word",
+ "rw = right words"
+ ]
+ },
+ "1": {
+ "input": [
+ 1
+ ],
+ "keys": "a",
+ "base": "1",
+ "baseshift": "!"
+ },
+ "2": {
+ "input": [
+ 2
+ ],
+ "keys": "s",
+ "base": "2",
+ "baseshift": "@"
+ },
+ "3": {
+ "input": [
+ 1,
+ 2
+ ],
+ "keys": "as",
+ "base": " ",
+ "baseshift": " "
+ },
+ "4": {
+ "input": [
+ 3
+ ],
+ "keys": "e",
+ "base": "3",
+ "baseshift": "#"
+ },
+ "5": {
+ "input": [
+ 1,
+ 3
+ ],
+ "keys": "ae",
+ "base": "`",
+ "baseshift": "~"
+ },
+ "6": {
+ "input": [
+ 2,
+ 3
+ ],
+ "keys": "se",
+ "base": "-",
+ "baseshift": "_"
+ },
+ "7": {
+ "input": [
+ 1,
+ 2,
+ 3
+ ],
+ "keys": "ase",
+ "base": "",
+ "baseshift": ""
+ },
+ "8": {
+ "input": [
+ 4
+ ],
+ "keys": "t",
+ "base": "4",
+ "baseshift": "$"
+ },
+ "9": {
+ "input": [
+ 1,
+ 4
+ ],
+ "keys": "at",
+ "base": "[",
+ "baseshift": "{"
+ },
+ "10": {
+ "input": [
+ 2,
+ 4
+ ],
+ "keys": "st",
+ "base": "Fn",
+ "baseshift": "Fn"
+ },
+ "11": {
+ "input": [
+ 1,
+ 2,
+ 4
+ ],
+ "keys": "ast",
+ "base": "",
+ "baseshift": ""
+ },
+ "12": {
+ "input": [
+ 3,
+ 4
+ ],
+ "keys": "et",
+ "base": "5",
+ "baseshift": "%"
+ },
+ "13": {
+ "input": [
+ 1,
+ 3,
+ 4
+ ],
+ "keys": "aet",
+ "base": "",
+ "baseshift": ""
+ },
+ "14": {
+ "input": [
+ 2,
+ 3,
+ 4
+ ],
+ "keys": "set",
+ "base": "",
+ "baseshift": ""
+ },
+ "15": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4
+ ],
+ "keys": "aset",
+ "base": "",
+ "baseshift": ""
+ },
+ "16": {
+ "input": [
+ 5
+ ],
+ "keys": "n",
+ "base": "7",
+ "baseshift": "&"
+ },
+ "17": {
+ "input": [
+ 1,
+ 5
+ ],
+ "keys": "an",
+ "base": " ",
+ "baseshift": " "
+ },
+ "18": {
+ "input": [
+ 2,
+ 5
+ ],
+ "keys": "sn",
+ "base": "End",
+ "baseshift": "End"
+ },
+ "19": {
+ "input": [
+ 1,
+ 2,
+ 5
+ ],
+ "keys": "asn",
+ "base": "",
+ "baseshift": ""
+ },
+ "20": {
+ "input": [
+ 3,
+ 5
+ ],
+ "keys": "en",
+ "base": "Home",
+ "baseshift": "Home"
+ },
+ "21": {
+ "input": [
+ 1,
+ 3,
+ 5
+ ],
+ "keys": "aen",
+ "base": "",
+ "baseshift": ""
+ },
+ "22": {
+ "input": [
+ 2,
+ 3,
+ 5
+ ],
+ "keys": "sen",
+ "base": "",
+ "baseshift": ""
+ },
+ "23": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 5
+ ],
+ "keys": "asen",
+ "base": "",
+ "baseshift": ""
+ },
+ "24": {
+ "input": [
+ 4,
+ 5
+ ],
+ "keys": "tn",
+ "base": "",
+ "baseshift": ""
+ },
+ "25": {
+ "input": [
+ 1,
+ 4,
+ 5
+ ],
+ "keys": "atn",
+ "base": "",
+ "baseshift": ""
+ },
+ "26": {
+ "input": [
+ 2,
+ 4,
+ 5
+ ],
+ "keys": "stn",
+ "base": "",
+ "baseshift": ""
+ },
+ "27": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 5
+ ],
+ "keys": "astn",
+ "base": "",
+ "baseshift": ""
+ },
+ "28": {
+ "input": [
+ 3,
+ 4,
+ 5
+ ],
+ "keys": "etn",
+ "base": "",
+ "baseshift": ""
+ },
+ "29": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 5
+ ],
+ "keys": "aetn",
+ "base": "",
+ "baseshift": ""
+ },
+ "30": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "keys": "setn",
+ "base": "",
+ "baseshift": ""
+ },
+ "31": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5
+ ],
+ "keys": "asetn",
+ "base": "",
+ "baseshift": ""
+ },
+ "32": {
+ "input": [
+ 6
+ ],
+ "keys": "i",
+ "base": "8",
+ "baseshift": "*"
+ },
+ "33": {
+ "input": [
+ 1,
+ 6
+ ],
+ "keys": "ai",
+ "base": "!",
+ "baseshift": "!"
+ },
+ "34": {
+ "input": [
+ 2,
+ 6
+ ],
+ "keys": "si",
+ "base": "=",
+ "baseshift": "+"
+ },
+ "35": {
+ "input": [
+ 1,
+ 2,
+ 6
+ ],
+ "keys": "asi",
+ "base": "",
+ "baseshift": ""
+ },
+ "36": {
+ "input": [
+ 3,
+ 6
+ ],
+ "keys": "ei",
+ "base": ",",
+ "baseshift": "<"
+ },
+ "37": {
+ "input": [
+ 1,
+ 3,
+ 6
+ ],
+ "keys": "aei",
+ "base": "",
+ "baseshift": ""
+ },
+ "38": {
+ "input": [
+ 2,
+ 3,
+ 6
+ ],
+ "keys": "sei",
+ "base": "",
+ "baseshift": ""
+ },
+ "39": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 6
+ ],
+ "keys": "asei",
+ "base": "",
+ "baseshift": ""
+ },
+ "40": {
+ "input": [
+ 4,
+ 6
+ ],
+ "keys": "ti",
+ "base": "",
+ "baseshift": ""
+ },
+ "41": {
+ "input": [
+ 1,
+ 4,
+ 6
+ ],
+ "keys": "ati",
+ "base": "",
+ "baseshift": ""
+ },
+ "42": {
+ "input": [
+ 2,
+ 4,
+ 6
+ ],
+ "keys": "sti",
+ "base": "",
+ "baseshift": ""
+ },
+ "43": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 6
+ ],
+ "keys": "asti",
+ "base": "",
+ "baseshift": ""
+ },
+ "44": {
+ "input": [
+ 3,
+ 4,
+ 6
+ ],
+ "keys": "eti",
+ "base": "",
+ "baseshift": ""
+ },
+ "45": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 6
+ ],
+ "keys": "aeti",
+ "base": "",
+ "baseshift": ""
+ },
+ "46": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 6
+ ],
+ "keys": "seti",
+ "base": "",
+ "baseshift": ""
+ },
+ "47": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 6
+ ],
+ "keys": "aseti",
+ "base": "",
+ "baseshift": ""
+ },
+ "48": {
+ "input": [
+ 5,
+ 6
+ ],
+ "keys": "ni",
+ "base": "6",
+ "baseshift": "^"
+ },
+ "49": {
+ "input": [
+ 1,
+ 5,
+ 6
+ ],
+ "keys": "ani",
+ "base": "",
+ "baseshift": ""
+ },
+ "50": {
+ "input": [
+ 2,
+ 5,
+ 6
+ ],
+ "keys": "sni",
+ "base": "",
+ "baseshift": ""
+ },
+ "51": {
+ "input": [
+ 1,
+ 2,
+ 5,
+ 6
+ ],
+ "keys": "asni",
+ "base": "",
+ "baseshift": ""
+ },
+ "52": {
+ "input": [
+ 3,
+ 5,
+ 6
+ ],
+ "keys": "eni",
+ "base": "",
+ "baseshift": ""
+ },
+ "53": {
+ "input": [
+ 1,
+ 3,
+ 5,
+ 6
+ ],
+ "keys": "aeni",
+ "base": "",
+ "baseshift": ""
+ },
+ "54": {
+ "input": [
+ 2,
+ 3,
+ 5,
+ 6
+ ],
+ "keys": "seni",
+ "base": "",
+ "baseshift": ""
+ },
+ "55": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 5,
+ 6
+ ],
+ "keys": "aseni",
+ "base": "",
+ "baseshift": ""
+ },
+ "56": {
+ "input": [
+ 4,
+ 5,
+ 6
+ ],
+ "keys": "tni",
+ "base": "",
+ "baseshift": ""
+ },
+ "57": {
+ "input": [
+ 1,
+ 4,
+ 5,
+ 6
+ ],
+ "keys": "atni",
+ "base": "",
+ "baseshift": ""
+ },
+ "58": {
+ "input": [
+ 2,
+ 4,
+ 5,
+ 6
+ ],
+ "keys": "stni",
+ "base": "",
+ "baseshift": ""
+ },
+ "59": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 5,
+ 6
+ ],
+ "keys": "astni",
+ "base": "",
+ "baseshift": ""
+ },
+ "60": {
+ "input": [
+ 3,
+ 4,
+ 5,
+ 6
+ ],
+ "keys": "etni",
+ "base": "",
+ "baseshift": ""
+ },
+ "61": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 5,
+ 6
+ ],
+ "keys": "aetni",
+ "base": "",
+ "baseshift": ""
+ },
+ "62": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6
+ ],
+ "keys": "setni",
+ "base": "",
+ "baseshift": ""
+ },
+ "63": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6
+ ],
+ "keys": "asetni",
+ "base": "",
+ "baseshift": ""
+ },
+ "64": {
+ "input": [
+ 7
+ ],
+ "keys": "o",
+ "base": "9",
+ "baseshift": "("
+ },
+ "65": {
+ "input": [
+ 1,
+ 7
+ ],
+ "keys": "ao",
+ "base": "(",
+ "baseshift": "("
+ },
+ "66": {
+ "input": [
+ 2,
+ 7
+ ],
+ "keys": "so",
+ "base": ".",
+ "baseshift": ">"
+ },
+ "67": {
+ "input": [
+ 1,
+ 2,
+ 7
+ ],
+ "keys": "aso",
+ "base": "",
+ "baseshift": ""
+ },
+ "68": {
+ "input": [
+ 3,
+ 7
+ ],
+ "keys": "eo",
+ "base": "-",
+ "baseshift": "_"
+ },
+ "69": {
+ "input": [
+ 1,
+ 3,
+ 7
+ ],
+ "keys": "aeo",
+ "base": "",
+ "baseshift": ""
+ },
+ "70": {
+ "input": [
+ 2,
+ 3,
+ 7
+ ],
+ "keys": "seo",
+ "base": "",
+ "baseshift": ""
+ },
+ "71": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 7
+ ],
+ "keys": "aseo",
+ "base": "",
+ "baseshift": ""
+ },
+ "72": {
+ "input": [
+ 4,
+ 7
+ ],
+ "keys": "to",
+ "base": "",
+ "baseshift": ""
+ },
+ "73": {
+ "input": [
+ 1,
+ 4,
+ 7
+ ],
+ "keys": "ato",
+ "base": "",
+ "baseshift": ""
+ },
+ "74": {
+ "input": [
+ 2,
+ 4,
+ 7
+ ],
+ "keys": "sto",
+ "base": "",
+ "baseshift": ""
+ },
+ "75": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 7
+ ],
+ "keys": "asto",
+ "base": "",
+ "baseshift": ""
+ },
+ "76": {
+ "input": [
+ 3,
+ 4,
+ 7
+ ],
+ "keys": "eto",
+ "base": "",
+ "baseshift": ""
+ },
+ "77": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 7
+ ],
+ "keys": "aeto",
+ "base": "",
+ "baseshift": ""
+ },
+ "78": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 7
+ ],
+ "keys": "seto",
+ "base": "",
+ "baseshift": ""
+ },
+ "79": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 7
+ ],
+ "keys": "aseto",
+ "base": "",
+ "baseshift": ""
+ },
+ "80": {
+ "input": [
+ 5,
+ 7
+ ],
+ "keys": "no",
+ "base": "Fn",
+ "baseshift": "Fn"
+ },
+ "81": {
+ "input": [
+ 1,
+ 5,
+ 7
+ ],
+ "keys": "ano",
+ "base": "",
+ "baseshift": ""
+ },
+ "82": {
+ "input": [
+ 2,
+ 5,
+ 7
+ ],
+ "keys": "sno",
+ "base": "",
+ "baseshift": ""
+ },
+ "83": {
+ "input": [
+ 1,
+ 2,
+ 5,
+ 7
+ ],
+ "keys": "asno",
+ "base": "",
+ "baseshift": ""
+ },
+ "84": {
+ "input": [
+ 3,
+ 5,
+ 7
+ ],
+ "keys": "eno",
+ "base": "",
+ "baseshift": ""
+ },
+ "85": {
+ "input": [
+ 1,
+ 3,
+ 5,
+ 7
+ ],
+ "keys": "aeno",
+ "base": "",
+ "baseshift": ""
+ },
+ "86": {
+ "input": [
+ 2,
+ 3,
+ 5,
+ 7
+ ],
+ "keys": "seno",
+ "base": "",
+ "baseshift": ""
+ },
+ "87": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 5,
+ 7
+ ],
+ "keys": "aseno",
+ "base": "",
+ "baseshift": ""
+ },
+ "88": {
+ "input": [
+ 4,
+ 5,
+ 7
+ ],
+ "keys": "tno",
+ "base": "",
+ "baseshift": ""
+ },
+ "89": {
+ "input": [
+ 1,
+ 4,
+ 5,
+ 7
+ ],
+ "keys": "atno",
+ "base": "",
+ "baseshift": ""
+ },
+ "90": {
+ "input": [
+ 2,
+ 4,
+ 5,
+ 7
+ ],
+ "keys": "stno",
+ "base": "",
+ "baseshift": ""
+ },
+ "91": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 5,
+ 7
+ ],
+ "keys": "astno",
+ "base": "",
+ "baseshift": ""
+ },
+ "92": {
+ "input": [
+ 3,
+ 4,
+ 5,
+ 7
+ ],
+ "keys": "etno",
+ "base": "",
+ "baseshift": ""
+ },
+ "93": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 5,
+ 7
+ ],
+ "keys": "aetno",
+ "base": "",
+ "baseshift": ""
+ },
+ "94": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 7
+ ],
+ "keys": "setno",
+ "base": "",
+ "baseshift": ""
+ },
+ "95": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 7
+ ],
+ "keys": "asetno",
+ "base": "",
+ "baseshift": ""
+ },
+ "96": {
+ "input": [
+ 6,
+ 7
+ ],
+ "keys": "io",
+ "base": "=",
+ "baseshift": "+"
+ },
+ "97": {
+ "input": [
+ 1,
+ 6,
+ 7
+ ],
+ "keys": "aio",
+ "base": "",
+ "baseshift": ""
+ },
+ "98": {
+ "input": [
+ 2,
+ 6,
+ 7
+ ],
+ "keys": "sio",
+ "base": "",
+ "baseshift": ""
+ },
+ "99": {
+ "input": [
+ 1,
+ 2,
+ 6,
+ 7
+ ],
+ "keys": "asio",
+ "base": "",
+ "baseshift": ""
+ },
+ "100": {
+ "input": [
+ 3,
+ 6,
+ 7
+ ],
+ "keys": "eio",
+ "base": "",
+ "baseshift": ""
+ },
+ "101": {
+ "input": [
+ 1,
+ 3,
+ 6,
+ 7
+ ],
+ "keys": "aeio",
+ "base": "",
+ "baseshift": ""
+ },
+ "102": {
+ "input": [
+ 2,
+ 3,
+ 6,
+ 7
+ ],
+ "keys": "seio",
+ "base": "",
+ "baseshift": ""
+ },
+ "103": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 6,
+ 7
+ ],
+ "keys": "aseio",
+ "base": "",
+ "baseshift": ""
+ },
+ "104": {
+ "input": [
+ 4,
+ 6,
+ 7
+ ],
+ "keys": "tio",
+ "base": "",
+ "baseshift": ""
+ },
+ "105": {
+ "input": [
+ 1,
+ 4,
+ 6,
+ 7
+ ],
+ "keys": "atio",
+ "base": "",
+ "baseshift": ""
+ },
+ "106": {
+ "input": [
+ 2,
+ 4,
+ 6,
+ 7
+ ],
+ "keys": "stio",
+ "base": "",
+ "baseshift": ""
+ },
+ "107": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 6,
+ 7
+ ],
+ "keys": "astio",
+ "base": "",
+ "baseshift": ""
+ },
+ "108": {
+ "input": [
+ 3,
+ 4,
+ 6,
+ 7
+ ],
+ "keys": "etio",
+ "base": "",
+ "baseshift": ""
+ },
+ "109": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 6,
+ 7
+ ],
+ "keys": "aetio",
+ "base": "",
+ "baseshift": ""
+ },
+ "110": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 6,
+ 7
+ ],
+ "keys": "setio",
+ "base": "",
+ "baseshift": ""
+ },
+ "111": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 6,
+ 7
+ ],
+ "keys": "asetio",
+ "base": "",
+ "baseshift": ""
+ },
+ "112": {
+ "input": [
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "nio",
+ "base": "",
+ "baseshift": ""
+ },
+ "113": {
+ "input": [
+ 1,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "anio",
+ "base": "",
+ "baseshift": ""
+ },
+ "114": {
+ "input": [
+ 2,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "snio",
+ "base": "",
+ "baseshift": ""
+ },
+ "115": {
+ "input": [
+ 1,
+ 2,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "asnio",
+ "base": "",
+ "baseshift": ""
+ },
+ "116": {
+ "input": [
+ 3,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "enio",
+ "base": "",
+ "baseshift": ""
+ },
+ "117": {
+ "input": [
+ 1,
+ 3,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "aenio",
+ "base": "",
+ "baseshift": ""
+ },
+ "118": {
+ "input": [
+ 2,
+ 3,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "senio",
+ "base": "",
+ "baseshift": ""
+ },
+ "119": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "asenio",
+ "base": "",
+ "baseshift": ""
+ },
+ "120": {
+ "input": [
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "tnio",
+ "base": "",
+ "baseshift": ""
+ },
+ "121": {
+ "input": [
+ 1,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "atnio",
+ "base": "",
+ "baseshift": ""
+ },
+ "122": {
+ "input": [
+ 2,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "stnio",
+ "base": "",
+ "baseshift": ""
+ },
+ "123": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "astnio",
+ "base": "",
+ "baseshift": ""
+ },
+ "124": {
+ "input": [
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "etnio",
+ "base": "",
+ "baseshift": ""
+ },
+ "125": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "aetnio",
+ "base": "",
+ "baseshift": ""
+ },
+ "126": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "setnio",
+ "base": "",
+ "baseshift": ""
+ },
+ "127": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7
+ ],
+ "keys": "asetnio",
+ "base": "",
+ "baseshift": ""
+ },
+ "128": {
+ "input": [
+ 8
+ ],
+ "keys": "p",
+ "base": "0",
+ "baseshift": ")"
+ },
+ "129": {
+ "input": [
+ 1,
+ 8
+ ],
+ "keys": "ap",
+ "base": "?",
+ "baseshift": "/"
+ },
+ "130": {
+ "input": [
+ 2,
+ 8
+ ],
+ "keys": "sp",
+ "base": ")",
+ "baseshift": ")"
+ },
+ "131": {
+ "input": [
+ 1,
+ 2,
+ 8
+ ],
+ "keys": "asp",
+ "base": "",
+ "baseshift": ""
+ },
+ "132": {
+ "input": [
+ 3,
+ 8
+ ],
+ "keys": "ep",
+ "base": "'",
+ "baseshift": "'"
+ },
+ "133": {
+ "input": [
+ 1,
+ 3,
+ 8
+ ],
+ "keys": "aep",
+ "base": "",
+ "baseshift": ""
+ },
+ "134": {
+ "input": [
+ 2,
+ 3,
+ 8
+ ],
+ "keys": "sep",
+ "base": "",
+ "baseshift": ""
+ },
+ "135": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 8
+ ],
+ "keys": "asep",
+ "base": "",
+ "baseshift": ""
+ },
+ "136": {
+ "input": [
+ 4,
+ 8
+ ],
+ "keys": "tp",
+ "base": "",
+ "baseshift": "",
+ "special": "bksp"
+ },
+ "137": {
+ "input": [
+ 1,
+ 4,
+ 8
+ ],
+ "keys": "atp",
+ "base": "",
+ "baseshift": ""
+ },
+ "138": {
+ "input": [
+ 2,
+ 4,
+ 8
+ ],
+ "keys": "stp",
+ "base": "",
+ "baseshift": ""
+ },
+ "139": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 8
+ ],
+ "keys": "astp",
+ "base": "",
+ "baseshift": ""
+ },
+ "140": {
+ "input": [
+ 3,
+ 4,
+ 8
+ ],
+ "keys": "etp",
+ "base": "",
+ "baseshift": ""
+ },
+ "141": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 8
+ ],
+ "keys": "aetp",
+ "base": "",
+ "baseshift": ""
+ },
+ "142": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 8
+ ],
+ "keys": "setp",
+ "base": "",
+ "baseshift": ""
+ },
+ "143": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 8
+ ],
+ "keys": "asetp",
+ "base": "",
+ "baseshift": ""
+ },
+ "144": {
+ "input": [
+ 5,
+ 8
+ ],
+ "keys": "np",
+ "base": "]",
+ "baseshift": "}"
+ },
+ "145": {
+ "input": [
+ 1,
+ 5,
+ 8
+ ],
+ "keys": "anp",
+ "base": "",
+ "baseshift": ""
+ },
+ "146": {
+ "input": [
+ 2,
+ 5,
+ 8
+ ],
+ "keys": "snp",
+ "base": "",
+ "baseshift": ""
+ },
+ "147": {
+ "input": [
+ 1,
+ 2,
+ 5,
+ 8
+ ],
+ "keys": "asnp",
+ "base": "",
+ "baseshift": ""
+ },
+ "148": {
+ "input": [
+ 3,
+ 5,
+ 8
+ ],
+ "keys": "enp",
+ "base": "",
+ "baseshift": ""
+ },
+ "149": {
+ "input": [
+ 1,
+ 3,
+ 5,
+ 8
+ ],
+ "keys": "aenp",
+ "base": "",
+ "baseshift": ""
+ },
+ "150": {
+ "input": [
+ 2,
+ 3,
+ 5,
+ 8
+ ],
+ "keys": "senp",
+ "base": "",
+ "baseshift": ""
+ },
+ "151": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 5,
+ 8
+ ],
+ "keys": "asenp",
+ "base": "",
+ "baseshift": ""
+ },
+ "152": {
+ "input": [
+ 4,
+ 5,
+ 8
+ ],
+ "keys": "tnp",
+ "base": "",
+ "baseshift": ""
+ },
+ "153": {
+ "input": [
+ 1,
+ 4,
+ 5,
+ 8
+ ],
+ "keys": "atnp",
+ "base": "LETTERS",
+ "baseshift": "LETTERS",
+ "special": "letters"
+ },
+ "154": {
+ "input": [
+ 2,
+ 4,
+ 5,
+ 8
+ ],
+ "keys": "stnp",
+ "base": "",
+ "baseshift": ""
+ },
+ "155": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 5,
+ 8
+ ],
+ "keys": "astnp",
+ "base": "",
+ "baseshift": ""
+ },
+ "156": {
+ "input": [
+ 3,
+ 4,
+ 5,
+ 8
+ ],
+ "keys": "etnp",
+ "base": "",
+ "baseshift": ""
+ },
+ "157": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 5,
+ 8
+ ],
+ "keys": "aetnp",
+ "base": "",
+ "baseshift": ""
+ },
+ "158": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 8
+ ],
+ "keys": "setnp",
+ "base": "",
+ "baseshift": ""
+ },
+ "159": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 8
+ ],
+ "keys": "asetnp",
+ "base": "",
+ "baseshift": ""
+ },
+ "160": {
+ "input": [
+ 6,
+ 8
+ ],
+ "keys": "ip",
+ "base": "",
+ "baseshift": "|"
+ },
+ "161": {
+ "input": [
+ 1,
+ 6,
+ 8
+ ],
+ "keys": "aip",
+ "base": "",
+ "baseshift": ""
+ },
+ "162": {
+ "input": [
+ 2,
+ 6,
+ 8
+ ],
+ "keys": "sip",
+ "base": "",
+ "baseshift": ""
+ },
+ "163": {
+ "input": [
+ 1,
+ 2,
+ 6,
+ 8
+ ],
+ "keys": "asip",
+ "base": "",
+ "baseshift": ""
+ },
+ "164": {
+ "input": [
+ 3,
+ 6,
+ 8
+ ],
+ "keys": "eip",
+ "base": "",
+ "baseshift": ""
+ },
+ "165": {
+ "input": [
+ 1,
+ 3,
+ 6,
+ 8
+ ],
+ "keys": "aeip",
+ "base": "",
+ "baseshift": ""
+ },
+ "166": {
+ "input": [
+ 2,
+ 3,
+ 6,
+ 8
+ ],
+ "keys": "seip",
+ "base": "",
+ "baseshift": ""
+ },
+ "167": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 6,
+ 8
+ ],
+ "keys": "aseip",
+ "base": "",
+ "baseshift": ""
+ },
+ "168": {
+ "input": [
+ 4,
+ 6,
+ 8
+ ],
+ "keys": "tip",
+ "base": "",
+ "baseshift": ""
+ },
+ "169": {
+ "input": [
+ 1,
+ 4,
+ 6,
+ 8
+ ],
+ "keys": "atip",
+ "base": "",
+ "baseshift": ""
+ },
+ "170": {
+ "input": [
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "keys": "stip",
+ "base": "",
+ "baseshift": ""
+ },
+ "171": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 6,
+ 8
+ ],
+ "keys": "astip",
+ "base": "",
+ "baseshift": ""
+ },
+ "172": {
+ "input": [
+ 3,
+ 4,
+ 6,
+ 8
+ ],
+ "keys": "etip",
+ "base": "",
+ "baseshift": ""
+ },
+ "173": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 6,
+ 8
+ ],
+ "keys": "aetip",
+ "base": "",
+ "baseshift": ""
+ },
+ "174": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 6,
+ 8
+ ],
+ "keys": "setip",
+ "base": "",
+ "baseshift": ""
+ },
+ "175": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 6,
+ 8
+ ],
+ "keys": "asetip",
+ "base": "",
+ "baseshift": ""
+ },
+ "176": {
+ "input": [
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "nip",
+ "base": "",
+ "baseshift": ""
+ },
+ "177": {
+ "input": [
+ 1,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "anip",
+ "base": "",
+ "baseshift": ""
+ },
+ "178": {
+ "input": [
+ 2,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "snip",
+ "base": "",
+ "baseshift": ""
+ },
+ "179": {
+ "input": [
+ 1,
+ 2,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "asnip",
+ "base": "",
+ "baseshift": ""
+ },
+ "180": {
+ "input": [
+ 3,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "enip",
+ "base": "",
+ "baseshift": ""
+ },
+ "181": {
+ "input": [
+ 1,
+ 3,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "aenip",
+ "base": "",
+ "baseshift": ""
+ },
+ "182": {
+ "input": [
+ 2,
+ 3,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "senip",
+ "base": "",
+ "baseshift": ""
+ },
+ "183": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "asenip",
+ "base": "",
+ "baseshift": ""
+ },
+ "184": {
+ "input": [
+ 4,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "tnip",
+ "base": "",
+ "baseshift": ""
+ },
+ "185": {
+ "input": [
+ 1,
+ 4,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "atnip",
+ "base": "",
+ "baseshift": ""
+ },
+ "186": {
+ "input": [
+ 2,
+ 4,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "stnip",
+ "base": "",
+ "baseshift": ""
+ },
+ "187": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "astnip",
+ "base": "",
+ "baseshift": ""
+ },
+ "188": {
+ "input": [
+ 3,
+ 4,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "etnip",
+ "base": "",
+ "baseshift": ""
+ },
+ "189": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "aetnip",
+ "base": "",
+ "baseshift": ""
+ },
+ "190": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "setnip",
+ "base": "",
+ "baseshift": ""
+ },
+ "191": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 8
+ ],
+ "keys": "asetnip",
+ "base": "",
+ "baseshift": ""
+ },
+ "192": {
+ "input": [
+ 7,
+ 8
+ ],
+ "keys": "op",
+ "base": ";",
+ "baseshift": ":"
+ },
+ "193": {
+ "input": [
+ 1,
+ 7,
+ 8
+ ],
+ "keys": "aop",
+ "base": "",
+ "baseshift": ""
+ },
+ "194": {
+ "input": [
+ 2,
+ 7,
+ 8
+ ],
+ "keys": "sop",
+ "base": "",
+ "baseshift": ""
+ },
+ "195": {
+ "input": [
+ 1,
+ 2,
+ 7,
+ 8
+ ],
+ "keys": "asop",
+ "base": "",
+ "baseshift": ""
+ },
+ "196": {
+ "input": [
+ 3,
+ 7,
+ 8
+ ],
+ "keys": "eop",
+ "base": "",
+ "baseshift": ""
+ },
+ "197": {
+ "input": [
+ 1,
+ 3,
+ 7,
+ 8
+ ],
+ "keys": "aeop",
+ "base": "",
+ "baseshift": ""
+ },
+ "198": {
+ "input": [
+ 2,
+ 3,
+ 7,
+ 8
+ ],
+ "keys": "seop",
+ "base": "",
+ "baseshift": ""
+ },
+ "199": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 7,
+ 8
+ ],
+ "keys": "aseop",
+ "base": "",
+ "baseshift": ""
+ },
+ "200": {
+ "input": [
+ 4,
+ 7,
+ 8
+ ],
+ "keys": "top",
+ "base": "",
+ "baseshift": ""
+ },
+ "201": {
+ "input": [
+ 1,
+ 4,
+ 7,
+ 8
+ ],
+ "keys": "atop",
+ "base": "",
+ "baseshift": ""
+ },
+ "202": {
+ "input": [
+ 2,
+ 4,
+ 7,
+ 8
+ ],
+ "keys": "stop",
+ "base": "",
+ "baseshift": ""
+ },
+ "203": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 7,
+ 8
+ ],
+ "keys": "astop",
+ "base": "",
+ "baseshift": ""
+ },
+ "204": {
+ "input": [
+ 3,
+ 4,
+ 7,
+ 8
+ ],
+ "keys": "etop",
+ "base": "",
+ "baseshift": ""
+ },
+ "205": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 7,
+ 8
+ ],
+ "keys": "aetop",
+ "base": "",
+ "baseshift": ""
+ },
+ "206": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 7,
+ 8
+ ],
+ "keys": "setop",
+ "base": "",
+ "baseshift": ""
+ },
+ "207": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 7,
+ 8
+ ],
+ "keys": "asetop",
+ "base": "",
+ "baseshift": ""
+ },
+ "208": {
+ "input": [
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "nop",
+ "base": "",
+ "baseshift": ""
+ },
+ "209": {
+ "input": [
+ 1,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "anop",
+ "base": "",
+ "baseshift": ""
+ },
+ "210": {
+ "input": [
+ 2,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "snop",
+ "base": "",
+ "baseshift": ""
+ },
+ "211": {
+ "input": [
+ 1,
+ 2,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "asnop",
+ "base": "",
+ "baseshift": ""
+ },
+ "212": {
+ "input": [
+ 3,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "enop",
+ "base": "",
+ "baseshift": ""
+ },
+ "213": {
+ "input": [
+ 1,
+ 3,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "aenop",
+ "base": "",
+ "baseshift": ""
+ },
+ "214": {
+ "input": [
+ 2,
+ 3,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "senop",
+ "base": "",
+ "baseshift": ""
+ },
+ "215": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "asenop",
+ "base": "",
+ "baseshift": ""
+ },
+ "216": {
+ "input": [
+ 4,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "tnop",
+ "base": "",
+ "baseshift": ""
+ },
+ "217": {
+ "input": [
+ 1,
+ 4,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "atnop",
+ "base": "",
+ "baseshift": ""
+ },
+ "218": {
+ "input": [
+ 2,
+ 4,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "stnop",
+ "base": "",
+ "baseshift": ""
+ },
+ "219": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "astnop",
+ "base": "",
+ "baseshift": ""
+ },
+ "220": {
+ "input": [
+ 3,
+ 4,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "etnop",
+ "base": "",
+ "baseshift": ""
+ },
+ "221": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "aetnop",
+ "base": "",
+ "baseshift": ""
+ },
+ "222": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "setnop",
+ "base": "",
+ "baseshift": ""
+ },
+ "223": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 7,
+ 8
+ ],
+ "keys": "asetnop",
+ "base": "",
+ "baseshift": ""
+ },
+ "224": {
+ "input": [
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "iop",
+ "base": "",
+ "baseshift": ""
+ },
+ "225": {
+ "input": [
+ 1,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "aiop",
+ "base": "",
+ "baseshift": ""
+ },
+ "226": {
+ "input": [
+ 2,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "siop",
+ "base": "",
+ "baseshift": ""
+ },
+ "227": {
+ "input": [
+ 1,
+ 2,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "asiop",
+ "base": "",
+ "baseshift": ""
+ },
+ "228": {
+ "input": [
+ 3,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "eiop",
+ "base": "",
+ "baseshift": ""
+ },
+ "229": {
+ "input": [
+ 1,
+ 3,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "aeiop",
+ "base": "",
+ "baseshift": ""
+ },
+ "230": {
+ "input": [
+ 2,
+ 3,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "seiop",
+ "base": "",
+ "baseshift": ""
+ },
+ "231": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "aseiop",
+ "base": "",
+ "baseshift": ""
+ },
+ "232": {
+ "input": [
+ 4,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "tiop",
+ "base": "",
+ "baseshift": ""
+ },
+ "233": {
+ "input": [
+ 1,
+ 4,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "atiop",
+ "base": "",
+ "baseshift": ""
+ },
+ "234": {
+ "input": [
+ 2,
+ 4,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "stiop",
+ "base": "",
+ "baseshift": ""
+ },
+ "235": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "astiop",
+ "base": "",
+ "baseshift": ""
+ },
+ "236": {
+ "input": [
+ 3,
+ 4,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "etiop",
+ "base": "",
+ "baseshift": ""
+ },
+ "237": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "aetiop",
+ "base": "",
+ "baseshift": ""
+ },
+ "238": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "setiop",
+ "base": "",
+ "baseshift": ""
+ },
+ "239": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "asetiop",
+ "base": "",
+ "baseshift": ""
+ },
+ "240": {
+ "input": [
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "niop",
+ "base": " ",
+ "baseshift": " "
+ },
+ "241": {
+ "input": [
+ 1,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "aniop",
+ "base": "",
+ "baseshift": ""
+ },
+ "242": {
+ "input": [
+ 2,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "sniop",
+ "base": "",
+ "baseshift": ""
+ },
+ "243": {
+ "input": [
+ 1,
+ 2,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "asniop",
+ "base": "",
+ "baseshift": ""
+ },
+ "244": {
+ "input": [
+ 3,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "eniop",
+ "base": "",
+ "baseshift": ""
+ },
+ "245": {
+ "input": [
+ 1,
+ 3,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "aeniop",
+ "base": "",
+ "baseshift": ""
+ },
+ "246": {
+ "input": [
+ 2,
+ 3,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "seniop",
+ "base": "",
+ "baseshift": ""
+ },
+ "247": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "aseniop",
+ "base": "",
+ "baseshift": ""
+ },
+ "248": {
+ "input": [
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "tniop",
+ "base": "",
+ "baseshift": ""
+ },
+ "249": {
+ "input": [
+ 1,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "atniop",
+ "base": "",
+ "baseshift": ""
+ },
+ "250": {
+ "input": [
+ 2,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "stniop",
+ "base": "",
+ "baseshift": ""
+ },
+ "251": {
+ "input": [
+ 1,
+ 2,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "astniop",
+ "base": "",
+ "baseshift": ""
+ },
+ "252": {
+ "input": [
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "etniop",
+ "base": "",
+ "baseshift": ""
+ },
+ "253": {
+ "input": [
+ 1,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "aetniop",
+ "base": "",
+ "baseshift": ""
+ },
+ "254": {
+ "input": [
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "setniop",
+ "base": "",
+ "baseshift": ""
+ },
+ "255": {
+ "input": [
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8
+ ],
+ "keys": "asetniop",
+ "base": "SPACE",
+ "baseshift": ""
+ }
+}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/nw-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/nw-keymap.json
new file mode 100644
index 00000000000..a326e75806c
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/nw-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",112911],"tlw":["a",7695],"lp":["aa","aaa"],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",10806],"tlw":["s",577],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["sa",77058],"tlw":["saa",19034],"lp":["sa","saa","as","aas","ass","ssa","wa","saas","asa","waa","ssaa","asaa","saaa","assa","aasa"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",6166],"tlw":["e",308],"lp":["ee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ae",70925],"tlw":["ex",147],"lp":["ae","aae","ea","ax","ex","aee","xe","exe","xa","exa","axe"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["de",411497],"tlw":["de",31445],"lp":["de","ed","se","es","ede","dd","dde","ds","des","sse","edes","dse","eds","see","ess","ese","edd","esse","edde","sed"],"rp":[]},"7":{"input":[1,2,3],"tlp":["da",41689],"tlw":["da",17989],"lp":["da","ad","add","adde","ade","aad","aes","aed","sae","aade","aede","ada","daa","dda","sad","asse","aese","saad","aada","ads"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",41039],"tlw":["t",37],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["at",83084],"tlw":["at",55917],"lp":["at","ta","fa","af","ft","att","aat","faa","taa","aatt","ff","aft","fat","tat","tta","aff","fatt","tf","tatt","ata"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["st",98189],"tlw":["st",132],"lp":["st","ts","sst","sc","tst","ct","tc","cc","tts","tss"],"rp":[]},"11":{"input":[1,2,4],"tlp":["sta",12336],"tlw":["sat",1574],"lp":["sta","ast","sat","staa","satt","tsa","ca","fas","fast","tsaa","fs","afs","ac","stat","fst","afst","ats","tats","tsat","asta"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["er",261904],"tlw":["er",33906],"lp":["er","et","te","re","rt","ere","tte","ter","tr","ett","ette","ret","rte","rr","ert","tter","tet","rre","err","tre"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ar",123529],"tlw":["fra",10890],"lp":["ar","ra","fr","aer","fra","aar","aere","fte","are","ef","atte","art","tra","eft","fter","efte","rae","fe","fre","tae"],"rp":[]},"14":{"input":[2,3,4],"tlp":["det",95805],"tlw":["det",77200],"lp":["det","der","ste","dt","rd","dr","rs","est","dre","rde","este","rst","res","red","dett","str","dte","ser","ers","erd"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["ard",3773],"tlw":["satte",1224],"lp":["ard","aest","stra","aerd","dra","ader","saet","derf","aste","rda","tad","rad","raad","stae","aard","stad","raed","fred","rsta","ras"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",37980],"trw":["n",328],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",164272],"trp":["na",33880],"tlw":["anna",1134],"trw":["na",964],"lp":["an","ann","aan","anna","ana"],"rp":["na","naa","nna","nan","nnan","nann","nana"]},"18":{"input":[2,5],"base":"j","baseshift":"J","tlp":["sn",5809],"trp":["ns",30049],"trw":["j",102],"lp":["sn","sj","ssn"],"rp":["ns","nj","jn","js","nns","nss","nsn"]},"19":{"input":[1,2,5],"tlp":["ans",16881],"trp":["ja",19604],"tlw":["sja",654],"trw":["ja",6049],"lp":["ans","sna","san","sja","aj","ansa","sjaa","sann","asj","aja","ssan","asn"],"rp":["ja","jaa","nja","nsa","nas","jan","njaa","nasj"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",321311],"trp":["ne",82848],"tlw":["en",38749],"trw":["nye",777],"lp":["en","enn","enne","ene","een","enen","ey"],"rp":["ne","nne","yn","nen","ny","ye","yne","nnen","nene","yen","nye","nny","nee"]},"21":{"input":[1,3,5],"tlp":["aen",13038],"trp":["nae",5436],"tlw":["annen",219],"trw":["naae",45],"lp":["aen","anne","ane","aaen","enna","anny","anen","aane","aene","ena","any","aany","enan","xan","exan"],"rp":["nae","naae","yna","ya","naee"]},"22":{"input":[2,3,5],"tlp":["den",74661],"trp":["nd",121952],"tlw":["den",37787],"trw":["ned",3945],"lp":["den","end","ende","sen","ens","denn","sy","syn","dn"],"rp":["nd","je","nde","jen","nden","nes","ned","ys","yd","nnes","ndes"]},"23":{"input":[1,2,3,5],"tlp":["and",33662],"trp":["jae",5122],"tlw":["anden",2420],"trw":["naade",166],"lp":["and","ande","dan","aend","aand","adan","sand","anse","enda","ands","aden","dans","dann","anda","sjae"],"rp":["jae","nda","naes","nand","ndda"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["tn",2343],"trp":["nt",20514],"tlw":["b",230],"trw":["nb",169],"lp":["tn","bt","bn","bb","tb","ttn"],"rp":["nt","nb","nnt","ntn"]},"25":{"input":[1,4,5],"tlp":["ba",17182],"trp":["nat",3688],"tlw":["fann",272],"trw":["nat",367],"lp":["ba","tan","ab","ant","fan","aab","baa","ban","abt","fann","abn","aabn","tab","aabt","anta","fant"],"rp":["nat","nf","natt","nta"]},"26":{"input":[2,4,5],"tlp":["bj",1597],"trp":["nst",1389],"lp":["bj","tj","sb","stn","bs","sbn","stj","sbj","stb","tsb","tsj","bst"],"rp":["nst","jst","jt","nc","jtn","nsc","nnst","nstn"]},"27":{"input":[1,2,4,5],"tlp":["stan",2679],"trp":["nsta",211],"tlw":["sant",289],"trw":["jf",31],"lp":["stan","fj","tans","sant","tja","bas","abs","anst","anc","fja","asb","asbj","stba","bja","tanc"],"rp":["nsta","jac","nast","jtna","ntas"]},"28":{"input":[3,4,5],"tlp":["be",28242],"trp":["nte",10150],"tlw":["berre",1003],"trw":["nyt",327],"lp":["be","ten","ren","rn","br","ent","rne","ern","erne","ty","ry","ber","ente","eb","rb","eren"],"rp":["nte","ner","yr","net"]},"29":{"input":[1,3,4,5],"tlp":["bar",6004],"trp":["nar",6320],"tlw":["bare",3028],"trw":["naar",5355],"lp":["bar","ran","taen","bare","fy","bra","arn","fyr","aren","ften","abe","barn","raen","arb","bae"],"rp":["nar","naar","naer","nnar","nart"]},"30":{"input":[2,3,4,5],"tlp":["sten",6428],"trp":["nder",11117],"tlw":["syntes",1260],"lp":["sten","bes","endt","rden","bed","sty","best","rend","dern","synt"],"rp":["nder","ndt","ndr","ndre","jer","ndet","ndte","yst","nest","jern"]},"31":{"input":[1,2,3,4,5],"tlw":["andre",3868],"trw":["naesten",1049],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",1106],"trw":["i",62852],"lp":[],"rp":["ii","iii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["ai",969],"trp":["ia",2946],"tlw":["ai",51],"lp":["ai","aai","za"],"rp":["ia","iaa"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["si",57626],"trp":["kk",58266],"tlw":["si",1195],"trw":["k",1220],"lp":["si","sk","ski","sik","sikk","skik","sis"],"rp":["kk","ik","ikk","is","ki","ks","iss","isk","kik","iks","kki","ikki","kikk"]},"35":{"input":[1,2,6],"tlp":["ak",14837],"trp":["ka",36672],"tlw":["saki",383],"trw":["ka",36],"lp":["ak","ska","akk","ask","aks","sak","aka","aask","akka","aki","saki","sia","aak","skaa"],"rp":["ka","kas","kka","isa","kaa","ika"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",46211],"trp":["ie",12197],"tlw":["ei",2621],"lp":["ei","eie"],"rp":["ie"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["xi",72],"trp":["iae",68],"tlw":["xi",27],"trw":["ix",27],"lp":["xi","aei","eia","xii","xiii"],"rp":["iae","ix"]},"38":{"input":[2,3,6],"tlp":["di",22778],"trp":["ke",75425],"tlw":["dei",9926],"trw":["ikke",27380],"lp":["di","ske","dei","ek","sid","ekk","side","esk","eis","eske","dis","eid"],"rp":["ke","kke","id","ikke","ide","ids","ise","isse"]},"39":{"input":[1,2,3,6],"tlp":["akke",3114],"trp":["ida",2239],"tlw":["skade",227],"trw":["kasse",30],"lp":["akke","aek","aekk","ake","aske","sida","adi","daek","ekka","skad","adsk","akse","eska","dska"],"rp":["ida","idda","isae","kad","kade","kae"]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",75549],"trp":["it",21023],"tlw":["vi",9397],"trw":["iv",58],"lp":["ti","vi","tv","vit","vt","tti","tvi","viv","tviv","vii","tiv","vitt","tit"],"rp":["it","iv","itt","iti","ivi","itti","ivt"]},"41":{"input":[1,4,6],"tlp":["va",86367],"trp":["if",2566],"tlw":["av",10474],"lp":["va","av","fi","vaa","ava","avt","avi","fti","tia","atti","aav","vat","ati","vita","aavi"],"rp":["if","ift","ita","iva","iaf"]},"42":{"input":[2,4,6],"tlp":["vis",9768],"trp":["kt",8569],"tlw":["sit",3082],"trw":["kvit",106],"lp":["vis","sv","sti","sit","viss","vist","sitt","vs","ci","ck","vst"],"rp":["kt","ist","kv","kvi","isst","ic","ikt","isti","kst"]},"43":{"input":[1,2,4,6],"tlp":["sva",5726],"trp":["kva",3206],"tlw":["fik",2530],"trw":["kva",1095],"lp":["sva","tak","fik","takk","akt","vak","stak","stia","fis","fisk","taka","vakk","fikk"],"rp":["kva","kast","kaf","ica","kaff","ista","kat"]},"44":{"input":[3,4,6],"tlp":["ve",84601],"trp":["ir",9659],"tlw":["eit",2100],"lp":["ve","ri","ver","ev","eve","vet","rei","eit","vei","rti","rv","rev","eri","eir","eier"],"rp":["ir","ive","ier","ite","iver"]},"45":{"input":[1,3,4,6],"tlp":["var",53426],"trp":["ifte",820],"tlw":["var",42028],"lp":["var","vae","vaer","ave","vart","vera","vare","fri","eva","aev","vara","arv","ari","rav","aeve","arve","fie","evae","fir"],"rp":["ifte"]},"46":{"input":[2,3,4,6],"tlp":["ved",13498],"trp":["kr",10422],"tlw":["ved",10508],"trw":["idet",890],"lp":["ved","vd","rk","vde","tid","rke","dri","vid","erk","skr","rdi"],"rp":["kr","ker","ket","idt","kri","kte","kker","iste","idst"]},"47":{"input":[1,2,3,4,6],"tlw":["fekk",1380],"trw":["kvar",593],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["in",88711],"trw":["inn",1636],"lp":[],"rp":["in","ni","hi","nin","inn","nh","hin","nhi","ih","nni","iin","nnin","hn","inni","ini","inin","nnh","hii","hiin","nnhi"]},"49":{"input":[1,5,6],"tlp":["ani",619],"trp":["ha",134263],"tlw":["ah",106],"trw":["han",52972],"lp":["ani","ania","ah","ain","anni"],"rp":["ha","han","haa","haan","ina","ian","inan","hina","nia","hann","iani","inna","nha","iana","nz"]},"50":{"input":[2,5,6],"tlp":["sin",12978],"trp":["kj",25013],"tlw":["sin",8225],"trw":["nik",27],"lp":["sin","skj","skin","sni","sh"],"rp":["kj","nk","kkj","ikkj","hj","nsk","kn","nsi","kin","ink","ins","his","nkj","kni","inkj"]},"51":{"input":[1,2,5,6],"tlp":["ansk",3797],"trp":["kan",11435],"tlw":["sank",208],"trw":["hans",8898],"lp":["ansk","ank","ansi","snak","skja","sank","ash","akn"],"rp":["kan","hans","kja","nak","nakk","hja","kans","hak","kann","kna","nska","has"]},"52":{"input":[3,5,6],"tlp":["ein",9181],"trp":["he",52514],"tlw":["ein",5538],"trw":["henne",2515],"lp":["ein","eh","enh","eni","eine","eien","enin","enhe"],"rp":["he","hen","ine","henn","hei","nei","ien","inne","hy","inen","nhe","ihe"]},"53":{"input":[1,3,5,6],"tlp":["eha",758],"trp":["hae",2400],"tlw":["einannan",141],"trw":["hena",63],"lp":["eha","enha","eina","ehan","anie","enia","enz","aine","anei","ahy","ehaa","aein","einz"],"rp":["hae","haen","iane","nhae","hena","hea","hax"]},"54":{"input":[2,3,5,6],"tlp":["enk",5100],"trp":["ind",19969],"tlw":["sine",3555],"trw":["ikkje",7483],"lp":["enk","sine","din"],"rp":["ind","kje","hend","inde","kkje","yk","ken","hed","nke","iden","ykk","hje","nske","ykke","ky","kjen","nesk"]},"55":{"input":[1,2,3,5,6],"tlw":["sidan",654],"trw":["hadde",11705],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["vin",4628],"trp":["hv",25602],"tlw":["thi",1736],"trw":["hit",287],"lp":["vin","th","bi","tin","vn","thi","tni","tnin","vint","bin","vinn"],"rp":["hv","hvi","int","ib","nti","nhv","nv","ntin","hvit"]},"57":{"input":[1,4,5,6],"tlp":["van",4044],"trp":["hav",15474],"tlw":["fin",261],"trw":["navn",696],"lp":["van","fin","avn","finn","tian","vant","anv","fint","vann"],"rp":["hav","hva","nav","navn","hava","hat","havt","haab","hatt","havn","nhav"]},"58":{"input":[2,4,5,6],"tlp":["ch",2454],"trp":["nkt",2442],"tlw":["sint",142],"trw":["hvis",1991],"lp":["ch","stin","sch","svin","skib","bis","tkj","stni"],"rp":["nkt","hvis","kvin","nic","hist","istn","ich","kib","isb","isbn","kniv","inst"]},"59":{"input":[1,2,4,5,6],"tlw":["bak",310],"trw":["kant",169],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["ven",10891],"trp":["her",10731],"tlw":["ven",661],"trw":["her",6657],"lp":["ven","rin","rh","vent","even","vne","beh","bei","bev","evn","erh","the"],"rp":["her","hve","hver","inte","hev","herr","hr","yv"]},"61":{"input":[1,3,4,5,6],"tlw":["fine",333],"trw":["har",14412],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["verden",958],"trw":["kjendte",636],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["vand",853],"trw":["havde",9987],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",42],"trw":["o",923],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","trp":["oa",34],"lp":[],"rp":["oa"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",62776],"trp":["os",14215],"tlw":["so",6443],"trw":["os",3796],"lp":["so","sos","sso","soso"],"rp":["os","oss","oso"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["wo",147],"trp":["ow",102],"trw":["ossaa",45],"lp":["wo","aso","aaso","asso"],"rp":["ow","ossa","owa"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["eo",687],"trp":["oe",3728],"trw":["-",3322],"lp":["eo","e-"],"rp":["oe","-o","o-"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["a-",49],"trp":["ox",122],"lp":["a-","e-a","e-aa"],"rp":["ox","oxe","-a","-aa"]},"70":{"input":[2,3,7],"tlp":["do",13375],"trp":["od",32172],"tlw":["dod",621],"trw":["odd",219],"lp":["do","dod","eso","dode","edo","sod","dso","esso","doe"],"rp":["od","ode","odd","ose","ods","odde","oed","oede","osse","odse","odes"]},"71":{"input":[1,2,3,7],"tlp":["adso",64],"trp":["odsa",186],"lp":["adso","de-a"],"rp":["odsa","oda","odda","-aas"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["to",34309],"trp":["og",149705],"tlw":["to",2884],"trw":["og",122759],"lp":["to","gt","go","gg","tog","tg","tot","tott","gto","tto","gtt","got","gtto","ttog"],"rp":["og","ot","ott","ogt","ogg","otto"]},"73":{"input":[1,4,7],"tlp":["fo",74135],"trp":["of",3896],"tlw":["gaa",1786],"lp":["fo","ag","ga","agt","gaa","tag","aag","gat","aga","tfo","tga","fot","gf","fag","gaat"],"rp":["of","oft","ofa","off","otta"]},"74":{"input":[2,4,7],"tlp":["sto",16012],"trp":["ogs",5245],"tlw":["stott",99],"trw":["oc",346],"lp":["sto","gs","sog","gst","sg","gso","sost","co","sogt","stot","toc","stoc","tso","sot"],"rp":["ogs","ost","oc","ogso","osto","oct"]},"75":{"input":[1,2,4,7],"tlp":["sag",7523],"trp":["ogsa",5006],"tlw":["sagt",1463],"trw":["ogsaa",3774],"lp":["sag","gsa","gsaa","sagt","ags","sof","saag","sga","asg","asto","sofa","sgaa","aco","fos","sfo","stof","soga","gsta"],"rp":["ogsa","ofas"]},"76":{"input":[3,4,7],"tlp":["ge",87205],"trp":["or",142919],"tlw":["eg",8868],"trw":["or",301],"lp":["ge","eg","ro","tor","get","ger","gr","ege","rg","gte","gge","tro","eget"],"rp":["or","ort","ore","oge","orte","org","oget"]},"77":{"input":[1,3,4,7],"tlp":["for",64883],"trp":["ora",3045],"tlw":["for",32016],"trw":["ofte",1064],"lp":["for","age","fort","aeg","tage","rag","gar","rfo","rfor","gra","fore","gaar","fora","agte","erfo","aegg"],"rp":["ora","ofte","orta","orf"]},"78":{"input":[2,3,4,7],"tlp":["stor",7850],"trp":["ord",13774],"tlw":["seg",6090],"trw":["ord",1982],"lp":["stor","god","seg","gd","tod","stod","gde","ges","dog","godt","rod","deg","dor","rso","sor"],"rp":["ord","ors","orst","orde","odt"]},"79":{"input":[1,2,3,4,7],"tlw":["sagde",3425],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["un",57145],"trw":["nu",8186],"lp":[],"rp":["un","no","on","nu","unn","ono","onn","nno","ou","uu","nun","uun","onno","non","nnu","uo","uno","oun"]},"81":{"input":[1,5,7],"tlp":["au",4958],"trp":["unna",1842],"tlw":["au",141],"trw":["unna",94],"lp":["au","ano","anu","anua","anno"],"rp":["unna","ona","ua","onna","nau","nua","una"]},"82":{"input":[2,5,7],"tlp":["su",3824],"trp":["jo",23891],"tlw":["son",930],"trw":["jo",3859],"lp":["su","son","sjo","snu","sun","sno","sson","sonn"],"rp":["jo","us","ju","jon","oj","ons","jonn","jus","ojn","uss","jos","uns"]},"83":{"input":[1,2,5,7],"tlp":["aus",1274],"trp":["jona",341],"tlw":["sau",28],"trw":["jau",154],"lp":["aus","ajo","asjo","sau","anus","wu","snau","sua"],"rp":["jona","jau","ussa","onas","janu","usa","onsa"]},"84":{"input":[3,5,7],"tlp":["eno",822],"trp":["ue",3657],"tlw":["enno",276],"trw":["noe",486],"lp":["eno","eu","enno","eon","eun","enu"],"rp":["ue","one","uen","unne","oy","onne","oen","noe","onen","une","noen","yo","oyo","oye"]},"85":{"input":[1,3,5,7],"tlp":["eona",156],"trp":["oxn",30],"lp":["eona","anoe","aue","auen"],"rp":["oxn","oxne","ux","oux","oxen","oya"]},"86":{"input":[2,3,5,7],"tlp":["du",19662],"trp":["und",23222],"tlw":["du",17772],"trw":["ud",4343],"lp":["du","dnu"],"rp":["und","ud","unde","ude","uden","ndnu","use","ond","uds","ndo","udd","udse","udde","oje","nod","ndu","onde","oden"]},"87":{"input":[1,2,3,5,7],"tlw":["daud",104],"trw":["unda",243],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["bo",11738],"trp":["ng",56304],"tlw":["gong",545],"trw":["ut",3855],"lp":["bo","gu","tu","gn","bu","tun","gun","gunn","gut","gon"],"rp":["ng","ut","nog","ug","ung","ngt","ong","ob","utt","ont"]},"89":{"input":[1,4,5,7],"tlp":["ang",17346],"trp":["nga",2499],"tlw":["gang",1862],"trw":["utan",212],"lp":["ang","gan","gang","fu","bag","angt","atu","aug","agn","fun","aut","fang"],"rp":["nga","natu","ngan","uf","nfo","uft","uta","utga"]},"90":{"input":[2,4,5,7],"tlp":["gj",23821],"trp":["ngs",2173],"tlw":["song",96],"trw":["just",538],"lp":["gj","gjo","stu","bjo","stun","tus","ggj","gus","stno"],"rp":["ngs","ust","ngst","jont","just","uc","ngso","job","jot","unst","ugus"]},"91":{"input":[1,2,4,5,7],"tlw":["sang",405],"trw":["jacob",143],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["gen",22078],"trp":["nge",25467],"tlw":["bort",1232],"trw":["noget",4415],"lp":["gen","ru","eng","bor","enge","beg","run","tur","egen","gy"],"rp":["nge","ur","ngen","noge","yg","nger","oren","orn","ogen","nor"]},"93":{"input":[1,3,4,5,7],"tlw":["gunnar",1603],"trw":["naturen",307],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["gjorde",2339],"trw":["jeg",29616],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["dagen",1077],"trw":["udenfor",448],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["il",83974],"trw":["lo",890],"lp":[],"rp":["il","li","ll","ol","lo","ill","oi","lli","oli","io","illi","lil","ili","lill","oll","llo","illo","lio","loi","iil"]},"97":{"input":[1,6,7],"tlp":["al",58249],"trp":["la",46808],"tlw":["al",993],"trw":["la",2277],"lp":["al","all","aal","ala","alli","ali","alla","aala","alo"],"rp":["la","laa","lla","ola","illa","ial","lai","olai","lia","ila","oia"]},"98":{"input":[2,6,7],"tlp":["sl",12627],"trp":["ko",30079],"tlw":["slik",1363],"trw":["los",291],"lp":["sl","sli","slik","sol","slo"],"rp":["ko","ok","ls","lik","lk","kl","olk","lsk","ils","oko","kol","oks","ilk","okk","los"]},"99":{"input":[1,2,6,7],"tlp":["skal",8407],"trp":["kal",10316],"tlw":["skal",8110],"trw":["kalla",209],"lp":["skal","sla","saal","ako","als","sal","slaa","alsk","alk","asl"],"rp":["kal","kla","las","lska","lass","kall","lsa","lask","lak","isla"]},"100":{"input":[3,6,7],"tlp":["el",77241],"trp":["le",79550],"tlw":["elle",34],"trw":["lille",1039],"lp":["el","ell","elle","eli","ele","eil","elli","eel","eile"],"rp":["le","lle","ille","ole","oie","lei","ile","lie","iel","lel","olle"]},"101":{"input":[1,3,6,7],"tlp":["ale",7840],"trp":["lae",9587],"tlw":["alle",5666],"trw":["lea",237],"lp":["ale","alle","ael","aale","aell","ella","aele","ela","alae","alie","alei","eal","eale","aael","alex"],"rp":["lae","laae","lea","iael","lex"]},"102":{"input":[2,3,6,7],"tlp":["els",10495],"trp":["ld",45157],"tlw":["del",665],"trw":["lod",1164],"lp":["els","del","sel","eld","else","deli","elsk","dl","elde"],"rp":["ld","lde","ild","ilde","old","lse","kel","led","lid","lede","keli"]},"103":{"input":[1,2,3,6,7],"tlw":["saaledes",1295],"trw":["lad",661],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["til",52776],"trp":["ig",98658],"tlw":["til",41443],"trw":["liv",1338],"lp":["til","vil","vo","gi","gl","tig","till","tl","gti"],"rp":["ig","lig","ov","lt","lv","igt","liv","lg","lit","ligt","lov"]},"105":{"input":[1,4,6,7],"tlp":["alt",10974],"trp":["lag",4727],"tlw":["alt",4399],"trw":["olav",641],"lp":["alt","fol","tal","fl","gav","fal","gla","alv","talt","folg","alti","flo","fla","tilf","gif"],"rp":["lag","lf","lav","lat","ilf"]},"106":{"input":[2,4,6,7],"tlp":["sig",27397],"trp":["lst",1344],"tlw":["sig",21706],"lp":["sig","gik","tok","stil","sigt","tils","vilk","stol","slig","sov","gvis","slog","gikk","stig"],"rp":["lst","lts","kog","likt","okt","kto"]},"107":{"input":[1,2,4,6,7],"tlw":["folk",2816],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["vor",14150],"trp":["ige",17385],"tlw":["eller",6110],"trw":["over",7437],"lp":["vor","elig","rl","vel","elv","rig","rli","rlig","elt","erl"],"rp":["ige","ove","ler","over","ller","lige","lev","lte","let","live"]},"109":{"input":[1,3,4,6,7],"tlw":["tale",1360],"trw":["laegge",464],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["vilde",7016],"trw":["lidt",2153],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["aldrig",2153],"trw":["idag",668],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["ho",30354],"trw":["hun",21044],"lp":[],"rp":["ho","hu","hun","ul","lu","hol","lin","hon","hono","nl","hoi","uli","ull","oin","nli","hil","llin","oh","oni","nhil"]},"113":{"input":[1,5,6,7],"tlp":["anl",884],"trp":["lan",10243],"tlw":["alonzo",24],"trw":["hall",138],"lp":["anl","anli","ahl"],"rp":["lan","hal","lau","hall","nla","oha","ohan","nal","onal","nnla","nlau","llan","hau","onla","ula","nlan","ulia"]},"114":{"input":[2,5,6,7],"tlp":["sku",10170],"trp":["ku",23180],"tlw":["sjol",372],"trw":["nok",3367],"lp":["sku","skul","skjo","slu"],"rp":["ku","kun","kul","nok","kon","kjo","uk","hos","hus","ukk","noko","kjon","kunn","jol","lj","jul"]},"115":{"input":[1,2,5,6,7],"trw":["hakon",849],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["eho",965],"trp":["hel",9131],"trw":["hele",2760],"lp":["eho","elen","enl","ehol"],"rp":["hel","len","ly","yl","hele","hell","oine","lene","olen","ule","ulle","hoie","hoy","heil","uly","nel"]},"117":{"input":[1,3,5,6,7],"tlw":["alene",964],"trw":["nella",82],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["skulde",7929],"trw":["kunde",7993],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["sjael",299],"trw":["land",975],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["bl",22281],"trp":["ing",20917],"tlw":["bli",1395],"trw":["hoit",425],"lp":["bl","bli","ting","gh","bliv","tilb","blo"],"rp":["ing","hvo","ning","lb","igh","ilb","hov","ling","ligh","hvil","lut","ntl","ntli"]},"121":{"input":[1,4,5,6,7],"tlw":["gunnlaug",319],"trw":["langt",1662],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["blik",491],"trw":["och",329],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["ansigt",724],"trw":["langs",495],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["blev",6367],"trw":["hvor",4988],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["tilbage",1441],"trw":["laenge",1067],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["gjekk",2117],"trw":["igjen",3313],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["ganske",1701],"trw":["landet",659],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trp":["pp",6585],"trw":["p",102],"lp":[],"rp":["pp"]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",4962],"trp":["pa",49694],"trw":["paa",26138],"lp":["ap","app","aap","apa","appa","aapa"],"rp":["pa","paa","pap","ppa","ppaa","papa"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",8870],"trp":["ps",217],"trw":["ps",26],"lp":["sp"],"rp":["ps","psp"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["spa",590],"trp":["pas",1229],"tlw":["saapas",42],"trw":["pas",58],"lp":["spa","saap","apas","asp"],"rp":["pas","pass","paas","psa","pspa"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",1790],"trp":["pe",12061],"trw":["'",36],"lp":["ep","epp","eppe","epe","e'"],"rp":["pe","ppe","pee","'e","pep","pepp"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["appe",605],"trp":["pae",444],"trw":["'a",44],"lp":["appe","ape","a'","epa","aape","eppa"],"rp":["pae","paee","'a","pea"]},"134":{"input":[2,3,8],"tlp":["spe",488],"trp":["pd",356],"lp":["spe","dp","esp","espe","sep","dsp","edp","s'","d'","d'e","es'","des'","ed'","dep"],"rp":["pd","ped","pede","pped","pes","ppes"]},"135":{"input":[1,2,3,8],"tlp":["spae",291],"trp":["pda",290],"tlw":["sa'",71],"trw":["passe",167],"lp":["spae","dpa","dpaa","sa'","edpa","aspe","depa"],"rp":["pda","pad","paed"]},"136":{"input":[4,8],"tlp":["tp",173],"trp":["pt",1987],"lp":["tp"],"rp":["pt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["apt",508],"trp":["pf",337],"tlw":["tapt",32],"lp":["apt","tpa","tap","tapt","tpaa"],"rp":["pf","pta","paaf","pfa","pfat","ptat","pat","ppat","patt"]},"138":{"input":[2,4,8],"trp":["pst",23],"lp":[],"rp":["pst"]},"139":{"input":[1,2,4,8],"tlp":["cap",53],"trp":["past",196],"trw":["paastaa",25],"lp":["cap","capp"],"rp":["past"]},"140":{"input":[3,4,8],"tlp":["rp",1719],"trp":["pr",6671],"tlw":["teppet",51],"trw":["per",998],"lp":["rp","erp","rep","repe","t'","et'","ept","tep"],"rp":["pr","per","pet","pre","pte","pper","ppet","petr","pete","ptr","pere","peer"]},"141":{"input":[1,3,4,8],"tlp":["rpa",1174],"trp":["pra",2577],"tlw":["rapp",178],"trw":["par",1236],"lp":["rpa","rpaa","erpa","rap","arp","rapp","trap","apte","apet","repa","arpe","apr","rape"],"rp":["pra","par","prae","part","prat","para","ptra"]},"142":{"input":[2,3,4,8],"tlp":["spr",1897],"trp":["pres",895],"tlw":["drepe",95],"trw":["prest",134],"lp":["spr","derp","drep","set'","sept","spre","sper","resp","step","rdsp","spec","d'er","dtp","rdp"],"rp":["pres","pers","pred","pdr","pec","pest"]},"143":{"input":[1,2,3,4,8],"tlw":["derpaa",639],"trw":["passer",132],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["mm",21715],"trw":["m",266],"lp":[],"rp":["mm","mp","mn","pn","nm","np","pm","nnp"]},"145":{"input":[1,5,8],"tlp":["am",30376],"trp":["ma",44872],"trw":["man",6961],"lp":["am","amm","ama","amp","aam","apn","aman","amn","ampa"],"rp":["ma","man","maa","mann","pan","mma","nap","nma","maan","npa","mpa"]},"146":{"input":[2,5,8],"tlp":["sm",7709],"trp":["ms",1313],"lp":["sm","spj"],"rp":["ms","nsm","mj","pj","nsp","mps","mss","msp"]},"147":{"input":[1,2,5,8],"tlp":["sam",7924],"trp":["maj",624],"tlw":["smaa",580],"trw":["jaampa",181],"lp":["sam","samm","sma","smaa","sman","asm","aasm","sama","saam","ams"],"rp":["maj","maas","mas","jam","jaam","nsma","mja","mass","jamn","jamm"]},"148":{"input":[3,5,8],"tlp":["em",29102],"trp":["me",119265],"trw":["men",24935],"lp":["em","emm","emme","emn","eme"],"rp":["me","men","mme","mmen","menn","nem","pen","nnem","my","mpe","mene","ppen","mee","nep","'n"]},"149":{"input":[1,3,5,8],"tlp":["amme",6974],"trp":["mae",3374],"tlw":["apne",60],"trw":["mannen",490],"lp":["amme","ame","amen","ema","ampe","aem","apne","enpa","aame","emae","aemp","apen","emna","xem"],"rp":["mae","maen","maae","paen","mane","pmae"]},"150":{"input":[2,3,5,8],"tlp":["dem",8585],"trp":["med",39755],"tlw":["dem",8538],"trw":["med",36341],"lp":["dem","sme","dm","esm","sem","emnd","emd","emde"],"rp":["med","jem","mes","mede","mens","jemm","mmed","mend","mmes","md","mde","mnd"]},"151":{"input":[1,2,3,5,8],"tlw":["samme",2157],"trw":["mand",2119],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["tm",528],"trp":["mt",5699],"lp":["tm","bm","ttm"],"rp":["mt","mb","mtm","mnt"]},"153":{"input":[1,4,5,8],"tlp":["amt",1276],"trp":["maat",2873],"tlw":["amt",30],"trw":["mat",345],"lp":["amt","amf","amta","fam","tma","tman","amtm","tam","tamm","amb"],"rp":["maat","mat","matt","mf","mta","mtma","napt","mant","manf","mata"],"special":"numsym"},"154":{"input":[2,4,5,8],"tlp":["stm",72],"trp":["mst",812],"lp":["stm"],"rp":["mst"]},"155":{"input":[1,2,4,5,8],"tlw":["samt",265],"trw":["jamt",42],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["rm",7650],"trp":["mer",11185],"trw":["mere",2630],"lp":["rm","rme","rem","tem","erm","emt","erme","temm","rmen","remm","emte","temt","rmer"],"rp":["mer","mmer","mere","met","mte","mmet","ment"]},"157":{"input":[1,3,4,5,8],"tlw":["frem",2232],"trw":["maatte",2413],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["dermed",460],"trw":["mest",1195],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["fremmede",427],"trw":["praesten",521],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"|","trp":["pi",3962],"lp":[],"rp":["pi","ip","ipp","ppi","pip","pii","ipi"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["api",565],"trp":["papi",297],"trw":["pipa",30],"lp":["api","apii","aapi"],"rp":["papi","ipa","pia","pipa"]},"162":{"input":[2,6,8],"tlp":["spi",1562],"trp":["pis",688],"tlw":["skip",130],"lp":["spi","spis","skip"],"rp":["pis","kip","pik","isp","kipp","kp","pk","psk","pski","psi","kipi","ips","kips"]},"163":{"input":[1,2,6,8],"tlp":["skap",1414],"trp":["kap",2212],"tlw":["skipa",35],"trw":["kap",53],"lp":["skap","spak"],"rp":["kap","pak","kapi","kapp","pakk","kasp","kipa","kapa"]},"164":{"input":[3,6,8],"tlp":["epi",51],"trp":["ippe",579],"lp":["epi"],"rp":["ippe","ipe","pei","i'","pipe"]},"165":{"input":[1,3,6,8],"trp":["paei",34],"lp":[],"rp":["paei"]},"166":{"input":[2,3,6,8],"tlp":["spid",160],"trp":["pise",465],"tlw":["spise",213],"trw":["pike",73],"lp":["spid","spek","spei","espi","dpi","edpi"],"rp":["pise","kipe","pid","pike","pek","pids","ispe","'k","peis","idsp"]},"167":{"input":[1,2,3,6,8],"tlw":["skape",20],"trw":["pakke",59],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["vp",22],"trp":["pit",244],"lp":["vp"],"rp":["pit","ipt"]},"169":{"input":[1,4,6,8],"tlp":["apit",244],"trp":["pita",83],"lp":["apit","vap","vaap","vpa"],"rp":["pita","pav","paav"]},"170":{"input":[2,4,6,8],"tlp":["cip",35],"trp":["pist",223],"tlw":["spist",76],"lp":["cip"],"rp":["pist"]},"171":{"input":[1,2,4,6,8],"tlw":["skapt",72],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["rip",118],"trp":["pri",1351],"lp":["rip","ript","ripe","tepi"],"rp":["pri","pir","pire","ipet","peri","ptei","pite","ptri","priv","piir","ipte","peti","prii","prei"]},"173":{"input":[1,3,4,6,8],"tlw":["appetit",31],"trw":["parti",114],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["skipet",189],"trw":["pris",147],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["skarpe",106],"trw":["paris",116],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["mi",30489],"trw":["min",5651],"lp":[],"rp":["mi","min","im","imi","ph","him","imm","mh","himm","imp","hm","minn","pin","mni","mnin","inm","phi","phin","nim","pni"]},"177":{"input":[1,5,6,8],"tlp":["ami",591],"trp":["ham",10774],"trw":["ham",10248],"lp":["ami","aim","aima","apni","amin","aham"],"rp":["ham","hamm","mai","ima","iman","inma","hama","maim","hamp","hma","hman","mina","hap","pian"]},"178":{"input":[2,5,6,8],"tlp":["smi",1350],"trp":["mk",1125],"trw":["km",55],"lp":["smi","sim","simp","skim","simi"],"rp":["mk","mis","km","msi","kim","ism","mins","mkj","misk","mik","ksim","insp","mpsk","ims","imss"]},"179":{"input":[1,2,5,6,8],"tlw":["skam",220],"trw":["kamp",171],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["eim",1710],"trp":["ime",2104],"trw":["mine",1626],"lp":["eim","eime","emni","enim"],"rp":["ime","mine","mei","heim","imme","meni","mein","hem","mhe","phe","hemm","impe","menh","imen","pine","hemn"]},"181":{"input":[1,3,5,6,8],"trw":["ha'",122],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["deim",320],"trw":["hjem",1228],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["aminda",55],"trw":["maaske",483],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tim",1156],"trp":["mit",1962],"trw":["mit",1634],"lp":["tim","timm","tmi","tmin","vm","vim"],"rp":["mit","mti","mv","ntim","mitt","imt","pib","mvi","mvit","mith","mint","pint","imit"]},"185":{"input":[1,4,5,6,8],"tlw":["vapni",74],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"tlw":["bisp",71],"trw":["minst",66],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"trw":["knapt",173],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["time",369],"trw":["meir",910],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["varme",418],"trw":["marthe",201],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"trw":["mindre",926],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["skarphedin",261],"trw":["maerke",210],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["op",14625],"trw":["op",5953],"lp":[],"rp":["op","po","opp","opo"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["apo",23],"trp":["opa",359],"lp":["apo"],"rp":["opa"]},"194":{"input":[2,7,8],"tlp":["spo",1607],"trp":["pos",227],"lp":["spo"],"rp":["pos","ops","osp","poss","pso","opso","opsp"]},"195":{"input":[1,2,7,8],"trp":["ospa",68],"lp":[],"rp":["ospa","opas"]},"196":{"input":[3,7,8],"trp":["oppe",1803],"trw":["oppe",861],"lp":[],"rp":["oppe","ope","-p","-pe","poe","o'","'o"]},"197":{"input":[1,3,7,8],"trp":["opae",89],"lp":[],"rp":["opae"]},"198":{"input":[2,3,7,8],"tlp":["dop",25],"trp":["opd",356],"trw":["posse",49],"lp":["dop","dope"],"rp":["opd","poes","pose"]},"199":{"input":[1,2,3,7,8],"trw":["opad",95],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["top",1476],"trp":["opt",955],"tlw":["top",86],"trw":["pot",131],"lp":["top","topp","ttop"],"rp":["opt","pot","pg","opg","pog","pott","pto","opto","ptog"]},"201":{"input":[1,4,7,8],"trp":["opf",337],"trw":["optat",55],"lp":[],"rp":["opf","opta","pfo","opfo","ptag","pga","opga","opfa","pag","pagt"]},"202":{"input":[2,4,7,8],"tlp":["stop",159],"trp":["post",133],"tlw":["spog",66],"trw":["post",83],"lp":["stop","spog","spot"],"rp":["post","psog","opst","psto"]},"203":{"input":[1,2,4,7,8],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["rop",1406],"trp":["por",1635],"tlw":["ropte",390],"trw":["potter",86],"lp":["rop","etop","ropp","ropt","erop","grep","t-p","t-pe"],"rp":["por","pro","porg","opte","opr","orp","prog","port","optr","pote","opro","pror"]},"205":{"input":[1,3,4,7,8],"tlw":["ropa",47],"trw":["praeg",79],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["spor",486],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"trw":["pastor",149],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["om",89943],"trw":["om",15683],"lp":[],"rp":["om","mo","omm","um","mu","pu","nom","onom","up","mun","upp","pun","mon","umm","umu","mum","omn","opm","munn","mom"]},"209":{"input":[1,5,7,8],"tlp":["amu",199],"trp":["oma",845],"trw":["opnaa",33],"lp":["amu","amun","amum","aum","anmo","aup"],"rp":["oma","uma","omma","pau","opma","oman","opna","uppa","manu","umaa","mau","upa","napo"]},"210":{"input":[2,5,7,8],"tlp":["som",43671],"trp":["oms",911],"tlw":["som",39317],"trw":["mons",44],"lp":["som","spu","smu","somm","smo","smun","sum","sup","supp","spjo"],"rp":["oms","osm","jom","mus","jop","nsom","pus","mons","mos","pjo"]},"211":{"input":[1,2,5,7,8],"tlw":["saasom",54],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["enom",392],"trp":["omme",9224],"trw":["munnen",129],"lp":["enom","emo","epu"],"rp":["omme","umme","uppe","ome","omne","omen","ume","moe","mue","opme","upe","ompe","mome","umen","muen","moen","omy"]},"213":{"input":[1,3,5,7,8],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["dom",370],"trw":["mod",2528],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["aasmund",396],"trw":["pause",88],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["tom",707],"trp":["mot",4043],"tlw":["tom",164],"trw":["mot",2107],"lp":["tom","tum","tomm","gm","gom","tomt","gmu","gmun","tup"],"rp":["mot","omt","mott","munt","mg","pub","omb","mbo","ombo","mob","omg"]},"217":{"input":[1,4,5,7,8],"tlw":["bagom",48],"trw":["magt",486],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["spjot",59],"trw":["pust",52],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["smag",190],"trw":["magnus",34],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"trw":["meget",2988],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["form",273],"trw":["mange",2669],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["gjennem",1415],"trw":["moder",464],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["sprang",713],"trw":["majoren",426],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["pl",3409],"trw":["lop",55],"lp":[],"rp":["pl","lp","pil","pill","lip","lipp","opl","pol","poli","pli","plo","opi","lop","oppi","polo","lpi","oplo"]},"225":{"input":[1,6,7,8],"tlp":["alp",182],"trp":["pla",1343],"trw":["paal",37],"lp":["alp","apol"],"rp":["pla","lap","lapp","lpa","paal","pal","opla","pall"]},"226":{"input":[2,6,7,8],"tlp":["spil",667],"trp":["kop",224],"tlw":["spil",91],"trw":["kop",63],"lp":["spil","slip","skop","spl","spok"],"rp":["kop","klip","pok","pokk","okp","kopp","opk","pko","opko","opsi","plos"]},"227":{"input":[1,2,6,7,8],"tlw":["slap",263],"trw":["plass",85],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["elp",1444],"trp":["pel",799],"trw":["pleie",43],"lp":["elp","elpe","elpi"],"rp":["pel","ple","lpe","plei","pell","lep","ople","lepp","peil","li'","ielp","ppel","pele","le'","peli","pile"]},"229":{"input":[1,3,6,7,8],"trw":["la'",34],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["slippe",195],"trw":["pleiede",91],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["selskap",63],"trw":["plads",500],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"trp":["pig",957],"trw":["pligt",151],"lp":[],"rp":["pig","pov","opov","plig","pilt","lpt","pgi","opgi","pgiv","pitl","opig","ppig","lvp","plog"]},"233":{"input":[1,4,6,7,8],"trw":["opgav",46],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"tlw":["spilt",21],"trw":["opkog",50],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["slapt",29],"trw":["kapital",22],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"trw":["pige",436],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"tlw":["april",106],"trw":["opgave",88],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["spiller",93],"trw":["krop",146],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["sprak-",207],"trw":["kapitel",109],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["ml",5031],"trw":["honom",2975],"lp":[],"rp":["ml","imo","mil","lm","mul","lom","muli","plu","mli","mill","llom","lmi","lmin","hop","omh","umul","mili","uml","iml","oph"],"special":"enter"},"241":{"input":[1,5,6,7,8],"tlw":["alm",22],"trw":["maal",213],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["smil",397],"trw":["kom",8732],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["smal",74],"trw":["koma",530],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"tlw":["emil",46],"trw":["mellem",1590],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["amalie",193],"trw":["lampen",95],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["smukke",238],"trw":["komme",2169],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["allesammen",166],"trw":["hjaelp",283],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"tlw":["glum",116],"trw":["mig",10638],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["gamal",73],"trw":["opfatning",67],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["smukt",152],"trw":["punkt",134],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["stockmann",328],"trw":["langsomt",378],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["temmelig",368],"trw":["nemlig",491],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["gamle",2534],"trw":["maelte",821],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["smilte",389],"trw":["kommer",2127],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["bokselskap",856],"trw":["litteraturselskap",207],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/pl-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/pl-keymap.json
new file mode 100644
index 00000000000..63735a422df
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/pl-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",468],"tlw":["a",8903],"lp":["aa","aaa"],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",175],"tlw":["s",502],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["as",42610],"tlw":["w",22418],"lp":["as","wa","aw","ws","sw","sa","awa","aws","was","asa","wsw","swa","asw","waw","ww","sas","wsa","wawa","wwa","awas"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",518],"tlw":["e",106],"lp":["ee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ax",1780],"tlw":["x",92],"lp":["ax","ea","xa","axa","ex"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["es",52602],"tlw":["d",228],"lp":["es","ed","de","se","ede","dd","ds","des","sed","dde","eds","ese","ess","see","sede","eed","dese","ded","dede","dee"],"rp":[]},"7":{"input":[1,2,3],"tlp":["ad",35569],"tlw":["dwa",1359],"lp":["ad","da","we","ew","dw","ada","wd","awe","daw","awd","ewa","swe","dwa","dawa","ase","ade","eda","sad","ews","wes"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",560],"tlw":["t",88],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["ta",68848],"tlw":["ta",2431],"lp":["ta","at","ata","tat","fa","af","ft","aft","ff","tta","att","fat","tata","atta","fta","afta"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["st",75161],"tlw":["c",338],"lp":["st","sc","tc","ts","stc","ct","cs"],"rp":[]},"11":{"input":[1,2,4],"tlp":["ac",50494],"tlw":["stas",540],"lp":["ac","sta","ca","tw","wc","wt","ast","twa","tac","stw","wac","stac","stat","aca","wst","tas","taw","staw","asta","asc"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["te",45936],"tlw":["te",3281],"lp":["te","er","tr","re","et","ter","etr","ret","rt","ere","ete","tre","rte","tere","tet","ert","ett","rete","rr","erte"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ra",55331],"tlw":["ar",328],"lp":["ra","ar","era","tar","atr","ara","tra","ate","tera","are","eta","art","rat","fe","tare","raf","tara","traf","fr","ef"],"rp":[]},"14":{"input":[2,3,4],"tlp":["ec",48514],"tlw":["rece",1133],"lp":["ec","ce","est","dr","str","esc","rs","ste","rd","rc","erc","ece","res","este","sr","ser","rec","serc","dc","rce"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["raw",8030],"tlw":["serca",563],"lp":["raw","wr","rac","rw","war","ard","star","erw","wet","awet","dac","rawd","twar","wte","rad","stra","rws","erws","rwa","wra"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",7406],"trw":["n",208],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",48964],"trp":["na",112653],"tlw":["anna",723],"trw":["na",21439],"lp":["an","ana","ann","anna"],"rp":["na","nan","nna","nana","naa"]},"18":{"input":[2,5],"base":"j","baseshift":"J","tlp":["sn",7535],"trp":["js",5713],"trw":["j",184],"lp":["sn","sj"],"rp":["js","ns","jn","jj"]},"19":{"input":[1,2,5],"tlp":["aj",20342],"trp":["ja",55861],"tlw":["aja",432],"trw":["ja",8216],"lp":["aj","wn","aja","asn","wan","awn","wna","wj","sna","ans","ajw"],"rp":["ja","nas","naj","naw","jan","jas","jw","jasn","najw"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",30498],"trp":["ne",25369],"trw":["ne",747],"lp":["en","enn","ey","ene","enny","eye","enne","een","eny"],"rp":["ne","ny","yn","nny","nne","yny","ye","yne","ynn","yy","nee"]},"21":{"input":[1,3,5],"tlp":["any",2470],"trp":["yna",3436],"tlw":["aye",124],"lp":["any","ane","ena","ay","anny","aye","ean","anne","enna"],"rp":["yna","nany","nane","ynan","yea","nex","ya","yya"]},"22":{"input":[2,3,5],"tlp":["ej",45590],"trp":["je",68792],"tlw":["syn",389],"trw":["jej",5718],"lp":["ej","dy","dn","edn","edy","sy","ejs","dne","den"],"rp":["je","ys","jes","jed","jedn","jej","nd","yj","yd","jd","nej"]},"23":{"input":[1,2,3,5],"tlp":["wy",23292],"trp":["nad",7353],"tlw":["and",2280],"trw":["nad",3785],"lp":["wy","dna","edna","aje","and","ewn","wys","wne","daj","adn","dan","wyd","wej","wyda"],"rp":["nad","yw","nawe","ywa","yja","yda"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["tn",4086],"trp":["nt",3555],"tlw":["b",226],"lp":["tn","bn"],"rp":["nt","nb"]},"25":{"input":[1,4,5],"tlp":["ba",16398],"trp":["nat",3728],"tlw":["ant",708],"lp":["ba","ab","tan","atn","tatn","ant","tana","aba","bab","tna","bna","ban","fn","baba","fab","bat"],"rp":["nat","nta","nf","nab"]},"26":{"input":[2,4,5],"tlp":["cj",4424],"trp":["nc",4520],"tlw":["tj",127],"lp":["cj","cn","bc","bs","stn","cb","bj","sb","tj"],"rp":["nc","jsc","jc","nst","jst","jb","jt","ncj","nts"]},"27":{"input":[1,2,4,5],"tlp":["stan",3867],"trp":["jac",5445],"tlw":["stan",180],"trw":["jac",97],"lp":["stan","ajac","taj","acj","bac","baw","anc","staj","cja","caj","wnat"],"rp":["jac","nac","nast","nca","nstw","jsca","jca","nasc","jat"]},"28":{"input":[3,4,5],"tlp":["by",46129],"trp":["yt",8428],"tlw":["ten",4023],"trw":["net",73],"lp":["by","ty","ry","be","eb","br","ten","rn","eby","ety","ent","ern","byt","tyn","ber"],"rp":["yt","yb","yby","yr","net"]},"29":{"input":[1,3,4,5],"tlp":["bra",4962],"trp":["yta",3398],"tlw":["aby",2523],"trw":["nate",242],"lp":["bra","bar","ary","aby","aty","eba","ran","arn","tary","rna","abr","aryn","ryna","brat"],"rp":["yta","nar","naty","yra","yba","ynar"]},"30":{"input":[2,3,4,5],"tlp":["cy",8269],"trp":["yc",28802],"tlw":["byc",2943],"trw":["jest",9582],"lp":["cy","bed","tyc","tej","ryc","byc","ejsc","dyt","edyt","dyb","dyby","rej","cej","ecej","sty"],"rp":["yc","jest","yst","nyc","jr"]},"31":{"input":[1,2,3,4,5],"tlw":["stary",943],"trw":["nawet",3158],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",2169],"trw":["i",28082],"lp":[],"rp":["ii","iii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["za",76007],"trp":["ia",68340],"tlw":["z",15934],"trw":["iz",305],"lp":["za","zi","az","zia","ai","aza","azi","zz","zaz","zza","zzi","zaza","zai"],"rp":["ia","iz","iaz","iza","iaza","izz","iazi"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["si",90184],"trp":["ki",45823],"tlw":["si",39],"trw":["is",1279],"lp":["si","sk","ski","sis","sks"],"rp":["ki","is","ik","ks","isk","ksi","kis","iki","isi","kk","iski","kki","kik","iss"]},"35":{"input":[1,2,6],"tlp":["wi",87989],"trp":["ka",38575],"tlw":["zas",2170],"trw":["ka",698],"lp":["wi","sz","ak","wsz","zas","wia","aki","zw","sza","asz","zk","swi","sia","awi","wz","ska","zis"],"rp":["ka","iw","kaz"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",1323],"trp":["ie",368657],"lp":["ei"],"rp":["ie","iei"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["ze",125561],"trp":["iez",5190],"tlw":["ze",12240],"trw":["ize",38],"lp":["ze","zie","ez","zez","aze","eza","eze","azie","ezi","ziez","ezie","ziei","xi","zeze"],"rp":["iez","iaze","ize","ieza","iezi","ieze"]},"38":{"input":[2,3,6],"tlp":["sie",75832],"trp":["kie",18740],"tlw":["sie",65236],"trw":["ide",164],"lp":["sie","ek","dk","eki","esi","sied","eks","skie","esie","eke"],"rp":["kie","ied","ies","iek","id","kied","ke","iesi","ieks","ieki"]},"39":{"input":[1,2,3,6],"tlp":["dz",71993],"trp":["iedz",11935],"tlw":["dzis",2729],"trw":["kad",1125],"lp":["dz","dzi","wie","dzie","edz","sze","esz","edzi","zes","zd","dzia","zed","wied","zek","wid","wiek","adz","eka"],"rp":["iedz","iew"]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",1632],"trp":["it",10113],"tlw":["v",123],"trw":["it",677],"lp":["ti","vi","vii","tv","tvi","tti","tiv","viii"],"rp":["it","iv","iti","itt","itiv"]},"41":{"input":[1,4,6],"tlp":["zt",5011],"trp":["iat",4655],"tlw":["tai",754],"trw":["if",169],"lp":["zt","fi","zat","zta","tai","av","fia","afi","va","tav","vaa","vaaa","tia","azat","ait","fit"],"rp":["iat","ita","iata","if"]},"42":{"input":[2,4,6],"tlp":["ci",62579],"trp":["ic",34576],"tlw":["ci",3112],"trw":["isc",445],"lp":["ci","sci","tk","stk","tki","stki","cic","ck","tkic","cis","vis","scic"],"rp":["ic","kt","kic","ist","isc","ikt","isci","ici"]},"43":{"input":[1,2,4,6],"tlp":["cz",84284],"trp":["iast",2879],"tlw":["tak",10183],"trw":["itak",560],"lp":["cz","tak","cza","zc","cia","szc","zcz","szcz","acz","zac","czas","wiat","taki","aci","wcz","scia","zacz","wic"],"rp":["iast","iac"]},"44":{"input":[3,4,6],"tlp":["ri",3494],"trp":["ier",13295],"tlw":["tie",65],"trw":["ir",2637],"lp":["ri","ve","rie","ev","vie","ver","rii","eve","ever","eri","tri","eir","rei"],"rp":["ier","iet","ir","ite","ietr","iete","iter"]},"45":{"input":[1,3,4,6],"tlp":["rz",90643],"trp":["ierz",2732],"tlw":["teraz",3005],"trw":["iteraz",110],"lp":["rz","rze","raz","trz","rzez","rza","arz","trze","zar","zr","eraz","erz","atrz","tez","zer","raze","trza","zara","zet"],"rp":["ierz"]},"46":{"input":[2,3,4,6],"tlp":["cie",23265],"trp":["iec",26434],"tlw":["cie",2111],"trw":["itd",184],"lp":["cie","eci","esci","scie","rek","ecie","rsk","rski","tkie","siec","rk"],"rp":["iec","kr","ieci","kre","iesc","kret","iece","ice","ierc"]},"47":{"input":[1,2,3,4,6],"tlw":["wiec",3828],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["ni",174405],"trw":["in",1322],"lp":[],"rp":["ni","in","inn","ini","hi","hn","nni","hin","inni","hni","nii","nin","iin","iinn","inii","nh"]},"49":{"input":[1,5,6],"tlp":["zn",27628],"trp":["nia",13186],"tlw":["ani",2778],"trw":["niz",2084],"lp":["zn","ani","zna","zni","ania","zan","zin","azn","zani","azni","znan"],"rp":["nia","ha","ina","niz","ian","naz","nani","han","hna"]},"50":{"input":[2,5,6],"tlp":["sni",3453],"trp":["nik",4194],"tlw":["sni",32],"trw":["his",454],"lp":["sni","sh"],"rp":["nik","kn","nk","ij","ji","nis","his","kni","jni","jsk","nisk","nsk","nki","nski","kin","ins","jis","isn"]},"51":{"input":[1,2,5,6],"tlp":["wni",5839],"trp":["jak",28350],"tlw":["wina",268],"trw":["jak",14792],"lp":["wni","win","zaj","wini","znaj","asni","szn","zj","wnia"],"rp":["jak","nak","jaki","hw","hwi","nasz","ija","kna","kan","jaka","iwn"]},"52":{"input":[3,5,6],"tlp":["eni",11343],"trp":["nie",115708],"trw":["nie",47473],"lp":["eni","enie"],"rp":["nie","he","ien","ieni","yni","inie","hy","inny","nien","inne","ynie","ine","iny","hen","nnie","hey","ienn","hnie"]},"53":{"input":[1,3,5,6],"tlp":["zy",86799],"trp":["yz",4726],"tlw":["zenie",780],"trw":["nanie",104],"lp":["zy","anie","zen","zeni","znie","zyn","enia","zyz","azy","zien","ezy","zne","zny","zyni","zyna","zyzn","ezn"],"rp":["yz","niez","yzn"]},"54":{"input":[2,3,5,6],"tlp":["dni",6393],"trp":["iej",15859],"tlw":["she",1219],"trw":["kiedy",2587],"lp":["dni","snie","dnie","she","esni","ekn"],"rp":["iej","niej","yk","iedy","iejs","kiej","nies","ysi","ieje","iekn","niek","nied","ije","ysie"]},"55":{"input":[1,2,3,5,6],"tlw":["dzien",1087],"trw":["jednak",3118],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["bi",21105],"trp":["ib",902],"tlw":["bi",50],"lp":["bi","th","tni","thi","bni","thin","bit","bin","bh","tin"],"rp":["ib","ht","nib","ith","int","itn","hb","nit","niti","hit"]},"57":{"input":[1,4,5,6],"tlp":["zb",4172],"trp":["hat",1109],"tlw":["that",591],"trw":["izba",42],"lp":["zb","tani","bia","zab","atni","abi","tha","that","zabi","zbi","zba","tnia","ath","bani"],"rp":["hat","itan","izb","inf","hta","hav"]},"58":{"input":[2,4,5,6],"tlp":["ch",74579],"trp":["ich",14715],"tlw":["bci",274],"trw":["ich",4866],"lp":["ch","chc","chci","bic","cji","chn","cich","bk"],"rp":["ich","nic","hc","kich","kb","hci","nich","icj","inic","nicj","nikt","jci"]},"59":{"input":[1,2,4,5,6],"tlw":["znich",449],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["bie",13336],"trp":["ieb",5068],"tlw":["the",3042],"trw":["her",1605],"lp":["bie","ebi","the","ebie","tnie","biet","rni","bnie"],"rp":["ieb","iebi","her","hr","nieb","nier","iety","hyb","iby","hry","iern","niby"]},"61":{"input":[1,3,4,5,6],"tlw":["bez",2806],"trw":["nieraz",449],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["tych",1735],"trw":["niech",1470],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["czy",5191],"trw":["jeszcze",5354],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",763],"trw":["o",6106],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","tlp":["ao",782],"trp":["oa",209],"lp":["ao"],"rp":["oa"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",12921],"trp":["os",50523],"tlw":["so",247],"lp":["so","sos","soo"],"rp":["os","oso","oos"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["wo",32063],"trp":["ow",64725],"tlw":["wo",109],"trw":["ow",544],"lp":["wo","swo","awo","sow","wos","wow","aso","asow","wso","wswo","aswo","awos"],"rp":["ow","owa","owo","ows","osa","osw","osow","owos"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["eo",700],"trp":["-o",242],"trw":["-",43777],"lp":["eo"],"rp":["-o","oe"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["xo",67],"trp":["-a",577],"trw":["-a",43],"lp":["xo","axo","a-"],"rp":["-a","ox"]},"70":{"input":[2,3,7],"tlp":["do",46979],"trp":["od",49479],"tlw":["do",12671],"trw":["od",4136],"lp":["do","dos","dod","eso","dodo","doo","edo","doe","does"],"rp":["od","odo","ode","odd","ose","ods","-d","odde","odos","oes","-do"]},"71":{"input":[1,2,3,7],"tlp":["wod",4591],"trp":["owe",3290],"tlw":["woda",528],"trw":["owe",142],"lp":["wod","dow","ado","dwo","ewo","dowo","wdo","dowa","ados","woda","doda","wode","awdo","dosw"],"rp":["owe","oda","owod","odda","owad","odw"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["to",72862],"trp":["ot",22422],"tlw":["to",23311],"trw":["oto",1109],"lp":["to","go","got","goto","tot","too","goo"],"rp":["ot","og","oto","ogo","ott","oog"]},"73":{"input":[1,4,7],"tlp":["ag",8439],"trp":["oga",3404],"tlw":["ato",208],"trw":["of",1252],"lp":["ag","ga","fo","ato","aga","ago","gat","tota","fot","tof","gf","gata"],"rp":["oga","of","ota","off","ogat","otta","ofa"]},"74":{"input":[2,4,7],"tlp":["co",15974],"trp":["oc",26832],"tlw":["co",5162],"lp":["co","sto","cos","gos","tos","cot","gosc","stos","stot","tosc","coto","toc","cott","sco"],"rp":["oc","osc","ost","osto","otc","ogos"]},"75":{"input":[1,2,4,7],"tlp":["two",4901],"trp":["osta",7294],"tlw":["gotow",216],"trw":["owoc",43],"lp":["two","tow","stwo","towa","woc","cow","wag","gw","wosc","gow","wg","wowc"],"rp":["osta","otw","owc","owac","otow","oca","owt","ogow"]},"76":{"input":[3,4,7],"tlp":["ro",57299],"trp":["or",45488],"tlw":["tego",4358],"trw":["-to",452],"lp":["ro","eg","ego","tor","tore","teg","tego","tro","gr","ge","rog","gor","gro","reg","ero","rego"],"rp":["or","ore","ote","otr"]},"77":{"input":[1,3,4,7],"tlp":["tora",3418],"trp":["ora",7565],"tlw":["for",554],"trw":["-ato",55],"lp":["tora","for","aro","rag","ateg","ega","gra","roga","gar","age","gora","arg","arto","areg","fro","taro"],"rp":["ora","otra","-ta","ogar"]},"78":{"input":[2,3,4,7],"tlp":["gd",17099],"trp":["ors",3173],"tlw":["dosc",813],"trw":["odtego",117],"lp":["gd","rod","roc","ros","dro","stro","god","tors","sro","srod","drog","rost","dot","dosc","cor","dost"],"rp":["ors","odc","odr","ostr"]},"79":{"input":[1,2,3,4,7],"tlw":["wsrod",1050],"trw":["otwarte",152],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["on",34225],"trw":["on",3987],"lp":[],"rp":["on","no","un","nu","ou","ono","uo","onu","nuo","nno","uno","oun","oon","onn","unu","onno","non","unon","nou"]},"81":{"input":[1,5,7],"tlp":["au",3651],"trp":["ona",5686],"tlw":["aon",234],"trw":["ona",1285],"lp":["au","ano","anu","aon","aona","anno","aun","auna","qu"],"rp":["ona","nau","una","nao","ua","onan","nano","oan","oann","nona","uau"]},"82":{"input":[2,5,7],"tlp":["su",4815],"trp":["oj",23708],"tlw":["su",735],"trw":["jo",359],"lp":["su","sno","sun","sus","snu"],"rp":["oj","us","ju","nos","uj","jo","jus","ojn","oju","osn","ojs","osu","nso","ojo","osno"]},"83":{"input":[1,2,5,7],"tlp":["woj",7645],"trp":["now",8001],"tlw":["swoja",803],"trw":["jau",356],"lp":["woj","swoj","wu","anow","wno","asu","aju","woja","wojn","won","sown"],"rp":["now","own","oja","uw","uwa","owu","nowu","uja","onow"]},"84":{"input":[3,5,7],"tlp":["eu",1045],"trp":["ony",3245],"trw":["you",832],"lp":["eu","eon","eno","eun","enu"],"rp":["ony","one","-n","yo","you","neu","yno","une","ynu","-no","ynno","uny","ynuo","-nu","-on"]},"85":{"input":[1,3,5,7],"tlp":["aux",164],"trp":["ux",164],"lp":["aux","eona","eanu","eau"],"rp":["ux"]},"86":{"input":[2,3,5,7],"tlp":["du",7756],"trp":["ud",11878],"tlw":["synu",166],"trw":["jedno",549],"lp":["du","dno","dus","don","edno","ejo","dnos"],"rp":["ud","oje","odn","uje","ody","ojej","odu","udn","osy","ude","yso","udy","-j"]},"87":{"input":[1,2,3,5,7],"tlw":["swoje",1014],"trw":["nowe",458],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["bo",17356],"trp":["ob",32371],"tlw":["tu",4701],"trw":["obu",290],"lp":["bo","tu","bu","gn","bog","gu","tob","tut","but","bot"],"rp":["ob","ug","ut","ub","obo","obn","nog","ugo","ogn","ng"]},"89":{"input":[1,4,5,7],"tlp":["gna",1454],"trp":["oba",4176],"tlw":["boga",442],"trw":["nato",715],"lp":["gna","agn","atu","tano","agna","boga","tuta","agu","toba","abo","gan"],"rp":["oba","nag","nato","uta","uga","noga","natu","nfo","obna"]},"90":{"input":[2,4,5,7],"tlp":["sob",8597],"trp":["uc",9675],"tlw":["boju",171],"trw":["noc",701],"lp":["sob","cu","stu","cju","cjus","boj","bos","scu","cno"],"rp":["uc","ust","nosc","onc","osob","noc","ojc","ncu","oncu","ocn","just"]},"91":{"input":[1,2,4,5,7],"tlw":["soba",912],"trw":["usta",582],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["ru",10352],"trp":["ory",10533],"tlw":["gory",402],"trw":["nero",306],"lp":["ru","tory","ron","rob","tron","bro","rug","tru","rony"],"rp":["ory","ur","obr","neg","nego","yto","oty","ytor","yg","oby","obe"]},"93":{"input":[1,3,4,5,7],"tlw":["rano",301],"trw":["natury",131],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["gdy",6483],"trw":["jego",6471],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["dobra",471],"trw":["justyna",463],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["lo",50381],"trw":["li",307],"lp":[],"rp":["lo","li","il","ol","io","oi","oli","olo","ilo","ili","ll","iol","lil","llo","ill","lli","lio","ilio","oil","loo"]},"97":{"input":[1,6,7],"tlp":["al",107956],"trp":["la",64546],"tlw":["zal",356],"trw":["la",391],"lp":["al","zo","ala","zl","zal","zial","alo","zlo","ali","zil","zla","zli","azal"],"rp":["la","oz","ial","ola","iala","ila","lal"]},"98":{"input":[2,6,7],"tlp":["sl",22280],"trp":["ko",47506],"tlw":["sil",387],"trw":["okolo",573],"lp":["sl","sli","slo","sil","sko"],"rp":["ko","ok","lk","kl","lko","los","oko","kol","lki","osi","ilk","kil","oki","kilk","okol"]},"99":{"input":[1,2,6,7],"tlp":["wal",9697],"trp":["owi",22633],"tlw":["slowa",956],"trw":["kilka",1527],"lp":["wal","wil","wol","wl","ako","szl","zos","wla","sla","wlas","slow"],"rp":["owi","low","las","lowi","kla","osz","lka","lowa","kow"]},"100":{"input":[3,6,7],"tlp":["el",23557],"trp":["le",60091],"trw":["ile",574],"lp":["el","eli","ele","elo","ell","ello","elli"],"rp":["le","iel","ole","ile","ieli","iele","iell","ielo","lie","lei","olei","lle","iole"]},"101":{"input":[1,3,6,7],"tlp":["ale",25698],"trp":["oze",6806],"tlw":["ale",11823],"trw":["lezal",224],"lp":["ale","zel","ela","alez","zle","ziel","zeli","zela","zale","ezal","ezel","ezl"],"rp":["oze","lez","iale","leza","iela","lale","ozle","loze"]},"102":{"input":[2,3,6,7],"tlp":["dl",18350],"trp":["lek",3460],"tlw":["sile",224],"trw":["like",346],"lp":["dl","ekl","elk","edl","esl","esli","dok","elki","eko","dol","dlo"],"rp":["lek","ielk","lod","ld","lkie","osie","led","ido","okie"]},"103":{"input":[1,2,3,6,7],"tlw":["dla",5302],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["gl",20525],"trp":["ogl",5611],"tlw":["gi",147],"trw":["ito",358],"lp":["gl","gi","glo","tol","tl","vo","gol"],"rp":["ogl","ig","ogi","lit","ito","lot","lig","igi","itol","ligi","lt","iot","oglo"]},"105":{"input":[1,4,6,7],"tlp":["tal",9006],"trp":["lat",3663],"tlw":["zato",341],"trw":["lat",1084],"lp":["tal","gla","zg","agl","tala","talo","zgo","agi","zlot","gal","atl","zgl","alt","toz"],"rp":["lat","iag","ogla","ofi","iatl","ofia"]},"106":{"input":[2,4,6,7],"tlp":["cil",3725],"trp":["kto",24526],"tlw":["glos",1013],"trw":["kto",1969],"lp":["cil","glos","tko","stko","stol"],"rp":["kto","osci","oci","lic","losc","lc","ocil","otk","oic","okt","okto","kosc","koc","isto","olic"]},"107":{"input":[1,2,4,6,7],"tlw":["glowa",1247],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["gle",3643],"trp":["ieg",7405],"tlw":["teorii",136],"trw":["ligie",262],"lp":["gle","gie","rol","rl","egl","rogi","tel","egi","role","giel"],"rp":["ieg","iego","leg","iero","lite","ori","lego","ior","ogie","legl"]},"109":{"input":[1,3,4,6,7],"tlw":["zeto",514],"trw":["oraz",543],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["drogi",663],"trw":["ktore",3303],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["gdzie",3077],"trw":["lecz",4127],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["lu",22354],"trw":["oni",779],"lp":[],"rp":["lu","ho","oni","ln","iu","lni","lon","ul","oln","niu","hl","nio","hlo","olni","hu","uni","ion","nil","lno","olu"]},"113":{"input":[1,5,6,7],"tlp":["zu",11610],"trp":["uz",13328],"tlw":["znalazl",366],"trw":["uz",245],"lp":["zu","zno","znal","zon","zul","azu","alan"],"rp":["uz","nal","ozn","ozna","lan","ozu","luz","hal","ozni","lna","nala","lani","nial"]},"114":{"input":[2,5,6,7],"tlp":["slu",3167],"trp":["ku",13470],"tlw":["skoku",179],"trw":["ku",734],"lp":["slu","slon","sku"],"rp":["ku","kon","uk","usi","koj","okoj","koni","oku","unk","nios","kun","lus","ius","nius","nku","nosi","niko"]},"115":{"input":[1,2,5,6,7],"tlw":["znowu",1380],"trw":["juz",8066],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["eln",2354],"trp":["yl",37140],"trw":["-nie",970],"lp":["eln","elu","elni","eniu"],"rp":["yl","ly","ylo","onie","lnie","yli","yly","yle","nel","ily","-ni","-nie","lny","lne","len","ielu"]},"117":{"input":[1,3,5,6,7],"tlw":["zony",234],"trw":["lzy",407],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["sily",637],"trw":["jesli",2399],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["dalej",1297],"trw":["ludzi",1877],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["bl",4510],"trp":["obi",10397],"tlw":["buvo",526],"trw":["lub",2322],"lp":["bl","gni","bli","bil","tlu","bol","tobi"],"rp":["obi","lb","ugi","lug","lub","lbo","nig","lugo","ogni","lugi","obil","obl","uv"]},"121":{"input":[1,4,5,6,7],"tlw":["albo",1927],"trw":["ognia",422],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["choc",1394],"trw":["obok",680],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["chwili",1257],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["bylo",6619],"trw":["niego",1339],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["byla",3016],"trw":["nagle",1105],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["tylko",7436],"trw":["ktory",4337],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["wszystko",2576],"trw":["oczy",2137],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trp":["pp",172],"trw":["p",135],"lp":[],"rp":["pp"]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",9918],"trp":["pa",27218],"trw":["pa",145],"lp":["ap","apa","app"],"rp":["pa","pap","papa"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",14576],"trp":["ps",984],"lp":["sp"],"rp":["ps"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["wp",3537],"trp":["pas",1206],"trw":["pas",221],"lp":["wp","spa","wsp","wpa","wspa","apas","asp","aspa","wap","awp","wpas","spas"],"rp":["pas","paw","psa","pasa","pw"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",5528],"trp":["pe",8856],"trw":["pe",37],"lp":["ep","e'","epe","eep"],"rp":["pe","ppe","pee"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["ape",1033],"trp":["pea",94],"lp":["ape","epa","a'","appe"],"rp":["pea","ppea"]},"134":{"input":[2,3,8],"tlp":["dp",2912],"trp":["'s",698],"lp":["dp","eps","esp","spe","e's","sped","spee","e'd","desp","dep","sep"],"rp":["'s","ped","'d","pede"]},"135":{"input":[1,2,3,8],"tlp":["dpa",640],"trp":["pew",3258],"tlw":["wpada",59],"trw":["pada",80],"lp":["dpa","apew","wpad","aped","spad","a's","apad","wpe","wpew","epas","epew"],"rp":["pew","pad","pada","pade","pawe","pase","pwe"]},"136":{"input":[4,8],"tlp":["tp",340],"trp":["pt",863],"lp":["tp"],"rp":["pt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["tap",450],"trp":["pat",2675],"lp":["tap","atp"],"rp":["pat","pta","pf"]},"138":{"input":[2,4,8],"tlp":["cp",40],"trp":["pc",913],"lp":["cp"],"rp":["pc","pst"]},"139":{"input":[1,2,4,8],"tlp":["stap",450],"trp":["pac",1055],"tlw":["spac",240],"trw":["pats",97],"lp":["stap","apac","watp","spac","wpat","acp","cpa","wacp","acpa"],"rp":["pac","pca","pasc","past","pats","pstw","ptac"]},"140":{"input":[3,4,8],"tlp":["tep",1202],"trp":["pr",57473],"trw":["per",245],"lp":["tep","epr","rp","erp","ept","t'","epte","re'","ere'","tepe"],"rp":["pr","pre","pet","petr","per","'t","pret","'r","'re","pte"]},"141":{"input":[1,3,4,8],"tlp":["apr",1964],"trp":["pra",9765],"tlw":["tarp",77],"trw":["pare",337],"lp":["apr","apra","epra","epta","arp","tarp","at'","apar","apre"],"rp":["pra","patr","par","pare","pfe","para","pera","part","papr"]},"142":{"input":[2,3,4,8],"tlp":["spr",2056],"trp":["pred",1040],"trw":["press",30],"lp":["spr","step","t's","epc","tepc","cep","rcep","cepc","spec","re's","epce","cept","depc"],"rp":["pred","prec","perc","pres","pce","peec","pec"]},"143":{"input":[1,2,3,4,8],"tlw":["sprawe",290],"trw":["prawda",673],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["mn",14832],"trw":["m",312],"lp":[],"rp":["mn","pn","mp","nm","np","mm"]},"145":{"input":[1,5,8],"tlp":["am",33618],"trp":["ma",28562],"tlw":["apan",98],"trw":["pan",4034],"lp":["am","ama","amn","amp","apan","anam"],"rp":["ma","pan","nam","nap","mam","mna","pana","man","pam","pann","namn","napa","pna","mama"]},"146":{"input":[2,5,8],"tlp":["sm",6824],"trp":["jm",1565],"lp":["sm"],"rp":["jm","ms","jmn","jp"]},"147":{"input":[1,2,5,8],"tlp":["sam",6796],"trp":["maj",1759],"tlw":["sam",2445],"trw":["maja",826],"lp":["sam","wam","ajm","sama","ajmn","wm","asam","sma","ajp","span","asm"],"rp":["maj","maja","mas","najm","jam","pans","maw","najp","nasm"]},"148":{"input":[3,5,8],"tlp":["em",47785],"trp":["ym",25806],"tlw":["eme",32],"trw":["my",1084],"lp":["em","emn","emy","epn","eme","emne"],"rp":["ym","my","me","yp","py","nym","nem","men","mne","mny","nnym","mym","n'","mem"]},"149":{"input":[1,3,5,8],"tlp":["amy",2050],"trp":["yma",2522],"tlw":["amy",88],"trw":["max",1479],"lp":["amy","ame","apy","ema","emna","amym","anem","epna","an'","amem"],"rp":["yma","max","ypa","mamy","nape","mane","pane","namy","maxa","na'"]},"150":{"input":[2,3,5,8],"tlp":["sem",2689],"trp":["mys",5369],"tlw":["dym",154],"trw":["jednym",518],"lp":["sem","dym","smy","dem","spy","dm","dnym","esm","edem","esmy","edm","ems"],"rp":["mys","jem","jemn","ysp","mej","ysm","ysmy","yms"]},"151":{"input":[1,2,3,5,8],"tlw":["samym",432],"trw":["pewna",264],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["tm",173],"trp":["mt",555],"lp":["tm"],"rp":["mt","mb"]},"153":{"input":[1,4,5,8],"tlp":["tam",5042],"trp":["mat",1787],"tlw":["tam",3597],"trw":["mat",31],"lp":["tam","amt","tamt","amta","fam","atam","bam","amf","atm","fm"],"rp":["mat","mta","mf","pant","mnat"],"special":"numsym"},"154":{"input":[2,4,5,8],"tlp":["cm",184],"trp":["mc",1077],"tlw":["tms",55],"lp":["cm","tms"],"rp":["mc","mst","pcj","msc"]},"155":{"input":[1,2,4,5,8],"tlw":["wacpan",40],"trw":["majac",369],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["tem",8044],"trp":["pyt",2717],"tlw":["tym",4037],"lp":["tem","tym","rym","bym","rm","rem","tepn","bem"],"rp":["pyt","mr","met","n't","mbe","mber","metr","ment","ybym","mer","ypr","mte"]},"157":{"input":[1,3,4,5,8],"tlw":["temat",228],"trw":["natym",299],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["system",322],"trw":["jestem",1324],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["wtym",987],"trw":["naprawde",460],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"|","trp":["pi",22224],"trw":["pi",56],"lp":[],"rp":["pi","ip"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["zap",2987],"trp":["pia",562],"lp":["zap","api","zp","aip","zapa","zpi","zpa","apia"],"rp":["pia","papi","ipa","paz","izap"]},"162":{"input":[2,6,8],"tlp":["spi",1310],"trp":["pis",4398],"tlw":["spi",122],"lp":["spi","skip"],"rp":["pis","kip","pk","isp","pki","psi"]},"163":{"input":[1,2,6,8],"tlp":["wpi",267],"trp":["kap",1184],"tlw":["zapas",72],"trw":["kaip",681],"lp":["wpi","apis","apk","zapk","szp","zkap","szpi"],"rp":["kap","kapi","kaip","psz","pisa","pak","pias","pisz","piw","kasp","pask","psza","piwa"]},"164":{"input":[3,6,8],"tlp":["epi",972],"trp":["pie",13522],"trw":["pie",48],"lp":["epi","epie"],"rp":["pie","iep","i'","ipe","iepe","pei","ppei"]},"165":{"input":[1,3,6,8],"tlp":["zep",1368],"trp":["piez",95],"tlw":["apie",272],"trw":["papieza",54],"lp":["zep","apie","ezp","zpie","ezpi","zape","zepa","zpe"],"rp":["piez"]},"166":{"input":[2,3,6,8],"tlp":["spie",1047],"trp":["pies",1441],"trw":["pies",178],"lp":["spie","epek","spek"],"rp":["pies","piek","iesp","kipe","pke","pek","kep"]},"167":{"input":[1,2,3,6,8],"tlw":["spiew",96],"trw":["pisze",141],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["tpi",70],"trp":["pit",866],"trw":["itp",74],"lp":["tpi"],"rp":["pit","itp","pti"]},"169":{"input":[1,4,6,8],"tlp":["apit",763],"trp":["pita",834],"tlw":["taip",402],"trw":["pati",50],"lp":["apit","tapi","taip","zpit","atpi"],"rp":["pita","piat","pati","ipat"]},"170":{"input":[2,4,6,8],"tlp":["cip",42],"trp":["pic",402],"trw":["pic",106],"lp":["cip","spit"],"rp":["pic","ipc","pist"]},"171":{"input":[1,2,4,6,8],"tlw":["czapka",41],"trw":["ptak",106],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["rpi",335],"trp":["pier",5070],"trw":["prie",378],"lp":["rpi","erpi","rpie","tpie","epti"],"rp":["pier","ierp","pri","prie","iepr","piet","ipr","it'","iper","pir"]},"173":{"input":[1,3,4,6,8],"tlw":["rzepa",61],"trw":["przez",6795],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["skiper",201],"trw":["piec",482],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["wprawdzie",446],"trw":["przed",3656],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["mi",59941],"trw":["mi",6561],"lp":[],"rp":["mi","im","mni","nim","imi","min","pni","hm","mim","nimi","hmi","imn","him","hip","mini","pin","imni","nmi","pini","imim"]},"177":{"input":[1,5,6,8],"tlp":["ami",9688],"trp":["mia",11078],"tlw":["zanim",753],"trw":["pani",1381],"lp":["ami","zm","zam","zmi","zami","anim","amia","zim","zma","znim","zmia","znam"],"rp":["mia","pani","nami","pami","hmia","mian","mina","maz"]},"178":{"input":[2,5,6,8],"tlp":["smi",4361],"trp":["kim",3177],"tlw":["spij",31],"trw":["kim",153],"lp":["smi","sim","skim"],"rp":["kim","mis","mk","jmni","ism","mkn","ims","kims","pij","kimi","mkni","jmi","jpi","misj","msk","mski","pism"]},"179":{"input":[1,2,5,6,8],"tlw":["wnim",424],"trw":["masz",794],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["emi",3623],"trp":["mie",22534],"trw":["mnie",6049],"lp":["emi","emie","emni","epni"],"rp":["mie","iem","mnie","niem","iemi","mien","ypi","ymi","iemn","hem","pien","imie","pnie","niep","iemy","imy"]},"181":{"input":[1,3,5,6,8],"tlw":["ziemi",986],"trw":["panie",1750],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["siedem",200],"trw":["mniej",628],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["wiem",1473],"trw":["miedzy",1744],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tim",148],"trp":["mit",146],"trw":["mit",116],"lp":["tim","bim","tnim","vim"],"rp":["mit","imit"]},"185":{"input":[1,4,5,6,8],"trw":["itam",129],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"trw":["mscic",37],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["zamiast",457],"trw":["matka",605],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["tymi",175],"trw":["itym",97],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["razem",1159],"trw":["przy",3948],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["smierc",577],"trw":["miec",761],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["tymczasem",730],"trw":["przypis",2677],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["po",79029],"trw":["po",5485],"lp":[],"rp":["po","op","pop","opo","opp","popp","popo"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["apo",1764],"trp":["opa",1101],"lp":["apo"],"rp":["opa","popa"]},"194":{"input":[2,7,8],"tlp":["spo",8518],"trp":["pos",6704],"tlw":["spo",52],"lp":["spo","spos"],"rp":["pos","poso","osp","ospo","posp","pso"]},"195":{"input":[1,2,7,8],"tlp":["wpo",932],"trp":["pow",12141],"trw":["psow",77],"lp":["wpo","wspo","apos","wpow","apow","wpos","awpo","wpop"],"rp":["pow","powo","opow","pows","powa","posa","posw","psow","paso"]},"196":{"input":[3,7,8],"tlp":["epo",395],"trp":["-p",478],"lp":["epo","eop"],"rp":["-p","ope","oppe","poe","peo","peop","-po"]},"197":{"input":[1,3,7,8],"trp":["-pa",318],"trw":["poppea",94],"lp":[],"rp":["-pa"]},"198":{"input":[2,3,7,8],"tlp":["dpo",2241],"trp":["pod",11766],"tlw":["spod",439],"trw":["pod",4050],"lp":["dpo","dop","spod","dopo","espo","epod","dope"],"rp":["pod","odp","odpo","podo","opod","pods","pode","podd","pose","pedo","podp","odep","osep"]},"199":{"input":[1,2,3,7,8],"trw":["powod",76],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["top",1200],"trp":["pot",6309],"trw":["pot",71],"lp":["top"],"rp":["pot","pog","pogo","opot","poto"]},"201":{"input":[1,4,7,8],"tlp":["apot",497],"trp":["poga",110],"lp":["apot","topa"],"rp":["poga","opat","pota"]},"202":{"input":[2,4,7,8],"tlp":["stop",1200],"trp":["poc",5454],"tlw":["stop",300],"lp":["stop","spot","gosp","spog","spoc","cop"],"rp":["poc","post","opc","posc","pco","opco"]},"203":{"input":[1,2,4,7,8],"tlw":["stopa",56],"trw":["postac",287],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["rop",301],"trp":["pro",7398],"trw":["popr",1453],"lp":["rop","epro","tepo"],"rp":["pro","pote","opr","por","popr","potr","opro","prog","poro","pror","opor","-pr","oper","-pro","poet","opre","opet"]},"205":{"input":[1,3,4,7,8],"trw":["pora",123],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["sporo",108],"trw":["prosto",232],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"tlw":["wprost",448],"trw":["prawo",368],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["mo",36877],"trw":["mu",7197],"lp":[],"rp":["mo","mu","om","um","pom","up","omu","pu","omo","omn","pon","pomo","mno","pomn","opn","pun","mom","omp","umn","opu"]},"209":{"input":[1,5,7,8],"tlp":["amo",1213],"trp":["oma",1236],"trw":["panu",545],"lp":["amo","apom","anom","apon","anum"],"rp":["oma","pano","uma","panu","upa","pona","napo","onam","mano","oman","omna","opan","namo","poma","mamo"]},"210":{"input":[2,5,7,8],"tlp":["spoj",1485],"trp":["moj",4972],"tlw":["spoj",47],"trw":["moj",1601],"lp":["spoj","smu","spom","sum"],"rp":["moj","mus","poj","pus","usm","mos","mnos","omos","opus","muj","osm","jmo","jom","jmu","jmuj","pojs"]},"211":{"input":[1,2,5,7,8],"tlw":["samo",635],"trw":["moja",1288],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["emu",3362],"trp":["ome",1246],"trw":["open",44],"lp":["emu","emo","emno"],"rp":["ome","omy","upe","pomy","umy","ypo","omen","mome","ymu","ypom","upy","ume","onem","omny","omne","ypu","-m"]},"213":{"input":[1,3,5,7,8],"trw":["-pan",98],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["domu",1023],"trw":["moje",1112],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["wdomu",466],"trw":["mowy",435],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["tom",725],"trp":["mog",6878],"tlw":["tom",165],"trw":["potu",49],"lp":["tom","topn","gm","gom","bom","gmu","gmun"],"rp":["mog","mot","mut","pob","mutn","moto","umb","mg","ptu","put","mput","motn","ogom"]},"217":{"input":[1,4,5,7,8],"tlw":["toma",53],"trw":["moga",569],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["sposob",1064],"trw":["moc",367],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["smutna",117],"trw":["mnostwo",266],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["temu",761],"trw":["potem",2023],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["forma",589],"trw":["megan",179],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["gdybym",317],"trw":["prostu",339],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["samego",331],"trw":["pewnego",233],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["pol",5926],"trw":["pol",506],"lp":[],"rp":["pol","pl","opi","lop","polo","pil","plo","ipo","pio","poli","pli","lopi","lp","lopo","opl","lip","ipol","opol","pili","pilo"]},"225":{"input":[1,6,7,8],"tlp":["zpo",957],"trp":["poz",4658],"tlw":["zlapal",59],"trw":["poza",483],"lp":["zpo","zapo","apl","apla","apal","apil","alp"],"rp":["poz","pla","pal","pozo","pola","poza","ozp","pali","lopa","ozpa","pala","ozpo","pozi"]},"226":{"input":[2,6,7,8],"tlp":["spok",1225],"trp":["pok",4474],"trw":["polski",326],"lp":["spok","spol"],"rp":["pok","poko","pols","piso","poki","posi","posl","pokl","opok","ospi","klop","opis","ipos","kop","pios","ispo","polk"]},"227":{"input":[1,2,6,7,8],"tlw":["wpol",123],"trw":["powoli",384],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["epl",290],"trp":["pel",2439],"trw":["pole",188],"lp":["epl","eplo","eple","eopl","elp"],"rp":["pel","opie","lep","lepi","pole","ple","iepl","iepo","pele","ople","'l","i'l","'ll","i'll","piel"]},"229":{"input":[1,3,6,7,8],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["dopoki",198],"trw":["polskie",78],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["wpadl",182],"trw":["powiedzial",1337],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["tpl",196],"trp":["piot",350],"trw":["plot",40],"lp":["tpl","tpli","topi"],"rp":["piot","pogl","plot","polg","polt","ptio","pito","ipog","pogi"]},"233":{"input":[1,4,6,7,8],"tlw":["filip",38],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"trw":["pociski",37],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["spotkac",156],"trw":["poczal",800],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"trw":["piotr",231],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"trw":["przeto",243],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["dopiero",1010],"trw":["predko",303],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"trw":["prosze",860],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["mil",4286],"trw":["mimo",629],"lp":[],"rp":["mil","umi","omi","ml","mlo","hlop","oim","pomi","omni","milo","mio","poni","moi","lum","imo","mimo","mion","iom","moim","minu"],"special":"enter"},"241":{"input":[1,5,6,7,8],"trw":["mial",2579],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["spokoj",193],"trw":["musi",771],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["swoim",499],"trw":["mowil",1284],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"trw":["mieli",613],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["zupelnie",861],"trw":["moze",4134],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["spokojnie",378],"trw":["lepiej",825],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["widzialem",345],"trw":["pozniej",689],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"tlw":["tlum",312],"trw":["mogl",1899],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["galima",72],"trw":["mogla",591],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["chlop",216],"trw":["milosc",470],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["chlopak",251],"trw":["mowic",686],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["bylem",489],"trw":["moglem",321],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["zapytal",512],"trw":["potrzeba",320],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["glosem",676],"trw":["ktorym",841],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["bowiem",669],"trw":["petroniusz",731],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/pt-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/pt-keymap.json
new file mode 100644
index 00000000000..afa22643f99
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/pt-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",311],"tlw":["a",279974],"lp":["aa"],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",199930],"tlw":["s",1267],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["as",403955],"tlw":["as",56128],"lp":["as","sa","ssa","ass","sas","asa","assa","ssas","wa","was","ww","sass","asas","www","aw","awa","sw","swa","ws"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",4232],"tlw":["e",282983],"lp":["ee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ex",35539],"tlw":["x",299],"lp":["ex","xa","ea","ae","xe","exe","exa","ax","axa","xx"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["de",603738],"tlw":["de",316379],"lp":["de","es","se","ess","sse","des","ed","esse","ese","ses","dess","dese","ede","eses","sses","sd","esd","sde","desd","esde"],"rp":[]},"7":{"input":[1,2,3],"tlp":["da",290653],"tlw":["da",79087],"lp":["da","ad","ade","ada","dad","dade","das","essa","esa","ase","sad","asse","eda","ades","adas","ssad","desa","edad","sada","sex"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",2738],"tlw":["t",692],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["ta",336586],"tlw":["ta",503],"lp":["ta","at","fa","ata","af","fat","tat","afa","ff","ft","att","tata","taf","atat","ataf","tf","fata","aft","tfa","tta"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["st",220589],"tlw":["c",936],"lp":["st","sc","ct","tc","cc","ts","cs"],"rp":[]},"11":{"input":[1,2,4],"tlp":["ca",291876],"tlw":["casa",8888],"lp":["ca","sta","ac","aca","cas","tas","casa","ast","fac","stas","sca","tac","asta","sf","cac","sac","taca","caca","asc","fas"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["er",412432],"tlw":["ter",11405],"lp":["er","te","re","tr","rt","ter","rr","et","tre","ere","ert","rte","err","rre","ret","terr","ete","etr","rer","tere"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ra",489515],"tlw":["era",37427],"lp":["ra","ar","ara","era","tra","fe","tar","are","rta","ate","art","rar","fr","eta","ef","rra","atr","fer","arr","rat"],"rp":[]},"14":{"input":[2,3,4],"tlp":["est",130667],"tlw":["ser",18726],"lp":["est","ce","ec","res","ser","rec","rd","cr","esc","tes","ece","ste","rc","der","cer","str","erd","este","rece","ces"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["esta",82829],"tlw":["esta",19307],"lp":["esta","car","ras","eca","cad","tad","rac","rad","sar","arec","rda","dar","tras","raca","cada","erda","ard","star","stra","rca"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",5010],"trw":["n",1260],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",281535],"trp":["na",264338],"tlw":["q",346],"trw":["na",47469],"lp":["an","aq","ana","ann","anq","anna","anan","aan"],"rp":["na","nq","naq","nan","nna"]},"18":{"input":[2,5],"base":"j","baseshift":"J","tlp":["sn",220],"trp":["ns",77600],"trw":["j",385],"lp":["sn","sj"],"rp":["ns","nj"]},"19":{"input":[1,2,5],"tlp":["san",8808],"trp":["ja",39162],"tlw":["san",234],"trw":["ja",13037],"lp":["san","ans","aj","sq","ssan","ansa","anas","anj","aja","anja","ajan","wn"],"rp":["ja","nas","nsa","jan","nsan","jas","nja","nsas"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",399933],"trp":["ne",63763],"tlw":["en",763],"trw":["y",1207],"lp":["en","ene","een","ey","enn","enny","eyn","eyne","enen","enne"],"rp":["ne","nen","ny","nny","yn","yne","ney","nne","ye","ynn"]},"21":{"input":[1,3,5],"tlp":["ena",18156],"trp":["ya",615],"tlw":["any",171],"lp":["ena","ane","eq","enq","xan","ay","ean","anny","anea","enx","aen","any","enxe","anen"],"rp":["ya","nea","nx","nxe","nex","nexa"]},"22":{"input":[2,3,5],"tlp":["sen",38594],"trp":["nd",184626],"tlw":["eyes",75],"trw":["nesse",1917],"lp":["sen","end","ens","den","ej","ende","sej","esen","esej","send","eend","sens"],"rp":["nd","nde","je","nse","nes","ness","nden","ndes"]},"23":{"input":[1,2,3,5],"tlp":["and",82846],"trp":["nda",26353],"tlw":["seja",3811],"trw":["nada",9040],"lp":["and","ensa","ande","eja","enas","dan","anda","seja","esq","daq","sand","enda","dand","seq"],"rp":["nda","nad","nada","jane","nand","ndan"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["bt",711],"trp":["nt",380933],"tlw":["b",631],"lp":["bt","bb"],"rp":["nt","nb"]},"25":{"input":[1,4,5],"tlp":["ant",80565],"trp":["nta",60116],"tlw":["tanta",767],"lp":["ant","ab","ba","tan","tant","aba","anta","ban","bat","fan","aban","fant","taq","bata","tab"],"rp":["nta","nf","ntan","nat","ntat"]},"26":{"input":[2,4,5],"tlp":["bs",6193],"trp":["nc",98606],"lp":["bs","bj","cn","bst","sb","bsc","bc"],"rp":["nc","nst","nsc","nts"]},"27":{"input":[1,2,4,5],"tlp":["anc",29762],"trp":["nca",33491],"tlw":["tantas",546],"lp":["anc","sab","cab","anca","can","stan","bas","acab","caba","tanc","bast","cant","sant"],"rp":["nca","ntas","ncas","nsta","nac","nsac","nsf"]},"28":{"input":[3,4,5],"tlp":["ent",207420],"trp":["nte",165647],"tlw":["entre",8275],"trw":["net",250],"lp":["ent","ente","be","br","ten","entr","ren","rn","bre","ber","eb","rent","ern","tent","eren"],"rp":["nte","ntr","ntre","nter","nten"]},"29":{"input":[1,3,4,5],"tlp":["ran",42850],"trp":["ntra",17480],"tlw":["frente",4513],"trw":["nate",648],"lp":["ran","ante","enta","abe","bra","rq","rna","rab","tran","trab","raba","bar","rant","aber","abr","rtan","fren"],"rp":["ntra","ntar","nar"]},"30":{"input":[2,3,4,5],"tlp":["enc",39246],"trp":["ntes",21043],"tlw":["entender",1104],"trw":["neste",1524],"lp":["enc","sent","cen","dent","tend","bec","cent","ceb","tenc","rend","cebe","renc","rceb"],"rp":["ntes","nce","nder","ntec","nec","nece","nstr"]},"31":{"input":[1,2,3,4,5],"tlw":["antes",8436],"trw":["jantar",1170],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",1421],"trw":["i",2965],"lp":[],"rp":["ii","iii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["ai",127585],"trp":["ia",229190],"tlw":["ai",2545],"trw":["ia",3166],"lp":["ai","az","za","zi","zia","azi","azia","aia","aza","zz","aiz","zzi"],"rp":["ia","iz","iza","izi","iai","izia","izz","izzi"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["si",84867],"trp":["is",248469],"tlw":["si",3658],"trw":["is",409],"lp":["si","ssi","sis","ssis","sk","ski"],"rp":["is","iss","isi","ik","ki","issi","iki","ks"]},"35":{"input":[1,2,6],"tlp":["ais",63939],"trp":["isa",27355],"tlw":["saia",685],"lp":["ais","assi","sai","asi","wi","sia","asia","ak","saia","sias","zas","ssia","aisa"],"rp":["isa","ias","isas","issa","ka","iais","ika"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",135404],"trp":["ie",27112],"tlw":["ei",385],"trw":["ie",93],"lp":["ei"],"rp":["ie","iei"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["ze",41552],"trp":["ix",21958],"tlw":["xia",158],"trw":["ix",103],"lp":["ze","ez","aze","xi","eix","aix","eia","eza","eze","eixa","exi","aixa","eixe","axi","ezi","eai"],"rp":["ix","ize","ixa","ixe"]},"38":{"input":[2,3,6],"tlp":["di",149151],"trp":["id",117035],"tlw":["disse",22191],"lp":["di","dis","diss","dei","edi","sid","sei","eis","did","side","esi","essi"],"rp":["id","isse","ide","ise","idi","idei","ke","ied"]},"39":{"input":[1,2,3,6],"tlp":["dia",31205],"trp":["ida",58061],"tlw":["dia",8588],"trw":["ideia",3049],"lp":["dia","diz","deix","zes","dize","ezes","adei","deia","xis","exis","dez","dias","adi","edia","sida","dida"],"rp":["ida","idad","iad","ieda"]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",136577],"trp":["it",117311],"tlw":["vi",1966],"trw":["it",901],"lp":["ti","vi","tiv","viv","vit","tit","vivi","tivi","viti","tv","vii","viii","vitt"],"rp":["it","iv","iti","ivi","itiv","itt"]},"41":{"input":[1,4,6],"tlp":["va",136327],"trp":["ita",29811],"tlw":["vai",6210],"lp":["va","av","ava","fi","tav","tava","via","faz","avi","avia","ati","vai","tia","ativ","tiva","afi"],"rp":["ita","if","ifi","iva"]},"42":{"input":[2,4,6],"tlp":["ci",126068],"trp":["ic",96581],"tlw":["civis",136],"lp":["ci","sti","tic","vis","cis","sit","siv","sic","vist","stiv","ssiv","sist","sci","ck","visi"],"rp":["ic","ist","ici","isc","isti"]},"43":{"input":[1,2,4,6],"tlp":["cia",40513],"trp":["ica",47187],"tlw":["vista",1644],"lp":["cia","stav","fic","fica","aci","cav","fici","cava","tica","sav","cisa","cai","sava","sica","vas"],"rp":["ica","ista","ific","icia","itas"]},"44":{"input":[3,4,6],"tlp":["ri",197607],"trp":["ir",123977],"tlw":["ver",6812],"trw":["ir",3642],"lp":["ri","ve","eri","ver","ev","eir","eit","eve","rei","tir","rv","rit","tive","teri","vr","rri"],"rp":["ir","ive","ite","ire"]},"45":{"input":[1,3,4,6],"tlp":["ria",65506],"trp":["ira",34560],"tlw":["vez",10904],"trw":["iria",1476],"lp":["ria","ari","eria","vez","eira","zer","ave","faze","rav","azer","aria","eva","fei","feit","var","arti","rava","eita"],"rp":["ira","izer"]},"46":{"input":[2,3,4,6],"tlp":["eci",33622],"trp":["iste",8299],"tlw":["tivesse",3417],"lp":["eci","vid","ves","reci","cid","cri","dir","dev","cie","ris","esti","tid","vess","ecis","rid","verd","dire","seri","deve"],"rp":["iste"]},"47":{"input":[1,2,3,4,6],"tlw":["estava",26264],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["in",225142],"trw":["in",1383],"lp":[],"rp":["in","nh","inh","ni","hi","ini","nin","nni","hin","nhi","hn","inin","ninh","hnn"]},"49":{"input":[1,5,6],"tlp":["anh",17458],"trp":["ha",149599],"tlw":["ah",1851],"trw":["ha",7686],"lp":["anh","ain","anha","ani","zin","zinh","ah"],"rp":["ha","nha","inha","ina","ian","han","iq","nia","nz","nina","nai","inz","hia"]},"50":{"input":[2,5,6],"tlp":["sin",6776],"trp":["nsi",8141],"tlw":["sin",78],"trw":["his",425],"lp":["sin","sh","ssin","shi","shin"],"rp":["nsi","ins","his","nis","ij","ji","inis","nsis","insi","nsin","niss","nk","kh","inj","kin"]},"51":{"input":[1,2,5,6],"tlp":["sina",3120],"trp":["has",9127],"tlw":["sinais",487],"trw":["haja",264],"lp":["sina","ansi","wh","ash","ashi","win","sain","anis","wash","siq","ank","wins"],"rp":["has","nhas","inas","nais","iaj","iaja","isq","ija"]},"52":{"input":[3,5,6],"tlp":["enh",22040],"trp":["he",69162],"trw":["he",710],"lp":["enh","eni","enin","ein","enie"],"rp":["he","nhe","ien","hei","nei","nenh","nhei","ine","inhe","nie","hen","nnie","hy","hine","hie"]},"53":{"input":[1,3,5,6],"tlp":["zen",6089],"trp":["izen",1523],"tlw":["annie",302],"lp":["zen","anei","enha","azen","anhe","eina","anie","ezen","xin","xinh"],"rp":["izen","nze","heia","inze","ixan","hae","nzen","hay","ixin","hea"]},"54":{"input":[2,3,5,6],"tlp":["senh",8286],"trp":["ind",27747],"tlw":["she",187],"trw":["keynes",525],"lp":["senh","din","endi","dinh","ensi","eij"],"rp":["ind","ndi","iden","nid","indi","jei","hes","nsid","ndid","nsei","inde","hesi","ines","hid"]},"55":{"input":[1,2,3,5,6],"tlw":["ainda",11235],"trw":["had",467],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["tin",38604],"trp":["nti",28083],"tlw":["bit",131],"lp":["tin","tinh","bi","th","vin","bit","vinh","bin"],"rp":["nti","int","nv","ntin","ib","niv","inv","nit","nvi","ith","ibi","ht"]},"57":{"input":[1,4,5,6],"tlp":["abi",11269],"trp":["hav",21186],"tlw":["tinha",19974],"trw":["havia",12654],"lp":["abi","fin","bai","van","bia","fina","abia","anti","vant"],"rp":["hav","havi","inf","iant","nfi","hava","nif","nav","ntia","inta","nifi"]},"58":{"input":[2,4,5,6],"tlp":["ch",51196],"trp":["nci",30934],"tlw":["this",245],"trw":["nick",345],"lp":["ch","cin","stin","cinc","chi","sint","sib"],"rp":["nci","inc","nic","hist","inci","inst","inic","nici","nist","nsci","nch","nsti","ich"]},"59":{"input":[1,2,4,5,6],"tlw":["sabia",4759],"trw":["jack",1117],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["enti",15708],"trp":["inte",16818],"tlw":["the",5095],"trw":["neve",796],"lp":["enti","bri","rin","ven","the","tenh","vent","vern","env"],"rp":["inte","her","ient","nve","heir","ntei","neir","nver","here","nive","ntir"]},"61":{"input":[1,3,4,5,6],"tlw":["tenha",2165],"trw":["haver",852],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["sentir",1575],"trw":["interesse",884],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["diante",2499],"trw":["instante",1219],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",2403],"trw":["o",225240],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","tlp":["ao",290064],"trp":["oa",20855],"tlw":["ao",31621],"lp":["ao","aao"],"rp":["oa","oao"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",163724],"trp":["os",421052],"tlw":["so",11721],"trw":["os",73145],"lp":["so","sso","sos","ssos","soo"],"rp":["os","oss","osso","oso","osos","oos"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["sao",23278],"trp":["oas",8168],"tlw":["sao",10362],"lp":["sao","soa","aos","ssoa","soas","aso","ssao","asso","wo","asos","woo","asao"],"rp":["oas","ossa","osa","ow","osas","osao","owa","osw"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["eo",6725],"trp":["oe",22866],"trw":["-",58877],"lp":["eo","e-","e-o"],"rp":["oe","o-","-e","-o","o-e"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["xo",11510],"trp":["ox",5327],"trw":["-a",77],"lp":["xo","a-","exo","xao","eao","xoe","exao","xa-","xe-","e-a","axo","axoe","exoe","ao-","a-a"],"rp":["ox","-a","oxa","oxo","-a-"]},"70":{"input":[2,3,7],"tlp":["do",416137],"trp":["od",73365],"tlw":["do",90461],"trw":["-se",74],"lp":["do","dos","esso","edo","eso","dedo","edos","soe","soes","doe","do-"],"rp":["od","ode","odo","oes","-s","-se","odos","osse","ose"]},"71":{"input":[1,2,3,7],"tlp":["ado",79015],"trp":["oda",11723],"tlw":["dado",976],"lp":["ado","ados","dado","sado","dao","a-s","a-se","xado","sexo","eado","xos","da-","dosa","adao","xoes","exos"],"rp":["oda","odas","oeda","owe"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["to",290254],"trp":["ot",25787],"tlw":["to",1894],"lp":["to","go","tot","tto","got","tog","gt","gto","too","gg","goo"],"rp":["ot","og","ogo","oto","ott","otto","otog","ogg"]},"73":{"input":[1,4,7],"tlp":["fo",73193],"trp":["of",13544],"tlw":["tao",9962],"trw":["of",1931],"lp":["fo","ga","ag","tao","ago","ato","aga","fato","fog","tota","gat","fogo","fot","foto","gao","tag","tato"],"rp":["of","ota","oga"]},"74":{"input":[2,4,7],"tlp":["co",405580],"trp":["oc",76923],"tlw":["gosto",1191],"lp":["co","sto","tos","cos","sco","gos","gost","cost","soc","toc","stos","cto","goc","coc","scoc","coco"],"rp":["oc","ost","osto","oco"]},"75":{"input":[1,2,4,7],"tlp":["cao",52031],"trp":["oca",15079],"tlw":["caso",3450],"lp":["cao","acao","aco","fos","foss","stao","caso","gas","sag","acos","sof","atos","sfo","saco","toca","asto"],"rp":["oca","osta","ocas","otas"]},"76":{"input":[3,4,7],"tlp":["ro",189615],"trp":["or",300995],"tlw":["george",652],"trw":["or",278],"lp":["ro","eg","ge","tro","gr","rg","tor","rto","erg","gor","ero","rro","eto","erto"],"rp":["or","ort","orr","ore","orre","orte"]},"77":{"input":[1,3,4,7],"tlp":["for",35880],"trp":["ora",47672],"tlw":["agora",9502],"trw":["ora",1045],"lp":["for","gar","gra","ega","age","aro","fora","agor","gora","arg","egar","rof","arro","rox","rao","rga","fort","agr"],"rp":["ora","orta"]},"78":{"input":[2,3,4,7],"tlp":["ros",31755],"trp":["oce",38021],"tlw":["todos",10399],"lp":["ros","cor","tod","seg","todo","dor","esco","eco","coe","coes","corr","esto","tros","sor","roc"],"rp":["oce","ord","oder","ores","orc"]},"79":{"input":[1,2,3,4,7],"tlw":["fosse",5405],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["ou",187963],"trw":["no",51404],"lp":[],"rp":["ou","no","on","un","nu","nun","nou","ono","uo","nuo","uou","nuou","onn","uno","onou","oou","oun","non","oon","unn"]},"81":{"input":[1,5,7],"tlp":["qu",415783],"trp":["ua",141069],"tlw":["ano",2467],"trw":["nao",106447],"lp":["qu","qua","quan","aqu","ano","au","anu","anqu"],"rp":["ua","nao","uan","nqu","ona","nqua","naqu","nua","una","oq","oqu","uq"]},"82":{"input":[2,5,7],"tlp":["su",74848],"trp":["us",60120],"tlw":["sou",2630],"trw":["nos",20778],"lp":["su","sou","son","ssu","sus","ssou","sun"],"rp":["us","nos","ons","jo","ju","noss","uns","oj","jun","nso","uj","uso","nsou"]},"83":{"input":[1,2,5,7],"tlp":["sua",42963],"trp":["uas",22607],"tlw":["sua",31618],"trw":["nossa",3352],"lp":["sua","anos","suas","quas","squ","aus","ausa","aju","assu","sau"],"rp":["uas","usa","nsao","joa","uja","usan","oja","joao","usao","onsa"]},"84":{"input":[3,5,7],"tlp":["eu",147300],"trp":["ue",347032],"tlw":["eu",43591],"trw":["you",709],"lp":["eu","eno","eun","eon","eu-","enou"],"rp":["ue","uen","u-","one","ou-","ueno","n-","yo","oen","you","ueu","nou-","nue","-n"]},"85":{"input":[1,3,5,7],"tlp":["que",325065],"trp":["ux",2970],"tlw":["que",242225],"trw":["-nao",146],"lp":["que","aque","equ","quen","eque","enqu","xou","xu","exu","xua","exua"],"rp":["ux","uena","nque","uxa","oque","uxo","oux","uxe","ouxe"]},"86":{"input":[2,3,5,7],"tlp":["seu",45915],"trp":["ndo",102634],"tlw":["seu",30091],"trw":["onde",9124],"lp":["seu","eus","du","endo","deu","seus","enos","deus"],"rp":["ndo","ud","ond","und","onde","udo","undo","onse","ude","u-s","u-se","ndeu"]},"87":{"input":[1,2,3,5,7],"tlw":["quando",23534],"trw":["usando",884],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["gu",87969],"trp":["nto",82230],"tlw":["tu",788],"trw":["notou",383],"lp":["gu","tu","bo","tou","gun","gunt"],"rp":["nto","ont","ut","ob","ng","out","unt","ntou","ug","ub","unto","ngu","uto","ong"]},"89":{"input":[1,4,5,7],"tlp":["anto",26539],"trp":["uant",14606],"tlw":["quanto",4990],"trw":["nota",549],"lp":["anto","fu","gua","gan","fun","atu","tua","ang","agu","agua","fon","abo"],"rp":["uant","onta","ntao","uga","uta","onf","unta","nfo"]},"90":{"input":[2,4,5,7],"tlp":["con",88877],"trp":["uc",20930],"tlw":["sob",2880],"trw":["junto",1728],"lp":["con","cu","cont","cons","sob","cou","scu","stou","cob","guns"],"rp":["uc","nco","ntos","ouc","uco","unc","ouco","ncon","ocu","nunc"]},"91":{"input":[1,2,4,5,7],"tlw":["boca",2277],"trw":["nunca",7198],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["ento",36495],"trp":["ur",58598],"tlw":["gente",3137],"trw":["outro",7994],"lp":["ento","egu","ru","gue","rou","tur","rgu","gen","ergu"],"rp":["ur","uer","obr","utr","outr","obre","ontr","utro","onte","ntro","uro"]},"93":{"input":[1,3,4,5,7],"tlw":["entao",11118],"trw":["outra",6635],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["sobre",14110],"trw":["outros",5996],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["grande",7378],"trw":["outras",3514],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["io",92146],"trw":["l",496],"lp":[],"rp":["io","lo","ol","li","oi","il","ili","olo","oli","ll","ilo","ill","lio","iol","oll","oio","lli","ilio","loo","illi"]},"97":{"input":[1,6,7],"tlp":["al",200651],"trp":["la",162745],"tlw":["ali",4130],"trw":["la",8495],"lp":["al","ala","ali","aio","alo","zo","alia","zao","azao"],"rp":["la","oz","lia","ial","ola","liz","iao","ilia","ozi","ila","liza"]},"98":{"input":[2,6,7],"tlp":["sol",10331],"trp":["ois",42788],"tlw":["sol",2060],"trw":["isso",18569],"lp":["sol","sil","sio","sl","ssio","soli","solo"],"rp":["ois","isso","ios","los","iso","ossi","osi","ls","lis","lso","ioso","ols","ok"]},"99":{"input":[1,2,6,7],"tlp":["sal",8453],"trp":["oisa",15190],"tlw":["sala",3032],"trw":["las",303],"lp":["sal","sala","asil","wil","will","soz","sozi","soal","alis","alos","alas","als"],"rp":["oisa","las","isao","iosa","lass","lias","lsa","olsa"]},"100":{"input":[3,6,7],"tlp":["el",253859],"trp":["le",167939],"tlw":["ele",53580],"trw":["lei",1081],"lp":["el","ele","elo","eio","eli","e-l","e-lo","ell"],"rp":["le","lei","ole","-l","ile","-lo","leo","lie","ioe","ilei","oel","iole"]},"101":{"input":[1,3,6,7],"tlp":["ela",75025],"trp":["ixo",8660],"tlw":["ela",31605],"trw":["lixo",278],"lp":["ela","ale","eal","aixo","eliz","eixo","eali","a-l","alei","ael","a-lo"],"rp":["ixo","oxi","lex","oze","-la","lez","leza","ia-","lea"]},"102":{"input":[2,3,6,7],"tlp":["del",18683],"trp":["ido",37514],"tlw":["eles",10957],"trw":["ido",578],"lp":["del","eles","dele","doi","dois","elos","sido","dio","dido","sile","sel","dol"],"rp":["ido","les","odi","lid","ld","idos","ilid","old"]},"103":{"input":[1,2,3,6,7],"tlw":["dela",4626],"trw":["lado",7350],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["vo",89842],"trp":["ito",55627],"tlw":["tio",740],"trw":["logo",3653],"lp":["vo","gi","vol","volt"],"rp":["ito","ig","lt","ov","lg","igo","olt","lv","oit","ovo","lto","liv","log","ivo","lig","lti"]},"105":{"input":[1,4,6,7],"tlp":["alg",28147],"trp":["lta",14607],"tlw":["foi",19254],"lp":["alg","tal","foi","fal","alt","fil","fala","alv","val","agi","alav","talv","fl","voz","gia"],"rp":["lta","iga","ova","olta","lav"]},"106":{"input":[2,4,6,7],"tlp":["voc",35885],"trp":["ico",23673],"tlw":["visto",1856],"trw":["isto",3322],"lp":["voc","coi","cio","cois","cl","col","vos","cil","colo","sig","scol"],"rp":["ico","lic","isto","itos","oci","loc","igos","icio","lc"]},"107":{"input":[1,2,4,6,7],"tlw":["coisa",9623],"trw":["local",1110],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["rio",30701],"trp":["iro",27990],"tlw":["rio",2083],"trw":["livro",2336],"lp":["rio","vel","eiro","eito","tori","rel","rig","erio","tel","rito","rov"],"rp":["iro","ori","ior","lev","ove","lve","ivel","oite","orri"]},"109":{"input":[1,3,4,6,7],"tlw":["talvez",5564],"trw":["levar",1384],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["voce",31586],"trw":["livros",1191],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["claro",3392],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["ho",111008],"trw":["olhou",3514],"lp":[],"rp":["ho","lh","ui","ul","lho","nho","olh","iu","lu","ilh","olho","onh","hu","uni","ulh","inu","ulo","lin","hou","ino"]},"113":{"input":[1,5,6,7],"tlp":["qui",23334],"trp":["lha",27941],"tlw":["aqui",6587],"trw":["luz",3303],"lp":["qui","qual","alh","aqui","alq","alqu","alha"],"rp":["lha","ual","lan","nal","olha","uz","lq","lqu","ualq","ilha","inal","iona","ula"]},"114":{"input":[2,5,6,7],"tlp":["sul",3044],"trp":["hos",17929],"tlw":["sonhos",1378],"trw":["olhos",8588],"lp":["sul","sonh","sion","solu","sui","sino"],"rp":["hos","lhos","uis","onsi","nhos","hoj","usi","ulos","lus","jul","inos","ijo","ku","loj"]},"115":{"input":[1,2,5,6,7],"tlw":["quais",1786],"trw":["loja",754],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["elh",18680],"trp":["lhe",25233],"trw":["lhe",9996],"lp":["elh","elho","enho","enhu","elen"],"rp":["lhe","uel","len","uele","onhe","ulhe","nel","uei","olhe","in-","ilen","ly","-lh","-lhe","nele"]},"117":{"input":[1,3,5,6,7],"tlw":["aquele",3696],"trw":["naquele",1801],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["disse-lhe",457],"trw":["hoje",2804],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["aqueles",1766],"trw":["olhando",2030],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["gui",16504],"trp":["uit",26642],"tlw":["vou",3725],"trw":["novo",4638],"lp":["gui","bl","gin"],"rp":["uit","lgu","uito","uv","nov","ing","ouv","ult","uvi","itu","ouvi","noit","lug","ingu","onti","long","onv"]},"121":{"input":[1,4,5,6,7],"tlw":["filho",2705],"trw":["nova",2638],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["cinco",2400],"trw":["unico",1538],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["alguns",5675],"trw":["unica",1846],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["tenho",3664],"trw":["noite",6059],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["qualquer",7063],"trw":["lugar",5157],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["senhor",5213],"trw":["jeito",1631],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["fazendo",2599],"trw":["historia",3341],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trp":["pp",1293],"trw":["p",1742],"lp":[],"rp":["pp"]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",54655],"trp":["pa",230757],"trw":["papa",278],"lp":["ap","apa","app"],"rp":["pa","pap","papa"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",45986],"trp":["ps",1182],"lp":["sp"],"rp":["ps"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["spa",5532],"trp":["pas",19597],"trw":["passa",679],"lp":["spa","sap","sapa","asp","apas","aps","ssap"],"rp":["pas","pass"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",29704],"trp":["pe",179445],"trw":["pe",2387],"lp":["ep","epe","e'"],"rp":["pe","pee","''"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["ape",14035],"trp":["pape",2221],"lp":["ape","xp","exp","epa","xpe","expe","xpa","expa","a'"],"rp":["pape","'a","pea","px"]},"134":{"input":[2,3,8],"tlp":["esp",37689],"trp":["pes",22163],"trw":["pes",1833],"lp":["esp","spe","espe","dep","depe","sep","desp","sesp","sped","spes","d'","eps","ssep"],"rp":["pes","pess","ped","pede","pd","'s","'d"]},"135":{"input":[1,2,3,8],"tlp":["espa",4992],"trp":["pad",5872],"tlw":["espada",1207],"trw":["pesada",361],"lp":["espa","apes","esap","spad","aspe","sepa","depa","d'a","xped","epas","spea","spx","aspx"],"rp":["pad","pesa","pada","peda","pade"]},"136":{"input":[4,8],"tlp":["tp",287],"trp":["pt",3485],"trw":["pt",2780],"lp":["tp","ttp"],"rp":["pt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["apat",596],"trp":["pat",2789],"tlw":["tapa",93],"lp":["apat","tap","apt","tapa","apta"],"rp":["pat","pata","pta"]},"138":{"input":[2,4,8],"trp":["pc",1162],"lp":[],"rp":["pc"]},"139":{"input":[1,2,4,8],"tlp":["cap",9324],"trp":["pac",6453],"tlw":["capa",572],"trw":["pasta",248],"lp":["cap","capa","spac","apac","scap","capt"],"rp":["pac","pca","paca","past","pact","patc"]},"140":{"input":[3,4,8],"tlp":["rep",8013],"trp":["pr",132035],"trw":["peter",441],"lp":["rep","rp","repe","rpr","rpre","epr","epre","epet","repr","erp"],"rp":["pr","per","pre","pert","pet","pret","pree","prep","pete","pere"]},"141":{"input":[1,3,4,8],"tlp":["apar",7369],"trp":["par",142915],"tlw":["tapete",247],"trw":["para",95245],"lp":["apar","apr","rap","apre","epar","rapa","xper","repa","xpr","expr","xpre","aper"],"rp":["par","para","pare","part","pra","pera","prat","perf"]},"142":{"input":[2,3,4,8],"tlp":["resp",11738],"trp":["pres",18252],"tlw":["espere",312],"trw":["perder",886],"lp":["resp","sper","spec","depr","cep","epc","cepc","spet","rsp"],"rp":["pres","prec","pec","perd","perc","pedr","pect","pers","pesc","pred","pest"]},"143":{"input":[1,2,3,4,8],"tlw":["apesar",1985],"trw":["parece",2731],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["mp",67484],"trw":["m",1887],"lp":[],"rp":["mp","mm","pn","mn","nm"]},"145":{"input":[1,5,8],"tlp":["am",185140],"trp":["ma",359934],"tlw":["ama",422],"trw":["ma",502],"lp":["am","ama","amp","aman","ampa","apan"],"rp":["ma","man","mpa","pan","mana","mpan","nam","mam","maq","pam","mama","map","mapa","nama"]},"146":{"input":[2,5,8],"tlp":["sm",24615],"trp":["nsp",908],"lp":["sm"],"rp":["nsp","nsm","ms"]},"147":{"input":[1,2,5,8],"tlp":["sam",7995],"trp":["mas",58930],"tlw":["sam",195],"trw":["mas",44387],"lp":["sam","sma","span","asam","asm","ssam","amas","smas","asma","ansp","ansm"],"rp":["mas","jam","nsam","jama","mass","jap","maj","mans","mpas"]},"148":{"input":[3,5,8],"tlp":["em",283802],"trp":["me",270378],"tlw":["em",82946],"trw":["me",23412],"lp":["em","emp","eme","emen","epen","empe","emm","eem"],"rp":["me","men","pen","mem","nem","mpe","my","mpen","n'","mmy","pene","ym"]},"149":{"input":[1,3,5,8],"tlp":["ame",42844],"trp":["pena",8675],"tlw":["emma",305],"trw":["mae",5046],"lp":["ame","amen","ema","apen","eman","xem","exem","xemp","xam","exam"],"rp":["pena","mae","peq","mane","name","mea","mame","max","pame","nema"]},"150":{"input":[2,3,5,8],"tlp":["sem",29109],"trp":["mes",30950],"tlw":["sem",13046],"trw":["meses",1641],"lp":["sem","esm","dem","semp","ssem","dm","sme","esme","smen","seme"],"rp":["mes","mesm","pens","med","mens","pend","mese","mend","ndep","mped"]},"151":{"input":[1,2,3,5,8],"tlw":["apenas",7324],"trw":["mesma",4037],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["tm",964],"trp":["mb",32610],"lp":["tm","bm"],"rp":["mb"]},"153":{"input":[1,4,5,8],"tlp":["tam",28816],"trp":["mat",4959],"tlw":["fama",211],"trw":["matt",334],"lp":["tam","amb","tamb","fam","atam","tama","amba","tamp","bam","abam","atm"],"rp":["mat","mant","mba","ntam","mata","pant","mbat","mpat","matt"],"special":"numsym"},"154":{"input":[2,4,5,8],"tlp":["cm",156],"trp":["mc",119],"tlw":["cm",85],"lp":["cm","cmm"],"rp":["mc","mcc"]},"155":{"input":[1,2,4,5,8],"tlw":["cama",2189],"trw":["maca",202],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["rm",41396],"trp":["ment",85913],"tlw":["bem",13447],"trw":["mente",2130],"lp":["rm","tem","bem","temp","emb","rem","empr","erm","rme","embr","term"],"rp":["ment","mpr","mpre","mer","mbr","mbe","mbem","met","ntem"]},"157":{"input":[1,3,4,5,8],"tlw":["tambem",10764],"trw":["mar",1598],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["sempre",8109],"trw":["presente",1043],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["certamente",1039],"trw":["pensar",2492],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"!","trp":["pi",24405],"lp":[],"rp":["pi","ip","ipi","pip","ppi","ipp","pipp","ippi"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["api",7700],"trp":["pai",11844],"trw":["pai",5571],"lp":["api","apaz","apai","zap","apia","zip"],"rp":["pai","paz","ipa","pia","ipai","piz","pizz","pazz"]},"162":{"input":[2,6,8],"tlp":["spi",5606],"trp":["isp",2854],"lp":["spi","sip","ssip"],"rp":["isp","pis","psi"]},"163":{"input":[1,2,6,8],"tlp":["apis",171],"trp":["pais",4098],"trw":["pais",2931],"lp":["apis","spia"],"rp":["pais","ispa","pisa","pias"]},"164":{"input":[3,6,8],"tlp":["epi",511],"trp":["pei",5264],"lp":["epi"],"rp":["pei","ipe","i'","pie","pipe"]},"165":{"input":[1,3,6,8],"tlp":["apei",323],"trp":["paix",1055],"trw":["peixe",323],"lp":["apei","a'z","a'za","zipe"],"rp":["paix","paze","peix","pez","peza","'z","'za","peia"]},"166":{"input":[2,3,6,8],"tlp":["espi",3719],"trp":["pedi",4130],"trw":["pedi",235],"lp":["espi","spei","disp","epis"],"rp":["pedi","pid","pide","peis","pied","ipes","i'd","ispe","kesp"]},"167":{"input":[1,2,3,6,8],"tlw":["despedida",129],"trw":["paises",490],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["tip",3741],"trp":["pit",4493],"lp":["tip","tipi"],"rp":["pit"]},"169":{"input":[1,4,6,8],"tlp":["apit",3841],"trp":["pita",2323],"lp":["apit","vap","apav"],"rp":["pita","pati","pav","pava","pavi"]},"170":{"input":[2,4,6,8],"tlp":["cip",5141],"trp":["pist",660],"lp":["cip","cipi","spit","scip"],"rp":["pist","pisc","psic","icip","pic","ipic","ipc","pci","ipci"]},"171":{"input":[1,2,4,6,8],"tlw":["capaz",1624],"trw":["passava",922],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["rip",238],"trp":["pri",25730],"tlw":["repetir",222],"trw":["piper",124],"lp":["rip","trip","repi","tepi","epit"],"rp":["pri","peri","pir","peit","piri","peti","prie","priv","prev","pire","prir","iper","it'","prei","ptei"]},"173":{"input":[1,3,4,6,8],"tlw":["rapaz",1561],"trw":["partir",1512],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["especie",1783],"trw":["pedir",815],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["esperava",1003],"trw":["parecia",5095],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["im",105296],"trw":["mim",6113],"lp":[],"rp":["im","mi","min","minh","imp","mim","nim","imi","mini","pin","ph","inim","nimi","pini","imin","mpi","hip","phi","imm","him"]},"177":{"input":[1,5,6,8],"tlp":["ami",18005],"trp":["mai",54885],"tlw":["amanha",798],"trw":["minha",12630],"lp":["ami","amin","anim","amai","ziam","aph"],"rp":["mai","ima","iam","ham","nham","mina","manh","hama","panh","nima","mia","impa","inam","imai"]},"178":{"input":[2,5,6,8],"tlp":["sim",20054],"trp":["mis",5228],"tlw":["sim",4845],"trw":["jim",693],"lp":["sim","ssim","simp","smi","spin","smis","sism","simi"],"rp":["mis","miss","jim","ism","mik","nism","insp","jimm","nspi","nsmi","mins","mk"]},"179":{"input":[1,2,5,6,8],"tlw":["assim",9572],"trw":["mais",42140],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["emi",2072],"trp":["ime",24625],"trw":["i'm",90],"lp":["emi","eph","emin","eim"],"rp":["ime","mei","imen","imei","meni","impe","inem","penh","immy","hem","mine","ymi","mie","peni","phie","pime"]},"181":{"input":[1,3,5,6,8],"trw":["menina",1204],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["seph",283],"trw":["pensei",1244],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["demais",2703],"trw":["medida",966],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tim",10629],"trp":["mit",5096],"tlw":["vim",252],"trw":["http",287],"lp":["tim","vim","timi","thm","bmi"],"rp":["mit","ntim","miti","imit","mbi","itim","imb","pint","itm","mbin","htm","http","mith","mint","himb"]},"185":{"input":[1,4,5,6,8],"tlw":["tinham",4868],"trw":["haviam",2041],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"tlw":["smith",280],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["cima",3152],"trw":["incapaz",367],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["vem",1339],"trw":["permitir",306],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["fazem",993],"trw":["primeira",3896],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["devem",852],"trw":["presidente",1153],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["estavam",5892],"trw":["imediatamente",1406],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["po",224923],"trw":["po",410],"lp":[],"rp":["po","op","opo","pop","opp","oop"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["apo",6185],"trp":["opa",1837],"trw":["pao",557],"lp":["apo","apao"],"rp":["opa","pao","papo","popa"]},"194":{"input":[2,7,8],"tlp":["spo",12061],"trp":["pos",28599],"trw":["posso",2774],"lp":["spo","spos","sop"],"rp":["pos","poss","opos","osp","pso","poso"]},"195":{"input":[1,2,7,8],"tlp":["apos",2721],"trp":["posa",1096],"tlw":["apos",1872],"trw":["passo",1318],"lp":["apos","sapo","sopa","apso"],"rp":["posa","opas","pow"]},"196":{"input":[3,7,8],"tlp":["epo",16405],"trp":["ope",1755],"trw":["poe",134],"lp":["epo","eop","eopo","e-p"],"rp":["ope","poe","o'","peo","peop","-p","oope"]},"197":{"input":[1,3,7,8],"tlp":["xpo",537],"trp":["peao",87],"lp":["xpo","expo"],"rp":["peao"]},"198":{"input":[2,3,7,8],"tlp":["depo",14313],"trp":["pod",31617],"tlw":["espesso",79],"trw":["pode",9510],"lp":["depo","espo","epos","spoe"],"rp":["pod","pode","peso","pose","ospe","pos-","poes","osep","opes"]},"199":{"input":[1,2,3,7,8],"tlw":["esposa",847],"trw":["pessoas",7432],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["top",1854],"trp":["pot",800],"tlw":["topo",438],"lp":["top","topo"],"rp":["pot","opt","pg","pto","ptop"]},"201":{"input":[1,4,7,8],"tlp":["apag",291],"trp":["pag",4975],"trw":["pag",402],"lp":["apag","apg","apto"],"rp":["pag","paga","pato","pago","opag","opat"]},"202":{"input":[2,4,7,8],"tlp":["cop",1332],"trp":["post",6329],"tlw":["copo",522],"trw":["posto",634],"lp":["cop","copo","copt","coop"],"rp":["post","poc","poco","opc","pco","opco","pgc","pgcs"]},"203":{"input":[1,2,4,7,8],"tlw":["sapatos",482],"trw":["opcao",191],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["rop",10909],"trp":["por",83084],"tlw":["reporter",133],"trw":["por",51332],"lp":["rop","ropr","rpo","ropo"],"rp":["por","pro","port","perg","prop","opr","orp","orpo","peg","pore","preo","preg","pero","opor","pego","prot"]},"205":{"input":[1,3,4,7,8],"tlw":["aeroporto",244],"trw":["porta",4885],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["corpo",3692],"trw":["poder",3010],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"tlw":["resposta",1706],"trw":["professor",1075],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["um",243291],"trw":["um",108193],"lp":[],"rp":["um","om","mo","mu","omo","mpo","omp","pu","num","pon","up","pou","mun","mon","nom","mom","upo","mou","omu","oup"]},"209":{"input":[1,5,7,8],"tlp":["amo",18697],"trp":["uma",107111],"tlw":["amo",321],"trw":["uma",83293],"lp":["amo","ampo","apon","amou","aum"],"rp":["uma","mao","oma","upa","numa","ompa","uman","oman","pau","mano","oupa","onam","maqu","mau","namo"]},"210":{"input":[2,5,7,8],"tlp":["smo",16965],"trp":["mos",29583],"tlw":["som",1252],"trw":["pousou",166],"lp":["smo","spon","som","sup","susp","sum","supo","somo","smos","ssum","spu"],"rp":["mos","mpos","mus","usp","omos","mons","pons","upos","pous"]},"211":{"input":[1,2,5,7,8],"tlw":["soma",177],"trw":["maos",4073],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["emo",14088],"trp":["ome",42557],"trw":["meu",13196],"lp":["emo","empo","emon"],"rp":["ome","meu","uem","omen","meno","omem","ume","mome","nome","nume","upe","umen","-m","-me","ompe","peu","memo"]},"213":{"input":[1,3,5,7,8],"tlw":["quem",7441],"trw":["pequeno",2129],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"trw":["mesmo",14794],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["damon",277],"trw":["pensando",1275],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["gum",14061],"trp":["mbo",6406],"tlw":["bom",4344],"trw":["ponto",2616],"lp":["gum","tom","bom","tum","ttom","tomo","tmo","gm"],"rp":["mbo","pont","omb","mot","mont","pub","put","pob","mput","moto","umb","utom"]},"217":{"input":[1,4,5,7,8],"tlw":["apontou",487],"trw":["ponta",807],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["com",79743],"trw":["pouco",7236],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["campo",1321],"trw":["moca",1091],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["tempo",10746],"trw":["momento",4691],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["forma",4643],"trw":["porque",9040],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["comecou",3483],"trw":["ombros",1499],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["estamos",1849],"trw":["pensamentos",1108],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["pl",22248],"trw":["polo",95],"lp":[],"rp":["pl","poi","pol","pli","ipo","plo","poli","lp","pio","opi","ipio","pil","olp","ppl","poio","lop","pilo","ipl","lip","ipli"]},"225":{"input":[1,6,7,8],"tlp":["apoi",894],"trp":["pal",9950],"tlw":["apoio",472],"trw":["paola",89],"lp":["apoi","alp","appl","apl","apli","apol","apla","alpa"],"rp":["pal","pla","pala","ipal","lpa","pali","lap","poia","opia","pila","lapi","palp"]},"226":{"input":[2,6,7,8],"tlp":["spio",144],"trp":["pois",18374],"trw":["pois",4416],"lp":["spio","spl"],"rp":["pois","posi","ispo","plos","ospi","piso","ipos","pios","psl"]},"227":{"input":[1,2,6,7,8],"trw":["lapis",171],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["epoi",14052],"trp":["pel",32898],"trw":["pelo",11997],"lp":["epoi","epl","epli","elop","elip","eple"],"rp":["pel","pelo","ple","pele","lpe","olpe","pple","pole","lope","poei","lipe","leop","l'","peli"]},"229":{"input":[1,3,6,7,8],"tlw":["apple",759],"trw":["pela",10602],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["depois",13958],"trw":["pelos",3503],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["explosao",225],"trw":["podia",5600],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["tipo",3460],"trp":["pov",1630],"tlw":["tipo",3053],"trw":["povo",1274],"lp":["tipo","golp","gip","tipl"],"rp":["pov","povo","ipot","polt","pito","polv","pig","ltip"]},"233":{"input":[1,4,6,7,8],"tlw":["galpao",98],"trw":["patio",409],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"tlw":["tipos",407],"trw":["politico",317],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["capitao",887],"trw":["policia",1169],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"tlw":["golpe",619],"trw":["proprio",2614],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"trw":["propria",2409],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["respeito",2148],"trw":["possivel",2464],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["rapido",1145],"trw":["poderia",4184],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["mui",26105],"trw":["mil",1923],"lp":[],"rp":["mui","lm","hom","mpl","mil","hum","mul","imo","mulh","omi","impo","nhum","mili","impl","lim","minu","ompl","pul","mplo","umi"],"special":"enter"},"241":{"input":[1,5,6,7,8],"tlw":["alma",1095],"trw":["mal",2849],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["suponho",319],"trw":["possui",298],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["almas",218],"trw":["humanos",876],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"tlw":["elmo",138],"trw":["homem",8542],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["alem",3586],"trw":["nenhuma",2224],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["simples",1787],"trw":["homens",5348],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["zaphod",507],"trw":["podiam",1009],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"tlw":["tumulo",138],"trw":["muito",18767],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["alguma",5734],"trw":["ultima",1690],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["comigo",1864],"trw":["muitos",2820],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["algumas",3503],"trw":["muitas",2792],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["vermelho",829],"trw":["melhor",5197],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["alguem",4202],"trw":["maior",3758],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["simplesmente",1695],"trw":["mulheres",2796],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["completamente",1313],"trw":["marido",1424],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/ro-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/ro-keymap.json
new file mode 100644
index 00000000000..0bed185ec58
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/ro-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",511],"tlw":["a",83146],"lp":["aa","aaa"],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",3507],"tlw":["s",933],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["sa",334071],"tlw":["sa",168486],"lp":["sa","as","asa","sas","ssa","asas","wa","aw","sw","ass","ws","was"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",21380],"tlw":["e",25573],"lp":["ee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ea",331408],"tlw":["ea",17717],"lp":["ea","ex","eea","ae","xa","exa","xe","exe","ax"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["de",474727],"tlw":["de",299045],"lp":["de","se","es","ed","des","ese","ede","ses","sese","dee","sed","dese","sse","ess","edes","esed","sede","dd","eed","eses"],"rp":[]},"7":{"input":[1,2,3],"tlp":["da",156223],"tlw":["da",10448],"lp":["da","ad","ase","eas","dea","sea","ada","ade","dad","esa","edea","deas","ases","adea","asea","esea","sase","eeas","dade","ew"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",3013],"tlw":["t",835],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["at",414820],"tlw":["fata",15507],"lp":["at","ta","ata","fa","tat","af","fat","atat","fata","tf","afa","tata","ft","afat","fta","ff","att","tta","ftat","atf"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["st",311126],"tlw":["c",706],"lp":["st","sc","ct","cc","tc","ts"],"rp":[]},"11":{"input":[1,2,4],"tlp":["ca",523509],"tlw":["ca",133317],"lp":["ca","ac","sta","ast","cat","aca","fac","asta","sca","asc","cas","asca","act","sf","stat","sat","casa","sfa","tac","faca"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["re",521801],"tlw":["te",15374],"lp":["re","te","er","tr","tre","et","rt","ere","rte","ter","ete","ret","tere","etr","ert","rer","tet","etre","rere","eret"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ar",509043],"tlw":["era",39299],"lp":["ar","ra","are","ate","era","rea","ara","tea","fe","tra","art","rat","arte","tar","tate","far","rta","area","fara","fr"],"rp":[]},"14":{"input":[2,3,4],"tlp":["ce",303452],"tlw":["ce",59249],"lp":["ce","ec","est","ste","este","cr","str","ces","dr","rec","cest","rc","rs","cre","res","cer","dec","esc","rd","cee"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["car",108000],"tlw":["care",72655],"lp":["car","care","ace","dar","cea","dat","eca","ras","aces","dac","daca","stra","data","acea","ecat","ceea","face","rca","east","astr"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",3834],"trw":["n",1145],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",216706],"trp":["na",142605],"tlw":["an",1202],"trw":["na",594],"lp":["an","ana","ann","anan","anna","aq","anaq"],"rp":["na","nan","nna","naq"]},"18":{"input":[2,5],"base":"j","baseshift":"J","tlp":["sn",3093],"trp":["ns",69609],"trw":["j",435],"lp":["sn"],"rp":["ns","nj"]},"19":{"input":[1,2,5],"tlp":["aj",20324],"trp":["nsa",12265],"tlw":["sansa",539],"trw":["nas",518],"lp":["aj","ans","san","ansa","anj","sana","aja","saj","sans","anja","asan","wn","anas","awn"],"rp":["nsa","ja","nas","nja","nsas","jan"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",157322],"trp":["ne",182563],"tlw":["en",86],"trw":["ne",11044],"lp":["en","ene","ey","eyn","enn","eye","een","enen","eyne","enny","enne"],"rp":["ne","yn","nen","nne","ny","nee","ye","nny","yne"]},"21":{"input":[1,3,5],"tlp":["ane",10158],"trp":["nea",30604],"tlw":["anne",526],"trw":["nea",342],"lp":["ane","enea","ena","ean","anee","ay","anne","anea","anen","xan","exan","eann","aye","eane","anx"],"rp":["nea","ya","nay","yx","nx"]},"22":{"input":[2,3,5],"tlp":["ej",6230],"trp":["nd",131965],"tlw":["sens",684],"trw":["je",103],"lp":["ej","sen","den","ens","dej","end","dy","sens","sey","ssey","seyn"],"rp":["nd","nde","nse","je","nes","ndes","nses","jd","ys"]},"23":{"input":[1,2,3,5],"tlp":["and",65203],"trp":["nda",9766],"tlw":["deja",3062],"trw":["new",498],"lp":["and","dan","anda","ande","eja","deja","adan","anse","dane","dans","esan","esaj","eaj"],"rp":["nda","ndea","nsea","neas","nand","new","jea"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["bt",2355],"trp":["nt",306047],"tlw":["b",322],"lp":["bt","bb"],"rp":["nt","nb"]},"25":{"input":[1,4,5],"tlp":["ba",71864],"trp":["nta",47119],"tlw":["ba",2052],"trw":["nat",115],"lp":["ba","ant","ab","tan","bat","anta","aba","ban","tant","bab","tana","bata","anat","fan","tab"],"rp":["nta","nat","nf","ntat","nata"]},"26":{"input":[2,4,5],"tlp":["bs",4364],"trp":["nc",92637],"lp":["bs","cn","bc","bst","sb","tj"],"rp":["nc","nst","nct","jb"]},"27":{"input":[1,2,4,5],"tlp":["can",32837],"trp":["nca",22051],"tlw":["banca",519],"trw":["nasca",92],"lp":["can","anc","stan","anca","cant","bas","abs","bast","cab","taj","tanc","acan","banc","sab"],"rp":["nca","ncat","nsta","nast","nanc","nsf"]},"28":{"input":[3,4,5],"tlp":["ent",84157],"trp":["ntr",104253],"tlw":["brett",483],"trw":["nr",169],"lp":["ent","entr","eb","reb","treb","be","rb","br","rn","ten","ren","ern","rbe","tent"],"rp":["ntr","nte","ntre","ner","nter","net"]},"29":{"input":[1,3,4,5],"tlp":["ran",24100],"trp":["ntra",6602],"tlw":["barbat",1660],"lp":["ran","enta","bar","eba","reba","rba","bra","tran","arb","rab","arba","bea","barb","rbat","rant","ante"],"rp":["ntra","nar","ntea","neat"]},"30":{"input":[2,3,4,5],"tlp":["cen",5052],"trp":["nce",27047],"tlw":["recent",181],"trw":["jerry",121],"lp":["cen","dent","bes","cent","rbes","bse","sten","sent","bser","best"],"rp":["nce","ncer","ndr","nec","ndre","ncet","ncr","ndc","ncre","nstr"]},"31":{"input":[1,2,3,4,5],"tlw":["cand",24121],"trw":["jeff",677],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",110946],"trw":["ii",23134],"lp":[],"rp":["ii","iii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["ai",175637],"trp":["ia",127873],"tlw":["ai",14411],"trw":["ia",3588],"lp":["ai","zi","az","za","aza","aia","azi","zia","zii","azia","aii","aiz","azii"],"rp":["ia","iz","iza","izi","iaz","iaza","izii"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["si",392768],"trp":["is",116257],"tlw":["si",229731],"trw":["isi",19173],"lp":["si","sis","sii","sk","ski","ssi","sisi","siss"],"rp":["is","isi","ki","ik","ks","iis","isk","iss","iki","kik","kiki","isis"]},"35":{"input":[1,2,6],"tlp":["asi",21012],"trp":["isa",3757],"tlw":["zis",2561],"trw":["iasa",754],"lp":["asi","zis","sai","sia","ak","wi","asis","sasi","wis","ais","aias","saiz","asii","zas","zias"],"rp":["isa","ias","ka","iasa","iasi"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",94946],"trp":["ie",135041],"tlw":["ei",24160],"trw":["iei",524],"lp":["ei","eie","eii"],"rp":["ie","iei"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["ez",32829],"trp":["ize",3487],"tlw":["zeii",292],"trw":["izea",421],"lp":["ez","ze","eze","ezi","xi","exi","aie","eza","eia","eaz","eaza","aze","zea","zie","zei","eai","eiz","eize"],"rp":["ize","ix"]},"38":{"input":[2,3,6],"tlp":["di",145395],"trp":["id",28001],"tlw":["desi",3541],"trw":["iesi",1561],"lp":["di","esi","edi","dis","desi","sie","sid","side","die","sise","sei","sedi"],"rp":["id","ise","ide","ies","idi","iesi","ke","idee"]},"39":{"input":[1,2,3,6],"tlp":["zise",7538],"trp":["ida",1906],"tlw":["zise",6592],"trw":["ideea",1322],"lp":["zise","xis","exis","adi","dia","sez","asez","edia","seza","easi","dai","zid","esia","aies","dez","aid","ezis","aide","ake"],"rp":["ida"]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",295163],"trp":["it",151806],"tlw":["ti",1335],"trw":["iti",3989],"lp":["ti","vi","tii","tit","tiv","vit","vii","titi","viit","tivi","tv"],"rp":["it","iv","iti","ivi","ivit","iit","itii","itiv","itit"]},"41":{"input":[1,4,6],"tlp":["va",110914],"trp":["ita",36266],"tlw":["fi",38843],"trw":["iata",1833],"lp":["va","fi","ati","av","tia","fii","vaz","zit","via","viat","ava","tai","tati","atii"],"rp":["ita","iat","itat","iata","iva","if"]},"42":{"input":[2,4,6],"tlp":["ci",156406],"trp":["ic",148028],"tlw":["ci",3836],"trw":["ici",186],"lp":["ci","sti","sit","cit","cti","tic","stii","stit","tis","vic","ctiv","vis","cii","sist"],"rp":["ic","ici","ist","isc","isti","itic"]},"43":{"input":[1,2,4,6],"tlp":["aci",11683],"trp":["ica",34598],"tlw":["aici",9541],"lp":["aci","aic","aici","caz","stia","acti","zic","fic","cati","caci","cia","asti","tica","faci","cai"],"rp":["ica","ista","icat","isca","ific"]},"44":{"input":[3,4,6],"tlp":["ri",261934],"trp":["ir",38667],"tlw":["trei",5142],"trw":["ieri",560],"lp":["ri","ve","ev","eri","vr","vre","tie","riv","tri","eti","rie","rei","rit","rivi","rti"],"rp":["ir","ire","ite","ier","iet"]},"45":{"input":[1,3,4,6],"tlp":["eva",33520],"trp":["iar",32094],"tlw":["avea",12237],"trw":["iar",16087],"lp":["eva","ari","ave","vea","fie","avea","rez","var","ria","evar","arti","reze","feri","vrea","vara","teva","rai","raz"],"rp":["iar","irea"]},"46":{"input":[2,3,4,6],"tlp":["ric",22696],"trp":["ice",14452],"tlw":["cei",7477],"trw":["iesit",918],"lp":["ric","eci","esti","dev","dic","cev","cei","ris","cri","ved","vede","rid","ves","ridi","eric","scri"],"rp":["ice","iste","iec","idic"]},"47":{"input":[1,2,3,4,6],"tlw":["ceva",11423],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["in",750933],"trw":["in",184145],"lp":[],"rp":["in","ni","hi","ini","nii","iin","hii","nin","ih","hn","inii","nni","ihn","iini","hin","inn","ihi","nh","hni","inin"]},"49":{"input":[1,5,6],"tlp":["ani",21231],"trp":["ina",49485],"tlw":["ani",6375],"trw":["hai",1393],"lp":["ani","ain","aini","ah","aha","anii","zin","zan"],"rp":["ina","ha","hia","nai","inai","nain","nz","hai","nia","han","ian","nza"]},"50":{"input":[2,5,6],"tlp":["sin",18411],"trp":["ins",33866],"tlw":["sin",190],"trw":["jh",411],"lp":["sin","sh","sih","sini","sni"],"rp":["ins","nis","ij","his","nsi","inis","ji","isn","iji","insi","jin","ijin","nsis","nk","nik"]},"51":{"input":[1,2,5,6],"tlp":["asin",3239],"trp":["insa",9893],"tlw":["ash",252],"trw":["insa",7993],"lp":["asin","sina","aji","ank","siha","sha","ash","ansi","ajii","anis","asni"],"rp":["insa","ija","hisa","hans","jak","kan","jah","ijah","hka"]},"52":{"input":[3,5,6],"tlp":["eni",33619],"trp":["ine",65502],"tlw":["eh",87],"trw":["hei",371],"lp":["eni","enii","ein","enin","eh","enie"],"rp":["ine","he","nei","ien","nie","hei","nein","inei","hen","heie","nnie","niei","hne","hie"]},"53":{"input":[1,3,5,6],"tlp":["aine",3733],"trp":["inea",7586],"trw":["haine",380],"lp":["aine","zen","ezen","enz","anie","ezin","enza","zne","azne","ezn","ezna","enzi"],"rp":["inea","nez","neze","hea","iena","nze","heia","neaz"]},"54":{"input":[2,3,5,6],"tlp":["din",90282],"trp":["ind",36487],"tlw":["din",67566],"trw":["iesind",261],"lp":["din","sine","dine","edin","enis","ensi"],"rp":["ind","ndi","inse","inde","iind","indi","hise","iden","nsid","hid","nise","hes","hide","nind"]},"55":{"input":[1,2,3,5,6],"tlw":["sinea",401],"trw":["jake",478],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["bi",58255],"trp":["int",156160],"tlw":["vin",1566],"trw":["intii",232],"lp":["bi","tin","bin","vin","th","bit","vint","tint"],"rp":["int","nti","ib","nit","inti","ntin","nv","ibi","iint","inv","nvi","ntii"]},"57":{"input":[1,4,5,6],"tlp":["abi",11731],"trp":["inta",22656],"tlw":["abia",2225],"trw":["nava",1620],"lp":["abi","aint","van","fiin","zb","tina","vant","bia","atin","bai","abia","babi","vina","bati","aib"],"rp":["inta","inf","nav","iba","inat"]},"58":{"input":[2,4,5,6],"tlp":["ch",61576],"trp":["inc",60349],"tlw":["cinci",2724],"trw":["nici",22847],"lp":["ch","chi","cin","sch","schi","chii","chis","stin","cinc","bis"],"rp":["inc","nic","nici","nci","nist","inci","nch","nchi","inch","nsti"]},"59":{"input":[1,2,4,5,6],"tlw":["stiinta",654],"trw":["inca",8005],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["rin",33243],"trp":["intr",61098],"tlw":["bine",14803],"trw":["intre",5472],"lp":["rin","bine","ven","veni","tine","rint","enti","rni","enit","rbi","even","bir","bie"],"rp":["intr","inte","nev","ient","inev","ibe","iber"]},"61":{"input":[1,3,4,5,6],"tlw":["tinea",1218],"trw":["inainte",6948],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["dintre",7665],"trw":["niste",5419],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["chiar",12228],"trw":["incerca",1941],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",1200],"trw":["o",113236],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","tlp":["ao",642],"trp":["oa",151490],"trw":["oa",179],"lp":["ao"],"rp":["oa"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",36626],"trp":["os",73956],"tlw":["so",137],"trw":["os",129],"lp":["so","sos","sso"],"rp":["os","oss","oso","oos"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["soa",8768],"trp":["oas",22126],"lp":["soa","aso","wo","swo","sow","woo","asoa","sowa","asso","ssow","aos"],"rp":["oas","oasa","ow","osa","ossa","owa","oass","ows"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["e-",29604],"trp":["-o",27659],"trw":["-",97955],"lp":["e-","eo","e-o"],"rp":["-o","oe","-e","o-","-o-"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["a-",46041],"trp":["-a",104204],"tlw":["a-",97],"trw":["-a",320],"lp":["a-","e-a","eoa","a-a","a-o"],"rp":["-a","ox","-a-"]},"70":{"input":[2,3,7],"tlp":["do",69536],"trp":["od",23024],"tlw":["s-o",6502],"lp":["do","s-","s-o","de-","deo","eod","deod","eso","eos","deos","eose","e-s"],"rp":["od","-s","ose","-se","ode","odo","oses","osse"]},"71":{"input":[1,2,3,7],"tlp":["sa-",34714],"trp":["oda",11577],"tlw":["s-a",12787],"trw":["oase",184],"lp":["sa-","s-a","doa","a-s","sa-s","de-a","eoda","deoa","ado","asa-","da-"],"rp":["oda","oase","-as","-ad","-ade","osea","oad","oada","odea"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["to",107166],"trp":["ot",74165],"tlw":["tot",13553],"trw":["otto",232],"lp":["to","tot","go","tog","tto","toto","gg","got","gt","gto","togo","tg"],"rp":["ot","og","oto","ott","otog","ogo","otto","oog"]},"73":{"input":[1,4,7],"tlp":["ga",71011],"trp":["oat",31855],"tlw":["toata",5023],"trw":["ofta",463],"lp":["ga","fo","toa","ag","toat","gat","ato","foa","aga","atoa","gata","ago","goa"],"rp":["oat","of","oata","ota","oga","oft","ogat"]},"74":{"input":[2,4,7],"tlp":["co",95698],"trp":["oc",55455],"tlw":["scos",703],"lp":["co","sco","sto","cto","cot","sot","soc","toc","gos","cos","gost","scot","goss"],"rp":["oc","ost","osc","oct","octo","oco","ocot"]},"75":{"input":[1,2,4,7],"tlp":["fos",18330],"trp":["oast",12711],"tlw":["fost",18063],"trw":["ostas",97],"lp":["fos","fost","aco","gas","coa","scoa","foc","coas","agos","coat","asto","sato","cato","sfo"],"rp":["oast","oca","oac","osta","ocat","oasc"]},"76":{"input":[3,4,7],"tlp":["ro",71384],"trp":["or",188766],"tlw":["rog",1945],"trw":["ore",1272],"lp":["ro","ge","eg","tor","gr","r-","tr-","rg","reg","ege","r-o","tr-o","gre","erg","reo"],"rp":["or","ort","-t","ore","ote"]},"77":{"input":[1,3,4,7],"tlp":["foar",10466],"trp":["oar",59190],"tlw":["toate",11462],"trw":["oare",2672],"lp":["foar","toar","for","roa","rag","ega","ator","gra","egat","a-t","arg","gea"],"rp":["oar","oare","oate","oart","ora","-ar","orta","oara"]},"78":{"input":[2,3,4,7],"tlp":["dor",9727],"trp":["ord",7233],"tlw":["rost",832],"lp":["dor","ros","cor","ce-","sor","rost","rso","ctor","deg","erso","stor","dege","roc","totd","doc"],"rp":["ord","oce","ostr","otd","otde"]},"79":{"input":[1,2,3,4,7],"tlw":["doar",7637],"trw":["oras",1618],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["un",291116],"trw":["nu",113453],"lp":[],"rp":["un","nu","on","no","ou","unu","uno","nou","nun","onu","ono","onn","non","oon","oun","uu","nuu","nno","onun","onon"]},"81":{"input":[1,5,7],"tlp":["au",127814],"trp":["ua",38098],"tlw":["au",14003],"trw":["una",3763],"lp":["au","anu","aun","auna","qu","anun","ano"],"rp":["ua","una","oua","noa","ona","nua","oan","noua","unoa","oana","nau","naun","nuna"]},"82":{"input":[2,5,7],"tlp":["su",87996],"trp":["us",98070],"tlw":["sus",2880],"trw":["jos",3880],"lp":["su","sun","sus","son","snu"],"rp":["us","ju","uns","jo","jun","nos","ons","unos","jos","juns","nsu","uso","nus","osu","nsus"]},"83":{"input":[1,2,5,7],"tlp":["sau",22053],"trp":["noas",7379],"tlw":["sau",21799],"trw":["usa",4343],"lp":["sau","asu","aju","ajun","soan","suna","sona","aus","ajo","anus","asun","ason","saju"],"rp":["noas","usa","joa","uas","usoa","nasu","ouas"]},"84":{"input":[3,5,7],"tlp":["eu",42582],"trp":["une",33961],"tlw":["eu",16688],"trw":["n-o",3069],"lp":["eu","enu","eun","enun","eno"],"rp":["une","n-","u-","nu-","-u","-un","ne-","ue","n-o","neo","one","uneo","-n","ony","une-"]},"85":{"input":[1,3,5,7],"tlp":["eau",24032],"trp":["n-a",17307],"trw":["n-a",2864],"lp":["eau","eaun","euna","que","xu","exu","e-au","eaua","xua","exua"],"rp":["n-a","-au","unea","ne-a","oane","neau","n-au","uque","ux","onea"]},"86":{"input":[2,3,5,7],"tlp":["du",82602],"trp":["use",37853],"tlw":["dus",2022],"trw":["unde",9415],"lp":["du","dou","dus","duse","eus","du-","esu","du-s"],"rp":["use","und","unde","ud","ndu","uses","unse","ond","u-s","ndo","ndu-","ude"]},"87":{"input":[1,2,3,5,7],"tlw":["doua",9678],"trw":["n-as",944],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["tu",124429],"trp":["ut",118950],"tlw":["tu",6631],"trw":["unt",87],"lp":["tu","bu","gu","bo","tun","bun","totu"],"rp":["ut","ng","unt","ob","ub","ntu","otu","nto","ont","ung","ngu","utu","ug"]},"89":{"input":[1,4,5,7],"tlp":["atu",33704],"trp":["uta",13540],"tlw":["buna",3510],"trw":["nota",476],"lp":["atu","fu","gan","atun","ang","aut","anga","tau","buna","antu","fun","gatu","tua"],"rp":["uta","nga","uf","uat","ntoa","uga","oba"]},"90":{"input":[2,4,5,7],"tlp":["cu",251869],"trp":["uc",41800],"tlw":["cu",107724],"trw":["joc",840],"lp":["cu","con","cut","sunt","scu","cun","tunc","stu","cont","cuno","sub","cons","scut","tus"],"rp":["uc","unc","ocu","onst","ust","nost"]},"91":{"input":[1,2,4,5,7],"tlw":["facut",6146],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["ru",139075],"trp":["ur",142738],"tlw":["greu",2486],"trw":["unor",2218],"lp":["ru","tru","ebu","tur","gur","rebu","reu","rob","run","r-u","tr-u","r-un","eru"],"rp":["ur","ntru","ute","ntr-","orb","oru","ngur"]},"93":{"input":[1,3,4,5,7],"tlw":["erau",9639],"trw":["n-ar",2738],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["trecut",2015],"trw":["usor",3025],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["fusese",5088],"trw":["noastra",2596],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["il",100912],"trw":["il",17933],"lp":[],"rp":["il","lo","li","oi","ol","io","olo","ilo","ili","oli","ll","iil","ill","lio","lii","oil","ilio","iol","lli","iilo"]},"97":{"input":[1,6,7],"tlp":["al",157962],"trp":["la",223904],"tlw":["al",17061],"trw":["la",103939],"lp":["al","ala","ali","zil","zo","alal"],"rp":["la","ioa","lal","ial","ila","oz","oia","loa","ozi","oal","ola","lia","iala","ilal"]},"98":{"input":[2,6,7],"tlp":["sol",5524],"trp":["osi",9398],"tlw":["sol",477],"trw":["ok",68],"lp":["sol","sl","sil","sosi","sio","sili"],"rp":["osi","los","olos","iso","ios","losi","ko","ls","lis","osii","ois","kil","kilo","iko"]},"99":{"input":[1,2,6,7],"tlp":["sal",9118],"trp":["las",16180],"tlw":["sala",1335],"trw":["lasa",3143],"lp":["sal","sla","sala","sola","alis","salo","wil","sall","als","sali","will"],"rp":["las","lasa","lasi","isoa","ioas","olas","llas","law","low"]},"100":{"input":[3,6,7],"tlp":["el",182428],"trp":["le",217374],"tlw":["el",30829],"trw":["le",16173],"lp":["el","ele","elo","eli","e-i","eil"],"rp":["le","ile","i-","-i","-l","l-","oie","lie","iile","lel","le-","ole","i-l","i-o"]},"101":{"input":[1,3,6,7],"tlp":["ale",32820],"trp":["i-a",24465],"tlw":["ale",8429],"trw":["i-a",2798],"lp":["ale","a-i","ela","a-l","eal","zile","eala","e-ai","elea","elal","eila","alea","zel","eali"],"rp":["i-a","-ai","lea","l-a","le-a","i-ai"]},"102":{"input":[2,3,6,7],"tlp":["si-",10078],"trp":["-si",12424],"tlw":["doi",4637],"trw":["ideile",361],"lp":["si-","doi","sel","eles","del","sele","delo","si-l","dio","si-i","esel"],"rp":["-si","les","iod","ld","lose","odi","old","lid","i-s"]},"103":{"input":[1,2,3,6,7],"tlw":["sa-i",9425],"trw":["lase",794],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["vo",55302],"trp":["lt",70688],"tlw":["voi",6798],"trw":["lovi",446],"lp":["vo","gi","voi","toti","til","gl","tio"],"rp":["lt","ig","oti","ov","lti","lit","ito","ovi","olit","liti","lov","lig","lv"]},"105":{"input":[1,4,6,7],"tlp":["alt",31331],"trp":["lta",15965],"tlw":["afla",4776],"lp":["alt","fl","tal","fla","afl","afla","alta","voa","alti","val","avo","fol","folo","alat"],"rp":["lta","lat","lalt","iga","lita","lati"]},"106":{"input":[2,4,6,7],"tlp":["col",18912],"trp":["loc",16849],"tlw":["colt",621],"trw":["loc",5973],"lp":["col","cl","sig","cio","colo","cli","voc","cil","soci","soti"],"rp":["loc","icio","lic","osti","oci","ico","ltc","lc","osit","isto"]},"107":{"input":[1,2,4,6,7],"tlw":["acolo",7879],"trw":["lasat",1202],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["tel",33441],"trp":["ori",36339],"tlw":["vor",6208],"trw":["lor",11526],"lp":["tel","tele","vor","ril","rile","rel","tori","rio","elor","rele","evo","egi","erio","evoi"],"rp":["ori","lor","leg","lte","ilor","-ti"]},"109":{"input":[1,3,4,6,7],"tlw":["fel",7250],"trw":["i-ar",1059],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["cel",9164],"trw":["orice",4726],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["astfel",4825],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["ul",257995],"trw":["lui",42818],"lp":[],"rp":["ul","lu","ui","lui","iu","nul","ulu","ului","lin","lul","inu","nui","uni","noi","iul","lun","iun","ho","unul","unui"]},"113":{"input":[1,5,6,7],"tlp":["zu",17502],"trp":["uz",18000],"tlw":["ziua",2202],"trw":["lua",3594],"lp":["zu","azu","auz","alu","anul","auzi","ziu","zul","alul"],"rp":["uz","lan","lua","nal","uzi","uia","inua","uza","inal","ula","onal"]},"114":{"input":[2,5,6,7],"tlp":["sul",13027],"trp":["usi",13886],"tlw":["solul",203],"trw":["insusi",1408],"lp":["sul","solu","snui","siu","siun","sulu"],"rp":["usi","insu","jul","onsi","jl","ijl","jlo","ijlo","nsul","isnu","lus","ius","isu","niso"]},"115":{"input":[1,2,5,6,7],"tlw":["salon",359],"trw":["nasul",473],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["elu",10235],"trp":["uie",12750],"trw":["nu-i",6710],"lp":["elu","elul","elui","enul"],"rp":["uie","u-i","nu-i","nel","unei","ule","iune","nele","nile","nule","ley","u-l","len","nu-l","inel","unel"]},"117":{"input":[1,3,5,6,7],"tlw":["auzea",594],"trw":["n-ai",1802],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["seldon",899],"trw":["nu-si",1718],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["daneel",945],"trw":["indoiala",1534],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["tul",54201],"trp":["ult",36980],"tlw":["totul",5658],"trw":["lungul",1158],"lp":["tul","bui","bil","tiu","bl","gin","tinu"],"rp":["ult","ing","uti","uit","into","ntul","utin","igu","ingu","uv","otul","itu","ulti"]},"121":{"input":[1,4,5,6,7],"tlw":["vazut",3775],"trw":["langa",4102],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["stiu",5950],"trw":["ochii",6711],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["atunci",10484],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["trebuie",10427],"trw":["intr-o",7901],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["vorba",4095],"trw":["legatura",2214],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["sigur",2888],"trw":["lucru",5287],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["singura",2707],"trw":["niciodata",5038],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trp":["pp",639],"trw":["p",1061],"lp":[],"rp":["pp"]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",93968],"trp":["pa",161658],"tlw":["apa",3245],"trw":["pa",666],"lp":["ap","apa"],"rp":["pa","pap","papa"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",103043],"trp":["ps",4877],"lp":["sp"],"rp":["ps"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["asp",12078],"trp":["pas",8637],"tlw":["apasa",575],"trw":["pas",1350],"lp":["asp","spa","sap","apas","aspa","aps","apsa","sapa"],"rp":["pas","pasa","psa"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",52344],"trp":["pe",216440],"trw":["pe",110407],"lp":["ep","epe"],"rp":["pe"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["ape",10151],"trp":["pea",1505],"tlw":["ape",142],"lp":["ape","epa","xp","exp","eap","xpe","expe","eapa","epea","a'","apea"],"rp":["pea","'a","pape"]},"134":{"input":[2,3,8],"tlp":["esp",14229],"trp":["pes",7355],"tlw":["spe",120],"trw":["pese",104],"lp":["esp","desp","spe","dep","eped","espe","d'","sep","depe","eps","edep","deps"],"rp":["pes","ped","pede","pse","pese","pses","'d"]},"135":{"input":[1,2,3,8],"tlp":["depa",6164],"trp":["pad",2363],"tlw":["da'",470],"trw":["pedeapsa",277],"lp":["depa","aspe","epas","d'a","dap","apad","adap","da'","espa","deap","spad","sepa","xped","eaps","dape","apes"],"rp":["pad","pada","pase","psea"]},"136":{"input":[4,8],"trp":["pt",44775],"lp":[],"rp":["pt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["apt",16520],"trp":["pat",19529],"tlw":["fapt",2580],"trw":["pat",1592],"lp":["apt","fap","fapt","apta","tap","apat","tapa"],"rp":["pat","pta","ptat","pata"]},"138":{"input":[2,4,8],"tlp":["tsp",179],"trp":["pc",487],"lp":["tsp"],"rp":["pc","pts","ptsp"]},"139":{"input":[1,2,4,8],"tlp":["cap",19242],"trp":["pac",5660],"tlw":["cap",4694],"trw":["pacat",460],"lp":["cap","spat","capa","stap","sapt","scap","apac","apc","capc","apca"],"rp":["pac","past","paca","ptas","pca"]},"140":{"input":[3,4,8],"tlp":["ept",20779],"trp":["pr",175984],"tlw":["trepte",244],"trw":["perete",698],"lp":["ept","rep","rept","tep","tept","repe","rp","epte","rpr","epet","epr"],"rp":["pr","pre","per","pte","pet","pere","petr","pret","pete"]},"141":{"input":[1,3,4,8],"tlp":["apr",12184],"trp":["par",57159],"tlw":["repeta",897],"trw":["prea",8562],"lp":["apr","epta","apar","epar","apte","eapt","rap","reap","xper","xpr"],"rp":["par","part","pra","pare","prea","para","patr","pate","pera","ptea"]},"142":{"input":[2,3,4,8],"tlp":["spr",29330],"trp":["pest",6829],"tlw":["spre",12456],"trw":["peste",6431],"lp":["spr","spre","cep","espr","drep","step","spec","sper","resp","cept","cepe","ccep","spet","ecep"],"rp":["pest","pres","pec","pers","pect","prec"]},"143":{"input":[1,2,3,4,8],"tlw":["departe",3651],"trw":["parca",3176],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["mp",55904],"trw":["m",611],"lp":[],"rp":["mp","mn","mm","pn","nm"]},"145":{"input":[1,5,8],"tlp":["am",164027],"trp":["ma",278091],"tlw":["am",32990],"trw":["ma",23028],"lp":["am","ama","aman","amn","amp","amna","apan"],"rp":["ma","man","pan","mana","pana","mna","pam","pama","mpa","mam","nap","mama","mpan"]},"146":{"input":[2,5,8],"tlp":["sm",3780],"trp":["nsp",2667],"lp":["sm"],"rp":["nsp","ms","nsm","jm"]},"147":{"input":[1,2,5,8],"tlp":["amas",5157],"trp":["mas",15541],"tlw":["sam",974],"trw":["masa",3415],"lp":["amas","sam","sma","sman","wm","wma","wman","ansp","ansm","ajm","ajma","asm","asam"],"rp":["mas","masa","maj","nspa","jma","paj","msw"]},"148":{"input":[3,5,8],"tlp":["em",62631],"trp":["me",133398],"tlw":["emmy",120],"trw":["pen",562],"lp":["em","eme","emn","emen","emp","emne","epen"],"rp":["me","pen","men","mne","mene","mpe","mem","nem","nep","my","mey","meye","meme"]},"149":{"input":[1,3,5,8],"tlp":["ame",19413],"trp":["mea",17220],"tlw":["amy",498],"trw":["mea",8040],"lp":["ame","eam","amen","eama","ema","emna","eamn","emea","eman","amne","xem","exem","xemp"],"rp":["mea","mnea","mane","max","pane","neam","mame"]},"150":{"input":[2,3,5,8],"tlp":["sem",11901],"trp":["med",6644],"tlw":["semn",1590],"trw":["mese",274],"lp":["sem","semn","seme","dem","dm","edem","demn","esem"],"rp":["med","mes","ndep","nsem","mese","mens","md","mped","mej","mejd","ndem","pend"]},"151":{"input":[1,2,3,5,8],"tlw":["seama",5586],"trw":["newman",723],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["tm",1176],"trp":["mb",18560],"lp":["tm"],"rp":["mb","mt","mpt","ntm"]},"153":{"input":[1,4,5,8],"tlp":["tam",11107],"trp":["mat",12972],"tlw":["tam",65],"trw":["pamant",2358],"lp":["tam","tamp","amb","fam","tama","apab","atm","amba"],"rp":["mat","ntam","mba","mant","mata","ptam","pant","mnat","pab","mbat","mta","ptan"],"special":"numsym"},"154":{"input":[2,4,5,8],"tlp":["cm",3183],"trp":["mc",201],"lp":["cm"],"rp":["mc","mcn"]},"155":{"input":[1,2,4,5,8],"tlw":["cam",2462],"trw":["manca",317],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["rm",42362],"trp":["pent",38307],"tlw":["tem",615],"trw":["merry",352],"lp":["rm","rem","tem","erm","reme","rme","term","trem"],"rp":["pent","mer","ment","mbr","mpr","mpre","met","mte","mbe","mere","ntem","perm"]},"157":{"input":[1,3,4,5,8],"tlw":["eram",2315],"trw":["mare",9405],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["cemp",522],"trw":["mers",716],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["camera",2871],"trw":["macar",2850],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"|","trp":["pi",47365],"trw":["pi",147],"lp":[],"rp":["pi","ip","pii","ipi","pip","piii","ipp","ppi","pipp","ippi","ipii"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["api",2966],"trp":["ipa",7902],"trw":["pai",991],"lp":["api","zap","zapa","aip"],"rp":["ipa","pia","pai","paz","paza","pipa","paia","ipai"]},"162":{"input":[2,6,8],"tlp":["spi",4099],"trp":["isp",6275],"lp":["spi","sip","sipi"],"rp":["isp","ips","psi","ipsi","pis","isip","pisi"]},"163":{"input":[1,2,6,8],"tlp":["spai",782],"trp":["ispa",2264],"trw":["pasi",1282],"lp":["spai","wisp","aisp"],"rp":["ispa","pasi","ipsa","pais","pias"]},"164":{"input":[3,6,8],"tlp":["epi",929],"trp":["pie",11267],"lp":["epi"],"rp":["pie","ipe","iep","piep","pipe","pei","ipei"]},"165":{"input":[1,3,6,8],"tlp":["epez",640],"trp":["pez",756],"tlw":["apei",412],"trw":["paie",113],"lp":["epez","apei"],"rp":["pez","pezi","paie","piez"]},"166":{"input":[2,3,6,8],"tlp":["disp",4472],"trp":["pid",1040],"trw":["piese",120],"lp":["disp","espi","depi","epis","eisp","dip","edip","epsi"],"rp":["pid","pied","ipse","ispe","pedi","pies","peis","pide","psei"]},"167":{"input":[1,2,3,6,8],"tlw":["zapada",443],"trw":["piesa",219],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["tip",2064],"trp":["pit",3627],"tlw":["tip",589],"lp":["tip","tipi"],"rp":["pit","pti","ptii","ipit","piti","ipt","piv","ptit"]},"169":{"input":[1,4,6,8],"tlp":["apit",1785],"trp":["piat",2890],"tlw":["tipa",384],"trw":["piata",623],"lp":["apit","tipa","fip","fipt","tapi"],"rp":["piat","pita","pati","pav","ptia","ipat","pavi","ptz"]},"170":{"input":[2,4,6,8],"tlp":["cip",1891],"trp":["pic",7270],"tlw":["tipic",72],"trw":["pic",662],"lp":["cip","spit","cipi","cisp","scip","spic"],"rp":["pic","pici","psit","pist","pci","pisc","icip","pict","ipic"]},"171":{"input":[1,2,4,6,8],"tlw":["twisp",358],"trw":["pisica",266],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["rip",1804],"trp":["pri",68428],"trw":["privi",2867],"lp":["rip","rpri","epti","ripi","tipe"],"rp":["pri","priv","peri","pier","prie","pir","iept","piri","iper","prii","prit","piet","ptie","prir","peti"]},"173":{"input":[1,3,4,6,8],"tlw":["aparitia",471],"trw":["privirea",2009],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["spirit",395],"trw":["priveste",1176],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["expresie",605],"trw":["paris",654],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["mi",133805],"trw":["imi",6836],"lp":[],"rp":["mi","im","min","imp","imi","nim","nimi","pin","him","hip","mii","mni","inim","mpi","imin","mini","impi","mpin","imii","hm"]},"177":{"input":[1,5,6,8],"tlp":["ami",12341],"trp":["mai",98477],"tlw":["amiaza",160],"trw":["mai",80029],"lp":["ami","amin","zam","anim","aim","aima"],"rp":["mai","ima","mina","main","nima","pina","mani","inap","pani","iam","impa","mia","miaz","hipa"]},"178":{"input":[2,5,6,8],"tlp":["sim",14730],"trp":["mis",9725],"tlw":["sim",169],"trw":["nisip",353],"lp":["sim","simp","smi","spin","smin","smis"],"rp":["mis","mij","imis","insp","mnis","psih","misi","pins","ism","nsmi","jim","nism","nspi","mik"]},"179":{"input":[1,2,5,6,8],"tlw":["spaima",491],"trw":["masina",2136],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["emei",6102],"trp":["ime",17305],"trw":["mine",8864],"lp":["emei","emi","enim","emni","epin"],"rp":["ime","meni","mine","mei","imen","nime","mie","meie","impe","hem","mpie","hme","nemi","mnei","hmey"]},"181":{"input":[1,3,5,6,8],"tlw":["examina",267],"trw":["maine",960],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["depinde",317],"trw":["mesei",432],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["asemeni",170],"trw":["inseamna",2064],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tim",26063],"trp":["mit",11574],"tlw":["timp",11216],"trw":["mintii",377],"lp":["tim","timp","timi","bim"],"rp":["mit","mint","imt","imb","mti","imti","himb","imit","ntim","mbi","mv","mtit","imbi","miti","mbin","mnit"]},"185":{"input":[1,4,5,6,8],"tlw":["zambi",959],"trw":["pamint",327],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"tlw":["simti",2661],"trw":["nimic",9112],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["stiam",937],"trw":["mica",2010],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["vreme",4271],"trw":["prin",13288],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["femeie",2003],"trw":["prima",3179],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["trimis",946],"trw":["incepe",1001],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["dimineata",2070],"trw":["imediat",2866],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["po",78466],"trw":["po",250],"lp":[],"rp":["po","op","opo","pop","popo","ppo"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["apo",15763],"trp":["poa",16012],"lp":["apo","apoa"],"rp":["poa","oap","opa","oapa","opoa"]},"194":{"input":[2,7,8],"tlp":["spo",1393],"trp":["pos",4845],"lp":["spo","sop"],"rp":["pos","osp","ppos","poso"]},"195":{"input":[1,2,7,8],"tlp":["apos",506],"trp":["oasp",820],"lp":["apos","soap"],"rp":["oasp","pow"]},"196":{"input":[3,7,8],"tlp":["eop",544],"trp":["ope",5829],"trw":["pe-o",124],"lp":["eop","epo","eopo"],"rp":["ope","pe-","poe","o'","pe-o","oep","-p","-po"]},"197":{"input":[1,3,7,8],"tlp":["eopa",329],"trp":["oape",5724],"lp":["eopa","eoap"],"rp":["oape","pa-","pa-a","pe-a","-ap","-apo"]},"198":{"input":[2,3,7,8],"tlp":["deop",448],"trp":["pod",1174],"trw":["pod",151],"lp":["deop","espo","depo"],"rp":["pod","pode","oped","o'd","'do","o'do","pose","podo","ospe"]},"199":{"input":[1,2,3,7,8],"trw":["podea",484],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["top",280],"trp":["pot",14753],"trw":["pot",6200],"lp":["top","topo"],"rp":["pot","opt","pto","poto","opot"]},"201":{"input":[1,4,7,8],"trp":["poat",13885],"trw":["poata",1395],"lp":[],"rp":["poat","oapt","pof","pag","poft","opat","opag","paga"]},"202":{"input":[2,4,7,8],"tlp":["cop",12351],"trp":["post",1578],"tlw":["scop",481],"trw":["post",334],"lp":["cop","scop","sopt","stop"],"rp":["post","poc","opts"]},"203":{"input":[1,2,4,7,8],"tlw":["soapta",372],"trw":["ostap",497],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["rop",9845],"trp":["pro",33227],"trw":["pro",584],"lp":["rop","ropr","torp","ropo"],"rp":["pro","por","prop","port","opr","oper","potr","orp","preg","opor","prot","preo","opre","pote","prog","poet"]},"205":{"input":[1,3,4,7,8],"tlw":["aproape",5419],"trw":["poate",12490],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["corp",515],"trw":["prost",652],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"tlw":["castorp",852],"trw":["profesor",467],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["pu",141518],"trw":["om",4434],"lp":[],"rp":["pu","um","mu","om","up","mo","pun","num","omn","mun","mnu","umn","omnu","mpo","mpu","mom","omu","upu","omp","umu"]},"209":{"input":[1,5,7,8],"tlp":["apu",6837],"trp":["upa",22884],"trw":["puna",1094],"lp":["apu","anum","amu"],"rp":["upa","uma","oam","numa","moa","oma","oamn","noap","puna","oman","manu","napo","uman","umoa","ompa","mau","umpa"]},"210":{"input":[2,5,7,8],"tlp":["spu",46684],"trp":["pus",30635],"tlw":["spus",7687],"trw":["pus",1846],"lp":["spu","spun","spus","sup","supu","smu","sum","som","somn"],"rp":["pus","puns","mos","jum","mus","umos","mons","usm","opus","mpos","upus"]},"211":{"input":[1,2,5,7,8],"tlw":["spuna",1588],"trw":["pusa",270],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["epu",10511],"trp":["ume",17000],"trw":["meu",6128],"lp":["epu","emu","emo","e-m"],"rp":["ume","pune","-m","m-","ome","omen","umne","nume","meu","mome","u-m","nu-m","upe","umen","unem","pome"]},"213":{"input":[1,3,5,7,8],"tlw":["anume",1489],"trw":["m-am",5385],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["spuse",11543],"trw":["mod",2741],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["dupa",19290],"trw":["m-as",588],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["gm",4573],"trp":["put",44011],"tlw":["tom",831],"trw":["putut",3710],"lp":["gm","gmu","gmun","tum","tom","gom","gomo"],"rp":["put","ptu","putu","mot","upt","mpot","umb","pub","munt","omot","nopt","mut","omb"]},"217":{"input":[1,4,5,7,8],"tlw":["fum",415],"trw":["muta",298],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["cum",21263],"trw":["punct",1203],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["acum",14119],"trw":["munca",1233],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["grup",794],"trw":["pentru",38307],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["forma",2036],"trw":["putea",12961],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["drum",2045],"trw":["precum",1277],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["asupra",4961],"trw":["jumatate",2548],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["pl",51269],"trw":["lipi",125],"lp":[],"rp":["pl","poi","pli","opi","lip","pil","pol","poli","opii","opil","plo","ipl","lipi","lop","piil","ilip","ipo","lp","opol","ipil"]},"225":{"input":[1,6,7,8],"tlp":["apoi",14490],"trp":["pla",21202],"tlw":["apoi",11964],"trw":["ploaia",308],"lp":["apoi","apl","alp","apli","alpi","aipo"],"rp":["pla","lipa","pal","poz","pozi","opia","pala","ipal","pali","ploa","pila","lap","poal","ploz"]},"226":{"input":[2,6,7,8],"tlp":["spl",128],"trp":["posi",2885],"trw":["lipsi",96],"lp":["spl","spio"],"rp":["posi","lips","ispo","oisp","ipos"]},"227":{"input":[1,2,6,7,8],"tlw":["spala",165],"trw":["lipsa",702],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["epl",2223],"trp":["ple",12048],"trw":["piele",586],"lp":["epl","epli","elep"],"rp":["ple","opie","pel","piel","iple","lep","lipe","pele","lope","pile","pelo","ipel","pleo","ople","lpe","opei","i-p"]},"229":{"input":[1,3,6,7,8],"tlw":["apele",237],"trw":["pielea",663],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["spele",82],"trw":["leopold",96],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["deplasa",142],"trw":["pilda",452],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["topi",144],"trp":["poti",3337],"tlw":["topi",76],"trw":["poti",3337],"lp":["topi","gip","gipt"],"rp":["poti","pov","opti","plit","pito","ptil","ipot","opit","poit"]},"233":{"input":[1,4,6,7,8],"tlw":["filip",379],"trw":["pozitia",504],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"tlw":["copii",1305],"trw":["lipsit",548],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["clipa",4697],"trw":["politica",737],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"trw":["opri",1970],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"tlw":["apropie",1375],"trw":["propria",852],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["clipe",748],"trw":["plece",755],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["spatele",2337],"trw":["picioare",2645],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["mul",40796],"trw":["omul",2345],"lp":[],"rp":["mul","pul","mpl","lum","umi","mnul","lumi","impo","mil","umin","plu","impu","impl","plin","mpul","lim","mili","imu","mplu","imul"],"special":"enter"},"241":{"input":[1,5,6,7,8],"trw":["numai",8412],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["simplu",2223],"trw":["plus",1041],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["simpla",704],"trw":["psihanaliza",445],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"trw":["mele",3338],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["exemplu",767],"trw":["oameni",4178],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["domnule",3620],"trw":["limpede",719],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["sa-mi",4566],"trw":["mesajul",279],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"tlw":["timpul",4000],"trw":["mult",13114],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["faptul",2300],"trw":["multa",2401],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["chipul",1320],"trw":["mijlocul",1212],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["capul",3813],"trw":["placut",782],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["trupul",1201],"trw":["multe",4923],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["ti-am",981],"trw":["probabil",2719],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["sigmund",4378],"trw":["inceput",3590],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["dumneavoastra",3116],"trw":["pardaillan",1106],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/sv-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/sv-keymap.json
new file mode 100644
index 00000000000..7f37672f41c
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/sv-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",697],"tlw":["a",9529],"lp":["aa"],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",67011],"tlw":["s",3622],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["sa",278948],"tlw":["sa",80180],"lp":["sa","as","ssa","ass","wa","assa","asa","was","sas","aw","ww","awa","sw","www","ws","swa","swas","wass","sass","saa"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",6371],"tlw":["e",4153],"lp":["ee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ex",11230],"tlw":["ae",267],"lp":["ex","ea","ax","ae","xe","xa","exe","exa","axe","axa"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["de",849873],"tlw":["de",70970],"lp":["de","ed","se","es","des","dd","ess","sed","dde","ds","sse","dess","ede","edd","esse","edde","ese","see","eds","ses"],"rp":[]},"7":{"input":[1,2,3],"tlp":["ad",298347],"tlw":["da",17349],"lp":["ad","ade","da","eda","sad","ada","seda","sade","ades","add","sada","dda","dad","we","essa","dade","ase","sex","ew","esa"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",430036],"tlw":["t",873],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["at",420129],"tlw":["att",208516],"lp":["at","ta","att","fa","ft","tta","atta","af","ff","ata","tat","fat","fatt","aff","ffa","affa","aft","tf","fta","tfa"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["st",283811],"tlw":["c",718],"lp":["st","ts","sst","sc","ct","cc","tst","tc","tts","cts","cs","sts","tss","css","stst","stt"],"rp":[]},"11":{"input":[1,2,4],"tlp":["sta",95542],"tlw":["satt",11381],"lp":["sta","ast","sat","ac","satt","tsa","asta","ats","ca","tsat","tac","fas","fast","stat","tas","ssta","stas","tast","sats","stac"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["et",462362],"tlw":["ett",56585],"lp":["et","er","te","re","ter","rt","tr","ett","tte","rr","tre","ete","ret","tet","rre","tter","ert","eter","ere","ttr"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ar",760793],"tlw":["ar",85841],"lp":["ar","ra","fr","ara","fra","are","era","ef","rat","fte","art","fter","tar","eft","efte","far","tra","ratt","fe","atte"],"rp":[]},"14":{"input":[2,3,4],"tlp":["det",223222],"tlw":["det",200915],"lp":["det","rs","dr","rd","der","ste","rde","rst","ers","est","res","red","str","ser","ec","ce","set","ster","rts","ters"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["dar",44203],"tlw":["dar",26310],"lp":["dar","rad","dra","tad","tade","rade","aste","rsta","ars","ttad","ras","erad","ard","star","sar","esta","reda","dare","stra","dera"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",152794],"trw":["n",1184],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",778026],"trp":["na",315512],"tlw":["an",15455],"trw":["nan",1595],"lp":["an","ann","anna","ana","anan","aan","aana","aq"],"rp":["na","nna","nan","nnan","nq","nana"]},"18":{"input":[2,5],"base":"j","baseshift":"J","tlp":["sj",21534],"trp":["ns",134271],"trw":["j",959],"lp":["sj","sn","ssn","sjn"],"rp":["ns","nns","nss","nj","jn","js"]},"19":{"input":[1,2,5],"tlp":["ans",66128],"trp":["ja",200724],"tlw":["san",954],"trw":["ja",6931],"lp":["ans","san","sja","sna","anns","sann","ssna","ansa","anss","aj","ssan"],"rp":["ja","nas","nsa","jan","nnas","jans","jana","nja","nans"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",686772],"trp":["ne",122568],"tlw":["en",141247],"trw":["ny",2216],"lp":["en","enn","enne","ene","een","ey","enen","enny"],"rp":["ne","nne","nen","ny","yn","nnen","ye","yne","nny","ynn","ynen","ynne"]},"21":{"input":[1,3,5],"tlp":["ena",17736],"trp":["ya",3990],"tlw":["ena",2504],"trw":["nya",3694],"lp":["ena","anne","ane","enna","ay","aen","any","anen","xan","exan","ean","xen","xn","xna","enq"],"rp":["ya","nya","yx","yea","nea"]},"22":{"input":[2,3,5],"tlp":["den",113774],"trp":["nd",217577],"tlw":["den",78914],"trw":["nej",5908],"lp":["den","sen","ens","ej","end","sy","dn","ende","dj"],"rp":["nd","nde","je","ys","nes","nnes","yd","nden","nej","jd","nse"]},"23":{"input":[1,2,3,5],"tlp":["and",132309],"trp":["nda",24974],"tlw":["sedan",13315],"trw":["new",1697],"lp":["and","ande","dan","edan","anda","sena","adan","enda","aden","anad","ensa","enas","aend","anse"],"rp":["nda","nad","nade","jad","jade","ndan"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["bb",13062],"trp":["nt",180386],"tlw":["b",734],"lp":["bb","tn","ttn","bt","bbt","tb"],"rp":["nt","nb","ntn","ntb"]},"25":{"input":[1,4,5],"tlp":["ba",80692],"trp":["nat",22606],"tlw":["annat",5472],"trw":["nat",1860],"lp":["ba","tan","ant","fan","anta","fann","ab","ban","abb","anf","bat","bba","tna"],"rp":["nat","nta","nf","nnat","nab","nabb","natt"]},"26":{"input":[2,4,5],"tlp":["tj",8505],"trp":["nst",17861],"tlw":["bbc",225],"lp":["tj","bj","bs","stn","sb","sjt","stj","sjtj","tsn","ttj","bc","bbc","stb"],"rp":["nst","nc","jt","nts","jtj","nsc","nstn"]},"27":{"input":[1,2,4,5],"tlp":["stan",20169],"trp":["nast",10284],"tlw":["fanns",8575],"trw":["nastan",4851],"lp":["stan","bas","snab","anst","sant","bast","tja","tans","stna","tjan","bac","can","abs","snac"],"rp":["nast","nsta","jat","nac","jac","ntas"]},"28":{"input":[3,4,5],"tlp":["be",75593],"trp":["nte",109829],"tlw":["be",2398],"trw":["ner",9674],"lp":["be","rn","ten","br","ty","ent","ren","ry","ern","ber","bet","rb"],"rp":["nte","ner","yt","ytt","yr","nner","ntr","net"]},"29":{"input":[1,3,4,5],"tlp":["ran",60950],"trp":["nar",65863],"tlw":["fran",27093],"trw":["nar",38189],"lp":["ran","rna","bar","fran","arn","bara","arna","erna","bra","aran","aren","enar","barn","bera","arb","fy","arbe","beta"],"rp":["nar","nare"]},"30":{"input":[2,3,4,5],"tlp":["rj",17958],"trp":["yc",35067],"tlw":["tyst",1977],"lp":["rj","bes","tyc","sten","tys","tyd","dern","ryc","tryc","best","tyst","rden","rje","cen"],"rp":["yc","nder","ndr","yst","ndet","jer"]},"31":{"input":[1,2,3,4,5],"tlw":["andra",13622],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",1872],"trw":["i",182908],"lp":[],"rp":["ii","iii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["ai",2800],"trp":["ia",13569],"tlw":["ai",142],"trw":["ia",109],"lp":["ai","za","zi","az","zia","azi","zz","zzi","zza"],"rp":["ia","iz","iza","izz","izza","izi"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["sk",180550],"trp":["is",102522],"trw":["is",3657],"lp":["sk","si","ski","sik","sis","ssi","sisk","ssis"],"rp":["is","ik","isk","ks","ki","iss","iks","kis","isi","iki","kisk","kss"]},"35":{"input":[1,2,6],"tlp":["ak",74294],"trp":["ka",235111],"tlw":["ska",12542],"trw":["kaka",73],"lp":["ak","ska","sak","aka","wi","ask","skak","asi","aska","aks","aki"],"rp":["ka","ika","ksa","iska","isa","kas","issa","kak","kaka"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",3018],"trp":["ie",21160],"tlw":["ei",236],"trw":["ie",545],"lp":["ei","eii","eiie"],"rp":["ie","iie"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["xi",1347],"trp":["ix",677],"tlw":["xii",198],"trw":["iae",103],"lp":["xi","ez","axi","exi","ezi","ezia","eiz","ze","xii","eza","aie","zie","zzie","eizi"],"rp":["ix","ixa","iae"]},"38":{"input":[2,3,6],"tlp":["di",49953],"trp":["ke",99121],"tlw":["skedde",390],"trw":["ide",614],"lp":["di","ek","ske","sid","dis","disk","sek","edi","esk","dsk","die"],"rp":["ke","id","ide","idi","ike","ise","idd","isse","iske"]},"39":{"input":[1,2,3,6],"tlp":["ake",15029],"trp":["kad",24793],"tlw":["sida",1628],"trw":["kikade",168],"lp":["ake","sake","sida","eka","skad","adi","akad","ekad","dska","xak","exak"],"rp":["kad","kade","ida","isad","idda","kada","kae","ikae","ikad"]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",221703],"trp":["it",120245],"tlw":["vi",40006],"trw":["it",2563],"lp":["ti","vi","tv","vit","tit","titt","tvi","vt","tiv","tti","vitt","tivt","viv"],"rp":["it","itt","iv","ivi","iti","ivit","ivt"]},"41":{"input":[1,4,6],"tlp":["va",353292],"trp":["itta",13428],"tlw":["av",76117],"trw":["if",757],"lp":["va","av","fi","ati","tva","vat","vatt","ava","avi","tav","ativ","vita","via","tia","tati"],"rp":["itta","if","iva","ita","ift"]},"42":{"input":[2,4,6],"tlp":["ck",135164],"trp":["kt",95132],"tlw":["sitt",8546],"trw":["its",666],"lp":["ck","sv","vis","sit","cks","ci","sti","sitt","viss","tis","ckt","tisk"],"rp":["kt","ic","ick","kv","ikt","kti","ist","isst"]},"43":{"input":[1,2,4,6],"tlp":["cka",27505],"trp":["kva",11609],"tlw":["fick",13643],"lp":["cka","sva","akt","ack","fic","fick","cksa","akti","tack","visa","acka","avs","tak","akta","fak"],"rp":["kva","icka","kta","kat","ista"]},"44":{"input":[3,4,6],"tlp":["ri",112888],"trp":["ite",18519],"tlw":["vet",9572],"trw":["iver",119],"lp":["ri","ve","ver","ev","vet","rit","eri","rv","riv","rti","rev","eve","erv","vr","rie","tri"],"rp":["ite","ir","ive","ivet"]},"45":{"input":[1,3,4,6],"tlp":["var",212597],"trp":["ifr",5093],"tlw":["var",117709],"lp":["var","vara","ari","vari","ave","arit","vart","rva","varf","vare","arti","rav","ria","veta","fri","eva","rati","riva"],"rp":["ifr","ifra"]},"46":{"input":[2,3,4,6],"tlp":["rk",39613],"trp":["kr",38960],"tlw":["vid",15758],"lp":["rk","tid","cke","vid","rik","cket","skr","erk","dri","verk","sve","ckte","tidi","ris","ekt"],"rp":["kr","kte","ker","ket","kri"]},"47":{"input":[1,2,3,4,6],"tlw":["vad",23975],"trw":["kvar",4233],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["in",374950],"trw":["in",24928],"lp":[],"rp":["in","ni","inn","nin","hi","nni","ih","nh","hin","ini","nnin","hn","hinn","hnn","inni","ninn","inh","nih","ihi","nihi"]},"49":{"input":[1,5,6],"tlp":["anni",10319],"trp":["ha",405073],"tlw":["ah",652],"trw":["han",135757],"lp":["anni","ani","anin","ah","anh","ain","aha","anha"],"rp":["ha","han","ina","inna","hann","ian","nha","iha","nhan","nina","naz","nazi"]},"50":{"input":[2,5,6],"tlp":["sin",33457],"trp":["nk",33920],"tlw":["sin",19809],"trw":["his",717],"lp":["sin","sh"],"rp":["nk","nsk","kn","ins","nis","nsi","inns","hj","nisk","nnis","his","nsik","nik","kni","kh","kin","nnik","kj"]},"51":{"input":[1,2,5,6],"tlp":["ank",24052],"trp":["kan",66516],"tlw":["sina",10070],"trw":["hans",21333],"lp":["ank","ansk","sina","anka","ansi","zj","akn","akna","wh","skan"],"rp":["kan","hans","kans","nska","kna","kann","nka","hja","has","nika"]},"52":{"input":[3,5,6],"tlp":["eh",10650],"trp":["he",119485],"tlw":["eh",118],"trw":["henne",15609],"lp":["eh","enh","enhe","eni","enin","enni"],"rp":["he","hen","henn","inne","ien","nhe","ine","hy","nie","hey","neh","nneh","hei","nnie"]},"53":{"input":[1,3,5,6],"tlp":["eha",2865],"trp":["neha",654],"tlw":["annie",246],"lp":["eha","anie","ehan","anhe","enha","xin","axin","eani"],"rp":["neha","hea","hay","iane","hae","ynha","hane"]},"54":{"input":[2,3,5,6],"tlp":["dni",7195],"trp":["ken",21208],"tlw":["din",3500],"trw":["hennes",10942],"lp":["dni","dnin","ensk","din","sky","enk","edni","enke"],"rp":["ken","nske","nke","ind","iden","ky","ysk","ndi","isen","yk","iken","inde"]},"55":{"input":[1,2,3,5,6],"tlw":["sidan",3037],"trw":["hade",75973],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["th",42119],"trp":["int",110738],"tlw":["bit",873],"trw":["hit",1552],"lp":["th","bi","vin","tin","vinn","tni","tnin","thi","vb","ttni"],"rp":["int","nti","hit","ntin","nv","hitt","ib","nit","ith","nnit"]},"57":{"input":[1,4,5,6],"tlp":["van",36400],"trp":["hat",6563],"tlw":["that",4254],"trw":["haft",3590],"lp":["van","fin","finn","vant","tha","that","vann","anv","anva","vana","vani"],"rp":["hat","nva","haf","haft","inf","nvan","hav","hant","nati"]},"58":{"input":[2,4,5,6],"tlp":["ch",278681],"trp":["nkt",10498],"tlw":["this",1111],"trw":["nick",290],"lp":["ch","vj","ckh","sch","stin","ckn","this","svin","tch"],"rp":["nkt","kvin","inst","nic","nick","hist","nsv","nist","nsti","ich","nsiv"]},"59":{"input":[1,2,4,5,6],"tlw":["finns",6035],"trw":["kvinna",2323],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["the",26354],"trp":["inte",103570],"tlw":["the",18662],"trw":["inte",98723],"lp":["the","rin","ven","beh","rh","enti","bri","ther","erh","rhe","rhet","erin"],"rp":["inte","het","hete","her","intr","iten","nhet","hr"]},"61":{"input":[1,3,4,5,6],"tlw":["aven",6437],"trw":["har",67488],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["tiden",4874],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["tankte",6155],"trw":["kanner",3200],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",2318],"trw":["o",784],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","tlp":["ao",454],"trp":["oa",4643],"lp":["ao"],"rp":["oa"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",206463],"trp":["os",36642],"tlw":["so",864],"trw":["oss",8697],"lp":["so","sso","soo"],"rp":["os","oss","oso","osso"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["wo",2187],"trp":["ow",2946],"tlw":["wow",58],"lp":["wo","aso","asso","saso","aos","woo","wow","sao"],"rp":["ow","osa","ossa","ows","owa"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["eo",2376],"trp":["oe",2841],"trw":["-",1201],"lp":["eo"],"rp":["oe","-o","-e"],"special":"punc"},"69":{"input":[1,3,7],"tlp":["xo",397],"trp":["ox",399],"lp":["xo","a-"],"rp":["ox","-a","oxe"]},"70":{"input":[2,3,7],"tlp":["do",35235],"trp":["od",40189],"tlw":["dod",2129],"trw":["ode",316],"lp":["do","dod","eso","edo","sod","sode","esso","dode","doe","does","dsso","dods"],"rp":["od","ode","odd","odde","ose","ods","ood","oes"]},"71":{"input":[1,2,3,7],"tlp":["doda",2068],"trp":["oda",5346],"tlw":["doda",1277],"lp":["doda","ado","sado","dow","easo","dosa","wood"],"rp":["oda","oad","odad","owe","oade","odda"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["to",90775],"trp":["ot",87066],"tlw":["tog",9006],"trw":["otto",257],"lp":["to","go","gt","got","gg","tog","gott","tto","tot","tg","tott"],"rp":["ot","og","ott","ogo","oto","ogt","otto","otog","ogg"]},"73":{"input":[1,4,7],"tlp":["ag",317285],"trp":["of",22543],"tlw":["ga",7744],"trw":["of",10904],"lp":["ag","fo","ga","ago","aga","agot","tag","gat","agg","agt","gga","gatt","fot","agga"],"rp":["of","oft","off","ota","ofta","oga"]},"74":{"input":[2,4,7],"tlp":["sto",40954],"trp":["oc",289376],"tlw":["sot",305],"trw":["ost",163],"lp":["sto","gs","co","gst","toc","stoc","soc","stot","sog","sot","sogo","togs","gts"],"rp":["oc","ost","ots","ogs","ogst","otst","osc"]},"75":{"input":[1,2,4,7],"tlp":["sag",35425],"trp":["osta",1492],"tlw":["sag",13608],"trw":["oftast",553],"lp":["sag","saga","ags","sagt","gas","gast","gsa","sof","aco","soff","asto","sags","gsta","stag","ggas","agas","two"],"rp":["osta","otsa","osca"]},"76":{"input":[3,4,7],"tlp":["ge",165737],"trp":["or",421801],"tlw":["gor",5705],"trw":["or",1673],"lp":["ge","ro","gr","ger","tor","eg","tro","gor","rg","get","ror","ege","gre","rot"],"rp":["or","ort","ore","orr","org","orre"]},"77":{"input":[1,3,4,7],"tlp":["for",206825],"trp":["ora",29125],"tlw":["for",86020],"lp":["for","gar","age","gra","rag","fort","frag","agr","raga","agra","gora","ager","rfo","rfor","fore","arfo","gare","agar","tora"],"rp":["ora"]},"78":{"input":[2,3,4,7],"tlp":["rso",20201],"trp":["ors",42598],"tlw":["stod",7497],"trw":["ord",2401],"lp":["rso","stor","erso","tod","stod","gd","dor","rod","gde","ros","dro","dorr","rost","sor"],"rp":["ors","ord","orde","orst","orso","orts"]},"79":{"input":[1,2,3,4,7],"tlw":["sager",8656],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["on",215270],"trw":["nu",20433],"lp":[],"rp":["on","un","no","nu","ono","unn","ou","nno","nnu","onn","non","oun","oon","onnu","nou"]},"81":{"input":[1,5,7],"tlp":["au",4722],"trp":["unna",7691],"tlw":["annu",3706],"lp":["au","annu","anno","ano","qu","anu","anua","anon","aou"],"rp":["unna","ua","ona","oan","nua","onna","una","oona","nqu","oann","uan"]},"82":{"input":[2,5,7],"tlp":["son",18325],"trp":["ju",46060],"tlw":["son",1353],"trw":["ju",10993],"lp":["son","su","sson","sju","ssu","sjo","sjon","sjun"],"rp":["ju","jo","us","oj","ons","jus","jon","nsso","uss","jun","jou","noj"]},"83":{"input":[1,2,5,7],"tlp":["aus",996],"trp":["usa",2823],"tlw":["sonja",276],"trw":["usa",1340],"lp":["aus","sona","wou","susa","ajo","ason"],"rp":["usa","oja","now","joa","own","janu","usan","onsa","onja","jua","jusa","ojan","nown","joan"]},"84":{"input":[3,5,7],"tlp":["eno",11644],"trp":["one",21213],"tlw":["eu",207],"trw":["you",1411],"lp":["eno","eu","eun","enou","enu"],"rp":["one","onen","yo","ue","you","unne","oen","une","n-","ony","oy","neu","y-","yon","nony"]},"85":{"input":[1,3,5,7],"tlp":["xu",643],"trp":["ux",939],"tlw":["anyone",56],"lp":["xu","exu","xue","exue","enqu","que","xua","exua","ann-","anyo"],"rp":["ux","uxn","uxna","yxo","uxe","uxen","na-","nna-","oxen","oya"]},"86":{"input":[2,3,5,7],"tlp":["du",45128],"trp":["und",57348],"tlw":["du",40597],"trw":["nojd",538],"lp":["du","essu","sone","dju","esu","don"],"rp":["und","unde","ud","use","ude","jud","ond","ojd","ojde","ndo","jude","nod","usen","oend"]},"87":{"input":[1,2,3,5,7],"tlw":["down",202],"trw":["undan",1747],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["bo",46434],"trp":["ng",167442],"tlw":["but",1259],"trw":["ut",23705],"lp":["bo","gon","tu","gn","ton","tun","gu","bu"],"rp":["ng","ut","ob","ung","ont","ug","ogon","ngt","unt","obb","uto","nog"]},"89":{"input":[1,4,5,7],"tlp":["ang",59439],"trp":["nag",48054],"tlw":["gang",6284],"trw":["nagot",17486],"lp":["ang","gan","agon","gang","anga","fu","gna","fon","angt","anfo","fun","atu"],"rp":["nag","nago","nga","uta","utan","nfo","natu","uf"]},"90":{"input":[2,4,5,7],"tlp":["gj",14385],"trp":["ust",11850],"tlw":["tjugo",984],"trw":["just",6345],"lp":["gj","gjo","stu","sut","stun","ssut","suto","gons","ston","bjo"],"rp":["ust","job","onst","just","ngs","jobb","uc","uts","jut","jug"]},"91":{"input":[1,2,4,5,7],"tlw":["sang",726],"trw":["jag",133333],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["gen",96318],"trp":["nge",54194],"tlw":["bort",5520],"trw":["ur",6494],"lp":["gen","ru","bor","geno","run","bort","bro","egen","gent","tur"],"rp":["nge","ur","ngen","yg","ngr","ute","nor","orn","nger","unge"]},"93":{"input":[1,3,4,5,7],"tlw":["gangen",3207],"trw":["nagra",10760],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["gjorde",8777],"trw":["under",14292],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["borjade",6021],"trw":["undrade",1668],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["ll",353262],"trw":["ol",691],"lp":[],"rp":["ll","li","il","ill","ol","lo","io","oli","oll","lli","ili","lil","lill","olo","illi","ilo","llo","oi","lio","ool"]},"97":{"input":[1,6,7],"tlp":["al",238639],"trp":["la",255368],"tlw":["alla",16475],"trw":["lilla",2283],"lp":["al","all","alla","ala","ali","alli","zl","zla","zo"],"rp":["la","lla","illa","ola","ial","lia","ila","olla","ilia","oal","oz"]},"98":{"input":[2,6,7],"tlp":["sl",40951],"trp":["ko",98099],"tlw":["sol",152],"trw":["loss",451],"lp":["sl","sok","sko","slo","skil","sli"],"rp":["ko","kl","ls","ok","lk","lik","kli","lls","lis","kil","ilk","olis","ills","kol"]},"99":{"input":[1,2,6,7],"tlp":["sla",15876],"trp":["kla",20340],"tlw":["alls",1882],"trw":["lika",4448],"lp":["sla","als","sal","ako","skal","alls","soka","alsk","wal"],"rp":["kla","las","kal","kall","lika","oka","lsa","lska","llsa","lak","lka"]},"100":{"input":[3,6,7],"tlp":["el",123518],"trp":["le",182809],"tlw":["el",140],"trw":["le",410],"lp":["el","ell","elle","ele","eli","elo","elie"],"rp":["le","lle","ille","ile","olle","ole","lie","iel","lee","iell","lei","ilie","leo"]},"101":{"input":[1,3,6,7],"tlp":["ela",19365],"trp":["lex",1360],"tlw":["alex",558],"trw":["ozzie",67],"lp":["ela","alle","ale","ella","alex","ael","xl","axl","xla","axla","alie","xel","axel","eal","zoe","elal"],"rp":["lex","lexa","lea","oale"]},"102":{"input":[2,3,6,7],"tlp":["del",18169],"trp":["ld",45006],"tlw":["del",4570],"trw":["ledde",906],"lp":["del","els","dl","else","dli","dele"],"rp":["ld","lde","lld","led","lse","llde","lke","oke","ild","ilke","les","kel","lise","lek"]},"103":{"input":[1,2,3,6,7],"tlw":["alldeles",2595],"trw":["lade",1957],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["til",104652],"trp":["ig",244414],"tlw":["till",78901],"trw":["liv",4044],"lp":["til","till","gi","vil","vill","tio","tig","gl","tl"],"rp":["ig","lig","lt","ov","igt","llt","ligt","lv","lit","liv","log"]},"105":{"input":[1,4,6,7],"tlp":["tal",36626],"trp":["lat",26260],"tlw":["allt",11228],"trw":["lag",5318],"lp":["tal","allt","val","fl","alv","vag","tall","fal","fol","fall","atio","tala","alt","gla"],"rp":["lat","lag","iga","liga","ova","lva"]},"106":{"input":[2,4,6,7],"tlp":["sig",64325],"trp":["ock",24775],"tlw":["sig",62876],"trw":["likt",416],"lp":["sig","gic","gick","vilk","sokt","sov","ckl"],"rp":["ock","ocks","lic","ktig","lick","klig","okt","loc","lock","lst","kov","lts","llts"]},"107":{"input":[1,2,4,6,7],"tlw":["alltsa",3917],"trw":["ocksa",11852],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["rl",28320],"trp":["ler",39552],"tlw":["eller",21635],"trw":["over",17755],"lp":["rl","rig","rli","elt","rlig","tel","rol","erl","rige"],"rp":["ler","ige","ller","ove","over","lev","lige","let","lite","llet","lir"]},"109":{"input":[1,3,4,6,7],"tlw":["varfor",5432],"trw":["later",1516],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["dig",9388],"trw":["kort",3076],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["aldrig",8974],"trw":["klart",1941],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["ho",156427],"trw":["hon",71785],"lp":[],"rp":["ho","hon","ul","ull","hu","lu","hono","ion","nl","lin","nli","hol","ln","holl","oh","iho","uni","hun","lun","ino"]},"113":{"input":[1,5,6,7],"tlp":["anl",7509],"trp":["lan",56925],"tlw":["quinn",114],"trw":["halla",3206],"lp":["anl","anli","alin","alln","alan"],"rp":["lan","hal","hall","llan","nal","oha","ohan","ula","nali","olan","lina","ulla","lna","nla","inal"]},"114":{"input":[2,5,6,7],"tlp":["sku",43264],"trp":["ku",78375],"tlw":["skull",1127],"trw":["hos",4276],"lp":["sku","skul","slu"],"rp":["ku","kul","kull","kun","lj","uk","kon","hus","ilj","juk","kunn","olj","jl","ojl","jli","ojli","hos"]},"115":{"input":[1,2,5,6,7],"tlw":["skolan",1295],"trw":["kunna",5127],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["eho",7167],"trp":["ulle",40111],"tlw":["elin",222],"trw":["hel",1084],"lp":["eho","eln","enl","enli"],"rp":["ulle","hel","len","ly","ione","llen","yl","hell","ilen","yll","olen","nle","uel","uell","leen","nel"]},"117":{"input":[1,3,5,6,7],"tlw":["elina",933],"trw":["hela",8378],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["skulle",39287],"trw":["kunde",19109],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["skillnad",573],"trw":["handlade",1198],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["bl",59992],"trp":["ing",86010],"tlw":["bli",9179],"trw":["hogt",1449],"lp":["bl","bli","tion","bil","vu","ting","gh"],"rp":["ing","ning","lut","lb","nlig","llb","illb","hog","uv","hov","huv","uvu","huvu"]},"121":{"input":[1,4,5,6,7],"tlw":["vanligt",1746],"trw":["inga",3339],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["slut",3258],"trw":["och",261930],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["sjalv",9343],"trw":["klockan",2663],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["blev",11880],"trw":["hur",18534],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["vagen",2479],"trw":["langre",3962],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["verkligen",3128],"trw":["huvudet",3819],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["bland",3152],"trw":["ibland",2952],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trp":["pp",78667],"trw":["p",2050],"lp":[],"rp":["pp"]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",29927],"trp":["pa",207370],"trw":["pa",144323],"lp":["ap","app","appa","apa"],"rp":["pa","ppa","pap","papp"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",19698],"trp":["ps",3998],"lp":["sp"],"rp":["ps","pps","psp","ppsp"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["spa",4537],"trp":["pas",7949],"tlw":["asp",86],"trw":["pass",549],"lp":["spa","sap","asp","aps","spas","aspa"],"rp":["pas","pass","ppas","psa","ppsa","pspa","pasa"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",6152],"trp":["pe",48173],"trw":["'",472],"lp":["ep","epp","e'","eppe","e'e","eep"],"rp":["pe","ppe","'e","pee","pep","pepp"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["ape",3130],"trp":["pape",411],"lp":["ape","appe","xp","exp","epa","xpe","expe","eap","eape","eppa"],"rp":["pape","'a"]},"134":{"input":[2,3,8],"tlp":["spe",8127],"trp":["pd",798],"tlw":["esp",72],"trw":["'de",96],"lp":["spe","esp","espe","sep","desp","dp","dsp","eps","dspe","dep","e's","d'","d'e"],"rp":["pd","ppd","'s","'d","'de","pse","'es"]},"135":{"input":[1,2,3,8],"tlp":["apad",573],"trp":["pad",4572],"trw":["passade",486],"lp":["apad","epad","dap","adap","spad","aspe","we'"],"rp":["pad","pade","ppad","pase","pesa"]},"136":{"input":[4,8],"tlp":["tp",509],"trp":["pt",11645],"trw":["pt",359],"lp":["tp","ttp"],"rp":["pt","ppt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["appt",2622],"trp":["pat",2945],"tlw":["tappa",242],"trw":["pat",56],"lp":["appt","tap","tapp","apt","apat","tpa","apta"],"rp":["pat","pf","ppf","pta","ppta","pfa","ppfa","pfat","ppat","ptat","pata","paf","patt"]},"138":{"input":[2,4,8],"tlp":["tsp",635],"trp":["pst",539],"lp":["tsp","stp","ttsp"],"rp":["pst","ppst"]},"139":{"input":[1,2,4,8],"tlp":["stpa",148],"trp":["past",2465],"trw":["pasta",175],"lp":["stpa","cap","astp","tpas","spac"],"rp":["past","ptac","pac","psta","psat","pats"]},"140":{"input":[3,4,8],"tlp":["rep",3339],"trp":["pr",31793],"tlw":["rep",90],"trw":["per",1755],"lp":["rep","ept","rp","epte","repp"],"rp":["pr","per","pre","pet","pte","pper","ppr","pete","ppte","'t","ppet","pter","petr","ppre","prep"]},"141":{"input":[1,3,4,8],"tlp":["rap",2854],"trp":["par",13633],"tlw":["trappa",178],"trw":["par",3758],"lp":["rap","rapp","trap","arp","rpa","arpa","apet","xper","repa","apr"],"rp":["par","pra","prat","part","pera","ppar","patr","pare","perf","para"]},"142":{"input":[2,3,4,8],"tlp":["spr",4496],"trp":["pers",6327],"tlw":["spred",228],"trw":["press",442],"lp":["spr","spec","cep","cept","resp","ccep","sept","t's","rsp","spre","etsp","sper","rspr","ecep"],"rp":["pers","prec","pres","pec","pdr","ppdr"]},"143":{"input":[1,2,3,4,8],"tlw":["spar",785],"trw":["pratade",1339],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["mm",66159],"trw":["m",1599],"lp":[],"rp":["mm","mn","mp","pn","ppn","pm","ppm","nm","np"]},"145":{"input":[1,5,8],"tlp":["am",108972],"trp":["ma",166775],"tlw":["am",93],"trw":["man",29921],"lp":["am","amm","amma","amn","amna"],"rp":["ma","man","mma","mann","mna","mman","pan","nam","mam","mamm","pna","namn","ppna","nap","napp"]},"146":{"input":[2,5,8],"tlp":["sm",12954],"trp":["ms",5095],"tlw":["sms",163],"trw":["jp",57],"lp":["sm","sms","spj","ssm"],"rp":["ms","mj","nsp","nsm","pj","jp"]},"147":{"input":[1,2,5,8],"tlp":["sam",33659],"trp":["mas",17101],"tlw":["samma",6340],"trw":["massa",827],"lp":["sam","samm","sma","span","ams","sman","asm","smas","sama"],"rp":["mas","mans","nsam","jam","mass","maj","mmas","jap","japa","pans","jamn"]},"148":{"input":[3,5,8],"tlp":["em",51088],"trp":["me",242113],"tlw":["e'en",102],"trw":["men",54243],"lp":["em","eme","emm","emp","empe","emen"],"rp":["me","men","mme","my","pen","ppen","ym","mpe","mne","yp","mmen","n'","mnen","ymm"]},"149":{"input":[1,3,5,8],"tlp":["ame",4829],"trp":["mena",3740],"tlw":["amy",218],"trw":["mannen",4191],"lp":["ame","emma","amne","xem","exem","xemp","amme","ema","apen","eman","amen","an'","apne"],"rp":["mena","mea","yma","yman","many","may","pany"]},"150":{"input":[2,3,5,8],"tlp":["dem",15113],"trp":["med",110013],"tlw":["dem",13812],"trw":["med",97131],"lp":["dem","ems","sme","smy","sem","seme","emes"],"rp":["med","mes","md","mde","mede","psy","mej","mens","medd","mnd","pens","mnde","mynd"]},"151":{"input":[1,2,3,5,8],"tlw":["ensam",1863],"trw":["medan",4549],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["tm",3262],"trp":["mt",19904],"lp":["tm","bm"],"rp":["mt","mb","mnt","pb"]},"153":{"input":[1,4,5,8],"tlp":["amt",15300],"trp":["mat",7731],"tlw":["famn",168],"trw":["mat",1157],"lp":["amt","tam","amf","amta","fam","amb","atm","tamm","amba","amat","tamt","tma"],"rp":["mat","mf","mta","mba","matt","mnat","mban","mfa"],"special":"numsym"},"154":{"input":[2,4,5,8],"tlp":["tsm",656],"trp":["mst",2612],"lp":["tsm","ttsm"],"rp":["mst","mts"]},"155":{"input":[1,2,4,5,8],"tlw":["samt",1065],"trw":["mats",293],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["rm",23979],"trp":["mer",31601],"tlw":["typ",630],"trw":["mer",11323],"lp":["rm","rme","rmen","tem","rem","emb","embe","erm","typ","emt"],"rp":["mer","mmer","met","mmet","mr","ment","mbe","mber","mete","penb"]},"157":{"input":[1,3,4,5,8],"tlw":["fram",10772],"trw":["menar",2322],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["september",636],"trw":["mest",3296],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["bestamde",1009],"trw":["maste",10840],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"!","trp":["pi",5476],"lp":[],"rp":["pi","ip","ipp","pip","ppi"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["api",1326],"trp":["ippa",1060],"trw":["pia",366],"lp":["api"],"rp":["ippa","ipa","pia","pipa","piz","pizz"]},"162":{"input":[2,6,8],"tlp":["spi",447],"trp":["pis",1842],"tlw":["skip",66],"lp":["spi","spis","spik","skip"],"rp":["pis","ips","psk","ppsk","pisk","isp","ksp","pik","psi","ppsi","psik","pk","ppk","kip"]},"163":{"input":[1,2,6,8],"tlp":["skap",4614],"trp":["kap",6395],"tlw":["skapa",567],"trw":["kapp",67],"lp":["skap"],"rp":["kap","kapi","kapa","pska","pisa","pak","kapp","ispa","ipas","ikap"]},"164":{"input":[3,6,8],"trp":["ipe",417],"lp":[],"rp":["ipe","pie","pei","ippe","i'"]},"165":{"input":[1,3,6,8],"lp":[],"rp":[]},"166":{"input":[2,3,6,8],"tlp":["spek",1307],"trp":["pek",3334],"tlw":["skepp",67],"trw":["keep",74],"lp":["spek","skep","disp","dip","espi"],"rp":["pek","idp","kep","pise","peis","kspe","pike","keep","ipse","kepp","keps","kesp"]},"167":{"input":[1,2,3,6,8],"tlw":["skapade",297],"trw":["pekade",973],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["tip",162],"trp":["pit",1381],"lp":["tip"],"rp":["pit","pti","ippt","pv","ppv"]},"169":{"input":[1,4,6,8],"tlp":["vap",1525],"trp":["pav",1648],"lp":["vap","apit"],"rp":["pav","pati","pita","pva","ppva","pif","ppif"]},"170":{"input":[2,4,6,8],"tlp":["cip",532],"trp":["pist",342],"tlw":["tips",162],"lp":["cip","tips","cksp","visp","scip","spit"],"rp":["pist","ptis","istp","pic"]},"171":{"input":[1,2,4,6,8],"tlw":["skapat",225],"trw":["packa",130],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["rip",1494],"trp":["pri",4672],"trw":["pierre",295],"lp":["rip","epti","vep","ripe","vept","epri"],"rp":["pri","peri","pite","priv","it'","prit","pier","iper","ppri","'ti"]},"173":{"input":[1,3,4,6,8],"tlw":["varpa",108],"trw":["partiet",469],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["respekt",485],"trw":["precis",3817],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["sprak",390],"trw":["patrik",492],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["mi",102861],"trw":["min",13506],"lp":[],"rp":["mi","min","im","mmi","imm","minn","mh","ph","him","mpi","mini","pph","imi","imp","hm","imin","mni","mnin","pni","ppni"]},"177":{"input":[1,5,6,8],"tlp":["ami",5806],"trp":["mina",5578],"trw":["mina",5090],"lp":["ami","amh","amin","amha","amni","ahm"],"rp":["mina","ham","imma","hamn","manh","mha","pami","pani","ima","hap","hami","mani","mia","iam"]},"178":{"input":[2,5,6,8],"tlp":["smi",1160],"trp":["mis",5636],"tlw":["smink",63],"trw":["minns",1738],"lp":["smi","smin","sim","simp","simm"],"rp":["mis","miss","mins","mk","mik","ism","mpis","mmis","misk","msk","kim","msi","insp","jim","km"]},"179":{"input":[1,2,5,6,8],"tlw":["smak",323],"trw":["manniska",1359],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["emi",765],"trp":["hem",10392],"trw":["hem",4760],"lp":["emi","ehm"],"rp":["hem","hemm","ime","mhe","imme","meni","mine","phy","ypi","imen","iem","phe","hemi","iemi","hym","meh","hme","mehm"]},"181":{"input":[1,3,5,6,8],"trw":["hemma",2590],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["spisen",158],"trw":["mindes",642],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["spanien",197],"trw":["make",607],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tim",4993],"trp":["mit",12022],"tlw":["bmi",74],"trw":["mitt",7427],"lp":["tim","timm","tmi","tmin","vtim","vm"],"rp":["mit","mitt","mti","mmit","mv","ntim","http","mbi","mith","pbi","mbin","imb","imt","htm"]},"185":{"input":[1,4,5,6,8],"tlw":["fatima",168],"trw":["hamta",775],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"tlw":["smith",142],"trw":["minst",1383],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["skamt",390],"trw":["knappt",1332],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["vem",3834],"trw":["mitten",567],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["timmar",1675],"trw":["paven",682],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["centimeter",252],"trw":["mycket",13594],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["amerikanska",1014],"trw":["marken",865],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["op",29076],"lp":[],"rp":["op","po","opp","ppo","pop","poo"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["appo",1452],"trp":["oppa",4532],"lp":["appo","apo"],"rp":["oppa","opa","poa"]},"194":{"input":[2,7,8],"tlp":["spo",1053],"trp":["pos",1604],"tlw":["sop",69],"lp":["spo","sop","sopp"],"rp":["pos","poss","osp","osop","opps"]},"195":{"input":[1,2,7,8],"tlp":["sapo",311],"trp":["pow",123],"tlw":["sapo",311],"lp":["sapo","apos"],"rp":["pow","opas"]},"196":{"input":[3,7,8],"tlp":["epo",584],"trp":["oppe",3306],"trw":["o'",107],"lp":["epo","eop"],"rp":["oppe","ope","peo","peop","o'","poe","o'e"]},"197":{"input":[1,3,7,8],"tlp":["xpo",151],"tlw":["expo",95],"lp":["xpo","expo"],"rp":[]},"198":{"input":[2,3,7,8],"tlp":["dop",66],"trp":["pose",156],"lp":["dop","espo"],"rp":["pose","ospe","osep","pod"]},"199":{"input":[1,2,3,7,8],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["top",2236],"trp":["pg",2205],"tlw":["topp",124],"lp":["top","topp","gp"],"rp":["pg","ppg","opt","pot","pott","pto"]},"201":{"input":[1,4,7,8],"tlp":["gap",69],"trp":["pag",1136],"trw":["pagatt",71],"lp":["gap","gapa"],"rp":["pag","pfo","ppfo","paga","ptag","pota","pga","ppga","opag"]},"202":{"input":[2,4,7,8],"tlp":["stop",1589],"trp":["post",535],"tlw":["stopp",156],"trw":["post",266],"lp":["stop","gsp","tspo","spot"],"rp":["post","psto"]},"203":{"input":[1,2,4,7,8],"tlw":["stoppa",368],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["rop",6174],"trp":["pro",9288],"tlw":["grepp",356],"trw":["oppet",450],"lp":["rop","ropp","grep","repo","epor","rope","rpo","rrop"],"rp":["pro","por","port","oper","ppor","opte","prog","ppro","pror","prot","peg","pege"]},"205":{"input":[1,3,4,7,8],"tlw":["rapport",324],"trw":["page",231],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["greps",172],"trw":["process",250],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"tlw":["ropade",806],"trw":["pastod",364],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["om",354658],"trw":["om",75959],"lp":[],"rp":["om","mo","up","upp","nom","omm","onom","um","mu","umm","oppn","pu","mun","num","omp","mon","pon","omn","munn","pun"]},"209":{"input":[1,5,7,8],"tlp":["amo",397],"trp":["omma",9507],"trw":["oppna",1197],"lp":["amo","amu","ampo","amon","ammo"],"rp":["omma","oma","pau","omna","upa","umma","uma","uman","ompa","uppa","moa","oman","poan","mona","ooma"]},"210":{"input":[2,5,7,8],"tlp":["som",155381],"trp":["moj",5297],"tlw":["som",144609],"trw":["puss",75],"lp":["som","somm","somn","smu","smo","sum","summ"],"rp":["moj","jup","mos","upps","poj","mus","oms","omoj","mju","mons","mjo","mso","omso"]},"211":{"input":[1,2,5,7,8],"tlw":["somna",238],"trw":["paus",417],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["enom",10795],"trp":["omme",12449],"trw":["uppe",1318],"lp":["enom","emo","emon"],"rp":["omme","umme","ome","uppe","ume","omen","nume","umen","pone","memo","meu","open","-m","on'","upe","onem","mue"]},"213":{"input":[1,3,5,7,8],"tlw":["anonym",71],"trw":["umea",222],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["dom",4177],"trw":["mod",240],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["djupa",306],"trw":["oppnade",1540],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["tom",8905],"trp":["mot",29248],"tlw":["tom",739],"trw":["mot",18572],"lp":["tom","gom","tum","tomm"],"rp":["mot","utom","mg","uppg","uppt","omt","mob","upt","pub","mott","utm","omg","omb","mog","mut","moto"]},"217":{"input":[1,4,5,7,8],"tlw":["tomma",544],"trw":["manga",6574],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["com",216],"trw":["most",517],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["tomas",242],"trw":["magnus",263],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["genom",7651],"trw":["mor",2097],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["framfor",3779],"trw":["pengar",2420],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["dessutom",3021],"trw":["person",1635],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["eftersom",5237],"trw":["omradet",633],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["pl",19160],"trw":["lopp",92],"lp":[],"rp":["pl","pol","poli","plo","lp","ppl","lip","lipp","pli","lop","ilip","opl","oppl","opi","lopp","ipl","llop","ipli","pio","ppli"]},"225":{"input":[1,6,7,8],"tlp":["alp",4565],"trp":["pla",9629],"trw":["lapp",124],"lp":["alp","alpa","appl","apl","apli","apol"],"rp":["pla","lap","lapp","lpa","pal","ppla","lapa","pala","pola","lopa","opia","plai","pall"]},"226":{"input":[2,6,7,8],"tlp":["slip",785],"trp":["kop",4334],"tlw":["slips",162],"trw":["polis",999],"lp":["slip","spl","spol","skop","spok","spio"],"rp":["kop","kopp","posi","klip","kopi","lips","plik","lsp","llsp","pok","ispl","pols","psl","ppsl"]},"227":{"input":[1,2,6,7,8],"tlw":["sallskap",673],"trw":["kopa",928],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["eopl",483],"trp":["pel",7276],"trw":["people",483],"lp":["eopl","elop","elp","e'l","e'll"],"rp":["pel","ple","pple","ople","lpe","pole","pell","lope","opei","pele","ppel","'l","'ll","opie"]},"229":{"input":[1,3,6,7,8],"tlw":["apple",405],"trw":["pela",641],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"tlw":["spel",332],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["spelade",1035],"trw":["klappade",170],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["gpl",562],"trp":["plot",3391],"trw":["pigg",86],"lp":["gpl","gip","tiop"],"rp":["plot","pgi","ppgi","lpt","plig","ptio","pig","lopt","pgiv","pitl","pigg","pigt"]},"233":{"input":[1,4,6,7,8],"tlw":["filippa",520],"trw":["pavliga",154],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"trw":["plotsligt",3109],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["slappt",216],"trw":["plats",2333],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"tlw":["grip",561],"trw":["prov",161],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"tlw":["april",550],"trw":["lappar",380],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["speciellt",540],"trw":["kropp",1211],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["slappte",734],"trw":["kapitel",1031],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["ml",11059],"trw":["honom",25475],"lp":[],"rp":["ml","mil","hop","lm","ommi","mli","ihop","hopp","inom","minu","lom","olm","holm","mill","uppl","mili","iml","ilm","omi","oml"],"special":"enter"},"241":{"input":[1,5,6,7,8],"tlw":["allihop",335],"trw":["lamna",1453],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["slump",168],"trw":["kom",13274],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["smala",395],"trw":["komma",5926],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"trw":["mille",982],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["exempel",1422],"trw":["mellan",5596],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["ekonomi",202],"trw":["polisen",2473],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["samlade",437],"trw":["lamnade",1603],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"tlw":["glomt",566],"trw":["mig",33025],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["gamla",2772],"trw":["lamnat",936],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["stockholm",1670],"trw":["kommit",3251],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["bakom",3858],"trw":["langsamt",1192],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"trw":["igenom",2222],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["tvartom",521],"trw":["information",924],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["emellertid",640],"trw":["kommer",10071],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["samtidigt",3340],"trw":["manniskor",3295],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/_generator/src/tr-keymap.json b/keyboards/gboards/dicts/aset/_generator/src/tr-keymap.json
new file mode 100644
index 00000000000..338d9a62a5f
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/_generator/src/tr-keymap.json
@@ -0,0 +1 @@
+{"0":{"value":0,"notes":["Developer : Zack Dennis (zack@asetniop.com)","Date : 12/12/2014","All code (c) 2014 Pointesa, LLC all rights reserved","Abbreviations : ","tlp = top left partial","lp = left partials","trp = top right partial","rp = right partials","tlw = top left word","lw = left words","trw = top right word","rw = right words"]},"1":{"input":[1],"base":"a","baseshift":"A","tlp":["aa",4698],"tlw":["a",3554],"lp":["aa"],"rp":[]},"2":{"input":[2],"base":"s","baseshift":"S","tlp":["ss",4821],"tlw":["s",2414],"lp":["ss"],"rp":[]},"3":{"input":[1,2],"base":"w","baseshift":"W","tlp":["as",119382],"tlw":["www",328],"lp":["as","sa","asa","saa","sas","asas","ww","ssa","ass","www","assa","aw","ssas","wa","was","aas"],"rp":[]},"4":{"input":[3],"base":"e","baseshift":"E","tlp":["ee",787],"tlw":["e",2415],"lp":["ee","eee"],"rp":[]},"5":{"input":[1,3],"base":"x","baseshift":"X","tlp":["ea",1611],"tlw":["x",136],"lp":["ea","ax","ex","ae"],"rp":[]},"6":{"input":[2,3],"base":"d","baseshift":"D","tlp":["de",225606],"tlw":["de",36223],"lp":["de","se","ed","es","ede","ded","ses","ese","dd","des","ess","dde","sed","sse","sess","ds","ssed","sede","dede","ddes"],"rp":[]},"7":{"input":[1,2,3],"tlp":["da",206254],"tlw":["da",34321],"lp":["da","ad","ada","ade","sad","das","sade","adas","esa","dad","add","we","asad","adde","dea","dada","eda","ew","esas","ades"],"rp":[]},"8":{"input":[4],"base":"t","baseshift":"T","tlp":["tt",24695],"tlw":["t",1015],"lp":["tt"],"rp":[]},"9":{"input":[1,4],"base":"f","baseshift":"F","tlp":["ta",77585],"tlw":["ta",701],"lp":["ta","at","fa","af","att","ata","aat","afa","tta","atta","ft","tat","fta","aft","afta","tf","taf","tafa","fat","tfa"],"rp":[]},"10":{"input":[2,4],"base":"c","baseshift":"C","tlp":["st",68030],"tlw":["c",1161],"lp":["st","ct","ts","tc","sc","cs","cc","stc"],"rp":[]},"11":{"input":[1,2,4],"tlp":["ca",58921],"tlw":["saat",1953],"lp":["ca","ac","aca","sta","ast","tas","saat","asta","sac","cas","sat","fas","afas","act","ats","saf","tsa","fac","cat","staf"],"rp":[]},"12":{"input":[3,4],"base":"r","baseshift":"R","tlp":["er",226224],"tlw":["r",1919],"lp":["er","re","te","et","ere","rt","ter","ett","ret","tr","rr","ete","rer","ert","etr","tte","eter","tre","tere","ette"],"rp":[]},"13":{"input":[1,3,4],"tlp":["ar",265101],"tlw":["ara",805],"lp":["ar","ra","ara","tar","ef","fe","art","rar","are","rta","raf","tara","efe","ate","far","araf","arar","era","aret","rat"],"rp":[]},"14":{"input":[2,3,4],"tlp":["rd",94145],"tlw":["eder",1592],"lp":["rd","ce","ec","rs","ece","ste","der","erd","rc","rde","erc","rce","erce","tes","ster","erde","eder","cer","dec","dece"],"rp":[]},"15":{"input":[1,2,3,4],"tlp":["ard",24858],"tlw":["sadece",3474],"lp":["ard","dar","adar","rad","rada","sar","ars","ras","aras","rda","arda","rsa","adec","car","arc","rca","arca","sara","arad","ates"],"rp":[]},"16":{"input":[5],"base":"n","baseshift":"N","trp":["nn",4449],"trw":["n",2786],"lp":[],"rp":["nn"]},"17":{"input":[1,5],"base":"q","baseshift":"Q","tlp":["an",238539],"trp":["na",72648],"tlw":["an",2138],"trw":["na",265],"lp":["an","ana","ann","anan","anna","anaa"],"rp":["na","nan","nana","nna","naa"]},"18":{"input":[2,5],"base":"j","baseshift":"J","tlp":["sn",731],"trp":["ns",19851],"trw":["j",258],"lp":["sn","sj"],"rp":["ns"]},"19":{"input":[1,2,5],"tlp":["san",27441],"trp":["nsa",12550],"tlw":["sana",3065],"trw":["jan",70],"lp":["san","sana","ans","asan","aj","sans","anas","sna","ansa","saj","wn","snas","aja","ajan"],"rp":["nsa","nsan","nas","ja","jan","jas"]},"20":{"input":[3,5],"base":"y","baseshift":"Y","tlp":["en",210551],"trp":["ne",100917],"tlw":["en",11061],"trw":["ne",21701],"lp":["en","ey","eye","ene","eyen","enn","enen","enne","eyn","eney"],"rp":["ne","ye","yen","yn","ny","nne","ney","nen","neye","yey"]},"21":{"input":[1,3,5],"tlp":["ay",82752],"trp":["ya",146697],"tlw":["ay",1315],"trw":["ya",9294],"lp":["ay","aya","ayn","ayan","eya","aye","anne","ane","ena","ean","ayna"],"rp":["ya","yan","nya","yana","yay","yna","nyan","nyay","nay"]},"22":{"input":[2,3,5],"tlp":["den",42341],"trp":["nd",145890],"tlw":["sey",11559],"trw":["neden",3186],"lp":["den","end","sey","sen","eden","eyd","sy","ende","eys","eyse","dey"],"rp":["nd","nde","yd","nden","ned","nede","nes","ys","yse"]},"23":{"input":[1,2,3,5],"tlp":["dan",31876],"trp":["nda",59116],"tlw":["anda",2147],"trw":["yandan",1000],"lp":["dan","and","anda","adan","say","ayd","day","sya","daya","saya"],"rp":["nda","ndan","yas","yasa","yda","yad","yand","yada","ydan","nyad"]},"24":{"input":[4,5],"base":"b","baseshift":"B","tlp":["bb",403],"trp":["nt",8039],"tlw":["b",1063],"lp":["bb","bn","tn"],"rp":["nt","nb","ntt"]},"25":{"input":[1,4,5],"tlp":["ba",93513],"trp":["nat",1344],"tlw":["bana",7207],"lp":["ba","ab","tan","aba","ban","bana","bab","baba","tab","aban","ant","bat","anb","tanb","atan","anat","anta","taba"],"rp":["nat","nta"]},"26":{"input":[2,4,5],"tlp":["cb",5912],"trp":["nc",43318],"lp":["cb","sb","bs"],"rp":["nc","nst","nts","nct","ncs"]},"27":{"input":[1,2,4,5],"tlp":["bas",33680],"trp":["nca",9555],"tlw":["bas",1003],"lp":["bas","anc","anca","can","sab","stan","saba","cab","abas","basa","banc","caba","bast","acab","bac","baca","acan"],"rp":["nca","jac","nanc"]},"28":{"input":[3,4,5],"tlp":["be",64335],"trp":["nr",22775],"tlw":["ben",11408],"trw":["yere",2638],"lp":["be","ben","ren","ten","ber","rb","bey","eb","ry","rn","rey","rry","bet"],"rp":["nr","yer","yet","ner","yr","yere","nere"]},"29":{"input":[1,3,4,5],"tlp":["ran",8536],"trp":["nra",19010],"tlw":["bay",1366],"trw":["nefret",613],"lp":["ran","ray","ayr","bay","ayat","rab","fen","anr","tanr","raya","abe","aber","bar","tay","aran","efen"],"rp":["nra","yar","yat","yara"]},"30":{"input":[2,3,4,5],"tlp":["enc",7430],"trp":["nce",17802],"tlw":["bes",2395],"trw":["yerde",2084],"lp":["enc","rden","bes","cen","ence","ecen","bend","bed","eyec","seb","sebe","cey","bede","denb","renc"],"rp":["nce","yerd","yec","ncer","yece"]},"31":{"input":[1,2,3,4,5],"tlw":["cay",353],"trw":["nefes",591],"lp":[],"rp":[]},"32":{"input":[6],"base":"i","baseshift":"I","trp":["ii",3027],"trw":["i",6002],"lp":[],"rp":["ii","iii"]},"33":{"input":[1,6],"base":"z","baseshift":"Z","tlp":["az",37543],"trp":["iz",67417],"tlw":["az",2781],"trw":["iz",185],"lp":["az","zi","za","azi","ai","aza","zz","zza","ziz","aziz","azz","azza","aiz","zizi"],"rp":["iz","izi","ia","iza","izz","izza"]},"34":{"input":[2,6],"base":"k","baseshift":"K","tlp":["si",195648],"trp":["is",144843],"tlw":["sik",1643],"trw":["ki",13823],"lp":["si","sk","sik","ski","sis"],"rp":["is","ki","ik","isi","iki","kis","ks","kisi","kk","kki","ksi","isik","isk","iss","ikk"]},"35":{"input":[1,2,6],"tlp":["ak",120301],"trp":["ka",146870],"tlw":["siz",2295],"trw":["kiz",2838],"lp":["ak","asi","aki","siz","ask","aka","ska","aska","aks","sizi","akk","sak"],"rp":["ka","ika","isa","kiz","ksa","kas","kasi","kka"]},"36":{"input":[3,6],"base":",","baseshift":"<","tlp":["ei",1119],"trp":["ie",1447],"lp":["ei"],"rp":["ie"],"special":"punc"},"37":{"input":[1,3,6],"tlp":["ze",32460],"trp":["ize",5154],"lp":["ze","ez","aze","eza","ezi","eze","xi","axi","zize","ezz","zze","ezze"],"rp":["ize","ix"]},"38":{"input":[2,3,6],"tlp":["di",240613],"trp":["ke",66794],"tlw":["dedi",14715],"trw":["ise",4856],"lp":["di","ek","edi","esi","dedi","eki","dis","disi","dik","sek","eke","esk","dek","eski"],"rp":["ke","id","ide","ise","kes","idi"]},"39":{"input":[1,2,3,6],"tlp":["adi",32039],"trp":["kad",29760],"tlw":["size",2133],"trw":["kez",2647],"lp":["adi","dak","zd","daki","zde","dasi","disa","size","dai","zdi","diz","aske","azd"],"rp":["kad","kada","kadi","ida","kez","izd","izde"]},"40":{"input":[4,6],"base":"v","baseshift":"V","tlp":["ti",111166],"trp":["it",25283],"tlw":["v",314],"trw":["iv",158],"lp":["ti","tti","vi","vv","tit","vit","tv","vitt","vvi","titi"],"rp":["it","itt","itti","iti","iv","ivi"]},"41":{"input":[1,4,6],"tlp":["va",43131],"trp":["if",8297],"tlw":["atti",862],"trw":["itaat",146],"lp":["va","av","ati","fi","ava","afi","faz","atti","zat","avi","fif","afif","tav","ait","zav","zava"],"rp":["if","ita","ifa","ift"]},"42":{"input":[2,4,6],"tlp":["ci",93762],"trp":["ic",75936],"tlw":["cikti",1490],"trw":["ic",1182],"lp":["ci","sti","cik","tik","cti","sit","cikt","tk","tki","cis"],"rp":["ic","ici","kt","ist","isti","kti","ikt","kit","ikti","kc"]},"43":{"input":[1,2,4,6],"tlp":["cak",14208],"trp":["kat",11273],"tlw":["fakat",5422],"trw":["kac",836],"lp":["cak","aci","akt","fak","akti","acak","cika","akat","faka","vas","tak","avas","acik","zc"],"rp":["kat","kta","kac","ica","izc","kita"]},"44":{"input":[3,4,6],"tlp":["ri",163641],"trp":["ir",286103],"tlw":["ve",81408],"trw":["iri",579],"lp":["ri","ve","eri","ev","ver","tir","etti","eti","rti","evi","eve","vet","vr","veri","evet","etir","evr"],"rp":["ir","iri","ire"]},"45":{"input":[1,3,4,6],"tlp":["ari",56898],"trp":["ira",15785],"tlw":["var",7891],"trw":["itiraf",311],"lp":["ari","var","zer","zeri","arti","raz","eva","rafi","zar","tari","avr","zate","zir","zere","air","fir","azir","atir"],"rp":["ira","iraz"]},"46":{"input":[2,3,4,6],"tlp":["rk",38427],"trp":["iste",14557],"tlw":["tek",4748],"trw":["iste",3907],"lp":["rk","rdi","rek","cek","dir","erek","rke","rsi","ekt","tek","erk","sir","erke","erdi","ris"],"rp":["iste","ird","irdi","kte","kir"]},"47":{"input":[1,2,3,4,6],"tlw":["vardi",6467],"trw":["kadar",16753],"lp":[],"rp":[]},"48":{"input":[5,6],"base":"h","baseshift":"H","trp":["in",370626],"trw":["in",526],"lp":[],"rp":["in","ni","ini","nin","hi","inin","ih","hin","ihi","nini","nih","hn","ihin","ihn","hni","ihni","hini","hnin","nni","hnn"]},"49":{"input":[1,5,6],"tlp":["ah",50091],"trp":["ha",92564],"tlw":["ah",1397],"trw":["izin",1006],"lp":["ah","ani","aha","anin","zin","ahi","zan"],"rp":["ha","ina","niz","han","izin","iniz","hiz","nz","haz","inan","hani","nina","hazi"]},"50":{"input":[2,5,6],"tlp":["sin",65670],"trp":["isin",17912],"tlw":["sinsi",110],"trw":["isin",932],"lp":["sin","sini","skin","sh"],"rp":["isin","kin","ins","nk","nki","ikin","his","kkin","nis","nsi","hs","nik","hiss","ji","hk","hik"]},"51":{"input":[1,2,5,6],"tlp":["asin",26353],"trp":["insa",12256],"tlw":["sanki",2615],"trw":["insan",3805],"lp":["asin","sina","akin","sah","sani","ank","sahi","anki","sank","ansi","akan"],"rp":["insa","kan","nasi","hak","hakk","has","kah","ikan","nsiz"]},"52":{"input":[3,5,6],"tlp":["eni",37090],"trp":["iy",103444],"tlw":["eh",335],"trw":["iyi",7728],"lp":["eni","eyi","enin","eh","eyin","ehi"],"rp":["iy","yi","he","ine","iye","iyi","yin","yeni","yni","niy","yine","niye","hen","hey"]},"53":{"input":[1,3,5,6],"tlp":["ayi",16661],"trp":["hay",12548],"tlw":["ayni",4770],"trw":["yani",4094],"lp":["ayi","ayni","zen","enz","aniy","ziy","ayin","enze","eniz","eyaz"],"rp":["hay","yani","iya","yaz","haya","hayi","yazi","yah","nze","iyan"]},"54":{"input":[2,3,5,6],"tlp":["endi",29457],"trp":["ind",72325],"tlw":["diye",15017],"trw":["kendi",7334],"lp":["endi","diy","din","sind","diye","esin","dini","siy","seni","sine","ediy"],"rp":["ind","ken","ndi","inde","kend","ydi","ndis","ndin","kiy"]},"55":{"input":[1,2,3,5,6],"tlw":["daha",20490],"trw":["kadin",3728],"lp":[],"rp":[]},"56":{"input":[4,5,6],"tlp":["bi",275568],"trp":["ib",28649],"tlw":["bin",1281],"trw":["hint",87],"lp":["bi","tin","bin","vin","th","tini","bit","bii"],"rp":["ib","ibi","ht","iht","hti","ihti","nti","nit","int","hib","hibi","inti"]},"57":{"input":[1,4,5,6],"tlp":["biz",10055],"trp":["hat",6156],"tlw":["biz",2560],"trw":["hatta",2528],"lp":["biz","abi","bizi","baz","fin","afin","bah","atin","tabi","bazi","tani","van","ahat","abah"],"rp":["hat","haf","hav","hava","hatt","hab"]},"58":{"input":[2,4,5,6],"tlp":["cin",41998],"trp":["icin",39248],"tlw":["cin",367],"trw":["icin",25984],"lp":["cin","cbi","bic","ch","bici","cini","vinc"],"rp":["icin","hic","inc","nci","icb","hicb","icbi","inci","kinc","nic","hc","nici","ich"]},"59":{"input":[1,2,4,5,6],"tlw":["baska",6795],"lp":[],"rp":[]},"60":{"input":[3,4,5,6],"tlp":["bir",195972],"trp":["her",22311],"tlw":["bir",148963],"trw":["her",15822],"lp":["bir","rin","erin","rini","beni","biri","rine","tiy","riy","evin","rh","rbi","birb"],"rp":["her","irin","yeri","yir","nri","yri","irb"]},"61":{"input":[1,3,4,5,6],"tlw":["biraz",4474],"trw":["hayir",2604],"lp":[],"rp":[]},"62":{"input":[2,3,4,5,6],"tlw":["birden",2181],"trw":["icinde",7275],"lp":[],"rp":[]},"63":{"input":[1,2,3,4,5,6],"tlw":["arasinda",3496],"trw":["yavas",1614],"lp":[],"rp":[]},"64":{"input":[7],"base":"o","baseshift":"O","trp":["oo",542],"trw":["o",25996],"lp":[],"rp":["oo"]},"65":{"input":[1,7],"base":"(","baseshift":"[","trp":["oa",60],"lp":[],"rp":["oa"],"special":"punc"},"66":{"input":[2,7],"base":".","baseshift":">","tlp":["so",67268],"trp":["os",16832],"tlw":["so",92],"lp":["so","sos"],"rp":["os","oso","oss"],"special":"punc"},"67":{"input":[1,2,7],"tlp":["wo",188],"trp":["osa",584],"lp":["wo","woo"],"rp":["osa","ow"]},"68":{"input":[3,7],"base":"-","baseshift":"_","tlp":["eo",1196],"trp":["oe",285],"trw":["-",13834],"lp":["eo","e-"],"rp":["oe","-e","-o"],"special":"punc"},"69":{"input":[1,3,7],"trp":["-a",61],"lp":[],"rp":["-a"]},"70":{"input":[2,3,7],"tlp":["do",35030],"trp":["od",5854],"tlw":["do",161],"lp":["do","dos","eso","edo","s-","s-s","s-se","sdo","dosd","deo"],"rp":["od","ose","-s","ode","oses","ood","osed","-se","osd","osdo"]},"71":{"input":[1,2,3,7],"tlp":["ado",548],"trp":["oda",4372],"trw":["odada",430],"lp":["ado","wood","eoda"],"rp":["oda","odas","odad","-w","-we","owe","oad"]},"72":{"input":[4,7],"base":"g","baseshift":"G","tlp":["go",43595],"trp":["og",22300],"tlw":["g",946],"trw":["ot",144],"lp":["go","to","got","tto","gog","tog","tg","gg","gt","gto"],"rp":["og","ot","oto","ott","otto","otog","ogg","ogo"]},"73":{"input":[1,4,7],"tlp":["ag",32516],"trp":["of",2290],"tlw":["aga",174],"trw":["of",191],"lp":["ag","ga","aga","fo","tag","atag","ato","fot","foto","taga","fag","tfag","faga","ago","fog","fogg"],"rp":["of","oga","ofo","ota"]},"74":{"input":[2,4,7],"tlp":["co",29333],"trp":["oc",10369],"tlw":["goc",81],"trw":["oc",52],"lp":["co","coc","gos","gost","cog","sog","sto","sg","gs","gogs","tos","cos","gc","sgc","stos"],"rp":["oc","ost","osto","ogs","osc"]},"75":{"input":[1,2,4,7],"tlp":["sag",5201],"trp":["oca",3682],"tlw":["sag",869],"lp":["sag","cag","acag","asag","gac","agac","sof","saga","gas","sga","gaca","sofo","gasa","astg","asg"],"rp":["oca","ocas","osta","osca","ocag"]},"76":{"input":[3,4,7],"tlp":["ge",85092],"trp":["or",124494],"tlw":["gore",3389],"trw":["ote",515],"lp":["ge","eg","ger","gor","gr","gere","gore","ege","ro","rg","eger","gre","get","tor"],"rp":["or","ogr","ort","ore","ote","ogre"]},"77":{"input":[1,3,4,7],"tlp":["gar",3353],"trp":["orta",6084],"tlw":["fotograf",161],"trw":["orta",641],"lp":["gar","arg","rag","gra","efo","age","t-f","t-fa","gara","rato","ator","for","rof","graf","agr"],"rp":["orta","ora","-f","-fa","ogra"]},"78":{"input":[2,3,4,7],"tlp":["deg",18415],"trp":["ord",34113],"tlw":["gece",2933],"trw":["otede",232],"lp":["deg","gec","dog","dogr","sor","gece","gerc","gord","sord","ceg","dor","eceg","dort","gect","dost","dege","gd"],"rp":["ord","oste","ors"]},"79":{"input":[1,2,3,4,7],"tlw":["dag",243],"trw":["orada",2520],"lp":[],"rp":[]},"80":{"input":[5,7],"base":"u","baseshift":"U","trp":["un",176917],"trw":["onu",9693],"lp":[],"rp":["un","on","nu","onu","unu","nun","onun","unun","no","nunu","ou","non","ono","nou","unn"]},"81":{"input":[1,5,7],"tlp":["ano",845],"trp":["una",8817],"trw":["ona",7053],"lp":["ano","anu","au","qu","anun","anon","aun"],"rp":["una","ona","unan","ua","nuna","uan","nano","onan"]},"82":{"input":[2,5,7],"tlp":["su",56434],"trp":["us",59637],"tlw":["su",6093],"trw":["us",133],"lp":["su","son","sun","sunu","sonu","sus","sons"],"rp":["us","usu","usun","nus","onus","nusu","osu","jo","ons","nsu","onsu","osun","ju"]},"83":{"input":[1,2,5,7],"tlp":["suna",877],"trp":["usa",2657],"tlw":["sona",460],"lp":["suna","sona","asu","anus","susa","ajo","sano","sau","saun","asus","anso"],"rp":["usa","usan","nusa","own","usaa","now","nown","osan","unas"]},"84":{"input":[3,5,7],"tlp":["enu",1411],"trp":["yo",85768],"trw":["onune",1033],"lp":["enu"],"rp":["yo","uy","yu","oy","uyo","uyu","une","one","uny","oyu","yun","nuy","oyun","nuyo","yon","unuy","n-","oyn","yone"]},"85":{"input":[1,3,5,7],"tlp":["anyo",338],"trp":["unya",5800],"trw":["yunan",253],"lp":["anyo","eona","eux","an-","que"],"rp":["unya","uya","uyan","oya","yuna","oyna","ux","nuya","yuya","onay","yoya","-ya","yano","oyan","yona"]},"86":{"input":[2,3,5,7],"tlp":["du",128153],"trp":["und",24604],"tlw":["dondu",1341],"trw":["onunde",1790],"lp":["du","soy","dus","dusu","don","dun","duny","duy","sund"],"rp":["und","unde","ud","ndu","ond","nund","undu","udu","ydu","uyd","uydu"]},"87":{"input":[1,2,3,5,7],"tlw":["sonunda",2463],"trw":["ondan",1762],"lp":[],"rp":[]},"88":{"input":[4,5,7],"tlp":["bu",129214],"trp":["ug",30997],"tlw":["bu",59152],"trw":["not",308],"lp":["bu","gu","tu","gun","bun","bo","tun","gunu","bunu","but","butu"],"rp":["ug","ugu","ut","ugun","utu","utun","otu","ng","ogu"]},"89":{"input":[1,4,5,7],"tlp":["bag",4649],"trp":["uf",2044],"tlw":["buna",2248],"lp":["bag","ang","abu","fon","buna","font","anbu","gan","guna","fu","tuta","agan"],"rp":["uf","uta","utf","ufa","utan","uga","uba","nag"]},"90":{"input":[2,4,5,7],"tlp":["cu",29850],"trp":["uc",23984],"tlw":["bos",1277],"trw":["uc",3579],"lp":["cu","stu","cun","cocu","guc","stun","sunc","bos","cug","cogu"],"rp":["uc","ust","ucu","ustu","unc","onc","ocu","ucun","nuc","onuc"]},"91":{"input":[1,2,4,5,7],"tlw":["fonts",354],"trw":["usta",320],"lp":[],"rp":[]},"92":{"input":[3,4,5,7],"tlp":["ru",61296],"trp":["ur",80226],"tlw":["gene",1320],"trw":["uygun",1047],"lp":["ru","tur","boy","buy","buyu","gru","run","gen","bur","goru"],"rp":["ur","yor","oru","onr","uru","uyor","yoru","ogru","orun","ure"]},"93":{"input":[1,3,4,5,7],"tlw":["buraya",1264],"trw":["ortaya",2163],"lp":[],"rp":[]},"94":{"input":[2,3,4,5,7],"tlw":["dogru",6276],"trw":["once",6114],"lp":[],"rp":[]},"95":{"input":[1,2,3,4,5,7],"tlw":["sonra",17553],"trw":["oradan",704],"lp":[],"rp":[]},"96":{"input":[6,7],"base":"l","baseshift":"L","trp":["li",153361],"trw":["l",1692],"lp":[],"rp":["li","il","ol","ili","ll","lli","ill","lo","oll","oli","illi","lil","olo","io","ilo","lili","ool","llo"]},"97":{"input":[1,6,7],"tlp":["al",111125],"trp":["la",193014],"tlw":["al",750],"trw":["la",412],"lp":["al","ali","zl","ala","zla","all","zo","alla","azl","zli","azla"],"rp":["la","ola","oz","ila","lla","ozl","izl","izli","izla"]},"98":{"input":[2,6,7],"tlp":["sl",30642],"trp":["ok",45144],"tlw":["sol",615],"trw":["ilk",4866],"lp":["sl","sil","sli","sili"],"rp":["ok","ko","kl","lik","lk","lis","kli","kil","ikl","ls","isl","lki","ols","ilk","kol","likl"]},"99":{"input":[1,2,6,7],"tlp":["asl",17339],"trp":["kal",18830],"tlw":["soz",2999],"trw":["olsa",1993],"lp":["asl","sla","asla","akl","asil","soz","sal","alis","akla","asli","alk","akli"],"rp":["kal","kla","las","lak","kala","lasi","kali","lsa"]},"100":{"input":[3,6,7],"tlp":["el",88486],"trp":["le",161881],"tlw":["el",1633],"trw":["ile",9283],"lp":["el","eli","ele","ell","elli","elle","elel","elil"],"rp":["le","ile","lle","ille","ole","lel","leo","-i","lee","leli","lele","i-"]},"101":{"input":[1,3,6,7],"tlp":["zle",10682],"trp":["ozle",8085],"tlw":["aile",576],"trw":["ozel",1294],"lp":["zle","zel","ale","ela","zell","aile","alle","zeli","elal","ael","elia","eal","ezil","ezel","azel","aale"],"rp":["ozle","oze","ozel","izle"]},"102":{"input":[2,3,6,7],"tlp":["dil",10774],"trp":["ld",66610],"tlw":["sekilde",2905],"trw":["kisisel",342],"lp":["dil","ekl","eld","sle","sel","eldi","dol","dile","esl","ekli"],"rp":["ld","old","ldi","ild","ildi","kle","lde","led","ledi","ikle"]},"103":{"input":[1,2,3,6,7],"tlw":["aldi",1426],"trw":["kaldi",1084],"lp":[],"rp":[]},"104":{"input":[4,6,7],"tlp":["gi",137313],"trp":["ig",40159],"tlw":["gitti",1369],"trw":["ilgili",1508],"lp":["gi","gil","tl","gl","tig","tigi","git","gili","tli","vl"],"rp":["ig","igi","lt","lg","lti","ilg","lgi","ilgi","lig","ligi"]},"105":{"input":[1,4,6,7],"tlp":["agi",15275],"trp":["lat",3470],"tlw":["fazla",3194],"trw":["laf",255],"lp":["agi","goz","alt","alti","gozl","agl","atl","fazl","tal","gla","tla","zg","agla","giz","val","atli","agli","gal","gz"],"rp":["lat"]},"106":{"input":[2,4,6,7],"tlp":["cok",19740],"trp":["okt",7640],"tlw":["cok",17627],"trw":["isigi",416],"lp":["cok","cl","cil","gis","sig","gisi","cli","sigi"],"rp":["okt","likt","kot","koc","lc","ktig","lic","olc","list","isig","kto","okto"]},"107":{"input":[1,2,4,6,7],"tlw":["asagi",1220],"trw":["olacak",1662],"lp":[],"rp":[]},"108":{"input":[3,4,6,7],"tlp":["rl",31288],"trp":["ler",57971],"tlw":["geri",3197],"trw":["ileri",1117],"lp":["rl","egi","gel","egil","rli","gir","rle","erl","geli","rler","erle","gele","eler"],"rp":["ler","leri","lir","iler","irl","ilir","irli"]},"109":{"input":[1,3,4,6,7],"tlw":["agir",1726],"lp":[],"rp":[]},"110":{"input":[2,3,4,6,7],"tlw":["degil",8435],"lp":[],"rp":[]},"111":{"input":[1,2,3,4,6,7],"tlw":["farkli",1113],"trw":["olarak",9384],"lp":[],"rp":[]},"112":{"input":[5,6,7],"trp":["nl",58209],"trw":["unlu",539],"lp":[],"rp":["nl","lu","ul","olu","lin","ulu","unl","nli","onl","lun","inl","hu","ln","lni","uh","ulun","ho","olun","lini","ilin"]},"113":{"input":[1,5,6,7],"tlp":["anl",26128],"trp":["uz",53334],"tlw":["allah",1522],"trw":["olan",10895],"lp":["anl","zu","anla","zun","anli","aln","alni"],"rp":["uz","nla","lan","hal","uzu","olan","uzun","onla","unla","ula","lniz","ozu","uza"]},"114":{"input":[2,5,6,7],"tlp":["sul",3102],"trp":["ku",42732],"tlw":["soluk",557],"trw":["olsun",2457],"lp":["sul"],"rp":["ku","uk","kon","konu","oku","unk","kul","nku","unku","ukl","luk","nlik","kus","kun","uks","lsu","olsu","lsun","lus"]},"115":{"input":[1,2,5,6,7],"tlw":["sozunu",629],"trw":["nasil",6031],"lp":[],"rp":[]},"116":{"input":[3,5,6,7],"tlp":["eyl",6217],"trp":["yl",48761],"tlw":["elini",1491],"trw":["oyle",5326],"lp":["eyl","elin","eyle","elen"],"rp":["yl","iyo","yle","oyl","oyle","liy","liyo","yil","len","yol","iyl","nle","ley","luy","iliy","luyo"]},"117":{"input":[1,3,5,6,7],"trw":["yalniz",2707],"lp":[],"rp":[]},"118":{"input":[2,3,5,6,7],"tlw":["soyle",2267],"trw":["yok",5734],"lp":[],"rp":[]},"119":{"input":[1,2,3,5,6,7],"tlw":["aslinda",1786],"trw":["halde",2581],"lp":[],"rp":[]},"120":{"input":[4,5,6,7],"tlp":["bil",29017],"trp":["igin",12379],"tlw":["gibi",22656],"trw":["oglu",704],"lp":["bil","gib","gibi","gin","bul","bili","gini","bunl","bulu","gul","vu","bol","glu"],"rp":["igin","ngi","uv","ltin","lb","utl","ult"]},"121":{"input":[1,4,5,6,7],"tlw":["bulunan",1116],"trw":["hangi",1195],"lp":[],"rp":[]},"122":{"input":[2,4,5,6,7],"tlw":["cunku",5282],"trw":["kucuk",4807],"lp":[],"rp":[]},"123":{"input":[1,2,4,5,6,7],"tlw":["sultan",928],"trw":["kabul",2501],"lp":[],"rp":[]},"124":{"input":[3,4,5,6,7],"tlw":["bile",8084],"trw":["olur",3157],"lp":[],"rp":[]},"125":{"input":[1,3,4,5,6,7],"tlw":["guzel",3729],"trw":["uzerine",3191],"lp":[],"rp":[]},"126":{"input":[2,3,4,5,6,7],"tlw":["buyuk",8285],"trw":["oldugunu",7814],"lp":[],"rp":[]},"127":{"input":[1,2,3,4,5,6,7],"tlw":["basladi",3009],"trw":["uzerinde",2861],"lp":[],"rp":[]},"128":{"input":[8],"base":"p","baseshift":"P","trw":["p",380],"lp":[],"rp":[]},"129":{"input":[1,8],"base":"?","baseshift":"/","tlp":["ap",33487],"trp":["pa",24487],"trw":["papa",112],"lp":["ap","apa"],"rp":["pa","pap","papa"],"special":"punc"},"130":{"input":[2,8],"base":")","baseshift":"]","tlp":["sp",921],"trp":["ps",3704],"lp":["sp"],"rp":["ps"],"special":"punc"},"131":{"input":[1,2,8],"tlp":["sap",796],"trp":["pas",1542],"trw":["pasa",973],"lp":["sap","spa","aps","asp","sapa","aspa","saps","apsa"],"rp":["pas","pasa","pasp","psa"]},"132":{"input":[3,8],"base":"'","baseshift":"\"","tlp":["ep",9410],"trp":["pe",13191],"trw":["'",2126],"lp":["ep","e'","epe"],"rp":["pe","'e","''","pee"],"special":"punc"},"133":{"input":[1,3,8],"tlp":["a'",2478],"trp":["'a",813],"lp":["a'","epa","ape","x'","ax'","a'e"],"rp":["'a","pa'"]},"134":{"input":[2,3,8],"tlp":["eps",2946],"trp":["'d",2842],"trw":["'de",625],"lp":["eps","s'","e'd","e'de","epes","d'","esp","eped","spe","s'e","es'","spee"],"rp":["'d","'de","pes","ped","pede","pse","pd","pds"]},"135":{"input":[1,2,3,8],"tlp":["sa'",753],"trp":["'da",1650],"trw":["'da",254],"lp":["sa'","a'd","a'da","asa'","esap","apad","sa'd","da'","aspe","apse","apd","apds","d'a"],"rp":["'da","pad","pa'd"]},"136":{"input":[4,8],"tlp":["tp",76],"trp":["pt",7654],"trw":["pt",1404],"lp":["tp","ttp"],"rp":["pt"],"special":"bksp","base":"tp"},"137":{"input":[1,4,8],"tlp":["apt",5195],"trp":["pta",1168],"trw":["pat",52],"lp":["apt","tap","apta","apat","tapt"],"rp":["pta","pat","patt","pata"]},"138":{"input":[2,4,8],"trp":["pc",141],"lp":[],"rp":["pc"]},"139":{"input":[1,2,4,8],"tlp":["apac",1249],"trp":["pac",1249],"lp":["apac","apc","apca","spat","cap"],"rp":["pac","paca","pca"]},"140":{"input":[3,4,8],"tlp":["rp",1331],"trp":["pr",3486],"tlw":["tepe",103],"trw":["'te",217],"lp":["rp","tep","tepe","r'","re'","ere'","er'","rpt","ept","epte","rpe","rper"],"rp":["pr","per","'t","pre","pet","'te","petr","pte"]},"141":{"input":[1,3,4,8],"tlp":["apar",1698],"trp":["par",11587],"tlw":["arap",301],"trw":["para",1673],"lp":["apar","rap","arp","arap","ra'","tepa","f'","rpa","arpa","ara'","arpt","apr","apra"],"rp":["par","para","pra","part","patr","'ta","pera"]},"142":{"input":[2,3,4,8],"tlp":["cep",294],"trp":["perd",423],"tlw":["cep",124],"trw":["perde",178],"lp":["cep","step","s't","s'te","tesp","r'd","er'd","sper","re'd","ecep","ste'"],"rp":["perd","perc","pers"]},"143":{"input":[1,2,3,4,8],"tlw":["sarap",440],"trw":["parca",649],"lp":[],"rp":[]},"144":{"input":[5,8],"base":"m","baseshift":"M","trp":["nm",9106],"trw":["m",1569],"lp":[],"rp":["nm","pm","mm","mp","mn"]},"145":{"input":[1,5,8],"tlp":["am",92732],"trp":["ma",129330],"tlw":["ama",21666],"trw":["mana",161],"lp":["am","ama","aman","apm","apma","anm","amam","anma","apan","amm"],"rp":["ma","man","mam","pma","nma","pan","mana","mpa","nam","mama"]},"146":{"input":[2,5,8],"tlp":["sm",13256],"trp":["ms",8305],"lp":["sm"],"rp":["ms","mps"]},"147":{"input":[1,2,5,8],"tlp":["sma",8191],"trp":["mas",9911],"tlw":["sam",348],"trw":["masa",380],"lp":["sma","sam","sman","asam","sama","asm","asma","amas","ams","smas","sanm","span","ssam"],"rp":["mas","masa","msa","pmas","nmas","maj","mans"]},"148":{"input":[3,5,8],"tlp":["em",49576],"trp":["me",74751],"tlw":["epey",418],"trw":["yemeye",95],"lp":["em","eme","emen","enm","emey"],"rp":["me","men","mey","meye","nem","'n","mem","nme","yem","ym","yeme","'y","pen","pey","y'"]},"149":{"input":[1,3,5,8],"tlp":["ame",2729],"trp":["yap",17207],"tlw":["annem",417],"trw":["yapan",657],"lp":["ame","amay","ema","a'n","amen","an'","a'y","eyma","a'ya"],"rp":["yap","may","maya","yapa","yapm","yma","'ya","mame","pmay","yman","pay"]},"150":{"input":[2,3,5,8],"tlp":["dem",6920],"trp":["md",15044],"tlw":["demeye",98],"trw":["'den",147],"lp":["dem","deme","sme","esm","emed","sem","ems","edem"],"rp":["md","mse","mes","med","mde","mede","mese","msey","meyd","mden","msen","msed"]},"151":{"input":[1,2,3,5,8],"tlw":["adam",4638],"trw":["meydana",782],"lp":[],"rp":[]},"152":{"input":[4,5,8],"tlp":["tm",17169],"trp":["mb",2359],"lp":["tm"],"rp":["mb","mt"]},"153":{"input":[1,4,5,8],"tlp":["tam",6202],"trp":["mat",647],"tlw":["tam",3821],"lp":["tam","tma","atm","tama","atma","bam","abam","amb","fam","amba","afam","apab","tatm","tman"],"rp":["mat","mba","mant","pab","ptan","pant"],"special":"numsym"},"154":{"input":[2,4,5,8],"tlp":["cm",3662],"trp":["mc",1577],"lp":["cm"],"rp":["mc"]},"155":{"input":[1,2,4,5,8],"tlw":["cam",364],"lp":[],"rp":[]},"156":{"input":[3,4,5,8],"tlp":["rm",25050],"trp":["mer",5044],"tlw":["etmeye",820],"trw":["mr",413],"lp":["rm","etm","tme","rme","etme","tem","erm","erme","teme","tmey","rmey","rem","renm","term","ry'","rry'"],"rp":["mer","met","mr","mbe"]},"157":{"input":[1,3,4,5,8],"tlw":["tamamen",907],"trw":["yapar",447],"lp":[],"rp":[]},"158":{"input":[2,3,4,5,8],"tlw":["sebep",489],"trw":["pencereden",421],"lp":[],"rp":[]},"159":{"input":[1,2,3,4,5,8],"tlw":["stepan",214],"trw":["jandarma",125],"lp":[],"rp":[]},"160":{"input":[6,8],"base":"!","baseshift":"!","trp":["ip",23109],"trw":["ip",98],"lp":[],"rp":["ip","pi","pip","ipi"],"special":"punc"},"161":{"input":[1,6,8],"tlp":["api",10616],"trp":["paz",682],"trw":["papaz",183],"lp":["api","apip","apaz","zip","azip","zap","azap"],"rp":["paz","paza"]},"162":{"input":[2,6,8],"tlp":["sip",883],"trp":["kip",3619],"tlw":["sikisip",77],"trw":["pis",531],"lp":["sip","spi"],"rp":["kip","psi","pis","pk","pisi","pki","ipk","ipki","ikip","psik","isip","pik","pkk","kipk","isp","pisk","ipik","kipi"]},"163":{"input":[1,2,6,8],"tlp":["apis",1831],"trp":["kap",8447],"tlw":["sapka",135],"trw":["kapi",974],"lp":["apis","akip","asip","apk","apka","sapk","apsi"],"rp":["kap","kapi","kapa","pka","ispa","pkas","pak","kapk","paki"]},"164":{"input":[3,6,8],"tlp":["epi",576],"trp":["'i",3340],"trw":["'i",87],"lp":["epi","e'i"],"rp":["'i","i'","ipe","ie'","pie"]},"165":{"input":[1,3,6,8],"tlp":["x'i",65],"trp":["pez",51],"lp":["x'i","ax'i"],"rp":["pez","peze"]},"166":{"input":[2,3,6,8],"tlp":["epsi",2946],"trp":["pek",6932],"tlw":["edip",667],"trw":["pek",4304],"lp":["epsi","dip","edip","ekip","ski'","epk","epki","espi","esip","s'i"],"rp":["pek","peki","idip","pesi","pid","k'","is'","ipek","ki'","k'i"]},"167":{"input":[1,2,3,6,8],"trw":["kapida",236],"lp":[],"rp":[]},"168":{"input":[4,6,8],"tlp":["tip",2155],"trp":["pti",4694],"tlw":["tip",299],"trw":["itip",81],"lp":["tip","tipi"],"rp":["pti","ipt","ipti","pit","itip"]},"169":{"input":[1,4,6,8],"tlp":["apti",4186],"trp":["itap",1997],"tlw":["atip",257],"lp":["apti","vap","atip","apit"],"rp":["itap","pav","pati","ipta","pita"]},"170":{"input":[2,4,6,8],"tlp":["cip",1668],"trp":["ptik",601],"tlw":["tipki",865],"trw":["icip",79],"lp":["cip","tipk","spit"],"rp":["ptik","pic","pici","icip","pist"]},"171":{"input":[1,2,4,6,8],"tlw":["takip",521],"trw":["kitap",795],"lp":[],"rp":[]},"172":{"input":[3,4,6,8],"tlp":["rip",3191],"trp":["irip",1440],"tlw":["verip",240],"trw":["pir",218],"lp":["rip","ri'","rpi","erip","ti'","rpti","r'i","re'i","ver'","er'i","rpip","rpri"],"rp":["irip","pir","piri","ptir","iti'","peri","irp","pri"]},"173":{"input":[1,3,4,6,8],"trw":["parti",379],"lp":[],"rp":[]},"174":{"input":[2,3,4,6,8],"tlw":["cekip",471],"trw":["kirip",55],"lp":[],"rp":[]},"175":{"input":[1,2,3,4,6,8],"tlw":["cevap",1689],"trw":["parcasi",437],"lp":[],"rp":[]},"176":{"input":[5,6,8],"trp":["im",97151],"trw":["mi",12284],"lp":[],"rp":["im","mi","min","nim","imi","nmi","mini","hip","hm","imin","inm","ph","pin","nip","pini","pmi","inmi","him","imp","nimi"]},"177":{"input":[1,5,6,8],"tlp":["zam",15802],"trp":["miz",5126],"tlw":["zaman",9588],"trw":["hanim",555],"lp":["zam","zama","ami","zim","amin","anim","ahip","zm","ahm","anmi"],"rp":["miz","maz","ima","izim","imiz","mani","mizi","mah","ham","mami"]},"178":{"input":[2,5,6,8],"tlp":["sim",12135],"trp":["mis",35215],"tlw":["simsiki",221],"trw":["kim",1847],"lp":["sim","smi"],"rp":["mis","kim","km","ism","ims","kims","ikm","misi","mk","kmi","nmis","kmis","kimi","ismi","isim","msi","ikmi","psin"]},"179":{"input":[1,2,5,6,8],"tlw":["aksam",1411],"trw":["misiniz",745],"lp":[],"rp":[]},"180":{"input":[3,5,6,8],"tlp":["emi",12554],"trp":["hem",8923],"tlw":["emin",834],"trw":["hemen",4788],"lp":["emi","enim","emin","emiy"],"rp":["hem","miy","hep","heme","'ni","'nin","piy","'in","ime","yim","yip","i'n","i'ni","hme","nemi","piyi"]},"181":{"input":[1,3,5,6,8],"tlw":["annemin",178],"trw":["hepimiz",316],"lp":[],"rp":[]},"182":{"input":[2,3,5,6,8],"tlw":["simdi",5781],"trw":["kimse",1852],"lp":[],"rp":[]},"183":{"input":[1,2,3,5,6,8],"tlw":["adamin",1501],"trw":["kapiyi",1057],"lp":[],"rp":[]},"184":{"input":[4,5,6,8],"tlp":["tim",7187],"trp":["itm",2987],"tlw":["tim",161],"trw":["mit",80],"lp":["tim","tmi","ttim","vim","timi","bitm","tmin","thm"],"rp":["itm","itmi","itim","ptim","mit","hipt","mbi","htim","ptin","imb","imbi","ntim"]},"185":{"input":[1,4,5,6,8],"tlw":["bizim",2636],"trw":["mavi",631],"lp":[],"rp":[]},"186":{"input":[2,4,5,6,8],"tlw":["cikmis",550],"trw":["mistik",111],"lp":[],"rp":[]},"187":{"input":[1,2,4,5,6,8],"tlw":["canim",596],"trw":["kaptan",268],"lp":[],"rp":[]},"188":{"input":[3,4,5,6,8],"tlw":["benim",6122],"trw":["yirmi",1140],"lp":[],"rp":[]},"189":{"input":[1,3,4,5,6,8],"tlw":["tanrim",479],"trw":["yapti",759],"lp":[],"rp":[]},"190":{"input":[2,3,4,5,6,8],"tlw":["etmek",2074],"lp":[],"rp":[]},"191":{"input":[1,2,3,4,5,6,8],"tlw":["devam",2432],"trw":["yardim",1282],"lp":[],"rp":[]},"192":{"input":[7,8],"base":";","baseshift":":","trp":["op",8798],"lp":[],"rp":["op","po","opo","pop","popo","poo"],"special":"punc"},"193":{"input":[1,7,8],"tlp":["apo",362],"trp":["opa",623],"tlw":["apo",61],"lp":["apo"],"rp":["opa"]},"194":{"input":[2,7,8],"tlp":["sop",218],"trp":["pos",264],"lp":["sop","spo"],"rp":["pos","opos","osp","pso"]},"195":{"input":[1,2,7,8],"tlp":["sopa",88],"trp":["pow",86],"tlw":["sopa",88],"lp":["sopa"],"rp":["pow"]},"196":{"input":[3,7,8],"tlp":["eop",251],"trp":["ope",871],"lp":["eop"],"rp":["ope","o'"]},"197":{"input":[1,3,7,8],"tlp":["eopa",251],"lp":["eopa"],"rp":[]},"198":{"input":[2,3,7,8],"tlp":["do'",50],"trp":["od'",59],"lp":["do'"],"rp":["od'","ood'"]},"199":{"input":[1,2,3,7,8],"lp":[],"rp":[]},"200":{"input":[4,7,8],"tlp":["top",5867],"trp":["opt",260],"tlw":["top",230],"lp":["top"],"rp":["opt","pot","pott"]},"201":{"input":[1,4,7,8],"tlp":["apag",165],"trp":["pag",1236],"lp":["apag"],"rp":["pag","opat","opag","paga","pota"]},"202":{"input":[2,4,7,8],"tlp":["cop",181],"trp":["post",126],"tlw":["cop",181],"trw":["otostop",67],"lp":["cop","stop"],"rp":["post"]},"203":{"input":[1,2,4,7,8],"trw":["posta",126],"lp":[],"rp":[]},"204":{"input":[3,4,7,8],"tlp":["topr",1446],"trp":["opr",1640],"trw":["potter",167],"lp":["topr","rop"],"rp":["opr","pro","-top","por","prog","peg","opeg","prop","oper","port","prot"]},"205":{"input":[1,3,4,7,8],"tlw":["topraga",181],"trw":["page",832],"lp":[],"rp":[]},"206":{"input":[2,3,4,7,8],"tlw":["spor",119],"trw":["protesto",51],"lp":[],"rp":[]},"207":{"input":[1,2,3,4,7,8],"trw":["profesor",263],"lp":[],"rp":[]},"208":{"input":[5,7,8],"trp":["um",48695],"trw":["mu",2378],"lp":[],"rp":["um","mu","up","umu","om","mo","unm","mun","omu","umun","mum","nmu","onm","nup","num","onup","unmu","pu","onmu","mnu"]},"209":{"input":[1,5,7,8],"tlp":["amu",724],"trp":["uma",3601],"lp":["amu","ammu","amo","apon"],"rp":["uma","oma","upa","unma","uman","oman","mua","numa","pau","pamu","muna","namu","uam","muam"]},"210":{"input":[2,5,7,8],"tlp":["sunm",1248],"trp":["mus",15207],"trw":["musun",1010],"lp":["sunm","sup","smu","smus","sum","som"],"rp":["mus","usm","nusm","ums","osm","musu","umus","nmus","msu","usmu","umsu","usup","mos","osum"]},"211":{"input":[1,2,5,7,8],"trw":["osman",247],"lp":[],"rp":[]},"212":{"input":[3,5,7,8],"tlp":["emnu",603],"trp":["onem",4198],"trw":["memnun",488],"lp":["emnu","emu"],"rp":["onem","ume","yum","muy","unme","yumu","ome","uym","ymu","muyo","'u","memu","uyum","oym","onme","o'n","umuy","'un"]},"213":{"input":[1,3,5,7,8],"trw":["maymun",120],"lp":[],"rp":[]},"214":{"input":[2,3,5,7,8],"tlw":["donup",819],"trw":["muydu",265],"lp":[],"rp":[]},"215":{"input":[1,2,3,5,7,8],"tlw":["dusman",463],"trw":["musaade",167],"lp":[],"rp":[]},"216":{"input":[4,5,7,8],"tlp":["tum",4398],"trp":["mut",4536],"tlw":["tum",2174],"trw":["umut",237],"lp":["tum","gum","gm","gumu","tom","tup","gmu","ttom","tutm","tumu","tmu","gom"],"rp":["mut","ugum","utm","omut","nutm","umut","utmu","utup"]},"217":{"input":[1,4,5,7,8],"tlw":["bomba",100],"trw":["mutfaga",167],"lp":[],"rp":[]},"218":{"input":[2,4,5,7,8],"tlw":["gumus",409],"trw":["unutmus",110],"lp":[],"rp":[]},"219":{"input":[1,2,4,5,7,8],"tlw":["cuma",169],"trw":["mustafa",624],"lp":[],"rp":[]},"220":{"input":[3,4,5,7,8],"tlw":["grup",385],"trw":["oturup",540],"lp":[],"rp":[]},"221":{"input":[1,3,4,5,7,8],"tlw":["ragmen",1330],"trw":["yagmur",493],"lp":[],"rp":[]},"222":{"input":[2,3,4,5,7,8],"tlw":["durum",881],"trw":["oturmus",358],"lp":[],"rp":[]},"223":{"input":[1,2,3,4,5,7,8],"tlw":["durumda",912],"trw":["propaganda",168],"lp":[],"rp":[]},"224":{"input":[6,7,8],"trp":["pl",6579],"trw":["pol",144],"lp":[],"rp":["pl","lip","opl","pil","pol","poli","ilip","ipl","lp","pli","pili","ilp","pilo","ipli","pool"]},"225":{"input":[1,6,7,8],"tlp":["apil",2908],"trp":["pla",4024],"tlw":["alip",1109],"lp":["apil","alip","apl","apla","apal","alp","apli"],"rp":["pla","opla","pila","pal","pali","ipla","lap","olap"]},"226":{"input":[2,6,7,8],"tlp":["skop",138],"trp":["kop",1470],"tlw":["silip",98],"trw":["polis",725],"lp":["skop","sipl"],"rp":["kop","lkip","kopo","pisl"]},"227":{"input":[1,2,6,7,8],"trw":["kapali",519],"lp":[],"rp":[]},"228":{"input":[3,6,7,8],"tlp":["elip",1112],"trp":["l'",1267],"trw":["poole",60],"lp":["elip","el'","el'i","epl","eple"],"rp":["l'","'l","ple","l'i","leop","li'","lep","'le","le'","lle'","le'i","iple","'li","ll'","ll'i"]},"229":{"input":[1,3,6,7,8],"trw":["la'e",56],"lp":[],"rp":[]},"230":{"input":[2,3,6,7,8],"trw":["kopek",433],"lp":[],"rp":[]},"231":{"input":[1,2,3,6,7,8],"tlw":["dolasip",126],"trw":["pekala",402],"lp":[],"rp":[]},"232":{"input":[4,6,7,8],"tlp":["topl",3261],"trp":["ptig",2000],"trw":["popov",105],"lp":["topl","gip"],"rp":["ptig","ptil","pov","opov"]},"233":{"input":[1,4,6,7,8],"tlw":["aptal",428],"trw":["iptal",64],"lp":[],"rp":[]},"234":{"input":[2,4,6,7,8],"trw":["politik",151],"lp":[],"rp":[]},"235":{"input":[1,2,4,6,7,8],"tlw":["ciplak",453],"trw":["politika",153],"lp":[],"rp":[]},"236":{"input":[3,4,6,7,8],"tlw":["gelip",1112],"trw":["piril",272],"lp":[],"rp":[]},"237":{"input":[1,3,4,6,7,8],"tlw":["garip",992],"trw":["pavel",210],"lp":[],"rp":[]},"238":{"input":[2,3,4,6,7,8],"tlw":["gidip",1162],"trw":["polisler",126],"lp":[],"rp":[]},"239":{"input":[1,2,3,4,6,7,8],"tlw":["toprak",602],"trw":["parlak",776],"lp":[],"rp":[]},"240":{"input":[5,6,7,8],"trp":["lm",46943],"trw":["olup",1530],"lp":[],"rp":["lm","olm","lmi","ilm","ml","lim","lum","ilmi","lmu","mli","olmu","olum","mil","iml","ulm","ilim","lup","plu","oplu","olup"],"special":"enter"},"241":{"input":[1,5,6,7,8],"tlw":["anlamina",563],"trw":["olmaz",1004],"lp":[],"rp":[]},"242":{"input":[2,5,6,7,8],"tlw":["sokup",136],"trw":["olmus",1359],"lp":[],"rp":[]},"243":{"input":[1,2,5,6,7,8],"tlw":["almak",825],"trw":["olmak",1877],"lp":[],"rp":[]},"244":{"input":[3,5,6,7,8],"tlw":["elimi",221],"trw":["onemli",2111],"lp":[],"rp":[]},"245":{"input":[1,3,5,6,7,8],"tlw":["almaya",456],"trw":["olmayan",1555],"lp":[],"rp":[]},"246":{"input":[2,3,5,6,7,8],"tlw":["soylemek",674],"trw":["oldum",429],"lp":[],"rp":[]},"247":{"input":[1,2,3,5,6,7,8],"tlw":["aldim",504],"trw":["olmadi",572],"lp":[],"rp":[]},"248":{"input":[4,5,6,7,8],"tlw":["bolum",547],"trw":["mutlu",849],"lp":[],"rp":[]},"249":{"input":[1,4,5,6,7,8],"tlw":["film",181],"trw":["hamilton",186],"lp":[],"rp":[]},"250":{"input":[2,4,5,6,7,8],"tlw":["gitmis",374],"trw":["olmustu",1519],"lp":[],"rp":[]},"251":{"input":[1,2,4,5,6,7,8],"tlw":["baslamisti",1046],"trw":["kocaman",640],"lp":[],"rp":[]},"252":{"input":[3,4,5,6,7,8],"tlw":["biliyorum",953],"trw":["muhtemelen",286],"lp":[],"rp":[]},"253":{"input":[1,3,4,5,6,7,8],"tlw":["zamanlar",874],"trw":["yaptigi",1060],"lp":[],"rp":[]},"254":{"input":[2,3,4,5,6,7,8],"tlw":["gormek",1084],"trw":["istiyorum",996],"lp":[],"rp":[]},"255":{"input":[1,2,3,4,5,6,7,8],"tlw":["basladim",495],"trw":["olmadigini",1197],"lp":[],"rp":[]}}
\ No newline at end of file
diff --git a/keyboards/gboards/dicts/aset/cmd-keymap.def b/keyboards/gboards/dicts/aset/cmd-keymap.def
new file mode 100644
index 00000000000..0d7398dd4a9
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/cmd-keymap.def
@@ -0,0 +1,28 @@
+PRES(CMD | AA, KC_LCTL)
+PRES(CMD | AS, KC_LSFT)
+PRES(CMD | AE, KC_LALT)
+PRES(CMD | AT, KC_LGUI)
+PRES(CMD | AN, KC_LEFT)
+PRES(CMD | AI, KC_DOWN)
+PRES(CMD | AO, KC_UP)
+PRES(CMD | AP, KC_RIGHT)
+PRES(CMD | AR, KC_PGUP)
+PRES(CMD | AL, KC_PGDN)
+
+PRES(CMD | AA | AP, KC_F1)
+PRES(CMD | AA | AO, KC_F2)
+PRES(CMD | AA | AO | AP, KC_F3)
+PRES(CMD | AA | AI, KC_F4)
+PRES(CMD | AA | AI | AP, KC_F5)
+PRES(CMD | AA | AI | AO, KC_F6)
+PRES(CMD | AA | AI | AO | AP, KC_F7)
+PRES(CMD | AA | AN, KC_F8)
+PRES(CMD | AA | AN | AP, KC_F9)
+PRES(CMD | AA | AN | AO, KC_F10)
+PRES(CMD | AA | AN | AO | AP, KC_F11)
+PRES(CMD | AA | AN | AI, KC_F12)
+
+PRES(CMD | AS | AN, KC_HOME)
+PRES(CMD | AS | AP, KC_END)
+PRES(CMD | AS | AI, KC_INS)
+PRES(CMD | AS | AO, KC_DEL)
diff --git a/keyboards/gboards/dicts/aset/da-keymap.def b/keyboards/gboards/dicts/aset/da-keymap.def
new file mode 100644
index 00000000000..48fe42aca1a
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/da-keymap.def
@@ -0,0 +1,386 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AT, KC_T)
+PRES(AS, KC_S)
+PRES(AN, KC_N)
+PRES(AE, KC_E)
+PRES(AP, KC_P)
+PRES(AO, KC_O)
+PRES(AI, KC_I)
+PRES(AA, KC_A)
+PRES(AT|AI, KC_V)
+PRES(AS|AI, KC_K)
+PRES(AE|AT, KC_R)
+PRES(AT|AN, KC_B)
+PRES(AN|AI, KC_H)
+PRES(AA|AS, KC_W)
+PRES(AN|AP, KC_M)
+PRES(AA|AI, KC_Z)
+PRES(AE|AO, KC_MINS)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+PRES(AE|AI, KC_COMM)
+PRES(AS|AO, KC_DOT)
+PRES(AS|AE, KC_D)
+PRES(AS|AN, KC_J)
+PRES(AT|AO, KC_G)
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AO|AP, KC_SCLN)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+PRES(AE|AN, KC_Y)
+PRES(AT|AP, KC_BSPC)
+PRES(AI|AO, KC_L)
+PRES(AA|AE, KC_X)
+PRES(AE|AP, KC_QUOT)
+PRES(AA|AP, KC_QUOT)
+PRES(AA|AT, KC_F)
+PRES(AN|AO, KC_U)
+PRES(AA|AN, KC_Q)
+PRES(AS|AT, KC_C)
+SUBS(AR|AS|AI|AP, str_565EB49E602024EF, "pis ")
+SUBS(AR|AA|AE|AO, str_C243E0504A15B978, "-aa ")
+SUBS(AR|AI|AO|AP, str_88B19184FF89676C, "pol ")
+SUBS(AR|AA|AE|AT, str_452BE2346B5B80C3, "fra ")
+SUBS(AR|AS|AE|AT, str_925BB6ABF283A228, "det ")
+SUBS(AR|AS|AT|AI, str_2B382E2C87F633B5, "sit ")
+SUBS(AR|AA|AS|AT, str_71D766F84D388274, "fast ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AA|AT|AI, str_72AD8360CE343978, "tav ")
+SUBS(AR|AA|AS|AO, str_83C2A82DF3DB1D35, "wos ")
+SUBS(AR|AN|AI|AO, str_5A09FD44BA314863, "hun ")
+SUBS(AR|AN|AI|AP, str_683696748A01B41C, "min ")
+SUBS(AR|AN|AO|AP, str_0F33CAECD78B3E6B, "om ")
+SUBS(AR|AS|AN|AP, str_D63FDE230FD34803, "sms ")
+SUBS(AR|AA|AS|AP, str_467C897077B58F08, "pas ")
+SUBS(AR|AA|AN|AO, str_FD846B750BDF7708, "au ")
+SUBS(AR|AE|AN|AO, str_683A471B89B5678B, "nue ")
+SUBS(AR|AE|AO|AP, str_5AC772D310448B08, "oppe ")
+SUBS(AR|AA|AS|AE, str_6E5B393925FE64CE, "da ")
+SUBS(AR|AE|AN|AI, str_7A4D8698951A1FAD, "hen ")
+SUBS(AR|AA|AE|AI, str_D2F95EA81F7C61D5, "ix ")
+SUBS(AR|AS|AT|AI|AP, str_A19F8973C971DB48, "spist ")
+SUBS(AR|AA|AS|AT|AN, str_7BC51A9B4E5AFDF1, "satan ")
+SUBS(AR|AA|AE|AN|AO, str_F1CF8B964BEDDE0C, "-naa ")
+SUBS(AR|AS|AN|AI|AP, str_CE4E838E0BC6E4DA, "km ")
+SUBS(AR|AT|AI|AO|AP, str_702F532D7A48BC00, "pligt ")
+SUBS(AR|AE|AN|AO|AP, str_BA75DF4F8F68AF81, "-men ")
+SUBS(AR|AA|AN|AO|AP, str_38342550D5BCF484, "opnaa ")
+SUBS(AR|AS|AT|AN|AP, str_DE6CBE601C534F3D, "cm ")
+SUBS(AR|AE|AN|AI|AP, str_B95094D0F4C2F09E, "mine ")
+SUBS(AR|AA|AS|AI|AP, str_CC46AF41D9985527, "pak ")
+SUBS(AR|AA|AS|AE|AO, str_8D630077F3C9958C, "-saa ")
+SUBS(AR|AA|AT|AI|AP, str_46C3C336E40056DB, "fip ")
+SUBS(AR|AE|AI|AO|AP, str_FAF3CEB5A465C19D, "pille ")
+SUBS(AR|AT|AN|AI|AP, str_168886128C6CCE68, "mit ")
+SUBS(AR|AA|AN|AI|AP, str_FC9AB513E2B03A28, "ham ")
+SUBS(AR|AA|AT|AN|AP, str_06AABBFC9BF9658F, "mat ")
+SUBS(AR|AA|AS|AN|AO, str_84BEE048B4700886, "jow ")
+SUBS(AR|AA|AS|AE|AT, str_7E1EAC57B515C2D1, "satte ")
+SUBS(AR|AS|AE|AO|AP, str_578A5EB31DA360B8, "pose ")
+SUBS(AR|AS|AI|AO, str_C9ADB25B4C37D131, "sol ")
+SUBS(AR|RGT|AS|AI|AO, str_7D5664732C823A0F, "los ")
+SUBS(AR|AE|AT|AN, str_8FB071FDE5C78172, "byen ")
+SUBS(AR|RGT|AE|AT|AN, str_77D0DE1110F92FFB, "nyt ")
+SUBS(AR|AA|AT|AN, str_72977AC3F75E644A, "tabt ")
+SUBS(AR|RGT|AA|AT|AN, str_47B698232847D3D2, "nat ")
+SUBS(AR|AA|AN|AI, str_DF39EA07684EC8FC, "zina ")
+SUBS(AR|RGT|AA|AN|AI, str_BB30CFFA4957C51C, "han ")
+SUBS(AR|AS|AE|AN, str_ECE5A6CDF4EED85C, "den ")
+SUBS(AR|RGT|AS|AE|AN, str_FB507079A5396F2A, "ned ")
+SUBS(AR|AT|AN|AI, str_802658407F3418BA, "thi ")
+SUBS(AR|RGT|AT|AN|AI, str_D6E1C0ECF0F9B0E2, "int ")
+SUBS(AR|AS|AE|AI, str_BA01E476816FB907, "disse ")
+SUBS(AR|RGT|AS|AE|AI, str_25694FCDDE3987C4, "ikke ")
+SUBS(AR|AS|AN|AI, str_55863E4A819B49C1, "sin ")
+SUBS(AR|RGT|AS|AN|AI, str_E1D43A91C597031D, "nik ")
+SUBS(AR|AT|AO|AP, str_8574F11BEB82545C, "top ")
+SUBS(AR|RGT|AT|AO|AP, str_0E727A3FBE39D351, "optog ")
+SUBS(AR|AE|AN|AP, str_AA0B430BA00E4952, "emne ")
+SUBS(AR|RGT|AE|AN|AP, str_B969E2F841D9C54A, "men ")
+SUBS(AR|AE|AT|AO, str_1EDA9A722270F7E4, "gore ")
+SUBS(AR|RGT|AE|AT|AO, str_6B77658521E3C3E6, "ore ")
+SUBS(AR|AS|AN|AO, str_3D29840CE477716A, "son ")
+SUBS(AR|RGT|AS|AN|AO, str_6E23CC4BFF56B58C, "jo ")
+SUBS(AR|AE|AT|AI, str_31E88DBD75048F73, "rev ")
+SUBS(AR|RGT|AE|AT|AI, str_60A95BD1113F9846, "iver ")
+SUBS(AR|AA|AE|AN, str_9CAD49AC9B02787F, "anne ")
+SUBS(AR|RGT|AA|AE|AN, str_890375A57AD3EAF4, "nae ")
+SUBS(AR|AE|AI|AO, str_05ED48987A1828F9, "el ")
+SUBS(AR|RGT|AE|AI|AO, str_E2986299752E3DE1, "lille ")
+SUBS(AR|AE|AT|AP, str_BDA9C3AA21C8CDAF, "er'et ")
+SUBS(AR|RGT|AE|AT|AP, str_342F8CACA85F0AD6, "per ")
+SUBS(AR|AS|AT|AO, str_5E351F69DA243685, "sogt ")
+SUBS(AR|RGT|AS|AT|AO, str_F12BF1912FA70BCD, "ost ")
+SUBS(AR|AA|AN|AP, str_85720F1C792E457F, "anm ")
+SUBS(AR|RGT|AA|AN|AP, str_7814AB9A9D941FFB, "man ")
+SUBS(AR|AA|AT|AO, str_A75FF214306BA9D1, "gaa ")
+SUBS(AR|RGT|AA|AT|AO, str_BF38370C83727D39, "of ")
+SUBS(AR|AA|AE|AP, str_102DD7D0196F36BB, "a' ")
+SUBS(AR|RGT|AA|AE|AP, str_67EC607457C73440, "pae' ")
+SUBS(AR|AA|AS|AN, str_CE3B00B88629D10F, "sans ")
+SUBS(AR|RGT|AA|AS|AN, str_16D6BE915787F782, "ja ")
+SUBS(AR|AS|AE|AO, str_5630D9590D848D9C, "dod ")
+SUBS(AR|RGT|AS|AE|AO, str_239CA41F6B24AC83, "ode ")
+SUBS(AR|AA|AS|AI, str_D8D6C8ABDF11FE6C, "zak ")
+SUBS(AR|RGT|AA|AS|AI, str_423FC7030B57068F, "ka ")
+SUBS(AR|AT|AN|AO, str_93A2E40FC11E1E12, "bog ")
+SUBS(AR|RGT|AT|AN|AO, str_AF77719623630FD4, "ung ")
+SUBS(AR|AA|AI|AO, str_C49001FAA655F248, "al ")
+SUBS(AR|RGT|AA|AI|AO, str_8CC474B4A7886F51, "laa ")
+SUBS(AR|AT|AI|AO, str_1C31AEE8DFCCE8EB, "til ")
+SUBS(AR|RGT|AT|AI|AO, str_DD07510FB54603F8, "liv ")
+SUBS(AR|AA|AS|AE|AT|AO, str_CA49BEAA613AC2F8, "sagde ")
+SUBS(AR|AE|AT|AI|AO|AP, str_348B2BB289B8817D, "pige ")
+SUBS(AR|AA|AE|AI|AO|AP, str_6726AAAD1B841698, "la' ")
+SUBS(AR|AA|AT|AN|AI|AP, str_78F7EA49F8D0A783, "timian ")
+SUBS(AR|AA|AS|AE|AO|AP, str_9D443C23601872A4, "opad ")
+SUBS(AR|AS|AT|AI|AO|AP, str_94A710198AA418ED, "politik ")
+SUBS(AR|AA|AE|AT|AN|AO, str_48AAA3207915A63E, "foran ")
+SUBS(AR|AA|AE|AN|AO|AP, str_7B08962D53257530, "-man ")
+SUBS(AR|AA|AS|AT|AI|AO, str_23089E82F5DFD0B4, "folk ")
+SUBS(AR|AE|AN|AI|AO|AP, str_8FB9C780573B2537, "mellem ")
+SUBS(AR|AA|AE|AN|AI|AP, str_9B092F875E2DA1B4, "ha' ")
+SUBS(AR|AS|AE|AI|AO, str_1861909A5CAE7807, "del ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_3CB77C2629D9FD41, "lod ")
+SUBS(AR|AA|AT|AN|AI, str_67B9DF0E88D8FE99, "tania ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_7589149FDAADDD5C, "navn ")
+SUBS(AR|AE|AT|AN|AP, str_8A3CF03C5FA779DF, "type ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_DEE3BBD571C511F7, "mere ")
+SUBS(AR|AA|AE|AT|AO, str_DAE84F2729ACCE2B, "for ")
+SUBS(AR|RGT|AA|AE|AT|AO, str_CC8D36F0E3CEDCB9, "ofte ")
+SUBS(AR|AT|AN|AO|AP, str_C7B05810B9878F2F, "tom ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_A9E20DE572F5CF4F, "omt ")
+SUBS(AR|AA|AS|AN|AP, str_FDE849B83007B2AD, "smaa ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_03C4681E621B41C8, "maj ")
+SUBS(AR|AA|AT|AI|AO, str_15B496B76D052225, "alt ")
+SUBS(AR|RGT|AA|AT|AI|AO, str_4447120BEB624253, "lagt ")
+SUBS(AR|AA|AE|AN|AI, str_B0D068D005493603, "annie ")
+SUBS(AR|RGT|AA|AE|AN|AI, str_384473729F209570, "hanne ")
+SUBS(AR|AA|AS|AI|AO, str_408F0634544C632D, "skal ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_05DBE3DB5EFBA943, "las ")
+SUBS(AR|AS|AI|AO|AP, str_AE39F7849C80EFF0, "spil ")
+SUBS(AR|RGT|AS|AI|AO|AP, str_87CFB86F7172C44A, "kop ")
+SUBS(AR|AS|AT|AN|AI, str_28584900EB088AC4, "skib ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_1F36E9BDFB6C17A3, "hvis ")
+SUBS(AR|AS|AE|AT|AI, str_44D89FF8C9DEFE4D, "ved ")
+SUBS(AR|RGT|AS|AE|AT|AI, str_44E526692C9E5C02, "idet ")
+SUBS(AR|AS|AT|AN|AO, str_E09BE53AF628FF96, "sgu ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_C039D2A5D9FC5D72, "just ")
+SUBS(AR|AA|AE|AI|AO, str_4B68781D007741F3, "alle ")
+SUBS(AR|RGT|AA|AE|AI|AO, str_F714B73058073162, "lae ")
+SUBS(AR|AE|AT|AI|AP, str_C2FA19F55AA9E107, "vipper ")
+SUBS(AR|RGT|AE|AT|AI|AP, str_BBC09EC206C805A7, "itt' ")
+SUBS(AR|AT|AN|AI|AO, str_5ED581CFD1E789A6, "blot ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_B3E389F57E160329, "lob ")
+SUBS(AR|AA|AE|AT|AP, str_E94650909CA1EEA6, "ta'r ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_F552C5CE7412D067, "par ")
+SUBS(AR|AA|AS|AE|AI, str_9CD8BF58537BE31A, "skade ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_DA742024F3D69E0A, "ida ")
+SUBS(AR|AS|AE|AT|AN, str_BB930E6E87DE648C, "syntes ")
+SUBS(AR|RGT|AS|AE|AT|AN, str_F5B0A1B8E66C4027, "jer ")
+SUBS(AR|AA|AE|AT|AN, str_9C31DB94CBCECD2F, "bare ")
+SUBS(AR|RGT|AA|AE|AT|AN, str_986149229D18C728, "naar ")
+SUBS(AR|AE|AT|AI|AO, str_87C9A08BCD5987C8, "eller ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_2CCE6615DDD45C8E, "over ")
+SUBS(AR|AS|AE|AT|AP, str_0F9FE8330213D831, "spredte ")
+SUBS(AR|RGT|AS|AE|AT|AP, str_0D904C6A57F1A574, "peder ")
+SUBS(AR|AA|AS|AE|AN, str_C51486569CE1AF4C, "anden ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_0C372259E4C87260, "naade ")
+SUBS(AR|AA|AS|AN|AI, str_4401268928040B20, "sank ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_FA2CEC25FAE97341, "kan ")
+SUBS(AR|AS|AE|AN|AO, str_68105B858B425CB4, "du ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_D208B44DAA2DC351, "ud ")
+SUBS(AR|AS|AT|AO|AP, str_769DB022AD959409, "spog ")
+SUBS(AR|RGT|AS|AT|AO|AP, str_993FB3354F37599E, "post ")
+SUBS(AR|AE|AN|AI|AO, str_7623453E9CFB03D4, "ellen ")
+SUBS(AR|RGT|AE|AN|AI|AO, str_EC7EE4878609F3D9, "hele ")
+SUBS(AR|AA|AS|AE|AP, str_80A2B7F4EDFF0C95, "saa' ")
+SUBS(AR|RGT|AA|AS|AE|AP, str_1B1C50D62E726AE4, "passe ")
+SUBS(AR|AE|AT|AO|AP, str_E645E421C52D9A7B, "toppe ")
+SUBS(AR|RGT|AE|AT|AO|AP, str_CDD6CAA713E7A893, "port ")
+SUBS(AR|AA|AN|AI|AO, str_BB59749492E9C0BF, "alanzo ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_4FB4F9ADE1176547, "hal ")
+SUBS(AR|AS|AE|AN|AP, str_AB4FDC245F092768, "dem ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_BA4C53A61687D977, "med ")
+SUBS(AR|AS|AT|AI|AO, str_1109F5FD7D22AAC8, "sig ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_66170C57E8AC354A, "livs ")
+SUBS(AR|AA|AE|AN|AP, str_1FE98214FA4D409C, "examen ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_C81F567AC96D5CA9, "mae ")
+SUBS(AR|AA|AE|AT|AI, str_776A8271136FBCDD, "var ")
+SUBS(AR|RGT|AA|AE|AT|AI, str_A1D412B3CD7242F7, "ivar ")
+SUBS(AR|AS|AE|AN|AI, str_5673F12CA48839F3, "sine ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_AB7A61D4A1CAD6AB, "ind ")
+SUBS(AR|AA|AS|AT|AI, str_8B539FEEE1CA73C0, "fik ")
+SUBS(AR|RGT|AA|AS|AT|AI, str_8492FC43FC840935, "kat ")
+SUBS(AR|AS|AE|AI|AP, str_6F2A64F59BE5E26E, "spise ")
+SUBS(AR|RGT|AS|AE|AI|AP, str_93E3B5B12E90C7FE, "piskede ")
+SUBS(AR|AS|AE|AT|AO, str_119AA3B0A66372A8, "dog ")
+SUBS(AR|RGT|AS|AE|AT|AO, str_D859293B22449C89, "ord ")
+SUBS(AR|AA|AS|AT|AO, str_B68AFDA999042AE2, "sagt ")
+SUBS(AR|RGT|AA|AS|AT|AO, str_592113E20E9BD955, "ogsaa ")
+SUBS(AR|AE|AT|AN|AO, str_BA3BD4D2DA7AE86E, "bort ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_B7409EC7507F1CD9, "noget ")
+SUBS(AR|AS|AN|AO|AP, str_7A83FEE54F908E5E, "som ")
+SUBS(AR|RGT|AS|AN|AO|AP, str_7B49EFB61062D284, "moj ")
+SUBS(AR|AA|AT|AN|AO, str_F3FA41B52DE36D40, "gang ")
+SUBS(AR|RGT|AA|AT|AN|AO, str_279E6A9F2A6C0F4C, "nabo ")
+SUBS(AR|AE|AT|AN|AI, str_47FD2EA69E80E270, "ven ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_8BA7632DC4B89BB1, "her ")
+SUBS(AR|AS|AN|AI|AO, str_6C63BE2099406E05, "suk ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_1B15DE9B098FFE3E, "kun ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_20D6D6623B1192DC, "pastor ")
+SUBS(AR|AA|AS|AI|AO|AP, str_0C564574F3F9E640, "slap ")
+SUBS(AR|RGT|AA|AS|AI|AO|AP, str_AF121D4C6F58EBE5, "klap ")
+SUBS(AR|AA|AS|AN|AI|AP, str_F3A14A8A57EB3C42, "skam ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_D105DFD94D8C3073, "knap ")
+SUBS(AR|AA|AS|AT|AN|AI, str_3AC2E8986403E297, "skabt ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_5105E1ED4EE07DAD, "kant ")
+SUBS(AR|AA|AS|AE|AN|AO, str_1D0D73185CF895B8, "aa-e-ja ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_2F5A5708B8F10188, "-ja ")
+SUBS(AR|AA|AE|AT|AO|AP, str_7614AC25161CB23C, "fo'r ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_49DD08FC11AFE8DA, "proft ")
+SUBS(AR|AS|AE|AT|AI|AP, str_DB6474B9B6FE3F2A, "spiste ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_405D34AF2264AD2A, "pris ")
+SUBS(AR|AA|AS|AN|AI|AO, str_0C54B4D2BB598DFD, "slank ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_41741403D88D5809, "nikola ")
+SUBS(AR|AA|AT|AI|AO|AP, str_F7C74701175E069E, "galop ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_2C59793065D02EDC, "opgav ")
+SUBS(AR|AA|AS|AE|AT|AP, str_2622E4CB4E7E9609, "derpaa ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_8B03947A124AA4BC, "praest ")
+SUBS(AR|AA|AS|AE|AT|AI, str_92D89244D618E868, "svarede ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI, str_33B15859793355EB, "kastede ")
+SUBS(AR|AA|AE|AN|AI|AO, str_9CD03918EFCF7A9D, "alene ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_5F31E0CB8997A3A5, "hallen ")
+SUBS(AR|AS|AE|AT|AO|AP, str_C3F89E20008EF31C, "spor ")
+SUBS(AR|RGT|AS|AE|AT|AO|AP, str_BFCD83C170167ADB, "pegede ")
+SUBS(AR|AA|AS|AE|AT|AN, str_691DC3BEDE0F7276, "andre ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN, str_33BEF0A978E16432, "naesten ")
+SUBS(AR|AA|AE|AT|AI|AP, str_D5CAE91410E03313, "appetit ")
+SUBS(AR|RGT|AA|AE|AT|AI|AP, str_8255DE4A198805C4, "papir ")
+SUBS(AR|AE|AT|AN|AO|AP, str_20ED4FBB1B1D71AF, "gennem ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_879E412A510F3163, "meget ")
+SUBS(AR|AA|AE|AT|AI|AO, str_C4AF10EDD7B3CE20, "tale ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_FE5FFDC3CA0DDDB6, "lave ")
+SUBS(AR|AS|AE|AI|AO|AP, str_FEDCA8331F2F4CE3, "spillede ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_6349762FDCAACF99, "poesi ")
+SUBS(AR|AS|AE|AT|AN|AP, str_F8F8EA0520C3D9BE, "stemme ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_44BF2FC17F81D9DC, "mest ")
+SUBS(AR|AS|AN|AI|AO|AP, str_D2957C6524A4A470, "smil ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_C50B116423771F39, "kom ")
+SUBS(AR|AA|AS|AN|AO|AP, str_FEC58E5F68E80032, "saasom ")
+SUBS(AR|RGT|AA|AS|AN|AO|AP, str_E2395CA046B6C017, "mansson ")
+SUBS(AR|AA|AE|AT|AN|AP, str_943BA4CC51713FB6, "frem ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_D4702E3A6CDC1944, "maatte ")
+SUBS(AR|AA|AE|AT|AN|AI, str_701758C383D21C1A, "fine ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_4ADA2A4F18F54100, "har ")
+SUBS(AR|AA|AS|AT|AN|AO, str_C87062042895E975, "sang ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO, str_08202FCF2789869B, "jagt ")
+SUBS(AR|AA|AS|AE|AI|AP, str_9432D01EEB76A7DE, "ska' ")
+SUBS(AR|RGT|AA|AS|AE|AI|AP, str_94F2F9657A2B07AA, "pakke ")
+SUBS(AR|AS|AE|AN|AI|AO, str_33147076F22F7144, "skulde ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_5E4907A9602E385A, "kunde ")
+SUBS(AR|AA|AS|AT|AN|AP, str_0F7A33633730631F, "samt ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_D38D5FAD0D7E36AD, "pjat ")
+SUBS(AR|AA|AS|AE|AN|AP, str_9A129D3C2CF63359, "samme ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_60F97D11D338DF2C, "mand ")
+SUBS(AR|AT|AN|AI|AO|AP, str_63C1E2163E48481C, "glimt ")
+SUBS(AR|RGT|AT|AN|AI|AO|AP, str_2CB95DC376B85715, "mig ")
+SUBS(AR|AS|AE|AT|AI|AO, str_5338F98C86098565, "selv ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO, str_D3FB3DC22A4E2199, "lidt ")
+SUBS(AR|AE|AT|AN|AI|AP, str_22BF017D1B0FAE0F, "timer ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_CB074ED3C95642B2, "hvem ")
+SUBS(AR|AS|AE|AT|AN|AO, str_8DF4F0A3E8D06533, "gjorde ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_40D58FBA4B772732, "jeg ")
+SUBS(AR|AA|AT|AN|AO|AP, str_721982306C26ABCE, "afmagt ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_59A99855C94EE38F, "magt ")
+SUBS(AR|AS|AE|AN|AI|AP, str_A09A36EF5C897FD4, "spidsen ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_88A02478E01864F9, "hjem ")
+SUBS(AR|AA|AT|AN|AI|AO, str_933D28650E857DFF, "blaa ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_5057A823E6EF6941, "langt ")
+SUBS(AR|AE|AT|AN|AI|AO, str_13A17952D7936000, "blev ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_C4B71F459D277067, "hvor ")
+SUBS(AR|AS|AT|AN|AI|AO, str_803AA4D54E4ECA25, "blik ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_5EF4D4ADB7F8591F, "hojt ")
+SUBS(AR|AA|AS|AE|AN|AI, str_938DC9B1D87622B2, "danske ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_B2437363459B367E, "hinanden ")
+SUBS(AR|AA|AS|AE|AI|AO, str_078A61B5A3D2EDA1, "saaledes ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_443AFB8E5BA06E0D, "lad ")
+SUBS(AR|AS|AE|AN|AO|AP, str_12BF12EEF13D6E95, "dom ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_03BC9D6CB8B3908A, "mod ")
+SUBS(AR|AA|AN|AI|AO|AP, str_CE78129290A1AC26, "alpina ")
+SUBS(AR|RGT|AA|AN|AI|AO|AP, str_2F0B08746C6E2063, "plan ")
+SUBS(AR|AS|AT|AN|AO|AP, str_102331403E7D212B, "stum ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_58A09E210104136F, "pust ")
+SUBS(AR|AS|AE|AT|AN|AI, str_85DA91107E7DA1F3, "vendte ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_213EA61EA400BBAD, "hvide ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_26668284D5C950DB, "william ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_3A0061CD2EC08D57, "hjalp ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_1AA224C15D31BCF5, "skarpt ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_7FC6F92BECEAFDC2, "praksis ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_72BCBC6B67C84CC5, "smag ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_FFAE1393B428FE51, "magnus ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_17CD626AEBE3C3D7, "tilbage ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_DEAE0E631215F7DA, "laenge ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_D140198E539D5FB4, "somand ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_99241769490F065E, "pause ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_A75EC7D775742180, "tilpas ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_10D21E1E9517FD2A, "plastisk ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_26E9D183E5DC1CEC, "varme ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_F9E5DFC6DC88C53E, "marie ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_BCBFC8DF86BE653E, "spiller ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_EA2F32DA16BB8574, "krop ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_55209DB4E6FCF722, "spurgte ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_155D8FA196A129D1, "mogens ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_1B4E5EF4EEBE2A23, "smukt ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_A2E95332F90A605E, "punkt ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_B874CB7A247D38E7, "aldrig ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO, str_36558B26E43D5E66, "lagde ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_62F5395F48D42C53, "finde ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_3E3C52395DF34DEA, "havde ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_600FF892DBD3178D, "emmanuelo ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_15B3FA68E5B2A5AF, "lampen ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_3AEC649DEA641DBB, "eksamen ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_6F3CCDA8F4434AEF, "maske ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_58DBAC3080F43A2C, "april ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO|AP, str_14CE87608C69A9E7, "opgave ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_F3CCDFD12CC6AD7E, "smilede ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_C3072C8E402D9AF0, "komme ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_AC1AE0D91923A15A, "slappe ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_DBE9C589EF0C7ECD, "plads ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_25F4ED8252F9FF46, "capitain ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_23061DC1E942126E, "knapt ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_A1BF08CE77023301, "ansigt ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO, str_6C2D114EB287C846, "langs ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_F569C2435FBC8FED, "glemt ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_1F771F0D1A16F9DD, "norholm ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_52B74BED48AFF3E2, "teknologi ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_9205FD9E9CDAF415, "holdt ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_B1448BBD59EE98E0, "derhjemme ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_100E9AB1EAEC3211, "mennesker ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_84B545298327CD46, "dagen ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO, str_17EB714C2539A733, "udenfor ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_91508723D13E50C2, "sjael ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_7D17F74FF1147EF0, "land ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_F4959725FF42EA5E, "form ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_C2CF32C587BF7039, "mange ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_2E642CEEC56D4266, "film ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_BD4D850A2591977C, "pollnitz ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_FD9C5088E67087F9, "fremmede ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_998AAA8FA0BD2EFA, "praesten ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_2CFDA380E510B024, "samlede ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_7C4D116A0E83A9CF, "hjaelp ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_6C41807404A5B896, "danmark ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_2DD2C51B8291C701, "maerke ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_809202FFCE5E1F57, "gamle ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_67AA89D7A8EEBF79, "planter ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_3100B6504E408AF8, "ganske ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_FF719EEE10F9EAED, "hvordan ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_F7217B4882909E73, "samling ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_AE887234BAEDACCA, "langsomt ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_9A3D6726509D76D8, "blomster ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_2286C79D95E0BDDA, "kommer ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_17C78FC5B7BDC81D, "vokseplads ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_E4B4237662F98075, "kapitel ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_983BB9490F1B54AF, "sprang ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_A298D7050F8B5E04, "professoren ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_8F0ADC7147FCCC3B, "samtidig ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_D484C569AB49E016, "plantes ")
diff --git a/keyboards/gboards/dicts/aset/de-keymap.def b/keyboards/gboards/dicts/aset/de-keymap.def
new file mode 100644
index 00000000000..6a2229f7a95
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/de-keymap.def
@@ -0,0 +1,373 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AT, KC_T)
+PRES(AE, KC_E)
+PRES(AN, KC_N)
+PRES(AP, KC_P)
+PRES(AA, KC_A)
+PRES(AI, KC_I)
+PRES(AS, KC_S)
+PRES(AO, KC_O)
+PRES(AS|AT, KC_C)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+PRES(AT|AI, KC_V)
+PRES(AE|AP, KC_QUOT)
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AS|AI, KC_K)
+PRES(AE|AN, KC_Y)
+PRES(AA|AN, KC_Q)
+PRES(AA|AT, KC_F)
+PRES(AE|AT, KC_R)
+PRES(AT|AO, KC_G)
+PRES(AA|AE, KC_X)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+PRES(AE|AI, KC_COMM)
+PRES(AN|AO, KC_U)
+PRES(AA|AP, KC_QUOT)
+PRES(AA|AS, KC_W)
+PRES(AI|AO, KC_L)
+PRES(AT|AP, KC_BSPC)
+PRES(AS|AE, KC_D)
+PRES(AT|AN, KC_B)
+PRES(AE|AO, KC_MINS)
+PRES(AS|AN, KC_J)
+PRES(AN|AI, KC_H)
+PRES(AA|AI, KC_Z)
+PRES(AS|AO, KC_DOT)
+PRES(AN|AP, KC_M)
+PRES(AO|AP, KC_SCLN)
+SUBS(AR|AA|AT|AP, str_7A06301D23DD2E0F, "pat ")
+SUBS(AR|AS|AE|AO, str_6C007D0218D5E48D, "dose ")
+SUBS(AR|AA|AT|AI, str_5FE37289F8887901, "fitz ")
+SUBS(AR|AA|AT|AN, str_BC6573200E84B046, "ab ")
+SUBS(AR|AT|AN|AI, str_BF8295FE584BC5B0, "bin ")
+SUBS(AR|AA|AS|AI, str_C6565548AE81D246, "kai ")
+SUBS(AR|AN|AO|AP, str_96877FFA56942058, "um ")
+SUBS(AR|AS|AN|AP, str_D63FDE230FD34803, "sms ")
+SUBS(AR|AS|AT|AO, str_435A04363A1FC13B, "sto ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AA|AN|AO, str_FD846B750BDF7708, "au ")
+SUBS(AR|AE|AT|AI, str_90DFFD07F9A960E1, "vier ")
+SUBS(AR|AA|AI|AP, str_DF4123F19953E2FD, "pia ")
+SUBS(AR|AA|AS|AE, str_6F5C46A47AA6D99E, "das ")
+SUBS(AR|AA|AS|AO, str_CBD1BA8947756219, "wo ")
+SUBS(AR|AS|AE|AT, str_1D0F4378A54C5C40, "der ")
+SUBS(AR|AA|AE|AP, str_B67661087B126CF1, "px ")
+SUBS(AR|AN|AI|AO, str_C7CD45D62BA33F37, "oh ")
+SUBS(AR|AE|AN|AO, str_C496E6E32E8C3A35, "neue ")
+SUBS(AR|AN|AI|AP, str_679C70AAB26706C0, "im ")
+SUBS(AR|AT|AI|AP, str_649734635B526795, "tippt ")
+SUBS(AR|AA|AS|AT, str_71D766F84D388274, "fast ")
+SUBS(AR|AA|AE|AT, str_1BBF9954E92B20BA, "trat ")
+SUBS(AR|AA|AE|AN, str_FBA19A9C1068CDAE, "nyx ")
+SUBS(AR|AA|AS|AE|AT, str_4861633B8205D116, "war ")
+SUBS(AR|AS|AE|AT|AI, str_CC5037F46E942D16, "dir ")
+SUBS(AR|AA|AT|AO|AP, str_9AA18794DB870BEB, "topf ")
+SUBS(AR|AE|AT|AI|AP, str_34BFA950C82D4F06, "tippte ")
+SUBS(AR|AA|AT|AI|AP, str_7970FB9D8AD7C647, "pfiff ")
+SUBS(AR|AA|AS|AE|AO, str_C7C9AFB6DDACE053, "sodass ")
+SUBS(AR|AA|AN|AO|AP, str_40B810EB6C30C217, "mona ")
+SUBS(AR|AA|AE|AT|AO, str_830AC10C454BC7CF, "fragte ")
+SUBS(AR|AE|AI|AO|AP, str_50240762B8933D32, "lippe ")
+SUBS(AR|AA|AE|AT|AI, str_C0B227849D9DA1BE, "zeit ")
+SUBS(AR|AS|AE|AI|AP, str_EAB63C3360390CF9, "spie ")
+SUBS(AR|AE|AN|AO|AP, str_F1E53A6EC2A7EEED, "neuem ")
+SUBS(AR|AS|AI|AO|AP, str_CC1E52D0BA53ECB6, "klops ")
+SUBS(AR|AT|AI|AO|AP, str_C97DA9851380EBAC, "pilot ")
+SUBS(AR|AA|AS|AT|AN, str_F8A2E43D3F3804D2, "sanft ")
+SUBS(AR|AA|AE|AT|AN, str_A6FDC6F40D49C030, "aber ")
+SUBS(AR|AA|AS|AT|AO, str_B68AFDA999042AE2, "sagt ")
+SUBS(AR|AS|AN|AO|AP, str_ADCADC5263539961, "muss ")
+SUBS(AR|AA|AS|AE|AP, str_1B1C50D62E726AE4, "passe ")
+SUBS(AR|AE|AN|AI|AO, str_BD86612621F1DEED, "ohne ")
+SUBS(AR|AE|AN|AI, str_02B1330BAE5CC4C1, "ein ")
+SUBS(AR|RGT|AE|AN|AI, str_CBE1960539B0E1B0, "ihnen ")
+SUBS(AR|AA|AI|AO, str_9F8EB086C328F80A, "all ")
+SUBS(AR|RGT|AA|AI|AO, str_0CDC91ED0A3C486E, "lilia ")
+SUBS(AR|AS|AI|AO, str_39168E0086ED545A, "soll ")
+SUBS(AR|RGT|AS|AI|AO, str_7D5664732C823A0F, "los ")
+SUBS(AR|AA|AN|AI, str_BF40C27E59DAAC7B, "ah ")
+SUBS(AR|RGT|AA|AN|AI, str_B65C7D9679E557CE, "nah ")
+SUBS(AR|AA|AS|AN, str_FB4580CB5C9E8D0C, "wann ")
+SUBS(AR|RGT|AA|AS|AN, str_16D6BE915787F782, "ja ")
+SUBS(AR|AS|AN|AI, str_E6780CCCF0717AA1, "sinn ")
+SUBS(AR|RGT|AS|AN|AI, str_EA9B7981A49111E5, "ins ")
+SUBS(AR|AS|AN|AO, str_7412E38D9D55C2DC, "su ")
+SUBS(AR|RGT|AS|AN|AO, str_A93C132A8DDF37AE, "uns ")
+SUBS(AR|AT|AI|AO, str_6BAEC4FB06A1849B, "vollig ")
+SUBS(AR|RGT|AT|AI|AO, str_64B9C1F4E5391AFD, "ig ")
+SUBS(AR|AA|AT|AO, str_BC186EE69CA0005E, "tag ")
+SUBS(AR|RGT|AA|AT|AO, str_44FBBABD801177BF, "oft ")
+SUBS(AR|AS|AT|AI, str_C1642DCE31CFDD0A, "vick ")
+SUBS(AR|RGT|AS|AT|AI, str_7313B62E48DA6777, "ist ")
+SUBS(AR|AE|AT|AP, str_CDD70EFAD623B33D, "treppe ")
+SUBS(AR|RGT|AE|AT|AP, str_D89F06941F4B44CE, "peter ")
+SUBS(AR|AE|AN|AP, str_B6C3042679BF7796, "em ")
+SUBS(AR|RGT|AE|AN|AP, str_8167BA049DBA2E41, "'ne ")
+SUBS(AR|AE|AI|AO, str_FFF635055C061C64, "eile ")
+SUBS(AR|RGT|AE|AI|AO, str_E7368ADE4F929A85, "lie ")
+SUBS(AR|AS|AE|AI, str_8DB12FA16BCFEA58, "die ")
+SUBS(AR|RGT|AS|AE|AI, str_8A50CBEF7E0A6524, "idee ")
+SUBS(AR|AE|AT|AN, str_C604097EB91F7B8E, "bett ")
+SUBS(AR|RGT|AE|AT|AN, str_DE73AC8CD7EDF112, "neben ")
+SUBS(AR|AA|AS|AP, str_FAD23F8E4E835984, "spa ")
+SUBS(AR|RGT|AA|AS|AP, str_4DFAE898587FE4FE, "pass ")
+SUBS(AR|AT|AN|AO, str_F303EEA86E1643BB, "gut ")
+SUBS(AR|RGT|AT|AN|AO, str_C4E8F4887CFD230A, "ob ")
+SUBS(AR|AE|AT|AO, str_02D571A452E0AF06, "gro ")
+SUBS(AR|RGT|AE|AT|AO, str_A5C288037377FAC0, "ort ")
+SUBS(AR|AS|AE|AN, str_ECE5A6CDF4EED85C, "den ")
+SUBS(AR|RGT|AS|AE|AN, str_BE269998D08E0255, "jeden ")
+SUBS(AR|AA|AN|AP, str_77BE4D44A5F2AD27, "am ")
+SUBS(AR|RGT|AA|AN|AP, str_7814AB9A9D941FFB, "man ")
+SUBS(AR|AA|AS|AE|AI|AP, str_B94ABE989DA4CCCD, "kappe ")
+SUBS(AR|AA|AS|AE|AT|AI, str_58435ED595907AF1, "wir ")
+SUBS(AR|AA|AS|AI|AO|AP, str_24A1B010F973F0D1, "klaps ")
+SUBS(AR|AA|AE|AI|AO|AP, str_F97A23E3E0ED8554, "pelz ")
+SUBS(AR|AE|AN|AI|AO|AP, str_DF52F7F5FDA2EE96, "himmel ")
+SUBS(AR|AS|AT|AI|AO|AP, str_94A710198AA418ED, "politik ")
+SUBS(AR|AA|AS|AE|AT|AN, str_DAED66ED9574D407, "waren ")
+SUBS(AR|AA|AS|AE|AT|AO, str_EA0DC5764E119536, "sagte ")
+SUBS(AR|AE|AT|AI|AO|AP, str_007AFEEC6A5820E2, "prior ")
+SUBS(AR|AS|AE|AN|AO, str_68105B858B425CB4, "du ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_E8DD0B7F8884F0E0, "und ")
+SUBS(AR|AE|AT|AN|AO, str_1778F5F15FD92AD4, "gegen ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_29DB5F4E8CEEA0C5, "nur ")
+SUBS(AR|AS|AE|AT|AO, str_F65CE91616912CA6, "dort ")
+SUBS(AR|RGT|AS|AE|AT|AO, str_87D6EE7EB7BA66A2, "oder ")
+SUBS(AR|AE|AT|AI|AO, str_0FE705D961162F91, "vor ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_61ABD98243A48ED8, "legte ")
+SUBS(AR|AT|AN|AO|AP, str_C7B05810B9878F2F, "tom ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_E7938942689FE8F0, "mut ")
+SUBS(AR|AS|AE|AN|AP, str_AB4FDC245F092768, "dem ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_F98CE3717B69FD61, "jedem ")
+SUBS(AR|AE|AN|AI|AP, str_25CA5E64BF5601DA, "einem ")
+SUBS(AR|RGT|AE|AN|AI|AP, str_4C8DF934B25FACD2, "meine ")
+SUBS(AR|AA|AN|AI|AO, str_30D9A7F1D6109836, "zu ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_4B92B2052C1070A6, "hinzu ")
+SUBS(AR|AS|AE|AI|AO, str_D3C668A9DCC935F9, "seele ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_B552F89639B85B19, "leise ")
+SUBS(AR|AT|AN|AI|AP, str_AF1FE256DC6BB784, "tim ")
+SUBS(AR|RGT|AT|AN|AI|AP, str_168886128C6CCE68, "mit ")
+SUBS(AR|AA|AE|AI|AO, str_4B68781D007741F3, "alle ")
+SUBS(AR|RGT|AA|AE|AI|AO, str_2BCCE3C0702A7BCE, "lizzie ")
+SUBS(AR|AE|AT|AN|AP, str_CD9F3081A1453B39, "typ ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_10A1A694946FA759, "mr ")
+SUBS(AR|AA|AE|AN|AP, str_7E02E71632E36E12, "amy ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_7E7D867E8D1507CE, "namen ")
+SUBS(AR|AA|AT|AN|AP, str_415DEF2531D5D328, "amt ")
+SUBS(AR|RGT|AA|AT|AN|AP, str_84D6693F0314A756, "matt ")
+SUBS(AR|AA|AS|AE|AN, str_076A05E119373A20, "wenn ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_5016D98F0EC9B5B2, "nase ")
+SUBS(AR|AS|AT|AI|AO, str_503F03DCEE6CB398, "still ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_4DC1C2755B24D34B, "lost ")
+SUBS(AR|AA|AS|AE|AI, str_19A2468090CBBDBF, "wie ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_3A427AA9A457931E, "kase ")
+SUBS(AR|AA|AS|AN|AO, str_4D41107A5D038E06, "aus ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_1850922148A52C13, "jason ")
+SUBS(AR|AS|AT|AN|AO, str_EE61C0244D00B288, "sonst ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_5FFA7FB69B0B139A, "jung ")
+SUBS(AR|AS|AT|AN|AI, str_EC9AF40130B60492, "sich ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_A2BD28473653B4A5, "ich ")
+SUBS(AR|AS|AE|AT|AP, str_F0889D6FB58D8DB4, "speer ")
+SUBS(AR|RGT|AS|AE|AT|AP, str_69D2F191AE8A202E, "presste ")
+SUBS(AR|AS|AN|AI|AO, str_0CEFF135F2E02EB0, "sohn ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_B24523534C6D82C9, "john ")
+SUBS(AR|AA|AI|AO|AP, str_36DDB482F63F4218, "apollo ")
+SUBS(AR|RGT|AA|AI|AO|AP, str_6AE5BB2A9F06CEC2, "opal ")
+SUBS(AR|AT|AN|AI|AO, str_FE0DE06C30B4AB8D, "von ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_4FCC0CDF3BBFB405, "hob ")
+SUBS(AR|AS|AN|AI|AP, str_59872F714705B2C5, "sims ")
+SUBS(AR|RGT|AS|AN|AI|AP, str_EE6DB6F94A1DBF2A, "miss ")
+SUBS(AR|AE|AT|AO|AP, str_FBCCDFCB24EEF885, "reporter ")
+SUBS(AR|RGT|AE|AT|AO|AP, str_C49A79241347400B, "potter ")
+SUBS(AR|AA|AT|AN|AI, str_6FA800B1DE90EC33, "zantini ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_C58EDF9C4F3ABF68, "hat ")
+SUBS(AR|AA|AS|AI|AO, str_29CE2FDA396D8322, "als ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_990499D84C6C6E2B, "lass ")
+SUBS(AR|AA|AT|AI|AO, str_2C2A0B8EADF98F75, "zog ")
+SUBS(AR|RGT|AA|AT|AI|AO, str_03908167F0479139, "lag ")
+SUBS(AR|AA|AT|AN|AO, str_F8243E78F018E913, "auf ")
+SUBS(AR|RGT|AA|AT|AN|AO, str_1CED875C402D54D0, "offnung ")
+SUBS(AR|AA|AE|AT|AP, str_00C6F477FE7982F4, "tapfer ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_77422CDECD520E45, "paar ")
+SUBS(AR|AS|AE|AT|AN, str_06DF3617C6E69D0E, "ersten ")
+SUBS(AR|RGT|AS|AE|AT|AN, str_4FCC7C2D812C8649, "jeder ")
+SUBS(AR|AA|AS|AT|AP, str_3421EC5B25389E38, "spat ")
+SUBS(AR|RGT|AA|AS|AT|AP, str_D5A9BD507CE653C2, "passt ")
+SUBS(AR|AA|AE|AN|AI, str_EAE54E70C7202AC7, "zehn ")
+SUBS(AR|RGT|AA|AE|AN|AI, str_9D4B150BD3065A8C, "nahe ")
+SUBS(AR|AA|AS|AN|AP, str_020E794D3DE91D12, "sam ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_21C1365689620902, "japan ")
+SUBS(AR|AS|AE|AN|AI, str_4C96EF4DA8B974F6, "sein ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_16BA655FB5C97393, "keine ")
+SUBS(AR|AA|AN|AI|AP, str_EDDDB55A1CC27DD4, "ahm ")
+SUBS(AR|RGT|AA|AN|AI|AP, str_6AEA92022C18E6EA, "nahm ")
+SUBS(AR|AA|AS|AN|AI, str_CAF0F677C1C11C4E, "sah ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_2FBBF18B488D07D9, "kann ")
+SUBS(AR|AS|AT|AO|AP, str_1FE10D1897307E54, "spott ")
+SUBS(AR|RGT|AS|AT|AO|AP, str_993FB3354F37599E, "post ")
+SUBS(AR|AE|AT|AN|AI, str_938AC13845137AF2, "einer ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_311A8F79C2DA7621, "ihr ")
+SUBS(AR|AA|AS|AT|AI, str_13007E19FB8F2C35, "satz ")
+SUBS(AR|RGT|AA|AS|AT|AI, str_C38E7280C2F336C5, "katsa ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_0585C12E982BE26D, "wurde ")
+SUBS(AR|AS|AT|AN|AI|AO, str_7B32E32451340B4E, "schon ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_A7B248A061F44321, "noch ")
+SUBS(AR|AS|AE|AT|AI|AP, str_5AE975DD19C6232D, "ripred ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_4D5328416DE780D7, "preis ")
+SUBS(AR|AA|AT|AN|AI|AP, str_546C421CC97F3567, "tamani ")
+SUBS(AR|RGT|AA|AT|AN|AI|AP, str_2C3632930C2AB50B, "mattia ")
+SUBS(AR|AE|AT|AN|AO|AP, str_EF1387C702D8A23C, "genommen ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_89317B9F835E8023, "mutter ")
+SUBS(AR|AA|AS|AE|AN|AP, str_3F5CB505A40D708F, "wem ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_242475997AA55CFF, "jemand ")
+SUBS(AR|AS|AE|AT|AN|AO, str_3C8D95A8EA816E72, "boden ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_FF5FFA7FB69B0B13, "junge ")
+SUBS(AR|AA|AS|AE|AN|AO, str_13EF2FBCAADCBAF8, "sonea ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_00F3AC940625EA74, "nasuada ")
+SUBS(AR|AA|AS|AT|AI|AP, str_E52C387D589C50E0, "spitz ")
+SUBS(AR|RGT|AA|AS|AT|AI|AP, str_30C0B19C0CE24E51, "packt ")
+SUBS(AR|AS|AE|AN|AI|AP, str_3680EB2E0F839352, "seinem ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_9E9475D12693FC4A, "meines ")
+SUBS(AR|AA|AS|AE|AI|AO, str_D68A9E9EAEE0475A, "alles ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_0377FCFAFF399698, "lasse ")
+SUBS(AR|AA|AS|AE|AT|AP, str_BC6F9AA6272C5136, "spater ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_FA65DF21B0052C92, "pferd ")
+SUBS(AR|AA|AE|AT|AI|AO, str_D981242C8D8F47E3, "fiel ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_9942C2E11AAAD8F1, "letzte ")
+SUBS(AR|AA|AE|AN|AI|AP, str_E160DEC99532918D, "annehmen ")
+SUBS(AR|RGT|AA|AE|AN|AI|AP, str_C0427811132C070F, "nahmen ")
+SUBS(AR|AA|AE|AT|AO|AP, str_3C2ED0348FD80B64, "tropfte ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_35744E33D0C7E01D, "pfote ")
+SUBS(AR|AA|AS|AT|AI|AO, str_F398E30808EEBB52, "willst ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO, str_CDC2117CADADAFBE, "lasst ")
+SUBS(AR|AS|AE|AN|AI|AO, str_8B3154C92495F09F, "sollen ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_B4439F1511896DFF, "konnen ")
+SUBS(AR|AA|AT|AN|AI|AO, str_B13EE8BE7FE6B633, "ganz ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_398EA44DBAA1E5C8, "luft ")
+SUBS(AR|AS|AE|AI|AO|AP, str_634E6ED82D9B6E02, "spiel ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_39D6AFDD5BD7AAF4, "klippe ")
+SUBS(AR|AA|AE|AT|AN|AI, str_062F83881A2C3959, "arbeit ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_606FEB70500CC1B2, "hatte ")
+SUBS(AR|AA|AE|AT|AI|AP, str_D5CAE91410E03313, "appetit ")
+SUBS(AR|RGT|AA|AE|AT|AI|AP, str_C3B90DAB4B7472C5, "papier ")
+SUBS(AR|AS|AE|AT|AI|AO, str_4F97AB670397150E, "sollte ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO, str_BA8EDD63707197A4, "krieger ")
+SUBS(AR|AE|AT|AN|AI|AP, str_5AE21533ACB6295B, "beim ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_99DC73C1DBA33000, "mir ")
+SUBS(AR|AS|AE|AT|AO|AP, str_E2BE3AA566F0D36D, "gepresst ")
+SUBS(AR|RGT|AS|AE|AT|AO|AP, str_0A5A646931994D47, "perdor ")
+SUBS(AR|AA|AS|AN|AI|AO, str_8FD1EE1AD212099B, "wohl ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_86110AE6A132D1F0, "haus ")
+SUBS(AR|AA|AE|AN|AI|AO, str_7BB3BE37770C35C5, "allein ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_D422763B4AE8465F, "luxa ")
+SUBS(AR|AE|AT|AN|AI|AO, str_C0CCF67B8D935B78, "gehen ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_6629424CB065B1AE, "leben ")
+SUBS(AR|AA|AS|AT|AN|AO, str_B25D747563F50C00, "angst ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO, str_412E9C52008E2FFC, "jacob ")
+SUBS(AR|AS|AT|AN|AI|AP, str_AE837C0AEB806908, "stimmt ")
+SUBS(AR|RGT|AS|AT|AN|AI|AP, str_03B991FD60FCCDFF, "mich ")
+SUBS(AR|AA|AE|AT|AN|AP, str_7469004C9DDD63E7, "arm ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_9E5EFC5EABED59CC, "manner ")
+SUBS(AR|AA|AT|AN|AO|AP, str_57D69F490DECB8EF, "baum ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_3C9B602D612DFCF2, "mag ")
+SUBS(AR|AA|AS|AT|AN|AI, str_C83A8D38120EC478, "ach ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_4F0DAA6022D45F46, "nach ")
+SUBS(AR|AA|AS|AN|AO|AP, str_7B97470A7290A70E, "amos ")
+SUBS(AR|RGT|AA|AS|AN|AO|AP, str_EC45A9C00BACF75C, "maus ")
+SUBS(AR|AA|AS|AT|AN|AP, str_DD7F938F95466D27, "stamm ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_B8ACD052577C0651, "mats ")
+SUBS(AR|AA|AS|AN|AI|AP, str_E3789DAB3DE05442, "asami ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_BD8696CC510E8C75, "kam ")
+SUBS(AR|AA|AN|AI|AO|AP, str_B6BB0FC67BB88D7B, "zum ")
+SUBS(AR|RGT|AA|AN|AI|AO|AP, str_8C909DCD35D4BFA0, "mal ")
+SUBS(AR|AS|AE|AT|AN|AP, str_B42DFF54430B4550, "erdem ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_E7AFF3FB05CB8051, "mrs ")
+SUBS(AR|AA|AE|AT|AN|AO, str_435CFA31A8B3D018, "fur ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_A4D24EE321C80B02, "offnete ")
+SUBS(AR|AS|AT|AN|AO|AP, str_F45F5C5B98553BB1, "stumm ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_AA6545AD9B1F0BD5, "musst ")
+SUBS(AR|AA|AT|AI|AO|AP, str_39B2E8A10609C1C3, "zopf ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_BF2275E23C9ECA0A, "platz ")
+SUBS(AR|AS|AE|AT|AN|AI, str_F123495253B562C3, "dich ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_1999466E4B7043DF, "nickte ")
+SUBS(AR|AS|AE|AN|AO|AP, str_02F72B6BF4AAD698, "dumm ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_94618F45CA2C605A, "mussen ")
+SUBS(AR|AS|AN|AI|AO|AP, str_6CBFC109D0CB9CF1, "simon ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_7D95E314453BF79D, "komm ")
+SUBS(AR|AA|AS|AE|AN|AI, str_35BB9422ACD256E4, "wissen ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_0AADDE3779A6F980, "hand ")
+SUBS(AR|AT|AN|AI|AO|AP, str_B9A79A859B5354B9, "vom ")
+SUBS(AR|RGT|AT|AN|AI|AO|AP, str_161CFD16FFB06DAC, "html ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_1BE695808028BBAA, "raum ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_8E9A7834DFD0CC67, "magen ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_6036918CB914502E, "stimme ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_2E7CB51A7ADC6E9E, "menschen ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_BCA7000FD6B05A39, "damien ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_0D1D4961DFE731F5, "niemand ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_396493EB412BD750, "gemeint ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_36A57B2C1C0D6713, "herum ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_2E642CEEC56D4266, "film ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_93267E69B60F8881, "umhang ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_3091E4B33387D834, "spurte ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_50C770EBED2E85CB, "musste ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_1B1197EA0B486110, "rappelte ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO|AP, str_C09994AC92D47FCA, "pfeil ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_64C4FBD09C403322, "einmal ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_90D65FA847C4AF11, "plane ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_0761A25382557BF1, "stopfte ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO|AP, str_6CD2A548A39A7E32, "professor ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_EA28998A02AE4A5E, "wachmann ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_89BDE0660B1C8164, "macht ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_00FB909A81FDF653, "zur ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_9EE245A5B47B5067, "lange ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_BDEF7A864183C449, "dazu ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_BB8CBC4B0646DA9F, "lassen ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_29D5EC092B9A2FF0, "damon ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_99241769490F065E, "pause ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_C738A9EAECAE9E1A, "spalt ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_686C6836A9E1635A, "kopf ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_26668284D5C950DB, "william ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_A54C47E63EA517D3, "kaum ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_BFCFF5C5E4554E1E, "spielen ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_D36C2228C44239C6, "kommen ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_731B0EED34C80E79, "doch ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_70E560BB368B886E, "konnte ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_5B5C513164D09493, "wollte ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO, str_5B962B1BC7184BBE, "klar ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_7AC4A6E3D6183CB2, "warme ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_7A5E7F2D4DB59E4D, "mandred ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_FCFC74A798F643C8, "wahrend ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_19B746E69FDBAC14, "jetzt ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_45818156770C84E3, "anspannung ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_FFAE1393B428FE51, "magnus ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_D5E8F2EB97BF0173, "speisesaal ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_D6A2FD2C4AB2A414, "klappe ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_D8D080DFD0656224, "auch ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO, str_B85922905A88930C, "obwohl ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_7476EFD58741E176, "schlimm ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_0DB2C10812B9A3D6, "kommt ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_7B690A6BC357AB8F, "spielte ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_ACE7A3DE5FA29EEB, "korper ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_4A1A67F07D7A0329, "zimmer ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_A3320077C9966D89, "prinz ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_1EDA55E43290AD17, "spitze ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_11169DA3F2AA9CB6, "passiert ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_32E1673FAAFCC3C0, "gemacht ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_3FC44629481B6D2F, "damit ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_AC0A502D01CB7CB7, "machte ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_D72027B770292097, "allmahlich ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_C5D764B9E14F7C80, "plotzlich ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_4E8F1B367AD6BB68, "zuruck ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_42F74CF5A5F20F76, "naturlich ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_7002CFB3C9601BBE, "distelpfote ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_E4B4237662F98075, "kapitel ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_D1DF47DF3AB253AB, "zusammen ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_E52EA210631D14A1, "niemals ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_9A5CA8CE178D4467, "gekommen ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_A03F863B696E8289, "mochte ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_A659555F342991D6, "familie ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_BD59ECDDA8A173B4, "uberhaupt ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_BD0367D811B87CFD, "warum ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_841E9767DB8BD57B, "umstanden ")
diff --git a/keyboards/gboards/dicts/aset/en-colemak-keymap.def b/keyboards/gboards/dicts/aset/en-colemak-keymap.def
new file mode 100644
index 00000000000..0f738df3eb6
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/en-colemak-keymap.def
@@ -0,0 +1,394 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AA, KC_A)
+PRES(AT, KC_T)
+PRES(AO, KC_I)
+PRES(AE, KC_S)
+PRES(AI, KC_E)
+PRES(AS, KC_R)
+PRES(AN, KC_N)
+PRES(AP, KC_O)
+PRES(AS|AT, KC_C)
+PRES(AA|AN, KC_J)
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AE|AP, KC_QUOT)
+PRES(AT|AO, KC_G)
+PRES(AT|AP, KC_QUOT)
+PRES(AN|AI, KC_H)
+PRES(AA|AT, KC_P)
+PRES(AT|AI, KC_V)
+PRES(AA|AS, KC_W)
+PRES(AE|AO, KC_MINS)
+PRES(AN|AO, KC_Y)
+PRES(AE|AI, KC_COMM)
+PRES(AS|AO, KC_DOT)
+PRES(AT|AN, KC_B)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+PRES(AS|AN, KC_K)
+PRES(AA|AI, KC_Q)
+PRES(AN|AP, KC_L)
+PRES(AE|AT, KC_D)
+PRES(AI|AO, KC_U)
+PRES(AS|AI, KC_Z)
+PRES(AA|AE, KC_X)
+PRES(AA|AP, KC_BSPC)
+PRES(AS|AE, KC_F)
+PRES(AE|AN, KC_M)
+PRES(AO|AP, KC_SCLN)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+SUBS(AR|AA|AS|AP, str_3B360FC9D89799E1, "row ")
+SUBS(AR|AS|AT|AN, str_F270B528E852FC3E, "bc ")
+SUBS(AR|AN|AO|AP, str_67863008AE8FD451, "only ")
+SUBS(AR|AS|AI|AO, str_2B9D2DB0A0FB41C0, "rue ")
+SUBS(AR|AN|AI|AP, str_9A6C6AD5C510E57E, "one ")
+SUBS(AR|AA|AS|AT, str_2569286750C7B4F4, "part ")
+SUBS(AR|AS|AT|AP, str_53F9A8D9EF9D3CBE, "root ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AS|AE|AT, str_546AE2E8DF2AFDB3, "dr ")
+SUBS(AR|AN|AI|AO, str_92FEB537D58ED05D, "eye ")
+SUBS(AR|AA|AE|AT, str_718051F50C1745F9, "past ")
+SUBS(AR|AS|AN|AO, str_60A15FB00ABCCBCA, "ink ")
+SUBS(AR|AT|AN|AO, str_8CCEA54EEE3F864A, "by ")
+SUBS(AR|AA|AS|AE, str_FB4F2F8581A28E79, "was ")
+SUBS(AR|AT|AI|AP, str_27ABA0A3E8746DD6, "vote ")
+SUBS(AR|AA|AT|AO, str_EDDB4B5D8E6E6CF7, "tip ")
+SUBS(AR|AE|AT|AN, str_1F5578C977E22C6F, "nd ")
+SUBS(AR|AS|AE|AN, str_10A1A694946FA759, "mr ")
+SUBS(AR|AS|AT|AO, str_A78456C45593516E, "critic ")
+SUBS(AR|AA|AT|AP, str_8574F11BEB82545C, "top ")
+SUBS(AR|AS|AE|AI, str_639A23C5AE6F83D0, "free ")
+SUBS(AR|AE|AO|AP, str_E5D0DBF6833C9487, "'i ")
+SUBS(AR|AT|AO|AP, str_EB95C155685E35D7, "go ")
+SUBS(AR|AA|AS|AE|AT, str_51931D246213D5BA, "fact ")
+SUBS(AR|AA|AE|AT|AP, str_CB532D5DED67E46B, "stop ")
+SUBS(AR|AT|AI|AO|AP, str_99844BD74A4B3366, "out ")
+SUBS(AR|AE|AT|AI|AP, str_D624E87354EE13C9, "does ")
+SUBS(AR|AA|AS|AE|AP, str_BFB948F92BEFA09D, "sofa ")
+SUBS(AR|AA|AT|AN|AO, str_25F54E15B0B3ABC1, "again ")
+SUBS(AR|AS|AT|AN|AP, str_A9DE0A41D933835E, "took ")
+SUBS(AR|AS|AE|AT|AO, str_F3E5067A2519AD56, "first ")
+SUBS(AR|AA|AS|AT|AO, str_B9BD537963CF3EDE, "wait ")
+SUBS(AR|AA|AT|AI|AP, str_AAB1D405F8D273AF, "pope ")
+SUBS(AR|AS|AI|AO|AP, str_16D0BE041D84CD0E, "our ")
+SUBS(AR|AS|AE|AT|AP, str_DCFA6A07F97D055B, "door ")
+SUBS(AR|AS|AE|AO|AP, str_FA8B03390F6118D3, "'if ")
+SUBS(AR|AA|AT|AO|AP, str_353D7D379A2BBFCE, "ago ")
+SUBS(AR|AA|AS|AE|AO, str_6737263D9BE8622F, "fair ")
+SUBS(AR|AA|AS|AT|AP, str_035228752979D35D, "two ")
+SUBS(AR|AA|AE|AI|AO, str_85D1F287CC8F2629, "usa ")
+SUBS(AR|AA|AS|AO|AP, str_8E2E49CC75F3CE28, "warrior ")
+SUBS(AR|AA|AS|AT|AI, str_A93FC4E7A3AB3CA1, "water ")
+SUBS(AR|AT|AI|AO, str_D3479574413D1475, "get ")
+SUBS(AR|RGT|AT|AI|AO, str_AA0C2C72B7AD23DB, "iv ")
+SUBS(AR|AS|AE|AO, str_A46CDBFFD039CDDD, "sir ")
+SUBS(AR|RGT|AS|AE|AO, str_D7978D4AE69E4592, "if ")
+SUBS(AR|AS|AN|AP, str_24F8045EA4C1F586, "roll ")
+SUBS(AR|RGT|AS|AN|AP, str_0A9A527945928EFB, "look ")
+SUBS(AR|AE|AT|AP, str_16AE4BE38D2F26C0, "do ")
+SUBS(AR|RGT|AE|AT|AP, str_90B2E8A16883F3EC, "odd ")
+SUBS(AR|AA|AI|AO, str_6A810E6F1345F79D, "que ")
+SUBS(AR|RGT|AA|AI|AO, str_9676951FE3C582DC, "iq ")
+SUBS(AR|AS|AT|AI, str_14773DB067F2C32D, "tree ")
+SUBS(AR|RGT|AS|AT|AI, str_F867205888E811D6, "ever ")
+SUBS(AR|AT|AN|AP, str_5B5C6B353D361F4E, "bob ")
+SUBS(AR|RGT|AT|AN|AP, str_3F3B1F8B5A3E409E, "not ")
+SUBS(AR|AA|AS|AN, str_7AAFE2EE07648FED, "ran ")
+SUBS(AR|RGT|AA|AS|AN, str_2CE76540AD536EFF, "jr ")
+SUBS(AR|AT|AN|AI, str_0C571CCD7FA5FAEF, "the ")
+SUBS(AR|RGT|AT|AN|AI, str_098DC5EDD94A95CA, "even ")
+SUBS(AR|AA|AS|AO, str_0F745394BA57F7F1, "air ")
+SUBS(AR|RGT|AA|AS|AO, str_929FE1BEB911F16F, "ira ")
+SUBS(AR|AA|AN|AI, str_9CAD49AC9B02787F, "anne ")
+SUBS(AR|RGT|AA|AN|AI, str_825E86353E58E557, "jane ")
+SUBS(AR|AE|AT|AO, str_3E9F631F6868B537, "did ")
+SUBS(AR|RGT|AE|AT|AO, str_732FCC97258E0FD6, "its ")
+SUBS(AR|AA|AS|AI, str_467AF751A93D5FEA, "were ")
+SUBS(AR|RGT|AA|AS|AI, str_E379EB50E86BEB3A, "ear ")
+SUBS(AR|AA|AN|AO, str_83396DA0D7927D05, "any ")
+SUBS(AR|RGT|AA|AN|AO, str_78E990102B716EE8, "nay ")
+SUBS(AR|AS|AI|AP, str_C07FB7D845986B9B, "zero ")
+SUBS(AR|RGT|AS|AI|AP, str_ECAAA38338BDFA85, "error ")
+SUBS(AR|AA|AE|AN, str_77BE4D44A5F2AD27, "am ")
+SUBS(AR|RGT|AA|AE|AN, str_7814AB9A9D941FFB, "man ")
+SUBS(AR|AA|AT|AI, str_F231D25717222487, "tea ")
+SUBS(AR|RGT|AA|AT|AI, str_6C2D1E83BFA41552, "eat ")
+SUBS(AR|AA|AE|AO, str_A7496AA18767D1E0, "six ")
+SUBS(AR|RGT|AA|AE|AO, str_D2F95EA81F7C61D5, "ix ")
+SUBS(AR|AE|AN|AI, str_B164BA3889B2FB9E, "she ")
+SUBS(AR|RGT|AE|AN|AI, str_5140BEC191346017, "me ")
+SUBS(AR|AS|AE|AP, str_DAE84F2729ACCE2B, "for ")
+SUBS(AR|RGT|AS|AE|AP, str_BF38370C83727D39, "of ")
+SUBS(AR|AA|AE|AI, str_4F0274A2E13525F6, "sea ")
+SUBS(AR|RGT|AA|AE|AI, str_9951159C79D95936, "ease ")
+SUBS(AR|AS|AN|AI, str_D1550EF3FF742581, "zen ")
+SUBS(AR|RGT|AS|AN|AI, str_8BA7632DC4B89BB1, "her ")
+SUBS(AR|AE|AN|AO, str_55863E4A819B49C1, "sin ")
+SUBS(AR|RGT|AE|AN|AO, str_A0AA5B74C096E40B, "my ")
+SUBS(AR|AE|AT|AI, str_FA675AA04C2E42E3, "set ")
+SUBS(AR|RGT|AE|AT|AI, str_F24CCF918506949F, "ed ")
+SUBS(AR|AE|AI|AO, str_1496CCFA31912C0B, "sue ")
+SUBS(AR|RGT|AE|AI|AO, str_93E9AC18AF76041F, "us ")
+SUBS(AR|AA|AN|AP, str_9F8EB086C328F80A, "all ")
+SUBS(AR|RGT|AA|AN|AP, str_7E7904D7326BCF29, "la ")
+SUBS(AR|AA|AT|AN, str_04B8207B25B0547B, "pan ")
+SUBS(AR|RGT|AA|AT|AN, str_21C1365689620902, "japan ")
+SUBS(AR|AE|AN|AP, str_30A932E1CBDCE716, "soon ")
+SUBS(AR|RGT|AE|AN|AP, str_473356DB440A7383, "mom ")
+SUBS(AR|AS|AE|AT|AI|AO, str_40711EF1BB6CE033, "five ")
+SUBS(AR|AA|AS|AE|AT|AO, str_4F6C506138FB813D, "paris ")
+SUBS(AR|AA|AS|AT|AI|AO, str_CB15D333C42E37D6, "great ")
+SUBS(AR|AA|AS|AE|AO|AP, str_B605F828461B6E2D, "warriors ")
+SUBS(AR|AA|AS|AE|AT|AP, str_6FD3D941462F3451, "words ")
+SUBS(AR|AA|AS|AT|AN|AO, str_0A79A87D8918C37C, "taking ")
+SUBS(AR|AA|AS|AE|AI|AP, str_66F9514DBFA60EF2, "we're ")
+SUBS(AR|AA|AE|AI|AO|AP, str_79D3E26175FCC175, "sioux ")
+SUBS(AR|AS|AE|AT|AO|AP, str_AEA7AF69C32E2CD4, "forgot ")
+SUBS(AR|AA|AS|AT|AO|AP, str_4E9BF03EDB04ADE3, "grow ")
+SUBS(AR|AA|AS|AE|AT|AN, str_A8A3948AAFF44BE9, "dark ")
+SUBS(AR|AA|AT|AI|AO, str_9B3F02A3D0BBA370, "put ")
+SUBS(AR|RGT|AA|AT|AI|AO, str_D443D6F10491FB2B, "up ")
+SUBS(AR|AA|AS|AE|AN, str_AFD48C0D96C26C82, "ask ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_5A394C259CBDE4D5, "mark ")
+SUBS(AR|AA|AE|AN|AP, str_446D4CA556AB6841, "also ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_B111895E3DEEB720, "man's ")
+SUBS(AR|AS|AT|AO|AP, str_8D95248E464BC3C1, "torrio ")
+SUBS(AR|RGT|AS|AT|AO|AP, str_9FF353D289A363BD, "org ")
+SUBS(AR|AS|AN|AI|AP, str_6077CFE95878168F, "role ")
+SUBS(AR|RGT|AS|AN|AI|AP, str_8E5F7D801B25691B, "honor ")
+SUBS(AR|AS|AE|AI|AO, str_E4CF94D769353920, "sure ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_23A06B50C1DE7196, "users ")
+SUBS(AR|AA|AN|AO|AP, str_BA829DA851D5C5EF, "ally ")
+SUBS(AR|RGT|AA|AN|AO|AP, str_06FE528509A5B57E, "lay ")
+SUBS(AR|AA|AE|AT|AI, str_4E512B260E36DC65, "state ")
+SUBS(AR|RGT|AA|AE|AT|AI, str_57E4F81A2B4D6010, "east ")
+SUBS(AR|AE|AN|AI|AO, str_A49D311A65686F59, "sun ")
+SUBS(AR|RGT|AE|AN|AI|AO, str_E9D65B1F0CC7B588, "his ")
+SUBS(AR|AS|AN|AO|AP, str_43C37D137046DBEF, "roy ")
+SUBS(AR|RGT|AS|AN|AO|AP, str_890C8D54DAEB7C87, "york ")
+SUBS(AR|AT|AN|AI|AP, str_237E8B21EE3454D9, "both ")
+SUBS(AR|RGT|AT|AN|AI|AP, str_F8DC13D4D6DED2F5, "let ")
+SUBS(AR|AA|AS|AT|AN, str_90AB495ADEB4039C, "can ")
+SUBS(AR|RGT|AA|AS|AT|AN, str_7F1DF9F101812702, "jack ")
+SUBS(AR|AS|AT|AN|AO, str_721DAB46F9F1A099, "city ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_01B39F439069940D, "king ")
+SUBS(AR|AS|AT|AI|AO, str_3433466C48D994E3, "true ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_9DE220743565099F, "ice ")
+SUBS(AR|AS|AE|AN|AP, str_2DCB6A06FF45764B, "from ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_216AEBBD35BB1EF3, "looks ")
+SUBS(AR|AT|AN|AO|AP, str_82F82D9347982012, "going ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_E9481F155C267491, "into ")
+SUBS(AR|AA|AE|AT|AN, str_C1FDC4AB8597A676, "and ")
+SUBS(AR|RGT|AA|AE|AT|AN, str_7B311AC4CACA03C6, "mad ")
+SUBS(AR|AS|AT|AN|AI, str_08358E010E322628, "there ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_06B986ED8B5C2398, "never ")
+SUBS(AR|AA|AE|AT|AO, str_B39CDB39BA4EDFE7, "said ")
+SUBS(AR|RGT|AA|AE|AT|AO, str_DA742024F3D69E0A, "ida ")
+SUBS(AR|AE|AN|AI|AP, str_29703C252684465E, "some ")
+SUBS(AR|RGT|AE|AN|AI|AP, str_AC07FAFFDC50A99F, "home ")
+SUBS(AR|AA|AS|AN|AO, str_F86A9EDBD6FC9244, "way ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_AC11722CD97971C7, "iran ")
+SUBS(AR|AS|AE|AN|AO, str_76ADD09A983F86E4, "firm ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_A20A8B3D86F67BE2, "kiss ")
+SUBS(AR|AE|AT|AN|AI, str_224997ADD6DF35BA, "them ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_57FCD18102003294, "need ")
+SUBS(AR|AA|AS|AN|AP, str_2A1FE2610765B6AF, "work ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_78916562F1D9BFAA, "now ")
+SUBS(AR|AS|AE|AN|AI, str_EF44C91E30C22640, "fresh ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_DEE3BBD571C511F7, "mere ")
+SUBS(AR|AA|AE|AN|AO, str_04451BF193552568, "say ")
+SUBS(AR|RGT|AA|AE|AN|AO, str_223DD41A813D045F, "many ")
+SUBS(AR|AA|AS|AI|AO, str_625BCB0AF25BADC4, "require ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_1A51ED70233C0AEF, "iraq ")
+SUBS(AR|AA|AS|AE|AI, str_ABE60ED77BB0868A, "few ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_3F7738E523F5301A, "ears ")
+SUBS(AR|AA|AS|AN|AI, str_43D073A61B4D28EA, "when ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_C161ABA85FEDF657, "new ")
+SUBS(AR|AT|AN|AI|AO, str_30278AC8BAD5995C, "but ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_7E91AE1D0B9C584A, "night ")
+SUBS(AR|AE|AT|AO|AP, str_0806A00E99F47F1E, "good ")
+SUBS(AR|RGT|AE|AT|AO|AP, str_8553C9AE3540A19D, "it's ")
+SUBS(AR|AA|AE|AN|AI, str_C1CFDEE565A45A39, "same ")
+SUBS(AR|RGT|AA|AE|AN|AI, str_F9F466F11B521E6F, "has ")
+SUBS(AR|AS|AN|AI|AO, str_9B96D050F4020292, "run ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_4F0FB0EFA2C3B084, "henry ")
+SUBS(AR|AS|AT|AI|AP, str_3A528F16E289F01C, "cover ")
+SUBS(AR|RGT|AS|AT|AI|AP, str_2CCE6615DDD45C8E, "over ")
+SUBS(AR|AA|AN|AI|AP, str_88405EF2E946D1D6, "alone ")
+SUBS(AR|RGT|AA|AN|AI|AP, str_B24523534C6D82C9, "john ")
+SUBS(AR|AE|AT|AI|AO, str_EF833FE60ABC700E, "side ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_85BC1A1AD7135055, "used ")
+SUBS(AR|AA|AN|AI|AO, str_D36C353C29396FB8, "queen ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_0749613DBDDF6C21, "yeah ")
+SUBS(AR|AE|AT|AN|AO, str_DBD97E3B522FD333, "sitting ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_0A7ED86EF765AFF1, "mind ")
+SUBS(AR|AS|AE|AT|AN, str_2F546AE769C0CBF8, "cbs ")
+SUBS(AR|RGT|AS|AE|AT|AN, str_8AC14839F77F07D3, "kd ")
+SUBS(AR|AA|AS|AI|AP, str_52EA90BBAFB4F4A1, "wore ")
+SUBS(AR|RGT|AA|AS|AI|AP, str_FEE35575A17EE85A, "owe ")
+SUBS(AR|AS|AE|AI|AP, str_6C574A0F59FA2300, "rose ")
+SUBS(AR|RGT|AS|AE|AI|AP, str_A9A8259196570018, "offer ")
+SUBS(AR|AS|AE|AT|AI, str_51512241229C5DF3, "street ")
+SUBS(AR|RGT|AS|AE|AT|AI, str_92C7783DE595AB4A, "effect ")
+SUBS(AR|AA|AT|AN|AI, str_DA20B440A7186A4B, "that ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_89E5D4BB42BF5AC6, "have ")
+SUBS(AR|AE|AN|AO|AP, str_81F316EF045DA533, "sly ")
+SUBS(AR|RGT|AE|AN|AO|AP, str_2A2F016FAA9B3070, "i'm ")
+SUBS(AR|AE|AT|AN|AP, str_2457621BE8FFDD2E, "don't ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_502F482B79087297, "most ")
+SUBS(AR|AA|AT|AN|AP, str_2F0B08746C6E2063, "plan ")
+SUBS(AR|RGT|AA|AT|AN|AP, str_31DBCE4A196B6F93, "job ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_5204C59B3BF29E2F, "process ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_2EEF85D3F346985C, "wife's ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_51EB56552116C89D, "radio ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_E484C1C2B2A4F93A, "arrived ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_606B2F10B55FE195, "always ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_1D76C98090617D6E, "down ")
+SUBS(AR|AA|AE|AN|AI|AO, str_D11B9A654063B9B3, "assume ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_DEBD70C653B8860B, "human ")
+SUBS(AR|AE|AN|AI|AO|AP, str_AA1A1A0DAC58FCE8, "smile ")
+SUBS(AR|RGT|AE|AN|AI|AO|AP, str_C031A6DB25D4AFF7, "house ")
+SUBS(AR|AA|AE|AT|AN|AP, str_95C7F6F3D4DB5B15, "almost ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_A57E20B51804CF2C, "last ")
+SUBS(AR|AA|AT|AI|AO|AP, str_035AAD7808B22162, "quote ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_1907DA045A375125, "output ")
+SUBS(AR|AS|AE|AI|AO|AP, str_7E93CBAD3C3B58D0, "four ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_C2FEB17C7BDA2BD4, "ours ")
+SUBS(AR|AE|AT|AN|AI|AO, str_F67830C3E4E560AB, "this ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_9AE637BD5FD038A8, "might ")
+SUBS(AR|AS|AE|AT|AN|AI, str_BF99AB6937309FE2, "remember ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_F35A6D491FB40217, "members ")
+SUBS(AR|AS|AT|AI|AO|AP, str_03E3F540957262B2, "voice ")
+SUBS(AR|RGT|AS|AT|AI|AO|AP, str_209C990BC721AB9D, "occur ")
+SUBS(AR|AS|AT|AN|AO|AP, str_D86D167AB9B47857, "girl ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_101345D47E9C9CDE, "looking ")
+SUBS(AR|AA|AN|AI|AO|AP, str_7D50A0C65C92712F, "anyone ")
+SUBS(AR|RGT|AA|AN|AI|AO|AP, str_37D7C0A214B0A265, "enjoy ")
+SUBS(AR|AT|AN|AI|AO|AP, str_EF6EC7C5B5FE957F, "thought ")
+SUBS(AR|RGT|AT|AN|AI|AO|AP, str_F5F45EC56E19863D, "little ")
+SUBS(AR|AA|AS|AE|AT|AI, str_0E857BEC949CC40A, "after ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI, str_85DD689D339275FF, "except ")
+SUBS(AR|AA|AS|AE|AN|AI, str_BA89A60792F6D2AE, "answer ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_4643015F5002ABFF, "make ")
+SUBS(AR|AA|AS|AN|AI|AP, str_4E6E8E4C9B45508F, "who ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_FAA922DD96A4D310, "how ")
+SUBS(AR|AA|AT|AN|AO|AP, str_12D789B35778048E, "point ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_8C3955AAA5717454, "national ")
+SUBS(AR|AA|AS|AE|AI|AO, str_31EBE5BA3BAF1564, "wife ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_C3EA5519A54A708E, "easier ")
+SUBS(AR|AA|AS|AN|AI|AO, str_BCA1DAA79DB9C8AE, "why ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_79F7715BBBB21655, "year ")
+SUBS(AR|AE|AT|AN|AO|AP, str_503F03DCEE6CB398, "still ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_18EB5CEDC005C927, "isn't ")
+SUBS(AR|AA|AE|AT|AI|AO, str_8F0137935E32C458, "despite ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_F180086B81853B17, "idea ")
+SUBS(AR|AE|AT|AI|AO|AP, str_F0177691329BF1AD, "goes ")
+SUBS(AR|RGT|AE|AT|AI|AO|AP, str_67BF6CF47B192C42, "i've ")
+SUBS(AR|AA|AE|AT|AO|AP, str_E892467E0460DAC0, "gossip ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_A9AE864FDE8A2520, "ipod ")
+SUBS(AR|AA|AS|AT|AN|AP, str_9D99660948094B78, "call ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_B8729A7E003EEBD7, "local ")
+SUBS(AR|AS|AE|AN|AI|AP, str_4F290479EC7B8012, "feel ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_CA73DC3F774CBABC, "more ")
+SUBS(AR|AS|AN|AI|AO|AP, str_A1E8E2FD164B5C7E, "rule ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_8C5E240F4E5D3061, "your ")
+SUBS(AR|AS|AT|AN|AI|AO, str_84895AD0D6A60E58, "their ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_E6D5EDD2E27809F9, "every ")
+SUBS(AR|AE|AT|AN|AI|AP, str_484C9079546B7C6E, "those ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_FD8E708197F5C58E, "moment ")
+SUBS(AR|AS|AT|AN|AI|AP, str_C19C0AAE3679C6D9, "brother ")
+SUBS(AR|RGT|AS|AT|AN|AI|AP, str_36FAD9241CEA5C82, "other ")
+SUBS(AR|AA|AE|AT|AN|AO, str_6C79F7FA2DF8C5A3, "day ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_62D4959696367129, "instant ")
+SUBS(AR|AS|AE|AT|AN|AO, str_C339147D80754375, "find ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_4619E5AA3B8E6B39, "kind ")
+SUBS(AR|AA|AE|AT|AN|AI, str_8ACEDC7348DC7E27, "death ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_B8157EA41E09D921, "had ")
+SUBS(AR|AA|AT|AN|AI|AP, str_56B0C240EA9FE481, "people ")
+SUBS(AR|RGT|AA|AT|AN|AI|AP, str_591BCA852B1294CC, "help ")
+SUBS(AR|AA|AS|AE|AN|AP, str_BA3809CE0E475488, "woman ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_6F239254D0D8ABBC, "major ")
+SUBS(AR|AA|AT|AN|AI|AO, str_A199A8785F0B305B, "anything ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_AD1AB4C08BF16CA6, "having ")
+SUBS(AR|AA|AE|AN|AI|AP, str_EE46D7E3DE224990, "shall ")
+SUBS(AR|RGT|AA|AE|AN|AI|AP, str_7A05C28B693E6259, "male ")
+SUBS(AR|AS|AE|AT|AI|AP, str_5173ADE4944D0776, "force ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_EC35C4B5B1F55FBB, "order ")
+SUBS(AR|AA|AS|AE|AN|AO, str_D3DB4C04069FC93F, "army ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_D326DB4A65CE22C7, "mary ")
+SUBS(AR|AS|AE|AT|AN|AP, str_AFCC3D83DFCADE82, "front ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_64B31ADF56C7440F, "lord ")
+SUBS(AR|AS|AE|AN|AO|AP, str_C670DB2E3BA8D8F4, "sorry ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_E6F5630257B79DD0, "mirror ")
+SUBS(AR|AA|AE|AN|AO|AP, str_279C5D17219228B4, "animal ")
+SUBS(AR|RGT|AA|AE|AN|AO|AP, str_AB1E39CC151AAAEC, "mail ")
+SUBS(AR|AA|AE|AT|AI|AP, str_97D5E1E2DDCE0F5D, "stopped ")
+SUBS(AR|RGT|AA|AE|AT|AI|AP, str_B2BF1DD0344AF8AF, "exposed ")
+SUBS(AR|AA|AS|AT|AN|AI, str_FC132AA2C16D882F, "what ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_864A667355C4B3C2, "each ")
+SUBS(AR|AS|AE|AN|AI|AO, str_701758C383D21C1A, "fine ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_2CC4A420745FDB22, "mike ")
+SUBS(AR|AA|AS|AT|AI|AP, str_4D2A6306F9C9BFCB, "power ")
+SUBS(AR|RGT|AA|AS|AT|AI|AP, str_EC999A983A431E7C, "operate ")
+SUBS(AR|AA|AS|AN|AO|AP, str_CC94E0C76922BF90, "will ")
+SUBS(AR|RGT|AA|AS|AN|AO|AP, str_21145976ED448EED, "okay ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_696F5175F70F9C32, "support ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_3FAB961579587CB5, "story ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_1CEE30E7027402BC, "morning ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_6BC2917C61A3F92D, "that's ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_1160B06F4F7112E2, "least ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_DEED0AFBEF843B42, "full ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_B49C2360C17BFAA5, "life ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_A3E4FBB212A28B78, "course ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_2044EBFCFC5E992B, "office ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_87226571AE131D8A, "with ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO, str_073DA3382936C187, "nature ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_8DFFD42CE860597C, "came ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_DA7F1A6E228C1A5B, "heard ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_2F5D687E7759B962, "working ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_49E4C34496734F49, "knowing ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_8589EF9E59347006, "anxious ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_B9DB7C8FDF935A94, "usually ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_48F8387F4FB7D369, "positive ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO|AP, str_3B9FD8A0395168B4, "opposite ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_AF3D9EAA19F822D9, "such ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_401EFB5649B2EBB4, "much ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_C8DEFAE65FA4EF3E, "another ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_B74E83C046B23FC2, "later ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_6E7EEC08674ED6D1, "before ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_EC81EEB3F21B0472, "left ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_28BB10C5BB93CDE6, "about ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_7E7546519DC7B3C8, "upon ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_38471417B8BD2111, "asking ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO, str_114560D7A89BA1F4, "making ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_BB64A6A5972FD42C, "wish ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_6BB7E1A1CA75BFB5, "years ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_456C45E3CE4E4FD1, "group ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_E6642DD0F48EDBD7, "europe ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_FA45FD5460D2DE0C, "game ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_C039D2A5D9FC5D72, "just ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_612AE2FB632AD051, "among ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_8623908E0D25EC7E, "lady ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_2223CB8066D845B9, "while ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_CB9940FE62844BE1, "early ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_7B4540ACD20A8E39, "women ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_57FB1B446847BBC1, "half ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_D6EE20239053CED9, "something ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_95035F1A76A4B5DB, "lives ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_4527C3E99AECDB31, "through ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_E1CDCB2AFADE1111, "everyone ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_E5AE62F9B29AD444, "families ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_93375F8043379EC1, "meanwhile ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_CD4ABC5E1C8E848A, "could ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_38DACC470533AA15, "itself ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_F1CF6AF5D5BFD0AF, "without ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_DD452F0E9D35762C, "large ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_D70EDAD8867014E8, "called ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_5F9274F22D0B449A, "learned ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_719BC090B9A903EE, "possible ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_7FE017B6D898E126, "immediately ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_C358A55785D991BA, "because ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_22575911E719BC02, "experience ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_2BFAFC3EB8546058, "company ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_B36787B90CE5F35A, "important ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_83235A0FA2F65989, "would ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_6EBFDE396F485CF3, "especially ")
diff --git a/keyboards/gboards/dicts/aset/en-dvorak-keymap.def b/keyboards/gboards/dicts/aset/en-dvorak-keymap.def
new file mode 100644
index 00000000000..343e8b7cec0
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/en-dvorak-keymap.def
@@ -0,0 +1,420 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AP, KC_S)
+PRES(AA, KC_A)
+PRES(AN, KC_H)
+PRES(AE, KC_E)
+PRES(AS, KC_O)
+PRES(AI, KC_T)
+PRES(AO, KC_N)
+PRES(AT, KC_I)
+PRES(AT|AI, KC_K)
+PRES(AA|AT, KC_P)
+PRES(AT|AP, KC_QUOT)
+PRES(AA|AN, KC_SCLN)
+PRES(AS|AT, KC_Y)
+PRES(AA|AO, KC_QUOT)
+PRES(AA|AP, KC_MINS)
+PRES(AA|AS, KC_COMM)
+PRES(AN|AI, KC_D)
+PRES(AO|AP, KC_L)
+PRES(AE|AI, KC_C)
+PRES(AI|AO, KC_R)
+PRES(AE|AN, KC_J)
+PRES(AN|AO, KC_G)
+PRES(AS|AN, KC_B)
+PRES(AE|AO, KC_V)
+PRES(AE|AT, KC_U)
+KEYS(AE|AP, cmb_e52b969e99584c51, {KC_LSFT, KC_0, COMBO_END})
+PRES(AS|AE, KC_DOT)
+PRES(AI|AP, KC_Z)
+PRES(AS|AP, KC_BSPC)
+PRES(AT|AN, KC_F)
+PRES(AS|AI, KC_W)
+PRES(AN|AP, KC_M)
+PRES(AS|AO, KC_Q)
+KEYS(AA|AI, cmb_12a7d61ee7e909a6, {KC_LSFT, KC_9, COMBO_END})
+KEYS(AA|AE, cmb_326203cf248f5a0b, {KC_LSFT, KC_1, COMBO_END})
+PRES(AT|AO, KC_X)
+SUBS(AR|AA|AI|AP, str_3B1A13C290639852, "sat ")
+SUBS(AR|AS|AT|AO, str_3ED234DBAE3D7B8E, "nixon ")
+SUBS(AR|AE|AI|AP, str_FA675AA04C2E42E3, "set ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AS|AE|AT, str_E429BF3EE734FF3A, "you ")
+SUBS(AR|AA|AS|AO, str_68A050786B16A5F7, "o' ")
+SUBS(AR|AA|AT|AN, str_AE7C21F6A7204ABC, "hip ")
+SUBS(AR|AS|AN|AO, str_EB95C155685E35D7, "go ")
+SUBS(AR|AA|AT|AP, str_4DFAE898587FE4FE, "pass ")
+SUBS(AR|AA|AI|AO, str_7AAFE2EE07648FED, "ran ")
+SUBS(AR|AA|AE|AO, str_868067C442CD38C1, "van ")
+SUBS(AR|AS|AT|AN|AI, str_87226571AE131D8A, "with ")
+SUBS(AR|AA|AT|AI|AO, str_2569286750C7B4F4, "part ")
+SUBS(AR|AS|AT|AI|AP, str_BDB5D53B3D616C95, "sky ")
+SUBS(AR|AA|AS|AT|AP, str_04451BF193552568, "say ")
+SUBS(AR|AA|AS|AE|AI, str_7AAAAFE6320C0D6B, "coat ")
+SUBS(AR|AE|AT|AI|AP, str_371C6F1198A5A44E, "success ")
+SUBS(AR|AA|AS|AE|AN, str_E71CDEA10812077E, "abee ")
+SUBS(AR|AS|AE|AI|AP, str_DC266345A77997C1, "west ")
+SUBS(AR|AA|AS|AI|AP, str_FB4F2F8581A28E79, "was ")
+SUBS(AR|AS|AE|AT|AP, str_9CFD6F6C59053F15, "eyes ")
+SUBS(AR|AA|AT|AI|AP, str_AFD48C0D96C26C82, "ask ")
+SUBS(AR|AA|AE|AT|AN, str_DCADC79BBC1A1497, "heap ")
+SUBS(AR|AA|AS|AE|AT, str_AAB1D405F8D273AF, "pope ")
+SUBS(AR|AS|AE|AI, str_C8F40BD7102B7E24, "we ")
+SUBS(AR|RGT|AS|AE|AI, str_FEE35575A17EE85A, "owe ")
+SUBS(AR|AN|AI|AO, str_546AE2E8DF2AFDB3, "dr ")
+SUBS(AR|RGT|AN|AI|AO, str_1F5578C977E22C6F, "nd ")
+SUBS(AR|AS|AN|AP, str_D2A8142DD2C2B864, "boss ")
+SUBS(AR|RGT|AS|AN|AP, str_473356DB440A7383, "mom ")
+SUBS(AR|AS|AI|AP, str_D2FF232093ED7FE9, "toss ")
+SUBS(AR|RGT|AS|AI|AP, str_4ED2D2B9D2D0F925, "oz ")
+SUBS(AR|AA|AE|AT, str_288993BA9FAF1F15, "pipe ")
+SUBS(AR|RGT|AA|AE|AT, str_D443D6F10491FB2B, "up ")
+SUBS(AR|AE|AT|AI, str_0F2C6B822BBFF497, "cut ")
+SUBS(AR|RGT|AE|AT|AI, str_9DE220743565099F, "ice ")
+SUBS(AR|AA|AN|AO, str_F3FA41B52DE36D40, "gang ")
+SUBS(AR|RGT|AA|AN|AO, str_4D07A4DED24106B4, "hang ")
+SUBS(AR|AS|AO|AP, str_30A932E1CBDCE716, "soon ")
+SUBS(AR|RGT|AS|AO|AP, str_71BB7B180F4C724C, "loss ")
+SUBS(AR|AS|AE|AN, str_7D2440FBBF9D0256, "be ")
+SUBS(AR|RGT|AS|AE|AN, str_31DBCE4A196B6F93, "job ")
+SUBS(AR|AA|AS|AT, str_4559382E20EB9335, "pay ")
+SUBS(AR|RGT|AA|AS|AT, str_CBA94FFB9DDDB35B, "ya ")
+SUBS(AR|AE|AO|AP, str_9DC99BC1636105A0, "seen ")
+SUBS(AR|RGT|AE|AO|AP, str_652B1CF209C5D907, "less ")
+SUBS(AR|AT|AI|AO, str_E8B598BF778C48B0, "tin ")
+SUBS(AR|RGT|AT|AI|AO, str_60A15FB00ABCCBCA, "ink ")
+SUBS(AR|AS|AE|AO, str_FE0DE06C30B4AB8D, "von ")
+SUBS(AR|RGT|AS|AE|AO, str_9A6C6AD5C510E57E, "one ")
+SUBS(AR|AA|AE|AP, str_4F0274A2E13525F6, "sea ")
+SUBS(AR|RGT|AA|AE|AP, str_9951159C79D95936, "ease ")
+SUBS(AR|AT|AN|AP, str_EABA263238C776B5, "fish ")
+SUBS(AR|RGT|AT|AN|AP, str_E9D65B1F0CC7B588, "his ")
+SUBS(AR|AA|AT|AO, str_968AF4858B6521BE, "pain ")
+SUBS(AR|RGT|AA|AT|AO, str_E5D0DBF6833C9487, "'i ")
+SUBS(AR|AA|AO|AP, str_9F8EB086C328F80A, "all ")
+SUBS(AR|RGT|AA|AO|AP, str_7E7904D7326BCF29, "la ")
+SUBS(AR|AA|AN|AP, str_77BE4D44A5F2AD27, "am ")
+SUBS(AR|RGT|AA|AN|AP, str_F9F466F11B521E6F, "has ")
+SUBS(AR|AE|AN|AP, str_B164BA3889B2FB9E, "she ")
+SUBS(AR|RGT|AE|AN|AP, str_5140BEC191346017, "me ")
+SUBS(AR|AT|AN|AO, str_0722DB63E15B9195, "fig ")
+SUBS(AR|RGT|AT|AN|AO, str_A8907BB9162F31E2, "high ")
+SUBS(AR|AE|AN|AO, str_FB51F2C8C00A7A37, "gene ")
+SUBS(AR|RGT|AE|AN|AO, str_3EB37F14209CB484, "egg ")
+SUBS(AR|AS|AT|AI, str_A9DE0A41D933835E, "took ")
+SUBS(AR|RGT|AS|AT|AI, str_9A86C59444872BAC, "kitty ")
+SUBS(AR|AS|AI|AO, str_5146C3491DA57E2B, "town ")
+SUBS(AR|RGT|AS|AI|AO, str_3F3B1F8B5A3E409E, "not ")
+SUBS(AR|AA|AT|AI, str_EDDB4B5D8E6E6CF7, "tip ")
+SUBS(AR|RGT|AA|AT|AI, str_31F7D241519F6E20, "kaa ")
+SUBS(AR|AT|AI|AP, str_2B382E2C87F633B5, "sit ")
+SUBS(AR|RGT|AT|AI|AP, str_732FCC97258E0FD6, "its ")
+SUBS(AR|AE|AT|AP, str_1496CCFA31912C0B, "sue ")
+SUBS(AR|RGT|AE|AT|AP, str_93E9AC18AF76041F, "us ")
+SUBS(AR|AS|AT|AN, str_8CCEA54EEE3F864A, "by ")
+SUBS(AR|RGT|AS|AT|AN, str_BF38370C83727D39, "of ")
+SUBS(AR|AE|AT|AN, str_22F999B882C34098, "fee ")
+SUBS(AR|RGT|AE|AT|AN, str_D55D0897EDFEB60B, "huh ")
+SUBS(AR|AT|AN|AI, str_3E9F631F6868B537, "did ")
+SUBS(AR|RGT|AT|AN|AI, str_D5ACE27258AF148F, "hit ")
+SUBS(AR|AT|AO|AP, str_A7496AA18767D1E0, "six ")
+SUBS(AR|RGT|AT|AO|AP, str_F50915F9E77588D7, "ill ")
+SUBS(AR|AE|AI|AO, str_39EAEC33BC5439E6, "ten ")
+SUBS(AR|RGT|AE|AI|AO, str_06B986ED8B5C2398, "never ")
+SUBS(AR|AS|AN|AI, str_4E6E8E4C9B45508F, "who ")
+SUBS(AR|RGT|AS|AN|AI, str_FAA922DD96A4D310, "how ")
+SUBS(AR|AE|AT|AO, str_106C36C84C6A6D7C, "vi ")
+SUBS(AR|RGT|AE|AT|AO, str_9F630A3292B712FA, "nine ")
+SUBS(AR|AA|AN|AI, str_DA20B440A7186A4B, "that ")
+SUBS(AR|RGT|AA|AN|AI, str_B8157EA41E09D921, "had ")
+SUBS(AR|AA|AE|AI, str_39D0688D43AC4064, "act ")
+SUBS(AR|RGT|AA|AE|AI, str_6C2D1E83BFA41552, "eat ")
+SUBS(AR|AE|AN|AI, str_0C571CCD7FA5FAEF, "the ")
+SUBS(AR|RGT|AE|AN|AI, str_F24CCF918506949F, "ed ")
+SUBS(AR|AS|AE|AN|AI|AP, str_484C9079546B7C6E, "those ")
+SUBS(AR|AA|AS|AN|AI|AO, str_2457621BE8FFDD2E, "don't ")
+SUBS(AR|AA|AS|AE|AN|AP, str_C8D8A206971E3C22, "base ")
+SUBS(AR|AA|AS|AE|AI|AP, str_95D15754412C81DA, "coast ")
+SUBS(AR|AA|AS|AN|AI|AP, str_A1ECA5B498E1A83A, "thomas ")
+SUBS(AR|AA|AS|AT|AI|AP, str_CB532D5DED67E46B, "stop ")
+SUBS(AR|AA|AS|AE|AT|AI, str_8A3CF03C5FA779DF, "type ")
+SUBS(AR|AE|AN|AO|AP, str_783DF1EF3115D810, "smell ")
+SUBS(AR|RGT|AE|AN|AO|AP, str_B969E2F841D9C54A, "men ")
+SUBS(AR|AS|AN|AI|AO, str_1D76C98090617D6E, "down ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_242C57A2EE5F055B, "north ")
+SUBS(AR|AS|AE|AI|AO, str_467AF751A93D5FEA, "were ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_2CCE6615DDD45C8E, "over ")
+SUBS(AR|AA|AS|AN|AO, str_353D7D379A2BBFCE, "ago ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_0E60BB84D855A13B, "noah ")
+SUBS(AR|AT|AI|AO|AP, str_503F03DCEE6CB398, "still ")
+SUBS(AR|RGT|AT|AI|AO|AP, str_CFF985CA3C59BFF1, "list ")
+SUBS(AR|AA|AS|AO|AP, str_446D4CA556AB6841, "also ")
+SUBS(AR|RGT|AA|AS|AO|AP, str_BAE95AEBCBC31CEB, "loan ")
+SUBS(AR|AA|AS|AN|AI, str_FC132AA2C16D882F, "what ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_4EE1983616EF60F2, "oath ")
+SUBS(AR|AS|AE|AN|AP, str_29703C252684465E, "some ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_AC07FAFFDC50A99F, "home ")
+SUBS(AR|AE|AN|AI|AP, str_224997ADD6DF35BA, "them ")
+SUBS(AR|RGT|AE|AN|AI|AP, str_C7D7F29E47B4BF3E, "met ")
+SUBS(AR|AA|AE|AN|AI, str_8ACEDC7348DC7E27, "death ")
+SUBS(AR|RGT|AA|AE|AN|AI, str_864A667355C4B3C2, "each ")
+SUBS(AR|AS|AE|AN|AI, str_6DF8502CC4CDA8DB, "bed ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_02FA2F0D36F77191, "object ")
+SUBS(AR|AA|AE|AN|AP, str_C1CFDEE565A45A39, "same ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_DED45DDEBF0E4340, "james ")
+SUBS(AR|AS|AT|AI|AO, str_2A1FE2610765B6AF, "work ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_E9481F155C267491, "into ")
+SUBS(AR|AS|AE|AO|AP, str_CB57DFC7BDDD7B84, "solve ")
+SUBS(AR|RGT|AS|AE|AO|AP, str_16E01F03892DC1D1, "love ")
+SUBS(AR|AA|AE|AI|AP, str_D5362858B5329DFE, "case ")
+SUBS(AR|RGT|AA|AE|AI|AP, str_57E4F81A2B4D6010, "east ")
+SUBS(AR|AS|AT|AN|AP, str_6B58DAE77CF6F199, "boys ")
+SUBS(AR|RGT|AS|AT|AN|AP, str_A0AA5B74C096E40B, "my ")
+SUBS(AR|AA|AE|AT|AO, str_A1FE22CFB5711A8E, "avenue ")
+SUBS(AR|RGT|AA|AE|AT|AO, str_67BF6CF47B192C42, "i've ")
+SUBS(AR|AS|AE|AT|AN, str_0F7882FBB9E32466, "buy ")
+SUBS(AR|RGT|AS|AE|AT|AN, str_FC4B92921CA14A88, "joy ")
+SUBS(AR|AA|AE|AO|AP, str_0C921261B86BB507, "save ")
+SUBS(AR|RGT|AA|AE|AO|AP, str_4A416D199D780078, "leave ")
+SUBS(AR|AA|AT|AN|AP, str_E05BFDB0A1C5FA8B, "ship ")
+SUBS(AR|RGT|AA|AT|AN|AP, str_7D7A787864763BBC, "map ")
+SUBS(AR|AE|AT|AN|AP, str_E3374BF3CE8F906D, "sum ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_92AF4A68D7F14A59, "jim ")
+SUBS(AR|AA|AE|AN|AO, str_371831D0BD1D3132, "gave ")
+SUBS(AR|RGT|AA|AE|AN|AO, str_89E5D4BB42BF5AC6, "have ")
+SUBS(AR|AA|AN|AI|AO, str_C1FDC4AB8597A676, "and ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_0AADDE3779A6F980, "hand ")
+SUBS(AR|AA|AS|AT|AI, str_F86A9EDBD6FC9244, "way ")
+SUBS(AR|RGT|AA|AS|AT|AI, str_21145976ED448EED, "okay ")
+SUBS(AR|AA|AS|AT|AO, str_83396DA0D7927D05, "any ")
+SUBS(AR|RGT|AA|AS|AT|AO, str_9BD947158C16F69A, "opinion ")
+SUBS(AR|AA|AE|AT|AP, str_99241769490F065E, "pause ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_85D1F287CC8F2629, "usa ")
+SUBS(AR|AA|AS|AT|AN, str_4D9F45FDB5471EFD, "baby ")
+SUBS(AR|RGT|AA|AS|AT|AN, str_ACD7C28D984A2833, "happy ")
+SUBS(AR|AA|AE|AI|AO, str_83C8874562C3DF81, "are ")
+SUBS(AR|RGT|AA|AE|AI|AO, str_644ECC08D8B17004, "near ")
+SUBS(AR|AA|AN|AI|AP, str_4681B2FAC150FE1B, "sad ")
+SUBS(AR|RGT|AA|AN|AI|AP, str_7B311AC4CACA03C6, "mad ")
+SUBS(AR|AA|AS|AI|AO, str_85FB90AD5AF3F778, "want ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_DA84D9A4529A15B9, "narrow ")
+SUBS(AR|AA|AT|AO|AP, str_2F0B08746C6E2063, "plan ")
+SUBS(AR|RGT|AA|AT|AO|AP, str_BA84125506BFD178, "i'll ")
+SUBS(AR|AA|AT|AN|AI, str_95AF45DBDC3B3D83, "paid ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_DA742024F3D69E0A, "ida ")
+SUBS(AR|AS|AE|AT|AO, str_D36C353C29396FB8, "queen ")
+SUBS(AR|RGT|AS|AE|AT|AO, str_9B2E6FD27C339188, "union ")
+SUBS(AR|AE|AT|AO|AP, str_A49D311A65686F59, "sun ")
+SUBS(AR|RGT|AE|AT|AO|AP, str_94D858BCEE50AD6B, "live ")
+SUBS(AR|AA|AI|AO|AP, str_E84B7CE6394EDDE8, "start ")
+SUBS(AR|RGT|AA|AI|AO|AP, str_A57E20B51804CF2C, "last ")
+SUBS(AR|AA|AE|AT|AI, str_F8E9D339EE8F0786, "take ")
+SUBS(AR|RGT|AA|AE|AT|AI, str_3BE3101B06222C42, "keep ")
+SUBS(AR|AS|AI|AO|AP, str_EBE5544575924AF7, "sort ")
+SUBS(AR|RGT|AS|AI|AO|AP, str_412CDD1E78EA9B08, "lot ")
+SUBS(AR|AS|AT|AO|AP, str_81F316EF045DA533, "sly ")
+SUBS(AR|RGT|AS|AT|AO|AP, str_67863008AE8FD451, "only ")
+SUBS(AR|AS|AN|AI|AP, str_B48EFE9B90416327, "show ")
+SUBS(AR|RGT|AS|AN|AI|AP, str_502F482B79087297, "most ")
+SUBS(AR|AT|AN|AI|AP, str_F67830C3E4E560AB, "this ")
+SUBS(AR|RGT|AT|AN|AI|AP, str_BE08333590E1E58A, "kids ")
+SUBS(AR|AA|AT|AN|AO, str_25F54E15B0B3ABC1, "again ")
+SUBS(AR|RGT|AA|AT|AN|AO, str_A119D81D4A86EB8B, "hanging ")
+SUBS(AR|AS|AN|AO|AP, str_20CF80C46BB5F512, "song ")
+SUBS(AR|RGT|AS|AN|AO|AP, str_D2026F6619D39DA3, "long ")
+SUBS(AR|AE|AT|AI|AO, str_054DDEADD30B1F66, "turn ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_8F95067BEB108348, "next ")
+SUBS(AR|AA|AS|AN|AP, str_3A17F6ED91E2A403, "bass ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_49324C2305B3B483, "obama ")
+SUBS(AR|AE|AT|AN|AO, str_5D9F94AF994041EF, "give ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_286C425EC106E430, "evening ")
+SUBS(AR|AS|AE|AN|AO, str_CC171B56CC89A739, "been ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_B24523534C6D82C9, "john ")
+SUBS(AR|AA|AN|AO|AP, str_841274C574BC6F3C, "small ")
+SUBS(AR|RGT|AA|AN|AO|AP, str_7814AB9A9D941FFB, "man ")
+SUBS(AR|AE|AI|AO|AP, str_7C0F5E706EA39A05, "tell ")
+SUBS(AR|RGT|AE|AI|AO|AP, str_F8DC13D4D6DED2F5, "let ")
+SUBS(AR|AE|AT|AN|AI, str_C513224842565A3D, "feet ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_92C7783DE595AB4A, "effect ")
+SUBS(AR|AE|AN|AI|AO, str_08358E010E322628, "there ")
+SUBS(AR|RGT|AE|AN|AI|AO, str_8BA7632DC4B89BB1, "her ")
+SUBS(AR|AS|AT|AN|AO, str_82F82D9347982012, "going ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_371EE465B604F023, "ongoing ")
+SUBS(AR|AT|AN|AO|AP, str_A2B348B0BB34204B, "sign ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_3E590F651B44D721, "hill ")
+SUBS(AR|AT|AN|AI|AO, str_1773D3DE23E4854F, "think ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_7E91AE1D0B9C584A, "night ")
+SUBS(AR|AS|AE|AT|AI, str_721DAB46F9F1A099, "city ")
+SUBS(AR|RGT|AS|AE|AT|AI, str_99844BD74A4B3366, "out ")
+SUBS(AR|AE|AT|AN|AI|AP, str_FAC1CC00AF3E4FF0, "time ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_C039D2A5D9FC5D72, "just ")
+SUBS(AR|AA|AS|AE|AT|AO, str_7D50A0C65C92712F, "anyone ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO, str_7E7546519DC7B3C8, "upon ")
+SUBS(AR|AE|AT|AN|AI|AO, str_84895AD0D6A60E58, "their ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_7A9785B2733BF653, "under ")
+SUBS(AR|AA|AS|AE|AO|AP, str_88405EF2E946D1D6, "alone ")
+SUBS(AR|RGT|AA|AS|AE|AO|AP, str_9C2D045532275AE8, "one's ")
+SUBS(AR|AA|AS|AE|AT|AP, str_F333C561F94B5419, "suppose ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_68BBF029287BDD2A, "easy ")
+SUBS(AR|AA|AT|AN|AI|AP, str_B39CDB39BA4EDFE7, "said ")
+SUBS(AR|RGT|AA|AT|AN|AI|AP, str_5CBFBEC5EA04168A, "maid ")
+SUBS(AR|AA|AE|AT|AN|AI, str_9F26F0A23087EC9C, "face ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_F180086B81853B17, "idea ")
+SUBS(AR|AA|AS|AE|AN|AI, str_BF2E6EC7C02A7E7E, "watch ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_FC3367E0C6099BCA, "jaw ")
+SUBS(AR|AS|AE|AI|AO|AP, str_5A3CC09208D67861, "well ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_9F8B412C91D1400E, "news ")
+SUBS(AR|AS|AE|AT|AN|AO, str_E8116E15417ED2E9, "being ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_D3C70CC67CBA9A1E, "enough ")
+SUBS(AR|AA|AS|AN|AO|AP, str_7CC468A54106718D, "along ")
+SUBS(AR|RGT|AA|AS|AN|AO|AP, str_CB6E0E5D0C6F9065, "lab ")
+SUBS(AR|AA|AE|AN|AI|AO, str_CB15D333C42E37D6, "great ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_DA7F1A6E228C1A5B, "heard ")
+SUBS(AR|AT|AN|AI|AO|AP, str_F3E5067A2519AD56, "first ")
+SUBS(AR|RGT|AT|AN|AI|AO|AP, str_9AE637BD5FD038A8, "might ")
+SUBS(AR|AE|AT|AI|AO|AP, str_4CF76BBAFC5418A8, "since ")
+SUBS(AR|RGT|AE|AT|AI|AO|AP, str_312A2E7E56737AFE, "like ")
+SUBS(AR|AA|AE|AT|AO|AP, str_2B3F3F8FD6F81D18, "value ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_EDEECE8BA4D74D8C, "explain ")
+SUBS(AR|AS|AT|AN|AI|AP, str_2D5F3DAB5D1EE0CD, "books ")
+SUBS(AR|RGT|AS|AT|AN|AI|AP, str_CAB4630B3E51B22D, "myth ")
+SUBS(AR|AA|AE|AT|AI|AO, str_BE19F1863CB54849, "taken ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_22575911E719BC02, "experience ")
+SUBS(AR|AA|AT|AN|AI|AO, str_F371381A7FBC125D, "didn't ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_6EA0CAD85622D379, "i'd ")
+SUBS(AR|AS|AN|AI|AO|AP, str_3E10FCFA54E158F8, "world ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_8090D54F7F16580B, "old ")
+SUBS(AR|AA|AS|AT|AN|AO, str_695F4C5E27C2021C, "paying ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO, str_ED485F122FBF5650, "hoping ")
+SUBS(AR|AA|AT|AI|AO|AP, str_BC5A62377F628C2E, "talk ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_8553C9AE3540A19D, "it's ")
+SUBS(AR|AA|AS|AT|AI|AO, str_12D789B35778048E, "point ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO, str_516342B1ECA2730B, "nation ")
+SUBS(AR|AA|AE|AI|AO|AP, str_9D99660948094B78, "call ")
+SUBS(AR|RGT|AA|AE|AI|AO|AP, str_B74E83C046B23FC2, "later ")
+SUBS(AR|AA|AS|AT|AN|AP, str_88F447F6C429C220, "shop ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_39F5B3CF98CFD8B5, "may ")
+SUBS(AR|AA|AN|AI|AO|AP, str_6BC2917C61A3F92D, "that's ")
+SUBS(AR|RGT|AA|AN|AI|AO|AP, str_737BE95337E844AC, "hands ")
+SUBS(AR|AS|AT|AN|AO|AP, str_EAF049284E789A79, "bill ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_40A6847AD3E4A1D1, "million ")
+SUBS(AR|AA|AS|AI|AO|AP, str_4968598C78A4FB4D, "wasn't ")
+SUBS(AR|RGT|AA|AS|AI|AO|AP, str_7E0B205FA174F770, "law ")
+SUBS(AR|AA|AS|AE|AT|AN, str_69F05648D6473B51, "pub ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN, str_09F58C3D64737E0A, "hope ")
+SUBS(AR|AA|AE|AT|AI|AP, str_08E1BE82C44AD245, "speak ")
+SUBS(AR|RGT|AA|AE|AT|AI|AP, str_0532D3EC1FD0BA68, "escape ")
+SUBS(AR|AS|AT|AI|AO|AP, str_CC94E0C76922BF90, "will ")
+SUBS(AR|RGT|AS|AT|AI|AO|AP, str_0A9A527945928EFB, "look ")
+SUBS(AR|AA|AT|AN|AO|AP, str_F7CDC52FE2976DD4, "fall ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_2A2F016FAA9B3070, "i'm ")
+SUBS(AR|AE|AN|AI|AO|AP, str_9188264C284ED629, "themselves ")
+SUBS(AR|RGT|AE|AN|AI|AO|AP, str_5F50A83985AEACB6, "held ")
+SUBS(AR|AA|AE|AN|AI|AP, str_8DFFD42CE860597C, "came ")
+SUBS(AR|RGT|AA|AE|AN|AI|AP, str_6A27FF657EABC9BE, "made ")
+SUBS(AR|AS|AE|AT|AI|AO, str_AA7E98BADAB37A2A, "very ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO, str_8C5E240F4E5D3061, "your ")
+SUBS(AR|AS|AE|AN|AO|AP, str_8D52764B3308B085, "someone ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_0B0E955DAB01600D, "move ")
+SUBS(AR|AS|AE|AT|AN|AP, str_10128867CBAFEEA8, "busy ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_C031A6DB25D4AFF7, "house ")
+SUBS(AR|AS|AE|AN|AI|AO, str_43D073A61B4D28EA, "when ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_36FAD9241CEA5C82, "other ")
+SUBS(AR|AA|AS|AE|AI|AO, str_A93FC4E7A3AB3CA1, "water ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_B27709BF0298CE44, "ocean ")
+SUBS(AR|AA|AE|AN|AO|AP, str_FA45FD5460D2DE0C, "game ")
+SUBS(AR|RGT|AA|AE|AN|AO|AP, str_08DF25FB539B7130, "name ")
+SUBS(AR|AS|AE|AT|AO|AP, str_5D99B1A0E283597E, "soul ")
+SUBS(AR|RGT|AS|AE|AT|AO|AP, str_4927358DC229B618, "louis ")
+SUBS(AR|AS|AT|AN|AI|AO, str_DAE84F2729ACCE2B, "for ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_6D8F86A39402B401, "nothing ")
+SUBS(AR|AA|AE|AT|AN|AP, str_2CD669BD9740E2C9, "safe ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_E320ED557B21C7C3, "jump ")
+SUBS(AR|AA|AE|AT|AN|AO, str_5E0C8ECDADE5F1A0, "page ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_AD1AB4C08BF16CA6, "having ")
+SUBS(AR|AA|AS|AT|AO|AP, str_6EEA10216935E72D, "play ")
+SUBS(AR|RGT|AA|AS|AT|AO|AP, str_06FE528509A5B57E, "lay ")
+SUBS(AR|AS|AE|AT|AI|AP, str_FF228D3D8317FB83, "weeks ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_8D5265A24936F5EE, "keys ")
+SUBS(AR|AE|AT|AN|AO|AP, str_4F290479EC7B8012, "feel ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_B49C2360C17BFAA5, "life ")
+SUBS(AR|AS|AE|AT|AN|AI, str_30278AC8BAD5995C, "but ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_2044EBFCFC5E992B, "office ")
+SUBS(AR|AA|AS|AT|AN|AI, str_6C79F7FA2DF8C5A3, "day ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_5C1F7D75957CA201, "habit ")
+SUBS(AR|AA|AS|AE|AN|AO, str_6845B958D04E4FC6, "began ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_F68E672F0728D823, "joan ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_E0B528088F72D995, "became ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_8F9CB366A24B6DB9, "matthew ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_D895CF9C2FCAE9D4, "asked ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_4643015F5002ABFF, "make ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_F024C3F42062CAC2, "business ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_39E44B61B232DC17, "money ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_95C7F6F3D4DB5B15, "almost ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_61179DB6D77CCDC6, "normal ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_81D86634091300D7, "felt ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_EC81EEB3F21B0472, "left ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_D70EDAD8867014E8, "called ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_DD452F0E9D35762C, "large ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_0B68014AA9B44CC3, "across ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_B8729A7E003EEBD7, "local ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_0FD394108C563406, "phone ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO, str_59C6FA07ACC41B99, "heavy ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_0E857BEC949CC40A, "after ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_B44202A156C97D96, "happened ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_A199A8785F0B305B, "anything ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO, str_59404CE48B401EA7, "ordinary ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_A3D79ADD43575D94, "able ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_1B3C73CC12F8382A, "ebola ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_4D2A6306F9C9BFCB, "power ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO, str_291B6E5B19493008, "you're ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_28BB10C5BB93CDE6, "about ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_F8D04F9FB877451A, "hoped ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_7B8F91CB37DDB1F1, "simple ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_591BCA852B1294CC, "help ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_448C9E2516C09696, "school ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_CA73DC3F774CBABC, "more ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_7A84F6987C8A0811, "family ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_223DD41A813D045F, "many ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_A3E4FBB212A28B78, "course ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_1CD7FF66940DE6E1, "likely ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_C8DEFAE65FA4EF3E, "another ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_8E5A30364A943EC9, "edward ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_CF8005E3F33D2936, "days ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_096F40DBA124CEDA, "habits ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_DD746578C42672FD, "spoke ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_3B9FD8A0395168B4, "opposite ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_006F85EBC7D6A342, "against ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_114560D7A89BA1F4, "making ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_56B0C240EA9FE481, "people ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO|AP, str_B9DB7C8FDF935A94, "usually ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_606B2F10B55FE195, "always ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_8C3955AAA5717454, "national ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_DC7DFAB3AB8E58A3, "sometimes ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_3ED202F6EBEE1C48, "outside ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_2DCB6A06FF45764B, "from ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_101345D47E9C9CDE, "looking ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_6E7EEC08674ED6D1, "before ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_F35A484FAD9BBE28, "often ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_9F163FD928C775B2, "famous ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_3F67EE3EB98FBB4E, "maybe ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_156052B6D0CC2F4A, "place ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO|AP, str_3831167D4AD8D40A, "natural ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_AF21CBC44BF9F140, "already ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_83235A0FA2F65989, "would ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_DFEA45C24149232E, "looked ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_3B78B1B662DA2511, "perhaps ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_CF044FBEAC05C20D, "instead ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_1F550C2F963E4CE7, "table ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_6F239254D0D8ABBC, "major ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_4435AADD7147CC97, "probably ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_B36787B90CE5F35A, "important ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_719BC090B9A903EE, "possible ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_7C4D111A8B27C0F1, "impossible ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_C358A55785D991BA, "because ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_1D26BFD0E139E5CE, "empty ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_17DD5A4D81625F40, "around ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_96F62D82D3878045, "opened ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_84E788D5ABD94372, "really ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_6BB7E1A1CA75BFB5, "years ")
diff --git a/keyboards/gboards/dicts/aset/en-keymap.def b/keyboards/gboards/dicts/aset/en-keymap.def
new file mode 100644
index 00000000000..d8d721f1b72
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/en-keymap.def
@@ -0,0 +1,403 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AP, KC_P)
+PRES(AI, KC_I)
+PRES(AT, KC_T)
+PRES(AE, KC_E)
+PRES(AA, KC_A)
+PRES(AO, KC_O)
+PRES(AS, KC_S)
+PRES(AN, KC_N)
+PRES(AS|AN, KC_J)
+PRES(AA|AI, KC_Z)
+PRES(AE|AT, KC_R)
+PRES(AA|AE, KC_X)
+PRES(AT|AI, KC_V)
+PRES(AN|AI, KC_H)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+PRES(AN|AP, KC_M)
+PRES(AE|AP, KC_QUOT)
+PRES(AA|AT, KC_F)
+PRES(AA|AS, KC_W)
+PRES(AO|AP, KC_SCLN)
+PRES(AS|AI, KC_K)
+PRES(AS|AE, KC_D)
+PRES(AS|AO, KC_DOT)
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AE|AN, KC_Y)
+PRES(AA|AN, KC_Q)
+PRES(AN|AO, KC_U)
+PRES(AE|AI, KC_COMM)
+PRES(AT|AP, KC_BSPC)
+PRES(AT|AN, KC_B)
+PRES(AE|AO, KC_MINS)
+PRES(AI|AO, KC_L)
+PRES(AT|AO, KC_G)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+PRES(AS|AT, KC_C)
+PRES(AA|AP, KC_SLSH)
+SUBS(AR|AI|AO|AP, str_E21E9A5405E9A529, "pool ")
+SUBS(AR|AN|AO|AP, str_D443D6F10491FB2B, "up ")
+SUBS(AR|AA|AS|AE, str_C8F40BD7102B7E24, "we ")
+SUBS(AR|AS|AE|AT, str_FA675AA04C2E42E3, "set ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AA|AE|AT, str_83C8874562C3DF81, "are ")
+SUBS(AR|AS|AN|AP, str_A38FEA2A97C8F836, "ms ")
+SUBS(AR|AE|AI|AP, str_E5D0DBF6833C9487, "'i ")
+SUBS(AR|AA|AS|AT, str_51931D246213D5BA, "fact ")
+SUBS(AR|AE|AN|AO, str_E429BF3EE734FF3A, "you ")
+SUBS(AR|AA|AI|AP, str_9EFFC1EA3EEA7DCB, "pizza ")
+SUBS(AR|AS|AT|AN, str_F270B528E852FC3E, "bc ")
+SUBS(AR|AA|AT|AN, str_538F2D3A0A77D97B, "fan ")
+SUBS(AR|AS|AT|AO, str_F33C271EA486B8BF, "cost ")
+SUBS(AR|AN|AI|AP, str_ECB888FDF52591CF, "him ")
+SUBS(AR|AE|AO|AP, str_AAB1D405F8D273AF, "pope ")
+SUBS(AR|AE|AT|AP, str_342F8CACA85F0AD6, "per ")
+SUBS(AR|AN|AI|AO, str_C7CD45D62BA33F37, "oh ")
+SUBS(AR|AA|AS|AO, str_F8126BA90C544306, "wow ")
+SUBS(AR|AA|AS|AT|AO, str_035228752979D35D, "two ")
+SUBS(AR|AE|AN|AO|AP, str_39E44B61B232DC17, "money ")
+SUBS(AR|AE|AI|AO|AP, str_56B0C240EA9FE481, "people ")
+SUBS(AR|AA|AS|AT|AN, str_90AB495ADEB4039C, "can ")
+SUBS(AR|AS|AE|AO|AP, str_329F2D4D4E320928, "possessed ")
+SUBS(AR|AS|AE|AT|AN, str_FA42CAAA8023B228, "best ")
+SUBS(AR|AE|AN|AI|AP, str_2A2F016FAA9B3070, "i'm ")
+SUBS(AR|AA|AE|AT|AI, str_40711EF1BB6CE033, "five ")
+SUBS(AR|AA|AT|AN|AO, str_28BB10C5BB93CDE6, "about ")
+SUBS(AR|AA|AS|AO|AP, str_4D4A66AB4047501D, "soap ")
+SUBS(AR|AA|AE|AN|AO, str_7D50A0C65C92712F, "anyone ")
+SUBS(AR|AA|AE|AI|AO, str_4D67956A1937C06A, "alex ")
+SUBS(AR|AA|AN|AO|AP, str_CB3AE7249E334094, "mao ")
+SUBS(AR|AE|AN|AI|AO, str_67863008AE8FD451, "only ")
+SUBS(AR|AA|AS|AE|AT, str_467AF751A93D5FEA, "were ")
+SUBS(AR|AA|AT|AI|AO, str_F7CDC52FE2976DD4, "fall ")
+SUBS(AR|AS|AE|AT|AI, str_A9281666A28E6EC3, "tried ")
+SUBS(AR|AA|AT|AN|AP, str_4EF41F48D393118D, "mba ")
+SUBS(AR|AT|AI|AO|AP, str_C97DA9851380EBAC, "pilot ")
+SUBS(AR|AE|AT|AO, str_D3479574413D1475, "get ")
+SUBS(AR|RGT|AE|AT|AO, str_B97355B02DCE4543, "or ")
+SUBS(AR|AE|AT|AN, str_7D2440FBBF9D0256, "be ")
+SUBS(AR|RGT|AE|AT|AN, str_EEF73D4A4AA7E9A8, "yet ")
+SUBS(AR|AE|AI|AO, str_05ED48987A1828F9, "el ")
+SUBS(AR|RGT|AE|AI|AO, str_E7368ADE4F929A85, "lie ")
+SUBS(AR|AS|AI|AP, str_50E8EDA878796D86, "sip ")
+SUBS(AR|RGT|AS|AI|AP, str_277D4DE77C229423, "piss ")
+SUBS(AR|AT|AI|AO, str_EAA77E250F575DF4, "till ")
+SUBS(AR|RGT|AT|AI|AO, str_412CDD1E78EA9B08, "lot ")
+SUBS(AR|AE|AN|AP, str_49B1300C7F5B31D3, "enemy ")
+SUBS(AR|RGT|AE|AN|AP, str_A0AA5B74C096E40B, "my ")
+SUBS(AR|AA|AI|AO, str_9F8EB086C328F80A, "all ")
+SUBS(AR|RGT|AA|AI|AO, str_7E7904D7326BCF29, "la ")
+SUBS(AR|AT|AN|AO, str_30278AC8BAD5995C, "but ")
+SUBS(AR|RGT|AT|AN|AO, str_3F3B1F8B5A3E409E, "not ")
+SUBS(AR|AT|AO|AP, str_8574F11BEB82545C, "top ")
+SUBS(AR|RGT|AT|AO|AP, str_028BB7B551A4BD43, "pot ")
+SUBS(AR|AA|AE|AI, str_2F03BA66EA35FE84, "xiii ")
+SUBS(AR|RGT|AA|AE|AI, str_D2F95EA81F7C61D5, "ix ")
+SUBS(AR|AA|AE|AN, str_83396DA0D7927D05, "any ")
+SUBS(AR|RGT|AA|AE|AN, str_78E990102B716EE8, "nay ")
+SUBS(AR|AS|AT|AI, str_2B382E2C87F633B5, "sit ")
+SUBS(AR|RGT|AS|AT|AI, str_732FCC97258E0FD6, "its ")
+SUBS(AR|AA|AN|AP, str_77BE4D44A5F2AD27, "am ")
+SUBS(AR|RGT|AA|AN|AP, str_7814AB9A9D941FFB, "man ")
+SUBS(AR|AA|AS|AN, str_45A403A4960EE226, "san ")
+SUBS(AR|RGT|AA|AS|AN, str_FC3367E0C6099BCA, "jaw ")
+SUBS(AR|AA|AT|AO, str_353D7D379A2BBFCE, "ago ")
+SUBS(AR|RGT|AA|AT|AO, str_BF38370C83727D39, "of ")
+SUBS(AR|AA|AS|AP, str_40CAD0466FECC661, "sap ")
+SUBS(AR|RGT|AA|AS|AP, str_4DFAE898587FE4FE, "pass ")
+SUBS(AR|AS|AE|AP, str_851EF570F98047B6, "deep ")
+SUBS(AR|RGT|AS|AE|AP, str_9B6ECB908551EEF3, "'s ")
+SUBS(AR|AS|AE|AI, str_3E9F631F6868B537, "did ")
+SUBS(AR|RGT|AS|AE|AI, str_BE08333590E1E58A, "kids ")
+SUBS(AR|AS|AE|AO, str_16AE4BE38D2F26C0, "do ")
+SUBS(AR|RGT|AS|AE|AO, str_90B2E8A16883F3EC, "odd ")
+SUBS(AR|AA|AT|AI, str_3D1300B21B8F08E8, "fit ")
+SUBS(AR|RGT|AA|AT|AI, str_D7978D4AE69E4592, "if ")
+SUBS(AR|AA|AS|AI, str_AFD48C0D96C26C82, "ask ")
+SUBS(AR|RGT|AA|AS|AI, str_31F7D241519F6E20, "kaa ")
+SUBS(AR|AT|AN|AI, str_C13C85985E26BFC4, "bit ")
+SUBS(AR|RGT|AT|AN|AI, str_D5ACE27258AF148F, "hit ")
+SUBS(AR|AS|AE|AN, str_9CFD6F6C59053F15, "eyes ")
+SUBS(AR|RGT|AS|AE|AN, str_57FCD18102003294, "need ")
+SUBS(AR|AS|AN|AI, str_A4290D8DEB996891, "skin ")
+SUBS(AR|RGT|AS|AN|AI, str_E9D65B1F0CC7B588, "his ")
+SUBS(AR|AA|AT|AP, str_FDF976B399FBC710, "tap ")
+SUBS(AR|RGT|AA|AT|AP, str_7A06301D23DD2E0F, "pat ")
+SUBS(AR|AS|AN|AO, str_30A932E1CBDCE716, "soon ")
+SUBS(AR|RGT|AS|AN|AO, str_93E9AC18AF76041F, "us ")
+SUBS(AR|AT|AI|AP, str_EDDB4B5D8E6E6CF7, "tip ")
+SUBS(AR|RGT|AT|AI|AP, str_6A240DF3344885E8, "pit ")
+SUBS(AR|AE|AN|AI, str_7E3D8B1C859776CA, "eh ")
+SUBS(AR|RGT|AE|AN|AI, str_C4D48E3111A94BAB, "he ")
+SUBS(AR|AE|AT|AI, str_F867205888E811D6, "ever ")
+SUBS(AR|RGT|AE|AT|AI, str_28326B589AD375ED, "ive ")
+SUBS(AR|AS|AI|AO, str_05076833F755C857, "skills ")
+SUBS(AR|RGT|AS|AI|AO, str_0A9A527945928EFB, "look ")
+SUBS(AR|AA|AN|AI, str_BF40C27E59DAAC7B, "ah ")
+SUBS(AR|RGT|AA|AN|AI, str_BB30CFFA4957C51C, "han ")
+SUBS(AR|AA|AT|AN|AI|AP, str_BC2C779464890843, "path ")
+SUBS(AR|AA|AS|AE|AT|AI, str_F3E5067A2519AD56, "first ")
+SUBS(AR|AA|AS|AT|AI|AP, str_E784B575D979691F, "pack ")
+SUBS(AR|AA|AS|AE|AO|AP, str_B2BF1DD0344AF8AF, "exposed ")
+SUBS(AR|AA|AS|AT|AO|AP, str_AD78DF7DDE0D91B8, "gaps ")
+SUBS(AR|AA|AS|AT|AN|AO, str_5146C3491DA57E2B, "town ")
+SUBS(AR|AT|AN|AI|AO|AP, str_9AE637BD5FD038A8, "might ")
+SUBS(AR|AS|AE|AI|AO, str_30F2D4838947F30C, "else ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_312A2E7E56737AFE, "like ")
+SUBS(AR|AA|AS|AE|AI, str_B39CDB39BA4EDFE7, "said ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_F180086B81853B17, "idea ")
+SUBS(AR|AA|AI|AO|AP, str_36DDB482F63F4218, "apollo ")
+SUBS(AR|RGT|AA|AI|AO|AP, str_42719932F51C5677, "lap ")
+SUBS(AR|AS|AE|AN|AO, str_C9F20BC0A0F63318, "done ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_FE0131033300781A, "use ")
+SUBS(AR|AA|AS|AN|AI, str_BB64A6A5972FD42C, "wish ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_F9F466F11B521E6F, "has ")
+SUBS(AR|AT|AN|AO|AP, str_C7B05810B9878F2F, "tom ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_9B3F02A3D0BBA370, "put ")
+SUBS(AR|AT|AN|AI|AP, str_AF1FE256DC6BB784, "tim ")
+SUBS(AR|RGT|AT|AN|AI|AP, str_3EAADEEF96AB44F4, "ibm ")
+SUBS(AR|AA|AS|AE|AO, str_4436AAC714307C5B, "wood ")
+SUBS(AR|RGT|AA|AS|AE|AO, str_E10AD3B44A42A964, "owed ")
+SUBS(AR|AE|AT|AN|AP, str_BF99AB6937309FE2, "remember ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_10A1A694946FA759, "mr ")
+SUBS(AR|AS|AT|AN|AO, str_0F2C6B822BBFF497, "cut ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_C039D2A5D9FC5D72, "just ")
+SUBS(AR|AS|AT|AI|AO, str_503F03DCEE6CB398, "still ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_4DC1C2755B24D34B, "lost ")
+SUBS(AR|AS|AE|AI|AP, str_D50EF184D7DE152A, "spies ")
+SUBS(AR|RGT|AS|AE|AI|AP, str_3BE3101B06222C42, "keep ")
+SUBS(AR|AA|AT|AN|AI, str_DA20B440A7186A4B, "that ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_C58EDF9C4F3ABF68, "hat ")
+SUBS(AR|AA|AS|AI|AO, str_CC94E0C76922BF90, "will ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_0686A7F7D30D643C, "low ")
+SUBS(AR|AA|AE|AT|AP, str_56EEBB00F4636C97, "appear ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_2569286750C7B4F4, "part ")
+SUBS(AR|AE|AT|AI|AP, str_704D673E0131D56E, "trip ")
+SUBS(AR|RGT|AE|AT|AI|AP, str_67BF6CF47B192C42, "i've ")
+SUBS(AR|AA|AS|AN|AO, str_C1060126A1DEC646, "won ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_78916562F1D9BFAA, "now ")
+SUBS(AR|AS|AI|AO|AP, str_1C74789AE46C4DA7, "slip ")
+SUBS(AR|RGT|AS|AI|AO|AP, str_0EB8B6118D400DE1, "lips ")
+SUBS(AR|AS|AN|AI|AO, str_5D99B1A0E283597E, "soul ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_B24523534C6D82C9, "john ")
+SUBS(AR|AA|AS|AE|AN, str_C1FDC4AB8597A676, "and ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_C161ABA85FEDF657, "new ")
+SUBS(AR|AS|AE|AN|AP, str_ABDD78CFD9534F96, "seemed ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_43F03EE41C293B0F, "jem ")
+SUBS(AR|AE|AT|AI|AO, str_7C0F5E706EA39A05, "tell ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_2CCE6615DDD45C8E, "over ")
+SUBS(AR|AS|AT|AI|AP, str_ADFCEE2911E10044, "tips ")
+SUBS(AR|RGT|AS|AT|AI|AP, str_8D03100AFD2419C2, "pick ")
+SUBS(AR|AE|AT|AN|AI, str_0C571CCD7FA5FAEF, "the ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_8BA7632DC4B89BB1, "her ")
+SUBS(AR|AA|AS|AN|AP, str_020E794D3DE91D12, "sam ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_84EA13866E40CFF7, "mass ")
+SUBS(AR|AS|AN|AI|AP, str_E05BFDB0A1C5FA8B, "ship ")
+SUBS(AR|RGT|AS|AN|AI|AP, str_EE6DB6F94A1DBF2A, "miss ")
+SUBS(AR|AS|AE|AT|AO, str_0806A00E99F47F1E, "good ")
+SUBS(AR|RGT|AS|AE|AT|AO, str_EC35C4B5B1F55FBB, "order ")
+SUBS(AR|AA|AE|AT|AN, str_7AAFE2EE07648FED, "ran ")
+SUBS(AR|RGT|AA|AE|AT|AN, str_8F95067BEB108348, "next ")
+SUBS(AR|AS|AT|AO|AP, str_CB532D5DED67E46B, "stop ")
+SUBS(AR|RGT|AS|AT|AO|AP, str_993FB3354F37599E, "post ")
+SUBS(AR|AS|AT|AN|AI, str_F67830C3E4E560AB, "this ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_622075F6AD6ED0AF, "nick ")
+SUBS(AR|AE|AT|AO|AP, str_F3B3DFDAE9EB2E0E, "report ")
+SUBS(AR|RGT|AE|AT|AO|AP, str_E77049B6FC0B816E, "poor ")
+SUBS(AR|AA|AS|AT|AI, str_B9BD537963CF3EDE, "wait ")
+SUBS(AR|RGT|AA|AS|AT|AI, str_67001204CE551856, "isaac ")
+SUBS(AR|AS|AN|AO|AP, str_E3374BF3CE8F906D, "sum ")
+SUBS(AR|RGT|AS|AN|AO|AP, str_E320ED557B21C7C3, "jump ")
+SUBS(AR|AA|AT|AO|AP, str_69EA1F9262FF90F7, "gap ")
+SUBS(AR|RGT|AA|AT|AO|AP, str_E4D8FCFFAEC006E6, "potato ")
+SUBS(AR|AA|AE|AT|AO, str_DAE84F2729ACCE2B, "for ")
+SUBS(AR|RGT|AA|AE|AT|AO, str_A9A8259196570018, "offer ")
+SUBS(AR|AA|AN|AI|AP, str_B934CCC840128CD9, "aim ")
+SUBS(AR|RGT|AA|AN|AI|AP, str_968AF4858B6521BE, "pain ")
+SUBS(AR|AE|AT|AN|AO, str_054DDEADD30B1F66, "turn ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_8C5E240F4E5D3061, "your ")
+SUBS(AR|AA|AN|AI|AO, str_C99D050CA3B2DCC7, "annual ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_54DEAA1A3F19A7FC, "hall ")
+SUBS(AR|AA|AE|AN|AI, str_B0D068D005493603, "annie ")
+SUBS(AR|RGT|AA|AE|AN|AI, str_0749613DBDDF6C21, "yeah ")
+SUBS(AR|AA|AS|AT|AP, str_95C59AB8275627DB, "cap ")
+SUBS(AR|RGT|AA|AS|AT|AP, str_718051F50C1745F9, "past ")
+SUBS(AR|AA|AE|AN|AP, str_E2E19588C5B3DEE3, "an' ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_223DD41A813D045F, "many ")
+SUBS(AR|AS|AE|AT|AP, str_72A3E3974353AD96, "step ")
+SUBS(AR|RGT|AS|AE|AT|AP, str_D4E79D57ECF89EE4, "press ")
+SUBS(AR|AA|AS|AE|AP, str_C1951FB3B98123CF, "we'd ")
+SUBS(AR|RGT|AA|AS|AE|AP, str_D6DAEAB665CE4271, "passed ")
+SUBS(AR|AT|AN|AI|AO, str_EF6EC7C5B5FE957F, "thought ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_E9481F155C267491, "into ")
+SUBS(AR|AS|AE|AN|AI, str_B164BA3889B2FB9E, "she ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_4619E5AA3B8E6B39, "kind ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_F1CF6AF5D5BFD0AF, "without ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_C8DEFAE65FA4EF3E, "another ")
+SUBS(AR|AA|AS|AT|AI|AO, str_9D99660948094B78, "call ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO, str_A57E20B51804CF2C, "last ")
+SUBS(AR|AA|AS|AE|AN|AI, str_43D073A61B4D28EA, "when ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_B8157EA41E09D921, "had ")
+SUBS(AR|AA|AS|AT|AN|AP, str_389AFA2E457B3E69, "camp ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_A9394C08A99670E3, "pants ")
+SUBS(AR|AA|AN|AI|AO|AP, str_279C5D17219228B4, "animal ")
+SUBS(AR|RGT|AA|AN|AI|AO|AP, str_DEBD70C653B8860B, "human ")
+SUBS(AR|AS|AE|AT|AN|AP, str_92C5DFE410A6CB2C, "spent ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_E7AFF3FB05CB8051, "mrs ")
+SUBS(AR|AS|AT|AN|AO|AP, str_430B184EA4F97301, "common ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_502F482B79087297, "most ")
+SUBS(AR|AA|AS|AN|AO|AP, str_BA3809CE0E475488, "woman ")
+SUBS(AR|RGT|AA|AS|AN|AO|AP, str_1E4A792A7CF7D30C, "mason ")
+SUBS(AR|AS|AN|AI|AO|AP, str_88F447F6C429C220, "shop ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_4E775E54248555FE, "mission ")
+SUBS(AR|AS|AT|AN|AI|AP, str_A523540C97D0BDFB, "smith ")
+SUBS(AR|RGT|AS|AT|AN|AI|AP, str_5640D73DE51D8F81, "pitch ")
+SUBS(AR|AE|AT|AI|AO|AP, str_1A4EF315EA80344F, "grip ")
+SUBS(AR|RGT|AE|AT|AI|AO|AP, str_A72C9EA66C108632, "prove ")
+SUBS(AR|AS|AE|AN|AI|AO, str_6C75DAC99724579F, "should ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_C031A6DB25D4AFF7, "house ")
+SUBS(AR|AA|AS|AE|AN|AP, str_C1CFDEE565A45A39, "same ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_6A27FF657EABC9BE, "made ")
+SUBS(AR|AA|AS|AT|AN|AI, str_87226571AE131D8A, "with ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_7F1DF9F101812702, "jack ")
+SUBS(AR|AA|AS|AE|AT|AN, str_79D415871F5A4054, "went ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN, str_6BB7E1A1CA75BFB5, "years ")
+SUBS(AR|AS|AE|AT|AN|AO, str_A3E4FBB212A28B78, "course ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_BA082B87D184320C, "once ")
+SUBS(AR|AA|AE|AT|AN|AI, str_0FE57C284CD1D01B, "father ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_89E5D4BB42BF5AC6, "have ")
+SUBS(AR|AA|AE|AI|AO|AP, str_F7D795E2DE04290F, "apple ")
+SUBS(AR|RGT|AA|AE|AI|AO|AP, str_B31539955F014950, "pale ")
+SUBS(AR|AS|AT|AI|AO|AP, str_FB0F58059CAD1F9C, "split ")
+SUBS(AR|RGT|AS|AT|AI|AO|AP, str_C319BFFA441D1BA3, "politics ")
+SUBS(AR|AS|AE|AN|AI|AP, str_89C08DE82ADCA512, "she'd ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_0A7ED86EF765AFF1, "mind ")
+SUBS(AR|AA|AT|AN|AO|AP, str_612AE2FB632AD051, "among ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_49324C2305B3B483, "obama ")
+SUBS(AR|AS|AT|AN|AI|AO, str_AF3D9EAA19F822D9, "such ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_101345D47E9C9CDE, "looking ")
+SUBS(AR|AA|AT|AN|AI|AO, str_25F54E15B0B3ABC1, "again ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_AD1AB4C08BF16CA6, "having ")
+SUBS(AR|AS|AE|AI|AO|AP, str_DD746578C42672FD, "spoke ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_724168D3AC384FD6, "people's ")
+SUBS(AR|AA|AS|AE|AI|AP, str_08E1BE82C44AD245, "speak ")
+SUBS(AR|RGT|AA|AS|AE|AI|AP, str_95AF45DBDC3B3D83, "paid ")
+SUBS(AR|AS|AE|AT|AI|AO, str_9F3EBE9397348D28, "told ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO, str_95035F1A76A4B5DB, "lives ")
+SUBS(AR|AE|AN|AI|AO|AP, str_A6ED3464B310461D, "employee ")
+SUBS(AR|RGT|AE|AN|AI|AO|AP, str_AC07FAFFDC50A99F, "home ")
+SUBS(AR|AA|AE|AN|AI|AP, str_E6E33C0422C174D9, "examine ")
+SUBS(AR|RGT|AA|AE|AN|AI|AP, str_ACD7C28D984A2833, "happy ")
+SUBS(AR|AE|AT|AN|AI|AO, str_4527C3E99AECDB31, "through ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_36FAD9241CEA5C82, "other ")
+SUBS(AR|AE|AT|AN|AO|AP, str_6AEDC2564217B9FE, "room ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_CA73DC3F774CBABC, "more ")
+SUBS(AR|AA|AE|AT|AN|AO, str_6E7EEC08674ED6D1, "before ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_F35A484FAD9BBE28, "often ")
+SUBS(AR|AA|AS|AN|AI|AP, str_2411238235BDC80F, "spanish ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_0ED035B7C06D15D8, "mask ")
+SUBS(AR|AA|AE|AT|AO|AP, str_0C644F2339AF7F37, "rapport ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_5E0C8ECDADE5F1A0, "page ")
+SUBS(AR|AA|AE|AT|AI|AO, str_81D86634091300D7, "felt ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_B49C2360C17BFAA5, "life ")
+SUBS(AR|AA|AS|AN|AI|AO, str_4E6E8E4C9B45508F, "who ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_FAA922DD96A4D310, "how ")
+SUBS(AR|AA|AS|AE|AT|AP, str_66F9514DBFA60EF2, "we're ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_854113AE64CFBDCB, "perfect ")
+SUBS(AR|AA|AS|AE|AI|AO, str_5A3CC09208D67861, "well ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_AD5C8C5F9A14AB9D, "lead ")
+SUBS(AR|AS|AE|AN|AO|AP, str_29703C252684465E, "some ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_96F62D82D3878045, "opened ")
+SUBS(AR|AA|AS|AI|AO|AP, str_0C564574F3F9E640, "slap ")
+SUBS(AR|RGT|AA|AS|AI|AO|AP, str_F36F1306B68B4B29, "pillow ")
+SUBS(AR|AS|AE|AT|AI|AP, str_8F0137935E32C458, "despite ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_8553C9AE3540A19D, "it's ")
+SUBS(AR|AA|AE|AT|AN|AP, str_D3DB4C04069FC93F, "army ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_C7589DCE3D265D20, "matter ")
+SUBS(AR|AA|AS|AE|AN|AO, str_1D76C98090617D6E, "down ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_603E54921B1E4A7D, "owned ")
+SUBS(AR|AA|AS|AE|AT|AO, str_6FD3D941462F3451, "words ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO, str_C22A200B9829FEE1, "offered ")
+SUBS(AR|AS|AE|AT|AO|AP, str_97D5E1E2DDCE0F5D, "stopped ")
+SUBS(AR|RGT|AS|AE|AT|AO|AP, str_5204C59B3BF29E2F, "process ")
+SUBS(AR|AA|AE|AN|AI|AO, str_88405EF2E946D1D6, "alone ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_06FE528509A5B57E, "lay ")
+SUBS(AR|AE|AT|AN|AI|AP, str_224997ADD6DF35BA, "them ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_03B00766F858AC97, "prevent ")
+SUBS(AR|AS|AE|AT|AN|AI, str_5CDCF79352E2D725, "these ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_020C4055128AF08A, "interest ")
+SUBS(AR|AA|AE|AT|AI|AP, str_5905044D20CB233F, "repair ")
+SUBS(AR|RGT|AA|AE|AT|AI|AP, str_1CF1E20A6157822C, "private ")
+SUBS(AR|AA|AT|AI|AO|AP, str_3A10D175C336684E, "flip ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_0A475BE09185AD1F, "plato ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_FE2065C67E4B5B94, "shame ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_4643015F5002ABFF, "make ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_C358A55785D991BA, "because ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO, str_A6F5E14196CFA092, "understand ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_CFB2C1EB66ED6A6F, "example ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_6EEA10216935E72D, "play ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_8A65747E667F35ED, "simply ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_68C5AA31332067D5, "pulled ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_841274C574BC6F3C, "small ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_62190B4341383730, "plans ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_7ABF668E1E4D2979, "we'll ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_6E1297423B061106, "please ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_AF422F414139D629, "coming ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_401EFB5649B2EBB4, "much ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_C6F4A4120E3273E8, "government ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_88CA21737CCD8555, "mother ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_58DBAC3080F43A2C, "april ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO|AP, str_0962EABEC6DBB122, "plate ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_8DFFD42CE860597C, "came ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_BC5AF0DFB06127DD, "parents ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_2E642CEEC56D4266, "film ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_ED3D57E7A6CC9262, "imagination ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_EC4217A15A7E46CA, "where ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_DA7F1A6E228C1A5B, "heard ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_9F163FD928C775B2, "famous ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_83D651B957F56E60, "moscow ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_8CCEE136EC2CB2E7, "corporate ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO|AP, str_4D2A6306F9C9BFCB, "power ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_CD4ABC5E1C8E848A, "could ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_87C388038CCDA852, "others ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_F371381A7FBC125D, "didn't ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_18EB5CEDC005C927, "isn't ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_2A1FE2610765B6AF, "work ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO, str_1160B06F4F7112E2, "least ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_A784182F63EBD443, "we've ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_4F6C506138FB813D, "paris ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_2DCB6A06FF45764B, "from ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_C17A5BF262856807, "program ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_2457621BE8FFDD2E, "don't ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_938C6DD7DE962990, "person ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_7B4540ACD20A8E39, "women ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_9ABDD772A92586B9, "paused ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_A069AFF6B6716321, "capital ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_F0F9720F9F9B0214, "political ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_9BF471CFA3E278C9, "captain ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_FD725E8016F75D43, "match ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_61FF1AE647568C2A, "remain ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_221AC40E44A1566C, "haven't ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_2FF09ABA6AA2E0E4, "replied ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_323C08EE5775F9CB, "police ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_83235A0FA2F65989, "would ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_B9DB7C8FDF935A94, "usually ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_B11AEB82875D9459, "special ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_156052B6D0CC2F4A, "place ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_AF21CBC44BF9F140, "already ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_987D112C04ADE934, "however ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_7A84F6987C8A0811, "family ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_B36787B90CE5F35A, "important ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_95C7F6F3D4DB5B15, "almost ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_114560D7A89BA1F4, "making ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_D6EE20239053CED9, "something ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_719BC090B9A903EE, "possible ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_6BC2917C61A3F92D, "that's ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_3B78B1B662DA2511, "perhaps ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_2BFAFC3EB8546058, "company ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_6F239254D0D8ABBC, "major ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_E80104C0BEF4DB70, "explained ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_5DE5DC9F9633371B, "played ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_6EBFDE396F485CF3, "especially ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_DB27096F0EC176E2, "himself ")
diff --git a/keyboards/gboards/dicts/aset/es-keymap.def b/keyboards/gboards/dicts/aset/es-keymap.def
new file mode 100644
index 00000000000..90eb8a9c689
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/es-keymap.def
@@ -0,0 +1,389 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AP, KC_P)
+PRES(AE, KC_E)
+PRES(AI, KC_I)
+PRES(AO, KC_O)
+PRES(AA, KC_A)
+PRES(AN, KC_N)
+PRES(AS, KC_S)
+PRES(AT, KC_T)
+PRES(AA|AP, KC_QUOT)
+PRES(AA|AN, KC_Q)
+PRES(AE|AP, KC_QUOT)
+PRES(AO|AP, KC_SCLN)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+PRES(AE|AT, KC_R)
+PRES(AT|AI, KC_V)
+PRES(AT|AO, KC_G)
+PRES(AA|AS, KC_W)
+PRES(AA|AE, KC_X)
+PRES(AS|AT, KC_C)
+PRES(AN|AO, KC_U)
+PRES(AT|AN, KC_B)
+PRES(AA|AI, KC_Z)
+PRES(AE|AN, KC_Y)
+PRES(AS|AN, KC_J)
+PRES(AS|AO, KC_DOT)
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AS|AI, KC_K)
+PRES(AE|AI, KC_COMM)
+PRES(AN|AI, KC_H)
+PRES(AT|AP, KC_BSPC)
+PRES(AN|AP, KC_M)
+PRES(AS|AE, KC_D)
+PRES(AE|AO, KC_MINS)
+PRES(AI|AO, KC_L)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+PRES(AA|AT, KC_F)
+SUBS(AR|AN|AI|AP, str_DD31FA4C91A58242, "mi ")
+SUBS(AR|AA|AO|AP, str_D1611781075D2D9C, "popa ")
+SUBS(AR|AS|AE|AO, str_17D1C10C08DF4AD2, "dos ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AA|AT|AN, str_F897A5516019E357, "tan ")
+SUBS(AR|AA|AS|AE, str_50DEB8798435C793, "esa ")
+SUBS(AR|AE|AN|AO, str_B35C3D21350CF155, "yo ")
+SUBS(AR|AA|AT|AI, str_E7CDB1C1B374D11A, "va ")
+SUBS(AR|AS|AN|AI, str_55863E4A819B49C1, "sin ")
+SUBS(AR|AN|AO|AP, str_30C2B43BBCEDE1E1, "puno ")
+SUBS(AR|AS|AE|AT, str_7533AF731BE1BC8B, "ser ")
+SUBS(AR|AE|AN|AP, str_5140BEC191346017, "me ")
+SUBS(AR|AS|AE|AN, str_1C1F25487A3242E2, "deje ")
+SUBS(AR|AI|AO|AP, str_B5B1422F3FD01968, "pollo ")
+SUBS(AR|AE|AT|AN, str_5E7FFBEBF6AB0C31, "entre ")
+SUBS(AR|AT|AN|AI, str_7900A4063D4CBBC0, "ibn ")
+SUBS(AR|AS|AO|AP, str_3EF10ED805CC1C44, "pos ")
+SUBS(AR|AE|AI|AP, str_A491E07566DCBCCE, "pie ")
+SUBS(AR|AT|AO|AP, str_989F8AEF9B574D84, "opto ")
+SUBS(AR|AA|AE|AP, str_2481C00632CA30D3, "pa' ")
+SUBS(AR|AA|AI|AP, str_02F342C78B0C6C01, "paz ")
+SUBS(AR|AS|AT|AO, str_0351BD49ED64AC3B, "toco ")
+SUBS(AR|AE|AT|AP, str_D89F06941F4B44CE, "peter ")
+SUBS(AR|AS|AE|AP, str_431A39591B2ACBF3, "pese ")
+SUBS(AR|AA|AS|AP, str_C4E57FF7A10C22EC, "pasa ")
+SUBS(AR|AA|AS|AT, str_AEE6EBDC4ABDC3CD, "casa ")
+SUBS(AR|AN|AI|AO, str_9C46BB6CC5E90EC7, "nino ")
+SUBS(AR|AA|AE|AT, str_0437C1EBD8E5369E, "era ")
+SUBS(AR|AA|AT|AI|AP, str_5A09773083420344, "tapia ")
+SUBS(AR|AS|AE|AI|AP, str_6F968C7D36E5FB46, "pies ")
+SUBS(AR|AA|AS|AE|AT, str_75DF9DA7D504F48F, "esta ")
+SUBS(AR|AE|AI|AO|AP, str_D9D61321CCA0806E, "piel ")
+SUBS(AR|AE|AT|AN|AI, str_5ABF3B03AD7D60C8, "bien ")
+SUBS(AR|AA|AE|AN|AI, str_FAD1D7AF4C0C0252, "hay ")
+SUBS(AR|AA|AS|AT|AO, str_8B25EEAAE9A0AF25, "cosas ")
+SUBS(AR|AE|AN|AI|AO, str_825C50073E75911E, "hoy ")
+SUBS(AR|AA|AS|AI|AP, str_D44E5D8ED960FACD, "pais ")
+SUBS(AR|AA|AS|AT|AN, str_C45142C704A9D613, "santa ")
+SUBS(AR|AS|AE|AT|AN, str_0C3D18A66DA7E905, "debe ")
+SUBS(AR|AA|AE|AN|AO, str_6A810E6F1345F79D, "que ")
+SUBS(AR|AA|AS|AT|AI, str_59476CD5B5A37FAB, "casi ")
+SUBS(AR|AA|AS|AE|AO, str_9B9896941ABC7ABF, "dado ")
+SUBS(AR|AS|AT|AO|AP, str_74EB943165D62B4B, "poco ")
+SUBS(AR|AA|AE|AI|AP, str_9C44889EA41AEDDD, "pieza ")
+SUBS(AR|AS|AN|AI|AP, str_2AF23F7FD8046F6F, "mis ")
+SUBS(AR|AE|AT|AI, str_B617CB13CF22666C, "ver ")
+SUBS(AR|RGT|AE|AT|AI, str_D1DCEFF648227DE8, "ir ")
+SUBS(AR|AA|AI|AO, str_C49001FAA655F248, "al ")
+SUBS(AR|RGT|AA|AI|AO, str_7E7904D7326BCF29, "la ")
+SUBS(AR|AS|AE|AI, str_0E524646FABCAF85, "seis ")
+SUBS(AR|RGT|AS|AE|AI, str_E92B6095BA22C49B, "kid ")
+SUBS(AR|AA|AS|AN, str_45A403A4960EE226, "san ")
+SUBS(AR|RGT|AA|AS|AN, str_16D6BE915787F782, "ja ")
+SUBS(AR|AA|AN|AO, str_0F85B9710F065575, "aun ")
+SUBS(AR|RGT|AA|AN|AO, str_2023844574ACF1BC, "una ")
+SUBS(AR|AT|AI|AO, str_5D906EE6B78C720C, "volvio ")
+SUBS(AR|RGT|AT|AI|AO, str_C563754EAC80F5F1, "oigo ")
+SUBS(AR|AE|AT|AO, str_ECAAA38338BDFA85, "error ")
+SUBS(AR|RGT|AE|AT|AO, str_0C1FB583BB12C203, "otro ")
+SUBS(AR|AS|AN|AO, str_7412E38D9D55C2DC, "su ")
+SUBS(AR|RGT|AS|AN|AO, str_0341A6E60E56E199, "nos ")
+SUBS(AR|AT|AN|AO, str_48542059A4690B7A, "tu ")
+SUBS(AR|RGT|AT|AN|AO, str_87CA49C5238B7C4E, "noto ")
+SUBS(AR|AA|AS|AI, str_5B50BA5A3E82CCD9, "asi ")
+SUBS(AR|RGT|AA|AS|AI, str_C8C9A1891557B2DC, "kazz ")
+SUBS(AR|AA|AN|AI, str_960D76DEE34D23E7, "ahi ")
+SUBS(AR|RGT|AA|AN|AI, str_BF044DB5EE261598, "ha ")
+SUBS(AR|AA|AT|AO, str_68BE1B3432EE72AE, "foto ")
+SUBS(AR|RGT|AA|AT|AO, str_BF38370C83727D39, "of ")
+SUBS(AR|AA|AE|AI, str_4267018742102E46, "xii ")
+SUBS(AR|RGT|AA|AE|AI, str_D2F95EA81F7C61D5, "ix ")
+SUBS(AR|AA|AT|AP, str_4E64DC39CCCFB68B, "tapa ")
+SUBS(AR|RGT|AA|AT|AP, str_F8A3BC239830EB4A, "pata ")
+SUBS(AR|AA|AE|AN, str_71F52FF80B4E955D, "ay ")
+SUBS(AR|RGT|AA|AE|AN, str_CBA94FFB9DDDB35B, "ya ")
+SUBS(AR|AA|AN|AP, str_F438C1279CCEB43D, "ama ")
+SUBS(AR|RGT|AA|AN|AP, str_9EC2935D719709ED, "manana ")
+SUBS(AR|AE|AI|AO, str_05ED48987A1828F9, "el ")
+SUBS(AR|RGT|AE|AI|AO, str_05A9C753CDE4911A, "le ")
+SUBS(AR|AE|AN|AI, str_7E3D8B1C859776CA, "eh ")
+SUBS(AR|RGT|AE|AN|AI, str_C4D48E3111A94BAB, "he ")
+SUBS(AR|AS|AI|AO, str_7EBCF4E92D0AAB6E, "solo ")
+SUBS(AR|RGT|AS|AI|AO, str_7D5664732C823A0F, "los ")
+SUBS(AR|AA|AS|AE|AN|AO, str_34AB0010764EC1DA, "quedo ")
+SUBS(AR|AA|AT|AN|AI|AP, str_CF5289964180B811, "pinta ")
+SUBS(AR|AA|AS|AI|AO|AP, str_C7229D2451BA2DB0, "pasillo ")
+SUBS(AR|AA|AS|AE|AT|AN, str_EACD25C315D637DE, "estaba ")
+SUBS(AR|AA|AS|AE|AT|AI, str_FE075F445FAD0891, "vida ")
+SUBS(AR|AS|AT|AN|AI|AP, str_A523540C97D0BDFB, "smith ")
+SUBS(AR|AS|AE|AT|AI|AO, str_8A801F9AF69282E7, "cierto ")
+SUBS(AR|AT|AN|AI|AO|AP, str_7BE8D089AFEAFDA6, "ultimo ")
+SUBS(AR|AA|AE|AI|AO|AP, str_566479242BB250D5, "papel ")
+SUBS(AR|AS|AN|AI|AO|AP, str_EBC29441D7946099, "mismo ")
+SUBS(AR|AS|AT|AN|AO, str_E826CEF2ACCD90D0, "con ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_2105BA4B2B9F53F7, "junto ")
+SUBS(AR|AA|AI|AO|AP, str_F6496DC813AAA524, "apolo ")
+SUBS(AR|RGT|AA|AI|AO|AP, str_0A3FAE924B2D7C5D, "plaza ")
+SUBS(AR|AS|AE|AN|AI, str_8AB7051D1BC68513, "dije ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_6C0FF8EE7E7F564E, "ines ")
+SUBS(AR|AA|AT|AN|AP, str_9C7BB48EBD7121E3, "fama ")
+SUBS(AR|RGT|AA|AT|AN|AP, str_31B3473DAE0FC043, "mata ")
+SUBS(AR|AS|AE|AT|AO, str_3F177E9DD458659D, "todo ")
+SUBS(AR|RGT|AS|AE|AT|AO, str_FDBB7644FF4A00E1, "otros ")
+SUBS(AR|AS|AE|AN|AO, str_96C8EA5BE3B7A827, "donde ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_CF131237C55B2EA5, "jose ")
+SUBS(AR|AA|AT|AN|AO, str_BABEDB16982A6B02, "tanto ")
+SUBS(AR|RGT|AA|AT|AN|AO, str_FF3F3B1F8B5A3E40, "nota ")
+SUBS(AR|AA|AS|AN|AP, str_020E794D3DE91D12, "sam ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_3AD00291CF91C488, "mas ")
+SUBS(AR|AA|AE|AI|AO, str_470292E1774A98B0, "ella ")
+SUBS(AR|RGT|AA|AE|AI|AO, str_75803E8B71A90126, "leia ")
+SUBS(AR|AA|AN|AI|AP, str_B74E44C3D09CB3F0, "anima ")
+SUBS(AR|RGT|AA|AN|AI|AP, str_A3EDA8102177A97D, "mia ")
+SUBS(AR|AA|AT|AI|AO, str_A5547E1BA5CDE53E, "algo ")
+SUBS(AR|RGT|AA|AT|AI|AO, str_B3551F9AAD6C7D45, "italia ")
+SUBS(AR|AS|AT|AI|AO, str_913CECC656E36EDE, "visto ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_A015E57171C5A19E, "loco ")
+SUBS(AR|AA|AE|AT|AI, str_41B64C1A303CDA0A, "vez ")
+SUBS(AR|RGT|AA|AE|AT|AI, str_929FE1BEB911F16F, "ira ")
+SUBS(AR|AA|AS|AI|AO, str_6741844A368F981E, "salio ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_05DBE3DB5EFBA943, "las ")
+SUBS(AR|AT|AN|AI|AO, str_771EDB710CE19AB8, "tuvo ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_EEF3139E99561E3D, "ningun ")
+SUBS(AR|AE|AN|AO|AP, str_68C3CD2B0D07881A, "empeno ")
+SUBS(AR|RGT|AE|AN|AO|AP, str_D8CC81716BA955CA, "muy ")
+SUBS(AR|AA|AS|AE|AP, str_F5D8B6FDF8888805, "espada ")
+SUBS(AR|RGT|AA|AS|AE|AP, str_BF35BC735E837CDF, "pase ")
+SUBS(AR|AA|AN|AI|AO, str_DF3A88D1DCACE502, "aqui ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_3118B416FA644770, "hizo ")
+SUBS(AR|AS|AE|AT|AP, str_3ACC31C908690E7F, "espere ")
+SUBS(AR|RGT|AS|AE|AT|AP, str_B3AAAAA39FAD04BA, "perder ")
+SUBS(AR|AS|AE|AT|AI, str_2F957842D4460850, "decir ")
+SUBS(AR|RGT|AS|AE|AT|AI, str_958C07341B0A8741, "irse ")
+SUBS(AR|AS|AE|AI|AO, str_1861909A5CAE7807, "del ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_C4A6AAB982B673F2, "les ")
+SUBS(AR|AA|AN|AO|AP, str_8CCDB3FD341FF633, "amo ")
+SUBS(AR|RGT|AA|AN|AO|AP, str_D0F280F187C19C7E, "mano ")
+SUBS(AR|AA|AS|AE|AI, str_F661EC259440B46B, "dia ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_F180086B81853B17, "idea ")
+SUBS(AR|AE|AT|AN|AP, str_A7DAAA10DFA0B705, "repente ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_680AEAD7C557B390, "mente ")
+SUBS(AR|AS|AE|AN|AP, str_D065DAF5F418D7EC, "depende ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_92C437930874C6F2, "meses ")
+SUBS(AR|AA|AE|AT|AP, str_9B3D84E54FCB95F9, "aparte ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_900C0665FDDCD3E1, "para ")
+SUBS(AR|AA|AS|AN|AO, str_3A8B64D5C12E1153, "anos ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_798CC0CCB621062A, "unas ")
+SUBS(AR|AA|AT|AO|AP, str_F3EF3850A26E01B3, "apago ")
+SUBS(AR|RGT|AA|AT|AO|AP, str_5D293F93FABBED9D, "pago ")
+SUBS(AR|AA|AE|AT|AO, str_BB8BDA4574B8EAFC, "rato ")
+SUBS(AR|RGT|AA|AE|AT|AO, str_74EAC75913C3800D, "otra ")
+SUBS(AR|AS|AN|AI|AO, str_55564072F3D625CE, "sino ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_115CCFCAD54F10BE, "hijo ")
+SUBS(AR|AA|AT|AN|AI, str_43AD10D41DE2729C, "fin ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_E97A53773867C514, "habia ")
+SUBS(AR|AA|AS|AN|AI, str_B7AC20B542E223B0, "ansia ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_F9F466F11B521E6F, "has ")
+SUBS(AR|AE|AT|AN|AO, str_86524E6ACDECD253, "gente ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_B27B3C5A169EEAF2, "negro ")
+SUBS(AR|AT|AN|AO|AP, str_7BDC3AE19F1D3F77, "tomo ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_63598A0CFD4270CA, "punto ")
+SUBS(AR|AE|AT|AO|AP, str_985226B4E7F941ED, "torpe ")
+SUBS(AR|RGT|AE|AT|AO|AP, str_8DDF4266066B432B, "por ")
+SUBS(AR|AT|AI|AO|AP, str_5C160B9C40438458, "tipo ")
+SUBS(AR|RGT|AT|AI|AO|AP, str_2C05F739BECF075B, "polvo ")
+SUBS(AR|AE|AT|AI|AO, str_D9A393BE13567B65, "rio ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_337C838CCF3DA296, "llego ")
+SUBS(AR|AA|AS|AE|AN, str_67CFE6CC85BD1CD1, "deja ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_37C4A203E75175E9, "nada ")
+SUBS(AR|AS|AI|AO|AP, str_1261B12442D25FC1, "soplo ")
+SUBS(AR|RGT|AS|AI|AO|AP, str_D697A8522D80103F, "piso ")
+SUBS(AR|AA|AS|AT|AP, str_53DD616AAFCCD0DA, "capa ")
+SUBS(AR|RGT|AA|AS|AT|AP, str_DD762A3048134660, "patas ")
+SUBS(AR|AS|AN|AO|AP, str_621C55C64E25834A, "somos ")
+SUBS(AR|RGT|AS|AN|AO|AP, str_9530C2F904CE3674, "puso ")
+SUBS(AR|AS|AE|AO|AP, str_79909EEF056E4804, "esposo ")
+SUBS(AR|RGT|AS|AE|AO|AP, str_403F88074C74D7CE, "peso ")
+SUBS(AR|AA|AE|AT|AN, str_34DF09A540AEF857, "eran ")
+SUBS(AR|RGT|AA|AE|AT|AN, str_324452A46CC22F53, "yabran ")
+SUBS(AR|AA|AE|AN|AP, str_1FE98214FA4D409C, "examen ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_9D388C1F5C864255, "pena ")
+SUBS(AR|AA|AS|AO|AP, str_F75289636128CFF8, "sopa ")
+SUBS(AR|RGT|AA|AS|AO|AP, str_BC100D2D09DD60E2, "paso ")
+SUBS(AR|AE|AT|AI|AP, str_8256E9932CEBED2F, "repetir ")
+SUBS(AR|RGT|AE|AT|AI|AP, str_10A8823ACF08084F, "pierre ")
+SUBS(AR|AA|AN|AI|AO|AP, str_6451C20BA328EECD, "alma ")
+SUBS(AR|RGT|AA|AN|AI|AO|AP, str_8C909DCD35D4BFA0, "mal ")
+SUBS(AR|AA|AS|AT|AN|AI, str_F70B1450DD7EC677, "sabia ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_A68C8E0159949EF0, "hasta ")
+SUBS(AR|AA|AS|AT|AO|AP, str_BB6283AAECECCCBD, "copa ")
+SUBS(AR|RGT|AA|AS|AT|AO|AP, str_1659A90E2B306C83, "pocas ")
+SUBS(AR|AS|AE|AN|AO|AP, str_4AC40B9D027BDCF1, "despues ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_579872B81E64C48F, "menos ")
+SUBS(AR|AA|AS|AT|AN|AP, str_F62F17A817EF074F, "cama ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_897A2E33CAB4B0A7, "pasaba ")
+SUBS(AR|AA|AS|AE|AN|AI, str_480C993D59043FCC, "ansiedad ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_4AA54B27A70328DC, "nadie ")
+SUBS(AR|AA|AS|AN|AI|AP, str_91DCC24BDBD7539C, "animas ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_9337E69B7F452297, "misma ")
+SUBS(AR|AS|AT|AN|AI|AO, str_E3D64E1E756C466B, "cinco ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_2CD6BC9A640B9A6A, "incluso ")
+SUBS(AR|AA|AE|AT|AN|AP, str_17B92FD13145D632, "tema ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_93F61927D0CD9859, "manera ")
+SUBS(AR|AA|AE|AN|AI|AP, str_4B51E1D9A287659B, "empieza ")
+SUBS(AR|RGT|AA|AE|AN|AI|AP, str_09298B99F194ADAA, "maxima ")
+SUBS(AR|AE|AN|AI|AO|AP, str_D0563E464AD42DFC, "empleo ")
+SUBS(AR|RGT|AE|AN|AI|AO|AP, str_6FDC6BDC55330400, "pleno ")
+SUBS(AR|AA|AE|AN|AO|AP, str_439926E4BC1CD956, "apoyo ")
+SUBS(AR|RGT|AA|AE|AN|AO|AP, str_43134FE349F09948, "pequeno ")
+SUBS(AR|AA|AS|AE|AI|AO, str_F59AA55712B30216, "ellas ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_74ECC4650BD9745F, "lado ")
+SUBS(AR|AS|AT|AN|AO|AP, str_666587B2FC1E5926, "como ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_14818793B0F13BB9, "puntos ")
+SUBS(AR|AS|AE|AT|AN|AI, str_A909FE2491EAA9D0, "tienes ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_7060991E500462BF, "interes ")
+SUBS(AR|AA|AT|AI|AO|AP, str_32BC6D00D39A360B, "filipo ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_3CBEF26B0E24699B, "patio ")
+SUBS(AR|AA|AE|AN|AI|AO, str_45C4156948CDA849, "quien ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_A39427F4E330E2AE, "linea ")
+SUBS(AR|AA|AT|AN|AO|AP, str_0329483B37CC7D79, "toma ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_1BACF8D6559332C4, "punta ")
+SUBS(AR|AS|AE|AN|AI|AP, str_B6F1C6C922FA4CB5, "dime ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_79E29C103C51988C, "impide ")
+SUBS(AR|AA|AS|AT|AI|AO, str_E51B6C18C29EEBDB, "facil ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO, str_161DBE8CF3A9A5A4, "oficial ")
+SUBS(AR|AA|AS|AN|AO|AP, str_933FD2B59738529C, "suma ")
+SUBS(AR|RGT|AA|AS|AN|AO|AP, str_20225BC096D643FF, "manos ")
+SUBS(AR|AA|AE|AT|AO|AP, str_EABC033D43046E24, "ropa ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_FA4B0FAFB0B04EE8, "pagar ")
+SUBS(AR|AA|AS|AT|AN|AO, str_AF722CF8A42E2D3B, "bajo ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO, str_A79F0232F547106C, "nunca ")
+SUBS(AR|AS|AE|AT|AN|AO, str_E295746522B0BD52, "sobre ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_944760B90B42A4C1, "usted ")
+SUBS(AR|AA|AS|AE|AO|AP, str_0165EC35ADBF0A0A, "esposa ")
+SUBS(AR|RGT|AA|AS|AE|AO|AP, str_9920E6AF0789CA02, "pasado ")
+SUBS(AR|AS|AE|AT|AN|AP, str_EE50716BCD51147C, "empece ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_7E1CBDFF36145A35, "presente ")
+SUBS(AR|AA|AS|AT|AI|AP, str_2DA569F77B293059, "capaz ")
+SUBS(AR|RGT|AA|AS|AT|AI|AP, str_B3FE0277F9A4F391, "pista ")
+SUBS(AR|AA|AE|AT|AI|AO, str_9EF12B22C2E9CC6A, "favor ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_4A2EA7F3FB7C8BF5, "llegar ")
+SUBS(AR|AA|AE|AT|AN|AO, str_02BDE264ADE81756, "fue ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_23DDCA183C040D0D, "obra ")
+SUBS(AR|AA|AS|AE|AN|AP, str_E74A1D7F4ABBBBCF, "ademas ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_F1DA01C3D29ABEC9, "mesa ")
+SUBS(AR|AE|AT|AN|AI|AO, str_BFECF83935EF6CC3, "voy ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_8DD651EA71B00EEF, "luego ")
+SUBS(AR|AS|AE|AN|AI|AO, str_8992B4434C98992E, "dijo ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_F79A80F2680953FD, "lejos ")
+SUBS(AR|AE|AT|AN|AO|AP, str_A727C75BFAA555B4, "grupo ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_FA935D927875D182, "momento ")
+SUBS(AR|AE|AT|AN|AI|AP, str_5153F8FB6D6E9B9C, "verme ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_C94F57BD3A7A4B8C, "primer ")
+SUBS(AR|AE|AT|AI|AO|AP, str_ED9183D066499E2C, "golpe ")
+SUBS(AR|RGT|AE|AT|AI|AO|AP, str_6A1F3C1FD7686EE1, "propio ")
+SUBS(AR|AA|AE|AT|AI|AP, str_B8673242D63F7452, "repetia ")
+SUBS(AR|RGT|AA|AE|AT|AI|AP, str_5597E67A7CD10BAB, "partir ")
+SUBS(AR|AS|AE|AI|AO|AP, str_5A715E41626B3D16, "episodio ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_E22B2895287222B0, "podido ")
+SUBS(AR|AA|AS|AE|AI|AP, str_67D1B2EBB6A8350B, "despedida ")
+SUBS(AR|RGT|AA|AS|AE|AI|AP, str_0FA2BE67B86DCB22, "paises ")
+SUBS(AR|AA|AS|AN|AI|AO, str_BE01984D01AD9843, "quiso ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_82157CC619B91DFA, "julia ")
+SUBS(AR|AA|AT|AN|AI|AO, str_9066C56ADAECEC3C, "alguna ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_8A1F9C1F409F6AFA, "ninguna ")
+SUBS(AR|AS|AT|AI|AO|AP, str_54CD08E80EB8F31D, "tipos ")
+SUBS(AR|RGT|AS|AT|AI|AO|AP, str_3E346AFB17A7EA70, "politicos ")
+SUBS(AR|AA|AS|AE|AT|AO, str_47E20C477C892793, "toda ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO, str_8536F1EC8D3393AD, "otras ")
+SUBS(AR|AS|AE|AT|AO|AP, str_39E980975F371242, "espero ")
+SUBS(AR|RGT|AS|AE|AT|AO|AP, str_D9390A2702CDE82C, "poder ")
+SUBS(AR|AA|AS|AE|AT|AP, str_411CF24DF7E6504C, "espera ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_27C9C54FCC0F7B22, "padre ")
+SUBS(AR|AA|AE|AT|AN|AI, str_1003F676006A79E9, "tenia ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_0214FC2A096B2D3F, "haber ")
+SUBS(AR|AS|AE|AT|AI|AP, str_5A72A21CB90AD104, "especie ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_DCCF38E69C29D422, "pedir ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_A176D3524344ABBE, "dicho ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_006CFB75D04A1288, "noche ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_50786631B00C5A67, "amigo ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_031DA253073BBFA8, "ultima ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_771950E48592891C, "aspecto ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO|AP, str_76D62DECF1B3082E, "profesor ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_7A64D0AC8DD32E92, "aquellos ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_F02761E53BEA7019, "juez ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_A069AFF6B6716321, "capital ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_4A062895BD6EDDB1, "politica ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_DC91BD1B64D71163, "suponia ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_A17CD2AD2C03004E, "humanos ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_C7C449F8712039AD, "amado ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_3CD1092D35907F13, "mando ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_BEDC41F928972057, "ejemplo ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_DA4D4AA12CA3D373, "medio ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_F754DD1C5BB79B1D, "replico ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_D9E2B84B7D94D53F, "perdido ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_DA1E2B68B3C399A5, "conmigo ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_7FA79F0F0BA0204A, "mucho ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_54ED99A11E31C37A, "capitan ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_56218FD730A2BA00, "incapaz ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_11294A1DDFAD3126, "tambien ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_76D6D8384449BC59, "primera ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_E54FFB041363F705, "cabeza ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_3D1F1D60980140F4, "hacer ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_86B28BB9A90E886E, "cuando ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO, str_A38365CA3FD960D2, "nuestra ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_1046780BB03E6785, "siempre ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_73DED435CD93F261, "presidente ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_DB5F4E3A529D6369, "todavia ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO, str_E0DE09BD0CB15981, "llegado ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_7531BB5E7A882E0D, "ahora ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_D9AA8032648D36A1, "lugar ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_310FA4C3D2129DB5, "cual ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO, str_7C3CF1A77C559788, "habitacion ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_85F6E4888BE994B4, "felipe ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO|AP, str_12EA4EC57FB92CEF, "propia ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_C7DF534AB38D394D, "armas ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_638F1E032E80A700, "madre ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_89FAFF95FE610565, "empezo ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_65A4E3E28D565AB1, "manuel ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_F901C73007FAD22F, "capacidad ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_3914D06D01AF9C60, "parecia ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_3F7DE52F17067AA5, "tampoco ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_D244322B82D54F7C, "montanas ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_5396FAD4FB94A42A, "cuerpo ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_ED597F2F7B9A6674, "mujer ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_041A46748B75F9B0, "espalda ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_3257A57A33C10007, "podia ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_522EE9C819BBCA09, "forma ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_2A7C4309211FCEA4, "porque ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_AC2F7362DC40E7E3, "tiempo ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_0A5C1BABC2D03D1A, "hombre ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_6B50A3CC9EDDA93C, "demasiadas ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_A2B8387B8472917D, "media ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_E6406ED5BB75DD5B, "demasiado ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_C49154DBAB485663, "podian ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_54D67E5ED6829471, "camino ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_A57CA9BB16F945E7, "muchas ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_B6AA74001228186C, "especial ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_E1FC9B0FC8F2C7DF, "podria ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_945CAEDEAFDE3382, "ciudad ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_FFAD1D59E3A668DD, "historia ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_F1F8C335E094A263, "respuesta ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_7DD78EFB96678F56, "personas ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_F5D118999EAE9F31, "encima ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_B0A365B3B8B29EFB, "mientras ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_3E9D05E02CFFC29E, "finalmente ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_E436EA5C72F51789, "hermano ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_CFD8D772EF06188A, "respondio ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_C4A95F657AB9475E, "hombres ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_C9DC300EB8DE2143, "comenzo ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_89C817C4BE2B5BFC, "palabras ")
diff --git a/keyboards/gboards/dicts/aset/fn-keymap.def b/keyboards/gboards/dicts/aset/fn-keymap.def
new file mode 100644
index 00000000000..9c484d30f4f
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/fn-keymap.def
@@ -0,0 +1,374 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AT, KC_T)
+PRES(AP, KC_P)
+PRES(AA, KC_A)
+PRES(AI, KC_I)
+PRES(AN, KC_N)
+PRES(AO, KC_O)
+PRES(AE, KC_E)
+PRES(AS, KC_S)
+PRES(AI|AO, KC_L)
+PRES(AS|AI, KC_K)
+PRES(AO|AP, KC_SCLN)
+PRES(AN|AP, KC_M)
+PRES(AE|AI, KC_COMM)
+PRES(AS|AE, KC_D)
+PRES(AT|AP, KC_BSPC)
+PRES(AE|AN, KC_Y)
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AS|AT, KC_C)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+PRES(AS|AN, KC_J)
+PRES(AT|AO, KC_G)
+PRES(AN|AI, KC_H)
+PRES(AE|AO, KC_MINS)
+PRES(AA|AT, KC_F)
+PRES(AS|AO, KC_DOT)
+PRES(AA|AP, KC_QUOT)
+PRES(AN|AO, KC_U)
+PRES(AA|AS, KC_W)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+PRES(AA|AI, KC_Z)
+PRES(AE|AP, KC_QUOT)
+PRES(AT|AI, KC_V)
+PRES(AT|AN, KC_B)
+PRES(AA|AN, KC_Q)
+PRES(AE|AT, KC_R)
+PRES(AA|AE, KC_X)
+SUBS(AR|AS|AE|AT, str_CA8CA0A8D3D87E1E, "ester ")
+SUBS(AR|AE|AT|AP, str_230EE54B9F1F8C37, "ett' ")
+SUBS(AR|AI|AO|AP, str_D6B6365E10D5695D, "oppi ")
+SUBS(AR|AA|AI|AP, str_2B4ABD32782C2DFB, "pappi ")
+SUBS(AR|AE|AT|AO, str_32B2587A37FE032A, "eero ")
+SUBS(AR|AA|AS|AE, str_33A13A91F9C8F071, "saada ")
+SUBS(AR|AA|AS|AO, str_14A690C62F8EC5A5, "osaa ")
+SUBS(AR|AA|AS|AT, str_B3D649184647D65A, "taas ")
+SUBS(AR|AA|AE|AP, str_13D0B652141ACD51, "aape ")
+SUBS(AR|AN|AI|AO, str_CDE4DA38099DE335, "olin ")
+SUBS(AR|AS|AE|AN, str_84D94AC64A433897, "sen ")
+SUBS(AR|AA|AT|AN, str_1ABDBBAEA3608926, "antaa ")
+SUBS(AR|AA|AT|AI, str_C4ED1C3C34714250, "tai ")
+SUBS(AR|AN|AI|AP, str_67055DC3D727C27D, "mihin ")
+SUBS(AR|AA|AE|AT, str_C8EC3B522313F5FE, "etta ")
+SUBS(AR|AA|AS|AP, str_2122BA631ABC6CB5, "paassa ")
+SUBS(AR|AT|AI|AP, str_65859E55437327F1, "piti ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AA|AN|AP, str_730FE67FAC142F03, "nama ")
+SUBS(AR|AN|AO|AP, str_54BDC5FC6B38B79F, "muu ")
+SUBS(AR|AS|AT|AI|AP, str_445F857E06BA4FF7, "pisti ")
+SUBS(AR|AS|AE|AT|AN, str_736B8FB339395666, "syntynyt ")
+SUBS(AR|AA|AE|AT|AP, str_0BBD5DC7C7067071, "paeta ")
+SUBS(AR|AT|AN|AI|AP, str_9C65B9DF26360FAE, "nimitti ")
+SUBS(AR|AA|AN|AI|AP, str_C28057540B4DAEAD, "mina ")
+SUBS(AR|AS|AE|AI|AP, str_BFB3494FFF558EA1, "kiipesi ")
+SUBS(AR|AA|AE|AI|AP, str_753DF9D1477A64CF, "eipa ")
+SUBS(AR|AA|AI|AO|AP, str_1A810308AF700748, "lapi ")
+SUBS(AR|AA|AE|AT|AI, str_622B9208A276CF4C, "eivat ")
+SUBS(AR|AA|AS|AE|AO, str_6D42BDC389AF9939, "sodassa ")
+SUBS(AR|AS|AE|AT|AO, str_172CFA86BE3A3BC1, "god ")
+SUBS(AR|AA|AS|AT|AP, str_1D6479B72380A513, "paasta ")
+SUBS(AR|AA|AE|AT|AO, str_95FAD039B7409DDA, "erottaa ")
+SUBS(AR|AS|AN|AI|AP, str_83D77267B1EECB14, "miksi ")
+SUBS(AR|AA|AE|AN|AO, str_7B32335A69464622, "yona ")
+SUBS(AR|AE|AT|AO|AP, str_7C794BD375481E68, "peto ")
+SUBS(AR|AA|AS|AE|AT, str_761BA0AE12AB2324, "eras ")
+SUBS(AR|AS|AN|AO|AP, str_B69C651C2E0852D3, "suom ")
+SUBS(AR|AT|AI|AO, str_C277590164DC0A8A, "voi ")
+SUBS(AR|RGT|AT|AI|AO, str_EBE4FA16893104C0, "otti ")
+SUBS(AR|AE|AN|AI, str_675A5EE07E7575FB, "enin ")
+SUBS(AR|RGT|AE|AN|AI, str_C4D48E3111A94BAB, "he ")
+SUBS(AR|AS|AN|AI, str_86283CF0D25AC8E0, "sikin ")
+SUBS(AR|RGT|AS|AN|AI, str_6E9EBAD15E54CE5D, "kiinni ")
+SUBS(AR|AA|AE|AN, str_BCA35D6AC296C37D, "enaa ")
+SUBS(AR|RGT|AA|AE|AN, str_A8F6E5F510F79985, "naen ")
+SUBS(AR|AA|AS|AI, str_79DEBAC9C2664321, "sai ")
+SUBS(AR|RGT|AA|AS|AI, str_6E2CA43C65391E79, "kaikki ")
+SUBS(AR|AA|AT|AP, str_4E64DC39CCCFB68B, "tapa ")
+SUBS(AR|RGT|AA|AT|AP, str_F792D8ED82AFC75D, "paata ")
+SUBS(AR|AT|AN|AI, str_46438117CE00C474, "viini ")
+SUBS(AR|RGT|AT|AN|AI, str_B0A27A04D5F474D3, "nti ")
+SUBS(AR|AS|AI|AO, str_01533D61B01FD06D, "soi ")
+SUBS(AR|RGT|AS|AI|AO, str_2FCEFD145E2C7692, "olisi ")
+SUBS(AR|AS|AN|AO, str_A49D311A65686F59, "sun ")
+SUBS(AR|RGT|AS|AN|AO, str_FF6E23CC4BFF56B5, "jos ")
+SUBS(AR|AE|AN|AO, str_8DD9BC6194C75208, "eno ")
+SUBS(AR|RGT|AE|AN|AO, str_29B9E3E6E2FEDA21, "yon ")
+SUBS(AR|AA|AN|AI, str_5A4E2CDD929A273D, "aina ")
+SUBS(AR|RGT|AA|AN|AI, str_BB30CFFA4957C51C, "han ")
+SUBS(AR|AE|AI|AO, str_AB5FBA967AA94E7A, "eli ")
+SUBS(AR|RGT|AE|AI|AO, str_33BE99F17CB10764, "ole ")
+SUBS(AR|AE|AT|AI, str_56954BEA38D53E11, "ettei ")
+SUBS(AR|RGT|AE|AT|AI, str_25BB806D22A7ACB2, "irti ")
+SUBS(AR|AE|AN|AP, str_5730C9BD457F5A45, "emme ")
+SUBS(AR|RGT|AE|AN|AP, str_5140BEC191346017, "me ")
+SUBS(AR|AA|AI|AO, str_30B8BB99FFF81FC0, "alla ")
+SUBS(AR|RGT|AA|AI|AO, str_93ABD4AC2276D5E8, "olla ")
+SUBS(AR|AS|AE|AI, str_8DB12FA16BCFEA58, "die ")
+SUBS(AR|RGT|AS|AE|AI, str_412E95852FAF9DC5, "keksi ")
+SUBS(AR|AE|AT|AN, str_80EB5933B56D1367, "eteen ")
+SUBS(AR|RGT|AE|AT|AN, str_77D0DE1110F92FFB, "nyt ")
+SUBS(AR|AS|AT|AI, str_E3B1F7D5762313E1, "viisi ")
+SUBS(AR|RGT|AS|AT|AI, str_ABA342344458F587, "itki ")
+SUBS(AR|AA|AT|AO, str_A0C7EBEDA346A9D5, "totta ")
+SUBS(AR|RGT|AA|AT|AO, str_8E11213C133D3905, "ottaa ")
+SUBS(AR|AT|AN|AO, str_AA80DB5190D83147, "tuo ")
+SUBS(AR|RGT|AT|AN|AO, str_5BBBEE8F4F949763, "outo ")
+SUBS(AR|AA|AE|AI, str_4267018742102E46, "xii ")
+SUBS(AR|RGT|AA|AE|AI, str_D2F95EA81F7C61D5, "ix ")
+SUBS(AR|AA|AS|AN, str_FCEDCF5CA4FBEE40, "ajan ")
+SUBS(AR|RGT|AA|AS|AN, str_16D6BE915787F782, "ja ")
+SUBS(AR|AS|AT|AI|AO|AP, str_B92B9BA93DC4BFC1, "potki ")
+SUBS(AR|AA|AS|AT|AO|AP, str_E41584A9F12B8D4E, "paatos ")
+SUBS(AR|AA|AE|AT|AO|AP, str_78D5016A3AE8C3A8, "opettaa ")
+SUBS(AR|AA|AS|AN|AI|AP, str_571467A48BD08511, "mika ")
+SUBS(AR|AA|AT|AN|AO|AP, str_9E750E8EF92FA417, "mutta ")
+SUBS(AR|AA|AT|AN|AI|AP, str_5B34E2428A52B09E, "mita ")
+SUBS(AR|AA|AE|AN|AO|AP, str_099DC162DA8116C2, "myonnan ")
+SUBS(AR|AS|AT|AN|AO|AP, str_9E0173B50CE1376D, "muutos ")
+SUBS(AR|AA|AE|AN|AI|AP, str_684D92D2E5BF10A6, "miehia ")
+SUBS(AR|AS|AE|AT|AN|AP, str_E7AFF3FB05CB8051, "mrs ")
+SUBS(AR|AS|AE|AT|AI|AP, str_5FF559A76614003A, "sit' ")
+SUBS(AR|AE|AN|AI|AO|AP, str_C842ABEA6FAAC7B6, "minulle ")
+SUBS(AR|AS|AT|AN|AI|AP, str_BCA33D02145BFA16, "pitkin ")
+SUBS(AR|AA|AS|AI|AO|AP, str_322697417AFE4827, "poika ")
+SUBS(AR|AA|AE|AT|AN, str_185456031754722E, "taytyy ")
+SUBS(AR|RGT|AA|AE|AT|AN, str_D648F593169AE3F1, "naet ")
+SUBS(AR|AS|AE|AN|AI, str_477DEEAECC34BE5E, "siihen ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_DE22FC07EB049ABA, "niiden ")
+SUBS(AR|AA|AS|AN|AP, str_9938249A98B4D533, "samassa ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_5D8E3182A2982735, "paansa ")
+SUBS(AR|AE|AT|AI|AO, str_4DBB6F79687D879F, "teille ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_6205BED2C428E817, "olet ")
+SUBS(AR|AA|AS|AT|AO, str_362FC001BD651549, "sota ")
+SUBS(AR|RGT|AA|AS|AT|AO, str_DF9896A6FDFA5C11, "ostaa ")
+SUBS(AR|AA|AN|AI|AO, str_F226A68871ED358F, "ainoa ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_1401F607621C240F, "liian ")
+SUBS(AR|AA|AS|AE|AI, str_B86035559AB58BF1, "eika ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_44A6DF6A3DF7AD3E, "kaikkea ")
+SUBS(AR|AS|AT|AI|AO, str_AFD6CA11BAC8D729, "voisi ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_8556FE314ADA0FD5, "kiitos ")
+SUBS(AR|AS|AI|AO|AP, str_08A1740795808A15, "sopii ")
+SUBS(AR|RGT|AS|AI|AO|AP, str_3CF1BF4E9A40E6AA, "pois ")
+SUBS(AR|AA|AT|AI|AO, str_3B728CA7E68948B1, "taalla ")
+SUBS(AR|RGT|AA|AT|AI|AO, str_153DFDFC7A82D836, "olivat ")
+SUBS(AR|AE|AT|AN|AI, str_5527811895A7B881, "tehnyt ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_A8C5FAFF02A38346, "hyvin ")
+SUBS(AR|AA|AN|AO|AP, str_1790EE92B2D834AF, "apua ")
+SUBS(AR|RGT|AA|AN|AO|AP, str_E2CD069C8F622519, "oman ")
+SUBS(AR|AA|AE|AN|AI, str_21252A50AF8148E5, "eihan ")
+SUBS(AR|RGT|AA|AE|AN|AI, str_655639CA393D6ED2, "hanen ")
+SUBS(AR|AA|AS|AT|AI, str_B41787BEDA1879F3, "sita ")
+SUBS(AR|RGT|AA|AS|AT|AI, str_23A70ED4245B5AF7, "kavi ")
+SUBS(AR|AE|AI|AO|AP, str_8DC63EBBD1D8047D, "ell'ei ")
+SUBS(AR|RGT|AE|AI|AO|AP, str_A9D4E9854B52E26A, "piilee ")
+SUBS(AR|AE|AT|AN|AO, str_D865AE3A4AB82C56, "tytto ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_DD1960AED9632F0E, "nuoren ")
+SUBS(AR|AA|AS|AN|AO, str_090C8E43D966392D, "sanoa ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_8183CC20DAAEDDC2, "jossa ")
+SUBS(AR|AA|AT|AN|AP, str_EB96AAFB74EC611E, "tama ")
+SUBS(AR|RGT|AA|AT|AN|AP, str_B3D403A160201B7F, "maata ")
+SUBS(AR|AE|AN|AI|AO, str_1C77E61836652578, "eilen ")
+SUBS(AR|RGT|AE|AN|AI|AO, str_1CBBAEB4C2459263, "olen ")
+SUBS(AR|AS|AE|AN|AP, str_DCAFFCF484A425C6, "esm ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_F04223914D45AAA0, "pysyy ")
+SUBS(AR|AS|AT|AN|AI, str_1DF97975CDE00E69, "viisin ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_7787F9559C51CC44, "kiinnitti ")
+SUBS(AR|AE|AT|AN|AP, str_E8FE0169A844CB5E, "ett'en ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_10A1A694946FA759, "mr ")
+SUBS(AR|AS|AN|AI|AO, str_786AB758DD23FB02, "silloin ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_3ADDFD8B7CA298E9, "kuin ")
+SUBS(AR|AA|AT|AN|AI, str_CACFF4AF501B4E91, "vaan ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_DA2005E0E1B0D570, "hanta ")
+SUBS(AR|AS|AE|AI|AO, str_C095478F3264C9FF, "eiko ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_7F6943458FF55753, "kello ")
+SUBS(AR|AA|AT|AI|AP, str_F271A41EF35FE81F, "vapaa ")
+SUBS(AR|RGT|AA|AT|AI|AP, str_BB1DEFAEA0058E92, "pitaa ")
+SUBS(AR|AE|AT|AI|AP, str_D484B804FC2C6A59, "ett'ei ")
+SUBS(AR|RGT|AE|AT|AI|AP, str_5AEF78115BF28919, "peitti ")
+SUBS(AR|AS|AE|AN|AO, str_C6EC0928AD174160, "syo ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_0E0AA6DDD84D9D8E, "uuden ")
+SUBS(AR|AE|AN|AI|AP, str_1520018BB475867D, "ennemmin ")
+SUBS(AR|RGT|AE|AN|AI|AP, str_A389F00895A7D53A, "meni ")
+SUBS(AR|AA|AT|AN|AO, str_C6CA6B37A4E7C0F2, "tuota ")
+SUBS(AR|RGT|AA|AT|AN|AO, str_6473D009487AC796, "uutta ")
+SUBS(AR|AT|AI|AO|AP, str_52ED40A75FB9C43E, "voipi ")
+SUBS(AR|RGT|AT|AI|AO|AP, str_3B4B853A21FED6C9, "ippolit ")
+SUBS(AR|AA|AS|AE|AP, str_E3C2EE8967A164B3, "sepa ")
+SUBS(AR|RGT|AA|AS|AE|AP, str_B004D8BD441C50C8, "paase ")
+SUBS(AR|AA|AS|AI|AO, str_655494910FA6FF4C, "silla ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_EDC8FD72D1D401B5, "koska ")
+SUBS(AR|AS|AT|AN|AO, str_7C30555AC9E6A4FC, "totuus ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_5EE8E16E428CF57A, "joutunut ")
+SUBS(AR|AA|AE|AI|AO, str_C2B49FFFE04218EB, "elaa ")
+SUBS(AR|RGT|AA|AE|AI|AO, str_4DB93DD67BC5B5E0, "lea ")
+SUBS(AR|AA|AS|AN|AI, str_2DA332A85B0767C0, "sina ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_47EA3D1C20B9AA45, "kanssa ")
+SUBS(AR|AA|AS|AT|AN, str_C4E427E90604CD74, "sanat ")
+SUBS(AR|RGT|AA|AS|AT|AN, str_8A528ACAEACE373B, "jattaa ")
+SUBS(AR|AA|AS|AE|AN, str_0D8E085D9A4111EE, "sydan ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_958A93767B59B3AE, "jaada ")
+SUBS(AR|AT|AN|AO|AP, str_C7B05810B9878F2F, "tom ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_F91FDF7952D700CD, "muut ")
+SUBS(AR|AT|AN|AI|AO, str_61FE9BB4DA317AE3, "tuli ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_C6818A39BD064FAD, "ollut ")
+SUBS(AR|AA|AE|AN|AP, str_E02371EE635B357E, "enemman ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_8A6E9C45BBC7F390, "menna ")
+SUBS(AR|AS|AE|AT|AI, str_88B7129EABB752FF, "teki ")
+SUBS(AR|RGT|AS|AE|AT|AI, str_17B4408B7C77EBFB, "itse ")
+SUBS(AR|AA|AS|AI|AP, str_25398F26F5B0C168, "saapi ")
+SUBS(AR|RGT|AA|AS|AI|AP, str_3C759C30448DB29D, "paasi ")
+SUBS(AR|AE|AN|AO|AP, str_70E236D771B6411F, "emo ")
+SUBS(AR|RGT|AE|AN|AO|AP, str_78055334B7691B59, "monen ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_F7B8D93B1B2B2FB3, "mista ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_D3BCCC21C4DBB9CB, "petosta ")
+SUBS(AR|AA|AS|AE|AT|AI, str_26E006419956B6A2, "tieda ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI, str_45DC10FA34290BC8, "kertaa ")
+SUBS(AR|AA|AN|AI|AO|AP, str_706EF5E4D1C65008, "aamulla ")
+SUBS(AR|RGT|AA|AN|AI|AO|AP, str_DFFD2B48FFDF953E, "minua ")
+SUBS(AR|AS|AE|AN|AI|AP, str_5C5CAFE86DB6C14F, "esim ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_A686776300DAD04F, "mies ")
+SUBS(AR|AA|AS|AE|AN|AI, str_876BD41F0BDFE63A, "ehka ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_7CF2DD5BBB07B098, "heidan ")
+SUBS(AR|AA|AS|AN|AI|AO, str_FEAD094A2678854B, "sanoi ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_84A59781026A8CBF, "joka ")
+SUBS(AR|AA|AE|AT|AN|AO, str_5E0410BE3D304962, "tyota ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_E286864CE8595811, "yota ")
+SUBS(AR|AA|AS|AT|AN|AI, str_5F6BC953B9A329DF, "vastaan ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_09682C268D24C1D3, "niista ")
+SUBS(AR|AS|AE|AT|AN|AO, str_4A771ED6475F8206, "suuren ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_BF80952BCD08AEB7, "joten ")
+SUBS(AR|AE|AT|AI|AO|AP, str_657A0B7655472430, "viel' ")
+SUBS(AR|RGT|AE|AT|AI|AO|AP, str_8CE1A14C5267904E, "perille ")
+SUBS(AR|AA|AE|AT|AI|AP, str_061EDCECAF5A9699, "ett'eivat ")
+SUBS(AR|RGT|AA|AE|AT|AI|AP, str_67AD816C02C26F87, "pari ")
+SUBS(AR|AA|AS|AT|AI|AO, str_B0BA9B0F5D39D5D7, "saattoi ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO, str_D9C9F9C1E3AC7EA6, "katsoi ")
+SUBS(AR|AS|AE|AI|AO|AP, str_D2E2DB7F06962CCE, "s'oli ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_5D5EC7B653D09D96, "pelko ")
+SUBS(AR|AA|AS|AE|AT|AP, str_33FC3E302A6E2839, "d'astarac ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_2A983F7F1EC3ACA2, "perasta ")
+SUBS(AR|AA|AS|AE|AT|AO, str_505D48BB6AB25BC6, "grace ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO, str_D169B6D8C80A2582, "odottaa ")
+SUBS(AR|AT|AN|AI|AO|AP, str_4F45D8A580125317, "toimi ")
+SUBS(AR|RGT|AT|AN|AI|AO|AP, str_6A98054A52C4F22B, "minut ")
+SUBS(AR|AA|AS|AT|AN|AO, str_22C9DA27FC59D0C1, "saanut ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO, str_8885126703E8B930, "jota ")
+SUBS(AR|AA|AS|AT|AN|AP, str_85F80436B5BA7B29, "samat ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_12934B4B65444606, "maasta ")
+SUBS(AR|AA|AS|AE|AN|AO, str_FDC5B5BCBBD7FB44, "sanoen ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_46BF52073D0F2BFC, "juoda ")
+SUBS(AR|AS|AE|AN|AO|AP, str_D0551B2605575C0D, "suomen ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_CA79F357E6547808, "myos ")
+SUBS(AR|AA|AE|AN|AI|AO, str_D829668D084E33AF, "aanella ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_04B66DB2CBFD3095, "hanelle ")
+SUBS(AR|AA|AS|AE|AI|AP, str_5D9FEE5EA22843BA, "sieppasi ")
+SUBS(AR|RGT|AA|AS|AE|AI|AP, str_B26062809346CC59, "pida ")
+SUBS(AR|AE|AT|AN|AO|AP, str_11901F5B01D04DE7, "bergbom ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_65351474F0D0A5E3, "muuten ")
+SUBS(AR|AA|AT|AI|AO|AP, str_3667E8E2F5A9D13E, "apotti ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_335C000BF215B773, "palata ")
+SUBS(AR|AA|AS|AE|AN|AP, str_16EE6F0C24B3AFF0, "sydamensa ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_5211664BB4194AEF, "pyydan ")
+SUBS(AR|AA|AE|AT|AN|AP, str_F3C70CD01CC2B03E, "emanta ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_0FF86DE89DF13B6F, "ymmarra ")
+SUBS(AR|AS|AT|AN|AI|AO, str_3226CEA0F3AFD8F9, "tunsi ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_9337BF7AF614B249, "istui ")
+SUBS(AR|AS|AE|AT|AN|AI, str_CDCA7F1BD345B31C, "sitten ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_53B2746FC723A689, "kenties ")
+SUBS(AR|AS|AN|AI|AO|AP, str_3F525D6479B13343, "silmin ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_061D0AAC3A7D6F03, "pikku ")
+SUBS(AR|AA|AE|AI|AO|AP, str_A9E8B510F611965D, "epailla ")
+SUBS(AR|RGT|AA|AE|AI|AO|AP, str_5469B5757E41971F, "paalle ")
+SUBS(AR|AA|AS|AN|AO|AP, str_D3C55FF6838E726B, "sanomaan ")
+SUBS(AR|RGT|AA|AS|AN|AO|AP, str_01114430CC02AAE6, "pojan ")
+SUBS(AR|AA|AS|AT|AI|AP, str_C52ACE16E9BDC0F4, "sitapaitsi ")
+SUBS(AR|RGT|AA|AS|AT|AI|AP, str_478BC427388CCE75, "pitaisi ")
+SUBS(AR|AS|AE|AN|AI|AO, str_F27857B89DD29865, "ennenkuin ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_6A2FA82287FDA259, "oikein ")
+SUBS(AR|AA|AE|AT|AI|AO, str_8E98D56FE94B5DF9, "viela ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_DB536AB8405B26B9, "oleva ")
+SUBS(AR|AA|AS|AE|AT|AN, str_A6B5D074DB77833C, "sentaan ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN, str_E8AA66011602C31F, "jaanyt ")
+SUBS(AR|AS|AE|AT|AI|AO, str_2B262B4AE3E71586, "toiset ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO, str_CAF0105BB94E24E2, "kertoi ")
+SUBS(AR|AE|AT|AN|AI|AO, str_88AB89229B2D8E5F, "tulee ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_1B98663FE8C86702, "nuori ")
+SUBS(AR|AA|AT|AN|AI|AO, str_B7B00EDA2FE78A86, "tulla ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_4DD4B7FD19CD9A51, "lahti ")
+SUBS(AR|AA|AE|AT|AN|AI, str_65CFF73B46671467, "taytyi ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_1BE829AC3F5014A6, "hanet ")
+SUBS(AR|AE|AT|AN|AI|AP, str_6607671A4D40B96A, "viimein ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_F5FD43E435B19560, "miten ")
+SUBS(AR|AA|AS|AE|AI|AO, str_AC8C6A15F079C769, "siella ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_8C3B170B843D3A6A, "keskella ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_8A4F8EE78569F915, "sopiva ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_B51DF84BB7117F58, "palasivat ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_90FD2D279878472E, "elaman ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_2D576457B671BB24, "meilla ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_6D3916C656615EE4, "sopinut ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_3D02EAD5BE3A8845, "muutkin ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_C17A439FA44061D3, "sprengtport ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_9B2F935F57297FC8, "prudence ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_9CEA2C27C8C73B40, "sielta ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO, str_F8717DABB4A28652, "katseli ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_F22CD82D60F743EC, "tapahtunut ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_8BB722DEC599A4A2, "muutamia ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_254459CC6C094FF5, "toimeen ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_FF8ED353CB7E54E1, "miltei ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_97A3E80803C670AA, "samalla ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_1E41744B134F83AC, "paljon ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_1E2E5858EFEFE8D1, "sellainen ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_D36240DF33379F88, "kylla ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_12813AF88FD1344B, "teidan ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_0C3F6921F8227A13, "kerran ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_6C2965E88C1BF945, "rouva ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_F34D9613E5382BD2, "olevan ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_9F398EB56D1021A6, "sill'aikaa ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_70715E663B34FFB7, "pelkaa ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_AA79959130D28B5F, "eteenpain ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_AEE98FA6CCCFECD2, "meita ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_23696AEF714A36A0, "ainoastaan ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO, str_0CD62CE71407209A, "jotka ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_ACE6B1185AF6A6AD, "sittemmin ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_9A3643BF0D232A2D, "ihmiset ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_C7DF534AB38D394D, "armas ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_311EF51A0020A890, "paassyt ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_51705648C1A115C5, "semmoinen ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_138B63F22FE84CCB, "myoskin ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_8F8429CAD7D93C5D, "tarpeeksi ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_6FA1342A7829A535, "parka ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_9E4190674474F1D1, "suuri ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_C8D03930E7EF1A38, "kuitenkin ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_9CFD517CEAF0015D, "vielapa ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO|AP, str_995CAF23BE5EF14D, "portaita ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_1E1F19E4BD823797, "suomessa ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_A4226EDA6DE9D750, "poydan ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_F50122FC9FD239A4, "suurta ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO, str_7C5D2BE7427C35B2, "uudestaan ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_E5AA7EF87A6E7418, "tuomas ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_7FAF5456CA6FD092, "pojat ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_A27D8719EF3E9505, "tuntemaan ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_8104E67C46E35F5F, "poytaan ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_80642C64EE2C3C1B, "tok' ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_18FC721930BF4B61, "posket ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_CDDE6FEE75C17FE8, "ensimainen ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_09BDF252AE5256C3, "meidan ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_51CE70EC6849E2D0, "silmat ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_814F6728326BF5BA, "minusta ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_EFFBA321177771BB, "varmaankin ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_332B284E82C5E009, "miesta ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_4C82FA8B22D5A52F, "epailematta ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_04CC9A34F5527C9A, "molemmat ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_958F45A5BF9A9926, "tahdon ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_CFFF552EB34BDD5F, "kuitenkaan ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_D2F7E610FC106643, "suomalaisen ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_BA16E5C3B446F4DB, "kallem ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_5988D62F8D29886E, "tarpeellista ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_E30132CF665E428F, "lapset ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_5D0AFC533FD1EDC5, "rupesi ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_B27A17B72C2F77D4, "helposti ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_ED3155D6B29343B8, "etupaassa ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_1B9974C23C440480, "opettaja ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_BDF6476C40CC63D4, "tapauksessa ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_836FBC8B50FD212A, "puolesta ")
diff --git a/keyboards/gboards/dicts/aset/fr-keymap.def b/keyboards/gboards/dicts/aset/fr-keymap.def
new file mode 100644
index 00000000000..88c9d5b2cb3
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/fr-keymap.def
@@ -0,0 +1,391 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AT, KC_T)
+PRES(AS, KC_S)
+PRES(AP, KC_P)
+PRES(AE, KC_E)
+PRES(AA, KC_A)
+PRES(AO, KC_O)
+PRES(AI, KC_I)
+PRES(AN, KC_N)
+PRES(AS|AO, KC_DOT)
+PRES(AS|AT, KC_C)
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AE|AN, KC_Y)
+PRES(AA|AT, KC_F)
+PRES(AA|AN, KC_Q)
+PRES(AI|AO, KC_L)
+PRES(AT|AI, KC_V)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+PRES(AA|AP, KC_QUOT)
+PRES(AE|AT, KC_R)
+PRES(AN|AI, KC_H)
+PRES(AO|AP, KC_SCLN)
+PRES(AE|AI, KC_COMM)
+PRES(AN|AO, KC_U)
+PRES(AT|AN, KC_B)
+PRES(AS|AE, KC_D)
+PRES(AA|AS, KC_W)
+PRES(AT|AO, KC_G)
+PRES(AS|AI, KC_K)
+PRES(AT|AP, KC_BSPC)
+PRES(AS|AN, KC_J)
+PRES(AE|AO, KC_MINS)
+PRES(AA|AE, KC_X)
+PRES(AA|AI, KC_Z)
+PRES(AN|AP, KC_M)
+PRES(AE|AP, KC_QUOT)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+SUBS(AR|AA|AT|AO, str_78081C47BB80A57E, "ota ")
+SUBS(AR|AA|AE|AP, str_420E36C5BBF26FC8, "pape ")
+SUBS(AR|AS|AN|AI, str_4FA7F5796CAA3748, "siskin ")
+SUBS(AR|AA|AS|AT, str_521DFAED1CC2AD68, "ca ")
+SUBS(AR|AA|AI|AP, str_9EFFC1EA3EEA7DCB, "pizza ")
+SUBS(AR|AA|AS|AE, str_883010E38FBB9167, "sexe ")
+SUBS(AR|AE|AT|AN, str_5E7FFBEBF6AB0C31, "entre ")
+SUBS(AR|AA|AT|AN, str_A3C80E4F3C86151C, "tant ")
+SUBS(AR|AE|AI|AP, str_288993BA9FAF1F15, "pipe ")
+SUBS(AR|AS|AT|AO, str_75E299337C819F75, "scott ")
+SUBS(AR|AA|AN|AP, str_2A907D456EBB3E24, "ma ")
+SUBS(AR|AT|AI|AP, str_2741375E1176FC82, "pitt ")
+SUBS(AR|AS|AN|AP, str_A38FEA2A97C8F836, "ms ")
+SUBS(AR|AE|AT|AI, str_26A9A7CA01A1D074, "vie ")
+SUBS(AR|AI|AO|AP, str_8AB1201260059D82, "poil ")
+SUBS(AR|AN|AI|AP, str_149A1D953225FF9C, "pin ")
+SUBS(AR|AA|AT|AP, str_4E64DC39CCCFB68B, "tapa ")
+SUBS(AR|AA|AS|AI, str_F27DC36CBF1518A9, "sais ")
+SUBS(AR|AS|AE|AT, str_29CD3969E34DF35B, "ce ")
+SUBS(AR|AA|AE|AI, str_4E954BC1BF0C30BF, "aie ")
+SUBS(AR|AN|AI|AO, str_9A5CC103ABF05E48, "lui ")
+SUBS(AR|AS|AI|AP, str_565EB49E602024EF, "pis ")
+SUBS(AR|AT|AN|AI, str_96A25A2A55589326, "vin ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AA|AE|AT, str_84F2B8BF6F246A77, "frere ")
+SUBS(AR|AN|AO|AP, str_00992C32EFED8CB7, "mon ")
+SUBS(AR|AA|AS|AT|AI, str_9829604A158B3E05, "vais ")
+SUBS(AR|AS|AN|AO|AP, str_12AF93D01647F576, "noms ")
+SUBS(AR|AA|AT|AO|AP, str_1BD669DDC261A05C, "tapota ")
+SUBS(AR|AS|AT|AI|AP, str_2BC515A6311342A6, "pic ")
+SUBS(AR|AS|AE|AT|AI, str_4304C227395BD37E, "dit ")
+SUBS(AR|AA|AS|AT|AP, str_95C59AB8275627DB, "cap ")
+SUBS(AR|AA|AN|AO|AP, str_40B810EB6C30C217, "mona ")
+SUBS(AR|AA|AT|AN|AO, str_CC080FE2FF7C2E70, "fut ")
+SUBS(AR|AE|AI|AO|AP, str_40D2BC6DD117FB71, "l'oeil ")
+SUBS(AR|AA|AS|AE|AO, str_FEE35575A17EE85A, "owe ")
+SUBS(AR|AA|AE|AT|AI, str_D325B8F33D71AF69, "etait ")
+SUBS(AR|AA|AE|AI|AP, str_6445A06E8D99B99F, "paix ")
+SUBS(AR|AA|AS|AT|AO, str_16E25DDA29420EFF, "costas ")
+SUBS(AR|AS|AT|AN|AO, str_1AFE5B1591616C6F, "sont ")
+SUBS(AR|AS|AN|AI|AP, str_2AF23F7FD8046F6F, "mis ")
+SUBS(AR|AA|AS|AI|AP, str_28F8ABE7BAB525FA, "passai ")
+SUBS(AR|AA|AS|AT|AN, str_ED64011B1DDBB524, "bas ")
+SUBS(AR|AA|AS|AE|AT, str_2F48A027894655CD, "tard ")
+SUBS(AR|AA|AS|AE|AI, str_6273F3FFBACF5CF4, "assez ")
+SUBS(AR|AA|AE|AT|AN, str_BD5CBA745807BD42, "enfant ")
+SUBS(AR|AS|AI|AO|AP, str_877FC3FABAB14793, "poils ")
+SUBS(AR|AS|AT|AN|AP, str_DE6CBE601C534F3D, "cm ")
+SUBS(AR|AA|AT|AI|AP, str_E3FED3DD94790CBB, "tapait ")
+SUBS(AR|AA|AI|AO|AP, str_0A3FAE924B2D7C5D, "plaza ")
+SUBS(AR|AA|AS|AO|AP, str_2C5A9D37E22C3E8B, "posa ")
+SUBS(AR|AA|AT|AI, str_0A95DEE41936732C, "avait ")
+SUBS(AR|RGT|AA|AT|AI, str_D7978D4AE69E4592, "if ")
+SUBS(AR|AT|AI|AO, str_BC609B944608D11C, "toi ")
+SUBS(AR|RGT|AT|AI|AO, str_298367581D06A3A3, "lit ")
+SUBS(AR|AA|AE|AN, str_618F1C5CCE914755, "annee ")
+SUBS(AR|RGT|AA|AE|AN, str_93990AACC914CE2D, "nanny ")
+SUBS(AR|AE|AN|AP, str_A2F6876B6C66BF2E, "emmene ")
+SUBS(AR|RGT|AE|AN|AP, str_5140BEC191346017, "me ")
+SUBS(AR|AS|AE|AO, str_17D1C10C08DF4AD2, "dos ")
+SUBS(AR|RGT|AS|AE|AO, str_3F9E1C177D3332EB, "ose ")
+SUBS(AR|AE|AN|AI, str_7E3D8B1C859776CA, "eh ")
+SUBS(AR|RGT|AE|AN|AI, str_C9E12997526D9B37, "hein ")
+SUBS(AR|AA|AN|AO, str_FD846B750BDF7708, "au ")
+SUBS(AR|RGT|AA|AN|AO, str_ABD6428DD78ACF4D, "noua ")
+SUBS(AR|AS|AT|AI, str_D466F321075D4855, "vis ")
+SUBS(AR|RGT|AS|AT|AI, str_119364F935F4EBCA, "ici ")
+SUBS(AR|AS|AI|AO, str_C9ADB25B4C37D131, "sol ")
+SUBS(AR|RGT|AS|AI|AO, str_43498AA51D30F3FF, "ils ")
+SUBS(AR|AE|AI|AO, str_3CD2516588C5C683, "elle ")
+SUBS(AR|RGT|AE|AI|AO, str_05A9C753CDE4911A, "le ")
+SUBS(AR|AE|AT|AO, str_CC2393E67BC4FD99, "gorge ")
+SUBS(AR|RGT|AE|AT|AO, str_B97355B02DCE4543, "or ")
+SUBS(AR|AA|AS|AP, str_96F2FCCCDB7B158D, "saps ")
+SUBS(AR|RGT|AA|AS|AP, str_467C897077B58F08, "pas ")
+SUBS(AR|AT|AN|AO, str_862A200BA269E645, "tout ")
+SUBS(AR|RGT|AT|AN|AO, str_54D987539784DC58, "ont ")
+SUBS(AR|AS|AE|AI, str_7F7E7B4A6D337279, "dis ")
+SUBS(AR|RGT|AS|AE|AI, str_8A50CBEF7E0A6524, "idee ")
+SUBS(AR|AT|AO|AP, str_8574F11BEB82545C, "top ")
+SUBS(AR|RGT|AT|AO|AP, str_028BB7B551A4BD43, "pot ")
+SUBS(AR|AS|AE|AN, str_32148592C3806623, "sens ")
+SUBS(AR|RGT|AS|AE|AN, str_6D067D15A808A9B1, "je ")
+SUBS(AR|AS|AN|AO, str_3D29840CE477716A, "son ")
+SUBS(AR|RGT|AS|AN|AO, str_22C9D5E22EF9095F, "nous ")
+SUBS(AR|AS|AE|AP, str_B595D9406FDA4F64, "epees ")
+SUBS(AR|RGT|AS|AE|AP, str_9209A1D5F27363FA, "pdd ")
+SUBS(AR|AA|AN|AI, str_BF40C27E59DAAC7B, "ah ")
+SUBS(AR|RGT|AA|AN|AI, str_4394B0F660AFCB43, "hanna ")
+SUBS(AR|AA|AS|AN, str_CE3B00B88629D10F, "sans ")
+SUBS(AR|RGT|AA|AS|AN, str_C5270D6F6B831E8A, "jan ")
+SUBS(AR|AE|AN|AO, str_3CF92217D792ADB9, "eu ")
+SUBS(AR|RGT|AE|AN|AO, str_5BF347C18B23AF8F, "une ")
+SUBS(AR|AE|AT|AP, str_4139EFF0D81A84C8, "repete ")
+SUBS(AR|RGT|AE|AT|AP, str_17F340CB47FA3AFE, "pere ")
+SUBS(AR|AA|AI|AO, str_30B8BB99FFF81FC0, "alla ")
+SUBS(AR|RGT|AA|AI|AO, str_7E7904D7326BCF29, "la ")
+SUBS(AR|AA|AS|AI|AO|AP, str_1FB1E1A6B345A6F4, "palais ")
+SUBS(AR|AA|AS|AE|AT|AI, str_4168E4A652CEAF80, "avec ")
+SUBS(AR|AE|AN|AI|AO|AP, str_2770B52E1461FA12, "homme ")
+SUBS(AR|AA|AE|AT|AN|AO, str_39654F9A6C617C0D, "autre ")
+SUBS(AR|AA|AS|AN|AO|AP, str_169D4FC4776F16BE, "poussa ")
+SUBS(AR|AA|AS|AE|AT|AO, str_7B2E217198FB3271, "regard ")
+SUBS(AR|AA|AS|AT|AO|AP, str_2DDD9C85A181E11B, "capot ")
+SUBS(AR|AA|AS|AE|AO|AP, str_96D231FB065DF073, "deposa ")
+SUBS(AR|AS|AE|AT|AN|AI, str_09433F144B1C4CE6, "dernier ")
+SUBS(AR|AS|AT|AN|AI|AP, str_A523540C97D0BDFB, "smith ")
+SUBS(AR|AA|AS|AT|AN|AO, str_7930E0090F32732B, "facon ")
+SUBS(AR|AE|AT|AI|AP, str_424298BF8C008AB0, "reprit ")
+SUBS(AR|RGT|AE|AT|AI|AP, str_869487CB835CCBF0, "petit ")
+SUBS(AR|AA|AE|AT|AO, str_CD81FDAA52C86F1E, "fort ")
+SUBS(AR|RGT|AA|AE|AT|AO, str_0CF42461BCC5C13F, "offert ")
+SUBS(AR|AS|AT|AI|AO, str_26B898C1A85DA5C9, "soit ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_280E295D8F1242CA, "kotko ")
+SUBS(AR|AA|AE|AT|AP, str_2A4B646527ABFDB5, "frappe ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_F552C5CE7412D067, "par ")
+SUBS(AR|AS|AE|AI|AO, str_34E7EC35CEFED8A7, "elles ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_C4A6AAB982B673F2, "les ")
+SUBS(AR|AE|AT|AO|AP, str_18E2DD7864DDEDC5, "trop ")
+SUBS(AR|RGT|AE|AT|AO|AP, str_BB421D7D5BAA04A1, "porte ")
+SUBS(AR|AA|AE|AN|AO, str_6A810E6F1345F79D, "que ")
+SUBS(AR|RGT|AA|AE|AN|AO, str_9BEBF2BB1F8A8717, "yeux ")
+SUBS(AR|AS|AE|AT|AO, str_01CF094CCF2E483F, "cote ")
+SUBS(AR|RGT|AS|AE|AT|AO, str_E4239056762C3D8E, "orc ")
+SUBS(AR|AA|AT|AN|AI, str_36D31D30200ABA8A, "avant ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_16285952EF2702B1, "navait ")
+SUBS(AR|AS|AE|AT|AN, str_425E36361A2CC461, "cent ")
+SUBS(AR|RGT|AS|AE|AT|AN, str_9AC336D3C99667F3, "jeter ")
+SUBS(AR|AE|AN|AI|AP, str_11F84E12BBBFCCEA, "ennemi ")
+SUBS(AR|RGT|AE|AN|AI|AP, str_08CB227850D070F0, "peine ")
+SUBS(AR|AA|AN|AI|AP, str_0399462E63D0085B, "ami ")
+SUBS(AR|RGT|AA|AN|AI|AP, str_5F9A0F9BBD5A0AB7, "main ")
+SUBS(AR|AS|AE|AT|AP, str_249204828DFE2B87, "c'est ")
+SUBS(AR|RGT|AS|AE|AT|AP, str_91024023E9BCDC7C, "pres ")
+SUBS(AR|AE|AT|AN|AP, str_8A3CF03C5FA779DF, "type ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_DEE3BBD571C511F7, "mere ")
+SUBS(AR|AA|AS|AE|AN, str_D382BDEBE52AB75E, "dans ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_E21E00C501A17368, "jean ")
+SUBS(AR|AT|AN|AO|AP, str_C7B05810B9878F2F, "tom ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_7E273C54E980F6C3, "mot ")
+SUBS(AR|AT|AN|AI|AP, str_AF1FE256DC6BB784, "tim ")
+SUBS(AR|RGT|AT|AN|AI|AP, str_168886128C6CCE68, "mit ")
+SUBS(AR|AT|AN|AI|AO, str_E186D37D1DC8E960, "vu ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_2E374ECBD051C431, "nuit ")
+SUBS(AR|AS|AE|AN|AO, str_68105B858B425CB4, "du ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_09307894AF437586, "jeune ")
+SUBS(AR|AE|AT|AI|AO, str_0BE27CEF5EAD8FF1, "votre ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_7BCEB3F9664FB392, "livre ")
+SUBS(AR|AS|AN|AI|AO, str_DB5D0CB8B2064E3F, "suis ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_B24523534C6D82C9, "john ")
+SUBS(AR|AA|AT|AN|AP, str_B3A4DBEADADE554B, "amant ")
+SUBS(AR|RGT|AA|AT|AN|AP, str_06AABBFC9BF9658F, "mat ")
+SUBS(AR|AA|AS|AN|AI, str_F49C2ED16A00AF71, "ainsi ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_F95DB4023FEBBF8D, "jai ")
+SUBS(AR|AE|AN|AI|AO, str_7CFEC9881D601C31, "euh ")
+SUBS(AR|RGT|AE|AN|AI|AO, str_343C08EE75398FFB, "lieu ")
+SUBS(AR|AA|AS|AI|AO, str_986F1E27EAD7EC5B, "siloa ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_A0250F313F0FE686, "laissa ")
+SUBS(AR|AS|AE|AN|AP, str_92522CFA3D4265D4, "s'en ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_FBAD4BF313DC1E39, "mes ")
+SUBS(AR|AA|AE|AN|AP, str_8FE802A36341EA0E, "ame ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_5A71C0C8EFA36509, "m'a ")
+SUBS(AR|AE|AT|AN|AI, str_5ABF3B03AD7D60C8, "bien ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_7FFC98FBA9E3A98C, "hier ")
+SUBS(AR|AA|AE|AN|AI, str_AFC88DA32D0E5B6C, "ayez ")
+SUBS(AR|RGT|AA|AE|AN|AI, str_FE3EA39B5CDB4B6D, "nez ")
+SUBS(AR|AS|AT|AO|AP, str_CB532D5DED67E46B, "stop ")
+SUBS(AR|RGT|AS|AT|AO|AP, str_9903C98C2263313F, "pots ")
+SUBS(AR|AA|AS|AN|AO, str_FEF698E458380208, "sonna ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_4DF8261DC5ABC45C, "joanna ")
+SUBS(AR|AA|AS|AN|AP, str_020E794D3DE91D12, "sam ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_E8089E5AE05C336B, "pans ")
+SUBS(AR|AS|AE|AN|AI, str_4C96EF4DA8B974F6, "sein ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_C18F2D3E5BFCF1EA, "indiens ")
+SUBS(AR|AA|AT|AI|AO, str_5457C8FE44545EC0, "voila ")
+SUBS(AR|RGT|AA|AT|AI|AO, str_CD43BCF9440F029F, "livia ")
+SUBS(AR|AS|AE|AI|AP, str_FB73F266A638529A, "d'idees ")
+SUBS(AR|RGT|AS|AE|AI|AP, str_4D92E385003BEF4D, "pieds ")
+SUBS(AR|AE|AN|AO|AP, str_0E5C26B177DB3B6B, "emu ")
+SUBS(AR|RGT|AE|AN|AO|AP, str_085535C1FC37ABD1, "peu ")
+SUBS(AR|AS|AE|AO|AP, str_ED02F27FF9D2AE40, "depose ")
+SUBS(AR|RGT|AS|AE|AO|AP, str_578A5EB31DA360B8, "pose ")
+SUBS(AR|AS|AT|AN|AI, str_965A2CA8D6D560B3, "chic ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_CACB1DDE4C45C572, "instinct ")
+SUBS(AR|AA|AS|AE|AP, str_C771C064D2998574, "depasse ")
+SUBS(AR|RGT|AA|AS|AE|AP, str_1B1C50D62E726AE4, "passe ")
+SUBS(AR|AA|AE|AI|AO, str_920555295259A453, "allez ")
+SUBS(AR|RGT|AA|AE|AI|AO, str_2BCCE3C0702A7BCE, "lizzie ")
+SUBS(AR|AE|AT|AN|AO, str_E41CC923CDA39A2D, "toute ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_F1E4A268EFF8EC70, "notre ")
+SUBS(AR|AA|AN|AI|AO, str_E6F04AE213D415C8, "qui ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_54DEAA1A3F19A7FC, "hall ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_66C5091BFE1D84F2, "grand ")
+SUBS(AR|AA|AE|AN|AI|AO, str_25482DDA67602F3F, "quelque ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_AD3F108A5D363BEA, "laquelle ")
+SUBS(AR|AS|AE|AN|AI|AP, str_AC28A211439F6911, "demi ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_1CA2E2124CE1270B, "mise ")
+SUBS(AR|AE|AT|AN|AI|AP, str_1A112A146452BC73, "termine ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_05D7B87CEB0F914E, "premiere ")
+SUBS(AR|AS|AE|AT|AO|AP, str_C0830DAE0B31642D, "corps ")
+SUBS(AR|RGT|AS|AE|AT|AO|AP, str_F35A63ECE326D256, "propos ")
+SUBS(AR|AS|AE|AT|AI|AO, str_BBAE3D000B70B461, "trois ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO, str_4E7A25870FA9D576, "levres ")
+SUBS(AR|AA|AS|AN|AI|AO, str_5CCED470C6376E24, "aussi ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_1CE92F7D438ECE71, "ouais ")
+SUBS(AR|AA|AS|AT|AN|AI, str_1C08995987F002CC, "cinq ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_62D4959696367129, "instant ")
+SUBS(AR|AA|AT|AN|AO|AP, str_68AF24BC140C3A1C, "tomba ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_C7736F1E6FE4A0FB, "monta ")
+SUBS(AR|AA|AT|AN|AI|AO, str_36D184CC7E806783, "voulait ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_BA6BB38BF55A70F7, "haut ")
+SUBS(AR|AA|AE|AT|AO|AP, str_0C644F2339AF7F37, "rapport ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_5E0C8ECDADE5F1A0, "page ")
+SUBS(AR|AA|AT|AI|AO|AP, str_F7C74701175E069E, "galop ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_622571FA2C6C5F91, "plait ")
+SUBS(AR|AA|AT|AN|AI|AP, str_D177B96161AD1907, "faim ")
+SUBS(AR|RGT|AA|AT|AN|AI|AP, str_CBD66599EF0CEAD6, "matin ")
+SUBS(AR|AS|AE|AT|AN|AP, str_BC8F7D662EC90482, "temps ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_CCD04B34B117B55B, "n'est ")
+SUBS(AR|AA|AE|AT|AN|AI, str_F418D65530DB8FD9, "etaient ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_7F47DD2F4421A474, "navire ")
+SUBS(AR|AS|AN|AI|AO|AP, str_6CBFC109D0CB9CF1, "simon ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_8CF693C1CD0D766F, "plus ")
+SUBS(AR|AA|AE|AT|AI|AP, str_3EDC6B6F5BA07B76, "t'ai ")
+SUBS(AR|RGT|AA|AE|AT|AI|AP, str_1476FE2F798ACCE5, "partie ")
+SUBS(AR|AS|AE|AT|AN|AO, str_5577D4AF34CAEB45, "sur ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_E65DB024A5ECD140, "jour ")
+SUBS(AR|AA|AE|AI|AO|AP, str_92B9AE4B66302B82, "appele ")
+SUBS(AR|RGT|AA|AE|AI|AO|AP, str_657A21827EC908C2, "l'a ")
+SUBS(AR|AS|AE|AN|AO|AP, str_AFAFEA75716A544B, "d'un ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_9CE7D746BF40A906, "monde ")
+SUBS(AR|AA|AS|AE|AN|AI, str_C863303B30CC6CA5, "whisky ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_5A076D67C1E12F00, "jadis ")
+SUBS(AR|AE|AT|AI|AO|AP, str_CAE4F1BAEB60B2AE, "reprit-il ")
+SUBS(AR|RGT|AE|AT|AI|AO|AP, str_3760146EA308F926, "l'oreille ")
+SUBS(AR|AS|AE|AI|AO|AP, str_B7896E215EDAB4D9, "s'il ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_A66EDFD8BBF7C02D, "l'idee ")
+SUBS(AR|AA|AS|AN|AI|AP, str_1338FD4C177C9FA5, "amis ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_1D5EA690EF5FD1C4, "mais ")
+SUBS(AR|AA|AN|AI|AO|AP, str_279C5D17219228B4, "animal ")
+SUBS(AR|RGT|AA|AN|AI|AO|AP, str_8C909DCD35D4BFA0, "mal ")
+SUBS(AR|AA|AS|AE|AT|AN, str_27921734FC6C4630, "bras ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN, str_9C15758D0561127B, "jeta ")
+SUBS(AR|AS|AE|AN|AI|AO, str_4909D64AE40AF235, "seul ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_728D44D57F3D5CB5, "luke ")
+SUBS(AR|AA|AS|AT|AI|AP, str_D316E05F7A31C556, "tapis ")
+SUBS(AR|RGT|AA|AS|AT|AI|AP, str_AE1C7C97FC8BC730, "passait ")
+SUBS(AR|AA|AS|AE|AI|AP, str_98E528E6E1AB891E, "epais ")
+SUBS(AR|RGT|AA|AS|AE|AI|AP, str_F7D8B7F7F4102B91, "peake ")
+SUBS(AR|AS|AT|AN|AI|AO, str_818D8DDAB25804FA, "vous ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_CF3E7E7B6F09026E, "longs ")
+SUBS(AR|AA|AS|AT|AN|AP, str_389AFA2E457B3E69, "camp ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_925ABF43C5B70E96, "passant ")
+SUBS(AR|AA|AE|AT|AN|AP, str_FFEC257529F84974, "femme ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_0686EEF367676984, "payer ")
+SUBS(AR|AE|AT|AN|AO|AP, str_39CC5C55E54AE0EF, "tomber ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_7EC4FCA07D149F5D, "pour ")
+SUBS(AR|AA|AS|AE|AN|AO, str_52FB09A529B5AC1E, "deux ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_71AF7338D30200D2, "judas ")
+SUBS(AR|AA|AS|AE|AN|AP, str_E39928C19E258CBE, "demande ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_F40A2652F64BAD03, "pays ")
+SUBS(AR|AT|AN|AI|AO|AP, str_20E52916AEA83DFC, "bulpitt ")
+SUBS(AR|RGT|AT|AN|AI|AO|AP, str_12D789B35778048E, "point ")
+SUBS(AR|AE|AT|AN|AI|AO, str_B2F5969132301C29, "trouve ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_BEAAEA0A6F8EBEC3, "leur ")
+SUBS(AR|AA|AS|AT|AI|AO, str_3CA68843DB6F2127, "fois ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO, str_784042E30FC8CF0A, "lac ")
+SUBS(AR|AA|AE|AN|AO|AP, str_65074CCDD92E4631, "qu'on ")
+SUBS(AR|RGT|AA|AE|AN|AO|AP, str_69712A142CC3282B, "peux ")
+SUBS(AR|AA|AS|AE|AI|AO, str_F1F005E4E14CAF9F, "salle ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_DBF5CCB5C080B8B5, "laisse ")
+SUBS(AR|AS|AT|AN|AO|AP, str_E0435EDC3EE5DE27, "coup ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_50133292145C1A36, "mots ")
+SUBS(AR|AA|AE|AT|AI|AO, str_C09D7F6A02526130, "voix ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_79A0BB6D702B34A9, "leva ")
+SUBS(AR|AA|AE|AN|AI|AP, str_DCA565EF88646A19, "aime ")
+SUBS(AR|RGT|AA|AE|AN|AI|AP, str_A64527EB8358356B, "n'ai ")
+SUBS(AR|AS|AE|AT|AI|AP, str_5118FCC0399F38AC, "esprit ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_405D34AF2264AD2A, "pris ")
+SUBS(AR|AA|AS|AE|AT|AP, str_3FC447E0B1693052, "apres ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_0453CA40903350E1, "parce ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_928C8C0A02A7EB95, "combat ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_18BBE181BAB96E83, "poussant ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_251617D0E028ECE3, "veux ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_ED52DD3F41A23E90, "nouveau ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_763CFE2AD899C547, "telephone ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_B91211B1C7BF142A, "lumiere ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_B1B7CEEBE8C4B932, "desespoir ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_323C08EE5775F9CB, "police ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_C2CA1BF2E422BA55, "chemin ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_BBDE7CF9FA9FE9E6, "merci ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_A069AFF6B6716321, "capital ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_DD33617FFDEE917C, "posait ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_950566F32F1EBB8F, "comme ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_A37C242ABE327536, "personne ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_6F460357096E0596, "d'accord ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO|AP, str_182416B9DC666D5A, "passage ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_F92CC0DC1482DEC1, "qu'il ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_CD72C767C5B6D6FE, "mieux ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_8B9405490B496F6F, "alors ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO, str_8ED6918DB98B9605, "laisser ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_9180E61C10C3729B, "s'appelle ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_B45035A406DC95FA, "l'aide ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_29FE2A4CE634943A, "forme ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_151F217B67BA2BC9, "pourtant ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_47E63E96300262A3, "depuis ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_3325F4C200714AFF, "hommes ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_69600B03931090D9, "commis ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_FC0C294EC6F5001A, "jimbo ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_18302BCF2C813E23, "d'eau ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_EE1B0995F3E463E4, "jusqu'a ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_E252EF88BE5FC18F, "chose ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_50D3BF444ADA147E, "leurs ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_2328F43B45266617, "femmes ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_DF6E230A237C3578, "pendant ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_344987CAE0102D4A, "appeler ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO|AP, str_9E45601B45E6A290, "l'air ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_F74F861955523A82, "quelques ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_30950D620683AF51, "la-dedans ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_93C5B21D9ECF3845, "salim ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_FB61EB5A0298BAB9, "maison ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_D38B77B3B282F7EF, "vraiment ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_D25857E29FFF781D, "n'etait ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_2E642CEEC56D4266, "film ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_602AE79E1C6F73F6, "pouvait ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_924E469EF66C97F9, "semaine ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_D1FF0E930BEAB21B, "j'ai ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_229DB63F9CAE985C, "devant ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_C8C3FE7AD27CA4CF, "jardin ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_FEABAA3D7026B6A4, "c'etait ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_4F6C506138FB813D, "paris ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_E741DF3E0D367E7F, "champ ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_FCF69A9140927069, "massif ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_E216469D374207EA, "avons ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO, str_244FCF4397B9D4E5, "lanca ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_37F6FFA75B31CE13, "qu'est-ce ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_432C4A96D08E0AB5, "presque ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_A1ECA5B498E1A83A, "thomas ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_176F238754B63C2C, "mauvais ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_A4100F3934E1B845, "qu'ils ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_2EAA520471AA5336, "musique ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_A436652AE4501CD4, "repondit ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_F1FA2F03D5969C88, "longtemps ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_33CD65AFB4B4BA6A, "famille ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_40469D10CEE2718D, "pourquoi ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_B7C7AA91F5D47EA4, "chaque ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_7140D3F219DA935B, "lorsque ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_AC7DF9B6CE60B66A, "d'avoir ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_156052B6D0CC2F4A, "place ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_A12E737B76D8C8DD, "chambre ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_BC2EBDFC3C3596EF, "j'avais ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_61C4FD13C960A702, "semblait ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_D91637207DF55DED, "larmes ")
diff --git a/keyboards/gboards/dicts/aset/hu-keymap.def b/keyboards/gboards/dicts/aset/hu-keymap.def
new file mode 100644
index 00000000000..a6b236fde3d
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/hu-keymap.def
@@ -0,0 +1,395 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AS, KC_S)
+PRES(AN, KC_N)
+PRES(AT, KC_T)
+PRES(AP, KC_P)
+PRES(AI, KC_I)
+PRES(AA, KC_A)
+PRES(AO, KC_O)
+PRES(AE, KC_E)
+PRES(AE|AO, KC_MINS)
+PRES(AA|AT, KC_F)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+PRES(AN|AI, KC_H)
+PRES(AE|AP, KC_QUOT)
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AS|AI, KC_K)
+PRES(AA|AN, KC_Q)
+PRES(AI|AO, KC_L)
+PRES(AN|AP, KC_M)
+PRES(AT|AP, KC_BSPC)
+PRES(AA|AI, KC_Z)
+PRES(AA|AP, KC_QUOT)
+PRES(AT|AI, KC_V)
+PRES(AA|AE, KC_X)
+PRES(AE|AI, KC_COMM)
+PRES(AE|AT, KC_R)
+PRES(AS|AT, KC_C)
+PRES(AS|AN, KC_J)
+PRES(AT|AN, KC_B)
+PRES(AA|AS, KC_W)
+PRES(AO|AP, KC_SCLN)
+PRES(AS|AO, KC_DOT)
+PRES(AT|AO, KC_G)
+PRES(AS|AE, KC_D)
+PRES(AN|AO, KC_U)
+PRES(AE|AN, KC_Y)
+SUBS(AR|AS|AE|AP, str_9B6ECB908551EEF3, "'s ")
+SUBS(AR|AN|AI|AO, str_37397E05936EF60B, "hol ")
+SUBS(AR|AI|AO|AP, str_B03D03B4D5AE548B, "pl ")
+SUBS(AR|AA|AS|AT, str_51931D246213D5BA, "fact ")
+SUBS(AR|AS|AN|AI, str_E9D65B1F0CC7B588, "his ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AS|AT|AO, str_4397946AE21A0B1E, "sot ")
+SUBS(AR|AE|AT|AP, str_D89F06941F4B44CE, "peter ")
+SUBS(AR|AS|AI|AP, str_50E8EDA878796D86, "sip ")
+SUBS(AR|AN|AO|AP, str_D443D6F10491FB2B, "up ")
+SUBS(AR|AA|AE|AO, str_AB819235D216611C, "-a ")
+SUBS(AR|AA|AS|AE, str_C8F40BD7102B7E24, "we ")
+SUBS(AR|AA|AE|AT, str_55C1EFD3A930269F, "arra ")
+SUBS(AR|AS|AT|AN, str_7C050C0539297C01, "stb ")
+SUBS(AR|AA|AE|AP, str_102DD7D0196F36BB, "a' ")
+SUBS(AR|AA|AE|AN, str_83396DA0D7927D05, "any ")
+SUBS(AR|AN|AI|AP, str_DD31FA4C91A58242, "mi ")
+SUBS(AR|AA|AS|AP, str_467C897077B58F08, "pas ")
+SUBS(AR|AE|AT|AN, str_7D2440FBBF9D0256, "be ")
+SUBS(AR|AS|AE|AT, str_0E0F5E232A8BAABC, "este ")
+SUBS(AR|AA|AT|AN, str_1E9FF302BE0690D7, "abban ")
+SUBS(AR|AE|AO|AP, str_AAB1D405F8D273AF, "pope ")
+SUBS(AR|AT|AN|AP, str_C8416EF912866543, "bp ")
+SUBS(AR|AT|AI|AO|AP, str_D83E8C3C544E3C39, "lopott ")
+SUBS(AR|AS|AT|AN|AP, str_DE6CBE601C534F3D, "cm ")
+SUBS(AR|AA|AE|AT|AI, str_A170D207626BFA6C, "ezt ")
+SUBS(AR|AE|AN|AO|AP, str_9A83D40FDDF2FD43, "unnep ")
+SUBS(AR|AA|AN|AO|AP, str_BB21C3559B0505B3, "napon ")
+SUBS(AR|AA|AS|AT|AI, str_8F4D5A11E1075008, "csak ")
+SUBS(AR|AA|AS|AT|AO, str_035228752979D35D, "two ")
+SUBS(AR|AA|AS|AI|AP, str_FF423FC7030B5706, "kap ")
+SUBS(AR|AS|AN|AI|AO, str_492EBC90B1BA2D9D, "jol ")
+SUBS(AR|AS|AE|AT|AN, str_47B7DB9C9515D10F, "esetben ")
+SUBS(AR|AS|AT|AO|AP, str_2F7B8DE60CE15A4C, "csopp ")
+SUBS(AR|AS|AE|AI|AP, str_89EF8827BC5CAFEE, "kepes ")
+SUBS(AR|AA|AS|AT|AN, str_38CBA2C343AD7A58, "sajat ")
+SUBS(AR|AE|AI|AO|AP, str_56B0C240EA9FE481, "people ")
+SUBS(AR|AE|AT|AI|AP, str_E67528768F8F1A01, "epitett ")
+SUBS(AR|AS|AI|AO|AP, str_B21314858751F43A, "pokol ")
+SUBS(AR|AT|AN|AI|AP, str_77E57956A656C9B8, "mint ")
+SUBS(AR|AA|AT|AI|AP, str_51714F0721910950, "pava ")
+SUBS(AR|AS|AN|AI|AP, str_A0C8194E7629B540, "mik ")
+SUBS(AR|AA|AS|AE|AT, str_467AF751A93D5FEA, "were ")
+SUBS(AR|AS|AE|AO, str_282BCAA32CE4859D, "eso ")
+SUBS(AR|RGT|AS|AE|AO, str_8A213E5D6F2BA5DB, "-es ")
+SUBS(AR|AE|AN|AP, str_E17A5ED5A1A6AF4A, "eppen ")
+SUBS(AR|RGT|AE|AN|AP, str_BFDFBBCE59808C23, "nem ")
+SUBS(AR|AT|AI|AO, str_D9780B17825EA8D9, "volt ")
+SUBS(AR|RGT|AT|AI|AO, str_11DA009B8D0699A1, "ivott ")
+SUBS(AR|AT|AN|AI, str_0A908952F66CD009, "th ")
+SUBS(AR|RGT|AT|AN|AI, str_D5ACE27258AF148F, "hit ")
+SUBS(AR|AA|AT|AI, str_5D5F572D27C24D40, "azt ")
+SUBS(AR|RGT|AA|AT|AI, str_D7978D4AE69E4592, "if ")
+SUBS(AR|AA|AN|AI, str_BF40C27E59DAAC7B, "ah ")
+SUBS(AR|RGT|AA|AN|AI, str_BF044DB5EE261598, "ha ")
+SUBS(AR|AT|AN|AO, str_68E7CCE8B282E00C, "tobb ")
+SUBS(AR|RGT|AT|AN|AO, str_3F3B1F8B5A3E409E, "not ")
+SUBS(AR|AA|AI|AP, str_01085B25BEA005B6, "apai ")
+SUBS(AR|RGT|AA|AI|AP, str_CE7F7248BB638D9D, "papi ")
+SUBS(AR|AE|AI|AO, str_05ED48987A1828F9, "el ")
+SUBS(AR|RGT|AE|AI|AO, str_05A9C753CDE4911A, "le ")
+SUBS(AR|AA|AN|AP, str_77BE4D44A5F2AD27, "am ")
+SUBS(AR|RGT|AA|AN|AP, str_2A907D456EBB3E24, "ma ")
+SUBS(AR|AS|AE|AN, str_8AB9BD4B2DD7D691, "ej ")
+SUBS(AR|RGT|AS|AE|AN, str_57FCD18102003294, "need ")
+SUBS(AR|AS|AN|AO, str_3D29840CE477716A, "son ")
+SUBS(AR|RGT|AS|AN|AO, str_6E23CC4BFF56B58C, "jo ")
+SUBS(AR|AE|AN|AI, str_6766245913211D5A, "enni ")
+SUBS(AR|RGT|AE|AN|AI, str_C4D48E3111A94BAB, "he ")
+SUBS(AR|AS|AE|AI, str_3E9F631F6868B537, "did ")
+SUBS(AR|RGT|AS|AE|AI, str_A1A4E3A00C59C039, "ide ")
+SUBS(AR|AA|AN|AO, str_FD846B750BDF7708, "au ")
+SUBS(AR|RGT|AA|AN|AO, str_1CCC7EC82E802088, "onnan ")
+SUBS(AR|AE|AT|AI, str_B7E480E46E7DFA02, "vette ")
+SUBS(AR|RGT|AE|AT|AI, str_27FACFBC140A967A, "irt ")
+SUBS(AR|AA|AS|AN, str_4BC4F429F19A0C20, "aj ")
+SUBS(AR|RGT|AA|AS|AN, str_BEF7CEEB940C40B9, "jaj ")
+SUBS(AR|AS|AI|AO, str_F5D70B36185F7036, "sok ")
+SUBS(AR|RGT|AS|AI|AO, str_80673F3F8044C003, "ok ")
+SUBS(AR|AA|AS|AI, str_6B36FC68063C30F0, "aki ")
+SUBS(AR|RGT|AA|AS|AI, str_7E1764BDF98728ED, "iszik ")
+SUBS(AR|AA|AE|AI, str_F7221C737CE4B0D8, "ez ")
+SUBS(AR|RGT|AA|AE|AI, str_F96D1FD4510B04BB, "ize ")
+SUBS(AR|AA|AT|AP, str_43CCF22EECA5DEC5, "apat ")
+SUBS(AR|RGT|AA|AT|AP, str_1D23167759D2504B, "papat ")
+SUBS(AR|AA|AT|AO, str_6F8D612584B7A93E, "fog ")
+SUBS(AR|RGT|AA|AT|AO, str_BF38370C83727D39, "of ")
+SUBS(AR|AA|AI|AO, str_9F8EB086C328F80A, "all ")
+SUBS(AR|RGT|AA|AI|AO, str_7E7904D7326BCF29, "la ")
+SUBS(AR|AE|AT|AO, str_B5E6B5782EE16BAB, "eg ")
+SUBS(AR|RGT|AE|AT|AO, str_6584CD3D35668CB7, "oreg ")
+SUBS(AR|AE|AN|AO, str_3CF92217D792ADB9, "eu ")
+SUBS(AR|RGT|AE|AN|AO, str_9A6C6AD5C510E57E, "one ")
+SUBS(AR|AS|AT|AI, str_FE3764D2CF4CD20F, "cit ")
+SUBS(AR|RGT|AS|AT|AI, str_94B0C1ADEB11A2D2, "kit ")
+SUBS(AR|AT|AN|AI|AO|AP, str_2CB95DC376B85715, "mig ")
+SUBS(AR|AE|AT|AI|AO|AP, str_22F64F6B5A7CF6B1, "lepett ")
+SUBS(AR|AA|AE|AT|AI|AP, str_9F69CCD23524A2D6, "ipari ")
+SUBS(AR|AA|AE|AN|AO|AP, str_AAB0586E90F3DB2B, "nyoman ")
+SUBS(AR|AA|AS|AE|AT|AO, str_303554932BA8F823, "adott ")
+SUBS(AR|AS|AT|AN|AI|AP, str_C7230E5D62C6574F, "cim ")
+SUBS(AR|AS|AT|AI|AO, str_8203D41944F59853, "titkos ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_9BA6433AE277E622, "kolto ")
+SUBS(AR|AE|AN|AI|AP, str_CD20717924E4F553, "enyim ")
+SUBS(AR|RGT|AE|AN|AI|AP, str_7DCF1B4C44D94FF6, "menni ")
+SUBS(AR|AA|AE|AN|AP, str_3F6F3E3C536FC149, "anyam ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_223DD41A813D045F, "many ")
+SUBS(AR|AA|AS|AT|AP, str_B931D3C42055A455, "csapat ")
+SUBS(AR|RGT|AA|AS|AT|AP, str_718051F50C1745F9, "past ")
+SUBS(AR|AA|AS|AN|AI, str_D80727E4BA0DDFEA, "annak ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_C0B6DE681C3A7A8F, "hisz ")
+SUBS(AR|AA|AE|AT|AN, str_5E4A4DA51E7CEA4B, "bar ")
+SUBS(AR|RGT|AA|AE|AT|AN, str_CBB292AE06389AEF, "natty ")
+SUBS(AR|AA|AE|AN|AO, str_6A810E6F1345F79D, "que ")
+SUBS(AR|RGT|AA|AE|AN|AO, str_0998DE34E163A419, "-an ")
+SUBS(AR|AA|AS|AE|AI, str_57DB6A8244965367, "ezek ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_3188F741A91C21B7, "kezd ")
+SUBS(AR|AT|AN|AI|AO, str_48BAA03F3958F7D6, "tobbi ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_1DA8E7958266845B, "otthon ")
+SUBS(AR|AA|AT|AO|AP, str_33D3B257A22359EF, "fopap ")
+SUBS(AR|RGT|AA|AT|AO|AP, str_65AE91DF2BABC307, "papot ")
+SUBS(AR|AE|AT|AO|AP, str_A89756F0BEB24A46, "gep ")
+SUBS(AR|RGT|AE|AT|AO|AP, str_8DDF4266066B432B, "por ")
+SUBS(AR|AA|AS|AI|AO, str_99918D3062109DEA, "azok ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_7E0B205FA174F770, "law ")
+SUBS(AR|AA|AT|AN|AP, str_9B718EA927D8ED65, "babam ")
+SUBS(AR|RGT|AA|AT|AN|AP, str_061FDED299547EE8, "mta ")
+SUBS(AR|AS|AE|AT|AP, str_3BEBEA0C0A68F107, "csepp ")
+SUBS(AR|RGT|AS|AE|AT|AP, str_8DAFD4DF49BEF2D5, "pest ")
+SUBS(AR|AA|AT|AN|AI, str_868067C442CD38C1, "van ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_C58EDF9C4F3ABF68, "hat ")
+SUBS(AR|AA|AE|AT|AO, str_DAE84F2729ACCE2B, "for ")
+SUBS(AR|RGT|AA|AE|AT|AO, str_10A7A601DE6C9DD5, "ora ")
+SUBS(AR|AE|AT|AN|AP, str_7298C815AC553A73, "ember ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_10565653235128D1, "mert ")
+SUBS(AR|AA|AN|AI|AO, str_516F020A9E389CB6, "azon ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_289E22A94354DA82, "hozza ")
+SUBS(AR|AA|AN|AI|AP, str_0399462E63D0085B, "ami ")
+SUBS(AR|RGT|AA|AN|AI|AP, str_446E12F7C9FCBEFC, "mai ")
+SUBS(AR|AS|AT|AN|AO, str_0C5D33A5EEBD385B, "bus ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_3DE03C65AEF3DE25, "jott ")
+SUBS(AR|AE|AN|AI|AO, str_7623453E9CFB03D4, "ellen ")
+SUBS(AR|RGT|AE|AN|AI|AO, str_C2547C442D138378, "oly ")
+SUBS(AR|AE|AT|AN|AI, str_0C571CCD7FA5FAEF, "the ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_04F396FE937765D9, "het ")
+SUBS(AR|AA|AS|AE|AO, str_C806F7817F5AACD9, "ado ")
+SUBS(AR|RGT|AA|AS|AE|AO, str_584C679B94ABF2B0, "oda ")
+SUBS(AR|AA|AE|AI|AO, str_D5C749255A53E902, "ezzel ")
+SUBS(AR|RGT|AA|AE|AI|AO, str_F68CBBCCFD4C1B83, "lexi ")
+SUBS(AR|AS|AE|AN|AI, str_FB171C2D065E9AA6, "ennek ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_102E5E1A734F1CE2, "neki ")
+SUBS(AR|AS|AE|AI|AO, str_33D765DDDE19EF31, "elso ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_8EC2B1D21CC5F2B4, "kell ")
+SUBS(AR|AA|AT|AI|AO, str_37FEE4A279EDEAA4, "alatt ")
+SUBS(AR|RGT|AA|AT|AI|AO, str_BC713E0EEBBC72E0, "igaz ")
+SUBS(AR|AT|AN|AO|AP, str_2E80A6F9779A636C, "gomb ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_A403E430455F3DAE, "mogott ")
+SUBS(AR|AA|AS|AE|AP, str_3E575316BD96B88C, "apad ")
+SUBS(AR|RGT|AA|AS|AE|AP, str_D6DAEAB665CE4271, "passed ")
+SUBS(AR|AS|AE|AN|AO, str_68105B858B425CB4, "du ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_E8DD0B7F8884F0E0, "und ")
+SUBS(AR|AA|AS|AN|AO, str_4E401A4F5E3E8371, "sajnos ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_2638B0CBA284BCE0, "janos ")
+SUBS(AR|AA|AE|AT|AP, str_460C0F92618276C4, "expert ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_F552C5CE7412D067, "par ")
+SUBS(AR|AA|AE|AN|AI, str_9F25E5B8B8BE523B, "ezen ")
+SUBS(AR|RGT|AA|AE|AN|AI, str_187F85E2E57920BD, "nehany ")
+SUBS(AR|AA|AS|AE|AN, str_C1FDC4AB8597A676, "and ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_C161ABA85FEDF657, "new ")
+SUBS(AR|AS|AE|AT|AO, str_0E96270660D2B068, "eros ")
+SUBS(AR|RGT|AS|AE|AT|AO, str_E0A0247DB2DA7153, "ordog ")
+SUBS(AR|AE|AT|AI|AO, str_3D2C74C95AD3693E, "elott ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_6517664B6491B1A6, "lett ")
+SUBS(AR|AS|AE|AN|AP, str_C373302FE1A4C7A3, "sem ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_4B03060D57A25BCD, "nemes ")
+SUBS(AR|AA|AI|AO|AP, str_7BBB5B013A64A6BD, "alap ")
+SUBS(AR|RGT|AA|AI|AO|AP, str_F03C162C8DF0F420, "pal ")
+SUBS(AR|AA|AT|AN|AO, str_28BB10C5BB93CDE6, "about ")
+SUBS(AR|RGT|AA|AT|AN|AO, str_FAD744D3AA1797A8, "utan ")
+SUBS(AR|AA|AS|AN|AP, str_1BB06B74B35A0120, "apja ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_3AD00291CF91C488, "mas ")
+SUBS(AR|AS|AT|AN|AI, str_F67830C3E4E560AB, "this ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_FA7EE41D18275CAB, "nincs ")
+SUBS(AR|AS|AN|AO|AP, str_E3374BF3CE8F906D, "sum ")
+SUBS(AR|RGT|AS|AN|AO|AP, str_425D8539BDE857C4, "mos ")
+SUBS(AR|AE|AT|AN|AO, str_3BDDACF6D97E90C3, "egy ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_EED2E60891C47179, "ugy ")
+SUBS(AR|AS|AE|AT|AI, str_A95B29E48DED6617, "vers ")
+SUBS(AR|RGT|AS|AE|AT|AI, str_45EFB52120C9D384, "ket ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_AC04ED0C829A4218, "szerint ")
+SUBS(AR|AA|AT|AI|AO|AP, str_40E8B48F5D8A434B, "allapot ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_DBE3E2CBB135AB14, "palota ")
+SUBS(AR|AE|AT|AN|AO|AP, str_21CFADCBE4A679D8, "engem ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_FDE6294FBD602643, "meg ")
+SUBS(AR|AA|AN|AI|AO|AP, str_41F275A21A18EE82, "alom ")
+SUBS(AR|RGT|AA|AN|AI|AO|AP, str_82B33F1AF8703293, "hozzam ")
+SUBS(AR|AS|AT|AN|AI|AO, str_AF3D9EAA19F822D9, "such ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_01B39F439069940D, "king ")
+SUBS(AR|AA|AS|AE|AT|AI, str_320CCBA364330797, "akar ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI, str_A10556A0EEBDA5A2, "kezet ")
+SUBS(AR|AS|AE|AN|AI|AP, str_61D9F0C9A4D5567C, "semmi ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_2D26347C93F557E4, "minden ")
+SUBS(AR|AA|AS|AE|AI|AO, str_6BF6E4E251D135ED, "szel ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_21A4D745F57C3A0E, "lesz ")
+SUBS(AR|AA|AS|AE|AI|AP, str_9A1C01570073B1F1, "szep ")
+SUBS(AR|RGT|AA|AS|AE|AI|AP, str_DEDC388B166E48B4, "kepzes ")
+SUBS(AR|AA|AE|AT|AN|AP, str_3D059807AC8370D9, "ram ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_89FE4E2FCC369BE7, "mar ")
+SUBS(AR|AS|AE|AT|AN|AI, str_5CDCF79352E2D725, "these ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_8F097DCB8D574480, "isten ")
+SUBS(AR|AS|AE|AT|AN|AO, str_DB50823FD4749E7F, "tudott ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_FB56E3054322FAD0, "ures ")
+SUBS(AR|AA|AS|AN|AI|AO, str_C734CF51599633D1, "soha ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_DFD24D003A87651B, "kozul ")
+SUBS(AR|AA|AS|AT|AO|AP, str_BFB27CAE42A6E567, "csapott ")
+SUBS(AR|RGT|AA|AS|AT|AO|AP, str_763E47DF74118590, "papsag ")
+SUBS(AR|AA|AS|AT|AI|AP, str_42B66480C80CC507, "csaptak ")
+SUBS(AR|RGT|AA|AS|AT|AI|AP, str_03E7347EBE66484F, "kapta ")
+SUBS(AR|AA|AS|AE|AN|AI, str_43D073A61B4D28EA, "when ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_B8157EA41E09D921, "had ")
+SUBS(AR|AS|AE|AT|AI|AP, str_8F0137935E32C458, "despite ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_B595314AE8340EE9, "kepet ")
+SUBS(AR|AE|AT|AN|AI|AO, str_38D7A2CAD335BE81, "bele ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_E41DD18023C6647E, "hogy ")
+SUBS(AR|AA|AE|AT|AN|AI, str_377CA225DD99D9A1, "tehat ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_89E5D4BB42BF5AC6, "have ")
+SUBS(AR|AA|AS|AE|AN|AP, str_53F857754C3C0D13, "adam ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_A18434730F75059D, "majd ")
+SUBS(AR|AS|AT|AI|AO|AP, str_0D9E2E52F68C6937, "topic ")
+SUBS(AR|RGT|AS|AT|AI|AO|AP, str_6E78098BA53F15EE, "kopott ")
+SUBS(AR|AS|AE|AT|AO|AP, str_E90A55281F13F652, "troops ")
+SUBS(AR|RGT|AS|AE|AT|AO|AP, str_5204C59B3BF29E2F, "process ")
+SUBS(AR|AA|AT|AN|AI|AO, str_3EA15FBA2936663D, "volna ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_1A8AF5FFFE101892, "hova ")
+SUBS(AR|AA|AS|AE|AN|AO, str_40F2EC1124C9B78E, "adjon ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_C32E34873DABA71F, "odaadja ")
+SUBS(AR|AS|AE|AT|AI|AO, str_D2837F2E7BBDAA50, "ekkor ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO, str_96D359E17A6D2BA5, "kellett ")
+SUBS(AR|AA|AE|AT|AN|AO, str_9F146ACA9C90D112, "baro ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_40C50E84AC0DBCD1, "nagy ")
+SUBS(AR|AA|AS|AT|AN|AP, str_BF985650D5802531, "tamas ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_B890AAEB3A286EF0, "mast ")
+SUBS(AR|AS|AE|AN|AO|AP, str_29703C252684465E, "some ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_D565FA141FD4F9EF, "modon ")
+SUBS(AR|AS|AT|AN|AO|AP, str_430B184EA4F97301, "common ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_502F482B79087297, "most ")
+SUBS(AR|AS|AN|AI|AO|AP, str_6CBFC109D0CB9CF1, "simon ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_D6C155E4E107931B, "miklos ")
+SUBS(AR|AA|AS|AN|AO|AP, str_BC547FDD34973C70, "samu ")
+SUBS(AR|RGT|AA|AS|AN|AO|AP, str_F44C2BB43789DE80, "pompas ")
+SUBS(AR|AA|AE|AN|AI|AP, str_A22179099F950793, "amennyi ")
+SUBS(AR|RGT|AA|AE|AN|AI|AP, str_22FC432392DA91E6, "hanem ")
+SUBS(AR|AA|AE|AN|AI|AO, str_0A49CFDE2344AE9B, "equal ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_4F2D867FD47483FB, "olyan ")
+SUBS(AR|AS|AE|AN|AI|AO, str_4CF809129F2D0BFD, "ejjel ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_036D29F61B9684AD, "nelkul ")
+SUBS(AR|AA|AS|AT|AN|AI, str_87226571AE131D8A, "with ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_26B0653E8710FEDE, "inkabb ")
+SUBS(AR|AE|AT|AN|AI|AP, str_224997ADD6DF35BA, "them ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_7D45403EFC1BFD0D, "miert ")
+SUBS(AR|AA|AT|AN|AI|AP, str_2F42442143143EA2, "amit ")
+SUBS(AR|RGT|AA|AT|AN|AI|AP, str_B6444DF8E7312B64, "mintha ")
+SUBS(AR|AA|AS|AI|AO|AP, str_C2D372336767C50C, "alapos ")
+SUBS(AR|RGT|AA|AS|AI|AO|AP, str_D3EE0E83D1EEB82F, "papok ")
+SUBS(AR|AA|AS|AN|AI|AP, str_F21DB8374859455A, "szama ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_BE1B4C56E533EAFB, "masik ")
+SUBS(AR|AA|AS|AE|AT|AN, str_6453B08D72C44161, "rajta ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN, str_BDF064E3883FFAE9, "jart ")
+SUBS(AR|AE|AN|AI|AO|AP, str_8FB892103C9E200F, "elem ")
+SUBS(AR|RGT|AE|AN|AI|AO|AP, str_77C0A2147D355169, "mely ")
+SUBS(AR|AA|AS|AT|AN|AO, str_78430482BCFE38F2, "fogja ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO, str_1ADC58F447F59EE9, "jobban ")
+SUBS(AR|AS|AE|AT|AN|AP, str_BEB053B5FB649ED1, "erdemes ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_74BC58FFB3FFA7C9, "mester ")
+SUBS(AR|AA|AS|AE|AT|AP, str_FA92C0FE0EF2B583, "arpad ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_E7FA8A19E3858076, "peace ")
+SUBS(AR|AA|AT|AN|AO|AP, str_612AE2FB632AD051, "among ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_ECCCB6576455849A, "maga ")
+SUBS(AR|AA|AE|AT|AI|AO, str_6676520F7E7AA391, "fel ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_EC81EEB3F21B0472, "left ")
+SUBS(AR|AA|AE|AT|AO|AP, str_53235F9C2335BF07, "apro ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_A8AE32F21A88BA59, "poeta ")
+SUBS(AR|AA|AS|AT|AI|AO, str_487552197D425C4E, "voltak ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO, str_BAD14FC6F00358B6, "kozott ")
+SUBS(AR|AS|AE|AI|AO|AP, str_DD746578C42672FD, "spoke ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_C009B8F143DC22DE, "peoples ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_5324FCBBE5A9585B, "maganak ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_411DB80E60AE991F, "gaspar ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO|AP, str_4D2A6306F9C9BFCB, "power ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_284877FCB32E84B5, "szepen ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_844E63B941315479, "messze ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_FC05E013234E5A14, "csupan ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_0D23985D5198CDA5, "magas ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_34E8A4031BB05535, "selyem ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_9902C7D0D33F3D27, "midon ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_8B60EA228E7F71C0, "velem ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_58B17637C07A71CD, "mellett ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_77B0E84AEA064820, "valami ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_D1E19EAF693C9B7F, "lattam ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_AF5825DD354EA7E9, "tamadt ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_1CA8590D125272C4, "matyas ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_95BD165EBEA90ED5, "ereztem ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_213E88BABD9FE059, "nemzeti ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_2B75D0DD3E459E5F, "adom ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_90AE684911BCF785, "mondja ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_E86DFF8A52DD5669, "semmit ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_AB7771EA9E40A305, "mindent ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_6F8A5E56C146E49F, "viszont ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO, str_A5B856782344BABA, "ifju ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_3ED8C174F4ACDCC7, "alapjan ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_53CAA67CB69EDB69, "munka ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_FD2DF433CAF55EFF, "csapatok ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_624DDF9DCD9AEBD0, "kapott ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_AC7D659EEE5A0B19, "tudom ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_F191F3FE9AB5586C, "mondott ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_B0EE5C054062A407, "egyik ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_B555E87F1EDA15C6, "korul ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_AD61B487DF2D6843, "eposz ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_9F19665F1AF00270, "kozepso ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_E38156BC30ACB174, "vagy ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_2E117EEF77FD8BCA, "horvath ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_D906A5D725E0BD47, "amely ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_A74F31F1C5C3D46F, "mihaly ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_B59811E36E56C2F0, "tudja ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO, str_D1C323E3C0A133CD, "ujra ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_E40E3D743B1E59CF, "csoportok ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_69AA16E43132B337, "pedig ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_9C9D8C615998E880, "szamat ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_875DB32764322A77, "masikat ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_9AE3D06B9D0E4FE8, "cimu ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_401EFB5649B2EBB4, "much ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_9C70E74E45AFC0AC, "asszony ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_F5A951B6E348A435, "kisasszony ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_6B0CAA224AC9CFF9, "alapveto ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO|AP, str_1846AB61BEDCA6FD, "polgari ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_30EE0D851BA335AD, "akkor ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO, str_810C08108F997467, "orszag ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_DD225950C067DEF3, "szerepet ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_9657DB1B25D916B0, "persze ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_2DCB6A06FF45764B, "from ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_C5858198FA44CC8A, "magyar ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_70A86B8298B03C50, "co-operative ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_AD56C53361989592, "pasztor ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_421F27E5D397590B, "amelyet ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_D8ABE74215A0FE50, "harom ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_925DF428FD578404, "szamara ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_4FD40E99DDCC2F1C, "mindjart ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_F45FB8B929D22223, "amelyek ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_BAEC2FDB97434FDC, "masodik ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_5C290EABE0107782, "vagyok ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_E8142D9D9E58D463, "kiraly ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_D1DB44FAFF9EA5AF, "egymast ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_C867943D4CEE3307, "mondta ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_BBDA2E4834C56059, "gyermek ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_BF5C21EF50D7C897, "mikor ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_3C30D742993893E7, "amikor ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_88C77D684569B9F9, "magyarok ")
diff --git a/keyboards/gboards/dicts/aset/it-keymap.def b/keyboards/gboards/dicts/aset/it-keymap.def
new file mode 100644
index 00000000000..99edc3df623
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/it-keymap.def
@@ -0,0 +1,399 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AP, KC_P)
+PRES(AE, KC_E)
+PRES(AN, KC_N)
+PRES(AA, KC_A)
+PRES(AT, KC_T)
+PRES(AS, KC_S)
+PRES(AO, KC_O)
+PRES(AI, KC_I)
+PRES(AT|AO, KC_G)
+PRES(AN|AO, KC_U)
+PRES(AA|AN, KC_Q)
+PRES(AO|AP, KC_SCLN)
+PRES(AS|AI, KC_K)
+PRES(AS|AT, KC_C)
+PRES(AN|AP, KC_M)
+PRES(AA|AE, KC_X)
+PRES(AN|AI, KC_H)
+PRES(AA|AS, KC_W)
+PRES(AE|AP, KC_QUOT)
+PRES(AA|AP, KC_QUOT)
+PRES(AE|AO, KC_MINS)
+PRES(AT|AI, KC_V)
+PRES(AE|AI, KC_COMM)
+PRES(AA|AI, KC_Z)
+PRES(AS|AO, KC_DOT)
+PRES(AT|AP, KC_BSPC)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AE|AN, KC_Y)
+PRES(AI|AO, KC_L)
+PRES(AS|AE, KC_D)
+PRES(AS|AN, KC_J)
+PRES(AT|AN, KC_B)
+PRES(AA|AT, KC_F)
+PRES(AE|AT, KC_R)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+SUBS(AR|AN|AO|AP, str_56AF5E7BD571866B, "puo ")
+SUBS(AR|AE|AN|AO, str_0978A85079370611, "oy ")
+SUBS(AR|AA|AS|AN, str_45A403A4960EE226, "san ")
+SUBS(AR|AS|AE|AP, str_CCDC46B0E394BCF4, "de' ")
+SUBS(AR|AE|AI|AP, str_A491E07566DCBCCE, "pie ")
+SUBS(AR|AI|AO|AP, str_404F1EBE03A16630, "poi ")
+SUBS(AR|AS|AE|AT, str_1CFFAF2B6E1CEC1B, "essere ")
+SUBS(AR|AA|AS|AT, str_AEE6EBDC4ABDC3CD, "casa ")
+SUBS(AR|AT|AI|AP, str_D342FE4F178C7A30, "tipi ")
+SUBS(AR|AA|AE|AN, str_6ED1301D90276771, "aye ")
+SUBS(AR|AE|AN|AP, str_5140BEC191346017, "me ")
+SUBS(AR|AS|AN|AI, str_55863E4A819B49C1, "sin ")
+SUBS(AR|AN|AI|AO, str_9A5CC103ABF05E48, "lui ")
+SUBS(AR|AA|AE|AT, str_0437C1EBD8E5369E, "era ")
+SUBS(AR|AS|AI|AP, str_0D73B887B19DE5E2, "spi ")
+SUBS(AR|AE|AT|AP, str_342F8CACA85F0AD6, "per ")
+SUBS(AR|AT|AN|AI, str_F1550476BF0CE003, "bi ")
+SUBS(AR|AT|AO|AP, str_DE2E4C23273EE8E2, "topo ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AE|AO|AP, str_5C0C47AE40B3A39F, "po' ")
+SUBS(AR|AA|AI|AP, str_6667F0578BFD0A36, "piazza ")
+SUBS(AR|AA|AS|AE, str_6E5B393925FE64CE, "da ")
+SUBS(AR|AA|AT|AI, str_DE43249870865F5F, "vita ")
+SUBS(AR|AN|AI|AP, str_DD31FA4C91A58242, "mi ")
+SUBS(AR|AS|AT|AI, str_A5BC7DE4E3DC110E, "ci ")
+SUBS(AR|AS|AE|AT|AI, str_BAD1432F2378793A, "dire ")
+SUBS(AR|AE|AI|AO|AP, str_623DB53C3DB2480D, "pelle ")
+SUBS(AR|AS|AT|AI|AO, str_B1F88E15F68363CC, "cosi ")
+SUBS(AR|AA|AS|AE|AT, str_C95D0B55006DE5FC, "testa ")
+SUBS(AR|AA|AE|AT|AI, str_4FFFF02AF006969A, "aveva ")
+SUBS(AR|AS|AE|AT|AO, str_9EA40F112155FCDC, "stesso ")
+SUBS(AR|AE|AN|AO|AP, str_2CDD05DBC2682B52, "meno ")
+SUBS(AR|AA|AS|AE|AO, str_A286D80C860977DA, "adesso ")
+SUBS(AR|AA|AE|AI|AO, str_4B68781D007741F3, "alle ")
+SUBS(AR|AS|AT|AI|AP, str_244F5B1E2326CF97, "tipici ")
+SUBS(AR|AA|AI|AO|AP, str_25A4B83B88C27ED1, "paio ")
+SUBS(AR|AA|AT|AI|AP, str_01F4123645BA397B, "piatti ")
+SUBS(AR|AA|AE|AI|AP, str_F1903D6A5823483D, "pezzi ")
+SUBS(AR|AA|AT|AO|AP, str_994C84A9B607BE0E, "patto ")
+SUBS(AR|AA|AE|AN|AO, str_6A810E6F1345F79D, "que ")
+SUBS(AR|AA|AS|AT|AI, str_9C531B864818604C, "stava ")
+SUBS(AR|AS|AE|AT|AN, str_72CD595FAA8C6C0C, "sebbene ")
+SUBS(AR|AA|AS|AT|AO, str_4659091C099DDFAA, "cosa ")
+SUBS(AR|AA|AS|AT|AN, str_48D42ABC512FFF33, "basta ")
+SUBS(AR|AS|AO|AP, str_82274D54E6521B8A, "spo ")
+SUBS(AR|RGT|AS|AO|AP, str_BB2A8EBDA4A2BCF1, "posso ")
+SUBS(AR|AA|AT|AO, str_6F7F8C386FF723B1, "fatto ")
+SUBS(AR|RGT|AA|AT|AO, str_BF38370C83727D39, "of ")
+SUBS(AR|AT|AN|AO, str_40ABD5B3D36FA5C6, "tutto ")
+SUBS(AR|RGT|AT|AN|AO, str_87CA49C5238B7C4E, "noto ")
+SUBS(AR|AE|AN|AI, str_7E3D8B1C859776CA, "eh ")
+SUBS(AR|RGT|AE|AN|AI, str_C40F784AA60FD210, "nei ")
+SUBS(AR|AA|AS|AP, str_FAD23F8E4E835984, "spa ")
+SUBS(AR|RGT|AA|AS|AP, str_60CC9352D1FD34D7, "passa ")
+SUBS(AR|AE|AT|AN, str_910551EE6A945C9B, "bene ")
+SUBS(AR|RGT|AE|AT|AN, str_F8D0253717B0F393, "nere ")
+SUBS(AR|AA|AN|AO, str_1151CDEBECCAA9AE, "qua ")
+SUBS(AR|RGT|AA|AN|AO, str_2023844574ACF1BC, "una ")
+SUBS(AR|AS|AT|AO, str_DE28723C3FC514C4, "sotto ")
+SUBS(AR|RGT|AS|AT|AO, str_77C6B8367F5A7C65, "oc ")
+SUBS(AR|AE|AI|AO, str_05ED48987A1828F9, "el ")
+SUBS(AR|RGT|AE|AI|AO, str_05A9C753CDE4911A, "le ")
+SUBS(AR|AS|AE|AI, str_99FABE30DAE0D8A8, "di ")
+SUBS(AR|RGT|AS|AE|AI, str_8A50CBEF7E0A6524, "idee ")
+SUBS(AR|AS|AN|AO, str_D76E07CD94AB4974, "sono ")
+SUBS(AR|RGT|AS|AN|AO, str_FD24805D645E6427, "uso ")
+SUBS(AR|AA|AN|AI, str_10DC0D219B939A2A, "anni ")
+SUBS(AR|RGT|AA|AN|AI, str_BF044DB5EE261598, "ha ")
+SUBS(AR|AA|AS|AO, str_FC4E78282D60163B, "sasso ")
+SUBS(AR|RGT|AA|AS|AO, str_9D30183EB9047071, "ossa ")
+SUBS(AR|AA|AE|AI, str_B001879F60551785, "zie ")
+SUBS(AR|RGT|AA|AE|AI, str_D2F95EA81F7C61D5, "ix ")
+SUBS(AR|AA|AT|AN, str_C24BA9CC30FB290C, "tanta ")
+SUBS(AR|RGT|AA|AT|AN, str_1780D9DFC87A2227, "nata ")
+SUBS(AR|AA|AI|AO, str_C49001FAA655F248, "al ")
+SUBS(AR|RGT|AA|AI|AO, str_7E7904D7326BCF29, "la ")
+SUBS(AR|AA|AT|AP, str_3E864890E72C0E60, "tappa ")
+SUBS(AR|RGT|AA|AT|AP, str_7A06301D23DD2E0F, "pat ")
+SUBS(AR|AE|AT|AI, str_D1117FAA9027B7CD, "ri ")
+SUBS(AR|RGT|AE|AT|AI, str_2528D620F9E674D2, "ieri ")
+SUBS(AR|AA|AE|AP, str_102DD7D0196F36BB, "a' ")
+SUBS(AR|RGT|AA|AE|AP, str_B4B3DD9B71491729, "pae ")
+SUBS(AR|AS|AE|AN, str_84D94AC64A433897, "sen ")
+SUBS(AR|RGT|AS|AE|AN, str_BAB1682CA062A864, "nes ")
+SUBS(AR|AS|AE|AO, str_16AE4BE38D2F26C0, "do ")
+SUBS(AR|RGT|AS|AE|AO, str_4BBC015B2B32DD62, "od ")
+SUBS(AR|AT|AI|AO, str_D5487803587D95EC, "gli ")
+SUBS(AR|RGT|AT|AI|AO, str_A288625DB86F17FE, "oggi ")
+SUBS(AR|AA|AN|AP, str_F438C1279CCEB43D, "ama ")
+SUBS(AR|RGT|AA|AN|AP, str_2A907D456EBB3E24, "ma ")
+SUBS(AR|AA|AS|AI, str_9E5D002E2AED54A0, "sia ")
+SUBS(AR|RGT|AA|AS|AI, str_423FC7030B57068F, "ka ")
+SUBS(AR|AE|AT|AO, str_7CC2B33170347490, "ero ")
+SUBS(AR|RGT|AE|AT|AO, str_6B77658521E3C3E6, "ore ")
+SUBS(AR|AS|AI|AO, str_7EBCF4E92D0AAB6E, "solo ")
+SUBS(AR|RGT|AS|AI|AO, str_7D5664732C823A0F, "los ")
+SUBS(AR|AA|AS|AE|AT|AN, str_F7E75210C0A5BA5C, "sarebbe ")
+SUBS(AR|AA|AS|AI|AO|AP, str_C74BA5E1FDD1E774, "spazio ")
+SUBS(AR|AT|AN|AI|AO|AP, str_C191DF51E5E13963, "molto ")
+SUBS(AR|AE|AN|AI|AO|AP, str_4A0CA48878CC3BA2, "l'uomo ")
+SUBS(AR|AA|AS|AE|AT|AO, str_4E3C37722A0C3D73, "fosse ")
+SUBS(AR|AE|AT|AI|AO|AP, str_3865ED18BE5305EA, "proprio ")
+SUBS(AR|AS|AE|AT|AI|AO, str_F9944DF29848CF31, "dove ")
+SUBS(AR|AS|AT|AN|AO|AP, str_AF8CB41B072A6FE4, "com ")
+SUBS(AR|AA|AS|AE|AT|AI, str_B5FD136868B969A5, "avesse ")
+SUBS(AR|AA|AS|AE|AO|AP, str_9DBC9AF330EC0230, "appeso ")
+SUBS(AR|AA|AE|AN|AO|AP, str_3378D03D3632B16E, "umane ")
+SUBS(AR|AS|AT|AN|AI|AP, str_A523540C97D0BDFB, "smith ")
+SUBS(AR|AA|AS|AO|AP, str_96C2E0CE0317D0E7, "sposa ")
+SUBS(AR|RGT|AA|AS|AO|AP, str_1839E188792C76D9, "passo ")
+SUBS(AR|AA|AN|AI|AP, str_B74E44C3D09CB3F0, "anima ")
+SUBS(AR|RGT|AA|AN|AI|AP, str_446E12F7C9FCBEFC, "mai ")
+SUBS(AR|AA|AT|AN|AP, str_9C7BB48EBD7121E3, "fama ")
+SUBS(AR|RGT|AA|AT|AN|AP, str_06AABBFC9BF9658F, "mat ")
+SUBS(AR|AT|AN|AI|AO, str_CFFF206084A05BAE, "tutti ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_E6432621F32A4D14, "ogni ")
+SUBS(AR|AS|AT|AO|AP, str_790F8C89A50660DF, "scopo ")
+SUBS(AR|RGT|AS|AT|AO|AP, str_74EB943165D62B4B, "poco ")
+SUBS(AR|AS|AE|AT|AP, str_C91EE18C530C275D, "c'e ")
+SUBS(AR|RGT|AS|AE|AT|AP, str_2628C9BCEA0406C5, "prese ")
+SUBS(AR|AA|AS|AE|AP, str_627FBA06562052E8, "spada ")
+SUBS(AR|RGT|AA|AS|AE|AP, str_4C2B5D9701B5E7E4, "paese ")
+SUBS(AR|AA|AN|AI|AO, str_E6F04AE213D415C8, "qui ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_3B61C22CC87E894D, "hanno ")
+SUBS(AR|AT|AI|AO|AP, str_5C160B9C40438458, "tipo ")
+SUBS(AR|RGT|AT|AI|AO|AP, str_D8BD43620A5A4529, "piglio ")
+SUBS(AR|AA|AS|AE|AN, str_C1FDC4AB8597A676, "and ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_C161ABA85FEDF657, "new ")
+SUBS(AR|AE|AN|AI|AP, str_11F23070596BCAF8, "ehm ")
+SUBS(AR|RGT|AE|AN|AI|AP, str_D838670506B7AA3B, "miei ")
+SUBS(AR|AE|AT|AO|AP, str_1A5BF9E9D441E258, "troppo ")
+SUBS(AR|RGT|AE|AT|AO|AP, str_14D6F19510A426C3, "pero ")
+SUBS(AR|AA|AS|AI|AP, str_0AD9D3DC11C3CE08, "sappia ")
+SUBS(AR|RGT|AA|AS|AI|AP, str_976D145B2EE388B1, "passi ")
+SUBS(AR|AE|AT|AN|AI, str_5C9AE5CFAF65E1D0, "viene ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_96DA1FCA53585DF0, "niente ")
+SUBS(AR|AA|AS|AI|AO, str_0649863385DBE960, "sola ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_72890DBD1C78F687, "ossia ")
+SUBS(AR|AE|AT|AI|AP, str_F556D726D7373A4A, "ripete ")
+SUBS(AR|RGT|AE|AT|AI|AP, str_E5BD687CBB82B1A5, "pri ")
+SUBS(AR|AA|AS|AT|AP, str_95C59AB8275627DB, "cap ")
+SUBS(AR|RGT|AA|AS|AT|AP, str_BE8B2457E9B377B0, "passata ")
+SUBS(AR|AA|AE|AN|AI, str_B0D068D005493603, "annie ")
+SUBS(AR|RGT|AA|AE|AN|AI, str_58BAA03789672B90, "haze ")
+SUBS(AR|AT|AN|AO|AP, str_C7B05810B9878F2F, "tom ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_63598A0CFD4270CA, "punto ")
+SUBS(AR|AE|AN|AI|AO, str_7623453E9CFB03D4, "ellen ")
+SUBS(AR|RGT|AE|AN|AI|AO, str_0CF1F7705A27D34C, "nel ")
+SUBS(AR|AA|AS|AE|AI, str_11E256C27CCBA3EA, "dai ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_F180086B81853B17, "idea ")
+SUBS(AR|AS|AN|AI|AP, str_5ABDC1D334C04FAB, "spin ")
+SUBS(AR|RGT|AS|AN|AI|AP, str_90D3A69F4C70C55E, "misi ")
+SUBS(AR|AA|AT|AN|AI, str_0EDC36A861828EA6, "avanti ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_9BAF9FCB73B35780, "infatti ")
+SUBS(AR|AA|AS|AN|AO, str_6F460F7ECE1E7238, "sua ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_533368D15997A98F, "naso ")
+SUBS(AR|AE|AT|AI|AO, str_58B1CC51DC4FE20B, "vero ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_D4B8E73F023E075D, "loro ")
+SUBS(AR|AA|AS|AN|AP, str_020E794D3DE91D12, "sam ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_248A481E3372E8F5, "massa ")
+SUBS(AR|AS|AN|AO|AP, str_3A244357A626E54C, "sommo ")
+SUBS(AR|RGT|AS|AN|AO|AP, str_4920A51FCEB17AC1, "possono ")
+SUBS(AR|AS|AE|AI|AP, str_EAB63C3360390CF9, "spie ")
+SUBS(AR|RGT|AS|AE|AI|AP, str_332CF3E306569539, "piedi ")
+SUBS(AR|AA|AE|AT|AO, str_4D7115EC825A991E, "forte ")
+SUBS(AR|RGT|AA|AE|AT|AO, str_10A7A601DE6C9DD5, "ora ")
+SUBS(AR|AE|AT|AN|AP, str_4EE4010F84E9D04E, "be' ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_E04F03BC968CD5E6, "mentre ")
+SUBS(AR|AA|AT|AI|AO, str_A715EAACA829780E, "volta ")
+SUBS(AR|RGT|AA|AT|AI|AO, str_54A8BFB924F22391, "lato ")
+SUBS(AR|AE|AT|AN|AO, str_438E64ED8431B9FB, "tutte ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_994B182E8A14D4DB, "notte ")
+SUBS(AR|AS|AE|AI|AO, str_1861909A5CAE7807, "del ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_C4A6AAB982B673F2, "les ")
+SUBS(AR|AS|AE|AO|AP, str_921E46EAAAFAEBA7, "dopo ")
+SUBS(AR|RGT|AS|AE|AO|AP, str_403F88074C74D7CE, "peso ")
+SUBS(AR|AS|AI|AO|AP, str_E9938D6D376710C4, "spio ")
+SUBS(AR|RGT|AS|AI|AO|AP, str_B991C7C93E522CE7, "polso ")
+SUBS(AR|AT|AN|AI|AP, str_AF1FE256DC6BB784, "tim ")
+SUBS(AR|RGT|AT|AN|AI|AP, str_AC95654B754C0CF8, "miti ")
+SUBS(AR|AS|AE|AN|AP, str_C373302FE1A4C7A3, "sem ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_8A0AC2472D15E0FA, "mese ")
+SUBS(AR|AS|AE|AN|AO, str_7CAA20F18F3CCCC0, "due ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_B07A18C2A67FF244, "nessuno ")
+SUBS(AR|AA|AE|AT|AP, str_97576E1938F64CBA, "aperta ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_185172488624CE89, "parte ")
+SUBS(AR|AS|AN|AI|AO, str_5019074DCD28CF02, "sul ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_B24523534C6D82C9, "john ")
+SUBS(AR|AS|AE|AN|AI, str_780C2F624A3924A3, "sensi ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_EF7717647A1A3977, "jessie ")
+SUBS(AR|AS|AT|AN|AI, str_E81AB44BC199F871, "chi ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_F86C7F9AA66E6D5F, "nisci ")
+SUBS(AR|AA|AT|AN|AO, str_36D0B382FF1F1658, "quanto ")
+SUBS(AR|RGT|AA|AT|AN|AO, str_FF3F3B1F8B5A3E40, "nota ")
+SUBS(AR|AS|AT|AN|AO, str_E826CEF2ACCD90D0, "con ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_5FFA7FB69B0B139A, "jung ")
+SUBS(AR|AA|AE|AN|AP, str_40BB9EEB201E97AB, "appena ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_FAB7798062357072, "'na ")
+SUBS(AR|AA|AE|AT|AN, str_191B510903C8FF15, "entrare ")
+SUBS(AR|RGT|AA|AE|AT|AN, str_8300E6B3E83FADA0, "nera ")
+SUBS(AR|AA|AN|AO|AP, str_8CCDB3FD341FF633, "amo ")
+SUBS(AR|RGT|AA|AN|AO|AP, str_D0F280F187C19C7E, "mano ")
+SUBS(AR|AA|AS|AN|AI, str_50BD1DF3866DB9ED, "assassini ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_4B4CC6627CFD3ECE, "hans ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_940219DB060F1864, "qualcosa ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_94476FDACCCD8072, "storia ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_6325494843B318BE, "meglio ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_C9D0F82BFA1911DE, "poteva ")
+SUBS(AR|AS|AN|AI|AO|AP, str_777DDB8DCAC1AF08, "simili ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_4E5C91FA47B8CED1, "luminoso ")
+SUBS(AR|AA|AS|AN|AI|AP, str_B108D1B3DC496BC8, "spina ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_05E967B8F8DDA9BF, "massima ")
+SUBS(AR|AS|AT|AN|AI|AO, str_4DE8C28979BA2FE4, "cui ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_48FEB3117AC85913, "occhi ")
+SUBS(AR|AA|AN|AI|AO|AP, str_F094E87A1D07FEE1, "animali ")
+SUBS(AR|RGT|AA|AN|AI|AO|AP, str_F9A74DD0BA049580, "piano ")
+SUBS(AR|AS|AE|AT|AO|AP, str_3169E81B5A93E031, "corpo ")
+SUBS(AR|RGT|AS|AE|AT|AO|AP, str_5A582F4F89C94271, "presto ")
+SUBS(AR|AA|AS|AT|AO|AP, str_2B2813B0071D92D4, "capo ")
+SUBS(AR|RGT|AA|AS|AT|AO|AP, str_C67E568D416235BE, "passato ")
+SUBS(AR|AA|AS|AE|AN|AO, str_1694C85ED0344196, "quando ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_C88F6A180EAEB04A, "nessuna ")
+SUBS(AR|AA|AT|AN|AI|AP, str_97B14F117DB21FF6, "bambini ")
+SUBS(AR|RGT|AA|AT|AN|AI|AP, str_AF41B19FC73920A3, "mattina ")
+SUBS(AR|AA|AE|AN|AI|AP, str_35CFD6E3C822E5ED, "zampe ")
+SUBS(AR|RGT|AA|AE|AN|AI|AP, str_7D7DBA20577C60A2, "piena ")
+SUBS(AR|AE|AT|AN|AI|AP, str_C2316D0028A47EF6, "tempi ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_C42836DB2A107CF0, "perrin ")
+SUBS(AR|AA|AT|AN|AI|AO, str_7332E99DD48C0027, "fino ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_E6218744D604CCD0, "lingua ")
+SUBS(AR|AS|AE|AN|AI|AP, str_5309F4B1D736620D, "dimmi ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_64658C925245C73D, "insieme ")
+SUBS(AR|AS|AE|AT|AI|AP, str_3357330CDFB08095, "specie ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_AA598D31EA95E490, "presi ")
+SUBS(AR|AS|AT|AI|AO|AP, str_0CD9402551091DEC, "colpo ")
+SUBS(AR|RGT|AS|AT|AI|AO|AP, str_D70498E0A7D19771, "piccolo ")
+SUBS(AR|AS|AE|AI|AO|AP, str_9B701BFEBDD85D9B, "doppio ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_B8C9339F843B55FB, "poesie ")
+SUBS(AR|AA|AT|AI|AO|AP, str_B805430170795B55, "appoggio ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_93376E1B2C5FB7EC, "pioggia ")
+SUBS(AR|AS|AE|AN|AI|AO, str_CA7A2655E43A2BAA, "sulle ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_3558D88358CFB14F, "johnny ")
+SUBS(AR|AA|AE|AT|AN|AP, str_C353F800D63E836C, "entrambe ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_22CC3EFF346CA6DB, "mare ")
+SUBS(AR|AE|AT|AN|AI|AO, str_D356169745F65011, "giorno ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_B83A8DBEA67E130B, "intorno ")
+SUBS(AR|AA|AS|AN|AO|AP, str_42D1318D0EF7A742, "somma ")
+SUBS(AR|RGT|AA|AS|AN|AO|AP, str_E2F4D4EDB680586D, "pausa ")
+SUBS(AR|AA|AS|AT|AN|AO, str_22CAB77FD20C4AC9, "bocca ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO, str_5AF1CE84E0CEF486, "nascosto ")
+SUBS(AR|AA|AS|AE|AI|AP, str_12E86F206723FC58, "appesi ")
+SUBS(AR|RGT|AA|AS|AE|AI|AP, str_C05A191A012405B1, "paesi ")
+SUBS(AR|AA|AE|AT|AI|AO, str_69A52B3D073C6CD1, "allora ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_3D53817090261B7F, "lavoro ")
+SUBS(AR|AA|AS|AT|AN|AP, str_5160763BEFDDD768, "stampa ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_7862B823A47DF4BB, "manca ")
+SUBS(AR|AA|AE|AN|AI|AO, str_77EE6C87C516F499, "quella ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_B9DC345474FEAAFE, "nella ")
+SUBS(AR|AS|AE|AT|AN|AI, str_646BF0C6C1081A24, "che ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_7B1CDBF5FC3E32F1, "invece ")
+SUBS(AR|AA|AE|AT|AN|AI, str_CEC900A37BBC3168, "avrebbe ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_2432FC778706761E, "infine ")
+SUBS(AR|AA|AS|AT|AI|AP, str_A47CE66350D26CBC, "capi ")
+SUBS(AR|RGT|AA|AS|AT|AI|AP, str_1759D773501295AA, "passava ")
+SUBS(AR|AA|AS|AE|AN|AP, str_8B32EFC854F0D146, "damane ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_6BDA31CBE16BF827, "pensa ")
+SUBS(AR|AS|AE|AN|AO|AP, str_AFAFEA75716A544B, "d'un ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_81BDACFB6AD5C9E4, "modo ")
+SUBS(AR|AA|AE|AT|AI|AP, str_DC77AA4F74FA416F, "apri ")
+SUBS(AR|RGT|AA|AE|AT|AI|AP, str_942036C586B52CDC, "parti ")
+SUBS(AR|AS|AE|AT|AN|AO, str_F367B21B8485E533, "contro ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_66AF92A069602B5B, "nostro ")
+SUBS(AR|AE|AT|AN|AO|AP, str_4D6598D37F6B809E, "tempo ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_FA935D927875D182, "momento ")
+SUBS(AR|AA|AE|AT|AN|AO, str_6E941A3BCD6C871C, "erano ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_7CED60BCD6B99FB4, "natura ")
+SUBS(AR|AA|AS|AT|AN|AI, str_A98C9B2EF25728C8, "stanza ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_7F1DF9F101812702, "jack ")
+SUBS(AR|AA|AS|AE|AT|AP, str_C51E53127C35BD9F, "c'era ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_27C9C54FCC0F7B22, "padre ")
+SUBS(AR|AA|AE|AI|AO|AP, str_32466ABDF950ACD3, "appello ")
+SUBS(AR|RGT|AA|AE|AI|AO|AP, str_7EC4C8B90FECB655, "pezzo ")
+SUBS(AR|AA|AS|AE|AI|AO, str_578490E97C45CB3D, "della ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_2F0C90737434677E, "ideale ")
+SUBS(AR|AA|AS|AT|AI|AO, str_68BEF91AF08A5C88, "cavallo ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO, str_9A2BFF5F664BAA67, "lasciato ")
+SUBS(AR|AA|AS|AN|AI|AO, str_B1AAE5D11BB57599, "sulla ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_65401EFABB1CF098, "unknown ")
+SUBS(AR|AA|AS|AE|AN|AI, str_CB66EC17FE62C22F, "senza ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_17CAB6C5BEC5CEEB, "jake ")
+SUBS(AR|AA|AT|AN|AO|AP, str_3007E4D36EFE8829, "appunto ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_1BACF8D6559332C4, "punta ")
+SUBS(AR|AA|AE|AT|AO|AP, str_F12DC8C702B0CDA8, "rapporto ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_C092DEF9A4255A92, "porta ")
+SUBS(AR|AS|AE|AT|AN|AP, str_9729556965A2CBF1, "sempre ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_6480D00B04B8D9E0, "prendere ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_C9CFA1D8D5335D7B, "qualche ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_1E51DA803B8E7EBE, "amici ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_85926B44136D7E6F, "macchina ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_3DC6111BCF89DAA8, "questo ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO, str_1E5AE07AC1B16955, "nostra ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_4D9AD05DA9076D34, "anche ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_51899FBF34DB7299, "neanche ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_2CDCA024BE789511, "sentimenti ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_CACE191DFBE942DE, "perche ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_EE327B8C1C441DCD, "assieme ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_03852252EC94910E, "pensai ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_0472305661A2A14B, "capito ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_AFF1EA3A0F00D57F, "piccola ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_654036ECAB40451B, "come ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_FCB63D3380808A14, "persone ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_E935BB036FBB02D0, "almeno ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_3A8213F5ED636A77, "mezzo ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_72D7B5574B011E3B, "domanda ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_D4C9D328AE006E0D, "pensando ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_10D278A48C38C0DA, "sapeva ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_20225CE0CCDCA439, "piacere ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_522EE9C819BBCA09, "forma ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_B61DAD7FEA50A960, "paura ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_76B46F7C969EB11E, "quindi ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_5977110913154896, "honda ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_9DB20D745501B69E, "avevano ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_D78F1104CD1F777E, "labbra ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_90C1CE5A1DEDBA0F, "campo ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_0097CAF90CACB6B5, "manco ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_5BD8B63BAD28D4C4, "rispose ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_9D02D1D1F067AFEE, "percio ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_06CD290E05D55DF5, "spalle ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_C319F01B7BB40BC8, "poesia ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_325D3F8AB751D94D, "sopra ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO|AP, str_328132E87587F598, "peccato ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_3074B9A389896963, "esempio ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_0EE959283D1A378C, "modi ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_E0EB5EC60B39E675, "siamo ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_674B2B8301995883, "possiamo ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_0C9D2FC9C2846573, "vecchio ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_62AF793B68A8F752, "luce ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_D3BA90640C1DB5CE, "abbiamo ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_05C0AD123C1E39E0, "montalbano ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_1FAC9EDE7281CC72, "veramente ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_9399D619292D5B85, "prima ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_47E11E86F043AFEE, "sembra ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_638F1E032E80A700, "madre ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_3461F7E55F64B53A, "comincio ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_C22466C4BBE6977C, "piuttosto ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_37A2330B35B33CF5, "sembrava ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_7D41F9D3BBE2974A, "presenza ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_CA67B9DA2861FAD1, "capelli ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_B943DE4F92DA22E1, "particolare ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_91052F536C4180D6, "amico ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_7FE894ECB3C4779C, "possibilita ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_0B767D533CC4CD2D, "domani ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_F23B72437C75D0BD, "posizione ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_6858011AA873A546, "semplice ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_E154B0DAE8265A47, "possibile ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_3E9D05E02CFFC29E, "finalmente ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_B554953ADD45BD07, "ormai ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_752C6DAC57EC49CF, "comunque ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_8766FEB77F0FD427, "persona ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_B0AE7F65CBD5FECE, "commissario ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_C509D099D7E1E313, "l'unica ")
diff --git a/keyboards/gboards/dicts/aset/layer-keymap.def b/keyboards/gboards/dicts/aset/layer-keymap.def
new file mode 100644
index 00000000000..0200f98ce68
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/layer-keymap.def
@@ -0,0 +1,22 @@
+// Thumb Keys
+PRES(AL, KC_LSFT)
+PRES(AR, KC_SPC)
+
+// Layer Switches
+// To Number
+SPEC( AA | AT | AN | AP, SPEC_STICKY, NUM)
+SPEC(NUM | AA | AT | AN | AP, SPEC_STICKY, NUM)
+SPEC(CMD | AA | AT | AN | AP, SPEC_STICKY, NUM)
+SPEC(USR | AA | AT | AN | AP, SPEC_STICKY, NUM)
+
+// To Command
+SPEC( AS | AE | AI | AO, SPEC_STICKY, CMD)
+SPEC(NUM | AS | AE | AI | AO, SPEC_STICKY, CMD)
+SPEC(CMD | AS | AE | AI | AO, SPEC_STICKY, CMD)
+SPEC(USR | AS | AE | AI | AO, SPEC_STICKY, CMD)
+
+// To User
+SPEC( AA | AS | AE | AT | AN | AI | AO | AP | AR | AL, SPEC_STICKY, USR)
+SPEC(NUM | AA | AS | AE | AT | AN | AI | AO | AP | AR | AL, SPEC_STICKY, USR)
+SPEC(CMD | AA | AS | AE | AT | AN | AI | AO | AP | AR | AL, SPEC_STICKY, USR)
+SPEC(USR | AA | AS | AE | AT | AN | AI | AO | AP | AR | AL, SPEC_STICKY, USR)
diff --git a/keyboards/gboards/dicts/aset/nl-keymap.def b/keyboards/gboards/dicts/aset/nl-keymap.def
new file mode 100644
index 00000000000..c79bdde1210
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/nl-keymap.def
@@ -0,0 +1,396 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AT, KC_T)
+PRES(AE, KC_E)
+PRES(AI, KC_I)
+PRES(AP, KC_P)
+PRES(AN, KC_N)
+PRES(AO, KC_O)
+PRES(AS, KC_S)
+PRES(AA, KC_A)
+PRES(AA|AE, KC_X)
+PRES(AE|AT, KC_R)
+PRES(AE|AO, KC_MINS)
+PRES(AA|AI, KC_Z)
+PRES(AS|AI, KC_K)
+PRES(AA|AT, KC_F)
+PRES(AE|AP, KC_QUOT)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+PRES(AI|AO, KC_L)
+PRES(AA|AP, KC_QUOT)
+PRES(AA|AS, KC_W)
+PRES(AN|AO, KC_U)
+PRES(AT|AO, KC_G)
+PRES(AA|AN, KC_Q)
+PRES(AE|AI, KC_COMM)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+PRES(AT|AI, KC_V)
+PRES(AN|AP, KC_M)
+PRES(AS|AE, KC_D)
+PRES(AT|AN, KC_B)
+PRES(AS|AO, KC_DOT)
+PRES(AS|AT, KC_C)
+PRES(AT|AP, KC_BSPC)
+PRES(AE|AN, KC_Y)
+PRES(AO|AP, KC_SCLN)
+PRES(AN|AI, KC_H)
+PRES(AS|AN, KC_J)
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+SUBS(AR|AA|AS|AT, str_C73596E8D5CA2F7E, "wat ")
+SUBS(AR|AE|AO|AP, str_6A842E25D4F36AEF, "'o ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AA|AE|AP, str_B67661087B126CF1, "px ")
+SUBS(AR|AT|AN|AP, str_9FF55347C3A05931, "mt ")
+SUBS(AR|AS|AE|AO, str_2E353EECFF819D7A, "dood ")
+SUBS(AR|AE|AT|AI, str_90DFFD07F9A960E1, "vier ")
+SUBS(AR|AE|AN|AO, str_E429BF3EE734FF3A, "you ")
+SUBS(AR|AT|AN|AI, str_427B48C8BCABBF6C, "bh ")
+SUBS(AR|AS|AN|AP, str_A38FEA2A97C8F836, "ms ")
+SUBS(AR|AA|AO|AP, str_B975552567CD7FCF, "opa ")
+SUBS(AR|AS|AE|AT, str_C8BA9AE3DFEB65D3, "eerste ")
+SUBS(AR|AA|AS|AP, str_467C897077B58F08, "pas ")
+SUBS(AR|AI|AO|AP, str_C70A0EA14058ABE0, "loop ")
+SUBS(AR|AA|AN|AP, str_7814AB9A9D941FFB, "man ")
+SUBS(AR|AA|AE|AI, str_4D4206C98723FE7F, "ze ")
+SUBS(AR|AS|AI|AP, str_DC6492AFCE0DFEC0, "pik ")
+SUBS(AR|AA|AT|AP, str_7A06301D23DD2E0F, "pat ")
+SUBS(AR|AN|AO|AP, str_0F33CAECD78B3E6B, "om ")
+SUBS(AR|AA|AI|AP, str_9EFFC1EA3EEA7DCB, "pizza ")
+SUBS(AR|AA|AE|AN, str_9CAD49AC9B02787F, "anne ")
+SUBS(AR|AE|AT|AP, str_A71472FDD1394FF4, "'t ")
+SUBS(AR|AA|AS|AE, str_C8F40BD7102B7E24, "we ")
+SUBS(AR|AS|AN|AI, str_D0C23190A14D30C8, "hij ")
+SUBS(AR|AN|AI|AO, str_5A09FD44BA314863, "hun ")
+SUBS(AR|AN|AI|AP, str_683696748A01B41C, "min ")
+SUBS(AR|AS|AO|AP, str_545E0508FFACDE01, "poos ")
+SUBS(AR|AA|AE|AT, str_25F80F62480B958F, "extra ")
+SUBS(AR|AS|AE|AP, str_9B6ECB908551EEF3, "'s ")
+SUBS(AR|AA|AS|AT|AO, str_399C79B6EB9B7C4A, "stof ")
+SUBS(AR|AA|AS|AE|AT, str_5326FFC92ECE7899, "dat ")
+SUBS(AR|AA|AS|AO|AP, str_8C9B1A012755CF4B, "oppas ")
+SUBS(AR|AS|AE|AT|AO, str_DCFA6A07F97D055B, "door ")
+SUBS(AR|AA|AN|AI|AP, str_BE5E1C18B0B5E15B, "hap ")
+SUBS(AR|AE|AN|AO|AP, str_5F1CC41FEB0BB428, "open ")
+SUBS(AR|AA|AE|AT|AI, str_038BB83261504480, "zette ")
+SUBS(AR|AA|AN|AO|AP, str_1C8723E7DFEEA85A, "oma ")
+SUBS(AR|AS|AE|AT|AN, str_86BFF886E6DCEFA6, "beetje ")
+SUBS(AR|AA|AT|AO|AP, str_4037EBCCD909B772, "pag ")
+SUBS(AR|AA|AI|AO|AP, str_722CFF3C34B02A02, "paal ")
+SUBS(AR|AS|AT|AI|AP, str_A1A3F3CAA425B3E9, "spits ")
+SUBS(AR|AA|AS|AE|AO, str_F52061A1FE7E4CBB, "woede ")
+SUBS(AR|AE|AI|AO|AP, str_FCC287D489118EA7, "liep ")
+SUBS(AR|AA|AS|AI|AP, str_CC46AF41D9985527, "pak ")
+SUBS(AR|AA|AE|AT|AO, str_0D0B8DC87B531987, "graag ")
+SUBS(AR|AS|AT|AN|AP, str_DE6CBE601C534F3D, "cm ")
+SUBS(AR|AS|AN|AI|AO, str_82A16B8D8890E00D, "kon ")
+SUBS(AR|AE|AI|AO, str_05ED48987A1828F9, "el ")
+SUBS(AR|RGT|AE|AI|AO, str_354C4F0CD314F7EE, "leo ")
+SUBS(AR|AT|AN|AO, str_25F879C1988DA686, "boog ")
+SUBS(AR|RGT|AT|AN|AO, str_050AC45AA0EAD9E3, "nog ")
+SUBS(AR|AS|AT|AI, str_D466F321075D4855, "vis ")
+SUBS(AR|RGT|AS|AT|AI, str_9E703250D29EDAE5, "kist ")
+SUBS(AR|AA|AT|AO, str_E5AF645EF99E967C, "gaat ")
+SUBS(AR|RGT|AA|AT|AO, str_BF38370C83727D39, "of ")
+SUBS(AR|AA|AN|AI, str_000A7A7F34AC54D7, "zin ")
+SUBS(AR|RGT|AA|AN|AI, str_4394B0F660AFCB43, "hanna ")
+SUBS(AR|AA|AI|AO, str_4E67B797D07DE242, "zo ")
+SUBS(AR|RGT|AA|AI|AO, str_7E7904D7326BCF29, "la ")
+SUBS(AR|AE|AT|AN, str_6EDDE1729393B4E6, "ben ")
+SUBS(AR|RGT|AE|AT|AN, str_86CBD141F40A0963, "net ")
+SUBS(AR|AS|AI|AO, str_B94B9E04844A5017, "slok ")
+SUBS(AR|RGT|AS|AI|AO, str_B670619D3111567D, "ook ")
+SUBS(AR|AA|AS|AI, str_9AFF001C35E4C65D, "zaak ")
+SUBS(AR|RGT|AA|AS|AI, str_411BA6BA3421BEEB, "kaas ")
+SUBS(AR|AE|AN|AP, str_B6C3042679BF7796, "em ")
+SUBS(AR|RGT|AE|AN|AP, str_5140BEC191346017, "me ")
+SUBS(AR|AA|AN|AO, str_1151CDEBECCAA9AE, "qua ")
+SUBS(AR|RGT|AA|AN|AO, str_0603690FBF40C46D, "oan ")
+SUBS(AR|AT|AO|AP, str_8574F11BEB82545C, "top ")
+SUBS(AR|RGT|AT|AO|AP, str_028BB7B551A4BD43, "pot ")
+SUBS(AR|AA|AS|AN, str_45A403A4960EE226, "san ")
+SUBS(AR|RGT|AA|AS|AN, str_16D6BE915787F782, "ja ")
+SUBS(AR|AA|AT|AI, str_6E9657F725548544, "zat ")
+SUBS(AR|RGT|AA|AT|AI, str_D7978D4AE69E4592, "if ")
+SUBS(AR|AS|AE|AI, str_8DB12FA16BCFEA58, "die ")
+SUBS(AR|RGT|AS|AE|AI, str_F6734CC303E80959, "keek ")
+SUBS(AR|AT|AI|AP, str_EDDB4B5D8E6E6CF7, "tip ")
+SUBS(AR|RGT|AT|AI|AP, str_2741375E1176FC82, "pitt ")
+SUBS(AR|AS|AE|AN, str_3243B29F82AFA1AE, "eens ")
+SUBS(AR|RGT|AS|AE|AN, str_6D067D15A808A9B1, "je ")
+SUBS(AR|AA|AT|AN, str_F145D71E556DCAA4, "baan ")
+SUBS(AR|RGT|AA|AT|AN, str_47B698232847D3D2, "nat ")
+SUBS(AR|AT|AI|AO, str_0A89D63B98F40BD6, "vol ")
+SUBS(AR|RGT|AT|AI|AO, str_F246E981BC4E2F1C, "ooit ")
+SUBS(AR|AE|AT|AO, str_3011DF1946993349, "toe ")
+SUBS(AR|RGT|AE|AT|AO, str_8F640B129C9BD33D, "oor ")
+SUBS(AR|AS|AN|AO, str_2A4603E856F568A7, "suus ")
+SUBS(AR|RGT|AS|AN|AO, str_68A33E3EC3EC7D5F, "ons ")
+SUBS(AR|AS|AT|AO, str_A506E8E4C24D161A, "stoot ")
+SUBS(AR|RGT|AS|AT|AO, str_A386283D297C53E2, "oogst ")
+SUBS(AR|AE|AN|AI, str_7E3D8B1C859776CA, "eh ")
+SUBS(AR|RGT|AE|AN|AI, str_7A4D8698951A1FAD, "hen ")
+SUBS(AR|AA|AE|AN|AO|AP, str_66E10295AC7B9CA0, "opnamen ")
+SUBS(AR|AA|AS|AE|AT|AO, str_3C79045BF3536CB2, "weg ")
+SUBS(AR|AA|AE|AT|AI|AP, str_C3B90DAB4B7472C5, "papier ")
+SUBS(AR|AS|AE|AN|AI|AP, str_3C9354E1B6E24DAA, "meisje ")
+SUBS(AR|AS|AT|AI|AO|AP, str_DC28411654225FFD, "pistool ")
+SUBS(AR|AA|AS|AN|AO|AP, str_7F2A8884B703B508, "mouw ")
+SUBS(AR|AA|AS|AT|AI|AP, str_41E617C734A9B9D0, "pakt ")
+SUBS(AR|AA|AS|AT|AN|AP, str_F11A03FECD1BAC54, "stam ")
+SUBS(AR|AA|AS|AE|AT|AI, str_201DF979D8D5FD45, "vader ")
+SUBS(AR|AA|AN|AI|AO|AP, str_2F0B08746C6E2063, "plan ")
+SUBS(AR|AE|AN|AI|AO|AP, str_19988C6A8F37C6DA, "lopen ")
+SUBS(AR|AT|AN|AO|AP, str_26DDC89FCFD3BABB, "boom ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_FD52E8E3B927C4FA, "punt ")
+SUBS(AR|AA|AE|AN|AI, str_F9FB633B31DC6D6D, "zien ")
+SUBS(AR|RGT|AA|AE|AN|AI, str_ADDEC78F35080769, "inzien ")
+SUBS(AR|AS|AE|AN|AP, str_07DEA57FA03F84E3, "sms'je ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_F175E0A1227509AD, "mensen ")
+SUBS(AR|AS|AE|AN|AI, str_A5971EF00EAEDA5D, "denk ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_5AEA4E664A6EEF29, "kijken ")
+SUBS(AR|AS|AE|AI|AP, str_13B6D52598748047, "diep ")
+SUBS(AR|RGT|AS|AE|AI|AP, str_C5D40B0A0C57A5E9, "'ik ")
+SUBS(AR|AA|AS|AN|AI, str_D59F9D011F750F2C, "zijn ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_FA2CEC25FAE97341, "kan ")
+SUBS(AR|AS|AT|AI|AO, str_521672AED92958DC, "stil ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_1C4875EFB5E3B65F, "kost ")
+SUBS(AR|AS|AT|AO|AP, str_CB532D5DED67E46B, "stop ")
+SUBS(AR|RGT|AS|AT|AO|AP, str_993FB3354F37599E, "post ")
+SUBS(AR|AA|AE|AT|AP, str_606F5AD016A47E89, "trap ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_77422CDECD520E45, "paar ")
+SUBS(AR|AE|AT|AN|AO, str_D8D04BB18B2FCBFF, "toen ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_3720281455A654E3, "ogen ")
+SUBS(AR|AE|AN|AI|AO, str_7623453E9CFB03D4, "ellen ")
+SUBS(AR|RGT|AE|AN|AI|AO, str_73B6B5B26FD71502, "hoe ")
+SUBS(AR|AA|AT|AN|AO, str_9B117438FFF3EC08, "gaan ")
+SUBS(AR|RGT|AA|AT|AN|AO, str_FF3F3B1F8B5A3E40, "nota ")
+SUBS(AR|AS|AN|AI|AP, str_5ABDC1D334C04FAB, "spin ")
+SUBS(AR|RGT|AS|AN|AI|AP, str_C82620527C76697D, "mijn ")
+SUBS(AR|AA|AS|AT|AP, str_B3DEAAF59F1E7727, "stap ")
+SUBS(AR|RGT|AA|AS|AT|AP, str_718051F50C1745F9, "past ")
+SUBS(AR|AS|AT|AN|AI, str_C452567AA7C49B83, "bij ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_9449E07F4DA95EC4, "kijkt ")
+SUBS(AR|AA|AS|AT|AI, str_4A8E4310C68D5030, "wist ")
+SUBS(AR|RGT|AA|AS|AT|AI, str_F4F7972FF6C3AA38, "kast ")
+SUBS(AR|AA|AE|AI|AO, str_4B68781D007741F3, "alle ")
+SUBS(AR|RGT|AA|AE|AI|AO, str_2BCCE3C0702A7BCE, "lizzie ")
+SUBS(AR|AS|AE|AT|AP, str_9CE549717FD693C0, "respect ")
+SUBS(AR|RGT|AS|AE|AT|AP, str_E53C14204106A2DF, "pers ")
+SUBS(AR|AS|AI|AO|AP, str_7D927358A163458C, "sloop ")
+SUBS(AR|RGT|AS|AI|AO|AP, str_87CFB86F7172C44A, "kop ")
+SUBS(AR|AA|AT|AI|AO, str_54A78C26DF801C39, "zag ")
+SUBS(AR|RGT|AA|AT|AI|AO, str_2CE8A84D8E8E7AF8, "laat ")
+SUBS(AR|AE|AN|AI|AP, str_E96AF9789DFD378D, "eph ")
+SUBS(AR|RGT|AE|AN|AI|AP, str_3DE7FC713EFDE099, "hem ")
+SUBS(AR|AA|AS|AI|AO, str_29CE2FDA396D8322, "als ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_05DBE3DB5EFBA943, "las ")
+SUBS(AR|AA|AS|AN|AO, str_0C965DFEA414E35D, "wou ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_E8396F9C50F95A2C, "uw ")
+SUBS(AR|AA|AN|AI|AO, str_A5359CE1548A4967, "zou ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_4FB4F9ADE1176547, "hal ")
+SUBS(AR|AS|AE|AI|AO, str_009492B1B1F90F25, "elke ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_A7FAFB59ED2F6C4D, "leek ")
+SUBS(AR|AA|AS|AE|AI, str_3C5B5E945519152C, "deze ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_949A6CD175077E9D, "kwaad ")
+SUBS(AR|AA|AE|AT|AN, str_F1DEA8BFE062BA32, "eraan ")
+SUBS(AR|RGT|AA|AE|AT|AN, str_986149229D18C728, "naar ")
+SUBS(AR|AT|AN|AI|AP, str_AF1FE256DC6BB784, "tim ")
+SUBS(AR|RGT|AT|AN|AI|AP, str_494AFE3F4D06465A, "htm ")
+SUBS(AR|AE|AT|AN|AP, str_16003C680922E420, "ermee ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_C7D7F29E47B4BF3E, "met ")
+SUBS(AR|AA|AS|AE|AN, str_2D98EFAF28A302ED, "dan ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_C161ABA85FEDF657, "new ")
+SUBS(AR|AA|AS|AE|AP, str_165816E712C2B28C, "da's ")
+SUBS(AR|RGT|AA|AS|AE|AP, str_E5E885A4F9D42365, "'we ")
+SUBS(AR|AE|AT|AN|AI, str_098DC5EDD94A95CA, "even ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_04F396FE937765D9, "het ")
+SUBS(AR|AS|AE|AT|AI, str_4304C227395BD37E, "dit ")
+SUBS(AR|RGT|AS|AE|AT|AI, str_33397C009A67360D, "iets ")
+SUBS(AR|AA|AS|AT|AN, str_85FB90AD5AF3F778, "want ")
+SUBS(AR|RGT|AA|AS|AT|AN, str_DE8077D7A04BD52E, "naast ")
+SUBS(AR|AE|AT|AO|AP, str_493C5DEFCB354F5C, "erop ")
+SUBS(AR|RGT|AE|AT|AO|AP, str_61F4C15CD4F64EAC, "poort ")
+SUBS(AR|AT|AN|AI|AO, str_997DE4CA09BE1D9D, "ging ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_A9006993E08B5F0F, "uit ")
+SUBS(AR|AA|AE|AI|AP, str_6243A5125E9902B3, "appie ")
+SUBS(AR|RGT|AA|AE|AI|AP, str_605E88BA6EDCA33E, "'ze ")
+SUBS(AR|AS|AE|AN|AO, str_94E0417806EBC8BA, "doen ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_78DA240D37E1DC90, "oude ")
+SUBS(AR|AE|AT|AI|AP, str_13E1E228D95B47CA, "riep ")
+SUBS(AR|RGT|AE|AT|AI|AP, str_BC7EF837C3357A72, "piper ")
+SUBS(AR|AA|AT|AN|AI, str_868067C442CD38C1, "van ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_5B528135063CFD88, "haat ")
+SUBS(AR|AE|AT|AI|AO, str_AB17747230E045A6, "voor ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_2CCE6615DDD45C8E, "over ")
+SUBS(AR|AT|AI|AO|AP, str_A4FDCBAE2772AE16, "volop ")
+SUBS(AR|RGT|AT|AI|AO|AP, str_D04D9E54BC1C50CA, "loopt ")
+SUBS(AR|AS|AE|AO|AP, str_8C372FC99C0A8AAC, "soep ")
+SUBS(AR|RGT|AS|AE|AO|AP, str_EDAECBC2519897FC, "poes ")
+SUBS(AR|AS|AN|AO|AP, str_DBBF68CE2078DE7F, "soms ")
+SUBS(AR|RGT|AS|AN|AO|AP, str_8B6D33658CB36F28, "joop ")
+SUBS(AR|AA|AS|AN|AP, str_4A9FFC3D2355E44C, "span ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_248A481E3372E8F5, "massa ")
+SUBS(AR|AA|AT|AN|AP, str_BF3DDFB8CBFE1C63, "tam ")
+SUBS(AR|RGT|AA|AT|AN|AP, str_31062213ACA2DB24, "maat ")
+SUBS(AR|AS|AT|AN|AO, str_23B31B7D36319EFC, "boos ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_9E6552A2D538596B, "jong ")
+SUBS(AR|AA|AE|AN|AP, str_BF181BAE939DFF3D, "aannemen ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_6FB419EBFA4FDDD0, "mannen ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_1A5E6E1C37C5C8B2, "worden ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_236D5AAB5DFA58BD, "manier ")
+SUBS(AR|AA|AS|AI|AO|AP, str_EDA01630903ACAA7, "slaap ")
+SUBS(AR|RGT|AA|AS|AI|AO|AP, str_AF121D4C6F58EBE5, "klap ")
+SUBS(AR|AS|AT|AN|AO|AP, str_89978456BF623F18, "stom ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_918C1F865A6F50C7, "muts ")
+SUBS(AR|AA|AT|AN|AI|AO, str_E6F4D34B2D045CCC, "vanuit ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_3ABD8DA65AF381C4, "lang ")
+SUBS(AR|AA|AS|AE|AN|AI, str_2DD4415EE04BAFDB, "weken ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_B8157EA41E09D921, "had ")
+SUBS(AR|AE|AT|AI|AO|AP, str_06159D74F5F706BE, "voorlopig ")
+SUBS(AR|RGT|AE|AT|AI|AO|AP, str_EC5262C322755AE3, "politie ")
+SUBS(AR|AA|AS|AN|AI|AO, str_B3D5DC24825AA93C, "zus ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_E29E3546C55CDCD4, "hals ")
+SUBS(AR|AA|AS|AE|AI|AP, str_5FAA21BFAFFD49DA, "zweep ")
+SUBS(AR|RGT|AA|AS|AE|AI|AP, str_CE173D7A0B469A2C, "'wie ")
+SUBS(AR|AS|AE|AT|AO|AP, str_8D8C2A92E91E7295, "dorp ")
+SUBS(AR|RGT|AS|AE|AT|AO|AP, str_DEB9C407B616CC4C, "proces ")
+SUBS(AR|AS|AE|AT|AN|AO, str_8C74304ECFAE815E, "stond ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_38CBB5F5A5E6D56E, "onder ")
+SUBS(AR|AE|AT|AN|AI|AO, str_37EC60B8A186E3F8, "eigen ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_4F098D98BD76E738, "leven ")
+SUBS(AR|AS|AE|AT|AI|AO, str_E806271D0AA00BA7, "voelde ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO, str_84367956ED9ACA98, "kreeg ")
+SUBS(AR|AA|AS|AE|AI|AO, str_8C72F9BBA7AA2FE0, "wel ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_3662FF4FA5D5A691, "kale ")
+SUBS(AR|AS|AN|AI|AO|AP, str_6CBFC109D0CB9CF1, "simon ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_C50B116423771F39, "kom ")
+SUBS(AR|AS|AT|AN|AI|AO, str_3F2B0424B90C0D3C, "toch ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_78252E3943F32B3B, "kunt ")
+SUBS(AR|AA|AS|AT|AN|AO, str_B25D747563F50C00, "angst ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO, str_412E9C52008E2FFC, "jacob ")
+SUBS(AR|AA|AE|AN|AI|AP, str_F99612A7FA7898A3, "z'n ")
+SUBS(AR|RGT|AA|AE|AN|AI|AP, str_09298B99F194ADAA, "maxima ")
+SUBS(AR|AS|AE|AT|AN|AI, str_75A9436A95A5D939, "tijd ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_CDE7DAB599D30443, "niets ")
+SUBS(AR|AS|AE|AN|AI|AO, str_42D62B365CC2637B, "snel ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_F61FAF52C7544EC2, "kunnen ")
+SUBS(AR|AA|AE|AN|AI|AO, str_AAECCABBBCD44493, "alleen ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_DE871427B5EA3F28, "onze ")
+SUBS(AR|AS|AE|AT|AI|AP, str_F2016119C06FB953, "spreekt ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_621F80E9187A5778, "precies ")
+SUBS(AR|AA|AE|AT|AN|AO, str_8314A7158DB48ABA, "gegaan ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_C5C63B76C01E50BC, "naartoe ")
+SUBS(AR|AA|AT|AN|AO|AP, str_DB4CB9C7228970A5, "tatum ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_3C9B602D612DFCF2, "mag ")
+SUBS(AR|AS|AE|AT|AN|AP, str_30674A9C115676E5, "stem ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_FC94D31C726700B8, "meeste ")
+SUBS(AR|AA|AS|AT|AN|AI, str_1E002CAE03FFABAE, "zich ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_5105E1ED4EE07DAD, "kant ")
+SUBS(AR|AA|AS|AE|AN|AO, str_3A59637361B43864, "wonen ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_A5A5D567FDBB9849, "ouwe ")
+SUBS(AR|AA|AS|AE|AT|AP, str_9761773C743B186A, "stapte ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_84938433B5435F0A, "'dat ")
+SUBS(AR|AA|AE|AT|AN|AP, str_4466B3233DC5388F, "armen ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_BE52D7C0FB6D254C, "maar ")
+SUBS(AR|AA|AS|AE|AT|AN, str_DAED66ED9574D407, "waren ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN, str_EFDB605A15AA4058, "jaar ")
+SUBS(AR|AE|AT|AN|AI|AP, str_AC8ACF17412A79B3, "evenmin ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_D346ED0408FA424A, "'het ")
+SUBS(AR|AA|AE|AT|AO|AP, str_2678AEB1CA537FBF, "gepraat ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_5E0C8ECDADE5F1A0, "page ")
+SUBS(AR|AS|AT|AN|AI|AP, str_16F38A80CD3A17A2, "schip ")
+SUBS(AR|RGT|AS|AT|AN|AI|AP, str_0237BF0C3728CA80, "minst ")
+SUBS(AR|AA|AE|AT|AI|AO, str_DC39801BE4734C10, "zelf ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_B74E83C046B23FC2, "later ")
+SUBS(AR|AA|AS|AT|AI|AO, str_D8A43722373FF9A4, "alsof ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO, str_A57E20B51804CF2C, "last ")
+SUBS(AR|AA|AT|AI|AO|AP, str_ECBA14C4E530E3A1, "afloop ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_51B518126A035A17, "plat ")
+SUBS(AR|AA|AT|AN|AI|AP, str_1AFD7B5D30FA8F4A, "fatima ")
+SUBS(AR|RGT|AA|AT|AN|AI|AP, str_2C3632930C2AB50B, "mattia ")
+SUBS(AR|AS|AE|AN|AO|AP, str_12BF12EEF13D6E95, "dom ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_88469FD19018C34B, "mond ")
+SUBS(AR|AA|AS|AE|AN|AP, str_3A3B5D326F9ADBEC, "samen ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_AAFD24093B719C48, "maanden ")
+SUBS(AR|AE|AT|AN|AO|AP, str_66326E12F17B8F42, "genomen ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_18C489B133CF1DF2, "moet ")
+SUBS(AR|AA|AE|AI|AO|AP, str_F7931A2969F890EC, "appel ")
+SUBS(AR|RGT|AA|AE|AI|AO|AP, str_637B39E43982BF03, "'zo ")
+SUBS(AR|AS|AE|AI|AO|AP, str_EF424961E35142C3, "speelde ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_2688CE2C4C0BFB8E, "plek ")
+SUBS(AR|AT|AN|AI|AO|AP, str_18112192C1C7162F, "glimp ")
+SUBS(AR|RGT|AT|AN|AI|AO|AP, str_96C152701E4AAF29, "omhoog ")
+SUBS(AR|AA|AE|AT|AN|AI, str_85D95EE86FD8D7E0, "zitten ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_D40674E651F303E0, "haar ")
+SUBS(AR|AA|AS|AN|AI|AP, str_3DDEC0B6B7DC4E60, "smaak ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_13427819E20417AC, "kwam ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_CFA69B347040DFA4, "zeggen ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_46A466751710BBDE, "laten ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_85B7B9EA92DBC33D, "spelen ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_632EEC8003417245, "komen ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_60DD52897AE7328E, "sprak ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_98D27C837BA93225, "pakte ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_36048F26B12AD2BA, "blijft ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO, str_6C2D114EB287C846, "langs ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_04780C055D9DEB2B, "roman ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_1ABC020C1C0B6956, "magere ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_01BF2A81399F3EFC, "samenwonen ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_19416B39EDE8D85C, "panose- ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_39100C139CAC1A92, "ruimte ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_830AFDF71CF14F69, "minuten ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_7442FC1455556F71, "tapijt ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_0A91A845CCB949E5, "maakt ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_2316AE8AFD12499B, "elkaar ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO, str_BC1176714EDFB3E3, "laatste ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_5E9245C93EB8BBA3, "schuim ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_4481899BE8B172DD, "komt ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_7860D88CB37DB0A8, "wanhoop ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_B13D2A8A9BC34AA7, "opzij ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_88ABA6EB9267140D, "slaapt ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_D72129058C74C7F1, "plaats ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_96A00CB4E77515EE, "achter ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_FBB6D1679D55DF18, "hard ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_CAD633A4A63AE769, "zwemmen ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_18325861BE240B96, "maken ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_97C13C48CCC03717, "waarop ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO|AP, str_6CD2A548A39A7E32, "professor ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_0D31590B6ACC2C8A, "vond ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_F599DDBDDE71784C, "krijgen ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_58DBAC3080F43A2C, "april ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO|AP, str_C2E1532C75A2EF31, "plezier ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_AEB29283A7830C6E, "allemaal ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_4DD5DE47DC3A8E33, "helemaal ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_C2631723111FD5AB, "waarmee ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_DCB82AC96739A6CF, "jasper ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_1AFC9CB2074AAA9B, "gesprek ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_DDDFBF7DF64C8DF4, "periode ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_EBB00619F6A89029, "spontaan ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_53161901D417782B, "opstaan ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_AC1AE0D91923A15A, "slappe ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_FE7B5420A2E0A4B1, "'als ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_2E642CEEC56D4266, "film ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_5CE65658ACD6EB87, "langzaam ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_70845B894C3B48C8, "sprong ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_65CB04686C20C8C8, "moest ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_1C8D1417F75B4C0C, "spreken ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_2BF315D4B342DDE6, "misschien ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_170F022302D848C7, "zouden ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_95755922697069DD, "nieuwe ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_A659555F342991D6, "familie ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_2EA20D24BC9FE614, "mezelf ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_D50595439EC5EC64, "waarom ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_50D197A6481113D3, "omdat ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_2AFDC195D9E636B0, "glimlach ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_104B5913C90D8088, "lichaam ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_B041FDB23876F0BB, "altijd ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_07508C5DC7F6C61B, "hoofd ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_3601E608A05BAF49, "amerikaanse ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_D6CB674EF62C8952, "maakte ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_A9C15615E26C9E7A, "slapen ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_FA42E4481BE23013, "opnieuw ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_567B8FED8B46FF1C, "collega's ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_132971BEE7D56AFC, "opgewekt ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_D8726BD9A2A130E1, "gekomen ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_354E3609C2CF02C2, "mogelijk ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_B1CD2F1C6D590B41, "gemaakt ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_F21D471DB7533EEF, "mevrouw ")
diff --git a/keyboards/gboards/dicts/aset/num-keymap.def b/keyboards/gboards/dicts/aset/num-keymap.def
new file mode 100644
index 00000000000..19eda5636cd
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/num-keymap.def
@@ -0,0 +1,36 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(NUM|AO, KC_9)
+PRES(NUM|AS, KC_2)
+PRES(NUM|AN, KC_7)
+PRES(NUM|AI, KC_8)
+PRES(NUM|AA, KC_1)
+PRES(NUM|AE, KC_3)
+PRES(NUM|AT, KC_4)
+PRES(NUM|AP, KC_0)
+PRES(NUM|AA|AE, KC_GRV)
+PRES(NUM|AA|AP, KC_QUOT)
+KEYS(NUM|AA|AI, cmb_e9bf29584cf72c14, {KC_LSFT, KC_1, COMBO_END})
+PRES(NUM|AE|AN, KC_HOME)
+PRES(NUM|AN|AI, KC_6)
+PRES(NUM|AE|AI, KC_COMM)
+PRES(NUM|AS|AT, KC_NO)
+PRES(NUM|AE|AP, KC_QUOT)
+PRES(NUM|AA|AS, KC_SPC)
+PRES(NUM|AS|AI, KC_EQL)
+PRES(NUM|AA|AT, KC_LBRC)
+PRES(NUM|AI|AO, KC_EQL)
+KEYS(NUM|AS|AP, cmb_ea889bef063f6825, {KC_LSFT, KC_0, COMBO_END})
+PRES(NUM|AT|AP, KC_BSPC)
+KEYS(NUM|AA|AO, cmb_bff41f9e9cd6fd93, {KC_LSFT, KC_9, COMBO_END})
+PRES(NUM|AA|AN, KC_SPC)
+PRES(NUM|AS|AO, KC_DOT)
+PRES(NUM|AE|AO, KC_MINS)
+PRES(NUM|AS|AE, KC_MINS)
+PRES(NUM|AE|AT, KC_5)
+PRES(NUM|AO|AP, KC_SCLN)
+PRES(NUM|AN|AO, KC_NO)
+PRES(NUM|AN|AP, KC_RBRC)
+PRES(NUM|AS|AN, KC_END)
+PRES(NUM|AN|AI|AO|AP, KC_TAB)
+PRES(NUM|AA|AS|AE|AT|AN|AI|AO|AP, KC_SPC)
diff --git a/keyboards/gboards/dicts/aset/nw-keymap.def b/keyboards/gboards/dicts/aset/nw-keymap.def
new file mode 100644
index 00000000000..d1ecbaef08e
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/nw-keymap.def
@@ -0,0 +1,381 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AE, KC_E)
+PRES(AS, KC_S)
+PRES(AP, KC_P)
+PRES(AN, KC_N)
+PRES(AT, KC_T)
+PRES(AI, KC_I)
+PRES(AO, KC_O)
+PRES(AA, KC_A)
+PRES(AI|AO, KC_L)
+PRES(AS|AN, KC_J)
+PRES(AA|AN, KC_Q)
+PRES(AT|AN, KC_B)
+PRES(AT|AP, KC_BSPC)
+PRES(AA|AI, KC_Z)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+PRES(AO|AP, KC_SCLN)
+PRES(AA|AT, KC_F)
+PRES(AA|AS, KC_W)
+PRES(AE|AI, KC_COMM)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AE|AN, KC_Y)
+PRES(AN|AI, KC_H)
+PRES(AN|AP, KC_M)
+PRES(AE|AT, KC_R)
+PRES(AS|AI, KC_K)
+PRES(AS|AO, KC_DOT)
+PRES(AT|AI, KC_V)
+PRES(AA|AE, KC_X)
+PRES(AE|AP, KC_QUOT)
+PRES(AS|AE, KC_D)
+PRES(AN|AO, KC_U)
+PRES(AT|AO, KC_G)
+PRES(AA|AP, KC_QUOT)
+PRES(AS|AT, KC_C)
+PRES(AE|AO, KC_MINS)
+SUBS(AR|AS|AE|AT, str_925BB6ABF283A228, "det ")
+SUBS(AR|AN|AO|AP, str_0F33CAECD78B3E6B, "om ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AE|AT|AI, str_7C0F236DA831BEB5, "eit ")
+SUBS(AR|AA|AT|AP, str_FB01F23B61D4D19E, "tapt ")
+SUBS(AR|AA|AE|AP, str_12715CFF7C2228E1, "'a ")
+SUBS(AR|AA|AN|AP, str_7814AB9A9D941FFB, "man ")
+SUBS(AR|AA|AS|AE, str_6E5B393925FE64CE, "da ")
+SUBS(AR|AE|AN|AP, str_B969E2F841D9C54A, "men ")
+SUBS(AR|AA|AS|AT, str_3B1A13C290639852, "sat ")
+SUBS(AR|AA|AI|AP, str_5359503E60204126, "pipa ")
+SUBS(AR|AI|AO|AP, str_3AFC1E9A8765C53B, "lop ")
+SUBS(AR|AA|AS|AO, str_62AB30530BED5D60, "ossaa ")
+SUBS(AR|AN|AI|AO, str_5A09FD44BA314863, "hun ")
+SUBS(AR|AN|AI|AP, str_683696748A01B41C, "min ")
+SUBS(AR|AA|AT|AI, str_BA2E119CA038883C, "av ")
+SUBS(AR|AA|AE|AT, str_452BE2346B5B80C3, "fra ")
+SUBS(AR|AE|AO|AP, str_5AC772D310448B08, "oppe ")
+SUBS(AR|AA|AT|AO, str_A75FF214306BA9D1, "gaa ")
+SUBS(AR|AS|AI|AP, str_A147DE6F127B4CD6, "skip ")
+SUBS(AR|AS|AE|AO|AP, str_B80F3FE3F3FCA0CC, "posse ")
+SUBS(AR|AA|AS|AT|AP, str_092E3BDF639232DD, "paastaa ")
+SUBS(AR|AE|AN|AO|AP, str_21DDFFBA443700D3, "munnen ")
+SUBS(AR|AT|AN|AI|AP, str_168886128C6CCE68, "mit ")
+SUBS(AR|AS|AN|AI|AP, str_CE4E838E0BC6E4DA, "km ")
+SUBS(AR|AS|AT|AI|AO, str_1109F5FD7D22AAC8, "sig ")
+SUBS(AR|AA|AN|AO|AP, str_38342550D5BCF484, "opnaa ")
+SUBS(AR|AA|AI|AO|AP, str_722CFF3C34B02A02, "paal ")
+SUBS(AR|AE|AN|AI|AO, str_EC7EE4878609F3D9, "hele ")
+SUBS(AR|AA|AE|AT|AI, str_776A8271136FBCDD, "var ")
+SUBS(AR|AT|AI|AO|AP, str_702F532D7A48BC00, "pligt ")
+SUBS(AR|AS|AE|AT|AN, str_BB930E6E87DE648C, "syntes ")
+SUBS(AR|AA|AT|AO|AP, str_4CCE26463694D960, "optat ")
+SUBS(AR|AE|AI|AO|AP, str_50BF19563B51D19B, "pleie ")
+SUBS(AR|AE|AN|AI|AP, str_B95094D0F4C2F09E, "mine ")
+SUBS(AR|AE|AT|AN|AP, str_DEE3BBD571C511F7, "mere ")
+SUBS(AR|AA|AN|AI|AP, str_FC9AB513E2B03A28, "ham ")
+SUBS(AR|AS|AT|AI|AP, str_A19F8973C971DB48, "spist ")
+SUBS(AR|AA|AS|AE|AT, str_7E1EAC57B515C2D1, "satte ")
+SUBS(AR|AS|AE|AO, str_5630D9590D848D9C, "dod ")
+SUBS(AR|RGT|AS|AE|AO, str_90B2E8A16883F3EC, "odd ")
+SUBS(AR|AA|AE|AI, str_68E1B1603E13FE30, "xi ")
+SUBS(AR|RGT|AA|AE|AI, str_D2F95EA81F7C61D5, "ix ")
+SUBS(AR|AE|AN|AO, str_E832D18A44EEE332, "enno ")
+SUBS(AR|RGT|AE|AN|AO, str_F18EF20D08AA79B8, "noe ")
+SUBS(AR|AT|AN|AI, str_802658407F3418BA, "thi ")
+SUBS(AR|RGT|AT|AN|AI, str_D5ACE27258AF148F, "hit ")
+SUBS(AR|AT|AN|AO, str_1B45A3756EC37127, "gong ")
+SUBS(AR|RGT|AT|AN|AO, str_AF931575FB1EA518, "ut ")
+SUBS(AR|AE|AT|AP, str_3AC87E4EE66F6E61, "teppet ")
+SUBS(AR|RGT|AE|AT|AP, str_342F8CACA85F0AD6, "per ")
+SUBS(AR|AA|AS|AP, str_C23AF9CA50CD0164, "saapas ")
+SUBS(AR|RGT|AA|AS|AP, str_467C897077B58F08, "pas ")
+SUBS(AR|AE|AT|AO, str_B5E6B5782EE16BAB, "eg ")
+SUBS(AR|RGT|AE|AT|AO, str_B97355B02DCE4543, "or ")
+SUBS(AR|AA|AE|AN, str_D184E1BC9A680407, "annen ")
+SUBS(AR|RGT|AA|AE|AN, str_D980517798430066, "naae ")
+SUBS(AR|AA|AI|AO, str_C49001FAA655F248, "al ")
+SUBS(AR|RGT|AA|AI|AO, str_7E7904D7326BCF29, "la ")
+SUBS(AR|AE|AI|AO, str_3CD2516588C5C683, "elle ")
+SUBS(AR|RGT|AE|AI|AO, str_E2986299752E3DE1, "lille ")
+SUBS(AR|AS|AT|AO, str_685B24601F82F924, "stott ")
+SUBS(AR|RGT|AS|AT|AO, str_77C6B8367F5A7C65, "oc ")
+SUBS(AR|AA|AN|AO, str_FD846B750BDF7708, "au ")
+SUBS(AR|RGT|AA|AN|AO, str_DCF7A99961FBA279, "unna ")
+SUBS(AR|AT|AO|AP, str_8574F11BEB82545C, "top ")
+SUBS(AR|RGT|AT|AO|AP, str_028BB7B551A4BD43, "pot ")
+SUBS(AR|AS|AE|AN, str_ECE5A6CDF4EED85C, "den ")
+SUBS(AR|RGT|AS|AE|AN, str_FB507079A5396F2A, "ned ")
+SUBS(AR|AA|AS|AN, str_63668A98CF9C47B7, "sja ")
+SUBS(AR|RGT|AA|AS|AN, str_16D6BE915787F782, "ja ")
+SUBS(AR|AA|AS|AI, str_2511202E00D980C7, "saki ")
+SUBS(AR|RGT|AA|AS|AI, str_423FC7030B57068F, "ka ")
+SUBS(AR|AS|AT|AI, str_2B382E2C87F633B5, "sit ")
+SUBS(AR|RGT|AS|AT|AI, str_057FCE32C97154C0, "kvit ")
+SUBS(AR|AA|AN|AI, str_BF40C27E59DAAC7B, "ah ")
+SUBS(AR|RGT|AA|AN|AI, str_BB30CFFA4957C51C, "han ")
+SUBS(AR|AS|AN|AI, str_55863E4A819B49C1, "sin ")
+SUBS(AR|RGT|AS|AN|AI, str_E1D43A91C597031D, "nik ")
+SUBS(AR|AS|AI|AO, str_D1E42442E1A668BC, "slik ")
+SUBS(AR|RGT|AS|AI|AO, str_7D5664732C823A0F, "los ")
+SUBS(AR|AT|AI|AO, str_1C31AEE8DFCCE8EB, "til ")
+SUBS(AR|RGT|AT|AI|AO, str_DD07510FB54603F8, "liv ")
+SUBS(AR|AA|AT|AN, str_AA9B005CF3762F95, "fann ")
+SUBS(AR|RGT|AA|AT|AN, str_47B698232847D3D2, "nat ")
+SUBS(AR|AE|AN|AI, str_02B1330BAE5CC4C1, "ein ")
+SUBS(AR|RGT|AE|AN|AI, str_4FFE5A0A17921200, "henne ")
+SUBS(AR|AE|AT|AN, str_131A9B4CD2947310, "berre ")
+SUBS(AR|RGT|AE|AT|AN, str_77D0DE1110F92FFB, "nyt ")
+SUBS(AR|AS|AN|AO, str_3D29840CE477716A, "son ")
+SUBS(AR|RGT|AS|AN|AO, str_6E23CC4BFF56B58C, "jo ")
+SUBS(AR|AS|AE|AI, str_D09F1FA0A086795B, "dei ")
+SUBS(AR|RGT|AS|AE|AI, str_25694FCDDE3987C4, "ikke ")
+SUBS(AR|AA|AS|AT|AI|AO, str_23089E82F5DFD0B4, "folk ")
+SUBS(AR|AA|AT|AI|AO|AP, str_2C59793065D02EDC, "opgav ")
+SUBS(AR|AA|AS|AN|AO|AP, str_FEC58E5F68E80032, "saasom ")
+SUBS(AR|AA|AT|AN|AI|AP, str_29B4DD2D22E83638, "vapni ")
+SUBS(AR|AE|AT|AN|AO|AP, str_879E412A510F3163, "meget ")
+SUBS(AR|AA|AS|AE|AO|AP, str_9D443C23601872A4, "opad ")
+SUBS(AR|AA|AE|AN|AI|AP, str_9B092F875E2DA1B4, "ha' ")
+SUBS(AR|AS|AE|AT|AO|AP, str_C3F89E20008EF31C, "spor ")
+SUBS(AR|AA|AS|AT|AI|AP, str_B3546060F2895743, "skapt ")
+SUBS(AR|AA|AS|AN|AI|AO, str_1F82936043CAFDC8, "hakon ")
+SUBS(AR|AE|AT|AI|AO|AP, str_348B2BB289B8817D, "pige ")
+SUBS(AR|AA|AS|AE|AT|AO, str_CA49BEAA613AC2F8, "sagde ")
+SUBS(AR|AA|AE|AI|AO|AP, str_6726AAAD1B841698, "la' ")
+SUBS(AR|AA|AE|AT|AN, str_9C31DB94CBCECD2F, "bare ")
+SUBS(AR|RGT|AA|AE|AT|AN, str_986149229D18C728, "naar ")
+SUBS(AR|AA|AS|AT|AN, str_F241B9D5D2417008, "sant ")
+SUBS(AR|RGT|AA|AS|AT|AN, str_2AAC07FC03EF5685, "jf ")
+SUBS(AR|AA|AS|AI|AP, str_6CB6EB1D7BCF408B, "skipa ")
+SUBS(AR|RGT|AA|AS|AI|AP, str_FF423FC7030B5706, "kap ")
+SUBS(AR|AS|AE|AN|AP, str_AB4FDC245F092768, "dem ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_BA4C53A61687D977, "med ")
+SUBS(AR|AA|AS|AE|AP, str_659DE3D98174868E, "sa' ")
+SUBS(AR|RGT|AA|AS|AE|AP, str_1B1C50D62E726AE4, "passe ")
+SUBS(AR|AA|AS|AN|AO, str_88345F7C93C4C73D, "sau ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_08B751B76E493B91, "jau ")
+SUBS(AR|AA|AE|AI|AO, str_4B68781D007741F3, "alle ")
+SUBS(AR|RGT|AA|AE|AI|AO, str_4DB93DD67BC5B5E0, "lea ")
+SUBS(AR|AS|AT|AN|AO, str_20CF80C46BB5F512, "song ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_C039D2A5D9FC5D72, "just ")
+SUBS(AR|AA|AT|AN|AI, str_43AD10D41DE2729C, "fin ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_7589149FDAADDD5C, "navn ")
+SUBS(AR|AA|AS|AE|AN, str_C51486569CE1AF4C, "anden ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_0C372259E4C87260, "naade ")
+SUBS(AR|AA|AS|AT|AO, str_B68AFDA999042AE2, "sagt ")
+SUBS(AR|RGT|AA|AS|AT|AO, str_592113E20E9BD955, "ogsaa ")
+SUBS(AR|AA|AE|AN|AP, str_A11DE192909885A2, "apne ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_6FB419EBFA4FDDD0, "mannen ")
+SUBS(AR|AA|AS|AE|AI, str_9CD8BF58537BE31A, "skade ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_056D17F1CB6B6987, "kasse ")
+SUBS(AR|AS|AN|AI|AO, str_070960D6B75F9DAA, "sjol ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_897B80D7A07B3BB6, "nok ")
+SUBS(AR|AA|AN|AI|AO, str_184A1BA14F670A97, "alonzo ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_54DEAA1A3F19A7FC, "hall ")
+SUBS(AR|AE|AT|AI|AO, str_87C9A08BCD5987C8, "eller ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_2CCE6615DDD45C8E, "over ")
+SUBS(AR|AS|AT|AO|AP, str_769DB022AD959409, "spog ")
+SUBS(AR|RGT|AS|AT|AO|AP, str_993FB3354F37599E, "post ")
+SUBS(AR|AA|AE|AT|AP, str_CCB60C7B52B04B65, "rapp ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_F552C5CE7412D067, "par ")
+SUBS(AR|AA|AE|AT|AO, str_DAE84F2729ACCE2B, "for ")
+SUBS(AR|RGT|AA|AE|AT|AO, str_CC8D36F0E3CEDCB9, "ofte ")
+SUBS(AR|AS|AE|AT|AI, str_44D89FF8C9DEFE4D, "ved ")
+SUBS(AR|RGT|AS|AE|AT|AI, str_44E526692C9E5C02, "idet ")
+SUBS(AR|AS|AI|AO|AP, str_AE39F7849C80EFF0, "spil ")
+SUBS(AR|RGT|AS|AI|AO|AP, str_87CFB86F7172C44A, "kop ")
+SUBS(AR|AE|AT|AN|AI, str_47FD2EA69E80E270, "ven ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_8BA7632DC4B89BB1, "her ")
+SUBS(AR|AA|AT|AN|AP, str_415DEF2531D5D328, "amt ")
+SUBS(AR|RGT|AA|AT|AN|AP, str_06AABBFC9BF9658F, "mat ")
+SUBS(AR|AA|AE|AN|AI, str_6CCDD17C98DBD8DA, "einannan ")
+SUBS(AR|RGT|AA|AE|AN|AI, str_3E7CD427C0274FF0, "hena ")
+SUBS(AR|AE|AT|AO|AP, str_7D0F31281EF69F8B, "ropte ")
+SUBS(AR|RGT|AE|AT|AO|AP, str_C49A79241347400B, "potter ")
+SUBS(AR|AS|AE|AT|AP, str_957AA55BB10DC8D1, "drepe ")
+SUBS(AR|RGT|AS|AE|AT|AP, str_E89D243AB8903FE3, "prest ")
+SUBS(AR|AS|AE|AI|AP, str_6F2A64F59BE5E26E, "spise ")
+SUBS(AR|RGT|AS|AE|AI|AP, str_E5D45F3E4260F02B, "pike ")
+SUBS(AR|AA|AS|AN|AP, str_FDE849B83007B2AD, "smaa ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_58182FA043E248BD, "jaampa ")
+SUBS(AR|AA|AS|AI|AO, str_408F0634544C632D, "skal ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_702618E7AF96922D, "kalla ")
+SUBS(AR|AS|AE|AI|AO, str_1861909A5CAE7807, "del ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_3CB77C2629D9FD41, "lod ")
+SUBS(AR|AS|AE|AN|AI, str_5673F12CA48839F3, "sine ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_B2996F5DF156F820, "ikkje ")
+SUBS(AR|AT|AN|AI|AO, str_166C1C638CBE4F0B, "bli ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_A3CF5E1B52894A08, "hoit ")
+SUBS(AR|AE|AT|AN|AO, str_BA3BD4D2DA7AE86E, "bort ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_B7409EC7507F1CD9, "noget ")
+SUBS(AR|AA|AT|AN|AO, str_F3FA41B52DE36D40, "gang ")
+SUBS(AR|RGT|AA|AT|AN|AO, str_FAD744D3AA1797A8, "utan ")
+SUBS(AR|AS|AT|AN|AI, str_98C61CAAF61C00D5, "sint ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_1F36E9BDFB6C17A3, "hvis ")
+SUBS(AR|AA|AT|AI|AO, str_15B496B76D052225, "alt ")
+SUBS(AR|RGT|AA|AT|AI|AO, str_57FCC1E7B02592FD, "olav ")
+SUBS(AR|AS|AE|AT|AO, str_C0568171B6FADB9E, "seg ")
+SUBS(AR|RGT|AS|AE|AT|AO, str_D859293B22449C89, "ord ")
+SUBS(AR|AT|AN|AO|AP, str_C7B05810B9878F2F, "tom ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_7E273C54E980F6C3, "mot ")
+SUBS(AR|AS|AE|AN|AO, str_68105B858B425CB4, "du ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_D208B44DAA2DC351, "ud ")
+SUBS(AR|AA|AS|AT|AI, str_8B539FEEE1CA73C0, "fik ")
+SUBS(AR|RGT|AA|AS|AT|AI, str_2DF56A494788F048, "kva ")
+SUBS(AR|AS|AN|AO|AP, str_7A83FEE54F908E5E, "som ")
+SUBS(AR|RGT|AS|AN|AO|AP, str_C9A7878495430405, "mons ")
+SUBS(AR|AA|AS|AN|AI, str_4401268928040B20, "sank ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_4B4CC6627CFD3ECE, "hans ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_23061DC1E942126E, "knapt ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_20D6D6623B1192DC, "pastor ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_812F7194D11B8ADE, "mindre ")
+SUBS(AR|AA|AE|AT|AN|AI, str_701758C383D21C1A, "fine ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_4ADA2A4F18F54100, "har ")
+SUBS(AR|AA|AS|AE|AT|AP, str_2622E4CB4E7E9609, "derpaa ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_2415BE5D6332DA50, "passer ")
+SUBS(AR|AA|AT|AN|AO|AP, str_20D86D618162A4CE, "bagom ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_59A99855C94EE38F, "magt ")
+SUBS(AR|AS|AE|AT|AI|AP, str_3E11FF89C13615F1, "skipet ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_405D34AF2264AD2A, "pris ")
+SUBS(AR|AE|AN|AI|AO|AP, str_D2C24B68658B63FD, "emil ")
+SUBS(AR|RGT|AE|AN|AI|AO|AP, str_8FB9C780573B2537, "mellem ")
+SUBS(AR|AS|AT|AN|AO|AP, str_1198A5FC9E3C4B8D, "spjot ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_58A09E210104136F, "pust ")
+SUBS(AR|AA|AS|AE|AT|AN, str_691DC3BEDE0F7276, "andre ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN, str_33BEF0A978E16432, "naesten ")
+SUBS(AR|AA|AS|AT|AN|AO, str_C87062042895E975, "sang ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO, str_412E9C52008E2FFC, "jacob ")
+SUBS(AR|AE|AT|AN|AI|AP, str_FAC1CC00AF3E4FF0, "time ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_525F6F04A9513987, "meir ")
+SUBS(AR|AA|AE|AT|AN|AP, str_943BA4CC51713FB6, "frem ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_D4702E3A6CDC1944, "maatte ")
+SUBS(AR|AA|AE|AT|AI|AP, str_D5CAE91410E03313, "appetit ")
+SUBS(AR|RGT|AA|AE|AT|AI|AP, str_942036C586B52CDC, "parti ")
+SUBS(AR|AS|AE|AT|AI|AO, str_B0E66F30B466B53B, "vilde ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO, str_D3FB3DC22A4E2199, "lidt ")
+SUBS(AR|AS|AT|AN|AI|AP, str_173A297B1E582BEA, "bisp ")
+SUBS(AR|RGT|AS|AT|AN|AI|AP, str_0237BF0C3728CA80, "minst ")
+SUBS(AR|AA|AS|AE|AN|AO, str_5F3E693A3DBE9F2E, "daud ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_65076753CFCFEB84, "unda ")
+SUBS(AR|AA|AS|AN|AI|AP, str_F3A14A8A57EB3C42, "skam ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_D7EEA8DF541E3089, "kamp ")
+SUBS(AR|AA|AS|AE|AI|AP, str_7DE18DE6A01D6E65, "skape ")
+SUBS(AR|RGT|AA|AS|AE|AI|AP, str_94F2F9657A2B07AA, "pakke ")
+SUBS(AR|AS|AN|AI|AO|AP, str_D2957C6524A4A470, "smil ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_C50B116423771F39, "kom ")
+SUBS(AR|AA|AS|AE|AT|AI, str_0BDE3ABCCA6AB259, "fekk ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI, str_9A09060F892B014F, "kvar ")
+SUBS(AR|AA|AE|AT|AI|AO, str_C4AF10EDD7B3CE20, "tale ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_8B224A56A722EACC, "laegge ")
+SUBS(AR|AA|AE|AT|AN|AO, str_FBD40D7FE37392C8, "gunnar ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_0DC869483ED5AEE0, "naturen ")
+SUBS(AR|AS|AE|AT|AN|AI, str_95821FFE4D6CCEB7, "verden ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_C94E0D979EC3173C, "kjendte ")
+SUBS(AR|AS|AE|AN|AI|AP, str_168528F7605DED93, "deim ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_88A02478E01864F9, "hjem ")
+SUBS(AR|AS|AT|AI|AO|AP, str_ADBF0C95C8F3EEC7, "spilt ")
+SUBS(AR|RGT|AS|AT|AI|AO|AP, str_0CC9334B24C94347, "opkog ")
+SUBS(AR|AA|AT|AN|AI|AO, str_C52ACE281FD23DC7, "gunnlaug ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_5057A823E6EF6941, "langt ")
+SUBS(AR|AA|AS|AE|AI|AO, str_078A61B5A3D2EDA1, "saaledes ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_443AFB8E5BA06E0D, "lad ")
+SUBS(AR|AA|AS|AT|AN|AP, str_0F7A33633730631F, "samt ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_B1D0E10589BDCF66, "jamt ")
+SUBS(AR|AS|AE|AN|AI|AO, str_33147076F22F7144, "skulde ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_5E4907A9602E385A, "kunde ")
+SUBS(AR|AS|AT|AN|AI|AO, str_803AA4D54E4ECA25, "blik ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_20856FF8512ED81F, "och ")
+SUBS(AR|AA|AS|AE|AN|AP, str_9A129D3C2CF63359, "samme ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_60F97D11D338DF2C, "mand ")
+SUBS(AR|AA|AS|AE|AN|AI, str_41BE0294178512AB, "sidan ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_9524DA52379D77C6, "hadde ")
+SUBS(AR|AA|AE|AT|AO|AP, str_EABC033D43046E24, "ropa ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_6668BB5B4D2A7ED7, "praeg ")
+SUBS(AR|AA|AE|AN|AI|AO, str_9CD03918EFCF7A9D, "alene ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_B9DC345474FEAAFE, "nella ")
+SUBS(AR|AA|AN|AI|AO|AP, str_2CA0FC38C08FA765, "alm ")
+SUBS(AR|RGT|AA|AN|AI|AO|AP, str_BB3C0422028F010B, "maal ")
+SUBS(AR|AS|AE|AT|AN|AO, str_8DF4F0A3E8D06533, "gjorde ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_40D58FBA4B772732, "jeg ")
+SUBS(AR|AS|AE|AT|AN|AP, str_530DA972D63F0664, "dermed ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_44BF2FC17F81D9DC, "mest ")
+SUBS(AR|AE|AT|AN|AI|AO, str_13A17952D7936000, "blev ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_C4B71F459D277067, "hvor ")
+SUBS(AR|AA|AS|AI|AO|AP, str_0C564574F3F9E640, "slap ")
+SUBS(AR|RGT|AA|AS|AI|AO|AP, str_C7EB7D81F91BE0A5, "plass ")
+SUBS(AR|AT|AN|AI|AO|AP, str_9421FD7057EC3479, "glum ")
+SUBS(AR|RGT|AT|AN|AI|AO|AP, str_2CB95DC376B85715, "mig ")
+SUBS(AR|AA|AS|AT|AN|AI, str_675E272AB3F66F0B, "bak ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_5105E1ED4EE07DAD, "kant ")
+SUBS(AR|AS|AE|AI|AO|AP, str_436EB2280846AFBA, "slippe ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_2B428695A66CFFA2, "pleiede ")
+SUBS(AR|AS|AE|AN|AO|AP, str_12BF12EEF13D6E95, "dom ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_03BC9D6CB8B3908A, "mod ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_26E9D183E5DC1CEC, "varme ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_4F68B541639EDEFD, "marthe ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_A1BF08CE77023301, "ansigt ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO, str_6C2D114EB287C846, "langs ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_473981551EFD6393, "amalie ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_15B3FA68E5B2A5AF, "lampen ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_FD9C5088E67087F9, "fremmede ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_998AAA8FA0BD2EFA, "praesten ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_84B545298327CD46, "dagen ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO, str_17EB714C2539A733, "udenfor ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_17CD626AEBE3C3D7, "tilbage ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_DEAE0E631215F7DA, "laenge ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_E28487370C845A56, "temmelig ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_E2A0F7ED7FA741CA, "nemlig ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_67E1DA9D0CFE08A6, "gjekk ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_8933F64483BB3D68, "igjen ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_F4959725FF42EA5E, "form ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_C2CF32C587BF7039, "mange ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_5E983D26AD532998, "selskap ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_DBE9C589EF0C7ECD, "plads ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_E2DDD7FA1C4E3257, "slapt ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_25C96A14BEB45AC4, "kapital ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_72BCBC6B67C84CC5, "smag ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_FFAE1393B428FE51, "magnus ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_C2B7418B33310F97, "smal ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_F1E4A79945AA15C8, "koma ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_91508723D13E50C2, "sjael ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_7D17F74FF1147EF0, "land ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_92B49DE543A0FE87, "aasmund ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_99241769490F065E, "pause ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_B874CB7A247D38E7, "aldrig ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO, str_BFA9B4DA0A071FCE, "idag ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_BCBFC8DF86BE653E, "spiller ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_EA2F32DA16BB8574, "krop ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_41ABC456A5EF7C05, "gamal ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_E7F55670DBE46CD8, "opfatning ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_D417C9470FA585D3, "skarpe ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_4F6C506138FB813D, "paris ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_50CE1FBCCF8F0C87, "gjennem ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_9D7FD16BE042340E, "moder ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_F874B4D22D07CD35, "smukke ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_C3072C8E402D9AF0, "komme ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_1B4E5EF4EEBE2A23, "smukt ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_A2E95332F90A605E, "punkt ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_58DBAC3080F43A2C, "april ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO|AP, str_14CE87608C69A9E7, "opgave ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_283CDFAB45CB688D, "aminda ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_65630D299B492DBA, "maaske ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_E58EBBCB29EC30ED, "vand ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_3E3C52395DF34DEA, "havde ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_3100B6504E408AF8, "ganske ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_641EBB3888B96B29, "landet ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_6A3C132D331BE48F, "sprak- ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_E4B4237662F98075, "kapitel ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_983BB9490F1B54AF, "sprang ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_525170CB0DE5F109, "majoren ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_30CB1E9A4531010A, "stockmann ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_AE887234BAEDACCA, "langsomt ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_2B7AC670F25AD6AB, "skarphedin ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_2DD2C51B8291C701, "maerke ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_9D99E681CE81731E, "smilte ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_2286C79D95E0BDDA, "kommer ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_809202FFCE5E1F57, "gamle ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_1C42E8C388890F53, "maelte ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_CEB3DC4E08870198, "allesammen ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_7C4D116A0E83A9CF, "hjaelp ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_B622BC891E1EA930, "bokselskap ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_4AD5B79509B5AD19, "litteraturselskap ")
diff --git a/keyboards/gboards/dicts/aset/pl-keymap.def b/keyboards/gboards/dicts/aset/pl-keymap.def
new file mode 100644
index 00000000000..2105c72e142
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/pl-keymap.def
@@ -0,0 +1,391 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AI, KC_I)
+PRES(AE, KC_E)
+PRES(AS, KC_S)
+PRES(AO, KC_O)
+PRES(AP, KC_P)
+PRES(AT, KC_T)
+PRES(AN, KC_N)
+PRES(AA, KC_A)
+PRES(AE|AN, KC_Y)
+PRES(AS|AT, KC_C)
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AT|AP, KC_BSPC)
+PRES(AI|AO, KC_L)
+PRES(AA|AT, KC_F)
+PRES(AE|AP, KC_QUOT)
+PRES(AN|AI, KC_H)
+PRES(AA|AP, KC_QUOT)
+PRES(AS|AE, KC_D)
+PRES(AE|AT, KC_R)
+PRES(AA|AN, KC_Q)
+PRES(AT|AN, KC_B)
+PRES(AE|AO, KC_MINS)
+PRES(AA|AI, KC_Z)
+PRES(AN|AP, KC_M)
+PRES(AS|AO, KC_DOT)
+PRES(AS|AN, KC_J)
+PRES(AO|AP, KC_SCLN)
+PRES(AA|AE, KC_X)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+PRES(AS|AI, KC_K)
+PRES(AT|AI, KC_V)
+PRES(AA|AS, KC_W)
+PRES(AN|AO, KC_U)
+PRES(AT|AO, KC_G)
+PRES(AE|AI, KC_COMM)
+SUBS(AR|AE|AI|AP, str_A491E07566DCBCCE, "pie ")
+SUBS(AR|AE|AN|AO, str_E429BF3EE734FF3A, "you ")
+SUBS(AR|AA|AT|AN, str_BC666593D4A4C03F, "ant ")
+SUBS(AR|AE|AT|AP, str_342F8CACA85F0AD6, "per ")
+SUBS(AR|AT|AN|AI, str_F1550476BF0CE003, "bi ")
+SUBS(AR|AS|AI|AP, str_0D73B887B19DE5E2, "spi ")
+SUBS(AR|AI|AO|AP, str_88B19184FF89676C, "pol ")
+SUBS(AR|AN|AI|AO, str_161D2E58C581072B, "oni ")
+SUBS(AR|AA|AE|AN, str_6ED1301D90276771, "aye ")
+SUBS(AR|AS|AE|AT, str_588356397058DF85, "rece ")
+SUBS(AR|AE|AN|AI, str_9921484B6D464113, "nie ")
+SUBS(AR|AS|AT|AO, str_2AE88837B413EF66, "co ")
+SUBS(AR|AA|AS|AT, str_F474D01C34F98813, "stas ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AA|AS|AP, str_467C897077B58F08, "pas ")
+SUBS(AR|AS|AT|AN, str_FE14BF055E2C7052, "tj ")
+SUBS(AR|AT|AO|AP, str_028BB7B551A4BD43, "pot ")
+SUBS(AR|AS|AO|AP, str_82274D54E6521B8A, "spo ")
+SUBS(AR|AT|AI|AP, str_3485B67E8E69F0E2, "itp ")
+SUBS(AR|AN|AI|AP, str_DD31FA4C91A58242, "mi ")
+SUBS(AR|AA|AS|AE, str_AEA81051C91270E9, "dwa ")
+SUBS(AR|AA|AE|AO, str_AB819235D216611C, "-a ")
+SUBS(AR|AN|AO|AP, str_2CDB1FF9C007065E, "mu ")
+SUBS(AR|AA|AE|AT, str_C1FED2185FB7D60F, "ar ")
+SUBS(AR|AE|AI|AO, str_B186DE4E1BCC6BDE, "ile ")
+SUBS(AR|AA|AS|AE|AT, str_EC4EB91CB342E940, "serca ")
+SUBS(AR|AA|AS|AO|AP, str_6C29AC27296DA679, "psow ")
+SUBS(AR|AS|AE|AI|AP, str_6F968C7D36E5FB46, "pies ")
+SUBS(AR|AS|AE|AT|AP, str_D4E79D57ECF89EE4, "press ")
+SUBS(AR|AS|AT|AI|AP, str_2BC515A6311342A6, "pic ")
+SUBS(AR|AE|AT|AN|AP, str_8F5B998AF340E04A, "tym ")
+SUBS(AR|AA|AE|AO|AP, str_753E0EA72488E92A, "poppea ")
+SUBS(AR|AE|AN|AI|AO, str_9A3D75FCA3F72BD8, "-nie ")
+SUBS(AR|AE|AT|AO|AP, str_EB50CC50FD89B4E1, "popr ")
+SUBS(AR|AS|AT|AO|AP, str_CB532D5DED67E46B, "stop ")
+SUBS(AR|AT|AI|AO|AP, str_29389FBA187AC95B, "plot ")
+SUBS(AR|AA|AN|AO|AP, str_675C6B89B793CD03, "panu ")
+SUBS(AR|AE|AT|AI|AP, str_B29260442498350B, "prie ")
+SUBS(AR|AE|AN|AO|AP, str_5F1CC41FEB0BB428, "open ")
+SUBS(AR|AT|AN|AI|AP, str_168886128C6CCE68, "mit ")
+SUBS(AR|AS|AT|AN|AP, str_6B0C78D6F9C44972, "tms ")
+SUBS(AR|AS|AI|AO|AP, str_6FF05C990E42FA88, "polski ")
+SUBS(AR|AE|AN|AI|AP, str_3825F1F13BE93849, "mnie ")
+SUBS(AR|AE|AI|AO|AP, str_5BAADB551C215537, "pole ")
+SUBS(AR|AS|AE|AN, str_75C24596AEB01E0F, "syn ")
+SUBS(AR|RGT|AS|AE|AN, str_7F8A878948419A08, "jej ")
+SUBS(AR|AS|AI|AO, str_A102081D29DBE99A, "sil ")
+SUBS(AR|RGT|AS|AI|AO, str_7F0B7D0481DBB4DB, "okolo ")
+SUBS(AR|AS|AE|AI, str_E58DC3AAD5620A93, "sie ")
+SUBS(AR|RGT|AS|AE|AI, str_A1A4E3A00C59C039, "ide ")
+SUBS(AR|AA|AN|AO, str_96310C678E194B46, "aon ")
+SUBS(AR|RGT|AA|AN|AO, str_E1BCA9513A9FBB4D, "ona ")
+SUBS(AR|AS|AN|AI, str_55BA44F3ECCF2160, "sni ")
+SUBS(AR|RGT|AS|AN|AI, str_E9D65B1F0CC7B588, "his ")
+SUBS(AR|AS|AN|AO, str_7412E38D9D55C2DC, "su ")
+SUBS(AR|RGT|AS|AN|AO, str_6E23CC4BFF56B58C, "jo ")
+SUBS(AR|AT|AI|AO, str_64C134863F91CBBF, "gi ")
+SUBS(AR|RGT|AT|AI|AO, str_82C52922742C8BCA, "ito ")
+SUBS(AR|AT|AN|AO, str_48542059A4690B7A, "tu ")
+SUBS(AR|RGT|AT|AN|AO, str_36A8BF615FFBF261, "obu ")
+SUBS(AR|AA|AS|AI, str_52ECEE9A713C2443, "zas ")
+SUBS(AR|RGT|AA|AS|AI, str_423FC7030B57068F, "ka ")
+SUBS(AR|AA|AS|AN, str_C87E02F3A5F27D9B, "aja ")
+SUBS(AR|RGT|AA|AS|AN, str_16D6BE915787F782, "ja ")
+SUBS(AR|AA|AN|AP, str_3D72E248EAC8A4B1, "apan ")
+SUBS(AR|RGT|AA|AN|AP, str_04B8207B25B0547B, "pan ")
+SUBS(AR|AS|AE|AO, str_16AE4BE38D2F26C0, "do ")
+SUBS(AR|RGT|AS|AE|AO, str_4BBC015B2B32DD62, "od ")
+SUBS(AR|AE|AT|AN, str_39EAEC33BC5439E6, "ten ")
+SUBS(AR|RGT|AE|AT|AN, str_86CBD141F40A0963, "net ")
+SUBS(AR|AA|AE|AI, str_4D4206C98723FE7F, "ze ")
+SUBS(AR|RGT|AA|AE|AI, str_F96D1FD4510B04BB, "ize ")
+SUBS(AR|AA|AS|AO, str_CBD1BA8947756219, "wo ")
+SUBS(AR|RGT|AA|AS|AO, str_718DDA8AD1E6441F, "ow ")
+SUBS(AR|AA|AT|AO, str_E8428C5D5071FB17, "ato ")
+SUBS(AR|RGT|AA|AT|AO, str_BF38370C83727D39, "of ")
+SUBS(AR|AA|AI|AO, str_E4AC71C68B795F6B, "zal ")
+SUBS(AR|RGT|AA|AI|AO, str_7E7904D7326BCF29, "la ")
+SUBS(AR|AE|AT|AO, str_D6BC93C137A0DDC1, "tego ")
+SUBS(AR|RGT|AE|AT|AO, str_0F66D9A64D728704, "-to ")
+SUBS(AR|AS|AT|AI, str_A5BC7DE4E3DC110E, "ci ")
+SUBS(AR|RGT|AS|AT|AI, str_32F2AE7B4D81A039, "isc ")
+SUBS(AR|AE|AT|AI, str_58BE655F23750BE2, "tie ")
+SUBS(AR|RGT|AE|AT|AI, str_D1DCEFF648227DE8, "ir ")
+SUBS(AR|AA|AN|AI, str_FEA2CC9886A11B4C, "ani ")
+SUBS(AR|RGT|AA|AN|AI, str_2F61D71797033A3B, "niz ")
+SUBS(AR|AE|AN|AP, str_73C7878926E85D22, "eme ")
+SUBS(AR|RGT|AE|AN|AP, str_A0AA5B74C096E40B, "my ")
+SUBS(AR|AA|AT|AI, str_C4ED1C3C34714250, "tai ")
+SUBS(AR|RGT|AA|AT|AI, str_D7978D4AE69E4592, "if ")
+SUBS(AR|AA|AS|AT|AI|AO, str_CD283EBD75315D80, "glowa ")
+SUBS(AR|AA|AN|AI|AO|AP, str_D1BBA15D26D271D6, "mial ")
+SUBS(AR|AA|AS|AT|AN|AI, str_953D4FFBBB45C0D6, "znich ")
+SUBS(AR|AA|AS|AE|AO|AP, str_0615F92751016E17, "powod ")
+SUBS(AR|AA|AS|AE|AI|AO, str_63F5DCD514DD9FD7, "dla ")
+SUBS(AR|AE|AT|AI|AO|AP, str_CA68B30D2A3E4CA7, "piotr ")
+SUBS(AR|AA|AE|AT|AO|AP, str_78B3E4A5BEFCCF86, "pora ")
+SUBS(AR|AS|AT|AI|AO|AP, str_24DAD2E9363385BD, "pociski ")
+SUBS(AR|AE|AN|AI|AO|AP, str_67481541F34CE2FC, "mieli ")
+SUBS(AR|AA|AT|AN|AI|AP, str_69834F7A15E3E249, "itam ")
+SUBS(AR|AA|AT|AI|AO|AP, str_2C31D8D65013108B, "filip ")
+SUBS(AR|AA|AE|AN|AO|AP, str_07A41DCCEB013EB0, "-pan ")
+SUBS(AR|AS|AT|AN|AI|AP, str_EB589FD49B0AF7DA, "mscic ")
+SUBS(AR|AA|AS|AE|AT|AI, str_43849ADF8911F81B, "wiec ")
+SUBS(AR|AE|AT|AI|AO, str_25898EFE2F007763, "teorii ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_5C97D4C96250D0DD, "ligie ")
+SUBS(AR|AE|AT|AN|AO, str_EF307FC773D273F8, "gory ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_FBF5946940EEEFAE, "nero ")
+SUBS(AR|AA|AE|AT|AP, str_2903C29B27FA6DB7, "tarp ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_EBDCC5E102538DD2, "pare ")
+SUBS(AR|AT|AN|AI|AO, str_7749EC7C4DCE5D35, "buvo ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_2A573CE3FF091D1A, "lub ")
+SUBS(AR|AS|AN|AI|AO, str_2598029A6FC1FB75, "skoku ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_4474A5BFA5EB3EF5, "ku ")
+SUBS(AR|AA|AI|AO|AP, str_D42B08D32AFC806C, "zlapal ")
+SUBS(AR|RGT|AA|AI|AO|AP, str_6891D94BA9696461, "poza ")
+SUBS(AR|AA|AT|AI|AP, str_E45E0E1FFA358289, "taip ")
+SUBS(AR|RGT|AA|AT|AI|AP, str_0F023B2A672E572C, "pati ")
+SUBS(AR|AS|AE|AO|AP, str_3137CACB06726B3D, "spod ")
+SUBS(AR|RGT|AS|AE|AO|AP, str_7F10168D0097DB0A, "pod ")
+SUBS(AR|AA|AE|AI|AP, str_9D5B2246A9A44C04, "apie ")
+SUBS(AR|RGT|AA|AE|AI|AP, str_46C7F3F152D77D2F, "papieza ")
+SUBS(AR|AA|AS|AE|AP, str_8012C8AD363ECD15, "wpada ")
+SUBS(AR|RGT|AA|AS|AE|AP, str_D8E7C7FFB71BBC84, "pada ")
+SUBS(AR|AA|AE|AI|AO, str_DB017B313F911B03, "ale ")
+SUBS(AR|RGT|AA|AE|AI|AO, str_EC58D2F8A88F5A23, "lezal ")
+SUBS(AR|AS|AN|AI|AP, str_216D0257CB4F1198, "spij ")
+SUBS(AR|RGT|AS|AN|AI|AP, str_ADA4AB22469B2792, "kim ")
+SUBS(AR|AA|AS|AN|AP, str_020E794D3DE91D12, "sam ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_697ABB49F35D04C1, "maja ")
+SUBS(AR|AS|AE|AI|AO, str_FFA102081D29DBE9, "sile ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_312A2E7E56737AFE, "like ")
+SUBS(AR|AA|AE|AT|AI, str_8E16FDEB3B7BD15E, "teraz ")
+SUBS(AR|RGT|AA|AE|AT|AI, str_24EDFFEA3C1B8914, "iteraz ")
+SUBS(AR|AA|AE|AN|AI, str_67E6E3E49740D9E4, "zenie ")
+SUBS(AR|RGT|AA|AE|AN|AI, str_5E352CCDA18A8397, "nanie ")
+SUBS(AR|AA|AE|AT|AO, str_DAE84F2729ACCE2B, "for ")
+SUBS(AR|RGT|AA|AE|AT|AO, str_EB5EB1EA9EC091DC, "-ato ")
+SUBS(AR|AA|AT|AN|AI, str_DA20B440A7186A4B, "that ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_F0766381B3230F6C, "izba ")
+SUBS(AR|AA|AS|AI|AP, str_CF010BA70501908F, "zapas ")
+SUBS(AR|RGT|AA|AS|AI|AP, str_1693E1BD8853EA38, "kaip ")
+SUBS(AR|AS|AT|AN|AO, str_3973DE5EE1634B28, "boju ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_7EDA07DE5F6587D0, "noc ")
+SUBS(AR|AA|AS|AN|AI, str_5A191BD0D3B5E0B0, "wina ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_0DD9825597AB1FD6, "jak ")
+SUBS(AR|AA|AE|AT|AN, str_5266192C1C4A0C53, "aby ")
+SUBS(AR|RGT|AA|AE|AT|AN, str_6C501A5B37F57C14, "nate ")
+SUBS(AR|AA|AT|AI|AO, str_54FF88B465DDE41C, "zato ")
+SUBS(AR|RGT|AA|AT|AI|AO, str_39A15AB60A930844, "lat ")
+SUBS(AR|AA|AT|AN|AO, str_BA8EB1FCD8D7F309, "boga ")
+SUBS(AR|RGT|AA|AT|AN|AO, str_6F75AB0560AB6029, "nato ")
+SUBS(AR|AS|AE|AT|AN, str_A099E61174562F44, "byc ")
+SUBS(AR|RGT|AS|AE|AT|AN, str_1536985B9146BCC8, "jest ")
+SUBS(AR|AS|AN|AO|AP, str_49C2B811AEA32933, "spoj ")
+SUBS(AR|RGT|AS|AN|AO|AP, str_7B49EFB61062D284, "moj ")
+SUBS(AR|AA|AS|AT|AP, str_75C0F40E20635976, "spac ")
+SUBS(AR|RGT|AA|AS|AT|AP, str_71BC2B4C61432D58, "pats ")
+SUBS(AR|AS|AE|AN|AO, str_FEE71AEABD01BE00, "synu ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_E011627E21CDE5CA, "jedno ")
+SUBS(AR|AT|AN|AO|AP, str_C7B05810B9878F2F, "tom ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_16573C5F75ACCF57, "potu ")
+SUBS(AR|AS|AE|AT|AO, str_E35488D14F1A1AE5, "dosc ")
+SUBS(AR|RGT|AS|AE|AT|AO, str_BB03C320B8AC9817, "odtego ")
+SUBS(AR|AA|AS|AE|AN, str_C1FDC4AB8597A676, "and ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_3A2D391B7974B59B, "nad ")
+SUBS(AR|AS|AE|AT|AI, str_308289549DD8EB29, "cie ")
+SUBS(AR|RGT|AS|AE|AT|AI, str_32CED4C220D5C898, "itd ")
+SUBS(AR|AS|AE|AN|AP, str_5A54D374BBFA01F0, "dym ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_5987DD037108FF0E, "jednym ")
+SUBS(AR|AA|AT|AN|AP, str_BF3DDFB8CBFE1C63, "tam ")
+SUBS(AR|RGT|AA|AT|AN|AP, str_06AABBFC9BF9658F, "mat ")
+SUBS(AR|AA|AS|AT|AN, str_B6B0791766FC5360, "stan ")
+SUBS(AR|RGT|AA|AS|AT|AN, str_FA78055C68B5A3B0, "jac ")
+SUBS(AR|AS|AT|AN|AI, str_3A08E259A2172D4A, "bci ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_A2BD28473653B4A5, "ich ")
+SUBS(AR|AS|AE|AN|AI, str_B164BA3889B2FB9E, "she ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_50C615FCB27CF013, "kiedy ")
+SUBS(AR|AA|AS|AI|AO, str_8341D8ECCB498083, "slowa ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_A31489C287CF556B, "kilka ")
+SUBS(AR|AS|AT|AI|AO, str_08FB9B842F110E0D, "glos ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_FCD2EBB756F8505C, "kto ")
+SUBS(AR|AA|AS|AN|AO, str_A3C468F489BEB8D7, "swoja ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_08B751B76E493B91, "jau ")
+SUBS(AR|AE|AT|AN|AI, str_0C571CCD7FA5FAEF, "the ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_8BA7632DC4B89BB1, "her ")
+SUBS(AR|AA|AN|AI|AO, str_4065901F0DBDE9E5, "znalazl ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_D76667AF53CFE716, "uz ")
+SUBS(AR|AA|AS|AE|AI, str_1150B261034F59C2, "dzis ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_F9095D7BADB76F7C, "kad ")
+SUBS(AR|AA|AE|AN|AP, str_7E02E71632E36E12, "amy ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_8ADBFF719B6887DA, "max ")
+SUBS(AR|AA|AS|AT|AO, str_D7267ED8F25FFCD6, "gotow ")
+SUBS(AR|RGT|AA|AS|AT|AO, str_6480A413B01E419E, "owoc ")
+SUBS(AR|AA|AS|AT|AI, str_30692A6B9C31E20B, "tak ")
+SUBS(AR|RGT|AA|AS|AT|AI, str_E6D7BAA9422C1C21, "itak ")
+SUBS(AR|AA|AS|AE|AO, str_61D192A51AFCC5F7, "woda ")
+SUBS(AR|RGT|AA|AS|AE|AO, str_FEE35575A17EE85A, "owe ")
+SUBS(AR|AA|AN|AI|AP, str_E7FD4D95E0ECE2F2, "zanim ")
+SUBS(AR|RGT|AA|AN|AI|AP, str_96B68E3CE631491F, "pani ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_E0E60930BCE3C73F, "chwili ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_FFA2CDACD468A7C0, "przeto ")
+SUBS(AR|AS|AE|AI|AO|AP, str_BF4D547DC946D1FF, "dopoki ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_76706733607D84E8, "polskie ")
+SUBS(AR|AA|AS|AE|AT|AO, str_17D5070CA583C13A, "wsrod ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO, str_121CE7FEF45F2B65, "otwarte ")
+SUBS(AR|AA|AS|AE|AT|AP, str_0830B0BEC335F9D0, "sprawe ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_897C8A1BC32867ED, "prawda ")
+SUBS(AR|AA|AS|AT|AN|AO, str_7EC4019BF7A27A2C, "soba ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO, str_39EF976E58C0F7CA, "usta ")
+SUBS(AR|AA|AS|AT|AO|AP, str_1C4343006ED44480, "stopa ")
+SUBS(AR|RGT|AA|AS|AT|AO|AP, str_9ADB6A5A7359C688, "postac ")
+SUBS(AR|AA|AT|AN|AI|AO, str_30C04EEB2550CE82, "albo ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_35AFA5EDA12A3932, "ognia ")
+SUBS(AR|AA|AS|AN|AI|AP, str_571D3A7C1C0FCA32, "wnim ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_C065D83192F92CFE, "masz ")
+SUBS(AR|AE|AT|AN|AI|AP, str_A3BFC273E7154C1F, "tymi ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_59E509482D5D1E60, "itym ")
+SUBS(AR|AA|AT|AN|AO|AP, str_0329483B37CC7D79, "toma ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_04735497277598FD, "moga ")
+SUBS(AR|AS|AE|AT|AO|AP, str_BADEEB86F71663E4, "sporo ")
+SUBS(AR|RGT|AS|AE|AT|AO|AP, str_8EF16902DCF50F29, "prosto ")
+SUBS(AR|AA|AE|AT|AN|AI, str_689683CE3D2F8C9C, "bez ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_D6EDA1112FE57CE1, "nieraz ")
+SUBS(AR|AT|AN|AI|AO|AP, str_FE22695BBC5DD558, "tlum ")
+SUBS(AR|RGT|AT|AN|AI|AO|AP, str_3B2C5CA4244325C7, "mogl ")
+SUBS(AR|AA|AE|AT|AI|AO, str_A8D00D9E20745330, "zeto ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_E63D2D54BB2E8D75, "oraz ")
+SUBS(AR|AS|AT|AN|AO|AP, str_66243C94F3B2B5DB, "sposob ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_3FC62401ECDB318D, "moc ")
+SUBS(AR|AA|AS|AE|AI|AP, str_AEDE320028514B19, "spiew ")
+SUBS(AR|RGT|AA|AS|AE|AI|AP, str_B0A3465B74523EEE, "pisze ")
+SUBS(AR|AA|AS|AE|AN|AP, str_8C8A288B208E0240, "samym ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_4EAB49C2A4C5D31E, "pewna ")
+SUBS(AR|AS|AE|AT|AN|AO, str_B8F1E4D51EDB5842, "gdy ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_399FF63D67EA14AC, "jego ")
+SUBS(AR|AS|AE|AT|AN|AI, str_681C096596CB803C, "tych ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_1C753E658A0EBF30, "niech ")
+SUBS(AR|AA|AE|AT|AN|AO, str_223F6F53F5A7F4CF, "rano ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_F6D7468D7894459B, "natury ")
+SUBS(AR|AS|AN|AI|AO|AP, str_2E0D541C604B98DA, "spokoj ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_D374CC34653EE315, "musi ")
+SUBS(AR|AS|AT|AN|AI|AO, str_FEF596EEB3395818, "choc ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_850A0D84D379C6A5, "obok ")
+SUBS(AR|AA|AS|AT|AI|AP, str_BF8B0E117F8D8B9C, "czapka ")
+SUBS(AR|RGT|AA|AS|AT|AI|AP, str_587D68CFFCA1B058, "ptak ")
+SUBS(AR|AA|AE|AN|AI|AP, str_99BF132245A8AE10, "ziemi ")
+SUBS(AR|RGT|AA|AE|AN|AI|AP, str_FE046E2117493F57, "panie ")
+SUBS(AR|AE|AT|AN|AI|AO, str_7855793FAD2584F7, "bylo ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_E172CE6A022BC486, "niego ")
+SUBS(AR|AS|AE|AT|AN|AP, str_77ED269248036BC2, "system ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_74BA4214B8CBF536, "jestem ")
+SUBS(AR|AS|AE|AT|AI|AO, str_11993E34A1021FA7, "drogi ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO, str_3447AD2799AF9B28, "ktore ")
+SUBS(AR|AA|AS|AN|AO|AP, str_C2EA6FBB32FA4604, "samo ")
+SUBS(AR|RGT|AA|AS|AN|AO|AP, str_81C55989B07D18A6, "moja ")
+SUBS(AR|AS|AE|AN|AI|AP, str_0EB1CF9B9FF00F0B, "siedem ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_A308BC1B9CDDE5C7, "mniej ")
+SUBS(AR|AA|AS|AE|AN|AO, str_D814AB707631E6E4, "swoje ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_79D4722D91A47364, "nowe ")
+SUBS(AR|AA|AE|AT|AI|AP, str_F7ED3CBF861705BD, "rzepa ")
+SUBS(AR|RGT|AA|AE|AT|AI|AP, str_DA38DE0EC076829E, "przez ")
+SUBS(AR|AA|AS|AI|AO|AP, str_B12C64BA71DE502B, "wpol ")
+SUBS(AR|RGT|AA|AS|AI|AO|AP, str_9566333CE4E4FAA4, "powoli ")
+SUBS(AR|AE|AT|AN|AO|AP, str_11F24D6D9FF9EE48, "temu ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_BA76DF85B03272BE, "potem ")
+SUBS(AR|AS|AE|AN|AO|AP, str_4952204E14B44646, "domu ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_FA159A0D4FF24695, "moje ")
+SUBS(AR|AA|AS|AT|AN|AP, str_AFE8BE2B21D61832, "wacpan ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_D91BF87AF03501D6, "majac ")
+SUBS(AR|AS|AE|AN|AI|AO, str_0E4BE7BD4C8B5FF5, "sily ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_AEAB8882710E1973, "jesli ")
+SUBS(AR|AS|AE|AT|AI|AP, str_B1450A5A96F9EB99, "skiper ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_120D2D4567D69D0F, "piec ")
+SUBS(AR|AA|AE|AN|AI|AO, str_D73B8B89A11E7E69, "zony ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_CBA39E01D46A5A40, "lzy ")
+SUBS(AR|AA|AS|AN|AI|AO, str_B4F893F17D5BFA60, "znowu ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_22555D6D3659AB8F, "juz ")
+SUBS(AR|AA|AS|AE|AN|AI, str_E97D61333AD33EE0, "dzien ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_E6B56EE21E79FD4F, "jednak ")
+SUBS(AR|AA|AS|AE|AT|AN, str_D71474D53A7860D2, "stary ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN, str_C15CBB0CC54B374B, "nawet ")
+SUBS(AR|AA|AE|AT|AN|AP, str_F458C645095A0346, "temat ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_484FFD0C3F8C22CE, "natym ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_F5595FF4F9D28058, "prosze ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_11A72F1C959137D7, "wdomu ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_AE0D097AA673151C, "mowy ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_FB8C0CCC698B87BD, "wprost ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO|AP, str_185FB4AA24BE7765, "prawo ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_1C179D8B06202BEC, "czy ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_7C777BA8CD2CD28A, "jeszcze ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_06CAAA8DCEDDD6C9, "gdybym ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_F04F7964DA98755D, "prostu ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_2FEEED214995A8CB, "smierc ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_DB1DD65B51E9B606, "miec ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_6BCDC45D27DD88BE, "tylko ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_C5AD4892C80D1F34, "ktory ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_BF4DC09E3508702F, "wpadl ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_4DED92BC9AC3F72A, "powiedzial ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_148B0ED2C8E528AC, "smutna ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_1FBEF6A287826893, "mnostwo ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_522EE9C819BBCA09, "forma ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_385D182E8B2F91A6, "megan ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_3B71E80521C0BA15, "wiem ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_A9A065DCE03C49A1, "miedzy ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_D4FE000DEB4B55F5, "dalej ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_987B33B10F364AD9, "ludzi ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_4980BCB04914E44D, "razem ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_9E07749BBF60F5CE, "przy ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_CF7E18B97298DBE3, "zamiast ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_A9DFA8D9FDDB15AD, "matka ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_AC996A78C2294199, "zupelnie ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_DA51E1D160D9115B, "moze ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_F7370E9D6547553C, "spotkac ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_F58FBC3716CBC4CB, "poczal ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_E730ED054409365F, "chlop ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_4AD46FC909BE0083, "milosc ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_11F77D3324142616, "bylem ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_A8A6AF2E2890A870, "moglem ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_335BC810370B5E80, "dobra ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO, str_D73D21EACF66876B, "justyna ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_BE0A1A51FAE9438B, "spokojnie ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_C59DBE92B191B3C4, "lepiej ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_00A00BE505F4C6F9, "byla ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_9E2D58089420B53D, "nagle ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_D28EA6CF6C5E4995, "swoim ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_DD5D1F24297C36F8, "mowil ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_176E7D225AF0F28C, "gdzie ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO, str_01E0AC99DA576DC0, "lecz ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_92A119435FC9CE89, "wprawdzie ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_DF560DEC3994A6D9, "przed ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_D83DF63ADE49E529, "galima ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_A2996D19E26D41C4, "mogla ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_B6C66CB47D17D70D, "wtym ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_740872627B08089B, "naprawde ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_C260090ACD1E2712, "dopiero ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_3E4446A236E69735, "predko ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_7C2323AA068D2942, "chlopak ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_16862140820A2B99, "mowic ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_D28F496BB90D5022, "zapytal ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_4F9D44B5EB4C2748, "potrzeba ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_B8E510C11F4DDD2B, "tymczasem ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_574683A673D00801, "przypis ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_D59AF32E612D0F1E, "samego ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_D898512EFFF7F322, "pewnego ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_4D1F6795712F4F0F, "widzialem ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_2DC01CC1CDC885FF, "pozniej ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_4B807319DDE29AD2, "glosem ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_42CA4D7EB0E630A7, "ktorym ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_02C8BBCB56F06802, "wszystko ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_86CE308D14D6110E, "oczy ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_B863B09C4E695B3F, "bowiem ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_53C973AE10A38D1D, "petroniusz ")
diff --git a/keyboards/gboards/dicts/aset/pt-keymap.def b/keyboards/gboards/dicts/aset/pt-keymap.def
new file mode 100644
index 00000000000..8bc5e31a04f
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/pt-keymap.def
@@ -0,0 +1,398 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AS, KC_S)
+PRES(AA, KC_A)
+PRES(AI, KC_I)
+PRES(AN, KC_N)
+PRES(AE, KC_E)
+PRES(AO, KC_O)
+PRES(AP, KC_P)
+PRES(AT, KC_T)
+PRES(AS|AO, KC_DOT)
+PRES(AT|AO, KC_G)
+PRES(AE|AP, KC_QUOT)
+PRES(AA|AN, KC_Q)
+PRES(AO|AP, KC_SCLN)
+PRES(AN|AI, KC_H)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+PRES(AE|AI, KC_COMM)
+PRES(AA|AS, KC_W)
+PRES(AN|AO, KC_U)
+PRES(AT|AI, KC_V)
+PRES(AE|AT, KC_R)
+PRES(AN|AP, KC_M)
+PRES(AS|AT, KC_C)
+PRES(AS|AI, KC_K)
+PRES(AI|AO, KC_L)
+PRES(AE|AN, KC_Y)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+PRES(AA|AI, KC_Z)
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AA|AE, KC_X)
+PRES(AT|AP, KC_BSPC)
+PRES(AS|AN, KC_J)
+PRES(AA|AP, KC_QUOT)
+PRES(AA|AT, KC_F)
+PRES(AS|AE, KC_D)
+PRES(AE|AO, KC_MINS)
+PRES(AT|AN, KC_B)
+SUBS(AR|AS|AE|AI, str_BA01E476816FB907, "disse ")
+SUBS(AR|AA|AT|AN, str_C24BA9CC30FB290C, "tanta ")
+SUBS(AR|AT|AN|AI, str_C13C85985E26BFC4, "bit ")
+SUBS(AR|AA|AE|AT, str_0437C1EBD8E5369E, "era ")
+SUBS(AR|AA|AS|AE, str_6E5B393925FE64CE, "da ")
+SUBS(AR|AN|AO|AP, str_96877FFA56942058, "um ")
+SUBS(AR|AE|AO|AP, str_CC3E5A3303308465, "poe ")
+SUBS(AR|AA|AO|AP, str_B7966CC526170B14, "pao ")
+SUBS(AR|AS|AE|AP, str_8701C012ABF855B9, "pes ")
+SUBS(AR|AA|AT|AI, str_BAFADEA916A599C6, "vai ")
+SUBS(AR|AA|AE|AN, str_83396DA0D7927D05, "any ")
+SUBS(AR|AA|AS|AO, str_F68A4F1A95A9BD49, "sao ")
+SUBS(AR|AN|AI|AO, str_1034F6BB7A17B9DD, "olhou ")
+SUBS(AR|AE|AN|AI, str_C4D48E3111A94BAB, "he ")
+SUBS(AR|AA|AI|AP, str_38C2991671D8F57C, "pai ")
+SUBS(AR|AT|AO|AP, str_DE2E4C23273EE8E2, "topo ")
+SUBS(AR|AS|AT|AO, str_2D72329877AAC8B6, "gosto ")
+SUBS(AR|AA|AT|AP, str_4E64DC39CCCFB68B, "tapa ")
+SUBS(AR|AI|AO|AP, str_588F6A0B4B7F490A, "polo ")
+SUBS(AR|AS|AE|AT, str_7533AF731BE1BC8B, "ser ")
+SUBS(AR|AA|AS|AP, str_60CC9352D1FD34D7, "passa ")
+SUBS(AR|AS|AT|AI, str_14448AE0E61D1AED, "civis ")
+SUBS(AR|AE|AT|AP, str_D89F06941F4B44CE, "peter ")
+SUBS(AR|AA|AE|AO, str_AB819235D216611C, "-a ")
+SUBS(AR|AA|AS|AT, str_AEE6EBDC4ABDC3CD, "casa ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AN|AI|AP, str_2F9CEC9D21E64B28, "mim ")
+SUBS(AR|AA|AS|AI, str_7B6254034666DEBB, "saia ")
+SUBS(AR|AS|AO|AP, str_BB2A8EBDA4A2BCF1, "posso ")
+SUBS(AR|AE|AN|AO|AP, str_74F9BE204413E051, "meu ")
+SUBS(AR|AA|AT|AI|AO, str_177813FF2C66EB30, "foi ")
+SUBS(AR|AS|AI|AO|AP, str_3CF1BF4E9A40E6AA, "pois ")
+SUBS(AR|AA|AS|AT|AN, str_36AE1C3C1BB7F46B, "tantas ")
+SUBS(AR|AA|AE|AN|AI, str_B0D068D005493603, "annie ")
+SUBS(AR|AE|AN|AI|AP, str_2A2F016FAA9B3070, "i'm ")
+SUBS(AR|AE|AN|AI|AO, str_B3DFF34C13426B88, "lhe ")
+SUBS(AR|AA|AE|AI|AP, str_4020E3E21A171F95, "peixe ")
+SUBS(AR|AA|AS|AI|AP, str_D44E5D8ED960FACD, "pais ")
+SUBS(AR|AA|AS|AE|AT, str_75DF9DA7D504F48F, "esta ")
+SUBS(AR|AS|AT|AN|AP, str_DE6CBE601C534F3D, "cm ")
+SUBS(AR|AS|AE|AI|AP, str_D369C5DC0DACB7CE, "pedi ")
+SUBS(AR|AS|AE|AT|AI, str_4E395F624AF132AD, "tivesse ")
+SUBS(AR|AE|AI|AO|AP, str_4C1F0DE14DF6E241, "pelo ")
+SUBS(AR|AA|AS|AT|AI, str_E9C99E1CFE322CD0, "vista ")
+SUBS(AR|AS|AE|AT|AO, str_318AFAF8CF406143, "todos ")
+SUBS(AR|AA|AS|AT|AO, str_D6139906E26C81C3, "caso ")
+SUBS(AR|AA|AS|AE|AO, str_9B9896941ABC7ABF, "dado ")
+SUBS(AR|AA|AT|AO|AP, str_4037EBCCD909B772, "pag ")
+SUBS(AR|AA|AN|AI, str_BF40C27E59DAAC7B, "ah ")
+SUBS(AR|RGT|AA|AN|AI, str_BF044DB5EE261598, "ha ")
+SUBS(AR|AA|AT|AO, str_4BB9E9EF63BEBC38, "tao ")
+SUBS(AR|RGT|AA|AT|AO, str_BF38370C83727D39, "of ")
+SUBS(AR|AE|AI|AO, str_272EFE1B7A38AC2F, "ele ")
+SUBS(AR|RGT|AE|AI|AO, str_BA18BADF84DB0986, "lei ")
+SUBS(AR|AA|AN|AO, str_71F6394BD16EE524, "ano ")
+SUBS(AR|RGT|AA|AN|AO, str_8A26C4FB2D8DF6C9, "nao ")
+SUBS(AR|AA|AI|AO, str_57703FBC3F00F956, "ali ")
+SUBS(AR|RGT|AA|AI|AO, str_7E7904D7326BCF29, "la ")
+SUBS(AR|AT|AI|AO, str_5B9BD401742B17DF, "tio ")
+SUBS(AR|RGT|AT|AI|AO, str_6168AC13AD887B2F, "logo ")
+SUBS(AR|AA|AS|AN, str_45A403A4960EE226, "san ")
+SUBS(AR|RGT|AA|AS|AN, str_16D6BE915787F782, "ja ")
+SUBS(AR|AA|AE|AI, str_B5C6868EBD0E9220, "xia ")
+SUBS(AR|RGT|AA|AE|AI, str_D2F95EA81F7C61D5, "ix ")
+SUBS(AR|AS|AE|AN, str_9CFD6F6C59053F15, "eyes ")
+SUBS(AR|RGT|AS|AE|AN, str_CC973B4210035154, "nesse ")
+SUBS(AR|AE|AN|AO, str_3CF92217D792ADB9, "eu ")
+SUBS(AR|RGT|AE|AN|AO, str_E429BF3EE734FF3A, "you ")
+SUBS(AR|AE|AT|AN, str_5E7FFBEBF6AB0C31, "entre ")
+SUBS(AR|RGT|AE|AT|AN, str_86CBD141F40A0963, "net ")
+SUBS(AR|AT|AN|AO, str_48542059A4690B7A, "tu ")
+SUBS(AR|RGT|AT|AN|AO, str_298D759206E85DAC, "notou ")
+SUBS(AR|AS|AI|AO, str_C9ADB25B4C37D131, "sol ")
+SUBS(AR|RGT|AS|AI|AO, str_A9A25720DD3EF6B7, "isso ")
+SUBS(AR|AS|AE|AO, str_16AE4BE38D2F26C0, "do ")
+SUBS(AR|RGT|AS|AE|AO, str_3005AB2C2310529F, "-se ")
+SUBS(AR|AA|AN|AP, str_F438C1279CCEB43D, "ama ")
+SUBS(AR|RGT|AA|AN|AP, str_2A907D456EBB3E24, "ma ")
+SUBS(AR|AE|AN|AP, str_B6C3042679BF7796, "em ")
+SUBS(AR|RGT|AE|AN|AP, str_5140BEC191346017, "me ")
+SUBS(AR|AE|AT|AI, str_B617CB13CF22666C, "ver ")
+SUBS(AR|RGT|AE|AT|AI, str_D1DCEFF648227DE8, "ir ")
+SUBS(AR|AS|AN|AO, str_F0B9D8D4E1BD5471, "sou ")
+SUBS(AR|RGT|AS|AN|AO, str_0341A6E60E56E199, "nos ")
+SUBS(AR|AE|AT|AO, str_20D7DB6356C0A844, "george ")
+SUBS(AR|RGT|AE|AT|AO, str_B97355B02DCE4543, "or ")
+SUBS(AR|AS|AN|AI, str_55863E4A819B49C1, "sin ")
+SUBS(AR|RGT|AS|AN|AI, str_E9D65B1F0CC7B588, "his ")
+SUBS(AR|AA|AS|AI|AO|AP, str_29103ED8CB64A6D7, "lapis ")
+SUBS(AR|AS|AE|AN|AO|AP, str_730CEFC84E43E909, "mesmo ")
+SUBS(AR|AS|AT|AN|AI|AP, str_A523540C97D0BDFB, "smith ")
+SUBS(AR|AA|AE|AN|AI|AP, str_1628448935D4E6CD, "menina ")
+SUBS(AR|AA|AS|AE|AT|AO, str_4E3C37722A0C3D73, "fosse ")
+SUBS(AR|AA|AS|AE|AT|AI, str_0BF4177DE6B0BAA1, "estava ")
+SUBS(AR|AT|AN|AO|AP, str_908755519640022F, "bom ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_FBC0C68825BA3ED7, "ponto ")
+SUBS(AR|AS|AE|AN|AP, str_C373302FE1A4C7A3, "sem ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_92C437930874C6F2, "meses ")
+SUBS(AR|AS|AN|AO|AP, str_7A83FEE54F908E5E, "som ")
+SUBS(AR|RGT|AS|AN|AO|AP, str_E1CD22283D20085C, "pousou ")
+SUBS(AR|AS|AE|AN|AI, str_B164BA3889B2FB9E, "she ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_05662FF02834B11E, "keynes ")
+SUBS(AR|AS|AE|AI|AO, str_8AD641F2C57C0448, "eles ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_A28152FE5B07DC04, "ido ")
+SUBS(AR|AA|AE|AI|AO, str_5CFE3D9F85B7F21C, "ela ")
+SUBS(AR|RGT|AA|AE|AI|AO, str_EF706E4ACB77221A, "lixo ")
+SUBS(AR|AA|AN|AO|AP, str_8CCDB3FD341FF633, "amo ")
+SUBS(AR|RGT|AA|AN|AO|AP, str_DD180EF391DDE2AB, "uma ")
+SUBS(AR|AE|AT|AN|AP, str_29779B9B38744BD2, "bem ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_680AEAD7C557B390, "mente ")
+SUBS(AR|AA|AS|AO|AP, str_073BCCEBCAB4EC8E, "apos ")
+SUBS(AR|RGT|AA|AS|AO|AP, str_1839E188792C76D9, "passo ")
+SUBS(AR|AA|AE|AT|AO, str_CBCC5E35852A45F9, "agora ")
+SUBS(AR|RGT|AA|AE|AT|AO, str_10A7A601DE6C9DD5, "ora ")
+SUBS(AR|AE|AT|AI|AO, str_D9A393BE13567B65, "rio ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_78EB02A73111AFAF, "livro ")
+SUBS(AR|AE|AT|AN|AO, str_86524E6ACDECD253, "gente ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_367528D2539A9E0E, "outro ")
+SUBS(AR|AA|AS|AE|AN, str_7A765B9FE6BE7A80, "seja ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_37C4A203E75175E9, "nada ")
+SUBS(AR|AA|AT|AN|AP, str_9C7BB48EBD7121E3, "fama ")
+SUBS(AR|RGT|AA|AT|AN|AP, str_84D6693F0314A756, "matt ")
+SUBS(AR|AA|AS|AN|AP, str_020E794D3DE91D12, "sam ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_3AD00291CF91C488, "mas ")
+SUBS(AR|AA|AT|AN|AI, str_DC24F46DC56D0174, "tinha ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_C05A9CA335749382, "havia ")
+SUBS(AR|AT|AI|AO|AP, str_5C160B9C40438458, "tipo ")
+SUBS(AR|RGT|AT|AI|AO|AP, str_C13BDF1DCA605739, "povo ")
+SUBS(AR|AS|AN|AI|AP, str_122C44A32A7CB6F5, "sim ")
+SUBS(AR|RGT|AS|AN|AI|AP, str_92AF4A68D7F14A59, "jim ")
+SUBS(AR|AS|AT|AO|AP, str_C397F170443D8EB3, "copo ")
+SUBS(AR|RGT|AS|AT|AO|AP, str_876C4D699D9E7557, "posto ")
+SUBS(AR|AA|AS|AE|AP, str_F5D8B6FDF8888805, "espada ")
+SUBS(AR|RGT|AA|AS|AE|AP, str_03B8E6DECF4617F1, "pesada ")
+SUBS(AR|AA|AS|AT|AP, str_53DD616AAFCCD0DA, "capa ")
+SUBS(AR|RGT|AA|AS|AT|AP, str_5C8A5086E8C1FD71, "pasta ")
+SUBS(AR|AA|AE|AT|AI, str_41B64C1A303CDA0A, "vez ")
+SUBS(AR|RGT|AA|AE|AT|AI, str_77E871A6659AC741, "iria ")
+SUBS(AR|AA|AE|AT|AN, str_A13CAC4178CE5DA9, "frente ")
+SUBS(AR|RGT|AA|AE|AT|AN, str_6C501A5B37F57C14, "nate ")
+SUBS(AR|AE|AT|AI|AP, str_8256E9932CEBED2F, "repetir ")
+SUBS(AR|RGT|AE|AT|AI|AP, str_BC7EF837C3357A72, "piper ")
+SUBS(AR|AA|AS|AN|AI, str_D0E3C0860E196C79, "sinais ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_032E186F59C3226D, "haja ")
+SUBS(AR|AS|AE|AT|AN, str_FF9BFD2E4AF84687, "entender ")
+SUBS(AR|RGT|AS|AE|AT|AN, str_F0D1F896293F98F2, "neste ")
+SUBS(AR|AA|AE|AT|AP, str_7496CDB33B675524, "tapete ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_900C0665FDDCD3E1, "para ")
+SUBS(AR|AS|AN|AI|AO, str_B7F7A29ED9549685, "sonhos ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_9F6003682DD847B5, "olhos ")
+SUBS(AR|AE|AT|AN|AI, str_0C571CCD7FA5FAEF, "the ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_39AD6C55CBFD2922, "neve ")
+SUBS(AR|AA|AI|AO|AP, str_63DD5D3893378E98, "apoio ")
+SUBS(AR|RGT|AA|AI|AO|AP, str_2F4B7C1FF9312713, "paola ")
+SUBS(AR|AS|AT|AN|AO, str_B158C081E4E6933F, "sob ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_2105BA4B2B9F53F7, "junto ")
+SUBS(AR|AA|AS|AE|AI, str_F661EC259440B46B, "dia ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_623021C4572AC297, "ideia ")
+SUBS(AR|AA|AN|AI|AO, str_DF3A88D1DCACE502, "aqui ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_A06D1AD25124C735, "luz ")
+SUBS(AR|AA|AE|AN|AO, str_6A810E6F1345F79D, "que ")
+SUBS(AR|RGT|AA|AE|AN|AO, str_893AF94CE33C9C02, "-nao ")
+SUBS(AR|AA|AN|AI|AP, str_1617F9D69F76173B, "amanha ")
+SUBS(AR|RGT|AA|AN|AI|AP, str_7A0F5D8A47FC42AB, "minha ")
+SUBS(AR|AS|AE|AO|AP, str_15ECECAA27F132B0, "espesso ")
+SUBS(AR|RGT|AS|AE|AO|AP, str_4B88E6BB0BB4FED0, "pode ")
+SUBS(AR|AT|AN|AI|AP, str_D10820C3FEBF6C12, "vim ")
+SUBS(AR|RGT|AT|AN|AI|AP, str_83792703CA7CE494, "http ")
+SUBS(AR|AE|AT|AO|AP, str_FBCCDFCB24EEF885, "reporter ")
+SUBS(AR|RGT|AE|AT|AO|AP, str_8DDF4266066B432B, "por ")
+SUBS(AR|AA|AE|AN|AP, str_2CE00A39BAF00476, "emma ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_C81F567AC96D5CA9, "mae ")
+SUBS(AR|AS|AE|AN|AO, str_4949161E4F891D8C, "seu ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_864EE853E8B8FBAA, "onde ")
+SUBS(AR|AS|AE|AT|AP, str_3ACC31C908690E7F, "espere ")
+SUBS(AR|RGT|AS|AE|AT|AP, str_B3AAAAA39FAD04BA, "perder ")
+SUBS(AR|AS|AT|AN|AI, str_F67830C3E4E560AB, "this ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_622075F6AD6ED0AF, "nick ")
+SUBS(AR|AA|AS|AI|AO, str_EEF664F3C6FBF507, "sala ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_05DBE3DB5EFBA943, "las ")
+SUBS(AR|AA|AS|AN|AO, str_6F460F7ECE1E7238, "sua ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_63EEBE8BBAB0423F, "nossa ")
+SUBS(AR|AS|AT|AI|AO, str_913CECC656E36EDE, "visto ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_95E494F4E4023F11, "isto ")
+SUBS(AR|AT|AN|AI|AO, str_339DBCB4357E8E96, "vou ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_2E18BAE19A2A9E54, "novo ")
+SUBS(AR|AA|AT|AN|AO, str_36D0B382FF1F1658, "quanto ")
+SUBS(AR|RGT|AA|AT|AN|AO, str_FF3F3B1F8B5A3E40, "nota ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_40909FC2168247E4, "propria ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_2A9BECFC7E43B7A8, "claro ")
+SUBS(AR|AA|AT|AI|AO|AP, str_F114FEA740CD2ADD, "galpao ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_3CBEF26B0E24699B, "patio ")
+SUBS(AR|AA|AE|AT|AN|AI, str_44EA8FE45CBA88E4, "tenha ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_2B3433FE04787BA9, "haver ")
+SUBS(AR|AS|AE|AN|AI|AP, str_A74D253E9B1887BA, "seph ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_C2F86B3030D94BBF, "pensei ")
+SUBS(AR|AA|AS|AT|AN|AO, str_7BF3F89E049A29B8, "boca ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO, str_A79F0232F547106C, "nunca ")
+SUBS(AR|AS|AT|AN|AO|AP, str_AF8CB41B072A6FE4, "com ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_1956B2DEECF48785, "pouco ")
+SUBS(AR|AS|AE|AT|AN|AO, str_E295746522B0BD52, "sobre ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_C2DE14EAAD943587, "outros ")
+SUBS(AR|AS|AE|AT|AN|AI, str_C1899A709EEAB6C9, "sentir ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_BEDF6EAC3D1D251F, "interesse ")
+SUBS(AR|AA|AT|AN|AO|AP, str_3B10E67384BC24CD, "apontou ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_8335B4528D6B7CD9, "ponta ")
+SUBS(AR|AA|AS|AE|AN|AO, str_1694C85ED0344196, "quando ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_5868AE63B0E51F4A, "usando ")
+SUBS(AR|AA|AE|AT|AI|AP, str_DD8C8A6D968B52F9, "rapaz ")
+SUBS(AR|RGT|AA|AE|AT|AI|AP, str_5597E67A7CD10BAB, "partir ")
+SUBS(AR|AA|AN|AI|AO|AP, str_6451C20BA328EECD, "alma ")
+SUBS(AR|RGT|AA|AN|AI|AO|AP, str_8C909DCD35D4BFA0, "mal ")
+SUBS(AR|AS|AE|AT|AN|AP, str_9729556965A2CBF1, "sempre ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_7E1CBDFF36145A35, "presente ")
+SUBS(AR|AA|AS|AN|AI|AO, str_BCD86D91F54D72B1, "quais ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_9C2BD3D79251B97A, "loja ")
+SUBS(AR|AA|AS|AE|AT|AP, str_27BD1FAEFCFEC47E, "apesar ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_47829B510E6E0969, "parece ")
+SUBS(AR|AA|AS|AE|AN|AI, str_1F3F11D083098D7F, "ainda ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_B8157EA41E09D921, "had ")
+SUBS(AR|AA|AS|AT|AN|AI, str_F70B1450DD7EC677, "sabia ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_7F1DF9F101812702, "jack ")
+SUBS(AR|AA|AS|AT|AI|AP, str_2DA569F77B293059, "capaz ")
+SUBS(AR|RGT|AA|AS|AT|AI|AP, str_1759D773501295AA, "passava ")
+SUBS(AR|AS|AE|AI|AO|AP, str_867913827E312852, "depois ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_6DC96B61DE3FC33B, "pelos ")
+SUBS(AR|AA|AS|AN|AO|AP, str_52A0FFA1D90B186D, "soma ")
+SUBS(AR|RGT|AA|AS|AN|AO|AP, str_75F11CD68AB3E96F, "maos ")
+SUBS(AR|AS|AN|AI|AO|AP, str_F08DB65390D6A260, "suponho ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_C5F44F4F217656BB, "possui ")
+SUBS(AR|AS|AE|AT|AI|AO, str_3BA918ABFE63F3BE, "voce ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO, str_43E5D39BAEB02209, "livros ")
+SUBS(AR|AA|AS|AE|AO|AP, str_0165EC35ADBF0A0A, "esposa ")
+SUBS(AR|RGT|AA|AS|AE|AO|AP, str_7E30E0829B11502A, "pessoas ")
+SUBS(AR|AA|AE|AN|AI|AO, str_A4C07A0DFF6A2D70, "aquele ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_2F743914CC1EE830, "naquele ")
+SUBS(AR|AT|AN|AI|AO|AP, str_15A36D6E947AA280, "tumulo ")
+SUBS(AR|RGT|AT|AN|AI|AO|AP, str_9A2CF7B5E9DAAD99, "muito ")
+SUBS(AR|AE|AT|AN|AI|AP, str_0057544F35671D44, "vem ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_F312AD97B64E4927, "permitir ")
+SUBS(AR|AA|AE|AT|AN|AO, str_8025BBDF6BAF54D5, "entao ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_4E805A08FB4BDC00, "outra ")
+SUBS(AR|AS|AT|AI|AO|AP, str_54CD08E80EB8F31D, "tipos ")
+SUBS(AR|RGT|AS|AT|AI|AO|AP, str_32F35A4F15BF9FBF, "politico ")
+SUBS(AR|AA|AS|AE|AI|AP, str_67D1B2EBB6A8350B, "despedida ")
+SUBS(AR|RGT|AA|AS|AE|AI|AP, str_0FA2BE67B86DCB22, "paises ")
+SUBS(AR|AA|AS|AT|AO|AP, str_1849C11C91ACE8EA, "sapatos ")
+SUBS(AR|RGT|AA|AS|AT|AO|AP, str_E96296958DF31CB0, "opcao ")
+SUBS(AR|AA|AE|AI|AO|AP, str_F7D795E2DE04290F, "apple ")
+SUBS(AR|RGT|AA|AE|AI|AO|AP, str_34EA7F3BE527A04F, "pela ")
+SUBS(AR|AA|AS|AN|AI|AP, str_F2CD9F26744CEAEC, "assim ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_1D5EA690EF5FD1C4, "mais ")
+SUBS(AR|AA|AE|AN|AO|AP, str_34B1BF6AC4655896, "quem ")
+SUBS(AR|RGT|AA|AE|AN|AO|AP, str_43134FE349F09948, "pequeno ")
+SUBS(AR|AA|AT|AN|AI|AO, str_CE983E18F6869AAE, "filho ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_56EDC83B32FBDC5A, "nova ")
+SUBS(AR|AA|AS|AT|AI|AO, str_4A33DC29C86A9612, "coisa ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO, str_B8729A7E003EEBD7, "local ")
+SUBS(AR|AA|AS|AE|AT|AN, str_52DF65A3865E9585, "antes ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN, str_28FA1D9FC8E2E05B, "jantar ")
+SUBS(AR|AA|AE|AT|AI|AO, str_F69648C05DCE55FD, "talvez ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_7F9E214F3099B995, "levar ")
+SUBS(AR|AA|AS|AE|AN|AP, str_E83FD8F1477DD091, "apenas ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_0BF99D12E692AB07, "mesma ")
+SUBS(AR|AA|AS|AE|AI|AO, str_0F605C8AE051247A, "dela ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_74ECC4650BD9745F, "lado ")
+SUBS(AR|AS|AE|AN|AI|AO, str_2DA85BF8AB5E1470, "disse-lhe ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_9041392BE56C6039, "hoje ")
+SUBS(AR|AE|AT|AN|AI|AO, str_3C1FFD3EF46BCAEA, "tenho ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_E5E793CF32309F5B, "noite ")
+SUBS(AR|AE|AT|AN|AO|AP, str_4D6598D37F6B809E, "tempo ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_FA935D927875D182, "momento ")
+SUBS(AR|AS|AE|AT|AI|AP, str_5A72A21CB90AD104, "especie ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_DCCF38E69C29D422, "pedir ")
+SUBS(AR|AE|AN|AI|AO|AP, str_6B1E99A9834B2BB3, "elmo ")
+SUBS(AR|RGT|AE|AN|AI|AO|AP, str_C0F30FC9FCEAED93, "homem ")
+SUBS(AR|AA|AS|AT|AN|AP, str_F62F17A817EF074F, "cama ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_2DB1FF35B8185E2B, "maca ")
+SUBS(AR|AA|AT|AN|AI|AP, str_2665EF08A428D718, "tinham ")
+SUBS(AR|RGT|AA|AT|AN|AI|AP, str_825BFBA4F20612DA, "haviam ")
+SUBS(AR|AS|AT|AN|AI|AO, str_E3D64E1E756C466B, "cinco ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_F95F57E0B44CBFB1, "unico ")
+SUBS(AR|AS|AE|AT|AO|AP, str_3169E81B5A93E031, "corpo ")
+SUBS(AR|RGT|AS|AE|AT|AO|AP, str_D9390A2702CDE82C, "poder ")
+SUBS(AR|AE|AT|AI|AO|AP, str_ED9183D066499E2C, "golpe ")
+SUBS(AR|RGT|AE|AT|AI|AO|AP, str_3865ED18BE5305EA, "proprio ")
+SUBS(AR|AA|AE|AT|AO|AP, str_93E0D08379A443DE, "aeroporto ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_C092DEF9A4255A92, "porta ")
+SUBS(AR|AA|AE|AT|AN|AP, str_83B9151F77AA65F9, "tambem ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_89FE4E2FCC369BE7, "mar ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_E7C3D51F1D969C15, "capitao ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_FFBE4D4C6357E41B, "policia ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_5EA1BD0C79A23973, "devem ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_73DED435CD93F261, "presidente ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_223E4F20D0974DF1, "simples ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_B4BBE6E5D6C882D2, "homens ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_28FC36B6E3C7F020, "almas ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_A17CD2AD2C03004E, "humanos ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_A7B872CD750CAEB3, "certamente ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_CE157E8AE95EB415, "pensar ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_40EFB7606712B1C9, "explosao ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_3257A57A33C10007, "podia ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_29D5EC092B9A2FF0, "damon ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_D4C9D328AE006E0D, "pensando ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_AEAEE1D38CBCE97A, "esperava ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_3914D06D01AF9C60, "parecia ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_F802BB68B42CA77F, "alem ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_F485FD38F38490BE, "nenhuma ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_9FE211D27ED8D997, "resposta ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO|AP, str_6CD2A548A39A7E32, "professor ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_EA814A9DD248A829, "senhor ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_D0061677504C51C3, "jeito ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_AA97659A2DAA9BA1, "vermelho ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_7C26133C46E3A0CE, "melhor ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_90C1CE5A1DEDBA0F, "campo ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_C50E1DF5FB38424C, "moca ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_F2210851CD069C30, "respeito ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_58FF808F0346EC9B, "possivel ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_6D5D4FDC3F9DFF2B, "alguma ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_031DA253073BBFA8, "ultima ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_50AA30F131B2E470, "qualquer ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_D9AA8032648D36A1, "lugar ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_0BFE68A0F1411636, "diante ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_F7081AA119A36CDC, "instante ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_07E95AE1F76C394E, "fazem ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_4D3D2EDE456B03BB, "primeira ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_AB11AA5BE19B8D7F, "comecou ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_388FFD605DEE918B, "ombros ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_9CA8B2D733B27792, "cima ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_56218FD730A2BA00, "incapaz ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_A7D60A5C0B2E1F3C, "demais ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_7B71CC0ECEDCE268, "medida ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_522EE9C819BBCA09, "forma ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_2A7C4309211FCEA4, "porque ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_19795205239F2A2E, "alguns ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO, str_81AA253A1C9DFDBF, "unica ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_97462BBAAD45EAD1, "grande ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO, str_BA539342DFEDA6CB, "outras ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_1C28EC34F56230A5, "comigo ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_4AFF02F518F2BDB8, "muitos ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_58A31BE0C27FAA40, "aqueles ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_F47E6FAE73F2DF0D, "olhando ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_3E0D6DB62554E555, "estavam ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_C3D8E64EAF6168D5, "imediatamente ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_F10E36BF2899B699, "alguem ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_2E3FB18B63661DE1, "maior ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_6C0D2FF2A548E257, "fazendo ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_FFAD1D59E3A668DD, "historia ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_5D1328D2587D0264, "zaphod ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_833B2E3200AFA957, "podiam ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_BD7AF5A271967564, "estamos ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_312757866E7463DC, "pensamentos ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_3DFBBDB0219BC4DC, "simplesmente ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_A5A1C5B715B89A74, "mulheres ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_F14CF1C7FDB6FF28, "algumas ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_3272855D6A8B2EF4, "muitas ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_169D778CA1859737, "rapido ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_DB76D70C4C63C085, "poderia ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_EE3C001BE8F3E31B, "completamente ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_E1BEFB72473CF816, "marido ")
diff --git a/keyboards/gboards/dicts/aset/ro-keymap.def b/keyboards/gboards/dicts/aset/ro-keymap.def
new file mode 100644
index 00000000000..1b721ff1d56
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/ro-keymap.def
@@ -0,0 +1,409 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AI, KC_I)
+PRES(AA, KC_A)
+PRES(AE, KC_E)
+PRES(AP, KC_P)
+PRES(AT, KC_T)
+PRES(AS, KC_S)
+PRES(AO, KC_O)
+PRES(AN, KC_N)
+PRES(AS|AE, KC_D)
+PRES(AS|AI, KC_K)
+PRES(AO|AP, KC_SCLN)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+PRES(AI|AO, KC_L)
+PRES(AN|AO, KC_U)
+PRES(AE|AP, KC_QUOT)
+PRES(AT|AP, KC_BSPC)
+PRES(AA|AI, KC_Z)
+PRES(AS|AN, KC_J)
+PRES(AE|AT, KC_R)
+PRES(AE|AN, KC_Y)
+PRES(AT|AN, KC_B)
+PRES(AA|AN, KC_Q)
+PRES(AA|AS, KC_W)
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AE|AO, KC_MINS)
+PRES(AT|AI, KC_V)
+PRES(AS|AO, KC_DOT)
+PRES(AS|AT, KC_C)
+PRES(AA|AE, KC_X)
+PRES(AT|AO, KC_G)
+PRES(AN|AP, KC_M)
+PRES(AA|AT, KC_F)
+PRES(AN|AI, KC_H)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+PRES(AA|AP, KC_QUOT)
+PRES(AE|AI, KC_COMM)
+SUBS(AR|AS|AT|AO, str_E4C5BBBFF82DFB94, "scos ")
+SUBS(AR|AT|AI|AP, str_EDDB4B5D8E6E6CF7, "tip ")
+SUBS(AR|AN|AO|AP, str_0F33CAECD78B3E6B, "om ")
+SUBS(AR|AS|AE|AO, str_A6C4D4E6E2DC9327, "s-o ")
+SUBS(AR|AN|AI|AP, str_691EE351478D7886, "imi ")
+SUBS(AR|AA|AE|AP, str_2A1A7461DB623D9B, "ape ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AI|AO|AP, str_7006A6778B2D7795, "lipi ")
+SUBS(AR|AS|AE|AT, str_29CD3969E34DF35B, "ce ")
+SUBS(AR|AA|AE|AT, str_0437C1EBD8E5369E, "era ")
+SUBS(AR|AA|AI|AP, str_38C2991671D8F57C, "pai ")
+SUBS(AR|AN|AI|AO, str_9A5CC103ABF05E48, "lui ")
+SUBS(AR|AA|AS|AE, str_6E5B393925FE64CE, "da ")
+SUBS(AR|AA|AS|AT, str_521DFAED1CC2AD68, "ca ")
+SUBS(AR|AE|AO|AP, str_99E79B03AD8B4C74, "pe-o ")
+SUBS(AR|AT|AO|AP, str_028BB7B551A4BD43, "pot ")
+SUBS(AR|AA|AT|AI|AO, str_2428DC73F971B48B, "afla ")
+SUBS(AR|AE|AI|AO|AP, str_AF7F8A801152DC8B, "piele ")
+SUBS(AR|AA|AE|AN|AO, str_A29D2DDDF2299AA9, "n-a ")
+SUBS(AR|AS|AE|AT|AO, str_A2E2A7890B6E1A26, "rost ")
+SUBS(AR|AS|AI|AO|AP, str_216EC9595D73CC70, "lipsi ")
+SUBS(AR|AA|AT|AO|AP, str_5481B7D85F210D75, "poata ")
+SUBS(AR|AS|AE|AO|AP, str_7F10168D0097DB0A, "pod ")
+SUBS(AR|AA|AN|AO|AP, str_4837C6E1143CA3EF, "puna ")
+SUBS(AR|AA|AS|AE|AT, str_81DF51CAE9E26CF3, "care ")
+SUBS(AR|AE|AN|AO|AP, str_74F9BE204413E051, "meu ")
+SUBS(AR|AE|AN|AI|AO, str_2C9F41D2E2B49ACB, "nu-i ")
+SUBS(AR|AE|AT|AI|AP, str_A9659D940BFC08DD, "privi ")
+SUBS(AR|AA|AS|AT|AI, str_2859A6CAFA8C1B00, "aici ")
+SUBS(AR|AE|AN|AI|AP, str_B95094D0F4C2F09E, "mine ")
+SUBS(AR|AA|AE|AT|AN, str_0DF060E16A761ADC, "barbat ")
+SUBS(AR|AS|AE|AI|AP, str_A35F0F6610D0E904, "piese ")
+SUBS(AR|AE|AT|AO|AP, str_6AE99DAFEC4D4FCD, "pro ")
+SUBS(AR|AA|AS|AI|AP, str_3344F8FE5E129E8A, "pasi ")
+SUBS(AR|AA|AE|AN|AI, str_8577D58769379401, "haine ")
+SUBS(AR|AS|AT|AI, str_A5BC7DE4E3DC110E, "ci ")
+SUBS(AR|RGT|AS|AT|AI, str_119364F935F4EBCA, "ici ")
+SUBS(AR|AA|AT|AI, str_30284D1463413AB2, "fi ")
+SUBS(AR|RGT|AA|AT|AI, str_46096E4526BD4733, "iata ")
+SUBS(AR|AE|AT|AP, str_0CAA47980A6E698C, "trepte ")
+SUBS(AR|RGT|AE|AT|AP, str_B9ED51F2786708FC, "perete ")
+SUBS(AR|AS|AE|AP, str_8102FC0AB10C07B7, "spe ")
+SUBS(AR|RGT|AS|AE|AP, str_431A39591B2ACBF3, "pese ")
+SUBS(AR|AE|AI|AO, str_05ED48987A1828F9, "el ")
+SUBS(AR|RGT|AE|AI|AO, str_05A9C753CDE4911A, "le ")
+SUBS(AR|AE|AN|AI, str_7E3D8B1C859776CA, "eh ")
+SUBS(AR|RGT|AE|AN|AI, str_46373FF5C172BEAA, "hei ")
+SUBS(AR|AA|AN|AI, str_FEA2CC9886A11B4C, "ani ")
+SUBS(AR|RGT|AA|AN|AI, str_874A76971D3F641B, "hai ")
+SUBS(AR|AA|AS|AP, str_6A237834F9D9CEC2, "apasa ")
+SUBS(AR|RGT|AA|AS|AP, str_467C897077B58F08, "pas ")
+SUBS(AR|AA|AN|AO, str_FD846B750BDF7708, "au ")
+SUBS(AR|RGT|AA|AN|AO, str_2023844574ACF1BC, "una ")
+SUBS(AR|AA|AN|AP, str_77BE4D44A5F2AD27, "am ")
+SUBS(AR|RGT|AA|AN|AP, str_2A907D456EBB3E24, "ma ")
+SUBS(AR|AA|AS|AN, str_F81781133D951FB5, "sansa ")
+SUBS(AR|RGT|AA|AS|AN, str_7BCC214E7C2F72D5, "nas ")
+SUBS(AR|AA|AS|AI, str_42CED37466A98FA4, "zis ")
+SUBS(AR|RGT|AA|AS|AI, str_7A4FAD911F818E95, "iasa ")
+SUBS(AR|AS|AI|AO, str_C9ADB25B4C37D131, "sol ")
+SUBS(AR|RGT|AS|AI|AO, str_80673F3F8044C003, "ok ")
+SUBS(AR|AS|AN|AI, str_55863E4A819B49C1, "sin ")
+SUBS(AR|RGT|AS|AN|AI, str_52597526AB3E148B, "jh ")
+SUBS(AR|AE|AT|AI, str_9806793D67632178, "trei ")
+SUBS(AR|RGT|AE|AT|AI, str_2528D620F9E674D2, "ieri ")
+SUBS(AR|AE|AN|AP, str_A6DA2C0814DDDE59, "emmy ")
+SUBS(AR|RGT|AE|AN|AP, str_C5C56919F9FD8ECA, "pen ")
+SUBS(AR|AA|AE|AN, str_9CAD49AC9B02787F, "anne ")
+SUBS(AR|RGT|AA|AE|AN, str_33AEFF4359116E76, "nea ")
+SUBS(AR|AS|AE|AN, str_32148592C3806623, "sens ")
+SUBS(AR|RGT|AS|AE|AN, str_6D067D15A808A9B1, "je ")
+SUBS(AR|AT|AN|AI, str_96A25A2A55589326, "vin ")
+SUBS(AR|RGT|AT|AN|AI, str_AB3C4B3424D8BFD8, "intii ")
+SUBS(AR|AE|AN|AO, str_3CF92217D792ADB9, "eu ")
+SUBS(AR|RGT|AE|AN|AO, str_DA685F075AF8D8A7, "n-o ")
+SUBS(AR|AT|AI|AO, str_C277590164DC0A8A, "voi ")
+SUBS(AR|RGT|AT|AI|AO, str_9A915B8E89BC2384, "lovi ")
+SUBS(AR|AA|AT|AN, str_06F4837F40125C65, "ba ")
+SUBS(AR|RGT|AA|AT|AN, str_47B698232847D3D2, "nat ")
+SUBS(AR|AE|AT|AN, str_C0859DD43842F407, "brett ")
+SUBS(AR|RGT|AE|AT|AN, str_ED9A2C22711EB44E, "nr ")
+SUBS(AR|AS|AE|AI, str_F4E15E651ECDAD93, "desi ")
+SUBS(AR|RGT|AS|AE|AI, str_71C1AFB2A53685DF, "iesi ")
+SUBS(AR|AA|AE|AI, str_82768E8FCF987ACD, "zeii ")
+SUBS(AR|RGT|AA|AE|AI, str_CC30A0558A1FC6CA, "izea ")
+SUBS(AR|AA|AE|AO, str_1308668E4E312A86, "a- ")
+SUBS(AR|RGT|AA|AE|AO, str_AB819235D216611C, "-a ")
+SUBS(AR|AE|AT|AO, str_46ADAEF189A4FFA8, "rog ")
+SUBS(AR|RGT|AE|AT|AO, str_6B77658521E3C3E6, "ore ")
+SUBS(AR|AA|AT|AO, str_B6ECC5733F3F9288, "toata ")
+SUBS(AR|RGT|AA|AT|AO, str_B75DF5741C41828A, "ofta ")
+SUBS(AR|AT|AN|AO, str_48542059A4690B7A, "tu ")
+SUBS(AR|RGT|AT|AN|AO, str_9546AA47D9B796A9, "unt ")
+SUBS(AR|AS|AN|AO, str_E6599811376DB42A, "sus ")
+SUBS(AR|RGT|AS|AN|AO, str_FF6E23CC4BFF56B5, "jos ")
+SUBS(AR|AA|AI|AO, str_C49001FAA655F248, "al ")
+SUBS(AR|RGT|AA|AI|AO, str_7E7904D7326BCF29, "la ")
+SUBS(AR|AA|AT|AP, str_8CECEC4EA8499163, "fapt ")
+SUBS(AR|RGT|AA|AT|AP, str_7A06301D23DD2E0F, "pat ")
+SUBS(AR|AE|AN|AI|AO|AP, str_862A47A12C97D575, "mele ")
+SUBS(AR|AA|AS|AE|AO|AP, str_E308D1F6F8197151, "podea ")
+SUBS(AR|AA|AS|AT|AN|AO, str_9E3A45798840176C, "facut ")
+SUBS(AR|AA|AN|AI|AO|AP, str_B8F055C00046F84D, "numai ")
+SUBS(AR|AA|AS|AE|AT|AI, str_C75D5E068F895F5D, "ceva ")
+SUBS(AR|AE|AT|AI|AO|AP, str_7F64C57AA9748B47, "opri ")
+SUBS(AR|AA|AN|AI|AP, str_A7412055CAD3DDA3, "amiaza ")
+SUBS(AR|RGT|AA|AN|AI|AP, str_446E12F7C9FCBEFC, "mai ")
+SUBS(AR|AE|AT|AN|AP, str_7E4096DA17B3C6D2, "tem ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_B2E8DF8FD857296C, "merry ")
+SUBS(AR|AA|AI|AO|AP, str_7985DC8DCCD996FA, "apoi ")
+SUBS(AR|RGT|AA|AI|AO|AP, str_58DFA79D10AA1C5E, "ploaia ")
+SUBS(AR|AA|AS|AT|AO, str_996884380E189E13, "fost ")
+SUBS(AR|RGT|AA|AS|AT|AO, str_568701C904899A03, "ostas ")
+SUBS(AR|AA|AS|AE|AO, str_DE31A63C4A0DD129, "s-a ")
+SUBS(AR|RGT|AA|AS|AE|AO, str_4DF853D12CE5146E, "oase ")
+SUBS(AR|AA|AT|AN|AO, str_3FDAD894DDA1E312, "buna ")
+SUBS(AR|RGT|AA|AT|AN|AO, str_FF3F3B1F8B5A3E40, "nota ")
+SUBS(AR|AS|AE|AN|AI, str_3DBAD2413F36A90A, "din ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_030DCAFB98844D05, "iesind ")
+SUBS(AR|AA|AN|AI|AO, str_12642683B58127C2, "ziua ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_6DFD460A54EEE22E, "lua ")
+SUBS(AR|AA|AS|AN|AO, str_88345F7C93C4C73D, "sau ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_85D1F287CC8F2629, "usa ")
+SUBS(AR|AS|AE|AT|AI, str_6DACB9555691782A, "cei ")
+SUBS(AR|RGT|AS|AE|AT|AI, str_9D8C88D9F7DA895E, "iesit ")
+SUBS(AR|AA|AS|AE|AI, str_011B5F412FE2415A, "zise ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_B36F55489CF2B3C1, "ideea ")
+SUBS(AR|AS|AN|AO|AP, str_E96267888236B240, "spus ")
+SUBS(AR|RGT|AS|AN|AO|AP, str_A745BBCE84D30277, "pus ")
+SUBS(AR|AA|AT|AN|AP, str_BF3DDFB8CBFE1C63, "tam ")
+SUBS(AR|RGT|AA|AT|AN|AP, str_02631141FC3D6F89, "pamant ")
+SUBS(AR|AT|AN|AO|AP, str_C7B05810B9878F2F, "tom ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_3BBF8252EA6BEE2D, "putut ")
+SUBS(AR|AS|AT|AI|AO, str_FF1CA2F8A5048D30, "colt ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_00CDC54B7DB15C46, "loc ")
+SUBS(AR|AA|AS|AT|AP, str_95C59AB8275627DB, "cap ")
+SUBS(AR|RGT|AA|AS|AT|AP, str_89307F56A2D607AC, "pacat ")
+SUBS(AR|AA|AT|AN|AI, str_4D9369A93C45281B, "abia ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_BE522AFB71DBC03D, "nava ")
+SUBS(AR|AS|AN|AI|AO, str_72E39EC6A4158B9A, "solul ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_68720D7C31A0407C, "insusi ")
+SUBS(AR|AA|AS|AN|AP, str_020E794D3DE91D12, "sam ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_0DF584E9973309E5, "masa ")
+SUBS(AR|AA|AE|AI|AP, str_C075124762EDDF07, "apei ")
+SUBS(AR|RGT|AA|AE|AI|AP, str_26810965DF9C62EC, "paie ")
+SUBS(AR|AA|AE|AI|AO, str_DB017B313F911B03, "ale ")
+SUBS(AR|RGT|AA|AE|AI|AO, str_1FAE8B28043E9BD8, "i-a ")
+SUBS(AR|AA|AT|AI|AP, str_24E37946E892C656, "tipa ")
+SUBS(AR|RGT|AA|AT|AI|AP, str_18E68A1C93CAC9BD, "piata ")
+SUBS(AR|AS|AE|AN|AO, str_8E65741A89C054E1, "dus ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_1ED7A4D73040B5B7, "unde ")
+SUBS(AR|AA|AE|AT|AP, str_3AE92C742795DAFB, "repeta ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_181DD74C10CF1A6E, "prea ")
+SUBS(AR|AS|AE|AT|AN, str_7C3B234BE02042FC, "recent ")
+SUBS(AR|RGT|AS|AE|AT|AN, str_B4F23484EC05D673, "jerry ")
+SUBS(AR|AS|AE|AI|AO, str_696FD16A0EB230A6, "doi ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_458B350C506917A3, "ideile ")
+SUBS(AR|AE|AT|AN|AO, str_03EF08A3DD704445, "greu ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_B22F0BDAC7FFCA09, "unor ")
+SUBS(AR|AA|AE|AT|AI, str_B5ECD2F1FA8E0FDB, "avea ")
+SUBS(AR|RGT|AA|AE|AT|AI, str_75D1CB05899F2CCB, "iar ")
+SUBS(AR|AA|AS|AI|AO, str_EEF664F3C6FBF507, "sala ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_101B0EB7B51FA839, "lasa ")
+SUBS(AR|AS|AT|AN|AO, str_54569851B27E9512, "cu ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_82F582F41ACC30FC, "joc ")
+SUBS(AR|AS|AT|AI|AP, str_41F913963A67ADFF, "tipic ")
+SUBS(AR|RGT|AS|AT|AI|AP, str_2BC515A6311342A6, "pic ")
+SUBS(AR|AS|AT|AN|AI, str_6C82BBCD22A3B803, "cinci ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_96A443A1052E70F4, "nici ")
+SUBS(AR|AA|AS|AT|AN, str_287A1955FF1C2ADB, "banca ")
+SUBS(AR|RGT|AA|AS|AT|AN, str_E0B9AA624815DFD9, "nasca ")
+SUBS(AR|AS|AE|AT|AP, str_27EBF0B7BDF6E3C7, "spre ")
+SUBS(AR|RGT|AS|AE|AT|AP, str_50E0BA7A9FFC2432, "peste ")
+SUBS(AR|AS|AE|AN|AP, str_8DEBA62F74F4AE47, "semn ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_8A0AC2472D15E0FA, "mese ")
+SUBS(AR|AE|AT|AN|AI, str_07AD71BB0B609B6A, "bine ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_EA10C33DF986B2B3, "intre ")
+SUBS(AR|AT|AN|AI|AP, str_4FA4E202022528E5, "timp ")
+SUBS(AR|RGT|AT|AN|AI|AP, str_150CB36344FF660F, "mintii ")
+SUBS(AR|AA|AS|AN|AI, str_E87EF6E43D2593B6, "ash ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_ADFBAE1BCDCBFF39, "insa ")
+SUBS(AR|AT|AI|AO|AP, str_517AB9F070F1168A, "topi ")
+SUBS(AR|RGT|AT|AI|AO|AP, str_E7BDD9EA240E4B4B, "poti ")
+SUBS(AR|AA|AS|AE|AP, str_0DA10FD23FD96645, "da' ")
+SUBS(AR|RGT|AA|AS|AE|AP, str_9123E747E8071EBF, "pedeapsa ")
+SUBS(AR|AS|AN|AI|AP, str_122C44A32A7CB6F5, "sim ")
+SUBS(AR|RGT|AS|AN|AI|AP, str_7888DBDFA5D0A1E2, "nisip ")
+SUBS(AR|AT|AN|AI|AO, str_CB719A4CFCA0E5E2, "totul ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_C115235B04798D96, "lungul ")
+SUBS(AR|AA|AS|AE|AN, str_67CFE6CC85BD1CD1, "deja ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_C161ABA85FEDF657, "new ")
+SUBS(AR|AE|AT|AI|AO, str_0FE705D961162F91, "vor ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_CE7828CD2F256560, "lor ")
+SUBS(AR|AA|AE|AN|AP, str_7E02E71632E36E12, "amy ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_72B2DC9CEAAFD82B, "mea ")
+SUBS(AR|AS|AT|AO|AP, str_A36FC15653CA04A0, "scop ")
+SUBS(AR|RGT|AS|AT|AO|AP, str_993FB3354F37599E, "post ")
+SUBS(AR|AA|AE|AT|AO, str_CD3C06F7C0B0CCBB, "toate ")
+SUBS(AR|RGT|AA|AE|AT|AO, str_19112A437035E563, "oare ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_402CB287BE8CC3AE, "astfel ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_910E43D1156BD447, "atunci ")
+SUBS(AR|AS|AE|AN|AI|AP, str_48ABA17C6DCF5E7C, "depinde ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_EC7A27F50E19BC86, "mesei ")
+SUBS(AR|AS|AT|AN|AI|AP, str_9D98B4E0596CD2C8, "simti ")
+SUBS(AR|RGT|AS|AT|AN|AI|AP, str_7F09A830549EC542, "nimic ")
+SUBS(AR|AS|AE|AN|AO|AP, str_2C8D0E5EB2ABC425, "spuse ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_03BC9D6CB8B3908A, "mod ")
+SUBS(AR|AS|AE|AT|AI|AP, str_8F280EB7CD23BC52, "spirit ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_81AC3D2F74222CB1, "priveste ")
+SUBS(AR|AS|AT|AN|AO|AP, str_3638010D863571D7, "cum ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_B2CB6EDCEE9FCBB9, "punct ")
+SUBS(AR|AA|AE|AI|AO|AP, str_E1FCBB7C427D1252, "apele ")
+SUBS(AR|RGT|AA|AE|AI|AO|AP, str_4ACA51882D0A35C9, "pielea ")
+SUBS(AR|AA|AS|AT|AI|AO, str_9C4AF9E3F81B4405, "acolo ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO, str_445499843B271A6A, "lasat ")
+SUBS(AR|AS|AT|AI|AO|AP, str_A4A5E0FD4BE6C8EB, "copii ")
+SUBS(AR|RGT|AS|AT|AI|AO|AP, str_645C0C3EC2B512A6, "lipsit ")
+SUBS(AR|AA|AS|AT|AN|AP, str_D70133B37553FCA8, "cam ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_7862B823A47DF4BB, "manca ")
+SUBS(AR|AA|AE|AT|AO|AP, str_0528BD2188D731A8, "aproape ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_2F51745CA0AE5346, "poate ")
+SUBS(AR|AA|AE|AT|AI|AO, str_6676520F7E7AA391, "fel ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_2ECCAB436EDCDE2F, "i-ar ")
+SUBS(AR|AA|AE|AN|AI|AO, str_B608D6D6C6D9A031, "auzea ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_B2D5400185D19E20, "n-ai ")
+SUBS(AR|AA|AT|AI|AO|AP, str_2C31D8D65013108B, "filip ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_61B1A9D6040A996F, "pozitia ")
+SUBS(AR|AS|AN|AI|AO|AP, str_061430F366EED7B8, "simplu ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_8CF693C1CD0D766F, "plus ")
+SUBS(AR|AA|AS|AN|AO|AP, str_F2AFBB18F5074D83, "spuna ")
+SUBS(AR|RGT|AA|AS|AN|AO|AP, str_EDC5B023AC1F747A, "pusa ")
+SUBS(AR|AE|AT|AN|AO|AP, str_EB55FC450E7312D7, "grup ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_92239078817B50BA, "pentru ")
+SUBS(AR|AA|AS|AE|AI|AO, str_CCAF7518D998E754, "sa-i ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_6BCBCD334A90F60A, "lase ")
+SUBS(AR|AT|AN|AI|AO|AP, str_EDC9E06B5E7B760B, "timpul ")
+SUBS(AR|RGT|AT|AN|AI|AO|AP, str_9D90E0D936B90DE9, "mult ")
+SUBS(AR|AA|AS|AE|AT|AO, str_A477EDAF8B049617, "doar ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO, str_A2B2E6E347976E7C, "oras ")
+SUBS(AR|AS|AE|AN|AI|AO, str_B61E9BC1A647A87C, "seldon ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_40EAA896EA3BF67B, "nu-si ")
+SUBS(AR|AE|AT|AN|AI|AP, str_24D6A9A3B0C01D06, "vreme ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_02999DA470617659, "prin ")
+SUBS(AR|AA|AS|AE|AI|AP, str_2D785485E386A6DE, "zapada ")
+SUBS(AR|RGT|AA|AS|AE|AI|AP, str_D88FCCE2EF5FB737, "piesa ")
+SUBS(AR|AA|AS|AE|AN|AI, str_5F88127866377E30, "sinea ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_17CAB6C5BEC5CEEB, "jake ")
+SUBS(AR|AA|AT|AN|AI|AO, str_B2BDDF48ABABA93E, "vazut ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_E53286214BF40E54, "langa ")
+SUBS(AR|AS|AE|AT|AO|AP, str_DC059D0807D91781, "corp ")
+SUBS(AR|RGT|AS|AE|AT|AO|AP, str_FC0D43D0BE1994A8, "prost ")
+SUBS(AR|AA|AS|AT|AN|AI, str_F2AB8AA5E09C2627, "stiinta ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_8DBFD5C7E2E0A8F7, "inca ")
+SUBS(AR|AA|AT|AN|AI|AP, str_30281A965E39B26C, "zambi ")
+SUBS(AR|RGT|AA|AT|AN|AI|AP, str_68E4B43ED8601F54, "pamint ")
+SUBS(AR|AS|AE|AT|AN|AO, str_02E5BAADFF2EF640, "trecut ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_CE83803B7FDB8189, "usor ")
+SUBS(AR|AE|AT|AN|AI|AO, str_947A751F0DD9AA28, "trebuie ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_D244FAC49F4041CB, "intr-o ")
+SUBS(AR|AS|AT|AN|AI|AO, str_6B02182174A3DD9C, "stiu ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_378C4C23B1FB6E9E, "ochii ")
+SUBS(AR|AA|AS|AT|AO|AP, str_F2C0F39F6EAD453A, "soapta ")
+SUBS(AR|RGT|AA|AS|AT|AO|AP, str_112D7B20AF6E6537, "ostap ")
+SUBS(AR|AA|AS|AI|AO|AP, str_725D87E841B5F90F, "spala ")
+SUBS(AR|RGT|AA|AS|AI|AO|AP, str_D6CF4E50A26D7016, "lipsa ")
+SUBS(AR|AA|AE|AT|AN|AO, str_F94F557D4564DD4C, "erau ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_7F451CD9801BBB3B, "n-ar ")
+SUBS(AR|AA|AE|AT|AN|AI, str_5992F9735265812F, "tinea ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_3F2F4FA818260EDB, "inainte ")
+SUBS(AR|AA|AS|AE|AT|AP, str_C43CE2FA7ACF2119, "departe ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_7F8309C46FBC0ED2, "parca ")
+SUBS(AR|AA|AE|AN|AO|AP, str_8F39EDEC065DCB88, "anume ")
+SUBS(AR|RGT|AA|AE|AN|AO|AP, str_EF361D671C2B2277, "m-am ")
+SUBS(AR|AA|AS|AE|AT|AN, str_C3EA12240EB61504, "cand ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN, str_29F94418C78306A8, "jeff ")
+SUBS(AR|AA|AS|AT|AI|AP, str_8DDC1666EC6B1F70, "twisp ")
+SUBS(AR|RGT|AA|AS|AT|AI|AP, str_E116B8A3DD0A1008, "pisica ")
+SUBS(AR|AA|AS|AE|AN|AP, str_00D057953A3F2DEB, "seama ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_119FAC7ADD192AF2, "newman ")
+SUBS(AR|AA|AS|AN|AI|AO, str_BCC072B250C4FFDA, "salon ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_970D63CB01E40D86, "nasul ")
+SUBS(AR|AA|AS|AE|AN|AO, str_7F7F04C082B68215, "doua ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_CC6B506783BCE454, "n-as ")
+SUBS(AR|AA|AT|AN|AO|AP, str_F51C656D52F6AB30, "fum ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_189388E9A31C96D5, "muta ")
+SUBS(AR|AS|AE|AT|AI|AO, str_A552366FAAB97976, "cel ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO, str_6CD8A7B921DC0A64, "orice ")
+SUBS(AR|AS|AE|AT|AN|AP, str_C4B57F0400D28945, "cemp ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_2C2CEF3E773989D6, "mers ")
+SUBS(AR|AA|AS|AN|AI|AP, str_EAD0F7787249282C, "spaima ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_3D55CD3C63F55239, "masina ")
+SUBS(AR|AS|AE|AI|AO|AP, str_F5A2C146FB931010, "spele ")
+SUBS(AR|RGT|AS|AE|AI|AO|AP, str_13BA136EDBD8CE3D, "leopold ")
+SUBS(AR|AA|AE|AT|AN|AP, str_7375734CEB490763, "eram ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_22CC3EFF346CA6DB, "mare ")
+SUBS(AR|AA|AE|AN|AI|AP, str_9D33FF80DD4E2AEA, "examina ")
+SUBS(AR|RGT|AA|AE|AN|AI|AP, str_3B37D04C3AED2BA2, "maine ")
+SUBS(AR|AS|AE|AT|AN|AI, str_1C331A99253C0F98, "dintre ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_681F831FB0E81162, "niste ")
+SUBS(AR|AA|AE|AT|AI|AP, str_811DD085F3A13904, "aparitia ")
+SUBS(AR|RGT|AA|AE|AT|AI|AP, str_29146626F0EB301A, "privirea ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_4B902381FB543716, "camera ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_422251C9179625E6, "macar ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_A81D389A4AF3DFAF, "chiar ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_3BCECBC626AF21E7, "incerca ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_F8B888EF7971DFF7, "daneel ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_7F66E5A594CB9D4A, "indoiala ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_005F524FC852EFC2, "simpla ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_43FD8F65DF0DD9FF, "psihanaliza ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_594C620883E0A721, "domnule ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_2120E5EE072353E5, "limpede ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_27703F71C426F78B, "expresie ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_4F6C506138FB813D, "paris ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_8BA329353569B0FD, "apropie ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO|AP, str_40909FC2168247E4, "propria ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_0FF2C33E494D811D, "acum ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_43E89B92A10B708E, "munca ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_8FA2CBAC3A032BC0, "drum ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_2F3A2A7435E3F29D, "precum ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_6A3F7123AC5FFFBD, "femeie ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_9399D619292D5B85, "prima ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_1ED297C53BE402A9, "faptul ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_21FDE10F95C83570, "multa ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_5044127857C093DB, "exemplu ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_7076A52249712F4F, "oameni ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_B0AC3533A36C6A1D, "fusese ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO, str_F85FA02AE87235ED, "noastra ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_50FCFF7427C378CD, "trupul ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_5A2D228B6A476B43, "multe ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_EAEB0BF9B4E13952, "clipe ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_E94FD79C95659866, "plece ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_D24E8308E974EAB6, "vorba ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_1E43CBA2DE6EF9B8, "legatura ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_522EE9C819BBCA09, "forma ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_AE9ED78C685BDEF6, "putea ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_5F0F15C990A3CF35, "castorp ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO|AP, str_76D62DECF1B3082E, "profesor ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_92997A5CFC83C927, "deplasa ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_910130DF4C7F3449, "pilda ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_2337D29D8962FE86, "chipul ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_AF223AE4CAE3614D, "mijlocul ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_66A7427C7AC36CAC, "stiam ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_47365A4A9C452EF6, "mica ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_BFF595D99542E428, "trimis ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_80078370113E53C1, "incepe ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_2B7419244C18E358, "dupa ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_EA58CE85E5C90630, "m-as ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_913BC87D4B6E6761, "clipa ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_4A062895BD6EDDB1, "politica ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_1EF1945EA8E6F640, "asemeni ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_A459AC76392FF821, "inseamna ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_1071F64006FFAD95, "sigur ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_C4804D1FBF166453, "lucru ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_CE6E4A7FF531EF94, "singura ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_5E3EE39B1C558704, "niciodata ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_3E530FA28EB32507, "capul ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_C1A52B6FA6184C6D, "placut ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_29A885A3A646CC20, "asupra ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_3FF58BD5BD308840, "jumatate ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_9A332A82495B5E0D, "dimineata ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_3CB9B36A5EC05505, "imediat ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_290DB145E4218429, "sigmund ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_B857E6CBE3A7F201, "inceput ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_240EA2ED41F0B474, "ti-am ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_64C4B42F5CC1803E, "probabil ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_67EFAC1F50906AEE, "sa-mi ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_28EAEE45DE319F91, "mesajul ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_195FC2868E05C956, "spatele ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_FB38D4376A7ACAD8, "picioare ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_ABCF2DD04EE4BA4D, "dumneavoastra ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_F2F306BBDDB4A2D2, "pardaillan ")
diff --git a/keyboards/gboards/dicts/aset/sv-keymap.def b/keyboards/gboards/dicts/aset/sv-keymap.def
new file mode 100644
index 00000000000..c2cd57c9ce5
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/sv-keymap.def
@@ -0,0 +1,403 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AP, KC_P)
+PRES(AO, KC_O)
+PRES(AE, KC_E)
+PRES(AN, KC_N)
+PRES(AA, KC_A)
+PRES(AT, KC_T)
+PRES(AS, KC_S)
+PRES(AI, KC_I)
+PRES(AT|AO, KC_G)
+PRES(AT|AI, KC_V)
+PRES(AS|AO, KC_DOT)
+PRES(AO|AP, KC_SCLN)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+PRES(AN|AO, KC_U)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+PRES(AI|AO, KC_L)
+PRES(AA|AT, KC_F)
+PRES(AS|AI, KC_K)
+PRES(AA|AI, KC_Z)
+PRES(AT|AN, KC_B)
+PRES(AN|AI, KC_H)
+PRES(AS|AN, KC_J)
+PRES(AS|AE, KC_D)
+PRES(AN|AP, KC_M)
+PRES(AE|AP, KC_QUOT)
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AA|AN, KC_Q)
+PRES(AA|AS, KC_W)
+PRES(AE|AT, KC_R)
+PRES(AE|AO, KC_MINS)
+PRES(AE|AI, KC_COMM)
+PRES(AS|AT, KC_C)
+PRES(AA|AE, KC_X)
+PRES(AE|AN, KC_Y)
+PRES(AT|AP, KC_BSPC)
+PRES(AA|AP, KC_QUOT)
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AI|AO|AP, str_CB2A8B4741DA9E6F, "lopp ")
+SUBS(AR|AS|AT|AN, str_6DC42A95A999C07A, "bbc ")
+SUBS(AR|AS|AE|AT, str_925BB6ABF283A228, "det ")
+SUBS(AR|AA|AS|AE, str_6E5B393925FE64CE, "da ")
+SUBS(AR|AN|AO|AP, str_0F33CAECD78B3E6B, "om ")
+SUBS(AR|AN|AI|AP, str_683696748A01B41C, "min ")
+SUBS(AR|AA|AS|AT, str_6BF50CC3535E6E3B, "satt ")
+SUBS(AR|AS|AI|AP, str_A147DE6F127B4CD6, "skip ")
+SUBS(AR|AA|AS|AO, str_F8126BA90C544306, "wow ")
+SUBS(AR|AN|AI|AO, str_C3BD48523B2E5650, "hon ")
+SUBS(AR|AA|AI|AP, str_DF4123F19953E2FD, "pia ")
+SUBS(AR|AS|AO|AP, str_384757EE1D95552D, "sop ")
+SUBS(AR|AE|AO|AP, str_68A050786B16A5F7, "o' ")
+SUBS(AR|AA|AE|AT, str_C1FED2185FB7D60F, "ar ")
+SUBS(AR|AT|AO|AP, str_686ED37FDD7B93CA, "topp ")
+SUBS(AR|AA|AN|AO, str_E136E894CA311E36, "annu ")
+SUBS(AR|AA|AE|AN|AO, str_7D50A0C65C92712F, "anyone ")
+SUBS(AR|AE|AT|AI|AP, str_10A8823ACF08084F, "pierre ")
+SUBS(AR|AA|AI|AO|AP, str_2395698702FA8208, "lapp ")
+SUBS(AR|AA|AE|AT|AI, str_776A8271136FBCDD, "var ")
+SUBS(AR|AE|AI|AO|AP, str_56B0C240EA9FE481, "people ")
+SUBS(AR|AA|AS|AE|AT, str_DC720A1A790186F1, "dar ")
+SUBS(AR|AA|AS|AO|AP, str_671819798AD99191, "sapo ")
+SUBS(AR|AA|AS|AE|AO, str_0BD2068EF14D24D6, "doda ")
+SUBS(AR|AE|AN|AI|AP, str_3DE7FC713EFDE099, "hem ")
+SUBS(AR|AS|AE|AT|AN, str_B9B2970CE84253EE, "tyst ")
+SUBS(AR|AS|AE|AT|AI, str_9587EB7402068F1B, "vid ")
+SUBS(AR|AT|AI|AO|AP, str_C00F1DE521F82126, "pigg ")
+SUBS(AR|AE|AN|AO|AP, str_C25E3E57C8BCC515, "uppe ")
+SUBS(AR|AA|AS|AT|AP, str_5C8A5086E8C1FD71, "pasta ")
+SUBS(AR|AA|AE|AT|AO, str_DAE84F2729ACCE2B, "for ")
+SUBS(AR|AA|AN|AI|AP, str_C28057540B4DAEAD, "mina ")
+SUBS(AR|AS|AT|AI|AP, str_ADFCEE2911E10044, "tips ")
+SUBS(AR|AA|AN|AO|AP, str_29E07354F08F6B18, "oppna ")
+SUBS(AR|AA|AE|AN|AI, str_B0D068D005493603, "annie ")
+SUBS(AR|AA|AS|AE|AP, str_E51F9C0F39177E4D, "passade ")
+SUBS(AR|AA|AS|AT|AI, str_8D542707BC0BDE4F, "fick ")
+SUBS(AR|AA|AT|AO|AP, str_4F7EE21A281E3CE2, "pagatt ")
+SUBS(AR|AA|AE|AO|AP, str_E7CC20BF367BAAB0, "expo ")
+SUBS(AR|AE|AN|AO, str_3CF92217D792ADB9, "eu ")
+SUBS(AR|RGT|AE|AN|AO, str_E429BF3EE734FF3A, "you ")
+SUBS(AR|AS|AE|AN, str_ECE5A6CDF4EED85C, "den ")
+SUBS(AR|RGT|AS|AE|AN, str_83A502A30DE82D24, "nej ")
+SUBS(AR|AS|AI|AO, str_C9ADB25B4C37D131, "sol ")
+SUBS(AR|RGT|AS|AI|AO, str_71BB7B180F4C724C, "loss ")
+SUBS(AR|AT|AN|AO, str_30278AC8BAD5995C, "but ")
+SUBS(AR|RGT|AT|AN|AO, str_AF931575FB1EA518, "ut ")
+SUBS(AR|AA|AT|AO, str_9360B38FC08F77D9, "ga ")
+SUBS(AR|RGT|AA|AT|AO, str_BF38370C83727D39, "of ")
+SUBS(AR|AT|AN|AI, str_C13C85985E26BFC4, "bit ")
+SUBS(AR|RGT|AT|AN|AI, str_D5ACE27258AF148F, "hit ")
+SUBS(AR|AE|AT|AO, str_E5E3AE6DB8C6A3E0, "gor ")
+SUBS(AR|RGT|AE|AT|AO, str_B97355B02DCE4543, "or ")
+SUBS(AR|AE|AI|AO, str_05ED48987A1828F9, "el ")
+SUBS(AR|RGT|AE|AI|AO, str_05A9C753CDE4911A, "le ")
+SUBS(AR|AS|AT|AO, str_4397946AE21A0B1E, "sot ")
+SUBS(AR|RGT|AS|AT|AO, str_F12BF1912FA70BCD, "ost ")
+SUBS(AR|AA|AT|AI, str_BA2E119CA038883C, "av ")
+SUBS(AR|RGT|AA|AT|AI, str_D7978D4AE69E4592, "if ")
+SUBS(AR|AS|AE|AI, str_15A3DFC05BB602DC, "skedde ")
+SUBS(AR|RGT|AS|AE|AI, str_A1A4E3A00C59C039, "ide ")
+SUBS(AR|AE|AT|AP, str_BEBC786E22CB711B, "rep ")
+SUBS(AR|RGT|AE|AT|AP, str_342F8CACA85F0AD6, "per ")
+SUBS(AR|AE|AN|AI, str_7E3D8B1C859776CA, "eh ")
+SUBS(AR|RGT|AE|AN|AI, str_4FFE5A0A17921200, "henne ")
+SUBS(AR|AA|AS|AI, str_378FF30A934CB6BA, "ska ")
+SUBS(AR|RGT|AA|AS|AI, str_71F4FF1F63663104, "kaka ")
+SUBS(AR|AE|AT|AI, str_39433EC098ED9804, "vet ")
+SUBS(AR|RGT|AE|AT|AI, str_60A95BD1113F9846, "iver ")
+SUBS(AR|AA|AT|AP, str_3E864890E72C0E60, "tappa ")
+SUBS(AR|RGT|AA|AT|AP, str_7A06301D23DD2E0F, "pat ")
+SUBS(AR|AS|AE|AP, str_9E6B55FFD6A1FEB5, "esp ")
+SUBS(AR|RGT|AS|AE|AP, str_389774CE338E67BC, "'de ")
+SUBS(AR|AS|AN|AP, str_D63FDE230FD34803, "sms ")
+SUBS(AR|RGT|AS|AN|AP, str_D86353170513CEA4, "jp ")
+SUBS(AR|AA|AS|AN, str_45A403A4960EE226, "san ")
+SUBS(AR|RGT|AA|AS|AN, str_16D6BE915787F782, "ja ")
+SUBS(AR|AS|AE|AO, str_5630D9590D848D9C, "dod ")
+SUBS(AR|RGT|AS|AE|AO, str_239CA41F6B24AC83, "ode ")
+SUBS(AR|AA|AE|AN, str_F52CCEBB3C161006, "ena ")
+SUBS(AR|RGT|AA|AE|AN, str_C2B5F013BDE248EE, "nya ")
+SUBS(AR|AA|AI|AO, str_30B8BB99FFF81FC0, "alla ")
+SUBS(AR|RGT|AA|AI|AO, str_9948A11D8AA163D2, "lilla ")
+SUBS(AR|AS|AN|AI, str_55863E4A819B49C1, "sin ")
+SUBS(AR|RGT|AS|AN|AI, str_E9D65B1F0CC7B588, "his ")
+SUBS(AR|AE|AT|AN, str_7D2440FBBF9D0256, "be ")
+SUBS(AR|RGT|AE|AT|AN, str_099F2492A3C5F70B, "ner ")
+SUBS(AR|AA|AN|AI, str_BF40C27E59DAAC7B, "ah ")
+SUBS(AR|RGT|AA|AN|AI, str_BB30CFFA4957C51C, "han ")
+SUBS(AR|AS|AN|AO, str_3D29840CE477716A, "son ")
+SUBS(AR|RGT|AS|AN|AO, str_109DDC2DF93BCFF8, "ju ")
+SUBS(AR|AA|AS|AP, str_6244D0D593084999, "asp ")
+SUBS(AR|RGT|AA|AS|AP, str_4DFAE898587FE4FE, "pass ")
+SUBS(AR|AA|AN|AP, str_77BE4D44A5F2AD27, "am ")
+SUBS(AR|RGT|AA|AN|AP, str_7814AB9A9D941FFB, "man ")
+SUBS(AR|AA|AE|AI, str_4267018742102E46, "xii ")
+SUBS(AR|RGT|AA|AE|AI, str_3430D3508CC4EB85, "iae ")
+SUBS(AR|AS|AT|AI, str_0172A9BC77031EE6, "sitt ")
+SUBS(AR|RGT|AS|AT|AI, str_732FCC97258E0FD6, "its ")
+SUBS(AR|AE|AN|AP, str_92051BF77C6DA259, "e'en ")
+SUBS(AR|RGT|AE|AN|AP, str_B969E2F841D9C54A, "men ")
+SUBS(AR|AT|AI|AO, str_EAA77E250F575DF4, "till ")
+SUBS(AR|RGT|AT|AI|AO, str_DD07510FB54603F8, "liv ")
+SUBS(AR|AA|AT|AN, str_6E47B8B84048A4C2, "annat ")
+SUBS(AR|RGT|AA|AT|AN, str_47B698232847D3D2, "nat ")
+SUBS(AR|AA|AS|AE|AT|AN, str_12CD003A21802C45, "andra ")
+SUBS(AR|AS|AE|AI|AO|AP, str_7F66830857589EA6, "spel ")
+SUBS(AR|AA|AS|AE|AT|AO, str_DF41DF6D38B1F4BB, "sager ")
+SUBS(AR|AA|AE|AN|AI|AP, str_880930E7BED2E979, "hemma ")
+SUBS(AR|AS|AT|AI|AO|AP, str_FF6FF5733057230C, "plotsligt ")
+SUBS(AR|AA|AS|AT|AO|AP, str_8EDF92EF8A7756C0, "stoppa ")
+SUBS(AR|AS|AE|AT|AN|AI, str_86D9A0FDFF9A3705, "tiden ")
+SUBS(AR|AE|AN|AI|AO|AP, str_BEB515F946EA1DBF, "mille ")
+SUBS(AR|AS|AE|AI|AP, str_34AB26CE48AFBE5C, "skepp ")
+SUBS(AR|RGT|AS|AE|AI|AP, str_3BE3101B06222C42, "keep ")
+SUBS(AR|AS|AT|AN|AI, str_F67830C3E4E560AB, "this ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_622075F6AD6ED0AF, "nick ")
+SUBS(AR|AS|AE|AN|AO, str_68105B858B425CB4, "du ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_6F0848512A20FB9E, "nojd ")
+SUBS(AR|AE|AT|AN|AO, str_BA3BD4D2DA7AE86E, "bort ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_20C7E0A6ACD15B70, "ur ")
+SUBS(AR|AA|AS|AN|AI, str_2DA332A85B0767C0, "sina ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_4B4CC6627CFD3ECE, "hans ")
+SUBS(AR|AA|AE|AT|AN, str_12EC974726DB1A33, "fran ")
+SUBS(AR|RGT|AA|AE|AT|AN, str_C8E26DF07F882DBA, "nar ")
+SUBS(AR|AS|AN|AI|AP, str_7B3D9BF3BD285CFC, "smink ")
+SUBS(AR|RGT|AS|AN|AI|AP, str_9BBF70A3DB63BC12, "minns ")
+SUBS(AR|AS|AT|AN|AO, str_50122A31FA39E465, "tjugo ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_C039D2A5D9FC5D72, "just ")
+SUBS(AR|AE|AT|AI|AO, str_87C9A08BCD5987C8, "eller ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_2CCE6615DDD45C8E, "over ")
+SUBS(AR|AA|AE|AN|AP, str_7E02E71632E36E12, "amy ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_6FB419EBFA4FDDD0, "mannen ")
+SUBS(AR|AA|AE|AI|AO, str_4D67956A1937C06A, "alex ")
+SUBS(AR|RGT|AA|AE|AI|AO, str_AE4F52A365891A9E, "ozzie ")
+SUBS(AR|AT|AN|AO|AP, str_C7B05810B9878F2F, "tom ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_7E273C54E980F6C3, "mot ")
+SUBS(AR|AA|AN|AI|AO, str_A8DDA231BA2910B9, "quinn ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_94518147FBDAF2CF, "halla ")
+SUBS(AR|AA|AE|AT|AP, str_C1BDE406A11E6A7E, "trappa ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_F552C5CE7412D067, "par ")
+SUBS(AR|AA|AS|AI|AP, str_06314E625F923056, "skapa ")
+SUBS(AR|RGT|AA|AS|AI|AP, str_721CDE1DEC3DE71C, "kapp ")
+SUBS(AR|AS|AN|AO|AP, str_7A83FEE54F908E5E, "som ")
+SUBS(AR|RGT|AS|AN|AO|AP, str_64DA274C556CB268, "puss ")
+SUBS(AR|AE|AT|AN|AP, str_CD9F3081A1453B39, "typ ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_4883074D107B4156, "mer ")
+SUBS(AR|AA|AT|AN|AP, str_57A08AEA16073C82, "famn ")
+SUBS(AR|RGT|AA|AT|AN|AP, str_06AABBFC9BF9658F, "mat ")
+SUBS(AR|AE|AT|AN|AI, str_0C571CCD7FA5FAEF, "the ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_EA6DAE4B0B7868AC, "inte ")
+SUBS(AR|AE|AT|AO|AP, str_C46812F9485ACF26, "grepp ")
+SUBS(AR|RGT|AE|AT|AO|AP, str_719CEA0EAF70B4FD, "oppet ")
+SUBS(AR|AS|AT|AO|AP, str_D2F6AE863C407DA6, "stopp ")
+SUBS(AR|RGT|AS|AT|AO|AP, str_993FB3354F37599E, "post ")
+SUBS(AR|AA|AS|AE|AN, str_D970791D8E529B3B, "sedan ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_C161ABA85FEDF657, "new ")
+SUBS(AR|AA|AS|AT|AN, str_C6BEF18FF179F36F, "fanns ")
+SUBS(AR|RGT|AA|AS|AT|AN, str_04CBF962C838CED3, "nastan ")
+SUBS(AR|AA|AS|AN|AP, str_E1C25EB8D3796D6A, "samma ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_248A481E3372E8F5, "massa ")
+SUBS(AR|AE|AN|AI|AO, str_194D9C755CA1AE6D, "elin ")
+SUBS(AR|RGT|AE|AN|AI|AO, str_8EC9B0CF3D5ABFF6, "hel ")
+SUBS(AR|AA|AS|AI|AO, str_B9A72CF6068BD9D2, "alls ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_4AFAEDFAA9FC24CD, "lika ")
+SUBS(AR|AA|AS|AN|AO, str_3F8BD1868475D8B9, "sonja ")
+SUBS(AR|RGT|AA|AS|AN|AO, str_85D1F287CC8F2629, "usa ")
+SUBS(AR|AS|AT|AI|AO, str_1109F5FD7D22AAC8, "sig ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_FF9FC3F804E743D8, "likt ")
+SUBS(AR|AA|AS|AT|AO, str_012BC8136AB7012F, "sag ")
+SUBS(AR|RGT|AA|AS|AT|AO, str_D3DFC6AC6C21C7E3, "oftast ")
+SUBS(AR|AS|AE|AT|AP, str_6A7B258F0DDCF55E, "spred ")
+SUBS(AR|RGT|AS|AE|AT|AP, str_D4E79D57ECF89EE4, "press ")
+SUBS(AR|AS|AE|AN|AP, str_AB4FDC245F092768, "dem ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_BA4C53A61687D977, "med ")
+SUBS(AR|AT|AN|AI|AP, str_428565F1D06EBE06, "bmi ")
+SUBS(AR|RGT|AT|AN|AI|AP, str_EE51CC402749D78B, "mitt ")
+SUBS(AR|AS|AI|AO|AP, str_B420CBE86C7BE38D, "slips ")
+SUBS(AR|RGT|AS|AI|AO|AP, str_D1CF976AEEEFB6C8, "polis ")
+SUBS(AR|AA|AT|AI|AO, str_85DD959B52E378D5, "allt ")
+SUBS(AR|RGT|AA|AT|AI|AO, str_03908167F0479139, "lag ")
+SUBS(AR|AA|AS|AE|AI, str_9453FC62F5332E3D, "sida ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_B77627A066E257E1, "kikade ")
+SUBS(AR|AS|AE|AN|AI, str_3DBAD2413F36A90A, "din ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_BA52ED42DD017F05, "hennes ")
+SUBS(AR|AA|AT|AN|AI, str_DA20B440A7186A4B, "that ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_671442E13F00342E, "haft ")
+SUBS(AR|AA|AT|AN|AO, str_F3FA41B52DE36D40, "gang ")
+SUBS(AR|RGT|AA|AT|AN|AO, str_ADA33F3823C59F0C, "nagot ")
+SUBS(AR|AT|AN|AI|AO, str_166C1C638CBE4F0B, "bli ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_DB42D9B320F0D944, "hogt ")
+SUBS(AR|AS|AN|AI|AO, str_E15586D5B544FD62, "skull ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_8179E159692B8D23, "hos ")
+SUBS(AR|AS|AE|AT|AO, str_CD184FE143DBDC11, "stod ")
+SUBS(AR|RGT|AS|AE|AT|AO, str_D859293B22449C89, "ord ")
+SUBS(AR|AS|AE|AI|AO, str_1861909A5CAE7807, "del ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_00F38181DF316F4B, "ledde ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_165507E6E85DD941, "igenom ")
+SUBS(AR|AA|AS|AE|AN|AI, str_41BE0294178512AB, "sidan ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_00735C43D435EF12, "hade ")
+SUBS(AR|AS|AT|AN|AI|AO, str_96BFB44EFF10350C, "slut ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_20856FF8512ED81F, "och ")
+SUBS(AR|AA|AE|AT|AI|AO, str_41E284BFF030473D, "varfor ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO, str_B74E83C046B23FC2, "later ")
+SUBS(AR|AS|AT|AN|AI|AP, str_A523540C97D0BDFB, "smith ")
+SUBS(AR|RGT|AS|AT|AN|AI|AP, str_0237BF0C3728CA80, "minst ")
+SUBS(AR|AA|AS|AT|AN|AP, str_0F7A33633730631F, "samt ")
+SUBS(AR|RGT|AA|AS|AT|AN|AP, str_B8ACD052577C0651, "mats ")
+SUBS(AR|AA|AE|AT|AN|AP, str_5546EDAE8D3CE507, "fram ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_9C3BB9AE6FBA08AC, "menar ")
+SUBS(AR|AA|AS|AT|AN|AI, str_29CAA37EE01CFD8F, "finns ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI, str_65230854244DEEA5, "kvinna ")
+SUBS(AR|AA|AS|AN|AO|AP, str_BFEABB3BEB86B455, "somna ")
+SUBS(AR|RGT|AA|AS|AN|AO|AP, str_255552DE3D93DC55, "paus ")
+SUBS(AR|AA|AS|AE|AN|AO, str_1D76C98090617D6E, "down ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_4A002965FED4A8FE, "undan ")
+SUBS(AR|AA|AT|AN|AI|AO, str_C4FF45788051CA5A, "vanligt ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_4CC29CA53EAD7246, "inga ")
+SUBS(AR|AA|AT|AN|AO|AP, str_44CBDA863AA5585D, "tomma ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_B91FF14178302E0A, "manga ")
+SUBS(AR|AA|AS|AE|AT|AP, str_BB75198872F76050, "spar ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_516AC7176516B725, "pratade ")
+SUBS(AR|AA|AS|AE|AI|AO, str_C375A03353B42973, "alldeles ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_77C9753B5C876862, "lade ")
+SUBS(AR|AA|AE|AT|AN|AO, str_D0A603CC65D30C70, "gangen ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_BD3467F836FD2F8C, "nagra ")
+SUBS(AR|AE|AT|AN|AO|AP, str_BCAE05E7EF3D810B, "genom ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_F173C987BE4F08AB, "mor ")
+SUBS(AR|AA|AN|AI|AO|AP, str_6BC4CA7BDF8782FF, "allihop ")
+SUBS(AR|RGT|AA|AN|AI|AO|AP, str_E0E5E182B30FE2E3, "lamna ")
+SUBS(AR|AA|AS|AT|AI|AP, str_1018E41A0C1EC1A0, "skapat ")
+SUBS(AR|RGT|AA|AS|AT|AI|AP, str_85A59F9EA1F92944, "packa ")
+SUBS(AR|AA|AS|AT|AI|AO, str_C3D89EF184B5BAE6, "alltsa ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO, str_18855DE37C447A96, "ocksa ")
+SUBS(AR|AA|AS|AN|AI|AP, str_FECDF8E66759AE90, "smak ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_78ED68ED18DCC543, "manniska ")
+SUBS(AR|AA|AS|AE|AT|AI, str_85A5D69A159324FC, "vad ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI, str_9A09060F892B014F, "kvar ")
+SUBS(AR|AT|AN|AI|AO|AP, str_E1F9A5A9593524A6, "glomt ")
+SUBS(AR|RGT|AT|AN|AI|AO|AP, str_2CB95DC376B85715, "mig ")
+SUBS(AR|AA|AE|AN|AO|AP, str_A9AF498065DEF967, "anonym ")
+SUBS(AR|RGT|AA|AE|AN|AO|AP, str_70F23D1E20A1ACD4, "umea ")
+SUBS(AR|AA|AS|AT|AN|AO, str_C87062042895E975, "sang ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO, str_81A8C6D8973AFD83, "jag ")
+SUBS(AR|AS|AE|AT|AI|AO, str_793519F6C38F4A03, "dig ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO, str_48A10C7DE9334752, "kort ")
+SUBS(AR|AA|AS|AN|AI|AO, str_8E12F1E2FEB357B7, "skolan ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_9C690AE731952F94, "kunna ")
+SUBS(AR|AA|AS|AI|AO|AP, str_0A66BD1C9CC79B64, "sallskap ")
+SUBS(AR|RGT|AA|AS|AI|AO|AP, str_5416D15BFD89C25D, "kopa ")
+SUBS(AR|AS|AE|AN|AI|AO, str_23364D98E5BADAA3, "skulle ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_5E4907A9602E385A, "kunde ")
+SUBS(AR|AA|AS|AE|AN|AP, str_C9922B7D35F8F5FF, "ensam ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_79413BF1389127FB, "medan ")
+SUBS(AR|AA|AE|AT|AN|AI, str_7E37EC9551F812BA, "aven ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_4ADA2A4F18F54100, "har ")
+SUBS(AR|AA|AE|AN|AI|AO, str_93C5A86211AA7CA2, "elina ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO, str_97AE27037986ADEA, "hela ")
+SUBS(AR|AA|AE|AT|AI|AP, str_F8CB64C5A270954A, "varpa ")
+SUBS(AR|RGT|AA|AE|AT|AI|AP, str_18606D9ECE0D83F1, "partiet ")
+SUBS(AR|AS|AE|AN|AO|AP, str_12BF12EEF13D6E95, "dom ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_03BC9D6CB8B3908A, "mod ")
+SUBS(AR|AS|AT|AN|AO|AP, str_AF8CB41B072A6FE4, "com ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_502F482B79087297, "most ")
+SUBS(AR|AS|AE|AT|AO|AP, str_83C26810E3BD3012, "greps ")
+SUBS(AR|RGT|AS|AE|AT|AO|AP, str_5204C59B3BF29E2F, "process ")
+SUBS(AR|AA|AS|AE|AI|AP, str_5ADD312E912CFFE9, "skapade ")
+SUBS(AR|RGT|AA|AS|AE|AI|AP, str_DB2C7D62AC684467, "pekade ")
+SUBS(AR|AS|AN|AI|AO|AP, str_15DFAD6856F1ED67, "slump ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_C50B116423771F39, "kom ")
+SUBS(AR|AE|AT|AN|AI|AP, str_0057544F35671D44, "vem ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_60B0320603B7F843, "mitten ")
+SUBS(AR|AS|AE|AT|AN|AP, str_01860FF7012071E5, "september ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_44BF2FC17F81D9DC, "mest ")
+SUBS(AR|AS|AE|AN|AI|AP, str_1FC28B1791FCDABB, "spisen ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_6FE29D77C1F08C97, "mindes ")
+SUBS(AR|AA|AE|AT|AO|AP, str_0C644F2339AF7F37, "rapport ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_5E0C8ECDADE5F1A0, "page ")
+SUBS(AR|AS|AE|AT|AN|AO, str_8DF4F0A3E8D06533, "gjorde ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_7A9785B2733BF653, "under ")
+SUBS(AR|AE|AT|AN|AI|AO, str_13A17952D7936000, "blev ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_ABE318F1EB93CC7F, "hur ")
+SUBS(AR|AA|AE|AI|AO|AP, str_F7D795E2DE04290F, "apple ")
+SUBS(AR|RGT|AA|AE|AI|AO|AP, str_34EA7F3BE527A04F, "pela ")
+SUBS(AR|AS|AE|AT|AI|AP, str_8CC7749F68433827, "respekt ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_DB4FF6C628F2F042, "precis ")
+SUBS(AR|AA|AT|AN|AI|AP, str_1AFD7B5D30FA8F4A, "fatima ")
+SUBS(AR|RGT|AA|AT|AN|AI|AP, str_9B3C263F520E632D, "hamta ")
+SUBS(AR|AE|AT|AI|AO|AP, str_1A4EF315EA80344F, "grip ")
+SUBS(AR|RGT|AE|AT|AI|AO|AP, str_E00C01D3BBA094DD, "prov ")
+SUBS(AR|AA|AT|AI|AO|AP, str_8F1B401C7BCDC7EE, "filippa ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_45FE9A2B260894A6, "pavliga ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_B47B50D1208647C5, "spelade ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_41164DEA1BFCD7FF, "klappade ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_730AB5BBBA2305E9, "ropade ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO|AP, str_D21982893DED0AFD, "pastod ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_58DBAC3080F43A2C, "april ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO|AP, str_EC34ADA15E62D00B, "lappar ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_AB25D3399C16705C, "sjalv ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO, str_A79BBD5387E55E2E, "klockan ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_B874CB7A247D38E7, "aldrig ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO, str_B109FA5914BAB3CC, "klart ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_174C90A0B77D66CF, "bestamde ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_631C484EF5C17F60, "maste ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_A0FB77BE600C518D, "verkligen ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_159DA67630B9C4A9, "huvudet ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_D809EA1C162F05D0, "dessutom ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_938C6DD7DE962990, "person ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_75328AD6ECDB94B3, "timmar ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_20D808CCE48F9C34, "paven ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_A9F017B0DEA052B4, "framfor ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_E735B15EE44DE283, "pengar ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_60DD52897AE7328E, "sprak ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_A2DCF68E7ACD2699, "patrik ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_E3AE17CB28B55902, "spanien ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_4643015F5002ABFF, "make ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_730A4A8F280D802E, "tankte ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_499CACB6288E17DD, "kanner ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_FB42C17B31D14164, "gamla ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_97C00B523408F8B7, "lamnat ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_2D9B3C8BB10F4C71, "exempel ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_096EF40B209100B2, "mellan ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_16A616A24AAA80D6, "skamt ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_A04DFE6A7FAEDD8E, "knappt ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_1C8B3965080EEF19, "tomas ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_FFAE1393B428FE51, "magnus ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_62AF0D5F4BB7987C, "slappt ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_FBADBE55C0272903, "plats ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_98E174199A997AFD, "djupa ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_0A6701358CC73E3A, "oppnade ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_BB4D7CF6778AD206, "smala ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_B8D7EF0ABFA2C4C3, "komma ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_88F5A43BE0BC072E, "skillnad ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_95B847E486379B38, "handlade ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_5C58D6B1BEC926EF, "stockholm ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_7C8D46C209F732E4, "kommit ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_258AA3102EC41BD6, "borjade ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO, str_646D208629EDBFC1, "undrade ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_961F574E5DB8CD35, "speciellt ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_64974DC541FEDAEF, "kropp ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_CE356BCCA5A45B45, "ekonomi ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_30354D5A4B436996, "polisen ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_90EB3F133AC9CF04, "vagen ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_F7B5CD697F847A3A, "langre ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_04D524DCEC185846, "centimeter ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AP, str_AD0842BD224F368E, "mycket ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_37A6692CFD8DF23C, "bland ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_9D5D6B2DFAEDAA76, "ibland ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_26DB64F196A60D81, "slappte ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_E4B4237662F98075, "kapitel ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_D0D226AAA0B90708, "samlade ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_1BBBF194DC4F2E9E, "lamnade ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_C949F411BCF227A9, "eftersom ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_5A4FC81688AEE4AB, "omradet ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_BFE60D3420EC2D27, "amerikanska ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_786E0CCB3A9F8DE2, "marken ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_8EE92B2E8CDC5E0B, "tvartom ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_F1D9096F612CF387, "information ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_B6704D34E096633F, "bakom ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_463790F4F9CDB0AD, "langsamt ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_1A5961CCABB64774, "emellertid ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_2286C79D95E0BDDA, "kommer ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_B04FBE0155955955, "samtidigt ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_52DA64450BF48564, "manniskor ")
diff --git a/keyboards/gboards/dicts/aset/tr-keymap.def b/keyboards/gboards/dicts/aset/tr-keymap.def
new file mode 100644
index 00000000000..93e1053b1fe
--- /dev/null
+++ b/keyboards/gboards/dicts/aset/tr-keymap.def
@@ -0,0 +1,387 @@
+// This file is automatically generated. Do not edit it!
+
+PRES(AE, KC_E)
+PRES(AA, KC_A)
+PRES(AT, KC_T)
+PRES(AI, KC_I)
+PRES(AN, KC_N)
+PRES(AS, KC_S)
+PRES(AP, KC_P)
+PRES(AO, KC_O)
+PRES(AS|AT, KC_C)
+PRES(AN|AO, KC_U)
+PRES(AE|AT, KC_R)
+PRES(AE|AP, KC_QUOT)
+PRES(AT|AP, KC_BSPC)
+KEYS(AA|AO, cmb_9df323cdb026f7ce, {KC_LSFT, KC_9, COMBO_END})
+PRES(AT|AI, KC_V)
+PRES(AE|AO, KC_MINS)
+KEYS(AI|AP, cmb_68737f3c98f133fe, {KC_LSFT, KC_1, COMBO_END})
+PRES(AA|AP, KC_QUOT)
+PRES(AS|AO, KC_DOT)
+PRES(AN|AI, KC_H)
+PRES(AO|AP, KC_SCLN)
+KEYS(AS|AP, cmb_e57ca193d8778bdc, {KC_LSFT, KC_0, COMBO_END})
+PRES(AT|AO, KC_G)
+PRES(AS|AN, KC_J)
+PRES(AI|AO, KC_L)
+PRES(AA|AI, KC_Z)
+PRES(AN|AP, KC_M)
+PRES(AA|AT, KC_F)
+PRES(AE|AI, KC_COMM)
+PRES(AE|AN, KC_Y)
+PRES(AS|AI, KC_K)
+PRES(AT|AN, KC_B)
+PRES(AA|AS, KC_W)
+PRES(AA|AN, KC_Q)
+PRES(AA|AE, KC_X)
+PRES(AS|AE, KC_D)
+SUBS(AR|AS|AE|AT, str_537FA833E2862BFA, "eder ")
+SUBS(AR|AA|AO|AP, str_293FC53F8C3C21A6, "apo ")
+SUBS(AR|AA|AE|AT, str_F81844C19D4C81B2, "ara ")
+SUBS(AR|AN|AI|AP, str_DD31FA4C91A58242, "mi ")
+SUBS(AR|AN|AI|AO, str_736E380176E67819, "unlu ")
+SUBS(AR|AT|AO|AP, str_8574F11BEB82545C, "top ")
+SUBS(AR|AA|AS|AE, str_6E5B393925FE64CE, "da ")
+SUBS(AR|AA|AT|AP, str_7A06301D23DD2E0F, "pat ")
+SUBS(AR|AS|AE|AO, str_16AE4BE38D2F26C0, "do ")
+SUBS(AR|AA|AI|AP, str_65D664ADF1031245, "papaz ")
+SUBS(AR|AN|AO|AP, str_2CDB1FF9C007065E, "mu ")
+SUBS(AR|AE|AI|AP, str_E5D0DBF6833C9487, "'i ")
+SUBS(AR|AA|AN|AO, str_E1BCA9513A9FBB4D, "ona ")
+SUBS(AR|AE|AN|AO, str_7E37B14C8B8926A1, "onune ")
+SUBS(AR|AA|AS|AT, str_DE2547EFFCE81249, "saat ")
+PRES(AN|AI|AO|AP, KC_ENT)
+SUBS(AR|AS|AE|AP, str_389774CE338E67BC, "'de ")
+SUBS(AR|AA|AS|AP, str_C4E57FF7A10C22EC, "pasa ")
+SUBS(AR|AA|AT|AN, str_16FA1740D0B2B584, "bana ")
+SUBS(AR|AI|AO|AP, str_88B19184FF89676C, "pol ")
+SUBS(AR|AA|AT|AI|AP, str_D411896E41169C3D, "atip ")
+SUBS(AR|AE|AN|AO|AP, str_8BAE8E7ED30FF787, "memnun ")
+SUBS(AR|AA|AS|AE|AO, str_419E359B821D2AA1, "odada ")
+SUBS(AR|AE|AT|AO|AP, str_C49A79241347400B, "potter ")
+SUBS(AR|AA|AS|AT|AN, str_ED64011B1DDBB524, "bas ")
+SUBS(AR|AT|AI|AO|AP, str_3239C8BD5E65A974, "popov ")
+SUBS(AR|AA|AS|AO|AP, str_F75289636128CFF8, "sopa ")
+SUBS(AR|AA|AS|AN|AO, str_AF9B75173C7A0B7A, "sona ")
+SUBS(AR|AA|AI|AO|AP, str_6B9966EF2DF10D5A, "alip ")
+SUBS(AR|AA|AS|AE|AP, str_4347B74ACC01398F, "'da ")
+SUBS(AR|AE|AI|AO|AP, str_F788D0AEDB30B308, "poole ")
+SUBS(AR|AA|AT|AN|AO, str_3FDAD894DDA1E312, "buna ")
+SUBS(AR|AS|AN|AO|AP, str_BC74EF8DF89E490A, "musun ")
+SUBS(AR|AA|AS|AT|AO, str_012BC8136AB7012F, "sag ")
+SUBS(AR|AA|AT|AN|AP, str_BF3DDFB8CBFE1C63, "tam ")
+SUBS(AR|AA|AS|AE|AT, str_E558D3BDD97766AE, "sadece ")
+SUBS(AR|AA|AE|AN|AO, str_6F88B0830DA452F6, "yunan ")
+SUBS(AR|AS|AE|AI, str_E8E3E66D08DA33FB, "dedi ")
+SUBS(AR|RGT|AS|AE|AI, str_BDA65BA81A4E5E51, "ise ")
+SUBS(AR|AS|AI|AO, str_C9ADB25B4C37D131, "sol ")
+SUBS(AR|RGT|AS|AI|AO, str_C973AC94B31D29D0, "ilk ")
+SUBS(AR|AT|AI|AO, str_53725C7A1A99F367, "gitti ")
+SUBS(AR|RGT|AT|AI|AO, str_A4252F407B929731, "ilgili ")
+SUBS(AR|AA|AT|AI, str_48F7952354BFCEE8, "atti ")
+SUBS(AR|RGT|AA|AT|AI, str_7768BDCB25C9BA0C, "itaat ")
+SUBS(AR|AS|AE|AN, str_C53852934F18FFD9, "sey ")
+SUBS(AR|RGT|AS|AE|AN, str_5C4BEB33B0909DA8, "neden ")
+SUBS(AR|AA|AI|AO, str_C49001FAA655F248, "al ")
+SUBS(AR|RGT|AA|AI|AO, str_7E7904D7326BCF29, "la ")
+SUBS(AR|AA|AT|AO, str_4DC80FED32FAFDC0, "aga ")
+SUBS(AR|RGT|AA|AT|AO, str_BF38370C83727D39, "of ")
+SUBS(AR|AE|AT|AO, str_1EDA9A722270F7E4, "gore ")
+SUBS(AR|RGT|AE|AT|AO, str_03D8DFC3440FFB4D, "ote ")
+SUBS(AR|AE|AT|AN, str_6EDDE1729393B4E6, "ben ")
+SUBS(AR|RGT|AE|AT|AN, str_E569986474B395C2, "yere ")
+SUBS(AR|AE|AN|AI, str_7E3D8B1C859776CA, "eh ")
+SUBS(AR|RGT|AE|AN|AI, str_8827D1EFB4EBF5F9, "iyi ")
+SUBS(AR|AT|AN|AO, str_00BFE1C3EEAE641F, "bu ")
+SUBS(AR|RGT|AT|AN|AO, str_3F3B1F8B5A3E409E, "not ")
+SUBS(AR|AE|AN|AP, str_CA549A07BB6C3E3E, "epey ")
+SUBS(AR|RGT|AE|AN|AP, str_868592BD219484EA, "yemeye ")
+SUBS(AR|AT|AI|AP, str_EDDB4B5D8E6E6CF7, "tip ")
+SUBS(AR|RGT|AT|AI|AP, str_3B65DB9F507392DD, "itip ")
+SUBS(AR|AS|AN|AO, str_7412E38D9D55C2DC, "su ")
+SUBS(AR|RGT|AS|AN|AO, str_93E9AC18AF76041F, "us ")
+SUBS(AR|AE|AT|AP, str_C99B9A9776E95F94, "tepe ")
+SUBS(AR|RGT|AE|AT|AP, str_18D30F121CA53072, "'te ")
+SUBS(AR|AS|AN|AI, str_E0C254EBD3EEAD33, "sinsi ")
+SUBS(AR|RGT|AS|AN|AI, str_8338AE885F86B7EB, "isin ")
+SUBS(AR|AS|AT|AO, str_2B5643EBEA529AC6, "goc ")
+SUBS(AR|RGT|AS|AT|AO, str_77C6B8367F5A7C65, "oc ")
+SUBS(AR|AA|AS|AN, str_472497D77F5A171D, "sana ")
+SUBS(AR|RGT|AA|AS|AN, str_C5270D6F6B831E8A, "jan ")
+SUBS(AR|AT|AN|AI, str_BF8295FE584BC5B0, "bin ")
+SUBS(AR|RGT|AT|AN|AI, str_1DB1DA700CC8EF14, "hint ")
+SUBS(AR|AE|AT|AI, str_9C1D72454CFB8F29, "ve ")
+SUBS(AR|RGT|AE|AT|AI, str_653E66B7460F4D09, "iri ")
+SUBS(AR|AA|AS|AI, str_53CD5CF62F2771BB, "siz ")
+SUBS(AR|RGT|AA|AS|AI, str_EC45B37743C0E0DC, "kiz ")
+SUBS(AR|AA|AN|AI, str_BF40C27E59DAAC7B, "ah ")
+SUBS(AR|RGT|AA|AN|AI, str_D6B4EABDEAB1AAFD, "izin ")
+SUBS(AR|AA|AN|AP, str_F438C1279CCEB43D, "ama ")
+SUBS(AR|RGT|AA|AN|AP, str_A807F22B2F10DE70, "mana ")
+SUBS(AR|AA|AE|AN, str_71F52FF80B4E955D, "ay ")
+SUBS(AR|RGT|AA|AE|AN, str_CBA94FFB9DDDB35B, "ya ")
+SUBS(AR|AS|AT|AI, str_B3A467A5E077FC8C, "cikti ")
+SUBS(AR|RGT|AS|AT|AI, str_1F6902701AB644CE, "ic ")
+SUBS(AR|AS|AI|AP, str_52ED463C934320BD, "sikisip ")
+SUBS(AR|RGT|AS|AI|AP, str_565EB49E602024EF, "pis ")
+SUBS(AR|AE|AI|AO, str_05ED48987A1828F9, "el ")
+SUBS(AR|RGT|AE|AI|AO, str_B186DE4E1BCC6BDE, "ile ")
+SUBS(AR|AA|AE|AI|AO|AP, str_0BE310FD055B244D, "la'e ")
+SUBS(AR|AA|AE|AT|AI|AP, str_942036C586B52CDC, "parti ")
+SUBS(AR|AA|AS|AE|AI|AP, str_7554CDFC28D7B7B1, "kapida ")
+SUBS(AR|AA|AE|AN|AO|AP, str_1355FCBB05D95A12, "maymun ")
+SUBS(AR|AA|AS|AN|AO|AP, str_94C0A609AB01BDDC, "osman ")
+SUBS(AR|AS|AE|AT|AI|AO, str_D6D42E8A680D9B3B, "degil ")
+SUBS(AR|AA|AE|AT|AI|AO, str_B486D61812526B81, "agir ")
+SUBS(AR|AA|AS|AT|AN|AI, str_44F4AF5A50ADCABC, "baska ")
+SUBS(AR|AS|AT|AI|AO|AP, str_94A710198AA418ED, "politik ")
+SUBS(AR|AA|AE|AN|AI|AO, str_C4990868212B50AD, "yalniz ")
+SUBS(AR|AA|AS|AT|AO|AP, str_FF993FB3354F3759, "posta ")
+SUBS(AR|AA|AS|AT|AN|AP, str_D70133B37553FCA8, "cam ")
+SUBS(AR|AA|AS|AI|AO|AP, str_F850D264E401D0ED, "kapali ")
+SUBS(AR|AS|AE|AI|AO|AP, str_D77CE85B474D3899, "kopek ")
+SUBS(AR|AS|AT|AN|AI, str_808974B4C921A87B, "cin ")
+SUBS(AR|RGT|AS|AT|AN|AI, str_5637E476173C5651, "icin ")
+SUBS(AR|AA|AT|AI|AO, str_CF535A10BCB881F1, "fazla ")
+SUBS(AR|RGT|AA|AT|AI|AO, str_B0BECDD9F3E0CE56, "laf ")
+SUBS(AR|AE|AN|AI|AO, str_64642F6BEEB4C0C4, "elini ")
+SUBS(AR|RGT|AE|AN|AI|AO, str_FE5039B64180B086, "oyle ")
+SUBS(AR|AS|AE|AN|AO, str_EB534B63B284CE6E, "dondu ")
+SUBS(AR|RGT|AS|AE|AN|AO, str_9D30508BB7F791A2, "onunde ")
+SUBS(AR|AS|AT|AI|AO, str_20D841C850E5918C, "cok ")
+SUBS(AR|RGT|AS|AT|AI|AO, str_660DBC63D8BA4C1D, "isigi ")
+SUBS(AR|AS|AE|AI|AP, str_76A4EAE8811EFAF7, "edip ")
+SUBS(AR|RGT|AS|AE|AI|AP, str_0D3BE62305D58F96, "pek ")
+SUBS(AR|AA|AS|AN|AP, str_020E794D3DE91D12, "sam ")
+SUBS(AR|RGT|AA|AS|AN|AP, str_0DF584E9973309E5, "masa ")
+SUBS(AR|AE|AT|AI|AP, str_254B9F9B1C382638, "verip ")
+SUBS(AR|RGT|AE|AT|AI|AP, str_E570F82063877B80, "pir ")
+SUBS(AR|AS|AT|AI|AP, str_EB0E51ECD49853D8, "tipki ")
+SUBS(AR|RGT|AS|AT|AI|AP, str_53593794EEDE7216, "icip ")
+SUBS(AR|AA|AN|AI|AO, str_DA678B247767B8F0, "allah ")
+SUBS(AR|RGT|AA|AN|AI|AO, str_DDC6E7D61E0848D2, "olan ")
+SUBS(AR|AA|AN|AI|AP, str_F169294DEF20007C, "zaman ")
+SUBS(AR|RGT|AA|AN|AI|AP, str_F3A337AF5902E0B0, "hanim ")
+SUBS(AR|AS|AN|AI|AP, str_C11A226C16359C4A, "simsiki ")
+SUBS(AR|RGT|AS|AN|AI|AP, str_ADA4AB22469B2792, "kim ")
+SUBS(AR|AA|AS|AI|AO, str_3B62E6B04ACB4910, "soz ")
+SUBS(AR|RGT|AA|AS|AI|AO, str_9F8B514A23F4E067, "olsa ")
+SUBS(AR|AA|AS|AT|AI, str_1584D2B85F7BEACE, "fakat ")
+SUBS(AR|RGT|AA|AS|AT|AI, str_C573E416F9DFCE7B, "kac ")
+SUBS(AR|AS|AE|AT|AI, str_F1146309407C38BA, "tek ")
+SUBS(AR|RGT|AS|AE|AT|AI, str_96C125AAB35C232C, "iste ")
+SUBS(AR|AA|AS|AE|AN, str_5E8D44E2CAB96FB1, "anda ")
+SUBS(AR|RGT|AA|AS|AE|AN, str_FDBD246CDAD22BC3, "yandan ")
+SUBS(AR|AS|AE|AT|AP, str_54B8D3DAFB1BFD6A, "cep ")
+SUBS(AR|RGT|AS|AE|AT|AP, str_4FAF20EC21BD1E37, "perde ")
+SUBS(AR|AS|AI|AO|AP, str_3E7549E7DDAFEDD6, "silip ")
+SUBS(AR|RGT|AS|AI|AO|AP, str_D1CF976AEEEFB6C8, "polis ")
+SUBS(AR|AA|AE|AT|AN, str_EE41B0454A85A919, "bay ")
+SUBS(AR|RGT|AA|AE|AT|AN, str_FD393C9D3221B8B8, "nefret ")
+SUBS(AR|AA|AE|AI|AO, str_884C1C7DD4B49B14, "aile ")
+SUBS(AR|RGT|AA|AE|AI|AO, str_BF0895A245C2BF38, "ozel ")
+SUBS(AR|AS|AT|AN|AO, str_95E986B36FA22668, "bos ")
+SUBS(AR|RGT|AS|AT|AN|AO, str_EE720D20FE456256, "uc ")
+SUBS(AR|AS|AE|AN|AI, str_57C8F477D19CC1CA, "diye ")
+SUBS(AR|RGT|AS|AE|AN|AI, str_9E0849EDED7BD94A, "kendi ")
+SUBS(AR|AA|AE|AN|AP, str_962E9B55318FFB33, "annem ")
+SUBS(AR|RGT|AA|AE|AN|AP, str_69B23B0C03482B1E, "yapan ")
+SUBS(AR|AE|AT|AI|AO, str_863BB9152468BEFA, "geri ")
+SUBS(AR|RGT|AE|AT|AI|AO, str_B7B838B8649E9F2F, "ileri ")
+SUBS(AR|AA|AE|AT|AO, str_ACACBB21FF427C1A, "fotograf ")
+SUBS(AR|RGT|AA|AE|AT|AO, str_9E7D3AA01152D41C, "orta ")
+SUBS(AR|AT|AN|AO|AP, str_5E04ED063898911C, "tum ")
+SUBS(AR|RGT|AT|AN|AO|AP, str_E5D368C0A2919C0F, "umut ")
+SUBS(AR|AT|AN|AI|AP, str_AF1FE256DC6BB784, "tim ")
+SUBS(AR|RGT|AT|AN|AI|AP, str_168886128C6CCE68, "mit ")
+SUBS(AR|AA|AS|AN|AI, str_3FD04028FA355FFA, "sanki ")
+SUBS(AR|RGT|AA|AS|AN|AI, str_3A5769429132B449, "insan ")
+SUBS(AR|AA|AS|AI|AP, str_F5C16F1F0EB11E41, "sapka ")
+SUBS(AR|RGT|AA|AS|AI|AP, str_4B08B49241B7625C, "kapi ")
+SUBS(AR|AT|AN|AI|AO, str_30D7E29C6AB72EC5, "gibi ")
+SUBS(AR|RGT|AT|AN|AI|AO, str_BE7B30B01B292B12, "oglu ")
+SUBS(AR|AA|AE|AN|AI, str_78E0E12A253E7AE1, "ayni ")
+SUBS(AR|RGT|AA|AE|AN|AI, str_642C5693D578E623, "yani ")
+SUBS(AR|AA|AE|AT|AI, str_776A8271136FBCDD, "var ")
+SUBS(AR|RGT|AA|AE|AT|AI, str_4DC961D6F46E8498, "itiraf ")
+SUBS(AR|AE|AT|AN|AI, str_4E68704B09E941AC, "bir ")
+SUBS(AR|RGT|AE|AT|AN|AI, str_8BA7632DC4B89BB1, "her ")
+SUBS(AR|AA|AE|AT|AP, str_460BF33F31FE5B60, "arap ")
+SUBS(AR|RGT|AA|AE|AT|AP, str_900C0665FDDCD3E1, "para ")
+SUBS(AR|AS|AE|AT|AO, str_7EE7FFD65702FA6C, "gece ")
+SUBS(AR|RGT|AS|AE|AT|AO, str_8A5179FCB5FFC0FB, "otede ")
+SUBS(AR|AS|AE|AI|AO, str_5DD922AE9A68D542, "sekilde ")
+SUBS(AR|RGT|AS|AE|AI|AO, str_9467E88F0E2DE2DC, "kisisel ")
+SUBS(AR|AA|AS|AE|AI, str_B74AC39257EEB48C, "size ")
+SUBS(AR|RGT|AA|AS|AE|AI, str_3D1AC7FB8818918A, "kez ")
+SUBS(AR|AE|AT|AN|AO, str_FB51F2C8C00A7A37, "gene ")
+SUBS(AR|RGT|AE|AT|AN|AO, str_F79C8557DD0FF58D, "uygun ")
+SUBS(AR|AA|AT|AN|AI, str_B9C9F742F6F7FDCA, "biz ")
+SUBS(AR|RGT|AA|AT|AN|AI, str_1BBF28F4AF839F81, "hatta ")
+SUBS(AR|AS|AN|AI|AO, str_4E9927ABF07D2A9D, "soluk ")
+SUBS(AR|RGT|AS|AN|AI|AO, str_BA84D32B219BA5CF, "olsun ")
+SUBS(AR|AE|AN|AI|AP, str_26467D3FCDCBC3A6, "emin ")
+SUBS(AR|RGT|AE|AN|AI|AP, str_53F0336D02315FFF, "hemen ")
+SUBS(AR|AS|AE|AT|AN, str_2C194879C1966F95, "bes ")
+SUBS(AR|RGT|AS|AE|AT|AN, str_45801DF17D4A1F16, "yerde ")
+SUBS(AR|AS|AT|AO|AP, str_ED481D10552FB497, "cop ")
+SUBS(AR|RGT|AS|AT|AO|AP, str_65F782359B3EEC88, "otostop ")
+SUBS(AR|AS|AE|AN|AP, str_8972A041675067FF, "demeye ")
+SUBS(AR|RGT|AS|AE|AN|AP, str_3B50DD376F63FFCF, "'den ")
+SUBS(AR|AE|AT|AN|AP, str_18DF9684F8E06299, "etmeye ")
+SUBS(AR|RGT|AE|AT|AN|AP, str_10A1A694946FA759, "mr ")
+SUBS(AR|AA|AS|AE|AT|AO|AP, str_76D62DECF1B3082E, "profesor ")
+SUBS(AR|AS|AE|AT|AN|AI|AP, str_229273766D1862E6, "etmek ")
+SUBS(AR|AA|AS|AE|AT|AI, str_EE53D172AE08A453, "vardi ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI, str_A5266B57E617FBD6, "kadar ")
+SUBS(AR|AE|AT|AI|AO|AP, str_E8D2D43FFA00B945, "gelip ")
+SUBS(AR|RGT|AE|AT|AI|AO|AP, str_16589DCCD3DBF4F5, "piril ")
+SUBS(AR|AA|AE|AT|AN|AI, str_E0EB8EF37B5CC571, "biraz ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI, str_2DDF44F81DEA7B53, "hayir ")
+SUBS(AR|AA|AS|AE|AT|AN, str_D14A510FDBEFC4D2, "cay ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN, str_609880ADC0419D4D, "nefes ")
+SUBS(AR|AS|AE|AT|AN|AI, str_66093427B818F7DC, "birden ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI, str_764E3E951C6ECBBA, "icinde ")
+SUBS(AR|AS|AT|AN|AO|AP, str_2D584A05A9BA0E67, "gumus ")
+SUBS(AR|RGT|AS|AT|AN|AO|AP, str_C8E988281C57E0BA, "unutmus ")
+SUBS(AR|AA|AT|AN|AI|AP, str_DBAF0E374DCFD905, "bizim ")
+SUBS(AR|RGT|AA|AT|AN|AI|AP, str_6FC03310E8B09E3F, "mavi ")
+SUBS(AR|AS|AE|AN|AO|AP, str_5700C6173D5769F1, "donup ")
+SUBS(AR|RGT|AS|AE|AN|AO|AP, str_11D9D6F188266199, "muydu ")
+SUBS(AR|AS|AE|AN|AI|AO, str_44C8444FA0BB5EEA, "soyle ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO, str_E1476CDC1ED6DB7D, "yok ")
+SUBS(AR|AA|AT|AI|AO|AP, str_CAC1D661F01CFD71, "aptal ")
+SUBS(AR|RGT|AA|AT|AI|AO|AP, str_9CC39C1C9F2FDC0E, "iptal ")
+SUBS(AR|AA|AS|AE|AN|AP, str_53F857754C3C0D13, "adam ")
+SUBS(AR|RGT|AA|AS|AE|AN|AP, str_757FABC9350E4C7A, "meydana ")
+SUBS(AR|AA|AS|AT|AN|AO, str_FC192BACADE82774, "fonts ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO, str_39EF976E58C0F7CA, "usta ")
+SUBS(AR|AA|AS|AT|AI|AO, str_5A88536193D41DBF, "asagi ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO, str_5A221ECF0DDB96A3, "olacak ")
+SUBS(AR|AA|AE|AT|AN|AP, str_CB3551D5FC71646E, "tamamen ")
+SUBS(AR|RGT|AA|AE|AT|AN|AP, str_9858DEB952EAAF02, "yapar ")
+SUBS(AR|AS|AT|AN|AI|AO, str_59B412D670871D2D, "cunku ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO, str_FBB2B6224B9A76AD, "kucuk ")
+SUBS(AR|AA|AN|AI|AO|AP, str_70BDA9ECA7ADF5ED, "anlamina ")
+SUBS(AR|RGT|AA|AN|AI|AO|AP, str_60462B1777DBED17, "olmaz ")
+SUBS(AR|AA|AE|AT|AN|AO, str_8786CD5FF215EABE, "buraya ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO, str_9123C035D1763408, "ortaya ")
+SUBS(AR|AA|AE|AT|AO|AP, str_EF8457E3CB802CCC, "topraga ")
+SUBS(AR|RGT|AA|AE|AT|AO|AP, str_5E0C8ECDADE5F1A0, "page ")
+SUBS(AR|AA|AS|AE|AT|AO, str_69172418D41AE1E4, "dag ")
+SUBS(AR|RGT|AA|AS|AE|AT|AO, str_41C90296C332ED2C, "orada ")
+SUBS(AR|AA|AE|AN|AI|AP, str_26BCF8488D314254, "annemin ")
+SUBS(AR|RGT|AA|AE|AN|AI|AP, str_345DE067681CB907, "hepimiz ")
+SUBS(AR|AE|AT|AN|AO|AP, str_EB55FC450E7312D7, "grup ")
+SUBS(AR|RGT|AE|AT|AN|AO|AP, str_5D03262B96845502, "oturup ")
+SUBS(AR|AA|AS|AE|AT|AP, str_FC938EC6D0C5B50C, "sarap ")
+SUBS(AR|RGT|AA|AS|AE|AT|AP, str_7F8309C46FBC0ED2, "parca ")
+SUBS(AR|AE|AT|AN|AI|AO, str_AE7F829FB2C17970, "bile ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO, str_CD1530DDBCCC41B1, "olur ")
+SUBS(AR|AS|AE|AT|AN|AO, str_F634CECC4D74BC1D, "dogru ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO, str_BA082B87D184320C, "once ")
+SUBS(AR|AA|AT|AN|AI|AO, str_3CEC778F5BFA1C27, "bulunan ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO, str_F0FE7383D4F42DCF, "hangi ")
+SUBS(AR|AA|AS|AE|AI|AO, str_D73B017E17730841, "aldi ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO, str_97A5A200471D85AC, "kaldi ")
+SUBS(AR|AA|AS|AT|AI|AP, str_6A2856E80E8F1D58, "takip ")
+SUBS(AR|RGT|AA|AS|AT|AI|AP, str_6BD9450F1788B4D7, "kitap ")
+SUBS(AR|AE|AT|AN|AI|AP, str_6A41BA6AD90B0603, "benim ")
+SUBS(AR|RGT|AE|AT|AN|AI|AP, str_15F46689AF492E39, "yirmi ")
+SUBS(AR|AA|AS|AN|AI|AO, str_2B6C868F6F195655, "sozunu ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO, str_66166C9BE5172B1E, "nasil ")
+SUBS(AR|AA|AS|AE|AN|AI, str_323290C279B549E7, "daha ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI, str_44EEB30CA020D42D, "kadin ")
+SUBS(AR|AS|AT|AN|AI|AP, str_7F30AAAC586D8B50, "cikmis ")
+SUBS(AR|RGT|AS|AT|AN|AI|AP, str_28987E2ADA80ED5D, "mistik ")
+SUBS(AR|AA|AS|AN|AI|AP, str_41ABFAF0FF784CAE, "aksam ")
+SUBS(AR|RGT|AA|AS|AN|AI|AP, str_05396CDFC13A1A43, "misiniz ")
+SUBS(AR|AS|AE|AT|AO|AP, str_C3F89E20008EF31C, "spor ")
+SUBS(AR|RGT|AS|AE|AT|AO|AP, str_ED113259C7973E21, "protesto ")
+SUBS(AR|AA|AS|AE|AN|AO, str_D83E09262A51A927, "sonunda ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO, str_085C192228098BC3, "ondan ")
+SUBS(AR|AS|AN|AI|AO|AP, str_3E3ADD8603A00EF7, "sokup ")
+SUBS(AR|RGT|AS|AN|AI|AO|AP, str_C5F0D21E78048361, "olmus ")
+SUBS(AR|AS|AE|AN|AI|AP, str_BDDCCF3C76478506, "simdi ")
+SUBS(AR|RGT|AS|AE|AN|AI|AP, str_D7A9ED3ED1949ABA, "kimse ")
+SUBS(AR|AA|AT|AN|AO|AP, str_9E9C2C2DCDFCA7A3, "bomba ")
+SUBS(AR|RGT|AA|AT|AN|AO|AP, str_B1045DE69BE5CD80, "mutfaga ")
+SUBS(AR|AS|AE|AT|AI|AP, str_B78C00616C0927C9, "cekip ")
+SUBS(AR|RGT|AS|AE|AT|AI|AP, str_F9C33F5E6760738A, "kirip ")
+SUBS(AR|AS|AE|AT|AN|AP, str_9F5BA422CC800977, "sebep ")
+SUBS(AR|RGT|AS|AE|AT|AN|AP, str_30E7C213CA4BD836, "pencereden ")
+SUBS(AR|AT|AN|AI|AO|AP, str_31E431E24A10B655, "bolum ")
+SUBS(AR|RGT|AT|AN|AI|AO|AP, str_A8582A006F2D6044, "mutlu ")
+SUBS(AR|AE|AN|AI|AO|AP, str_995FA5DD0BC5D3D3, "elimi ")
+SUBS(AR|RGT|AE|AN|AI|AO|AP, str_0C4F00FE9E896D08, "onemli ")
+SUBS(AR|AA|AS|AE|AT|AN|AP, str_E500E88807C6A03A, "stepan ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AP, str_9C35DC9E5202404F, "jandarma ")
+SUBS(AR|AA|AT|AN|AI|AO|AP, str_2E642CEEC56D4266, "film ")
+SUBS(AR|RGT|AA|AT|AN|AI|AO|AP, str_944E1395168C6D51, "hamilton ")
+SUBS(AR|AA|AE|AN|AI|AO|AP, str_71EDF4FB94D4699A, "almaya ")
+SUBS(AR|RGT|AA|AE|AN|AI|AO|AP, str_04B8FA201DBFF4B6, "olmayan ")
+SUBS(AR|AA|AS|AT|AN|AI|AO, str_B798C26D42E29874, "sultan ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO, str_C349CDB48BEE3E54, "kabul ")
+SUBS(AR|AE|AT|AN|AI|AO|AP, str_41539AB152F99266, "biliyorum ")
+SUBS(AR|RGT|AE|AT|AN|AI|AO|AP, str_40721692EDCA1E6F, "muhtemelen ")
+SUBS(AR|AA|AS|AE|AT|AI|AP, str_DB02B66EC3B8C7AE, "cevap ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AP, str_65711D239191216B, "parcasi ")
+SUBS(AR|AA|AS|AE|AI|AO|AP, str_1955A94E057DCC98, "dolasip ")
+SUBS(AR|RGT|AA|AS|AE|AI|AO|AP, str_B0DE83084472B1B3, "pekala ")
+SUBS(AR|AA|AE|AT|AI|AO|AP, str_A2D855797928C3E8, "garip ")
+SUBS(AR|RGT|AA|AE|AT|AI|AO|AP, str_D45C3E9B4CCF3C6F, "pavel ")
+SUBS(AR|AA|AS|AE|AT|AN|AO, str_0FED97B4BCCB2490, "sonra ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO, str_8FDE75ECB1272A4E, "oradan ")
+SUBS(AR|AA|AS|AE|AN|AI|AP, str_C216A0E287994C2B, "adamin ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AP, str_27073C376FEADC42, "kapiyi ")
+SUBS(AR|AA|AS|AE|AN|AO|AP, str_20BF4FEAA16623CA, "dusman ")
+SUBS(AR|RGT|AA|AS|AE|AN|AO|AP, str_607C48455B8E1AAF, "musaade ")
+SUBS(AR|AS|AE|AT|AI|AO|AP, str_1A9B0AC9478A4008, "gidip ")
+SUBS(AR|RGT|AS|AE|AT|AI|AO|AP, str_8A359AF81852C394, "polisler ")
+SUBS(AR|AA|AS|AT|AN|AO|AP, str_DF0FD87C1AFC51D9, "cuma ")
+SUBS(AR|RGT|AA|AS|AT|AN|AO|AP, str_941AD10A3AFA836F, "mustafa ")
+SUBS(AR|AA|AE|AT|AN|AI|AP, str_A1DAB58F92BD1771, "tanrim ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AP, str_E018C94DF896F66B, "yapti ")
+SUBS(AR|AS|AT|AN|AI|AO|AP, str_9936BF584D4C627C, "gitmis ")
+SUBS(AR|RGT|AS|AT|AN|AI|AO|AP, str_53E2A98FB43C82A1, "olmustu ")
+SUBS(AR|AA|AE|AT|AN|AI|AO, str_D360428EC279C24A, "guzel ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO, str_ACD32F5C6A192156, "uzerine ")
+SUBS(AR|AA|AS|AT|AI|AO|AP, str_5F5496E38A6B7892, "ciplak ")
+SUBS(AR|RGT|AA|AS|AT|AI|AO|AP, str_5A24157BAAFB7656, "politika ")
+SUBS(AR|AA|AE|AT|AN|AO|AP, str_10CC7AD9D858E828, "ragmen ")
+SUBS(AR|RGT|AA|AE|AT|AN|AO|AP, str_4A786FFDFE68908A, "yagmur ")
+SUBS(AR|AS|AE|AT|AN|AO|AP, str_CEFA49339EE4DAD4, "durum ")
+SUBS(AR|RGT|AS|AE|AT|AN|AO|AP, str_64D8F918B8BA73C2, "oturmus ")
+SUBS(AR|AS|AE|AN|AI|AO|AP, str_E946F470598B4C5B, "soylemek ")
+SUBS(AR|RGT|AS|AE|AN|AI|AO|AP, str_951245C934D1BA30, "oldum ")
+SUBS(AR|AA|AS|AT|AN|AI|AP, str_41D6E472627DA12D, "canim ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AP, str_57B74889BB18CAEC, "kaptan ")
+SUBS(AR|AA|AS|AE|AT|AN|AI, str_DCC79D5D70AC1A28, "arasinda ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI, str_A94ED5B836309CD7, "yavas ")
+SUBS(AR|AA|AS|AE|AT|AI|AO, str_8BC57A977D0BDD7F, "farkli ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO, str_B026B57BD40B1AD2, "olarak ")
+SUBS(AR|AA|AS|AE|AN|AI|AO, str_06AE4F58BA6A430A, "aslinda ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO, str_FFA37F2D13C0071B, "halde ")
+SUBS(AR|AA|AS|AN|AI|AO|AP, str_A2C610874DEA2A0F, "almak ")
+SUBS(AR|RGT|AA|AS|AN|AI|AO|AP, str_AEF3C691254FD431, "olmak ")
+SUBS(AR|AS|AE|AT|AN|AI|AO, str_3002A62B595E3D7D, "buyuk ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO, str_35A072B58C65D17E, "oldugunu ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO, str_47E4097D9C96503E, "basladi ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO, str_8AEE926F3C6F829A, "uzerinde ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AP, str_9FDCF46EA5EFE3C2, "devam ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AP, str_7ECB122B72B3F5C5, "yardim ")
+SUBS(AR|AA|AE|AT|AN|AI|AO|AP, str_472FC836FDD13709, "zamanlar ")
+SUBS(AR|RGT|AA|AE|AT|AN|AI|AO|AP, str_EC6311CA7E1DA72D, "yaptigi ")
+SUBS(AR|AA|AS|AE|AT|AI|AO|AP, str_DDBACE58EA0875AD, "toprak ")
+SUBS(AR|RGT|AA|AS|AE|AT|AI|AO|AP, str_C3295E9AAA29B46B, "parlak ")
+SUBS(AR|AA|AS|AT|AN|AI|AO|AP, str_59A1C984A232FC57, "baslamisti ")
+SUBS(AR|RGT|AA|AS|AT|AN|AI|AO|AP, str_089CA9673DDA67E4, "kocaman ")
+SUBS(AR|AA|AS|AE|AT|AN|AO|AP, str_4DEC37FECF7B7A0F, "durumda ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AO|AP, str_4C12AA56F24F9211, "propaganda ")
+SUBS(AR|AA|AS|AE|AN|AI|AO|AP, str_683C9C8FB8876296, "aldim ")
+SUBS(AR|RGT|AA|AS|AE|AN|AI|AO|AP, str_DDEBA1749E054F42, "olmadi ")
+SUBS(AR|AS|AE|AT|AN|AI|AO|AP, str_D4034C4AE3C4D28C, "gormek ")
+SUBS(AR|RGT|AS|AE|AT|AN|AI|AO|AP, str_E1CD29DE5981C388, "istiyorum ")
+SUBS(AR|AA|AS|AE|AT|AN|AI|AO|AP, str_416DB56108ECB7D5, "basladim ")
+SUBS(AR|RGT|AA|AS|AE|AT|AN|AI|AO|AP, str_87E3C402A0866439, "olmadigini ")
diff --git a/keyboards/gboards/engine/config.h b/keyboards/gboards/engine/config.h
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/gboards/engine/engine.c b/keyboards/gboards/engine/engine.c
new file mode 100644
index 00000000000..9094b7905a6
--- /dev/null
+++ b/keyboards/gboards/engine/engine.c
@@ -0,0 +1,458 @@
+/* This is a stripped down version of the Georgi engine meant for use with
+ * Ginni. As such serial-Steno features are disabled, chords are 16bits and
+ * crap is removed where possible
+ *
+ * Do not use this on anything other then Ginny if you want to be sane
+ */
+#include "engine.h"
+
+// Chord state
+C_SIZE cChord = 0; // Current Chord
+int chordIndex = 0; // Keys in previousachord
+C_SIZE pressed = 0; // number of held keys
+C_SIZE chordState[32]; // Full Chord history
+#define QWERBUF 24 // Size of chords to buffer for output
+
+bool repeatFlag = false; // Should we repeat?
+C_SIZE pChord = 0; // Previous Chord
+C_SIZE stickyBits = 0; // Or'd with every incoming press
+int pChordIndex = 0; // Keys in previousachord
+C_SIZE pChordState[32]; // Previous chord sate
+
+// Key Dicts
+extern const struct keyEntry keyDict[];
+extern const struct comboEntry cmbDict[];
+extern const struct funcEntry funDict[];
+extern const struct stringEntry strDict[];
+extern const struct specialEntry spcDict[];
+extern size_t specialLen;
+extern size_t stringLen;
+extern size_t funcsLen;
+extern size_t keyLen;
+extern size_t comboLen;
+
+// Mode state
+enum MODE { STENO = 0, QWERTY, COMMAND };
+enum MODE pMode;
+enum MODE cMode = QWERTY;
+
+// Command State
+#define MAX_CMD_BUF 20
+uint8_t CMDLEN = 0;
+uint8_t CMDBUF[MAX_CMD_BUF];
+
+// Key Repeat state
+bool inChord = false;
+bool repEngaged = false;
+uint16_t repTimer = 0;
+#define REP_INIT_DELAY 750
+#define REP_DELAY 25
+
+// Mousekeys state
+bool inMouse = false;
+int8_t mousePress;
+
+// All processing done at chordUp goes through here
+void processKeysUp() {
+ // Check for mousekeys, this is release
+#ifdef MOUSEKEY_ENABLE
+ if (inMouse) {
+ inMouse = false;
+ mousekey_off(mousePress);
+ mousekey_send();
+ }
+#endif
+
+ // handle command mode
+ if (cChord == COMMAND_MODE) {
+#ifndef NO_DEBUG
+ uprintf("COMMAND Toggle\n");
+#endif
+ if (cMode != COMMAND) { // Entering Command Mode
+ CMDLEN = 0;
+ pMode = cMode;
+ cMode = COMMAND;
+ } else { // Exiting Command Mode
+ cMode = pMode;
+
+ // Press all and release all
+ for (int i = 0; i < CMDLEN; i++) {
+ register_code(CMDBUF[i]);
+ }
+ clear_keyboard();
+ }
+ }
+
+ // Process and reset state
+ processChord();
+ cChord = pressed;
+ inChord = false;
+ chordIndex = 0;
+ clear_keyboard();
+ repEngaged = false;
+ for (int i = 0; i < 32; i++) chordState[i] = 0xFFFF;
+}
+
+// Update Chord State
+bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
+ // Everything happens in here when steno keys come in.
+ // Bail on keyup
+
+ // Update key repeat timers
+ repTimer = timer_read();
+ bool pr = record->event.pressed;
+ // Switch on the press adding to chord
+ switch (keycode) {
+ ENGINE_CONFIG
+ default:
+ return true;
+ }
+
+ // Handle any postprocessing
+
+ // All keys up, send it!
+ if (inChord && !pr && (pressed & IN_CHORD_MASK) == 0) {
+ processKeysUp();
+ return false;
+ }
+ if (pressed == 0 && !pr) {
+ processKeysUp();
+ return false;
+ }
+
+ cChord |= pressed;
+ cChord = process_engine_post(cChord, keycode, record);
+ inChord = (cChord & IN_CHORD_MASK) != 0;
+
+ // Store previous state for fastQWER
+ if (pr) {
+ chordState[chordIndex] = cChord;
+ chordIndex++;
+ }
+
+#ifndef NO_DEBUG
+ uprintf("Chord: %u\n", cChord);
+#endif
+ return false;
+}
+void matrix_scan_user(void) {
+ // We abuse this for early sending of key
+ // Key repeat only on QWER/SYMB layers
+ if (cMode != QWERTY || !inChord) return;
+
+ // Check timers
+#ifndef NO_HOLD
+ if (!repEngaged && timer_elapsed(repTimer) > REP_INIT_DELAY) {
+ // Process Key for report
+ processChord();
+
+ // Send report to host
+ send_keyboard_report();
+ repEngaged = true;
+ }
+#endif
+};
+
+// Try and match cChord
+C_SIZE mapKeys(C_SIZE chord, bool lookup) {
+ lookup = lookup || repEngaged;
+#ifndef NO_DEBUG
+ if (!lookup) uprint("SENT!\n");
+#endif
+ // Single key chords
+ for (int i = 0; i < keyLen; i++) {
+ if (keyDict[i].chord == chord) {
+ if (!lookup) SEND(keyDict[i].key);
+ return chord;
+ }
+ }
+
+ // strings
+ for (int i = 0; i < stringLen; i++) {
+ struct stringEntry fromPgm;
+ memcpy_P(&fromPgm, &strDict[i], sizeof(stringEntry_t));
+ if (fromPgm.chord == chord) {
+ if (!lookup) {
+ if (get_mods() & (MOD_LSFT | MOD_RSFT)) {
+ set_mods(get_mods() & ~(MOD_LSFT | MOD_RSFT));
+ set_oneshot_mods(MOD_LSFT);
+ }
+ send_string_P((PGM_P)(fromPgm.str));
+ }
+ return chord;
+ }
+ }
+
+ // combos
+ for (int i = 0; i < comboLen; i++) {
+ struct comboEntry fromPgm;
+ memcpy_P(&fromPgm, &cmbDict[i], sizeof(comboEntry_t));
+ if (fromPgm.chord == chord) {
+#ifndef NO_DEBUG
+ uprintf("%d found combo\n", i);
+#endif
+
+ if (!lookup) {
+ uint8_t comboKeys[COMBO_MAX];
+ memcpy_P(&comboKeys, fromPgm.keys, sizeof(uint8_t) * COMBO_MAX);
+ for (int j = 0; j < COMBO_MAX; j++)
+#ifndef NO_DEBUG
+ uprintf("Combo [%u]: %u\n", j, comboKeys[j]);
+#endif
+
+ for (int j = 0; (j < COMBO_MAX) && (comboKeys[j] != COMBO_END); j++) {
+#ifndef NO_DEBUG
+ uprintf("Combo [%u]: %u\n", j, comboKeys[j]);
+#endif
+ SEND(comboKeys[j]);
+ }
+ }
+ return chord;
+ }
+ }
+
+ // functions
+ for (int i = 0; i < funcsLen; i++) {
+ if (funDict[i].chord == chord) {
+ if (!lookup) funDict[i].act();
+ return chord;
+ }
+ }
+
+ // Special handling
+ for (int i = 0; i < specialLen; i++) {
+ if (spcDict[i].chord == chord) {
+ if (!lookup) {
+ uint16_t arg = spcDict[i].arg;
+ switch (spcDict[i].action) {
+ case SPEC_STICKY:
+ SET_STICKY(arg);
+ break;
+ case SPEC_REPEAT:
+ REPEAT();
+ break;
+ case SPEC_CLICK:
+ CLICK_MOUSE((uint8_t)arg);
+ break;
+ case SPEC_SWITCH:
+ SWITCH_LAYER(arg);
+ break;
+ default:
+ SEND_STRING("Invalid Special in Keymap");
+ }
+ }
+ return chord;
+ }
+ }
+
+ if ((chord & IN_CHORD_MASK) && (chord & IN_CHORD_MASK) != chord && mapKeys((chord & IN_CHORD_MASK), true) == (chord & IN_CHORD_MASK)) {
+#ifndef NO_DEBUG
+ uprintf("Try with ignore mask:%u\n", (chord & IN_CHORD_MASK));
+#endif
+ mapKeys((chord & ~IN_CHORD_MASK), lookup);
+ mapKeys((chord & IN_CHORD_MASK), lookup);
+ return chord;
+ }
+#ifndef NO_DEBUG
+ uprintf("Reached end\n");
+#endif
+ return 0;
+}
+// Traverse the chord history to a given point
+// Returns the mask to use
+void processChord(void) {
+ // Save the clean chord state
+ C_SIZE savedChord = cChord;
+
+ // Apply Stick Bits if needed
+ if (stickyBits != 0) {
+ cChord |= stickyBits;
+ for (int i = 0; i <= chordIndex; i++) chordState[i] |= stickyBits;
+ }
+
+ // First we test if a whole chord was passsed
+ // If so we just run it handling repeat logic
+ if (mapKeys(cChord, true) == cChord) {
+ mapKeys(cChord, false);
+ // Repeat logic
+ if (repeatFlag) {
+#ifndef NO_DEBUG
+ uprintf("repeating?\n");
+#endif
+ restoreState();
+ repeatFlag = false;
+ processChord();
+ } else {
+ saveState(cChord);
+ }
+ return;
+ }
+
+ C_SIZE next = process_chord_getnext(cChord);
+ if (next && next != cChord) {
+#ifndef NO_DEBUG
+ uprintf("Trying next candidate: %u\n", next);
+#endif
+ if (mapKeys(next, true) == next) {
+ mapKeys(next, false);
+ // Repeat logic
+ if (repeatFlag) {
+#ifndef NO_DEBUG
+ uprintf("repeating?\n");
+#endif
+ restoreState();
+ repeatFlag = false;
+ processChord();
+ } else {
+ saveState(cChord);
+ }
+ return;
+ }
+ }
+
+#ifndef NO_DEBUG
+ uprintf("made it past the maw\n");
+#endif
+
+ // Iterate through chord picking out the individual
+ // and longest chords
+ C_SIZE bufChords[QWERBUF];
+ int bufLen = 0;
+ C_SIZE mask = 0;
+
+ // We iterate over it multiple times to catch the longest
+ // chord. Then that gets addded to the mask and re run.
+ while (savedChord != mask) {
+ C_SIZE test = 0;
+ C_SIZE longestChord = 0;
+
+ for (int i = 0; i <= chordIndex; i++) {
+ cChord = chordState[i] & ~mask;
+ if (cChord == 0) continue;
+
+ test = mapKeys(cChord, true);
+ if (test != 0) {
+ longestChord = test;
+ }
+ }
+
+ mask |= longestChord;
+ bufChords[bufLen] = longestChord;
+ bufLen++;
+
+ // That's a loop of sorts, halt processing
+ if (bufLen >= QWERBUF) {
+#ifndef NO_DEBUG
+ uprintf("looped. exiting");
+#endif
+ return;
+ }
+ }
+
+ // Now that the buffer is populated, we run it
+ for (int i = 0; i < bufLen; i++) {
+ cChord = bufChords[i];
+#ifndef NO_DEBUG
+ uprintf("sending: %u\n", cChord);
+#endif
+ mapKeys(cChord, false);
+ }
+
+ // Save state in case of repeat
+ if (!repeatFlag) {
+ saveState(savedChord);
+ }
+
+ // Restore cChord for held repeat
+ cChord = savedChord;
+ return;
+}
+void saveState(C_SIZE cleanChord) {
+ pChord = cleanChord;
+ pChordIndex = chordIndex;
+ for (int i = 0; i < 32; i++) pChordState[i] = chordState[i];
+}
+void restoreState() {
+ cChord = pChord;
+ chordIndex = pChordIndex;
+ for (int i = 0; i < 32; i++) chordState[i] = pChordState[i];
+}
+
+// Macros for calling from keymap.c
+void SEND(uint8_t kc) {
+ // Send Keycode, Does not work for Quantum Codes
+ if (cMode == COMMAND && CMDLEN < MAX_CMD_BUF) {
+#ifndef NO_DEBUG
+ uprintf("CMD LEN: %d BUF: %d\n", CMDLEN, MAX_CMD_BUF);
+#endif
+ CMDBUF[CMDLEN] = kc;
+ CMDLEN++;
+ }
+
+ if (cMode != COMMAND) register_code(kc);
+ return;
+}
+void REPEAT(void) {
+ if (cMode != QWERTY) return;
+
+ repeatFlag = true;
+ return;
+}
+void SET_STICKY(C_SIZE stick) {
+ stickyBits ^= stick;
+ return;
+}
+void CLICK_MOUSE(uint8_t kc) {
+#ifdef MOUSEKEY_ENABLE
+ mousekey_on(kc);
+ mousekey_send();
+
+ // Store state for later use
+ inMouse = true;
+ mousePress = kc;
+#endif
+}
+void SWITCH_LAYER(int layer) {
+#ifndef NO_ACTION_LAYER
+ if (keymapsCount >= layer) layer_on(layer);
+#endif
+}
+uint8_t bitpop_v(C_SIZE val) {
+#if C_SIZE == uint8_t
+ return bitpop(val);
+#elif C_SIZE == uint16_t
+ return bitpop16(val);
+#elif C_SIZE == uint32_t
+ return bitpop32(val);
+#elif C_SIZE == uint64_t
+ uint8_t n = 0;
+ if (bits >> 32) {
+ bits >>= 32;
+ n += 32;
+ }
+ if (bits >> 16) {
+ bits >>= 16;
+ n += 16;
+ }
+ if (bits >> 8) {
+ bits >>= 8;
+ n += 8;
+ }
+ if (bits >> 4) {
+ bits >>= 4;
+ n += 4;
+ }
+ if (bits >> 2) {
+ bits >>= 2;
+ n += 2;
+ }
+ if (bits >> 1) {
+ bits >>= 1;
+ n += 1;
+ }
+ return n;
+#else
+# error unsupported C_SIZE
+#endif
+}
+__attribute__((weak)) C_SIZE process_engine_post(C_SIZE cur_chord, uint16_t keycode, keyrecord_t *record) { return cur_chord; }
diff --git a/keyboards/gboards/engine/engine.h b/keyboards/gboards/engine/engine.h
new file mode 100644
index 00000000000..5b9d5b0ecb2
--- /dev/null
+++ b/keyboards/gboards/engine/engine.h
@@ -0,0 +1,104 @@
+/* 2019, g Heavy Industries
+ Blessed mother of Christ, please keep this readable
+ and protect us from segfaults. For thine is the clock,
+ the slave and the master. Until we return from main.
+
+ Amen.
+
+ This is a stripped down version of the Georgi engine meant for use with
+ . As such serial-Steno features are disabled, chords are 16bits and
+ crap is removed where possible
+*/
+
+#include QMK_KEYBOARD_H
+#pragma once
+#include "keymap.h"
+#include
+#include
+#include
+#include "config_engine.h"
+#include
+#include "wait.h"
+
+// Maximum values for combos
+#define COMBO_END 0x00
+
+// In memory chord datatypes
+enum specialActions {
+ SPEC_STICKY,
+ SPEC_REPEAT,
+ SPEC_CLICK,
+ SPEC_SWITCH,
+};
+struct funcEntry {
+ C_SIZE chord;
+ void (*act)(void);
+} funcEntry_t;
+struct stringEntry {
+ C_SIZE chord;
+ PGM_P str;
+} stringEntry_t;
+struct comboEntry {
+ C_SIZE chord;
+ PGM_P keys;
+} comboEntry_t;
+struct keyEntry {
+ C_SIZE chord;
+ uint8_t key;
+} keyEntry_t;
+struct specialEntry {
+ C_SIZE chord;
+ enum specialActions action;
+ uint16_t arg;
+} specialEntry_t;
+
+// Chord Temps
+extern C_SIZE cChord;
+extern C_SIZE test;
+
+// Function defs
+void processKeysUp(void);
+void processChord(void);
+C_SIZE processQwerty(bool lookup);
+C_SIZE processFakeSteno(bool lookup);
+void saveState(C_SIZE cChord);
+void restoreState(void);
+uint8_t bitpop_v(C_SIZE val);
+
+// Macros for use in keymap.c
+void SEND(uint8_t kc);
+void REPEAT(void);
+void SET_STICKY(C_SIZE);
+void SWITCH_LAYER(int);
+void CLICK_MOUSE(uint8_t);
+C_SIZE process_engine_post(C_SIZE cur_chord, uint16_t keycode, keyrecord_t *record);
+C_SIZE process_chord_getnext(C_SIZE cur_chord);
+
+// Keymap helpers
+// New Approach, multiple structures
+#define P_KEYMAP(chord, keycode) {chord, keycode},
+
+#define K_KEYMAP(chord, name, ...) {chord, (PGM_P)&name},
+#define K_ACTION(chord, name, ...) const uint8_t name[] PROGMEM = __VA_ARGS__;
+
+#define S_KEYMAP(chord, name, string) {chord, (PGM_P)&name},
+#define S_ACTION(chord, name, string) const char name[] PROGMEM = string;
+
+#define X_KEYMAP(chord, name, func) {chord, name},
+#define X_ACTION(chord, name, func) \
+ void name(void) { func }
+
+#define Z_KEYMAP(chord, act, arg) {chord, act, arg},
+
+#define TEST_COLLISION(chord, ...) \
+ case chord: \
+ break;
+#define BLANK(...)
+
+// Shift to internal representation
+// i.e) S(teno)R(ight)F
+#define STN(n) ((C_SIZE)1 << n)
+#define ENGINE_HOOK(keycode, chord) \
+ case keycode: \
+ pr ? (pressed |= (chord)) : (pressed &= ~(chord)); \
+ break;
diff --git a/keyboards/gboards/engine/keymap_engine.h b/keyboards/gboards/engine/keymap_engine.h
new file mode 100644
index 00000000000..c8a42a052bf
--- /dev/null
+++ b/keyboards/gboards/engine/keymap_engine.h
@@ -0,0 +1,121 @@
+/* If for some reason you're still here, maybe due to horror, shock or
+ * some other godforsaken reason. Meet X Macros.
+ *
+ * The we abuse the include system to generate data structures that are
+ * used by the internal chording engine. The alternative to this is
+ * using a external generator (Like is done for the ASETNIOP base keymaps)
+ * With this disgusting bodge, you can just edit your .defs and compile!
+ */
+
+// Clear all X Macros
+#define PRES BLANK
+#define KEYS BLANK
+#define SUBS BLANK
+#define EXEC BLANK
+#define SPEC BLANK
+
+// Process single key pushes
+#undef PRES
+#define PRES P_KEYMAP
+const struct keyEntry keyDict[] = {
+#include "dicts.def"
+};
+#undef PRES
+#define PRES BLANK
+
+// Process Combos
+#undef KEYS
+#define KEYS K_ACTION
+#include "dicts.def"
+#undef KEYS
+#define KEYS BLANK
+
+#undef KEYS
+#define KEYS K_KEYMAP
+const struct comboEntry PROGMEM cmbDict[] = {
+#include "dicts.def"
+};
+#undef KEYS
+#define KEYS BLANK
+
+// Process String stubs
+#undef SUBS
+#define SUBS S_ACTION
+#include "dicts.def"
+#undef SUBS
+#define SUBS BLANK
+
+// Generate dict for strings
+#undef SUBS
+#define SUBS S_KEYMAP
+const struct stringEntry PROGMEM strDict[] = {
+#include "dicts.def"
+};
+#undef SUBS
+#define SUBS BLANK
+
+// Generate function stubs
+#undef EXEC
+#define EXEC X_ACTION
+#include "dicts.def"
+#undef EXEC
+#define EXEC BLANK
+
+// Process the function structure
+#undef EXEC
+#define EXEC X_KEYMAP
+const struct funcEntry funDict[] = {
+#include "dicts.def"
+};
+#undef EXEC
+#define EXEC BLANK
+
+// Handle Special calls
+#undef SPEC
+#define SPEC Z_KEYMAP
+const struct specialEntry spcDict[] = {
+#include "dicts.def"
+};
+#undef SPEC
+#define SPEC BLANK
+
+// Test for collisions!
+// Switch statement will explode on duplicate
+// chords. This will be optimized out
+#undef PRES
+#undef KEYS
+#undef SUBS
+#undef EXEC
+#undef SPEC
+#define PRES TEST_COLLISION
+#define KEYS TEST_COLLISION
+#define SUBS TEST_COLLISION
+#define EXEC TEST_COLLISION
+#define SPEC TEST_COLLISION
+void testCollisions(void) {
+ C_SIZE bomb = 0;
+ switch (bomb) {
+#include "dicts.def"
+ }
+}
+
+// Test for unexpected input
+// Should return blank lines for all valid input
+#undef PRES
+#undef KEYS
+#undef SUBS
+#undef EXEC
+#undef SPEC
+#define PRES BLANK
+#define KEYS BLANK
+#define SUBS BLANK
+#define EXEC BLANK
+#define SPEC BLANK
+#include "dicts.def"
+
+// Get size data back into the engine
+size_t funcsLen = sizeof(funDict) / sizeof(funDict[0]);
+size_t stringLen = sizeof(strDict) / sizeof(strDict[0]);
+size_t keyLen = sizeof(keyDict) / sizeof(keyDict[0]);
+size_t comboLen = sizeof(cmbDict) / sizeof(cmbDict[0]);
+size_t specialLen = sizeof(spcDict) / sizeof(spcDict[0]);
diff --git a/keyboards/gboards/engine/rules.mk b/keyboards/gboards/engine/rules.mk
new file mode 100644
index 00000000000..186f59386d7
--- /dev/null
+++ b/keyboards/gboards/engine/rules.mk
@@ -0,0 +1 @@
+SRC += engine.c
diff --git a/keyboards/gboards/g/config_default.h b/keyboards/gboards/g/config_default.h
new file mode 100644
index 00000000000..821c2c4ad59
--- /dev/null
+++ b/keyboards/gboards/g/config_default.h
@@ -0,0 +1,90 @@
+#include "engine.h"
+
+// Configuration options for the engine
+
+#define C_SIZE uint64_t // type for chord
+#define COMBO_MAX 4 // Longest Combo
+
+// Key Aliases, must fit within C_SIZE!
+// These are for Ginni + Asetniop
+#define GQ STN(0)
+#define GW STN(1)
+#define GE STN(2)
+#define GR STN(3)
+#define GT STN(4)
+#define GY STN(5)
+#define GU STN(6)
+#define GI STN(7)
+#define GO STN(8)
+#define GP STN(9)
+
+#define GA STN(10)
+#define GS STN(11)
+#define GD STN(12)
+#define GF STN(13)
+#define GG STN(14)
+#define GH STN(15)
+#define GJ STN(16)
+#define GK STN(17)
+#define GL STN(18)
+#define GCL STN(19)
+
+#define GZ STN(20)
+#define GX STN(21)
+#define GC STN(22)
+#define GV STN(23)
+#define GB STN(24)
+#define GN STN(25)
+#define GM STN(26)
+#define GLT STN(27)
+#define GGT STN(28)
+#define GQU STN(29)
+
+#define GL1 STN(30)
+#define GL2 STN(31)
+#define GL3 STN(32)
+#define GR3 STN(33)
+#define GR2 STN(34)
+#define GR1 STN(35)
+
+// Chord to start buffering strokes
+#define COMMAND_MODE (GL1 | GR1)
+
+// Mapping of QMK Keycodes to chord positions
+#define ENGINE_CONFIG \
+ ENGINE_HOOK(KC_Q, GQ) \
+ ENGINE_HOOK(KC_W, GW) \
+ ENGINE_HOOK(KC_E, GE) \
+ ENGINE_HOOK(KC_R, GR) \
+ ENGINE_HOOK(KC_T, GT) \
+ ENGINE_HOOK(KC_Y, GY) \
+ ENGINE_HOOK(KC_U, GU) \
+ ENGINE_HOOK(KC_I, GI) \
+ ENGINE_HOOK(KC_O, GO) \
+ ENGINE_HOOK(KC_P, GP) \
+ ENGINE_HOOK(KC_A, GA) \
+ ENGINE_HOOK(KC_S, GS) \
+ ENGINE_HOOK(KC_D, GD) \
+ ENGINE_HOOK(KC_F, GF) \
+ ENGINE_HOOK(KC_G, GG) \
+ ENGINE_HOOK(KC_H, GH) \
+ ENGINE_HOOK(KC_J, GJ) \
+ ENGINE_HOOK(KC_K, GK) \
+ ENGINE_HOOK(KC_L, GL) \
+ ENGINE_HOOK(KC_SCLN, GCL) \
+ ENGINE_HOOK(KC_Z, GZ) \
+ ENGINE_HOOK(KC_X, GX) \
+ ENGINE_HOOK(KC_C, GC) \
+ ENGINE_HOOK(KC_V, GV) \
+ ENGINE_HOOK(KC_B, GB) \
+ ENGINE_HOOK(KC_N, GN) \
+ ENGINE_HOOK(KC_M, GM) \
+ ENGINE_HOOK(KC_COMM, GLT) \
+ ENGINE_HOOK(KC_DOT, GGT) \
+ ENGINE_HOOK(KC_SLSH, GQU) \
+ ENGINE_HOOK(KC_F1, GL1) \
+ ENGINE_HOOK(KC_F2, GL2) \
+ ENGINE_HOOK(KC_F3, GL3) \
+ ENGINE_HOOK(KC_F4, GR3) \
+ ENGINE_HOOK(KC_F5, GR2) \
+ ENGINE_HOOK(KC_F6, GR1)
diff --git a/keyboards/gboards/g/engine.c b/keyboards/gboards/g/engine.c
new file mode 100644
index 00000000000..015b48d38ff
--- /dev/null
+++ b/keyboards/gboards/g/engine.c
@@ -0,0 +1,470 @@
+/* This is a stripped down version of the Georgi engine meant for use with
+ * Ginni. As such serial-Steno features are disabled, chords are 16bits and
+ * crap is removed where possible
+ *
+ * Do not use this on anything other then Ginny if you want to be sane
+ */
+#include "engine.h"
+
+// Chord state
+C_SIZE cChord = 0; // Current Chord
+int chordIndex = 0; // Keys in previousachord
+C_SIZE pressed = 0; // number of held keys
+C_SIZE chordState[32]; // Full Chord history
+#define QWERBUF 24 // Size of chords to buffer for output
+
+bool repeatFlag = false; // Should we repeat?
+C_SIZE pChord = 0; // Previous Chord
+C_SIZE stickyBits = 0; // Or'd with every incoming press
+int pChordIndex = 0; // Keys in previousachord
+C_SIZE pChordState[32]; // Previous chord sate
+
+// Key Dicts
+extern const struct keyEntry keyDict[];
+extern const struct comboEntry cmbDict[];
+extern const struct funcEntry funDict[];
+extern const struct stringEntry strDict[];
+extern const struct specialEntry spcDict[];
+extern size_t specialLen;
+extern size_t stringLen;
+extern size_t funcsLen;
+extern size_t keyLen;
+extern size_t comboLen;
+
+// Mode state
+enum MODE { STENO = 0, QWERTY, COMMAND };
+enum MODE pMode;
+enum MODE cMode = QWERTY;
+
+// Command State
+#define MAX_CMD_BUF 20
+uint8_t CMDLEN = 0;
+uint8_t CMDBUF[MAX_CMD_BUF];
+
+// Key Repeat state
+bool inChord = false;
+bool repEngaged = false;
+uint16_t repTimer = 0;
+#define REP_INIT_DELAY 750
+#define REP_DELAY 25
+
+// Mousekeys state
+bool inMouse = false;
+int8_t mousePress;
+
+// All processing done at chordUp goes through here
+void processKeysUp() {
+ // Check for mousekeys, this is release
+#ifdef MOUSEKEY_ENABLE
+ if (inMouse) {
+ inMouse = false;
+ mousekey_off(mousePress);
+ mousekey_send();
+ }
+#endif
+
+ // handle command mode
+#ifdef COMMAND_MODE
+ if (cChord == COMMAND_MODE) {
+# ifndef NO_DEBUG
+ uprintf("COMMAND Toggle\n");
+# endif
+ if (cMode != COMMAND) { // Entering Command Mode
+ CMDLEN = 0;
+ pMode = cMode;
+ cMode = COMMAND;
+ } else { // Exiting Command Mode
+ cMode = pMode;
+
+ // Press all and release all
+ for (int i = 0; i < CMDLEN; i++) {
+ register_code(CMDBUF[i]);
+ }
+ clear_keyboard();
+ }
+ }
+#endif
+
+ // Process and reset state
+ processChord();
+ cChord = pressed;
+ inChord = false;
+ chordIndex = 0;
+ clear_keyboard();
+ repEngaged = false;
+ for (int i = 0; i < 32; i++) chordState[i] = 0xFFFF;
+}
+
+// Update Chord State
+bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
+ // Check if we should run at all
+ if (process_engine_pre(cChord, keycode, record) == false) return true;
+
+ // Everything happens in here when steno keys come in.
+ // Bail on keyup
+
+ // Update key repeat timers
+ repTimer = timer_read();
+ bool pr = record->event.pressed;
+ // Switch on the press adding to chord
+ switch (keycode) {
+ ENGINE_CONFIG
+ default:
+ return true;
+ }
+
+ // Handle any postprocessing
+
+ // All keys up, send it!
+ if (inChord && !pr && (pressed & IN_CHORD_MASK) == 0) {
+ processKeysUp();
+ return false;
+ }
+ if (pressed == 0 && !pr) {
+ processKeysUp();
+ return false;
+ }
+
+ cChord |= pressed;
+ cChord = process_engine_post(cChord, keycode, record);
+ inChord = (cChord & IN_CHORD_MASK) != 0;
+
+ // Store previous state for fastQWER
+ if (pr) {
+ chordState[chordIndex] = cChord;
+ chordIndex++;
+ }
+
+#ifndef NO_DEBUG
+ uprintf("Chord: %u\n", cChord);
+#endif
+ return false;
+}
+void matrix_scan_user(void) {
+ // We abuse this for early sending of key
+ // Key repeat only on QWER/SYMB layers
+ if (cMode != QWERTY || !inChord) return;
+
+ // Check timers
+#ifndef NO_HOLD
+ if (!repEngaged && timer_elapsed(repTimer) > REP_INIT_DELAY) {
+ // Process Key for report
+ processChord();
+
+ // Send report to host
+ send_keyboard_report();
+ repEngaged = true;
+ }
+#endif
+};
+
+// Try and match cChord
+C_SIZE mapKeys(C_SIZE chord, bool lookup) {
+ lookup = lookup || repEngaged;
+#ifndef NO_DEBUG
+ if (!lookup) uprint("SENT!\n");
+#endif
+ // Single key chords
+ for (int i = 0; i < keyLen; i++) {
+ if (keyDict[i].chord == chord) {
+ if (!lookup) SEND(keyDict[i].key);
+ return chord;
+ }
+ }
+
+ // strings
+ for (int i = 0; i < stringLen; i++) {
+ struct stringEntry fromPgm;
+ memcpy_P(&fromPgm, &strDict[i], sizeof(stringEntry_t));
+ if (fromPgm.chord == chord) {
+ if (!lookup) {
+ if (get_mods() & (MOD_LSFT | MOD_RSFT)) {
+ set_mods(get_mods() & ~(MOD_LSFT | MOD_RSFT));
+ set_oneshot_mods(MOD_LSFT);
+ }
+ send_string_P((PGM_P)(fromPgm.str));
+ }
+ return chord;
+ }
+ }
+
+ // combos
+ for (int i = 0; i < comboLen; i++) {
+ struct comboEntry fromPgm;
+ memcpy_P(&fromPgm, &cmbDict[i], sizeof(comboEntry_t));
+ if (fromPgm.chord == chord) {
+#ifndef NO_DEBUG
+ uprintf("%d found combo\n", i);
+#endif
+
+ if (!lookup) {
+ uint8_t comboKeys[COMBO_MAX];
+ memcpy_P(&comboKeys, fromPgm.keys, sizeof(uint8_t) * COMBO_MAX);
+ for (int j = 0; j < COMBO_MAX; j++)
+#ifndef NO_DEBUG
+ uprintf("Combo [%u]: %u\n", j, comboKeys[j]);
+#endif
+
+ for (int j = 0; (j < COMBO_MAX) && (comboKeys[j] != COMBO_END); j++) {
+#ifndef NO_DEBUG
+ uprintf("Combo [%u]: %u\n", j, comboKeys[j]);
+#endif
+ SEND(comboKeys[j]);
+ }
+ }
+ return chord;
+ }
+ }
+
+ // functions
+ for (int i = 0; i < funcsLen; i++) {
+ if (funDict[i].chord == chord) {
+ if (!lookup) funDict[i].act();
+ return chord;
+ }
+ }
+
+ // Special handling
+ for (int i = 0; i < specialLen; i++) {
+ if (spcDict[i].chord == chord) {
+ if (!lookup) {
+ uint16_t arg = spcDict[i].arg;
+ switch (spcDict[i].action) {
+ case SPEC_STICKY:
+ SET_STICKY(arg);
+ break;
+ case SPEC_REPEAT:
+ REPEAT();
+ break;
+ case SPEC_CLICK:
+ CLICK_MOUSE((uint8_t)arg);
+ break;
+ case SPEC_SWITCH:
+ SWITCH_LAYER(arg);
+ break;
+ default:
+ SEND_STRING("Invalid Special in Keymap");
+ }
+ }
+ return chord;
+ }
+ }
+
+ if ((chord & IN_CHORD_MASK) && (chord & IN_CHORD_MASK) != chord && mapKeys((chord & IN_CHORD_MASK), true) == (chord & IN_CHORD_MASK)) {
+#ifndef NO_DEBUG
+ uprintf("Try with ignore mask:%u\n", (chord & IN_CHORD_MASK));
+#endif
+ mapKeys((chord & ~IN_CHORD_MASK), lookup);
+ mapKeys((chord & IN_CHORD_MASK), lookup);
+ return chord;
+ }
+#ifndef NO_DEBUG
+ uprintf("Reached end\n");
+#endif
+ return 0;
+}
+// Traverse the chord history to a given point
+// Returns the mask to use
+void processChord(void) {
+ // Save the clean chord state
+ C_SIZE savedChord = cChord;
+
+ // Apply Stick Bits if needed
+ if (stickyBits != 0) {
+ cChord |= stickyBits;
+ for (int i = 0; i <= chordIndex; i++) chordState[i] |= stickyBits;
+ }
+
+ // First we test if a whole chord was passsed
+ // If so we just run it handling repeat logic
+ if (mapKeys(cChord, true) == cChord) {
+ mapKeys(cChord, false);
+ // Repeat logic
+ if (repeatFlag) {
+#ifndef NO_DEBUG
+ uprintf("repeating?\n");
+#endif
+ restoreState();
+ repeatFlag = false;
+ processChord();
+ } else {
+ saveState(cChord);
+ }
+ return;
+ }
+
+ C_SIZE next = process_chord_getnext(cChord);
+ if (next && next != cChord) {
+#ifndef NO_DEBUG
+ uprintf("Trying next candidate: %u\n", next);
+#endif
+ if (mapKeys(next, true) == next) {
+ mapKeys(next, false);
+ // Repeat logic
+ if (repeatFlag) {
+#ifndef NO_DEBUG
+ uprintf("repeating?\n");
+#endif
+ restoreState();
+ repeatFlag = false;
+ processChord();
+ } else {
+ saveState(cChord);
+ }
+ return;
+ }
+ }
+
+#ifndef NO_DEBUG
+ uprintf("made it past the maw\n");
+#endif
+
+ // Iterate through chord picking out the individual
+ // and longest chords
+ C_SIZE bufChords[QWERBUF];
+ int bufLen = 0;
+ C_SIZE mask = 0;
+
+ // We iterate over it multiple times to catch the longest
+ // chord. Then that gets addded to the mask and re run.
+ while (savedChord != mask) {
+ C_SIZE test = 0;
+ C_SIZE longestChord = 0;
+
+ for (int i = 0; i <= chordIndex; i++) {
+ cChord = chordState[i] & ~mask;
+ if (cChord == 0) continue;
+
+ test = mapKeys(cChord, true);
+ if (test != 0) {
+ longestChord = test;
+ }
+ }
+
+ mask |= longestChord;
+ bufChords[bufLen] = longestChord;
+ bufLen++;
+
+ // That's a loop of sorts, halt processing
+ if (bufLen >= QWERBUF) {
+#ifndef NO_DEBUG
+ uprintf("looped. exiting");
+#endif
+ return;
+ }
+ }
+
+ // Now that the buffer is populated, we run it
+ for (int i = 0; i < bufLen; i++) {
+ cChord = bufChords[i];
+#ifndef NO_DEBUG
+ uprintf("sending: %u\n", cChord);
+#endif
+ mapKeys(cChord, false);
+ }
+
+ // Save state in case of repeat
+ if (!repeatFlag) {
+ saveState(savedChord);
+ }
+
+ // Restore cChord for held repeat
+ cChord = savedChord;
+ return;
+}
+void saveState(C_SIZE cleanChord) {
+ pChord = cleanChord;
+ pChordIndex = chordIndex;
+ for (int i = 0; i < 32; i++) pChordState[i] = chordState[i];
+}
+void restoreState() {
+ cChord = pChord;
+ chordIndex = pChordIndex;
+ for (int i = 0; i < 32; i++) chordState[i] = pChordState[i];
+}
+
+// Macros for calling from keymap.c
+void SEND(uint8_t kc) {
+ // Send Keycode, Does not work for Quantum Codes
+ if (cMode == COMMAND && CMDLEN < MAX_CMD_BUF) {
+#ifndef NO_DEBUG
+ uprintf("CMD LEN: %d BUF: %d\n", CMDLEN, MAX_CMD_BUF);
+#endif
+ CMDBUF[CMDLEN] = kc;
+ CMDLEN++;
+ }
+
+ if (cMode != COMMAND) register_code(kc);
+ return;
+}
+void REPEAT(void) {
+ if (cMode != QWERTY) return;
+
+ repeatFlag = true;
+ return;
+}
+void SET_STICKY(C_SIZE stick) {
+ stickyBits ^= stick;
+ return;
+}
+void CLICK_MOUSE(uint8_t kc) {
+#ifdef MOUSEKEY_ENABLE
+ mousekey_on(kc);
+ mousekey_send();
+
+ // Store state for later use
+ inMouse = true;
+ mousePress = kc;
+#endif
+}
+void SWITCH_LAYER(int layer) {
+#ifndef NO_ACTION_LAYER
+ if (keymapsCount >= layer) {
+ layer_clear();
+ layer_on(layer);
+ }
+#endif
+}
+uint8_t bitpop_v(C_SIZE val) {
+#if C_SIZE == uint8_t
+ return bitpop(val);
+#elif C_SIZE == uint16_t
+ return bitpop16(val);
+#elif C_SIZE == uint32_t
+ return bitpop32(val);
+#elif C_SIZE == uint64_t
+ uint8_t n = 0;
+ if (bits >> 32) {
+ bits >>= 32;
+ n += 32;
+ }
+ if (bits >> 16) {
+ bits >>= 16;
+ n += 16;
+ }
+ if (bits >> 8) {
+ bits >>= 8;
+ n += 8;
+ }
+ if (bits >> 4) {
+ bits >>= 4;
+ n += 4;
+ }
+ if (bits >> 2) {
+ bits >>= 2;
+ n += 2;
+ }
+ if (bits >> 1) {
+ bits >>= 1;
+ n += 1;
+ }
+ return n;
+#else
+# error unsupported C_SIZE
+#endif
+}
+
+// See engine.h for what these hooks do
+__attribute__((weak)) C_SIZE process_engine_post(C_SIZE cur_chord, uint16_t keycode, keyrecord_t *record) { return cur_chord; }
+__attribute__((weak)) C_SIZE process_engine_pre(C_SIZE cur_chord, uint16_t keycode, keyrecord_t *record) { return true; }
+__attribute__((weak)) C_SIZE process_chord_getnext(C_SIZE cur_chord) { return 0; }
diff --git a/keyboards/gboards/g/engine.h b/keyboards/gboards/g/engine.h
new file mode 100644
index 00000000000..547ea09fdd2
--- /dev/null
+++ b/keyboards/gboards/g/engine.h
@@ -0,0 +1,117 @@
+/* 2019, g Heavy Industries
+ Blessed mother of Christ, please keep this readable
+ and protect us from segfaults. For thine is the clock,
+ the slave and the master. Until we return from main.
+
+ Amen.
+
+ This is a stripped down version of the Georgi engine meant for use with
+ . As such serial-Steno features are disabled, chords are 16bits and
+ crap is removed where possible
+*/
+
+#include QMK_KEYBOARD_H
+#pragma once
+#include "keymap.h"
+#include
+#include
+#include
+#include "config_engine.h"
+#include
+#include "wait.h"
+#ifdef MOUSEKEY_ENABLE
+# include "mousekey.h"
+#endif
+
+// Set defaults
+#ifndef IN_CHORD_MASK
+# define IN_CHORD_MASK 0xFFFFFFFFFFFFFFFF
+#endif
+
+#ifndef COMBO_END
+# define COMBO_END 0x00
+#endif
+
+// In memory chord datatypes
+enum specialActions {
+ SPEC_STICKY,
+ SPEC_REPEAT,
+ SPEC_CLICK,
+ SPEC_SWITCH,
+};
+struct funcEntry {
+ C_SIZE chord;
+ void (*act)(void);
+} funcEntry_t;
+struct stringEntry {
+ C_SIZE chord;
+ PGM_P str;
+} stringEntry_t;
+struct comboEntry {
+ C_SIZE chord;
+ PGM_P keys;
+} comboEntry_t;
+struct keyEntry {
+ C_SIZE chord;
+ uint8_t key;
+} keyEntry_t;
+struct specialEntry {
+ C_SIZE chord;
+ enum specialActions action;
+ uint16_t arg;
+} specialEntry_t;
+
+// Chord Temps
+extern C_SIZE cChord;
+extern C_SIZE test;
+extern size_t keymapsCount; // Total keymaps (exported from keymap.c)
+
+// Function defs
+void processKeysUp(void);
+void processChord(void);
+C_SIZE processQwerty(bool lookup);
+C_SIZE processFakeSteno(bool lookup);
+void saveState(C_SIZE cChord);
+void restoreState(void);
+uint8_t bitpop_v(C_SIZE val);
+
+// Macros for use in keymap.c
+void SEND(uint8_t kc);
+void REPEAT(void);
+void SET_STICKY(C_SIZE);
+void SWITCH_LAYER(int);
+void CLICK_MOUSE(uint8_t);
+C_SIZE process_chord_getnext(C_SIZE cur_chord);
+// Run before hitting the engine. Return false to skip engine processing
+C_SIZE process_engine_pre(C_SIZE cur_chord, uint16_t keycode, keyrecord_t *record);
+// Run after reading a chord.
+C_SIZE process_engine_post(C_SIZE cur_chord, uint16_t keycode, keyrecord_t *record);
+
+// Keymap helpers
+// New Approach, multiple structures
+#define P_KEYMAP(chord, keycode) {chord, keycode},
+
+#define K_KEYMAP(chord, name, ...) {chord, (PGM_P)&name},
+#define K_ACTION(chord, name, ...) const uint8_t name[] PROGMEM = __VA_ARGS__;
+
+#define S_KEYMAP(chord, name, string) {chord, (PGM_P)&name},
+#define S_ACTION(chord, name, string) const char name[] PROGMEM = string;
+
+#define X_KEYMAP(chord, name, func) {chord, name},
+#define X_ACTION(chord, name, func) \
+ void name(void) { func }
+
+#define Z_KEYMAP(chord, act, arg) {chord, act, arg},
+
+#define TEST_COLLISION(chord, ...) \
+ case chord: \
+ break;
+#define BLANK(...)
+
+// Shift to internal representation
+// i.e) S(teno)R(ight)F
+#define STN(n) ((C_SIZE)1 << n)
+#define ENGINE_HOOK(keycode, chord) \
+ case keycode: \
+ pr ? (pressed |= (chord)) : (pressed &= ~(chord)); \
+ break;
diff --git a/keyboards/gboards/g/keymap_combo.h b/keyboards/gboards/g/keymap_combo.h
new file mode 100644
index 00000000000..674d3356cc8
--- /dev/null
+++ b/keyboards/gboards/g/keymap_combo.h
@@ -0,0 +1,56 @@
+// Keymap helpers
+
+#define K_ENUM(name, key, ...) name,
+#define K_DATA(name, key, ...) const uint16_t PROGMEM cmb_##name[] = {__VA_ARGS__, COMBO_END};
+#define K_COMB(name, key, ...) [name] = COMBO(cmb_##name, key),
+
+#define A_ENUM(name, string, ...) name,
+#define A_DATA(name, string, ...) const uint16_t PROGMEM cmb_##name[] = {__VA_ARGS__, COMBO_END};
+#define A_COMB(name, string, ...) [name] = COMBO_ACTION(cmb_##name),
+#define A_ACTI(name, string, ...) \
+ case name: \
+ if (pressed) SEND_STRING(string); \
+ break;
+#define BLANK(...)
+
+// Generate data needed for combos/actions
+// Create Enum
+#undef COMB
+#undef SUBS
+#define COMB K_ENUM
+#define SUBS A_ENUM
+enum combos {
+#include "combos.def"
+};
+
+// Bake combos into mem
+#undef COMB
+#undef SUBS
+#define COMB K_DATA
+#define SUBS A_DATA
+#include "combos.def"
+#undef COMB
+#undef SUBS
+
+// Fill combo array
+#define COMB K_COMB
+#define SUBS A_COMB
+combo_t key_combos[] = {
+#include "combos.def"
+};
+#undef COMB
+#undef SUBS
+
+// Export length to combo module
+int COMBO_LEN = sizeof(key_combos) / sizeof(key_combos[0]);
+
+// Fill QMK hook
+#define COMB BLANK
+#define SUBS A_ACTI
+void process_combo_event(uint8_t combo_index, bool pressed) {
+ switch (combo_index) {
+#include "combos.def"
+ }
+}
+#undef COMB
+#undef SUBS
diff --git a/keyboards/gboards/g/keymap_engine.h b/keyboards/gboards/g/keymap_engine.h
new file mode 100644
index 00000000000..93a4423340f
--- /dev/null
+++ b/keyboards/gboards/g/keymap_engine.h
@@ -0,0 +1,122 @@
+/* If for some reason you're still here, maybe due to horror, shock or
+ * some other godforsaken reason. Meet X Macros.
+ *
+ * The we abuse the include system to generate data structures that are
+ * used by the internal chording engine. The alternative to this is
+ * using a external generator (Like is done for the ASETNIOP base keymaps)
+ * With this disgusting bodge, you can just edit your .defs and compile!
+ */
+#include "g/engine.h"
+
+// Clear all X Macros
+#define PRES BLANK
+#define KEYS BLANK
+#define SUBS BLANK
+#define EXEC BLANK
+#define SPEC BLANK
+
+// Process single key pushes
+#undef PRES
+#define PRES P_KEYMAP
+const struct keyEntry keyDict[] = {
+#include "dicts.def"
+};
+#undef PRES
+#define PRES BLANK
+
+// Process Combos
+#undef KEYS
+#define KEYS K_ACTION
+#include "dicts.def"
+#undef KEYS
+#define KEYS BLANK
+
+#undef KEYS
+#define KEYS K_KEYMAP
+const struct comboEntry PROGMEM cmbDict[] = {
+#include "dicts.def"
+};
+#undef KEYS
+#define KEYS BLANK
+
+// Process String stubs
+#undef SUBS
+#define SUBS S_ACTION
+#include "dicts.def"
+#undef SUBS
+#define SUBS BLANK
+
+// Generate dict for strings
+#undef SUBS
+#define SUBS S_KEYMAP
+const struct stringEntry PROGMEM strDict[] = {
+#include "dicts.def"
+};
+#undef SUBS
+#define SUBS BLANK
+
+// Generate function stubs
+#undef EXEC
+#define EXEC X_ACTION
+#include "dicts.def"
+#undef EXEC
+#define EXEC BLANK
+
+// Process the function structure
+#undef EXEC
+#define EXEC X_KEYMAP
+const struct funcEntry funDict[] = {
+#include "dicts.def"
+};
+#undef EXEC
+#define EXEC BLANK
+
+// Handle Special calls
+#undef SPEC
+#define SPEC Z_KEYMAP
+const struct specialEntry spcDict[] = {
+#include "dicts.def"
+};
+#undef SPEC
+#define SPEC BLANK
+
+// Test for collisions!
+// Switch statement will explode on duplicate
+// chords. This will be optimized out
+#undef PRES
+#undef KEYS
+#undef SUBS
+#undef EXEC
+#undef SPEC
+#define PRES TEST_COLLISION
+#define KEYS TEST_COLLISION
+#define SUBS TEST_COLLISION
+#define EXEC TEST_COLLISION
+#define SPEC TEST_COLLISION
+void testCollisions(void) {
+ C_SIZE bomb = 0;
+ switch (bomb) {
+#include "dicts.def"
+ }
+}
+
+// Test for unexpected input
+// Should return blank lines for all valid input
+#undef PRES
+#undef KEYS
+#undef SUBS
+#undef EXEC
+#undef SPEC
+#define PRES BLANK
+#define KEYS BLANK
+#define SUBS BLANK
+#define EXEC BLANK
+#define SPEC BLANK
+#include "dicts.def"
+
+// Get size data back into the engine
+size_t funcsLen = sizeof(funDict) / sizeof(funDict[0]);
+size_t stringLen = sizeof(strDict) / sizeof(strDict[0]);
+size_t keyLen = sizeof(keyDict) / sizeof(keyDict[0]);
+size_t comboLen = sizeof(cmbDict) / sizeof(cmbDict[0]);
+size_t specialLen = sizeof(spcDict) / sizeof(spcDict[0]);
diff --git a/keyboards/gboards/g/rules.mk b/keyboards/gboards/g/rules.mk
new file mode 100644
index 00000000000..186f59386d7
--- /dev/null
+++ b/keyboards/gboards/g/rules.mk
@@ -0,0 +1 @@
+SRC += engine.c
diff --git a/keyboards/gboards/readme.md b/keyboards/gboards/readme.md
new file mode 100644
index 00000000000..743bacbcc15
--- /dev/null
+++ b/keyboards/gboards/readme.md
@@ -0,0 +1,39 @@
+# gBoards Monorepo
+
+Ever wanted to do some crazy stuff with combos or onboard steno? Here's a big repo for you to include into your
+keymaps. You may need to do some configuration on your part, for the documentation hit up [docs.gboards.ca](http://docs.gboards.ca/)
+
+## Building
+
+You can find all of my keyboards under the k/ folder. Make with
+
+`make gboards/k/gergoplex:default:flash` or similar
+
+## Configuration
+Dictionaries are layered ontop of each other at compile time, you specify these in dicts.def and combos.def respectively.
+This system allows the easy integration of other users combos and a simple way to break out combos by functionality.
+
+If you have a cool dictionary, please submit a PR against the respective directory!
+
+## Combos
+This is a set of dicts that templates macros ontop of QMK. Use this for augmenting your current setup with
+multi-chords! You can browse the available combo lists in combos/
+
+
+## Engine
+This is the onboard chording engine for all sorts of fun shenanigans. Be aware that this currently is a bit of a QMK
+replacement focused on pure chording. Take a look at the configuration in keyboards/ginny for ideas, all these dicts
+are stored over in dicts/
+
+## Installation
+You will need to add the following bits to your rules.mk, refer to keyboards/ginny for a working example
+`VPATH += keyboards/gboards/`
+
+And if you're using the chording engine, this as well.
+`SRC += g/engine.c `
+
+For combos, add `#include "g/keymap_combos.h"` to keymap.c to compile your combos.def into your keymap
+
+For the chording engine, add `#include "g/keymap_engine.h"` to keymap.c compile your dicts.def into your keymap. If you
+don't have a config_engine.h file for your keyboard, you will need to create it. (Once again, look at keyboards/ginny/
+for a example of how to do this.
diff --git a/keyboards/georgi/keymaps/dennytom/README.md b/keyboards/georgi/keymaps/dennytom/README.md
new file mode 100644
index 00000000000..14bc1d2045e
--- /dev/null
+++ b/keyboards/georgi/keymaps/dennytom/README.md
@@ -0,0 +1,11 @@
+# # Dennytom's Georgi Layout
+
+This keymap is using a custom chording engine. Head out to my (DennyTom) user space to find the source files and details.
+
+To make a real keymap from the JSON file, run
+
+```sh
+python3 parser.py keymap_def.json keymap.c
+```
+
+Likely will change with use. I enjoy the modifiers on the "home row".
\ No newline at end of file
diff --git a/keyboards/georgi/keymaps/dennytom/keymap.c b/keyboards/georgi/keymaps/dennytom/keymap.c
new file mode 100644
index 00000000000..2e019177457
--- /dev/null
+++ b/keyboards/georgi/keymaps/dennytom/keymap.c
@@ -0,0 +1,1208 @@
+#include QMK_KEYBOARD_H
+
+#define H_TOP1 ((HASH_TYPE) 1 << 0)
+#define H_TOP2 ((HASH_TYPE) 1 << 1)
+#define H_TOP3 ((HASH_TYPE) 1 << 2)
+#define H_TOP4 ((HASH_TYPE) 1 << 3)
+#define H_TOP5 ((HASH_TYPE) 1 << 4)
+#define H_TOP6 ((HASH_TYPE) 1 << 5)
+#define H_TOP7 ((HASH_TYPE) 1 << 6)
+#define H_TOP8 ((HASH_TYPE) 1 << 7)
+#define H_TOP9 ((HASH_TYPE) 1 << 8)
+#define H_TOP10 ((HASH_TYPE) 1 << 9)
+#define H_TOP11 ((HASH_TYPE) 1 << 10)
+#define H_TOP12 ((HASH_TYPE) 1 << 11)
+#define H_BOT1 ((HASH_TYPE) 1 << 12)
+#define H_BOT2 ((HASH_TYPE) 1 << 13)
+#define H_BOT3 ((HASH_TYPE) 1 << 14)
+#define H_BOT4 ((HASH_TYPE) 1 << 15)
+#define H_BOT5 ((HASH_TYPE) 1 << 16)
+#define H_BOT6 ((HASH_TYPE) 1 << 17)
+#define H_BOT7 ((HASH_TYPE) 1 << 18)
+#define H_BOT8 ((HASH_TYPE) 1 << 19)
+#define H_BOT9 ((HASH_TYPE) 1 << 20)
+#define H_BOT10 ((HASH_TYPE) 1 << 21)
+#define H_BOT11 ((HASH_TYPE) 1 << 22)
+#define H_BOT12 ((HASH_TYPE) 1 << 23)
+#define H_THU1 ((HASH_TYPE) 1 << 24)
+#define H_THU2 ((HASH_TYPE) 1 << 25)
+#define H_THU3 ((HASH_TYPE) 1 << 26)
+#define H_THU4 ((HASH_TYPE) 1 << 27)
+#define H_THU5 ((HASH_TYPE) 1 << 28)
+#define H_THU6 ((HASH_TYPE) 1 << 29)
+
+enum internal_keycodes {
+ TOP1 = SAFE_RANGE,
+ TOP2, TOP3, TOP4, TOP5, TOP6, TOP7, TOP8, TOP9, TOP10, TOP11, TOP12, BOT1, BOT2, BOT3, BOT4, BOT5, BOT6, BOT7, BOT8, BOT9, BOT10, BOT11, BOT12, THU1, THU2, THU3, THU4, THU5, THU6,
+ FIRST_INTERNAL_KEYCODE = TOP1,
+ LAST_INTERNAL_KEYCODE = THU6
+};
+
+enum pseudolayers {
+ ALWAYS_ON, QWERTY, NUM, FNC, NAV, MOUSE
+};
+
+#define CHORD_TIMEOUT 100
+#define DANCE_TIMEOUT 200
+#define LEADER_TIMEOUT 750
+#define TAP_TIMEOUT 50
+#define LONG_PRESS_MULTIPLIER 3
+#define DYNAMIC_MACRO_MAX_LENGTH 20
+#define COMMAND_MAX_LENGTH 5
+#define STRING_MAX_LENGTH 16
+#define LEADER_MAX_LENGTH 5
+#define HASH_TYPE uint32_t
+#define NUMBER_OF_KEYS 30
+#define DEFAULT_PSEUDOLAYER QWERTY
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_georgi(TOP1, TOP2, TOP3, TOP4, TOP5, TOP6, TOP7, TOP8, TOP9, TOP10, TOP11, TOP12, BOT1, BOT2, BOT3, BOT4, BOT5, BOT6, BOT7, BOT8, BOT9, BOT10, BOT11, BOT12, THU1, THU2, THU3, THU4, THU5, THU6),
+};
+size_t keymapsCount = 1;
+
+uint8_t keycodes_buffer_array[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+uint8_t command_buffer[] = {
+ 0, 0, 0, 0, 0
+};
+
+uint16_t leader_buffer[] = {
+ 0, 0, 0, 0, 0
+};
+
+uint8_t dynamic_macro_buffer[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+enum chord_states {
+ IDLE,
+ READY,
+ ACTIVATED,
+ DEACTIVATED,
+ PRESS_FROM_ACTIVE,
+ FINISHED_FROM_ACTIVE,
+ IDLE_IN_DANCE,
+ READY_IN_DANCE,
+ FINISHED,
+ LOCKED,
+ READY_LOCKED,
+ RESTART,
+ IN_ONE_SHOT
+};
+
+struct Chord {
+ uint32_t keycodes_hash;
+ uint8_t pseudolayer;
+ uint8_t* state;
+ uint8_t* counter;
+ uint16_t value1;
+ uint8_t value2;
+ void (*function) (const struct Chord*);
+};
+
+uint8_t current_pseudolayer = DEFAULT_PSEUDOLAYER;
+bool lock_next = false;
+uint16_t chord_timer = 0;
+uint16_t dance_timer = 0;
+bool autoshift_mode = true;
+uint8_t keycode_index = 0;
+uint8_t command_mode = 0;
+uint8_t command_ind = 0;
+bool in_leader_mode = false;
+uint8_t leader_ind = 0;
+uint16_t leader_timer = 0;
+uint8_t dynamic_macro_mode = false;
+uint8_t dynamic_macro_ind = 0;
+bool a_key_went_through = false;
+struct Chord* last_chord = NULL;
+
+bool handle_US_ANSI_shifted_keys(int16_t keycode, bool in) {
+ bool is_US_ANSI_shifted = true;
+
+ int16_t regular_keycode = KC_NO;
+ switch (keycode) {
+ case KC_TILDE:
+ regular_keycode = KC_GRAVE;
+ break;
+ case KC_EXCLAIM:
+ regular_keycode = KC_1;
+ break;
+ case KC_AT:
+ regular_keycode = KC_2;
+ break;
+ case KC_HASH:
+ regular_keycode = KC_3;
+ break;
+ case KC_DOLLAR:
+ regular_keycode = KC_4;
+ break;
+ case KC_PERCENT:
+ regular_keycode = KC_5;
+ break;
+ case KC_CIRCUMFLEX:
+ regular_keycode = KC_6;
+ break;
+ case KC_AMPERSAND:
+ regular_keycode = KC_7;
+ break;
+ case KC_ASTERISK:
+ regular_keycode = KC_8;
+ break;
+ case KC_LEFT_PAREN:
+ regular_keycode = KC_9;
+ break;
+ case KC_RIGHT_PAREN:
+ regular_keycode = KC_0;
+ break;
+ case KC_UNDERSCORE:
+ regular_keycode = KC_MINUS;
+ break;
+ case KC_PLUS:
+ regular_keycode = KC_EQUAL;
+ break;
+ case KC_LEFT_CURLY_BRACE:
+ regular_keycode = KC_LBRACKET;
+ break;
+ case KC_RIGHT_CURLY_BRACE:
+ regular_keycode = KC_RBRACKET;
+ break;
+ case KC_PIPE:
+ regular_keycode = KC_BSLASH;
+ break;
+ case KC_COLON:
+ regular_keycode = KC_SCOLON;
+ break;
+ case KC_DOUBLE_QUOTE:
+ regular_keycode = KC_QUOTE;
+ break;
+ case KC_LEFT_ANGLE_BRACKET:
+ regular_keycode = KC_COMMA;
+ break;
+ case KC_RIGHT_ANGLE_BRACKET:
+ regular_keycode = KC_DOT;
+ break;
+ case KC_QUESTION:
+ regular_keycode = KC_SLASH;
+ break;
+ default:
+ is_US_ANSI_shifted = false;
+ }
+ if (is_US_ANSI_shifted) {
+ if (in) {
+ register_code(KC_LSFT);
+ register_code(regular_keycode);
+ } else {
+ unregister_code(regular_keycode);
+ unregister_code(KC_LSFT);
+ }
+ }
+ return is_US_ANSI_shifted;
+}
+
+void key_in(int16_t keycode) {
+ if (command_mode == 1 && command_ind < COMMAND_MAX_LENGTH) {
+ command_buffer[command_ind] = keycode;
+ command_ind++;
+ a_key_went_through = true;
+ } else if (in_leader_mode && leader_ind < LEADER_MAX_LENGTH) {
+ leader_buffer[leader_ind] = keycode;
+ leader_ind++;
+ a_key_went_through = true;
+ } else if (dynamic_macro_mode && dynamic_macro_ind < DYNAMIC_MACRO_MAX_LENGTH) {
+ dynamic_macro_buffer[dynamic_macro_ind] = keycode;
+ dynamic_macro_ind++;
+ a_key_went_through = true;
+ } else {
+ if (!handle_US_ANSI_shifted_keys(keycode, true)) {
+ register_code(keycode);
+ }
+ send_keyboard_report();
+ a_key_went_through = true;
+ }
+}
+
+void key_out(int16_t keycode) {
+ if (command_mode == 0) {
+ if (!handle_US_ANSI_shifted_keys(keycode, false)) {
+ if (command_mode == 0 && in_leader_mode == false && dynamic_macro_mode == false) {
+ unregister_code(keycode);
+ }
+ }
+ send_keyboard_report();
+ }
+}
+
+void tap_key(int16_t keycode) {
+ key_in(keycode);
+ wait_ms(TAP_TIMEOUT);
+ key_out(keycode);
+}
+const char * const strings[] PROGMEM = {
+
+};
+void single_dance(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ key_in(self->value1);
+ break;
+ case DEACTIVATED:
+ key_out(self->value1);
+ *self->state = IDLE;
+ break;
+ case RESTART:
+ key_out(self->value1);
+ break;
+ default:
+ break;
+ }
+}
+
+void key_layer_dance(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ current_pseudolayer = self->value2;
+ a_key_went_through = false;
+ break;
+ case DEACTIVATED:
+ case RESTART:
+ if (!a_key_went_through) {
+ tap_key(self->value1);
+ }
+ current_pseudolayer = self->pseudolayer;
+ *self->state = IDLE; // does not have effect if the state was RESTART
+ break;
+ default:
+ break;
+ }
+}
+
+void key_mod_dance(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ key_in(self->value2);
+ a_key_went_through = false;
+ break;
+ case DEACTIVATED:
+ case RESTART:
+ key_out(self->value2);
+ if (!a_key_went_through) {
+ tap_key(self->value1);
+ }
+ *self->state = IDLE; // does not have effect if the state was RESTART
+ break;
+ default:
+ break;
+ }
+}
+
+void key_key_dance(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ break;
+ case DEACTIVATED:
+ tap_key(self->value1);
+ *self->state = IDLE;
+ break;
+ case FINISHED:
+ case PRESS_FROM_ACTIVE:
+ key_in(self->value2);
+ break;
+ case RESTART:
+ key_out(self->value2);
+ break;
+ default:
+ break;
+ }
+}
+
+void autoshift_dance_impl(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ *self->counter = 0;
+ break;
+ case DEACTIVATED:
+ case RESTART:
+ tap_key(self->value1);
+ *self->state = IDLE;
+ break;
+ case FINISHED_FROM_ACTIVE:
+ if (*self->counter == (LONG_PRESS_MULTIPLIER - 2)) {
+ key_in(KC_LSFT);
+ tap_key(self->value1);
+ key_out(KC_LSFT);
+ *self->state = IDLE;
+ // the skip to IDLE is usually just a lag optimization,
+ // in this case it has a logic function, on a short
+ // press (still longer than a tap) the key does not get shifted
+ } else {
+ *self->counter += 1;
+ *self->state = PRESS_FROM_ACTIVE;
+ dance_timer = timer_read();
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void autoshift_dance(const struct Chord* self) {
+ if (autoshift_mode) {
+ autoshift_dance_impl(self);
+ } else {
+ single_dance(self);
+ }
+}
+
+void autoshift_toggle(const struct Chord* self){
+ if (*self->state == ACTIVATED) {
+ autoshift_mode = !autoshift_mode;
+ *self->state = IDLE;
+ }
+}
+
+void temp_pseudolayer(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ current_pseudolayer = self->value1;
+ break;
+ case DEACTIVATED:
+ current_pseudolayer = self->pseudolayer;
+ *self->state = IDLE;
+ break;
+ case RESTART:
+ current_pseudolayer = self->pseudolayer;
+ break;
+ default:
+ break;
+ }
+}
+
+void temp_pseudolayer_alt(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ current_pseudolayer = self->value1;
+ break;
+ case DEACTIVATED:
+ current_pseudolayer = self->value2;
+ *self->state = IDLE;
+ break;
+ case RESTART:
+ current_pseudolayer = self->value2;
+ break;
+ default:
+ break;
+ }
+}
+
+void perm_pseudolayer(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ current_pseudolayer = self->value1;
+ *self->state = IDLE;
+ }
+}
+
+void switch_layer(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ layer_move(self->value1);
+ *self->state = IDLE;
+ }
+}
+
+void lock(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ lock_next = true;
+ *self->state = IDLE;
+ }
+}
+
+void one_shot_key(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ break;
+ case DEACTIVATED:
+ key_in(self->value1);
+ *self->state = IN_ONE_SHOT;
+ break;
+ case FINISHED:
+ case PRESS_FROM_ACTIVE:
+ key_in(self->value1);
+ a_key_went_through = false;
+ break;
+ case RESTART:
+ if (a_key_went_through) {
+ key_out(self->value1);
+ } else {
+ *self->state = IN_ONE_SHOT;
+ }
+ default:
+ break;
+ }
+}
+
+void one_shot_layer(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ break;
+ case DEACTIVATED:
+ current_pseudolayer = self->value1;
+ *self->state = IN_ONE_SHOT;
+ break;
+ case FINISHED:
+ case PRESS_FROM_ACTIVE:
+ current_pseudolayer = self->value1;
+ a_key_went_through = false;
+ break;
+ case RESTART:
+ if (a_key_went_through) {
+ current_pseudolayer = self->pseudolayer;
+ } else {
+ *self->state = IN_ONE_SHOT;
+ }
+ default:
+ break;
+ }
+}
+
+void command(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ command_mode++;
+ *self->state = IDLE;
+ }
+}
+
+bool identical(uint16_t* buffer1, uint16_t* buffer2) {
+ bool same = true;
+ for (int i = 0; i < LEADER_MAX_LENGTH; i++) {
+ same = same && (buffer1[i] == buffer2[i]);
+ }
+ return same;
+}
+
+void leader(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ in_leader_mode = true;
+ *self->state = IDLE;
+ }
+}
+
+void dynamic_macro_record(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ for (int i = 0; i < DYNAMIC_MACRO_MAX_LENGTH; i++) {
+ dynamic_macro_buffer[i] = 0;
+ }
+ dynamic_macro_mode = true;
+ *self->state = IDLE;
+ }
+}
+
+void dynamic_macro_next(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ if (dynamic_macro_mode && dynamic_macro_ind < DYNAMIC_MACRO_MAX_LENGTH) {
+ dynamic_macro_buffer[dynamic_macro_ind] = 0;
+ dynamic_macro_ind++;
+ }
+ *self->state = IDLE;
+ }
+}
+
+void dynamic_macro_end(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ if (dynamic_macro_mode) {
+ dynamic_macro_mode = false;
+ }
+ *self->state = IDLE;
+ }
+}
+
+void dynamic_macro_play(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ int ind_start = 0;
+ while (ind_start < DYNAMIC_MACRO_MAX_LENGTH) {
+ for (int i = ind_start; i < DYNAMIC_MACRO_MAX_LENGTH; i++) {
+ if (dynamic_macro_buffer[i] == 0) {
+ break;
+ }
+ register_code(dynamic_macro_buffer[i]);
+ }
+ send_keyboard_report();
+ wait_ms(TAP_TIMEOUT);
+ for (int i = ind_start; i < DYNAMIC_MACRO_MAX_LENGTH; i++) {
+ if (dynamic_macro_buffer[i] == 0) {
+ ind_start = i + 1;
+ break;
+ }
+ unregister_code(dynamic_macro_buffer[i]);
+ }
+ send_keyboard_report();
+ }
+ *self->state = IDLE;
+ }
+}
+
+void string_in(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ char buffer[STRING_MAX_LENGTH];
+ strcpy_P(buffer, (char*)pgm_read_word(&(strings[self->value1])));
+ send_string(buffer);
+ }
+}
+
+void clear(const struct Chord* self);
+
+void reset_keyboard_kb(void){
+#ifdef WATCHDOG_ENABLE
+ MCUSR = 0;
+ wdt_disable();
+ wdt_reset();
+#endif
+ reset_keyboard();
+}
+
+void reset(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ reset_keyboard_kb();
+ }
+}
+
+uint8_t state_0 = IDLE;
+const struct Chord chord_0 PROGMEM = {H_TOP1 + H_TOP12 + H_BOT1 + H_BOT12, ALWAYS_ON, &state_0, NULL, 0, 0, clear};
+uint8_t state_1 = IDLE;
+const struct Chord chord_1 PROGMEM = {H_TOP6 + H_TOP7 + H_BOT6 + H_BOT7, ALWAYS_ON, &state_1, NULL, 0, 0, command};
+uint8_t state_2 = IDLE;
+const struct Chord chord_2 PROGMEM = {H_TOP1, QWERTY, &state_2, NULL, KC_ESC, 0, single_dance};
+uint8_t state_3 = IDLE;
+const struct Chord chord_3 PROGMEM = {H_TOP2, QWERTY, &state_3, NULL, KC_Q, 0, single_dance};
+uint8_t state_4 = IDLE;
+const struct Chord chord_4 PROGMEM = {H_TOP3, QWERTY, &state_4, NULL, KC_W, 0, single_dance};
+uint8_t state_5 = IDLE;
+const struct Chord chord_5 PROGMEM = {H_TOP4, QWERTY, &state_5, NULL, KC_E, 0, single_dance};
+uint8_t state_6 = IDLE;
+const struct Chord chord_6 PROGMEM = {H_TOP5, QWERTY, &state_6, NULL, KC_R, 0, single_dance};
+uint8_t state_7 = IDLE;
+const struct Chord chord_7 PROGMEM = {H_TOP6, QWERTY, &state_7, NULL, KC_T, 0, single_dance};
+uint8_t state_8 = IDLE;
+const struct Chord chord_8 PROGMEM = {H_TOP7, QWERTY, &state_8, NULL, KC_Y, 0, single_dance};
+uint8_t state_9 = IDLE;
+const struct Chord chord_9 PROGMEM = {H_TOP8, QWERTY, &state_9, NULL, KC_U, 0, single_dance};
+uint8_t state_10 = IDLE;
+const struct Chord chord_10 PROGMEM = {H_TOP9, QWERTY, &state_10, NULL, KC_I, 0, single_dance};
+uint8_t state_11 = IDLE;
+const struct Chord chord_11 PROGMEM = {H_TOP10, QWERTY, &state_11, NULL, KC_O, 0, single_dance};
+uint8_t state_12 = IDLE;
+const struct Chord chord_12 PROGMEM = {H_TOP11, QWERTY, &state_12, NULL, KC_P, 0, single_dance};
+uint8_t state_13 = IDLE;
+const struct Chord chord_13 PROGMEM = {H_TOP12, QWERTY, &state_13, NULL, KC_BSLASH, 0, single_dance};
+uint8_t state_14 = IDLE;
+const struct Chord chord_14 PROGMEM = {H_TOP1 + H_BOT1, QWERTY, &state_14, NULL, KC_INS, 0, single_dance};
+uint8_t state_15 = IDLE;
+const struct Chord chord_15 PROGMEM = {H_TOP2 + H_BOT2, QWERTY, &state_15, NULL, KC_A, 0, single_dance};
+uint8_t state_16 = IDLE;
+uint8_t counter_16 = 0;
+const struct Chord chord_16 PROGMEM = {H_TOP3 + H_BOT3, QWERTY, &state_16, &counter_16, KC_S, KC_LALT, key_key_dance};
+uint8_t state_17 = IDLE;
+const struct Chord chord_17 PROGMEM = {H_TOP4 + H_BOT4, QWERTY, &state_17, NULL, KC_D, KC_LCTL, key_mod_dance};
+uint8_t state_18 = IDLE;
+const struct Chord chord_18 PROGMEM = {H_TOP5 + H_BOT5, QWERTY, &state_18, NULL, KC_F, KC_LSFT, key_mod_dance};
+uint8_t state_19 = IDLE;
+uint8_t counter_19 = 0;
+const struct Chord chord_19 PROGMEM = {H_TOP6 + H_BOT6, QWERTY, &state_19, &counter_19, KC_G, KC_LGUI, key_key_dance};
+uint8_t state_20 = IDLE;
+uint8_t counter_20 = 0;
+const struct Chord chord_20 PROGMEM = {H_TOP7 + H_BOT7, QWERTY, &state_20, &counter_20, KC_H, KC_RGUI, key_key_dance};
+uint8_t state_21 = IDLE;
+const struct Chord chord_21 PROGMEM = {H_TOP8 + H_BOT8, QWERTY, &state_21, NULL, KC_J, KC_RSFT, key_mod_dance};
+uint8_t state_22 = IDLE;
+const struct Chord chord_22 PROGMEM = {H_TOP9 + H_BOT9, QWERTY, &state_22, NULL, KC_K, KC_RCTL, key_mod_dance};
+uint8_t state_23 = IDLE;
+uint8_t counter_23 = 0;
+const struct Chord chord_23 PROGMEM = {H_TOP10 + H_BOT10, QWERTY, &state_23, &counter_23, KC_L, KC_RALT, key_key_dance};
+uint8_t state_24 = IDLE;
+const struct Chord chord_24 PROGMEM = {H_TOP11 + H_BOT11, QWERTY, &state_24, NULL, KC_SCOLON, 0, single_dance};
+uint8_t state_25 = IDLE;
+const struct Chord chord_25 PROGMEM = {H_BOT1, QWERTY, &state_25, NULL, KC_TAB, 0, single_dance};
+uint8_t state_26 = IDLE;
+const struct Chord chord_26 PROGMEM = {H_BOT2, QWERTY, &state_26, NULL, KC_Z, 0, single_dance};
+uint8_t state_27 = IDLE;
+const struct Chord chord_27 PROGMEM = {H_BOT3, QWERTY, &state_27, NULL, KC_X, 0, single_dance};
+uint8_t state_28 = IDLE;
+const struct Chord chord_28 PROGMEM = {H_BOT4, QWERTY, &state_28, NULL, KC_C, 0, single_dance};
+uint8_t state_29 = IDLE;
+const struct Chord chord_29 PROGMEM = {H_BOT5, QWERTY, &state_29, NULL, KC_V, 0, single_dance};
+uint8_t state_30 = IDLE;
+const struct Chord chord_30 PROGMEM = {H_BOT6, QWERTY, &state_30, NULL, KC_B, 0, single_dance};
+uint8_t state_31 = IDLE;
+const struct Chord chord_31 PROGMEM = {H_BOT7, QWERTY, &state_31, NULL, KC_N, 0, single_dance};
+uint8_t state_32 = IDLE;
+const struct Chord chord_32 PROGMEM = {H_BOT8, QWERTY, &state_32, NULL, KC_M, 0, single_dance};
+uint8_t state_33 = IDLE;
+const struct Chord chord_33 PROGMEM = {H_BOT9, QWERTY, &state_33, NULL, KC_COMMA, 0, single_dance};
+uint8_t state_34 = IDLE;
+const struct Chord chord_34 PROGMEM = {H_BOT10, QWERTY, &state_34, NULL, KC_DOT, 0, single_dance};
+uint8_t state_35 = IDLE;
+const struct Chord chord_35 PROGMEM = {H_BOT11, QWERTY, &state_35, NULL, KC_SLASH, 0, single_dance};
+uint8_t state_36 = IDLE;
+const struct Chord chord_36 PROGMEM = {H_BOT12, QWERTY, &state_36, NULL, KC_QUOTE, 0, single_dance};
+uint8_t state_37 = IDLE;
+const struct Chord chord_37 PROGMEM = {H_THU1, QWERTY, &state_37, NULL, KC_ENTER, 0, single_dance};
+uint8_t state_38 = IDLE;
+uint8_t counter_38 = 0;
+const struct Chord chord_38 PROGMEM = {H_THU2, QWERTY, &state_38, &counter_38, KC_SPC, NUM, key_layer_dance};
+uint8_t state_39 = IDLE;
+uint8_t counter_39 = 0;
+const struct Chord chord_39 PROGMEM = {H_THU3, QWERTY, &state_39, &counter_39, KC_BSPC, NAV, key_layer_dance};
+uint8_t state_40 = IDLE;
+const struct Chord chord_40 PROGMEM = {H_THU4, QWERTY, &state_40, NULL, KC_DEL, 0, single_dance};
+uint8_t state_41 = IDLE;
+uint8_t counter_41 = 0;
+const struct Chord chord_41 PROGMEM = {H_THU5, QWERTY, &state_41, &counter_41, KC_SPC, FNC, key_layer_dance};
+uint8_t state_42 = IDLE;
+const struct Chord chord_42 PROGMEM = {H_THU6, QWERTY, &state_42, NULL, KC_ENTER, 0, single_dance};
+uint8_t state_43 = IDLE;
+const struct Chord chord_43 PROGMEM = {H_THU2 + H_THU3, QWERTY, &state_43, NULL, MOUSE, 0, temp_pseudolayer};
+uint8_t state_44 = IDLE;
+const struct Chord chord_44 PROGMEM = {H_TOP1, NUM, &state_44, NULL, KC_GRAVE, 0, single_dance};
+uint8_t state_45 = IDLE;
+const struct Chord chord_45 PROGMEM = {H_TOP2, NUM, &state_45, NULL, KC_1, 0, single_dance};
+uint8_t state_46 = IDLE;
+const struct Chord chord_46 PROGMEM = {H_TOP3, NUM, &state_46, NULL, KC_2, 0, single_dance};
+uint8_t state_47 = IDLE;
+const struct Chord chord_47 PROGMEM = {H_TOP4, NUM, &state_47, NULL, KC_3, 0, single_dance};
+uint8_t state_48 = IDLE;
+const struct Chord chord_48 PROGMEM = {H_TOP5, NUM, &state_48, NULL, KC_4, 0, single_dance};
+uint8_t state_49 = IDLE;
+const struct Chord chord_49 PROGMEM = {H_TOP6, NUM, &state_49, NULL, KC_5, 0, single_dance};
+uint8_t state_50 = IDLE;
+const struct Chord chord_50 PROGMEM = {H_TOP7, NUM, &state_50, NULL, KC_6, 0, single_dance};
+uint8_t state_51 = IDLE;
+const struct Chord chord_51 PROGMEM = {H_TOP8, NUM, &state_51, NULL, KC_7, 0, single_dance};
+uint8_t state_52 = IDLE;
+const struct Chord chord_52 PROGMEM = {H_TOP9, NUM, &state_52, NULL, KC_8, 0, single_dance};
+uint8_t state_53 = IDLE;
+const struct Chord chord_53 PROGMEM = {H_TOP10, NUM, &state_53, NULL, KC_9, 0, single_dance};
+uint8_t state_54 = IDLE;
+const struct Chord chord_54 PROGMEM = {H_TOP11, NUM, &state_54, NULL, KC_0, 0, single_dance};
+uint8_t state_55 = IDLE;
+const struct Chord chord_55 PROGMEM = {H_TOP12, NUM, &state_55, NULL, KC_MINUS, 0, single_dance};
+uint8_t state_56 = IDLE;
+const struct Chord chord_56 PROGMEM = {H_TOP3 + H_BOT3, NUM, &state_56, NULL, KC_LALT, 0, single_dance};
+uint8_t state_57 = IDLE;
+const struct Chord chord_57 PROGMEM = {H_TOP4 + H_BOT4, NUM, &state_57, NULL, KC_LCTL, 0, single_dance};
+uint8_t state_58 = IDLE;
+const struct Chord chord_58 PROGMEM = {H_TOP5 + H_BOT5, NUM, &state_58, NULL, KC_LSFT, 0, single_dance};
+uint8_t state_59 = IDLE;
+const struct Chord chord_59 PROGMEM = {H_TOP6 + H_BOT6, NUM, &state_59, NULL, KC_LGUI, 0, single_dance};
+uint8_t state_60 = IDLE;
+const struct Chord chord_60 PROGMEM = {H_TOP7 + H_BOT7, NUM, &state_60, NULL, KC_RGUI, 0, single_dance};
+uint8_t state_61 = IDLE;
+const struct Chord chord_61 PROGMEM = {H_TOP8 + H_BOT8, NUM, &state_61, NULL, KC_RSFT, 0, single_dance};
+uint8_t state_62 = IDLE;
+const struct Chord chord_62 PROGMEM = {H_TOP9 + H_BOT9, NUM, &state_62, NULL, KC_RCTL, 0, single_dance};
+uint8_t state_63 = IDLE;
+const struct Chord chord_63 PROGMEM = {H_TOP10 + H_BOT10, NUM, &state_63, NULL, KC_RALT, 0, single_dance};
+uint8_t state_64 = IDLE;
+const struct Chord chord_64 PROGMEM = {H_BOT12, NUM, &state_64, NULL, KC_EQUAL, 0, single_dance};
+uint8_t state_65 = IDLE;
+const struct Chord chord_65 PROGMEM = {H_TOP2, FNC, &state_65, NULL, KC_F1, 0, single_dance};
+uint8_t state_66 = IDLE;
+const struct Chord chord_66 PROGMEM = {H_TOP3, FNC, &state_66, NULL, KC_F2, 0, single_dance};
+uint8_t state_67 = IDLE;
+const struct Chord chord_67 PROGMEM = {H_TOP4, FNC, &state_67, NULL, KC_F3, 0, single_dance};
+uint8_t state_68 = IDLE;
+const struct Chord chord_68 PROGMEM = {H_TOP5, FNC, &state_68, NULL, KC_F4, 0, single_dance};
+uint8_t state_69 = IDLE;
+const struct Chord chord_69 PROGMEM = {H_TOP6, FNC, &state_69, NULL, KC_F5, 0, single_dance};
+uint8_t state_70 = IDLE;
+const struct Chord chord_70 PROGMEM = {H_TOP7, FNC, &state_70, NULL, KC_F6, 0, single_dance};
+uint8_t state_71 = IDLE;
+const struct Chord chord_71 PROGMEM = {H_TOP8, FNC, &state_71, NULL, KC_F7, 0, single_dance};
+uint8_t state_72 = IDLE;
+const struct Chord chord_72 PROGMEM = {H_TOP9, FNC, &state_72, NULL, KC_F8, 0, single_dance};
+uint8_t state_73 = IDLE;
+const struct Chord chord_73 PROGMEM = {H_TOP10, FNC, &state_73, NULL, KC_F9, 0, single_dance};
+uint8_t state_74 = IDLE;
+const struct Chord chord_74 PROGMEM = {H_TOP11, FNC, &state_74, NULL, KC_F10, 0, single_dance};
+uint8_t state_75 = IDLE;
+const struct Chord chord_75 PROGMEM = {H_TOP12, FNC, &state_75, NULL, KC_F11, 0, single_dance};
+uint8_t state_76 = IDLE;
+const struct Chord chord_76 PROGMEM = {H_TOP3 + H_BOT3, FNC, &state_76, NULL, KC_LALT, 0, single_dance};
+uint8_t state_77 = IDLE;
+const struct Chord chord_77 PROGMEM = {H_TOP4 + H_BOT4, FNC, &state_77, NULL, KC_LCTL, 0, single_dance};
+uint8_t state_78 = IDLE;
+const struct Chord chord_78 PROGMEM = {H_TOP5 + H_BOT5, FNC, &state_78, NULL, KC_LSFT, 0, single_dance};
+uint8_t state_79 = IDLE;
+const struct Chord chord_79 PROGMEM = {H_TOP6 + H_BOT6, FNC, &state_79, NULL, KC_LGUI, 0, single_dance};
+uint8_t state_80 = IDLE;
+const struct Chord chord_80 PROGMEM = {H_TOP7 + H_BOT7, FNC, &state_80, NULL, KC_RGUI, 0, single_dance};
+uint8_t state_81 = IDLE;
+const struct Chord chord_81 PROGMEM = {H_TOP8 + H_BOT8, FNC, &state_81, NULL, KC_RSFT, 0, single_dance};
+uint8_t state_82 = IDLE;
+const struct Chord chord_82 PROGMEM = {H_TOP9 + H_BOT9, FNC, &state_82, NULL, KC_RCTL, 0, single_dance};
+uint8_t state_83 = IDLE;
+const struct Chord chord_83 PROGMEM = {H_TOP10 + H_BOT10, FNC, &state_83, NULL, KC_RALT, 0, single_dance};
+uint8_t state_84 = IDLE;
+const struct Chord chord_84 PROGMEM = {H_BOT12, FNC, &state_84, NULL, KC_F12, 0, single_dance};
+uint8_t state_85 = IDLE;
+const struct Chord chord_85 PROGMEM = {H_TOP8, NAV, &state_85, NULL, KC_HOME, 0, single_dance};
+uint8_t state_86 = IDLE;
+const struct Chord chord_86 PROGMEM = {H_TOP9, NAV, &state_86, NULL, KC_UP, 0, single_dance};
+uint8_t state_87 = IDLE;
+const struct Chord chord_87 PROGMEM = {H_TOP10, NAV, &state_87, NULL, KC_END, 0, single_dance};
+uint8_t state_88 = IDLE;
+const struct Chord chord_88 PROGMEM = {H_TOP11, NAV, &state_88, NULL, KC_PGUP, 0, single_dance};
+uint8_t state_89 = IDLE;
+const struct Chord chord_89 PROGMEM = {H_TOP3 + H_BOT3, NAV, &state_89, NULL, KC_LALT, 0, single_dance};
+uint8_t state_90 = IDLE;
+const struct Chord chord_90 PROGMEM = {H_TOP4 + H_BOT4, NAV, &state_90, NULL, KC_LCTL, 0, single_dance};
+uint8_t state_91 = IDLE;
+const struct Chord chord_91 PROGMEM = {H_TOP5 + H_BOT5, NAV, &state_91, NULL, KC_LSFT, 0, single_dance};
+uint8_t state_92 = IDLE;
+const struct Chord chord_92 PROGMEM = {H_TOP6 + H_BOT6, NAV, &state_92, NULL, KC_LGUI, 0, single_dance};
+uint8_t state_93 = IDLE;
+const struct Chord chord_93 PROGMEM = {H_BOT8, NAV, &state_93, NULL, KC_LEFT, 0, single_dance};
+uint8_t state_94 = IDLE;
+const struct Chord chord_94 PROGMEM = {H_BOT9, NAV, &state_94, NULL, KC_DOWN, 0, single_dance};
+uint8_t state_95 = IDLE;
+const struct Chord chord_95 PROGMEM = {H_BOT10, NAV, &state_95, NULL, KC_RIGHT, 0, single_dance};
+uint8_t state_96 = IDLE;
+const struct Chord chord_96 PROGMEM = {H_BOT11, NAV, &state_96, NULL, KC_PGDN, 0, single_dance};
+uint8_t state_97 = IDLE;
+const struct Chord chord_97 PROGMEM = {H_TOP8, MOUSE, &state_97, NULL, KC_BTN1, 0, single_dance};
+uint8_t state_98 = IDLE;
+const struct Chord chord_98 PROGMEM = {H_TOP9, MOUSE, &state_98, NULL, KC_MS_U, 0, single_dance};
+uint8_t state_99 = IDLE;
+const struct Chord chord_99 PROGMEM = {H_TOP10, MOUSE, &state_99, NULL, KC_BTN2, 0, single_dance};
+uint8_t state_100 = IDLE;
+const struct Chord chord_100 PROGMEM = {H_TOP11, MOUSE, &state_100, NULL, KC_WH_U, 0, single_dance};
+uint8_t state_101 = IDLE;
+const struct Chord chord_101 PROGMEM = {H_TOP3 + H_BOT3, MOUSE, &state_101, NULL, KC_LALT, 0, single_dance};
+uint8_t state_102 = IDLE;
+const struct Chord chord_102 PROGMEM = {H_TOP4 + H_BOT4, MOUSE, &state_102, NULL, KC_LCTL, 0, single_dance};
+uint8_t state_103 = IDLE;
+const struct Chord chord_103 PROGMEM = {H_TOP5 + H_BOT5, MOUSE, &state_103, NULL, KC_LSFT, 0, single_dance};
+uint8_t state_104 = IDLE;
+const struct Chord chord_104 PROGMEM = {H_TOP6 + H_BOT6, MOUSE, &state_104, NULL, KC_LGUI, 0, single_dance};
+uint8_t state_105 = IDLE;
+const struct Chord chord_105 PROGMEM = {H_BOT8, MOUSE, &state_105, NULL, KC_MS_L, 0, single_dance};
+uint8_t state_106 = IDLE;
+const struct Chord chord_106 PROGMEM = {H_BOT9, MOUSE, &state_106, NULL, KC_MS_D, 0, single_dance};
+uint8_t state_107 = IDLE;
+const struct Chord chord_107 PROGMEM = {H_BOT10, MOUSE, &state_107, NULL, KC_MS_R, 0, single_dance};
+uint8_t state_108 = IDLE;
+const struct Chord chord_108 PROGMEM = {H_BOT11, MOUSE, &state_108, NULL, KC_WH_D, 0, single_dance};
+
+const struct Chord* const list_of_chords[] PROGMEM = {
+ &chord_0, &chord_1, &chord_2, &chord_3, &chord_4, &chord_5, &chord_6, &chord_7, &chord_8, &chord_9, &chord_10, &chord_11, &chord_12, &chord_13, &chord_14, &chord_15, &chord_16, &chord_17, &chord_18, &chord_19, &chord_20, &chord_21, &chord_22, &chord_23, &chord_24, &chord_25, &chord_26, &chord_27, &chord_28, &chord_29, &chord_30, &chord_31, &chord_32, &chord_33, &chord_34, &chord_35, &chord_36, &chord_37, &chord_38, &chord_39, &chord_40, &chord_41, &chord_42, &chord_43, &chord_44, &chord_45, &chord_46, &chord_47, &chord_48, &chord_49, &chord_50, &chord_51, &chord_52, &chord_53, &chord_54, &chord_55, &chord_56, &chord_57, &chord_58, &chord_59, &chord_60, &chord_61, &chord_62, &chord_63, &chord_64, &chord_65, &chord_66, &chord_67, &chord_68, &chord_69, &chord_70, &chord_71, &chord_72, &chord_73, &chord_74, &chord_75, &chord_76, &chord_77, &chord_78, &chord_79, &chord_80, &chord_81, &chord_82, &chord_83, &chord_84, &chord_85, &chord_86, &chord_87, &chord_88, &chord_89, &chord_90, &chord_91, &chord_92, &chord_93, &chord_94, &chord_95, &chord_96, &chord_97, &chord_98, &chord_99, &chord_100, &chord_101, &chord_102, &chord_103, &chord_104, &chord_105, &chord_106, &chord_107, &chord_108
+};
+
+const uint16_t** const leader_triggers PROGMEM = NULL;
+void (*leader_functions[]) (void) = {};
+
+#define NUMBER_OF_CHORDS 109
+#define NUMBER_OF_LEADER_COMBOS 0
+
+bool are_hashed_keycodes_in_sound(HASH_TYPE keycodes_hash, HASH_TYPE sound) {
+ return (keycodes_hash & sound) == keycodes_hash;
+}
+
+uint8_t keycode_to_index(uint16_t keycode) {
+ return keycode - FIRST_INTERNAL_KEYCODE;
+}
+
+void sound_keycode_array(uint16_t keycode) {
+ uint8_t index = keycode_to_index(keycode);
+ keycode_index++;
+ keycodes_buffer_array[index] = keycode_index;
+}
+
+void silence_keycode_hash_array(HASH_TYPE keycode_hash) {
+ for (int i = 0; i < NUMBER_OF_KEYS; i++) {
+ bool index_in_hash = ((HASH_TYPE) 1 << i) & keycode_hash;
+ if (index_in_hash) {
+ uint8_t current_val = keycodes_buffer_array[i];
+ keycodes_buffer_array[i] = 0;
+ for (int j = 0; j < NUMBER_OF_KEYS; j++) {
+ if (keycodes_buffer_array[j] > current_val) {
+ keycodes_buffer_array[j]--;
+ }
+ }
+ keycode_index--;
+ }
+ }
+}
+
+bool are_hashed_keycodes_in_array(HASH_TYPE keycode_hash) {
+ for (int i = 0; i < NUMBER_OF_KEYS; i++) {
+ bool index_in_hash = ((HASH_TYPE) 1 << i) & keycode_hash;
+ bool index_in_array = (bool) keycodes_buffer_array[i];
+ if (index_in_hash && !index_in_array) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void kill_one_shots(void) {
+ struct Chord chord_storage;
+ struct Chord* chord_ptr;
+ struct Chord* chord;
+
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ chord = &chord_storage;
+
+ if (*chord->state == IN_ONE_SHOT) {
+ *chord->state = RESTART;
+ chord->function(chord);
+ if (*chord->state == RESTART) {
+ *chord->state = IDLE;
+ }
+ }
+ }
+}
+
+void process_finished_dances(void) {
+ struct Chord chord_storage;
+ struct Chord* chord_ptr;
+ struct Chord* chord;
+
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ chord = &chord_storage;
+
+ if (*chord->state == ACTIVATED) {
+ *chord->state = PRESS_FROM_ACTIVE;
+ chord->function(chord);
+ if (a_key_went_through) {
+ kill_one_shots();
+ }
+ dance_timer = timer_read();
+ } else if (*chord->state == IDLE_IN_DANCE) {
+ *chord->state = FINISHED;
+ chord->function(chord);
+ if (*chord->state == FINISHED) {
+ *chord->state = RESTART;
+ if (*chord->state == RESTART) {
+ *chord->state = IDLE;
+ }
+ }
+ } else if (*chord->state == PRESS_FROM_ACTIVE) {
+ *chord->state = FINISHED_FROM_ACTIVE;
+ chord->function(chord);
+ if (a_key_went_through) {
+ kill_one_shots();
+ }
+ dance_timer = timer_read();
+ }
+ }
+}
+
+uint8_t keycodes_buffer_array_min(uint8_t* first_keycode_index) {
+ for (int i = 0; i < NUMBER_OF_KEYS; i++) {
+ if (keycodes_buffer_array[i] == 1) {
+ if (first_keycode_index != NULL) {
+ *first_keycode_index = (uint8_t) i;
+ }
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void remove_subchords(void) {
+ struct Chord chord_storage;
+ struct Chord* chord_ptr;
+ struct Chord* chord;
+
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ chord = &chord_storage;
+
+ if (!(*chord->state == READY || *chord->state == READY_IN_DANCE || *chord->state == READY_LOCKED)) {
+ continue;
+ }
+
+ struct Chord chord_storage_2;
+ struct Chord* chord_ptr_2;
+ struct Chord* chord_2;
+ for (int j = 0; j < NUMBER_OF_CHORDS; j++) {
+ if (i == j) {continue;}
+
+ chord_ptr_2 = (struct Chord*) pgm_read_word (&list_of_chords[j]);
+ memcpy_P(&chord_storage_2, chord_ptr_2, sizeof(struct Chord));
+ chord_2 = &chord_storage_2;
+
+ if (are_hashed_keycodes_in_sound(chord_2->keycodes_hash, chord->keycodes_hash)) {
+ if (*chord_2->state == READY) {
+ *chord_2->state = IDLE;
+ }
+ if (*chord_2->state == READY_IN_DANCE) {
+ *chord_2->state = IDLE_IN_DANCE;
+ }
+ if (*chord_2->state == READY_LOCKED) {
+ *chord_2->state = LOCKED;
+ }
+ }
+ }
+ }
+}
+
+void process_ready_chords(void) {
+ uint8_t first_keycode_index = 0;
+ while (keycodes_buffer_array_min(&first_keycode_index)) {
+ // find ready chords
+ struct Chord chord_storage;
+ struct Chord* chord_ptr;
+ struct Chord* chord;
+
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ chord = &chord_storage;
+
+ // if the chord does not contain the first keycode
+ bool contains_first_keycode = ((uint32_t) 1 << first_keycode_index) & chord->keycodes_hash;
+ if (!contains_first_keycode) {
+ continue;
+ }
+
+ if (!are_hashed_keycodes_in_array(chord->keycodes_hash)){
+ continue;
+ }
+
+ if (*chord->state == LOCKED) {
+ *chord->state = READY_LOCKED;
+ continue;
+ }
+
+ if (!(chord->pseudolayer == current_pseudolayer || chord->pseudolayer == ALWAYS_ON)) {
+ continue;
+ }
+
+ if (*chord->state == IDLE) {
+ *chord->state = READY;
+ continue;
+ }
+
+ if (*chord->state == IDLE_IN_DANCE) {
+ *chord->state = READY_IN_DANCE;
+ }
+ }
+
+ // remove subchords
+ remove_subchords();
+
+ // execute logic
+ // this should be only one chord
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ chord = &chord_storage;
+
+ if (*chord->state == READY_LOCKED) {
+ *chord->state = RESTART;
+ chord->function(chord);
+ if (*chord->state == RESTART) {
+ *chord->state = IDLE;
+ }
+ break;
+ }
+
+ if (*chord->state == READY || *chord->state == READY_IN_DANCE) {
+ if (last_chord && last_chord != chord) {
+ process_finished_dances();
+ }
+
+ bool lock_next_prev_state = lock_next;
+
+ *chord->state = ACTIVATED;
+ chord->function(chord);
+ dance_timer = timer_read();
+
+ if (lock_next && lock_next == lock_next_prev_state) {
+ lock_next = false;
+ *chord->state = PRESS_FROM_ACTIVE;
+ chord->function(chord);
+ if (*chord->state == PRESS_FROM_ACTIVE) {
+ *chord->state = LOCKED;
+ }
+ if (a_key_went_through) {
+ kill_one_shots();
+ }
+ }
+ break;
+ }
+ }
+
+ // silence notes
+ silence_keycode_hash_array(chord->keycodes_hash);
+ }
+}
+
+void deactivate_active_chords(uint16_t keycode) {
+ HASH_TYPE hash = (HASH_TYPE)1 << (keycode - SAFE_RANGE);
+ bool broken;
+ struct Chord chord_storage;
+ struct Chord* chord_ptr;
+ struct Chord* chord;
+
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ chord = &chord_storage;
+
+ broken = are_hashed_keycodes_in_sound(hash, chord->keycodes_hash);
+ if (!broken) {
+ continue;
+ }
+
+ switch (*chord->state) {
+ case ACTIVATED:
+ *chord->state = DEACTIVATED;
+ chord->function(chord);
+
+ if (*chord->state == DEACTIVATED) {
+ dance_timer = timer_read();
+ *chord->state = IDLE_IN_DANCE;
+ }
+ if (*chord->state != IN_ONE_SHOT) {
+ kill_one_shots();
+ }
+ break;
+ case PRESS_FROM_ACTIVE:
+ case FINISHED_FROM_ACTIVE:
+ *chord->state = RESTART;
+ chord->function(chord);
+ if (*chord->state == RESTART) {
+ *chord->state = IDLE;
+ }
+ kill_one_shots();
+ break;
+ default:
+ break;
+ }
+ }
+
+}
+
+void process_command(void) {
+ command_mode = 0;
+ for (int i = 0; i < COMMAND_MAX_LENGTH; i++) {
+ if (command_buffer[i]) {
+ register_code(command_buffer[i]);
+ }
+ send_keyboard_report();
+ }
+ wait_ms(TAP_TIMEOUT);
+ for (int i = 0; i < COMMAND_MAX_LENGTH; i++) {
+ if (command_buffer[i]) {
+ unregister_code(command_buffer[i]);
+ }
+ send_keyboard_report();
+ }
+ for (int i = 0; i < COMMAND_MAX_LENGTH; i++) {
+ command_buffer[i] = 0;
+ }
+ command_ind = 0;
+}
+
+void process_leader(void) {
+ in_leader_mode = false;
+ for (int i = 0; i < NUMBER_OF_LEADER_COMBOS; i++) {
+ uint16_t trigger[LEADER_MAX_LENGTH];
+ memcpy_P(trigger, leader_triggers[i], LEADER_MAX_LENGTH * sizeof(uint16_t));
+
+ if (identical(leader_buffer, trigger)) {
+ (*leader_functions[i])();
+ break;
+ }
+ }
+ for (int i = 0; i < LEADER_MAX_LENGTH; i++) {
+ leader_buffer[i] = 0;
+ }
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (keycode < FIRST_INTERNAL_KEYCODE || keycode > LAST_INTERNAL_KEYCODE) {
+ return true;
+ }
+
+ if (record->event.pressed) {
+ sound_keycode_array(keycode);
+ } else {
+ process_ready_chords();
+ deactivate_active_chords(keycode);
+ }
+ chord_timer = timer_read();
+ leader_timer = timer_read();
+
+ return false;
+}
+
+void matrix_scan_user(void) {
+ bool chord_timer_expired = timer_elapsed(chord_timer) > CHORD_TIMEOUT;
+ if (chord_timer_expired && keycodes_buffer_array_min(NULL)) {
+ process_ready_chords();
+ }
+
+ bool dance_timer_expired = timer_elapsed(dance_timer) > DANCE_TIMEOUT;
+ if (dance_timer_expired) { // would love to have && in_dance but not sure how
+ process_finished_dances();
+ }
+
+ bool in_command_mode = command_mode == 2;
+ if (in_command_mode) {
+ process_command();
+ }
+
+ bool leader_timer_expired = timer_elapsed(leader_timer) > LEADER_TIMEOUT;
+ if (leader_timer_expired && in_leader_mode) {
+ process_leader();
+ }
+
+}
+
+void clear(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ // kill all chords
+ struct Chord chord_storage;
+ struct Chord* chord_ptr;
+ struct Chord* chord;
+
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ chord = &chord_storage;
+
+ *chord->state = IDLE;
+
+ if (chord->counter) {
+ *chord->counter = 0;
+ }
+ }
+
+ // clear keyboard
+ clear_keyboard();
+ send_keyboard_report();
+
+ // switch to default pseudolayer
+ current_pseudolayer = DEFAULT_PSEUDOLAYER;
+
+ // clear all keyboard states
+ lock_next = false;
+ autoshift_mode = true;
+ command_mode = 0;
+ in_leader_mode = false;
+ leader_ind = 0;
+ dynamic_macro_mode = false;
+ a_key_went_through = false;
+
+ for (int i = 0; i < DYNAMIC_MACRO_MAX_LENGTH; i++) {
+ dynamic_macro_buffer[i] = 0;
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/georgi/keymaps/dennytom/keymap_def.json b/keyboards/georgi/keymaps/dennytom/keymap_def.json
new file mode 100644
index 00000000000..232ccafadf4
--- /dev/null
+++ b/keyboards/georgi/keymaps/dennytom/keymap_def.json
@@ -0,0 +1,153 @@
+{
+ "keys": [
+ "TOP1", "TOP2", "TOP3", "TOP4", "TOP5", "TOP6", "TOP7", "TOP8", "TOP9", "TOP10", "TOP11", "TOP12",
+ "BOT1", "BOT2", "BOT3", "BOT4", "BOT5", "BOT6", "BOT7", "BOT8", "BOT9", "BOT10", "BOT11", "BOT12",
+ "THU1", "THU2", "THU3", "THU4", "THU5", "THU6"
+ ],
+ "parameters": {
+ "layout_function_name": "LAYOUT_georgi",
+ "chord_timeout": 100,
+ "dance_timeout": 200,
+ "leader_timeout": 750,
+ "tap_timeout": 50,
+ "command_max_length": 5,
+ "leader_max_length": 5,
+ "dynamic_macro_max_length": 20,
+ "string_max_length": 16,
+ "long_press_multiplier": 3,
+ "default_pseudolayer": "QWERTY"
+ },
+ "layers": [
+ {
+ "type": "auto"
+ }
+ ],
+ "chord_sets": [
+ {
+ "name": "rows",
+ "chords":
+ [
+ ["TOP1"], ["TOP2"], ["TOP3"], ["TOP4"], ["TOP5"], ["TOP6"], ["TOP7"], ["TOP8"], ["TOP9"], ["TOP10"], ["TOP11"], ["TOP12"],
+ ["TOP1", "BOT1"], ["TOP2", "BOT2"], ["TOP3", "BOT3"], ["TOP4", "BOT4"], ["TOP5", "BOT5"], ["TOP6", "BOT6"], ["TOP7", "BOT7"], ["TOP8", "BOT8"], ["TOP9", "BOT9"], ["TOP10", "BOT10"], ["TOP11", "BOT11"], ["TOP12", "BOT12"],
+ ["BOT1"], ["BOT2"], ["BOT3"], ["BOT4"], ["BOT5"], ["BOT6"], ["BOT7"], ["BOT8"], ["BOT9"], ["BOT10"], ["BOT11"], ["BOT12"],
+ ["THU1"], ["THU2"], ["THU3"], ["THU4"], ["THU5"], ["THU6"]
+ ]
+ }
+ ],
+ "pseudolayers": [
+ {
+ "name": "ALWAYS_ON",
+ "chords": [
+ {
+ "type": "visual",
+ "chord": [
+ "X", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X",
+ "X", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "X",
+ " ", " ", " ", " ", " ", " "
+ ],
+ "keycode": "CLEAR_KB"
+ },
+ {
+ "type": "visual",
+ "chord": [
+ " ", " ", " ", " ", " ", "X", "X", " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ", "X", "X", " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ", " "
+ ],
+ "keycode": "CMD"
+ }
+ ]
+ },
+ {
+ "name": "QWERTY",
+ "chords": [
+ {
+ "type": "chord_set",
+ "set": "rows",
+ "keycodes": [
+ "ESC", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "\\",
+ "INS", "A", "KK(S, LALT)", "KM(D, LCTL)", "KM(F, LSFT)", "KK(G, LGUI)", "KK(H, RGUI)", "KM(J, RSFT)", "KM(K, RCTL)", "KK(L, RALT)", ";", " ",
+ "TAB", "Z", "X", "C", "V", "B", "N", "M", ",", ".", "/", "'",
+ "","","","","",""
+ ]
+ },
+ {
+ "type": "visual_array",
+ "keys": ["THU1", "THU2", "THU3", "THU4", "THU5", "THU6"],
+ "dictionary": [
+ ["X", " ", " ", " ", " ", " ", "ENTER"],
+ [" ", "X", " ", " ", " ", " ", "KL(SPC, NUM)"],
+ [" ", " ", "X", " ", " ", " ", "KL(BSPC, NAV)"],
+ [" ", " ", " ", "X", " ", " ", "DEL"],
+ [" ", " ", " ", " ", "X", " ", "KL(SPC, FNC)"],
+ [" ", " ", " ", " ", " ", "X", "ENTER"],
+ [" ", "X", "X", " ", " ", " ", "MO(MOUSE)"]
+ ]
+ }
+ ]
+ },
+ {
+ "name": "NUM",
+ "chords": [
+ {
+ "type": "chord_set",
+ "set": "rows",
+ "keycodes": [
+ "`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-",
+ " ", " ", "LALT", "LCTL", "LSFT", "LGUI", "RGUI", "RSFT", "RCTL", "RALT", " ", " ",
+ " ", " ", " ", " ", " ", " ", " ", " ", " ", "[", "]", "=",
+ " ", " ", " ", " ", " ", " "
+ ]
+ }
+ ]
+ },
+ {
+ "name": "FNC",
+ "chords": [
+ {
+ "type": "chord_set",
+ "set": "rows",
+ "keycodes": [
+ " ", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11",
+ " ", " ", "LALT", "LCTL", "LSFT", "LGUI", "RGUI", "RSFT", "RCTL", "RALT", " ", " ",
+ " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "F12",
+ " ", " ", " ", " ", " ", " "
+ ]
+ }
+ ]
+ },
+ {
+ "name": "NAV",
+ "chords": [
+ {
+ "type": "chord_set",
+ "set": "rows",
+ "keycodes": [
+ " ", " ", " ", " ", " ", " ", " ", "HOME", "UP", "END", "PGUP", " ",
+ " ", " ", "LALT", "LCTL", "LSFT", "LGUI", " ", " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ", " ", " ", "LEFT", "DOWN", "RIGHT", "PGDN", " ",
+ " ", " ", " ", " ", " ", " "
+ ]
+ }
+ ]
+ },
+ {
+ "name": "MOUSE",
+ "chords": [
+ {
+ "type": "chord_set",
+ "set": "rows",
+ "keycodes": [
+ " ", " ", " ", " ", " ", " ", " ", "BTN1", "MS_U", "BTN2", "WH_U", " ",
+ " ", " ", "LALT", "LCTL", "LSFT", "LGUI", " ", " ", " ", " ", " ", " ",
+ " ", " ", " ", " ", " ", " ", " ", "MS_L", "MS_D", "MS_R", "WH_D", " ",
+ " ", " ", " ", " ", " ", " "
+ ]
+ }
+ ]
+ }
+ ],
+ "leader_sequences": [],
+ "extra_code": "",
+ "extra_dependencies": []
+}
\ No newline at end of file
diff --git a/keyboards/georgi/keymaps/dennytom/rules.mk b/keyboards/georgi/keymaps/dennytom/rules.mk
new file mode 100644
index 00000000000..1155f72c04a
--- /dev/null
+++ b/keyboards/georgi/keymaps/dennytom/rules.mk
@@ -0,0 +1,8 @@
+MOUSEKEY_ENABLE = yes
+EXTRAKEY_ENABLE = yes
+CONSOLE_ENABLE = no
+# COMMAND_ENABLE = no
+NKRO_ENABLE = yes
+
+TMPVAR := $(SRC)
+SRC = $(filter-out sten.c, $(TMPVAR))
\ No newline at end of file
diff --git a/keyboards/gergo/keymaps/gotham/config.h b/keyboards/gergo/keymaps/gotham/config.h
new file mode 100644
index 00000000000..6393d46f14b
--- /dev/null
+++ b/keyboards/gergo/keymaps/gotham/config.h
@@ -0,0 +1,3 @@
+#pragma once
+
+#define IGNORE_MOD_TAP_INTERRUPT
diff --git a/keyboards/gergo/keymaps/gotham/keymap.c b/keyboards/gergo/keymaps/gotham/keymap.c
new file mode 100644
index 00000000000..ff6df266f20
--- /dev/null
+++ b/keyboards/gergo/keymaps/gotham/keymap.c
@@ -0,0 +1,155 @@
+/* Good on you for modifying your layout! if you don't have
+ * time to read the QMK docs, a list of keycodes can be found at
+ *
+ * https://github.com/qmk/qmk_firmware/blob/master/docs/keycodes.md
+ *
+ * There's also a template for adding new layers at the bottom of this file!
+ */
+
+#include QMK_KEYBOARD_H
+
+enum layers {
+ BASE, // default layer
+ SYMB, // symbols
+ NUMB, // number/navigation
+ MOUS, // mouse navigation
+};
+
+#define KC_ANGL LSFT(KC_COMM)
+#define KC_ANGR LSFT(KC_DOT)
+
+// Blank template at the bottom
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | ESC | Q | W | E | R | T | | Y | U | I | O | P | \ | |
+ * |--------+------+------+------+------+------|------. .------|------+------+------+------+------+--------|
+ * | LShift | A | S | D | F | G | | | VolUp| H | J | K | L | ; : |RSft/' "|
+ * |--------+------+------+------+------+------|------| |------|------+------+------+------+------+--------|
+ * | LCtrl | Z | X | C | V | B | | | VolDn| N | M | , < | . > | / ? |RCtl/- _|
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * .----------. .----------. .-----------. .------.
+ * | LAlt | |SYMB/Space| | NUMB/Bksp | | MOUS |
+ * '----------' '----------' `-----------' '------'
+ * ,-------. ,-------.
+ * | | |VolMute|
+ * ,------|-------| |-------|------.
+ * | NUMB | | | | SYMB |
+ * | Tab | LGui | | = | Enter|
+ * | | | | | |
+ * `--------------' `--------------'
+ */
+[BASE] = LAYOUT_gergo(
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, XXXXXXX, KC_VOLU, KC_H, KC_J, KC_K, KC_L, KC_SCLN, MT(MOD_RSFT, KC_QUOT),
+ KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, XXXXXXX, XXXXXXX, KC_MUTE, KC_VOLD, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(MOD_RCTL, KC_MINS),
+ KC_LALT, LT(SYMB, KC_SPC), LT(NUMB, KC_TAB), KC_LGUI, KC_EQL, LT(SYMB, KC_ENT), LT(NUMB, KC_BSPC), MO(MOUS)
+ ),
+/* Keymap 1: Symbols layer
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | # | $ | { | } | | | | < | > | | | | |
+ * |--------+------+------+------+------+------|------. .------|------+------+------+------+------+--------|
+ * | | ! | @ | ( | ) | ` | | | | - | & | + | * | ; | ' " |
+ * |--------+------+------+------+------+------|------| |------|------+------+------+------+------+--------|
+ * | | % | ^ | [ | ] | ~ | | | | _ | | | , | . | / ? | - _ |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * .----------. .----------. .-----. .------.
+ * | LAlt | |SYMB/Space| | Del | | MOUS |
+ * '----------' '----------' `-----' '------'
+ * ,-------. ,-------.
+ * | | | |
+ * ,------|-------| |-------|------.
+ * | NUMB | | | | SYMB |
+ * | Tab | LGui | | = | Enter|
+ * | | | | | |
+ * `--------------' `--------------'
+ */
+[SYMB] = LAYOUT_gergo(
+ _______, KC_HASH, KC_DLR, KC_LCBR, KC_RCBR, XXXXXXX, XXXXXXX, KC_ANGL, KC_ANGR, XXXXXXX, XXXXXXX, KC_PIPE,
+ _______, KC_EXLM, KC_AT, KC_LPRN, KC_RPRN, KC_GRV, XXXXXXX, XXXXXXX, KC_MINS, KC_AMPR, KC_PLUS, KC_ASTR, KC_SCLN, KC_QUOT,
+ _______, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_UNDS, KC_PIPE, KC_COMM, KC_DOT, KC_SLSH, KC_MINS,
+ _______, _______, _______, _______, _______, _______, KC_DEL, _______
+ ),
+/* Keymap 2: Pad/Function layer
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
+ * |--------+------+------+------+------+------|------. .------|------+------+------+------+------+--------|
+ * | | F1 | F2 | F3 | F4 | F5 | F6 | | | PgUp | LEFT | UP | RIGHT| | |
+ * |--------+------+------+------+------+------|------| |------|------+------+------+------+------+--------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 | | |PgDown| HOME | DOWN | END | | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * .----------. .----------. .-----------. .------.
+ * | LAlt | |SYMB/Space| | NUMB/Bksp | | MOUS |
+ * '----------' '----------' `-----------' '------'
+ * ,-------. ,-------.
+ * | | | |
+ * ,------|-------| |-------|------.
+ * | NUMB | | | | SYMB |
+ * | Tab | LGui | | = | Enter|
+ * | | | | | |
+ * `--------------' `--------------'
+ */
+[NUMB] = LAYOUT_gergo(
+ _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, XXXXXXX,
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, XXXXXXX, KC_PGUP, KC_LEFT, KC_UP, KC_RIGHT, XXXXXXX, XXXXXXX,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGDN, KC_HOME, KC_DOWN, KC_END, XXXXXXX, XXXXXXX,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+/* Keymap 3: Mouse layer
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
+ * |--------+------+------+------+------+------|------. .------|------+------+------+------+------+--------|
+ * | | F1 | F2 | F3 | F4 | F5 | F6 | | | | M_L | M_U | M_R | M_Clk| |
+ * |--------+------+------+------+------+------|------| |------|------+------+------+------+------+--------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 | | | | L_Clk| M_D | R_Clk| | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * .----------. .----------. .-----------. .------.
+ * | LAlt | |SYMB/Space| | NUMB/Bksp | | MOUS |
+ * '----------' '----------' `-----------' '------'
+ * ,-------. ,-------.
+ * | | | |
+ * ,------|-------| |-------|------.
+ * | NUMB | | | | SYMB |
+ * | Tab | LGui | | = | Enter|
+ * | | | | | |
+ * `--------------' `--------------'
+ */
+[MOUS] = LAYOUT_gergo(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_MS_L, KC_MS_U, KC_MS_R, KC_BTN3, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, KC_BTN1, KC_MS_D, KC_BTN2, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+};
+
+/* Keymap template
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------|------. .------|------+------+------+------+------+--------|
+ * | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------|------| |------|------+------+------+------+------+--------|
+ * | | | | | | | | | | | | | | | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * .------. .------. .------. .-----.
+ * | | | | | | | |
+ * '------' '------' `------. '-----'
+ * ,-------. ,-------.
+ * | | | |
+ * ,------|-------| |-------|------.
+ * | | | | | |
+ * | | | | | |
+ * | | | | | |
+ * `--------------' `--------------'
+[SYMB] = LAYOUT_gergo(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+ */
diff --git a/keyboards/gergo/keymaps/gotham/readme.md b/keyboards/gergo/keymaps/gotham/readme.md
new file mode 100644
index 00000000000..2b1c5ab1dab
--- /dev/null
+++ b/keyboards/gergo/keymaps/gotham/readme.md
@@ -0,0 +1,8 @@
+This is a modified version of the default keymap for Gergo with some changes.
+
+## Changes:
+ - Rehaul thumb keys. For my hand size, the L and R thumbs rest on space and backspace, and one finger outward, are tab and enter.
+ - = has its own dedicated key to facilitate typing "=", which is a very common trigram in programming.
+ - Change navigation into a T-shaped cluster and add Home and End keys. T-shaped, because it's similar to arrow key cluster and most keys are on the home row, while sharing the number layer.
+ - Separated mouse navigation into a separate layer (in favor of T-shaped arrows, which require 2 rows).
+ - Difficult-to-reach key positions are mostly unused.
diff --git a/keyboards/gergo/keymaps/gotham/rules.mk b/keyboards/gergo/keymaps/gotham/rules.mk
new file mode 100644
index 00000000000..351c5255835
--- /dev/null
+++ b/keyboards/gergo/keymaps/gotham/rules.mk
@@ -0,0 +1,37 @@
+#----------------------------------------------------------------------------
+# make gergo:germ:dfu
+# Make sure you have dfu-programmer installed!
+#----------------------------------------------------------------------------
+# Firmware options
+BALLER = no # Enable to ball out
+BALLSTEP = 20 # Multiple in px to move, multiplied by layer number
+SCROLLSTEP = 1 # Lines to scroll with ball
+MOUSEKEY_ENABLE = yes # Mouse keys, needed for baller
+
+#Debug options
+VERBOSE = yes
+DEBUG_MATRIX_SCAN_RATE = no
+DEBUG_BALLER = no
+DEBUG_MATRIX = yes
+
+# A bunch of stuff that you shouldn't touch unless you
+# know what you're doing.
+#
+# No touchy, capiche?
+SRC += matrix.c i2c_master.c
+ifneq ($(strip $(BALLSTEP)),)
+ OPT_DEFS += -DTRKSTEP=$(strip $(BALLSTEP))
+endif
+ifneq ($(strip $(SCROLLSTEP)),)
+ OPT_DEFS += -DSCROLLSTEP=$(strip $(SCROLLSTEP))
+endif
+ifeq ($(strip $(BALLER)), yes)
+ POINTING_DEVICE_ENABLE = yes
+ OPT_DEFS += -DBALLER
+endif
+ifeq ($(strip $(DEBUG_BALLER)), yes)
+ OPT_DEFS += -DDEBUG_BALLER
+endif
+ifeq ($(strip $(DEBUG_MATRIX)), yes)
+ OPT_DEFS += -DDEBUG_MATRIX
+endif
diff --git a/keyboards/gh60/revc/config.h b/keyboards/gh60/revc/config.h
index e0cfa7268d3..8c24b1e7e62 100644
--- a/keyboards/gh60/revc/config.h
+++ b/keyboards/gh60/revc/config.h
@@ -14,14 +14,17 @@ 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 .
*/
+
+#pragma once
+
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x6060
+#define VENDOR_ID 0x4335 // GEEKhack
+#define PRODUCT_ID 0x0001
#define DEVICE_VER 0x0001
#define MANUFACTURER geekhack
-#define PRODUCT GH60
+#define PRODUCT GH60 Rev C
#define DESCRIPTION t.m.k. keyboard firmware for GH60
/* key matrix size */
diff --git a/keyboards/gh60/revc/info.json b/keyboards/gh60/revc/info.json
index bbfa1f2dab4..7a8a19c1ece 100644
--- a/keyboards/gh60/revc/info.json
+++ b/keyboards/gh60/revc/info.json
@@ -1,10 +1,7 @@
{
- "keyboard_name": "GH60",
- "url": "http://qmk.fm/keyboards/gh60",
+ "keyboard_name": "GH60 Rev C",
+ "url": "",
"maintainer": "qmk",
- "keyboard_folder": "gh60",
- "processor": "atmega32u4",
- "manufacturer": "geekhack",
"width": 15,
"height": 5,
"layouts": {
diff --git a/keyboards/gh60/revc/keymaps/via/keymap.c b/keyboards/gh60/revc/keymaps/via/keymap.c
new file mode 100644
index 00000000000..653636c7323
--- /dev/null
+++ b/keyboards/gh60/revc/keymaps/via/keymap.c
@@ -0,0 +1,53 @@
+/* Copyright 2020 Diego Song
+
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_all( /* 0: qwerty */
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT,
+ KC_LSFT, TG(2), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL
+ ),
+
+ [1] = LAYOUT_all( /* 1: fn */
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [2] = LAYOUT_all( /* 2: arrows */
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+};
diff --git a/keyboards/gh60/revc/keymaps/via/rules.mk b/keyboards/gh60/revc/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/gh60/revc/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/gh60/revc/revc.h b/keyboards/gh60/revc/revc.h
index e183f776e90..450c59020c1 100644
--- a/keyboards/gh60/revc/revc.h
+++ b/keyboards/gh60/revc/revc.h
@@ -142,3 +142,17 @@ inline void gh60_wasd_leds_off(void) { setPinInput(F7); }
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \
{ K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D } \
}
+
+#define LAYOUT_60_tsangan_hhkb( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49,\
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3C, \
+ K40, K41, K42, K45, K4B, K4C, K4D \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D }, \
+ { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \
+ { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, K49, KC_NO, K4B, K4C, K4D } \
+}
diff --git a/keyboards/gh60/revc/rules.mk b/keyboards/gh60/revc/rules.mk
index fb9ca646f07..831de85d004 100644
--- a/keyboards/gh60/revc/rules.mk
+++ b/keyboards/gh60/revc/rules.mk
@@ -28,4 +28,4 @@ NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https:
# UNICODE_ENABLE = YES # Unicode
# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
-LAYOUTS = 60_ansi 60_iso 60_ansi_split_bs_rshift
+LAYOUTS = 60_ansi 60_iso 60_ansi_split_bs_rshift 60_tsangan_hhkb
diff --git a/keyboards/gh60/satan/config.h b/keyboards/gh60/satan/config.h
index d8c9ae9ab57..8c172314a81 100644
--- a/keyboards/gh60/satan/config.h
+++ b/keyboards/gh60/satan/config.h
@@ -20,11 +20,11 @@ along with this program. If not, see .
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x6060
+#define VENDOR_ID 0x4335
+#define PRODUCT_ID 0x0002
#define DEVICE_VER 0x0003
#define MANUFACTURER SATAN
-#define PRODUCT GH60
+#define PRODUCT GH60 Satan
#define DESCRIPTION 60% keyboard with backlight and WS2812 support
/* key matrix size */
diff --git a/keyboards/gh60/satan/info.json b/keyboards/gh60/satan/info.json
index 2b2e96ed19c..a805c6cf910 100644
--- a/keyboards/gh60/satan/info.json
+++ b/keyboards/gh60/satan/info.json
@@ -1,5 +1,5 @@
{
- "keyboard_name": "Satan GH60",
+ "keyboard_name": "GH60 Satan",
"url": "",
"maintainer": "qmk",
"width": 15,
diff --git a/keyboards/gh60/satan/keymaps/via/keymap.c b/keyboards/gh60/satan/keymaps/via/keymap.c
new file mode 100644
index 00000000000..c9c6acf6817
--- /dev/null
+++ b/keyboards/gh60/satan/keymaps/via/keymap.c
@@ -0,0 +1,53 @@
+/* Copyright 2020 Diego Song
+
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_all( /* 0: qwerty */
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT,
+ KC_LSFT, TG(2), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL
+ ),
+
+ [1] = LAYOUT_all( /* 1: fn */
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [2] = LAYOUT_all( /* 2: arrows */
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+};
\ No newline at end of file
diff --git a/keyboards/gh60/satan/keymaps/via/rules.mk b/keyboards/gh60/satan/keymaps/via/rules.mk
new file mode 100644
index 00000000000..43061db1dd4
--- /dev/null
+++ b/keyboards/gh60/satan/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/gingham/config.h b/keyboards/gingham/config.h
index 45ef573ce09..653c0f62795 100644
--- a/keyboards/gingham/config.h
+++ b/keyboards/gingham/config.h
@@ -24,7 +24,7 @@ along with this program. If not, see .
#define DEVICE_VER 0x0001
#define MANUFACTURER Yiancar-Designs
#define PRODUCT Gingham
-#define DESCRIPTION A 65 persent keyboard with only through hole components
+#define DESCRIPTION A 60 percent keyboard with only through hole components
/* key matrix size */
#define MATRIX_ROWS 5
@@ -240,8 +240,3 @@ along with this program. If not, see .
#define LCD_E_PIN 1 //< pin for Enable line
#endif
*/
-
-/* Bootmagic Lite key configuration */
-#define BOOTMAGIC_LITE_ROW 0
-#define BOOTMAGIC_LITE_COLUMN 0
-
diff --git a/keyboards/gingham/keymaps/default/keymap.c b/keyboards/gingham/keymaps/default/keymap.c
index b5b4de5fffa..f54d6d8bdc8 100644
--- a/keyboards/gingham/keymaps/default/keymap.c
+++ b/keyboards/gingham/keymaps/default/keymap.c
@@ -21,7 +21,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_60_ansi_split_bs_rshift( /* Base */
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
- KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1) , KC_APP, KC_RCTL),
@@ -46,15 +46,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
};
-
-void matrix_init_user(void) {
- //user initialization
-}
-
-void matrix_scan_user(void) {
- //user matrix
-}
-
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- return true;
-}
\ No newline at end of file
diff --git a/keyboards/gingham/keymaps/iso/keymap.c b/keyboards/gingham/keymaps/iso/keymap.c
index 0058df54acb..6aae0ccf364 100644
--- a/keyboards/gingham/keymaps/iso/keymap.c
+++ b/keyboards/gingham/keymaps/iso/keymap.c
@@ -20,41 +20,29 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_60_iso_split_bs_rshift( /* Base */
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,
- KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1) , KC_APP, KC_RCTL),
[1] = LAYOUT_60_iso_split_bs_rshift( /* FN */
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET ,
+ KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET ,
KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
[2] = LAYOUT_60_iso_split_bs_rshift( /* Empty for dynamic keymaps */
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
[3] = LAYOUT_60_iso_split_bs_rshift( /* Empty for dynamic keymaps */
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
};
-
-void matrix_init_user(void) {
- //user initialization
-}
-
-void matrix_scan_user(void) {
- //user matrix
-}
-
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- return true;
-}
\ No newline at end of file
diff --git a/keyboards/gingham/keymaps/via/keymap.c b/keyboards/gingham/keymaps/via/keymap.c
new file mode 100644
index 00000000000..3f7f1c4229a
--- /dev/null
+++ b/keyboards/gingham/keymaps/via/keymap.c
@@ -0,0 +1,48 @@
+/* Copyright 2018 Yiancar
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+// This keymaps is used for VIA, it reflects the default keymap.
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_60_iso_split_bs_rshift( /* Base */
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1) , KC_APP, KC_RCTL),
+
+[1] = LAYOUT_60_iso_split_bs_rshift( /* FN */
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET ,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+[2] = LAYOUT_60_iso_split_bs_rshift( /* Empty for dynamic keymaps */
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+[3] = LAYOUT_60_iso_split_bs_rshift( /* Empty for dynamic keymaps */
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+};
diff --git a/keyboards/gingham/keymaps/via/readme.md b/keyboards/gingham/keymaps/via/readme.md
new file mode 100644
index 00000000000..a49e2c05684
--- /dev/null
+++ b/keyboards/gingham/keymaps/via/readme.md
@@ -0,0 +1,3 @@
+# Compile with this keymap to use VIA
+
+Sadly right now when using VIA, extrakeys is disabled. This means volume control will not work.
diff --git a/keyboards/gingham/keymaps/via/rules.mk b/keyboards/gingham/keymaps/via/rules.mk
new file mode 100644
index 00000000000..930e3552ad0
--- /dev/null
+++ b/keyboards/gingham/keymaps/via/rules.mk
@@ -0,0 +1,3 @@
+VIA_ENABLE = yes
+MOUSEKEY_ENABLE = no
+EXTRAKEY_ENABLE = no
diff --git a/keyboards/gingham/usbconfig.h b/keyboards/gingham/usbconfig.h
deleted file mode 100644
index 3c7aa0da06a..00000000000
--- a/keyboards/gingham/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 0
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'Y','i','a','n','c','a','r','-','D','e', 's', 'i', 'g', 'n', 's'
-#define USB_CFG_VENDOR_NAME_LEN 15
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'G', 'i', 'n', 'g', 'h', 'a', 'm'
-#define USB_CFG_DEVICE_NAME_LEN 7
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-#define USB_CFG_SERIAL_NUMBER '0'
-#define USB_CFG_SERIAL_NUMBER_LEN 1
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-// #define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-// /* #define USB_INTR_CFG_CLR 0 */
-// /* #define USB_INTR_ENABLE EIMSK */
-// #define USB_INTR_ENABLE_BIT INT1
-// /* #define USB_INTR_PENDING EIFR */
-// #define USB_INTR_PENDING_BIT INTF1
-// #define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/gray_studio/cod67/config.h b/keyboards/gray_studio/cod67/config.h
index 2231827ba65..238869c2c3d 100644
--- a/keyboards/gray_studio/cod67/config.h
+++ b/keyboards/gray_studio/cod67/config.h
@@ -52,6 +52,7 @@ along with this program. If not, see .
* https://docs.qmk.fm/#/feature_backlight?id=timer-assisted-pwm-implementation
*/
#define BACKLIGHT_PIN D4
+#define BACKLIGHT_ON_STATE 0
#define RGB_DI_PIN B2
#ifdef RGB_DI_PIN
diff --git a/keyboards/gray_studio/cod67/readme.md b/keyboards/gray_studio/cod67/readme.md
index 6e79ffec4a2..b7a9a8028ad 100644
--- a/keyboards/gray_studio/cod67/readme.md
+++ b/keyboards/gray_studio/cod67/readme.md
@@ -39,7 +39,3 @@ After putting your COD67 in bootloader mode, it will show up as a drive.
* Drag and drop your new `COD67.BIN` to the drive.
* Wait a few seconds for it to write. The caps lock LED flashes rapidly while writing.
* Press the `Esc` key or eject the drive in Finder to reset the board. You are now ready to type!
-
-## Notes
-
-The backlight pin is attached to a non PWM pin `D4` so the backlight is only on/off.
diff --git a/keyboards/gray_studio/hb85/rules.mk b/keyboards/gray_studio/hb85/rules.mk
index 79b783e4213..a9746c0d3dd 100644
--- a/keyboards/gray_studio/hb85/rules.mk
+++ b/keyboards/gray_studio/hb85/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = no
MOUSEKEY_ENABLE = no
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
diff --git a/keyboards/gray_studio/hb85/usbconfig.h b/keyboards/gray_studio/hb85/usbconfig.h
deleted file mode 100644
index 186e2dca354..00000000000
--- a/keyboards/gray_studio/hb85/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'G', 'r', 'a', 'y', ' ', 'S', 't', 'u', 'd', 'i', 'o'
-#define USB_CFG_VENDOR_NAME_LEN 11
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'H', 'B', '8', '5'
-#define USB_CFG_DEVICE_NAME_LEN 4
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/gray_studio/space65/keymaps/keithlo/keymap.c b/keyboards/gray_studio/space65/keymaps/keithlo/keymap.c
new file mode 100644
index 00000000000..9efc3fd84af
--- /dev/null
+++ b/keyboards/gray_studio/space65/keymaps/keithlo/keymap.c
@@ -0,0 +1,63 @@
+/* Copyright 2019 MechMerlin
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* Qwerty
+ * ,------------------------------------------------------------------------------------------------.
+ * | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | DEL |
+ * |------------------------------------------------------------------------------------------------+
+ * | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | INS |
+ * |------------------------------------------------------------------------------------------------+
+ * | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | Enter | PGUP |
+ * |------------------------------------------------------------------------------------------------+
+ * | Shift | Z | X | C | V | B | N | M | , | . | ?/ | Shift | Up | PGDN |
+ * |------------------------------------------------------------------------------------------------+
+ * | Ctrl | Alt | Cmd | Space | Fn | Cmd | Alt | Fn | | Left | Down |Right |
+ * `----------------------------------------------------------------------' '--------------------'
+ */
+
+[0] = LAYOUT( \
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_DEL, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_INS, \
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \
+ KC_LSFT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, \
+ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, MO(1), KC_RGUI, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT \
+ ),
+
+ /* Fn Layer
+ * ,------------------------------------------------------------------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | Vol- | Vol+ | Mute | Mute |
+ * |------------------------------------------------------------------------------------------------+
+ * | |RGB T|RGB M| Hue-| Hue+| Sat-| Sat+| Val-| Val+| | | | | | |
+ * |------------------------------------------------------------------------------------------------+
+ * | | RGBP | RGPG | RGPK | | | Left| Down| Up |Right| | | Play/Pause | |
+ * |------------------------------------------------------------------------------------------------+
+ * | | | | | | | | | | Scr- | Scr+ | | PgUp | |
+ * |------------------------------------------------------------------------------------------------+
+ * | | | | | | | | | | Home | PgDn | End |
+ * `---------------------------------------------------------------------' '--------------------'
+ */
+
+[1] = LAYOUT( \
+ KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_VOLD, KC_VOLU, KC_MUTE, KC_MUTE, KC_MUTE, \
+ KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, RGB_SPD, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
+ KC_TRNS, RGB_M_P, RGB_M_G, RGB_M_K, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_TRNS, KC_MPLY, KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BRID, KC_BRIU, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END \
+ ),
+};
diff --git a/keyboards/gray_studio/space65/keymaps/keithlo/readme.md b/keyboards/gray_studio/space65/keymaps/keithlo/readme.md
new file mode 100644
index 00000000000..d8673643ef8
--- /dev/null
+++ b/keyboards/gray_studio/space65/keymaps/keithlo/readme.md
@@ -0,0 +1,107 @@
+## Space65 layout (with split space row -- no pun intended)
+
+This layout is optimized for vim users on MacOS.
+The split space row == least travel possible (I've found). Coming from an Alice this is the only way I can find myself going back to a non-ergonomic 6X% board
+
+###### Settings:
+
+* The `ALT` and `CMD` keys are swapped to replicate the Mac layout
+* vim-style arrow key bindings H J K L in Fn layer
+
+###### Flashing:
+
+* v1 PCB: in order to toggle BootLoader from a factory PCB you must hold down ESC + Modifier MO(1) before you plug the board in
+* otherwise you just hold ESC before you plug the board in
+* Next, to make the .hex file and subsequently flash the board run:
+
+```$ make gray_studio/space65:keithlo:flash # be in the qmk_firmware directory to do this ```
+* more info at the bottom if you're getting errors
+
+
+### Qwerty
+```
+,------------------------------------------------------------------------------------------------.
+| ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | DEL |
+|------------------------------------------------------------------------------------------------+
+| TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | INS |
+|------------------------------------------------------------------------------------------------+
+| CAPS | A | S | D | F | G | H | J | K | L | ; | ' | Enter | PGUP |
+|------------------------------------------------------------------------------------------------+
+| Shift | Z | X | C | V | B | N | M | , | . | ?/ | Shift | Up | PGDN |
+|------------------------------------------------------------------------------------------------+
+| Ctrl | Alt | Cmd | Space | Fn | Cmd | Alt | Fn | | Left | Down |Right |
+`----------------------------------------------------------------------' '--------------------'
+```
+
+### Fn Layer
+```
+,------------------------------------------------------------------------------------------------.
+| | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | Vol- | Vol+ | Mute | Mute |
+|------------------------------------------------------------------------------------------------+
+| |RGB T|RGB M| Hue-| Hue+| Sat-| Sat+| Val-| Val+| | | | | | |
+|------------------------------------------------------------------------------------------------+
+| | RGBP | RGPG | RGPK | | | Left| Down| Up |Right| | | Play/Pause | |
+|------------------------------------------------------------------------------------------------+
+| | | | | | | | | | Scr- | Scr+ | | PgUp | |
+|------------------------------------------------------------------------------------------------+
+| | | | | | | | | | Home | PgDn | End |
+`---------------------------------------------------------------------' '--------------------'
+
+
+Fn Layer Mapping chars -> RGB commands
+|------------------------------------------------------------------------------------------------+
+| |RGB T|RGB M| Hue-| Hue+| Sat-| Sat+| Val-| Val+| | | | | | |
+|------------------------------------------------------------------------------------------------+
+| | Q | W | E | R | T | Y | U | I | | | | | | |
+|------------------------------------------------------------------------------------------------+
+
+|------------------------------------------------------------------------------------------------+
+| | RGBP | RGPG | RGPK | | | Left| Down| Up |Right| | | Play/Pause | |
+|------------------------------------------------------------------------------------------------+
+| | A | S | D | | | H | J | K | L | | | Enter | |
+|------------------------------------------------------------------------------------------------+
+```
+
+
+###### Flashing (debugging)
+* Make sure you are holding ESC + MO(1) when you plug board in
+* Release ESC + MO(1) if you are stuck in the ```dfu-programmer: no device present.
+ERROR: Bootloader not found. Trying again in 5s.``` loop seen below
+
+* You should see a screen like this when you make and flash
+```
+qmk_firmware git:(master)$ make gray_studio/space65:keithlo:flash
+QMK Firmware 0.8.107
+Making gray_studio/space65 with keymap keithlo and target flash
+
+avr-gcc (GCC) 8.3.0
+Copyright (C) 2018 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+Size before:
+ text data bss dec hex filename
+ 0 21836 0 21836 554c .build/gray_studio_space65_keithlo.hex
+
+Copying gray_studio_space65_keithlo.hex to qmk_firmware folder [OK]
+Checking file size of gray_studio_space65_keithlo.hex [OK]
+ * The firmware size is fine - 21836/28672 (76%, 6836 bytes free)
+dfu-programmer: no device present.
+ERROR: Bootloader not found. Trying again in 5s.
+dfu-programmer: no device present.
+ERROR: Bootloader not found. Trying again in 5s.
+Bootloader Version: 0x00 (0)
+Erasing flash... Success
+Checking memory from 0x0 to 0x6FFF... Empty.
+Checking memory from 0x0 to 0x557F... Empty.
+0% 100% Programming 0x5580 bytes...
+[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
+0% 100% Reading 0x7000 bytes...
+[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
+Validating... Success
+0x5580 bytes written into 0x7000 bytes memory (76.34%).
+qmk_firmware git:(master)$
+```
+
+
+shoutout @billiams for the base ascii art template
diff --git a/keyboards/handwired/aek64/config.h b/keyboards/handwired/aek64/config.h
index a072d562a78..f10cd69dd5a 100644
--- a/keyboards/handwired/aek64/config.h
+++ b/keyboards/handwired/aek64/config.h
@@ -27,9 +27,6 @@ along with this program. If not, see .
#define PRODUCT AEK64
#define DESCRIPTION QMK keyboard firmware for AEK64 handwired
-/* Define the backlight */
-/*#define BACKLIGHT_ON_STATE 1*/
-
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 14
diff --git a/keyboards/handwired/aplx2/README.md b/keyboards/handwired/aplx2/README.md
new file mode 100644
index 00000000000..424d964817f
--- /dev/null
+++ b/keyboards/handwired/aplx2/README.md
@@ -0,0 +1,34 @@
+# Aplx2
+
+
+
+A simple 2% keyboard for osu!. Designed to be assembled as a sandwich with a Pro Micro, using M3 x 16mm screws, your choice of MX- or Alps-compatible switches, and 1N4148 diodes.
+
+**Layout:**
+The default layout is: Z , X .
+Used pins can be found in `config.h`. All ProMicro pins can be found [here](https://cdn.sparkfun.com/datasheets/Dev/Arduino/Boards/ProMicro16MHzv1.pdf).
+
+* Keyboard Maintainer: [Aplyard](https://github.com/Aplyard)
+* Hardware Supported: Pro Micro (ATmega32U4)
+* Hardware Availability: [GitHub](https://github.com/Aplyard/Aplx2), [Thingiverse](https://www.thingiverse.com/thing:4294608)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/aplx2:default
+
+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).
+
+---
+**Designed in:**
+Fusion360
+[Keyboard Plate & Case Builder](http://builder.swillkb.com/)
+
+
+**Usefull Links:**
+[Qmk Online Configurator](https://config.qmk.fm/#)
+
+**Alternatives of qmk that worked for me:**
+[Keyboard Layout Editor](http://www.keyboard-layout-editor.com/#/)
+[Firmware Builder](https://kbfirmware.com/)
+
+---
diff --git a/keyboards/handwired/aplx2/aplx2.c b/keyboards/handwired/aplx2/aplx2.c
new file mode 100644
index 00000000000..e3dd174542e
--- /dev/null
+++ b/keyboards/handwired/aplx2/aplx2.c
@@ -0,0 +1,19 @@
+/*
+Copyright 2020 April Aplyard
+
+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 .
+*/
+
+#include "aplx2.h"
+
diff --git a/keyboards/handwired/aplx2/aplx2.h b/keyboards/handwired/aplx2/aplx2.h
new file mode 100644
index 00000000000..a47b064b96a
--- /dev/null
+++ b/keyboards/handwired/aplx2/aplx2.h
@@ -0,0 +1,25 @@
+/*
+Copyright 2020 April Aplyard
+
+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 .
+*/
+
+#pragma once
+#include "quantum.h"
+
+#define LAYOUT( \
+ K00, K01 \
+) { \
+ { K00 , K01 } \
+}
diff --git a/keyboards/handwired/aplx2/config.h b/keyboards/handwired/aplx2/config.h
new file mode 100644
index 00000000000..041f956b8da
--- /dev/null
+++ b/keyboards/handwired/aplx2/config.h
@@ -0,0 +1,41 @@
+/*
+Copyright 2020 April Aplyard
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xE0E0
+#define PRODUCT_ID 0x0030
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Aplyard
+#define PRODUCT Aplx2
+#define DESCRIPTION Aplx2% osu!
+
+/* key matrix size */
+#define MATRIX_ROWS 1
+#define MATRIX_COLS 2
+
+/* pin-out */
+#define MATRIX_ROW_PINS { D1 }
+#define MATRIX_COL_PINS { B5, D3 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
diff --git a/keyboards/handwired/aplx2/keymaps/default/keymap.c b/keyboards/handwired/aplx2/keymaps/default/keymap.c
new file mode 100644
index 00000000000..b99a7df0610
--- /dev/null
+++ b/keyboards/handwired/aplx2/keymaps/default/keymap.c
@@ -0,0 +1,16 @@
+#include QMK_KEYBOARD_H
+
+#define _MAIN 0
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Keymap __MAIN: Default Layer
+ * ,---------------.
+ * | |-----|-----| |
+ * | | Ζ | Χ | |
+ * | |-----|-----| |
+ * '---------------'
+ */
+ [_MAIN] = LAYOUT(
+ KC_Z, KC_X
+ ),
+};
diff --git a/keyboards/handwired/aplx2/rules.mk b/keyboards/handwired/aplx2/rules.mk
new file mode 100644
index 00000000000..af9df6087f3
--- /dev/null
+++ b/keyboards/handwired/aplx2/rules.mk
@@ -0,0 +1,33 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+UNICODE_ENABLE = no # Unicode
diff --git a/keyboards/handwired/bdn9_ble/bdn9_ble.c b/keyboards/handwired/bdn9_ble/bdn9_ble.c
new file mode 100644
index 00000000000..75fe7fff718
--- /dev/null
+++ b/keyboards/handwired/bdn9_ble/bdn9_ble.c
@@ -0,0 +1 @@
+#include "bdn9_ble.h"
diff --git a/keyboards/handwired/bdn9_ble/bdn9_ble.h b/keyboards/handwired/bdn9_ble/bdn9_ble.h
new file mode 100644
index 00000000000..8a451132647
--- /dev/null
+++ b/keyboards/handwired/bdn9_ble/bdn9_ble.h
@@ -0,0 +1,37 @@
+/* Copyright 2019 Danny Nguyen
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "quantum.h"
+
+/* This 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( \
+ KA1, KA2, KA3, \
+ KB1, KB2, KB3, \
+ KC1, KC2, KC3 \
+) \
+{ \
+ { KA1, KA2, KA3 }, \
+ { KB1, KB2, KB3 }, \
+ { KC1, KC2, KC3 } \
+}
diff --git a/keyboards/handwired/bdn9_ble/config.h b/keyboards/handwired/bdn9_ble/config.h
new file mode 100644
index 00000000000..e6762406a05
--- /dev/null
+++ b/keyboards/handwired/bdn9_ble/config.h
@@ -0,0 +1,51 @@
+/*
+Copyright 2019 Danny Nguyen
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xCB10
+#define PRODUCT_ID 0x1134
+#define DEVICE_VER 0x0100
+#define MANUFACTURER KeyPCB/Keebio
+#define PRODUCT BDN9-BLE
+#define DESCRIPTION 3x3 Bluetooth Macropad
+
+/* key matrix size */
+#define MATRIX_ROWS 3
+#define MATRIX_COLS 3
+
+/* Keyboard Matrix Assignments */
+#define DIRECT_PINS { \
+ { D1, D0, C6 }, \
+ { D7, B5, B6 }, \
+ { B7, D6, F7 } \
+}
+
+#define BACKLIGHT_PIN F6
+// #define BACKLIGHT_BREATHING
+#define BACKLIGHT_LEVELS 5
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+/* 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
diff --git a/keyboards/handwired/bdn9_ble/info.json b/keyboards/handwired/bdn9_ble/info.json
new file mode 100644
index 00000000000..49bf627197f
--- /dev/null
+++ b/keyboards/handwired/bdn9_ble/info.json
@@ -0,0 +1,22 @@
+{
+ "keyboard_name": "KeyPCB/Keeb.io BDN9-BLE",
+ "url": "",
+ "maintainer": "merlin04",
+ "width": 3,
+ "height": 3,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":0, "y":1},
+ {"x":1, "y":1},
+ {"x":2, "y":1},
+ {"x":0, "y":2},
+ {"x":1, "y":2},
+ {"x":2, "y":2}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/bdn9_ble/keymaps/default/keymap.c b/keyboards/handwired/bdn9_ble/keymaps/default/keymap.c
new file mode 100644
index 00000000000..40684214677
--- /dev/null
+++ b/keyboards/handwired/bdn9_ble/keymaps/default/keymap.c
@@ -0,0 +1,49 @@
+/* Copyright 2019 Danny Nguyen
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+
+// Enable test mode, which sets the keys to letters A-I.
+//#define TESTMODE
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ #ifndef TESTMODE
+ // MEH - hold down ctrl, alt, shift, and press key
+ [0] = LAYOUT(
+ MEH(KC_1), MEH(KC_2), MEH(KC_3),
+ MEH(KC_4), MEH(KC_5), MEH(KC_6),
+ MEH(KC_7), MEH(KC_8), LT(1, MEH(KC_9))
+ ),
+ #else
+ [0] = LAYOUT(
+ KC_A, KC_B, KC_C,
+ KC_D, KC_E, KC_F,
+ KC_G, KC_H, KC_I
+ ),
+ #endif
+ /*
+ * ------------------------------------------------------------------------
+ * | | Automatic BLE output detection | Reset |
+ * | Backlight Step | Use USB port for output | |
+ * | Backlight Tgl | Use Bluetooth for output | (currently pressed) |
+ * ------------------------------------------------------------------------
+ */
+ [1] = LAYOUT(
+ _______, OUT_AUTO, RESET,
+ BL_STEP, OUT_USB, _______,
+ BL_TOGG, OUT_BT, _______
+ )
+};
diff --git a/keyboards/handwired/bdn9_ble/readme.md b/keyboards/handwired/bdn9_ble/readme.md
new file mode 100644
index 00000000000..eaeab59ad87
--- /dev/null
+++ b/keyboards/handwired/bdn9_ble/readme.md
@@ -0,0 +1,14 @@
+# BDN9-BLE
+
+
+
+A handwired modified version of the Keebio BDN9 macropad to support BLE through the Adafruit Feather 32u4 Bluefruit LE.
+
+* Keyboard Maintainer: [merlin04/KeyPCB](https://github.com/merlin04)
+* Hardware Supported: Adafruit Feather 32u4 Bluefruit LE
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/bdn9_ble:default
+
+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).
diff --git a/keyboards/handwired/bdn9_ble/rules.mk b/keyboards/handwired/bdn9_ble/rules.mk
new file mode 100644
index 00000000000..4fabf1c89d0
--- /dev/null
+++ b/keyboards/handwired/bdn9_ble/rules.mk
@@ -0,0 +1,37 @@
+# MCU name
+MCU = atmega32u4
+
+# Processor frequency
+F_CPU = 8000000
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH = AdafruitBLE # Enable Bluetooth
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+ENCODER_ENABLE = no
diff --git a/keyboards/handwired/bluepill/bluepill70/rules.mk b/keyboards/handwired/bluepill/bluepill70/rules.mk
index 5cf5f3f6ca6..4a757bcc913 100644
--- a/keyboards/handwired/bluepill/bluepill70/rules.mk
+++ b/keyboards/handwired/bluepill/bluepill70/rules.mk
@@ -1,51 +1,9 @@
-# project specific files
-SRC = matrix.c \
- led.c
-
-# GENERIC STM32F103C8T6 board - stm32duino bootloader
-#OPT_DEFS = -DCORTEX_VTOR_INIT=0x2000
-#MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
-#BOARD = GENERIC_STM32_F103
-
-# GENERIC STM32F103C8T6 board - no bootloader (programmer over serial or SWD) // Modified by Xydane
-OPT_DEFS =
-MCU_LDSCRIPT = STM32F103x8
-BOARD = GENERIC_STM32_F103
-
-# MAPLE MINI
-# OPT_DEFS = -DCORTEX_VTOR_INIT=0x5000
-# MCU_LDSCRIPT = STM32F103xB_maplemini_bootloader
-# BOARD = MAPLEMINI_STM32_F103
-
-## chip/board settings
-# the next two should match the directories in
-# /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-MCU_FAMILY = STM32
-MCU_SERIES = STM32F1xx
-# linker script to use
-# it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/
-# or /ld/
-# startup code to use
-# is should exist in /os/common/ports/ARMCMx/compilers/GCC/mk/
-MCU_STARTUP = stm32f1xx
-# it should exist either in /os/hal/boards/
-# or /boards
-# Cortex version
-# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
-MCU = cortex-m3
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-ARMV = 7
-# If you want to be able to jump to bootloader from firmware on STM32 MCUs,
-# set the correct BOOTLOADER_ADDRESS. Either set it here, or define it in
-# ./bootloader_defs.h or in ./boards//bootloader_defs.h (if you have
-# a custom board definition that you plan to reuse).
-# If you're not setting it here, leave it commented out.
-# It is chip dependent, the correct number can be looked up here (page 175):
-# http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
-# This also requires a patch to chibios:
-# /tmk_core/tool/chibios/ch-bootloader-jump.patch
-#STM32_BOOTLOADER_ADDRESS = 0x1FFFC800
-
+# MCU name
+MCU = STM32F103
# Enter lower-power sleep mode when on the ChibiOS idle thread
OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
+
+# project specific files
+SRC = matrix.c \
+ led.c
diff --git a/keyboards/handwired/ck4x4/chconf.h b/keyboards/handwired/ck4x4/chconf.h
index 4640ff5332b..03f63da36a8 100644
--- a/keyboards/handwired/ck4x4/chconf.h
+++ b/keyboards/handwired/ck4x4/chconf.h
@@ -331,7 +331,7 @@
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE FALSE
+#define CH_CFG_USE_MEMCORE TRUE
#endif
/**
diff --git a/keyboards/handwired/d48/README.md b/keyboards/handwired/d48/README.md
new file mode 100644
index 00000000000..a20b8a4251b
--- /dev/null
+++ b/keyboards/handwired/d48/README.md
@@ -0,0 +1,87 @@
+# D48
+
+
+
+A Proton C based handwired 48 key keyboard with 2 rotary encoders, I2C OLED, WS2812 strip, buzzer & clock!
+
+- Keyboard Maintainer: Andrew Dunai
+- Hardware Supported: Proton C handwired
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/d48:default
+
+## Details
+
+- Proton C based handwired keyboard
+- 2x custom 1.25mm stainless steel plates
+- Kailh Choc White (clicky)
+- 2x rotary encoders
+- 0.91" 128x32 I2 C OLED
+- Small buzzer mounted inside (still waiting for the AST1109MLTRQ boys)
+- WS2812 strip (14 LEDs)
+- DS1307 I2 C module real-time clock
+
+Build process: [album](https://imgur.com/gallery/zZZGdDw)
+
+## Pinout
+
+
+
+## Challenges
+
+I'm very happy with the result, but at some point Proton C was driving me nuts.
+
+I did a lot of trial and error during assembly & programming.
+There were a lot of *yet* undocumented caveats,
+so I'll outline them here so that you guys can avoid the same issues I had.
+
+## Matrix & encoders
+
+Although this is a 48-key board with a 12-col & 4-row matrix, I've decided to add an extra row above the first one
+to make my matrix 12x5 and wire encoders' push buttons as 2 extra keys, thus making it a total of 50 (12x4 + 2 encoders).
+I used 2 columns (9 & 12) for those buttons.
+
+So, a first row actually has 2 buttons on columns 9 & 12 (because encoders are located near those columns).
+Encoders' push buttons are also configured via QMK's keymap.
+
+Check out the `d48.h` & `config.h` for pins used & keymap macro definition.
+
+## I2 C/OLED
+
+Most of the stuff worked out of the box, except me choosing the right pins for my OLED.
+
+On the Proton C pinout, there are 3 labels for I2 C and for some reason
+there are 2 pairs of SDA/SCL for I2 C1 channel: `B8`/`B9` (rear left side) and `B6`/`B7` (rear right side).
+I'm not sure if this is a mistake or if I was doing something wrong. So initially I picked `B8`/`B9`
+which were not working. When I switched to B6/B7, things worked like a charm.
+Later I used B9 for matrix row. No issues so far.
+
+Oh, and by the way, while using `B8`/`B9`, keyboard was sometimes *swallowing* quick keypresses.
+I believe this was due to I(2)C timeouts (because incorrect pins were used for OLED).
+
+## Buzzer
+
+It turns out once you switch on `AUDIO_ENABLE`, you cannot use A4 & A5 because they interfere with the buzzer.
+My guess is that buzzer uses DAC channels (not sure why both).
+
+I couldn't find this in documentation. Honestly, Proton C has almost zero documentation and this was
+the biggest challenge. Anyway, apart from almost going crazy from those challenges, I really liked it!
+
+## RGB
+
+I used pin `A15` for my WS28128 RGB strip.
+
+## D1307 real-time clock
+
+Connecting DS1307 RTC was a piece of cake: same I2 pins as OLED (SDA/SCL), GND to GND and power to Proton C VUSB pin (5v).
+
+## Other issues
+
+- `B5` could not be used for matrix.
+- `TAP_CODE_DELAY` had to be increased to 10 to fix `tap_code(KC_VOLU/KC_VOLD)` calls being swallowed in encoder callback.
+- Be extremely attentive about the pinout: keep in mind that **the official Proton C pinout displays the rear of the board, not the front.** Being used to front pinouts, I ended up soldering entire matrix to the wrong side, so I had to desolder every wire and connect it to the opposite side.
+
+## Conclusion
+
+I had a lot of fun. The layout was inspired by the Planck THK. Feel free to ask any questions!
diff --git a/keyboards/handwired/d48/config.h b/keyboards/handwired/d48/config.h
new file mode 100644
index 00000000000..9c23442997d
--- /dev/null
+++ b/keyboards/handwired/d48/config.h
@@ -0,0 +1,77 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x6060
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Andrew Dunai
+#define PRODUCT D48
+
+/* Key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 12
+
+/* Key matrix pins */
+#define MATRIX_ROW_PINS { B8, B9, B1, B2, B4 }
+
+#define MATRIX_COL_PINS { A2, B0, A7, A8, A13, A14, B12, B11, B10, B15, B14, B13 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* Set 0 if debouncing isn't needed */
+// #define DEBOUNCE 5
+
+/* 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
+
+/* prevent stuck modifiers */
+// #define PREVENT_STUCK_MODIFIERS
+
+/* RGB Underglow */
+#ifdef RGBLIGHT_ENABLE
+#define RGB_DI_PIN A15
+#define RGBLED_NUM 14
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+#define RGBLIGHT_ANIMATIONS
+#endif
+
+/* Audio */
+#ifdef AUDIO_ENABLE
+#define STARTUP_SONG_DOOM SONG(E1M1_DOOM)
+#define STARTUP_SONG SONG( \
+ Q__NOTE(_E6), \
+ Q__NOTE(_A6), \
+ H__NOTE(_E7), \
+ Q__NOTE(_E6), \
+ Q__NOTE(_E7) \
+)
+#endif
+
+/* Encoders */
+#define ENCODERS_PAD_A { B3, A0 }
+#define ENCODERS_PAD_B { A6, A1 }
+/* #define ENCODER_RESOLUTION 4 */
+
+/* OLED */
+#define OLED_FONT_H "glcdfont_d48.c"
+#define OLED_TIMEOUT 0
+// #define OLED_SCROLL_TIMEOUT 1000
+
+/* Taps (encoder tap_code) */
+#define TAP_CODE_DELAY 10
+
+/* I2C */
+//#define I2C1_DUTY_CYCLE FAST_DUTY_CYCLE_2
+//#define PAL_MODE_STM32_ALTERNATE_OPENDRAIN (PAL_MODE_ALTERNATE(4) | PAL_STM32_OTYPE_OPENDRAIN)
+
+/* DS1307 */
+#define DS1307_ADDR (0x68 << 1)
diff --git a/keyboards/handwired/d48/d48.c b/keyboards/handwired/d48/d48.c
new file mode 100644
index 00000000000..3cc2097bf87
--- /dev/null
+++ b/keyboards/handwired/d48/d48.c
@@ -0,0 +1 @@
+#include "d48.h"
diff --git a/keyboards/handwired/d48/d48.h b/keyboards/handwired/d48/d48.h
new file mode 100644
index 00000000000..b698ca187f0
--- /dev/null
+++ b/keyboards/handwired/d48/d48.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "quantum.h"
+
+#define ___ KC_NO
+
+#define LAYOUT( \
+ K08, K0B, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, \
+ K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B \
+) { \
+ { ___, ___, ___, ___, ___, ___, ___, ___, K08, ___, ___, K0B }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B }, \
+ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B } \
+}
diff --git a/keyboards/handwired/d48/ds1307.c b/keyboards/handwired/d48/ds1307.c
new file mode 100644
index 00000000000..f6b57d50d2e
--- /dev/null
+++ b/keyboards/handwired/d48/ds1307.c
@@ -0,0 +1,21 @@
+#include "ds1307.h"
+#include "i2c_master.h"
+
+void ds1307_set_time(uint8_t h, uint8_t m, uint8_t s) {
+ uint8_t data[] = {
+ ((s % 10) | ((s / 10) << 4)) & 0x7F,
+ ((m % 10) | ((m / 10) << 4)) & 0x7F,
+ ((h % 10) | ((h / 10) << 4)) & 0x3F,
+ 0, 0, 0, 0, 0
+ }; // 24-hour mode
+ i2c_writeReg(DS1307_ADDR, 0, data, 8, 100);
+}
+
+void ds1307_get_time(uint8_t *h, uint8_t *m, uint8_t *s) {
+ uint8_t data[3];
+ i2c_readReg(DS1307_ADDR, 0, data, 3, 100);
+ i2c_stop();
+ *s = (data[0] & 0b1111) + ((data[0] & 0b1110000) >> 4) * 10;
+ *m = (data[1] & 0b1111) + ((data[1] & 0b1110000) >> 4) * 10;
+ *h = (data[2] & 0b1111) + ((data[2] & 0b0110000) >> 4) * 10;
+}
diff --git a/keyboards/handwired/d48/ds1307.h b/keyboards/handwired/d48/ds1307.h
new file mode 100644
index 00000000000..6f76db25089
--- /dev/null
+++ b/keyboards/handwired/d48/ds1307.h
@@ -0,0 +1,6 @@
+#pragma once
+
+#include
+
+void ds1307_set_time(uint8_t h, uint8_t m, uint8_t s);
+void ds1307_get_time(uint8_t *h, uint8_t *m, uint8_t *s);
diff --git a/keyboards/handwired/d48/glcdfont_d48.c b/keyboards/handwired/d48/glcdfont_d48.c
new file mode 100644
index 00000000000..19063b00ceb
--- /dev/null
+++ b/keyboards/handwired/d48/glcdfont_d48.c
@@ -0,0 +1,231 @@
+#include "progmem.h"
+
+// Helidox 8x6 font with QMK Firmware Logo
+// Online editor: http://teripom.x0.com/
+
+static const unsigned char font[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
+ 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
+ 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
+ 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
+ 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
+ 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
+ 0x00, 0x00, 0x08, 0x08, 0x00, 0x00,
+ 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
+ 0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
+ 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
+ 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
+ 0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
+ 0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
+ 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
+ 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
+ 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
+ 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
+ 0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
+ 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
+ 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
+ 0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
+ 0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
+ 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
+ 0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
+ 0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
+ 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
+ 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
+ 0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
+ 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
+ 0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
+ 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
+ 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
+ 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
+ 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
+ 0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
+ 0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
+ 0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
+ 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
+ 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
+ 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
+ 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
+ 0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
+ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
+ 0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
+ 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
+ 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
+ 0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
+ 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
+ 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
+ 0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
+ 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
+ 0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
+ 0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
+ 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
+ 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
+ 0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
+ 0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
+ 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
+ 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
+ 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
+ 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
+ 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
+ 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
+ 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
+ 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
+ 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
+ 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
+ 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
+ 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
+ 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
+ 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
+ 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
+ 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
+ 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
+ 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
+ 0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
+ 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
+ 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
+ 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
+ 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
+ 0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
+ 0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
+ 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
+ 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
+ 0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
+ 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
+ 0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
+ 0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
+ 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
+ 0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
+ 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
+ 0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
+ 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
+ 0x18, 0xA4, 0xA4, 0x9C, 0x78, 0x00,
+ 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
+ 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
+ 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
+ 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
+ 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
+ 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
+ 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
+ 0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
+ 0xFC, 0x18, 0x24, 0x24, 0x18, 0x00,
+ 0x18, 0x24, 0x24, 0x18, 0xFC, 0x00,
+ 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
+ 0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
+ 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
+ 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
+ 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
+ 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
+ 0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
+ 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00,
+ 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
+ 0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
+ 0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
+ 0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
+ 0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
+ 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x60, 0x70, 0x78, 0x3C,
+ 0x1E, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0,
+ 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC,
+ 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x07,
+ 0x07, 0x07, 0x07, 0x07, 0x07, 0x0F,
+ 0x1F, 0xFE, 0xFE, 0xF8, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xF0, 0xFC, 0xFE, 0xFE, 0x3F,
+ 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x9F,
+ 0xFF, 0xFE, 0xFE, 0xFC, 0xF0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3E, 0x22, 0x22, 0x00, 0x02, 0x3E,
+ 0x02, 0x00, 0x3E, 0x20, 0x20, 0x00,
+ 0x00, 0x3C, 0x0A, 0x3C, 0x00, 0x3E,
+ 0x20, 0x20, 0x02, 0x3E, 0x02, 0x00,
+ 0x00, 0x1C, 0x22, 0x32, 0x00, 0x1E,
+ 0x20, 0x20, 0x1E, 0x00, 0x3E, 0x00,
+ 0x00, 0x2C, 0x2A, 0x1A, 0x00, 0x3E,
+ 0x0A, 0x02, 0x00, 0x02, 0x3E, 0x02,
+ 0x00, 0x00, 0x08, 0x08, 0x08, 0x08,
+ 0x08, 0x08, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xC0, 0xF8, 0xFF, 0xFF,
+ 0xFF, 0xE7, 0xE0, 0xE0, 0xE7, 0xFF,
+ 0xFF, 0xFF, 0xF8, 0xC0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x3C,
+ 0x3C, 0x3C, 0x3C, 0x3C, 0x3C, 0x7E,
+ 0xFF, 0xE7, 0xE7, 0x81, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
+ 0xF0, 0xF8, 0x7C, 0x3E, 0x1F, 0x0F,
+ 0x07, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x22, 0x22, 0x00, 0x00,
+ 0x0F, 0x0F, 0x2F, 0x2F, 0x0F, 0x0F,
+ 0xF0, 0xF0, 0xF2, 0xF2, 0xF0, 0xF0,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x00, 0x22, 0x22, 0x00, 0xFF,
+ 0x0F, 0x0F, 0x2F, 0x2F, 0x0F, 0xFF,
+ 0xF0, 0xF0, 0xF2, 0xF2, 0xF0, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xF0, 0xFE, 0xFF, 0xFF, 0x0F, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x0F, 0xFF, 0xFF, 0xFE, 0xF0,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0,
+ 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xF0,
+ 0xF8, 0x7F, 0x7F, 0x1F, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0F, 0x3F, 0x7F, 0x7F, 0xFF,
+ 0xF9, 0xF0, 0xF0, 0xF0, 0xF0, 0xF8,
+ 0xFC, 0x7F, 0x7F, 0x3F, 0x0F, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0xFF, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F,
+ 0xFF, 0xF1, 0xF1, 0xF1, 0xF1, 0xF1,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
+ 0xFF, 0x11, 0x11, 0x11, 0x11, 0x11,
+};
diff --git a/keyboards/handwired/d48/keymaps/anderson/keymap.c b/keyboards/handwired/d48/keymaps/anderson/keymap.c
new file mode 100644
index 00000000000..25837a3591b
--- /dev/null
+++ b/keyboards/handwired/d48/keymaps/anderson/keymap.c
@@ -0,0 +1,340 @@
+#include QMK_KEYBOARD_H
+#include "taphold.h"
+#include "seq.h"
+#include "ds1307.h"
+#include "lightmode.h"
+#include
+
+/* Note: don't forget there's some more code in qmk_firmware/users/anderson dir */
+
+#define _MAIN 0
+#define _ALPHA 1
+#define _BETA 2
+
+enum custom_keycodes {
+ KC_MAIN = SAFE_RANGE,
+ KC_ALPHA,
+ KC_BETA,
+#ifdef LIGHTMODE_ENABLE
+ KC_LIGHT_MODE,
+#endif
+ KC_SEQ,
+ KC_SET_TIME,
+};
+#ifdef LIGHTMODE_ENABLE
+#endif
+
+/* TapHold is my own implementation of the `LT` macro. It's processed in `process_record_user()`. */
+#define TAPHOLD_CONFIG_SIZE 3
+taphold_t taphold_config[TAPHOLD_CONFIG_SIZE] = {
+ {.key=KC_ALPHA, .mode=TAPHOLD_LAYER, .shortAction=KC_ESC, .longAction=_ALPHA},
+ {.key=KC_BETA, .mode=TAPHOLD_LAYER, .shortAction=KC_EQL, .longAction=_BETA},
+ {.key=KC_RCTRL, .mode=TAPHOLD_MOD, .shortAction=KC_MINS, .longAction=KC_LCTRL},
+};
+uint16_t taphold_config_size = TAPHOLD_CONFIG_SIZE;
+uint32_t taphold_timeout = 90;
+
+/* Seq is implementation of unicode macros similar to UCIS, but with unicode strings. */
+#define SEQ_CONFIG_SIZE 3
+seq_t seq_config[SEQ_CONFIG_SIZE] = {
+ {.sequence="temp", .result="42°C"},
+ {.sequence="table", .result="┳━━┳"},
+ {.sequence="shrug", .result="¯\\_(ツ)_/¯"}
+};
+uint16_t seq_config_size = SEQ_CONFIG_SIZE;
+
+/* Colors */
+uint32_t layer_colors[3] = {
+ [_MAIN] = 0xFF0010,
+ [_ALPHA] = 0x4020FF,
+ [_BETA] = 0x20FF00,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Main layer
+ │MUTE │ │L_MOD│
+ ┏━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┓
+ ┃ TAB ┃ Q │ W │ E │ R │ T ┃ Y │ U │ I │ O │ P ┃ BSP ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃𝛼/ESC┃ A │ S │ D │ F │ G ┃ H │ J │ K │ L │ ; ┃ RET ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃SHIFT┃ Z │ X │ C │ V │ B ┃ N │ M │ , │ . │ / ┃CTL/-┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃LCTRL┃ │ │ ALT │ GUI │SPACE┃SPACE│ 𝛽/= │ ' │ │ ┃ \ ┃
+ ┗━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┛
+ */
+ [_MAIN] = LAYOUT( \
+ KC_MUTE, LCTL(KC_D),
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \
+ KC_ALPHA,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RCTRL,\
+ KC_LCTRL,_______, _______, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_BETA, KC_QUOT, _______, _______, KC_BSLS \
+ ),
+
+ /* Alpha layer (𝛼)
+ │ │ │ │
+ ┏━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┓
+ ┃ ┃PREV │PLAY │NEXT │ │NUMLK┃ - │ ^^^ │ ^ │ vvv │ ~ ┃ DEL ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃ ┃ │VOL -│VOL +│ │CPSLK┃HOME │ <-- │ v │ --> │ ` ┃ \ ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃ ┃ │ │ │ │SCRLK┃ END │ = │ [ │ ] │ ( ┃ ) ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃ ┃ │ │ │ │ ┃ │ │ │ │ ┃ ┃
+ ┗━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┛
+ */
+ [_ALPHA] = LAYOUT( \
+ _______, _______, \
+ _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, KC_NLCK, KC_MINS, KC_PGUP, KC_UP, KC_PGDN, KC_TILD, KC_DEL, \
+ _______, _______, KC_VOLD, KC_VOLU, _______, KC_CAPS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT,KC_GRV, KC_BSLS, \
+ _______, _______, _______, _______, _______, KC_SLCK, KC_END, KC_EQL, KC_LBRC, KC_RBRC, KC_LPRN ,KC_RPRN, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+ ),
+
+ /* Beta layer (𝛽)
+ │ │ │ │
+ ┏━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┓
+ ┃ RGB ┃ 1 │ 2 │ 3 │ 4 │ 5 ┃ 6 │ 7 │ 8 │ 9 │ 0 ┃ F12 ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃L_MOD┃ F1 │ F2 │ F3 │ F4 │ F5 ┃ F6 │ F7 │ F8 │ F9 │ F10 ┃ F11 ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃ ┃RESET│DEBUG│ │ │TIME ┃SLEEP│ SEQ │ { │ } │PTSCR┃ ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃ ┃ │ │ │ │ ┃ │ │ │ │ ┃ ┃
+ ┗━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┛
+ */
+ [_BETA] = LAYOUT( \
+ _______, _______, \
+ RGB_TOG, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12,
+#ifdef LIGHTMODE_ENABLE
+ KC_LIGHT_MODE,
+#else
+ _______,
+#endif
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, \
+ _______, RESET, DEBUG, _______, _______, KC_SET_TIME,KC_SLEP,KC_SEQ,KC_LCBR, KC_RCBR, KC_PSCR, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+ )
+};
+
+static bool alpha_pressed = false;
+static bool beta_pressed = false;
+
+static bool ctrl_pressed = false;
+static bool alt_pressed = false;
+static bool shift_pressed = false;
+static bool gui_pressed = false;
+
+static bool is_in_seq = false;
+
+void keyboard_post_init_user(void) {
+ /* debug_enable = true; */
+ /* debug_matrix = true; */
+}
+
+void eeconfig_init_user(void) {
+ set_unicode_input_mode(UC_LNX);
+}
+
+void matrix_init_user(void) {
+#ifdef LIGHTMODE_ENABLE
+ set_light_mode(SMOOTHLED, layer_colors[_MAIN]);
+#endif
+}
+
+static uint32_t last_update = 0;
+static uint8_t hours, minutes, seconds;
+
+void matrix_scan_user(void) {
+ uint32_t now = timer_read32();
+ if (now - last_update > 500) {
+ ds1307_get_time(&hours, &minutes, &seconds);
+ last_update = now;
+ }
+}
+
+static bool is_in_set_time = false;
+static char new_time[6];
+static uint8_t new_time_index = 0;
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (keycode == KC_SEQ && record->event.pressed) {
+ seq_start();
+ layer_off(_BETA);
+ is_in_seq = true;
+ return false;
+ } else if (is_in_seq) {
+ if (record->event.pressed) {
+ if (!seq_feed(keycode)) {
+ is_in_seq = false;
+ }
+ }
+ return false;
+ }
+ if (keycode == KC_SET_TIME && record->event.pressed) {
+ is_in_set_time = true;
+ new_time_index = 0;
+ } else if (is_in_set_time) {
+ if (!record->event.pressed && keycode >= KC_1 && keycode <= KC_0) {
+ new_time[new_time_index++] = (keycode == KC_0) ? 0 : keycode - KC_1 + 1;
+ if (new_time_index == 6) {
+ is_in_set_time = false;
+ ds1307_set_time(
+ (new_time[0]) * 10 + (new_time[1]),
+ (new_time[2]) * 10 + (new_time[3]),
+ (new_time[4]) * 10 + (new_time[5])
+ );
+ for (int i = 0; i < 6; i++) {
+ tap_code(KC_BSPACE);
+ }
+ }
+ }
+ }
+
+ if (keycode == KC_LCTRL || keycode == KC_RCTRL) {
+ ctrl_pressed = record->event.pressed;
+ } else if (keycode == KC_LALT) {
+ alt_pressed = record->event.pressed;
+ } else if (keycode == KC_LSFT) {
+ shift_pressed = record->event.pressed;
+ } else if (keycode == KC_LGUI) {
+ gui_pressed = record->event.pressed;
+ } else if (keycode == KC_ALPHA) {
+ alpha_pressed = record->event.pressed;
+ } else if (keycode == KC_BETA) {
+ beta_pressed = record->event.pressed;
+ }
+
+ if (keycode == RESET) {
+ rgblight_setrgb(255, 255, 0);
+ }
+#ifdef LIGHTMODE_ENABLE
+ if (record->event.pressed && keycode == KC_LIGHT_MODE) {
+ next_light_mode(layer_colors[_MAIN]);
+ }
+#endif
+ if (keycode == KC_LCTRL) {
+ /* Some Overlay1_Enable fuckery! */
+ (record->event.pressed ? register_code : unregister_code)(KC_LCTRL);
+ return false;
+ }
+ return taphold_process(keycode, record);
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+#ifdef LIGHTMODE_ENABLE
+ uint8_t layer = get_highest_layer(state);
+ update_light_mode(layer_colors[layer]);
+#endif
+ return state;
+}
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ if (!alpha_pressed) {
+ tap_code(clockwise ? KC_VOLD : KC_VOLU);
+ } else {
+ tap_code(clockwise ? KC_MPRV : KC_MNXT);
+ }
+ } else if (index == 1) {
+ if (!alpha_pressed) {
+ tap_code(clockwise ? KC_UP : KC_DOWN);
+ } else {
+ tap_code(clockwise ? KC_PGUP : KC_PGDN);
+ }
+ }
+}
+
+#ifdef OLED_DRIVER_ENABLE
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+ return OLED_ROTATION_0;
+}
+
+void oled_task_user(void) {
+ /* Host Keyboard Layer Status */
+ uint8_t current_layer = get_highest_layer(layer_state);
+
+ /* Layer */
+ static const char PROGMEM icons[4][3][6] = {
+ {
+ { 0x80, 0x81, 0x82, 0x83, 0x84, 0 },
+ { 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0 },
+ { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0 }
+ },
+ {
+ { 0x85, 0x86, 0x87, 0x88, 0x89, 0 },
+ { 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0 },
+ { 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0 }
+ },
+ {
+ { 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0 },
+ { 0xaa, 0xab, 0xac, 0xad, 0xae, 0 },
+ { 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0 }
+ },
+ {
+ { 0x8f, 0x90, 0x91, 0x92, 0x93, 0 },
+ { 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0 },
+ { 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0 }
+ }
+ };
+
+ uint8_t icon_index = current_layer == _MAIN ? 3 : current_layer == _ALPHA ? 1 : 2;
+ for (int i = 0; i < 3; i++) {
+ oled_set_cursor(0, i + 1);
+ oled_write_P(icons[icon_index][i], false);
+ }
+
+ /* Time */
+ oled_set_cursor(6, 0);
+ // oled_write_P(PSTR("-D48 Custom-\n"), false);
+ char buf[16];
+ sprintf(
+ buf,
+ "%02d:%02d:%02d", hours, minutes, seconds
+ );
+ oled_write(buf, false);
+
+ /* Modifiers */
+ static const char PROGMEM mods[][2] = {
+ {0x94, 0x95}, // CTL
+ {0x96, 0x97}, // ALT
+ {0x98, 0x99}, // GUI
+ {0x9a, 0x9b}, // SFT
+ /* {0x9c, 0x9d}, // EMPTY */
+ };
+
+ char mod_data[13] = "\x9c\x9d\x9c\x9d\x9c\x9d\x9c\x9d \x07\x07\x07\0";
+ if (ctrl_pressed) strncpy(mod_data, mods[0], 2);
+ if (alt_pressed) strncpy(mod_data + 2, mods[1], 2);
+ if (gui_pressed) strncpy(mod_data + 4, mods[2], 2);
+ if (shift_pressed) strncpy(mod_data + 6, mods[3], 2);
+ led_t led_usb_state = host_keyboard_led_state();
+ if (led_usb_state.num_lock) mod_data[9] = 'N';
+ if (led_usb_state.caps_lock) mod_data[10] = 'C';
+ if (led_usb_state.scroll_lock) mod_data[11] = 'S';
+
+ oled_set_cursor(6, 1);
+ oled_write(mod_data, false);
+
+ /* Matrix */
+ static const char PROGMEM matrix_chars[] = {
+ 0xb4, // None
+ 0xb5, // Upper
+ 0xb6, // Lower
+ 0xb7 // Both
+ };
+
+ for (uint8_t row = 1; row < MATRIX_ROWS; row += 2) {
+ // Skip first row because it's used by the encoders.
+ uint16_t bits1 = matrix_get_row(row);
+ uint16_t bits2 = matrix_get_row(row + 1);
+
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ uint8_t matrix_char = matrix_chars[((bits1 & (1 << col)) ? 1 : 0) | ((bits2 & (1 << col)) ? 2 : 0)];
+ oled_set_cursor(6 + col, 2 + (row - 1) / 2);
+ oled_write_char(matrix_char, false);
+ }
+ }
+
+}
+#endif
diff --git a/keyboards/handwired/d48/keymaps/anderson/lightmode.c b/keyboards/handwired/d48/keymaps/anderson/lightmode.c
new file mode 100644
index 00000000000..bc059562144
--- /dev/null
+++ b/keyboards/handwired/d48/keymaps/anderson/lightmode.c
@@ -0,0 +1,44 @@
+#include "lightmode.h"
+
+#ifdef LIGHTMODE_ENABLE
+
+/* Light modes switcher */
+
+uint8_t light_mode = SMOOTHLED;
+
+void set_light_mode(light_mode_t value, uint32_t color) {
+ light_mode = value;
+ if (light_mode == SMOOTHLED) {
+ smoothled_set(color);
+ } else {
+ dmc12_start(color, true);
+ }
+}
+
+void process_light_mode(void) {
+ if (light_mode == SMOOTHLED) {
+ smoothled_process();
+ } else {
+ dmc12_process();
+ }
+}
+
+void update_light_mode(uint32_t color) {
+ if (light_mode == SMOOTHLED) {
+ smoothled_set(color);
+ } else {
+ dmc12_start(color, false);
+ }
+}
+
+void next_light_mode(uint32_t color) {
+ light_mode = (light_mode + 1) % LIGHT_MODE_SIZE;
+ set_light_mode(light_mode, color);
+}
+
+void matrix_scan_kb(void) {
+ process_light_mode();
+ matrix_scan_user();
+}
+
+#endif
diff --git a/keyboards/handwired/d48/keymaps/anderson/lightmode.h b/keyboards/handwired/d48/keymaps/anderson/lightmode.h
new file mode 100644
index 00000000000..0c81e476bbe
--- /dev/null
+++ b/keyboards/handwired/d48/keymaps/anderson/lightmode.h
@@ -0,0 +1,12 @@
+#include "smoothled.h"
+#include "dmc12.h"
+#include "quantum.h"
+
+/* Light modes */
+enum light_mode_enum { SMOOTHLED, DMC12, LIGHT_MODE_SIZE };
+typedef enum light_mode_enum light_mode_t;
+
+void set_light_mode(light_mode_t value, uint32_t color);
+void process_light_mode(void);
+void update_light_mode(uint32_t color);
+void next_light_mode(uint32_t color);
diff --git a/keyboards/handwired/d48/keymaps/anderson/rules.mk b/keyboards/handwired/d48/keymaps/anderson/rules.mk
new file mode 100644
index 00000000000..e925b9a89f7
--- /dev/null
+++ b/keyboards/handwired/d48/keymaps/anderson/rules.mk
@@ -0,0 +1,2 @@
+OPT_DEFS += -DLIGHTMODE_ENABLE
+SRC += smoothled.c dmc12.c seq.c lightmode.c
diff --git a/keyboards/handwired/d48/keymaps/default/keymap.c b/keyboards/handwired/d48/keymaps/default/keymap.c
new file mode 100644
index 00000000000..b7914f3bcd5
--- /dev/null
+++ b/keyboards/handwired/d48/keymaps/default/keymap.c
@@ -0,0 +1,285 @@
+#include QMK_KEYBOARD_H
+#include
+#include
+#include "taphold.h"
+#include "ds1307.h"
+
+/* Note: don't forget there's some more code in qmk_firmware/users/anderson dir */
+
+#define _MAIN 0
+#define _ALPHA 1
+#define _BETA 2
+
+enum custom_keycodes {
+ KC_MAIN = SAFE_RANGE,
+ KC_ALPHA,
+ KC_BETA,
+ KC_SET_TIME,
+};
+
+/* TapHold is my own implementation of the `LT` macro. It's processed in `process_record_user()`. */
+#define TAPHOLD_CONFIG_SIZE 3
+taphold_t taphold_config[TAPHOLD_CONFIG_SIZE] = {
+ {.key=KC_ALPHA, .mode=TAPHOLD_LAYER, .shortAction=KC_ESC, .longAction=_ALPHA},
+ {.key=KC_BETA, .mode=TAPHOLD_LAYER, .shortAction=KC_EQL, .longAction=_BETA},
+ {.key=KC_RCTRL, .mode=TAPHOLD_MOD, .shortAction=KC_MINS, .longAction=KC_LCTRL},
+};
+uint16_t taphold_config_size = TAPHOLD_CONFIG_SIZE;
+uint32_t taphold_timeout = 90;
+
+/* Colors */
+uint32_t layer_colors[3] = {
+ [_MAIN] = 0xFF0010,
+ [_ALPHA] = 0x4020FF,
+ [_BETA] = 0x20FF00,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Main layer
+ │MUTE │ │L_MOD│
+ ┏━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┓
+ ┃ TAB ┃ Q │ W │ E │ R │ T ┃ Y │ U │ I │ O │ P ┃ BSP ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃𝛼/ESC┃ A │ S │ D │ F │ G ┃ H │ J │ K │ L │ ; ┃ RET ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃SHIFT┃ Z │ X │ C │ V │ B ┃ N │ M │ , │ . │ / ┃CTL/-┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃LCTRL┃ │ │ ALT │ GUI │SPACE┃SPACE│ 𝛽/= │ ' │ │ ┃ \ ┃
+ ┗━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┛
+ */
+ [_MAIN] = LAYOUT( \
+ KC_MUTE, _______, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \
+ KC_ALPHA,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RCTRL,\
+ KC_LCTRL,_______, _______, KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_BETA, KC_QUOT, _______, _______, KC_BSLS \
+ ),
+
+ /* Alpha layer (𝛼)
+ │ │ │ │
+ ┏━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┓
+ ┃ ┃PREV │PLAY │NEXT │ │NUMLK┃ - │ ^^^ │ ^ │ vvv │ ~ ┃ DEL ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃ ┃ │VOL -│VOL +│ │CPSLK┃HOME │ <-- │ v │ --> │ ` ┃ \ ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃ ┃ │ │ │ │SCRLK┃ END │ = │ [ │ ] │ ( ┃ ) ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃ ┃ │ │ │ │ ┃ │ │ │ │ ┃ ┃
+ ┗━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┛
+ */
+ [_ALPHA] = LAYOUT( \
+ _______, _______, \
+ _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, KC_NLCK, KC_MINS, KC_PGUP, KC_UP, KC_PGDN, KC_TILD, KC_DEL, \
+ _______, _______, KC_VOLD, KC_VOLU, _______, KC_CAPS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT,KC_GRV, KC_BSLS, \
+ _______, _______, _______, _______, _______, KC_SLCK, KC_END, KC_EQL, KC_LBRC, KC_RBRC, KC_LPRN ,KC_RPRN, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+ ),
+
+ /* Beta layer (𝛽)
+ │ │ │ │
+ ┏━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┯━━━━━┯━━━━━┯━━━━━┯━━━━━┳━━━━━┓
+ ┃ RGB ┃ 1 │ 2 │ 3 │ 4 │ 5 ┃ 6 │ 7 │ 8 │ 9 │ 0 ┃ F12 ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃L_MOD┃ F1 │ F2 │ F3 │ F4 │ F5 ┃ F6 │ F7 │ F8 │ F9 │ F10 ┃ F11 ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃ ┃RESET│DEBUG│ │ │TIME ┃SLEEP│ │ { │ } │PTSCR┃ ┃
+ ┣━━━━━╉─────┼─────┼─────┼─────┼─────╂─────┼─────┼─────┼─────┼─────╊━━━━━┫
+ ┃ ┃ │ │ │ │ ┃ │ │ │ │ ┃ ┃
+ ┗━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┷━━━━━┷━━━━━┷━━━━━┷━━━━━┻━━━━━┛
+ */
+ [_BETA] = LAYOUT( \
+ _______, _______, \
+ RGB_TOG, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12,
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, \
+ _______, RESET, DEBUG, _______, _______, KC_SET_TIME,KC_SLEP,_______,KC_LCBR,KC_RCBR, KC_PSCR, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+ )
+};
+
+static bool alpha_pressed = false;
+static bool beta_pressed = false;
+
+static bool ctrl_pressed = false;
+static bool alt_pressed = false;
+static bool shift_pressed = false;
+static bool gui_pressed = false;
+
+void keyboard_post_init_user(void) {
+ /* debug_enable = true; */
+ /* debug_matrix = true; */
+}
+
+void eeconfig_init_user(void) {
+ set_unicode_input_mode(UC_LNX);
+}
+
+static uint32_t last_update = 0;
+static uint8_t hours, minutes, seconds;
+
+void matrix_scan_user(void) {
+ uint32_t now = timer_read32();
+ if (now - last_update > 500) {
+ ds1307_get_time(&hours, &minutes, &seconds);
+ last_update = now;
+ }
+}
+
+static bool is_in_set_time = false;
+static char new_time[6];
+static uint8_t new_time_index = 0;
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (keycode == KC_SET_TIME && record->event.pressed) {
+ is_in_set_time = true;
+ new_time_index = 0;
+ } else if (is_in_set_time) {
+ if (!record->event.pressed && keycode >= KC_1 && keycode <= KC_0) {
+ new_time[new_time_index++] = (keycode == KC_0) ? 0 : keycode - KC_1 + 1;
+ if (new_time_index == 6) {
+ is_in_set_time = false;
+ ds1307_set_time(
+ (new_time[0]) * 10 + (new_time[1]),
+ (new_time[2]) * 10 + (new_time[3]),
+ (new_time[4]) * 10 + (new_time[5])
+ );
+ for (int i = 0; i < 6; i++) {
+ tap_code(KC_BSPACE);
+ }
+ }
+ }
+ }
+
+ if (keycode == KC_LCTRL || keycode == KC_RCTRL) {
+ ctrl_pressed = record->event.pressed;
+ } else if (keycode == KC_LALT) {
+ alt_pressed = record->event.pressed;
+ } else if (keycode == KC_LSFT) {
+ shift_pressed = record->event.pressed;
+ } else if (keycode == KC_LGUI) {
+ gui_pressed = record->event.pressed;
+ } else if (keycode == KC_ALPHA) {
+ alpha_pressed = record->event.pressed;
+ } else if (keycode == KC_BETA) {
+ beta_pressed = record->event.pressed;
+ }
+
+ if (keycode == RESET) {
+ rgblight_setrgb(255, 255, 0);
+ }
+ if (keycode == KC_LCTRL) {
+ /* Some Overlay1_Enable fuckery! */
+ (record->event.pressed ? register_code : unregister_code)(KC_LCTRL);
+ return false;
+ }
+ return taphold_process(keycode, record);
+}
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ if (!alpha_pressed) {
+ tap_code(clockwise ? KC_VOLD : KC_VOLU);
+ } else {
+ tap_code(clockwise ? KC_MPRV : KC_MNXT);
+ }
+ } else if (index == 1) {
+ if (!alpha_pressed) {
+ tap_code(clockwise ? KC_UP : KC_DOWN);
+ } else {
+ tap_code(clockwise ? KC_PGUP : KC_PGDN);
+ }
+ }
+}
+
+#ifdef OLED_DRIVER_ENABLE
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+ return OLED_ROTATION_0;
+}
+
+void oled_task_user(void) {
+ /* Host Keyboard Layer Status */
+ uint8_t current_layer = get_highest_layer(layer_state);
+
+ /* Layer */
+ static const char PROGMEM icons[4][3][6] = {
+ {
+ { 0x80, 0x81, 0x82, 0x83, 0x84, 0 },
+ { 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0 },
+ { 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0 }
+ },
+ {
+ { 0x85, 0x86, 0x87, 0x88, 0x89, 0 },
+ { 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0 },
+ { 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0 }
+ },
+ {
+ { 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0 },
+ { 0xaa, 0xab, 0xac, 0xad, 0xae, 0 },
+ { 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0 }
+ },
+ {
+ { 0x8f, 0x90, 0x91, 0x92, 0x93, 0 },
+ { 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0 },
+ { 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0 }
+ }
+ };
+
+ uint8_t icon_index = current_layer == _MAIN ? 3 : current_layer == _ALPHA ? 1 : 2;
+ for (int i = 0; i < 3; i++) {
+ oled_set_cursor(0, i + 1);
+ oled_write_P(icons[icon_index][i], false);
+ }
+
+ /* Time */
+ oled_set_cursor(6, 0);
+ // oled_write_P(PSTR("-D48 Custom-\n"), false);
+ char buf[16];
+ sprintf(
+ buf,
+ "%02d:%02d:%02d", hours, minutes, seconds
+ );
+ oled_write(buf, false);
+
+ /* Modifiers */
+ static const char PROGMEM mods[][2] = {
+ {0x94, 0x95}, // CTL
+ {0x96, 0x97}, // ALT
+ {0x98, 0x99}, // GUI
+ {0x9a, 0x9b}, // SFT
+ /* {0x9c, 0x9d}, // EMPTY */
+ };
+
+ char mod_data[13] = "\x9c\x9d\x9c\x9d\x9c\x9d\x9c\x9d \x07\x07\x07\0";
+ if (ctrl_pressed) strncpy(mod_data, mods[0], 2);
+ if (alt_pressed) strncpy(mod_data + 2, mods[1], 2);
+ if (gui_pressed) strncpy(mod_data + 4, mods[2], 2);
+ if (shift_pressed) strncpy(mod_data + 6, mods[3], 2);
+ led_t led_usb_state = host_keyboard_led_state();
+ if (led_usb_state.num_lock) mod_data[9] = 'N';
+ if (led_usb_state.caps_lock) mod_data[10] = 'C';
+ if (led_usb_state.scroll_lock) mod_data[11] = 'S';
+
+ oled_set_cursor(6, 1);
+ oled_write(mod_data, false);
+
+ /* Matrix */
+ static const char PROGMEM matrix_chars[] = {
+ 0xb4, // None
+ 0xb5, // Upper
+ 0xb6, // Lower
+ 0xb7 // Both
+ };
+
+ for (uint8_t row = 1; row < MATRIX_ROWS; row += 2) {
+ // Skip first row because it's used by the encoders.
+ uint16_t bits1 = matrix_get_row(row);
+ uint16_t bits2 = matrix_get_row(row + 1);
+
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ uint8_t matrix_char = matrix_chars[((bits1 & (1 << col)) ? 1 : 0) | ((bits2 & (1 << col)) ? 2 : 0)];
+ oled_set_cursor(6 + col, 2 + (row - 1) / 2);
+ oled_write_char(matrix_char, false);
+ }
+ }
+
+}
+#endif
diff --git a/keyboards/handwired/d48/rules.mk b/keyboards/handwired/d48/rules.mk
new file mode 100644
index 00000000000..57c83694e1d
--- /dev/null
+++ b/keyboards/handwired/d48/rules.mk
@@ -0,0 +1,22 @@
+# MCU name
+MCU = STM32F303
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = yes
+USE_I2C = no
+RGBLIGHT_ENABLE = yes
+ENCODER_ENABLE = yes
+OLED_DRIVER_ENABLE = yes
+UNICODE_ENABLE = yes
+
+SRC += ds1307.c taphold.c
diff --git a/keyboards/handwired/d48/taphold.c b/keyboards/handwired/d48/taphold.c
new file mode 100644
index 00000000000..0b56a5a6a10
--- /dev/null
+++ b/keyboards/handwired/d48/taphold.c
@@ -0,0 +1,29 @@
+#include "taphold.h"
+
+bool taphold_process(uint16_t keycode, keyrecord_t *record) {
+ for (int i = 0; i < taphold_config_size; i++) {
+ taphold_t *config = &taphold_config[i];
+ if (config->key == keycode && record->event.pressed) {
+ if (config->mode == TAPHOLD_LAYER) {
+ layer_on(config->longAction);
+ } else {
+ register_code(config->longAction);
+ }
+ config->time = timer_read32();
+ config->keypos = record->event.key;
+ return false;
+ } else if (KEYEQ(record->event.key, config->keypos) && !record->event.pressed) {
+ if (config->mode == TAPHOLD_LAYER) {
+ layer_off(config->longAction);
+ } else {
+ unregister_code(config->longAction);
+ }
+ if (timer_elapsed32(config->time) < taphold_timeout) {
+ tap_code(config->shortAction);
+ }
+ config->keypos.row = 255;
+ return false;
+ }
+ }
+ return true;
+}
diff --git a/keyboards/handwired/d48/taphold.h b/keyboards/handwired/d48/taphold.h
new file mode 100644
index 00000000000..3bc5ca02756
--- /dev/null
+++ b/keyboards/handwired/d48/taphold.h
@@ -0,0 +1,25 @@
+#include "quantum.h"
+
+typedef enum taphold_mode_t {
+ TAPHOLD_LAYER,
+ TAPHOLD_MOD
+} taphold_mode_t;
+
+typedef struct taphold_t {
+ uint16_t key;
+ uint32_t time;
+ taphold_mode_t mode;
+ uint16_t shortAction;
+ uint16_t longAction;
+ keypos_t keypos;
+ // We store key pos to properly release the key
+ // even when a different layer is active and the key has a different action now
+} taphold_t;
+
+extern taphold_t taphold_config[];
+extern uint16_t taphold_config_size;
+// Dual keys tap/hold timeout.
+// If key is tapped for less than this value, send key in addition to primary action after completing the action.
+extern uint32_t taphold_timeout;
+
+bool taphold_process(uint16_t keycode, keyrecord_t *record);
diff --git a/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/config.h b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/config.h
index 10b96932677..3190132085e 100644
--- a/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/config.h
+++ b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/config.h
@@ -1,7 +1,5 @@
#pragma once
-#include "333fred_config.h"
-
#define USE_SERIAL
#define EE_HANDS
diff --git a/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/keymap.c b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/keymap.c
index bc61579de8a..d8ac1910bfc 100644
--- a/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/keymap.c
+++ b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/keymap.c
@@ -1,12 +1,6 @@
#include QMK_KEYBOARD_H
#include "333fred.h"
-enum custom_macros {
- DLEFT,
- DRIGHT,
- PSCREEN_APP
-};
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[BASE] = LAYOUT_5x6(
diff --git a/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/rules.mk b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/rules.mk
index 79ef33e7c36..6d2e27cb41c 100644
--- a/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/rules.mk
+++ b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/rules.mk
@@ -1,7 +1,3 @@
-
-NKRO_ENABLE = yes
KEY_LOCK_ENABLE = yes
-TAP_DANCE_ENABLE = yes
CONSOLE_ENABLE = no
-PERMISSIVE_HOLD = yes
EXTRAFLAGS += -flto
diff --git a/keyboards/handwired/ddg_56/config.h b/keyboards/handwired/ddg_56/config.h
new file mode 100644
index 00000000000..de4c94e6590
--- /dev/null
+++ b/keyboards/handwired/ddg_56/config.h
@@ -0,0 +1,39 @@
+/* Copyright 2019 Spaceman
+ *
+ * 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 .
+ */
+#pragma once
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0xB195
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Spaceman
+#define PRODUCT DDG_56
+#define DESCRIPTION DDG_56
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 14
+
+#define DIODE_DIRECTION COL2ROW
+
+#define MATRIX_ROW_PINS { B5, B15, B9, B10, A14 }
+#define MATRIX_COL_PINS { A2, B8, B13, B14, B4, B11, B12, A13, A15, A8, A7, A6, B0, B1 }
+
+#define QMK_SPEAKER A5
+
+#define ENCODERS_PAD_A { A1, B3 }
+#define ENCODERS_PAD_B { A0, B2 }
diff --git a/keyboards/handwired/ddg_56/ddg_56.c b/keyboards/handwired/ddg_56/ddg_56.c
new file mode 100644
index 00000000000..5d24bc74b55
--- /dev/null
+++ b/keyboards/handwired/ddg_56/ddg_56.c
@@ -0,0 +1,16 @@
+/* Copyright 2019 Spaceman
+ *
+ * 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 .
+ */
+#include "ddg_56.h"
\ No newline at end of file
diff --git a/keyboards/handwired/ddg_56/ddg_56.h b/keyboards/handwired/ddg_56/ddg_56.h
new file mode 100644
index 00000000000..dd0c78bea0b
--- /dev/null
+++ b/keyboards/handwired/ddg_56/ddg_56.h
@@ -0,0 +1,32 @@
+/* Copyright 2019 Spaceman
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "quantum.h"
+#define LAYOUT( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k1D, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k2D, k3D, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k4B, \
+ k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4C, k4D \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D }, \
+ { k30, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D } \
+}
diff --git a/keyboards/handwired/ddg_56/info.json b/keyboards/handwired/ddg_56/info.json
new file mode 100644
index 00000000000..1b0509b0ec3
--- /dev/null
+++ b/keyboards/handwired/ddg_56/info.json
@@ -0,0 +1,17 @@
+{
+ "keyboard_name": "ddg_56",
+ "url": "",
+ "maintainer": "spaceman",
+ "width": 16.5,
+ "height": 5.25,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"x":0, "y":0.25}, {"x":1.25, "y":0}, {"x":2.25, "y":0}, {"x":3.25, "y":0}, {"x":4.25, "y":0}, {"x":5.25, "y":0}, {"x":6.25, "y":0}, {"x":7.25, "y":0}, {"x":8.25, "y":0}, {"x":9.25, "y":0}, {"x":10.25, "y":0}, {"x":11.25, "y":0}, {"x":12.25, "y":0}, {"x":14, "y":1}, {"x":15, "y":1},
+ {"x":0, "y":1.25}, {"x":1.25, "y":1}, {"x":2.25, "y":1}, {"x":3.25, "y":1}, {"x":4.25, "y":1}, {"x":5.25, "y":1}, {"x":6.25, "y":1}, {"x":7.25, "y":1}, {"x":8.25, "y":1}, {"x":9.25, "y":1}, {"x":10.25, "y":1}, {"x":11.25, "y":1}, {"x":12.25, "y":1}, {"x":14, "y":2}, {"x":15, "y":2},
+ {"x":0, "y":2.25}, {"x":1.25, "y":2}, {"x":2.25, "y":2}, {"x":3.25, "y":2}, {"x":4.25, "y":2}, {"x":5.25, "y":2}, {"x":6.25, "y":2}, {"x":7.25, "y":2}, {"x":8.25, "y":2}, {"x":9.25, "y":2}, {"x":10.25, "y":2}, {"x":11.25, "y":2}, {"x":12.25, "y":2},
+ {"x":0, "y":3.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3},
+ {"x":14.5, "y":3.25}, {"x":1.3333, "y":4, "w":1.5}, {"x":2.8333, "y":4}, {"x":3.8333, "y":4, "w":1.25}, {"x":5.0833, "y":4}, {"x":6.0833, "y":4, "w":2.25}, {"x":8.3333, "y":4}, {"x":9.3333, "y":4, "w":1.25}, {"x":10.5833, "y":4}, {"x":11.5833, "y":4, "w":1.5}, {"x":13.5, "y":4.25}, {"x":14.5, "y":4.25}, {"x":15.5, "y":4.25}]
+ }
+ }
+}
diff --git a/keyboards/handwired/ddg_56/keymaps/default/keymap.c b/keyboards/handwired/ddg_56/keymaps/default/keymap.c
new file mode 100644
index 00000000000..fd0f2a25728
--- /dev/null
+++ b/keyboards/handwired/ddg_56/keymaps/default/keymap.c
@@ -0,0 +1,35 @@
+#include QMK_KEYBOARD_H
+enum layers {
+ _DEFAULT,
+ _LOWER,
+ _RAISE
+};
+
+#define LOWER LT(2,KC_BSPC)
+#define RAISE LT(1,KC_ENT)
+#define KC_DSPACE SFT_T(KC_SPC)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_DEFAULT] = LAYOUT(
+ KC_HOME, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, KC_MINS, KC_EQL,
+ KC_PGUP, KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_LBRC, KC_RBRC,
+ KC_PGDN, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_END, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, RAISE, KC_DSPACE, LOWER, KC_RGUI, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [_RAISE] = LAYOUT(
+ KC_HOME, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, KC_PGUP, KC_HOME,
+ KC_PGUP, KC_TRNS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_TRNS, KC_PGDN, KC_END,
+ KC_PGDN, KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [_LOWER] = LAYOUT(
+ RESET, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MSTP,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT)
+
+};
diff --git a/keyboards/handwired/ddg_56/readme.md b/keyboards/handwired/ddg_56/readme.md
new file mode 100644
index 00000000000..de4277c00a0
--- /dev/null
+++ b/keyboards/handwired/ddg_56/readme.md
@@ -0,0 +1,9 @@
+# DDG-56
+
+* Keyboard Maintainer: [Rionlion100](https://github.com/rionlion100)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/ddg_56:default
+
+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).
diff --git a/keyboards/handwired/ddg_56/rules.mk b/keyboards/handwired/ddg_56/rules.mk
new file mode 100644
index 00000000000..0604f117639
--- /dev/null
+++ b/keyboards/handwired/ddg_56/rules.mk
@@ -0,0 +1,17 @@
+# MCU name
+MCU = STM32F303
+
+# Build Options
+# change to "no" to disable the options, or define them in the Makefile in
+# the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = no # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+MIDI_ENABLE = no # MIDI controls
+AUDIO_ENABLE = yes # Audio output on port C6
+UNICODE_ENABLE = no # Unicode
\ No newline at end of file
diff --git a/keyboards/handwired/fc200rt_qmk/config.h b/keyboards/handwired/fc200rt_qmk/config.h
new file mode 100644
index 00000000000..12c40360b1b
--- /dev/null
+++ b/keyboards/handwired/fc200rt_qmk/config.h
@@ -0,0 +1,133 @@
+/*
+Copyright 2020 NaCly
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xBEEF
+#define PRODUCT_ID 0xFFFF
+#define DEVICE_VER 0x0001
+#define MANUFACTURER NaCly
+#define PRODUCT fc200rt_qmk
+#define DESCRIPTION Leopold FC200RT QMK enbabled with Teensy 2.0
+
+/* key matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 16
+
+#define MATRIX_ROW_PINS { B0, B1, B2, B3, E6, B7, D0, D1 }
+#define MATRIX_COL_PINS { D2, D3, C6, C7, D5, D4, D6, D7, B4, B5, B6, F7, F6, F5, F4, F1 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION ROW2COL
+
+/* 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 userful 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
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+/* defined by default; to change, uncomment and set to the combination you want */
+// #define IS_COMMAND() (get_mods() == MOD_MASK_SHIFT)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP H
+//#define MAGIC_KEY_HELP_ALT SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER0_ALT GRAVE
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER B
+//#define MAGIC_KEY_BOOTLOADER_ALT ESC
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_EEPROM_CLEAR BSPACE
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/* disable these deprecated features by default */
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
diff --git a/keyboards/handwired/fc200rt_qmk/fc200rt_qmk.c b/keyboards/handwired/fc200rt_qmk/fc200rt_qmk.c
new file mode 100644
index 00000000000..3e38e5e2fd2
--- /dev/null
+++ b/keyboards/handwired/fc200rt_qmk/fc200rt_qmk.c
@@ -0,0 +1,17 @@
+/* Copyright 2020 NaCly
+ *
+ * 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 .
+ */
+
+#include "fc200rt_qmk.h"
diff --git a/keyboards/handwired/fc200rt_qmk/fc200rt_qmk.h b/keyboards/handwired/fc200rt_qmk/fc200rt_qmk.h
new file mode 100644
index 00000000000..f9abbf38357
--- /dev/null
+++ b/keyboards/handwired/fc200rt_qmk/fc200rt_qmk.h
@@ -0,0 +1,46 @@
+/* Copyright 2020 NaCly
+ *
+ * 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 .
+ */
+
+#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( \
+ k31, k62, k63, k13, k33, k70, k36, k17, k67, k6A, k7A, k3A, k5A, k79, k09, k00, \
+ k61, k71, k72, k73, k74, k64, k65, k75, k76, k77, k78, k68, k66, k1A, k6C, k6E, k6D, \
+ k11, k01, k02, k03, k04, k14, k15, k05, k06, k07, k08, k18, k16, k2A, k6B, k7E, k7D, \
+ k12, k21, k22, k23, k24, k34, k35, k25, k26, k27, k28, k38, k4A, \
+ k1F, k41, k42, k43, k44, k54, k55, k45, k46, k47, k58, k2F, k3E, \
+ k60, k10, k39, k3B, k59, k29, k57, k40, k5E, k5B, k5C \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, KC_NO, k1A, KC_NO, KC_NO, KC_NO, KC_NO, k1F }, \
+ { KC_NO, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, KC_NO, KC_NO, KC_NO, KC_NO, k2F }, \
+ { KC_NO, k31, KC_NO, k33, k34, k35, k36, KC_NO, k38, k39, k3A, k3B, KC_NO, KC_NO, k3E, KC_NO }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, KC_NO, KC_NO, k4A, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, k54, k55, KC_NO, k57, k58, k59, k5A, k5B, k5C, KC_NO, k5E, KC_NO }, \
+ { k60, k61, k62, k63, k64, k65, k66, k67, k68, KC_NO, k6A, k6B, k6C, k6D, k6E, KC_NO }, \
+ { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7A, KC_NO, KC_NO, k7D, k7E, KC_NO }, \
+}
diff --git a/keyboards/handwired/fc200rt_qmk/info.json b/keyboards/handwired/fc200rt_qmk/info.json
new file mode 100644
index 00000000000..2a8bf3dd9f7
--- /dev/null
+++ b/keyboards/handwired/fc200rt_qmk/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "fc200rt_qmk",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 18.25,
+ "height": 6.5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":2, "y":0}, {"label":"F2", "x":3, "y":0}, {"label":"F3", "x":4, "y":0}, {"label":"F4", "x":5, "y":0}, {"label":"F5", "x":6.5, "y":0}, {"label":"F6", "x":7.5, "y":0}, {"label":"F7", "x":8.5, "y":0}, {"label":"F8", "x":9.5, "y":0}, {"label":"F9", "x":11, "y":0}, {"label":"F10", "x":12, "y":0}, {"label":"F11", "x":13, "y":0}, {"label":"F12", "x":14, "y":0}, {"label":"PrtSc", "x":15.25, "y":0}, {"label":"Scroll Lock", "x":16.25, "y":0}, {"label":"Pause", "x":17.25, "y":0}, {"label":"~", "x":0, "y":1.5}, {"label":"!", "x":1, "y":1.5}, {"label":"@", "x":2, "y":1.5}, {"label":"#", "x":3, "y":1.5}, {"label":"$", "x":4, "y":1.5}, {"label":"%", "x":5, "y":1.5}, {"label":"^", "x":6, "y":1.5}, {"label":"&", "x":7, "y":1.5}, {"label":"*", "x":8, "y":1.5}, {"label":"(", "x":9, "y":1.5}, {"label":")", "x":10, "y":1.5}, {"label":"_", "x":11, "y":1.5}, {"label":"+", "x":12, "y":1.5}, {"label":"Backspace", "x":13, "y":1.5, "w":2}, {"label":"Insert", "x":15.25, "y":1.5}, {"label":"Home", "x":16.25, "y":1.5}, {"label":"PgUp", "x":17.25, "y":1.5}, {"label":"Tab", "x":0, "y":2.5, "w":1.5}, {"label":"Q", "x":1.5, "y":2.5}, {"label":"W", "x":2.5, "y":2.5}, {"label":"E", "x":3.5, "y":2.5}, {"label":"R", "x":4.5, "y":2.5}, {"label":"T", "x":5.5, "y":2.5}, {"label":"Y", "x":6.5, "y":2.5}, {"label":"U", "x":7.5, "y":2.5}, {"label":"I", "x":8.5, "y":2.5}, {"label":"O", "x":9.5, "y":2.5}, {"label":"P", "x":10.5, "y":2.5}, {"label":"{", "x":11.5, "y":2.5}, {"label":"}", "x":12.5, "y":2.5}, {"label":"|", "x":13.5, "y":2.5, "w":1.5}, {"label":"Delete", "x":15.25, "y":2.5}, {"label":"End", "x":16.25, "y":2.5}, {"label":"PgDn", "x":17.25, "y":2.5}, {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75}, {"label":"A", "x":1.75, "y":3.5}, {"label":"S", "x":2.75, "y":3.5}, {"label":"D", "x":3.75, "y":3.5}, {"label":"F", "x":4.75, "y":3.5}, {"label":"G", "x":5.75, "y":3.5}, {"label":"H", "x":6.75, "y":3.5}, {"label":"J", "x":7.75, "y":3.5}, {"label":"K", "x":8.75, "y":3.5}, {"label":"L", "x":9.75, "y":3.5}, {"label":":", "x":10.75, "y":3.5}, {"label":"\"", "x":11.75, "y":3.5}, {"label":"Enter", "x":12.75, "y":3.5, "w":2.25}, {"label":"Shift", "x":0, "y":4.5, "w":2.25}, {"label":"Z", "x":2.25, "y":4.5}, {"label":"X", "x":3.25, "y":4.5}, {"label":"C", "x":4.25, "y":4.5}, {"label":"V", "x":5.25, "y":4.5}, {"label":"B", "x":6.25, "y":4.5}, {"label":"N", "x":7.25, "y":4.5}, {"label":"M", "x":8.25, "y":4.5}, {"label":"<", "x":9.25, "y":4.5}, {"label":">", "x":10.25, "y":4.5}, {"label":"?", "x":11.25, "y":4.5}, {"label":"Shift", "x":12.25, "y":4.5, "w":2.75}, {"label":"\u2191", "x":16.25, "y":4.5}, {"label":"Ctrl", "x":0, "y":5.5, "w":1.25}, {"label":"Win", "x":1.25, "y":5.5, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.5, "w":1.25}, {"x":3.75, "y":5.5, "w":6.25}, {"label":"Alt", "x":10, "y":5.5, "w":1.25}, {"label":"Win", "x":11.25, "y":5.5, "w":1.25}, {"label":"Menu", "x":12.5, "y":5.5, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25}, {"label":"\u2190", "x":15.25, "y":5.5}, {"label":"\u2193", "x":16.25, "y":5.5}, {"label":"\u2192", "x":17.25, "y":5.5}]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/handwired/fc200rt_qmk/keymaps/default/keymap.c b/keyboards/handwired/fc200rt_qmk/keymaps/default/keymap.c
new file mode 100644
index 00000000000..eb72c08d62e
--- /dev/null
+++ b/keyboards/handwired/fc200rt_qmk/keymaps/default/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2019 NaCly
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+
+};
\ No newline at end of file
diff --git a/keyboards/handwired/fc200rt_qmk/readme.md b/keyboards/handwired/fc200rt_qmk/readme.md
new file mode 100644
index 00000000000..6490227806a
--- /dev/null
+++ b/keyboards/handwired/fc200rt_qmk/readme.md
@@ -0,0 +1,35 @@
+# fc200rt_qmk
+
+
+
+A Leopold FC200RT rewired with Teensy 2.0
+
+Uses original row and column matrix, so you can wire the teensy 2.0 to the corrosposnding column and row numbers and flash this firmware to the teensy.
+
+Pinout of Leopold's matrix:
+
+| | c0 | c1 | c2 | c3 | c4 | c5 | c6 | c7 | c8 | c9 | c10 | c11 | c12 | c13 | c14 | c15 |
+|----|------|-----|------|----|----|----|------|-----|------|------|------|------|------|------|------|------|
+| r0 | PAUS | Q | W | E | R | U | I | O | P | SLCK | | | | | | |
+| r1 | LGUI | TAB | CAPS | F3 | T | Y | RBRC | F7 | LBRC | | BSPC | | | | | LSFT |
+| r2 | | A | | D | F | J | K | L | SCLN | RGUI | BSLS | | | | | RSFT |
+| r3 | | ESC | X | F4 | G | H | F6 | | QUOT | LALT | F11 | SPC | | | UP | |
+| r4 | | Z | | C | V | M | COMM | DOT | | | ENT | | | | | |
+| r5 | | | | | B | N | | APP | SLSH | RALT | F12 | DOWN | RGHT | | LEFT | |
+| r6 | LCTL | GRV | F1 | F2 | 5 | 6 | EQL | F8 | MINS | | F9 | DEL | INS | PGUP | HOME | |
+| r7 | F5 | 1 | 2 | 3 | 4 | 7 | 8 | 9 | 0 | PSCR | F10 | | | PGDN | END | |
+| | | | | | | | | | | | | | | | | |
+
+Choose any key from the corrosponding row and column and solder it to the pin on the Teensy listed in the firmware config.h
+
+_NOTE: Some of the keys had mislabled columns and rows, so make sure the columns are all connected without diodes to one another, and that the rows are soldered after the diode_
+
+* Keyboard Maintainer: [NaCly](https://github.com/Na-Cly)
+* Hardware Supported: The PCBs, controllers supported
+* Hardware Availability: Leopold FC200RT + Teensy 2.0
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/fc200rt_qmk:default
+
+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).
diff --git a/keyboards/handwired/fc200rt_qmk/rules.mk b/keyboards/handwired/fc200rt_qmk/rules.mk
new file mode 100644
index 00000000000..8ef9dbd6c38
--- /dev/null
+++ b/keyboards/handwired/fc200rt_qmk/rules.mk
@@ -0,0 +1,32 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = halfkay
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
diff --git a/keyboards/handwired/floorboard/config.h b/keyboards/handwired/floorboard/config.h
index 6f2e9d0c0bd..bf8646f39af 100644
--- a/keyboards/handwired/floorboard/config.h
+++ b/keyboards/handwired/floorboard/config.h
@@ -192,10 +192,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/handwired/hnah40/config.h b/keyboards/handwired/hnah40/config.h
index 3d3c05fd424..9583c4c38ee 100644
--- a/keyboards/handwired/hnah40/config.h
+++ b/keyboards/handwired/hnah40/config.h
@@ -23,7 +23,7 @@ along with this program. If not, see .
#define PRODUCT_ID 0x0000
#define DEVICE_VER 0x0002
#define MANUFACTURER HnahKB
-#define PRODUCT hnah40
+#define PRODUCT Hnah40
#define DESCRIPTION Custom 40% PCB
/* key matrix size */
diff --git a/keyboards/handwired/hnah40/usbconfig.h b/keyboards/handwired/hnah40/usbconfig.h
deleted file mode 100644
index b26a3c7d673..00000000000
--- a/keyboards/handwired/hnah40/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 0
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'H','n','a','h','K','B'
-#define USB_CFG_VENDOR_NAME_LEN 6
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'H', 'n', 'a', 'h', '4', '0'
-#define USB_CFG_DEVICE_NAME_LEN 6
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-#define USB_CFG_SERIAL_NUMBER 'H','n','a','h','K','B'
-#define USB_CFG_SERIAL_NUMBER_LEN 6
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-// #define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-// /* #define USB_INTR_CFG_CLR 0 */
-// /* #define USB_INTR_ENABLE EIMSK */
-// #define USB_INTR_ENABLE_BIT INT1
-// /* #define USB_INTR_PENDING EIFR */
-// #define USB_INTR_PENDING_BIT INTF1
-// #define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/handwired/jotpad16/config.h b/keyboards/handwired/jotpad16/config.h
index 075f9649c77..dc6bb795939 100644
--- a/keyboards/handwired/jotpad16/config.h
+++ b/keyboards/handwired/jotpad16/config.h
@@ -16,13 +16,14 @@
/* pro_micro pin-out */
#define MATRIX_ROW_PINS { B6, B2, D2, D3 }
-#define MATRIX_COL_PINS { B5, B4, B3, B1 }
+#define MATRIX_COL_PINS { E6, D7, B3, B1 }
#define UNUSED_PINS
/* leds */
-#define QMK_LED E6
-#define BACKLIGHT_LEVELS 3
-#define BACKLIGHT_PIN D7
+#define JOTPAD16_LEDS
+#define JOTPAD16_LED1 B5
+#define JOTPAD16_LED2 B4
+#define QMK_LED B5
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/handwired/jotpad16/jotpad16.c b/keyboards/handwired/jotpad16/jotpad16.c
index 512234b9177..2f112a6101d 100644
--- a/keyboards/handwired/jotpad16/jotpad16.c
+++ b/keyboards/handwired/jotpad16/jotpad16.c
@@ -4,3 +4,10 @@ void matrix_init_kb(void) {
matrix_init_user();
}
+
+void keyboard_pre_init_kb() {
+ setPinOutput(JOTPAD16_LED1);
+ setPinOutput(JOTPAD16_LED2);
+
+ keyboard_pre_init_user();
+}
diff --git a/keyboards/handwired/jotpad16/readme.md b/keyboards/handwired/jotpad16/readme.md
index 3d971a51548..c8773cf1833 100644
--- a/keyboards/handwired/jotpad16/readme.md
+++ b/keyboards/handwired/jotpad16/readme.md
@@ -1,7 +1,5 @@
# JotPad16
-
-
A ortholinear keypad (4x4) made by jotix.
Keyboard Maintainer: [jotix](https://github.com/jotix)
@@ -16,13 +14,13 @@ Hardware Supported: Arduino Pro Micro
| columns | 0 | 1 | 2 | 3 |
|-------------|----|----|----|----|
-| arduino pin | 9 | 8 | 14 | 15 |
-| qmk pin | B5 | B4 | B3 | C3 |
+| arduino pin | 7 | 6 | 14 | 15 |
+| qmk pin | E6 | D7 | B3 | C3 |
-| | QMK led | Backlight |
-|-------------|-----------|-----------|
-| Arduino pin | 7 | 6 |
-| qmk pin | E6 | D7 |
+| | LED1 | LED2 |
+|-------------|------|------|
+| Arduino pin | 9 | 8 |
+| QMK pin | B5 | B4 |
### Compiling the Firmware
@@ -32,8 +30,12 @@ Make example for this keyboard (after setting up your build environment):
### The Default Keymap
-
+| 7 | 8 | 9 | - |
+|---|---|---|---|
+| 4 | 5 | 6 | + |
+|---|---|---|---|
+| 1 | 2 | 3 |ent|
+|---|---|---|---|
+| 0 | . | / | * |
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).
-
-
diff --git a/keyboards/handwired/jotpad16/rules.mk b/keyboards/handwired/jotpad16/rules.mk
index 0c9370f1c1d..79c32c5c352 100644
--- a/keyboards/handwired/jotpad16/rules.mk
+++ b/keyboards/handwired/jotpad16/rules.mk
@@ -22,7 +22,7 @@ EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
CONSOLE_ENABLE = yes # Console for debug(+400)
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
diff --git a/keyboards/handwired/jtallbean/split_65/config.h b/keyboards/handwired/jtallbean/split_65/config.h
index a2c8d22bf79..5c7a9d54ba0 100644
--- a/keyboards/handwired/jtallbean/split_65/config.h
+++ b/keyboards/handwired/jtallbean/split_65/config.h
@@ -195,10 +195,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/handwired/novem/config.h b/keyboards/handwired/novem/config.h
new file mode 100644
index 00000000000..a8c012a45f8
--- /dev/null
+++ b/keyboards/handwired/novem/config.h
@@ -0,0 +1,60 @@
+/*
+Copyright 2020 Jose I. Martinez
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x0000
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Jose I. Martinez
+#define PRODUCT novem
+#define DESCRIPTION A custom keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 3
+#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 { E6, B4, B5 }
+#define MATRIX_COL_PINS { B3, B2, B6 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+/* 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
+
+
+
diff --git a/keyboards/handwired/novem/info.json b/keyboards/handwired/novem/info.json
new file mode 100644
index 00000000000..df0b6932010
--- /dev/null
+++ b/keyboards/handwired/novem/info.json
@@ -0,0 +1,18 @@
+{
+ "keyboard_name": "novem",
+ "url": "",
+ "maintainer": "Jose I. Martinez",
+ "width": 3,
+ "height": 2,
+ "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}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/novem/keymaps/default/keymap.c b/keyboards/handwired/novem/keymaps/default/keymap.c
new file mode 100644
index 00000000000..ca6f3188826
--- /dev/null
+++ b/keyboards/handwired/novem/keymaps/default/keymap.c
@@ -0,0 +1,77 @@
+/* Copyright 2020 Jose I. Martinez
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+// Defines names for use in layer keycodes and the keymap
+enum layer_names {
+ _BASE,
+ _FN
+};
+
+// Defines the keycodes used by our macros in process_record_user
+enum custom_keycodes {
+ GITSTTS = SAFE_RANGE,
+ GITPULL,
+ GITPUSH,
+ GITCOM
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Base */
+ [_BASE] = LAYOUT(
+ KC_ESCAPE, KC_HOME, KC_DEL,
+ MO(_FN) , KC_UP , KC_ENTER,
+ KC_LEFT , KC_DOWN, KC_RIGHT
+ ),
+ [_FN] = LAYOUT(
+ KC_TRNS, GITCOM, GITPUSH,
+ KC_TRNS, GITSTTS, GITPULL,
+ KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case GITSTTS:
+ if (record->event.pressed) {
+ // when keycode GITSTTS is pressed
+ SEND_STRING("git status");
+ }
+ break;
+ case GITPULL:
+ if (record->event.pressed) {
+ // when keycode GITPULL is pressed
+ SEND_STRING("git pull");
+ }
+ break;
+ case GITPUSH:
+ if (record->event.pressed) {
+ // when keycode GITPUSH is pressed
+ SEND_STRING("git push");
+ }
+ break;
+ case GITCOM:
+ if (record->event.pressed) {
+ // when keycode GITCOM is pressed
+ SEND_STRING("git commit -m ");
+ }
+ break;
+ default:
+ return true;
+ }
+ return true;
+}
+
diff --git a/keyboards/handwired/novem/keymaps/default/readme.md b/keyboards/handwired/novem/keymaps/default/readme.md
new file mode 100644
index 00000000000..0f833a09d32
--- /dev/null
+++ b/keyboards/handwired/novem/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for novem
diff --git a/keyboards/handwired/novem/novem.c b/keyboards/handwired/novem/novem.c
new file mode 100644
index 00000000000..967ec828f09
--- /dev/null
+++ b/keyboards/handwired/novem/novem.c
@@ -0,0 +1,18 @@
+/* Copyright 2020 Jose I. Martinez
+ *
+ * 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 .
+ */
+
+#include "novem.h"
+
diff --git a/keyboards/handwired/novem/novem.h b/keyboards/handwired/novem/novem.h
new file mode 100644
index 00000000000..b1040094e0f
--- /dev/null
+++ b/keyboards/handwired/novem/novem.h
@@ -0,0 +1,31 @@
+/* Copyright 2020 Jose I. Martinez
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+
+#define LAYOUT( \
+ k00, k01, k02, \
+ k03, k04, k05, \
+ k06, k07, k08 \
+) \
+{ \
+ { k00, k01, k02 }, \
+ { k03, k04, k05 }, \
+ { k06, k07, k08 }, \
+}
diff --git a/keyboards/handwired/novem/readme.md b/keyboards/handwired/novem/readme.md
new file mode 100644
index 00000000000..c259c2cb828
--- /dev/null
+++ b/keyboards/handwired/novem/readme.md
@@ -0,0 +1,16 @@
+# novem
+
+
+
+A short description of the keyboard/project
+
+* Keyboard Maintainer: [Jose I. Martinez](https://github.com/mechanicalguy21)
+* Hardware Supported: This is a handwired keyboard created over a 3d printed case.
+STL will be shared soon.
+* Hardware Availability: STL files will be shared soon.
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/novem:default
+
+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).
diff --git a/keyboards/handwired/novem/rules.mk b/keyboards/handwired/novem/rules.mk
new file mode 100644
index 00000000000..3891651f3b0
--- /dev/null
+++ b/keyboards/handwired/novem/rules.mk
@@ -0,0 +1,32 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = no # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
diff --git a/keyboards/handwired/obuwunkunubi/spaget/config.h b/keyboards/handwired/obuwunkunubi/spaget/config.h
new file mode 100644
index 00000000000..79c5d2bf162
--- /dev/null
+++ b/keyboards/handwired/obuwunkunubi/spaget/config.h
@@ -0,0 +1,74 @@
+/*
+Copyright 2020 obuwunkunubi
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x1337
+#define PRODUCT_ID 0x6969
+#define DEVICE_VER 0x0001
+#define MANUFACTURER obuwunkunubi
+#define PRODUCT spaget
+#define DESCRIPTION numpad with 2 encoders and a screen
+
+/* key matrix size */
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 4
+
+// ROWS: Top to bottom, COLS: Left to right
+
+#define MATRIX_ROW_PINS { D4, C6, D7, E6, B4, B5 }
+#define MATRIX_COL_PINS { B1, B3, B2, B6 }
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* Set 0 if debouncing isn't needed */
+//#define DEBOUNCE 5
+
+/* 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
+
+/* Define encoder pins */
+#define ENCODERS_PAD_A { F5, F7 } // 1a, 2a
+#define ENCODERS_PAD_B { F4, F6 } // 1b, 2b
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
diff --git a/keyboards/handwired/obuwunkunubi/spaget/info.json b/keyboards/handwired/obuwunkunubi/spaget/info.json
new file mode 100644
index 00000000000..4228c9c648d
--- /dev/null
+++ b/keyboards/handwired/obuwunkunubi/spaget/info.json
@@ -0,0 +1,36 @@
+{
+ "keyboard_name": "spaget",
+ "url": "",
+ "maintainer": "obuwunkunubi",
+ "width": 4,
+ "height": 7.5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":3, "y":0},
+ {"x":0, "y":1.5},
+ {"x":1, "y":1.5},
+ {"x":2, "y":1.5},
+ {"x":3, "y":1.5},
+ {"x":0, "y":2.5},
+ {"x":1, "y":2.5},
+ {"x":2, "y":2.5},
+ {"x":3, "y":2.5},
+ {"x":0, "y":3.5},
+ {"x":1, "y":3.5},
+ {"x":2, "y":3.5},
+ {"x":0, "y":4.5},
+ {"x":1, "y":4.5},
+ {"x":2, "y":4.5},
+ {"x":3, "y":3.5, "h":2},
+ {"x":0, "y":5.5},
+ {"x":1, "y":5.5},
+ {"x":2, "y":5.5},
+ {"x":0, "y":6.5, "w":2},
+ {"x":2, "y":6.5},
+ {"x":3, "y":5.5, "h":2}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/obuwunkunubi/spaget/keymaps/default/keymap.c b/keyboards/handwired/obuwunkunubi/spaget/keymaps/default/keymap.c
new file mode 100644
index 00000000000..1854894e562
--- /dev/null
+++ b/keyboards/handwired/obuwunkunubi/spaget/keymaps/default/keymap.c
@@ -0,0 +1,435 @@
+/* Copyright 2020 obuwunkunubi
+*
+* 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 .
+*/
+#include QMK_KEYBOARD_H
+
+// Defines for shortcut macros
+#define KC_CAD LALT(LCTL(KC_DEL)) // CTRL + ALT + DEL
+#define KC_CPY LCTL(KC_C) // Copy
+#define KC_PST LCTL(KC_V) // Paste
+#define KC_AF4 LALT(KC_F4) // ALT + F4
+
+enum custom_keycodes {
+ SELWN = SAFE_RANGE,
+ SELWP,
+ EM1,
+ EM2,
+ EM3,
+ EM4,
+ EM5,
+ EM6,
+ EM7,
+ EM8,
+ EM9,
+ MAKE1,
+ MAKE2,
+ MAIL1,
+ MAIL2,
+ OBUWUN,
+ DIR
+};
+
+enum layer_names {
+ BASE,
+ ONE,
+ TWO
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* Keymap BASE: Base Layer
+ *
+ * ,---. ,---.
+ * |NUM| |PLY|
+ * `---' `---'
+ * ,---------------.
+ * |CAL| UP|PRE|NXT|
+ * |---------------|
+ * | = | / | * | - |
+ * |---------------|
+ * | 7 | 8 | 9 | |
+ * |------------ + |
+ * | 4 | 5 | 6 | |
+ * |---------------|
+ * | 1 | 2 | 3 | |
+ * |------------ENT|
+ * | 0 | . | |
+ * `---------------'
+ */
+ [BASE] = LAYOUT( \
+ KC_NLCK, KC_MPLY, \
+ KC_CALC, TO(ONE), KC_MPRV, KC_MNXT, \
+ KC_EQL, KC_PSLS, KC_PAST, KC_MINS, \
+ KC_P7, KC_P8, KC_P9, \
+ KC_P4, KC_P5, KC_P6, KC_PPLS, \
+ KC_P1, KC_P2, KC_P3, \
+ KC_P0, KC_PDOT, KC_PENT \
+ ),
+
+ /* Keymap ONE: Util Layer
+ *
+ * ,---. ,---.
+ * |RST| |CAD|
+ * `---' `---'
+ * ,---------------.
+ * |BAS|TWO|MK1|MK2|
+ * |---------------|
+ * |DIR|@1 |@2 |OBU|
+ * |---------------|
+ * |SWP|AF4|SWN| |
+ * |------------PSC|
+ * |CPY| U |PST| |
+ * |---------------|
+ * | L | D | R | |
+ * |------------ NO|
+ * | NO | NO| |
+ * `---------------'
+ */
+ [ONE] = LAYOUT( \
+ RESET, KC_CAD, \
+ TO(BASE), TO(TWO), MAKE1, MAKE2, \
+ DIR, MAIL1, MAIL2, OBUWUN, \
+ SELWP, KC_AF4, SELWN, \
+ KC_CPY, KC_UP, KC_PST, KC_PSCR, \
+ KC_LEFT, KC_DOWN, KC_RGHT, \
+ KC_P0, KC_PDOT, KC_PENT \
+ ),
+
+ /* Keymap TWO: Emoji Layer
+ *
+ * ,---. ,---.
+ * | NO| | NO|
+ * `---' `---'
+ * ,---------------.
+ * |ONE|BAS| [ | ] |
+ * |---------------|
+ * |F13|F14|F15|F16|
+ * |---------------|
+ * |EM7|EM8|EM9| |
+ * |------------ NO|
+ * |EM4|EM5|EM6| |
+ * |---------------|
+ * |EM1|EM2|EM3| |
+ * |------------ NO|
+ * | NO | NO| |
+ * `---------------'
+ */
+ [TWO] = LAYOUT( \
+ KC_NO, KC_NO, \
+ TO(ONE), TO(BASE), KC_LBRC, KC_RBRC, \
+ KC_F13, KC_F14, KC_F15, KC_F16, \
+ EM7, EM8, EM9, \
+ EM4, EM5, EM6, KC_NO, \
+ EM1, EM2, EM3, \
+ KC_NO, KC_NO, KC_NO \
+ ),
+
+};
+
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+
+ case SELWN: // select and copy next word
+ if (record->event.pressed) {
+ // when keycode SELWN is pressed
+
+ tap_code16(C(S(KC_RGHT)));
+ tap_code16(KC_CPY);
+ return false; break;
+
+ } else {
+ // when keycode SELWN is released
+ }
+ break;
+
+ case SELWP: // select and copy previous word
+ if (record->event.pressed) {
+ // when keycode SELWP is pressed
+
+ tap_code16(C(S(KC_LEFT)));
+ tap_code16(KC_CPY);
+ return false; break;
+
+ } else {
+ // when keycode SELWP is released
+ }
+ break;
+
+ case MAKE1:
+ if (record->event.pressed) {
+ // when keycode MAKE1 is pressed
+
+ send_string("make handwired/obuwunkunubi/spaget:default:avrdude");
+
+ } else {
+ // when keycode MAKE1 is released
+ }
+ break;
+
+ case MAKE2:
+ if (record->event.pressed) {
+ // when keycode MAKE2 is pressed
+
+ send_string("make preonic/rev3:obuwunkunubi:dfu-util");
+
+ } else {
+ // when keycode MAKE2 is released
+ }
+ break;
+
+ case DIR:
+ if (record->event.pressed) {
+ // when keycode DIR is pressed
+
+ send_string("cd /d/Keyboards/qmk/qmk_firmware/");
+
+ } else {
+ // when keycode DIR is released
+ }
+ break;
+
+ case OBUWUN:
+ if (record->event.pressed) {
+ // when keycode OBUWUN is pressed
+
+ send_string("obuwunkunubi");
+
+ } else {
+ // when keycode OBUWUN is released
+ }
+ break;
+
+ case MAIL1:
+ if (record->event.pressed) {
+ // when keycode MAIL1 is pressed
+
+ send_string("marko.bakan7");
+
+ } else {
+ // when keycode MAIL1 is released
+ }
+ break;
+
+ case MAIL2:
+ if (record->event.pressed) {
+ // when keycode MAIL2 is pressed
+
+ send_string("bakan.marko7");
+
+ } else {
+ // when keycode MAIL2 is released
+ }
+ break;
+
+ case EM1:
+ if (record->event.pressed) {
+ // when keycode EM1 is pressed
+
+ send_unicode_string("ʕ•ᴥ•ʔ");
+
+ } else {
+ // when keycode EM1 is released
+ }
+ break;
+
+ case EM2:
+ if (record->event.pressed) {
+ // when keycode EM2 is pressed
+
+ send_unicode_string("༼ つ ◕_◕ ༽つ");
+
+ } else {
+ // when keycode EM2 is released
+ }
+ break;
+
+ case EM3:
+ if (record->event.pressed) {
+ // when keycode EM3 is pressed
+
+ send_unicode_string("( ⌐■_■)");
+
+ } else {
+ // when keycode EM3 is released
+ }
+ break;
+
+ case EM4:
+ if (record->event.pressed) {
+ // when keycode EM4 is pressed
+
+ send_unicode_string("(╯°□°)╯彡 ┻━┻");
+
+ } else {
+ // when keycode EM4 is released
+ }
+ break;
+
+ case EM5:
+ if (record->event.pressed) {
+ // when keycode EM5 is pressed
+
+ send_unicode_string("ಠ_ಠ");
+
+ } else {
+ // when keycode EM5 is released
+ }
+ break;
+
+ case EM6:
+ if (record->event.pressed) {
+ // when keycode EM6 is pressed
+
+ send_unicode_string("( ͡° ͜ʖ ͡°)");
+
+ } else {
+ // when keycode EM6 is released
+ }
+ break;
+
+ case EM7:
+ if (record->event.pressed) {
+ // when keycode EM7 is pressed
+
+ send_unicode_string("(☞゚ヮ゚)☞");
+
+ } else {
+ // when keycode EM7 is released
+ }
+ break;
+
+ case EM8:
+ if (record->event.pressed) {
+ // when keycode EM8 is pressed
+
+ send_unicode_string("(^‿^)");
+
+ } else {
+ // when keycode EM8 is released
+ }
+ break;
+
+ case EM9:
+ if (record->event.pressed) {
+ // when keycode EM9 is pressed
+
+ send_unicode_string("¯\\_(ツ)_/¯");
+
+ } else {
+ // when keycode EM9 is released
+ }
+ break;
+
+ }
+ return true;
+};
+
+// Unicode input mode set to Windows using WinCompose
+void matrix_init_user(void) {
+ set_unicode_input_mode(UC_WINC);
+};
+#ifdef OLED_DRIVER_ENABLE
+void oled_task_user(void) {
+ oled_write_P(PSTR(" spaget v1\n\n"), false);
+
+ // Host Keyboard Layer Status
+ oled_write_P(PSTR("Layer: "), false);
+
+ switch (get_highest_layer(layer_state)) {
+ case BASE:
+ oled_write_P(PSTR("Base\n"), false);
+ break;
+ case ONE:
+ oled_write_P(PSTR("Util\n"), false);
+ break;
+ case TWO:
+ oled_write_P(PSTR("Emoji\n"), false);
+ break;
+ default:
+ oled_write_ln_P(PSTR("Undefined"), false);
+ }
+
+ // Host Keyboard LED Status
+ led_t led_state = host_keyboard_led_state();
+ oled_write_P(PSTR("Lock: "), false);
+ oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
+ oled_write_P(led_state.caps_lock ? PSTR("CAPS ") : PSTR(" "), false);
+ oled_write_P(led_state.scroll_lock ? PSTR("SCROLL ") : PSTR(" "), false);
+}
+#endif
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if(IS_LAYER_ON(BASE)) {
+ if (index == 0) { /* First encoder */
+ if (clockwise) {
+ tap_code(KC_PGDN);
+ } else {
+ tap_code(KC_PGUP);
+ }
+ } else if (index == 1) { /* Second encoder */
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ }
+ }
+ else if(IS_LAYER_ON(ONE)) {
+ if (index == 0) { /* First encoder */
+ if (clockwise) {
+ tap_code(KC_WH_R);
+ } else {
+ tap_code(KC_WH_L);
+ }
+ } else if (index == 1) { /* Second encoder */
+ if (clockwise) {
+ tap_code(KC_WH_D);
+ } else {
+ tap_code(KC_WH_U);
+ }
+ }
+ }
+ else if(IS_LAYER_ON(TWO)) {
+ if (index == 0) { /* First encoder */
+ if (clockwise) {
+ tap_code(KC_DEL);
+ } else {
+ tap_code(KC_BSPC);
+ }
+ } else if (index == 1) { /* Second encoder */
+ if (clockwise) {
+ tap_code(KC_DOWN);
+ } else {
+ tap_code(KC_UP);
+ }
+ }
+ }
+ else {
+ if (index == 0) { /* First encoder */
+ if (clockwise) {
+ tap_code(KC_PGDN);
+ } else {
+ tap_code(KC_PGUP);
+ }
+ } else if (index == 1) { /* Second encoder */
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ }
+ }
+}
diff --git a/keyboards/handwired/obuwunkunubi/spaget/keymaps/default/readme.md b/keyboards/handwired/obuwunkunubi/spaget/keymaps/default/readme.md
new file mode 100644
index 00000000000..9a453e1f693
--- /dev/null
+++ b/keyboards/handwired/obuwunkunubi/spaget/keymaps/default/readme.md
@@ -0,0 +1 @@
+# default spaget layout
diff --git a/keyboards/handwired/obuwunkunubi/spaget/keymaps/default/rules.mk b/keyboards/handwired/obuwunkunubi/spaget/keymaps/default/rules.mk
new file mode 100644
index 00000000000..916b1154bdd
--- /dev/null
+++ b/keyboards/handwired/obuwunkunubi/spaget/keymaps/default/rules.mk
@@ -0,0 +1 @@
+# Build Overrides
diff --git a/keyboards/handwired/obuwunkunubi/spaget/readme.md b/keyboards/handwired/obuwunkunubi/spaget/readme.md
new file mode 100644
index 00000000000..253870a4326
--- /dev/null
+++ b/keyboards/handwired/obuwunkunubi/spaget/readme.md
@@ -0,0 +1,14 @@
+# spaget
+
+
+
+A hand wired numpad style QMK macropad, with a 128x32 OLED screen and two rotary encoders. Powered by an Arduino Pro Micro.
+
+* Keyboard Maintainer: [obuwunkunubi](https://github.com/obuwunkunubi)
+* Hardware Supported: spaget v1
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/obuwunkunubi/spaget:default
+
+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).
diff --git a/keyboards/handwired/obuwunkunubi/spaget/rules.mk b/keyboards/handwired/obuwunkunubi/spaget/rules.mk
new file mode 100644
index 00000000000..8be738f3ec0
--- /dev/null
+++ b/keyboards/handwired/obuwunkunubi/spaget/rules.mk
@@ -0,0 +1,34 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+RGBLIGHT_ENABLE = no # Enable keyboard underlight functionality
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+MIDI_ENABLE = no # MIDI controls
+AUDIO_ENABLE = no
+UNICODE_ENABLE = yes # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+AUDIO_ENABLE = no # Audio output on port C6
+
+OLED_DRIVER_ENABLE = yes # Enable OLED display support
+ENCODER_ENABLE = yes # Enable encoder support
+
diff --git a/keyboards/handwired/obuwunkunubi/spaget/spaget.c b/keyboards/handwired/obuwunkunubi/spaget/spaget.c
new file mode 100644
index 00000000000..aeb0dc54360
--- /dev/null
+++ b/keyboards/handwired/obuwunkunubi/spaget/spaget.c
@@ -0,0 +1,16 @@
+/* Copyright 2020 obuwunkunubi
+ *
+ * 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 .
+ */
+ #include "spaget.h"
diff --git a/keyboards/handwired/obuwunkunubi/spaget/spaget.h b/keyboards/handwired/obuwunkunubi/spaget/spaget.h
new file mode 100644
index 00000000000..7d4b9e9dff5
--- /dev/null
+++ b/keyboards/handwired/obuwunkunubi/spaget/spaget.h
@@ -0,0 +1,47 @@
+/* Copyright 2020 obuwunkunubi
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "quantum.h"
+
+/* This 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.
+ */
+
+// readability
+#define XXX KC_NO
+
+#define LAYOUT( \
+ K23, K43, \
+ K00, K01, K02, K03, \
+ K10, K11, K12, K13, \
+ K20, K21, K22, \
+ K30, K31, K32, K33, \
+ K40, K41, K42, \
+ K51, K52, K53 \
+) { \
+ { K00, K01, K02, K03 }, \
+ { K10, K11, K12, K13 }, \
+ { K20, K21, K22, K23 }, \
+ { K30, K31, K32, K33 }, \
+ { K40, K41, K42, K43 }, \
+ { XXX, K51, K52, K53 } \
+}
diff --git a/keyboards/handwired/onekey/blackpill_f401/config.h b/keyboards/handwired/onekey/blackpill_f401/config.h
index 01555e43152..c6166380cf2 100644
--- a/keyboards/handwired/onekey/blackpill_f401/config.h
+++ b/keyboards/handwired/onekey/blackpill_f401/config.h
@@ -27,3 +27,5 @@
#define BACKLIGHT_PWM_CHANNEL 1
#define RGB_DI_PIN A1
+
+#define ADC_PIN A0
diff --git a/keyboards/handwired/onekey/blackpill_f411/config.h b/keyboards/handwired/onekey/blackpill_f411/config.h
index 01555e43152..c6166380cf2 100644
--- a/keyboards/handwired/onekey/blackpill_f411/config.h
+++ b/keyboards/handwired/onekey/blackpill_f411/config.h
@@ -27,3 +27,5 @@
#define BACKLIGHT_PWM_CHANNEL 1
#define RGB_DI_PIN A1
+
+#define ADC_PIN A0
diff --git a/keyboards/handwired/onekey/bluepill/config.h b/keyboards/handwired/onekey/bluepill/config.h
index 01555e43152..c6166380cf2 100644
--- a/keyboards/handwired/onekey/bluepill/config.h
+++ b/keyboards/handwired/onekey/bluepill/config.h
@@ -27,3 +27,5 @@
#define BACKLIGHT_PWM_CHANNEL 1
#define RGB_DI_PIN A1
+
+#define ADC_PIN A0
diff --git a/keyboards/handwired/onekey/elite_c/config.h b/keyboards/handwired/onekey/elite_c/config.h
index fbcd630d790..167373cd39b 100644
--- a/keyboards/handwired/onekey/elite_c/config.h
+++ b/keyboards/handwired/onekey/elite_c/config.h
@@ -21,3 +21,9 @@
#define MATRIX_COL_PINS { F4 }
#define MATRIX_ROW_PINS { F5 }
#define UNUSED_PINS
+
+#define BACKLIGHT_PIN B6
+
+#define RGB_DI_PIN F6
+
+#define ADC_PIN F6
diff --git a/keyboards/handwired/onekey/keymaps/adc/keymap.c b/keyboards/handwired/onekey/keymaps/adc/keymap.c
new file mode 100644
index 00000000000..6626894fac1
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/adc/keymap.c
@@ -0,0 +1,34 @@
+#include QMK_KEYBOARD_H
+#include "analog.h"
+#include
+
+enum custom_keycodes {
+ ADC_SAMPLE = SAFE_RANGE,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ LAYOUT(ADC_SAMPLE) //
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case ADC_SAMPLE:
+ if (record->event.pressed) {
+ int16_t val = analogReadPin(ADC_PIN);
+
+ char buffer [50];
+ sprintf(buffer, "ADC:%u\n", val);
+#ifdef CONSOLE_ENABLE
+ printf(buffer);
+#else
+ SEND_STRING(buffer);
+#endif
+ }
+ break;
+ }
+ return false;
+};
+
+// adc_mux pinToMux(pin_t pin) {
+// return TO_MUX( ADC_CHANNEL_IN1, 0 );
+// };
diff --git a/keyboards/handwired/onekey/keymaps/adc/rules.mk b/keyboards/handwired/onekey/keymaps/adc/rules.mk
new file mode 100644
index 00000000000..a691d5488f1
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/adc/rules.mk
@@ -0,0 +1,3 @@
+SRC += analog.c
+
+CONSOLE_ENABLE = yes
diff --git a/keyboards/handwired/onekey/keymaps/i2c_scanner/config.h b/keyboards/handwired/onekey/keymaps/i2c_scanner/config.h
new file mode 100644
index 00000000000..42ab08e36e8
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/i2c_scanner/config.h
@@ -0,0 +1,6 @@
+#pragma once
+
+// AVR: can change to other supported values
+#define F_SCL 100000UL
+
+// TODO: add some default ARM configs for i2cv1 and i2cv2
diff --git a/keyboards/handwired/onekey/keymaps/i2c_scanner/keymap.c b/keyboards/handwired/onekey/keymaps/i2c_scanner/keymap.c
new file mode 100644
index 00000000000..262bd588f2b
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/i2c_scanner/keymap.c
@@ -0,0 +1,66 @@
+#include QMK_KEYBOARD_H
+
+#include "i2c_master.h"
+#include "debug.h"
+
+#define TIMEOUT 50
+
+// TODO: remove patch
+#ifdef PROTOCOL_CHIBIOS
+# pragma message("ChibiOS is currently 'best effort' and might not report accurate results")
+
+i2c_status_t i2c_start_bodge(uint8_t address, uint16_t timeout) {
+ i2c_start(address);
+
+ // except on ChibiOS where the only way is do do "something"
+ uint8_t data = 0;
+ return i2c_readReg(address, 0, &data, sizeof(data), TIMEOUT);
+}
+
+# define i2c_start i2c_start_bodge
+#endif
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ LAYOUT(KC_A) //
+};
+
+void do_scan(void) {
+ uint8_t nDevices = 0;
+
+ dprintf("Scanning...\n");
+
+ for (uint8_t address = 1; address < 127; address++) {
+ // The i2c_scanner uses the return value of
+ // i2c_start to see if a device did acknowledge to the address.
+ i2c_status_t error = i2c_start(address << 1, TIMEOUT);
+ if (error == I2C_STATUS_SUCCESS) {
+ i2c_stop();
+ dprintf(" I2C device found at address 0x%02X\n", address);
+ nDevices++;
+ } else {
+ // dprintf(" Unknown error (%u) at address 0x%02X\n", error, address);
+ }
+ }
+
+ if (nDevices == 0)
+ dprintf("No I2C devices found\n");
+ else
+ dprintf("done\n");
+}
+
+uint16_t scan_timer = 0;
+
+void matrix_scan_user(void) {
+ if (timer_elapsed(scan_timer) > 5000) {
+ do_scan();
+ scan_timer = timer_read();
+ }
+}
+
+void keyboard_post_init_user(void) {
+ debug_enable = true;
+ debug_matrix = true;
+
+ i2c_init();
+ scan_timer = timer_read();
+}
diff --git a/keyboards/handwired/onekey/keymaps/i2c_scanner/readme.md b/keyboards/handwired/onekey/keymaps/i2c_scanner/readme.md
new file mode 100644
index 00000000000..ce6357a9c27
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/i2c_scanner/readme.md
@@ -0,0 +1,36 @@
+# i2c_scanner
+
+Aiming to provide a more qmk friendly version of
+
+> This very simple ~~sketch~~ keymap scans the I2C-bus for devices. If a device is found, it is reported to the ~~Arduino serial monitor~~ console.
+
+
+## Flashing
+
+Pick a target that is aligned to the MCU you want to test:
+
+```console
+make handwired/onekey/elite_c:i2c_scanner:flash # also 32u4 + dfu bootloader
+make handwired/onekey/promicro:i2c_scanner:flash
+make handwired/onekey/teensy_2:i2c_scanner:flash
+
+# ChibiOS is currently 'best effort' and might not report accurate results
+make handwired/onekey/proton_c:i2c_scanner:flash
+```
+
+others might work with additional configuration.
+
+## Usage
+
+Output is viewable through a compatible tool .
+
+You can change the wires, and plug-in I2C devices while the i2c_scanner is running.
+
+The output of the console will look like this:
+
+```
+Listening:
+Scanning...
+ I2C device found at address 0x20
+done
+```
diff --git a/keyboards/handwired/onekey/keymaps/i2c_scanner/rules.mk b/keyboards/handwired/onekey/keymaps/i2c_scanner/rules.mk
new file mode 100644
index 00000000000..04498a88312
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/i2c_scanner/rules.mk
@@ -0,0 +1,3 @@
+CONSOLE_ENABLE = yes
+
+QUANTUM_LIB_SRC += i2c_master.c
diff --git a/keyboards/handwired/onekey/promicro/config.h b/keyboards/handwired/onekey/promicro/config.h
index fbcd630d790..167373cd39b 100644
--- a/keyboards/handwired/onekey/promicro/config.h
+++ b/keyboards/handwired/onekey/promicro/config.h
@@ -21,3 +21,9 @@
#define MATRIX_COL_PINS { F4 }
#define MATRIX_ROW_PINS { F5 }
#define UNUSED_PINS
+
+#define BACKLIGHT_PIN B6
+
+#define RGB_DI_PIN F6
+
+#define ADC_PIN F6
diff --git a/keyboards/handwired/onekey/proton_c/config.h b/keyboards/handwired/onekey/proton_c/config.h
index fe34f94add3..3ba4ba64996 100644
--- a/keyboards/handwired/onekey/proton_c/config.h
+++ b/keyboards/handwired/onekey/proton_c/config.h
@@ -18,8 +18,8 @@
#include "config_common.h"
-#define MATRIX_COL_PINS { A3 }
-#define MATRIX_ROW_PINS { A2 }
+#define MATRIX_COL_PINS { A2 }
+#define MATRIX_ROW_PINS { A1 }
#define UNUSED_PINS
#define BACKLIGHT_PIN B8
@@ -27,4 +27,6 @@
#define BACKLIGHT_PWM_CHANNEL 3
#define BACKLIGHT_PAL_MODE 2
-#define RGB_DI_PIN A1
+#define RGB_DI_PIN A0
+
+#define ADC_PIN A0
diff --git a/keyboards/handwired/onekey/stm32f0_disco/chconf.h b/keyboards/handwired/onekey/stm32f0_disco/chconf.h
index 4640ff5332b..03f63da36a8 100644
--- a/keyboards/handwired/onekey/stm32f0_disco/chconf.h
+++ b/keyboards/handwired/onekey/stm32f0_disco/chconf.h
@@ -331,7 +331,7 @@
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE FALSE
+#define CH_CFG_USE_MEMCORE TRUE
#endif
/**
diff --git a/keyboards/handwired/onekey/stm32f0_disco/config.h b/keyboards/handwired/onekey/stm32f0_disco/config.h
index 637ed65d3fa..0d6dd18fa22 100644
--- a/keyboards/handwired/onekey/stm32f0_disco/config.h
+++ b/keyboards/handwired/onekey/stm32f0_disco/config.h
@@ -28,3 +28,5 @@
#define BACKLIGHT_PAL_MODE 0
#define RGB_DI_PIN B15
+
+#define ADC_PIN A0
diff --git a/keyboards/handwired/onekey/teensy_2/config.h b/keyboards/handwired/onekey/teensy_2/config.h
index fbcd630d790..167373cd39b 100644
--- a/keyboards/handwired/onekey/teensy_2/config.h
+++ b/keyboards/handwired/onekey/teensy_2/config.h
@@ -21,3 +21,9 @@
#define MATRIX_COL_PINS { F4 }
#define MATRIX_ROW_PINS { F5 }
#define UNUSED_PINS
+
+#define BACKLIGHT_PIN B6
+
+#define RGB_DI_PIN F6
+
+#define ADC_PIN F6
diff --git a/keyboards/handwired/onekey/teensy_2pp/config.h b/keyboards/handwired/onekey/teensy_2pp/config.h
index 9d993980c25..167373cd39b 100644
--- a/keyboards/handwired/onekey/teensy_2pp/config.h
+++ b/keyboards/handwired/onekey/teensy_2pp/config.h
@@ -18,6 +18,12 @@
#include "config_common.h"
-#define MATRIX_COL_PINS { B2 }
-#define MATRIX_ROW_PINS { B1 }
+#define MATRIX_COL_PINS { F4 }
+#define MATRIX_ROW_PINS { F5 }
#define UNUSED_PINS
+
+#define BACKLIGHT_PIN B6
+
+#define RGB_DI_PIN F6
+
+#define ADC_PIN F6
diff --git a/keyboards/handwired/p1800fl/config.h b/keyboards/handwired/p1800fl/config.h
new file mode 100644
index 00000000000..c2022a6b27c
--- /dev/null
+++ b/keyboards/handwired/p1800fl/config.h
@@ -0,0 +1,72 @@
+/*
+Copyright 2020 marhalloweenvt
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x3EAE
+#define DEVICE_VER 0x0001
+#define MANUFACTURER marhalloweenvt
+#define PRODUCT p1800fl
+#define DESCRIPTION A compact 1800 layout keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 6
+#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 { B6, B5, B4, D7, D6, D4 }
+#define MATRIX_COL_PINS { C7, F7, F6, F5, F4, F1, F0, E6, B0, B1, B2, B3, D0, D1, D2}
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+#define BACKLIGHT_PIN B7
+#define BACKLIGHT_BREATHING
+#define BACKLIGHT_LEVELS 5
+
+/* 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
+
+/* disable these deprecated features by default */
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
+/* QMK DFU key configuration */
+#define QMK_ESC_OUTPUT C7 // usually COL
+#define QMK_ESC_INPUT B6 // usually ROW
\ No newline at end of file
diff --git a/keyboards/handwired/p1800fl/info.json b/keyboards/handwired/p1800fl/info.json
new file mode 100644
index 00000000000..1509b59d96a
--- /dev/null
+++ b/keyboards/handwired/p1800fl/info.json
@@ -0,0 +1,99 @@
+{
+ "keyboard_name": "p1800fl",
+ "url": "",
+ "maintainer": "marhalloweenvt",
+ "width": 19.5,
+ "height": 5.25,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"Esc", "x":0, "y":0},
+ {"label":"!", "x":1, "y":0},
+ {"label":"@", "x":2, "y":0},
+ {"label":"#", "x":3, "y":0},
+ {"label":"$", "x":4, "y":0},
+ {"label":"%", "x":5, "y":0},
+ {"label":"^", "x":6, "y":0},
+ {"label":"&", "x":7, "y":0},
+ {"label":"*", "x":8, "y":0},
+ {"label":"(", "x":9, "y":0},
+ {"label":")", "x":10, "y":0},
+ {"label":"_", "x":11, "y":0},
+ {"label":"+", "x":12, "y":0},
+ {"label":"Backspace", "x":13, "y":0},
+ {"label":"Backspace", "x":14, "y":0},
+ {"label":"Num Lock", "x":15.5, "y":0},
+ {"label":"/", "x":16.5, "y":0},
+ {"label":"*", "x":17.5, "y":0},
+ {"label":"-", "x":18.5, "y":0},
+ {"label":"Tab", "x":0, "y":1, "w":1.5},
+ {"label":"Q", "x":1.5, "y":1},
+ {"label":"W", "x":2.5, "y":1},
+ {"label":"E", "x":3.5, "y":1},
+ {"label":"R", "x":4.5, "y":1},
+ {"label":"T", "x":5.5, "y":1},
+ {"label":"Y", "x":6.5, "y":1},
+ {"label":"U", "x":7.5, "y":1},
+ {"label":"I", "x":8.5, "y":1},
+ {"label":"O", "x":9.5, "y":1},
+ {"label":"P", "x":10.5, "y":1},
+ {"label":"{", "x":11.5, "y":1},
+ {"label":"}", "x":12.5, "y":1},
+ {"label":"|", "x":13.5, "y":1, "w":1.5},
+ {"label":"7", "x":15.5, "y":1},
+ {"label":"8", "x":16.5, "y":1},
+ {"label":"9", "x":17.5, "y":1},
+ {"label":"+", "x":18.5, "y":1},
+ {"label":"Caps Lock", "x":0, "y":2, "w":1.75},
+ {"label":"A", "x":1.75, "y":2},
+ {"label":"S", "x":2.75, "y":2},
+ {"label":"D", "x":3.75, "y":2},
+ {"label":"F", "x":4.75, "y":2},
+ {"label":"G", "x":5.75, "y":2},
+ {"label":"H", "x":6.75, "y":2},
+ {"label":"J", "x":7.75, "y":2},
+ {"label":"K", "x":8.75, "y":2},
+ {"label":"L", "x":9.75, "y":2},
+ {"label":":", "x":10.75, "y":2},
+ {"label":"\"", "x":11.75, "y":2},
+ {"label":"Enter", "x":12.75, "y":2},
+ {"label":"Enter", "x":13.75, "y":2, "w":1.25},
+ {"label":"4", "x":15.5, "y":2},
+ {"label":"5", "x":16.5, "y":2},
+ {"label":"6", "x":17.5, "y":2},
+ {"label":"+", "x":18.5, "y":2},
+ {"label":"Shift", "x":0, "y":3, "w":1.25},
+ {"label":"Shift", "x":1.25, "y":3},
+ {"label":"Z", "x":2.25, "y":3},
+ {"label":"X", "x":3.25, "y":3},
+ {"label":"C", "x":4.25, "y":3},
+ {"label":"V", "x":5.25, "y":3},
+ {"label":"B", "x":6.25, "y":3},
+ {"label":"N", "x":7.25, "y":3},
+ {"label":"M", "x":8.25, "y":3},
+ {"label":"<", "x":9.25, "y":3},
+ {"label":">", "x":10.25, "y":3},
+ {"label":"?", "x":11.25, "y":3},
+ {"label":"Shift", "x":12.25, "y":3, "w":1.75},
+ {"label":"1", "x":15.5, "y":3},
+ {"label":"2", "x":16.5, "y":3},
+ {"label":"3", "x":17.5, "y":3},
+ {"label":"Enter", "x":18.5, "y":3},
+ {"label":"Up", "x":14.25, "y":3.25},
+ {"label":"Ctrl", "x":0, "y":4, "w":1.25},
+ {"label":"Win", "x":1.25, "y":4, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":4, "w":1.25},
+ {"label":"6.25x", "x":3.75, "y":4, "w":6.25},
+ {"label":"Ctrl", "x":10, "y":4},
+ {"label":"Win", "x":11, "y":4},
+ {"label":"Alt", "x":12, "y":4},
+ {"label":"0", "x":16.5, "y":4},
+ {"label":".", "x":17.5, "y":4},
+ {"label":"Enter", "x":18.5, "y":4},
+ {"label":"Left", "x":13.25, "y":4.25},
+ {"label":"Down", "x":14.25, "y":4.25},
+ {"label":"Right", "x":15.25, "y":4.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/p1800fl/keymaps/default/keymap.c b/keyboards/handwired/p1800fl/keymaps/default/keymap.c
new file mode 100644
index 00000000000..03b6a1efd0c
--- /dev/null
+++ b/keyboards/handwired/p1800fl/keymaps/default/keymap.c
@@ -0,0 +1,41 @@
+/* Copyright 2020 marhalloweenvt
+ *
+ * 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 .
+ */
+#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_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PEQL,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PMNS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_LSFT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
+ ),
+ [_FN] = LAYOUT(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL, BL_TOGG, BL_INC, KC_PAST, RESET,
+ _______, KC_HOME, KC_UP, KC_END, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, BL_BRTG, BL_DEC, _______, EEP_RST,
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, EEP_RST,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLU, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/handwired/p1800fl/keymaps/default/readme.md b/keyboards/handwired/p1800fl/keymaps/default/readme.md
new file mode 100644
index 00000000000..268d3992248
--- /dev/null
+++ b/keyboards/handwired/p1800fl/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for p1800fl
diff --git a/keyboards/handwired/p1800fl/p1800fl.c b/keyboards/handwired/p1800fl/p1800fl.c
new file mode 100644
index 00000000000..e0fc16a5e7d
--- /dev/null
+++ b/keyboards/handwired/p1800fl/p1800fl.c
@@ -0,0 +1,28 @@
+/* Copyright 2020 marhalloweenvt
+ *
+ * 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 .
+ */
+
+#include "p1800fl.h"
+
+bool led_update_kb(led_t led_state) {
+ bool res = led_update_user(led_state);
+ if(res) {
+ writePin(D3, led_state.num_lock);
+ writePin(D5, led_state.caps_lock);
+ writePin(C6, led_state.scroll_lock);
+ }
+ return res;
+}
+
diff --git a/keyboards/handwired/p1800fl/p1800fl.h b/keyboards/handwired/p1800fl/p1800fl.h
new file mode 100644
index 00000000000..7b8f3dcffde
--- /dev/null
+++ b/keyboards/handwired/p1800fl/p1800fl.h
@@ -0,0 +1,42 @@
+/* Copyright 2020 marhalloweenvt
+ *
+ * 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 .
+ */
+
+#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, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k50, k51, k52, k53, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k54, k55, k56, k57, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k58, k59, k5a, k5b, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k5c, k5d, k5e, k4e, \
+ k40, k41, k42, k43, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4d \
+) { \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, KC_NO }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, KC_NO }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, KC_NO }, \
+ { k40, k41, k42, k43, KC_NO, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4d, k4e }, \
+ { k50, k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a, k5b, k5c, k5d, k5e }, \
+}
diff --git a/keyboards/handwired/p1800fl/readme.md b/keyboards/handwired/p1800fl/readme.md
new file mode 100644
index 00000000000..545bd691a42
--- /dev/null
+++ b/keyboards/handwired/p1800fl/readme.md
@@ -0,0 +1,15 @@
+# p1800fl
+
+
+
+A 1800 Frow-less keyboard project from our local makers.
+
+* Keyboard Maintainer: [marhalloweenvt](https://github.com/marhalloweenvt)
+* Hardware Supported: p1800fl
+* Hardware Availability: p1800fl
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/p1800fl:default
+
+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).
diff --git a/keyboards/handwired/p1800fl/rules.mk b/keyboards/handwired/p1800fl/rules.mk
new file mode 100644
index 00000000000..b8601f0f105
--- /dev/null
+++ b/keyboards/handwired/p1800fl/rules.mk
@@ -0,0 +1,32 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = qmk-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
diff --git a/keyboards/handwired/prime_exl/info.json b/keyboards/handwired/prime_exl/info.json
index 65b08d61517..6d0da451a02 100644
--- a/keyboards/handwired/prime_exl/info.json
+++ b/keyboards/handwired/prime_exl/info.json
@@ -6,7 +6,7 @@
"height": 6,
"layouts": {
"LAYOUT": {
- "layout": [{"x":0,"y":0,"w":1,"h":1}, {"x":1,"y":0,"w":1,"h":1}, {"x":2,"y":0,"w":1,"h":1}, {"x":3,"y":0,"w":1,"h":1}, {"x":4,"y":0,"w":1,"h":1}, {"x":5,"y":0,"w":1,"h":1}, {"x":6.5,"y":0,"w":1,"h":1}, {"x":7.5,"y":0,"w":1,"h":1}, {"x":8.5,"y":0,"w":1,"h":1}, {"x":9.5,"y":0,"w":1,"h":1}, {"x":10.5,"y":0,"w":1,"h":1}, {"x":11.5,"y":0,"w":1,"h":1}, {"x":13.75,"y":0,"w":1,"h":1}, {"x":14.75,"y":0,"w":1,"h":1}, {"x":15.75,"y":0,"w":1,"h":1}, {"x":16.75,"y":0,"w":1,"h":1}, {"x":17.75,"y":0,"w":1,"h":1}, {"x":18.75,"y":0,"w":2,"h":1}, {"x":0,"y":1,"w":1,"h":1}, {"x":1,"y":1,"w":1,"h":1}, {"x":2,"y":1,"w":1,"h":1}, {"x":3,"y":1,"w":1,"h":1}, {"x":4,"y":1,"w":1,"h":1}, {"x":5,"y":1,"w":1,"h":1}, {"x":6.5,"y":1,"w":1.26,"h":1}, {"x":7.75,"y":1,"w":1,"h":1}, {"x":8.75,"y":1,"w":1,"h":1}, {"x":9.75,"y":1,"w":1,"h":1}, {"x":10.75,"y":1,"w":1,"h":1}, {"x":11.75,"y":1,"w":1,"h":1}, {"x":14,"y":1,"w":1,"h":1}, {"x":15,"y":1,"w":1,"h":1}, {"x":16,"y":1,"w":1,"h":1}, {"x":17,"y":1,"w":1,"h":1}, {"x":18,"y":1,"w":1,"h":1}, {"x":19,"y":1,"w":1.75,"h":1}, {"x":0,"y":2,"w":1,"h":1}, {"x":1,"y":2,"w":1,"h":1}, {"x":2,"y":2,"w":1,"h":1}, {"x":3,"y":2,"w":1,"h":1}, {"x":4,"y":2,"w":1,"h":1}, {"x":5,"y":2,"w":1,"h":1}, {"x":6.5,"y":2,"w":1.75,"h":1}, {"x":8.25,"y":2,"w":1,"h":1}, {"x":9.25,"y":2,"w":1,"h":1}, {"x":10.25,"y":2,"w":1,"h":1}, {"x":11.25,"y":2,"w":1,"h":1}, {"x":12.25,"y":2,"w":1,"h":1}, {"x":13.5,"y":2,"w":1,"h":1}, {"x":14.5,"y":2,"w":1,"h":1}, {"x":15.5,"y":2,"w":1,"h":1}, {"x":16.5,"y":2,"w":1,"h":1}, {"x":17.5,"y":2,"w":1,"h":1}, {"x":18.5,"y":2,"w":1,"h":1}, {"x":19.5,"y":2,"w":1.25,"h":1}, {"x":0,"y":3,"w":1,"h":1}, {"x":1,"y":3,"w":1,"h":1}, {"x":2,"y":3,"w":1,"h":1}, {"x":3,"y":3,"w":1,"h":1}, {"x":4,"y":3,"w":1,"h":1}, {"x":5,"y":3,"w":1,"h":1}, {"x":6.5,"y":3,"w":1.25,"h":1}, {"x":7.75,"y":3,"w":1.25,"h":1}, {"x":9,"y":3,"w":1,"h":1}, {"x":10,"y":3,"w":1,"h":1}, {"x":11,"y":3,"w":2,"h":1}, {"x":13.5,"y":3,"w":2,"h":1}, {"x":15.5,"y":3,"w":1,"h":1}, {"x":16.5,"y":3,"w":1,"h":1}, {"x":17.5,"y":3,"w":1.5,"h":1}, {"x":19,"y":3,"w":1.5,"h":1}, {"x":0,"y":4,"w":1,"h":1}, {"x":1,"y":4,"w":1,"h":1}, {"x":2,"y":4,"w":1,"h":1}, {"x":3,"y":4,"w":1,"h":1}, {"x":4,"y":4,"w":1,"h":1}, {"x":5,"y":4,"w":1,"h":1}]
+ "layout": [{"x":0,"y":0,"w":1,"h":1}, {"x":1,"y":0,"w":1,"h":1}, {"x":2,"y":0,"w":1,"h":1}, {"x":3,"y":0,"w":1,"h":1}, {"x":4,"y":0,"w":1,"h":1}, {"x":5,"y":0,"w":1,"h":1}, {"x":6.5,"y":0,"w":1,"h":1}, {"x":7.5,"y":0,"w":1,"h":1}, {"x":8.5,"y":0,"w":1,"h":1}, {"x":9.5,"y":0,"w":1,"h":1}, {"x":10.5,"y":0,"w":1,"h":1}, {"x":11.5,"y":0,"w":1,"h":1}, {"x":13.75,"y":0,"w":1,"h":1}, {"x":14.75,"y":0,"w":1,"h":1}, {"x":15.75,"y":0,"w":1,"h":1}, {"x":16.75,"y":0,"w":1,"h":1}, {"x":17.75,"y":0,"w":1,"h":1}, {"x":18.75,"y":0,"w":2,"h":1}, {"x":0,"y":1,"w":1,"h":1}, {"x":1,"y":1,"w":1,"h":1}, {"x":2,"y":1,"w":1,"h":1}, {"x":3,"y":1,"w":1,"h":1}, {"x":4,"y":1,"w":1,"h":1}, {"x":5,"y":1,"w":1,"h":1}, {"x":6.5,"y":1,"w":1.25,"h":1}, {"x":7.75,"y":1,"w":1,"h":1}, {"x":8.75,"y":1,"w":1,"h":1}, {"x":9.75,"y":1,"w":1,"h":1}, {"x":10.75,"y":1,"w":1,"h":1}, {"x":11.75,"y":1,"w":1,"h":1}, {"x":14,"y":1,"w":1,"h":1}, {"x":15,"y":1,"w":1,"h":1}, {"x":16,"y":1,"w":1,"h":1}, {"x":17,"y":1,"w":1,"h":1}, {"x":18,"y":1,"w":1,"h":1}, {"x":19,"y":1,"w":1.75,"h":1}, {"x":0,"y":2,"w":1,"h":1}, {"x":1,"y":2,"w":1,"h":1}, {"x":2,"y":2,"w":1,"h":1}, {"x":3,"y":2,"w":1,"h":1}, {"x":4,"y":2,"w":1,"h":1}, {"x":5,"y":2,"w":1,"h":1}, {"x":6.5,"y":2,"w":1.75,"h":1}, {"x":8.25,"y":2,"w":1,"h":1}, {"x":9.25,"y":2,"w":1,"h":1}, {"x":10.25,"y":2,"w":1,"h":1}, {"x":11.25,"y":2,"w":1,"h":1}, {"x":12.25,"y":2,"w":1,"h":1}, {"x":13.5,"y":2,"w":1,"h":1}, {"x":14.5,"y":2,"w":1,"h":1}, {"x":15.5,"y":2,"w":1,"h":1}, {"x":16.5,"y":2,"w":1,"h":1}, {"x":17.5,"y":2,"w":1,"h":1}, {"x":18.5,"y":2,"w":1,"h":1}, {"x":19.5,"y":2,"w":1.25,"h":1}, {"x":0,"y":3,"w":1,"h":1}, {"x":1,"y":3,"w":1,"h":1}, {"x":2,"y":3,"w":1,"h":1}, {"x":3,"y":3,"w":1,"h":1}, {"x":4,"y":3,"w":1,"h":1}, {"x":5,"y":3,"w":1,"h":1}, {"x":6.5,"y":3,"w":1.25,"h":1}, {"x":7.75,"y":3,"w":1.25,"h":1}, {"x":9,"y":3,"w":1,"h":1}, {"x":10,"y":3,"w":1,"h":1}, {"x":11,"y":3,"w":2,"h":1}, {"x":13.5,"y":3,"w":2,"h":1}, {"x":15.5,"y":3,"w":1,"h":1}, {"x":16.5,"y":3,"w":1,"h":1}, {"x":17.5,"y":3,"w":1.5,"h":1}, {"x":19,"y":3,"w":1.5,"h":1}, {"x":0,"y":4,"w":1,"h":1}, {"x":1,"y":4,"w":1,"h":1}, {"x":2,"y":4,"w":1,"h":1}, {"x":3,"y":4,"w":1,"h":1}, {"x":4,"y":4,"w":1,"h":1}, {"x":5,"y":4,"w":1,"h":1}]
}
}
}
diff --git a/keyboards/handwired/sick68/config.h b/keyboards/handwired/sick68/config.h
new file mode 100644
index 00000000000..9f050c361e9
--- /dev/null
+++ b/keyboards/handwired/sick68/config.h
@@ -0,0 +1,253 @@
+/*
+Copyright 2020 umbynos
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x5F00
+#define DEVICE_VER 0x0001
+#define MANUFACTURER umbynos
+#define PRODUCT sick68
+#define DESCRIPTION A 3d printed custom keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#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 \
+ { D3, D2, D1, D0, D4 }
+#define MATRIX_COL_PINS \
+ { C6, D7, E6, B4, B5, B0, D5, B6, B2, B3, B1, F7, F6, F5, F4 }
+#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 BACKLIGHT_PIN B7
+// #define BACKLIGHT_BREATHING
+// #define BACKLIGHT_LEVELS 3
+
+// #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 userful 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
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+/* defined by default; to change, uncomment and set to the combination you want */
+// #define IS_COMMAND() (get_mods() == MOD_MASK_SHIFT)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP H
+//#define MAGIC_KEY_HELP_ALT SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER0_ALT GRAVE
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER B
+//#define MAGIC_KEY_BOOTLOADER_ALT ESC
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_EEPROM_CLEAR BSPACE
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+
+/* disable these deprecated features by default */
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
+/*
+ * MIDI options
+ */
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+//#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 1
+
+/*
+ * 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
+*/
+
+/* Bootmagic Lite key configuration */
+// #define BOOTMAGIC_LITE_ROW 0
+// #define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/handwired/sick68/info.json b/keyboards/handwired/sick68/info.json
new file mode 100644
index 00000000000..29faff29fab
--- /dev/null
+++ b/keyboards/handwired/sick68/info.json
@@ -0,0 +1,86 @@
+{
+ "keyboard_name": "sick68",
+ "url": "",
+ "maintainer": "umbynos",
+ "width": 15,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_65_ansi": {
+ "key_count": 68,
+ "layout": [
+ {"label":"Esc", "x":0, "y":0},
+ {"label":"!", "x":1, "y":0},
+ {"label":"@", "x":2, "y":0},
+ {"label":"#", "x":3, "y":0},
+ {"label":"$", "x":4, "y":0},
+ {"label":"%", "x":5, "y":0},
+ {"label":"^", "x":6, "y":0},
+ {"label":"&", "x":7, "y":0},
+ {"label":"*", "x":8, "y":0},
+ {"label":"(", "x":9, "y":0},
+ {"label":")", "x":10, "y":0},
+ {"label":"_", "x":11, "y":0},
+ {"label":"+", "x":12, "y":0},
+ {"label":"Backspace", "x":13, "y":0, "w":2},
+ {"label":"~", "x":15, "y":0},
+
+ {"label":"Tab", "x":0, "y":1, "w":1.5},
+ {"label":"Q", "x":1.5, "y":1},
+ {"label":"W", "x":2.5, "y":1},
+ {"label":"E", "x":3.5, "y":1},
+ {"label":"R", "x":4.5, "y":1},
+ {"label":"T", "x":5.5, "y":1},
+ {"label":"Y", "x":6.5, "y":1},
+ {"label":"U", "x":7.5, "y":1},
+ {"label":"I", "x":8.5, "y":1},
+ {"label":"O", "x":9.5, "y":1},
+ {"label":"P", "x":10.5, "y":1},
+ {"label":"{", "x":11.5, "y":1},
+ {"label":"}", "x":12.5, "y":1},
+ {"label":"|", "x":13.5, "y":1, "w":1.5},
+ {"label":"Delete", "x":15, "y":1},
+
+ {"label":"Caps Lock", "x":0, "y":2, "w":1.75},
+ {"label":"A", "x":1.75, "y":2},
+ {"label":"S", "x":2.75, "y":2},
+ {"label":"D", "x":3.75, "y":2},
+ {"label":"F", "x":4.75, "y":2},
+ {"label":"G", "x":5.75, "y":2},
+ {"label":"H", "x":6.75, "y":2},
+ {"label":"J", "x":7.75, "y":2},
+ {"label":"K", "x":8.75, "y":2},
+ {"label":"L", "x":9.75, "y":2},
+ {"label":":", "x":10.75, "y":2},
+ {"label":"\"", "x":11.75, "y":2},
+ {"label":"Enter", "x":12.75, "y":2, "w":2.25},
+ {"label":"Page Up", "x":15, "y":2},
+
+ {"label":"Shift", "x":0, "y":3, "w":2.25},
+ {"label":"Z", "x":2.25, "y":3},
+ {"label":"X", "x":3.25, "y":3},
+ {"label":"C", "x":4.25, "y":3},
+ {"label":"V", "x":5.25, "y":3},
+ {"label":"B", "x":6.25, "y":3},
+ {"label":"N", "x":7.25, "y":3},
+ {"label":"M", "x":8.25, "y":3},
+ {"label":"<", "x":9.25, "y":3},
+ {"label":">", "x":10.25, "y":3},
+ {"label":"?", "x":11.25, "y":3},
+ {"label":"Shift", "x":12.25, "y":3, "w":1.75},
+ {"label":"Up", "x":14, "y":3},
+ {"label":"Page Down", "x":15, "y":3},
+
+ {"label":"Ctrl", "x":0, "y":4, "w":1.25},
+ {"label":"Win", "x":1.25, "y":4, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":4, "w":1.25},
+ {"label":"Space", "x":3.75, "y":4, "w":6.25},
+ {"label":"Alt", "x":10, "y":4},
+ {"label":"Fn", "x":11, "y":4},
+ {"label":"Ctrl", "x":12, "y":4},
+ {"label":"Left", "x":13, "y":4},
+ {"label":"Down", "x":14, "y":4},
+ {"label":"Right", "x":15, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/sick68/keymaps/default/keymap.c b/keyboards/handwired/sick68/keymaps/default/keymap.c
new file mode 100644
index 00000000000..f25be190760
--- /dev/null
+++ b/keyboards/handwired/sick68/keymaps/default/keymap.c
@@ -0,0 +1,81 @@
+/* Copyright 2020 umbynos
+ *
+ * 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 .
+ */
+#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] = {
+ /* Keymap _BASE: (Base Layer) Default Layer
+ * ,----------------------------------------------------------------.
+ * |Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |~ ` |
+ * |----------------------------------------------------------------|
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |Del |
+ * |----------------------------------------------------------------|
+ * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp|
+ * |----------------------------------------------------------------|
+ * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn|
+ * |----------------------------------------------------------------|
+ * |Ctrl|Win |Alt | Space |Alt| FN|Ctrl|Lef|Dow|Rig |
+ * `----------------------------------------------------------------'
+ */
+ [_BASE] = LAYOUT_65_ansi(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ /* Keymap _FL: Function Layer
+ * ,----------------------------------------------------------------.
+ * | | F1|F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |Ins |
+ * |----------------------------------------------------------------|
+ * | | |Up | | | | | | | | | | | |Hme |
+ * |----------------------------------------------------------------|
+ * | |<- |Dn | ->| | | | | | | | | |End |
+ * |----------------------------------------------------------------|
+ * | | | |Bl-|BL |BL+| |VU-|VU+|MUT| | McL|MsU|McR |
+ * |----------------------------------------------------------------|
+ * | | | | | | | |MsL|MsD|MsR |
+ * `----------------------------------------------------------------'
+ */
+ [_FN] = LAYOUT_65_ansi(
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS,
+ _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME,
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END,
+ _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, KC_BTN1, KC_MS_U, KC_BTN2,
+ _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R
+ ),
+};
+
+
+/*
+void matrix_init_user(void) {
+
+}
+
+void matrix_scan_user(void) {
+
+}
+
+bool led_update_user(led_t led_state) {
+ return true;
+}
+*/
diff --git a/keyboards/handwired/sick68/keymaps/default/readme.md b/keyboards/handwired/sick68/keymaps/default/readme.md
new file mode 100644
index 00000000000..0cc8fbefcc5
--- /dev/null
+++ b/keyboards/handwired/sick68/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for sick68
diff --git a/keyboards/handwired/sick68/readme.md b/keyboards/handwired/sick68/readme.md
new file mode 100644
index 00000000000..c37ac85c72d
--- /dev/null
+++ b/keyboards/handwired/sick68/readme.md
@@ -0,0 +1,15 @@
+# SiCK-68
+
+
+
+The SiCK-68 is a custom 3D printed mechanical keyboard built from scratch without the price tag often associated with one. It uses the Tada68 layout but an arduino pro micro as microcontroller.
+
+* Keyboard Maintainer: [umbynos](https://github.com/umbynos)
+* Hardware Supported: Arduino Pro Micro
+* Hardware Availability: [files to print and documentation](https://www.thingiverse.com/thing:3478494)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/sick68:default
+
+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).
diff --git a/keyboards/handwired/sick68/rules.mk b/keyboards/handwired/sick68/rules.mk
new file mode 100644
index 00000000000..f90c4cf21e3
--- /dev/null
+++ b/keyboards/handwired/sick68/rules.mk
@@ -0,0 +1,34 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+
+LAYOUTS = 65_ansi
diff --git a/keyboards/handwired/sick68/sick68.c b/keyboards/handwired/sick68/sick68.c
new file mode 100644
index 00000000000..c1f37824ca2
--- /dev/null
+++ b/keyboards/handwired/sick68/sick68.c
@@ -0,0 +1,17 @@
+/* Copyright 2020 umbynos
+ *
+ * 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 .
+ */
+
+#include "sick68.h"
diff --git a/keyboards/handwired/sick68/sick68.h b/keyboards/handwired/sick68/sick68.h
new file mode 100644
index 00000000000..f97d3ef944d
--- /dev/null
+++ b/keyboards/handwired/sick68/sick68.h
@@ -0,0 +1,62 @@
+/* Copyright 2020 umbynos
+ *
+ * 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 .
+ */
+
+#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.
+ */
+
+// readability
+#define XXX KC_NO
+
+/* SICK68 ANSI layout
+ * ,----------------------------------------------------------------.
+ * | 00 |01| 02| 03| 04| 05| 06| 07| 08| 09| 0a| 0b| 0c| 0d | 0e |
+ * |----------------------------------------------------------------|
+ * | 10 | 11| 12| 13| 14| 15| 16| 17| 18| 19| 1a| 1b| 1c| 1d | 1e |
+ * |----------------------------------------------------------------|
+ * | 20 | 21| 22| 23| 24| 25| 26| 27| 28| 29| 2a| 2b| 2d | 2e |
+ * |----------------------------------------------------------------|
+ * | 30 | 32| 33| 34| 35| 36| 37| 38| 39| 3a| 3b| 3c| 3d| 3e |
+ * |----------------------------------------------------------------|
+ * | 40 | 41 | 42 | 46 | 49| 4a| 4b| 4c| 4d| 4e |
+ * `----------------------------------------------------------------'
+ */
+// The first section contains all of the arguments
+// The second converts the arguments into a two-dimensional array
+
+#define LAYOUT_65_ansi( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2d, k2e, \
+ k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \
+ k40, k41, k42, k46, k49, k4a, k4b, k4c, k4d, k4e \
+) \
+{ \
+ {k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e}, \
+ {k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e}, \
+ {k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, XXX, k2d, k2e}, \
+ {k30, XXX, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e}, \
+ {k40, k41, k42, XXX, XXX, XXX, k46, XXX, XXX, k49, k4a, k4b, k4c, k4d, k4e} \
+}
diff --git a/keyboards/handwired/slash/rules.mk b/keyboards/handwired/slash/rules.mk
index 4aba5bdeb9a..092115db127 100644
--- a/keyboards/handwired/slash/rules.mk
+++ b/keyboards/handwired/slash/rules.mk
@@ -5,6 +5,13 @@ MCU = atmega32u4
F_CPU = 8000000
# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
BOOTLOADER = caterina
# Build Options
diff --git a/keyboards/handwired/videowriter/config.h b/keyboards/handwired/videowriter/config.h
index d392564eb9e..bcf059b62b3 100644
--- a/keyboards/handwired/videowriter/config.h
+++ b/keyboards/handwired/videowriter/config.h
@@ -130,10 +130,8 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
/* Bootmagic Lite key configuration */
// #define BOOTMAGIC_LITE_ROW 0
diff --git a/keyboards/handwired/xealousbrown/README.md b/keyboards/handwired/xealousbrown/README.md
index e6092ebb059..970f9444c43 100644
--- a/keyboards/handwired/xealousbrown/README.md
+++ b/keyboards/handwired/xealousbrown/README.md
@@ -7,5 +7,11 @@ https://sites.google.com/site/xaelous/keyboards/handwired-keyboard
Make example for this keyboard (after setting up your build environment):
- make handwired/xealous-brown:default
+ make handwired/xealousbrown:default
+
+The brief list of speedhacks to make this keyboard blazing fast:
+1) bit-bash implementation of scanning rows, columns. Very short delay between pin waiting.
+2) Compiling with a few extra flags
+3) Eager-per-key Debouncing algorithm (no 5ms delay before message is sent)
+4) 1000hz polling
diff --git a/keyboards/handwired/xealousbrown/config.h b/keyboards/handwired/xealousbrown/config.h
index 17aa6c94ee5..bf15637a4d1 100644
--- a/keyboards/handwired/xealousbrown/config.h
+++ b/keyboards/handwired/xealousbrown/config.h
@@ -29,7 +29,10 @@ along with this program. If not, see .
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 13
-
+#define DEBOUNCE 10
+#define USB_POLLING_INTERVAL_MS 1
+/* layer optimization */
+#define LAYER_STATE_8BIT
/*
* Keyboard Matrix Assignments
*
diff --git a/keyboards/handwired/xealousbrown/keymaps/default/keymap.c b/keyboards/handwired/xealousbrown/keymaps/default/keymap.c
index 6597c56673e..908e54133c0 100644
--- a/keyboards/handwired/xealousbrown/keymaps/default/keymap.c
+++ b/keyboards/handwired/xealousbrown/keymaps/default/keymap.c
@@ -10,8 +10,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[1] = LAYOUT( /* FN_Layer */
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \
- KC_CAPS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK,KC_PAUS,\
- KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_INS, KC_DEL, KC_TRNS, \
+ KC_CAPS, KC_PGUP, KC_UP, KC_PGDN, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_UP, KC_PGDN, KC_PSCR, KC_SLCK,KC_PAUS,\
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_HOME, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_INS, KC_DEL, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS,KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DEL \
)
diff --git a/keyboards/handwired/xealousbrown/matrix.c b/keyboards/handwired/xealousbrown/matrix.c
new file mode 100644
index 00000000000..cce0d06ebb8
--- /dev/null
+++ b/keyboards/handwired/xealousbrown/matrix.c
@@ -0,0 +1,112 @@
+/*
+Copyright 2019 Alex Ong
+
+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 .
+*/
+#include
+#include
+#include "wait.h"
+#include "util.h"
+#include "matrix.h"
+#include "debounce.h"
+#include "quantum.h"
+
+/* matrix state(1:on, 0:off) */
+extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values
+extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values
+
+// matrix code
+// super fast read_cols code.
+static matrix_row_t read_cols(void) {
+ return (PINC & (1 << 6) ? 0 : (1UL << 0)) |
+ (PIND & (1 << 7) ? 0 : (1UL << 1)) |
+ (PINE & (1 << 6) ? 0 : (1UL << 2)) |
+ (PINB & (1 << 4) ? 0 : (1UL << 3)) |
+ (PINB & (1 << 5) ? 0 : (1UL << 4)) |
+ (PINB & (1 << 6) ? 0 : (1UL << 5)) |
+ (PINB & (1 << 2) ? 0 : (1UL << 6)) |
+ (PINB & (1 << 3) ? 0 : (1UL << 7)) |
+ (PINB & (1 << 1) ? 0 : (1UL << 8)) |
+ (PINF & (1 << 7) ? 0 : (1UL << 9)) |
+ (PINF & (1 << 6) ? 0 : (1UL << 10)) |
+ (PINF & (1 << 5) ? 0 : (1UL << 11)) |
+ (PINF & (1 << 4) ? 0 : (1UL << 12));
+}
+
+static void unselect_rows(void) {
+ DDRD &= ~0b00011111;
+ PORTD &= ~0b00011111;
+}
+
+static void select_row(uint8_t row) {
+ switch (row) {
+ case 0:
+ DDRD |= (1 << 3);
+ PORTD &= ~(1 << 3);
+ break;
+ case 1:
+ DDRD |= (1 << 2);
+ PORTD &= ~(1 << 2);
+ break;
+ case 2:
+ DDRD |= (1 << 1);
+ PORTD &= ~(1 << 1);
+ break;
+ case 3:
+ DDRD |= (1 << 0);
+ PORTD &= ~(1 << 0);
+ break;
+ case 4:
+ DDRD |= (1 << 4);
+ PORTD &= ~(1 << 4);
+ break;
+ }
+}
+
+static void init_pins(void) {
+ DDRC &= ~(1 << 6);
+ PORTC |= (1 << 6);
+ DDRD &= ~(1 << 7);
+ PORTD |= (1 << 7);
+ DDRE &= ~(1 << 6);
+ PORTE |= (1 << 6);
+ DDRB &= ~(1 << 4 | 1 << 5 | 1 << 6 | 1 << 2 | 1 << 3 | 1 << 1);
+ PORTB |= (1 << 4 | 1 << 5 | 1 << 6 | 1 << 2 | 1 << 3 | 1 << 1);
+ DDRF &= ~(1 << 7 | 1 << 6 | 1 << 5 | 1 << 4);
+ PORTF |= (1 << 7 | 1 << 6 | 1 << 5 | 1 << 4);
+}
+
+// Only need to init the pins. Debounce / raw matrix are initialized already for us.
+void matrix_init_custom(void) {
+ // initialize key pins
+ init_pins();
+}
+
+// Only need to scan the result into current_matrix, and return changed.
+uint8_t matrix_scan_custom(matrix_row_t current_matrix[]) {
+ bool changed = false;
+
+ // Set row, read cols
+ for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) {
+ select_row(current_row);
+ asm volatile("nop");
+ asm volatile("nop");
+ matrix_row_t cols = read_cols();
+ changed |= (current_matrix[current_row] != cols);
+ current_matrix[current_row] = cols;
+ unselect_rows();
+ }
+
+ return changed;
+}
diff --git a/keyboards/handwired/xealousbrown/rules.mk b/keyboards/handwired/xealousbrown/rules.mk
index c346ef6c988..88766358006 100644
--- a/keyboards/handwired/xealousbrown/rules.mk
+++ b/keyboards/handwired/xealousbrown/rules.mk
@@ -14,17 +14,27 @@ BOOTLOADER = caterina
# Build Options
# change yes to no to disable
#
-BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = no # Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
-CONSOLE_ENABLE = yes # Console for debug(+400)
-COMMAND_ENABLE = yes # Commands for debug and configuration
+BOOTMAGIC_ENABLE = full # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE = yes # USB Nkey Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
-MIDI_ENABLE = no # MIDI controls
-UNICODE_ENABLE = no # Unicode
-BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = no # Audio output on port C6
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE = no # MIDI controls
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+SPACE_CADET_ENABLE = no # Unneeded feature.
+
+
+# special sauce for this keyboard
+DEBOUNCE_TYPE = eager_pk # Debounce using eager_pk.
+CUSTOM_MATRIX = lite # Custom matrix that polls at 7000hz instead of a measly 2000hz.
+LTO_ENABLE = yes # smaller binary
+SRC += matrix.c
+
+# Also remember to open tmk's rules.mk and set compilation optimization to 3
diff --git a/keyboards/handwired/xealousbrown/xealousbrown.c b/keyboards/handwired/xealousbrown/xealousbrown.c
index 5c8e2fb18a5..39def8ade43 100644
--- a/keyboards/handwired/xealousbrown/xealousbrown.c
+++ b/keyboards/handwired/xealousbrown/xealousbrown.c
@@ -6,3 +6,44 @@ void matrix_init_kb(void) {
matrix_init_user();
}
+
+
+
+#ifdef BENCHMARK_MATRIX
+# include "timer.h"
+# include
+# include
+# include "wait.h"
+# include "util.h"
+# include "matrix.h"
+# include "quantum.h"
+
+static int scans = 0;
+static uint16_t last_print_out = 0;
+static int last_timer = 0;
+void matrix_scan_user(void) {
+ scans++;
+ uint16_t timer = timer_read();
+
+ if (timer != last_timer && timer != last_timer + 1) {
+ print("MS:\n");
+ print_dec(timer);
+ print("->");
+ print_dec(last_timer);
+ print("\n");
+ }
+
+ last_timer = timer;
+ if ((timer % 1000 == 0) && (timer != last_print_out)) {
+ print("Benchmark:");
+ print("\n");
+ print_dec(timer);
+ print("\n");
+ print_dec(scans);
+ print("\n");
+ print("-------");
+ scans = 0;
+ last_print_out = timer;
+ }
+}
+#endif
diff --git a/keyboards/helix/local_drivers/ssd1306.h b/keyboards/helix/local_drivers/ssd1306.h
index 9cf6983b7e4..f9f91c6fedf 100644
--- a/keyboards/helix/local_drivers/ssd1306.h
+++ b/keyboards/helix/local_drivers/ssd1306.h
@@ -3,7 +3,6 @@
#include
#include
-#include "pincontrol.h"
#include "action.h"
enum ssd1306_cmds {
diff --git a/keyboards/helix/pico/config.h b/keyboards/helix/pico/config.h
index 05713d7602f..a4cc77143b7 100644
--- a/keyboards/helix/pico/config.h
+++ b/keyboards/helix/pico/config.h
@@ -19,8 +19,8 @@ along with this program. If not, see .
#pragma once
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x3060
+#define VENDOR_ID 0x3265
+#define PRODUCT_ID 0x0001
#define DEVICE_VER 0x0002
#define MANUFACTURER Yushakobo
#define PRODUCT HelixPico
diff --git a/keyboards/helix/rev1/config.h b/keyboards/helix/rev1/config.h
index 1a5a2666411..6c6ebea68a0 100644
--- a/keyboards/helix/rev1/config.h
+++ b/keyboards/helix/rev1/config.h
@@ -19,8 +19,8 @@ along with this program. If not, see .
#pragma once
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x3060
+#define VENDOR_ID 0x3265
+#define PRODUCT_ID 0x8000
#define DEVICE_VER 0x0001
#define MANUFACTURER Yushakobo
#define PRODUCT Helix Alpha
diff --git a/keyboards/helix/rev2/config.h b/keyboards/helix/rev2/config.h
index 467d2d66f6e..f85896fbeab 100644
--- a/keyboards/helix/rev2/config.h
+++ b/keyboards/helix/rev2/config.h
@@ -19,8 +19,8 @@ along with this program. If not, see .
#pragma once
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x3060
+#define VENDOR_ID 0x3265
+#define PRODUCT_ID 0x0000
#define DEVICE_VER 0x0001
#define MANUFACTURER Yushakobo
#define PRODUCT Helix Beta
diff --git a/keyboards/helix/rev2/keymaps/default/keymap.c b/keyboards/helix/rev2/keymaps/default/keymap.c
index 78e3424fd54..c575287ee6d 100644
--- a/keyboards/helix/rev2/keymaps/default/keymap.c
+++ b/keyboards/helix/rev2/keymaps/default/keymap.c
@@ -536,9 +536,9 @@ static void render_logo(struct CharacterMatrix *matrix) {
}
static void render_rgbled_status(bool full, struct CharacterMatrix *matrix) {
-#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_ANIMATIONS)
+#ifdef RGBLIGHT_ENABLE
char buf[30];
- if(rgblight_config.enable) {
+ if (RGBLIGHT_MODES > 1 && rgblight_config.enable) {
if (full) {
snprintf(buf, sizeof(buf), " LED %2d: %d,%d,%d ",
rgblight_config.mode,
diff --git a/keyboards/helix/rev2/keymaps/five_rows/keymap.c b/keyboards/helix/rev2/keymaps/five_rows/keymap.c
index eb73881c6ba..fcc5c4bbefa 100644
--- a/keyboards/helix/rev2/keymaps/five_rows/keymap.c
+++ b/keyboards/helix/rev2/keymaps/five_rows/keymap.c
@@ -496,9 +496,9 @@ static void render_logo(struct CharacterMatrix *matrix) {
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,
0};
matrix_write(matrix, logo);
-#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_ANIMATIONS)
+#ifdef RGBLIGHT_ENABLE
char buf[30];
- if(rgblight_config.enable) {
+ if (RGBLIGHT_MODES > 1 && rgblight_config.enable) {
snprintf(buf, sizeof(buf), " LED %2d: %d,%d,%d ",
rgblight_config.mode,
rgblight_config.hue/RGBLIGHT_HUE_STEP,
diff --git a/keyboards/helix/rev2/keymaps/xulkal/config.h b/keyboards/helix/rev2/keymaps/xulkal/config.h
new file mode 100644
index 00000000000..e2b325450a6
--- /dev/null
+++ b/keyboards/helix/rev2/keymaps/xulkal/config.h
@@ -0,0 +1,38 @@
+/*
+This is the c configuration file for the keymap
+
+Copyright 2012 Jun Wako
+Copyright 2015 Jack Humbert
+
+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 .
+*/
+
+#pragma once
+
+// place overrides here
+
+// If you need more program area, try select and reduce rgblight modes to use.
+
+// Selection of RGBLIGHT MODE to use.
+#if defined(LED_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
+#endif
diff --git a/keyboards/helix/rev2/keymaps/xulkal/keymap.c b/keyboards/helix/rev2/keymaps/xulkal/keymap.c
index 3fad64deac3..fecdf4cbd24 100644
--- a/keyboards/helix/rev2/keymaps/xulkal/keymap.c
+++ b/keyboards/helix/rev2/keymaps/xulkal/keymap.c
@@ -27,8 +27,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_________________QWERTY_L1_________________, _________________QWERTY_R1_________________, \
_________________QWERTY_L2_________________, _________________QWERTY_R2_________________, \
_________________QWERTY_L3_________________, _________________QWERTY_R3_________________, \
- _________________QWERTY_L4_________________, RGB_TOG, RGBRST, _________________QWERTY_R4_________________, \
- _________________QWERTY_L5_________________, RGB_RMOD, RGB_MOD, _________________QWERTY_R5_________________ \
+ _________________QWERTY_L4_________________, KC_MINS, KC_EQL, _________________QWERTY_R4_________________, \
+ _________________QWERTY_L5_________________, KC_LBRC, KC_RBRC, _________________QWERTY_R5_________________ \
),
#ifndef GAMELAYER_DISABLE
@@ -36,8 +36,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
___________________GAME_L1_________________, ___________________GAME_R1_________________, \
___________________GAME_L2_________________, ___________________GAME_R2_________________, \
___________________GAME_L3_________________, ___________________GAME_R3_________________, \
- ___________________GAME_L4_________________, RGB_TOG, RGBRST, ___________________GAME_R4_________________, \
- ___________________GAME_L5_________________, RGB_RMOD, RGB_MOD, ___________________GAME_R5_________________ \
+ ___________________GAME_L4_________________, KC_MINS, KC_EQL, ___________________GAME_R4_________________, \
+ ___________________GAME_L5_________________, KC_LBRC, KC_RBRC, ___________________GAME_R5_________________ \
),
#endif
diff --git a/keyboards/hhkb/hhkb.h b/keyboards/hhkb/hhkb.h
index 30dc039a4c1..668f78eecc5 100644
--- a/keyboards/hhkb/hhkb.h
+++ b/keyboards/hhkb/hhkb.h
@@ -21,6 +21,7 @@
{ K70, K71, K72, K73, K74, K75, K76, KC_NO } \
}
+#define LAYOUT_60_hhkb LAYOUT
#define LAYOUT_JP( \
K02, K32, K62, K22, K12, K52, K72, KA2, K92, K82, KB2, KE2, KF2, KD2, KC2, \
diff --git a/keyboards/hhkb/keymaps/dbroqua/keymap.c b/keyboards/hhkb/keymaps/dbroqua/keymap.c
index 4da9b1d4abf..e230a87fb27 100644
--- a/keyboards/hhkb/keymaps/dbroqua/keymap.c
+++ b/keyboards/hhkb/keymaps/dbroqua/keymap.c
@@ -3,18 +3,10 @@
*/
#include QMK_KEYBOARD_H
-enum planck_layers
-{
- _DEFAULT,
- _ALTERNATE,
- _FN,
- _ADJUST
-};
-
-enum planck_keycodes
-{
- DEF = SAFE_RANGE,
- ALT
+enum planck_layers {
+ _DEFAULT,
+ _ALTERNATE,
+ _FN
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@@ -28,7 +20,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |-----------------------------------------------------------------------------------------+
* | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | fn |
* +-----------------------------------------------------------------------------------------+
- * | Alt | Gui | Space | Gui | Alt |
+ * | Alt | Gui | Space | Gui |RCtrl|
* `----------------------------------------------------------------´
*/
[_DEFAULT] = LAYOUT(
@@ -36,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN),
- KC_LALT, KC_LGUI, /* */ KC_SPC, KC_RGUI, KC_RALT),
+ KC_LALT, KC_LGUI, /* */ KC_SPC, KC_RGUI, KC_RCTL),
/* Alternamte layer: swap alt/gui
* ,-----------------------------------------------------------------------------------------.
* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
@@ -47,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |-----------------------------------------------------------------------------------------+
* | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | fn |
* +-----------------------------------------------------------------------------------------+
- * | Gui | Alt | Space | AltGr | RGui|
+ * | Gui | Alt | Space | AltGr |RCtrl|
* `----------------------------------------------------------------´
*/
[_ALTERNATE] = LAYOUT(
@@ -55,7 +47,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN),
- KC_LGUI, KC_LALT, /* */ KC_SPC, KC_RALT, KC_RGUI),
+ KC_LGUI, KC_LALT, /* */ KC_SPC, KC_RALT, KC_RCTL),
/* FN Layer
* ,-----------------------------------------------------------------------------------------.
@@ -75,27 +67,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS,
KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS,
KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, TG(_ADJUST), KC_MSTP, KC_TRNS),
-
- /* SWITCH LAYOUT
- * ,-----------------------------------------------------------------------------------------.
- * | | | | | | | | | | | | | | | |
- * |-----------------------------------------------------------------------------------------+
- * | | | | | | | | | | | | | | |
- * |-----------------------------------------------------------------------------------------+
- * | | | | | | | | | | | | | |
- * |-----------------------------------------------------------------------------------------+
- * | | | | | | | | | | | | | |
- * +-----------------------------------------------------------------------------------------+
- * | | | | | |
- * `----------------------------------------------------------------´
- */
- [_ADJUST] = LAYOUT(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- DEF, ALT, KC_TRNS, KC_TRNS, KC_TRNS)};
+ DF(_DEFAULT), DF(_ALTERNATE), KC_TRNS, KC_MSTP, KC_TRNS)};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
@@ -115,26 +87,3 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
}
return MACRO_NONE;
};
-
-bool process_record_user(uint16_t keycode, keyrecord_t *record)
-{
- switch (keycode)
- {
- case DEF:
- if (record->event.pressed)
- {
- print("mode just switched to qwerty and this is a huge string\n");
- set_single_persistent_default_layer(_DEFAULT);
- }
- return false;
- break;
- case ALT:
- if (record->event.pressed)
- {
- set_single_persistent_default_layer(_ALTERNATE);
- }
- return false;
- break;
- }
- return true;
-}
diff --git a/keyboards/hhkb/keymaps/dbroqua/readme.md b/keyboards/hhkb/keymaps/dbroqua/readme.md
index 05ae9ff4276..3b8950fee0b 100644
--- a/keyboards/hhkb/keymaps/dbroqua/readme.md
+++ b/keyboards/hhkb/keymaps/dbroqua/readme.md
@@ -2,10 +2,25 @@
* Online keyboard layout editor: http://www.keyboard-layout-editor.com/#/gists/78eaf35e80bb714eea80cb4049dedb01
-# Programming Instructions:
+## Switch layout
-Enter into programming mode and run the following command.
+Default bottom layer:
-```
-$ sudo LAYOUT=dbroqua make dfu
-```
+* LALT / LGUI / SPACE / RGUI / RCTRL
+
+Alternate bottom layer:
+
+* LGUI / LALT / SPACE / RALT / RCTRL
+
+To switch from default to alternate (or alternate to default) simple press FN + (LALT/LGUI).
+
+
+## Media keys :
+
+* fn + a = vol_dn
+* fn + s = vol_up
+* fn + d = mute
+* fn + z = previous song
+* fn + x = play/pause
+* fn + c = next song
+* fn + (RGUI/RALT) = stop
diff --git a/keyboards/hhkb/rules.mk b/keyboards/hhkb/rules.mk
index fb1538d8ac3..68fb51a30cf 100644
--- a/keyboards/hhkb/rules.mk
+++ b/keyboards/hhkb/rules.mk
@@ -67,3 +67,5 @@ endif
# debug-off: EXTRAFLAGS += -DNO_DEBUG -DNO_PRINT
# debug-off: OPT_DEFS := $(filter-out -DCONSOLE_ENABLE,$(OPT_DEFS))
# debug-off: all
+
+LAYOUTS = 60_hhkb
diff --git a/keyboards/hineybush/hbcp/config.h b/keyboards/hineybush/hbcp/config.h
index 8a5b96ec367..4f3f2a1cd6b 100644
--- a/keyboards/hineybush/hbcp/config.h
+++ b/keyboards/hineybush/hbcp/config.h
@@ -45,8 +45,7 @@ along with this program. If not, see .
#define MATRIX_COL_PINS { F0, F1, F2, F3, F4, F5, F6, F7, A0, A1, A2, A3, A4, A5, B5, B4, B3, B2 }
#define UNUSED_PINS
-/* COL2ROW, ROW2COL*/
-#define DIODE_DIRECTION COL2ROW
+#define DIODE_DIRECTION EITHERWAY
#define BACKLIGHT_PIN B7
#define BACKLIGHT_BREATHING
diff --git a/keyboards/hineybush/hbcp/matrix.c b/keyboards/hineybush/hbcp/matrix.c
new file mode 100644
index 00000000000..d493a7e9ef6
--- /dev/null
+++ b/keyboards/hineybush/hbcp/matrix.c
@@ -0,0 +1,139 @@
+/*
+Copyright 2012-2020 Jun Wako, Jack Humbert, Yiancar, Ein Terakawa, Drashna, Josh Hinnebusch
+
+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 .
+*/
+#include
+#include
+#include "util.h"
+#include "matrix.h"
+#include "debounce.h"
+#include "quantum.h"
+
+static const pin_t row_pins[] = MATRIX_ROW_PINS;
+static const pin_t col_pins[] = MATRIX_COL_PINS;
+
+/* matrix state(1:on, 0:off) */
+static matrix_row_t last_matrix[MATRIX_ROWS]; // raw values of last scan
+
+// matrix code
+
+ void select_row(uint8_t row) {
+ setPinOutput(row_pins[row]);
+ writePinLow(row_pins[row]);
+}
+
+ void unselect_row(uint8_t row) { setPinInputHigh(row_pins[row]); }
+
+ bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) {
+ // Store last value of row prior to reading
+ matrix_row_t last_row_value = current_matrix[current_row];
+
+ // Clear data in matrix row
+ current_matrix[current_row] = 0;
+
+ // Select row and wait for row selecton to stabilize
+ select_row(current_row);
+ matrix_io_delay();
+
+ // For each col...
+ for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
+ // Select the col pin to read (active low)
+ uint8_t pin_state = readPin(col_pins[col_index]);
+
+ // Populate the matrix row with the state of the col pin
+ current_matrix[current_row] |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index);
+ }
+
+ // Unselect row
+ unselect_row(current_row);
+
+ return (last_row_value != current_matrix[current_row]);
+}
+
+ void select_col(uint8_t col) {
+ setPinOutput(col_pins[col]);
+ writePinLow(col_pins[col]);
+}
+
+ void unselect_col(uint8_t col) { setPinInputHigh(col_pins[col]); }
+
+ bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) {
+ bool matrix_changed = false;
+
+ // Select col and wait for col selecton to stabilize
+ select_col(current_col);
+ matrix_io_delay();
+
+ // For each row...
+ for (uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) {
+ // Store last value of row prior to reading
+ matrix_row_t last_row_value = current_matrix[row_index];
+
+ // Check row pin state
+ if (readPin(row_pins[row_index]) == 0) {
+ // Pin LO, set col bit
+ current_matrix[row_index] |= (MATRIX_ROW_SHIFTER << current_col);
+ }
+
+ // Determine if the matrix changed state
+ if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) {
+ matrix_changed = true;
+ }
+ }
+
+ // Unselect col
+ unselect_col(current_col);
+
+ return matrix_changed;
+}
+
+ void unselect_rows(void) {
+ for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
+ setPinInputHigh(row_pins[x]);
+ }
+}
+
+ void unselect_cols(void) {
+ for (uint8_t x = 0; x < MATRIX_COLS; x++) {
+ setPinInputHigh(col_pins[x]);
+ }
+}
+
+ void init_pins(void) {
+ unselect_rows();
+ unselect_cols();
+}
+
+void matrix_init_custom(void) {
+ // initialize key pins
+ init_pins();
+}
+
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
+ bool changed = false;
+ for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) {
+ last_matrix[current_row] = current_matrix[current_row];
+ read_cols_on_row(current_matrix, current_row);
+ }
+ for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
+ read_rows_on_col(current_matrix, current_col);
+ }
+ for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) {
+ if (last_matrix[current_row] != current_matrix[current_row]) {
+ changed = true;
+ }
+ }
+ return (uint8_t)changed;
+}
diff --git a/keyboards/hineybush/hbcp/rules.mk b/keyboards/hineybush/hbcp/rules.mk
index 869fa029c93..1e973bc858e 100644
--- a/keyboards/hineybush/hbcp/rules.mk
+++ b/keyboards/hineybush/hbcp/rules.mk
@@ -31,3 +31,5 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no # Audio output on port C6
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+CUSTOM_MATRIX = lite
+SRC += matrix.c
diff --git a/keyboards/hineybush/physix/config.h b/keyboards/hineybush/physix/config.h
index cc6e185321e..ccdb18fd212 100644
--- a/keyboards/hineybush/physix/config.h
+++ b/keyboards/hineybush/physix/config.h
@@ -192,10 +192,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/hineybush/physix/info.json b/keyboards/hineybush/physix/info.json
index 089fcdb26b6..80319d476b1 100644
--- a/keyboards/hineybush/physix/info.json
+++ b/keyboards/hineybush/physix/info.json
@@ -6,16 +6,296 @@
"height": 5.25,
"layouts": {
"LAYOUT_all": {
- "layout": [{"label":"Delete", "x":18.75, "y":0}, {"label":"Esc", "x":0.75, "y":0.25}, {"label":"!", "x":1.75, "y":0.25}, {"label":"@", "x":2.75, "y":0.25}, {"label":"#", "x":4, "y":0.25}, {"label":"$", "x":5, "y":0.25}, {"label":"%", "x":6, "y":0.25}, {"label":"^", "x":7, "y":0.25}, {"label":"&", "x":10, "y":0.25}, {"label":"*", "x":11, "y":0.25}, {"label":"(", "x":12, "y":0.25}, {"label":")", "x":13, "y":0.25}, {"label":"_", "x":14.25, "y":0.25}, {"label":"+", "x":15.25, "y":0.25}, {"label":"~", "x":16.25, "y":0.25}, {"label":"Back", "x":17.25, "y":0.25}, {"label":"PgUp", "x":19, "y":1}, {"label":"Tab", "x":0.5, "y":1.25, "w":1.5}, {"label":"Q", "x":2, "y":1.25}, {"label":"W", "x":3.5, "y":1.25}, {"label":"E", "x":4.5, "y":1.25}, {"label":"R", "x":5.5, "y":1.25}, {"label":"T", "x":6.5, "y":1.25}, {"label":"Y", "x":9.5, "y":1.25}, {"label":"U", "x":10.5, "y":1.25}, {"label":"I", "x":11.5, "y":1.25}, {"label":"O", "x":12.5, "y":1.25}, {"label":"P", "x":14, "y":1.25}, {"label":"{", "x":15, "y":1.25}, {"label":"}", "x":16, "y":1.25}, {"label":"|", "x":17, "y":1.25, "w":1.5}, {"label":"PgDn", "x":19.25, "y":2}, {"label":"Caps Lock", "x":0.25, "y":2.25, "w":1.75}, {"label":"A", "x":2, "y":2.25}, {"label":"S", "x":3.75, "y":2.25}, {"label":"D", "x":4.75, "y":2.25}, {"label":"F", "x":5.75, "y":2.25}, {"label":"G", "x":6.75, "y":2.25}, {"label":"H", "x":9.75, "y":2.25}, {"label":"J", "x":10.75, "y":2.25}, {"label":"K", "x":11.75, "y":2.25}, {"label":"L", "x":12.75, "y":2.25}, {"label":":", "x":14.5, "y":2.25}, {"label":"\"", "x":15.5, "y":2.25}, {"label":"Enter", "x":16.5, "y":2.25, "w":2.25}, {"label":"Shift", "x":0, "y":3.25, "w":2.25}, {"label":"Z", "x":2.25, "y":3.25}, {"label":"X", "x":4.25, "y":3.25}, {"label":"C", "x":5.25, "y":3.25}, {"label":"V", "x":6.25, "y":3.25}, {"label":"B", "x":7.25, "y":3.25}, {"label":"B", "x":9.25, "y":3.25}, {"label":"N", "x":10.25, "y":3.25}, {"label":"M", "x":11.25, "y":3.25}, {"label":"<", "x":12.25, "y":3.25}, {"label":">", "x":14, "y":3.25}, {"label":"?", "x":15, "y":3.25}, {"label":"Shift", "x":16, "y":3.25, "w":1.75}, {"label":"\u2191", "x":17.75, "y":3.25}, {"label":"Ctrl", "x":0.25, "y":4.25, "w":1.5}, {"label":"Alt", "x":4, "y":4.25, "w":1.25}, {"label":"Space", "x":5.25, "y":4.25, "w":2.25}, {"label":"Layer 2", "x":7.5, "y":4.25}, {"label":"Space", "x":9, "y":4.25, "w":2}, {"x":11, "y":4.25}, {"label":"Right Alt", "x":12, "y":4.25}, {"label":"Win", "x":15.25, "y":4.25, "w":1.5}, {"label":"\u2190", "x":16.75, "y":4.25}, {"label":"\u2193", "x":17.75, "y":4.25}, {"label":"\u2192", "x":18.75, "y":4.25}]
+ "layout": [
+ {"label":"Esc", "x":0.75, "y":0.25},
+ {"label":"!", "x":1.75, "y":0.25},
+ {"label":"@", "x":2.75, "y":0.25},
+ {"label":"#", "x":4, "y":0.25},
+ {"label":"$", "x":5, "y":0.25},
+ {"label":"%", "x":6, "y":0.25},
+ {"label":"^", "x":7, "y":0.25},
+ {"label":"&", "x":10, "y":0.25},
+ {"label":"*", "x":11, "y":0.25},
+ {"label":"(", "x":12, "y":0.25},
+ {"label":")", "x":13, "y":0.25},
+ {"label":"_", "x":14.25, "y":0.25},
+ {"label":"+", "x":15.25, "y":0.25},
+ {"label":"~", "x":16.25, "y":0.25},
+ {"label":"Back", "x":17.25, "y":0.25},
+ {"label":"Delete", "x":18.75, "y":0},
+ {"label":"Tab", "x":0.5, "y":1.25, "w":1.5},
+ {"label":"Q", "x":2, "y":1.25},
+ {"label":"W", "x":3.5, "y":1.25},
+ {"label":"E", "x":4.5, "y":1.25},
+ {"label":"R", "x":5.5, "y":1.25},
+ {"label":"T", "x":6.5, "y":1.25},
+ {"label":"Y", "x":9.5, "y":1.25},
+ {"label":"U", "x":10.5, "y":1.25},
+ {"label":"I", "x":11.5, "y":1.25},
+ {"label":"O", "x":12.5, "y":1.25},
+ {"label":"P", "x":14, "y":1.25},
+ {"label":"{", "x":15, "y":1.25},
+ {"label":"}", "x":16, "y":1.25},
+ {"label":"|", "x":17, "y":1.25, "w":1.5},
+ {"label":"PgUp", "x":19, "y":1},
+ {"label":"Caps Lock", "x":0.25, "y":2.25, "w":1.75},
+ {"label":"A", "x":2, "y":2.25},
+ {"label":"S", "x":3.75, "y":2.25},
+ {"label":"D", "x":4.75, "y":2.25},
+ {"label":"F", "x":5.75, "y":2.25},
+ {"label":"G", "x":6.75, "y":2.25},
+ {"label":"H", "x":9.75, "y":2.25},
+ {"label":"J", "x":10.75, "y":2.25},
+ {"label":"K", "x":11.75, "y":2.25},
+ {"label":"L", "x":12.75, "y":2.25},
+ {"label":":", "x":14.5, "y":2.25},
+ {"label":"\"", "x":15.5, "y":2.25},
+ {"label":"Enter", "x":16.5, "y":2.25, "w":2.25},
+ {"label":"PgDn", "x":19.25, "y":2},
+ {"label":"Shift", "x":0, "y":3.25, "w":2.25},
+ {"label":"Z", "x":2.25, "y":3.25},
+ {"label":"X", "x":4.25, "y":3.25},
+ {"label":"C", "x":5.25, "y":3.25},
+ {"label":"V", "x":6.25, "y":3.25},
+ {"label":"B", "x":7.25, "y":3.25},
+ {"label":"B", "x":9.25, "y":3.25},
+ {"label":"N", "x":10.25, "y":3.25},
+ {"label":"M", "x":11.25, "y":3.25},
+ {"label":"<", "x":12.25, "y":3.25},
+ {"label":">", "x":14, "y":3.25},
+ {"label":"?", "x":15, "y":3.25},
+ {"label":"Shift", "x":16, "y":3.25, "w":1.75},
+ {"label":"\u2191", "x":17.75, "y":3.25},
+ {"label":"Ctrl", "x":0.25, "y":4.25, "w":1.5},
+ {"label":"Alt", "x":4, "y":4.25, "w":1.25},
+ {"label":"Space", "x":5.25, "y":4.25, "w":2.25},
+ {"label":"Layer 2", "x":7.5, "y":4.25},
+ {"label":"Space", "x":9, "y":4.25, "w":2},
+ {"x":11, "y":4.25},
+ {"label":"Right Alt", "x":12, "y":4.25},
+ {"label":"Win", "x":15.25, "y":4.25, "w":1.5},
+ {"label":"\u2190", "x":16.75, "y":4.25},
+ {"label":"\u2193", "x":17.75, "y":4.25},
+ {"label":"\u2192", "x":18.75, "y":4.25}
+ ]
},
"LAYOUT_split_bksp_275_rspace": {
- "layout": [{"label":"Delete", "x":18.75, "y":0}, {"label":"Esc", "x":0.75, "y":0.25}, {"label":"!", "x":1.75, "y":0.25}, {"label":"@", "x":2.75, "y":0.25}, {"label":"#", "x":4, "y":0.25}, {"label":"$", "x":5, "y":0.25}, {"label":"%", "x":6, "y":0.25}, {"label":"^", "x":7, "y":0.25}, {"label":"&", "x":10, "y":0.25}, {"label":"*", "x":11, "y":0.25}, {"label":"(", "x":12, "y":0.25}, {"label":")", "x":13, "y":0.25}, {"label":"_", "x":14.25, "y":0.25}, {"label":"+", "x":15.25, "y":0.25}, {"label":"~", "x":16.25, "y":0.25}, {"label":"Back", "x":17.25, "y":0.25}, {"label":"PgUp", "x":19, "y":1}, {"label":"Tab", "x":0.5, "y":1.25, "w":1.5}, {"label":"Q", "x":2, "y":1.25}, {"label":"W", "x":3.5, "y":1.25}, {"label":"E", "x":4.5, "y":1.25}, {"label":"R", "x":5.5, "y":1.25}, {"label":"T", "x":6.5, "y":1.25}, {"label":"Y", "x":9.5, "y":1.25}, {"label":"U", "x":10.5, "y":1.25}, {"label":"I", "x":11.5, "y":1.25}, {"label":"O", "x":12.5, "y":1.25}, {"label":"P", "x":14, "y":1.25}, {"label":"{", "x":15, "y":1.25}, {"label":"}", "x":16, "y":1.25}, {"label":"|", "x":17, "y":1.25, "w":1.5}, {"label":"PgDn", "x":19.25, "y":2}, {"label":"Caps Lock", "x":0.25, "y":2.25, "w":1.75}, {"label":"A", "x":2, "y":2.25}, {"label":"S", "x":3.75, "y":2.25}, {"label":"D", "x":4.75, "y":2.25}, {"label":"F", "x":5.75, "y":2.25}, {"label":"G", "x":6.75, "y":2.25}, {"label":"H", "x":9.75, "y":2.25}, {"label":"J", "x":10.75, "y":2.25}, {"label":"K", "x":11.75, "y":2.25}, {"label":"L", "x":12.75, "y":2.25}, {"label":":", "x":14.5, "y":2.25}, {"label":"\"", "x":15.5, "y":2.25}, {"label":"Enter", "x":16.5, "y":2.25, "w":2.25}, {"label":"Shift", "x":0, "y":3.25, "w":2.25}, {"label":"Z", "x":2.25, "y":3.25}, {"label":"X", "x":4.25, "y":3.25}, {"label":"C", "x":5.25, "y":3.25}, {"label":"V", "x":6.25, "y":3.25}, {"label":"B", "x":7.25, "y":3.25}, {"label":"B", "x":9.25, "y":3.25}, {"label":"N", "x":10.25, "y":3.25}, {"label":"M", "x":11.25, "y":3.25}, {"label":"<", "x":12.25, "y":3.25}, {"label":">", "x":14, "y":3.25}, {"label":"?", "x":15, "y":3.25}, {"label":"Shift", "x":16, "y":3.25, "w":1.75}, {"label":"\u2191", "x":17.75, "y":3.25}, {"label":"Ctrl", "x":0.25, "y":4.25, "w":1.5}, {"label":"Alt", "x":4, "y":4.25, "w":1.25}, {"label":"Space", "x":5.25, "y":4.25, "w":2.25}, {"label":"Layer 2", "x":7.5, "y":4.25}, {"label":"Space", "x":9, "y":4.25, "w":2.75}, {"label":"Right Alt", "x":11.75, "y":4.25, "w":1.25}, {"label":"Win", "x":15.25, "y":4.25, "w":1.5}, {"label":"\u2190", "x":16.75, "y":4.25}, {"label":"\u2193", "x":17.75, "y":4.25}, {"label":"\u2192", "x":18.75, "y":4.25}]
+ "layout": [
+ {"label":"Esc", "x":0.75, "y":0.25},
+ {"label":"!", "x":1.75, "y":0.25},
+ {"label":"@", "x":2.75, "y":0.25},
+ {"label":"#", "x":4, "y":0.25},
+ {"label":"$", "x":5, "y":0.25},
+ {"label":"%", "x":6, "y":0.25},
+ {"label":"^", "x":7, "y":0.25},
+ {"label":"&", "x":10, "y":0.25},
+ {"label":"*", "x":11, "y":0.25},
+ {"label":"(", "x":12, "y":0.25},
+ {"label":")", "x":13, "y":0.25},
+ {"label":"_", "x":14.25, "y":0.25},
+ {"label":"+", "x":15.25, "y":0.25},
+ {"label":"~", "x":16.25, "y":0.25},
+ {"label":"Back", "x":17.25, "y":0.25},
+ {"label":"Delete", "x":18.75, "y":0},
+ {"label":"Tab", "x":0.5, "y":1.25, "w":1.5},
+ {"label":"Q", "x":2, "y":1.25},
+ {"label":"W", "x":3.5, "y":1.25},
+ {"label":"E", "x":4.5, "y":1.25},
+ {"label":"R", "x":5.5, "y":1.25},
+ {"label":"T", "x":6.5, "y":1.25},
+ {"label":"Y", "x":9.5, "y":1.25},
+ {"label":"U", "x":10.5, "y":1.25},
+ {"label":"I", "x":11.5, "y":1.25},
+ {"label":"O", "x":12.5, "y":1.25},
+ {"label":"P", "x":14, "y":1.25},
+ {"label":"{", "x":15, "y":1.25},
+ {"label":"}", "x":16, "y":1.25},
+ {"label":"|", "x":17, "y":1.25, "w":1.5},
+ {"label":"PgUp", "x":19, "y":1},
+ {"label":"Caps Lock", "x":0.25, "y":2.25, "w":1.75},
+ {"label":"A", "x":2, "y":2.25},
+ {"label":"S", "x":3.75, "y":2.25},
+ {"label":"D", "x":4.75, "y":2.25},
+ {"label":"F", "x":5.75, "y":2.25},
+ {"label":"G", "x":6.75, "y":2.25},
+ {"label":"H", "x":9.75, "y":2.25},
+ {"label":"J", "x":10.75, "y":2.25},
+ {"label":"K", "x":11.75, "y":2.25},
+ {"label":"L", "x":12.75, "y":2.25},
+ {"label":":", "x":14.5, "y":2.25},
+ {"label":"\"", "x":15.5, "y":2.25},
+ {"label":"Enter", "x":16.5, "y":2.25, "w":2.25},
+ {"label":"PgDn", "x":19.25, "y":2},
+ {"label":"Shift", "x":0, "y":3.25, "w":2.25},
+ {"label":"Z", "x":2.25, "y":3.25},
+ {"label":"X", "x":4.25, "y":3.25},
+ {"label":"C", "x":5.25, "y":3.25},
+ {"label":"V", "x":6.25, "y":3.25},
+ {"label":"B", "x":7.25, "y":3.25},
+ {"label":"B", "x":9.25, "y":3.25},
+ {"label":"N", "x":10.25, "y":3.25},
+ {"label":"M", "x":11.25, "y":3.25},
+ {"label":"<", "x":12.25, "y":3.25},
+ {"label":">", "x":14, "y":3.25},
+ {"label":"?", "x":15, "y":3.25},
+ {"label":"Shift", "x":16, "y":3.25, "w":1.75},
+ {"label":"\u2191", "x":17.75, "y":3.25},
+ {"label":"Ctrl", "x":0.25, "y":4.25, "w":1.5},
+ {"label":"Alt", "x":4, "y":4.25, "w":1.25},
+ {"label":"Space", "x":5.25, "y":4.25, "w":2.25},
+ {"label":"Layer 2", "x":7.5, "y":4.25},
+ {"label":"Space", "x":9, "y":4.25, "w":2.75},
+ {"label":"Right Alt", "x":11.75, "y":4.25, "w":1.25},
+ {"label":"Win", "x":15.25, "y":4.25, "w":1.5},
+ {"label":"\u2190", "x":16.75, "y":4.25},
+ {"label":"\u2193", "x":17.75, "y":4.25},
+ {"label":"\u2192", "x":18.75, "y":4.25}
+ ]
},
"LAYOUT_full_bksp_275_rspace": {
- "layout": [{"label":"Delete", "x":18.75, "y":0}, {"label":"Esc", "x":0.75, "y":0.25}, {"label":"!", "x":1.75, "y":0.25}, {"label":"@", "x":2.75, "y":0.25}, {"label":"#", "x":4, "y":0.25}, {"label":"$", "x":5, "y":0.25}, {"label":"%", "x":6, "y":0.25}, {"label":"^", "x":7, "y":0.25}, {"label":"&", "x":10, "y":0.25}, {"label":"*", "x":11, "y":0.25}, {"label":"(", "x":12, "y":0.25}, {"label":")", "x":13, "y":0.25}, {"label":"_", "x":14.25, "y":0.25}, {"label":"+", "x":15.25, "y":0.25}, {"label":"Back", "x":16.25, "y":0.25, "w":2}, {"label":"PgUp", "x":19, "y":1}, {"label":"Tab", "x":0.5, "y":1.25, "w":1.5}, {"label":"Q", "x":2, "y":1.25}, {"label":"W", "x":3.5, "y":1.25}, {"label":"E", "x":4.5, "y":1.25}, {"label":"R", "x":5.5, "y":1.25}, {"label":"T", "x":6.5, "y":1.25}, {"label":"Y", "x":9.5, "y":1.25}, {"label":"U", "x":10.5, "y":1.25}, {"label":"I", "x":11.5, "y":1.25}, {"label":"O", "x":12.5, "y":1.25}, {"label":"P", "x":14, "y":1.25}, {"label":"{", "x":15, "y":1.25}, {"label":"}", "x":16, "y":1.25}, {"label":"|", "x":17, "y":1.25, "w":1.5}, {"label":"PgDn", "x":19.25, "y":2}, {"label":"Caps Lock", "x":0.25, "y":2.25, "w":1.75}, {"label":"A", "x":2, "y":2.25}, {"label":"S", "x":3.75, "y":2.25}, {"label":"D", "x":4.75, "y":2.25}, {"label":"F", "x":5.75, "y":2.25}, {"label":"G", "x":6.75, "y":2.25}, {"label":"H", "x":9.75, "y":2.25}, {"label":"J", "x":10.75, "y":2.25}, {"label":"K", "x":11.75, "y":2.25}, {"label":"L", "x":12.75, "y":2.25}, {"label":":", "x":14.5, "y":2.25}, {"label":"\"", "x":15.5, "y":2.25}, {"label":"Enter", "x":16.5, "y":2.25, "w":2.25}, {"label":"Shift", "x":0, "y":3.25, "w":2.25}, {"label":"Z", "x":2.25, "y":3.25}, {"label":"X", "x":4.25, "y":3.25}, {"label":"C", "x":5.25, "y":3.25}, {"label":"V", "x":6.25, "y":3.25}, {"label":"B", "x":7.25, "y":3.25}, {"label":"B", "x":9.25, "y":3.25}, {"label":"N", "x":10.25, "y":3.25}, {"label":"M", "x":11.25, "y":3.25}, {"label":"<", "x":12.25, "y":3.25}, {"label":">", "x":14, "y":3.25}, {"label":"?", "x":15, "y":3.25}, {"label":"Shift", "x":16, "y":3.25, "w":1.75}, {"label":"\u2191", "x":17.75, "y":3.25}, {"label":"Ctrl", "x":0.25, "y":4.25, "w":1.5}, {"label":"Alt", "x":4, "y":4.25, "w":1.25}, {"label":"Space", "x":5.25, "y":4.25, "w":2.25}, {"label":"Layer 2", "x":7.5, "y":4.25}, {"label":"Space", "x":9, "y":4.25, "w":2.75}, {"label":"Right Alt", "x":11.75, "y":4.25, "w":1.25}, {"label":"Win", "x":15.25, "y":4.25, "w":1.5}, {"label":"\u2190", "x":16.75, "y":4.25}, {"label":"\u2193", "x":17.75, "y":4.25}, {"label":"\u2192", "x":18.75, "y":4.25}]
+ "layout": [
+ {"label":"Esc", "x":0.75, "y":0.25},
+ {"label":"!", "x":1.75, "y":0.25},
+ {"label":"@", "x":2.75, "y":0.25},
+ {"label":"#", "x":4, "y":0.25},
+ {"label":"$", "x":5, "y":0.25},
+ {"label":"%", "x":6, "y":0.25},
+ {"label":"^", "x":7, "y":0.25},
+ {"label":"&", "x":10, "y":0.25},
+ {"label":"*", "x":11, "y":0.25},
+ {"label":"(", "x":12, "y":0.25},
+ {"label":")", "x":13, "y":0.25},
+ {"label":"_", "x":14.25, "y":0.25},
+ {"label":"+", "x":15.25, "y":0.25},
+ {"label":"Back", "x":16.25, "y":0.25, "w":2},
+ {"label":"Delete", "x":18.75, "y":0},
+ {"label":"Tab", "x":0.5, "y":1.25, "w":1.5},
+ {"label":"Q", "x":2, "y":1.25},
+ {"label":"W", "x":3.5, "y":1.25},
+ {"label":"E", "x":4.5, "y":1.25},
+ {"label":"R", "x":5.5, "y":1.25},
+ {"label":"T", "x":6.5, "y":1.25},
+ {"label":"Y", "x":9.5, "y":1.25},
+ {"label":"U", "x":10.5, "y":1.25},
+ {"label":"I", "x":11.5, "y":1.25},
+ {"label":"O", "x":12.5, "y":1.25},
+ {"label":"P", "x":14, "y":1.25},
+ {"label":"{", "x":15, "y":1.25},
+ {"label":"}", "x":16, "y":1.25},
+ {"label":"|", "x":17, "y":1.25, "w":1.5},
+ {"label":"PgUp", "x":19, "y":1},
+ {"label":"Caps Lock", "x":0.25, "y":2.25, "w":1.75},
+ {"label":"A", "x":2, "y":2.25},
+ {"label":"S", "x":3.75, "y":2.25},
+ {"label":"D", "x":4.75, "y":2.25},
+ {"label":"F", "x":5.75, "y":2.25},
+ {"label":"G", "x":6.75, "y":2.25},
+ {"label":"H", "x":9.75, "y":2.25},
+ {"label":"J", "x":10.75, "y":2.25},
+ {"label":"K", "x":11.75, "y":2.25},
+ {"label":"L", "x":12.75, "y":2.25},
+ {"label":":", "x":14.5, "y":2.25},
+ {"label":"\"", "x":15.5, "y":2.25},
+ {"label":"Enter", "x":16.5, "y":2.25, "w":2.25},
+ {"label":"PgDn", "x":19.25, "y":2},
+ {"label":"Shift", "x":0, "y":3.25, "w":2.25},
+ {"label":"Z", "x":2.25, "y":3.25},
+ {"label":"X", "x":4.25, "y":3.25},
+ {"label":"C", "x":5.25, "y":3.25},
+ {"label":"V", "x":6.25, "y":3.25},
+ {"label":"B", "x":7.25, "y":3.25},
+ {"label":"B", "x":9.25, "y":3.25},
+ {"label":"N", "x":10.25, "y":3.25},
+ {"label":"M", "x":11.25, "y":3.25},
+ {"label":"<", "x":12.25, "y":3.25},
+ {"label":">", "x":14, "y":3.25},
+ {"label":"?", "x":15, "y":3.25},
+ {"label":"Shift", "x":16, "y":3.25, "w":1.75},
+ {"label":"\u2191", "x":17.75, "y":3.25},
+ {"label":"Ctrl", "x":0.25, "y":4.25, "w":1.5},
+ {"label":"Alt", "x":4, "y":4.25, "w":1.25},
+ {"label":"Space", "x":5.25, "y":4.25, "w":2.25},
+ {"label":"Layer 2", "x":7.5, "y":4.25},
+ {"label":"Space", "x":9, "y":4.25, "w":2.75},
+ {"label":"Right Alt", "x":11.75, "y":4.25, "w":1.25},
+ {"label":"Win", "x":15.25, "y":4.25, "w":1.5},
+ {"label":"\u2190", "x":16.75, "y":4.25},
+ {"label":"\u2193", "x":17.75, "y":4.25},
+ {"label":"\u2192", "x":18.75, "y":4.25}
+ ]
},
"LAYOUT_full_bksp_200_rspace": {
- "layout": [{"label":"Delete", "x":18.75, "y":0}, {"label":"Esc", "x":0.75, "y":0.25}, {"label":"!", "x":1.75, "y":0.25}, {"label":"@", "x":2.75, "y":0.25}, {"label":"#", "x":4, "y":0.25}, {"label":"$", "x":5, "y":0.25}, {"label":"%", "x":6, "y":0.25}, {"label":"^", "x":7, "y":0.25}, {"label":"&", "x":10, "y":0.25}, {"label":"*", "x":11, "y":0.25}, {"label":"(", "x":12, "y":0.25}, {"label":")", "x":13, "y":0.25}, {"label":"_", "x":14.25, "y":0.25}, {"label":"+", "x":15.25, "y":0.25}, {"label":"Back", "x":16.25, "y":0.25, "w":2}, {"label":"PgUp", "x":19, "y":1}, {"label":"Tab", "x":0.5, "y":1.25, "w":1.5}, {"label":"Q", "x":2, "y":1.25}, {"label":"W", "x":3.5, "y":1.25}, {"label":"E", "x":4.5, "y":1.25}, {"label":"R", "x":5.5, "y":1.25}, {"label":"T", "x":6.5, "y":1.25}, {"label":"Y", "x":9.5, "y":1.25}, {"label":"U", "x":10.5, "y":1.25}, {"label":"I", "x":11.5, "y":1.25}, {"label":"O", "x":12.5, "y":1.25}, {"label":"P", "x":14, "y":1.25}, {"label":"{", "x":15, "y":1.25}, {"label":"}", "x":16, "y":1.25}, {"label":"|", "x":17, "y":1.25, "w":1.5}, {"label":"PgDn", "x":19.25, "y":2}, {"label":"Caps Lock", "x":0.25, "y":2.25, "w":1.75}, {"label":"A", "x":2, "y":2.25}, {"label":"S", "x":3.75, "y":2.25}, {"label":"D", "x":4.75, "y":2.25}, {"label":"F", "x":5.75, "y":2.25}, {"label":"G", "x":6.75, "y":2.25}, {"label":"H", "x":9.75, "y":2.25}, {"label":"J", "x":10.75, "y":2.25}, {"label":"K", "x":11.75, "y":2.25}, {"label":"L", "x":12.75, "y":2.25}, {"label":":", "x":14.5, "y":2.25}, {"label":"\"", "x":15.5, "y":2.25}, {"label":"Enter", "x":16.5, "y":2.25, "w":2.25}, {"label":"Shift", "x":0, "y":3.25, "w":2.25}, {"label":"Z", "x":2.25, "y":3.25}, {"label":"X", "x":4.25, "y":3.25}, {"label":"C", "x":5.25, "y":3.25}, {"label":"V", "x":6.25, "y":3.25}, {"label":"B", "x":7.25, "y":3.25}, {"label":"B", "x":9.25, "y":3.25}, {"label":"N", "x":10.25, "y":3.25}, {"label":"M", "x":11.25, "y":3.25}, {"label":"<", "x":12.25, "y":3.25}, {"label":">", "x":14, "y":3.25}, {"label":"?", "x":15, "y":3.25}, {"label":"Shift", "x":16, "y":3.25, "w":1.75}, {"label":"\u2191", "x":17.75, "y":3.25}, {"label":"Ctrl", "x":0.25, "y":4.25, "w":1.5}, {"label":"Alt", "x":4, "y":4.25, "w":1.25}, {"label":"Space", "x":5.25, "y":4.25, "w":2.25}, {"label":"Layer 2", "x":7.5, "y":4.25}, {"label":"Space", "x":9, "y":4.25, "w":2}, {"x":11, "y":4.25}, {"label":"Right Alt", "x":12, "y":4.25}, {"label":"Win", "x":15.25, "y":4.25, "w":1.5}, {"label":"\u2190", "x":16.75, "y":4.25}, {"label":"\u2193", "x":17.75, "y":4.25}, {"label":"\u2192", "x":18.75, "y":4.25}]
+ "layout": [
+ {"label":"Esc", "x":0.75, "y":0.25},
+ {"label":"!", "x":1.75, "y":0.25},
+ {"label":"@", "x":2.75, "y":0.25},
+ {"label":"#", "x":4, "y":0.25},
+ {"label":"$", "x":5, "y":0.25},
+ {"label":"%", "x":6, "y":0.25},
+ {"label":"^", "x":7, "y":0.25},
+ {"label":"&", "x":10, "y":0.25},
+ {"label":"*", "x":11, "y":0.25},
+ {"label":"(", "x":12, "y":0.25},
+ {"label":")", "x":13, "y":0.25},
+ {"label":"_", "x":14.25, "y":0.25},
+ {"label":"+", "x":15.25, "y":0.25},
+ {"label":"Back", "x":16.25, "y":0.25, "w":2},
+ {"label":"Delete", "x":18.75, "y":0},
+ {"label":"Tab", "x":0.5, "y":1.25, "w":1.5},
+ {"label":"Q", "x":2, "y":1.25},
+ {"label":"W", "x":3.5, "y":1.25},
+ {"label":"E", "x":4.5, "y":1.25},
+ {"label":"R", "x":5.5, "y":1.25},
+ {"label":"T", "x":6.5, "y":1.25},
+ {"label":"Y", "x":9.5, "y":1.25},
+ {"label":"U", "x":10.5, "y":1.25},
+ {"label":"I", "x":11.5, "y":1.25},
+ {"label":"O", "x":12.5, "y":1.25},
+ {"label":"P", "x":14, "y":1.25},
+ {"label":"{", "x":15, "y":1.25},
+ {"label":"}", "x":16, "y":1.25},
+ {"label":"|", "x":17, "y":1.25, "w":1.5},
+ {"label":"PgUp", "x":19, "y":1},
+ {"label":"Caps Lock", "x":0.25, "y":2.25, "w":1.75},
+ {"label":"A", "x":2, "y":2.25},
+ {"label":"S", "x":3.75, "y":2.25},
+ {"label":"D", "x":4.75, "y":2.25},
+ {"label":"F", "x":5.75, "y":2.25},
+ {"label":"G", "x":6.75, "y":2.25},
+ {"label":"H", "x":9.75, "y":2.25},
+ {"label":"J", "x":10.75, "y":2.25},
+ {"label":"K", "x":11.75, "y":2.25},
+ {"label":"L", "x":12.75, "y":2.25},
+ {"label":":", "x":14.5, "y":2.25},
+ {"label":"\"", "x":15.5, "y":2.25},
+ {"label":"Enter", "x":16.5, "y":2.25, "w":2.25},
+ {"label":"PgDn", "x":19.25, "y":2},
+ {"label":"Shift", "x":0, "y":3.25, "w":2.25},
+ {"label":"Z", "x":2.25, "y":3.25},
+ {"label":"X", "x":4.25, "y":3.25},
+ {"label":"C", "x":5.25, "y":3.25},
+ {"label":"V", "x":6.25, "y":3.25},
+ {"label":"B", "x":7.25, "y":3.25},
+ {"label":"B", "x":9.25, "y":3.25},
+ {"label":"N", "x":10.25, "y":3.25},
+ {"label":"M", "x":11.25, "y":3.25},
+ {"label":"<", "x":12.25, "y":3.25},
+ {"label":">", "x":14, "y":3.25},
+ {"label":"?", "x":15, "y":3.25},
+ {"label":"Shift", "x":16, "y":3.25, "w":1.75},
+ {"label":"\u2191", "x":17.75, "y":3.25},
+ {"label":"Ctrl", "x":0.25, "y":4.25, "w":1.5},
+ {"label":"Alt", "x":4, "y":4.25, "w":1.25},
+ {"label":"Space", "x":5.25, "y":4.25, "w":2.25},
+ {"label":"Layer 2", "x":7.5, "y":4.25},
+ {"label":"Space", "x":9, "y":4.25, "w":2},
+ {"x":11, "y":4.25},
+ {"label":"Right Alt", "x":12, "y":4.25},
+ {"label":"Win", "x":15.25, "y":4.25, "w":1.5},
+ {"label":"\u2190", "x":16.75, "y":4.25},
+ {"label":"\u2193", "x":17.75, "y":4.25},
+ {"label":"\u2192", "x":18.75, "y":4.25}
+ ]
}
}
}
diff --git a/keyboards/hs60/v2/ansi/rules.mk b/keyboards/hs60/v2/ansi/rules.mk
index d013775c11e..8efabcccbf9 100644
--- a/keyboards/hs60/v2/ansi/rules.mk
+++ b/keyboards/hs60/v2/ansi/rules.mk
@@ -30,4 +30,4 @@ SRC = keyboards/wilba_tech/wt_main.c \
keyboards/wilba_tech/wt_rgb_backlight.c \
drivers/issi/is31fl3733.c \
quantum/color.c \
- drivers/arm/i2c_master.c
+ drivers/chibios/i2c_master.c
diff --git a/keyboards/hs60/v2/hhkb/rules.mk b/keyboards/hs60/v2/hhkb/rules.mk
index 44399851f03..14951cca70b 100644
--- a/keyboards/hs60/v2/hhkb/rules.mk
+++ b/keyboards/hs60/v2/hhkb/rules.mk
@@ -28,4 +28,4 @@ SRC = keyboards/wilba_tech/wt_main.c \
keyboards/wilba_tech/wt_rgb_backlight.c \
drivers/issi/is31fl3733.c \
quantum/color.c \
- drivers/arm/i2c_master.c
+ drivers/chibios/i2c_master.c
diff --git a/keyboards/hs60/v2/iso/rules.mk b/keyboards/hs60/v2/iso/rules.mk
index 582ed4e8173..96bfbce056b 100644
--- a/keyboards/hs60/v2/iso/rules.mk
+++ b/keyboards/hs60/v2/iso/rules.mk
@@ -30,4 +30,4 @@ SRC = keyboards/wilba_tech/wt_main.c \
keyboards/wilba_tech/wt_rgb_backlight.c \
drivers/issi/is31fl3733.c \
quantum/color.c \
- drivers/arm/i2c_master.c
+ drivers/chibios/i2c_master.c
diff --git a/keyboards/id80/config.h b/keyboards/id80/config.h
new file mode 100644
index 00000000000..936fd5b2e87
--- /dev/null
+++ b/keyboards/id80/config.h
@@ -0,0 +1,94 @@
+/*
+Copyright 2020 Sergey Vlasov
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x6964 /* "id" */
+#define PRODUCT_ID 0x0080
+#define DEVICE_VER 0x0001
+#define MANUFACTURER IDOBAO
+#define PRODUCT ID80
+#define DESCRIPTION A 75% hotswap keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 9
+#define MATRIX_COLS 11
+
+/*
+ * 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)
+ *
+ * The matrix description in the vendor-supplied JSON file for kbfirmware.com
+ * had 9 columns:
+ * { D0, D1, D2, D3, D5, D4, D6, D7, B4 }
+ * and 12 rows:
+ * { B7, B3, B2, B1, B0, E6, F0, F1, F4, F5, F6, F7 }
+ * However, the row 6 was completely empty, and the pin F0 was not actually
+ * routed anywhere on the PCB, therefore this row was removed to save some
+ * resources (the EEPROM space for dynamic keymaps is especially scarce).
+ *
+ * After doing the above change, the matrix was transposed (rows and columns
+ * were swapped), because a matrix with the COL2ROW layout can be scanned much
+ * more efficiently than a matrix with the ROW2COL layout (depending on various
+ * optimizations, the difference in scan rate can be over 2 times). Because of
+ * this, the "columns" in the matrix layout now mostly correspond to physical
+ * rows, and the "rows" have mostly vertical physical orientation.
+ */
+#define MATRIX_ROW_PINS { D0, D1, D2, D3, D5, D4, D6, D7, B4 }
+#define MATRIX_COL_PINS { B7, B3, B2, B1, B0, E6, F1, F4, F5, F6, F7 }
+
+#define DIODE_DIRECTION COL2ROW
+
+#define BACKLIGHT_PIN B6
+// #define BACKLIGHT_BREATHING
+#define BACKLIGHT_LEVELS 3
+
+#define CAPS_LOCK_LED_PIN C7
+
+#define RGB_DI_PIN E2
+#ifdef RGB_DI_PIN
+ #define RGBLED_NUM 20 /* 16 underglow LEDs, 4 top LEDs */
+ #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
+#endif
+
+/* Bootmagic Lite key configuration: use the Esc key */
+#define BOOTMAGIC_LITE_ROW 0
+#define BOOTMAGIC_LITE_COLUMN 5
diff --git a/keyboards/id80/id80.c b/keyboards/id80/id80.c
new file mode 100644
index 00000000000..5e5dbc31249
--- /dev/null
+++ b/keyboards/id80/id80.c
@@ -0,0 +1,36 @@
+/* Copyright 2020 Sergey Vlasov
+ *
+ * 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 .
+ */
+#include "id80.h"
+
+void matrix_init_kb(void) {
+ led_init_ports();
+ matrix_init_user();
+}
+
+void led_init_ports(void) {
+ setPinOutput(CAPS_LOCK_LED_PIN);
+}
+
+bool led_update_kb(led_t led_state) {
+ bool res = led_update_user(led_state);
+ if (res) {
+ writePin(CAPS_LOCK_LED_PIN, !led_state.caps_lock);
+ }
+ return res;
+}
+
+// partially generated by KBFirmware JSON to QMK Parser
+// https://noroadsleft.github.io/kbf_qmk_converter/
diff --git a/keyboards/id80/id80.h b/keyboards/id80/id80.h
new file mode 100644
index 00000000000..94626fe4f60
--- /dev/null
+++ b/keyboards/id80/id80.h
@@ -0,0 +1,37 @@
+/* Copyright 2020 Sergey Vlasov
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K50, K51, K52, K53, K54, K55, K56, K57, K58, KA7, KA5, KA4, KA3, KA6, KA2, \
+ K40, K41, K42, K43, K44, K45, K46, K47, K48, K98, K97, K95, K94, K96, K92, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K88, K87, K85, K84, K83, K82, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K78, K77, K75, K74, \
+ K10, K12, K13, K14, K15, K16, K17, K18, K68, K67, K65, K64, K63, \
+ K00, K01, K02, K06, K08, K07, K05, K04, K03 \
+) { \
+ { K00, K10, K20, K30, K40, K50, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { K01, KC_NO, K21, K31, K41, K51, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { K02, K12, K22, K32, K42, K52, KC_NO, KC_NO, K82, K92, KA2 }, \
+ { K03, K13, K23, K33, K43, K53, K63, KC_NO, K83, KC_NO, KA3 }, \
+ { K04, K14, K24, K34, K44, K54, K64, K74, K84, K94, KA4 }, \
+ { K05, K15, K25, K35, K45, K55, K65, K75, K85, K95, KA5 }, \
+ { K06, K16, K26, K36, K46, K56, KC_NO, KC_NO, KC_NO, K96, KA6 }, \
+ { K07, K17, K27, K37, K47, K57, K67, K77, K87, K97, KA7 }, \
+ { K08, K18, K28, K38, K48, K58, K68, K78, K88, K98, KC_NO }, \
+}
diff --git a/keyboards/id80/info.json b/keyboards/id80/info.json
new file mode 100644
index 00000000000..986d967a192
--- /dev/null
+++ b/keyboards/id80/info.json
@@ -0,0 +1,13 @@
+{
+ "keyboard_name": "ID80",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 16.25,
+ "height": 6.5,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 80,
+ "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"F1", "x":1.25, "y":0}, {"label":"F2", "x":2.25, "y":0}, {"label":"F3", "x":3.25, "y":0}, {"label":"F4", "x":4.25, "y":0}, {"label":"F5", "x":5.5, "y":0}, {"label":"F6", "x":6.5, "y":0}, {"label":"F7", "x":7.5, "y":0}, {"label":"F8", "x":8.5, "y":0}, {"label":"F9", "x":9.75, "y":0}, {"label":"F10", "x":10.75, "y":0}, {"label":"F11", "x":11.75, "y":0}, {"label":"F12", "x":12.75, "y":0}, {"label":"Fn", "x":14, "y":0}, {"label":"Insert", "x":15.25, "y":0}, {"label":"`", "x":0, "y":1.25}, {"label":"1", "x":1, "y":1.25}, {"label":"2", "x":2, "y":1.25}, {"label":"3", "x":3, "y":1.25}, {"label":"4", "x":4, "y":1.25}, {"label":"5", "x":5, "y":1.25}, {"label":"6", "x":6, "y":1.25}, {"label":"7", "x":7, "y":1.25}, {"label":"8", "x":8, "y":1.25}, {"label":"9", "x":9, "y":1.25}, {"label":"0", "x":10, "y":1.25}, {"label":"-", "x":11, "y":1.25}, {"label":"=", "x":12, "y":1.25}, {"label":"Backspace", "x":13, "y":1.25, "w":2}, {"label":"Home", "x":15.25, "y":1.25}, {"label":"Tab", "x":0, "y":2.25, "w":1.5}, {"label":"Q", "x":1.5, "y":2.25}, {"label":"W", "x":2.5, "y":2.25}, {"label":"E", "x":3.5, "y":2.25}, {"label":"R", "x":4.5, "y":2.25}, {"label":"T", "x":5.5, "y":2.25}, {"label":"Y", "x":6.5, "y":2.25}, {"label":"U", "x":7.5, "y":2.25}, {"label":"I", "x":8.5, "y":2.25}, {"label":"O", "x":9.5, "y":2.25}, {"label":"P", "x":10.5, "y":2.25}, {"label":"[", "x":11.5, "y":2.25}, {"label":"]", "x":12.5, "y":2.25}, {"label":"\\", "x":13.5, "y":2.25, "w":1.5}, {"label":"Delete", "x":15.25, "y":2.25}, {"label":"Caps Lock", "x":0, "y":3.25, "w":1.75}, {"label":"A", "x":1.75, "y":3.25}, {"label":"S", "x":2.75, "y":3.25}, {"label":"D", "x":3.75, "y":3.25}, {"label":"F", "x":4.75, "y":3.25}, {"label":"G", "x":5.75, "y":3.25}, {"label":"H", "x":6.75, "y":3.25}, {"label":"J", "x":7.75, "y":3.25}, {"label":"K", "x":8.75, "y":3.25}, {"label":"L", "x":9.75, "y":3.25}, {"label":";", "x":10.75, "y":3.25}, {"label":"'", "x":11.75, "y":3.25}, {"label":"Enter", "x":12.75, "y":3.25, "w":2.25}, {"label":"Shift", "x":0, "y":4.25, "w":2.25}, {"label":"Z", "x":2.25, "y":4.25}, {"label":"X", "x":3.25, "y":4.25}, {"label":"C", "x":4.25, "y":4.25}, {"label":"V", "x":5.25, "y":4.25}, {"label":"B", "x":6.25, "y":4.25}, {"label":"N", "x":7.25, "y":4.25}, {"label":"M", "x":8.25, "y":4.25}, {"label":",", "x":9.25, "y":4.25}, {"label":".", "x":10.25, "y":4.25}, {"label":"/", "x":11.25, "y":4.25}, {"label":"Shift", "x":12.25, "y":4.25, "w":1.75}, {"label":"\u2191", "x":14.25, "y":4.5}, {"label":"Ctrl", "x":0, "y":5.25, "w":1.25}, {"label":"Win", "x":1.25, "y":5.25, "w":1.25}, {"label":"Alt", "x":2.5, "y":5.25, "w":1.25}, {"x":3.75, "y":5.25, "w":6.25}, {"label":"Alt", "x":10, "y":5.25, "w":1.5}, {"label":"Ctrl", "x":11.5, "y":5.25, "w":1.5}, {"label":"\u2190", "x":13.25, "y":5.5}, {"label":"\u2193", "x":14.25, "y":5.5}, {"label":"\u2192", "x":15.25, "y":5.5}]
+ }
+ }
+}
diff --git a/keyboards/id80/keymaps/default/keymap.c b/keyboards/id80/keymaps/default/keymap.c
new file mode 100644
index 00000000000..696fb303e29
--- /dev/null
+++ b/keyboards/id80/keymaps/default/keymap.c
@@ -0,0 +1,35 @@
+/* Copyright 2020 Sergey Vlasov
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, MO(1), KC_INS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT(
+ RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, RGB_TOG, _______, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, NK_TOGG, _______, _______, _______, _______, _______, BL_INC,
+ _______, _______, _______, _______, _______, _______, BL_TOGG, BL_DEC, BL_STEP
+ ),
+};
diff --git a/keyboards/id80/keymaps/default/readme.md b/keyboards/id80/keymaps/default/readme.md
new file mode 100644
index 00000000000..8ae9f656cd0
--- /dev/null
+++ b/keyboards/id80/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for id80
diff --git a/keyboards/id80/keymaps/via/keymap.c b/keyboards/id80/keymaps/via/keymap.c
new file mode 100644
index 00000000000..686ce9ce739
--- /dev/null
+++ b/keyboards/id80/keymaps/via/keymap.c
@@ -0,0 +1,51 @@
+/* Copyright 2020 Sergey Vlasov
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, MO(1), KC_INS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT(
+ RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, RGB_TOG, _______, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, NK_TOGG, _______, _______, _______, _______, _______, BL_INC,
+ _______, _______, _______, _______, _______, _______, BL_TOGG, BL_DEC, BL_STEP
+ ),
+ [2] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+ [3] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+};
diff --git a/keyboards/id80/keymaps/via/rules.mk b/keyboards/id80/keymaps/via/rules.mk
new file mode 100644
index 00000000000..ea9a831e174
--- /dev/null
+++ b/keyboards/id80/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+LINK_TIME_OPTIMIZATION_ENABLE = yes
+VIA_ENABLE = yes
diff --git a/keyboards/id80/readme.md b/keyboards/id80/readme.md
new file mode 100644
index 00000000000..3d2b934c329
--- /dev/null
+++ b/keyboards/id80/readme.md
@@ -0,0 +1,15 @@
+# IDOBAO ID80
+
+
+
+A 75% hotswap keyboard from IDOBAO.
+
+* Keyboard Maintainer: [Sergey Vlasov](https://github.com/sigprof)
+* Hardware Supported: IDOBAO ID80
+* Hardware Availability: [AliExpress](https://www.aliexpress.com/item/4000590804514.html), [Drop](https://drop.com/buy/idobao-id80-75-hot-swappable-mechanical-keyboard-kit?mode=guest_open)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make id80:default
+
+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).
diff --git a/keyboards/id80/rules.mk b/keyboards/id80/rules.mk
new file mode 100644
index 00000000000..37aa911568b
--- /dev/null
+++ b/keyboards/id80/rules.mk
@@ -0,0 +1,36 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+
+# partially generated by KBFirmware JSON to QMK Parser
+# https://noroadsleft.github.io/kbf_qmk_converter/
diff --git a/keyboards/idb/idb_60/idb_60.c b/keyboards/idb/idb_60/idb_60.c
index d280f644b5c..18ce690431d 100644
--- a/keyboards/idb/idb_60/idb_60.c
+++ b/keyboards/idb/idb_60/idb_60.c
@@ -1,11 +1,5 @@
#include "idb_60.h"
-extern inline void _idb_60_caps_led_on(void);
-extern inline void _idb_60_esc_led_on(void);
-
-extern inline void _idb_60_caps_led_off(void);
-extern inline void _idb_60_esc_led_off(void);
-
void keyboard_pre_init_kb(void) {
setPinOutput(C4);
setPinOutput(C5);
diff --git a/keyboards/idb/idb_60/idb_60.h b/keyboards/idb/idb_60/idb_60.h
index c47d6b29272..5d61ac464af 100644
--- a/keyboards/idb/idb_60/idb_60.h
+++ b/keyboards/idb/idb_60/idb_60.h
@@ -3,21 +3,24 @@
#include "quantum.h"
inline void _idb_60_caps_led_on(void) {
- writePinLow(C5);
+ writePinHigh(C5);
}
-inline void _idb_60_esc_led_on(void) {
- writePinLow(C4);
+inline void _idb_60_fn_led_on(void) {
+ writePinHigh(C4);
}
inline void _idb_60_caps_led_off(void) {
writePinLow(C5);
}
-inline void _idb_60_esc_led_off(void) {
+inline void _idb_60_fn_led_off(void) {
writePinLow(C4);
}
+#define _idb_60_esc_led_on _idb_60_fn_led_on
+#define _idb_60_esc_led_off _idb_60_fn_led_off
+
#define LAYOUT( \
K00, K10, K01, K11, K02, K12, K03, K13, K04, K14, K05, K15, K06, K16, K07,\
K20, K30, K21, K31, K22, K32, K23, K33, K24, K34, K25, K35, K26, K36,\
@@ -57,4 +60,3 @@ inline void _idb_60_esc_led_off(void) {
{ K80, K81, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
{ KC_NO, KC_NO, KC_NO, K93, KC_NO, K95, K96 } \
}
-
diff --git a/keyboards/idb/idb_60/keymaps/all_keys/keymap.c b/keyboards/idb/idb_60/keymaps/all_keys/keymap.c
index 9f2ef36a1f2..2edde98c26d 100644
--- a/keyboards/idb/idb_60/keymaps/all_keys/keymap.c
+++ b/keyboards/idb/idb_60/keymaps/all_keys/keymap.c
@@ -37,10 +37,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
layer_state_t layer_state_set_user(layer_state_t state) {
if (layer_state_cmp(state, 1)) {
- _idb_60_esc_led_on();
+ _idb_60_fn_led_on();
} else {
- _idb_60_esc_led_off();
+ _idb_60_fn_led_off();
}
-
+
return state;
-}
\ No newline at end of file
+}
diff --git a/keyboards/idb/idb_60/keymaps/default/keymap.c b/keyboards/idb/idb_60/keymaps/default/keymap.c
index 22f208caaca..1bf25867f94 100644
--- a/keyboards/idb/idb_60/keymaps/default/keymap.c
+++ b/keyboards/idb/idb_60/keymaps/default/keymap.c
@@ -37,10 +37,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
layer_state_t layer_state_set_user(layer_state_t state) {
if (layer_state_cmp(state, 1)) {
- _idb_60_esc_led_on();
+ _idb_60_fn_led_on();
} else {
- _idb_60_esc_led_off();
+ _idb_60_fn_led_off();
}
-
+
return state;
-}
\ No newline at end of file
+}
diff --git a/keyboards/idb/idb_60/keymaps/pngu/keymap.c b/keyboards/idb/idb_60/keymaps/pngu/keymap.c
index de336e5fa4d..ac0ad10d342 100644
--- a/keyboards/idb/idb_60/keymaps/pngu/keymap.c
+++ b/keyboards/idb/idb_60/keymaps/pngu/keymap.c
@@ -6,8 +6,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_NO,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Z, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
LT(2, KC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
- KC_LSFT, KC_NUBS, KC_Y, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_NO,
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_MENU, MO(1)
+ KC_LSFT, KC_NUBS, KC_Y, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_MENU, KC_RGUI
),
[1] = LAYOUT(
RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, _______,
@@ -30,10 +30,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
layer_state_t layer_state_set_user(layer_state_t state) {
if (layer_state_cmp(state, 1)) {
- _idb_60_esc_led_on();
+ _idb_60_fn_led_on();
} else {
- _idb_60_esc_led_off();
+ _idb_60_fn_led_off();
}
-
+
return state;
-}
\ No newline at end of file
+}
diff --git a/keyboards/idb/idb_60/keymaps/via/keymap.c b/keyboards/idb/idb_60/keymaps/via/keymap.c
index 22f208caaca..1bf25867f94 100644
--- a/keyboards/idb/idb_60/keymaps/via/keymap.c
+++ b/keyboards/idb/idb_60/keymaps/via/keymap.c
@@ -37,10 +37,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
layer_state_t layer_state_set_user(layer_state_t state) {
if (layer_state_cmp(state, 1)) {
- _idb_60_esc_led_on();
+ _idb_60_fn_led_on();
} else {
- _idb_60_esc_led_off();
+ _idb_60_fn_led_off();
}
-
+
return state;
-}
\ No newline at end of file
+}
diff --git a/keyboards/idb/idb_60/readme.md b/keyboards/idb/idb_60/readme.md
index 13a4841b4ae..bd2f76ae689 100644
--- a/keyboards/idb/idb_60/readme.md
+++ b/keyboards/idb/idb_60/readme.md
@@ -2,9 +2,10 @@
Firmware for the idb 60 PCB
-* Keyboard Maintainer: [/u/omgitspngu](https://github.com/itspngu)
+* Keyboard Maintainer: [pngu](https://github.com/itspngu)
* Hardware Supported: idb 60 PCB
-* Hardware Availability: [/u/omgitspngu](https://www.reddit.com/user/omgitspngu/)
+* Hardware Availability: [Case & PCB Files (CC-by-SA 4.0)](https://github.com/itspngu/idb_60)
+* Project Website: [idb Keyboards » 60](https://idb-keyboards.xyz/60)
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/idb/idb_60/rules.mk b/keyboards/idb/idb_60/rules.mk
index 289e77f7716..7e11d4be750 100644
--- a/keyboards/idb/idb_60/rules.mk
+++ b/keyboards/idb/idb_60/rules.mk
@@ -25,4 +25,3 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
-DEBOUNCE_TYPE = eager_pk # Eager debounce type
diff --git a/keyboards/j80/config.h b/keyboards/j80/config.h
index a4a10bff429..c4276431cf3 100644
--- a/keyboards/j80/config.h
+++ b/keyboards/j80/config.h
@@ -39,10 +39,8 @@ along with this program. If not, see .
#define BACKLIGHT_PIN D4
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
/* key combination for magic key command */
/* defined by default; to change, uncomment and set to the combination you want */
diff --git a/keyboards/j80/rules.mk b/keyboards/j80/rules.mk
index 1ceafc9c017..b2ca3a0c2bf 100644
--- a/keyboards/j80/rules.mk
+++ b/keyboards/j80/rules.mk
@@ -17,7 +17,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
+CONSOLE_ENABLE = no # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
diff --git a/keyboards/j80/usbconfig.h b/keyboards/j80/usbconfig.h
deleted file mode 100644
index 0c377f4b7e5..00000000000
--- a/keyboards/j80/usbconfig.h
+++ /dev/null
@@ -1,373 +0,0 @@
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU / 1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'J', 'E', 'R'
-#define USB_CFG_VENDOR_NAME_LEN 3
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'J', '8', '0'
-#define USB_CFG_DEVICE_NAME_LEN 3
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/jae/j01/config.h b/keyboards/jae/j01/config.h
index 8faa651aa7c..9c05a98766b 100644
--- a/keyboards/jae/j01/config.h
+++ b/keyboards/jae/j01/config.h
@@ -165,10 +165,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/jc65/v32a/config.h b/keyboards/jc65/v32a/config.h
index 11f39a5e020..6cf71ab3af0 100644
--- a/keyboards/jc65/v32a/config.h
+++ b/keyboards/jc65/v32a/config.h
@@ -22,8 +22,8 @@ along with this program. If not, see .
#define VENDOR_ID 0x1234
#define PRODUCT_ID 0x5679
#define DEVICE_VER 0x0200
-#define MANUFACTURER winkeyless.kr
-#define PRODUCT JC65 PS2AVRGB
+#define MANUFACTURER RAMA
+#define PRODUCT JC65 BMC
/* matrix size */
#define MATRIX_ROWS 7
diff --git a/keyboards/jc65/v32a/rules.mk b/keyboards/jc65/v32a/rules.mk
index a8fea7efa7f..fd340f04ebc 100644
--- a/keyboards/jc65/v32a/rules.mk
+++ b/keyboards/jc65/v32a/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = full
MOUSEKEY_ENABLE = no
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
diff --git a/keyboards/jc65/v32a/usbconfig.h b/keyboards/jc65/v32a/usbconfig.h
deleted file mode 100644
index 85a915bb463..00000000000
--- a/keyboards/jc65/v32a/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/jisplit89/config.h b/keyboards/jisplit89/config.h
new file mode 100644
index 00000000000..cfb6bf4ffcc
--- /dev/null
+++ b/keyboards/jisplit89/config.h
@@ -0,0 +1,21 @@
+/*
+Copyright 2012 Jun Wako
+Copyright 2015 Jack Humbert
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
diff --git a/keyboards/jisplit89/info.json b/keyboards/jisplit89/info.json
new file mode 100644
index 00000000000..9e4f176aacf
--- /dev/null
+++ b/keyboards/jisplit89/info.json
@@ -0,0 +1,102 @@
+{
+ "keyboard_name": "jisplit89",
+ "url": "https://salicylic-acid3.hatenablog.com/",
+ "maintainer": "Salicylic_acid3",
+ "width": 17,
+ "height": 6.25,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"Esc", "x":0, "y":0},
+ {"label":"F1", "x":1.25, "y":0},
+ {"label":"F2", "x":2.25, "y":0},
+ {"label":"F3", "x":3.25, "y":0},
+ {"label":"F4", "x":4.25, "y":0},
+ {"label":"F5", "x":5.5, "y":0},
+ {"label":"F6", "x":7.5, "y":0},
+ {"label":"F7", "x":8.5, "y":0},
+ {"label":"F8", "x":9.5, "y":0},
+ {"label":"F9", "x":10.75, "y":0},
+ {"label":"F10", "x":11.75, "y":0},
+ {"label":"F11", "x":12.75, "y":0},
+ {"label":"F12", "x":13.75, "y":0},
+ {"label":"Insert", "x":15, "y":0},
+ {"label":"Print Screen", "x":16, "y":0},
+ {"label":"Hankaku/Zenkaku", "x":0, "y":1.25},
+ {"label":"!", "x":1, "y":1.25},
+ {"label":"\"", "x":2, "y":1.25},
+ {"label":"#", "x":3, "y":1.25},
+ {"label":"$", "x":4, "y":1.25},
+ {"label":"%", "x":5, "y":1.25},
+ {"label":"&", "x":7, "y":1.25},
+ {"label":"'", "x":8, "y":1.25},
+ {"label":"(", "x":9, "y":1.25},
+ {"label":")", "x":10, "y":1.25},
+ {"label":"", "x":11, "y":1.25},
+ {"label":"=", "x":12, "y":1.25},
+ {"label":"~", "x":13, "y":1.25},
+ {"label":"|", "x":14, "y":1.25},
+ {"label":"Back", "x":15, "y":1.25},
+ {"label":"Del", "x":16, "y":1.25},
+ {"label":"Tab", "x":0, "y":2.25, "w":1.5},
+ {"label":"Q", "x":1.5, "y":2.25},
+ {"label":"W", "x":2.5, "y":2.25},
+ {"label":"E", "x":3.5, "y":2.25},
+ {"label":"R", "x":4.5, "y":2.25},
+ {"label":"T", "x":5.5, "y":2.25},
+ {"label":"Y", "x":7.5, "y":2.25},
+ {"label":"U", "x":8.5, "y":2.25},
+ {"label":"I", "x":9.5, "y":2.25},
+ {"label":"O", "x":10.5, "y":2.25},
+ {"label":"P", "x":11.5, "y":2.25},
+ {"label":"`", "x":12.5, "y":2.25},
+ {"label":"{", "x":13.5, "y":2.25},
+ {"label":"Return", "x":14.75, "y":2.25, "w":1.25, "h":2},
+ {"label":"Home", "x":16, "y":2.25},
+ {"label":"Caps", "x":0, "y":3.25, "w":1.75},
+ {"label":"A", "x":1.75, "y":3.25},
+ {"label":"S", "x":2.75, "y":3.25},
+ {"label":"D", "x":3.75, "y":3.25},
+ {"label":"F", "x":4.75, "y":3.25},
+ {"label":"G", "x":5.75, "y":3.25},
+ {"label":"H", "x":7.75, "y":3.25},
+ {"label":"J", "x":8.75, "y":3.25},
+ {"label":"K", "x":9.75, "y":3.25},
+ {"label":"L", "x":10.75, "y":3.25},
+ {"label":"+", "x":11.75, "y":3.25},
+ {"label":"*", "x":12.75, "y":3.25},
+ {"label":"}", "x":13.75, "y":3.25},
+ {"label":"End", "x":16, "y":3.25},
+ {"label":"Shift", "x":0, "y":4.25, "w":2},
+ {"label":"Z", "x":2, "y":4.25},
+ {"label":"X", "x":3, "y":4.25},
+ {"label":"C", "x":4, "y":4.25},
+ {"label":"V", "x":5, "y":4.25},
+ {"label":"B", "x":6, "y":4.25},
+ {"label":"N", "x":8, "y":4.25},
+ {"label":"M", "x":9, "y":4.25},
+ {"label":"<", "x":10, "y":4.25},
+ {"label":">", "x":11, "y":4.25},
+ {"label":"?", "x":12, "y":4.25},
+ {"label":"_", "x":13, "y":4.25},
+ {"label":"PgDwn", "x":14, "y":4.25},
+ {"label":"Up", "x":15, "y":4.25},
+ {"label":"PgUp", "x":16, "y":4.25},
+ {"label":"Ctrl", "x":0, "y":5.25, "w":1.25},
+ {"label":"Win", "x":1.25, "y":5.25},
+ {"label":"Alt", "x":2.25, "y":5.25, "w":1.25},
+ {"label":"Muhenkan", "x":3.5, "y":5.25},
+ {"label":"Alt", "x":4.5, "y":5.25, "w":1.25},
+ {"label":"1", "x":5.75, "y":5.25},
+ {"label":"2", "x":7.75, "y":5.25},
+ {"label":"Ctrl", "x":8.75, "y":5.25, "w":1.25},
+ {"label":"Henkan", "x":10, "y":5.25, "w":1.25},
+ {"label":"Kana", "x":11.25, "y":5.25, "w":1.25},
+ {"label":"App", "x":12.5, "y":5.25},
+ {"label":"Left", "x":14, "y":5.25},
+ {"label":"Down", "x":15, "y":5.25},
+ {"label":"Right", "x":16, "y":5.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/jisplit89/jisplit89.c b/keyboards/jisplit89/jisplit89.c
new file mode 100644
index 00000000000..f57f71a6fcc
--- /dev/null
+++ b/keyboards/jisplit89/jisplit89.c
@@ -0,0 +1 @@
+#include "jisplit89.h"
diff --git a/keyboards/jisplit89/jisplit89.h b/keyboards/jisplit89/jisplit89.h
new file mode 100644
index 00000000000..ab1ed00ba60
--- /dev/null
+++ b/keyboards/jisplit89/jisplit89.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#ifdef KEYBOARD_jisplit89_rev1
+ #include "rev1.h"
+#endif
diff --git a/keyboards/jisplit89/keymaps/default/keymap.c b/keyboards/jisplit89/keymaps/default/keymap.c
new file mode 100644
index 00000000000..787e74c4e9e
--- /dev/null
+++ b/keyboards/jisplit89/keymaps/default/keymap.c
@@ -0,0 +1,75 @@
+#include QMK_KEYBOARD_H
+#include "keymap_jp.h"
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_number {
+ _QWERTY = 0,
+ _ADJUST,
+};
+
+enum custom_keycodes {
+ RGB_RST = SAFE_RANGE
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT(
+ //,-----------------------------------------------------| |--------------------------------------------------------------------------------.
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_PSCR,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+LT(_ADJUST,KC_ZKHK),KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, JP_MINS, JP_EQL, JP_YEN, KC_BSPC, KC_DEL,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JP_AT, JP_LBRC, KC_ENT, KC_HOME,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, JP_SCLN, JP_QUOT, JP_RBRC, KC_END,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, JP_BSLS, KC_PGDN, KC_UP, KC_PGUP,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ KC_LCTRL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_HENK, KC_KANA, KC_APP, KC_LEFT, KC_DOWN,KC_RIGHT
+ //`-----------------------------------------------------| |--------------------------------------------------------------------------------'
+ ),
+ [_ADJUST] = LAYOUT( /* Base */
+ //,-----------------------------------------------------| |--------------------------------------------------------------------------------.
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ MO(_ADJUST), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_VAD, RGB_VAI, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+ //`-----------------------------------------------------| |--------------------------------------------------------------------------------'
+ )
+};
+
+int RGB_current_mode;
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ bool result = false;
+ switch (keycode) {
+ #ifdef RGBLIGHT_ENABLE
+ case RGB_MOD:
+ if (record->event.pressed) {
+ rgblight_mode(RGB_current_mode);
+ rgblight_step();
+ RGB_current_mode = rgblight_get_mode();
+ }
+ break;
+ case RGB_RST:
+ if (record->event.pressed) {
+ eeconfig_update_rgblight_default();
+ rgblight_enable();
+ RGB_current_mode = rgblight_get_mode();
+ }
+ break;
+ #endif
+ default:
+ result = true;
+ break;
+ }
+
+ return result;
+}
diff --git a/keyboards/jisplit89/keymaps/salicylic/config.h b/keyboards/jisplit89/keymaps/salicylic/config.h
new file mode 100644
index 00000000000..81ee8ef7850
--- /dev/null
+++ b/keyboards/jisplit89/keymaps/salicylic/config.h
@@ -0,0 +1,22 @@
+/* Copyright 2020 Salicylic_acid3
+ *
+ * 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 .
+ */
+
+#pragma once
+
+/* Select hand configuration */
+
+#define TAPPING_FORCE_HOLD
+#define TAPPING_TERM 180
diff --git a/keyboards/jisplit89/keymaps/salicylic/keymap.c b/keyboards/jisplit89/keymaps/salicylic/keymap.c
new file mode 100644
index 00000000000..350292db1c6
--- /dev/null
+++ b/keyboards/jisplit89/keymaps/salicylic/keymap.c
@@ -0,0 +1,143 @@
+#include QMK_KEYBOARD_H
+#include "keymap_jp.h"
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_number {
+ _QWERTY = 0,
+ _MOUSE,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+enum custom_keycodes {
+ RGB_RST = SAFE_RANGE
+};
+
+enum tapdances{
+ TD_ESMS = 0,
+ TD_ESAR,
+};
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_ESMS] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _MOUSE),
+ [TD_ESAR] = ACTION_TAP_DANCE_DUAL_ROLE(KC_ESC, _QWERTY),
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT(
+ //,-----------------------------------------------------| |--------------------------------------------------------------------------------.
+ TD(TD_ESMS), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_PSCR,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ KC_ZKHK, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, JP_MINS, JP_EQL, JP_YEN, KC_BSPC, KC_DEL,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JP_AT, JP_LBRC, KC_ENT, KC_HOME,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, JP_MINS, JP_QUOT, JP_RBRC, KC_END,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, JP_BSLS, KC_PGDN, KC_UP, KC_PGUP,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ KC_ZKHK, KC_LGUI, KC_LALT,KC_MHEN,LT(_LOWER,KC_ENT),KC_BSPC,KC_DEL,LT(_RAISE,KC_SPC),KC_HENK, KC_KANA, KC_APP, KC_LEFT, KC_DOWN,KC_RIGHT
+ //`-----------------------------------------------------| |--------------------------------------------------------------------------------'
+ ),
+
+ [_MOUSE] = LAYOUT(
+ //,-----------------------------------------------------| |--------------------------------------------------------------------------------.
+ TD(TD_ESAR), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, LCTL(KC_W),
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, LCTL(LSFT(KC_T)),
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_MS_U, KC_BTN2,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R
+ //`-----------------------------------------------------| |--------------------------------------------------------------------------------'
+ ),
+
+ [_LOWER] = LAYOUT(
+ //,-----------------------------------------------------| |--------------------------------------------------------------------------------.
+ KC_ESC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ JP_QUOT, JP_EXLM, JP_QUES, JP_LBRC, JP_RBRC, JP_TILD, KC_P6, KC_P7, KC_P8, KC_P9, JP_ASTR, JP_SLSH, _______, _______, KC_HOME,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+LCTL_T(JP_QUOT),JP_HASH, JP_DQT, JP_LPRN, JP_RPRN, JP_AT, XXXXXXX, KC_P4, KC_P5, KC_P6, JP_MINS, JP_EQL, _______, KC_END,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+SFT_T(JP_CIRC),JP_PERC, JP_AMPR, JP_SCLN, JP_COLN, JP_PIPE, KC_P0, KC_P1, KC_P2, KC_P3, JP_PLUS, _______, KC_PGDN, KC_UP, KC_PGUP,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, MO(_LOWER), _______, _______,MO(_RAISE),_______,_______, _______, KC_LEFT, KC_DOWN,KC_RIGHT
+ //`-----------------------------------------------------| |--------------------------------------------------------------------------------'
+ ),
+
+ [_RAISE] = LAYOUT(
+ //,-----------------------------------------------------| |--------------------------------------------------------------------------------.
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_5, XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, KC_PGUP, XXXXXXX, _______, _______, KC_HOME,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+LCTL_T(KC_F11),XXXXXXX, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, KC_LEFT, KC_DOWN,KC_RIGHT, XXXXXXX, XXXXXXX, _______, KC_END,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+SFT_T(KC_F12), KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_PGDN, _______, KC_PGDN, KC_UP, KC_PGUP,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN,KC_RIGHT
+ //`-----------------------------------------------------| |--------------------------------------------------------------------------------'
+ ),
+
+ [_ADJUST] = LAYOUT( /* Base */
+ //,-----------------------------------------------------| |--------------------------------------------------------------------------------.
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RST, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_VAD, RGB_VAI, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, XXXXXXX, XXXXXXX, XXXXXXX,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX
+ //`-----------------------------------------------------| |--------------------------------------------------------------------------------'
+ )
+};
+
+//A description for expressing the layer position in LED mode.
+layer_state_t layer_state_set_user(layer_state_t state) {
+ state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
+return state;
+}
+
+int RGB_current_mode;
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ bool result = false;
+ switch (keycode) {
+ #ifdef RGBLIGHT_ENABLE
+ case RGB_MOD:
+ if (record->event.pressed) {
+ rgblight_mode(RGB_current_mode);
+ rgblight_step();
+ RGB_current_mode = rgblight_get_mode();
+ }
+ break;
+ case RGB_RST:
+ if (record->event.pressed) {
+ eeconfig_update_rgblight_default();
+ rgblight_enable();
+ RGB_current_mode = rgblight_get_mode();
+ }
+ break;
+ #endif
+ default:
+ result = true;
+ break;
+ }
+
+ return result;
+}
diff --git a/keyboards/jisplit89/keymaps/salicylic/rules.mk b/keyboards/jisplit89/keymaps/salicylic/rules.mk
new file mode 100644
index 00000000000..0bcbf86d5e4
--- /dev/null
+++ b/keyboards/jisplit89/keymaps/salicylic/rules.mk
@@ -0,0 +1,2 @@
+TAP_DANCE_ENABLE = yes
+MOUSEKEY_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/jisplit89/readme.md b/keyboards/jisplit89/readme.md
new file mode 100644
index 00000000000..e7472ab9666
--- /dev/null
+++ b/keyboards/jisplit89/readme.md
@@ -0,0 +1,17 @@
+# JISplit89
+
+
+
+This is 89 keys Custom keyboard.
+
+* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+* Hardware Supported: jisplit89 PCB, Pro Micro
+* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1916810)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make jisplit89:default
+
+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).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/7skb-mx-build-guide)(See here because it is almost the same as 7sKB)
diff --git a/keyboards/jisplit89/rev1/config.h b/keyboards/jisplit89/rev1/config.h
new file mode 100644
index 00000000000..a745ec83420
--- /dev/null
+++ b/keyboards/jisplit89/rev1/config.h
@@ -0,0 +1,83 @@
+/*
+Copyright 2020 Salicylic_acid3
+
+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 .
+*/
+
+#pragma once
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x3060
+#define DEVICE_VER 0x06ae
+#define MANUFACTURER Salicylic_Acid
+#define PRODUCT jisplit89
+#define DESCRIPTION A custom keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 14
+#define MATRIX_COLS 8
+
+// wiring of each half
+#define MATRIX_ROW_PINS { D1, D0, D4, C6, D7, E6, B4 }
+#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B5 }
+
+#define DIODE_DIRECTION COL2ROW
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D2
+#define SPLIT_HAND_PIN B6
+
+/* 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
+
+/* ws2812 RGB LED */
+#define RGB_DI_PIN D3
+
+#ifndef RGBLED_NUM
+ #define RGBLED_NUM 31
+ #define RGBLIGHT_SPLIT
+ #define RGBLED_SPLIT { 11, 20 }
+#endif
+
+#define RGBLIGHT_ANIMATIONS
+
+#ifndef IOS_DEVICE_ENABLE
+ #define RGBLIGHT_LIMIT_VAL 180
+ #define RGBLIGHT_VAL_STEP 17
+#else
+ #define RGBLIGHT_LIMIT_VAL 50
+ #define RGBLIGHT_VAL_STEP 4
+#endif
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+
+#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE)
+// USB_MAX_POWER_CONSUMPTION value for naked48 keyboard
+// 120 RGBoff, OLEDoff
+// 120 OLED
+// 330 RGB 6
+// 300 RGB 32
+// 310 OLED & RGB 32
+ #define USB_MAX_POWER_CONSUMPTION 400
+#else
+ // fix iPhone and iPad power adapter issue
+ // iOS device need lessthan 100
+ #define USB_MAX_POWER_CONSUMPTION 100
+#endif
diff --git a/keyboards/jisplit89/rev1/rev1.c b/keyboards/jisplit89/rev1/rev1.c
new file mode 100644
index 00000000000..520a869e57b
--- /dev/null
+++ b/keyboards/jisplit89/rev1/rev1.c
@@ -0,0 +1 @@
+#include "rev1.h"
diff --git a/keyboards/jisplit89/rev1/rev1.h b/keyboards/jisplit89/rev1/rev1.h
new file mode 100644
index 00000000000..13fb08dfeae
--- /dev/null
+++ b/keyboards/jisplit89/rev1/rev1.h
@@ -0,0 +1,49 @@
+#pragma once
+
+#include "jisplit89.h"
+
+#include "quantum.h"
+
+//////////////////////////////////////////////////////////////////////////////
+// When only use JISplit89.
+//////////////////////////////////////////////////////////////////////////////
+/*
+ * ,-------------------------------------- ----------------------------------------------------------.
+ * | L00 | L01 | L02 | L03 | L04 | L05 | | R00 | R01 | R02 | R03 | R04 | R05 | R06 | R07 | R60 |
+ * |-------------------------------------- ------------------------------------------------------------+
+ * | L10 | L11 | L12 | L13 | L14 | L15 | | R10 | R11 | R12 | R13 | R14 | R15 | R16 | R17 | R61 | R62 |
+ * |---------------------------------------------------------------------------------------------------+
+ * | L20 | L21 | L22 | L23 | L24 | L25 | | R20 | R21 | R22 | R23 | R24 | R25 | R26 | R27 | R63 |
+ * |---------------------------------------- ---------------------------------------------------------+
+ * | L30 | L31 | L32 | L33 | L34 | L35 | | R30 | R31 | R32 | R33 | R34 | R35 | R36 | | R37 |
+ * |---------------------------------------------------------------------------------------------------+
+ * | L40 | L41 | L42 | L43 | L44 | L45 | | R40 | R41 | R42 | R43 | R44 | R45 | R46 | R47 | R57 |
+ * |------------------------------------------- -----------------------------------------------------+
+ * | L50 | L51 | L52 | L53 | L54 | L55 | | R50 | R51 | R52 | R53 | R54 | | R55 | R56 | R64 |
+ * |---------------------------------------- ------------------------------------------------------'
+ */
+
+#define LAYOUT( \
+ L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, R06, R07, R60, \
+ L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, R16, R17, R61, R62, \
+ L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, R26, R27, R63, \
+ L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35, R36, R37, \
+ L40, L41, L42, L43, L44, L45, R40, R41, R42, R43, R44, R45, R46, R47, R57, \
+ L50, L51, L52, L53, L54, L55, R50, R51, R52, R53, R54, R55, R56, R64 \
+ ) \
+ { \
+ { L00, L01, L02, L03, L04, L05, KC_NO, KC_NO }, \
+ { L10, L11, L12, L13, L14, L15, KC_NO, KC_NO }, \
+ { L20, L21, L22, L23, L24, L25, KC_NO, KC_NO }, \
+ { L30, L31, L32, L33, L34, L35, KC_NO, KC_NO }, \
+ { L40, L41, L42, L43, L44, L45, KC_NO, KC_NO }, \
+ { L50, L51, L52, L53, L54, L55, KC_NO, KC_NO }, \
+ {KC_NO,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { R00, R01, R02, R03, R04, R05, R06, R07 }, \
+ { R10, R11, R12, R13, R14, R15, R16, R17 }, \
+ { R20, R21, R22, R23, R24, R25, R26, R27 }, \
+ { R30, R31, R32, R33, R34, R35, R36, R37 }, \
+ { R40, R41, R42, R43, R44, R45, R46, R47 }, \
+ { R50, R51, R52, R53, R54, R55, R56, R57 }, \
+ { R60, R61, R62, R63, R64, KC_NO, KC_NO, KC_NO } \
+ }
diff --git a/keyboards/jisplit89/rev1/rules.mk b/keyboards/jisplit89/rev1/rules.mk
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/jisplit89/rules.mk b/keyboards/jisplit89/rules.mk
new file mode 100644
index 00000000000..c78aa66ba5f
--- /dev/null
+++ b/keyboards/jisplit89/rules.mk
@@ -0,0 +1,38 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+UNICODE_ENABLE = no # Unicode
+
+SPLIT_KEYBOARD = yes
+
+DEFAULT_FOLDER = jisplit89/rev1
diff --git a/keyboards/jj40/config.h b/keyboards/jj40/config.h
index 3138023bb7d..9a1eadb7841 100644
--- a/keyboards/jj40/config.h
+++ b/keyboards/jj40/config.h
@@ -19,10 +19,8 @@ along with this program. If not, see .
#define VENDOR_ID 0x20A0
#define PRODUCT_ID 0x422D
#define DEVICE_VER 0x0200
-// TODO: share these strings with usbconfig.h
-// Edit usbconfig.h to change these.
-#define MANUFACTURER Kprepublic
-#define PRODUCT jj40
+#define MANUFACTURER KPrepublic
+#define PRODUCT JJ40
/* matrix size */
#define MATRIX_ROWS 4
diff --git a/keyboards/jj40/keymaps/stevexyz/config.h b/keyboards/jj40/keymaps/stevexyz/config.h
index 4d4825f9b64..84c02dddd6f 100644
--- a/keyboards/jj40/keymaps/stevexyz/config.h
+++ b/keyboards/jj40/keymaps/stevexyz/config.h
@@ -1,6 +1,8 @@
+#pragma once
// Behaviors That Can Be Configured
+
#define TAPPING_TERM 250
// how long before a tap becomes a hold, if set above 500, a key tapped during the tapping term will turn it into a hold too
@@ -9,18 +11,18 @@
#define IGNORE_MOD_TAP_INTERRUPT
// makes it possible to do rolling combos (zx) with keys that convert to other keys on hold, by enforcing the TAPPING_TERM for both keys.
+#define TAPPING_FORCE_HOLD
+ // makes it possible to use a dual role key as modifier shortly after having been tapped (see Hold after tap)
+ // Breaks any Tap Toggle functionality (TT or the One Shot Tap Toggle)
+
+
/*
#define TAPPING_TERM_PER_KEY
// enables handling for per key TAPPING_TERM settings
#define RETRO_TAPPING
// tap anyway, even after TAPPING_TERM, if there was no other key interruption between press and release
- // See Retro Tapping for details
#define TAPPING_TOGGLE 2
// how many taps before triggering the toggle
- #define TAPPING_FORCE_HOLD
- // makes it possible to use a dual role key as modifier shortly after having been tapped
- // See Hold after tap
- // Breaks any Tap Toggle functionality (TT or the One Shot Tap Toggle)
#define LEADER_TIMEOUT 300
// how long before the leader key times out
// If you're having issues finishing the sequence before it times out, you may need to increase the timeout setting. Or you may want to enable the LEADER_PER_KEY_TIMING option, which resets the timeout after each key is tapped.
diff --git a/keyboards/jj40/keymaps/stevexyz/keyboard-layout-editor-raw-data.txt b/keyboards/jj40/keymaps/stevexyz/keyboard-layout-editor-raw-data.txt
deleted file mode 100644
index 0117b5e2ee1..00000000000
--- a/keyboards/jj40/keymaps/stevexyz/keyboard-layout-editor-raw-data.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-[{c:"#eeddcc",g:true,a:7},"","","","","","","","","","","",""],
-["",{c:"#cccccc",g:false,a:4,fa:[2,1,5,5,8]},"F11\nF1\n!\n1\nQ","F12\nF2\n@\n2\nW","Layer Num\nF3\n#\n3\nE","Layer Light\nF4\n$\n4\nR","\nF5\n%\n5\nT","\nF6\n^\n6\nY","\nF7\n&\n7\nU","\nF8\n*\n8\nI","Layer Mouse\nF9\n(\n9\nO","\nF10\n)\n0\nP",{c:"#eeddcc",g:true,a:7},""],
-["",{c:"#cccccc",t:"#000000\n\n\n\n\n\n\n\n\n\n#804020",g:false,a:4,fa:[2,1,5,5,8,0,2,2,0,0,1]},"Caps\n\n\n\nA\n\nEsc\nTab\n\n\nshift",{fa:[2,2,5,5,8,0,2,2,0,0,1]}," \n \n~\n`\nS\n\n\n\n\n\nfn"," \n \n_\n-\nD\n\n\n\n\n\nnum",{t:"#000000"}," \n \n+\n=\nF",{t:"#000000\n\n\n\n\n\n\n\n\n\n#804020"}," \n \n{\n[\nG\n\n\n\n\n\n "," \n \n}\n]\nH\n\n\n\n\n\n ",{t:"#000000"},"\n \n|\n\\\nJ",{t:"#000000\n\n\n\n\n\n\n\n\n\n#804020"},"\n \n:\n;\nK\n\n\n\n\n\nfn","\n \n\"\n'\nL\n\n\n\n\n\nnum",{c:"#eeddcc",f:1,fa:[2,2,5,5,8,0,2,2,0,0,0]},"Ins\n\n\n\n\n\nBS\nDel\n\n\nshift",{t:"#000000",g:true,a:7,f:3},""],
-["","",{c:"#cccccc",t:"#000000\n#804020",g:false,a:5,fa:[0,1,0,0,8]},"\nctrl\n\n\nZ","\nalt\n\n\nX",{t:"#000000\n\n\n\n\n\n\n\n\n\n#804020",a:4,fa:[2,1,0,0,8,0,0,0,0,0,1]},"^\n\n\n\nC\n\n\n\n\n\nfn","^\n\n\n\nV\n\n\n\n\n\nnum",{fa:[2,1,5,5,8,0,0,0,0,0,1]},"Prnt Scrn\n\n<\n,\nB\n\n\n\n\n\nshift","Scr Lock\n\n>\n.\nN\n\n\n\n\n\nalt","Paus\n\n?\n/\nM\n\n\n\n\n\nctrl",{t:"#000000\n#804020",a:5},"\nshift",{c:"#eeddcc",t:"#000000",g:true,a:7},"",""]
diff --git a/keyboards/jj40/keymaps/stevexyz/keymap.c b/keyboards/jj40/keymaps/stevexyz/keymap.c
index 4045d071092..02601a30d9c 100644
--- a/keyboards/jj40/keymaps/stevexyz/keymap.c
+++ b/keyboards/jj40/keymaps/stevexyz/keymap.c
@@ -22,6 +22,12 @@
*/
+/*
+ * Nice to have:
+ * - tap dancing (p=backspace, q=escape, a=tab, vowel=accentedletter and same for consonant as the french c)
+ */
+
+
#include QMK_KEYBOARD_H
enum layers {
@@ -38,20 +44,24 @@ enum custom_keycodes {
CK_TRIPLEZERO = SAFE_RANGE,
};
+#define CK_CONFIGINIT EEPROM_RESET
+
enum {
- TD_ENT_BSPC = 0,
- TD_KPENT_BSPC,
- TD_E_GRAVE,
+ TD_P_BSPC = 0,
+ TD_Q_ESC,
+ TD_A_TAB,
TD_A_GRAVE,
+ TD_E_GRAVE,
+ TD_E_ACUTE,
+ TD_I_GRAVE,
TD_O_GRAVE,
TD_U_GRAVE,
- TD_I_GRAVE,
- TD_E_ACUTE,
};
qk_tap_dance_action_t tap_dance_actions[] = {
- [TD_ENT_BSPC] = ACTION_TAP_DANCE_DOUBLE(KC_ENT, KC_BSPC),
- [TD_KPENT_BSPC] = ACTION_TAP_DANCE_DOUBLE(KC_KP_ENTER, KC_BSPC),
- [TD_E_GRAVE] = ACTION_TAP_DANCE_DOUBLE(KC_E, KC_E),
+ [TD_P_BSPC] = ACTION_TAP_DANCE_DOUBLE(KC_P, KC_BSPC),
+ [TD_Q_ESC] = ACTION_TAP_DANCE_DOUBLE(KC_Q, KC_ESC),
+ [TD_A_TAB] = ACTION_TAP_DANCE_DOUBLE(KC_A, KC_TAB),
+ //[TD_E_GRAVE] = ACTION_TAP_DANCE_DOUBLE(KC_E, KC_EGRAVE),
};
@@ -83,18 +93,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | | | | | | | | | | | |
* | | A | S | D | F | G | H | J | K | L | Enter| |
- * | | Shift| FnNav|NumSym| ____ | OSkey| OSkey| ____ | FnNav|NumSym| Shift| |
+ * | | Shift| FnNav|NumSym| AltGr| OSkey| OSkey| AltGr| FnNav|NumSym| Shift| |
* |------+------+------+------+------+------+------|------+------+------+------+------+
* | | | | | | | | | | | | |
* | | | Z | X | C | V | B | N | M | Space| | |
- * | | | Ctrl | Alt | FnNav|NumSym| Shift| Alt | Ctrl | Shift| | |
+ * | | | Ctrl | Alt | FnNav|NumSym| Shift| Alt | Ctrl | Shift| | |
* `-----------------------------------------------------------------------------------'
*/
[LAYER_HOME] = LAYOUT_ortho_4x12(
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, XXXXXXX,
- XXXXXXX, MT(MOD_LSFT, KC_A), LT(LAYER_FUNC, KC_S), LT(LAYER_NUMSYM, KC_D), KC_F, MT(MOD_LGUI, KC_G), MT(MOD_RGUI, KC_H), KC_J, LT(LAYER_FUNC, KC_K), LT(LAYER_NUMSYM, KC_L), MT(MOD_RSFT, KC_ENT), XXXXXXX,
- XXXXXXX, XXXXXXX, MT(MOD_LCTL, KC_Z), MT(MOD_LALT, KC_X), LT(LAYER_FUNC, KC_C), LT(LAYER_NUMSYM, KC_V), MT(MOD_LSFT, KC_B), MT(MOD_RALT, KC_N), MT(MOD_RCTL, KC_M), MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
+ XXXXXXX, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, XXXXXXX,
+ XXXXXXX, MT(MOD_LSFT, KC_A), LT(LAYER_FUNC, KC_S), LT(LAYER_NUMSYM, KC_D), MT(MOD_RALT, KC_F), MT(MOD_LGUI, KC_G), MT(MOD_RGUI, KC_H), MT(MOD_RALT, KC_J), LT(LAYER_FUNC, KC_K), LT(LAYER_NUMSYM, KC_L), MT(MOD_RSFT, KC_ENT), XXXXXXX,
+ XXXXXXX, XXXXXXX, MT(MOD_LCTL, KC_Z), MT(MOD_LALT, KC_X), LT(LAYER_FUNC, KC_C), LT(LAYER_NUMSYM, KC_V), MT(MOD_LSFT, KC_B), MT(MOD_LALT, KC_N), MT(MOD_RCTL, KC_M), MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
/* Function and Navigation Layer
* ,-----------------------------------------------------------------------------------.
@@ -108,18 +118,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | | | | | | | | | | | |
* | | ESC | Home | PgDn | PgUp | End | Left | Down | Up | Right| Baksp| |
- * | | Shift|xxxxxx|SysLay| ____ | ____ | ____ | ____ |xxxxxx|SysLay| Shift| |
+ * | | Shift| ____ |SysLay| AltGr| OSkey| OSkey| AltGr| ____ |SysLay| Shift| |
* |------+------+------+------+------+------+------|------+------+------+------+------+
* | | | | | | | | | | | | |
* | | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | | |
- * | | | Ctrl | Alt |xxxxxx|SysLay| Shift| Alt | Ctrl | Shift| | |
+ * | | | Ctrl | Alt | ____ |SysLay| Shift| Alt | Ctrl | Shift| | |
* `-----------------------------------------------------------------------------------'
*/
[LAYER_FUNC] = LAYOUT_ortho_4x12(
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX,
- XXXXXXX, MT(MOD_LSFT, KC_ESC), KC_HOME, LT(LAYER_SYST, KC_PGDN), KC_PGUP, KC_END, KC_LEFT, KC_DOWN, KC_UP, LT(LAYER_SYST, KC_RGHT), MT(MOD_RSFT, KC_BSPC), XXXXXXX,
- XXXXXXX, XXXXXXX, KC_LCTL, KC_LALT, KC_TRNS, MO(LAYER_SYST), KC_LSFT, KC_RALT, KC_RCTL, MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
+ XXXXXXX, MT(MOD_LSFT, KC_ESC), KC_HOME, LT(LAYER_SYST, KC_PGDN), MT(MOD_RALT, KC_PGUP), MT(MOD_LGUI, KC_END), MT(MOD_RGUI, KC_LEFT), MT(MOD_RALT, KC_DOWN), KC_UP, LT(LAYER_SYST, KC_RGHT), MT(MOD_RSFT, KC_BSPC), XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_LCTL, KC_LALT, KC_NO, MO(LAYER_SYST), KC_LSFT, KC_LALT, KC_RCTL, MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
/* Number and Symbols Layer
* ,-----------------------------------------------------------------------------------.
@@ -133,18 +143,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | | ~ | _ | + | { | } | | | : | " | | |
* | | TAB | ` | - | = | [ | ] | \ | ; | ' | | |
- * | | Shift|SysLay|xxxxxx| ____ | ____ | ____ | ____ |SysLay|xxxxxx| Shift| |
+ * | | Shift|SysLay| ____ | AltGr| OSkey| OSkey| AltGr|SysLay| ____ | Shift| |
* |------+------+------+------+------+------+------|------+------+------+------+------+
* | | | | | | | < | > | ? | | | |
* | | | ____ | ____ | ____ | ____ | , | . | / | ____ | | |
- * | | | Ctrl | Alt |SysLay|xxxxxx| Shift| ____ | ____ | Shift| | |
+ * | | | Ctrl | Alt |SysLay| ____ | Shift| Alt | Ctrl | Shift| | |
* `-----------------------------------------------------------------------------------'
*/
[LAYER_NUMSYM] = LAYOUT_ortho_4x12(
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, XXXXXXX,
- XXXXXXX, MT(MOD_LSFT, KC_TAB), LT(LAYER_SYST, KC_GRV), KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, LT(LAYER_SYST, KC_SCLN), KC_QUOT, MT(MOD_RSFT, KC_DEL), XXXXXXX,
- XXXXXXX, XXXXXXX, KC_LCTL, KC_LALT, MO(LAYER_SYST), KC_TRNS, MT(MOD_LSFT, KC_COMM), KC_DOT, KC_SLSH, MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
+ XXXXXXX, MT(MOD_LSFT, KC_TAB), LT(LAYER_SYST, KC_GRV), KC_MINS, MT(MOD_RALT, KC_EQL), MT(MOD_LGUI, KC_LBRC), MT(MOD_RGUI, KC_RBRC), MT(MOD_RALT, KC_BSLS), LT(LAYER_SYST, KC_SCLN), KC_QUOT, MT(MOD_RSFT, KC_DEL), XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_LCTL, KC_LALT, MO(LAYER_SYST), KC_NO, MT(MOD_LSFT, KC_COMM), MT(MOD_LALT, KC_DOT), MT(MOD_RCTL, KC_SLSH), MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
/* System Layer
* ,-----------------------------------------------------------------------------------.
@@ -153,11 +163,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | | |
- * | | F11 | F12 |NumLay|LghLay| ____ | ____ | ____ | ____ |MouLay|Backsp| |
+ * | | F11 | F12 |NumLay|LghLay| ____ |KbInit| Power|SysReq|MouLay|Backsp| |
* | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | |
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | | | | | | | | | | | |
- * | | Caps | Mute | Vol- | Vol+ | Play | Next | ____ | ____ | ____ | Ins | |
+ * | | Caps | Mute | Vol- | Vol+ | Play | Next | ____ | ____ |OSMenu| Ins | |
* | | Shift| ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | Shift| |
* |------+------+------+------+------+------+------|------+------+------+------+------+
* | | | | | | | | | | | | |
@@ -167,9 +177,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
[LAYER_SYST] = LAYOUT_ortho_4x12(
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- XXXXXXX, KC_F11, KC_F12, TG(LAYER_NUMONLY), TG(LAYER_LIGHTS), KC_NO, KC_NO, KC_NO, KC_NO, TG(LAYER_MOUSE), KC_BSPC, XXXXXXX,
- XXXXXXX, MT(MOD_LSFT, KC_CAPS), KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY, KC_MNXT, KC_NO, KC_NO, KC_NO, MT(MOD_RSFT, KC_INS), XXXXXXX,
- XXXXXXX, XXXXXXX, KC_LCTL, KC_LALT, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
+ XXXXXXX, KC_F11, KC_F12, TG(LAYER_NUMONLY), TG(LAYER_LIGHTS), KC_NO, CK_CONFIGINIT, KC_POWER, KC_SYSREQ, TG(LAYER_MOUSE), KC_BSPC, XXXXXXX,
+ XXXXXXX, MT(MOD_LSFT, KC_CAPS), KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY, KC_MNXT, KC_NO, KC_NO, KC_APP, MT(MOD_RSFT, KC_INS), XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_LCTL, KC_LALT, KC_NO, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
/* Numeric Keypad
* ,-----------------------------------------------------------------------------------.
@@ -233,7 +243,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | | | | | | | | | | | | |
* | | Left | Down | Right| Whl- | ____ | ____ | ____ | ____ | ____ | Enter| |
- * | | ____ | ____ | ____ | ____ | OSkey| OSkey| ____ | ____ | ____ | ____ | |
+ * | | ____ | ____ | ____ | ____ | OSkey| OSkey| AltGr| ____ | ____ | ____ | |
* |------+------+------+------+------+------+------|------+------+------+------+------+
* | | | | | | | | | | | | |
* | | | ____ | ____ | ____ | ____ | ____ | ____ | ____ | Space| | |
@@ -243,14 +253,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[LAYER_MOUSE] = LAYOUT_ortho_4x12(
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_MS_WH_UP, KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, KC_NO, TG(LAYER_MOUSE), KC_NO, XXXXXXX,
- XXXXXXX, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_DOWN, KC_LGUI, KC_RGUI, KC_NO, KC_NO, KC_NO, KC_ENT, XXXXXXX,
- XXXXXXX, XXXXXXX, KC_LCTL, KC_LALT, KC_NO, KC_NO, KC_LSFT, KC_RALT, KC_RCTL, MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
+ XXXXXXX, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_WH_DOWN, KC_LGUI, KC_RGUI, KC_RALT, KC_NO, KC_NO, KC_ENT, XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_LCTL, KC_LALT, KC_NO, KC_NO, KC_LSFT, KC_LALT, KC_RCTL, MT(MOD_RSFT, KC_SPC), XXXXXXX, XXXXXXX ),
};
void matrix_init_user(void) {
- // set num lock on at start independently of state (for numonly layer to work)
+ // eeconfig_init(); // reset keyboard to a standard default state; useful when new releases messup with eeprom values
+ // set num lock on at start (for numonly layer to work)
if (!(host_keyboard_leds() & (1<> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'j', 'j', '4', '0'
-#define USB_CFG_DEVICE_NAME_LEN 4
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/jj4x4/README.md b/keyboards/jj4x4/README.md
deleted file mode 100644
index 24212bc9905..00000000000
--- a/keyboards/jj4x4/README.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# jj4x4
-
-
-
-A 4x4 keypad kit made and KPRepublic on AliExpress. This is a chopped off version of the jj40 with rearranged keys.
-
-* Keyboard Maintainer: [QMK Community](https://github.com/qmk)
-* Hardware Supported: Atmega32A
-* Hardware Availability: [AliExpress](https://www.aliexpress.com/item/jj4x4-jj4X4-16-keys-Custom-Mechanical-Keyboard-PCB-programmed-numpad-layouts-bface-firmware-with-rgb-bottom/32901955446.html)
-
-Make example for this keyboard (after setting up your build environment):
-
- make jj4x4:default
-
-Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
-
- make jj4x4:default:flash
-
-**Reset Key**:
-
-Hold down the key located at *K12*, commonly programmed as *8* while plugging in the keyboard USB cable.
-
-Key *K12* is in the above picture:
-
-Row 2 from the top, Column 2 from the left, see the schematic below:
-
-```
- ,-----------------------.
- | | | | |
- |-----`-----`-----`-----|
- | | K12 | | |
- |-----`-----`-----`-----|
- | | | | |
- |-----`-----`-----`-----|
- | | | | |
- `-----`-----`-----`-----'
-```
-
-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).
diff --git a/keyboards/jj4x4/config.h b/keyboards/jj4x4/config.h
index d8ccef3ad7c..45c8671cc5c 100644
--- a/keyboards/jj4x4/config.h
+++ b/keyboards/jj4x4/config.h
@@ -19,13 +19,11 @@ along with this program. If not, see .
#include "config_common.h"
-#define VENDOR_ID 0x20A0
-#define PRODUCT_ID 0x422D
+#define VENDOR_ID 0x4B50 // "KP"
+#define PRODUCT_ID 0x0044 // 4x4
#define DEVICE_VER 0x0200
-// TODO: share these strings with usbconfig.h
-// Edit usbconfig.h to change these.
-#define MANUFACTURER Kprepublic
-#define PRODUCT jj4x4
+#define MANUFACTURER KPrepublic
+#define PRODUCT JJ4x4
/* matrix size */
#define MATRIX_ROWS 4
diff --git a/keyboards/jj4x4/info.json b/keyboards/jj4x4/info.json
index 602fdc90a37..0fff9b9c883 100644
--- a/keyboards/jj4x4/info.json
+++ b/keyboards/jj4x4/info.json
@@ -1,30 +1,30 @@
{
- "keyboard_name": "jj4x4",
- "url": "",
- "maintainer": "qmk",
- "width": 4,
- "height": 4,
- "layouts": {
- "LAYOUT_ortho_4x4": {
- "key_count": 16,
- "layout": [
- {"x":0, "y":0},
- {"x":1, "y":0},
- {"x":2, "y":0},
- {"x":3, "y":0},
- {"x":0, "y":1},
- {"x":1, "y":1},
- {"x":2, "y":1},
- {"x":3, "y":1},
- {"x":0, "y":2},
- {"x":1, "y":2},
- {"x":2, "y":2},
- {"x":3, "y":2},
- {"x":0, "y":3},
- {"x":1, "y":3},
- {"x":2, "y":3},
- {"x":3, "y":3}
- ]
+ "keyboard_name": "JJ4x4",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 4,
+ "height": 4,
+ "layouts": {
+ "LAYOUT_ortho_4x4": {
+ "key_count": 16,
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":0, "y":1},
+ {"x":1, "y":1},
+ {"x":2, "y":1},
+ {"x":3, "y":1},
+ {"x":0, "y":2},
+ {"x":1, "y":2},
+ {"x":2, "y":2},
+ {"x":3, "y":2},
+ {"x":0, "y":3},
+ {"x":1, "y":3},
+ {"x":2, "y":3},
+ {"x":3, "y":3}
+ ]
+ }
}
- }
-}
\ No newline at end of file
+}
diff --git a/keyboards/jj4x4/jj4x4.h b/keyboards/jj4x4/jj4x4.h
index 7b8cb81835e..ee17e896dd3 100644
--- a/keyboards/jj4x4/jj4x4.h
+++ b/keyboards/jj4x4/jj4x4.h
@@ -28,14 +28,13 @@ along with this program. If not, see .
* represents the switch matrix.
*/
#define LAYOUT_ortho_4x4( \
- K01, K02, K03, K04, \
- K11, K12, K13, K14, \
- K21, K22, K23, K24, \
- K31, K32, K33, K34 \
-) \
-{ \
- { K01, K02, K03, K04 }, \
- { K11, K12, K13, K14 }, \
- { K21, K22, K23, K24 }, \
- { K31, K32, K33, K34 } \
-}
+ K00, K01, K02, K03, \
+ K10, K11, K12, K13, \
+ K20, K21, K22, K23, \
+ K30, K31, K32, K33 \
+) { \
+ { K00, K01, K02, K03 }, \
+ { K10, K11, K12, K13 }, \
+ { K20, K21, K22, K23 }, \
+ { K30, K31, K32, K33 } \
+}
diff --git a/keyboards/jj4x4/keymaps/default/keymap.c b/keyboards/jj4x4/keymaps/default/keymap.c
index a0b06ee92a3..ae2c6b54170 100644
--- a/keyboards/jj4x4/keymaps/default/keymap.c
+++ b/keyboards/jj4x4/keymaps/default/keymap.c
@@ -13,61 +13,56 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
+
#include QMK_KEYBOARD_H
enum layers {
- _BASE = 0,
- _FN1,
- _FN2,
+ _BASE = 0,
+ _FN1,
+ _FN2
};
// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
- QMKBEST = SAFE_RANGE,
- QMKURL
+ QMKBEST = SAFE_RANGE,
+ QMKURL
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-
- [_BASE] = LAYOUT_ortho_4x4(
- KC_PGUP, KC_HOME, KC_UP, KC_END , \
- KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, \
- MO(_FN2), KC_VOLU, KC_MPLY, KC_MPRV, \
- MO(_FN1), KC_VOLD, KC_MUTE, KC_MNXT \
- ),
- [_FN1] = LAYOUT_ortho_4x4(
- KC_ESC, KC_P7, KC_P8, KC_P9, \
- KC_TAB, KC_P4, KC_P5, KC_P6, \
- KC_ENT, KC_P1, KC_P2, KC_P3, \
- _______, KC_P0, KC_P0, KC_DOT \
- ),
- [_FN2] = LAYOUT_ortho_4x4(
- RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \
- RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, \
- _______, _______, _______, RESET, \
- BL_STEP, _______, QMKBEST, QMKURL \
- )
-
+ [_BASE] = LAYOUT_ortho_4x4(
+ KC_PGUP, KC_HOME, KC_UP, KC_END,
+ KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT,
+ MO(_FN2), KC_VOLU, KC_MPLY, KC_MPRV,
+ MO(_FN1), KC_VOLD, KC_MUTE, KC_MNXT
+ ),
+ [_FN1] = LAYOUT_ortho_4x4(
+ KC_ESC, KC_P7, KC_P8, KC_P9,
+ KC_TAB, KC_P4, KC_P5, KC_P6,
+ KC_ENT, KC_P1, KC_P2, KC_P3,
+ _______, KC_P0, KC_P0, KC_DOT
+ ),
+ [_FN2] = LAYOUT_ortho_4x4(
+ RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI,
+ RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD,
+ _______, _______, _______, RESET,
+ BL_STEP, _______, QMKBEST, QMKURL
+ )
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- switch (keycode) {
- case QMKBEST:
- if (record->event.pressed) {
- // when keycode QMKBEST is pressed
- SEND_STRING("QMK is the best thing ever!");
- } else {
- // when keycode QMKBEST is released
- }
- break;
- case QMKURL:
- if (record->event.pressed) {
- // when keycode QMKURL is pressed
- SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER));
- } else {
- // when keycode QMKURL is released
- }
- break;
- }
- return true;
+ switch (keycode) {
+ case QMKBEST:
+ if (record->event.pressed) {
+ // when keycode QMKBEST is pressed
+ SEND_STRING("QMK is the best thing ever!");
+ }
+ break;
+ case QMKURL:
+ if (record->event.pressed) {
+ // when keycode QMKURL is pressed
+ SEND_STRING("https://qmk.fm/\n");
+ }
+ break;
+ }
+ return true;
}
diff --git a/keyboards/jj4x4/keymaps/via/keymap.c b/keyboards/jj4x4/keymaps/via/keymap.c
new file mode 100644
index 00000000000..35ca0e361da
--- /dev/null
+++ b/keyboards/jj4x4/keymaps/via/keymap.c
@@ -0,0 +1,44 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ LAYOUT_ortho_4x4(
+ KC_P7, KC_P8, KC_P9, KC_PSLS,
+ KC_P4, KC_P5, KC_P6, KC_PAST,
+ KC_P1, KC_P2, KC_P3, KC_PMNS,
+ KC_P0, KC_PDOT, KC_PPLS, LT(1, KC_ENT)
+ ),
+ LAYOUT_ortho_4x4(
+ RESET, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______
+ ),
+ LAYOUT_ortho_4x4(
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______
+ ),
+ LAYOUT_ortho_4x4(
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/jj4x4/keymaps/via/rules.mk b/keyboards/jj4x4/keymaps/via/rules.mk
new file mode 100644
index 00000000000..82fb80d5e77
--- /dev/null
+++ b/keyboards/jj4x4/keymaps/via/rules.mk
@@ -0,0 +1,3 @@
+VIA_ENABLE = yes
+EXTRAKEY_ENABLE = no
+MOUSEKEY_ENABLE = no
diff --git a/keyboards/jj4x4/readme.md b/keyboards/jj4x4/readme.md
new file mode 100644
index 00000000000..714e8e88f7f
--- /dev/null
+++ b/keyboards/jj4x4/readme.md
@@ -0,0 +1,39 @@
+# JJ4x4
+
+
+
+A 4x4 keypad kit made and KPRepublic on AliExpress. This is a chopped off version of the JJ40 with rearranged keys.
+
+* Keyboard Maintainer: [QMK Community](https://github.com/qmk)
+* Hardware Supported: Atmega32A
+* Hardware Availability: [AliExpress](https://www.aliexpress.com/item/jj4x4-jj4X4-16-keys-Custom-Mechanical-Keyboard-PCB-programmed-numpad-layouts-bface-firmware-with-rgb-bottom/32901955446.html)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make jj4x4:default
+
+Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
+
+ make jj4x4:default:flash
+
+**Reset Key**:
+
+Hold down the key located at *K11*, commonly programmed as *8* while plugging in the keyboard USB cable.
+
+Key *K11* is in the above picture:
+
+Row 2 from the top, Column 2 from the left, see the schematic below:
+
+```
+,-----------------------.
+| | | | |
+|-----`-----`-----`-----|
+| | K11 | | |
+|-----`-----`-----`-----|
+| | | | |
+|-----`-----`-----`-----|
+| | | | |
+`-----`-----`-----`-----'
+```
+
+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).
diff --git a/keyboards/jj4x4/rules.mk b/keyboards/jj4x4/rules.mk
index 82e25e6a7a6..5ff5c37692d 100644
--- a/keyboards/jj4x4/rules.mk
+++ b/keyboards/jj4x4/rules.mk
@@ -31,6 +31,6 @@ UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no # Audio output on port C6
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
-HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
LAYOUTS = ortho_4x4
diff --git a/keyboards/jj4x4/usbconfig.h b/keyboards/jj4x4/usbconfig.h
deleted file mode 100644
index 96bf2eda8fc..00000000000
--- a/keyboards/jj4x4/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'j', 'j', '4', 'x', '4'
-#define USB_CFG_DEVICE_NAME_LEN 5
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/jj50/config.h b/keyboards/jj50/config.h
index 2f0e98d531e..8453f55880f 100644
--- a/keyboards/jj50/config.h
+++ b/keyboards/jj50/config.h
@@ -25,10 +25,8 @@ along with this program. If not, see .
#define VENDOR_ID 0x20A0
#define PRODUCT_ID 0x422D
#define DEVICE_VER 0x0200
-// TODO: share these strings with usbconfig.h
-// Edit usbconfig.h to change these.
-#define MANUFACTURER kprepublic
-#define PRODUCT jj50
+#define MANUFACTURER KPrepublic
+#define PRODUCT JJ50
#define DESCRIPTION Preonic-like clone
/* matrix size */
diff --git a/keyboards/jj50/usbconfig.h b/keyboards/jj50/usbconfig.h
deleted file mode 100644
index b05fc975e71..00000000000
--- a/keyboards/jj50/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'K', 'P', 'R', 'e', 'p', 'u', 'b', 'l', 'i', 'c'
-#define USB_CFG_VENDOR_NAME_LEN 10
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'J','J','5','0',' ','K','e','y','b','o','a','r','d'
-#define USB_CFG_DEVICE_NAME_LEN 13
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/jm60/rules.mk b/keyboards/jm60/rules.mk
index ed6431b6538..a513461fc86 100644
--- a/keyboards/jm60/rules.mk
+++ b/keyboards/jm60/rules.mk
@@ -1,41 +1,9 @@
-# project specific files
-SRC = matrix.c \
- led.c
+# MCU name
+MCU = STM32F103
-## chip/board settings
-# - the next two should match the directories in
-# /os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
-MCU_FAMILY = STM32
-MCU_SERIES = STM32F1xx
-
-# Linker script to use
-# - it should exist either in /os/common/ports/ARMCMx/compilers/GCC/ld/
-# or /ld/
-# - NOTE: a custom ld script is needed for EEPROM on Teensy LC
MCU_LDSCRIPT = jm60_bootloader
-
-# Startup code to use
-# - it should exist in /os/common/ports/ARMCMx/compilers/GCC/mk/
-MCU_STARTUP = stm32f1xx
-
-# Board: it should exist either in /os/hal/boards/
-# or /boards
BOARD = JM60_BOARD
-# Cortex version
-# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
-MCU = cortex-m3
-
-# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
-# I.e. 6 for Teensy LC; 7 for Teensy 3.x
-ARMV = 7
-
-# Vector table for application
-# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
-# The CORTEX_VTOR... is needed only for MCHCK/Infinity KB
-#OPT_DEFS = -DCORTEX_VTOR_INIT=0x00001000
-OPT_DEFS =
-
# Build Options
# comment out to disable the options.
#
@@ -51,10 +19,9 @@ CUSTOM_MATRIX = yes # Custom matrix file
BACKLIGHT_ENABLE = no
VISUALIZER_ENABLE = no
-#LED_DRIVER = is31fl3731c
-#LED_WIDTH = 16
-#LED_HEIGHT = 5
-
-
# Enter lower-power sleep mode when on the ChibiOS idle thread
OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
+
+# project specific files
+SRC = matrix.c \
+ led.c
diff --git a/keyboards/just60/config.h b/keyboards/just60/config.h
index ef0af7c6108..66e5bf7b671 100644
--- a/keyboards/just60/config.h
+++ b/keyboards/just60/config.h
@@ -48,7 +48,5 @@ along with this program. If not, see .
#define LOCKING_RESYNC_ENABLE
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
diff --git a/keyboards/kbdfans/kbd67/hotswap/hotswap.h b/keyboards/kbdfans/kbd67/hotswap/hotswap.h
index 45cf537cbe4..ba6c1686fa8 100644
--- a/keyboards/kbdfans/kbd67/hotswap/hotswap.h
+++ b/keyboards/kbdfans/kbd67/hotswap/hotswap.h
@@ -40,3 +40,5 @@
{ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, KC_NO, K3C, K3D, K3E}, \
{ K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, K49, K4A, K4B, KC_NO, K4D, K4E}, \
}
+
+#define LAYOUT_65_ansi_blocker_split_bs LAYOUT
diff --git a/keyboards/kbdfans/kbd67/hotswap/keymaps/bcat/keymap.c b/keyboards/kbdfans/kbd67/hotswap/keymaps/bcat/keymap.c
deleted file mode 100644
index 71aed2b37bb..00000000000
--- a/keyboards/kbdfans/kbd67/hotswap/keymaps/bcat/keymap.c
+++ /dev/null
@@ -1,28 +0,0 @@
-#include QMK_KEYBOARD_H
-
-enum layer {
- LAYER_DEFAULT,
- LAYER_FUNCTION,
-};
-
-#define LY_FUNC LT(LAYER_FUNCTION, KC_APP)
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- /* Default layer: http://www.keyboard-layout-editor.com/#/gists/dd675b40cc4df2c7bb78847ac29f5988 */
- [LAYER_DEFAULT] = LAYOUT(
- KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_HOME,
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_PGUP,
- KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, LY_FUNC, KC_LEFT, KC_DOWN, KC_RGHT
- ),
-
- /* Function layer: http://www.keyboard-layout-editor.com/#/gists/f29128427f674c43777f045e363d1b44 */
- [LAYER_FUNCTION] = LAYOUT(
- _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, _______,
- KC_CAPS, _______, KC_MPLY, KC_VOLU, KC_MSTP, _______, EEP_RST, RESET, KC_PSCR, KC_SLCK, KC_PAUS, _______, _______, _______, _______,
- _______, _______, KC_MPRV, KC_VOLD, KC_MNXT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______, _______, _______, _______, _______, _______
- ),
-};
diff --git a/keyboards/kbdfans/kbd67/hotswap/keymaps/bcat/readme.md b/keyboards/kbdfans/kbd67/hotswap/keymaps/bcat/readme.md
deleted file mode 100644
index a0c2d97dfe3..00000000000
--- a/keyboards/kbdfans/kbd67/hotswap/keymaps/bcat/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# bcat's KBD67 hotswap layout
-
-This is pretty much a stock 65% split keyboard layout, with an HHKB-style
-(split) backspace and media keys in the function layer centered around the ESDF
-cluster.
-
-## Default layer
-
-
-
-([KLE](http://www.keyboard-layout-editor.com/#/gists/dd675b40cc4df2c7bb78847ac29f5988))
-
-## Function layer
-
-
-
-([KLE](http://www.keyboard-layout-editor.com/#/gists/f29128427f674c43777f045e363d1b44))
diff --git a/keyboards/kbdfans/kbd67/hotswap/rules.mk b/keyboards/kbdfans/kbd67/hotswap/rules.mk
index 08dd1f63590..7739b69c0e3 100644
--- a/keyboards/kbdfans/kbd67/hotswap/rules.mk
+++ b/keyboards/kbdfans/kbd67/hotswap/rules.mk
@@ -31,3 +31,5 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no # Audio output on port C6
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+
+LAYOUTS = 65_ansi_blocker_split_bs
diff --git a/keyboards/kbdfans/kbd67/mkii_soldered/config.h b/keyboards/kbdfans/kbd67/mkii_soldered/config.h
index df0607b249a..b72866c6633 100644
--- a/keyboards/kbdfans/kbd67/mkii_soldered/config.h
+++ b/keyboards/kbdfans/kbd67/mkii_soldered/config.h
@@ -20,7 +20,7 @@ along with this program. If not, see .
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xA103
+#define VENDOR_ID 0xA103 // ai03
#define PRODUCT_ID 0x0013
#define DEVICE_VER 0x0001
#define MANUFACTURER KBDfans
@@ -48,205 +48,17 @@ along with this program. If not, see .
/* 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 BACKLIGHT_PIN B7
#ifdef BACKLIGHT_PIN
#define BACKLIGHT_BREATHING
#define BACKLIGHT_LEVELS 3
#endif
-//#define RGB_DI_PIN B3
-//#ifdef RGB_DI_PIN
-// #define RGBLED_NUM 20
-// #define RGBLIGHT_HUE_STEP 8
-// #define RGBLIGHT_SAT_STEP 8
-// #define RGBLIGHT_VAL_STEP 8
-// #define RGBLIGHT_LIMIT_VAL 200 /* 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
-
-/* number of backlight levels */
/* 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 userful 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
-
-/*
- * Magic Key Options
- *
- * Magic keys are hotkey commands that allow control over firmware functions of
- * the keyboard. They are best used in combination with the HID Listen program,
- * found here: https://www.pjrc.com/teensy/hid_listen.html
- *
- * The options below allow the magic key functionality to be changed. This is
- * useful if your keyboard/keypad is missing keys and you want magic key support.
- *
- */
-
-/* key combination for magic key command */
-/* defined by default; to change, uncomment and set to the combination you want */
-// #define IS_COMMAND() (get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))
-
-/* control how magic key switches layers */
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
-
-/* override magic key keymap */
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
-//#define MAGIC_KEY_HELP H
-//#define MAGIC_KEY_HELP_ALT SLASH
-//#define MAGIC_KEY_DEBUG D
-//#define MAGIC_KEY_DEBUG_MATRIX X
-//#define MAGIC_KEY_DEBUG_KBD K
-//#define MAGIC_KEY_DEBUG_MOUSE M
-//#define MAGIC_KEY_VERSION V
-//#define MAGIC_KEY_STATUS S
-//#define MAGIC_KEY_CONSOLE C
-//#define MAGIC_KEY_LAYER0 0
-//#define MAGIC_KEY_LAYER0_ALT GRAVE
-//#define MAGIC_KEY_LAYER1 1
-//#define MAGIC_KEY_LAYER2 2
-//#define MAGIC_KEY_LAYER3 3
-//#define MAGIC_KEY_LAYER4 4
-//#define MAGIC_KEY_LAYER5 5
-//#define MAGIC_KEY_LAYER6 6
-//#define MAGIC_KEY_LAYER7 7
-//#define MAGIC_KEY_LAYER8 8
-//#define MAGIC_KEY_LAYER9 9
-//#define MAGIC_KEY_BOOTLOADER B
-//#define MAGIC_KEY_BOOTLOADER_ALT ESC
-//#define MAGIC_KEY_LOCK CAPS
-//#define MAGIC_KEY_EEPROM E
-//#define MAGIC_KEY_EEPROM_CLEAR BSPACE
-//#define MAGIC_KEY_NKRO N
-//#define MAGIC_KEY_SLEEP_LED Z
-
-/*
- * 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
-//#define NO_ACTION_MACRO
-//#define NO_ACTION_FUNCTION
-
-/*
- * MIDI options
- */
-
-/* Prevent use of disabled MIDI features in the keymap */
-//#define MIDI_ENABLE_STRICT 1
-
-/* enable basic MIDI features:
- - MIDI notes can be sent when in Music mode is on
-*/
-//#define MIDI_BASIC
-
-/* enable advanced MIDI features:
- - MIDI notes can be added to the keymap
- - Octave shift and transpose
- - Virtual sustain, portamento, and modulation wheel
- - etc.
-*/
-//#define MIDI_ADVANCED
-
-/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
-//#define MIDI_TONE_KEYCODE_OCTAVES 1
-
-/*
- * 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
-*/
-
-/* Bootmagic Lite key configuration */
-// #define BOOTMAGIC_LITE_ROW 0
-// #define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/kbdfans/kbd67/mkii_soldered/keymaps/via/keymap.c b/keyboards/kbdfans/kbd67/mkii_soldered/keymaps/via/keymap.c
new file mode 100644
index 00000000000..eebd077dbe7
--- /dev/null
+++ b/keyboards/kbdfans/kbd67/mkii_soldered/keymaps/via/keymap.c
@@ -0,0 +1,50 @@
+/* Copyright 2020 MechMerlin
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_all( /* Base */
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END,
+ MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT_all( /* FN */
+ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, BL_INC,
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_DEC,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END
+ ),
+
+ [2] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [3] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/kbdfans/kbd67/mkii_soldered/keymaps/via/rules.mk b/keyboards/kbdfans/kbd67/mkii_soldered/keymaps/via/rules.mk
new file mode 100644
index 00000000000..36b7ba9cbc9
--- /dev/null
+++ b/keyboards/kbdfans/kbd67/mkii_soldered/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/kbdfans/kbd67/mkiirgb/v2/config.h b/keyboards/kbdfans/kbd67/mkiirgb/v2/config.h
index f1be48510d4..afe5e51a2e4 100644
--- a/keyboards/kbdfans/kbd67/mkiirgb/v2/config.h
+++ b/keyboards/kbdfans/kbd67/mkiirgb/v2/config.h
@@ -19,6 +19,7 @@
#define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
#define RGB_DISABLE_WHEN_USB_SUSPENDED true // turn off effects when suspended
#define RGB_MATRIX_KEYPRESSES
+#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_ALL
#define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN
#define DISABLE_RGB_MATRIX_BAND_SAT
#define DISABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
@@ -35,10 +36,9 @@
#define DISABLE_RGB_MATRIX_SOLID_SPLASH
#define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH
#define DISABLE_RGB_MATRIX_DIGITAL_RAIN
-#define DISABLE_RGB_MATRIX_CYCLE_ALL
#define DISABLE_RGB_MATRIX_RAINDROPS
#define DISABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
-#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 160
+#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 255
#define DRIVER_ADDR_1 0b1110100
#define DRIVER_ADDR_2 0b1110111
#define DRIVER_COUNT 2
diff --git a/keyboards/kbdfans/kbd67/rev1/keymaps/default/keymap.c b/keyboards/kbdfans/kbd67/rev1/keymaps/default/keymap.c
index 13a8a420d2f..9e0065ff2e9 100644
--- a/keyboards/kbdfans/kbd67/rev1/keymaps/default/keymap.c
+++ b/keyboards/kbdfans/kbd67/rev1/keymaps/default/keymap.c
@@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |----------------------------------------------------------------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |PgUp|
* |----------------------------------------------------------------|
- * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return |PgDn|
+ * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return |PgDn|
* |----------------------------------------------------------------|
* |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|End |
* |----------------------------------------------------------------|
@@ -38,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_65_ansi(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, \
- KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, \
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, \
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, \
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
@@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* ,----------------------------------------------------------------.
* |~ `|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |Ins |
* |----------------------------------------------------------------|
- * |Caps | |Up | | | | | |PSc|SLk|Pau|Up | | | |
+ * | | |Up | | | | | |PSc|SLk|Pau|Up | | | |
* |----------------------------------------------------------------|
* | |Lef|Dow|Rig| | | | |Hom|PUp|Lef|Rig| | |
* |----------------------------------------------------------------|
@@ -57,7 +57,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
[1] = LAYOUT_65_ansi(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,KC_INS, \
- KC_CAPS,_______, KC_UP,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP,_______, _______,_______, \
+ _______,_______, KC_UP,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP,_______, _______,_______, \
_______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,_______,_______,KC_HOME,KC_PGUP,KC_LEFT,KC_RGHT, _______,_______, \
_______,_______,_______,_______,_______,_______,_______,_______, KC_END,KC_PGDN,KC_DOWN, _______,KC_PGUP,_______, \
_______, _______, _______, _______, _______,_______,_______,KC_HOME,KC_PGDN, KC_END),
diff --git a/keyboards/kbdfans/kbd67/rev1/rules.mk b/keyboards/kbdfans/kbd67/rev1/rules.mk
index 7e305070ba8..8e96199b3d0 100644
--- a/keyboards/kbdfans/kbd67/rev1/rules.mk
+++ b/keyboards/kbdfans/kbd67/rev1/rules.mk
@@ -31,3 +31,5 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no # Audio output on port C6
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+
+LAYOUTS = 65_ansi
diff --git a/keyboards/kbdfans/kbd67/rev2/config.h b/keyboards/kbdfans/kbd67/rev2/config.h
index 931f5714b8b..4e1352c4138 100644
--- a/keyboards/kbdfans/kbd67/rev2/config.h
+++ b/keyboards/kbdfans/kbd67/rev2/config.h
@@ -20,9 +20,9 @@ along with this program. If not, see .
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x6060
-#define DEVICE_VER 0x0001
+#define VENDOR_ID 0x4B42
+#define PRODUCT_ID 0x6067
+#define DEVICE_VER 0x0002
#define MANUFACTURER KBDFans
#define PRODUCT KBD67v2
#define DESCRIPTION 65% Keyboard
diff --git a/keyboards/kbdfans/kbd67/rev2/info.json b/keyboards/kbdfans/kbd67/rev2/info.json
index 8cf2d391510..f9d9922eed1 100644
--- a/keyboards/kbdfans/kbd67/rev2/info.json
+++ b/keyboards/kbdfans/kbd67/rev2/info.json
@@ -161,6 +161,155 @@
{"x":15, "y":4}
]
},
+ "LAYOUT_65_ansi_blocker": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+ {"x":6, "y":0},
+ {"x":7, "y":0},
+ {"x":8, "y":0},
+ {"x":9, "y":0},
+ {"x":10, "y":0},
+ {"x":11, "y":0},
+ {"x":12, "y":0},
+ {"x":13, "y":0, "w":2},
+ {"x":15, "y":0},
+
+ {"x":0, "y":1, "w":1.5},
+ {"x":1.5, "y":1},
+ {"x":2.5, "y":1},
+ {"x":3.5, "y":1},
+ {"x":4.5, "y":1},
+ {"x":5.5, "y":1},
+ {"x":6.5, "y":1},
+ {"x":7.5, "y":1},
+ {"x":8.5, "y":1},
+ {"x":9.5, "y":1},
+ {"x":10.5, "y":1},
+ {"x":11.5, "y":1},
+ {"x":12.5, "y":1},
+ {"x":13.5, "y":1, "w":1.5},
+ {"x":15, "y":1},
+
+ {"x":0, "y":2, "w":1.75},
+ {"x":1.75, "y":2},
+ {"x":2.75, "y":2},
+ {"x":3.75, "y":2},
+ {"x":4.75, "y":2},
+ {"x":5.75, "y":2},
+ {"x":6.75, "y":2},
+ {"x":7.75, "y":2},
+ {"x":8.75, "y":2},
+ {"x":9.75, "y":2},
+ {"x":10.75, "y":2},
+ {"x":11.75, "y":2},
+ {"x":12.75, "y":2, "w":2.25},
+ {"x":15, "y":2},
+
+ {"x":0, "y":3, "w":2.25},
+ {"x":2.25, "y":3},
+ {"x":3.25, "y":3},
+ {"x":4.25, "y":3},
+ {"x":5.25, "y":3},
+ {"x":6.25, "y":3},
+ {"x":7.25, "y":3},
+ {"x":8.25, "y":3},
+ {"x":9.25, "y":3},
+ {"x":10.25, "y":3},
+ {"x":11.25, "y":3},
+ {"x":12.25, "y":3, "w":1.75},
+ {"x":14, "y":3},
+ {"x":15, "y":3},
+
+ {"x":0, "y":4, "w":1.25},
+ {"x":1.25, "y":4, "w":1.25},
+ {"x":2.5, "y":4, "w":1.25},
+ {"x":3.75, "y":4, "w":6.25},
+ {"x":10, "y":4, "w":1.25},
+ {"x":11.25, "y":4, "w":1.25},
+ {"x":13, "y":4},
+ {"x":14, "y":4},
+ {"x":15, "y":4}]
+ },
+ "LAYOUT_65_ansi_blocker_splitbs": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+ {"x":6, "y":0},
+ {"x":7, "y":0},
+ {"x":8, "y":0},
+ {"x":9, "y":0},
+ {"x":10, "y":0},
+ {"x":11, "y":0},
+ {"x":12, "y":0},
+ {"x":13, "y":0},
+ {"x":14, "y":0},
+ {"x":15, "y":0},
+
+ {"x":0, "y":1, "w":1.5},
+ {"x":1.5, "y":1},
+ {"x":2.5, "y":1},
+ {"x":3.5, "y":1},
+ {"x":4.5, "y":1},
+ {"x":5.5, "y":1},
+ {"x":6.5, "y":1},
+ {"x":7.5, "y":1},
+ {"x":8.5, "y":1},
+ {"x":9.5, "y":1},
+ {"x":10.5, "y":1},
+ {"x":11.5, "y":1},
+ {"x":12.5, "y":1},
+ {"x":13.5, "y":1, "w":1.5},
+ {"x":15, "y":1},
+
+ {"x":0, "y":2, "w":1.75},
+ {"x":1.75, "y":2},
+ {"x":2.75, "y":2},
+ {"x":3.75, "y":2},
+ {"x":4.75, "y":2},
+ {"x":5.75, "y":2},
+ {"x":6.75, "y":2},
+ {"x":7.75, "y":2},
+ {"x":8.75, "y":2},
+ {"x":9.75, "y":2},
+ {"x":10.75, "y":2},
+ {"x":11.75, "y":2},
+ {"x":12.75, "y":2, "w":2.25},
+ {"x":15, "y":2},
+
+ {"x":0, "y":3, "w":2.25},
+ {"x":2.25, "y":3},
+ {"x":3.25, "y":3},
+ {"x":4.25, "y":3},
+ {"x":5.25, "y":3},
+ {"x":6.25, "y":3},
+ {"x":7.25, "y":3},
+ {"x":8.25, "y":3},
+ {"x":9.25, "y":3},
+ {"x":10.25, "y":3},
+ {"x":11.25, "y":3},
+ {"x":12.25, "y":3, "w":1.75},
+ {"x":14, "y":3},
+ {"x":15, "y":3},
+
+ {"x":0, "y":4, "w":1.25},
+ {"x":1.25, "y":4, "w":1.25},
+ {"x":2.5, "y":4, "w":1.25},
+ {"x":3.75, "y":4, "w":6.25},
+ {"x":10, "y":4, "w":1.25},
+ {"x":11.25, "y":4, "w":1.25},
+ {"x":13, "y":4},
+ {"x":14, "y":4},
+ {"x":15, "y":4}]
+ },
"LAYOUT_65_iso": {
"layout": [
{"x":0, "y":0},
diff --git a/keyboards/kbdfans/kbd67/rev2/keymaps/ansi_blocker/keymap.c b/keyboards/kbdfans/kbd67/rev2/keymaps/ansi_blocker/keymap.c
new file mode 100644
index 00000000000..73fd4583a18
--- /dev/null
+++ b/keyboards/kbdfans/kbd67/rev2/keymaps/ansi_blocker/keymap.c
@@ -0,0 +1,33 @@
+/* Copyright 2020 'elmo-space'
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_65_ansi_blocker(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, \
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, \
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT),
+
+[1] = LAYOUT_65_ansi_blocker(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, \
+ KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END),
+
+};
diff --git a/keyboards/kbdfans/kbd67/rev2/keymaps/ansi_blocker/readme.md b/keyboards/kbdfans/kbd67/rev2/keymaps/ansi_blocker/readme.md
new file mode 100644
index 00000000000..de149da1b63
--- /dev/null
+++ b/keyboards/kbdfans/kbd67/rev2/keymaps/ansi_blocker/readme.md
@@ -0,0 +1 @@
+# Ansi with blocker keymap for kbd67
diff --git a/keyboards/kbdfans/kbd67/rev2/keymaps/ansi_blocker_splitbs/keymap.c b/keyboards/kbdfans/kbd67/rev2/keymaps/ansi_blocker_splitbs/keymap.c
new file mode 100644
index 00000000000..38a90560dc9
--- /dev/null
+++ b/keyboards/kbdfans/kbd67/rev2/keymaps/ansi_blocker_splitbs/keymap.c
@@ -0,0 +1,32 @@
+/* Copyright 2020 'elmo-space'
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_65_ansi_blocker_splitbs(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSLS, KC_DEL, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, MO(1), \
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, \
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+[1] = LAYOUT_65_ansi_blocker_splitbs(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, KC_INS, \
+ KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END),
+};
diff --git a/keyboards/kbdfans/kbd67/rev2/keymaps/ansi_blocker_splitbs/readme.md b/keyboards/kbdfans/kbd67/rev2/keymaps/ansi_blocker_splitbs/readme.md
new file mode 100644
index 00000000000..de149da1b63
--- /dev/null
+++ b/keyboards/kbdfans/kbd67/rev2/keymaps/ansi_blocker_splitbs/readme.md
@@ -0,0 +1 @@
+# Ansi with blocker keymap for kbd67
diff --git a/keyboards/kbdfans/kbd67/rev2/keymaps/default/keymap.c b/keyboards/kbdfans/kbd67/rev2/keymaps/default/keymap.c
index 13a8a420d2f..9e0065ff2e9 100644
--- a/keyboards/kbdfans/kbd67/rev2/keymaps/default/keymap.c
+++ b/keyboards/kbdfans/kbd67/rev2/keymaps/default/keymap.c
@@ -28,7 +28,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |----------------------------------------------------------------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |PgUp|
* |----------------------------------------------------------------|
- * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return |PgDn|
+ * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return |PgDn|
* |----------------------------------------------------------------|
* |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|End |
* |----------------------------------------------------------------|
@@ -38,7 +38,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_65_ansi(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, \
- KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, \
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, \
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END, \
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
@@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* ,----------------------------------------------------------------.
* |~ `|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |Ins |
* |----------------------------------------------------------------|
- * |Caps | |Up | | | | | |PSc|SLk|Pau|Up | | | |
+ * | | |Up | | | | | |PSc|SLk|Pau|Up | | | |
* |----------------------------------------------------------------|
* | |Lef|Dow|Rig| | | | |Hom|PUp|Lef|Rig| | |
* |----------------------------------------------------------------|
@@ -57,7 +57,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
[1] = LAYOUT_65_ansi(
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,KC_INS, \
- KC_CAPS,_______, KC_UP,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP,_______, _______,_______, \
+ _______,_______, KC_UP,_______,_______,_______,_______,_______,KC_PSCR,KC_SLCK,KC_PAUS, KC_UP,_______, _______,_______, \
_______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,_______,_______,KC_HOME,KC_PGUP,KC_LEFT,KC_RGHT, _______,_______, \
_______,_______,_______,_______,_______,_______,_______,_______, KC_END,KC_PGDN,KC_DOWN, _______,KC_PGUP,_______, \
_______, _______, _______, _______, _______,_______,_______,KC_HOME,KC_PGDN, KC_END),
diff --git a/keyboards/kbdfans/kbd67/rev2/keymaps/jscatena88/keymap.c b/keyboards/kbdfans/kbd67/rev2/keymaps/jscatena88/keymap.c
new file mode 100644
index 00000000000..625b768e66f
--- /dev/null
+++ b/keyboards/kbdfans/kbd67/rev2/keymaps/jscatena88/keymap.c
@@ -0,0 +1,58 @@
+/* Copyright 2018 jscatena88
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap (Base Layer) Default Layer
+ * ,----------------------------------------------------------------.
+ * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | `~ |
+ * |----------------------------------------------------------------|
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |Del |
+ * |----------------------------------------------------------------|
+ * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '|Return |PgUp|
+ * |----------------------------------------------------------------|
+ * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|PgDn|
+ * |----------------------------------------------------------------|
+ * |Ctrl|Win |Alt | Space |Alt| FN|Ctrl|Lef|Dow|Rig |
+ * `----------------------------------------------------------------'
+ */
+[0] = LAYOUT_65_ansi(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+ /* Keymap Fn Layer
+ * ,----------------------------------------------------------------.
+ * |~ `|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |Ins |
+ * |----------------------------------------------------------------|
+ * |Caps | |Up | | | | | |PSc|SLk|Pau|Up | | | |
+ * |----------------------------------------------------------------|
+ * | |Lef|Dow|Rig| | | | |Hom|PUp|Lef|Rig| | |
+ * |----------------------------------------------------------------|
+ * | | | | | | | | |End|PDn|Dow| |PUp| |
+ * |----------------------------------------------------------------|
+ * | | | | | | | |Hom|PDn|End |
+ * `----------------------------------------------------------------'
+ */
+
+[1] = LAYOUT_65_ansi(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_VOLU,
+ KC_CAPS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS, KC_VOLD,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS, KC_MUTE,
+ KC_TRNS, RGB_TOG, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_PGUP, KC_MPLY,
+ LCTL(KC_LALT), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_END),
+};
diff --git a/keyboards/kbdfans/kbd67/rev2/keymaps/jscatena88/readme.md b/keyboards/kbdfans/kbd67/rev2/keymaps/jscatena88/readme.md
new file mode 100644
index 00000000000..21b28de90d5
--- /dev/null
+++ b/keyboards/kbdfans/kbd67/rev2/keymaps/jscatena88/readme.md
@@ -0,0 +1,4 @@
+# Jscatena88's KBD67 Layout
+
+
+This modifies the far right column on layer 1, adds RGB control to the second layer, and creates a CTRL+ALT button on the second layer for switching between Linux TTYs (this is the key labelled LCTL(LC_L), it is actually LCTL(KC_LALT) but the visualization software didn't support that)
\ No newline at end of file
diff --git a/keyboards/kbdfans/kbd67/rev2/keymaps/via/config.h b/keyboards/kbdfans/kbd67/rev2/keymaps/via/config.h
new file mode 100644
index 00000000000..579212d4a3a
--- /dev/null
+++ b/keyboards/kbdfans/kbd67/rev2/keymaps/via/config.h
@@ -0,0 +1 @@
+#define DYNAMIC_KEYMAP_LAYER_COUNT 2
diff --git a/keyboards/kbdfans/kbd67/rev2/keymaps/via/keymap.c b/keyboards/kbdfans/kbd67/rev2/keymaps/via/keymap.c
new file mode 100644
index 00000000000..e2f3a664b5e
--- /dev/null
+++ b/keyboards/kbdfans/kbd67/rev2/keymaps/via/keymap.c
@@ -0,0 +1,45 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap (Base Layer) Default Layer
+ * ,----------------------------------------------------------------.
+ * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |Home|
+ * |----------------------------------------------------------------|
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |PgUp|
+ * |----------------------------------------------------------------|
+ * |Caps | A| S| D| F| G| H| J| K| L| ;| '|Return |PgDn|
+ * |----------------------------------------------------------------|
+ * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up|End |
+ * |----------------------------------------------------------------|
+ * |Ctrl|Win |Alt | Space |Alt| FN|Ctrl|Lef|Dow|Rig |
+ * `----------------------------------------------------------------'
+ */
+[0] = LAYOUT_65_ansi(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+),
+
+ /* Keymap Fn Layer
+ * ,----------------------------------------------------------------.
+ * |~ `|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12|Del |Ins |
+ * |----------------------------------------------------------------|
+ * | | |Up | | | | | |PSc|SLk|Pau|Up | | | |
+ * |----------------------------------------------------------------|
+ * | |Lef|Dow|Rig| | | | |Hom|PUp|Lef|Rig| | |
+ * |----------------------------------------------------------------|
+ * | | | | | | | | |End|PDn|Dow| |PUp| |
+ * |----------------------------------------------------------------|
+ * | | | | | | | |Hom|PDn|End |
+ * `----------------------------------------------------------------'
+ */
+[1] = LAYOUT_65_ansi(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS,
+ _______, _______, KC_UP, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, KC_DOWN, _______, KC_PGUP, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END
+)
+};
diff --git a/keyboards/kbdfans/kbd67/rev2/keymaps/via/rules.mk b/keyboards/kbdfans/kbd67/rev2/keymaps/via/rules.mk
new file mode 100644
index 00000000000..36b7ba9cbc9
--- /dev/null
+++ b/keyboards/kbdfans/kbd67/rev2/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/kbdfans/kbd67/rev2/rev2.h b/keyboards/kbdfans/kbd67/rev2/rev2.h
index 4f68e810aa8..dba43492668 100644
--- a/keyboards/kbdfans/kbd67/rev2/rev2.h
+++ b/keyboards/kbdfans/kbd67/rev2/rev2.h
@@ -55,6 +55,38 @@
{ K40, K41, KC_NO, K43, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D, K4E, K4F }, \
}
+#define LAYOUT_65_ansi_blocker( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0E, K0F, \
+ K10, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \
+ K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, K3F, \
+ K40, K41, K43, K46, K4A, K4B, K4D, K4E, K4F \
+) \
+{ \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, KC_NO, K0E, K0F }, \
+ { K10, KC_NO, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \
+ { K20, KC_NO, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, KC_NO, K2F }, \
+ { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E, K3F }, \
+ { K40, K41, KC_NO, K43, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, KC_NO, K4D, K4E, K4F }, \
+}
+
+#define LAYOUT_65_ansi_blocker_splitbs( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
+ K10, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \
+ K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2F, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, K3F, \
+ K40, K41, K43, K46, K4A, K4B, K4D, K4E, K4F \
+) \
+{ \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \
+ { K10, KC_NO, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \
+ { K20, KC_NO, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, KC_NO, K2F }, \
+ { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, K3E, K3F }, \
+ { K40, K41, KC_NO, K43, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, KC_NO, K4D, K4E, K4F }, \
+}
+
+#define LAYOUT_65_ansi_blocker_split_bs LAYOUT_65_ansi_blocker_splitbs
+
#define LAYOUT_65_iso( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0E, K0F, \
K10, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1E, K1F, \
diff --git a/keyboards/kbdfans/kbd67/rev2/rules.mk b/keyboards/kbdfans/kbd67/rev2/rules.mk
index d97db91e307..de55438dd83 100644
--- a/keyboards/kbdfans/kbd67/rev2/rules.mk
+++ b/keyboards/kbdfans/kbd67/rev2/rules.mk
@@ -32,4 +32,4 @@ AUDIO_ENABLE = no # Audio output on port C6
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
-LAYOUTS = 65_ansi 65_iso
+LAYOUTS = 65_ansi 65_iso 65_ansi_blocker 65_ansi_blocker_split_bs
diff --git a/keyboards/kbdfans/kbd6x/config.h b/keyboards/kbdfans/kbd6x/config.h
index 61d086fbd58..32a625f71e4 100644
--- a/keyboards/kbdfans/kbd6x/config.h
+++ b/keyboards/kbdfans/kbd6x/config.h
@@ -20,12 +20,12 @@ along with this program. If not, see .
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x0000
+#define VENDOR_ID 0x4B42
+#define PRODUCT_ID 0x3658
#define DEVICE_VER 0x0001
#define MANUFACTURER You
#define PRODUCT kbd6x
-#define DESCRIPTION A custom keyboard
+#define DESCRIPTION Dual USB-C Tsangan Hot Swap PCB
/* key matrix size */
#define MATRIX_ROWS 5
diff --git a/keyboards/kbdfans/kbd6x/keymaps/konstantin/keymap.c b/keyboards/kbdfans/kbd6x/keymaps/konstantin/keymap.c
index d002322056e..46cc0a11373 100644
--- a/keyboards/kbdfans/kbd6x/keymaps/konstantin/keymap.c
+++ b/keyboards/kbdfans/kbd6x/keymaps/konstantin/keymap.c
@@ -14,8 +14,23 @@ void eeconfig_init_keymap(void) {
rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL);
}
+bool indicator_light = false;
+
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
+ case RGB_TOG ... RGB_SPD:
+ // Disable RGB controls when Fn/Caps indicator lights are on
+ if (indicator_light) {
+ return false;
+ }
+ // Shift+Toggle = reset RGB
+ if (record->event.pressed && keycode == RGB_TOG && get_mods() & MOD_MASK_SHIFT) {
+ eeconfig_init_keymap();
+ return false;
+ }
+ break;
+
+ // Combined RCtrl and layer
case RCTRL:
if (record->event.pressed) {
register_code(KC_RCTRL);
@@ -33,17 +48,20 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
static inline void fn_light(void) {
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
rgblight_sethsv_noeeprom(modern_dolch_red.h, modern_dolch_red.s, rgblight_get_val());
+ indicator_light = true;
}
static inline void caps_light(void) {
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
rgblight_sethsv_noeeprom(modern_dolch_cyan.h, modern_dolch_cyan.s, rgblight_get_val());
+ indicator_light = true;
}
static inline void restore_light(void) {
rgblight_config_t saved = { .raw = eeconfig_read_rgblight() };
rgblight_sethsv_noeeprom(saved.hue, saved.sat, saved.val);
rgblight_mode_noeeprom(saved.mode);
+ indicator_light = false;
}
static void check_light_layer(uint32_t state) {
diff --git a/keyboards/kbdfans/kbd6x/keymaps/konstantin/rules.mk b/keyboards/kbdfans/kbd6x/keymaps/konstantin/rules.mk
index 64428383cf9..c75488af628 100644
--- a/keyboards/kbdfans/kbd6x/keymaps/konstantin/rules.mk
+++ b/keyboards/kbdfans/kbd6x/keymaps/konstantin/rules.mk
@@ -3,6 +3,7 @@ BOOTMAGIC_ENABLE = no
COMMAND_ENABLE = yes
CONSOLE_ENABLE = no
EXTRAKEY_ENABLE = yes
+GRAVE_ESC_ENABLE = no
MOUSEKEY_ENABLE = yes
NKRO_ENABLE = yes
RGBLIGHT_ENABLE = yes
diff --git a/keyboards/kbdfans/kbd6x/keymaps/via/keymap.c b/keyboards/kbdfans/kbd6x/keymaps/via/keymap.c
new file mode 100644
index 00000000000..07883b0a5e0
--- /dev/null
+++ b/keyboards/kbdfans/kbd6x/keymaps/via/keymap.c
@@ -0,0 +1,50 @@
+/* Copyright 2020 mixedfeelings
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_DEL,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_RCTL
+ ),
+
+ [1] = LAYOUT(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_GRV,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RIGHT, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDOWN, KC_DOWN, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, MO(2), KC_STOP, KC_TRNS, KC_TRNS
+ ),
+
+ [2] = LAYOUT(
+ RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_TOGG, BL_INC, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [3] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+};
diff --git a/keyboards/kbdfans/kbd6x/keymaps/via/readme.md b/keyboards/kbdfans/kbd6x/keymaps/via/readme.md
new file mode 100644
index 00000000000..9e125443e14
--- /dev/null
+++ b/keyboards/kbdfans/kbd6x/keymaps/via/readme.md
@@ -0,0 +1,7 @@
+# VIA keymap for KBDFans KBD6x.
+
+Predefined Layers:
+- 0 - Default KBD6x keymap
+- 1 - A modified version of the classic HHKB function layer
+- 2 - Lighting control and RESET
+- 3 - Blank
\ No newline at end of file
diff --git a/keyboards/kbdfans/kbd6x/keymaps/via/rules.mk b/keyboards/kbdfans/kbd6x/keymaps/via/rules.mk
new file mode 100644
index 00000000000..36b7ba9cbc9
--- /dev/null
+++ b/keyboards/kbdfans/kbd6x/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/kbdfans/kbd8x_mk2/readme.md b/keyboards/kbdfans/kbd8x_mk2/readme.md
index 3655ac1c75f..fbd65046096 100644
--- a/keyboards/kbdfans/kbd8x_mk2/readme.md
+++ b/keyboards/kbdfans/kbd8x_mk2/readme.md
@@ -6,7 +6,7 @@ A fairly typical TKL
Keyboard Maintainer: [ai03](https://github.com/ai03-2725) / [KBDfans](https://kbdfans.cn/)
Hardware Supported: KBD8X MKII PCB/case
-Hardware Availability: [KBDfans](https://kbdfans.cn/collections/new-arrival/products/coming-soon-kbd8x-mkii-custom-mechanical-keyboard-kit)
+Hardware Availability: [KBDfans](https://kbdfans.com/collections/90-kbd19x/products/gb-kbd8x-mkii-pcb)
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/kbdfans/kbdpad/mk1/config.h b/keyboards/kbdfans/kbdpad/mk1/config.h
index d41ec6001e6..1646a1af1fa 100644
--- a/keyboards/kbdfans/kbdpad/mk1/config.h
+++ b/keyboards/kbdfans/kbdpad/mk1/config.h
@@ -23,7 +23,7 @@ along with this program. If not, see .
#define PRODUCT_ID 0x422D
#define DEVICE_VER 0x0200
#define MANUFACTURER KBDfans
-#define PRODUCT KBDPAD-MKI
+#define PRODUCT KBDPAD Mk. I
#define MATRIX_ROWS 6
#define MATRIX_COLS 4
diff --git a/keyboards/kbdfans/kbdpad/mk1/rules.mk b/keyboards/kbdfans/kbdpad/mk1/rules.mk
index b4cd885b1a3..dcd7e554050 100644
--- a/keyboards/kbdfans/kbdpad/mk1/rules.mk
+++ b/keyboards/kbdfans/kbdpad/mk1/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = no
MOUSEKEY_ENABLE = yes
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = no
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = no # PCB has underglow LEDs, but case doesn't let them show.
diff --git a/keyboards/kbdfans/kbdpad/mk1/usbconfig.h b/keyboards/kbdfans/kbdpad/mk1/usbconfig.h
deleted file mode 100644
index e65d210ace8..00000000000
--- a/keyboards/kbdfans/kbdpad/mk1/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/kc60/config.h b/keyboards/kc60/config.h
index 7e9cdaa086f..7c6e695a456 100644
--- a/keyboards/kc60/config.h
+++ b/keyboards/kc60/config.h
@@ -15,18 +15,17 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
-#ifndef CONFIG_H
-#define CONFIG_H
+#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x6060
+#define VENDOR_ID 0x530A
+#define PRODUCT_ID 0x6FFC
#define DEVICE_VER 0x0001
-#define MANUFACTURER You
-#define PRODUCT kc60v2
-#define DESCRIPTION A custom keyboard
+#define MANUFACTURER NPKC
+#define PRODUCT KC60
+#define DESCRIPTION QMK Firmware: KC60
/* key matrix size */
#define MATRIX_ROWS 5
@@ -41,119 +40,60 @@ along with this program. If not, see .
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
-*/
-
-// Possible pins for columns include: F1 F0 E6 D7 D6 D4 C7 C6 B7 B5 B4 B3 B1 B0
-// Pins for rows include: D0 D1 F6 F7 D5
-// KC60 Version 2
+ */
#define MATRIX_ROW_PINS { D0, D1, F6, F7, D5 }
#define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B7, D4, B1, B0, B5, B4, D7, D6, B3 }
#define UNUSED_PINS
-#define BACKLIGHT_PIN B6
-
-/* COL2ROW or ROW2COL */
+/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
+#define BACKLIGHT_PIN B6
+#define BACKLIGHT_BREATHING
+#define BACKLIGHT_LEVELS 5
+
+#ifdef RGBLIGHT_ENABLE
+# define RGB_DI_PIN F5
+# define RGBLED_NUM 16 // Number of LEDs. Change this to match your use case.
+# 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
-/* number of backlight levels */
-#define BACKLIGHT_LEVELS 5
-
/* 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
-/*
- * 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
-
-/*
- * Magic Key Options
- *
- * Magic keys are hotkey commands that allow control over firmware functions of
- * the keyboard. They are best used in combination with the HID Listen program,
- * found here: https://www.pjrc.com/teensy/hid_listen.html
- *
- * The options below allow the magic key functionality to be changed. This is
- * useful if your keyboard/keypad is missing keys and you want magic key support.
- *
- */
-
-/* control how magic key switches layers */
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
-
-/* override magic key keymap */
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
-//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
-//#define MAGIC_KEY_HELP1 H
-//#define MAGIC_KEY_HELP2 SLASH
-//#define MAGIC_KEY_DEBUG D
-//#define MAGIC_KEY_DEBUG_MATRIX X
-//#define MAGIC_KEY_DEBUG_KBD K
-//#define MAGIC_KEY_DEBUG_MOUSE M
-//#define MAGIC_KEY_VERSION V
-//#define MAGIC_KEY_STATUS S
-//#define MAGIC_KEY_CONSOLE C
-//#define MAGIC_KEY_LAYER0_ALT1 ESC
-//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
-//#define MAGIC_KEY_LAYER0 0
-//#define MAGIC_KEY_LAYER1 1
-//#define MAGIC_KEY_LAYER2 2
-//#define MAGIC_KEY_LAYER3 3
-//#define MAGIC_KEY_LAYER4 4
-//#define MAGIC_KEY_LAYER5 5
-//#define MAGIC_KEY_LAYER6 6
-//#define MAGIC_KEY_LAYER7 7
-//#define MAGIC_KEY_LAYER8 8
-//#define MAGIC_KEY_LAYER9 9
-//#define MAGIC_KEY_BOOTLOADER PAUSE
-//#define MAGIC_KEY_LOCK CAPS
-//#define MAGIC_KEY_EEPROM E
-//#define MAGIC_KEY_NKRO N
-//#define MAGIC_KEY_SLEEP_LED Z
-
-/*
- * 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
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
-
-#endif
diff --git a/keyboards/kc60/info.json b/keyboards/kc60/info.json
index adc3355eb1d..bd21b6a6c55 100644
--- a/keyboards/kc60/info.json
+++ b/keyboards/kc60/info.json
@@ -1,16 +1,212 @@
{
- "keyboard_name": "KC60",
- "url": "",
- "maintainer": "qmk",
- "width": 15,
- "height": 5,
- "layouts": {
- "LAYOUT": {
- "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":2, "w":1.25}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":5}, {"x":8.75, "y":4, "w":1.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}]
- },
-
- "LAYOUT_60_ansi": {
- "layout": [{"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}]
- }
- }
+ "keyboard_name": "KC60",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 15,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [
+ {"label":"Esc", "x":0, "y":0},
+ {"label":"1", "x":1, "y":0},
+ {"label":"2", "x":2, "y":0},
+ {"label":"3", "x":3, "y":0},
+ {"label":"4", "x":4, "y":0},
+ {"label":"5", "x":5, "y":0},
+ {"label":"6", "x":6, "y":0},
+ {"label":"7", "x":7, "y":0},
+ {"label":"8", "x":8, "y":0},
+ {"label":"9", "x":9, "y":0},
+ {"label":"0", "x":10, "y":0},
+ {"label":"-", "x":11, "y":0},
+ {"label":"=", "x":12, "y":0},
+ {"label":"Backspace", "x":13, "y":0},
+ {"label":"`", "x":14, "y":0},
+ {"label":"Tab", "x":0, "y":1, "w":1.5},
+ {"label":"Q", "x":1.5, "y":1},
+ {"label":"W", "x":2.5, "y":1},
+ {"label":"E", "x":3.5, "y":1},
+ {"label":"R", "x":4.5, "y":1},
+ {"label":"T", "x":5.5, "y":1},
+ {"label":"Y", "x":6.5, "y":1},
+ {"label":"U", "x":7.5, "y":1},
+ {"label":"I", "x":8.5, "y":1},
+ {"label":"O", "x":9.5, "y":1},
+ {"label":"P", "x":10.5, "y":1},
+ {"label":"[", "x":11.5, "y":1},
+ {"label":"]", "x":12.5, "y":1},
+ {"label":"\\", "x":13.5, "y":1, "w":1.5},
+ {"label":"CapsLock", "x":0, "y":2, "w":1.75},
+ {"label":"A", "x":1.75, "y":2},
+ {"label":"S", "x":2.75, "y":2},
+ {"label":"D", "x":3.75, "y":2},
+ {"label":"F", "x":4.75, "y":2},
+ {"label":"G", "x":5.75, "y":2},
+ {"label":"H", "x":6.75, "y":2},
+ {"label":"J", "x":7.75, "y":2},
+ {"label":"K", "x":8.75, "y":2},
+ {"label":"L", "x":9.75, "y":2},
+ {"label":";", "x":10.75, "y":2},
+ {"label":"'", "x":11.75, "y":2},
+ {"label":"ISO#", "x":12.75, "y":2},
+ {"label":"Enter", "x":13.75, "y":2, "w":1.25},
+ {"label":"Shift", "x":0, "y":3, "w":1.25},
+ {"label":"ISO\\", "x":1.25, "y":3},
+ {"label":"Z", "x":2.25, "y":3},
+ {"label":"X", "x":3.25, "y":3},
+ {"label":"C", "x":4.25, "y":3},
+ {"label":"V", "x":5.25, "y":3},
+ {"label":"B", "x":6.25, "y":3},
+ {"label":"N", "x":7.25, "y":3},
+ {"label":"M", "x":8.25, "y":3},
+ {"label":",", "x":9.25, "y":3},
+ {"label":".", "x":10.25, "y":3},
+ {"label":"/", "x":11.25, "y":3},
+ {"label":"Shift", "x":12.25, "y":3, "w":1.75},
+ {"label":"HHKBFn", "x":14, "y":3},
+ {"label":"Ctrl", "x":0, "y":4, "w":1.25},
+ {"label":"GUI", "x":1.25, "y":4, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":4, "w":1.25},
+ {"label":"Space", "x":3.75, "y":4, "w":6.25},
+ {"label":"Alt", "x":10, "y":4, "w":1.25},
+ {"label":"GUI", "x":11.25, "y":4, "w":1.25},
+ {"label":"Menu", "x":12.5, "y":4, "w":1.25},
+ {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}
+ ]
+ },
+ "LAYOUT": {
+ "layout": [
+ {"label":"K00", "x":0, "y":0},
+ {"label":"K01", "x":1, "y":0},
+ {"label":"K02", "x":2, "y":0},
+ {"label":"K03", "x":3, "y":0},
+ {"label":"K04", "x":4, "y":0},
+ {"label":"K05", "x":5, "y":0},
+ {"label":"K06", "x":6, "y":0},
+ {"label":"K07", "x":7, "y":0},
+ {"label":"K08", "x":8, "y":0},
+ {"label":"K09", "x":9, "y":0},
+ {"label":"K0A", "x":10, "y":0},
+ {"label":"K0B", "x":11, "y":0},
+ {"label":"K0C", "x":12, "y":0},
+ {"label":"K0D", "x":13, "y":0},
+ {"label":"K10", "x":0, "y":1, "w":1.5},
+ {"label":"K11", "x":1.5, "y":1},
+ {"label":"K12", "x":2.5, "y":1},
+ {"label":"K13", "x":3.5, "y":1},
+ {"label":"K14", "x":4.5, "y":1},
+ {"label":"K15", "x":5.5, "y":1},
+ {"label":"K16", "x":6.5, "y":1},
+ {"label":"K17", "x":7.5, "y":1},
+ {"label":"K18", "x":8.5, "y":1},
+ {"label":"K19", "x":9.5, "y":1},
+ {"label":"K1A", "x":10.5, "y":1},
+ {"label":"K1B", "x":11.5, "y":1},
+ {"label":"K1C", "x":12.5, "y":1},
+ {"label":"K1D", "x":13.5, "y":1, "w":1.5},
+ {"label":"K20", "x":0, "y":2, "w":1.75},
+ {"label":"K21", "x":1.75, "y":2},
+ {"label":"K22", "x":2.75, "y":2},
+ {"label":"K23", "x":3.75, "y":2},
+ {"label":"K24", "x":4.75, "y":2},
+ {"label":"K25", "x":5.75, "y":2},
+ {"label":"K26", "x":6.75, "y":2},
+ {"label":"K27", "x":7.75, "y":2},
+ {"label":"K28", "x":8.75, "y":2},
+ {"label":"K29", "x":9.75, "y":2},
+ {"label":"K2A", "x":10.75, "y":2},
+ {"label":"K2B", "x":11.75, "y":2},
+ {"label":"K2C", "x":12.75, "y":2},
+ {"label":"K2D", "x":13.75, "y":2, "w":1.25},
+ {"label":"K30", "x":0, "y":3, "w":1.25},
+ {"label":"K31", "x":1.25, "y":3},
+ {"label":"K32", "x":2.25, "y":3},
+ {"label":"K33", "x":3.25, "y":3},
+ {"label":"K34", "x":4.25, "y":3},
+ {"label":"K35", "x":5.25, "y":3},
+ {"label":"K36", "x":6.25, "y":3},
+ {"label":"K37", "x":7.25, "y":3},
+ {"label":"K38", "x":8.25, "y":3},
+ {"label":"K39", "x":9.25, "y":3},
+ {"label":"K3A", "x":10.25, "y":3},
+ {"label":"K3B", "x":11.25, "y":3},
+ {"label":"K3C", "x":12.25, "y":3, "w":1.75},
+ {"label":"K3D", "x":14, "y":3},
+ {"label":"K40", "x":0, "y":4, "w":1.25},
+ {"label":"K41", "x":1.25, "y":4, "w":1.25},
+ {"label":"K42", "x":2.5, "y":4, "w":1.25},
+ {"label":"K45", "x":3.75, "y":4, "w":6.25},
+ {"label":"K49", "x":14, "y":0},
+ {"label":"K4A", "x":10, "y":4, "w":1.25},
+ {"label":"K4B", "x":11.25, "y":4, "w":1.25},
+ {"label":"K4C", "x":12.5, "y":4, "w":1.25},
+ {"label":"K4D", "x":13.75, "y":4, "w":1.25}
+ ]
+ },
+ "LAYOUT_60_ansi": {
+ "layout": [
+ {"label":"~", "x":0, "y":0},
+ {"label":"1", "x":1, "y":0},
+ {"label":"2", "x":2, "y":0},
+ {"label":"3", "x":3, "y":0},
+ {"label":"4", "x":4, "y":0},
+ {"label":"5", "x":5, "y":0},
+ {"label":"6", "x":6, "y":0},
+ {"label":"7", "x":7, "y":0},
+ {"label":"8", "x":8, "y":0},
+ {"label":"9", "x":9, "y":0},
+ {"label":"0", "x":10, "y":0},
+ {"label":"-", "x":11, "y":0},
+ {"label":"=", "x":12, "y":0},
+ {"label":"Backspace", "x":13, "y":0, "w":2},
+ {"label":"Tab", "x":0, "y":1, "w":1.5},
+ {"label":"Q", "x":1.5, "y":1},
+ {"label":"W", "x":2.5, "y":1},
+ {"label":"E", "x":3.5, "y":1},
+ {"label":"R", "x":4.5, "y":1},
+ {"label":"T", "x":5.5, "y":1},
+ {"label":"Y", "x":6.5, "y":1},
+ {"label":"U", "x":7.5, "y":1},
+ {"label":"I", "x":8.5, "y":1},
+ {"label":"O", "x":9.5, "y":1},
+ {"label":"P", "x":10.5, "y":1},
+ {"label":"[", "x":11.5, "y":1},
+ {"label":"]", "x":12.5, "y":1},
+ {"label":"\\", "x":13.5, "y":1, "w":1.5},
+ {"label":"CapsLock", "x":0, "y":2, "w":1.75},
+ {"label":"A", "x":1.75, "y":2},
+ {"label":"S", "x":2.75, "y":2},
+ {"label":"D", "x":3.75, "y":2},
+ {"label":"F", "x":4.75, "y":2},
+ {"label":"G", "x":5.75, "y":2},
+ {"label":"H", "x":6.75, "y":2},
+ {"label":"J", "x":7.75, "y":2},
+ {"label":"K", "x":8.75, "y":2},
+ {"label":"L", "x":9.75, "y":2},
+ {"label":";", "x":10.75, "y":2},
+ {"label":"'", "x":11.75, "y":2},
+ {"label":"Enter", "x":12.75, "y":2, "w":2.25},
+ {"label":"Shift", "x":0, "y":3, "w":2.25},
+ {"label":"Z", "x":2.25, "y":3},
+ {"label":"X", "x":3.25, "y":3},
+ {"label":"C", "x":4.25, "y":3},
+ {"label":"V", "x":5.25, "y":3},
+ {"label":"B", "x":6.25, "y":3},
+ {"label":"N", "x":7.25, "y":3},
+ {"label":"M", "x":8.25, "y":3},
+ {"label":",", "x":9.25, "y":3},
+ {"label":".", "x":10.25, "y":3},
+ {"label":"/", "x":11.25, "y":3},
+ {"label":"Shift", "x":12.25, "y":3, "w":2.75},
+ {"label":"Ctrl", "x":0, "y":4, "w":1.25},
+ {"label":"Win", "x":1.25, "y":4, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":4, "w":1.25},
+ {"label":"Space", "x":3.75, "y":4, "w":6.25},
+ {"label":"Alt", "x":10, "y":4, "w":1.25},
+ {"label":"Win", "x":11.25, "y":4, "w":1.25},
+ {"label":"Menu", "x":12.5, "y":4, "w":1.25},
+ {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}
+ ]
+ }
+ }
}
diff --git a/keyboards/kc60/kc60.h b/keyboards/kc60/kc60.h
index b8e16c0b30e..2f26b2c0e13 100644
--- a/keyboards/kc60/kc60.h
+++ b/keyboards/kc60/kc60.h
@@ -1,25 +1,53 @@
-#ifndef KC60_H
-#define KC60_H
+#pragma once
#include "quantum.h"
-// K49 key is for the key at row 1 and column 15 when you split the backspace in 2 1U key.
+/* LAYOUT_all
+ * ,-----------------------------------------------------------.
+ * |00 |01 |02 |03 |04 |05 |06 |07 |08 |09 |0A |0B |0C |0D |49 |
+ * |-----------------------------------------------------------| ,-----.
+ * |10 |11 |12 |13 |14 |15 |16 |17 |18 |19 |1A |1B |1C |1D | | |
+ * |-----------------------------------------------------------| ,---. |
+ * |20 |21 |22 |23 |24 |25 |26 |17 |28 |29 |2A |2B |2D | |2C |2D |
+ * |-----------------------------------------------------------| `--------'
+ * |30 |31 |32 |33 |34 |35 |36 |37 |38 |39 |3A |3B |3D |3C |
+ * |-----------------------------------------------------------|
+ * |40 |41 |42 | 45 |4A |4B |4C |4D |
+ * `-----------------------------------------------------------'
+ * 2u Backspace = K0D
+ * 2.25u left Shift = K30
+ * 2.75u right Shift = K3D
+ */
+#define LAYOUT_all( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3C, \
+ K40, K41, K42, K45, K4A, K4B, K4C, K4D \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \
+ { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, K49, K4A, K4B, K4C, K4D } \
+}
-// This a shortcut to help you visually see your layout.
-// The first section contains all of the arguements
-// The second converts the arguments into a multi-dimensional array
-/*
- * ,-----------------------------------------------------------------------------------------.
- * | K00 | K01 | K02 | K03 | K04 | K05 | K06 | K07 | K08 | K09 | K0A | K0B | K0C | K0D | K49 |
- * |-----------------------------------------------------------------------------------------+
- * | K10 | K11 | K12 | K13 | K14 | K15 | K16 | K17 | K18 | K19 | K1A | K1B | K1C | K1D |
- * |-----------------------------------------------------------------------------------------+
- * | K20 | K21 | K22 | K23 | K24 | K25 | K26 | K17 | K28 | K29 | K2A | K2B | K2C |
- * |-----------------------------------------------------------------------------------------+
- * | K30 | K32 | K33 | K34 | K35 | K36 | K37 | K38 | K39 | K3A | K3B | K3D | K3C |
- * |-----------------------------------------------------------------------------------------+
- * | K40 | K41 | K42 | K45 | K4A | K4B | K4C | K4D |
- * `-----------------------------------------------------------------------------------------'
+/* LAYOUT
+ * Present for backwards compatibility with older keymaps. The commit that added
+ * split Backspace support put the right 1u key of the split on the bottom row,
+ * next to right Alt. The arguments for 1.75/1u right Shift are also in reverse
+ * order.
+ * ,-----------------------------------------------------------.
+ * |00 |01 |02 |03 |04 |05 |06 |07 |08 |09 |0A |0B |0C |0D |49 |
+ * |-----------------------------------------------------------| ,-----.
+ * |10 |11 |12 |13 |14 |15 |16 |17 |18 |19 |1A |1B |1C |1D | | |
+ * |-----------------------------------------------------------| ,---. |
+ * |20 |21 |22 |23 |24 |25 |26 |17 |28 |29 |2A |2B |2D | |2C |2D |
+ * |-----------------------------------------------------------| `--------'
+ * |30 |31 |32 |33 |34 |35 |36 |37 |38 |39 |3A |3B |3D |3C |
+ * |-----------------------------------------------------------|
+ * |40 |41 |42 | 45 |4A |4B |4C |4D |
+ * `-----------------------------------------------------------'
*/
#define LAYOUT( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
@@ -27,82 +55,37 @@
K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
K40, K41, K42, K45, K49, K4A, K4B, K4C, K4D \
- ) { \
- { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, }, \
- { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
- { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
- { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \
- { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, K49, K4A, K4B, K4C, K4D } \
-}
+) LAYOUT_all( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K49, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3C, \
+ K40, K41, K42, K45, K4A, K4B, K4C, K4D \
+)
-/* Default layout
- * ,-----------------------------------------------------------------------------------------.
- * | K00 | K01 | K02 | K03 | K04 | K05 | K06 | K07 | K08 | K09 | K0A | K0B | K0C | K0D |
- * |-----------------------------------------------------------------------------------------+
- * | K10 | K11 | K12 | K13 | K14 | K15 | K16 | K17 | K18 | K19 | K1A | K1B | K1C | K1D |
- * |-----------------------------------------------------------------------------------------+
- * | K20 | K21 | K22 | K23 | K24 | K25 | K26 | K17 | K28 | K29 | K2A | K2B | K2D |
- * |-----------------------------------------------------------------------------------------+
- * | K30 | K32 | K33 | K34 | K35 | K36 | K37 | K38 | K39 | K3A | K3B | K3D |
- * |-----------------------------------------------------------------------------------------+
- * | K40 | K41 | K42 | K45 | K4A | K4B | K4C | K4D |
- * `-----------------------------------------------------------------------------------------'
+/* LAYOUT_60_ansi
+ * ,-----------------------------------------------------------.
+ * |00 |01 |02 |03 |04 |05 |06 |07 |08 |09 |0A |0B |0C |0D |
+ * |-----------------------------------------------------------|
+ * |10 |11 |12 |13 |14 |15 |16 |17 |18 |19 |1A |1B |1C |1D |
+ * |-----------------------------------------------------------|
+ * |20 |21 |22 |23 |24 |25 |26 |17 |28 |29 |2A |2B |2D |
+ * |-----------------------------------------------------------|
+ * |30 |32 |33 |34 |35 |36 |37 |38 |39 |3A |3B |3D |
+ * |-----------------------------------------------------------|
+ * |40 |41 |42 | 45 |4A |4B |4C |4D |
+ * `-----------------------------------------------------------'
*/
-
#define LAYOUT_60_ansi( \
K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
- K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
- K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
- K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \
- K40, K41, K42, K45, K4A, K4B, K4C, K4D \
- ) { \
- { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
- { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
- { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D }, \
- { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D }, \
- { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D } \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \
+ K40, K41, K42, K45, K4A, K4B, K4C, K4D \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D }, \
+ { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D }, \
+ { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D } \
}
-
-/* Mini Lshift
- * ,-----------------------------------------------------------------------------------------.
- * | K00 | K01 | K02 | K03 | K04 | K05 | K06 | K07 | K08 | K09 | K0A | K0B | K0C | K0D |
- * |-----------------------------------------------------------------------------------------+
- * | K10 | K11 | K12 | K13 | K14 | K15 | K16 | K17 | K18 | K19 | K1A | K1B | K1C | K1D |
- * |-----------------------------------------------------------------------------------------+
- * | K20 | K21 | K22 | K23 | K24 | K25 | K26 | K17 | K28 | K29 | K2A | K2B | K2C |
- * |-----------------------------------------------------------------------------------------+
- * | K30 |K31| K32 | K33 | K34 | K35 | K36 | K37 | K38 | K39 | K3A | K3B | K3C |
- * |-----------------------------------------------------------------------------------------+
- * | K40 | K41 | K42 | K45 | K4A | K4B | K4C | K4D |
- * `-----------------------------------------------------------------------------------------'
- */
-
-/* Mini Rshift
- * ,-----------------------------------------------------------------------------------------.
- * | K00 | K01 | K02 | K03 | K04 | K05 | K06 | K07 | K08 | K09 | K0A | K0B | K0C | K0D |
- * |-----------------------------------------------------------------------------------------+
- * | K10 | K11 | K12 | K13 | K14 | K15 | K16 | K17 | K18 | K19 | K1A | K1B | K1C | K1D |
- * |-----------------------------------------------------------------------------------------+
- * | K20 | K21 | K22 | K23 | K24 | K25 | K26 | K17 | K28 | K29 | K2A | K2B | K2C |
- * |-----------------------------------------------------------------------------------------+
- * | K30 | K32 | K33 | K34 | K35 | K36 | K37 | K38 | K39 | K3A | K3B | K3C | K3D |
- * |-----------------------------------------------------------------------------------------+
- * | K40 | K41 | K42 | K45 | K4A | K4B | K4C | K4D |
- * `-----------------------------------------------------------------------------------------'
- */
-
-/* Mini Enter
- * ,-----------------------------------------------------------------------------------------.
- * | K00 | K01 | K02 | K03 | K04 | K05 | K06 | K07 | K08 | K09 | K0A | K0B | K0C | K0D |
- * |-----------------------------------------------------------------------------------------+
- * | K10 | K11 | K12 | K13 | K14 | K15 | K16 | K17 | K18 | K19 | K1A | K1B | K1C | K1D |
- * |-----------------------------------------------------------------------------------------+
- * | K20 | K21 | K22 | K23 | K24 | K25 | K26 | K17 | K28 | K29 | K2A | K2B | K2C | K2D |
- * |-----------------------------------------------------------------------------------------+
- * | K30 | K32 | K33 | K34 | K35 | K36 | K37 | K38 | K39 | K3A | K3B | K3C |
- * |-----------------------------------------------------------------------------------------+
- * | K40 | K41 | K42 | K45 | K4A | K4B | K4C | K4D |
- * `-----------------------------------------------------------------------------------------'
- */
-
-#endif
diff --git a/keyboards/kc60/keymaps/default/keymap.c b/keyboards/kc60/keymaps/default/keymap.c
index a96b9d3770e..d5286e351d4 100644
--- a/keyboards/kc60/keymaps/default/keymap.c
+++ b/keyboards/kc60/keymaps/default/keymap.c
@@ -1,12 +1,18 @@
-
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [0] = LAYOUT( /* Basic QWERTY */
- KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
- KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \
- KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, KC_RSFT, \
- KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_NO, KC_RGUI, KC_RALT, KC_RCTL, RESET \
- ),
+ [0] = LAYOUT_all(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, LT(1,KC_APP),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, LT(1,KC_APP), KC_RCTL
+ ),
+ [1] = LAYOUT_all(
+ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_PSCR, KC_SLCK, KC_PAUS,
+ XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, XXXXXXX, XXXXXXX, XXXXXXX,
+ _______, XXXXXXX, XXXXXXX, BL_DEC, BL_TOGG, BL_INC, BL_BRTG, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, _______, _______,
+ _______, _______, _______, XXXXXXX, _______, _______, _______, _______
+ ),
};
diff --git a/keyboards/kc60/keymaps/default/readme.md b/keyboards/kc60/keymaps/default/readme.md
new file mode 100644
index 00000000000..b10124eac9e
--- /dev/null
+++ b/keyboards/kc60/keymaps/default/readme.md
@@ -0,0 +1,5 @@
+# The default keymap for KC60
+
+
+
+Both `Fn` keys trigger `KC_APP` when tapped, and activate Layer 1 when held.
diff --git a/keyboards/kc60/keymaps/ws2812/config.h b/keyboards/kc60/keymaps/ws2812/config.h
index 43abf6228ef..ef39965b3ba 100644
--- a/keyboards/kc60/keymaps/ws2812/config.h
+++ b/keyboards/kc60/keymaps/ws2812/config.h
@@ -1,9 +1,4 @@
-#include "../../config.h"
+#pragma once
-/* WS2812B RGB Underglow LED */
-#define RGB_DI_PIN F5 // Based on wiring depicted in ws2812_wiring.jpg
-#define RGBLIGHT_ANIMATIONS
-#define RGBLED_NUM 16 // Number of LEDs. Change this to match your use case.
-#define RGBLIGHT_HUE_STEP 8
-#define RGBLIGHT_SAT_STEP 8
-#define RGBLIGHT_VAL_STEP 8
+#undef RGBLED_NUM
+#define RGBLED_NUM 16 // Number of LEDs. Change this to match your use case.
diff --git a/keyboards/kc60/keymaps/ws2812/keymap.c b/keyboards/kc60/keymaps/ws2812/keymap.c
index d445df33709..aaefb61ca3f 100644
--- a/keyboards/kc60/keymaps/ws2812/keymap.c
+++ b/keyboards/kc60/keymaps/ws2812/keymap.c
@@ -1,96 +1,18 @@
-
#include QMK_KEYBOARD_H
-// Used for SHIFT_ESC
-#define MODS_CTRL_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
-
-// Each layer gets a name for readability, which is then used in the keymap matrix below.
-// The underscores don't mean anything - you can have a layer called STUFF or any other name.
-// Layer names don't all need to be of the same length, obviously, and you can also skip them
-// entirely and just use numbers.
-#define _BL 0
-#define _FL 1
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- /* Keymap _BL: (Base Layer) Default Layer
- * ,-----------------------------------------------------------.
- * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |
- * |-----------------------------------------------------------|
- * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |
- * |-----------------------------------------------------------|
- * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return |
- * |-----------------------------------------------------------|
- * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |
- * |-----------------------------------------------------------|
- * |Ctrl|Gui |Alt | Space |Alt |Gui |FN |Ctrl |
- * `-----------------------------------------------------------'
- */
-[_BL] = LAYOUT(
- F(0), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
- KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_NO, KC_ENT, \
- KC_LSFT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_NO, KC_RSFT, \
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_NO, KC_RALT,KC_RGUI, MO(_FL), KC_RCTL),
-
- /* Keymap _FL: Function Layer
- * ,-----------------------------------------------------------.
- * |~ |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| DEL |
- * |-----------------------------------------------------------|
- * | | |UP | | | | | | | | |BL-|BL+|BL |
- * |-----------------------------------------------------------|
- * | |LFT|DWN|RGT| | | | | | | | |
- * |-----------------------------------------------------------|
- * | |FN1|FN2|FN3|FN4|FN5|FN6|FN7|FN8| | | |
- * |-----------------------------------------------------------|
- * | | | | | | | |RSET|
- * `-----------------------------------------------------------'
- */
-[_FL] = LAYOUT(
- #ifdef RGBLIGHT_ENABLE
- KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \
- KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_INC, BL_TOGG, \
- KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
- KC_TRNS, KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, RESET),
- #else
- KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \
- KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_INC, BL_TOGG, \
- KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, RESET),
- #endif
+ [0] = LAYOUT_all(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, LT(1,KC_APP),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, LT(1,KC_APP), KC_RCTL
+ ),
+ [1] = LAYOUT_all(
+ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, XXXXXXX, XXXXXXX,
+ XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, KC_INS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_PSCR, KC_SLCK, KC_PAUS,
+ XXXXXXX, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, KC_DEL, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, XXXXXXX, XXXXXXX, XXXXXXX,
+ _______, XXXXXXX, XXXXXXX, BL_DEC, BL_TOGG, BL_INC, BL_BRTG, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, _______, _______,
+ _______, _______, _______, XXXXXXX, _______, _______, _______, _______
+ ),
};
-
-enum function_id {
- SHIFT_ESC,
-};
-
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_FUNCTION(SHIFT_ESC),
-};
-
-void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
- static uint8_t shift_esc_shift_mask;
- switch (id) {
- case SHIFT_ESC:
- shift_esc_shift_mask = get_mods()&MODS_CTRL_MASK;
- if (record->event.pressed) {
- if (shift_esc_shift_mask) {
- add_key(KC_GRV);
- send_keyboard_report();
- } else {
- add_key(KC_ESC);
- send_keyboard_report();
- }
- } else {
- if (shift_esc_shift_mask) {
- del_key(KC_GRV);
- send_keyboard_report();
- } else {
- del_key(KC_ESC);
- send_keyboard_report();
- }
- }
- break;
- }
-}
diff --git a/keyboards/kc60/keymaps/ws2812/readme.md b/keyboards/kc60/keymaps/ws2812/readme.md
deleted file mode 100644
index 49357a0f54a..00000000000
--- a/keyboards/kc60/keymaps/ws2812/readme.md
+++ /dev/null
@@ -1,21 +0,0 @@
-KC60 with WS2812 RGB Underglow
-======================
-
-
-
-## Quantum MK Firmware
-For the full Quantum feature list, see [the parent readme.md](/readme.md).
-
-## WS2812 Support
-By default, it is now setup for 16 LEDs on the PF5 breakout pin. See [included image](https://i.imgur.com/TcKL2Sn.jpg) for wiring reference.
-
-### Build
-To build this keymap with WS2812 enabled, simply run `make KEYMAP=ws2812`.
-
-### Reference Images
-
-
-
-
-### Additional Credits
-Keymap based on work by [TerryMatthews](https://github.com/TerryMathews) for GH60 Satan.
diff --git a/keyboards/kc60/keymaps/ws2812/rules.mk b/keyboards/kc60/keymaps/ws2812/rules.mk
index 393ff863e0d..72a3d6f6c1a 100644
--- a/keyboards/kc60/keymaps/ws2812/rules.mk
+++ b/keyboards/kc60/keymaps/ws2812/rules.mk
@@ -1,22 +1,2 @@
-
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-KEYBOARD_LOCK_ENABLE = yes # Allow locking of keyboard via magic key
-BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = yes # Enable WS2812 underglow RGB strip
-MIDI_ENABLE = no # MIDI controls
-UNICODE_ENABLE = no # Unicode
-BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = no # Audio output on port C6
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE = no # USB Nkey Rollover
-
+COMMAND_ENABLE = no
+RGBLIGHT_ENABLE = yes
diff --git a/keyboards/kc60/mod_rgb_underglow.md b/keyboards/kc60/mod_rgb_underglow.md
new file mode 100644
index 00000000000..6aab1e1d2e6
--- /dev/null
+++ b/keyboards/kc60/mod_rgb_underglow.md
@@ -0,0 +1,31 @@
+# Adding RGB Underglow to the KC60
+
+
+
+The KC60 has breakout pins to which one may wire a strip of WS2812-compatible LEDs.
+
+By default, the source is set up for 16 LEDs on the F5 breakout pin. See [included image](https://i.imgur.com/TcKL2Sn.jpg) for wiring reference. If you attach a different number of LEDs, configure your source for the correct number of LEDs by adding a `config.h` file alongside your `keymap.c` file, with the following contents:
+
+```c
+#pragma once
+
+#undef RGBLED_NUM
+#define RGBLED_NUM
+```
+
+To enable RGB Underglow, simply add a `rules.mk` file containing `RGBLIGHT_ENABLE = yes` alongside your `keymap.c` file, and compile as normal:
+
+```shell
+make kc60:
+```
+
+The [ws2812 keymap](keymaps/ws2812/) may be copied and used as a starting point.
+
+RGB Underglow is a fairly large feature, and your firmware may be too large to be flashed with it enabled. Adding `CONSOLE_ENABLE = no` or `COMMAND_ENABLE = no` to your `rules.mk` file will reduce the size of the firmware greatly, and if you don't use either feature, is a very low impact change.
+
+
+## Reference Images
+
+
+
+
diff --git a/keyboards/kc60/readme.md b/keyboards/kc60/readme.md
index e152824ccfc..71888e7503f 100644
--- a/keyboards/kc60/readme.md
+++ b/keyboards/kc60/readme.md
@@ -1,35 +1,19 @@
-KC60 (version 2.0) keyboard firmware
-======================
+# KC60
-## Quantum MK Firmware
-For the full Quantum feature list, see [the parent readme.md](/readme.md).
+
-## Building
-Download or clone the whole firmware and navigate to the keyboards/kc60 folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
+A 60% PCB supporting in-switch LEDs, formerly available on AliExpress and (Mass)Drop. Supports ANSI, ISO, split Backspace, and both standard and Tsangan bottom row layouts.
-Depending on which keymap you would like to use, you will have to compile slightly differently.
+* Keyboard Maintainer: [The QMK Community](https://github.com/qmk)
+* Hardware Supported: KC60 v1.6, v2.0; ATmega32U4
+* Hardware Availability: [Drop.com](https://drop.com/buy/kc60-mechanical-keyboard?mode=guest_open) (no longer available)
-### Default
-To build with the default keymap, simply run `make default`.
+Make example for this keyboard (after setting up your build environment):
-### Other Keymaps
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `.c` in the keymaps folder, and see keymap document (you can find in top readme.md) and existent keymap files.
+ make kc60:default
-To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+## RGB Underglow Support
-```
-$ make [default|jack|]
-```
+To add RGB Underglow to the KC60, see [Adding RGB Underglow to the KC60](mod_rgb_underglow.md).
-Keymaps follow the format **__\.c__** and are stored in the `keymaps` folder.
-
-## WS2812 Support
-
-Build with WS2812 Support by running `make ws2812`.
-
-## Warning
-For those who want to use 2x1U instead of classic backspace you need to use K0D and K49 like this:
-* K0D represents the key at the right of =.
-* K49 represents the last key of the row (is wired at the right of the space key on the PCB)
-
-In kc60.h I've put several definitions' examples of possible layouts proposed by online editor (http://123.57.250.164:9128/).
+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).
diff --git a/keyboards/kc60/rules.mk b/keyboards/kc60/rules.mk
index 487b22c38d4..e1c92de9611 100644
--- a/keyboards/kc60/rules.mk
+++ b/keyboards/kc60/rules.mk
@@ -19,15 +19,17 @@ MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
-KEYBOARD_LOCK_ENABLE = yes # Allow locking of keyboard via magic key
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no # USB Nkey Rollover
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
-MIDI_ENABLE = no # MIDI controls
-UNICODE_ENABLE = no # Unicode
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+KEYBOARD_LOCK_ENABLE = yes # Allow locking of keyboard via magic key
LAYOUTS = 60_ansi
diff --git a/keyboards/keebio/bdn9/bdn9.c b/keyboards/keebio/bdn9/bdn9.c
index 0ff55fd6d45..f3842d09897 100644
--- a/keyboards/keebio/bdn9/bdn9.c
+++ b/keyboards/keebio/bdn9/bdn9.c
@@ -1 +1,18 @@
#include "bdn9.h"
+
+void eeconfig_init_kb(void) {
+#ifdef BACKLIGHT_ENABLE
+ backlight_enable();
+ backlight_level(5);
+#endif
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(0, 255, 255); // Set default HSV - red hue, full saturation, full brightness
+#ifdef RGBLIGHT_ANIMATIONS
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2); // set to RGB_RAINBOW_SWIRL by default
+#endif
+#endif
+
+ eeconfig_update_kb(0);
+ eeconfig_init_user();
+}
diff --git a/keyboards/keebio/bdn9/keymaps/via/keymap.c b/keyboards/keebio/bdn9/keymaps/via/keymap.c
new file mode 100644
index 00000000000..6ef7a06eaf6
--- /dev/null
+++ b/keyboards/keebio/bdn9/keymaps/via/keymap.c
@@ -0,0 +1,52 @@
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+ _ZERO,
+ _ONE,
+ _TWO,
+ _THREE
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[_ZERO] = LAYOUT(
+ KC_MPLY, KC_HOME, KC_MUTE,
+ MO(1), KC_UP, RGB_MOD,
+ KC_LEFT, KC_DOWN, KC_RGHT
+),
+
+[_ONE] = LAYOUT(
+ RESET, BL_STEP, KC_STOP,
+ _______, KC_HOME, RGB_MOD,
+ KC_MPRV, KC_END , KC_MNXT
+),
+
+[_TWO] = LAYOUT(
+ _______, _______, _______,
+ _______, _______, _______,
+ _______, _______, _______
+),
+
+[_THREE] = LAYOUT(
+ _______, _______, _______,
+ _______, _______, _______,
+ _______, _______, _______
+)
+
+};
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ } else if (index == 1) {
+ if (clockwise) {
+ tap_code(KC_WH_U);
+ } else {
+ tap_code(KC_WH_D);
+ }
+ }
+}
diff --git a/keyboards/keebio/bdn9/keymaps/via/rules.mk b/keyboards/keebio/bdn9/keymaps/via/rules.mk
new file mode 100644
index 00000000000..5b604f2b06d
--- /dev/null
+++ b/keyboards/keebio/bdn9/keymaps/via/rules.mk
@@ -0,0 +1,5 @@
+VIA_ENABLE = yes
+LINK_TIME_OPTIMIZATION_ENABLE = yes
+MOUSEKEY_ENABLE = yes
+CONSOLE_ENABLE = no
+COMMAND_ENABLE = no
diff --git a/keyboards/keebio/choconum/chconf.h b/keyboards/keebio/choconum/chconf.h
new file mode 100644
index 00000000000..03f63da36a8
--- /dev/null
+++ b/keyboards/keebio/choconum/chconf.h
@@ -0,0 +1,714 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file rt/templates/chconf.h
+ * @brief Configuration file template.
+ * @details A copy of this file must be placed in each project directory, it
+ * contains the application specific kernel settings.
+ *
+ * @addtogroup config
+ * @details Kernel related settings and hooks.
+ * @{
+ */
+
+#ifndef CHCONF_H
+#define CHCONF_H
+
+#define _CHIBIOS_RT_CONF_
+#define _CHIBIOS_RT_CONF_VER_6_0_
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System time counter resolution.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_ST_RESOLUTION)
+#define CH_CFG_ST_RESOLUTION 32
+#endif
+
+/**
+ * @brief System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ * setting also defines the system tick time unit.
+ */
+#if !defined(CH_CFG_ST_FREQUENCY)
+#define CH_CFG_ST_FREQUENCY 10000
+#endif
+
+/**
+ * @brief Time intervals data size.
+ * @note Allowed values are 16, 32 or 64 bits.
+ */
+#if !defined(CH_CFG_INTERVALS_SIZE)
+#define CH_CFG_INTERVALS_SIZE 32
+#endif
+
+/**
+ * @brief Time types data size.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#if !defined(CH_CFG_TIME_TYPES_SIZE)
+#define CH_CFG_TIME_TYPES_SIZE 32
+#endif
+
+/**
+ * @brief Time delta constant for the tick-less mode.
+ * @note If this value is zero then the system uses the classic
+ * periodic tick. This value represents the minimum number
+ * of ticks that is safe to specify in a timeout directive.
+ * The value one is not valid, timeouts are rounded up to
+ * this value.
+ */
+#if !defined(CH_CFG_ST_TIMEDELTA)
+#define CH_CFG_ST_TIMEDELTA 2
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel parameters and options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Round robin interval.
+ * @details This constant is the number of system ticks allowed for the
+ * threads before preemption occurs. Setting this value to zero
+ * disables the preemption for threads with equal priority and the
+ * round robin becomes cooperative. Note that higher priority
+ * threads can still preempt, the kernel is always preemptive.
+ * @note Disabling the round robin preemption makes the kernel more compact
+ * and generally faster.
+ * @note The round robin preemption is not supported in tickless mode and
+ * must be set to zero in that case.
+ */
+#if !defined(CH_CFG_TIME_QUANTUM)
+#define CH_CFG_TIME_QUANTUM 0
+#endif
+
+/**
+ * @brief Managed RAM size.
+ * @details Size of the RAM area to be managed by the OS. If set to zero
+ * then the whole available RAM is used. The core memory is made
+ * available to the heap allocator and/or can be used directly through
+ * the simplified core memory allocator.
+ *
+ * @note In order to let the OS manage the whole RAM the linker script must
+ * provide the @p __heap_base__ and @p __heap_end__ symbols.
+ * @note Requires @p CH_CFG_USE_MEMCORE.
+ */
+#if !defined(CH_CFG_MEMCORE_SIZE)
+#define CH_CFG_MEMCORE_SIZE 0
+#endif
+
+/**
+ * @brief Idle thread automatic spawn suppression.
+ * @details When this option is activated the function @p chSysInit()
+ * does not spawn the idle thread. The application @p main()
+ * function becomes the idle thread and must implement an
+ * infinite loop.
+ */
+#if !defined(CH_CFG_NO_IDLE_THREAD)
+#define CH_CFG_NO_IDLE_THREAD FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Performance options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief OS optimization.
+ * @details If enabled then time efficient rather than space efficient code
+ * is used when two possible implementations exist.
+ *
+ * @note This is not related to the compiler optimization options.
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_OPTIMIZE_SPEED)
+#define CH_CFG_OPTIMIZE_SPEED FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Subsystem options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Time Measurement APIs.
+ * @details If enabled then the time measurement APIs are included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_TM)
+#define CH_CFG_USE_TM FALSE
+#endif
+
+/**
+ * @brief Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_REGISTRY)
+#define CH_CFG_USE_REGISTRY TRUE
+#endif
+
+/**
+ * @brief Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_WAITEXIT)
+#define CH_CFG_USE_WAITEXIT TRUE
+#endif
+
+/**
+ * @brief Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES)
+#define CH_CFG_USE_SEMAPHORES TRUE
+#endif
+
+/**
+ * @brief Semaphores queuing mode.
+ * @details If enabled then the threads are enqueued on semaphores by
+ * priority rather than in FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_SEMAPHORES_PRIORITY)
+#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MUTEXES)
+#define CH_CFG_USE_MUTEXES TRUE
+#endif
+
+/**
+ * @brief Enables recursive behavior on mutexes.
+ * @note Recursive mutexes are heavier and have an increased
+ * memory footprint.
+ *
+ * @note The default is @p FALSE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_MUTEXES_RECURSIVE)
+#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
+#endif
+
+/**
+ * @brief Conditional Variables APIs.
+ * @details If enabled then the conditional variables APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MUTEXES.
+ */
+#if !defined(CH_CFG_USE_CONDVARS)
+#define CH_CFG_USE_CONDVARS TRUE
+#endif
+
+/**
+ * @brief Conditional Variables APIs with timeout.
+ * @details If enabled then the conditional variables APIs with timeout
+ * specification are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_CONDVARS.
+ */
+#if !defined(CH_CFG_USE_CONDVARS_TIMEOUT)
+#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
+#endif
+
+/**
+ * @brief Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_EVENTS)
+#define CH_CFG_USE_EVENTS TRUE
+#endif
+
+/**
+ * @brief Events Flags APIs with timeout.
+ * @details If enabled then the events APIs with timeout specification
+ * are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_EVENTS.
+ */
+#if !defined(CH_CFG_USE_EVENTS_TIMEOUT)
+#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MESSAGES)
+#define CH_CFG_USE_MESSAGES TRUE
+#endif
+
+/**
+ * @brief Synchronous Messages queuing mode.
+ * @details If enabled then messages are served by priority rather than in
+ * FIFO order.
+ *
+ * @note The default is @p FALSE. Enable this if you have special
+ * requirements.
+ * @note Requires @p CH_CFG_USE_MESSAGES.
+ */
+#if !defined(CH_CFG_USE_MESSAGES_PRIORITY)
+#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
+#endif
+
+/**
+ * @brief Mailboxes APIs.
+ * @details If enabled then the asynchronous messages (mailboxes) APIs are
+ * included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_SEMAPHORES.
+ */
+#if !defined(CH_CFG_USE_MAILBOXES)
+#define CH_CFG_USE_MAILBOXES TRUE
+#endif
+
+/**
+ * @brief Core Memory Manager APIs.
+ * @details If enabled then the core memory manager APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMCORE)
+#define CH_CFG_USE_MEMCORE TRUE
+#endif
+
+/**
+ * @brief Heap Allocator APIs.
+ * @details If enabled then the memory heap allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_MEMCORE and either @p CH_CFG_USE_MUTEXES or
+ * @p CH_CFG_USE_SEMAPHORES.
+ * @note Mutexes are recommended.
+ */
+#if !defined(CH_CFG_USE_HEAP)
+#define CH_CFG_USE_HEAP FALSE
+#endif
+
+/**
+ * @brief Memory Pools Allocator APIs.
+ * @details If enabled then the memory pools allocator APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_MEMPOOLS)
+#define CH_CFG_USE_MEMPOOLS FALSE
+#endif
+
+/**
+ * @brief Objects FIFOs APIs.
+ * @details If enabled then the objects FIFOs APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_OBJ_FIFOS)
+#define CH_CFG_USE_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Pipes APIs.
+ * @details If enabled then the pipes APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#if !defined(CH_CFG_USE_PIPES)
+#define CH_CFG_USE_PIPES FALSE
+#endif
+
+/**
+ * @brief Dynamic Threads APIs.
+ * @details If enabled then the dynamic threads creation APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ * @note Requires @p CH_CFG_USE_WAITEXIT.
+ * @note Requires @p CH_CFG_USE_HEAP and/or @p CH_CFG_USE_MEMPOOLS.
+ */
+#if !defined(CH_CFG_USE_DYNAMIC)
+#define CH_CFG_USE_DYNAMIC FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Objects factory options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Objects Factory APIs.
+ * @details If enabled then the objects factory APIs are included in the
+ * kernel.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_CFG_USE_FACTORY)
+#define CH_CFG_USE_FACTORY FALSE
+#endif
+
+/**
+ * @brief Maximum length for object names.
+ * @details If the specified length is zero then the name is stored by
+ * pointer but this could have unintended side effects.
+ */
+#if !defined(CH_CFG_FACTORY_MAX_NAMES_LENGTH)
+#define CH_CFG_FACTORY_MAX_NAMES_LENGTH 8
+#endif
+
+/**
+ * @brief Enables the registry of generic objects.
+ */
+#if !defined(CH_CFG_FACTORY_OBJECTS_REGISTRY)
+#define CH_CFG_FACTORY_OBJECTS_REGISTRY FALSE
+#endif
+
+/**
+ * @brief Enables factory for generic buffers.
+ */
+#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)
+#define CH_CFG_FACTORY_GENERIC_BUFFERS FALSE
+#endif
+
+/**
+ * @brief Enables factory for semaphores.
+ */
+#if !defined(CH_CFG_FACTORY_SEMAPHORES)
+#define CH_CFG_FACTORY_SEMAPHORES FALSE
+#endif
+
+/**
+ * @brief Enables factory for mailboxes.
+ */
+#if !defined(CH_CFG_FACTORY_MAILBOXES)
+#define CH_CFG_FACTORY_MAILBOXES FALSE
+#endif
+
+/**
+ * @brief Enables factory for objects FIFOs.
+ */
+#if !defined(CH_CFG_FACTORY_OBJ_FIFOS)
+#define CH_CFG_FACTORY_OBJ_FIFOS FALSE
+#endif
+
+/**
+ * @brief Enables factory for Pipes.
+ */
+#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)
+#define CH_CFG_FACTORY_PIPES FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Debug option, kernel statistics.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_STATISTICS)
+#define CH_DBG_STATISTICS FALSE
+#endif
+
+/**
+ * @brief Debug option, system state check.
+ * @details If enabled the correct call protocol for system APIs is checked
+ * at runtime.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_SYSTEM_STATE_CHECK)
+#define CH_DBG_SYSTEM_STATE_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, parameters checks.
+ * @details If enabled then the checks on the API functions input
+ * parameters are activated.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_CHECKS)
+#define CH_DBG_ENABLE_CHECKS FALSE
+#endif
+
+/**
+ * @brief Debug option, consistency checks.
+ * @details If enabled then all the assertions in the kernel code are
+ * activated. This includes consistency checks inside the kernel,
+ * runtime anomalies and port-defined checks.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_ENABLE_ASSERTS)
+#define CH_DBG_ENABLE_ASSERTS FALSE
+#endif
+
+/**
+ * @brief Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_MASK)
+#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
+#endif
+
+/**
+ * @brief Trace buffer entries.
+ * @note The trace buffer is only allocated if @p CH_DBG_TRACE_MASK is
+ * different from @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#if !defined(CH_DBG_TRACE_BUFFER_SIZE)
+#define CH_DBG_TRACE_BUFFER_SIZE 128
+#endif
+
+/**
+ * @brief Debug option, stack checks.
+ * @details If enabled then a runtime stack check is performed.
+ *
+ * @note The default is @p FALSE.
+ * @note The stack check is performed in a architecture/port dependent way.
+ * It may not be implemented or some ports.
+ * @note The default failure mode is to halt the system with the global
+ * @p panic_msg variable set to @p NULL.
+ */
+#if !defined(CH_DBG_ENABLE_STACK_CHECK)
+#define CH_DBG_ENABLE_STACK_CHECK FALSE
+#endif
+
+/**
+ * @brief Debug option, stacks initialization.
+ * @details If enabled then the threads working area is filled with a byte
+ * value when a thread is created. This can be useful for the
+ * runtime measurement of the used stack.
+ *
+ * @note The default is @p FALSE.
+ */
+#if !defined(CH_DBG_FILL_THREADS)
+#define CH_DBG_FILL_THREADS FALSE
+#endif
+
+/**
+ * @brief Debug option, threads profiling.
+ * @details If enabled then a field is added to the @p thread_t structure that
+ * counts the system ticks occurred while executing the thread.
+ *
+ * @note The default is @p FALSE.
+ * @note This debug option is not currently compatible with the
+ * tickless mode.
+ */
+#if !defined(CH_DBG_THREADS_PROFILING)
+#define CH_DBG_THREADS_PROFILING FALSE
+#endif
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System structure extension.
+ * @details User fields added to the end of the @p ch_system_t structure.
+ */
+#define CH_CFG_SYSTEM_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief System initialization hook.
+ * @details User initialization code added to the @p chSysInit() function
+ * just before interrupts are enabled globally.
+ */
+#define CH_CFG_SYSTEM_INIT_HOOK() { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads descriptor structure extension.
+ * @details User fields added to the end of the @p thread_t structure.
+ */
+#define CH_CFG_THREAD_EXTRA_FIELDS \
+ /* Add threads custom fields here.*/
+
+/**
+ * @brief Threads initialization hook.
+ * @details User initialization code added to the @p _thread_init() function.
+ *
+ * @note It is invoked from within @p _thread_init() and implicitly from all
+ * the threads creation APIs.
+ */
+#define CH_CFG_THREAD_INIT_HOOK(tp) { \
+ /* Add threads initialization code here.*/ \
+}
+
+/**
+ * @brief Threads finalization hook.
+ * @details User finalization code added to the @p chThdExit() API.
+ */
+#define CH_CFG_THREAD_EXIT_HOOK(tp) { \
+ /* Add threads finalization code here.*/ \
+}
+
+/**
+ * @brief Context switch hook.
+ * @details This hook is invoked just before switching between threads.
+ */
+#define CH_CFG_CONTEXT_SWITCH_HOOK(ntp, otp) { \
+ /* Context switch code here.*/ \
+}
+
+/**
+ * @brief ISR enter hook.
+ */
+#define CH_CFG_IRQ_PROLOGUE_HOOK() { \
+ /* IRQ prologue code here.*/ \
+}
+
+/**
+ * @brief ISR exit hook.
+ */
+#define CH_CFG_IRQ_EPILOGUE_HOOK() { \
+ /* IRQ epilogue code here.*/ \
+}
+
+/**
+ * @brief Idle thread enter hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to activate a power saving mode.
+ */
+#define CH_CFG_IDLE_ENTER_HOOK() { \
+ /* Idle-enter code here.*/ \
+}
+
+/**
+ * @brief Idle thread leave hook.
+ * @note This hook is invoked within a critical zone, no OS functions
+ * should be invoked from here.
+ * @note This macro can be used to deactivate a power saving mode.
+ */
+#define CH_CFG_IDLE_LEAVE_HOOK() { \
+ /* Idle-leave code here.*/ \
+}
+
+/**
+ * @brief Idle Loop hook.
+ * @details This hook is continuously invoked by the idle thread loop.
+ */
+#define CH_CFG_IDLE_LOOP_HOOK() { \
+ /* Idle loop code here.*/ \
+}
+
+/**
+ * @brief System tick event hook.
+ * @details This hook is invoked in the system tick handler immediately
+ * after processing the virtual timers queue.
+ */
+#define CH_CFG_SYSTEM_TICK_HOOK() { \
+ /* System tick event code here.*/ \
+}
+
+/**
+ * @brief System halt hook.
+ * @details This hook is invoked in case to a system halting error before
+ * the system is halted.
+ */
+#define CH_CFG_SYSTEM_HALT_HOOK(reason) { \
+ /* System halt code here.*/ \
+}
+
+/**
+ * @brief Trace hook.
+ * @details This hook is invoked each time a new record is written in the
+ * trace buffer.
+ */
+#define CH_CFG_TRACE_HOOK(tep) { \
+ /* Trace code here.*/ \
+}
+
+/** @} */
+
+/*===========================================================================*/
+/* Port-specific settings (override port settings defaulted in chcore.h). */
+/*===========================================================================*/
+
+#endif /* CHCONF_H */
+
+/** @} */
diff --git a/keyboards/keebio/choconum/choconum.c b/keyboards/keebio/choconum/choconum.c
new file mode 100644
index 00000000000..5360a716d78
--- /dev/null
+++ b/keyboards/keebio/choconum/choconum.c
@@ -0,0 +1 @@
+#include "choconum.h"
diff --git a/keyboards/keebio/choconum/choconum.h b/keyboards/keebio/choconum/choconum.h
new file mode 100644
index 00000000000..e77c5886ec4
--- /dev/null
+++ b/keyboards/keebio/choconum/choconum.h
@@ -0,0 +1,49 @@
+/* Copyright 2020 Keebio
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_ortho_5x4( \
+ KA1, KA2, KA3, KA4, \
+ KB1, KB2, KB3, KB4, \
+ KC1, KC2, KC3, KC4, \
+ KD1, KD2, KD3, KD4, \
+ KE1, KE2, KE3, KE4 \
+) \
+{ \
+ { KA1, KA2, KA3, KA4 }, \
+ { KB1, KB2, KB3, KB4 }, \
+ { KC1, KC2, KC3, KC4 }, \
+ { KD1, KD2, KD3, KD4 }, \
+ { KE1, KE2, KE3, KE4 } \
+}
+
+#define LAYOUT_numpad_5x4( \
+ KA1, KA2, KA3, KA4, \
+ KB1, KB2, KB3, KB4, \
+ KC1, KC2, KC3, \
+ KD1, KD2, KD3, KD4, \
+ KE1, KE3 \
+) \
+{ \
+ { KA1, KA2, KA3, KA4 }, \
+ { KB1, KB2, KB3, KB4 }, \
+ { KC1, KC2, KC3, KC_NO }, \
+ { KD1, KD2, KD3, KD4 }, \
+ { KE1, KC_NO, KE3, KC_NO } \
+}
diff --git a/keyboards/keebio/choconum/config.h b/keyboards/keebio/choconum/config.h
new file mode 100644
index 00000000000..d3a0da168b2
--- /dev/null
+++ b/keyboards/keebio/choconum/config.h
@@ -0,0 +1,206 @@
+/*
+Copyright 2020 Keebio
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xCB10
+#define PRODUCT_ID 0x1154
+#define DEVICE_VER 0x0100
+#define MANUFACTURER Keebio
+#define PRODUCT Choconum
+#define DESCRIPTION Low-Profile Numpad
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 4
+#define DIRECT_PINS { \
+ { B2, B10, B3, B4 }, \
+ { B1, B11, A15, B5 }, \
+ { B0, A5, B7, F0 }, \
+ { A7, A6, B8, B6 }, \
+ { A4, A3, B9, F1 } \
+}
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+#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 userful 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
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+/* defined by default; to change, uncomment and set to the combination you want */
+// #define IS_COMMAND() (get_mods() == MOD_MASK_SHIFT)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP H
+//#define MAGIC_KEY_HELP_ALT SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER0_ALT GRAVE
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER B
+//#define MAGIC_KEY_BOOTLOADER_ALT ESC
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_EEPROM_CLEAR BSPACE
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+
+/* disable these deprecated features by default */
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
+/*
+ * MIDI options
+ */
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+//#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 1
+
+/*
+ * 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
+*/
+
+/* Bootmagic Lite key configuration */
+// #define BOOTMAGIC_LITE_ROW 0
+// #define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/keebio/choconum/halconf.h b/keyboards/keebio/choconum/halconf.h
new file mode 100644
index 00000000000..ff5ae7e8a5f
--- /dev/null
+++ b/keyboards/keebio/choconum/halconf.h
@@ -0,0 +1,525 @@
+/*
+ ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+/**
+ * @file templates/halconf.h
+ * @brief HAL configuration header.
+ * @details HAL configuration file, this file allows to enable or disable the
+ * various device drivers from your application. You may also use
+ * this file in order to override the device drivers default settings.
+ *
+ * @addtogroup HAL_CONF
+ * @{
+ */
+
+#ifndef HALCONF_H
+#define HALCONF_H
+
+#define _CHIBIOS_HAL_CONF_
+#define _CHIBIOS_HAL_CONF_VER_7_0_
+
+#include "mcuconf.h"
+
+/**
+ * @brief Enables the PAL subsystem.
+ */
+#if !defined(HAL_USE_PAL) || defined(__DOXYGEN__)
+#define HAL_USE_PAL TRUE
+#endif
+
+/**
+ * @brief Enables the ADC subsystem.
+ */
+#if !defined(HAL_USE_ADC) || defined(__DOXYGEN__)
+#define HAL_USE_ADC FALSE
+#endif
+
+/**
+ * @brief Enables the CAN subsystem.
+ */
+#if !defined(HAL_USE_CAN) || defined(__DOXYGEN__)
+#define HAL_USE_CAN FALSE
+#endif
+
+/**
+ * @brief Enables the cryptographic subsystem.
+ */
+#if !defined(HAL_USE_CRY) || defined(__DOXYGEN__)
+#define HAL_USE_CRY FALSE
+#endif
+
+/**
+ * @brief Enables the DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC FALSE
+#endif
+
+/**
+ * @brief Enables the GPT subsystem.
+ */
+#if !defined(HAL_USE_GPT) || defined(__DOXYGEN__)
+#define HAL_USE_GPT FALSE
+#endif
+
+/**
+ * @brief Enables the I2C subsystem.
+ */
+#if !defined(HAL_USE_I2C) || defined(__DOXYGEN__)
+#define HAL_USE_I2C FALSE
+#endif
+
+/**
+ * @brief Enables the I2S subsystem.
+ */
+#if !defined(HAL_USE_I2S) || defined(__DOXYGEN__)
+#define HAL_USE_I2S FALSE
+#endif
+
+/**
+ * @brief Enables the ICU subsystem.
+ */
+#if !defined(HAL_USE_ICU) || defined(__DOXYGEN__)
+#define HAL_USE_ICU FALSE
+#endif
+
+/**
+ * @brief Enables the MAC subsystem.
+ */
+#if !defined(HAL_USE_MAC) || defined(__DOXYGEN__)
+#define HAL_USE_MAC FALSE
+#endif
+
+/**
+ * @brief Enables the MMC_SPI subsystem.
+ */
+#if !defined(HAL_USE_MMC_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_MMC_SPI FALSE
+#endif
+
+/**
+ * @brief Enables the PWM subsystem.
+ */
+#if !defined(HAL_USE_PWM) || defined(__DOXYGEN__)
+#define HAL_USE_PWM TRUE
+#endif
+
+/**
+ * @brief Enables the RTC subsystem.
+ */
+#if !defined(HAL_USE_RTC) || defined(__DOXYGEN__)
+#define HAL_USE_RTC FALSE
+#endif
+
+/**
+ * @brief Enables the SDC subsystem.
+ */
+#if !defined(HAL_USE_SDC) || defined(__DOXYGEN__)
+#define HAL_USE_SDC FALSE
+#endif
+
+/**
+ * @brief Enables the SERIAL subsystem.
+ */
+#if !defined(HAL_USE_SERIAL) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL FALSE
+#endif
+
+/**
+ * @brief Enables the SERIAL over USB subsystem.
+ */
+#if !defined(HAL_USE_SERIAL_USB) || defined(__DOXYGEN__)
+#define HAL_USE_SERIAL_USB FALSE
+#endif
+
+/**
+ * @brief Enables the SIO subsystem.
+ */
+#if !defined(HAL_USE_SIO) || defined(__DOXYGEN__)
+#define HAL_USE_SIO FALSE
+#endif
+
+/**
+ * @brief Enables the SPI subsystem.
+ */
+#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_SPI FALSE
+#endif
+
+/**
+ * @brief Enables the TRNG subsystem.
+ */
+#if !defined(HAL_USE_TRNG) || defined(__DOXYGEN__)
+#define HAL_USE_TRNG FALSE
+#endif
+
+/**
+ * @brief Enables the UART subsystem.
+ */
+#if !defined(HAL_USE_UART) || defined(__DOXYGEN__)
+#define HAL_USE_UART FALSE
+#endif
+
+/**
+ * @brief Enables the USB subsystem.
+ */
+#if !defined(HAL_USE_USB) || defined(__DOXYGEN__)
+#define HAL_USE_USB TRUE
+#endif
+
+/**
+ * @brief Enables the WDG subsystem.
+ */
+#if !defined(HAL_USE_WDG) || defined(__DOXYGEN__)
+#define HAL_USE_WDG FALSE
+#endif
+
+/**
+ * @brief Enables the WSPI subsystem.
+ */
+#if !defined(HAL_USE_WSPI) || defined(__DOXYGEN__)
+#define HAL_USE_WSPI FALSE
+#endif
+
+/*===========================================================================*/
+/* PAL driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define PAL_USE_CALLBACKS FALSE
+#endif
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__)
+#define PAL_USE_WAIT FALSE
+#endif
+
+/*===========================================================================*/
+/* ADC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_WAIT) || defined(__DOXYGEN__)
+#define ADC_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p adcAcquireBus() and @p adcReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(ADC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define ADC_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* CAN driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Sleep mode related APIs inclusion switch.
+ */
+#if !defined(CAN_USE_SLEEP_MODE) || defined(__DOXYGEN__)
+#define CAN_USE_SLEEP_MODE TRUE
+#endif
+
+/**
+ * @brief Enforces the driver to use direct callbacks rather than OSAL events.
+ */
+#if !defined(CAN_ENFORCE_USE_CALLBACKS) || defined(__DOXYGEN__)
+#define CAN_ENFORCE_USE_CALLBACKS FALSE
+#endif
+
+/*===========================================================================*/
+/* CRY driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the SW fall-back of the cryptographic driver.
+ * @details When enabled, this option, activates a fall-back software
+ * implementation for algorithms not supported by the underlying
+ * hardware.
+ * @note Fall-back implementations may not be present for all algorithms.
+ */
+#if !defined(HAL_CRY_USE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_USE_FALLBACK FALSE
+#endif
+
+/**
+ * @brief Makes the driver forcibly use the fall-back implementations.
+ */
+#if !defined(HAL_CRY_ENFORCE_FALLBACK) || defined(__DOXYGEN__)
+#define HAL_CRY_ENFORCE_FALLBACK FALSE
+#endif
+
+/*===========================================================================*/
+/* DAC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_WAIT) || defined(__DOXYGEN__)
+#define DAC_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p dacAcquireBus() and @p dacReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(DAC_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define DAC_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* I2C driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the mutual exclusion APIs on the I2C bus.
+ */
+#if !defined(I2C_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define I2C_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/*===========================================================================*/
+/* MAC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables the zero-copy API.
+ */
+#if !defined(MAC_USE_ZERO_COPY) || defined(__DOXYGEN__)
+#define MAC_USE_ZERO_COPY FALSE
+#endif
+
+/**
+ * @brief Enables an event sources for incoming packets.
+ */
+#if !defined(MAC_USE_EVENTS) || defined(__DOXYGEN__)
+#define MAC_USE_EVENTS TRUE
+#endif
+
+/*===========================================================================*/
+/* MMC_SPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ * This option is recommended also if the SPI driver does not
+ * use a DMA channel and heavily loads the CPU.
+ */
+#if !defined(MMC_NICE_WAITING) || defined(__DOXYGEN__)
+#define MMC_NICE_WAITING TRUE
+#endif
+
+/*===========================================================================*/
+/* SDC driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Number of initialization attempts before rejecting the card.
+ * @note Attempts are performed at 10mS intervals.
+ */
+#if !defined(SDC_INIT_RETRY) || defined(__DOXYGEN__)
+#define SDC_INIT_RETRY 100
+#endif
+
+/**
+ * @brief Include support for MMC cards.
+ * @note MMC support is not yet implemented so this option must be kept
+ * at @p FALSE.
+ */
+#if !defined(SDC_MMC_SUPPORT) || defined(__DOXYGEN__)
+#define SDC_MMC_SUPPORT FALSE
+#endif
+
+/**
+ * @brief Delays insertions.
+ * @details If enabled this options inserts delays into the MMC waiting
+ * routines releasing some extra CPU time for the threads with
+ * lower priority, this may slow down the driver a bit however.
+ */
+#if !defined(SDC_NICE_WAITING) || defined(__DOXYGEN__)
+#define SDC_NICE_WAITING TRUE
+#endif
+
+/**
+ * @brief OCR initialization constant for V20 cards.
+ */
+#if !defined(SDC_INIT_OCR_V20) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR_V20 0x50FF8000U
+#endif
+
+/**
+ * @brief OCR initialization constant for non-V20 cards.
+ */
+#if !defined(SDC_INIT_OCR) || defined(__DOXYGEN__)
+#define SDC_INIT_OCR 0x80100000U
+#endif
+
+/*===========================================================================*/
+/* SERIAL driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Default bit rate.
+ * @details Configuration parameter, this is the baud rate selected for the
+ * default configuration.
+ */
+#if !defined(SERIAL_DEFAULT_BITRATE) || defined(__DOXYGEN__)
+#define SERIAL_DEFAULT_BITRATE 38400
+#endif
+
+/**
+ * @brief Serial buffers size.
+ * @details Configuration parameter, you can change the depth of the queue
+ * buffers depending on the requirements of your application.
+ * @note The default is 16 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_BUFFERS_SIZE 16
+#endif
+
+/*===========================================================================*/
+/* SERIAL_USB driver related setting. */
+/*===========================================================================*/
+
+/**
+ * @brief Serial over USB buffers size.
+ * @details Configuration parameter, the buffer size must be a multiple of
+ * the USB data endpoint maximum packet size.
+ * @note The default is 256 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_SIZE 1
+#endif
+
+/**
+ * @brief Serial over USB number of buffers.
+ * @note The default is 2 buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_NUMBER) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_NUMBER 2
+#endif
+
+/*===========================================================================*/
+/* SPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_WAIT) || defined(__DOXYGEN__)
+#define SPI_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables circular transfers APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_CIRCULAR) || defined(__DOXYGEN__)
+#define SPI_USE_CIRCULAR FALSE
+#endif
+
+
+/**
+ * @brief Enables the @p spiAcquireBus() and @p spiReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define SPI_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+/**
+ * @brief Handling method for SPI CS line.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(SPI_SELECT_MODE) || defined(__DOXYGEN__)
+#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD
+#endif
+
+/*===========================================================================*/
+/* UART driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_WAIT) || defined(__DOXYGEN__)
+#define UART_USE_WAIT FALSE
+#endif
+
+/**
+ * @brief Enables the @p uartAcquireBus() and @p uartReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(UART_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define UART_USE_MUTUAL_EXCLUSION FALSE
+#endif
+
+/*===========================================================================*/
+/* USB driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
+#define USB_USE_WAIT TRUE
+#endif
+
+/*===========================================================================*/
+/* WSPI driver related settings. */
+/*===========================================================================*/
+
+/**
+ * @brief Enables synchronous APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_WAIT) || defined(__DOXYGEN__)
+#define WSPI_USE_WAIT TRUE
+#endif
+
+/**
+ * @brief Enables the @p wspiAcquireBus() and @p wspiReleaseBus() APIs.
+ * @note Disabling this option saves both code and data space.
+ */
+#if !defined(WSPI_USE_MUTUAL_EXCLUSION) || defined(__DOXYGEN__)
+#define WSPI_USE_MUTUAL_EXCLUSION TRUE
+#endif
+
+#endif /* HALCONF_H */
+
+/** @} */
diff --git a/keyboards/keebio/choconum/info.json b/keyboards/keebio/choconum/info.json
new file mode 100644
index 00000000000..8886235667b
--- /dev/null
+++ b/keyboards/keebio/choconum/info.json
@@ -0,0 +1,64 @@
+{
+ "keyboard_name": "Choconum",
+ "url": "https://keeb.io",
+ "maintainer": "Keebio",
+ "width": 5,
+ "height": 4,
+ "layouts": {
+ "LAYOUT_numpad_5x4": {
+ "key_count": 17,
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+
+ {"x":0, "y":1},
+ {"x":1, "y":1},
+ {"x":2, "y":1},
+ {"x":3, "y":1, "h":2},
+
+ {"x":0, "y":2},
+ {"x":1, "y":2},
+ {"x":2, "y":2},
+
+ {"x":0, "y":3},
+ {"x":1, "y":3},
+ {"x":2, "y":3},
+ {"x":3, "y":3, "h":2},
+
+ {"x":0, "y":4,"w":2},
+ {"x":2, "y":4}
+ ]
+ },
+ "LAYOUT_ortho_5x4": {
+ "key_count": 20,
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+
+ {"x":0, "y":1},
+ {"x":1, "y":1},
+ {"x":2, "y":1},
+ {"x":3, "y":1},
+
+ {"x":0, "y":2},
+ {"x":1, "y":2},
+ {"x":2, "y":2},
+ {"x":3, "y":2},
+
+ {"x":0, "y":3},
+ {"x":1, "y":3},
+ {"x":2, "y":3},
+ {"x":3, "y":3},
+
+ {"x":0, "y":4},
+ {"x":1, "y":4},
+ {"x":2, "y":4},
+ {"x":3, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/keebio/choconum/keymaps/default/keymap.c b/keyboards/keebio/choconum/keymaps/default/keymap.c
new file mode 100644
index 00000000000..d6f0af3c8c7
--- /dev/null
+++ b/keyboards/keebio/choconum/keymaps/default/keymap.c
@@ -0,0 +1,40 @@
+/* Copyright 2020 Keebio
+ *
+ * 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 .
+ */
+#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_numpad_5x4(
+ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_P4, KC_P5, KC_P6,
+ KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_P0, KC_PDOT
+ ),
+ [_FN] = LAYOUT_numpad_5x4(
+ _______, _______, _______, _______,
+ KC_HOME, KC_UP, KC_PGUP, _______,
+ KC_LEFT, _______, KC_RGHT,
+ KC_END, KC_DOWN, KC_PGDN, KC_PEQL,
+ KC_INS, KC_DEL
+ )
+};
diff --git a/keyboards/keebio/choconum/keymaps/via/keymap.c b/keyboards/keebio/choconum/keymaps/via/keymap.c
new file mode 100644
index 00000000000..fec5e59e700
--- /dev/null
+++ b/keyboards/keebio/choconum/keymaps/via/keymap.c
@@ -0,0 +1,48 @@
+/* Copyright 2020 Keebio
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Base */
+ [0] = LAYOUT_ortho_5x4(
+ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_P4, KC_P5, KC_P6, KC_PEQL,
+ KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_P0, KC_P0, KC_PDOT, KC_PENT
+ ),
+ [1] = LAYOUT_ortho_5x4(
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______
+ ),
+ [2] = LAYOUT_ortho_5x4(
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______
+ ),
+ [3] = LAYOUT_ortho_5x4(
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/keebio/choconum/keymaps/via/readme.md b/keyboards/keebio/choconum/keymaps/via/readme.md
new file mode 100644
index 00000000000..58d53f0dfef
--- /dev/null
+++ b/keyboards/keebio/choconum/keymaps/via/readme.md
@@ -0,0 +1 @@
+# The default keymap for choconum
diff --git a/keyboards/keebio/choconum/keymaps/via/rules.mk b/keyboards/keebio/choconum/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/keebio/choconum/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/keebio/choconum/mcuconf.h b/keyboards/keebio/choconum/mcuconf.h
new file mode 100644
index 00000000000..0e49478c8b0
--- /dev/null
+++ b/keyboards/keebio/choconum/mcuconf.h
@@ -0,0 +1,176 @@
+/*
+ ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+#ifndef _MCUCONF_H_
+#define _MCUCONF_H_
+
+/*
+ * STM32F0xx drivers configuration.
+ * The following settings override the default settings present in
+ * the various device driver implementation headers.
+ * Note that the settings for each driver only have effect if the whole
+ * driver is enabled in halconf.h.
+ *
+ * IRQ priorities:
+ * 3...0 Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3 Lowest...Highest.
+ */
+
+#define STM32F0xx_MCUCONF
+// #define STM32F070xB
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT FALSE
+#define STM32_PVD_ENABLE FALSE
+#define STM32_PLS STM32_PLS_LEV0
+#define STM32_HSI_ENABLED TRUE
+#define STM32_HSI14_ENABLED TRUE
+#define STM32_HSI48_ENABLED FALSE
+#define STM32_LSI_ENABLED TRUE
+#define STM32_HSE_ENABLED FALSE
+#define STM32_LSE_ENABLED FALSE
+#define STM32_SW STM32_SW_PLL
+#define STM32_PLLSRC STM32_PLLSRC_HSI_DIV2
+#define STM32_PREDIV_VALUE 1
+#define STM32_PLLMUL_VALUE 12
+#define STM32_HPRE STM32_HPRE_DIV1
+#define STM32_PPRE STM32_PPRE_DIV1
+#define STM32_ADCSW STM32_ADCSW_HSI14
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_ADCSW STM32_ADCSW_HSI14
+#define STM32_USBSW STM32_USBSW_HSI48
+#define STM32_CECSW STM32_CECSW_HSI
+#define STM32_I2C1SW STM32_I2C1SW_HSI
+#define STM32_USART1SW STM32_USART1SW_PCLK
+#define STM32_RTCSEL STM32_RTCSEL_LSI
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_USE_ADC1 FALSE
+#define STM32_ADC_ADC1_DMA_PRIORITY 2
+#define STM32_ADC_IRQ_PRIORITY 2
+#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 2
+
+/*
+ * EXT driver system settings.
+ */
+#define STM32_EXT_EXTI0_1_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI2_3_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI4_15_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI16_IRQ_PRIORITY 3
+#define STM32_EXT_EXTI17_IRQ_PRIORITY 3
+
+/*
+ * GPT driver system settings.
+ */
+#define STM32_GPT_USE_TIM1 FALSE
+#define STM32_GPT_USE_TIM2 FALSE
+#define STM32_GPT_USE_TIM3 FALSE
+#define STM32_GPT_USE_TIM14 FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY 2
+#define STM32_GPT_TIM2_IRQ_PRIORITY 2
+#define STM32_GPT_TIM3_IRQ_PRIORITY 2
+#define STM32_GPT_TIM14_IRQ_PRIORITY 2
+
+/*
+ * I2C driver system settings.
+ */
+#define STM32_I2C_USE_I2C1 FALSE
+#define STM32_I2C_USE_I2C2 FALSE
+#define STM32_I2C_BUSY_TIMEOUT 50
+#define STM32_I2C_I2C1_IRQ_PRIORITY 3
+#define STM32_I2C_I2C2_IRQ_PRIORITY 3
+#define STM32_I2C_USE_DMA TRUE
+#define STM32_I2C_I2C1_DMA_PRIORITY 1
+#define STM32_I2C_I2C2_DMA_PRIORITY 1
+#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
+#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6)
+#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure")
+
+/*
+ * ICU driver system settings.
+ */
+#define STM32_ICU_USE_TIM1 FALSE
+#define STM32_ICU_USE_TIM2 FALSE
+#define STM32_ICU_USE_TIM3 FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY 3
+#define STM32_ICU_TIM2_IRQ_PRIORITY 3
+#define STM32_ICU_TIM3_IRQ_PRIORITY 3
+
+/*
+ * PWM driver system settings.
+ */
+#define STM32_PWM_USE_ADVANCED FALSE
+#define STM32_PWM_USE_TIM1 FALSE
+#define STM32_PWM_USE_TIM2 FALSE
+#define STM32_PWM_USE_TIM3 TRUE
+#define STM32_PWM_TIM1_IRQ_PRIORITY 3
+#define STM32_PWM_TIM2_IRQ_PRIORITY 3
+#define STM32_PWM_TIM3_IRQ_PRIORITY 3
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1 FALSE
+#define STM32_SERIAL_USE_USART2 FALSE
+#define STM32_SERIAL_USART1_PRIORITY 3
+#define STM32_SERIAL_USART2_PRIORITY 3
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1 FALSE
+#define STM32_SPI_USE_SPI2 FALSE
+#define STM32_SPI_SPI1_DMA_PRIORITY 1
+#define STM32_SPI_SPI2_DMA_PRIORITY 1
+#define STM32_SPI_SPI1_IRQ_PRIORITY 2
+#define STM32_SPI_SPI2_IRQ_PRIORITY 2
+#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5)
+#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY 2
+#define STM32_ST_USE_TIMER 2
+
+/*
+ * UART driver system settings.
+ */
+#define STM32_UART_USE_USART1 FALSE
+#define STM32_UART_USE_USART2 FALSE
+#define STM32_UART_USART1_IRQ_PRIORITY 3
+#define STM32_UART_USART2_IRQ_PRIORITY 3
+#define STM32_UART_USART1_DMA_PRIORITY 0
+#define STM32_UART_USART2_DMA_PRIORITY 0
+#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure")
+
+/*
+ * USB driver system settings.
+ */
+#define STM32_USB_USE_USB1 TRUE
+#define STM32_USB_LOW_POWER_ON_SUSPEND FALSE
+#define STM32_USB_USB1_LP_IRQ_PRIORITY 3
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/keebio/choconum/readme.md b/keyboards/keebio/choconum/readme.md
new file mode 100644
index 00000000000..7c2f70001ea
--- /dev/null
+++ b/keyboards/keebio/choconum/readme.md
@@ -0,0 +1,18 @@
+# Choconum
+
+
+
+A numpad for Kailh Choc switches
+
+* Keyboard Maintainer: [Keebio](https://github.com/nooges)
+* Hardware Availability: [Keebio - Choconum](https://keeb.io/products/choconum-kailh-choc-numpad)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make keebio/choconum:default
+
+Example of flashing this keyboard:
+
+ make keebio/choconum: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).
diff --git a/keyboards/keebio/choconum/rules.mk b/keyboards/keebio/choconum/rules.mk
new file mode 100644
index 00000000000..9e754e09a94
--- /dev/null
+++ b/keyboards/keebio/choconum/rules.mk
@@ -0,0 +1,27 @@
+# MCU name
+MCU = STM32F072
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+
+LAYOUTS = ortho_5x4 numpad_5x4
+
+# Enter lower-power sleep mode when on the ChibiOS idle thread
+OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
diff --git a/keyboards/keebio/chocopad/chocopad.c b/keyboards/keebio/chocopad/chocopad.c
index f54753af506..db62f02cc58 100644
--- a/keyboards/keebio/chocopad/chocopad.c
+++ b/keyboards/keebio/chocopad/chocopad.c
@@ -1 +1,18 @@
#include "chocopad.h"
+
+void eeconfig_init_kb(void) {
+#ifdef BACKLIGHT_ENABLE
+ backlight_enable();
+ backlight_level(5);
+#endif
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(0, 255, 255); // Set default HSV - red hue, full saturation, full brightness
+#ifdef RGBLIGHT_ANIMATIONS
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2); // set to RGB_RAINBOW_SWIRL by default
+#endif
+#endif
+
+ eeconfig_update_kb(0);
+ eeconfig_init_user();
+}
diff --git a/keyboards/keebio/dilly/dilly.c b/keyboards/keebio/dilly/dilly.c
index 89affe85094..da17277f69f 100644
--- a/keyboards/keebio/dilly/dilly.c
+++ b/keyboards/keebio/dilly/dilly.c
@@ -1 +1,18 @@
#include "dilly.h"
+
+void eeconfig_init_kb(void) {
+#ifdef BACKLIGHT_ENABLE
+ backlight_enable();
+ backlight_level(3);
+#endif
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(0, 255, 255); // Set default HSV - red hue, full saturation, full brightness
+#ifdef RGBLIGHT_ANIMATIONS
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2); // set to RGB_RAINBOW_SWIRL by default
+#endif
+#endif
+
+ eeconfig_update_kb(0);
+ eeconfig_init_user();
+}
diff --git a/keyboards/keebio/ergodicity/ergodicity.c b/keyboards/keebio/ergodicity/ergodicity.c
index 0bbcf611784..790dc2f61ef 100644
--- a/keyboards/keebio/ergodicity/ergodicity.c
+++ b/keyboards/keebio/ergodicity/ergodicity.c
@@ -1,51 +1,18 @@
-/* Copyright 2019 Keebio
- *
- * 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 .
- */
#include "ergodicity.h"
-// Optional override functions below.
-// You can leave any or all of these undefined.
-// These are only required if you want to perform custom actions.
+void eeconfig_init_kb(void) {
+#ifdef BACKLIGHT_ENABLE
+ backlight_enable();
+ backlight_level(5);
+#endif
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(0, 255, 255); // Set default HSV - red hue, full saturation, full brightness
+#ifdef RGBLIGHT_ANIMATIONS
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2); // set to RGB_RAINBOW_SWIRL by default
+#endif
+#endif
-/*
-
-void matrix_init_kb(void) {
- // put your keyboard start-up code here
- // runs once when the firmware starts up
-
- matrix_init_user();
+ eeconfig_update_kb(0);
+ eeconfig_init_user();
}
-
-void matrix_scan_kb(void) {
- // put your looping keyboard code here
- // runs every cycle (a lot)
-
- matrix_scan_user();
-}
-
-bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
- // put your per-action keyboard code here
- // runs for every action, just before processing by the firmware
-
- return process_record_user(keycode, record);
-}
-
-void led_set_kb(uint8_t usb_led) {
- // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
-
- led_set_user(usb_led);
-}
-
-*/
diff --git a/keyboards/keebio/iris/keymaps/333fred/config.h b/keyboards/keebio/iris/keymaps/333fred/config.h
index 8a866b826d8..c3997b0f47a 100644
--- a/keyboards/keebio/iris/keymaps/333fred/config.h
+++ b/keyboards/keebio/iris/keymaps/333fred/config.h
@@ -1,7 +1,5 @@
#pragma once
-#include "333fred_config.h"
-
#define USE_SERIAL
#define EE_HANDS
#define NO_ACTION_MACRO
diff --git a/keyboards/keebio/iris/keymaps/333fred/rules.mk b/keyboards/keebio/iris/keymaps/333fred/rules.mk
index 2b5da5a22fb..995272e2f22 100644
--- a/keyboards/keebio/iris/keymaps/333fred/rules.mk
+++ b/keyboards/keebio/iris/keymaps/333fred/rules.mk
@@ -1,7 +1,4 @@
-NKRO_ENABLE = yes
KEY_LOCK_ENABLE = yes
-TAP_DANCE_ENABLE = yes
CONSOLE_ENABLE = no
-PERMISSIVE_HOLD = yes
EXTRAFLAGS += -flto
diff --git a/keyboards/keebio/iris/keymaps/default/config.h b/keyboards/keebio/iris/keymaps/default/config.h
index 01bb31a6e14..149a54be7fa 100644
--- a/keyboards/keebio/iris/keymaps/default/config.h
+++ b/keyboards/keebio/iris/keymaps/default/config.h
@@ -19,10 +19,3 @@ along with this program. If not, see .
// #define USE_I2C
#define EE_HANDS
-
-#undef RGBLED_NUM
-#define RGBLIGHT_ANIMATIONS
-#define RGBLED_NUM 12
-#define RGBLIGHT_HUE_STEP 8
-#define RGBLIGHT_SAT_STEP 8
-#define RGBLIGHT_VAL_STEP 8
diff --git a/keyboards/keebio/iris/keymaps/dvorak/config.h b/keyboards/keebio/iris/keymaps/dvorak/config.h
new file mode 100644
index 00000000000..d37d3c3123c
--- /dev/null
+++ b/keyboards/keebio/iris/keymaps/dvorak/config.h
@@ -0,0 +1,33 @@
+/*
+Copyright 2017 Danny Nguyen
+
+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 .
+*/
+
+#pragma once
+
+/* Use I2C or Serial, not both */
+
+#define USE_SERIAL
+
+/* Select hand configuration */
+
+#define MASTER_LEFT
+
+#undef RGBLED_NUM
+#define RGBLIGHT_ANIMATIONS
+#define RGBLED_NUM 12
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
diff --git a/keyboards/keebio/iris/keymaps/dvorak/keebio_iris_rev2_layout_dvorak.json b/keyboards/keebio/iris/keymaps/dvorak/keebio_iris_rev2_layout_dvorak.json
new file mode 100644
index 00000000000..be5cc37938c
--- /dev/null
+++ b/keyboards/keebio/iris/keymaps/dvorak/keebio_iris_rev2_layout_dvorak.json
@@ -0,0 +1,192 @@
+{
+ "author": "",
+ "layers": [
+ [
+ "KC_ESC",
+ "KC_1",
+ "KC_2",
+ "KC_3",
+ "KC_4",
+ "KC_5",
+ "KC_6",
+ "KC_7",
+ "KC_8",
+ "KC_9",
+ "KC_0",
+ "KC_BSPC",
+ "KC_TAB",
+ "KC_QUOT",
+ "KC_COMM",
+ "KC_DOT",
+ "KC_P",
+ "KC_Y",
+ "KC_F",
+ "KC_G",
+ "KC_C",
+ "KC_R",
+ "KC_L",
+ "KC_SLSH",
+ "KC_LCTL",
+ "KC_A",
+ "KC_O",
+ "KC_E",
+ "KC_U",
+ "KC_I",
+ "KC_D",
+ "KC_H",
+ "KC_T",
+ "KC_N",
+ "KC_S",
+ "KC_MINS",
+ "KC_LSFT",
+ "KC_SCLN",
+ "KC_Q",
+ "KC_J",
+ "KC_K",
+ "KC_X",
+ "KC_HOME",
+ "KC_END",
+ "KC_B",
+ "KC_M",
+ "KC_W",
+ "KC_V",
+ "KC_Z",
+ "KC_RSFT",
+ "MO(1)",
+ "KC_LGUI",
+ "KC_ENT",
+ "KC_SPC",
+ "KC_RALT",
+ "MO(2)"
+ ],
+ [
+ "KC_TILD",
+ "KC_EXLM",
+ "KC_AT",
+ "KC_HASH",
+ "KC_DLR",
+ "KC_PERC",
+ "KC_CIRC",
+ "KC_AMPR",
+ "KC_ASTR",
+ "KC_LPRN",
+ "KC_RPRN",
+ "KC_BSPC",
+ "RESET",
+ "KC_1",
+ "KC_2",
+ "KC_3",
+ "KC_4",
+ "KC_5",
+ "KC_6",
+ "KC_7",
+ "KC_8",
+ "KC_9",
+ "KC_0",
+ "KC_GRV",
+ "KC_DEL",
+ "KC_NO",
+ "KC_LEFT",
+ "KC_RGHT",
+ "KC_UP",
+ "KC_LCBR",
+ "KC_RCBR",
+ "KC_P4",
+ "KC_P5",
+ "KC_P6",
+ "KC_PPLS",
+ "KC_BSPC",
+ "BL_INC",
+ "KC_NO",
+ "KC_NO",
+ "KC_NO",
+ "KC_DOWN",
+ "KC_LBRC",
+ "KC_LPRN",
+ "KC_RPRN",
+ "KC_RBRC",
+ "KC_P1",
+ "KC_P2",
+ "KC_P3",
+ "KC_PMNS",
+ "KC_PIPE",
+ "KC_NO",
+ "KC_NO",
+ "KC_DEL",
+ "KC_DEL",
+ "KC_NO",
+ "KC_P0"
+ ],
+ [
+ "KC_F12",
+ "KC_F1",
+ "KC_F2",
+ "KC_F3",
+ "KC_F4",
+ "KC_F5",
+ "KC_F6",
+ "KC_F7",
+ "KC_F8",
+ "KC_F9",
+ "KC_F10",
+ "KC_F11",
+ "RGB_TOG",
+ "KC_EXLM",
+ "KC_AT",
+ "KC_HASH",
+ "KC_DLR",
+ "KC_PERC",
+ "KC_CIRC",
+ "KC_AMPR",
+ "KC_ASTR",
+ "KC_LPRN",
+ "KC_RPRN",
+ "KC_NO",
+ "RGB_MOD",
+ "KC_MRWD",
+ "KC_MFFD",
+ "KC_VOLU",
+ "KC_PGUP",
+ "KC_UNDS",
+ "KC_PEQL",
+ "KC_HOME",
+ "RGB_HUI",
+ "RGB_SAI",
+ "RGB_VAI",
+ "KC_BSLS",
+ "KC_MUTE",
+ "KC_MSTP",
+ "KC_MPLY",
+ "KC_VOLD",
+ "KC_PGDN",
+ "KC_PMNS",
+ "KC_NO",
+ "KC_NO",
+ "KC_PPLS",
+ "KC_END",
+ "RGB_HUD",
+ "RGB_SAD",
+ "RGB_VAD",
+ "KC_NO",
+ "KC_NO",
+ "KC_NO",
+ "KC_NO",
+ "KC_NO",
+ "KC_NO",
+ "KC_NO"
+ ]
+ ],
+ "layout": "LAYOUT",
+ "keymap": "keebio_iris_rev2_layout_dvorak.json",
+ "keyboard": "keebio/iris/rev2",
+ "documentation": "\"This file is a QMK Configurator export. You can import this at . It can also be used directly with QMK's source code.
+
+To setup your QMK environment check out the tutorial:
+
+You can convert this file to a keymap.c using this command: `qmk json2c {keymap}`
+
+You can compile this keymap using this command: `qmk compile {keymap}`\"
+",
+ "notes": "",
+ "version": 1
+}
diff --git a/keyboards/keebio/iris/keymaps/dvorak/keymap.c b/keyboards/keebio/iris/keymaps/dvorak/keymap.c
new file mode 100644
index 00000000000..3f0886521c7
--- /dev/null
+++ b/keyboards/keebio/iris/keymaps/dvorak/keymap.c
@@ -0,0 +1,73 @@
+#include QMK_KEYBOARD_H
+enum my_layers {
+ _DVORAK,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+#define RAISE MO(_RAISE)
+#define LOWER MO(_LOWER)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_DVORAK] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_LCTL, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_HOME, KC_END, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT,
+ //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘
+ LOWER, KC_LGUI, KC_ENT, KC_SPC, KC_RALT, RAISE
+ // └────────┴────────┴────────┘ └────────┴────────┴────────┘
+ ),
+
+ [_LOWER] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ RESET, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRAVE,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_DEL, _______, KC_LEFT, KC_RGHT, KC_UP, KC_LBRC, KC_RBRC, KC_P4, KC_P5, KC_P6, KC_PLUS, KC_BSPC,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ BL_STEP, _______, _______, _______, KC_DOWN, KC_LCBR, KC_LPRN, KC_RPRN, KC_RCBR, KC_P1, KC_P2, KC_P3, KC_MINS, KC_PIPE,
+ //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘
+ _______, _______, KC_DEL, KC_DEL, _______, KC_P0
+ // └────────┴────────┴────────┘ └────────┴────────┴────────┘
+ ),
+
+ [_RAISE] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
+ KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ RGB_TOG, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ RGB_MOD, KC_MPRV, KC_MNXT, KC_VOLU, KC_PGUP, KC_UNDS, KC_EQL, KC_HOME, RGB_HUI, RGB_SAI, RGB_VAI, KC_BSLS,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_MUTE, KC_MSTP, KC_MPLY, KC_VOLD, KC_PGDN, KC_MINS, _______, _______, KC_PLUS, KC_END, RGB_HUD, RGB_SAD, RGB_VAD, _______,
+ //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘
+ _______, _______, _______, _______, _______, _______
+ // └────────┴────────┴────────┘ └────────┴────────┴────────┘
+ ),
+
+ [_ADJUST] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘
+ _______, _______, _______, _______, _______, _______
+ // └────────┴────────┴────────┘ └────────┴────────┴────────┘
+ )
+};
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+}
diff --git a/keyboards/keebio/iris/keymaps/dvorak/readme.md b/keyboards/keebio/iris/keymaps/dvorak/readme.md
new file mode 100644
index 00000000000..8397ef84acd
--- /dev/null
+++ b/keyboards/keebio/iris/keymaps/dvorak/readme.md
@@ -0,0 +1,16 @@
+
+
+
+# Dvorak
+
+```
+make keebio/iris/rev2:dvorak
+```
+```
+make keebio/iris/rev3:dvorak
+```
+```
+make keebio/iris/rev4:dvorak
+```
+
+Tested with Iris rev. 2
diff --git a/keyboards/keebio/iris/keymaps/default/rules.mk b/keyboards/keebio/iris/keymaps/dvorak/rules.mk
similarity index 100%
rename from keyboards/keebio/iris/keymaps/default/rules.mk
rename to keyboards/keebio/iris/keymaps/dvorak/rules.mk
diff --git a/keyboards/keebio/iris/keymaps/fsck/config.h b/keyboards/keebio/iris/keymaps/fsck/config.h
new file mode 100644
index 00000000000..01bb31a6e14
--- /dev/null
+++ b/keyboards/keebio/iris/keymaps/fsck/config.h
@@ -0,0 +1,28 @@
+/*
+Copyright 2017 Danny Nguyen
+
+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 .
+*/
+
+#pragma once
+
+// #define USE_I2C
+#define EE_HANDS
+
+#undef RGBLED_NUM
+#define RGBLIGHT_ANIMATIONS
+#define RGBLED_NUM 12
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
diff --git a/keyboards/keebio/iris/keymaps/fsck/keymap.c b/keyboards/keebio/iris/keymaps/fsck/keymap.c
new file mode 100644
index 00000000000..bdc707e7550
--- /dev/null
+++ b/keyboards/keebio/iris/keymaps/fsck/keymap.c
@@ -0,0 +1,40 @@
+#include QMK_KEYBOARD_H
+
+
+#define _QWERTY 0
+#define _RAISE 1
+
+enum custom_keycodes {
+ QWERTY = SAFE_RANGE,
+ RAISE,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_QWERTY] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_DEL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_SPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘
+ KC_LCTL, MO(_RAISE), KC_ENT, KC_SPC, KC_LGUI, KC_LALT
+ // └────────┴────────┴────────┘ └────────┴────────┴────────┘
+ ),
+ [_RAISE] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
+ KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, KC_HOME, KC_UP, KC_END, KC_PGUP, _______, _______, KC_UNDS, KC_PLUS, _______, _______, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_ESC, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDN, KC_UNDS, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, _______, _______, _______, _______, KC_NUHS, KC_NUBS, KC_VOLD, KC_VOLU, _______,
+ //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘
+ _______, _______, _______, _______, _______, _______
+ // └────────┴────────┴────────┘ └────────┴────────┴────────┘
+ ),
+};
diff --git a/keyboards/keebio/iris/keymaps/fsck/readme.md b/keyboards/keebio/iris/keymaps/fsck/readme.md
new file mode 100644
index 00000000000..88f3127658d
--- /dev/null
+++ b/keyboards/keebio/iris/keymaps/fsck/readme.md
@@ -0,0 +1,3 @@
+
+
+# fsck's Iris Layout
diff --git a/keyboards/keebio/iris/keymaps/khitsule/config.h b/keyboards/keebio/iris/keymaps/khitsule/config.h
new file mode 100644
index 00000000000..62760cce35c
--- /dev/null
+++ b/keyboards/keebio/iris/keymaps/khitsule/config.h
@@ -0,0 +1,24 @@
+/*
+Copyright 2017 Danny Nguyen
+
+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 .
+*/
+
+#pragma once
+
+// #define USE_I2C
+#define EE_HANDS
+#define IGNORE_MOD_TAP_INTERRUPT
+
+#undef RGBLED_NUM
diff --git a/keyboards/keebio/iris/keymaps/khitsule/keymap.c b/keyboards/keebio/iris/keymaps/khitsule/keymap.c
new file mode 100644
index 00000000000..3e99cd6b0ab
--- /dev/null
+++ b/keyboards/keebio/iris/keymaps/khitsule/keymap.c
@@ -0,0 +1,153 @@
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _QWERTY,
+ _GAME,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+// define keycode macros for readability
+#define KM_DLEFT LGUI(LCTL(KC_LEFT))
+#define KM_DRIGHT LGUI(LCTL(KC_RIGHT))
+#define TSKMGR LCTL(LSFT(KC_ESC))
+#define KC_LCBR LSFT(KC_LBRC)
+#define KC_RCBR LSFT(KC_RBRC)
+
+enum custom_keycodes {
+ QWERTY = SAFE_RANGE,
+ GAME,
+ LOWER,
+ RAISE,
+ ADJUST
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_QWERTY] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ENT, KC_DEL, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_BSLS,
+ //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘
+ KC_LALT, LT(_LOWER, KC_TAB), CTL_T(KC_SPC), SFT_T(KC_BSPC), MO(_RAISE), KC_LGUI
+ // └────────┴────────┴────────┘ └────────┴────────┴────────┘
+ ),
+
+ [_GAME] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, _______, _______, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘
+ _______, MO(_LOWER), KC_SPC, _______, TO(_QWERTY), _______
+ // └────────┴────────┴────────┘ └────────┴────────┴────────┘
+ ),
+
+ [_LOWER] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
+ LALT(KC_F4), KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, _______, _______, KC_LPRN, KC_RPRN, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_MUTE, KC_HOME, KC_UP, KC_END, KC_PGUP, _______, _______, _______, KC_NLCK, KC_LBRC, KC_RBRC, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_VOLU, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, _______, _______, _______, KC_LCBR, KC_RCBR, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_VOLD, KC_MPRV, KC_MPLY, KC_MNXT, KM_DLEFT, KM_DRIGHT,_______, _______, _______, _______, _______, _______, _______, _______,
+ //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘
+ _______, _______, _______, _______, _______, _______
+ // └────────┴────────┴────────┘ └────────┴────────┴────────┘
+ ),
+
+ [_RAISE] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
+ KC_F12, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, KC_PLUS, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, KC_PMNS, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_P0, KC_P1, KC_P2, KC_P3, KC_EQL, _______,
+ //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘
+ _______, _______, _______, _______, _______, TO(_GAME)
+ // └────────┴────────┴────────┘ └────────┴────────┴────────┘
+ ),
+ [_ADJUST] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
+ _______, _______, _______,_______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //└────────┴────────┴────────┴───┬────┴───┬────┴───┬────┴───┬────┘ └───┬────┴───┬────┴───┬────┴───┬────┴────────┴────────┴────────┘
+ _______, _______, _______, _______, _______, _______
+ // └────────┴────────┴────────┘ └────────┴────────┴────────┘
+ )
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case QWERTY:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_QWERTY);
+ }
+ return false;
+ break;
+ case LOWER:
+ if (record->event.pressed) {
+ layer_on(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ return false;
+ break;
+ case RAISE:
+ if (record->event.pressed) {
+ layer_on(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ return false;
+ break;
+ case ADJUST:
+ if (record->event.pressed) {
+ layer_on(_ADJUST);
+ } else {
+ layer_off(_ADJUST);
+ }
+ return false;
+ break;
+ }
+ return true;
+}
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ }
+ else if (index == 1) {
+ if (clockwise) {
+ tap_code(KC_PGDN);
+ } else {
+ tap_code(KC_PGUP);
+ }
+ }
+}
diff --git a/keyboards/keebio/iris/keymaps/khitsule/readme.md b/keyboards/keebio/iris/keymaps/khitsule/readme.md
new file mode 100644
index 00000000000..ad848063174
--- /dev/null
+++ b/keyboards/keebio/iris/keymaps/khitsule/readme.md
@@ -0,0 +1,31 @@
+# Iris Layout by Khitsule
+
+
+
+[KLE link](http://www.keyboard-layout-editor.com/#/gists/856ad949a89c47fa84c808ba17ae10c5)
+
+## Layers
+
+| Layer | Legend |
+| ----- | ------ |
+| Base | Centre (black) |
+| Game | Centre (black) - see below |
+| Lower | Bottom (purple) |
+| Raise | Top (pink) |
+
+## Features
+
+* Raise/lower layers focus first on one-handed use
+* Numpad on right hand with raise layer
+* Game layer to be used as a gamepad
+ * Accessed by gui key in raise layer, return with the raise key
+ * Same as base layer **except** numbers 1-5 replaced with F1-F5; dual function removed from thumb keys (dedicated lower and space)
+ * Numbers to F1-F5 is designed to be used with a mouse such as the Naga that has numbers
+ * Lower layer gives one-handed access to arrows and F6-F10 as well
+* Navigation on left hand with lower layer
+ * D refers to desktop left/right on Win 10 (win+ctrl+left/right)
+* Use of hold/tap dual function keys
+ * Ctrl/Space
+ * Shift/Backspace
+ * Lower/Tab
+* Dedicated ctrl and shift to allow for navigation shortcuts with ctrl+shift+nav
diff --git a/keyboards/keebio/iris/keymaps/khitsule/rules.mk b/keyboards/keebio/iris/keymaps/khitsule/rules.mk
new file mode 100644
index 00000000000..b6c9a258059
--- /dev/null
+++ b/keyboards/keebio/iris/keymaps/khitsule/rules.mk
@@ -0,0 +1,2 @@
+BACKLIGHT_ENABLE = no
+RGBLIGHT_ENABLE = no
diff --git a/keyboards/keebio/iris/keymaps/pvinis/config.h b/keyboards/keebio/iris/keymaps/pvinis/config.h
index b2fb43be917..9574f2a837f 100644
--- a/keyboards/keebio/iris/keymaps/pvinis/config.h
+++ b/keyboards/keebio/iris/keymaps/pvinis/config.h
@@ -1,24 +1,36 @@
#pragma once
-
#ifdef PRODUCT
- #undef PRODUCT
- #define PRODUCT Iris Keyboard - pvinis
+# undef PRODUCT
+# define PRODUCT Iris Keyboard - pvinis
#endif
-
-// Use I2C or Serial, not both
+// Use I2C or Serial, not both.
#define USE_SERIAL
// #define USE_I2C
-
-// Select hand configuration
-#define MASTER_LEFT
-// #define MASTER_RIGHT
+// Select hand configuration.
+// #define MASTER_LEFT
+#define MASTER_RIGHT
// #define EE_HANDS
-
-// choose pin to use for audio. c6 is the one iris uses.
+// Choose pin to use for audio. C6 is the one iris uses.
#ifdef AUDIO_ENABLE
- #define C6_AUDIO
+# define C6_AUDIO
+# define STARTUP_SONG SONG(NO_SOUND) // No startup song.
+#endif
+
+#ifdef RGBLIGHT_ENABLE
+# undef RGBLED_NUM
+# define RGBLED_NUM 16
+#endif
+
+#ifdef ENCODER_ENABLE
+# define ENCODERS_PAD_A \
+ { F5 } // I connected the encoder to F4 and F5.
+# define ENCODERS_PAD_B \
+ { F4 }
+// #define ENCODERS_PAD_A_RIGHT { B5 }
+// #define ENCODERS_PAD_B_RIGHT { C6 }
+# define ENCODER_RESOLUTION 2
#endif
diff --git a/keyboards/keebio/iris/keymaps/pvinis/keymap.c b/keyboards/keebio/iris/keymaps/pvinis/keymap.c
index 2f6d5a6b47c..5c61c1321eb 100644
--- a/keyboards/keebio/iris/keymaps/pvinis/keymap.c
+++ b/keyboards/keebio/iris/keymaps/pvinis/keymap.c
@@ -1,16 +1,16 @@
// pvinis iris
-// ,-----------------------------. ,-----------------------------.
-// | | | | | | | | | | | | | |
-// |----+----+----+----+----+----| |----+----+----+----+----+----|
-// | | | | | | | | | | | | | |
-// |----+----+----+----x----x----| |----x----x----+----+----+----|
-// | | | | | | | | | | | | | |
-// |----+----+----+----x----x----+----. ,----|----x----x----+----+----+----|
-// | | | | | | | | | | | | | | | |
-// `-------------------+----+----+----/ \----+----+----+-------------------'
-// | | | | | | | |
-// `----+---------' `--------------'
-
+// make keebio/iris/rev2:pvinis:avrdude
+// ,-----------------------------. ┌────┬────┬────┬────┬────┬────┐
+// | | | | | | | │ │ │ │ │ │ │
+// |----+----+----+----+----+----| ├────┼────┼────┼────┼────┼────┤
+// | | | | | | | │ │ │ │ │ │ │
+// |----+----+----+----x----x----| ├────╆━━━━╅────┼────┼────┼────┤
+// | | | | | | | │ ┃ ┃ │ │ │ │
+// |----+----+----+----x----x----+----. ┌────┼────╄━━━━╃────┼────┼────┼────┤
+// | | | | | | | | │ │ │ │ │ │ │ │
+// `-------------------+----+----+----/ └┬───┴┬───┴┬───┴┬───┴────┴────┴────┘
+// | | | | │ │ │ │
+// `----+---------' └────┴────┴────┘
#include QMK_KEYBOARD_H
#include "pvinis.h"
@@ -19,102 +19,179 @@
//#include "eeconfig.h"
#ifdef AUDIO_ENABLE
- #include "audio.h"
+# include "audio.h"
#endif
#ifdef AUDIO_ENABLE
- // #define STARTUP_SONG SONG(SONIC_RING)
+// #define STARTUP_SONG SONG(SONIC_RING)
#endif
#ifdef AUDIO_ENABLE
- float tone_sonic[][2] = SONG(IN_LIKE_FLINT);
- float tone_1[][2] = SONG(QWERTY_SOUND);
- float tone_2[][2] = SONG(OLD_SPICE);
- float tone_3[][2] = SONG(OVERWATCH_THEME);
- float tone_4[][2] = SONG(QWERTY_SOUND);
+// float n04[][2] = SONG(CLOSE_ENCOUNTERS_5_NOTE);
+// float n10[][2] = SONG(STARTUP_SOUND);
+// float n11[][2] = SONG(GOODBYE_SOUND);
+// float n12[][2] = SONG(PLANCK_SOUND);
+// float n19[][2] = SONG(MUSIC_ON_SOUND);
+// float n20[][2] = SONG(AUDIO_ON_SOUND);
+// float n29[][2] = SONG(CAPS_LOCK_ON_SOUND);
+// float n30[][2] = SONG(CAPS_LOCK_OFF_SOUND);
+// float n31[][2] = SONG(SCROLL_LOCK_ON_SOUND);
+// float n32[][2] = SONG(SCROLL_LOCK_OFF_SOUND);
+// float n33[][2] = SONG(NUM_LOCK_ON_SOUND);
+// float n34[][2] = SONG(NUM_LOCK_OFF_SOUND);
+// float n40[][2] = SONG(ONE_UP_SOUND);
+// float n49[][2] = SONG(E1M1_DOOM);
+// float n53[][2] = SONG(OLD_SPICE);
+// float n56[][2] = SONG(RICK_ROLL);
+// float n57[][2] = SONG(FF_PRELUDE);
+// RGB_MODE_KNIGHT
+// float n78[][2] = SONG(KATAMARI_ROLLING_STAR);
#endif
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- // ,-----------------------------. ,-----------------------------.
- // | | | | | |QWER| | | | | | | |
- // |----+----+----+----+----+----| |----+----+----+----+----+----|
- // |Tab | | | | |CARP| | | | | | |Del |
- // |----+----+----+----x----x----| |----x----x----+----+----+----|
- // |EscC| | | | | | | | | | | |Ent |
- // |----+----+----+----x----x----+----. ,----|----x----x----+----+----+----|
- // |LSft| | | | | |Home| |End | | | | | |Rsft|
- // `-------------------+----+----+----/ \----+----+----+-------------------'
- // |Cmd |LOWR|Bspc| |Spc |RASE|RAlt|
- // `----+---------' `--------------'
- [LR_BASE] = LAYOUT_wrapper(
- _______, _______, _______, _______, _______, QWERTY , _______, _______, _______, _______, _______, _______,
- KC_TAB , _______, _______, _______, _______, CARPALX, _______, _______, _______, _______, _______, KC_DEL ,
- PV_ESCC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_ENT ,
- KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RSFT,
- KC_LGUI, SYMBOL , KC_BSPC, KC_SPC , SYSCTL , KC_RALT
- ),
+ // ,-----------------------------. ,-----------------------------.
+ // | | | | |GAME|QWER| | | | | | | |
+ // |----+----+----+----+----+----| |----+----+----+----+----+----|
+ // |Tab | | | | |CRPL| | | | | | |Del |
+ // |----+----+----+----x----x----| |----x----x----+----+----+----|
+ // |EscC| | | | | | | | | | | |Ent |
+ // |----+----+----+----x----x----+----. ,----|----x----x----+----+----+----|
+ // |LSft| | | | | |Home| |End | | | | | |Rsft|
+ // `-------------------+----+----+----/ \----+----+----+-------------------'
+ // |Cmd |LOWR|Bspc| |Spc |RASE|RAlt|
+ // `----+---------' `--------------'
+ [LR_BASE] = LAYOUT_wrapper(
+ // clang-format off
+ KC_MUTE, _______, _______, _______, GAME1 , QWERTY , KC_1 , _______, _______, _______, _______, _______,
+ KC_TAB , ___________________________________________, ___________________________________________, KC_DEL ,
+ PV_ESCC, ___________________________________________, ___________________________________________, KC_ENT ,
+ KC_LSFT, ___________________________________________, _______, _______, _______, _______, _______, _______, _______, KC_RSFT,
+ KC_LGUI, SYMBOL , KC_BSPC, KC_SPC , SYSCTL , KC_RALT
+ // clang-format on
+ ),
- // ,-----------------------------. ,-----------------------------.
- // | | NUMBERS_L | | NUMBERS_R | |
- // |----+----+----+----+----+----| |----+----+----+----+----+----|
- // | | | | | |
- // |----+ | | +----|
- // | | QWERTY_L | | QWERTY_R | |
- // |----+ +----. ,----| +----|
- // | | | | | | | |
- // `-------------------+----+----+----/ \----+----+----+-------------------'
- // | | | | | | | |
- // `----+---------' `--------------'
- [LR_QWERTY] = LAYOUT_wrapper(
- _______, ________________NUMBERS_L__________________, ________________NUMBERS_R__________________, _______,
- _______, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, _______,
- _______, _____________MOD_QWERTY_L2_________________, _____________MOD_QWERTY_R2_________________, _______,
- _______, _________________QWERTY_L3_________________, _______, _______, _________________QWERTY_R3_________________, _______,
- _______, _______, _______, _______, _______, _______
- ),
+ // ,-----------------------------. ,-----------------------------.
+ // | | NUMBERS_L | | NUMBERS_R | |
+ // |----+----+----+----+----+----| |----+----+----+----+----+----|
+ // | | | | | |
+ // |----+ | | +----|
+ // | | QWERTY_L | | QWERTY_R | |
+ // |----+ +----. ,----| +----|
+ // | | | | | | | |
+ // `-------------------+----+----+----/ \----+----+----+-------------------'
+ // | | | | | | | |
+ // `----+---------' `--------------'
+ [LR_QWERTY] = LAYOUT_wrapper(
+ // clang-format off
+ _______, ________________NUMBERS_L__________________, ________________NUMBERS_R__________________, _______,
+ _______, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, _______,
+ _______, _____________MOD_QWERTY_L2_________________, _________________QWERTY_R2_________________, _______,
+ _______, _________________QWERTY_L3_________________, _______, _______, _________________QWERTY_R3_________________, _______,
+ _______, _______, _______, _______, _______, _______
+ // clang-format on
+ ),
- // ,-----------------------------. ,-----------------------------.
- // | | NUMBERS_L | | NUMBERS_R | |
- // |----+----+----+----+----+----| |----+----+----+----+----+----|
- // | | | | | |
- // |----+ | | +----|
- // | | CARPALX_L | | CARPALX_R | |
- // |----+ +----. ,----| +----|
- // | | | | | | | |
- // `-------------------+----+----+----/ \----+----+----+-------------------'
- // | | | | | | | |
- // `----+---------' `--------------'
- [LR_CARPALX] = LAYOUT_wrapper(
- _______, ________________NUMBERS_L__________________, ________________NUMBERS_R__________________, _______,
- _______, ________________CARPALX_L1_________________, ________________CARPALX_R1_________________, _______,
- _______, ________________CARPALX_L2_________________, ________________CARPALX_R2_________________, _______,
- _______, ________________CARPALX_L3_________________, _______, _______, ________________CARPALX_R3_________________, _______,
- _______, _______, _______, _______, _______, _______
- ),
+ // ,-----------------------------. ,-----------------------------.
+ // | | NUMBERS_L | | NUMBERS_R | |
+ // |----+----+----+----+----+----| |----+----+----+----+----+----|
+ // | | | | | |
+ // |----+ | | +----|
+ // | | CARPALX_L | | CARPALX_R | |
+ // |----+ +----. ,----| +----|
+ // | | | | | | | |
+ // `-------------------+----+----+----/ \----+----+----+-------------------'
+ // | | | | | | | |
+ // `----+---------' `--------------'
+ [LR_CARPALX] = LAYOUT_wrapper(
+ // clang-format off
+ _______, ________________NUMBERS_L__________________, ________________NUMBERS_R__________________, _______,
+ _______, ________________CARPALX_L1_________________, ________________CARPALX_R1_________________, _______,
+ _______, ________________CARPALX_L2_________________, ________________CARPALX_R2_________________, _______,
+ _______, ________________CARPALX_L3_________________, _______, _______, ________________CARPALX_R3_________________, _______,
+ _______, _______, _______, _______, _______, _______
+ // clang-format on
+ ),
- [LR_SYMBOL] = LAYOUT_wrapper(
- KC_F12 , ______________________F_L__________________, ______________________F_R__________________, KC_F11 ,
- _______, _________________SYMBOL_L1_________________, _________________SYMBOL_R1_________________, _______,
- _______, _________________SYMBOL_L2_________________, _________________SYMBOL_R2_________________, _______,
- _______, _________________SYMBOL_L3_________________, _______, _______, _________________SYMBOL_R3_________________, _______,
- _______, _______, _______, _______, _______, _______
- ),
+ [LR_SYMBOL] = LAYOUT_wrapper(
+ // clang-format off
+ KC_F12 , ______________________F_L__________________, ______________________F_R__________________, KC_F11 ,
+ _______, _________________SYMBOL_L1_________________, _________________SYMBOL_R1_________________, _______,
+ _______, _________________SYMBOL_L2_________________, _________________SYMBOL_R2_________________, _______,
+ _______, _________________SYMBOL_L3_________________, _______, _______, _________________SYMBOL_R3_________________, _______,
+ _______, _______, _______, _______, _______, _______
+ // clang-format on
+ ),
- [LR_SYSCTL] = LAYOUT_wrapper(
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______, _______, _______, _________________SYSCTL_R1_________________, _______,
- _______, _______, _______, _______, _______, _______, _________________SYSCTL_R2_________________, _______,
- _______, _______, _______, _______, _______, _______, _______, _______, _________________SYSCTL_R3_________________, _______,
- _______, _______, _______, _______, _______, _______
- ),
+ [LR_SYSCTL] = LAYOUT_wrapper(
+ // clang-format off
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _________________SYSCTL_L1_________________, _________________SYSCTL_R1_________________, _______,
+ _______, _________________SYSCTL_L2_________________, _________________SYSCTL_R2_________________, _______,
+ _______, _________________SYSCTL_L3_________________, _______, _______, _________________SYSCTL_R3_________________, _______,
+ _______, _______, _______, _______, _______, _______
+ // clang-format on
+ ),
- [LR_KBCTL] = LAYOUT_wrapper(
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- XXXXXXX, __________________KBCTL_L1_________________, __________________KBCTL_R1_________________, XXXXXXX,
- XXXXXXX, __________________KBCTL_L2_________________, __________________KBCTL_R2_________________, XXXXXXX,
- BASE , __________________KBCTL_L3_________________, XXXXXXX, XXXXXXX, __________________KBCTL_R3_________________, XXXXXXX,
- XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX
- )
+ [LR_KBCTL] = LAYOUT_wrapper(
+ // clang-format off
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, __________________KBCTL_L1_________________, __________________KBCTL_R1_________________, XXXXXXX,
+ XXXXXXX, __________________KBCTL_L2_________________, __________________KBCTL_R2_________________, XXXXXXX,
+ BASE , __________________KBCTL_L3_________________, XXXXXXX, XXXXXXX, __________________KBCTL_R3_________________, XXXXXXX,
+ XXXXXXX, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX
+ // clang-format on
+ ),
+
+ // ,-----------------------------. ,-----------------------------.
+ // | | NUMBERS_L | | NUMBERS_R | |
+ // |----+----+----+----+----+----| |----+----+----+----+----+----|
+ // | | | | | |
+ // |----+ | | +----|
+ // |ESC | QWERTY_L | | QWERTY_R | |
+ // |----+ +----. ,----| +----|
+ // | | | | | | | |
+ // `-------------------+----+----+----/ \----+----+----+-------------------'
+ // | |SPC | | | | | |
+ // `----+---------' `--------------'
+ [LR_GAME1] = LAYOUT_wrapper(
+ // clang-format off
+ _______, ________________NUMBERS_L__________________, ________________NUMBERS_R__________________, KC_BSPC,
+ _______, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, QWERTY ,
+ KC_ESC , _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, _______,
+ _______, _________________QWERTY_L3_________________, _______, _______, _________________QWERTY_R3_________________, _______,
+ _______, _______, KC_SPC , _______, _______, _______
+ // clang-format on
+ ),
+
+ [LR_GAME2] = LAYOUT_wrapper(
+ // clang-format off
+ _______, ________________NUMBERS_L__________________, ________________NUMBERS_R__________________, KC_BSPC,
+ _______, _________________QWERTY_L1_________________, KC_Y , KC_U , KC_UP , KC_O , KC_P , QWERTY ,
+ KC_ESC , _________________QWERTY_L2_________________, KC_H , KC_LEFT, KC_DOWN, KC_RGHT, KC_SCLN, _______,
+ _______, _________________QWERTY_L3_________________, _______, _______, _________________QWERTY_R3_________________, _______,
+ _______, _______, KC_SPC , _______, _______, _______
+ // clang-format on
+ ),
};
+
+#ifdef ENCODER_ENABLE
+void encoder_update_user(uint8_t index, bool clockwise) {
+ // if (index == 0) { /* First encoder */
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ // }
+}
+#endif
+
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+#ifdef AUDIO_ENABLE
+// case PV_S04: if (record->event.pressed) PLAY_SONG(n04); return false; break;
+#endif
+ }
+ return true; // Process everything else normally
+}
diff --git a/keyboards/keebio/iris/keymaps/pvinis/rules.mk b/keyboards/keebio/iris/keymaps/pvinis/rules.mk
index 899312894b0..deeb3120363 100644
--- a/keyboards/keebio/iris/keymaps/pvinis/rules.mk
+++ b/keyboards/keebio/iris/keymaps/pvinis/rules.mk
@@ -1,2 +1,9 @@
-AUDIO_ENABLE = no # off for now
-RGBLIGHT_ENABLE = no # off for now
+TAP_DANCE_ENABLE = yes
+AUDIO_ENABLE = no # piezo speaker sounds
+RGBLIGHT_ENABLE = yes # rgb leds underlight
+ENCODER_ENABLE = yes # rotary knob
+
+# Some extra stuff to make firmware smaller.
+LINK_TIME_OPTIMIZATION_ENABLE = yes
+CONSOLE_ENABLE = no
+COMMAND_ENABLE = no
diff --git a/keyboards/keebio/iris/keymaps/via/rules.mk b/keyboards/keebio/iris/keymaps/via/rules.mk
index 1e5b99807cb..92f9671eeb2 100644
--- a/keyboards/keebio/iris/keymaps/via/rules.mk
+++ b/keyboards/keebio/iris/keymaps/via/rules.mk
@@ -1 +1,2 @@
VIA_ENABLE = yes
+LINK_TIME_OPTIMIZATION_ENABLE = yes
diff --git a/keyboards/keebio/iris/rev1/config.h b/keyboards/keebio/iris/rev1/config.h
index a6b14138e48..f475d2941ae 100644
--- a/keyboards/keebio/iris/rev1/config.h
+++ b/keyboards/keebio/iris/rev1/config.h
@@ -60,3 +60,4 @@ along with this program. If not, see .
/* ws2812 RGB LED */
#define RGB_DI_PIN D3
#define RGBLED_NUM 12 // Number of LEDs
+#define RGBLIGHT_ANIMATIONS
diff --git a/keyboards/keebio/iris/rev1/rules.mk b/keyboards/keebio/iris/rev1/rules.mk
index 53719d7550a..765fa7f07a3 100644
--- a/keyboards/keebio/iris/rev1/rules.mk
+++ b/keyboards/keebio/iris/rev1/rules.mk
@@ -22,7 +22,7 @@ EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
diff --git a/keyboards/keebio/iris/rev1_led/config.h b/keyboards/keebio/iris/rev1_led/config.h
index 5f93a61dfc9..f06a182a48b 100644
--- a/keyboards/keebio/iris/rev1_led/config.h
+++ b/keyboards/keebio/iris/rev1_led/config.h
@@ -60,3 +60,4 @@ along with this program. If not, see .
/* ws2812 RGB LED */
#define RGB_DI_PIN D3
#define RGBLED_NUM 12 // Number of LEDs
+#define RGBLIGHT_ANIMATIONS
diff --git a/keyboards/keebio/iris/rev1_led/rules.mk b/keyboards/keebio/iris/rev1_led/rules.mk
index 53719d7550a..765fa7f07a3 100644
--- a/keyboards/keebio/iris/rev1_led/rules.mk
+++ b/keyboards/keebio/iris/rev1_led/rules.mk
@@ -22,7 +22,7 @@ EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
diff --git a/keyboards/keebio/iris/rev2/config.h b/keyboards/keebio/iris/rev2/config.h
index ab55bf77b2c..4ead367d3ca 100644
--- a/keyboards/keebio/iris/rev2/config.h
+++ b/keyboards/keebio/iris/rev2/config.h
@@ -19,10 +19,10 @@ along with this program. If not, see .
/* USB Device descriptor parameter */
#define VENDOR_ID 0xCB10
-#define PRODUCT_ID 0x1256
+#define PRODUCT_ID 0x2256
#define DEVICE_VER 0x0200
#define MANUFACTURER Keebio
-#define PRODUCT Iris Keyboard
+#define PRODUCT Keebio Iris Rev. 2
#define DESCRIPTION Split 50 percent ergonomic keyboard
/* key matrix size */
@@ -60,3 +60,4 @@ along with this program. If not, see .
/* ws2812 RGB LED */
#define RGB_DI_PIN D3
#define RGBLED_NUM 12 // Number of LEDs
+#define RGBLIGHT_ANIMATIONS
diff --git a/keyboards/keebio/iris/rev2/rev2.c b/keyboards/keebio/iris/rev2/rev2.c
index 8575243f0d2..70c30695ad9 100644
--- a/keyboards/keebio/iris/rev2/rev2.c
+++ b/keyboards/keebio/iris/rev2/rev2.c
@@ -1,12 +1,5 @@
#include "rev2.h"
-#ifdef SSD1306OLED
-void led_set_kb(uint8_t usb_led) {
- // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
- led_set_user(usb_led);
-}
-#endif
-
#ifdef SWAP_HANDS_ENABLE
__attribute__ ((weak))
// swap-hands action needs a matrix to define the swap
@@ -26,3 +19,19 @@ const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
};
#endif
+void eeconfig_init_kb(void) {
+#ifdef BACKLIGHT_ENABLE
+ backlight_enable();
+ backlight_level(3);
+#endif
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(0, 255, 255); // Set default HSV - red hue, full saturation, full brightness
+#ifdef RGBLIGHT_ANIMATIONS
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2); // set to RGB_RAINBOW_SWIRL by default
+#endif
+#endif
+
+ eeconfig_update_kb(0);
+ eeconfig_init_user();
+}
diff --git a/keyboards/keebio/iris/rev3/config.h b/keyboards/keebio/iris/rev3/config.h
index 8c6f4ad0859..945b8e9c2ae 100644
--- a/keyboards/keebio/iris/rev3/config.h
+++ b/keyboards/keebio/iris/rev3/config.h
@@ -22,7 +22,7 @@ along with this program. If not, see .
#define PRODUCT_ID 0x1256
#define DEVICE_VER 0x0300
#define MANUFACTURER Keebio
-#define PRODUCT Iris Keyboard
+#define PRODUCT Keebio Iris Rev. 3
#define DESCRIPTION Split 50 percent ergonomic keyboard
/* key matrix size */
@@ -69,3 +69,4 @@ along with this program. If not, see .
#define RGB_DI_PIN F7
#define RGBLED_NUM 12 // Number of LEDs
#define RGBLED_SPLIT { 6, 6 }
+#define RGBLIGHT_ANIMATIONS
diff --git a/keyboards/keebio/iris/rev3/rev3.c b/keyboards/keebio/iris/rev3/rev3.c
index 7e49330c1da..f58c2093c41 100644
--- a/keyboards/keebio/iris/rev3/rev3.c
+++ b/keyboards/keebio/iris/rev3/rev3.c
@@ -1,12 +1,5 @@
#include "rev3.h"
-#ifdef SSD1306OLED
-void led_set_kb(uint8_t usb_led) {
- // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
- led_set_user(usb_led);
-}
-#endif
-
#ifdef SWAP_HANDS_ENABLE
__attribute__ ((weak))
// swap-hands action needs a matrix to define the swap
@@ -25,3 +18,20 @@ const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
{{0,4}, {1,4}, {2,4}, {3,4}, {4,4}, {5,4}},
};
#endif
+
+void eeconfig_init_kb(void) {
+#ifdef BACKLIGHT_ENABLE
+ backlight_enable();
+ backlight_level(3);
+#endif
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(0, 255, 255); // Set default HSV - red hue, full saturation, full brightness
+#ifdef RGBLIGHT_ANIMATIONS
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2); // set to RGB_RAINBOW_SWIRL by default
+#endif
+#endif
+
+ eeconfig_update_kb(0);
+ eeconfig_init_user();
+}
diff --git a/keyboards/keebio/iris/rev3/rev3.h b/keyboards/keebio/iris/rev3/rev3.h
index da9da844030..a968c47ed62 100644
--- a/keyboards/keebio/iris/rev3/rev3.h
+++ b/keyboards/keebio/iris/rev3/rev3.h
@@ -16,18 +16,18 @@
L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, \
L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, \
L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, \
- L30, L31, L32, L33, L34, L35, LT4, RT4, R30, R31, R32, R33, R34, R35, \
- LT1, LT2, LT3, RT3, RT2, RT1 \
+ L30, L31, L32, L33, L34, L35, L42, R43, R30, R31, R32, R33, R34, R35, \
+ L43, L44, L45, R40, R41, R42 \
) \
{ \
{ L00, L01, L02, L03, L04, L05 }, \
{ L10, L11, L12, L13, L14, L15 }, \
{ L20, L21, L22, L23, L24, L25 }, \
{ L30, L31, L32, L33, L34, L35 }, \
- { KC_NO, KC_NO, LT4, LT1, LT2, LT3 }, \
+ { KC_NO, KC_NO, L42, L43, L44, L45 }, \
{ R05, R04, R03, R02, R01, R00 }, \
{ R15, R14, R13, R12, R11, R10 }, \
{ R25, R24, R23, R22, R21, R20 }, \
{ R35, R34, R33, R32, R31, R30 }, \
- { KC_NO, KC_NO, RT4, RT1, RT2, RT3 } \
+ { KC_NO, KC_NO, R43, R42, R41, R40 } \
}
diff --git a/keyboards/keebio/iris/rev4/config.h b/keyboards/keebio/iris/rev4/config.h
index 87fdafcd5b7..fb8b69ada7e 100644
--- a/keyboards/keebio/iris/rev4/config.h
+++ b/keyboards/keebio/iris/rev4/config.h
@@ -19,10 +19,10 @@ along with this program. If not, see .
/* USB Device descriptor parameter */
#define VENDOR_ID 0xCB10
-#define PRODUCT_ID 0x1256
+#define PRODUCT_ID 0x4256
#define DEVICE_VER 0x0400
#define MANUFACTURER Keebio
-#define PRODUCT Iris Keyboard
+#define PRODUCT Keebio Iris Rev. 4
#define DESCRIPTION Split 50 percent ergonomic keyboard
/* key matrix size */
@@ -73,3 +73,4 @@ along with this program. If not, see .
#define RGB_DI_PIN D6
#define RGBLED_NUM 12 // Number of LEDs
#define RGBLED_SPLIT { 6, 6 }
+#define RGBLIGHT_ANIMATIONS
diff --git a/keyboards/keebio/iris/rev4/rev4.c b/keyboards/keebio/iris/rev4/rev4.c
index bd0989acb30..de2ba26db3a 100644
--- a/keyboards/keebio/iris/rev4/rev4.c
+++ b/keyboards/keebio/iris/rev4/rev4.c
@@ -1 +1,18 @@
#include "rev4.h"
+
+void eeconfig_init_kb(void) {
+#ifdef BACKLIGHT_ENABLE
+ backlight_enable();
+ backlight_level(3);
+#endif
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(0, 255, 255); // Set default HSV - red hue, full saturation, full brightness
+#ifdef RGBLIGHT_ANIMATIONS
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2); // set to RGB_RAINBOW_SWIRL by default
+#endif
+#endif
+
+ eeconfig_update_kb(0);
+ eeconfig_init_user();
+}
diff --git a/keyboards/keebio/levinson/rev2/rev2.c b/keyboards/keebio/levinson/rev2/rev2.c
index 573fa787baa..8e65af7ade4 100644
--- a/keyboards/keebio/levinson/rev2/rev2.c
+++ b/keyboards/keebio/levinson/rev2/rev2.c
@@ -1,22 +1,18 @@
#include "levinson.h"
-#ifdef SSD1306OLED
-void led_set_kb(uint8_t usb_led) {
- // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
- led_set_user(usb_led);
-}
+void eeconfig_init_kb(void) {
+#ifdef BACKLIGHT_ENABLE
+ backlight_enable();
+ backlight_level(5);
+#endif
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(0, 255, 255); // Set default HSV - red hue, full saturation, full brightness
+#ifdef RGBLIGHT_ANIMATIONS
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2); // set to RGB_RAINBOW_SWIRL by default
+#endif
#endif
-void matrix_init_kb(void) {
-
- // // green led on
- // DDRD |= (1<<5);
- // PORTD &= ~(1<<5);
-
- // // orange led on
- // DDRB |= (1<<0);
- // PORTB &= ~(1<<0);
-
- matrix_init_user();
-};
-
+ eeconfig_update_kb(0);
+ eeconfig_init_user();
+}
diff --git a/keyboards/keebio/levinson/rev3/rev3.c b/keyboards/keebio/levinson/rev3/rev3.c
index 573fa787baa..8e65af7ade4 100644
--- a/keyboards/keebio/levinson/rev3/rev3.c
+++ b/keyboards/keebio/levinson/rev3/rev3.c
@@ -1,22 +1,18 @@
#include "levinson.h"
-#ifdef SSD1306OLED
-void led_set_kb(uint8_t usb_led) {
- // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
- led_set_user(usb_led);
-}
+void eeconfig_init_kb(void) {
+#ifdef BACKLIGHT_ENABLE
+ backlight_enable();
+ backlight_level(5);
+#endif
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(0, 255, 255); // Set default HSV - red hue, full saturation, full brightness
+#ifdef RGBLIGHT_ANIMATIONS
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2); // set to RGB_RAINBOW_SWIRL by default
+#endif
#endif
-void matrix_init_kb(void) {
-
- // // green led on
- // DDRD |= (1<<5);
- // PORTD &= ~(1<<5);
-
- // // orange led on
- // DDRB |= (1<<0);
- // PORTB &= ~(1<<0);
-
- matrix_init_user();
-};
-
+ eeconfig_update_kb(0);
+ eeconfig_init_user();
+}
diff --git a/keyboards/keebio/nyquist/keymaps/georgepetri/config.h b/keyboards/keebio/nyquist/keymaps/georgepetri/config.h
index bc7fed826dc..d13d3294fde 100644
--- a/keyboards/keebio/nyquist/keymaps/georgepetri/config.h
+++ b/keyboards/keebio/nyquist/keymaps/georgepetri/config.h
@@ -17,11 +17,9 @@ along with this program. If not, see .
#pragma once
-// #define USE_I2C
-
-/* Select hand configuration */
-// #define MASTER_RIGHT
-// #define EE_HANDS
-
#undef RGBLED_NUM
#define RGBLED_NUM 12
+#define RGBLIGHT_LAYERS
+
+#define TAPPING_TOGGLE 2
+#define TAPPING_TERM 150
diff --git a/keyboards/keebio/nyquist/keymaps/georgepetri/keymap.c b/keyboards/keebio/nyquist/keymaps/georgepetri/keymap.c
index 6b427e06d57..96ea4ff1998 100644
--- a/keyboards/keebio/nyquist/keymaps/georgepetri/keymap.c
+++ b/keyboards/keebio/nyquist/keymaps/georgepetri/keymap.c
@@ -6,10 +6,6 @@ extern keymap_config_t keymap_config;
#define _L 1
#define _R 2
-enum custom_keycodes {
- QWERTY = SAFE_RANGE
-};
-
#define KC_TL LCTL(KC_PGUP)
#define KC_TR LCTL(KC_PGDN)
#define KC_TC LCTL(KC_W)
@@ -26,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_ENT ,
//├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
- KC_CAPS, KC_LCTL, KC_LGUI, KC_LALT, MO(_L) , KC_SPC , KC_SPC , TG(_R) , KC_LEFT, KC_DOWN, KC_UP , KC_RGHT
+ KC_CAPS, KC_LCTL, KC_LGUI, KC_LALT, MO(_L) , KC_SPC , KC_RSFT, TT(_R) , KC_LEFT, KC_DOWN, KC_UP , KC_RGHT
//└────────┴────────┴────────┴────────┴────────┴────────┘ └────────┴────────┴────────┴────────┴────────┴────────┘
),
@@ -59,33 +55,54 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};
+const rgblight_segment_t PROGMEM left[] = RGBLIGHT_LAYER_SEGMENTS(
+ {0, 12, HSV_MAGENTA}
+);
+
+const rgblight_segment_t PROGMEM right[] = RGBLIGHT_LAYER_SEGMENTS(
+ {0, 12, HSV_RED}
+);
+
+const rgblight_segment_t PROGMEM capslock[] = RGBLIGHT_LAYER_SEGMENTS(
+ {0, 3, HSV_GOLD},
+ {6, 3, HSV_GOLD}
+);
+
+const rgblight_segment_t* const PROGMEM rgb_layers[] = RGBLIGHT_LAYERS_LIST(left, right, capslock);
+
void keyboard_post_init_user(void) {
- rgblight_sethsv_noeeprom(HSV_BLUE);
+ rgblight_sethsv_noeeprom(HSV_SPRINGGREEN);
+ rgblight_layers = rgb_layers;
}
-void update_led(void) {
- switch (biton32(layer_state)) {
- case _BASE:
- rgblight_sethsv_noeeprom(HSV_BLUE);
- break;
- case _L:
- rgblight_sethsv_noeeprom(HSV_CORAL);
- break;
- case _R:
- rgblight_sethsv_noeeprom(HSV_MAGENTA);
- break;
+layer_state_t layer_state_set_user(layer_state_t state) {
+ rgblight_set_layer_state(0, layer_state_cmp(state, _L));
+ rgblight_set_layer_state(1, layer_state_cmp(state, _R));
+ return state;
+}
+
+void suspend_power_down_user(void) {
+ rgblight_disable();
+}
+
+void suspend_wakeup_init_user(void) {
+ rgblight_enable();
+}
+
+bool is_shift_pressed = false;
+
+bool led_update_user(led_t led_state) {
+ rgblight_set_layer_state(2, is_shift_pressed != led_state.caps_lock);
+ return true;
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t* record) {
+ switch (keycode) {
+ case KC_LSFT:
+ case KC_RSFT:
+ is_shift_pressed = record->event.pressed;
+ rgblight_set_layer_state(2, is_shift_pressed != host_keyboard_led_state().caps_lock);
+ default:
+ return true;
}
- if (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) {
- rgblight_sethsv_range(HSV_WHITE,0,3);
- rgblight_sethsv_range(HSV_WHITE,9,12);
- }
-}
-
-uint32_t layer_state_set_user(uint32_t state) {
- update_led();
- return state;
-}
-
-void led_set_user(uint8_t usb_led) {
- update_led();
}
diff --git a/keyboards/keebio/nyquist/keymaps/georgepetri/readme.md b/keyboards/keebio/nyquist/keymaps/georgepetri/readme.md
index a659905f8f9..5d1855e933d 100644
--- a/keyboards/keebio/nyquist/keymaps/georgepetri/readme.md
+++ b/keyboards/keebio/nyquist/keymaps/georgepetri/readme.md
@@ -1,7 +1,7 @@
# George Petri's Nyquist layout
```
-make keebio/nyquist/rev2:georgepetri
+sudo make keebio/nyquist/rev2:georgepetri:dfu
```
Features a dedicated navigation layer on rise and current layer status on rgb underglow.
@@ -15,9 +15,9 @@ Features a dedicated navigation layer on rise and current layer status on rgb un
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
│ ESC │ A │ S │ D │ F │ G │ │ H │ J │ K │ L │ SCLN│ QUOT │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
-│ LSFT│ Z │ X │ C │ V │ B │ │ N │ M │ COMM │ DOT │ SLSH│ ENT │
+│ LSFT│ Z │ X │ C │ V │ B │ │ N │ M │ COMM│ DOT │ SLSH│ ENT │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
-│ CAPS│ LCTL│ LGUI │ LALT │MO(_L)│ SPC │ │ SPC │MO(_R)│ LEFT │ DOWN│ UP │ RGHT │
+│ CAPS│ LCTL│ LGUI │ LALT │MO(_L)│ SPC │ │ RSFT│MO(_R)│ LEFT│ DOWN│ UP │ RGHT │
└──────┴──────┴──────┴──────┴──────┴──────┘ └──────┴──────┴──────┴──────┴──────┴──────┘
```
@@ -28,7 +28,7 @@ Features a dedicated navigation layer on rise and current layer status on rgb un
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
│ │ F11 │ F12 │ │ │ │ │ │ MINS│ EQL │ LBRC│ RBRC│ BSLS │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
-│ │ │ │ │ │ │ │ LEFT │ DOWN │ UP │ RGHT │ │ │
+│ │ │ │ │ │ │ │ LEFT│ DOWN│ UP │ RGHT│ │ │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
│ │ │ │ │ │ │ │ │ PGDN│ PGUP │ HOME│ END │ │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
@@ -43,9 +43,9 @@ Features a dedicated navigation layer on rise and current layer status on rgb un
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
│ │ TAB_L│ TAB_R│ TAB_C│ TAB_R│ │ │ │ TAB_L│ TAB_R│ TAB_C│ TAB_R│ │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
-│ │ LEFT │ DOWN │ UP │ RGHT │ │ │ LEFT │ DOWN │ UP │ RGHT │ │ │
+│ │ LEFT│ DOWN│ UP │ RGHT│ │ │ LEFT│ DOWN│ UP │ RGHT│ │ │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
-│ │ PGDN │ PGUP │ HOME│ END │ │ │ │ PGDN │ PGUP │ HOME│ END │ │
+│ │ PGDN│ PGUP│ HOME│ END │ │ │ │ PGDN│ PGUP│ HOME│ END │ │
├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
│ │ │ │ │ │ │ │ │ │ │ │ │ │
└──────┴──────┴──────┴──────┴──────┴──────┘ └──────┴──────┴──────┴──────┴──────┴──────┘
diff --git a/keyboards/keebio/nyquist/keymaps/georgepetri/rules.mk b/keyboards/keebio/nyquist/keymaps/georgepetri/rules.mk
index 2e145d5a881..4010d90f03c 100644
--- a/keyboards/keebio/nyquist/keymaps/georgepetri/rules.mk
+++ b/keyboards/keebio/nyquist/keymaps/georgepetri/rules.mk
@@ -1,3 +1,5 @@
-RGBLIGHT_ENABLE = yes
MOUSEKEY_ENABLE = no
COMMAND_ENABLE = no
+RGBLIGHT_ENABLE = yes
+LTO_ENABLE = yes
+DEBOUNCE_TYPE = eager_pk
diff --git a/keyboards/keebio/nyquist/keymaps/georgepetri3/config.h b/keyboards/keebio/nyquist/keymaps/georgepetri3/config.h
new file mode 100644
index 00000000000..2e84fa0d531
--- /dev/null
+++ b/keyboards/keebio/nyquist/keymaps/georgepetri3/config.h
@@ -0,0 +1,25 @@
+/*
+Copyright 2017 Danny Nguyen
+
+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 .
+*/
+
+#pragma once
+
+#define RGBLIGHT_LAYERS
+
+#define TAPPING_TOGGLE 2
+#define TAPPING_TERM 150
+
+#define USE_I2C
diff --git a/keyboards/keebio/nyquist/keymaps/georgepetri3/keymap.c b/keyboards/keebio/nyquist/keymaps/georgepetri3/keymap.c
new file mode 100644
index 00000000000..a20c0d9351a
--- /dev/null
+++ b/keyboards/keebio/nyquist/keymaps/georgepetri3/keymap.c
@@ -0,0 +1,106 @@
+#include QMK_KEYBOARD_H
+#define _BASE 0
+#define _L 1
+#define _R 2
+
+#define KC_TL LCTL(KC_PGUP)
+#define KC_TR LCTL(KC_PGDN)
+#define KC_TC LCTL(KC_W)
+#define KC_TRO LCTL(LSFT(KC_T))
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[_BASE] = LAYOUT(
+//┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
+ KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_BSPC,
+//├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_DEL ,
+//├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_ESC , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT,
+//├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_ENT ,
+//├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_CAPS, KC_LCTL, KC_LGUI, KC_LALT, MO(_L) , KC_SPC , KC_RSFT, TT(_R) , KC_LEFT, KC_DOWN, KC_UP , KC_RGHT
+//└────────┴────────┴────────┴────────┴────────┴────────┘ └────────┴────────┴────────┴────────┴────────┴────────┘
+ ),
+
+ [_L] = LAYOUT(
+//┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
+ _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_F7 , KC_F8 , KC_F9 , KC_F10 , _______,
+//├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, KC_F11 , KC_F12 , _______, _______, _______, _______, KC_MINS, KC_EQL , KC_LBRC, KC_RBRC, KC_BSLS,
+//├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______,
+//├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, KC_PGDN, KC_PGUP, KC_HOME, KC_END , _______,
+//├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+//└────────┴────────┴────────┴────────┴────────┴────────┘ └────────┴────────┴────────┴────────┴────────┴────────┘
+ ),
+
+ [_R] = LAYOUT(
+//┌────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┐
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+//├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, KC_TL , KC_TR , KC_TC , KC_TRO , _______, _______, KC_TL , KC_TR , KC_TC , KC_TRO , _______,
+//├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, KC_LEFT, KC_DOWN, KC_UP , KC_RGHT, _______, _______,
+//├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, KC_PGDN, KC_PGUP, KC_HOME, KC_END , _______, _______, KC_PGDN, KC_PGUP, KC_HOME, KC_END , _______,
+//├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+//└────────┴────────┴────────┴────────┴────────┴────────┘ └────────┴────────┴────────┴────────┴────────┴────────┘
+ )
+};
+
+const rgblight_segment_t PROGMEM left[] = RGBLIGHT_LAYER_SEGMENTS(
+ {0, 12, HSV_SPRINGGREEN}
+);
+
+const rgblight_segment_t PROGMEM right[] = RGBLIGHT_LAYER_SEGMENTS(
+ {0, 12, HSV_RED}
+);
+
+const rgblight_segment_t PROGMEM capslock[] = RGBLIGHT_LAYER_SEGMENTS(
+ {2, 3, HSV_GOLD},
+ {6, 1, HSV_GOLD},
+ {11, 1, HSV_GOLD}
+);
+
+const rgblight_segment_t* const PROGMEM rgb_layers[] = RGBLIGHT_LAYERS_LIST(left, right, capslock);
+
+void keyboard_post_init_user(void) {
+ rgblight_sethsv_noeeprom(HSV_BLUE);
+ rgblight_layers = rgb_layers;
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ rgblight_set_layer_state(0, layer_state_cmp(state, _L));
+ rgblight_set_layer_state(1, layer_state_cmp(state, _R));
+ return state;
+}
+
+void suspend_power_down_user(void) {
+ rgblight_disable();
+}
+
+void suspend_wakeup_init_user(void) {
+ rgblight_enable();
+}
+
+bool is_shift_pressed = false;
+
+bool led_update_user(led_t led_state) {
+ rgblight_set_layer_state(2, is_shift_pressed != led_state.caps_lock);
+ return true;
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t* record) {
+ switch (keycode) {
+ case KC_LSFT:
+ case KC_RSFT:
+ is_shift_pressed = record->event.pressed;
+ rgblight_set_layer_state(2, is_shift_pressed != host_keyboard_led_state().caps_lock);
+ default:
+ return true;
+ }
+}
diff --git a/keyboards/keebio/nyquist/keymaps/georgepetri3/readme.md b/keyboards/keebio/nyquist/keymaps/georgepetri3/readme.md
new file mode 100644
index 00000000000..db4af6b314a
--- /dev/null
+++ b/keyboards/keebio/nyquist/keymaps/georgepetri3/readme.md
@@ -0,0 +1,52 @@
+# George Petri's Nyquist rev3 layout
+
+```
+sudo make keebio/nyquist/rev3:georgepetri3:dfu
+```
+
+Features a dedicated navigation layer on rise and current layer status on rgb underglow.
+
+### Base Layer
+```
+┌──────┬──────┬──────┬──────┬──────┬──────┐ ┌──────┬──────┬──────┬──────┬──────┬──────┐
+│ GRAVE│ 1 │ 2 │ 3 │ 4 │ 5 │ │ 6 │ 7 │ 8 │ 9 │ 0 │ BSPC │
+├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
+│ TAB │ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │ DEL │
+├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
+│ ESC │ A │ S │ D │ F │ G │ │ H │ J │ K │ L │ SCLN│ QUOT │
+├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
+│ LSFT│ Z │ X │ C │ V │ B │ │ N │ M │ COMM│ DOT │ SLSH│ ENT │
+├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
+│ CAPS│ LCTL│ LGUI │ LALT │MO(_L)│ SPC │ │ RSFT│MO(_R)│ LEFT│ DOWN│ UP │ RGHT │
+└──────┴──────┴──────┴──────┴──────┴──────┘ └──────┴──────┴──────┴──────┴──────┴──────┘
+```
+
+### Lower
+```
+┌──────┬──────┬──────┬──────┬──────┬──────┐ ┌──────┬──────┬──────┬──────┬──────┬──────┐
+│ │ F1 │ F2 │ F3 │ F4 │ F5 │ │ F6 │ F7 │ F8 │ F9 │ F10 │ │
+├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
+│ │ F11 │ F12 │ │ │ │ │ │ MINS│ EQL │ LBRC│ RBRC│ BSLS │
+├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
+│ │ │ │ │ │ │ │ LEFT│ DOWN│ UP │ RGHT│ │ │
+├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
+│ │ │ │ │ │ │ │ │ PGDN│ PGUP │ HOME│ END │ │
+├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │
+└──────┴──────┴──────┴──────┴──────┴──────┘ └──────┴──────┴──────┴──────┴──────┴──────┘
+```
+
+### Rise
+```
+┌──────┬──────┬──────┬──────┬──────┬──────┐ ┌──────┬──────┬──────┬──────┬──────┬──────┐
+│ │ │ │ │ │ │ │ │ │ │ │ │ │
+├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
+│ │ TAB_L│ TAB_R│ TAB_C│ TAB_R│ │ │ │ TAB_L│ TAB_R│ TAB_C│ TAB_R│ │
+├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
+│ │ LEFT│ DOWN│ UP │ RGHT│ │ │ LEFT│ DOWN│ UP │ RGHT│ │ │
+├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
+│ │ PGDN│ PGUP│ HOME│ END │ │ │ │ PGDN│ PGUP│ HOME│ END │ │
+├──────┼──────┼──────┼──────┼──────┼──────┤ ├──────┼──────┼──────┼──────┼──────┼──────┤
+│ │ │ │ │ │ │ │ │ │ │ │ │ │
+└──────┴──────┴──────┴──────┴──────┴──────┘ └──────┴──────┴──────┴──────┴──────┴──────┘
+```
diff --git a/keyboards/keebio/nyquist/keymaps/georgepetri3/rules.mk b/keyboards/keebio/nyquist/keymaps/georgepetri3/rules.mk
new file mode 100644
index 00000000000..4010d90f03c
--- /dev/null
+++ b/keyboards/keebio/nyquist/keymaps/georgepetri3/rules.mk
@@ -0,0 +1,5 @@
+MOUSEKEY_ENABLE = no
+COMMAND_ENABLE = no
+RGBLIGHT_ENABLE = yes
+LTO_ENABLE = yes
+DEBOUNCE_TYPE = eager_pk
diff --git a/keyboards/keebio/nyquist/rev2/rev2.c b/keyboards/keebio/nyquist/rev2/rev2.c
index 9922b8995ab..b5652e06d3e 100644
--- a/keyboards/keebio/nyquist/rev2/rev2.c
+++ b/keyboards/keebio/nyquist/rev2/rev2.c
@@ -1,21 +1,18 @@
#include "rev2.h"
-#ifdef SSD1306OLED
-void led_set_kb(uint8_t usb_led) {
- // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
- led_set_user(usb_led);
-}
+void eeconfig_init_kb(void) {
+#ifdef BACKLIGHT_ENABLE
+ backlight_enable();
+ backlight_level(5);
+#endif
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(0, 255, 255); // Set default HSV - red hue, full saturation, full brightness
+#ifdef RGBLIGHT_ANIMATIONS
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2); // set to RGB_RAINBOW_SWIRL by default
+#endif
#endif
-void matrix_init_kb(void) {
-
- // // green led on
- // DDRD |= (1<<5);
- // PORTD &= ~(1<<5);
-
- // // orange led on
- // DDRB |= (1<<0);
- // PORTB &= ~(1<<0);
-
- matrix_init_user();
-};
+ eeconfig_update_kb(0);
+ eeconfig_init_user();
+}
diff --git a/keyboards/keebio/nyquist/rev3/rev3.c b/keyboards/keebio/nyquist/rev3/rev3.c
index 34500fb104d..6d7dc3531d6 100644
--- a/keyboards/keebio/nyquist/rev3/rev3.c
+++ b/keyboards/keebio/nyquist/rev3/rev3.c
@@ -1,21 +1,18 @@
#include "rev3.h"
-#ifdef SSD1306OLED
-void led_set_kb(uint8_t usb_led) {
- // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
- led_set_user(usb_led);
-}
+void eeconfig_init_kb(void) {
+#ifdef BACKLIGHT_ENABLE
+ backlight_enable();
+ backlight_level(5);
+#endif
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(0, 255, 255); // Set default HSV - red hue, full saturation, full brightness
+#ifdef RGBLIGHT_ANIMATIONS
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2); // set to RGB_RAINBOW_SWIRL by default
+#endif
#endif
-void matrix_init_kb(void) {
-
- // // green led on
- // DDRD |= (1<<5);
- // PORTD &= ~(1<<5);
-
- // // orange led on
- // DDRB |= (1<<0);
- // PORTB &= ~(1<<0);
-
- matrix_init_user();
-};
+ eeconfig_update_kb(0);
+ eeconfig_init_user();
+}
diff --git a/keyboards/keebio/quefrency/keymaps/bcat/keymap.c b/keyboards/keebio/quefrency/keymaps/bcat/keymap.c
index d74a55b4b11..8ccfa879fb5 100644
--- a/keyboards/keebio/quefrency/keymaps/bcat/keymap.c
+++ b/keyboards/keebio/quefrency/keymaps/bcat/keymap.c
@@ -5,7 +5,7 @@ enum layer {
LAYER_FUNCTION,
};
-#define LY_FUNC MO(LAYER_FUNCTION)
+#define LY_FN MO(LAYER_FUNCTION)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Default layer: http://www.keyboard-layout-editor.com/#/gists/60a262432bb340b37d364a4424f3037b */
@@ -14,7 +14,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_PGUP,
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
- KC_LCTL, KC_LGUI, KC_LALT, LY_FUNC, KC_SPC, KC_SPC, XXXXXXX, KC_RALT, LY_FUNC, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT
+ KC_LCTL, KC_LGUI, KC_LALT, LY_FN, KC_SPC, KC_SPC, XXXXXXX, KC_RALT, LY_FN, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
),
/* Function layer: http://www.keyboard-layout-editor.com/#/gists/59636898946da51f91fb290f8e078b4d */
@@ -22,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, RGB_HUI,
KC_CAPS, _______, KC_MPLY, KC_VOLU, KC_MSTP, _______, EEP_RST, RESET, KC_PSCR, KC_SLCK, KC_PAUS, _______, _______, _______, RGB_SAI,
_______, _______, KC_MPRV, KC_VOLD, KC_MNXT, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_SAD,
- _______, _______, _______, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, RGB_HUD,
+ _______, KC_APP, _______, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI, RGB_HUD,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_RMOD, RGB_VAD, RGB_MOD
),
};
diff --git a/keyboards/keebio/quefrency/keymaps/bcat/readme.md b/keyboards/keebio/quefrency/keymaps/bcat/readme.md
index 0436e1d2ce1..9499d717592 100644
--- a/keyboards/keebio/quefrency/keymaps/bcat/readme.md
+++ b/keyboards/keebio/quefrency/keymaps/bcat/readme.md
@@ -1,17 +1,17 @@
# bcat's Quefrency 65% layout
-This is pretty much a stock 65% split keyboard layout, with an HHKB-style
-(split) backspace, media keys in the function layer centered around the ESDF
-cluster, and RGB controls in the function layer on the arrow/nav keys.
+This is a standard 65% keyboard layout, with a split spacebar, an HHKB-style
+(split) backspace, media controls in the function layer (centered around the
+ESDF cluster), and RGB controls in the function layer (on the arrow/nav keys).
## Default layer
-
+
([KLE](http://www.keyboard-layout-editor.com/#/gists/60a262432bb340b37d364a4424f3037b))
## Function layer
-
+
([KLE](http://www.keyboard-layout-editor.com/#/gists/59636898946da51f91fb290f8e078b4d))
diff --git a/keyboards/keebio/quefrency/keymaps/via/keymap.c b/keyboards/keebio/quefrency/keymaps/via/keymap.c
new file mode 100644
index 00000000000..f70a5bab9a0
--- /dev/null
+++ b/keyboards/keebio/quefrency/keymaps/via/keymap.c
@@ -0,0 +1,51 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_all(
+ KC_F1, KC_F2, KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_DEL, KC_BSPC, KC_HOME,
+ KC_F3, KC_F4, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END,
+ KC_F5, KC_F6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGUP,
+ KC_F7, KC_F8, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_F9, KC_F10, KC_LCTL, KC_LALT, KC_LGUI, MO(1), KC_SPC, KC_SPC, MO(1), KC_SPC, KC_RALT, KC_RCTL, KC_RGUI, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT_all(
+ _______, _______, KC_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_BSPC, _______,
+ _______, _______, RGB_TOG, RGB_MOD, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, KC_TILD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [2] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [3] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ if (clockwise) {
+ tap_code(KC_PGDN);
+ } else {
+ tap_code(KC_PGUP);
+ }
+ } else if (index == 1) {
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ }
+}
diff --git a/keyboards/keebio/quefrency/keymaps/via/rules.mk b/keyboards/keebio/quefrency/keymaps/via/rules.mk
new file mode 100644
index 00000000000..540fc2ac3fe
--- /dev/null
+++ b/keyboards/keebio/quefrency/keymaps/via/rules.mk
@@ -0,0 +1,3 @@
+VIA_ENABLE = yes
+CONSOLE_ENABLE = yes
+LINK_TIME_OPTIMIZATION_ENABLE = yes
diff --git a/keyboards/keebio/quefrency/rev1/config.h b/keyboards/keebio/quefrency/rev1/config.h
index 1e3be6347ac..815a3e19717 100644
--- a/keyboards/keebio/quefrency/rev1/config.h
+++ b/keyboards/keebio/quefrency/rev1/config.h
@@ -23,7 +23,7 @@ along with this program. If not, see .
#define PRODUCT_ID 0x1257
#define DEVICE_VER 0x0100
#define MANUFACTURER Keebio
-#define PRODUCT Quefrency
+#define PRODUCT Quefrency Rev. 1
#define DESCRIPTION Split 60/65 percent staggered keyboard
/* key matrix size */
@@ -55,3 +55,6 @@ along with this program. If not, see .
#define RGB_DI_PIN D3
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 16 // Number of LEDs
+
+// Set 65% column (option 1) and Macro (option 2) on by default
+#define VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT 0x06
diff --git a/keyboards/keebio/quefrency/rev1/rev1.c b/keyboards/keebio/quefrency/rev1/rev1.c
index a690a7eff7b..567730535d6 100644
--- a/keyboards/keebio/quefrency/rev1/rev1.c
+++ b/keyboards/keebio/quefrency/rev1/rev1.c
@@ -1,5 +1,14 @@
#include "quefrency.h"
-void matrix_init_kb(void) {
- matrix_init_user();
-};
+void eeconfig_init_kb(void) {
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(0, 255, 255); // Set default HSV - red hue, full saturation, full brightness
+#ifdef RGBLIGHT_ANIMATIONS
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2); // set to RGB_RAINBOW_SWIRL by default
+#endif
+#endif
+
+ eeconfig_update_kb(0);
+ eeconfig_init_user();
+}
diff --git a/keyboards/keebio/quefrency/rev1/rev1.h b/keyboards/keebio/quefrency/rev1/rev1.h
index 137aa41c2f7..da62f904cc3 100644
--- a/keyboards/keebio/quefrency/rev1/rev1.h
+++ b/keyboards/keebio/quefrency/rev1/rev1.h
@@ -79,7 +79,6 @@
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \
}
-
#define LAYOUT_65_with_macro( \
LA9, LA8, LA1, LA2, LA3, LA4, LA5, LA6, LA7, RA1, RA2, RA3, RA4, RA5, RA6, RA7, RA8, RA9, \
LB9, LB8, LB1, LB2, LB3, LB4, LB5, LB6, RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8, RB9, \
@@ -101,3 +100,25 @@
{ RE1, RE2, RE9, RE4, RE5, RE6, RE7, RE8 }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RA9, RB9 } \
}
+
+#define LAYOUT_all( \
+ LA9, LA8, LA1, LA2, LA3, LA4, LA5, LA6, LA7, RA1, RA2, RA3, RA4, RA5, RA6, RA7, RA8, RA9, \
+ LB9, LB8, LB1, LB2, LB3, LB4, LB5, LB6, RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8, RB9, \
+ LC9, LC8, LC1, LC2, LC3, LC4, LC5, LC6, RC1, RC2, RC3, RC4, RC5, RC6, RC7x,RC8, RC9, \
+ LD9, LD8, LD1, LD2x,LD3, LD4, LD5, LD6, LD7, RD1, RD2, RD3, RD4, RD6, RD7, RD8, RD9, \
+ LE9, LE8, LE1, LE2, LE3, LE5, LE6x,LE7, RE1, RE2, RE4, RE5, RE6, RE7, RE8, RE9 \
+ ) \
+ { \
+ { LA1, LA2, LA3, LA4, LA5, LA6, LA7, LA8 }, \
+ { LB1, LB2, LB3, LB4, LB5, LB6, LB9, LB8 }, \
+ { LC1, LC2, LC3, LC4, LC5, LC6, LC9, LC8 }, \
+ { LD1, LD9, LD3, LD4, LD5, LD6, LD7, LD8 }, \
+ { LE1, LE2, LE3, LA9, LE5, LE9, LE7, LE8 }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { RA1, RA2, RA3, RA4, RA5, RA6, RA7, RA8 }, \
+ { RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8 }, \
+ { RC1, RC2, RC3, RC4, RC5, RC6, RC9, RC8 }, \
+ { RD1, RD2, RD3, RD4, RD9, RD6, RD7, RD8 }, \
+ { RE1, RE2, RE9, RE4, RE5, RE6, RE7, RE8 }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RA9, RB9 } \
+ }
diff --git a/keyboards/keebio/quefrency/rev1/rules.mk b/keyboards/keebio/quefrency/rev1/rules.mk
index e69de29bb2d..58e9a76b230 100644
--- a/keyboards/keebio/quefrency/rev1/rules.mk
+++ b/keyboards/keebio/quefrency/rev1/rules.mk
@@ -0,0 +1 @@
+BOOTLOADER = caterina
diff --git a/keyboards/keebio/quefrency/rev2/config.h b/keyboards/keebio/quefrency/rev2/config.h
index 4463eb73963..ba85dc0f6ec 100644
--- a/keyboards/keebio/quefrency/rev2/config.h
+++ b/keyboards/keebio/quefrency/rev2/config.h
@@ -20,10 +20,10 @@ along with this program. If not, see .
/* USB Device descriptor parameter */
#define VENDOR_ID 0xCB10
-#define PRODUCT_ID 0x1257
+#define PRODUCT_ID 0x2257
#define DEVICE_VER 0x0200
#define MANUFACTURER Keebio
-#define PRODUCT Quefrency
+#define PRODUCT Quefrency Rev. 2
#define DESCRIPTION Split 60/65 percent staggered keyboard
/* key matrix size */
@@ -38,15 +38,16 @@ along with this program. If not, see .
#define MATRIX_ROW_PINS_RIGHT { B3, B2, B6, B4, D7 }
#define MATRIX_COL_PINS_RIGHT { F1, F0, F4, F5, F6, D5, C7, D3, B7 }
#define SPLIT_HAND_PIN F7
-#define ENCODERS_PAD_A { F6 }
-#define ENCODERS_PAD_B { F5 }
-#define ENCODERS_PAD_A_RIGHT { D4 }
-#define ENCODERS_PAD_B_RIGHT { D6 }
+#define ENCODERS_PAD_A { F5 }
+#define ENCODERS_PAD_B { F6 }
+#define ENCODERS_PAD_A_RIGHT { D6 }
+#define ENCODERS_PAD_B_RIGHT { D4 }
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
#define BACKLIGHT_PIN B5
+#define CAPS_LOCK_LED_PIN B6
/* serial.c configuration for split keyboard */
#define SOFT_SERIAL_PIN D0
@@ -62,3 +63,7 @@ along with this program. If not, see .
#define RGBLED_NUM 16 // Number of LEDs
#define RGBLED_SPLIT { 8, 8 }
#define RGBLIGHT_LED_MAP { 1, 2, 3, 12, 13, 14, 15, 0, 7, 6, 5, 4, 11, 10, 9, 8 }
+
+// Set 65% column (option 3) and Macro (option 4) on by default
+#define VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT 0x0018
+#define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 2
diff --git a/keyboards/keebio/quefrency/rev2/rev2.c b/keyboards/keebio/quefrency/rev2/rev2.c
index d713a0ff3a6..69edfd415ff 100644
--- a/keyboards/keebio/quefrency/rev2/rev2.c
+++ b/keyboards/keebio/quefrency/rev2/rev2.c
@@ -1 +1,32 @@
#include "quefrency.h"
+#include "split_util.h"
+
+void matrix_init_kb(void) {
+ setPinOutput(CAPS_LOCK_LED_PIN);
+ matrix_init_user();
+}
+
+bool led_update_kb(led_t led_state) {
+ // Only update if left half
+ if (isLeftHand && led_update_user(led_state)) {
+ writePin(CAPS_LOCK_LED_PIN, !led_state.caps_lock);
+ }
+ return true;
+}
+
+void eeconfig_init_kb(void) {
+#ifdef BACKLIGHT_ENABLE
+ backlight_enable();
+ backlight_level(3);
+#endif
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(0, 255, 255); // Set default HSV - red hue, full saturation, full brightness
+#ifdef RGBLIGHT_ANIMATIONS
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2); // set to RGB_RAINBOW_SWIRL by default
+#endif
+#endif
+
+ eeconfig_update_kb(0);
+ eeconfig_init_user();
+}
diff --git a/keyboards/keebio/quefrency/rev2/rev2.h b/keyboards/keebio/quefrency/rev2/rev2.h
index 6d3db55842b..b9c2ef6b448 100644
--- a/keyboards/keebio/quefrency/rev2/rev2.h
+++ b/keyboards/keebio/quefrency/rev2/rev2.h
@@ -16,7 +16,7 @@
LB3, LB4, LB5, LB6, LB7, LB8, RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8, \
LC3, LC4, LC5, LC6, LC7, LC8, RC1, RC2, RC3, RC4, RC5, RC6, RC8, \
LD3, LD5, LD6, LD7, LD8, LD9, RD1, RD2, RD3, RD4, RD5, RD7, RD8, \
- LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE4, RE5, RE6, RE7, RE8 \
+ LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE3, RE4, RE5, RE7, RE8 \
) \
{ \
{ KC_NO, KC_NO, LA3, LA4, LA5, LA6, LA7, LA8, LA9 }, \
@@ -28,7 +28,7 @@
{ RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8, KC_NO }, \
{ RC1, RC2, RC3, RC4, RC5, RC6, KC_NO, RC8, KC_NO }, \
{ RD1, RD2, RD3, RD4, RD5, KC_NO, RD7, RD8, KC_NO }, \
- { RE1, RE2, KC_NO, RE4, RE5, RE6, RE7, RE8, KC_NO } \
+ { RE1, RE2, RE3, RE4, RE5, KC_NO, RE7, RE8, KC_NO } \
}
#define LAYOUT LAYOUT_60 // For backwards compatibility with Rev. 1
@@ -38,7 +38,7 @@
LB3, LB4, LB5, LB6, LB7, LB8, RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8, RB9, \
LC3, LC4, LC5, LC6, LC7, LC8, RC1, RC2, RC3, RC4, RC5, RC6, RC8, RC9, \
LD3, LD5, LD6, LD7, LD8, LD9, RD1, RD2, RD3, RD4, RD5, RD7, RD8, RD9, \
- LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE4, RE5, RE6, RE7, RE8, RE9 \
+ LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE3, RE4, RE5, RE7, RE8, RE9 \
) \
{ \
{ KC_NO, KC_NO, LA3, LA4, LA5, LA6, LA7, LA8, LA9 }, \
@@ -50,7 +50,7 @@
{ RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8, RB9 }, \
{ RC1, RC2, RC3, RC4, RC5, RC6, KC_NO, RC8, RC9 }, \
{ RD1, RD2, RD3, RD4, RD5, KC_NO, RD7, RD8, RD9 }, \
- { RE1, RE2, KC_NO, RE4, RE5, RE6, RE7, RE8, RE9 } \
+ { RE1, RE2, RE3, RE4, RE5, KC_NO, RE7, RE8, RE9 } \
}
#define LAYOUT_60_with_macro( \
@@ -58,7 +58,7 @@
LB1, LB2, LB3, LB4, LB5, LB6, LB7, LB8, RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8, \
LC1, LC2, LC3, LC4, LC5, LC6, LC7, LC8, RC1, RC2, RC3, RC4, RC5, RC6, RC8, \
LD1, LD2, LD3, LD5, LD6, LD7, LD8, LD9, RD1, RD2, RD3, RD4, RD5, RD7, RD8, \
- LE1, LE2, LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE4, RE5, RE6, RE7, RE8 \
+ LE1, LE2, LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE3, RE4, RE5, RE7, RE8 \
) \
{ \
{ LA1, LA2, LA3, LA4, LA5, LA6, LA7, LA8, LA9 }, \
@@ -70,7 +70,7 @@
{ RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8, KC_NO }, \
{ RC1, RC2, RC3, RC4, RC5, RC6, KC_NO, RC8, KC_NO }, \
{ RD1, RD2, RD3, RD4, RD5, KC_NO, RD7, RD8, KC_NO }, \
- { RE1, RE2, KC_NO, RE4, RE5, RE6, RE7, RE8, KC_NO } \
+ { RE1, RE2, RE3, RE4, RE5, KC_NO, RE7, RE8, KC_NO } \
}
#define LAYOUT_65_with_macro( \
@@ -78,7 +78,7 @@
LB1, LB2, LB3, LB4, LB5, LB6, LB7, LB8, RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8, RB9, \
LC1, LC2, LC3, LC4, LC5, LC6, LC7, LC8, RC1, RC2, RC3, RC4, RC5, RC6, RC8, RC9, \
LD1, LD2, LD3, LD5, LD6, LD7, LD8, LD9, RD1, RD2, RD3, RD4, RD5, RD7, RD8, RD9, \
- LE1, LE2, LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE4, RE5, RE6, RE7, RE8, RE9 \
+ LE1, LE2, LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE3, RE4, RE5, RE7, RE8, RE9 \
) \
{ \
{ LA1, LA2, LA3, LA4, LA5, LA6, LA7, LA8, LA9 }, \
@@ -90,7 +90,7 @@
{ RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8, RB9 }, \
{ RC1, RC2, RC3, RC4, RC5, RC6, KC_NO, RC8, RC9 }, \
{ RD1, RD2, RD3, RD4, RD5, KC_NO, RD7, RD8, RD9 }, \
- { RE1, RE2, KC_NO, RE4, RE5, RE6, RE7, RE8, RE9 } \
+ { RE1, RE2, RE3, RE4, RE5, KC_NO, RE7, RE8, RE9 } \
}
#define LAYOUT_60_iso( \
@@ -98,7 +98,7 @@
LB3, LB4, LB5, LB6, LB7, LB8, RB1, RB2, RB3, RB4, RB5, RB6, RB7, \
LC3, LC4, LC5, LC6, LC7, LC8, RC1, RC2, RC3, RC4, RC5, RC6, RC7, RC8, \
LD3, LD4, LD5, LD6, LD7, LD8, LD9, RD1, RD2, RD3, RD4, RD5, RD7, RD8, \
- LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE4, RE5, RE6, RE7, RE8 \
+ LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE3, RE4, RE5, RE7, RE8 \
) \
{ \
{ KC_NO, KC_NO, LA3, LA4, LA5, LA6, LA7, LA8, LA9 }, \
@@ -110,7 +110,7 @@
{ RB1, RB2, RB3, RB4, RB5, RB6, RB7, KC_NO, KC_NO }, \
{ RC1, RC2, RC3, RC4, RC5, RC6, RC7, RC8, KC_NO }, \
{ RD1, RD2, RD3, RD4, RD5, KC_NO, RD7, RD8, KC_NO }, \
- { RE1, RE2, KC_NO, RE4, RE5, RE6, RE7, RE8, KC_NO } \
+ { RE1, RE2, RE3, RE4, RE5, KC_NO, RE7, RE8, KC_NO } \
}
#define LAYOUT_65_iso( \
@@ -118,7 +118,7 @@
LB3, LB4, LB5, LB6, LB7, LB8, RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB9, \
LC3, LC4, LC5, LC6, LC7, LC8, RC1, RC2, RC3, RC4, RC5, RC6, RC7, RC8, RC9, \
LD3, LD4, LD5, LD6, LD7, LD8, LD9, RD1, RD2, RD3, RD4, RD5, RD7, RD8, RD9, \
- LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE4, RE5, RE6, RE7, RE8, RE9 \
+ LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE3, RE4, RE5, RE7, RE8, RE9 \
) \
{ \
{ KC_NO, KC_NO, LA3, LA4, LA5, LA6, LA7, LA8, LA9 }, \
@@ -130,7 +130,7 @@
{ RB1, RB2, RB3, RB4, RB5, RB6, RB7, KC_NO, RB9 }, \
{ RC1, RC2, RC3, RC4, RC5, RC6, RC7, RC8, RC9 }, \
{ RD1, RD2, RD3, RD4, RD5, KC_NO, RD7, RD8, RD9 }, \
- { RE1, RE2, KC_NO, RE4, RE5, RE6, RE7, RE8, RE9 } \
+ { RE1, RE2, RE3, RE4, RE5, KC_NO, RE7, RE8, RE9 } \
}
#define LAYOUT_60_iso_with_macro( \
@@ -138,7 +138,7 @@
LB1, LB2, LB3, LB4, LB5, LB6, LB7, LB8, RB1, RB2, RB3, RB4, RB5, RB6, RB7, \
LC1, LC2, LC3, LC4, LC5, LC6, LC7, LC8, RC1, RC2, RC3, RC4, RC5, RC6, RC7, RC8, \
LD1, LD2, LD3, LD4, LD5, LD6, LD7, LD8, LD9, RD1, RD2, RD3, RD4, RD5, RD7, RD8, \
- LE1, LE2, LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE4, RE5, RE6, RE7, RE8 \
+ LE1, LE2, LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE3, RE4, RE5, RE7, RE8 \
) \
{ \
{ LA1, LA2, LA3, LA4, LA5, LA6, LA7, LA8, LA9 }, \
@@ -150,7 +150,7 @@
{ RB1, RB2, RB3, RB4, RB5, RB6, RB7, KC_NO, KC_NO }, \
{ RC1, RC2, RC3, RC4, RC5, RC6, RC7, RC8, KC_NO }, \
{ RD1, RD2, RD3, RD4, RD5, KC_NO, RD7, RD8, KC_NO }, \
- { RE1, RE2, KC_NO, RE4, RE5, RE6, RE7, RE8, KC_NO } \
+ { RE1, RE2, RE3, RE4, RE5, KC_NO, RE7, RE8, KC_NO } \
}
#define LAYOUT_65_iso_with_macro( \
@@ -158,7 +158,7 @@
LB1, LB2, LB3, LB4, LB5, LB6, LB7, LB8, RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB9, \
LC1, LC2, LC3, LC4, LC5, LC6, LC7, LC8, RC1, RC2, RC3, RC4, RC5, RC6, RC7, RC8, RC9, \
LD1, LD2, LD3, LD4, LD5, LD6, LD7, LD8, LD9, RD1, RD2, RD3, RD4, RD5, RD7, RD8, RD9, \
- LE1, LE2, LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE4, RE5, RE6, RE7, RE8, RE9 \
+ LE1, LE2, LE3, LE4, LE5, LE6, LE8, RE1, RE2, RE3, RE4, RE5, RE7, RE8, RE9 \
) \
{ \
{ LA1, LA2, LA3, LA4, LA5, LA6, LA7, LA8, LA9 }, \
@@ -170,7 +170,7 @@
{ RB1, RB2, RB3, RB4, RB5, RB6, RB7, KC_NO, RB9 }, \
{ RC1, RC2, RC3, RC4, RC5, RC6, RC7, RC8, RC9 }, \
{ RD1, RD2, RD3, RD4, RD5, KC_NO, RD7, RD8, RD9 }, \
- { RE1, RE2, KC_NO, RE4, RE5, RE6, RE7, RE8, RE9 } \
+ { RE1, RE2, RE3, RE4, RE5, KC_NO, RE7, RE8, RE9 } \
}
#define LAYOUT_all( \
@@ -178,7 +178,7 @@
LB1, LB2, LB3, LB4, LB5, LB6, LB7, LB8, RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8, RB9, \
LC1, LC2, LC3, LC4, LC5, LC6, LC7, LC8, RC1, RC2, RC3, RC4, RC5, RC6, RC7, RC8, RC9, \
LD1, LD2, LD3, LD4, LD5, LD6, LD7, LD8, LD9, RD1, RD2, RD3, RD4, RD5, RD7, RD8, RD9, \
- LE1, LE2, LE3, LE4, LE5, LE6, LE7, LE8, RE1, RE2, RE4, RE5, RE6, RE7, RE8, RE9 \
+ LE1, LE2, LE3, LE4, LE5, LE6, LE7, LE8, RE1, RE2, RE3, RE4, RE5, RE7, RE8, RE9 \
) \
{ \
{ LA1, LA2, LA3, LA4, LA5, LA6, LA7, LA8, LA9 }, \
@@ -190,5 +190,5 @@
{ RB1, RB2, RB3, RB4, RB5, RB6, RB7, RB8, RB9 }, \
{ RC1, RC2, RC3, RC4, RC5, RC6, RC7, RC8, RC9 }, \
{ RD1, RD2, RD3, RD4, RD5, KC_NO, RD7, RD8, RD9 }, \
- { RE1, RE2, KC_NO, RE4, RE5, RE6, RE7, RE8, RE9 } \
+ { RE1, RE2, RE3, RE4, RE5, KC_NO, RE7, RE8, RE9 } \
}
diff --git a/keyboards/keebio/quefrency/rev2/rules.mk b/keyboards/keebio/quefrency/rev2/rules.mk
index 32e78815991..0a368deb47b 100644
--- a/keyboards/keebio/quefrency/rev2/rules.mk
+++ b/keyboards/keebio/quefrency/rev2/rules.mk
@@ -1,3 +1,4 @@
+BOOTLOADER = atmel-dfu
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
ENCODER_ENABLE = yes
diff --git a/keyboards/keebio/quefrency/rules.mk b/keyboards/keebio/quefrency/rules.mk
index a13f0478b11..2c5ad0c36b4 100644
--- a/keyboards/keebio/quefrency/rules.mk
+++ b/keyboards/keebio/quefrency/rules.mk
@@ -1,32 +1,18 @@
# MCU name
MCU = atmega32u4
-# Bootloader selection
-# Teensy halfkay
-# Pro Micro caterina
-# Atmel DFU atmel-dfu
-# LUFA DFU lufa-dfu
-# QMK DFU qmk-dfu
-# ATmega32A bootloadHID
-# ATmega328P USBasp
-BOOTLOADER = caterina
-
-# Build Options
-# change to "no" to disable the options, or define them in the Makefile in
-# the appropriate keymap folder that will get included automatically
-#
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
-RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
+RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
diff --git a/keyboards/keebio/viterbi/keymaps/ericgebhart/config.h b/keyboards/keebio/viterbi/keymaps/ericgebhart/config.h
new file mode 100644
index 00000000000..7ad7f5a4cf4
--- /dev/null
+++ b/keyboards/keebio/viterbi/keymaps/ericgebhart/config.h
@@ -0,0 +1,15 @@
+#pragma once
+
+// #define USE_I2C
+
+/* Select hand configuration */
+
+// #define MASTER_RIGHT
+// #define EE_HANDS
+
+#undef RGBLED_NUM
+#define RGBLIGHT_ANIMATIONS
+#define RGBLED_NUM 12
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
diff --git a/keyboards/keebio/viterbi/keymaps/ericgebhart/keymap.c b/keyboards/keebio/viterbi/keymaps/ericgebhart/keymap.c
new file mode 100644
index 00000000000..baf6637eaa9
--- /dev/null
+++ b/keyboards/keebio/viterbi/keymaps/ericgebhart/keymap.c
@@ -0,0 +1,193 @@
+/*
+ Copyright 2018 Eric Gebhart
+
+ 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 .
+*/
+
+#include "keymap_bepo.h"
+#include "ericgebhart.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [DVORAK] = LAYOUT_ortho_5x14_wrapper(
+ KC_GRV, ___12_DVORAK_1___, KC_SLASH,
+ TAB_BKTAB, ___12_DVORAK_2___, KC_MINUS,
+ KC_LSFT, ___12_DVORAK_3___, KC_RSFT,
+ ___ORTHO_14_BOTTOM___,
+ ___ORTHO_14_THUMBS_BOTTOM___
+ ),
+
+ [QWERTY] = LAYOUT_ortho_5x14_wrapper(
+ KC_GRV, ___12_QWERTY_1___, KC_SLASH,
+ TAB_BKTAB, ___12_QWERTY_2___, KC_MINUS,
+ KC_LSFT, ___12_QWERTY_3___, KC_RSFT,
+ ___ORTHO_14_BOTTOM___,
+ ___ORTHO_14_THUMBS_BOTTOM___
+ ),
+
+ [COLEMAK] = LAYOUT_ortho_5x14_wrapper(
+ KC_GRV, ___12_COLEMAK_1___, KC_SLASH,
+ TAB_BKTAB, ___12_COLEMAK_2___, KC_MINUS,
+ KC_LSFT, ___12_COLEMAK_3___, KC_RSFT,
+ ___ORTHO_14_BOTTOM___,
+ ___ORTHO_14_THUMBS_BOTTOM___
+ ),
+
+ [WORKMAN] = LAYOUT_ortho_5x14_wrapper(
+ KC_GRV, ___12_WORKMAN_1___, KC_SLASH,
+ TAB_BKTAB, ___12_WORKMAN_2___, KC_MINUS,
+ KC_LSFT, ___12_WORKMAN_3___, KC_RSFT,
+ ___ORTHO_14_BOTTOM___,
+ ___ORTHO_14_THUMBS_BOTTOM___
+ ),
+
+ [NORMAN] = LAYOUT_ortho_5x14_wrapper(
+ KC_GRV, ___12_NORMAN_1___, KC_SLASH,
+ TAB_BKTAB, ___12_NORMAN_2___, KC_MINUS,
+ KC_LSFT, ___12_NORMAN_3___, KC_RSFT,
+ ___ORTHO_14_BOTTOM___,
+ ___ORTHO_14_THUMBS_BOTTOM___
+ ),
+
+ [DVORAK_ON_BEPO] = LAYOUT_ortho_5x14_wrapper(
+ KC_GRV, ___12_DVORAK_B_1___, KC_SLASH,
+ TAB_BKTAB, ___12_DVORAK_B_2___, KC_MINUS,
+ KC_LSFT, ___12_DVORAK_B_3___, KC_RSFT,
+ ___ORTHO_14_BOTTOM_FR___,
+ ___ORTHO_14_THUMBS_BOTTOM___
+ ),
+
+ [BEPO] = LAYOUT_ortho_5x14_wrapper(
+ KC_GRV, ___12_DVORAK_B_1___, KC_SLASH,
+ TAB_BKTAB, ___12_DVORAK_B_2___, KC_MINUS,
+ KC_LSFT, ___12_DVORAK_B_3___, KC_RSFT,
+ ___ORTHO_14_BOTTOM_BP___,
+ ___ORTHO_14_THUMBS_BOTTOM___
+ ),
+
+ [XMONAD] = LAYOUT_ortho_5x14_wrapper(
+ ___, ___12_DVORAK_1___, ___,
+ ___, ___12_DVORAK_2___, ___,
+ ___, ___12_DVORAK_3___, ___,
+ ___14___,
+ ___14___
+ ),
+
+ [XMONAD_FR] = LAYOUT_ortho_5x14_wrapper(
+ ___, ___12_DVORAK_B_1___, ___,
+ ___, ___12_DVORAK_B_2___, ___,
+ ___, ___12_DVORAK_B_3___, ___,
+ ___14___,
+ ___14___
+ ),
+
+
+ // SYMBOLS
+ [SYMB] = LAYOUT_ortho_5x14_wrapper(
+ ___14_SYMB_1___,
+ ___14_SYMB_2___,
+ ___14_SYMB_3___,
+ ___14_SYMB_4___,
+ ___14___
+ ),
+
+ [KEYPAD] = LAYOUT_ortho_5x14_wrapper(
+ ___14_KP_1___,
+ ___14_KP_2___,
+ ___14_KP_3___,
+ ___14_KP_4___,
+ ___14___
+ ),
+
+ [KEYPAD_ON_BEPO] = LAYOUT_ortho_5x14_wrapper(
+ ___14_KP_B_1___,
+ ___14_KP_B_2___,
+ ___14_KP_B_3___,
+ ___14_KP_B_4___,
+ ___14___
+ ),
+
+ [SYMB_ON_BEPO] = LAYOUT_ortho_5x14_wrapper(
+ ___14_SYMB_B_1___,
+ ___14_SYMB_B_2___,
+ ___14_SYMB_B_3___,
+ ___14_SYMB_B_4___,
+ ___14___
+ ),
+
+ // MEDIA AND MOUSE
+ [MDIA] = LAYOUT_ortho_5x14_wrapper(
+ ___14_MDIA_1___,
+ ___14_MDIA_2___,
+ ___14_MDIA_3___,
+ ___14_MDIA_4___,
+ ___14___
+ ),
+
+ [LAYERS] = LAYOUT_ortho_5x14_wrapper(
+ ___14_LAYERS_1___,
+ ___14_LAYERS_2___,
+ ___14_LAYERS_3___,
+ ___14___,
+ ___14___
+ ),
+
+ [_RGB] = LAYOUT_ortho_5x14_wrapper(
+ ___14_RGB_1___,
+ ___14_RGB_2___,
+ ___14_RGB_3___,
+ ___14___,
+ ___14___
+ ),
+};
+
+/* bool process_record_user(uint16_t keycode, keyrecord_t *record) { */
+/* switch (keycode) { */
+/* case QWERTY: */
+/* if (record->event.pressed) { */
+/* set_single_persistent_default_layer(_QWERTY); */
+/* } */
+/* return false; */
+/* break; */
+/* case LOWER: */
+/* if (record->event.pressed) { */
+/* layer_on(_LOWER); */
+/* update_tri_layer(_LOWER, _RAISE, _ADJUST); */
+/* } else { */
+/* layer_off(_LOWER); */
+/* update_tri_layer(_LOWER, _RAISE, _ADJUST); */
+/* } */
+/* return false; */
+/* break; */
+/* case RAISE: */
+/* if (record->event.pressed) { */
+/* layer_on(_RAISE); */
+/* update_tri_layer(_LOWER, _RAISE, _ADJUST); */
+/* } else { */
+/* layer_off(_RAISE); */
+/* update_tri_layer(_LOWER, _RAISE, _ADJUST); */
+/* } */
+/* return false; */
+/* break; */
+/* case ADJUST: */
+/* if (record->event.pressed) { */
+/* layer_on(_ADJUST); */
+/* } else { */
+/* layer_off(_ADJUST); */
+/* } */
+/* return false; */
+/* break; */
+/* } */
+/* return true; */
+/* } */
diff --git a/keyboards/keebio/viterbi/keymaps/vosechu/config.h b/keyboards/keebio/viterbi/keymaps/vosechu/config.h
new file mode 100644
index 00000000000..0faddd17c2f
--- /dev/null
+++ b/keyboards/keebio/viterbi/keymaps/vosechu/config.h
@@ -0,0 +1,41 @@
+/*
+Copyright 2017 Chuck Lauer Vose
+
+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 .
+*/
+
+#pragma once
+
+#undef RGBLED_NUM
+#define RGBLIGHT_ANIMATIONS
+#define RGBLED_NUM 3
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+
+#define RGBLIGHT_SLEEP // Put the keyboard to sleep when USB goes dark
+
+#define LAYOUT_ortho_half_5x7( \
+ L00, L01, L02, L03, L04, L05, L06, \
+ L10, L11, L12, L13, L14, L15, L16, \
+ L20, L21, L22, L23, L24, L25, L26, \
+ L30, L31, L32, L33, L34, L35, L36, \
+ L40, L41, L42, L43, L44, L45, L46 \
+ ) \
+ LAYOUT_ortho_5x14( \
+ L00, L01, L02, L03, L04, L05, L06, KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO, \
+ L10, L11, L12, L13, L14, L15, L16, KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO, \
+ L20, L21, L22, L23, L24, L25, L26, KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO, \
+ L30, L31, L32, L33, L34, L35, L36, KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO, \
+ L40, L41, L42, L43, L44, L45, L46, KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO , KC_NO \
+ )
diff --git a/keyboards/keebio/viterbi/keymaps/vosechu/keymap.c b/keyboards/keebio/viterbi/keymaps/vosechu/keymap.c
new file mode 100644
index 00000000000..bbaa448574c
--- /dev/null
+++ b/keyboards/keebio/viterbi/keymaps/vosechu/keymap.c
@@ -0,0 +1,91 @@
+#include QMK_KEYBOARD_H
+#include "vosechu.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[BASE] = LAYOUT_ortho_half_5x7( // Base layer
+ KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_9 ,
+ ALT_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , TT(TT1) ,
+ CTL_ESC , KC_A , KC_S , KC_D , KC_F , KC_G , TT(TT2) ,
+ KC_F13 , KC_Z , KC_X , KC_C , KC_V , KC_B , TT(TT3) ,
+ KC_MEH , CTL_GRV , ALT_TAB , KC_LALT , MO(LWR) , LFT_BK , SFT_SPC
+),
+[LWR] = LAYOUT_ortho_half_5x7( // EVE layer
+ _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
+ A(KC_LEFT), KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F9 ,
+ SFT_SPC , A(KC_F1), A(KC_F2), A(KC_F3), A(KC_F4), _______ , _______ ,
+ A(KC_RGHT), C(KC_F1), C(KC_F2), C(KC_F3), C(KC_F4), _______ , _______ ,
+ _______ , RESET , _______ , _______ , _LAYER_ , KC_DEL , KC_ENT
+),
+[LFT] = LAYOUT_ortho_half_5x7( // Media
+ _______ , KC_F10 , KC_F11 , KC_F12 , KC_PSCR , KC_SLCK , KC_PAUS ,
+ _______ , KC_F7 , KC_F8 , KC_F9 , KC_INS , KC_HOME , KC_PGUP ,
+ RGB_TOG , KC_F4 , KC_F5 , KC_F6 , KC_DEL , KC_END , KC_PGDN ,
+ _______ , KC_F1 , KC_F2 , KC_F3 , KC_VOLU , KC_VOLD , KC_MUTE ,
+ _______ , _______ , _______ , _______ , PSWD , _LAYER_ , PSWD_ALT
+),
+[TT1] = LAYOUT_ortho_half_5x7( // Override WASD with arrows
+ _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
+ _______ , _______ , KC_UP , _______ , _______ , _______ , _______ ,
+ _______ , KC_LEFT , KC_DOWN , KC_RGHT , _______ , _______ , _______ ,
+ _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
+ _______ , _______ , _______ , _______ , _______ , _______ , _______
+),
+[TT2] = LAYOUT_ortho_half_5x7( // Browser layer
+ C(KC_W) , C(KC_1) , C(KC_T) , C(KC_9) , _______ , _______ , _______ ,
+ WBWSRBK , WTABLFT , KC_UP , WTABRGT , WBWSRFW , _______ , _______ ,
+ KC_ESC , KC_LEFT , KC_DOWN , KC_RGHT , C(KC_R) , _______ , _______ ,
+ _______ , _______ , _______ , _______ , _______ , _______ , TT(T23X),
+ _______ , _______ , _______ , _______ , _______ , _______ , _______
+),
+[TT3] = LAYOUT_ortho_half_5x7( // OS X override layer
+ _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
+ _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
+ _______ , _______ , _______ , _______ , _______ , _______ , TT(T23X),
+ _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
+ _______ , _______ , _______ , KC_LGUI , _______ , _______ , _______
+),
+[T23X] = LAYOUT_ortho_half_5x7( // Browser layer
+ G(KC_W) , G(KC_1) , G(KC_T) , G(KC_9) , _______ , SLACKTB , _______ ,
+ BWSR_BK , TAB_LFT , KC_UP , TAB_RGT , BWSR_FW , SLACKUP , _______ ,
+ KC_ESC , KC_LEFT , KC_DOWN , KC_RGHT , G(KC_R) , SLACKDN , _______ ,
+ _______ , _______ , KC_Q , KC_J , KC_K , _______ , _______ ,
+ _______ , _______ , _______ , KC_LGUI , _______ , _______ , _______
+),
+// [_EMPTY] = LAYOUT(
+// _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
+// _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
+// _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
+// _______ , _______ , _______ , _______ , _______ , _______ , _______ ,
+// _______ , _______ , _______ , _______ , _______ , _______ , _______
+// ),
+};
+
+void keyboard_post_init_user(void) {
+ // Call the post init code.
+ rgblight_enable_noeeprom(); // enables Rgb, without saving settings
+ rgblight_mode_noeeprom(0);
+ rgblight_sethsv_noeeprom(0, 0, 0);
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ switch (get_highest_layer(state)) {
+ case TT1:
+ rgblight_sethsv_noeeprom(HSV_BLUE);
+ break;
+ case TT2:
+ rgblight_sethsv_noeeprom(HSV_PURPLE);
+ break;
+ case T23X:
+ rgblight_sethsv_noeeprom(HSV_GOLD);
+ break;
+ case TT3:
+ rgblight_sethsv_noeeprom(HSV_GREEN);
+ break;
+ default: // for any other layers, or the default layer
+ rgblight_sethsv_noeeprom(0, 0, 0);
+ break;
+ }
+
+ return state;
+}
diff --git a/keyboards/keebio/viterbi/keymaps/vosechu/rules.mk b/keyboards/keebio/viterbi/keymaps/vosechu/rules.mk
new file mode 100644
index 00000000000..1e3cebb1451
--- /dev/null
+++ b/keyboards/keebio/viterbi/keymaps/vosechu/rules.mk
@@ -0,0 +1 @@
+RGBLIGHT_ENABLE = yes
diff --git a/keyboards/keebio/viterbi/rev2/rev2.c b/keyboards/keebio/viterbi/rev2/rev2.c
index 509e42dc515..dbf584f99ea 100644
--- a/keyboards/keebio/viterbi/rev2/rev2.c
+++ b/keyboards/keebio/viterbi/rev2/rev2.c
@@ -1 +1,18 @@
#include "viterbi.h"
+
+void eeconfig_init_kb(void) {
+#ifdef BACKLIGHT_ENABLE
+ backlight_enable();
+ backlight_level(5);
+#endif
+#ifdef RGBLIGHT_ENABLE
+ rgblight_enable(); // Enable RGB by default
+ rgblight_sethsv(0, 255, 255); // Set default HSV - red hue, full saturation, full brightness
+#ifdef RGBLIGHT_ANIMATIONS
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL + 2); // set to RGB_RAINBOW_SWIRL by default
+#endif
+#endif
+
+ eeconfig_update_kb(0);
+ eeconfig_init_user();
+}
diff --git a/keyboards/keebwerk/nano_slider/config.h b/keyboards/keebwerk/nano_slider/config.h
index ba079c53101..3ed356b8a98 100644
--- a/keyboards/keebwerk/nano_slider/config.h
+++ b/keyboards/keebwerk/nano_slider/config.h
@@ -161,10 +161,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
-# define NO_ACTION_MACRO
-# define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/keebwerk/nano_slider/keymaps/default/keymap.c b/keyboards/keebwerk/nano_slider/keymaps/default/keymap.c
index 85f2d55ec80..f9a14452fb1 100644
--- a/keyboards/keebwerk/nano_slider/keymaps/default/keymap.c
+++ b/keyboards/keebwerk/nano_slider/keymaps/default/keymap.c
@@ -21,7 +21,7 @@
enum layer_names {
_BASE,
_FN,
- _DEMO
+ _MEDIA
};
// Defines the keycodes used by our macros in process_record_user
@@ -30,6 +30,7 @@ enum custom_keycodes {
QMKURL
};
+
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Base */
[_BASE] = LAYOUT(
@@ -38,14 +39,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_4, KC_5, KC_6, KC_0
),
[_FN] = LAYOUT(
- TO(_DEMO),
- RGB_TOG, RGB_MOD, RGB_VAI,
- _______, _______, _______, _______
+ TO(_MEDIA),
+ RGB_TOG, RGB_MOD, RGB_VAI,
+ QMKURL, RGB_RMOD, RGB_VAD, QMKBEST
),
- [_DEMO] = LAYOUT(
+ [_MEDIA] = LAYOUT(
TO(_BASE),
- QMKBEST, _______, _______,
- _______, _______, _______, QMKURL
+ KC_VOLD, KC_VOLU, KC_F24,
+ KC_MRWD, KC_MFFD, KC_F23, KC_MPLY
)
};
diff --git a/keyboards/keycapsss/plaid_pad/usbconfig.h b/keyboards/keycapsss/plaid_pad/usbconfig.h
deleted file mode 100644
index e208e99f2e4..00000000000
--- a/keyboards/keycapsss/plaid_pad/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 0
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'K','e','y','c','a','p','s','s','s'
-#define USB_CFG_VENDOR_NAME_LEN 9
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'P', 'l', 'a', 'i', 'd', '-', 'P', 'a', 'd'
-#define USB_CFG_DEVICE_NAME_LEN 9
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-// #define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-// /* #define USB_INTR_CFG_CLR 0 */
-// /* #define USB_INTR_ENABLE EIMSK */
-// #define USB_INTR_ENABLE_BIT INT1
-// /* #define USB_INTR_PENDING EIFR */
-// #define USB_INTR_PENDING_BIT INTF1
-// #define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/kinesis/keymaps/xyverz/keymap.c b/keyboards/kinesis/keymaps/xyverz/keymap.c
index 18fdb2e08fb..ffc4459547a 100644
--- a/keyboards/kinesis/keymaps/xyverz/keymap.c
+++ b/keyboards/kinesis/keymaps/xyverz/keymap.c
@@ -28,15 +28,15 @@ enum custom_keycodes { DVORAK = SAFE_RANGE, QWERTY, COLEMAK, KEYPAD };
Dvorak layer:
,-------------------------------------------.,-------------------------------------------.
- | ] | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | [ |
+ | = | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | \ |
|--------+------+------+------+------+------||------+------+------+------+------+--------|
- | Tab | ' | , | . | P | Y || F | G | C | R | L | \ |
+ | Tab | ' | , | . | P | Y || F | G | C | R | L | / |
|--------+------+------+------+------+------||------+------+------+------+------+--------|
| CapsLk | A | O | E | U | I || D | H | T | N | S | - |
|--------+------+------+------+------+------||------+------+------+------+------+--------|
| LShift | Z | X | C | V | X || B | M | W | V | Z | RShift |
`--------+------+------+------+------+------'`------+------+------+------+------+--------'
- | ` | INS | Left | Rght | | Up | Dn | / | = |
+ | ` | INS | Left | Rght | | Up | Dn | [ | ] |
`---------------------------' `---------------------------'
,--------------.,--------------.
| LCtl | LAlt || RGUI | RCtl |
@@ -112,7 +112,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_DVORAK] = LAYOUT (
// Left Hand
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8,
- KC_RBRC, KC_1, KC_2, KC_3, KC_4, KC_5,
+ KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5,
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y,
KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I,
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X,
@@ -124,11 +124,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// Right Hand
KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, TG(_KEYPAD), RESET,
- KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC,
- KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS,
+ KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS,
+ KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH,
KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS,
KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT,
- KC_UP, KC_DOWN, KC_SLSH, KC_EQL,
+ KC_UP, KC_DOWN, KC_LBRC, KC_RBRC,
// Right Thumb
KC_RGUI, KC_RCTL,
KC_PGUP,
diff --git a/keyboards/kinesis/keymaps/xyverz/readme.md b/keyboards/kinesis/keymaps/xyverz/readme.md
index 702af4474a2..f0f55a478b4 100644
--- a/keyboards/kinesis/keymaps/xyverz/readme.md
+++ b/keyboards/kinesis/keymaps/xyverz/readme.md
@@ -2,9 +2,7 @@
## About this keymap:
-The Dvorak layout shown here stems from my early Kinesis years, using the Contour PS/2 with a Dvorak software layout. Because of this, the RBRC and LBRC were on opposite sides of the board in the corner keys. I've decided to continue using this layout with my QMK Kinesis.
-
-The QWERTY layout shown here is based entirely on the Kinesis Advantage layout. The Colemak layout is merely an adaptation of that.
+This is is pretty much a stock Advantage layout for Dvorak, with a bit of rearranging of certain keys. The QWERTY layout shown here is based entirely on the Kinesis Advantage layout. The Colemak layout is merely an adaptation of that.
I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar to the default Planck layouts.
@@ -12,6 +10,8 @@ Depending on the OS, most of the LEDs are now working in this keymap, but I stil
Removed the Media layer 2018-12-07
+Updated Dvorak layer to move slash to a position relative to my other 5x12 ortholinear keyboards 2020-05-04
+
## Still to do:
* Figure out how to make the Numpad LED work properly.
@@ -27,15 +27,15 @@ Removed the Media layer 2018-12-07
### Layer 0: Dvorak layer
,-------------------------------------------.,-------------------------------------------.
- | ] | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | [ |
+ | = | 1 | 2 | 3 | 4 | 5 || 6 | 7 | 8 | 9 | 0 | \ |
|--------+------+------+------+------+------||------+------+------+------+------+--------|
- | Tab | ' | , | . | P | Y || F | G | C | R | L | \ |
+ | Tab | ' | , | . | P | Y || F | G | C | R | L | / |
|--------+------+------+------+------+------||------+------+------+------+------+--------|
| CapsLk | A | O | E | U | I || D | H | T | N | S | - |
|--------+------+------+------+------+------||------+------+------+------+------+--------|
| LShift | Z | X | C | V | X || B | M | W | V | Z | RShift |
`--------+------+------+------+------+------'`------+------+------+------+------+--------'
- | ` | INS | Left | Rght | | Up | Dn | / | = |
+ | ` | INS | Left | Rght | | Up | Dn | [ | ] |
`---------------------------' `---------------------------'
,--------------.,--------------.
| LCtl | LAlt || RGUI | RCtl |
diff --git a/keyboards/kingly_keys/romac_plus/keymaps/via/keymap.c b/keyboards/kingly_keys/romac_plus/keymaps/via/keymap.c
new file mode 100644
index 00000000000..dccaf2e81ab
--- /dev/null
+++ b/keyboards/kingly_keys/romac_plus/keymaps/via/keymap.c
@@ -0,0 +1,17 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_7, KC_8, KC_9,
+ KC_4, KC_5, KC_6,
+ KC_1, KC_2, KC_3,
+ MO(1), KC_0, KC_DOT
+ ),
+
+ [1] = LAYOUT(
+ RGB_MOD, KC_HOME, KC_PGUP,
+ KC_TRNS, KC_END, KC_PGDN,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_ENT
+ )
+};
diff --git a/keyboards/kingly_keys/romac_plus/keymaps/via/rules.mk b/keyboards/kingly_keys/romac_plus/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/kingly_keys/romac_plus/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/kira80/config.h b/keyboards/kira80/config.h
index b9ad85eb29a..725b68d6e66 100644
--- a/keyboards/kira80/config.h
+++ b/keyboards/kira80/config.h
@@ -20,7 +20,7 @@ along with this program. If not, see .
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
+#define VENDOR_ID 0x6986
#define PRODUCT_ID 0xC583
#define DEVICE_VER 0x0102
#define MANUFACTURER EVE
diff --git a/keyboards/kira80/keymaps/via/keymap.c b/keyboards/kira80/keymaps/via/keymap.c
new file mode 100644
index 00000000000..ebac6c6bd07
--- /dev/null
+++ b/keyboards/kira80/keymaps/via/keymap.c
@@ -0,0 +1,52 @@
+/* Copyright 2020 Lorenz Wellmer
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_TRNS, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [1] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BL_TOGG, BL_DEC, BL_INC,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_VOLD,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+};
diff --git a/keyboards/kira80/keymaps/via/readme.md b/keyboards/kira80/keymaps/via/readme.md
new file mode 100644
index 00000000000..a72e88c8bae
--- /dev/null
+++ b/keyboards/kira80/keymaps/via/readme.md
@@ -0,0 +1 @@
+# VIA keymap for Kira 80
diff --git a/keyboards/kira80/keymaps/via/rules.mk b/keyboards/kira80/keymaps/via/rules.mk
new file mode 100644
index 00000000000..981c7ad4cfa
--- /dev/null
+++ b/keyboards/kira80/keymaps/via/rules.mk
@@ -0,0 +1,3 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+EXTRAKEY_ENABLE = no
diff --git a/keyboards/kira80/rules.mk b/keyboards/kira80/rules.mk
index 6e63be4ad14..02f34c5e8c5 100644
--- a/keyboards/kira80/rules.mk
+++ b/keyboards/kira80/rules.mk
@@ -17,7 +17,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
+CONSOLE_ENABLE = no # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
NKRO_ENABLE = no # USB Nkey Rollover
diff --git a/keyboards/kira80/usbconfig.h b/keyboards/kira80/usbconfig.h
deleted file mode 100644
index 33030c83161..00000000000
--- a/keyboards/kira80/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'E', 'V', 'E'
-#define USB_CFG_VENDOR_NAME_LEN 3
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'K', 'i', 'r', 'a', '8', '0'
-#define USB_CFG_DEVICE_NAME_LEN 6
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/kudox/kudox.h b/keyboards/kudox/kudox.h
index 09549fbc555..ca61ea82d12 100644
--- a/keyboards/kudox/kudox.h
+++ b/keyboards/kudox/kudox.h
@@ -22,6 +22,9 @@
#ifdef KEYBOARD_kudox_rev2
#include "rev2.h"
#endif
+#ifdef KEYBOARD_kudox_rev3
+ #include "rev3.h"
+#endif
#ifdef KEYBOARD_kudox_columner
#include "columner.h"
#endif
diff --git a/keyboards/kudox/readme.md b/keyboards/kudox/readme.md
index cc97bf83b0a..107b99b1005 100644
--- a/keyboards/kudox/readme.md
+++ b/keyboards/kudox/readme.md
@@ -5,25 +5,23 @@
|
-
+
- Keyboard Maintainer: [Kumao Kobo](https://github.com/kumaokobo)
-- Hardware Supported: Kudox PCB rev1.0 rev2.0 w/ Pro Micro
+- Hardware Supported: Kudox PCB rev1.0 rev2.0 rev3.0 w/ Pro Micro
Make example for this keyboard (after setting up your build environment):
```sh
-make kudox/rev2:default
+make kudox/rev3:default
```
Example of flashing this keyboard:
```sh
-make kudox/rev2:default:flash
+make kudox/rev3:default:flash
```
-*keymaps/default is for rev2.0. If you want to use rev1.0, you should remove Left-06 key and Right-06 key.*
-
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).
diff --git a/keyboards/kudox/rev3/config.h b/keyboards/kudox/rev3/config.h
new file mode 100644
index 00000000000..88969feed9e
--- /dev/null
+++ b/keyboards/kudox/rev3/config.h
@@ -0,0 +1,91 @@
+/* Copyright 2019 Kumao Kobo
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x9690
+#define DEVICE_VER 0x0300
+#define MANUFACTURER Kumao Kobo
+#define PRODUCT The Kudox Keyboard
+#define DESCRIPTION Split row staggered 5x7 custom keyboard
+
+/* key matrix size */
+// Rows are doubled-up
+#define MATRIX_ROWS 10
+#define MATRIX_COLS 7
+
+// wiring of each half
+#define MATRIX_ROW_PINS { D4, D7, E6, B4, B5 }
+#define MATRIX_COL_PINS { F5, F6, F7, B1, B3, B2, B6 }
+// #define MATRIX_COL_PINS { B6, B2, B3, B1, F7, F6, F5} //uncomment this line and comment line above if you need to reverse left-to-right key order
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+// #define BACKLIGHT_LEVELS 3
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
+/* 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
+
+/* ws2812 RGB LED */
+#define RGB_DI_PIN D3
+
+#undef RGBLED_NUM
+#define RGBLED_NUM 14 // Number of LEDs
+#define RGBLIGHT_ANIMATIONS
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+#define MOUSEKEY_INTERVAL 20
+#define MOUSEKEY_DELAY 0
+#define MOUSEKEY_TIME_TO_MAX 60
+#define MOUSEKEY_MAX_SPEED 7
+#define MOUSEKEY_WHEEL_DELAY 0
diff --git a/keyboards/kudox/rev3/info.json b/keyboards/kudox/rev3/info.json
new file mode 100644
index 00000000000..84b5ce0f309
--- /dev/null
+++ b/keyboards/kudox/rev3/info.json
@@ -0,0 +1,77 @@
+{
+ "url": "http://kumaokobo.com/",
+ "maintainer": "Kumao Kobo",
+ "keyboard_name": "Kudox Keyboard Rev3",
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"`", "x":0, "y":0},
+ {"label":"1", "x":1, "y":0},
+ {"label":"2", "x":2, "y":0},
+ {"label":"3", "x":3, "y":0},
+ {"label":"4", "x":4, "y":0},
+ {"label":"5", "x":5, "y":0},
+ {"label":"6", "x":6, "y":0},
+ {"label":"7", "x":10, "y":0},
+ {"label":"8", "x":11, "y":0},
+ {"label":"9", "x":12, "y":0},
+ {"label":"0", "x":13, "y":0},
+ {"label":"-", "x":14, "y":0},
+ {"label":"=", "x":15, "y":0},
+ {"label":"\u2190", "x":16, "y":0},
+ {"label":"Tab", "x":0, "y":1, "w":1.25},
+ {"label":"Q", "x":1.25, "y":1},
+ {"label":"W", "x":2.25, "y":1},
+ {"label":"E", "x":3.25, "y":1},
+ {"label":"R", "x":4.25, "y":1},
+ {"label":"T", "x":5.25, "y":1},
+ {"label":"Esc", "x":6.25, "y":1},
+ {"label":"Y", "x":9.75, "y":1},
+ {"label":"U", "x":10.75, "y":1},
+ {"label":"I", "x":11.75, "y":1},
+ {"label":"O", "x":12.75, "y":1},
+ {"label":"P", "x":13.75, "y":1},
+ {"label":"'", "x":14.75, "y":1},
+ {"label":"\\", "x":15.75, "y":1, "w":1.25},
+ {"label":"Ctrl", "x":0, "y":2, "w":1.75},
+ {"label":"A", "x":1.75, "y":2},
+ {"label":"S", "x":2.75, "y":2},
+ {"label":"D", "x":3.75, "y":2},
+ {"label":"F", "x":4.75, "y":2},
+ {"label":"G", "x":5.75, "y":2},
+ {"label":"H", "x":10.25, "y":2},
+ {"label":"J", "x":11.25, "y":2},
+ {"label":"K", "x":12.25, "y":2},
+ {"label":"L", "x":13.25, "y":2},
+ {"label":";", "x":14.25, "y":2},
+ {"label":"Enter", "x":15.25, "y":2, "w":1.75},
+ {"label":"Shift", "x":0, "y":3, "w":2.25},
+ {"label":"Z", "x":2.25, "y":3},
+ {"label":"X", "x":3.25, "y":3},
+ {"label":"C", "x":4.25, "y":3},
+ {"label":"V", "x":5.25, "y":3},
+ {"label":"B", "x":6.25, "y":3},
+ {"label":"N", "x":9.75, "y":3},
+ {"label":"M", "x":10.75, "y":3},
+ {"label":",", "x":11.75, "y":3},
+ {"label":".", "x":12.75, "y":3},
+ {"label":"/", "x":13.75, "y":3},
+ {"label":"Shift", "x":14.75, "y":3, "w":2.25},
+ {"label":"Alt", "x":0, "y":4, "w":1.25},
+ {"label":"[", "x":1.25, "y":4},
+ {"label":"]", "x":2.25, "y":4},
+ {"label":"LANG2", "x":3.25, "y":4},
+ {"label":"Enter", "x":4.25, "y":4.33, "w":1.25},
+ {"label":"GUI", "x":5.5, "y":4.67},
+ {"label":"Space", "x":6.5, "y":5},
+ {"label":"Space", "x":9.5, "y":5},
+ {"label":"GUI", "x":10.5, "y":4.67},
+ {"label":"LANG1", "x":11.5, "y":4.33, "w":1.25},
+ {"label":"\u2190", "x":12.75, "y":4},
+ {"label":"\u2193", "x":13.75, "y":4},
+ {"label":"\u2191", "x":14.75, "y":4},
+ {"label":"\u2192", "x":15.75, "y":4, "w":1.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/kudox/rev3/keymaps/default/keymap.c b/keyboards/kudox/rev3/keymaps/default/keymap.c
new file mode 100644
index 00000000000..53166e73550
--- /dev/null
+++ b/keyboards/kudox/rev3/keymaps/default/keymap.c
@@ -0,0 +1,70 @@
+#include QMK_KEYBOARD_H
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QWERTY 0
+#define _SYMB 1
+#define _LIGHT 2
+
+// Shortcut to make keymap more readable
+#define SYM_L2 LT(_SYMB, KC_LANG2)
+#define TO_LIGH TO(_LIGHT)
+#define TO_QWER TO(_QWERTY)
+
+#define KC_ALES LALT_T(KC_ESC)
+#define KC_ALEN LALT_T(KC_ENT)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_QWERTY] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐
+ KC_GRV ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_6 , KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_MINS, KC_EQL ,KC_BSPC ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_ESC , KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_SLSH ,KC_BSLS ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┘ └────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_LCTL ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G , KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN ,KC_ENT ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B , KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_UP ,KC_RSFT ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┴────────┼────────┼────────┼────────┤
+ KC_ALES ,KC_LBRC ,KC_RBRC ,SYM_L2 ,KC_ALEN ,KC_LGUI ,KC_SPC , KC_SPC ,KC_RGUI ,TO_LIGH ,KC_LANG1,KC_LEFT, KC_DOWN ,KC_RIGHT
+ //└────────┴────────┴────────┴────────┴────────┴────────┴────────┘ └────────┴────────┴────────┴────────┴────────┴────────┴────────┘
+ ),
+
+ [_SYMB] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐
+ KC_ESC ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 , KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_DEL ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ _______ ,KC_DQUO ,KC_QUOT ,KC_GRV ,KC_ASTR ,KC_PLUS ,KC_EQL , KC_LPRN ,KC_RPRN ,KC_PIPE ,KC_ASTR ,KC_TILD ,KC_CIRC ,KC_PIPE ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┘ └────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ _______ ,KC_AT ,KC_COLN ,KC_GRV ,KC_SLSH ,KC_MINS , KC_LBRC ,KC_RBRC ,KC_DOT ,KC_SLSH ,KC_MINS ,_______ ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , KC_LCBR ,KC_RCBR ,_______ ,_______ ,KC_CIRC ,_______ ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┴────────┼────────┼────────┼────────┤
+ _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,KC_LABK ,KC_UNDS ,KC_RABK
+ //└────────┴────────┴────────┴────────┴────────┴────────┴────────┘ └────────┴────────┴────────┴────────┴────────┴────────┴────────┘
+ ),
+
+ [_LIGHT] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐
+ _______ ,RGB_HUI ,RGB_HUD ,RGB_SAI ,RGB_SAD ,RGB_VAI ,RGB_VAD , RGB_HUI ,RGB_HUD ,RGB_SAI ,RGB_SAD ,RGB_VAI ,RGB_VAD ,XXXXXXX ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ _______ ,RGB_M_P ,RGB_M_SW ,RGB_M_X,XXXXXXX ,XXXXXXX ,XXXXXXX , RGB_M_P ,RGB_M_SW ,RGB_M_X ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┘ └────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ _______ ,RGB_M_B ,RGB_M_SN ,RGB_M_G,XXXXXXX ,XXXXXXX , RGB_M_B ,RGB_M_SN ,RGB_M_G ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______ ,RGB_M_R ,RGB_M_K ,RGB_M_T ,XXXXXXX ,XXXXXXX , RGB_M_R ,RGB_M_K ,RGB_M_T ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┴────────┼────────┼────────┼────────┤
+ _______ ,_______ ,_______ ,_______ ,_______ ,RGB_MOD ,RGB_TOG , RGB_TOG ,RGB_MOD ,TO_QWER ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX
+ //└────────┴────────┴────────┴────────┴────────┴────────┴────────┘ └────────┴────────┴────────┴────────┴────────┴────────┴────────┘
+ )
+
+};
+
+
+#ifdef RGBLIGHT_ENABLE
+void keyboard_post_init_user(void) {
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_RAINBOW_SWIRL);
+};
+#endif
diff --git a/keyboards/kudox/rev3/keymaps/default/readme.md b/keyboards/kudox/rev3/keymaps/default/readme.md
new file mode 100644
index 00000000000..aead0ad1f17
--- /dev/null
+++ b/keyboards/kudox/rev3/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for Kudox Keyboard Rev3.0
diff --git a/keyboards/kudox/rev3/keymaps/jis/keymap.c b/keyboards/kudox/rev3/keymaps/jis/keymap.c
new file mode 100644
index 00000000000..bc1b3331056
--- /dev/null
+++ b/keyboards/kudox/rev3/keymaps/jis/keymap.c
@@ -0,0 +1,70 @@
+#include QMK_KEYBOARD_H
+#include"keymap_jp.h"
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _QWERTY 0
+#define _SYMB 1
+#define _LIGHT 2
+
+// Shortcut to make keymap more readable
+#define SYM_L2 LT(_SYMB, KC_LANG2)
+#define TO_LIGH TO(_LIGHT)
+#define TO_QWER TO(_QWERTY)
+
+#define KC_ALES LALT_T(KC_ESC)
+#define KC_ALEN LALT_T(KC_ENT)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_QWERTY] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐
+ JP_ZKHK ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_6 , KC_7 ,KC_8 ,KC_9 ,KC_0 ,JP_MINS ,JP_CIRC ,KC_BSPC ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_TAB ,KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,KC_ESC , KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,JP_AT ,JP_SLSH ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┘ └────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_LCTL ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G , KC_H ,KC_J ,KC_K ,KC_L ,JP_SCLN ,KC_ENT ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B , KC_N ,KC_M ,JP_COMM ,JP_DOT ,KC_UP ,KC_RSFT ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┴────────┼────────┼────────┼────────┤
+ KC_ALES ,JP_YEN ,JP_COLN ,SYM_L2 ,KC_ALEN ,KC_LGUI ,KC_SPC , KC_SPC ,KC_RGUI ,TO_LIGH ,KC_LANG1,KC_LEFT, KC_DOWN ,KC_RIGHT
+ //└────────┴────────┴────────┴────────┴────────┴────────┴────────┘ └────────┴────────┴────────┴────────┴────────┴────────┴────────┘
+ ),
+
+ [_SYMB] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐
+ KC_ESC ,KC_F1 ,KC_F2 ,KC_F3 ,KC_F4 ,KC_F5 ,KC_F6 , KC_F7 ,KC_F8 ,KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,KC_DEL ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ _______ ,JP_DQUO ,JP_QUOT ,KC_GRV ,JP_ASTR ,JP_PLUS ,JP_EQL , JP_LPRN ,JP_RPRN ,JP_PIPE ,JP_ASTR ,JP_TILD ,JP_CIRC ,JP_PIPE ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┘ └────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ _______ ,JP_AT ,JP_COLN ,KC_GRV ,JP_SLSH ,JP_MINS , JP_LBRC ,JP_RBRC ,JP_DOT ,JP_SLSH ,JP_MINS ,_______ ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______ ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX , JP_LCBR ,JP_RCBR ,_______ ,_______ ,JP_CIRC ,_______ ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┴────────┼────────┼────────┼────────┤
+ _______ ,_______ ,_______ ,_______ ,_______ ,_______ ,_______ , _______ ,_______ ,_______ ,_______ ,JP_LABK ,JP_UNDS ,JP_RABK
+ //└────────┴────────┴────────┴────────┴────────┴────────┴────────┘ └────────┴────────┴────────┴────────┴────────┴────────┴────────┘
+ ),
+
+ [_LIGHT] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐ ┌────────┬────────┬────────┬────────┬────────┬────────┬────────┐
+ _______ ,RGB_HUI ,RGB_HUD ,RGB_SAI ,RGB_SAD ,RGB_VAI ,RGB_VAD , RGB_HUI ,RGB_HUD ,RGB_SAI ,RGB_SAD ,RGB_VAI ,RGB_VAD ,XXXXXXX ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ _______ ,RGB_M_P ,RGB_M_SW ,RGB_M_X,XXXXXXX ,XXXXXXX ,XXXXXXX , RGB_M_P ,RGB_M_SW ,RGB_M_X ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┘ └────────┼────────┼────────┼────────┼────────┼────────┼────────┤
+ _______ ,RGB_M_B ,RGB_M_SN ,RGB_M_G,XXXXXXX ,XXXXXXX , RGB_M_B ,RGB_M_SN ,RGB_M_G ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┤ ├────────┼────────┼────────┼────────┼────────┼────────┤
+ _______ ,RGB_M_R ,RGB_M_K ,RGB_M_T ,XXXXXXX ,XXXXXXX , RGB_M_R ,RGB_M_K ,RGB_M_T ,XXXXXXX ,XXXXXXX ,XXXXXXX ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐ ┌────────┼────────┼────────┴────────┼────────┼────────┼────────┤
+ _______ ,_______ ,_______ ,_______ ,_______ ,RGB_MOD ,RGB_TOG , RGB_TOG ,RGB_MOD ,TO_QWER ,XXXXXXX ,XXXXXXX ,XXXXXXX ,XXXXXXX
+ //└────────┴────────┴────────┴────────┴────────┴────────┴────────┘ └────────┴────────┴────────┴────────┴────────┴────────┴────────┘
+ )
+
+};
+
+#ifdef RGBLIGHT_ENABLE
+void keyboard_post_init_user(void) {
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_RAINBOW_SWIRL);
+};
+#endif
diff --git a/keyboards/kudox/rev3/keymaps/jis/readme.md b/keyboards/kudox/rev3/keymaps/jis/readme.md
new file mode 100644
index 00000000000..90e7902153a
--- /dev/null
+++ b/keyboards/kudox/rev3/keymaps/jis/readme.md
@@ -0,0 +1 @@
+# The JIS keymap for Kudox Keyboard Rev3.0
diff --git a/keyboards/kudox/rev3/rev3.c b/keyboards/kudox/rev3/rev3.c
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/kudox/rev3/rev3.h b/keyboards/kudox/rev3/rev3.h
new file mode 100644
index 00000000000..dcc745ddb79
--- /dev/null
+++ b/keyboards/kudox/rev3/rev3.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ L00, L01, L02, L03, L04, L05, L06, R06, R05, R04, R03, R02, R01, R00, \
+ L10, L11, L12, L13, L14, L15, L16, R16, R15, R14, R13, R12, R11, R10, \
+ L20, L21, L22, L23, L24, L25, R25, R24, R23, R22, R21, R20, \
+ L30, L31, L32, L33, L34, L35, R35, R34, R33, R32, R31, R30, \
+ L40, L41, L42, L43, L44, L45, L46, R46, R45, R44, R43, R42, R41, R40 \
+) \
+{ \
+ { L00, L01, L02, L03, L04, L05, L06 }, \
+ { L10, L11, L12, L13, L14, L15, L16 }, \
+ { L20, L21, L22, L23, L24, L25 }, \
+ { L30, L31, L32, L33, L34, L35 }, \
+ { L40, L41, L42, L43, L44, L45, L46 }, \
+ { R00, R01, R02, R03, R04, R05, R06 }, \
+ { R10, R11, R12, R13, R14, R15, R16 }, \
+ { R20, R21, R22, R23, R24, R25 }, \
+ { R30, R31, R32, R33, R34, R35 }, \
+ { R40, R41, R42, R43, R44, R45, R46 } \
+}
diff --git a/keyboards/kudox/rev3/rules.mk b/keyboards/kudox/rev3/rules.mk
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/kudox/rules.mk b/keyboards/kudox/rules.mk
index 4ae8ea7fbb6..1b00218c752 100644
--- a/keyboards/kudox/rules.mk
+++ b/keyboards/kudox/rules.mk
@@ -33,4 +33,4 @@ RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
SPLIT_KEYBOARD = yes
-DEFAULT_FOLDER = kudox/rev2
+DEFAULT_FOLDER = kudox/rev3
diff --git a/keyboards/kudox_game/info.json b/keyboards/kudox_game/info.json
index 42932601a9a..0862dade53b 100644
--- a/keyboards/kudox_game/info.json
+++ b/keyboards/kudox_game/info.json
@@ -18,8 +18,8 @@
{"label":"E", "x":3.75, "y":1},
{"label":"R", "x":4.75, "y":1},
{"label":"T", "x":5.75, "y":1},
- {"label":"GUI", "x":0, "y":2},
- {"label":"Alt", "x":1, "y":2},
+ {"label":"Ctrl-C", "x":0, "y":2},
+ {"label":"Ctrl-V", "x":1, "y":2},
{"label":"A", "x":2, "y":2},
{"label":"S", "x":3, "y":2},
{"label":"D", "x":4, "y":2},
diff --git a/keyboards/kudox_game/keymaps/default/keymap.c b/keyboards/kudox_game/keymaps/default/keymap.c
index cf6b1dfc505..d7efeaed019 100644
--- a/keyboards/kudox_game/keymaps/default/keymap.c
+++ b/keyboards/kudox_game/keymaps/default/keymap.c
@@ -6,20 +6,26 @@
// entirely and just use numbers.
#define _QWERTY 0
#define _SYMB 1
+#define _LIGHT 2
// Shortcut to make keymap more readable
#define SYM_L MO(_SYMB)
#define KC_ALEN LALT_T(KC_ENT)
+#define ES_LIGH LT(_LIGHT, KC_ESC)
+
+#define CT_COPY LCTL(KC_C)
+#define CT_PASTE LCTL(KC_V)
+
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT(
//┌────────┬────────┬────────┬────────┬────────┬────────┐
- KC_ESC ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,
+ ES_LIGH ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,
//└────────┼────────┼────────┼────────┼────────┼────────┤
KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,
//┌────────┼────────┼────────┼────────┼────────┼────────┼────────┐
- KC_LGUI ,KC_ALEN ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,
+ CT_COPY ,CT_PASTE,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,
//├────────┼────────┼────────┼────────┼────────┼────────┼────────┐
KC_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,
//├────────┼────────┘ └────────┴────────┼────────┼────────┐
@@ -35,10 +41,31 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//┌────────┼────────┼────────┼────────┼────────┼────────┼────────┐
_______ ,_______ ,KC_LEFT ,KC_DOWN ,KC_RIGHT,KC_LBRC ,KC_RBRC ,
//├────────┼────────┼────────┼────────┼────────┼────────┼────────┐
- _______ ,KC_BSPC ,KC_CIRC ,KC_LPRN ,KC_RPRN ,
+ _______ ,KC_BSPC ,KC_DEL ,KC_LPRN ,KC_RPRN ,
//├────────┼────────┘ └────────┴────────┼────────┼────────┐
_______ ,_______ ,_______
//└────────┘ └────────┴────────┘
+ ),
+
+ [_LIGHT] = LAYOUT(
+ //┌────────┬────────┬────────┬────────┬────────┬────────┐
+ _______ ,RGB_HUI ,RGB_HUD ,RGB_SAI ,RGB_SAD ,RGB_VAI ,
+ //└────────┼────────┼────────┼────────┼────────┼────────┤
+ RGB_M_P ,RGB_M_SW,RGB_M_X ,RGB_M_B ,RGB_VAD ,
+ //┌────────┼────────┼────────┼────────┼────────┼────────┼────────┐
+ _______ ,_______ ,RGB_M_SN,RGB_M_G ,RGB_M_R ,RGB_M_K ,RGB_M_T ,
+ //├────────┼────────┼────────┼────────┼────────┼────────┼────────┐
+ _______ ,RGB_M_T ,XXXXXXX ,RGB_VAI ,RGB_VAD ,
+ //├────────┼────────┘ └────────┴────────┼────────┼────────┐
+ _______ ,RGB_MOD ,RGB_TOG
+ //└────────┘ └────────┴────────┘
)
};
+
+// Runs just one time when the keyboard initializes.
+#ifdef RGBLIGHT_ENABLE
+void keyboard_post_init_user(void) {
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_RAINBOW_SWIRL);
+};
+#endif
diff --git a/keyboards/kudox_game/kudox_game.h b/keyboards/kudox_game/kudox_game.h
index 1da820fc270..c76f086c879 100644
--- a/keyboards/kudox_game/kudox_game.h
+++ b/keyboards/kudox_game/kudox_game.h
@@ -19,5 +19,8 @@
#ifdef KEYBOARD_kudox_game_rev1
#include "rev1.h"
#endif
+#ifdef KEYBOARD_kudox_game_rev2
+ #include "rev2.h"
+#endif
#include "quantum.h"
diff --git a/keyboards/kudox_game/readme.md b/keyboards/kudox_game/readme.md
index 5ad867790b0..31565a59968 100644
--- a/keyboards/kudox_game/readme.md
+++ b/keyboards/kudox_game/readme.md
@@ -9,18 +9,18 @@
- Keyboard Maintainer: [Kumao Kobo](https://github.com/kumaokobo)
-- Hardware Supported: Kudox Game PCB rev1.0 w/ Pro Micro
+- Hardware Supported: Kudox Game PCB rev1.0 rev2.0 w/ Pro Micro
Make example for this keyboard (after setting up your build environment):
```sh
-make kudox_game/rev1:default
+make kudox_game/rev2:default
```
Example of flashing this keyboard:
```sh
-make kudox_game/rev1:default:avrdude
+make kudox_game/rev2:default:avrdude
```
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).
diff --git a/keyboards/kudox_game/rev2/config.h b/keyboards/kudox_game/rev2/config.h
new file mode 100644
index 00000000000..500f93280d9
--- /dev/null
+++ b/keyboards/kudox_game/rev2/config.h
@@ -0,0 +1,91 @@
+/*
+Copyright 2019 Kumao Kobo
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x9696
+#define DEVICE_VER 0x0200
+#define MANUFACTURER Kumao Kobo
+#define PRODUCT The Kudox Game Keyboard
+#define DESCRIPTION Custom keyboard for playing game
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 7
+
+// wiring of each half
+#define MATRIX_ROW_PINS { D4, D7, E6, B4, B5 }
+#define MATRIX_COL_PINS { F5, F6, F7, B1, B3, B2, B6 }
+// #define MATRIX_COL_PINS { B6, B2, B3, B1, F7, F6, F5} //uncomment this line and comment line above if you need to reverse left-to-right key order
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+// #define BACKLIGHT_LEVELS 3
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
+/* 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
+
+/* ws2812 RGB LED */
+#define RGB_DI_PIN D3
+
+#undef RGBLED_NUM
+#define RGBLED_NUM 7 // Number of LEDs
+#define RGBLIGHT_ANIMATIONS
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+#define MOUSEKEY_INTERVAL 20
+#define MOUSEKEY_DELAY 0
+#define MOUSEKEY_TIME_TO_MAX 60
+#define MOUSEKEY_MAX_SPEED 7
+#define MOUSEKEY_WHEEL_DELAY 0
diff --git a/keyboards/kudox_game/rev2/rev2.c b/keyboards/kudox_game/rev2/rev2.c
new file mode 100644
index 00000000000..32356f8a4ae
--- /dev/null
+++ b/keyboards/kudox_game/rev2/rev2.c
@@ -0,0 +1 @@
+#include "kudox_game.h"
diff --git a/keyboards/kudox_game/rev2/rev2.h b/keyboards/kudox_game/rev2/rev2.h
new file mode 100644
index 00000000000..e630a51658d
--- /dev/null
+++ b/keyboards/kudox_game/rev2/rev2.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#include "../kudox_game.h"
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ k00, k01, k02, k03, k04, k05, \
+ k11, k12, k13, k14, k15, \
+ k20, k21, k22, k23, k24, k25, k26, \
+ k30, k31, k34, k35, k36, \
+ k40, k45, k46 \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, KC_NO }, \
+ { KC_NO, k11, k12, k13, k14, k15, KC_NO }, \
+ { k20, k21, k22, k23, k24, k25, k26 }, \
+ { k30, k31, KC_NO, KC_NO, k34, k35, k36 }, \
+ { k40, KC_NO, KC_NO, KC_NO, KC_NO, k45, k46 } \
+}
diff --git a/keyboards/kudox_game/rev2/rules.mk b/keyboards/kudox_game/rev2/rules.mk
new file mode 100644
index 00000000000..1e3cebb1451
--- /dev/null
+++ b/keyboards/kudox_game/rev2/rules.mk
@@ -0,0 +1 @@
+RGBLIGHT_ENABLE = yes
diff --git a/keyboards/kudox_game/rules.mk b/keyboards/kudox_game/rules.mk
index d3fa26ee6ac..63280b38d7a 100644
--- a/keyboards/kudox_game/rules.mk
+++ b/keyboards/kudox_game/rules.mk
@@ -31,4 +31,4 @@ AUDIO_ENABLE = no # Audio output on port C6
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
-DEFAULT_FOLDER = kudox_game/rev1
+DEFAULT_FOLDER = kudox_game/rev2
diff --git a/keyboards/kyria/keymaps/corodiak/config.h b/keyboards/kyria/keymaps/corodiak/config.h
new file mode 100644
index 00000000000..eed94d05586
--- /dev/null
+++ b/keyboards/kyria/keymaps/corodiak/config.h
@@ -0,0 +1,45 @@
+/* Copyright 2019 Thomas Baart
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#ifdef OLED_DRIVER_ENABLE
+ #define OLED_DISPLAY_128X64
+#endif
+
+#ifdef RGBLIGHT_ENABLE
+ #define RGBLIGHT_ANIMATIONS
+ #define RGBLIGHT_HUE_STEP 8
+ #define RGBLIGHT_SAT_STEP 8
+ #define RGBLIGHT_VAL_STEP 8
+#endif
+
+// The Leader key allows to flexibly assign macros to key sequences.
+#define LEADER_PER_KEY_TIMING
+#define LEADER_TIMEOUT 350
+
+#define TAPPING_TERM 200
+
+// Turn off on slave
+#define WAIT_FOR_USB
+
+// If you are using an Elite C rev3 on the slave side, uncomment the lines below:
+#define SPLIT_USB_DETECT
+#define NO_USB_STARTUP_CHECK
+
+// Allows to use either side as the master. Look at the documentation for info:
+// https://docs.qmk.fm/#/config_options?id=setting-handedness
+#define EE_HANDS
diff --git a/keyboards/kyria/keymaps/corodiak/keymap.c b/keyboards/kyria/keymaps/corodiak/keymap.c
new file mode 100644
index 00000000000..0f7e05991bd
--- /dev/null
+++ b/keyboards/kyria/keymaps/corodiak/keymap.c
@@ -0,0 +1,321 @@
+/* Copyright 2019 Thomas Baart
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+typedef union {
+ uint32_t raw;
+ struct {
+ bool osIsWindows;
+ };
+} user_config_t;
+
+user_config_t user_config;
+
+enum layers {
+ _QWERTY = 0,
+ _COLEMAK,
+ _NAV,
+ _SYMBOLS,
+ _NUM,
+ _ADJUST
+};
+
+enum custom_keycodes {
+ Qwerty = SAFE_RANGE,
+ Colemak,
+ Undo,
+ Cut,
+ Copy,
+ Paste,
+ NxtWord,
+ PrvWord
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * Base Layer: QWERTY
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | TAB | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | NAV | A | S | D | F | G | | H | J | K | L | ; : | ' " |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | LShift | Z | X | C | V | B |Enter | ESC | |ADJUST|Space | N | M | , < | . > | / ? | Del |
+ * `----------------------+------+------+------+ +------| |------+ +------+------+------+----------------------'
+ * | LCTL | GUI | RALT | | NUM | | NUM | | SYMB | NAV |LEADER|
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_QWERTY] = LAYOUT(
+ KC_TAB , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y, KC_U , KC_I , KC_O , KC_P , KC_BSPC,
+ MO(_NAV), KC_A , KC_S , KC_D , KC_F , KC_G , KC_H, KC_J , KC_K , KC_L ,KC_SCLN, KC_QUOT,
+ KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , XXXXXXX, KC_ESC , MO(_ADJUST), XXXXXXX, KC_N, KC_M ,KC_COMM, KC_DOT ,KC_SLSH, RSFT_T(KC_DEL),
+ KC_LCTL, KC_LGUI, KC_RALT, KC_ENT ,TT(_NUM),TT(_NUM), KC_SPC, MO(_SYMBOLS), MO(_NAV), KC_LEAD
+ ),
+
+/*
+ * Base Layer: Colemak
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | TAB | Q | W | F | P | G | | J | L | U | Y | ; : | Bksp |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | NAV | A | R | S | T | D | | H | N | E | I | O | ' " |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | LShift | Z | X | C | V | B |Enter | ESC | |ADJUST|Space | K | M | , < | . > | / ? | Del |
+ * `----------------------+------+------+------+ +------| |------+ +------+------+------+----------------------'
+ * | LCTL | GUI | RALT | | NUM | | NUM | | SYMB | NAV |LEADER|
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_COLEMAK] = LAYOUT(
+ KC_TAB , KC_Q , KC_W , KC_F , KC_P , KC_G , KC_J, KC_L , KC_U , KC_Y ,KC_SCLN, KC_BSPC,
+ MO(_NAV), KC_A , KC_R , KC_S , KC_T , KC_D , KC_H, KC_N , KC_E , KC_I , KC_O , KC_QUOT,
+ KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , XXXXXXX, KC_ESC , MO(_ADJUST), XXXXXXX, KC_K, KC_M ,KC_COMM, KC_DOT ,KC_SLSH, RSFT_T(KC_DEL),
+ KC_LCTL, KC_LGUI, KC_RALT, KC_ENT ,TT(_NUM),TT(_NUM), KC_SPC, MO(_SYMBOLS), MO(_NAV), KC_LEAD
+ ),
+
+/*
+ * Navigation Layer: Cursor, Text Navigation
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | | |WheelU| | | | |PrvWord| Up |NxtWord| | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | | LCTL |WheelD|LSFT | Bksp | | Bksp | Left | Down |Right | Del | |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | Undo | Cut | Copy |Paste | | | | | | | | Home | | End | | |
+ * `----------------------+------+------+------+ +------| |------+ +------+------+------+----------------------'
+ * | | | | |Space | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_NAV] = LAYOUT(
+ _______, _______, _______, KC_WH_U, _______, _______, _______, PrvWord, KC_UP , NxtWord, _______, _______,
+ _______, _______, KC_LCTL, KC_WH_D, KC_LSFT, KC_BSPC, KC_BSPC, KC_LEFT, KC_DOWN,KC_RIGHT, KC_DEL , _______,
+ _______, Undo , Cut , Copy , Paste , _______, XXXXXXX, _______, _______, XXXXXXX, _______, KC_HOME, _______, KC_END , _______, _______,
+ _______, _______, _______, _______, KC_SPC , _______, _______, _______, _______, _______
+ ),
+
+/*
+ * Symbol Layer
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | ` ~ | ! | @ | # | $ | % | | ^ | { | } | | € | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | ~ | | | - _ | = + | & | | * | ( | ) | | | | |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | | _ | + | | | | | | | | [ { | ] } | | \ | | |
+ * `----------------------+------+------+------+ +------| |------+ +------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_SYMBOLS] = LAYOUT(
+ KC_GRV, KC_EXLM, KC_AT , KC_HASH, KC_DLR , KC_PERC, KC_CIRC, KC_LCBR, KC_RCBR, _______,ALGR(KC_5),_______,
+ KC_TILD, _______, _______, KC_MINS, KC_EQL , KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, KC_PIPE, _______,
+ _______, _______, _______, KC_UNDS, KC_PLUS, _______, XXXXXXX, _______, _______, XXXXXXX, _______, KC_LBRC, KC_RBRC, _______, KC_BSLS, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+/*
+ * Num Layer
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | 1 ! | 2 @ | 3 # | 4 $ | 5 % | | / | 7 & | 8 * | 9 ( | - | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | 6 ^ | 7 & | 8 * | 9 ( | 0 ) | | * | 4 $ | 5 % | 6 ^ | + | Space |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | | | | | | | | | | 0 ) | 1 ! | 2 @ | 3 # | = | Enter |
+ * `----------------------+------+------+------+ +------| |------+ +------+------+------+----------------------'
+ * | | | | | | | | | | , | . |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_NUM] = LAYOUT(
+ _______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_PSLS, KC_7 , KC_8 , KC_9 , KC_PMNS, _______,
+ _______, KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_PAST, KC_4 , KC_5 , KC_6 , KC_PLUS, KC_SPC ,
+ _______, _______, _______, _______, _______, _______, XXXXXXX, _______, _______, XXXXXXX, KC_0 , KC_1 , KC_2 , KC_3 , KC_PEQL, KC_ENT ,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PCMM, KC_DOT
+ ),
+
+/*
+ * Adjust Layer: Media
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | F9 | F10 | F11 | F12 | | | SAI | | Vol+ | | Play | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | F5 | F6 | F7 | F8 | | | HUI | Prev | Vol- | Nxt | | |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | F1 | F2 | F3 | F4 | | | | | | | VAI | Mute | | | | |
+ * `----------------------+------+------+------+ +------| |------+ +------+------+------+----------------------'
+ * |Qwerty|Colemak| | | | | RGB | | RGB | | |
+ * | Dflt | Dflt | | | | |Toggle| | Mode | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_ADJUST] = LAYOUT(
+ _______, KC_F9 , KC_F10 , KC_F11 , KC_F12 , _______, RGB_SAI, _______, KC_VOLU, _______, KC_MPLY, _______,
+ _______, KC_F5 , KC_F6 , KC_F7 , KC_F8 , _______, RGB_HUI, KC_MPRV, KC_VOLD, KC_MNXT, _______, _______,
+ _______, KC_F1 , KC_F2 , KC_F3 , KC_F4 , _______, XXXXXXX, _______, _______, XXXXXXX, RGB_VAI, KC_MUTE, _______, _______, _______, _______,
+ Qwerty , Colemak, _______, _______, _______, RGB_TOG, _______, RGB_MOD, _______, _______
+ ),
+
+// /*
+// * Layer template
+// *
+// * ,-------------------------------------------. ,-------------------------------------------.
+// * | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | | | | | |
+// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+// * | | | | | | | | | | | |
+// * | | | | | | | | | | | |
+// * `----------------------------------' `----------------------------------'
+// */
+// [_LAYERINDEX] = LAYOUT(
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+// ),
+};
+
+void keyboard_post_init_user(void) {
+ // Call the post init code.
+
+ // Read the user config from EEPROM
+ user_config.raw = eeconfig_read_user();
+
+ // Default RGB settings, without saving settings
+ rgblight_enable_noeeprom();
+ rgblight_sethsv_noeeprom(HSV_CYAN);
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch(keycode) {
+ case Qwerty:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_QWERTY);
+ }
+ break;
+ case Colemak:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_COLEMAK);
+ }
+ break;
+ case Undo:
+ if (record->event.pressed) {
+ if (user_config.osIsWindows == 1) {
+ tap_code16(C(KC_Z));
+ } else if (user_config.osIsWindows == 0) {
+ tap_code16(G(KC_Z));
+ }
+ }
+ break;
+ case Cut:
+ if (record->event.pressed) {
+ if (user_config.osIsWindows == 1) {
+ tap_code16(C(KC_X));
+ } else if (user_config.osIsWindows == 0) {
+ tap_code16(G(KC_X));
+ }
+ }
+ break;
+ case Copy:
+ if (record->event.pressed) {
+ if (user_config.osIsWindows == 1) {
+ tap_code16(C(KC_C));
+ } else if (user_config.osIsWindows == 0) {
+ tap_code16(G(KC_C));
+ }
+ }
+ break;
+ case Paste:
+ if (record->event.pressed) {
+ if (user_config.osIsWindows == 1) {
+ tap_code16(C(KC_V));
+ } else if (user_config.osIsWindows == 0) {
+ tap_code16(G(KC_V));
+ }
+ }
+ break;
+ case PrvWord:
+ if (record->event.pressed) {
+ if (user_config.osIsWindows == 1) {
+ tap_code16(C(KC_LEFT));
+ } else if (user_config.osIsWindows == 0) {
+ tap_code16(A(KC_LEFT));
+ }
+ }
+ break;
+ case NxtWord:
+ if (record->event.pressed) {
+ if (user_config.osIsWindows == 1) {
+ tap_code16(C(KC_RGHT));
+ } else if (user_config.osIsWindows == 0) {
+ tap_code16(A(KC_RGHT));
+ }
+ }
+ break;
+ }
+ return true;
+};
+
+LEADER_EXTERNS();
+
+void matrix_scan_user(void) {
+ LEADER_DICTIONARY() {
+ leading = false;
+ leader_end();
+
+ // Set current OS indicator to macOs
+ SEQ_ONE_KEY(KC_M) {
+ user_config.osIsWindows = false;
+ eeconfig_update_user(user_config.raw);
+ }
+
+ // Set current OS indicator to Windows
+ SEQ_ONE_KEY(KC_W) {
+ user_config.osIsWindows = true;
+ eeconfig_update_user(user_config.raw);
+ }
+
+ // Screenshot
+ SEQ_ONE_KEY(KC_S) {
+ if (user_config.osIsWindows == 1) {
+ tap_code16(S(G(KC_S)));
+ } else if (user_config.osIsWindows == 0) {
+ tap_code16(S(G(KC_4)));
+ }
+ }
+
+ // Video
+ SEQ_ONE_KEY(KC_V) {
+ if (user_config.osIsWindows == 0) {
+ tap_code16(S(G(KC_5)));
+ }
+ }
+
+ // Sleep
+ SEQ_ONE_KEY(KC_P) {
+ if (user_config.osIsWindows == 1) {
+ SEND_STRING(SS_LGUI("x") "u" "h");
+ } else if (user_config.osIsWindows == 0) {
+ tap_code16(A(G(KC_PWR)));
+ }
+ }
+ }
+}
diff --git a/keyboards/kyria/keymaps/corodiak/rules.mk b/keyboards/kyria/keymaps/corodiak/rules.mk
new file mode 100644
index 00000000000..da64c4ea51f
--- /dev/null
+++ b/keyboards/kyria/keymaps/corodiak/rules.mk
@@ -0,0 +1,4 @@
+# OLED_DRIVER_ENABLE = yes # Enables the use of OLED displays
+# ENCODER_ENABLE = yes # Enables the use of one or more encoders
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+LEADER_ENABLE = yes # Enables the Leader shortcut funtionality
diff --git a/keyboards/kyria/keymaps/drashna/config.h b/keyboards/kyria/keymaps/drashna/config.h
index e566b16d5c3..f93069ac00e 100644
--- a/keyboards/kyria/keymaps/drashna/config.h
+++ b/keyboards/kyria/keymaps/drashna/config.h
@@ -37,3 +37,5 @@
// If you are using an Elite C rev3 on the slave side, uncomment the lines below:
#define SPLIT_USB_DETECT
#define SPLIT_USB_TIMEOUT 1000
+
+#define KEYLOGGER_LENGTH 10
diff --git a/keyboards/kyria/keymaps/drashna/keymap.c b/keyboards/kyria/keymaps/drashna/keymap.c
index 5604f1a6920..5e97ca55adb 100644
--- a/keyboards/kyria/keymaps/drashna/keymap.c
+++ b/keyboards/kyria/keymaps/drashna/keymap.c
@@ -2,35 +2,6 @@
uint8_t is_master;
-#ifdef OLED_DRIVER_ENABLE
-# define KEYLOGGER_LENGTH 10
-static uint32_t oled_timer = 0;
-static char keylog_str[KEYLOGGER_LENGTH + 1] = {"\n"};
-static uint16_t log_timer = 0;
-// clang-format off
-static const char PROGMEM code_to_name[0xFF] = {
-// 0 1 2 3 4 5 6 7 8 9 A B c D E F
- ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', // 0x
- 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', // 1x
- '3', '4', '5', '6', '7', '8', '9', '0', 20, 19, 27, 26, 22, '-', '=', '[', // 2x
- ']','\\', '#', ';','\'', '`', ',', '.', '/', 128, ' ', ' ', ' ', ' ', ' ', ' ', // 3x
- ' ', ' ', ' ', ' ', ' ', ' ', 'P', 'S', ' ', ' ', ' ', ' ', 16, ' ', ' ', ' ', // 4x
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 5x
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 6x
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 7x
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 8x
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 9x
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Ax
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Bx
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Cx
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Dx
- 'C', 'S', 'A', 'C', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Ex
- ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' // Fx
-};
-
-void add_keylog(uint16_t keycode);
-#endif
-
#ifndef UNICODE_ENABLE
# define UC(x) KC_NO
#endif
@@ -52,7 +23,7 @@ void add_keylog(uint16_t keycode);
LAYOUT_wrapper( \
KC_ESC, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, KC_MINS, \
LALT_T(KC_TAB), K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, RALT_T(KC_QUOT), \
- OS_LSFT, CTL_T(K21), K22, K23, K24, K25, KC_NO, KC_NO, MEH(KC_MINS), KC_NO, K26, K27, K28, K29, RCTL_T(K2A), OS_RSFT, \
+ OS_LSFT, CTL_T(K21), K22, K23, K24, K25, KC_NO, MEH(KC_MINS), TG(_DIABLO), KC_NO, K26, K27, K28, K29, RCTL_T(K2A), OS_RSFT, \
KC_MUTE, OS_LALT, KC_GRV, KC_SPC, BK_LWER, DL_RAIS, KC_ENT, OS_RGUI, UC(0x03A8), UC(0x2E2E) \
)
/* Re-pass though to allow templates to be used */
@@ -107,12 +78,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_____________CARPLAX_QFMLWY_L2_____________, _____________CARPLAX_QFMLWY_R2_____________,
_____________CARPLAX_QFMLWY_L3_____________, _____________CARPLAX_QFMLWY_R3_____________
),
+
[_MODS] = LAYOUT_wrapper(
_______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
_______, ___________________BLANK___________________, ___________________BLANK___________________, _______,
KC_LSFT, ___________________BLANK___________________, _______, _______, _______, _______, ___________________BLANK___________________, KC_RSFT,
_______, _______, KC_LALT, _______, _______, _______, _______, KC_RGUI, _______, _______
),
+ [_DIABLO] = LAYOUT_wrapper(
+ KC_ESC, KC_S, KC_I, KC_F, KC_M, KC_T, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, KC_NO,
+ KC_TAB, KC_1, KC_2, KC_3, KC_4, KC_G, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_LCTL, KC_D3_1, KC_D3_2, KC_D3_3, KC_D3_4, KC_Z, KC_J, KC_L, TG(_DIABLO), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_DIABLO_CLEAR, KC_J, KC_NO, SFT_T(KC_SPACE), ALT_T(KC_Q), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
+ ),
[_LOWER] = LAYOUT_wrapper(
KC_F12, _________________LOWER_L1__________________, _________________LOWER_R1__________________, KC_F11,
_______, _________________LOWER_L2__________________, _________________LOWER_R2__________________, KC_PIPE,
@@ -142,10 +120,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
-#ifdef OLED_DRIVER_ENABLE
- oled_timer = timer_read32();
- add_keylog(keycode);
-#endif
#ifndef SPLIT_KEYBOARD
if (keycode == RESET && !is_master) {
return false;
@@ -154,133 +128,16 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
}
return true;
}
+
void matrix_init_keymap(void) { is_master = (uint8_t)is_keyboard_master(); }
#ifdef OLED_DRIVER_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_180; }
-void add_keylog(uint16_t keycode) {
- if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX) || (keycode >= QK_MODS && keycode <= QK_MODS_MAX)) {
- keycode = keycode & 0xFF;
- } else if (keycode > 0xFF) {
- keycode = 0;
- }
-
- for (uint8_t i = (KEYLOGGER_LENGTH - 1); i > 0; --i) {
- keylog_str[i] = keylog_str[i - 1];
- }
-
- if (keycode < (sizeof(code_to_name) / sizeof(char))) {
- keylog_str[0] = pgm_read_byte(&code_to_name[keycode]);
- }
-
- log_timer = timer_read();
-}
-
-void update_log(void) {
- if (timer_elapsed(log_timer) > 750) {
- // add_keylog(0);
- }
-}
-
-void render_keylogger_status(void) {
- oled_write_P(PSTR("Keylogger: "), false);
- oled_write(keylog_str, false);
-}
-
-void render_default_layer_state(void) {
- oled_write_P(PSTR("Layout: "), false);
- switch (get_highest_layer(default_layer_state)) {
- case _QWERTY: oled_write_ln_P(PSTR("Qwerty"), false); break;
- case _COLEMAK: oled_write_ln_P(PSTR("Colemak"), false); break;
- case _DVORAK: oled_write_ln_P(PSTR("Dvorak"), false); break;
- case _WORKMAN: oled_write_ln_P(PSTR("Workman"), false); break;
- case _NORMAN: oled_write_ln_P(PSTR("Norman"), false); break;
- case _MALTRON: oled_write_ln_P(PSTR("Maltron"), false); break;
- case _EUCALYN: oled_write_ln_P(PSTR("Eucalyn"), false); break;
- case _CARPLAX: oled_write_ln_P(PSTR("Carplax"), false); break;
- }
-}
-
-void render_layer_state(void) {
- oled_write_ln_P(PSTR("Layer:"), false);
- oled_write_P(PSTR(" "), false);
- oled_write_P(PSTR("Lower"), layer_state_is(_LOWER));
- oled_write_P(PSTR(" "), false);
- oled_write_P(PSTR("Raise"), layer_state_is(_RAISE));
- oled_write_P(PSTR(" "), false);
- oled_write_ln_P(PSTR("Mods"), layer_state_is(_MODS));
-}
-
-void render_keylock_status(uint8_t led_usb_state) {
- oled_write_P(PSTR("Lock: "), false);
- oled_write_P(PSTR("NUML"), led_usb_state & (1 << USB_LED_NUM_LOCK));
- oled_write_P(PSTR(" "), false);
- oled_write_P(PSTR("CAPS"), led_usb_state & (1 << USB_LED_CAPS_LOCK));
- oled_write_P(PSTR(" "), false);
- oled_write_ln_P(PSTR("SCLK"), led_usb_state & (1 << USB_LED_SCROLL_LOCK));
-}
-
-void render_mod_status(uint8_t modifiers) {
- oled_write_P(PSTR("Mods: "), false);
- oled_write_P(PSTR("Sft"), (modifiers & MOD_MASK_SHIFT));
- oled_write_P(PSTR(" "), false);
- oled_write_P(PSTR("Ctl"), (modifiers & MOD_MASK_CTRL));
- oled_write_P(PSTR(" "), false);
- oled_write_P(PSTR("Alt"), (modifiers & MOD_MASK_ALT));
- oled_write_P(PSTR(" "), false);
- oled_write_P(PSTR("GUI"), (modifiers & MOD_MASK_GUI));
-}
-
-void render_bootmagic_status(void) {
- /* Show Ctrl-Gui Swap options */
- static const char PROGMEM logo[][2][3] = {
- {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}},
- {{0x95, 0x96, 0}, {0xb5, 0xb6, 0}},
- };
- oled_write_P(PSTR("Boot "), false);
- if (keymap_config.swap_lctl_lgui) {
- oled_write_P(logo[1][0], false);
- } else {
- oled_write_P(logo[0][0], false);
- }
- oled_write_P(PSTR(" "), false);
- oled_write_P(PSTR("NKRO"), keymap_config.nkro);
- oled_write_P(PSTR(" "), false);
- oled_write_ln_P(PSTR("GUI"), !keymap_config.no_gui);
- oled_write_P(PSTR("Magic "), false);
- if (keymap_config.swap_lctl_lgui) {
- oled_write_P(logo[1][1], false);
- } else {
- oled_write_P(logo[0][1], false);
- }
- oled_write_P(PSTR(" "), false);
- oled_write_P(PSTR("GRV"), keymap_config.swap_grave_esc);
- oled_write_P(PSTR(" "), false);
- oled_write_ln_P(PSTR("CAPS"), keymap_config.swap_control_capslock);
-}
-
-void render_user_status(void) {
- oled_write_P(PSTR("USER: "), false);
- oled_write_P(PSTR("Anim"), userspace_config.rgb_matrix_idle_anim);
- oled_write_P(PSTR(" "), false);
- oled_write_P(PSTR("Layr"), userspace_config.rgb_layer_change);
- oled_write_P(PSTR(" "), false);
- oled_write_ln_P(PSTR("Nuke"), userspace_config.nuke_switch);
-}
-
// clang-format off
-void render_logo(void) {
- static const char PROGMEM qmk_logo[] = {
- 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
- 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
- 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0};
-
- oled_write_P(qmk_logo, false);
-}
# ifndef SPLIT_TRANSPORT_MIRROR
-void render_kyria_logo(void) {
+void oled_driver_render_logo(void) {
static const char PROGMEM kyria_logo[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128,192,224,240,112,120, 56, 60, 28, 30, 14, 14, 14, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 14, 14, 14, 30, 28, 60, 56,120,112,240,224,192,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,192,224,240,124, 62, 31, 15, 7, 3, 1,128,192,224,240,120, 56, 60, 28, 30, 14, 14, 7, 7,135,231,127, 31,255,255, 31,127,231,135, 7, 7, 14, 14, 30, 28, 60, 56,120,240,224,192,128, 1, 3, 7, 15, 31, 62,124,240,224,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -294,51 +151,6 @@ void render_kyria_logo(void) {
oled_write_raw_P(kyria_logo, sizeof(kyria_logo));
}
# endif
-// clang-format on
-
-void render_status_main(void) {
- /* Show Keyboard Layout */
- render_default_layer_state();
- render_keylock_status(host_keyboard_leds());
- render_bootmagic_status();
- render_user_status();
-
- render_keylogger_status();
-}
-
-void render_status_secondary(void) {
- /* Show Keyboard Layout */
- render_logo();
- render_default_layer_state();
- render_layer_state();
- render_mod_status(get_mods() | get_oneshot_mods());
-
- render_keylogger_status();
-}
-
-void oled_task_user(void) {
- if (timer_elapsed32(oled_timer) > 30000) {
- oled_off();
- return;
- }
-# ifndef SPLIT_KEYBOARD
- else {
- oled_on();
- }
-# endif
-
- update_log();
- if (is_master) {
- render_status_main(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
- } else {
-# ifdef SPLIT_TRANSPORT_MIRROR
- render_status_secondary();
-# else
- render_kyria_logo();
-# endif
- }
-}
-
#endif
#ifdef ENCODER_ENABLE
diff --git a/keyboards/kyria/keymaps/drashna/rules.mk b/keyboards/kyria/keymaps/drashna/rules.mk
index e835340bbfe..2486ecd5d5d 100644
--- a/keyboards/kyria/keymaps/drashna/rules.mk
+++ b/keyboards/kyria/keymaps/drashna/rules.mk
@@ -20,3 +20,5 @@ HD44780_ENABLE = no # Enable support for HD44780 based LCDs
BOOTLOADER = atmel-dfu
SPLIT_TRANSPORT = mirror
+
+TAP_DANCE_ENABLE = yes
diff --git a/keyboards/latinpad/config.h b/keyboards/latinpad/config.h
new file mode 100644
index 00000000000..2b7698d4ce8
--- /dev/null
+++ b/keyboards/latinpad/config.h
@@ -0,0 +1,59 @@
+/*
+Copyright 2020 latincompass
+
+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 .*/
+
+#pragma once
+
+#include "config_common.h"
+#define VENDOR_ID 0x6C63 // "lc" = latincompass
+#define PRODUCT_ID 0x6C70 // "lp" = latinpad
+#define DEVICE_VER 0x0001
+#define MANUFACTURER latincompass
+#define PRODUCT latinpad
+#define DESCRIPTION dual rotary encoder macro pad
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 4
+#define MATRIX_ROW_PINS { F4, F5, F6, F7, B1 }
+#define MATRIX_COL_PINS { D4, C6, D7, E6 }
+#define UNUSED_PINS
+
+#define DIODE_DIRECTION ROW2COL
+
+#define SSD1306OLED
+#define RGB_DI_PIN D3
+
+#define RGBLED_NUM 18
+#define DRIVER_LED_TOTAL RGBLED_NUM
+
+/* 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
+
+
+#define OLED_FONT_H "./lib/glcdfont.c"
+
+#define ENCODERS_PAD_A { B4, B5 }
+#define ENCODERS_PAD_B { B2, B6 }
+
+#define ENCODER_RESOLUTION 4
diff --git a/keyboards/latinpad/info.json b/keyboards/latinpad/info.json
new file mode 100644
index 00000000000..024672d30b7
--- /dev/null
+++ b/keyboards/latinpad/info.json
@@ -0,0 +1,34 @@
+{
+ "keyboard_name": "latinpad",
+ "url": "https://github.com/latincompass/2-RotaryEncoder-pad",
+ "maintainer": "latincompass",
+
+ "width": 4,
+ "height": 5,
+ "layouts": {
+
+ "LAYOUT": {
+ "layout": [
+ {"label":"Num Lock", "x":0, "y":0, "w":0.8, "h":0.8},
+ {"label":"/", "x":0.8, "y":0, "w":0.8, "h":0.8},
+
+ {"label":"7", "x":0, "y":1},
+ {"label":"8", "x":1, "y":1},
+ {"label":"9", "x":2, "y":1},
+ {"label":"+", "x":3, "y":1},
+ {"label":"4", "x":0, "y":2},
+ {"label":"5", "x":1, "y":2},
+ {"label":"6", "x":2, "y":2},
+ {"label":"+", "x":3, "y":2},
+ {"label":"1", "x":0, "y":3},
+ {"label":"2", "x":1, "y":3},
+ {"label":"3", "x":2, "y":3},
+ {"label":"Enter", "x":3, "y":3},
+ {"label":"0", "x":0, "y":4},
+ {"label":"0", "x":1, "y":4},
+ {"label":".", "x":2, "y":4},
+ {"label":"Enter", "x":3, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/latinpad/keymaps/default/keymap.c b/keyboards/latinpad/keymaps/default/keymap.c
new file mode 100644
index 00000000000..8edc66f0aba
--- /dev/null
+++ b/keyboards/latinpad/keymaps/default/keymap.c
@@ -0,0 +1,70 @@
+ /* Keymap _0: (Base Layer) Default Layer
+
+ * .-----------.
+ * |PGUP | PGDN|
+ * |-----------------------.
+ * | 7 | 8 | 9 | MO1 |
+ * |-----|-----|-----|-----|
+ * | 4 | 5 | 6 | + |
+ * |-----|-----|-----|-----|
+ * | 1 | 2 | 3 | — |
+ * |-----|-----|-----|-----|
+ * | 0 | . | DEL |Enter|
+ * .-----------------------.
+ */
+ /* Keymap _1: (Second Layer) second Layer
+
+ * .---------------.
+ * |NUMLOCK|Calc. |
+ * |--------------------------------.
+ * |RGB_TOG|RGB_MOD|RGB_M_K|RGB_M_X |
+ * |-------|-------|-------|--------|
+ * |RGB_SAI|RGB_SAD|RGB_HUI|RGB_HUD |
+ * |-------|-------|-------|--------|
+ * |RGB_VAI|RGB_VAD|RGB_SPI|RGB_SPD |
+ * |-------|-------|-------|--------|
+ * |RGB_SPI|RGB_SPD|RGB_TOG|KC_TRNS |
+ * .--------------------------------.
+*/
+
+#include QMK_KEYBOARD_H
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_PGUP, KC_PGDOWN,
+ KC_KP_7, KC_KP_8, KC_KP_9, MO(1),
+ KC_P4, KC_P5, KC_P6, KC_KP_PLUS,
+ KC_P1, KC_P2, KC_P3, KC_KP_MINUS,
+ KC_P0, KC_PDOT,KC_DELETE, KC_KP_ENTER),
+ [1] = LAYOUT(
+ KC_NUMLOCK, KC_CALCULATOR,
+ RGB_TOG, RGB_MOD, RGB_M_K, RGB_M_X,
+ RGB_SAI, RGB_SAD, RGB_HUI, RGB_HUD,
+ RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD,
+ RGB_SPI, RGB_SPD, RGB_TOG, KC_TRNS),
+};
+
+static void render_logo(void) {
+ static const char PROGMEM qmk_logo[] = {0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0};
+ oled_write_P(qmk_logo, false);
+}
+
+#ifdef OLED_DRIVER_ENABLE
+void oled_task_user(void) { render_logo(); }
+#endif
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ if (clockwise) {
+ tap_code(KC_AUDIO_VOL_UP);
+ } else {
+ tap_code(KC_AUDIO_VOL_DOWN);
+ }
+ } else if (index == 1) {
+ if (clockwise) {
+ tap_code(KC_BRIGHTNESS_UP);
+ } else {
+ tap_code(KC_BRIGHTNESS_DOWN);
+ }
+ }
+}
+void matrix_init_user(void) { render_logo(); }
diff --git a/keyboards/latinpad/keymaps/via/keymap.c b/keyboards/latinpad/keymaps/via/keymap.c
new file mode 100644
index 00000000000..c48dd88a81d
--- /dev/null
+++ b/keyboards/latinpad/keymaps/via/keymap.c
@@ -0,0 +1,68 @@
+/* Keymap _0: (Base Layer) Default Layer
+ * .-----------.
+ * |PGUP | PGDN|
+ * |-----------------------.
+ * | 7 | 8 | 9 | MO1 |
+ * |-----|-----|-----|-----|
+ * | 4 | 5 | 6 | + |
+ * |-----|-----|-----|-----|
+ * | 1 | 2 | 3 | — |
+ * |-----|-----|-----|-----|
+ * | 0 | . | DEL |Enter|
+ * .-----------------------.
+ */
+ /* Keymap _1: (Second Layer) second Layer
+ * .---------------.
+ * |NUMLOCK|Calc. |
+ * |--------------------------------.
+ * |RGB_TOG|RGB_MOD|RGB_M_K|RGB_M_X |
+ * |-------|-------|-------|--------|
+ * |RGB_SAI|RGB_SAD|RGB_HUI|RGB_HUD |
+ * |-------|-------|-------|--------|
+ * |RGB_VAI|RGB_VAD|RGB_SPI|RGB_SPD |
+ * |-------|-------|-------|--------|
+ * |RGB_SPI|RGB_SPD|RGB_TOG|KC_TRNS |
+ * .--------------------------------.
+*/
+
+#include QMK_KEYBOARD_H
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_PGUP, KC_PGDOWN,
+ KC_KP_7, KC_KP_8, KC_KP_9, MO(1),
+ KC_P4, KC_P5, KC_P6, KC_KP_PLUS,
+ KC_P1, KC_P2, KC_P3, KC_KP_MINUS,
+ KC_P0, KC_PDOT,KC_DELETE, KC_KP_ENTER),
+ [1] = LAYOUT(
+ KC_NUMLOCK, KC_CALCULATOR,
+ RGB_TOG, RGB_MOD, RGB_M_K, RGB_M_X,
+ RGB_SAI, RGB_SAD, RGB_HUI, RGB_HUD,
+ RGB_VAI, RGB_VAD, RGB_SPI, RGB_SPD,
+ RGB_SPI, RGB_SPD, RGB_TOG, KC_TRNS),
+};
+
+static void render_logo(void) {
+ static const char PROGMEM qmk_logo[] = {0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0};
+ oled_write_P(qmk_logo, false);
+}
+
+#ifdef OLED_DRIVER_ENABLE
+void oled_task_user(void) { render_logo(); }
+#endif
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ if (clockwise) {
+ tap_code(KC_AUDIO_VOL_UP);
+ } else {
+ tap_code(KC_AUDIO_VOL_DOWN);
+ }
+ } else if (index == 1) {
+ if (clockwise) {
+ tap_code(KC_BRIGHTNESS_UP);
+ } else {
+ tap_code(KC_BRIGHTNESS_DOWN);
+ }
+ }
+}
+void matrix_init_user(void) { render_logo(); }
diff --git a/keyboards/latinpad/keymaps/via/rules.mk b/keyboards/latinpad/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/latinpad/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/latinpad/latinpad.c b/keyboards/latinpad/latinpad.c
new file mode 100644
index 00000000000..85f8eba7d57
--- /dev/null
+++ b/keyboards/latinpad/latinpad.c
@@ -0,0 +1,40 @@
+/* Copyright 2020 latincompass
+ *
+ * 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 .
+ */
+#include "latinpad.h"
+
+#ifdef RGB_MATRIX_ENABLE
+ led_config_t g_led_config = {
+ {
+ { 1, 2, 3, 4 },
+ { 5, 6, 7, 8 },
+ { 9, 10, 11, 12 },
+ { 13, 14, 15, 16 },
+ { 17, 18, NO_LED, NO_LED }
+ },{
+ { 74, 21 }, { 37, 21 }, { 24, 21 }, { 18, 21 },
+ { 74, 10 }, { 37, 10 }, { 28, 10 }, { 18, 10 },
+ { 74, 7 }, { 37, 7 }, { 20, 7 }, { 18, 7 },
+ { 74, 5 }, { 37, 5 }, { 22, 5 }, { 18, 5 },
+ { 74, 5 }, { 37, 5 },
+ },{
+ 1, 1, 1, 1,
+ 1, 1, 1, 1,
+ 1, 1, 1, 1,
+ 1, 1, 1, 1,
+ 1, 1
+ }
+ };
+#endif
diff --git a/keyboards/latinpad/latinpad.h b/keyboards/latinpad/latinpad.h
new file mode 100644
index 00000000000..a2c275aec38
--- /dev/null
+++ b/keyboards/latinpad/latinpad.h
@@ -0,0 +1,42 @@
+/* Copyright 2020 latincompass
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "quantum.h"
+
+/* This 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( \
+ K40, K41, \
+ K00, K01, K02, K03, \
+ K10, K11, K12, K13, \
+ K20, K21, K22, K23, \
+ K30, K31, K32, K33 \
+) \
+{ \
+ { K00, K01, K02, K03 }, \
+ { K10, K11, K12, K13 }, \
+ { K20, K21, K22, K23 }, \
+ { K30, K31, K32, K33 }, \
+ { K40, K41, KC_NO, KC_NO } \
+}
diff --git a/keyboards/latinpad/lib/glcdfont.c b/keyboards/latinpad/lib/glcdfont.c
new file mode 100644
index 00000000000..03ddddc5c24
--- /dev/null
+++ b/keyboards/latinpad/lib/glcdfont.c
@@ -0,0 +1,228 @@
+#include "progmem.h"
+// Standard ASCII 5x7 font
+const unsigned char font[] PROGMEM = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x00,
+ 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x00,
+ 0x1C, 0x3E, 0x7C, 0x3E, 0x1C, 0x00,
+ 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x00,
+ 0x1C, 0x57, 0x7D, 0x57, 0x1C, 0x00,
+ 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00,
+ 0x00, 0x18, 0x3C, 0x18, 0x00, 0x00,
+ 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00,
+ 0x00, 0x18, 0x24, 0x18, 0x00, 0x00,
+ 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x00,
+ 0x30, 0x48, 0x3A, 0x06, 0x0E, 0x00,
+ 0x26, 0x29, 0x79, 0x29, 0x26, 0x00,
+ 0x40, 0x7F, 0x05, 0x05, 0x07, 0x00,
+ 0x40, 0x7F, 0x05, 0x25, 0x3F, 0x00,
+ 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x00,
+ 0x7F, 0x3E, 0x1C, 0x1C, 0x08, 0x00,
+ 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x00,
+ 0x14, 0x22, 0x7F, 0x22, 0x14, 0x00,
+ 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x00,
+ 0x06, 0x09, 0x7F, 0x01, 0x7F, 0x00,
+ 0x00, 0x66, 0x89, 0x95, 0x6A, 0x00,
+ 0x60, 0x60, 0x60, 0x60, 0x60, 0x00,
+ 0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x00,
+ 0x08, 0x04, 0x7E, 0x04, 0x08, 0x00,
+ 0x10, 0x20, 0x7E, 0x20, 0x10, 0x00,
+ 0x08, 0x08, 0x2A, 0x1C, 0x08, 0x00,
+ 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x00,
+ 0x1E, 0x10, 0x10, 0x10, 0x10, 0x00,
+ 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x00,
+ 0x30, 0x38, 0x3E, 0x38, 0x30, 0x00,
+ 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00,
+ 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
+ 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x00,
+ 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00,
+ 0x23, 0x13, 0x08, 0x64, 0x62, 0x00,
+ 0x36, 0x49, 0x56, 0x20, 0x50, 0x00,
+ 0x00, 0x08, 0x07, 0x03, 0x00, 0x00,
+ 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00,
+ 0x00, 0x41, 0x22, 0x1C, 0x00, 0x00,
+ 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x00,
+ 0x08, 0x08, 0x3E, 0x08, 0x08, 0x00,
+ 0x00, 0x80, 0x70, 0x30, 0x00, 0x00,
+ 0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
+ 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,
+ 0x20, 0x10, 0x08, 0x04, 0x02, 0x00,
+ 0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00,
+ 0x00, 0x42, 0x7F, 0x40, 0x00, 0x00,
+ 0x72, 0x49, 0x49, 0x49, 0x46, 0x00,
+ 0x21, 0x41, 0x49, 0x4D, 0x33, 0x00,
+ 0x18, 0x14, 0x12, 0x7F, 0x10, 0x00,
+ 0x27, 0x45, 0x45, 0x45, 0x39, 0x00,
+ 0x3C, 0x4A, 0x49, 0x49, 0x31, 0x00,
+ 0x41, 0x21, 0x11, 0x09, 0x07, 0x00,
+ 0x36, 0x49, 0x49, 0x49, 0x36, 0x00,
+ 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00,
+ 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0x34, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x14, 0x22, 0x41, 0x00,
+ 0x14, 0x14, 0x14, 0x14, 0x14, 0x00,
+ 0x00, 0x41, 0x22, 0x14, 0x08, 0x00,
+ 0x02, 0x01, 0x59, 0x09, 0x06, 0x00,
+ 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x00,
+ 0x7C, 0x12, 0x11, 0x12, 0x7C, 0x00,
+ 0x7F, 0x49, 0x49, 0x49, 0x36, 0x00,
+ 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00,
+ 0x7F, 0x41, 0x41, 0x41, 0x3E, 0x00,
+ 0x7F, 0x49, 0x49, 0x49, 0x41, 0x00,
+ 0x7F, 0x09, 0x09, 0x09, 0x01, 0x00,
+ 0x3E, 0x41, 0x41, 0x51, 0x73, 0x00,
+ 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,
+ 0x00, 0x41, 0x7F, 0x41, 0x00, 0x00,
+ 0x20, 0x40, 0x41, 0x3F, 0x01, 0x00,
+ 0x7F, 0x08, 0x14, 0x22, 0x41, 0x00,
+ 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x7F, 0x02, 0x1C, 0x02, 0x7F, 0x00,
+ 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x00,
+ 0x3E, 0x41, 0x41, 0x41, 0x3E, 0x00,
+ 0x7F, 0x09, 0x09, 0x09, 0x06, 0x00,
+ 0x3E, 0x41, 0x51, 0x21, 0x5E, 0x00,
+ 0x7F, 0x09, 0x19, 0x29, 0x46, 0x00,
+ 0x26, 0x49, 0x49, 0x49, 0x32, 0x00,
+ 0x03, 0x01, 0x7F, 0x01, 0x03, 0x00,
+ 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x00,
+ 0x1F, 0x20, 0x40, 0x20, 0x1F, 0x00,
+ 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x00,
+ 0x63, 0x14, 0x08, 0x14, 0x63, 0x00,
+ 0x03, 0x04, 0x78, 0x04, 0x03, 0x00,
+ 0x61, 0x59, 0x49, 0x4D, 0x43, 0x00,
+ 0x00, 0x7F, 0x41, 0x41, 0x41, 0x00,
+ 0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
+ 0x00, 0x41, 0x41, 0x41, 0x7F, 0x00,
+ 0x04, 0x02, 0x01, 0x02, 0x04, 0x00,
+ 0x40, 0x40, 0x40, 0x40, 0x40, 0x00,
+ 0x00, 0x03, 0x07, 0x08, 0x00, 0x00,
+ 0x20, 0x54, 0x54, 0x78, 0x40, 0x00,
+ 0x7F, 0x28, 0x44, 0x44, 0x38, 0x00,
+ 0x38, 0x44, 0x44, 0x44, 0x28, 0x00,
+ 0x38, 0x44, 0x44, 0x28, 0x7F, 0x00,
+ 0x38, 0x54, 0x54, 0x54, 0x18, 0x00,
+ 0x00, 0x08, 0x7E, 0x09, 0x02, 0x00,
+ 0x18, 0x24, 0x24, 0x1C, 0x78, 0x00,
+ 0x7F, 0x08, 0x04, 0x04, 0x78, 0x00,
+ 0x00, 0x44, 0x7D, 0x40, 0x00, 0x00,
+ 0x20, 0x40, 0x40, 0x3D, 0x00, 0x00,
+ 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00,
+ 0x00, 0x41, 0x7F, 0x40, 0x00, 0x00,
+ 0x7C, 0x04, 0x78, 0x04, 0x78, 0x00,
+ 0x7C, 0x08, 0x04, 0x04, 0x78, 0x00,
+ 0x38, 0x44, 0x44, 0x44, 0x38, 0x00,
+ 0x7C, 0x18, 0x24, 0x24, 0x18, 0x00,
+ 0x18, 0x24, 0x24, 0x18, 0x7C, 0x00,
+ 0x7C, 0x08, 0x04, 0x04, 0x08, 0x00,
+ 0x48, 0x54, 0x54, 0x54, 0x24, 0x00,
+ 0x04, 0x04, 0x3F, 0x44, 0x24, 0x00,
+ 0x3C, 0x40, 0x40, 0x20, 0x7C, 0x00,
+ 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x00,
+ 0x3C, 0x40, 0x30, 0x40, 0x3C, 0x00,
+ 0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
+ 0x4C, 0x90, 0x90, 0x90, 0x7C, 0x00,
+ 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00,
+ 0x00, 0x08, 0x36, 0x41, 0x00, 0x00,
+ 0x00, 0x00, 0x77, 0x00, 0x00, 0x00,
+ 0x00, 0x41, 0x36, 0x08, 0x00, 0x00,
+ 0x02, 0x01, 0x02, 0x04, 0x02, 0x00,
+ 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xF8, 0xF8, 0x58, 0x58, 0x5E,
+ 0xDA, 0x5A, 0x5B, 0x59, 0xDB, 0x5A,
+ 0x5B, 0x58, 0xD8, 0x58, 0x58, 0x58,
+ 0xD8, 0x58, 0x58, 0x58, 0xD8, 0x58,
+ 0x58, 0x58, 0xD8, 0x58, 0x58, 0x58,
+ 0xD8, 0x58, 0x58, 0x78, 0xF8, 0xF8,
+ 0xF8, 0x78, 0x78, 0x78, 0xF8, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x44, 0x28, 0xFF, 0x5A, 0x24,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0x44, 0x55, 0x44,
+ 0xFF, 0x44, 0x55, 0x44, 0xFF, 0x44,
+ 0x55, 0x44, 0xFF, 0x44, 0x55, 0x44,
+ 0xFF, 0x44, 0x55, 0x44, 0xFF, 0x44,
+ 0x55, 0x44, 0xFF, 0x44, 0x55, 0x44,
+ 0xFF, 0x44, 0x55, 0x44, 0xFF, 0xFF,
+ 0xFF, 0xC4, 0xD5, 0xC4, 0xFF, 0x00,
+ 0x00, 0xFE, 0x21, 0x61, 0xA1, 0x1E,
+ 0x00, 0xFE, 0x01, 0x21, 0x21, 0xEF,
+ 0x00, 0xFF, 0x11, 0x11, 0x11, 0xFE,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0x11, 0x11, 0x11, 0xFE, 0x00,
+ 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00,
+ 0xFF, 0x11, 0x11, 0x11, 0x01, 0x00,
+ 0x01, 0x01, 0xFF, 0x01, 0x01, 0x00,
+ 0xFF, 0x01, 0x01, 0xFF, 0x00, 0xFF,
+ 0x01, 0x01, 0xFF, 0x00, 0x01, 0x01,
+ 0xFF, 0x01, 0x01, 0x00, 0xFF, 0x20,
+ 0x20, 0x20, 0xFF, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x7F, 0x7F, 0x44, 0x55, 0x44,
+ 0x7F, 0x44, 0x55, 0x54, 0x57, 0x54,
+ 0x55, 0x54, 0x57, 0x54, 0x55, 0x54,
+ 0x57, 0x54, 0x55, 0x54, 0x57, 0x54,
+ 0x45, 0x7C, 0x47, 0x54, 0x45, 0x7C,
+ 0x7F, 0x7C, 0x45, 0x54, 0x57, 0x50,
+ 0x5E, 0x50, 0x57, 0x47, 0x7F, 0x00,
+ 0x00, 0x03, 0x00, 0x00, 0x00, 0x03,
+ 0x00, 0x01, 0x02, 0x02, 0x02, 0x03,
+ 0x00, 0x03, 0x02, 0x02, 0x02, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x02, 0x02, 0x02, 0x01, 0x00,
+ 0x03, 0x02, 0x02, 0x02, 0x02, 0x00,
+ 0x03, 0x02, 0x02, 0x02, 0x03, 0x00,
+ 0x03, 0x02, 0x02, 0x02, 0x02, 0x00,
+ 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x03, 0x02, 0x02, 0x03, 0x00, 0x03,
+ 0x02, 0x02, 0x03, 0x00, 0x00, 0x30,
+ 0x2B, 0x7C, 0x20, 0x40, 0x03, 0x7C,
+ 0x44, 0x7C, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
diff --git a/keyboards/latinpad/readme.md b/keyboards/latinpad/readme.md
new file mode 100644
index 00000000000..620bf64301e
--- /dev/null
+++ b/keyboards/latinpad/readme.md
@@ -0,0 +1,14 @@
+# Latinpad
+
+
+
+macro 2 rotary encoder pad
+
+* Keyboard Maintainer: [latincompass](https://github.com/latincompass)
+* Hardware Availability: https://github.com/latincompass/2-RotaryEncoder-pad
+
+Make example for this keyboard (after setting up your build environment):
+
+ make latinpad:default
+
+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).
diff --git a/keyboards/latinpad/rules.mk b/keyboards/latinpad/rules.mk
new file mode 100644
index 00000000000..47208aec2e9
--- /dev/null
+++ b/keyboards/latinpad/rules.mk
@@ -0,0 +1,28 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+NKRO_ENABLE = no # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = no
+RGBLIGHT_ENABLE = no
+OLED_DRIVER_ENABLE = yes
+ENCODER_ENABLE = yes
+RGB_MATRIX_ENABLE = WS2812
diff --git a/keyboards/lattice60/config.h b/keyboards/lattice60/config.h
new file mode 100644
index 00000000000..649219538d0
--- /dev/null
+++ b/keyboards/lattice60/config.h
@@ -0,0 +1,103 @@
+/*
+Copyright 2019 Ethan Durrant (emdarcher)
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x16C0
+#define PRODUCT_ID 0x27DB
+#define DEVICE_VER 0x0001
+#define MANUFACTURER emdarcher
+#define PRODUCT LATTICE60
+#define DESCRIPTION A HHKB layout keyboard using only through-hole components.
+
+/* key matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 8
+
+/*
+ * 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 { B2, B3, B4, B5, C0, C1, C2, C3 }
+#define MATRIX_COL_PINS { D7, D6, B0, D5, D1, D4, D0, B1 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION ROW2COL
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+/* 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 userful for the Windows task manager shortcut (ctrl+shift+esc).
+ */
+// #define GRAVE_ESC_CTRL_OVERRIDE
+
+/*
+ * Force NKRO
+ *
+ * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
+ * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
+ * makefile for this to work.)
+ *
+ * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
+ * until the next keyboard reset.
+ *
+ * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
+ * fully operational during normal computer usage.
+ *
+ * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
+ * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
+ * bootmagic, NKRO mode will always be enabled until it is toggled again during a
+ * power-up.
+ *
+ */
+//#define FORCE_NKRO
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+
+/* disable these deprecated features by default */
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
diff --git a/keyboards/lattice60/info.json b/keyboards/lattice60/info.json
new file mode 100644
index 00000000000..fd738945d48
--- /dev/null
+++ b/keyboards/lattice60/info.json
@@ -0,0 +1,19 @@
+{
+ "keyboard_name": "lattice60",
+ "url": "",
+ "maintainer": "emdarcher",
+ "width": 15,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [
+ {"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"~", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"", "x":14, "y":3}, {"label":"Alt", "x":1.5, "y":4}, {"label":"Win", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4}, {"x":5, "y":4, "w":2.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Win", "x":11, "y":4, "w":1.5}, {"label":"Alt", "x":12.5, "y":4}
+ ]
+ },
+ "LAYOUT_60_hhkb": {
+ "layout": [
+ {"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"|", "x":13, "y":0}, {"label":"~", "x":14, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Backspace", "x":13.5, "y":1, "w":1.5}, {"label":"Control", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"", "x":14, "y":3}, {"label":"Alt", "x":1.5, "y":4}, {"label":"Win", "x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"label":"Win", "x":11, "y":4, "w":1.5}, {"label":"Alt", "x":12.5, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/lattice60/keymaps/default/config.h b/keyboards/lattice60/keymaps/default/config.h
new file mode 100644
index 00000000000..88d9334765e
--- /dev/null
+++ b/keyboards/lattice60/keymaps/default/config.h
@@ -0,0 +1,20 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+// place overrides here
+#define GRAVE_ESC_ALT_OVERRIDE
diff --git a/keyboards/lattice60/keymaps/default/keymap.c b/keyboards/lattice60/keymaps/default/keymap.c
new file mode 100644
index 00000000000..a5102070ea2
--- /dev/null
+++ b/keyboards/lattice60/keymaps/default/keymap.c
@@ -0,0 +1,40 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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 .
+ */
+#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_all(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN),
+ KC_LALT, KC_LGUI, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_RGUI, KC_RALT
+ ),
+ [_FN] = LAYOUT_all(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
+ KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_BSPC,
+ KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
diff --git a/keyboards/lattice60/keymaps/default/readme.md b/keyboards/lattice60/keymaps/default/readme.md
new file mode 100644
index 00000000000..bde2ba9b410
--- /dev/null
+++ b/keyboards/lattice60/keymaps/default/readme.md
@@ -0,0 +1,5 @@
+# The default keymap for lattice60
+
+
+
+This keymap uses a default HHKB layout, with support for a split spacebar and the addition of GESC on the ESC key.
diff --git a/keyboards/lattice60/keymaps/default_hhkb/config.h b/keyboards/lattice60/keymaps/default_hhkb/config.h
new file mode 100644
index 00000000000..88d9334765e
--- /dev/null
+++ b/keyboards/lattice60/keymaps/default_hhkb/config.h
@@ -0,0 +1,20 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+// place overrides here
+#define GRAVE_ESC_ALT_OVERRIDE
diff --git a/keyboards/lattice60/keymaps/default_hhkb/keymap.c b/keyboards/lattice60/keymaps/default_hhkb/keymap.c
new file mode 100644
index 00000000000..ccdc10ab32b
--- /dev/null
+++ b/keyboards/lattice60/keymaps/default_hhkb/keymap.c
@@ -0,0 +1,40 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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 .
+ */
+#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_60_hhkb(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN),
+ KC_LALT, KC_LGUI, /* */ KC_SPC, KC_RGUI, KC_RALT
+ ),
+ [_FN] = LAYOUT_60_hhkb(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
+ KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_BSPC,
+ KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
diff --git a/keyboards/lattice60/keymaps/default_hhkb/readme.md b/keyboards/lattice60/keymaps/default_hhkb/readme.md
new file mode 100644
index 00000000000..734ba74b9e3
--- /dev/null
+++ b/keyboards/lattice60/keymaps/default_hhkb/readme.md
@@ -0,0 +1,5 @@
+# The default HHKB keymap for lattice60
+
+
+
+This keymap uses a default HHKB layout, with the addition of GESC on the ESC key.
diff --git a/keyboards/lattice60/keymaps/emdarcher/config.h b/keyboards/lattice60/keymaps/emdarcher/config.h
new file mode 100644
index 00000000000..88d9334765e
--- /dev/null
+++ b/keyboards/lattice60/keymaps/emdarcher/config.h
@@ -0,0 +1,20 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+// place overrides here
+#define GRAVE_ESC_ALT_OVERRIDE
diff --git a/keyboards/lattice60/keymaps/emdarcher/keymap.c b/keyboards/lattice60/keymaps/emdarcher/keymap.c
new file mode 100644
index 00000000000..099e8e9203a
--- /dev/null
+++ b/keyboards/lattice60/keymaps/emdarcher/keymap.c
@@ -0,0 +1,48 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+// Defines names for use in layer keycodes and the keymap
+enum layer_names {
+ _BASE,
+ _FN0,
+ _FN1
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Base */
+ [_BASE] = LAYOUT_60_hhkb(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN0),
+ KC_LALT, KC_LGUI, /* */ KC_SPC, MO(_FN1), KC_RALT
+ ),
+ [_FN0] = LAYOUT_60_hhkb(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
+ KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_BSPC,
+ KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLU, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_VOLD, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [_FN1] = LAYOUT_60_hhkb(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_BSPC,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MRWD, KC_MFFD, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
diff --git a/keyboards/lattice60/keymaps/emdarcher/readme.md b/keyboards/lattice60/keymaps/emdarcher/readme.md
new file mode 100644
index 00000000000..812351af486
--- /dev/null
+++ b/keyboards/lattice60/keymaps/emdarcher/readme.md
@@ -0,0 +1,5 @@
+# emdarcher's keymap for lattice60
+
+
+
+Modified function layer from the default HHKB functions, and added an extra layer for media controls.
diff --git a/keyboards/lattice60/lattice60.c b/keyboards/lattice60/lattice60.c
new file mode 100644
index 00000000000..6cc0ea42fbf
--- /dev/null
+++ b/keyboards/lattice60/lattice60.c
@@ -0,0 +1,37 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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 .
+ */
+
+#include "lattice60.h"
+
+#define LED1_PIN C4
+#define LED2_PIN C5
+
+void keyboard_pre_init_kb(void){
+ //init the LED pins as outputs
+ setPinOutput(LED1_PIN);
+ setPinOutput(LED2_PIN);
+ //call any user initialization code
+ keyboard_pre_init_user();
+}
+
+bool led_update_kb(led_t led_state) {
+ bool res = led_update_user(led_state);
+ if(res){
+ //write the CAPS LOCK state on LED1
+ writePin(LED1_PIN, led_state.caps_lock);
+ }
+ return res;
+}
diff --git a/keyboards/lattice60/lattice60.h b/keyboards/lattice60/lattice60.h
new file mode 100644
index 00000000000..d9f5f37deaa
--- /dev/null
+++ b/keyboards/lattice60/lattice60.h
@@ -0,0 +1,64 @@
+/* Copyright 2019 Ethan Durrant (emdarcher)
+ *
+ * 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 .
+ */
+
+#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_all( \
+ k00, k04, k10, k14, k20, k24, k30, k34, k40, k44, k50, k54, k60, k64, k65, \
+ k01, k05, k11, k15, k21, k25, k31, k35, k41, k45, k51, k55, k61, k66, \
+ k02, k06, k12, k16, k22, k26, k32, k36, k42, k46, k52, k56, k62, \
+ k03, k07, k13, k17, k23, k27, k37, k43, k47, k53, k57, k63, k67, \
+ k70, k71, k72, k33, k74, k75, k76, k77 \
+) \
+{ \
+ { k00, k10, k20, k30, k40, k50, k60, k70 }, \
+ { k01, k11, k21, k31, k41, k51, k61, k71 }, \
+ { k02, k12, k22, k32, k42, k52, k62, k72 }, \
+ { k03, k13, k23, k33, k43, k53, k63, KC_NO }, \
+ { k04, k14, k24, k34, k44, k54, k64, k74 }, \
+ { k05, k15, k25, k35, k45, k55, k65, k75 }, \
+ { k06, k16, k26, k36, k46, k56, k66, k76 }, \
+ { k07, k17, k27, k37, k47, k57, k67, k77 } \
+}
+
+
+#define LAYOUT_60_hhkb( \
+ k00, k04, k10, k14, k20, k24, k30, k34, k40, k44, k50, k54, k60, k64, k65, \
+ k01, k05, k11, k15, k21, k25, k31, k35, k41, k45, k51, k55, k61, k66, \
+ k02, k06, k12, k16, k22, k26, k32, k36, k42, k46, k52, k56, k62, \
+ k03, k07, k13, k17, k23, k27, k37, k43, k47, k53, k57, k63, k67, \
+ k70, k71, k33, k76, k77 \
+) \
+{ \
+ { k00, k10, k20, k30, k40, k50, k60, k70 }, \
+ { k01, k11, k21, k31, k41, k51, k61, k71 }, \
+ { k02, k12, k22, k32, k42, k52, k62, KC_NO }, \
+ { k03, k13, k23, k33, k43, k53, k63, KC_NO }, \
+ { k04, k14, k24, k34, k44, k54, k64, KC_NO }, \
+ { k05, k15, k25, k35, k45, k55, k65, KC_NO }, \
+ { k06, k16, k26, k36, k46, k56, k66, k76 }, \
+ { k07, k17, k27, k37, k47, k57, k67, k77 } \
+}
diff --git a/keyboards/lattice60/readme.md b/keyboards/lattice60/readme.md
new file mode 100644
index 00000000000..f5a3dc59428
--- /dev/null
+++ b/keyboards/lattice60/readme.md
@@ -0,0 +1,21 @@
+# lattice60
+
+
+
+A HHKB layout keyboard using only through-hole components.
+
+* Keyboard Maintainer: [emdarcher](https://github.com/emdarcher)
+* Hardware Supported: LATTICE60 PCB
+* Hardware Availability: [KeyHive](https://keyhive.xyz/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make lattice60:default
+
+To activate the USBasploader bootloader, hold the BOOT button down during power on or reset. LED2 should light up to indicate that the bootloader is active.
+
+Flash the firmware using the `make` command with the `flash` parameter, example below:
+
+ make lattice60: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).
diff --git a/keyboards/lattice60/rules.mk b/keyboards/lattice60/rules.mk
new file mode 100644
index 00000000000..2a1a5296601
--- /dev/null
+++ b/keyboards/lattice60/rules.mk
@@ -0,0 +1,40 @@
+# MCU name
+MCU = atmega328p
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = USBasp
+
+# Processor frequency
+F_CPU = 12000000
+
+# disable the debugging code
+OPT_DEFS = -DDEBUG_LEVEL=0
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+
+LAYOUTS = 60_hhkb
diff --git a/keyboards/launchpad/keymaps/via/keymap.c b/keyboards/launchpad/keymaps/via/keymap.c
new file mode 100644
index 00000000000..ac25fa1e1ee
--- /dev/null
+++ b/keyboards/launchpad/keymaps/via/keymap.c
@@ -0,0 +1,94 @@
+// Below layout is based upon /u/That-Canadian's planck layout
+#include QMK_KEYBOARD_H
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_names {
+ _QWERTY,
+ _FUNC,
+ _RGB,
+ _LAYER3
+};
+
+// Defines for task manager and such
+#define CALTDEL LCTL(LALT(KC_DEL))
+#define TSKMGR LCTL(LSFT(KC_ESC))
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-------------.
+ * | 1 | 2 |
+ * |------+------|
+ * | 3 | 4 |
+ * |------+------|
+ * | 5 | 6 |
+ * |------+------|
+ * | FUNC | 8 |
+ * `-------------'
+ */
+[_QWERTY] = LAYOUT(
+ KC_1, KC_2,
+ KC_3, KC_4,
+ KC_5, KC_6,
+ MO(_FUNC), TG(_RGB)
+),
+
+/* Function
+ * ,-------------.
+ * | Q |CALDEL|
+ * |------+------|
+ * | A |TSKMGR|
+ * |------+------|
+ * | Z | X |
+ * |------+------|
+ * | | C |
+ * `-------------'
+ */
+[_FUNC] = LAYOUT(
+ KC_Q, CALTDEL,
+ KC_A, TSKMGR,
+ KC_Z, KC_X,
+ KC_TRNS, KC_C
+),
+
+/* RGB
+ * ,-------------.
+ * | MODE-| MODE+|
+ * |------+------|
+ * | HUE- | HUE+ |
+ * |------+------|
+ * | SAT- | SAT+ |
+ * |------+------|
+ * |TOGGLE| |
+ * `-------------'
+ */
+[_RGB] = LAYOUT(
+ RGB_RMOD, RGB_MOD,
+ RGB_HUD, RGB_HUI,
+ RGB_SAD, RGB_SAI,
+ RGB_TOG, KC_TRNS
+),
+
+/* Layer 3
+ * ,-------------.
+ * | | |
+ * |------+------|
+ * | | |
+ * |------+------|
+ * | | |
+ * |------+------|
+ * | | |
+ * `-------------'
+ */
+[_LAYER3] = LAYOUT(
+ KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS
+)
+
+};
diff --git a/keyboards/launchpad/keymaps/via/rules.mk b/keyboards/launchpad/keymaps/via/rules.mk
new file mode 100644
index 00000000000..87843cb0d6e
--- /dev/null
+++ b/keyboards/launchpad/keymaps/via/rules.mk
@@ -0,0 +1,3 @@
+VIA_ENABLE = yes
+LINK_TIME_OPTIMIZATION_ENABLE = yes
+RGBLIGHT_ENABLE = yes
diff --git a/keyboards/launchpad/rev1/config.h b/keyboards/launchpad/rev1/config.h
index 67a4154226f..debc28fab31 100644
--- a/keyboards/launchpad/rev1/config.h
+++ b/keyboards/launchpad/rev1/config.h
@@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
-#ifndef REV1_CONFIG_H
-#define REV1_CONFIG_H
+#pragma once
#include "../config.h"
@@ -29,4 +28,6 @@ along with this program. If not, see .
#define DIODE_DIRECTION COL2ROW
-#endif
+#define RGBLED_NUM 10
+#define RGB_DI_PIN F6
+#define RGBLIGHT_ANIMATIONS
diff --git a/keyboards/lazydesigners/dimple/config.h b/keyboards/lazydesigners/dimple/config.h
index 5c36a725272..a72c78cb3ca 100644
--- a/keyboards/lazydesigners/dimple/config.h
+++ b/keyboards/lazydesigners/dimple/config.h
@@ -20,7 +20,7 @@ along with this program. If not, see .
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
+#define VENDOR_ID 0x4C44 // "LD"
#define PRODUCT_ID 0x0040
#define DEVICE_VER 0x0001
#define MANUFACTURER LazyDesigners
diff --git a/keyboards/lazydesigners/dimple/keymaps/via/keymap.c b/keyboards/lazydesigners/dimple/keymaps/via/keymap.c
new file mode 100644
index 00000000000..d3bfed176c3
--- /dev/null
+++ b/keyboards/lazydesigners/dimple/keymaps/via/keymap.c
@@ -0,0 +1,23 @@
+#include QMK_KEYBOARD_H
+
+/* THIS FILE WAS GENERATED!
+ *
+ * This file was generated by QMK CLI. You may or may not want to
+ * edit it directly.
+ */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(KC_GESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT, KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_UP, KC_DOT, KC_LCTL, KC_LGUI, KC_LALT, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT),
+ [1] = LAYOUT(KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
+ [2] = LAYOUT(KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
+ [3] = LAYOUT(KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO)
+};
+
+bool led_update_user(led_t led_state) {
+ if (led_state.caps_lock) {
+ dimple_led_on();
+ } else {
+ dimple_led_off();
+ }
+ return false;
+}
diff --git a/keyboards/lazydesigners/dimple/keymaps/via/rules.mk b/keyboards/lazydesigners/dimple/keymaps/via/rules.mk
new file mode 100644
index 00000000000..f2e549c7b75
--- /dev/null
+++ b/keyboards/lazydesigners/dimple/keymaps/via/rules.mk
@@ -0,0 +1,10 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+# These features are not (yet) supported by VIA
+LEADER_ENABLE = no
+FAUXCLICKY_ENABLE = no
+MIDI_ENABLE = no
+BLUETOOTH_ENABLE = no
+KEY_LOCK_ENABLE = no
+TERMINAL_ENABLE = no
+MOUSEKEY_ENABLE = no
diff --git a/keyboards/lazydesigners/the30/config.h b/keyboards/lazydesigners/the30/config.h
index fdd76fe730e..63b1637c231 100644
--- a/keyboards/lazydesigners/the30/config.h
+++ b/keyboards/lazydesigners/the30/config.h
@@ -20,7 +20,7 @@ along with this program. If not, see .
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
+#define VENDOR_ID 0x4C44 // "LD"
#define PRODUCT_ID 0x0030
#define DEVICE_VER 0x0001
#define MANUFACTURER LazyDesigners
diff --git a/keyboards/lazydesigners/the50/config.h b/keyboards/lazydesigners/the50/config.h
index 72246eabac5..c46dcbeb1a7 100644
--- a/keyboards/lazydesigners/the50/config.h
+++ b/keyboards/lazydesigners/the50/config.h
@@ -3,7 +3,7 @@
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
+#define VENDOR_ID 0x4C44 // "LD"
#define PRODUCT_ID 0x0050
#define DEVICE_VER 0x0001
#define MANUFACTURER LazyDesigners
diff --git a/keyboards/lazydesigners/the60/config.h b/keyboards/lazydesigners/the60/config.h
index d6bd2205c6e..2929ad2adb6 100644
--- a/keyboards/lazydesigners/the60/config.h
+++ b/keyboards/lazydesigners/the60/config.h
@@ -3,7 +3,7 @@
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
+#define VENDOR_ID 0x4C44 // "LD"
#define PRODUCT_ID 0x0060
#define DEVICE_VER 0x0001
#define MANUFACTURER LazyDesigners
diff --git a/keyboards/le_chiffre/config.h b/keyboards/le_chiffre/config.h
new file mode 100644
index 00000000000..1ab07a6450a
--- /dev/null
+++ b/keyboards/le_chiffre/config.h
@@ -0,0 +1,46 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0xD645
+#define DEVICE_VER 0x0001
+#define MANUFACTURER tominabox1
+#define PRODUCT Le Chiffre
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 10
+
+/*
+ * 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 { B3, D4, F1, C6 }
+#define MATRIX_COL_PINS { F4, F5, B0, B2, B1, B4, D7, C7, D2, F7 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION ROW2COL
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+/* 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
+
+/* Define encoder pads */
+#define ENCODERS_PAD_A { D5 }
+#define ENCODERS_PAD_B { D3 }
+
+/* #define RGB_DI_PIN F0
+ #define RGBLED_NUM 1 */
diff --git a/keyboards/le_chiffre/info.json b/keyboards/le_chiffre/info.json
new file mode 100644
index 00000000000..eda303ffc15
--- /dev/null
+++ b/keyboards/le_chiffre/info.json
@@ -0,0 +1,15 @@
+{
+ "keyboard_name": "le_chiffre",
+ "url": "",
+ "maintainer": "tominabox1",
+ "width": 11,
+ "height": 4,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [{"label":"Q", "x":0, "y":0}, {"label":"W", "x":1, "y":0}, {"label":"E", "x":2, "y":0}, {"label":"R", "x":3, "y":0}, {"label":"T", "x":4, "y":0}, {"label":"Rotary", "x":5, "y":0, "w":1}, {"label":"Y", "x":6, "y":0}, {"label":"U", "x":7, "y":0}, {"label":"I", "x":8, "y":0}, {"label":"O", "x":9, "y":0}, {"label":"P", "x":10, "y":0},
+ {"label":"A", "x":0, "y":1}, {"label":"S", "x":1, "y":1}, {"label":"D", "x":2, "y":1}, {"label":"F", "x":3, "y":1}, {"label":"G", "x":4, "y":1}, {"label":"H", "x":6, "y":1}, {"label":"J", "x":7, "y":1}, {"label":"K", "x":8, "y":1}, {"label":"L", "x":9, "y":1},
+ {"label":";", "x":10, "y":1}, {"label":"Z", "x":0, "y":2}, {"label":"X", "x":1, "y":2}, {"label":"C", "x":2, "y":2}, {"label":"V", "x":3, "y":2}, {"label":"B", "x":4, "y":2}, {"label":"N", "x":6, "y":2}, {"label":"M", "x":7, "y":2}, {"label":"<", "x":8, "y":2}, {"label":">", "x":9, "y":2}, {"label":"?", "x":10, "y":2},
+ {"label":"", "x":1.75, "y":3, "w":1.25}, {"label":"", "x":3, "y":3, "w":2}, {"label":"", "x":6, "y":3, "w":2}, {"label":"", "x":8, "y":3, "w":1.25}]
+ }
+ }
+}
diff --git a/keyboards/le_chiffre/keymaps/default/keymap.c b/keyboards/le_chiffre/keymaps/default/keymap.c
new file mode 100644
index 00000000000..d5ca6969d57
--- /dev/null
+++ b/keyboards/le_chiffre/keymaps/default/keymap.c
@@ -0,0 +1,142 @@
+#include QMK_KEYBOARD_H
+
+enum layers{
+ _BASE,
+ _NUM_SYM,
+ _NAV
+};
+
+#define KC_NUM_SPC LT(_NUM_SYM, KC_SPC)
+#define KC_GA LGUI_T(KC_A)
+#define KC_AS LALT_T(KC_S)
+#define KC_CD LCTL_T(KC_D)
+#define KC_SF LSFT_T(KC_F)
+#define KC_SJ RSFT_T(KC_J)
+#define KC_CK RCTL_T(KC_K)
+#define KC_AL RALT_T(KC_L)
+#define KC_GSCLN RGUI_T(KC_SCLN)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT(
+ KC_Q, KC_W, KC_E, KC_R, KC_T, KC_MPLY, KC_Y, KC_U, KC_I, KC_O, KC_P,
+ KC_GA, KC_AS, KC_CD, KC_SF, KC_G, KC_H, KC_SJ, KC_CK, KC_AL, KC_GSCLN,
+ KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,
+ KC_LCTL, KC_ENT, KC_NUM_SPC, MO(_NAV)
+ ),
+
+ [_NUM_SYM] = LAYOUT(
+ KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_6, KC_7, KC_8, KC_9, KC_0,
+ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_EQUAL, KC_MINS,
+ KC_BSLS,KC_LCBR, KC_LBRC, KC_LPRN, KC_UNDS, KC_RPRN, KC_RBRC, KC_RCBR, KC_DOT, KC_GRV,
+ KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [_NAV] = LAYOUT(
+ RESET, _______, AG_NORM, AG_SWAP, DEBUG, KC_TRNS, KC_GRV, KC_PGDN, KC_UP, KC_PGUP, KC_SCLN,
+ RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, KC_NO, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END,
+ RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, KC_NO, KC_MINS, KC_RO, KC_COMM, KC_DOT, KC_BSLS,
+ KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+};
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ if (clockwise) {
+ tap_code(KC_MNXT);
+ } else {
+ tap_code(KC_MPRV);
+ }
+ }
+}
+
+#ifdef OLED_DRIVER_ENABLE
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+ return OLED_ROTATION_90; // flips the display 180 degrees if offhand
+}
+
+void oled_task_user(void) {
+ static const char PROGMEM base_logo[] = {
+ // 'base', 32x128px
+ 0x00, 0x00, 0x80, 0x7c, 0x02, 0x01, 0x01, 0x80, 0x00, 0xe0, 0x50, 0x28, 0x98, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x40, 0x41, 0x41, 0x41, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x3e, 0x41, 0x40, 0x40, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x30, 0x10, 0x08, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x07, 0x02, 0x39, 0x27, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x13, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xfc,
+ 0x22, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x60, 0x1f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x90, 0x7e, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40,
+ 0x30, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0xe4, 0x1c, 0x08, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x54, 0x4a, 0x26, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+static const char PROGMEM base_caps_logo[] = {
+ // 'caps', 32x128px
+ 0x00, 0x00, 0x80, 0x7c, 0x02, 0x01, 0x01, 0x80, 0x00, 0xe0, 0x50, 0x28, 0x98, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x80, 0x40, 0x41, 0x41, 0x41, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x3e, 0x41, 0x40, 0x40, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x30, 0x10, 0x08, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x07, 0x02, 0x39, 0x27, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x13, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xfc,
+ 0x22, 0x21, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x60, 0x1f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x90, 0x7e, 0x11, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40,
+ 0x30, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0xe4, 0x1c, 0x08, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x54, 0x4a, 0x26, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x10, 0x10, 0x10, 0x30, 0x00, 0x00, 0x80,
+ 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x1e, 0x11, 0x09, 0x08,
+ 0x1e, 0x11, 0x81, 0x7d, 0x13, 0x11, 0x08, 0x17, 0x11, 0x12, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+ switch (get_highest_layer(layer_state)) {
+ case _BASE:
+ if (host_keyboard_led_state().caps_lock) {
+ oled_write_raw_P(base_caps_logo, sizeof(base_caps_logo));
+ } else {
+ oled_write_raw_P(base_logo, sizeof(base_logo));
+ }
+ break;
+ default:
+ oled_write_raw_P(base_logo, sizeof(base_logo));
+ }
+}
+#endif
diff --git a/keyboards/le_chiffre/keymaps/default/readme.md b/keyboards/le_chiffre/keymaps/default/readme.md
new file mode 100644
index 00000000000..29f2d31f6ff
--- /dev/null
+++ b/keyboards/le_chiffre/keymaps/default/readme.md
@@ -0,0 +1 @@
+# Default Le Chiffre Keymap
diff --git a/keyboards/le_chiffre/le_chiffre.c b/keyboards/le_chiffre/le_chiffre.c
new file mode 100644
index 00000000000..2f28911b450
--- /dev/null
+++ b/keyboards/le_chiffre/le_chiffre.c
@@ -0,0 +1 @@
+#include "le_chiffre.h"
diff --git a/keyboards/le_chiffre/le_chiffre.h b/keyboards/le_chiffre/le_chiffre.h
new file mode 100644
index 00000000000..a95c0f262fe
--- /dev/null
+++ b/keyboards/le_chiffre/le_chiffre.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "quantum.h"
+
+#define XXX KC_NO
+
+#define LAYOUT( \
+ K00, K01, K02, K03, K04, K38, K05, K06, K07, K08, K09, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, \
+ K32, K34, K35, K37 \
+) \
+{ \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09 }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19 }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29 }, \
+ { XXX, XXX, K32, XXX, K34, K35, XXX, K37, K38, XXX } \
+}
diff --git a/keyboards/le_chiffre/readme.md b/keyboards/le_chiffre/readme.md
new file mode 100644
index 00000000000..ead6d88b3e7
--- /dev/null
+++ b/keyboards/le_chiffre/readme.md
@@ -0,0 +1,15 @@
+# Le Chiffre
+
+
+
+Le Chiffre (ironically, "the number" in French is a 30% keyboard designed by tominabox1. The purpose of the board is to provide a platform for MX and Choc ergo in one package for when ones wrists need a break. The board supports an RGB LED strip with DI on port F0. The board is also fitted with support for run-of-the-mill .91" OLED and EC11 rotary encoder.
+
+* Keyboard Maintainer: [TJ Campie](https://github.com/tominabox1)
+* Hardware Supported: Le Chiffre (source not available at this time)
+* Hardware Availability: Bring your own case.
+
+Make example for this keyboard (after setting up your build environment):
+
+ make le_chiffre:default
+
+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).
diff --git a/keyboards/le_chiffre/rules.mk b/keyboards/le_chiffre/rules.mk
new file mode 100644
index 00000000000..d9d44e06e67
--- /dev/null
+++ b/keyboards/le_chiffre/rules.mk
@@ -0,0 +1,22 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+TAP_DANCE_ENABLE = no
+ENCODER_ENABLE = yes
+OLED_DRIVER_ENABLE = no
diff --git a/keyboards/leeku/finger65/config.h b/keyboards/leeku/finger65/config.h
index 584db4ad319..dcf1aad65b4 100644
--- a/keyboards/leeku/finger65/config.h
+++ b/keyboards/leeku/finger65/config.h
@@ -24,7 +24,7 @@ along with this program. If not, see .
#define PRODUCT_ID 0x6050
#define DEVICE_VER 0x0100
#define MANUFACTURER LeeKu
-#define PRODUCT L3
+#define PRODUCT Finger65
#define DESCRIPTION QMK keyboard firmware for L3
#define RGBLED_NUM 12
diff --git a/keyboards/leeku/finger65/usbconfig.h b/keyboards/leeku/finger65/usbconfig.h
deleted file mode 100644
index 48be8904681..00000000000
--- a/keyboards/leeku/finger65/usbconfig.h
+++ /dev/null
@@ -1,364 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 0
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'L', 'e', 'e', 'k', 'u'
-#define USB_CFG_VENDOR_NAME_LEN 5
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'F', 'i', 'n', 'g', 'e', 'r', '6', '5'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/lfkeyboards/lfk78/config.h b/keyboards/lfkeyboards/lfk78/config.h
index 3478c9629f9..b96aca07c92 100644
--- a/keyboards/lfkeyboards/lfk78/config.h
+++ b/keyboards/lfkeyboards/lfk78/config.h
@@ -158,10 +158,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/lfkeyboards/lfkpad/config.h b/keyboards/lfkeyboards/lfkpad/config.h
index fb48297e5cd..b05ee0f0cad 100644
--- a/keyboards/lfkeyboards/lfkpad/config.h
+++ b/keyboards/lfkeyboards/lfkpad/config.h
@@ -175,10 +175,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/lily58/keymaps/bcat/config.h b/keyboards/lily58/keymaps/bcat/config.h
index 18092620449..f7f08d076a5 100644
--- a/keyboards/lily58/keymaps/bcat/config.h
+++ b/keyboards/lily58/keymaps/bcat/config.h
@@ -1,3 +1,6 @@
#pragma once
#define EE_HANDS
+
+/* Work around Elite-C v3 with broken VBUS detection. */
+#define SPLIT_USB_DETECT
diff --git a/keyboards/lily58/keymaps/bcat/keymap.c b/keyboards/lily58/keymaps/bcat/keymap.c
index fac14782abb..7fa65b876f1 100644
--- a/keyboards/lily58/keymaps/bcat/keymap.c
+++ b/keyboards/lily58/keymaps/bcat/keymap.c
@@ -27,7 +27,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
KC_CAPS, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______,
_______, _______, _______, _______, _______, _______, KC_PIPE, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_TILD,
- _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_APP, _______, _______, KC_BSLS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_GRV,
+ _______, KC_APP, KC_PSCR, KC_SLCK, KC_PAUS, _______, _______, _______, KC_BSLS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_GRV,
_______, _______, _______, _______, _______, _______, _______, _______
),
diff --git a/keyboards/lily58/keymaps/bcat/readme.md b/keyboards/lily58/keymaps/bcat/readme.md
index 389def1432b..57b7929d3bd 100644
--- a/keyboards/lily58/keymaps/bcat/readme.md
+++ b/keyboards/lily58/keymaps/bcat/readme.md
@@ -1,49 +1,18 @@
# bcat's Lily58 layout
-This split ergo layout is standard QWERTY on the default layer, with symbols on
-the lower layer, numbers/navigation on the raise layer, and media keys centered
-around the ESDF cluster in the adjust (raise + lower) layer. A few general
-principles went into this layout:
+This split ergo layout follows my preferred [Crkbd
+layout](https://github.com/qmk/qmk_firmware/tree/master/keyboards/crkbd/keymaps/bcat)
+with the following changes:
-* The number row is optional, as are the outermost bottom row keys and the
-"extra" keys on the innnermost columns below the controllers. This allows me to
-switch between this keyboard and a 40% like the
-[Crkbd](https://github.com/qmk/qmk_firmware/tree/master/keyboards/lily58/keymaps/bcat)
-without breaking muscle memory.
+* There's an optional number row at the top of the keyboard. I am quite used to
+using layers for numbers and symbols, so in practice this goes unused.
-* Space and Enter are on the big thumb keys so they're easy to press.
+* The dedicated Hyphen/Underscore and Equals/Plus keys on the number row are
+placed in the same positions as on the ErgoDox EZ. (There's no real reason for
+this; I just had to do _something_ with those keys.)
-* There are two shift keys because Right Shift is all that important, but just
-because I don't have any better ideas for what to put there.
-
-* Arrow keys are on VIM-style HJKL keys.
-
-* Home/End and Page Up/Page Down are equivalent to the arrow keys, but
-translated down one row.
-
-* Navigation is usable with just the right hand, to enable left-handed mousing
-at the same time. Additionally, Web page scrolling (Space, Shift+Space) is
-possible with just the left hand, for writing at the same time as scrolling.
-
-* Escape is easy to reach because Vim is life.
-
-* Since most of the modifiers are on the left half, keys frequently pressed
-together with mods (e.g., numbers, function keys, etc.) are on the Raise layer
-activated by the right thumb.
-
-* Every key on a TKL has a binding.
-
-* Backspace is bound in the same place on every layer to avoid having to let go
-of layer-shift keys to fix a mistake.
-
-* Likewise, the comma and period keys are not rebound on the raise layer to
-allow typing numbers with thousand separators and decimal points without
-releasing the layer key.
-
-* Brackets and braces are on or near the home row for quick access when coding.
-They're positioned below the parens on the Raise layer for easy recall.
-
-* For consistency, mods aren't rebound on layers (except for the Tab key).
+* The extra thumb keys are used for dedicated Ctrl/Menu keys (not super useful)
+and browser back/forward navigation keys (actually more useful than expected).
## Default layer
@@ -53,7 +22,7 @@ They're positioned below the parens on the Raise layer for easy recall.
## Lower layer
-
+
([KLE](http://www.keyboard-layout-editor.com/#/gists/19ad0d3b5d745fbb2818db09740f5a11))
diff --git a/keyboards/lily58/ssd1306.h b/keyboards/lily58/ssd1306.h
index ea8c9232805..0ca093093a1 100755
--- a/keyboards/lily58/ssd1306.h
+++ b/keyboards/lily58/ssd1306.h
@@ -2,7 +2,6 @@
#include
#include
-#include "pincontrol.h"
#include "action.h"
enum ssd1306_cmds {
@@ -88,4 +87,4 @@ void matrix_write_ln(struct CharacterMatrix *matrix, const char *data);
void matrix_write_P(struct CharacterMatrix *matrix, const char *data);
void matrix_render(struct CharacterMatrix *matrix);
-bool process_record_gfx(uint16_t keycode, keyrecord_t *record);
\ No newline at end of file
+bool process_record_gfx(uint16_t keycode, keyrecord_t *record);
diff --git a/keyboards/m0lly/config.h b/keyboards/m0lly/config.h
index 010833ac80a..327b0f08c15 100644
--- a/keyboards/m0lly/config.h
+++ b/keyboards/m0lly/config.h
@@ -67,6 +67,11 @@ along with this program. If not, see .
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
+#define QMK_ESC_OUTPUT A0 // usually COL
+#define QMK_ESC_INPUT F4 // usually ROW
+#define QMK_LED D2 // NumLock on M0lly
+//#define QMK_SPEAKER C6
+
/*
* Force NKRO
*
diff --git a/keyboards/m0lly/i2c.c b/keyboards/m0lly/i2c.c
deleted file mode 100644
index cd2b835d501..00000000000
--- a/keyboards/m0lly/i2c.c
+++ /dev/null
@@ -1,166 +0,0 @@
-#include
-#include
-#include
-#include
-#include
-#include
-#include "i2c.h"
-
-#ifdef USE_I2C
-
-// Limits the amount of we wait for any one i2c transaction.
-// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is
-// 9 bits, a single transaction will take around 90μs to complete.
-//
-// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit
-// poll loop takes at least 8 clock cycles to execute
-#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8
-
-#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE)
-
-volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE];
-
-static volatile uint8_t slave_buffer_pos;
-static volatile bool slave_has_register_set = false;
-
-// Wait for an i2c operation to finish
-inline static
-void i2c_delay(void) {
- uint16_t lim = 0;
- while(!(TWCR & (1<10.
- // Check datasheets for more info.
- TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
-}
-
-// Start a transaction with the given i2c slave address. The direction of the
-// transfer is set with I2C_READ and I2C_WRITE.
-// returns: 0 => success
-// 1 => error
-uint8_t i2c_master_start(uint8_t address) {
- TWCR = (1< slave ACK
-// 1 => slave NACK
-uint8_t i2c_master_write(uint8_t data) {
- TWDR = data;
- TWCR = (1<= SLAVE_BUFFER_SIZE ) {
- ack = 0;
- slave_buffer_pos = 0;
- }
- slave_has_register_set = true;
- } else {
- i2c_slave_buffer[slave_buffer_pos] = TWDR;
- BUFFER_POS_INC();
- }
- break;
-
- case TW_ST_SLA_ACK:
- case TW_ST_DATA_ACK:
- // master has addressed this device as a slave transmitter and is
- // requesting data.
- TWDR = i2c_slave_buffer[slave_buffer_pos];
- BUFFER_POS_INC();
- break;
-
- case TW_BUS_ERROR: // something went wrong, reset twi state
- TWCR = 0;
- default:
- break;
- }
- // Reset everything, so we are ready for the next TWI interrupt
- TWCR |= (1<
-
-#ifndef F_CPU
-#define F_CPU 16000000UL
-#endif
-
-#define I2C_READ 1
-#define I2C_WRITE 0
-
-#define I2C_ACK 1
-#define I2C_NACK 0
-
-#define SLAVE_BUFFER_SIZE 0x10
-
-// i2c SCL clock frequency
-#define SCL_CLOCK 800000L
-
-extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE];
-
-void i2c_master_init(void);
-uint8_t i2c_master_start(uint8_t address);
-void i2c_master_stop(void);
-uint8_t i2c_master_write(uint8_t data);
-uint8_t i2c_master_read(int);
-void i2c_reset_state(void);
-void i2c_slave_init(uint8_t address);
-
-
-static inline unsigned char i2c_start_read(unsigned char addr) {
- return i2c_master_start((addr << 1) | I2C_READ);
-}
-
-static inline unsigned char i2c_start_write(unsigned char addr) {
- return i2c_master_start((addr << 1) | I2C_WRITE);
-}
-
-// from SSD1306 scrips
-extern unsigned char i2c_rep_start(unsigned char addr);
-extern void i2c_start_wait(unsigned char addr);
-extern unsigned char i2c_readAck(void);
-extern unsigned char i2c_readNak(void);
-extern unsigned char i2c_read(unsigned char ack);
-
-#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak();
-
-#endif
diff --git a/keyboards/m0lly/keymaps/default/config.h b/keyboards/m0lly/keymaps/default/config.h
deleted file mode 100644
index ee142927f3a..00000000000
--- a/keyboards/m0lly/keymaps/default/config.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Copyright 2017 Mathias Andersson
- *
- * 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 .
- */
-
-#pragma once
-
-#define USE_I2C
-#define SSD1306OLED
-//#define OLED_ROTATE180
-#define SSD1306_ADDRESS 0x3C
-
-// place overrides here
diff --git a/keyboards/m0lly/keymaps/default/keymap.c b/keyboards/m0lly/keymaps/default/keymap.c
index 784deb04a72..5f6211f0f58 100644
--- a/keyboards/m0lly/keymaps/default/keymap.c
+++ b/keyboards/m0lly/keymaps/default/keymap.c
@@ -13,11 +13,8 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
+
#include QMK_KEYBOARD_H
-#include "LUFA/Drivers/Peripheral/TWI.h"
-#include "i2c.h"
-#include "ssd1306.h"
-
//Layers
@@ -26,13 +23,6 @@ enum {
FUNCTION,
};
-bool screenWorks = 0;
-
-//13 characters max without re-writing the "Layer: " format in iota_gfx_task_user()
-static char layer_lookup[][14] = {"Base","Function"};
-
-
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap BASE: (Base Layer) Default Layer
*
@@ -78,72 +68,27 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- return true;
-}
+#ifdef OLED_DRIVER_ENABLE
+void oled_task_user(void) {
+ oled_write_P(PSTR("TKC1800\n"),false);
+ // Host Keyboard Layer Status
+ oled_write_P(PSTR("Layer: "), false);
-void led_set_user(uint8_t usb_led) {
-
-}
-
-void matrix_init_user(void) {
- #ifdef USE_I2C
- i2c_master_init();
- #ifdef SSD1306OLED
- // calls code for the SSD1306 OLED
- _delay_ms(400);
- TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000));
- if ( iota_gfx_init() ) { // turns on the display
- screenWorks = 1;
- }
- #endif
- #endif
- #ifdef AUDIO_ENABLE
- startup_user();
- #endif
-}
-
-void matrix_scan_user(void) {
- #ifdef SSD1306OLED
- if ( screenWorks ) {
- iota_gfx_task(); // this is what updates the display continuously
- };
- #endif
-}
-
-void matrix_update(struct CharacterMatrix *dest,
- const struct CharacterMatrix *source) {
- if (memcmp(dest->display, source->display, sizeof(dest->display))) {
- memcpy(dest->display, source->display, sizeof(dest->display));
- dest->dirty = true;
- }
-}
-
-void iota_gfx_task_user(void) {
- #if DEBUG_TO_SCREEN
- if (debug_enable) {
- return;
+ switch (get_highest_layer(layer_state)) {
+ case BASE:
+ oled_write_P(PSTR("Base\n"), false);
+ break;
+ case FUNCTION:
+ oled_write_P(PSTR("Function\n"), false);
+ break;
+ default:
+ // Or use the write_ln shortcut over adding '\n' to the end of your string
+ oled_write_ln_P(PSTR("Undefined"), false);
}
- #endif
-
- struct CharacterMatrix matrix;
-
- matrix_clear(&matrix);
- matrix_write_P(&matrix, PSTR("TKC M0LLY"));
-
- uint8_t layer = biton32(layer_state);
-
- char buf[40];
- snprintf(buf,sizeof(buf), "Undef-%d", layer);
- matrix_write_P(&matrix, PSTR("\nLayer: "));
- matrix_write(&matrix, layer_lookup[layer]);
-
- // Host Keyboard LED Status
- char led[40];
- snprintf(led, sizeof(led), "\n\n%s %s %s",
- (host_keyboard_leds() & (1< .
#define PRODUCT_ID 0x7465
#define DEVICE_VER 0x0001
#define MANUFACTURER Maartenwut
-#define PRODUCT TA-65
+#define PRODUCT ta-65
#define DESCRIPTION A universal 65% PCB with underglow.
/* key matrix size */
@@ -37,6 +37,12 @@ along with this program. If not, see .
#define MATRIX_COL_PINS {D2,D1,D0,D3,D5,C7,C6,B6,B5,F0,F1,F4,F5,F6,F7,B0}
#define UNUSED_PINS
+#define ENCODERS_PAD_A { B2 }
+#define ENCODERS_PAD_B { B1 }
+
+/* Uncomment if your encoder doesn't react to every turn or skips */
+//#define ENCODER_RESOLUTION 2
+
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/maartenwut/ta65/keymaps/default/keymap.c b/keyboards/maartenwut/ta65/keymaps/default/keymap.c
index b04172c7590..8bb8a14ba05 100644
--- a/keyboards/maartenwut/ta65/keymaps/default/keymap.c
+++ b/keyboards/maartenwut/ta65/keymaps/default/keymap.c
@@ -1,17 +1,38 @@
#include QMK_KEYBOARD_H
-// Each layer gets a name for readability, which is then used in the keymap matrix below.
-// The underscores don't mean anything - you can have a layer called STUFF or any other name.
-// Layer names don't all need to be of the same length, obviously, and you can also skip them
-// entirely and just use numbers.
-#define _MA 0
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[_MA] = LAYOUT_all(
- KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_BSPC, KC_GRV,
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
- KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, KC_PGUP,
- KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_APP, KC_RCTRL, KC_LEFT, KC_DOWN, KC_RGHT)
+[0] = LAYOUT_all(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_BSPC, KC_INS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTRL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+[1] = LAYOUT_all(
+ RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
+
};
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ switch(get_highest_layer(layer_state)){
+ case 1: //Layer 1
+ if (!clockwise) { // Remove ! to reverse direction
+ tap_code(KC_WH_U);
+ } else {
+ tap_code(KC_WH_D);
+ }
+ break;
+ default: //Layer 0
+ if (!clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ break;
+ }
+}
diff --git a/keyboards/maartenwut/ta65/keymaps/via/keymap.c b/keyboards/maartenwut/ta65/keymaps/via/keymap.c
new file mode 100644
index 00000000000..e2d96eb9c0c
--- /dev/null
+++ b/keyboards/maartenwut/ta65/keymaps/via/keymap.c
@@ -0,0 +1,33 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[0] = LAYOUT_all(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSLS, KC_INS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_CAPS, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTRL,MO(2), KC_LEFT, KC_DOWN, KC_RGHT),
+
+[1] = LAYOUT_all(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, KC_PSCR,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, _______, _______, _______, _______, KC_INS,
+ _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, KC_HOME,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, KC_END,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
+
+[2] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
+
+[3] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
+
+};
diff --git a/keyboards/maartenwut/ta65/keymaps/via/rules.mk b/keyboards/maartenwut/ta65/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/maartenwut/ta65/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/maartenwut/ta65/rules.mk b/keyboards/maartenwut/ta65/rules.mk
index db0567bd03d..86efb933bb4 100644
--- a/keyboards/maartenwut/ta65/rules.mk
+++ b/keyboards/maartenwut/ta65/rules.mk
@@ -12,19 +12,24 @@ MCU = atmega32u4
BOOTLOADER = qmk-dfu
# Build Options
-# comment out to disable the options.
+# change yes to no to disable
#
-BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
-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
-NKRO_ENABLE = no # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-MIDI_ENABLE = no # MIDI controls
-AUDIO_ENABLE = no
-UNICODE_ENABLE = no # Unicode
-BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+ENCODER_ENABLE = yes
LAYOUTS = 65_ansi 65_iso
diff --git a/keyboards/maartenwut/ta65/ta65.h b/keyboards/maartenwut/ta65/ta65.h
index 273acf9ad39..40a763b993e 100644
--- a/keyboards/maartenwut/ta65/ta65.h
+++ b/keyboards/maartenwut/ta65/ta65.h
@@ -38,14 +38,14 @@
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2d, k2e, \
k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \
- k40, k41, k42, k46, k49, k4c, k4d, k4e \
+ k40, k41, k42, k46, k4a, k4c, k4d, k4e \
) \
{ \
{k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f}, \
{k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, ___}, \
{k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, ___, k2d, k2e, ___}, \
{k30, ___, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, ___}, \
- {k40, k41, k42, ___, ___, ___, k46, ___, ___, k49, ___, ___, k4c, k4d, k4e, ___} \
+ {k40, k41, k42, ___, ___, ___, k46, ___, ___, ___, k4a, ___, k4c, k4d, k4e, ___} \
}
#define LAYOUT_iso_tsangan( \
@@ -53,14 +53,14 @@
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1e, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \
- k40, k41, k42, k46, k49, k4c, k4d, k4e \
+ k40, k41, k42, k46, k4a, k4c, k4d, k4e \
) \
{ \
{k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f}, \
{k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, ___, k1e, ___}, \
{k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, ___}, \
{k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, ___}, \
- {k40, k41, k42, ___, ___, ___, k46, ___, ___, k49, ___, ___, k4c, k4d, k4e, ___} \
+ {k40, k41, k42, ___, ___, ___, k46, ___, ___, ___, k4a, ___, k4c, k4d, k4e, ___} \
}
#define LAYOUT_65_iso( \
diff --git a/keyboards/maartenwut/wasdat/config.h b/keyboards/maartenwut/wasdat/config.h
index ffd33d8534d..d30263bfcfc 100644
--- a/keyboards/maartenwut/wasdat/config.h
+++ b/keyboards/maartenwut/wasdat/config.h
@@ -20,7 +20,7 @@ along with this program. If not, see .
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
+#define VENDOR_ID 0x4705
#define PRODUCT_ID 0xC474
#define DEVICE_VER 0x0001
#define MANUFACTURER Maartenwut
@@ -252,5 +252,7 @@ along with this program. If not, see .
*/
/* Bootmagic Lite key configuration */
-// #define BOOTMAGIC_LITE_ROW 0
-// #define BOOTMAGIC_LITE_COLUMN 0
+#define BOOTMAGIC_LITE_ROW 0
+#define BOOTMAGIC_LITE_COLUMN 5
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
diff --git a/keyboards/maartenwut/wasdat/info.json b/keyboards/maartenwut/wasdat/info.json
index 8f931f46cf7..6154bd55556 100644
--- a/keyboards/maartenwut/wasdat/info.json
+++ b/keyboards/maartenwut/wasdat/info.json
@@ -185,7 +185,6 @@
{"label":"P", "x":10.5, "y":2.5},
{"label":"{", "x":11.5, "y":2.5},
{"label":"}", "x":12.5, "y":2.5},
- {"label":"Enter", "x":13.75, "y":2.5, "w":1.25, "h":2},
{"label":"Delete", "x":15.25, "y":2.5},
{"label":"End", "x":16.25, "y":2.5},
@@ -209,6 +208,7 @@
{"label":":", "x":10.75, "y":3.5},
{"label":"@", "x":11.75, "y":3.5},
{"label":"~", "x":12.75, "y":3.5},
+ {"label":"Enter", "x":13.75, "y":2.5, "w":1.25, "h":2},
{"label":"4", "x":18.5, "y":3.5},
{"label":"5", "x":19.5, "y":3.5},
@@ -405,7 +405,6 @@
{"label":"P", "x":10.5, "y":2.5},
{"label":"{", "x":11.5, "y":2.5},
{"label":"}", "x":12.5, "y":2.5},
- {"label":"Enter", "x":13.75, "y":2.5, "w":1.25, "h":2},
{"label":"Delete", "x":15.25, "y":2.5},
{"label":"End", "x":16.25, "y":2.5},
@@ -424,6 +423,7 @@
{"label":":", "x":10.75, "y":3.5},
{"label":"@", "x":11.75, "y":3.5},
{"label":"~", "x":12.75, "y":3.5},
+ {"label":"Enter", "x":13.75, "y":2.5, "w":1.25, "h":2},
{"label":"Shift", "x":0, "y":4.5, "w":1.25},
{"label":"|", "x":1.25, "y":4.5},
diff --git a/keyboards/maartenwut/wasdat/keymaps/konstantin/rules.mk b/keyboards/maartenwut/wasdat/keymaps/konstantin/rules.mk
index 041d3211459..c3a73fd8450 100644
--- a/keyboards/maartenwut/wasdat/keymaps/konstantin/rules.mk
+++ b/keyboards/maartenwut/wasdat/keymaps/konstantin/rules.mk
@@ -3,6 +3,7 @@ BOOTMAGIC_ENABLE = no
COMMAND_ENABLE = yes
CONSOLE_ENABLE = yes
EXTRAKEY_ENABLE = yes
+GRAVE_ESC_ENABLE = no
MOUSEKEY_ENABLE = yes
NKRO_ENABLE = yes
SPACE_CADET_ENABLE = no
diff --git a/keyboards/maartenwut/wasdat/keymaps/via/keymap.c b/keyboards/maartenwut/wasdat/keymaps/via/keymap.c
new file mode 100644
index 00000000000..9ad78d60d90
--- /dev/null
+++ b/keyboards/maartenwut/wasdat/keymaps/via/keymap.c
@@ -0,0 +1,96 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+ * │Esc│ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │PSc│Slk│Pse│
+ * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│ │Num│ / │ * │ - │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│ │ 7 │ 8 │ 9 │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ├───┼───┼───┤ + │
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ │ 4 │ 5 │ 6 │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐ ├───┼───┼───┼───┤
+ * │Shft│ < │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │ │ 1 │ 2 │ 3 │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤Ent│
+ * │Ctrl│GUI │Alt │ │ Alt│ GUI│FnMn│Ctrl│ │ ← │ ↓ │ → │ │ 0 │ . │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
+ */
+ LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, LT(1, KC_APP), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+ ),
+
+ /*
+ * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+ * │Rst│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ├───┼───┼───┤ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐ ├───┼───┼───┼───┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
+ */
+ LAYOUT_all(
+ RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ /*
+ * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ├───┼───┼───┤ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐ ├───┼───┼───┼───┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
+ */
+ LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/maartenwut/wasdat/keymaps/via/rules.mk b/keyboards/maartenwut/wasdat/keymaps/via/rules.mk
new file mode 100644
index 00000000000..36b7ba9cbc9
--- /dev/null
+++ b/keyboards/maartenwut/wasdat/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/maartenwut/wasdat/rules.mk b/keyboards/maartenwut/wasdat/rules.mk
index db9728623e5..822baf5ed84 100644
--- a/keyboards/maartenwut/wasdat/rules.mk
+++ b/keyboards/maartenwut/wasdat/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = qmk-dfu
# Build Options
# change yes to no to disable
#
-BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = no # Console for debug
diff --git a/keyboards/maartenwut/wasdat/wasdat.h b/keyboards/maartenwut/wasdat/wasdat.h
index d9f1f95a2dc..a25646b6286 100644
--- a/keyboards/maartenwut/wasdat/wasdat.h
+++ b/keyboards/maartenwut/wasdat/wasdat.h
@@ -27,6 +27,25 @@
* The second converts the arguments into a two-dimensional array which
* represents the switch matrix.
*/
+#define LAYOUT_all( \
+ K05, K44, K42, K32, K02, K21, K0A, K3E, K4E, K4D, K2D, K0D, K7D, K23, K53, K51, \
+ K45, K25, K24, K22, K20, K40, K48, K28, K2A, K2E, K2F, K4F, K4A, K3D, K47, K4C, K46, K69, K67, K66, K76, \
+ K35, K55, K54, K52, K50, K30, K38, K58, K5A, K5E, K5F, K3F, K3A, K1D, K49, K2C, K26, K59, K57, K56, K5C, \
+ K34, K15, K14, K12, K10, K00, K08, K18, K1A, K1E, K1F, K0F, K6D, K39, K37, K36, \
+ K3B, K04, K65, K64, K62, K60, K70, K78, K68, K6A, K6E, K7F, K1B, K0C, K19, K17, K16, K1C, \
+ K41, K31, K03, K09, K73, K11, K33, K61, K7C, K79, K77, K07, K06 \
+) \
+{ \
+ { K00, XXX, K02, K03, K04, K05, K06, K07, K08, K09, K0A, XXX, K0C, K0D, XXX, K0F }, \
+ { K10, K11, K12, XXX, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \
+ { K20, K21, K22, K23, K24, K25, K26, XXX, K28, XXX, K2A, XXX, K2C, K2D, K2E, K2F }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D, K3E, K3F }, \
+ { K40, K41, K42, XXX, K44, K45, K46, K47, K48, K49, K4A, XXX, K4C, K4D, K4E, K4F }, \
+ { K50, K51, K52, K53, K54, K55, K56, K57, K58, K59, K5A, XXX, K5C, XXX, K5E, K5F }, \
+ { K60, K61, K62, XXX, K64, K65, K66, K67, K68, K69, K6A, XXX, XXX, K6D, K6E, XXX }, \
+ { K70, XXX, XXX, K73, XXX, XXX, K76, K77, K78, K79, XXX, XXX, K7C, K7D, XXX, K7F } \
+}
+
#define LAYOUT_fullsize_ansi( \
K05, K44, K42, K32, K02, K21, K0A, K3E, K4E, K4D, K2D, K0D, K7D, K23, K53, K51, \
K45, K25, K24, K22, K20, K40, K48, K28, K2A, K2E, K2F, K4F, K4A, K3D, K47, K4C, K46, K69, K67, K66, K76, \
diff --git a/keyboards/maartenwut/wasdat_code/config.h b/keyboards/maartenwut/wasdat_code/config.h
new file mode 100644
index 00000000000..16d5acd9c42
--- /dev/null
+++ b/keyboards/maartenwut/wasdat_code/config.h
@@ -0,0 +1,258 @@
+/*
+Copyright 2019 Maarten Dekkers
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x4705
+#define PRODUCT_ID 0xB00E
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Maartenwut
+#define PRODUCT Wasdat Code
+#define DESCRIPTION Custom controller for the WASD CODE TKL and 104-key keyboards
+
+/* key matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 16
+
+/*
+ * 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 { E6, C7, C6, B6, B5, B4, D7, D6 }
+#define MATRIX_COL_PINS { }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION ROW2COL
+
+// For QMK DFU
+#define QMK_ESC_OUTPUT E6
+#define QMK_ESC_INPUT F0
+#define QMK_LED B1
+
+/*
+ * 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 BACKLIGHT_PIN B7
+#define BACKLIGHT_BREATHING
+#define BACKLIGHT_LEVELS 5
+
+// #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
+
+/* number of backlight levels */
+
+/* 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 userful 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
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+/* defined by default; to change, uncomment and set to the combination you want */
+// #define IS_COMMAND() (get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP H
+//#define MAGIC_KEY_HELP_ALT SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER0_ALT GRAVE
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER B
+//#define MAGIC_KEY_BOOTLOADER_ALT ESC
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_EEPROM_CLEAR BSPACE
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+/*
+ * MIDI options
+ */
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+//#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 1
+
+/*
+ * 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
+*/
+
+/* Bootmagic Lite key configuration */
+#define BOOTMAGIC_LITE_ROW 2
+#define BOOTMAGIC_LITE_COLUMN 3
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
diff --git a/keyboards/maartenwut/wasdat_code/info.json b/keyboards/maartenwut/wasdat_code/info.json
new file mode 100644
index 00000000000..526883f8d50
--- /dev/null
+++ b/keyboards/maartenwut/wasdat_code/info.json
@@ -0,0 +1,459 @@
+{
+ "keyboard_name": "Wasdat Code",
+ "url": "https://maartenwut.com/product/wasdat-code/",
+ "maintainer": "Maartenwut",
+ "width": 22.5,
+ "height": 6.5,
+ "layouts": {
+ "LAYOUT_fullsize_ansi": {
+ "layout": [
+ {"label":"Esc", "x":0, "y":0},
+ {"label":"F1", "x":2, "y":0},
+ {"label":"F2", "x":3, "y":0},
+ {"label":"F3", "x":4, "y":0},
+ {"label":"F4", "x":5, "y":0},
+ {"label":"F5", "x":6.5, "y":0},
+ {"label":"F6", "x":7.5, "y":0},
+ {"label":"F7", "x":8.5, "y":0},
+ {"label":"F8", "x":9.5, "y":0},
+ {"label":"F9", "x":11, "y":0},
+ {"label":"F10", "x":12, "y":0},
+ {"label":"F11", "x":13, "y":0},
+ {"label":"F12", "x":14, "y":0},
+
+ {"label":"PrtSc", "x":15.25, "y":0},
+ {"label":"Scroll Lock", "x":16.25, "y":0},
+ {"label":"Pause", "x":17.25, "y":0},
+
+ {"label":"~", "x":0, "y":1.5},
+ {"label":"1", "x":1, "y":1.5},
+ {"label":"2", "x":2, "y":1.5},
+ {"label":"3", "x":3, "y":1.5},
+ {"label":"4", "x":4, "y":1.5},
+ {"label":"5", "x":5, "y":1.5},
+ {"label":"6", "x":6, "y":1.5},
+ {"label":"7", "x":7, "y":1.5},
+ {"label":"8", "x":8, "y":1.5},
+ {"label":"9", "x":9, "y":1.5},
+ {"label":"0", "x":10, "y":1.5},
+ {"label":"_", "x":11, "y":1.5},
+ {"label":"+", "x":12, "y":1.5},
+ {"label":"Backspace", "x":13, "y":1.5, "w":2},
+
+ {"label":"Insert", "x":15.25, "y":1.5},
+ {"label":"Home", "x":16.25, "y":1.5},
+ {"label":"PgUp", "x":17.25, "y":1.5},
+
+ {"label":"Num Lock", "x":18.5, "y":1.5},
+ {"label":"/", "x":19.5, "y":1.5},
+ {"label":"*", "x":20.5, "y":1.5},
+ {"label":"-", "x":21.5, "y":1.5},
+
+ {"label":"Tab", "x":0, "y":2.5, "w":1.5},
+ {"label":"Q", "x":1.5, "y":2.5},
+ {"label":"W", "x":2.5, "y":2.5},
+ {"label":"E", "x":3.5, "y":2.5},
+ {"label":"R", "x":4.5, "y":2.5},
+ {"label":"T", "x":5.5, "y":2.5},
+ {"label":"Y", "x":6.5, "y":2.5},
+ {"label":"U", "x":7.5, "y":2.5},
+ {"label":"I", "x":8.5, "y":2.5},
+ {"label":"O", "x":9.5, "y":2.5},
+ {"label":"P", "x":10.5, "y":2.5},
+ {"label":"{", "x":11.5, "y":2.5},
+ {"label":"}", "x":12.5, "y":2.5},
+ {"label":"|", "x":13.5, "y":2.5, "w":1.5},
+
+ {"label":"Delete", "x":15.25, "y":2.5},
+ {"label":"End", "x":16.25, "y":2.5},
+ {"label":"PgDn", "x":17.25, "y":2.5},
+
+ {"label":"7", "x":18.5, "y":2.5},
+ {"label":"8", "x":19.5, "y":2.5},
+ {"label":"9", "x":20.5, "y":2.5},
+ {"label":"+", "x":21.5, "y":2.5, "h":2},
+
+ {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75},
+ {"label":"A", "x":1.75, "y":3.5},
+ {"label":"S", "x":2.75, "y":3.5},
+ {"label":"D", "x":3.75, "y":3.5},
+ {"label":"F", "x":4.75, "y":3.5},
+ {"label":"G", "x":5.75, "y":3.5},
+ {"label":"H", "x":6.75, "y":3.5},
+ {"label":"J", "x":7.75, "y":3.5},
+ {"label":"K", "x":8.75, "y":3.5},
+ {"label":"L", "x":9.75, "y":3.5},
+ {"label":":", "x":10.75, "y":3.5},
+ {"label":"\"", "x":11.75, "y":3.5},
+ {"label":"Enter", "x":12.75, "y":3.5, "w":2.25},
+
+ {"label":"4", "x":18.5, "y":3.5},
+ {"label":"5", "x":19.5, "y":3.5},
+ {"label":"6", "x":20.5, "y":3.5},
+
+ {"label":"Shift", "x":0, "y":4.5, "w":2.25},
+ {"label":"Z", "x":2.25, "y":4.5},
+ {"label":"X", "x":3.25, "y":4.5},
+ {"label":"C", "x":4.25, "y":4.5},
+ {"label":"V", "x":5.25, "y":4.5},
+ {"label":"B", "x":6.25, "y":4.5},
+ {"label":"N", "x":7.25, "y":4.5},
+ {"label":"M", "x":8.25, "y":4.5},
+ {"label":"<", "x":9.25, "y":4.5},
+ {"label":">", "x":10.25, "y":4.5},
+ {"label":"?", "x":11.25, "y":4.5},
+ {"label":"Shift", "x":12.25, "y":4.5, "w":2.75},
+
+ {"label":"\u2191", "x":16.25, "y":4.5},
+
+ {"label":"1", "x":18.5, "y":4.5},
+ {"label":"2", "x":19.5, "y":4.5},
+ {"label":"3", "x":20.5, "y":4.5},
+ {"label":"Enter", "x":21.5, "y":4.5, "h":2},
+
+ {"label":"Ctrl", "x":0, "y":5.5, "w":1.25},
+ {"label":"Win", "x":1.25, "y":5.5, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":5.5, "w":1.25},
+ {"x":3.75, "y":5.5, "w":6.25},
+ {"label":"Alt", "x":10, "y":5.5, "w":1.25},
+ {"label":"Win", "x":11.25, "y":5.5, "w":1.25},
+ {"label":"Menu", "x":12.5, "y":5.5, "w":1.25},
+ {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25},
+
+ {"label":"\u2190", "x":15.25, "y":5.5},
+ {"label":"\u2193", "x":16.25, "y":5.5},
+ {"label":"\u2192", "x":17.25, "y":5.5},
+
+ {"label":"0", "x":18.5, "y":5.5, "w":2},
+ {"label":".", "x":20.5, "y":5.5}
+ ]
+ },
+ "LAYOUT_fullsize_iso": {
+ "layout": [
+ {"label":"Esc", "x":0, "y":0},
+ {"label":"F1", "x":2, "y":0},
+ {"label":"F2", "x":3, "y":0},
+ {"label":"F3", "x":4, "y":0},
+ {"label":"F4", "x":5, "y":0},
+ {"label":"F5", "x":6.5, "y":0},
+ {"label":"F6", "x":7.5, "y":0},
+ {"label":"F7", "x":8.5, "y":0},
+ {"label":"F8", "x":9.5, "y":0},
+ {"label":"F9", "x":11, "y":0},
+ {"label":"F10", "x":12, "y":0},
+ {"label":"F11", "x":13, "y":0},
+ {"label":"F12", "x":14, "y":0},
+
+ {"label":"PrtSc", "x":15.25, "y":0},
+ {"label":"Scroll Lock", "x":16.25, "y":0},
+ {"label":"Pause", "x":17.25, "y":0},
+
+ {"label":"\u00ac", "x":0, "y":1.5},
+ {"label":"!", "x":1, "y":1.5},
+ {"label":"\"", "x":2, "y":1.5},
+ {"label":"\u00a3", "x":3, "y":1.5},
+ {"label":"$", "x":4, "y":1.5},
+ {"label":"%", "x":5, "y":1.5},
+ {"label":"^", "x":6, "y":1.5},
+ {"label":"&", "x":7, "y":1.5},
+ {"label":"*", "x":8, "y":1.5},
+ {"label":"(", "x":9, "y":1.5},
+ {"label":")", "x":10, "y":1.5},
+ {"label":"_", "x":11, "y":1.5},
+ {"label":"+", "x":12, "y":1.5},
+ {"label":"Backspace", "x":13, "y":1.5, "w":2},
+
+ {"label":"Insert", "x":15.25, "y":1.5},
+ {"label":"Home", "x":16.25, "y":1.5},
+ {"label":"PgUp", "x":17.25, "y":1.5},
+
+ {"label":"Num Lock", "x":18.5, "y":1.5},
+ {"label":"/", "x":19.5, "y":1.5},
+ {"label":"*", "x":20.5, "y":1.5},
+ {"label":"-", "x":21.5, "y":1.5},
+
+ {"label":"Tab", "x":0, "y":2.5, "w":1.5},
+ {"label":"Q", "x":1.5, "y":2.5},
+ {"label":"W", "x":2.5, "y":2.5},
+ {"label":"E", "x":3.5, "y":2.5},
+ {"label":"R", "x":4.5, "y":2.5},
+ {"label":"T", "x":5.5, "y":2.5},
+ {"label":"Y", "x":6.5, "y":2.5},
+ {"label":"U", "x":7.5, "y":2.5},
+ {"label":"I", "x":8.5, "y":2.5},
+ {"label":"O", "x":9.5, "y":2.5},
+ {"label":"P", "x":10.5, "y":2.5},
+ {"label":"{", "x":11.5, "y":2.5},
+ {"label":"}", "x":12.5, "y":2.5},
+
+ {"label":"Delete", "x":15.25, "y":2.5},
+ {"label":"End", "x":16.25, "y":2.5},
+ {"label":"PgDn", "x":17.25, "y":2.5},
+
+ {"label":"7", "x":18.5, "y":2.5},
+ {"label":"8", "x":19.5, "y":2.5},
+ {"label":"9", "x":20.5, "y":2.5},
+ {"label":"+", "x":21.5, "y":2.5, "h":2},
+
+ {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75},
+ {"label":"A", "x":1.75, "y":3.5},
+ {"label":"S", "x":2.75, "y":3.5},
+ {"label":"D", "x":3.75, "y":3.5},
+ {"label":"F", "x":4.75, "y":3.5},
+ {"label":"G", "x":5.75, "y":3.5},
+ {"label":"H", "x":6.75, "y":3.5},
+ {"label":"J", "x":7.75, "y":3.5},
+ {"label":"K", "x":8.75, "y":3.5},
+ {"label":"L", "x":9.75, "y":3.5},
+ {"label":":", "x":10.75, "y":3.5},
+ {"label":"@", "x":11.75, "y":3.5},
+ {"label":"~", "x":12.75, "y":3.5},
+ {"label":"Enter", "x":13.75, "y":2.5, "w":1.25, "h":2},
+
+ {"label":"4", "x":18.5, "y":3.5},
+ {"label":"5", "x":19.5, "y":3.5},
+ {"label":"6", "x":20.5, "y":3.5},
+
+ {"label":"Shift", "x":0, "y":4.5, "w":1.25},
+ {"label":"|", "x":1.25, "y":4.5},
+ {"label":"Z", "x":2.25, "y":4.5},
+ {"label":"X", "x":3.25, "y":4.5},
+ {"label":"C", "x":4.25, "y":4.5},
+ {"label":"V", "x":5.25, "y":4.5},
+ {"label":"B", "x":6.25, "y":4.5},
+ {"label":"N", "x":7.25, "y":4.5},
+ {"label":"M", "x":8.25, "y":4.5},
+ {"label":"<", "x":9.25, "y":4.5},
+ {"label":">", "x":10.25, "y":4.5},
+ {"label":"?", "x":11.25, "y":4.5},
+ {"label":"Shift", "x":12.25, "y":4.5, "w":2.75},
+
+ {"label":"\u2191", "x":16.25, "y":4.5},
+
+ {"label":"1", "x":18.5, "y":4.5},
+ {"label":"2", "x":19.5, "y":4.5},
+ {"label":"3", "x":20.5, "y":4.5},
+ {"label":"Enter", "x":21.5, "y":4.5, "h":2},
+
+ {"label":"Ctrl", "x":0, "y":5.5, "w":1.25},
+ {"label":"Win", "x":1.25, "y":5.5, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":5.5, "w":1.25},
+ {"x":3.75, "y":5.5, "w":6.25},
+ {"label":"AltGr", "x":10, "y":5.5, "w":1.25},
+ {"label":"Win", "x":11.25, "y":5.5, "w":1.25},
+ {"label":"Menu", "x":12.5, "y":5.5, "w":1.25},
+ {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25},
+
+ {"label":"\u2190", "x":15.25, "y":5.5},
+ {"label":"\u2193", "x":16.25, "y":5.5},
+ {"label":"\u2192", "x":17.25, "y":5.5},
+
+ {"label":"0", "x":18.5, "y":5.5, "w":2},
+ {"label":".", "x":20.5, "y":5.5}
+ ]
+ },
+ "LAYOUT_tkl_ansi": {
+ "layout": [
+ {"label":"Esc", "x":0, "y":0},
+ {"label":"F1", "x":2, "y":0},
+ {"label":"F2", "x":3, "y":0},
+ {"label":"F3", "x":4, "y":0},
+ {"label":"F4", "x":5, "y":0},
+ {"label":"F5", "x":6.5, "y":0},
+ {"label":"F6", "x":7.5, "y":0},
+ {"label":"F7", "x":8.5, "y":0},
+ {"label":"F8", "x":9.5, "y":0},
+ {"label":"F9", "x":11, "y":0},
+ {"label":"F10", "x":12, "y":0},
+ {"label":"F11", "x":13, "y":0},
+ {"label":"F12", "x":14, "y":0},
+
+ {"label":"PrtSc", "x":15.25, "y":0},
+ {"label":"Scroll Lock", "x":16.25, "y":0},
+ {"label":"Pause", "x":17.25, "y":0},
+
+ {"label":"~", "x":0, "y":1.5},
+ {"label":"1", "x":1, "y":1.5},
+ {"label":"2", "x":2, "y":1.5},
+ {"label":"3", "x":3, "y":1.5},
+ {"label":"4", "x":4, "y":1.5},
+ {"label":"5", "x":5, "y":1.5},
+ {"label":"6", "x":6, "y":1.5},
+ {"label":"7", "x":7, "y":1.5},
+ {"label":"8", "x":8, "y":1.5},
+ {"label":"9", "x":9, "y":1.5},
+ {"label":"0", "x":10, "y":1.5},
+ {"label":"_", "x":11, "y":1.5},
+ {"label":"+", "x":12, "y":1.5},
+ {"label":"Backspace", "x":13, "y":1.5, "w":2},
+
+ {"label":"Insert", "x":15.25, "y":1.5},
+ {"label":"Home", "x":16.25, "y":1.5},
+ {"label":"Page Up", "x":17.25, "y":1.5},
+
+ {"label":"Tab", "x":0, "y":2.5, "w":1.5},
+ {"label":"Q", "x":1.5, "y":2.5},
+ {"label":"W", "x":2.5, "y":2.5},
+ {"label":"E", "x":3.5, "y":2.5},
+ {"label":"R", "x":4.5, "y":2.5},
+ {"label":"T", "x":5.5, "y":2.5},
+ {"label":"Y", "x":6.5, "y":2.5},
+ {"label":"U", "x":7.5, "y":2.5},
+ {"label":"I", "x":8.5, "y":2.5},
+ {"label":"O", "x":9.5, "y":2.5},
+ {"label":"P", "x":10.5, "y":2.5},
+ {"label":"{", "x":11.5, "y":2.5},
+ {"label":"}", "x":12.5, "y":2.5},
+ {"label":"|", "x":13.5, "y":2.5, "w":1.5},
+
+ {"label":"Delete", "x":15.25, "y":2.5},
+ {"label":"End", "x":16.25, "y":2.5},
+ {"label":"PgDn", "x":17.25, "y":2.5},
+
+ {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75},
+ {"label":"A", "x":1.75, "y":3.5},
+ {"label":"S", "x":2.75, "y":3.5},
+ {"label":"D", "x":3.75, "y":3.5},
+ {"label":"F", "x":4.75, "y":3.5},
+ {"label":"G", "x":5.75, "y":3.5},
+ {"label":"H", "x":6.75, "y":3.5},
+ {"label":"J", "x":7.75, "y":3.5},
+ {"label":"K", "x":8.75, "y":3.5},
+ {"label":"L", "x":9.75, "y":3.5},
+ {"label":":", "x":10.75, "y":3.5},
+ {"label":"\"", "x":11.75, "y":3.5},
+ {"label":"Enter", "x":12.75, "y":3.5, "w":2.25},
+
+ {"label":"Shift", "x":0, "y":4.5, "w":2.25},
+ {"label":"Z", "x":2.25, "y":4.5},
+ {"label":"X", "x":3.25, "y":4.5},
+ {"label":"C", "x":4.25, "y":4.5},
+ {"label":"V", "x":5.25, "y":4.5},
+ {"label":"B", "x":6.25, "y":4.5},
+ {"label":"N", "x":7.25, "y":4.5},
+ {"label":"M", "x":8.25, "y":4.5},
+ {"label":"<", "x":9.25, "y":4.5},
+ {"label":">", "x":10.25, "y":4.5},
+ {"label":"?", "x":11.25, "y":4.5},
+ {"label":"Shift", "x":12.25, "y":4.5, "w":2.75},
+
+ {"label":"\u2191", "x":16.25, "y":4.5},
+
+ {"label":"Ctrl", "x":0, "y":5.5, "w":1.25},
+ {"label":"Win", "x":1.25, "y":5.5, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":5.5, "w":1.25},
+ {"x":3.75, "y":5.5, "w":6.25},
+ {"label":"Alt", "x":10, "y":5.5, "w":1.25},
+ {"label":"Win", "x":11.25, "y":5.5, "w":1.25},
+ {"label":"Menu", "x":12.5, "y":5.5, "w":1.25},
+ {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25},
+
+ {"label":"\u2190", "x":15.25, "y":5.5},
+ {"label":"\u2193", "x":16.25, "y":5.5},
+ {"label":"\u2192", "x":17.25, "y":5.5}
+ ]
+ },
+ "LAYOUT_tkl_iso": {
+ "layout": [
+ {"label":"Esc", "x":0, "y":0},
+ {"label":"F1", "x":2, "y":0},
+ {"label":"F2", "x":3, "y":0},
+ {"label":"F3", "x":4, "y":0},
+ {"label":"F4", "x":5, "y":0},
+ {"label":"F5", "x":6.5, "y":0},
+ {"label":"F6", "x":7.5, "y":0},
+ {"label":"F7", "x":8.5, "y":0},
+ {"label":"F8", "x":9.5, "y":0},
+ {"label":"F9", "x":11, "y":0},
+ {"label":"F10", "x":12, "y":0},
+ {"label":"F11", "x":13, "y":0},
+ {"label":"F12", "x":14, "y":0},
+
+ {"label":"PrtSc", "x":15.25, "y":0},
+ {"label":"Scroll Lock", "x":16.25, "y":0},
+ {"label":"Pause", "x":17.25, "y":0},
+
+ {"label":"\u00ac", "x":0, "y":1.5},
+ {"label":"!", "x":1, "y":1.5},
+ {"label":"\"", "x":2, "y":1.5},
+ {"label":"\u00a3", "x":3, "y":1.5},
+ {"label":"$", "x":4, "y":1.5},
+ {"label":"%", "x":5, "y":1.5},
+ {"label":"^", "x":6, "y":1.5},
+ {"label":"&", "x":7, "y":1.5},
+ {"label":"*", "x":8, "y":1.5},
+ {"label":"(", "x":9, "y":1.5},
+ {"label":")", "x":10, "y":1.5},
+ {"label":"_", "x":11, "y":1.5},
+ {"label":"+", "x":12, "y":1.5},
+ {"label":"Backspace", "x":13, "y":1.5, "w":2},
+
+ {"label":"Insert", "x":15.25, "y":1.5},
+ {"label":"Home", "x":16.25, "y":1.5},
+ {"label":"PgUp", "x":17.25, "y":1.5},
+
+ {"label":"Tab", "x":0, "y":2.5, "w":1.5},
+ {"label":"Q", "x":1.5, "y":2.5},
+ {"label":"W", "x":2.5, "y":2.5},
+ {"label":"E", "x":3.5, "y":2.5},
+ {"label":"R", "x":4.5, "y":2.5},
+ {"label":"T", "x":5.5, "y":2.5},
+ {"label":"Y", "x":6.5, "y":2.5},
+ {"label":"U", "x":7.5, "y":2.5},
+ {"label":"I", "x":8.5, "y":2.5},
+ {"label":"O", "x":9.5, "y":2.5},
+ {"label":"P", "x":10.5, "y":2.5},
+ {"label":"{", "x":11.5, "y":2.5},
+ {"label":"}", "x":12.5, "y":2.5},
+
+ {"label":"Delete", "x":15.25, "y":2.5},
+ {"label":"End", "x":16.25, "y":2.5},
+ {"label":"PgDn", "x":17.25, "y":2.5},
+
+ {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75},
+ {"label":"A", "x":1.75, "y":3.5},
+ {"label":"S", "x":2.75, "y":3.5},
+ {"label":"D", "x":3.75, "y":3.5},
+ {"label":"F", "x":4.75, "y":3.5},
+ {"label":"G", "x":5.75, "y":3.5},
+ {"label":"H", "x":6.75, "y":3.5},
+ {"label":"J", "x":7.75, "y":3.5},
+ {"label":"K", "x":8.75, "y":3.5},
+ {"label":"L", "x":9.75, "y":3.5},
+ {"label":":", "x":10.75, "y":3.5},
+ {"label":"@", "x":11.75, "y":3.5},
+ {"label":"~", "x":12.75, "y":3.5},
+ {"label":"Enter", "x":13.75, "y":2.5, "w":1.25, "h":2},
+
+ {"label":"Shift", "x":0, "y":4.5, "w":1.25},
+ {"label":"|", "x":1.25, "y":4.5},
+ {"label":"Z", "x":2.25, "y":4.5},
+ {"label":"X", "x":3.25, "y":4.5},
+ {"label":"C", "x":4.25, "y":4.5},
+ {"label":"V", "x":5.25, "y":4.5},
+ {"label":"B", "x":6.25, "y":4.5},
+ {"label":"N", "x":7.25, "y":4.5},
+ {"label":"M", "x":8.25, "y":4.5},
+ {"label":"<", "x":9.25, "y":4.5},
+ {"label":">", "x":10.25, "y":4.5},
+ {"label":"?", "x":11.25, "y":4.5},
+ {"label":"Shift", "x":12.25, "y":4.5, "w":2.75},
+
+ {"label":"\u2191", "x":16.25, "y":4.5},
+
+ {"label":"Ctrl", "x":0, "y":5.5, "w":1.25},
+ {"label":"Win", "x":1.25, "y":5.5, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":5.5, "w":1.25},
+ {"x":3.75, "y":5.5, "w":6.25},
+ {"label":"AltGr", "x":10, "y":5.5, "w":1.25},
+ {"label":"Win", "x":11.25, "y":5.5, "w":1.25},
+ {"label":"Menu", "x":12.5, "y":5.5, "w":1.25},
+ {"label":"Ctrl", "x":13.75, "y":5.5, "w":1.25},
+
+ {"label":"\u2190", "x":15.25, "y":5.5},
+ {"label":"\u2193", "x":16.25, "y":5.5},
+ {"label":"\u2192", "x":17.25, "y":5.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/maartenwut/wasdat_code/keymaps/default/keymap.c b/keyboards/maartenwut/wasdat_code/keymaps/default/keymap.c
new file mode 100644
index 00000000000..beee150b601
--- /dev/null
+++ b/keyboards/maartenwut/wasdat_code/keymaps/default/keymap.c
@@ -0,0 +1,53 @@
+/* Copyright 2019 Maarten Dekkers
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+ * │Esc│ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │PSc│Slk│Pse│
+ * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│ │Num│ / │ * │ - │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│ │ 7 │ 8 │ 9 │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ├───┼───┼───┤ + │
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │ │ 4 │ 5 │ 6 │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐ ├───┼───┼───┼───┤
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │ │ 1 │ 2 │ 3 │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤Ent│
+ * │Ctrl│GUI │Alt │ │ Alt│ GUI│Menu│Ctrl│ │ ← │ ↓ │ → │ │ 0 │ . │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
+ */
+ LAYOUT_fullsize_ansi(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+ ),
+ LAYOUT_fullsize_ansi(
+ RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_STEP, BL_TOGG, _______, _______, KC_MUTE,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_VOLU, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/maartenwut/wasdat_code/keymaps/default/readme.md b/keyboards/maartenwut/wasdat_code/keymaps/default/readme.md
new file mode 100644
index 00000000000..66cf593892c
--- /dev/null
+++ b/keyboards/maartenwut/wasdat_code/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default ANSI keymap for the Wasdat
diff --git a/keyboards/maartenwut/wasdat_code/keymaps/default_iso/keymap.c b/keyboards/maartenwut/wasdat_code/keymaps/default_iso/keymap.c
new file mode 100644
index 00000000000..8bdad483120
--- /dev/null
+++ b/keyboards/maartenwut/wasdat_code/keymaps/default_iso/keymap.c
@@ -0,0 +1,44 @@
+/* Copyright 2019 Maarten Dekkers
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+ * │Esc│ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │PSc│Slk│Pse│
+ * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│ │Num│ / │ * │ - │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ │ │Del│End│PgD│ │ 7 │ 8 │ 9 │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ Ent│ └───┴───┴───┘ ├───┼───┼───┤ + │
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ # │ │ │ 4 │ 5 │ 6 │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤ ┌───┐ ├───┼───┼───┼───┤
+ * │Shft│ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │ │ 1 │ 2 │ 3 │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤Ent│
+ * │Ctrl│GUI │Alt │ │AlGr│ GUI│Menu│Ctrl│ │ ← │ ↓ │ → │ │ 0 │ . │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘
+ */
+ LAYOUT_fullsize_iso(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+ )
+};
diff --git a/keyboards/maartenwut/wasdat_code/keymaps/default_iso/readme.md b/keyboards/maartenwut/wasdat_code/keymaps/default_iso/readme.md
new file mode 100644
index 00000000000..e36d7642016
--- /dev/null
+++ b/keyboards/maartenwut/wasdat_code/keymaps/default_iso/readme.md
@@ -0,0 +1 @@
+# The default ISO keymap for the Wasdat
diff --git a/keyboards/maartenwut/wasdat_code/keymaps/via/keymap.c b/keyboards/maartenwut/wasdat_code/keymaps/via/keymap.c
new file mode 100644
index 00000000000..c3155c1e724
--- /dev/null
+++ b/keyboards/maartenwut/wasdat_code/keymaps/via/keymap.c
@@ -0,0 +1,46 @@
+/* Copyright 2019 Maarten Dekkers
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT, KC_P4, KC_P5, KC_P6,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT
+ ),
+ [1] = LAYOUT_all(
+ RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, BL_STEP, BL_TOGG, _______, _______, KC_MUTE,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_MSTP, KC_VOLU, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_VOLD, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+ [2] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/maartenwut/wasdat_code/keymaps/via/rules.mk b/keyboards/maartenwut/wasdat_code/keymaps/via/rules.mk
new file mode 100644
index 00000000000..36b7ba9cbc9
--- /dev/null
+++ b/keyboards/maartenwut/wasdat_code/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/maartenwut/wasdat_code/matrix.c b/keyboards/maartenwut/wasdat_code/matrix.c
new file mode 100644
index 00000000000..7844db7ab74
--- /dev/null
+++ b/keyboards/maartenwut/wasdat_code/matrix.c
@@ -0,0 +1,369 @@
+/*
+Copyright 2012-2018 Jun Wako, Jack Humbert, Yiancar
+
+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 .
+*/
+#include
+#include
+#include "wait.h"
+#include "util.h"
+#include "matrix.h"
+#include "debounce.h"
+#include "quantum.h"
+
+#ifdef DIRECT_PINS
+static pin_t direct_pins[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS;
+#elif (DIODE_DIRECTION == ROW2COL) || (DIODE_DIRECTION == COL2ROW)
+static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
+//static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
+#endif
+
+// matrix code
+
+#ifdef DIRECT_PINS
+
+static void init_pins(void) {
+ for (int row = 0; row < MATRIX_ROWS; row++) {
+ for (int col = 0; col < MATRIX_COLS; col++) {
+ pin_t pin = direct_pins[row][col];
+ if (pin != NO_PIN) {
+ setPinInputHigh(pin);
+ }
+ }
+ }
+}
+
+static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) {
+ matrix_row_t last_row_value = current_matrix[current_row];
+ current_matrix[current_row] = 0;
+
+ for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
+ pin_t pin = direct_pins[current_row][col_index];
+ if (pin != NO_PIN) {
+ current_matrix[current_row] |= readPin(pin) ? 0 : (MATRIX_ROW_SHIFTER << col_index);
+ }
+ }
+
+ return (last_row_value != current_matrix[current_row]);
+}
+
+#elif (DIODE_DIRECTION == COL2ROW)
+
+static void select_row(uint8_t row) {
+ setPinOutput(row_pins[row]);
+ writePinLow(row_pins[row]);
+}
+
+static void unselect_row(uint8_t row) { setPinInputHigh(row_pins[row]); }
+
+static void unselect_rows(void) {
+ for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
+ setPinInputHigh(row_pins[x]);
+ }
+}
+
+static void init_pins(void) {
+ unselect_rows();
+ for (uint8_t x = 0; x < MATRIX_COLS; x++) {
+ setPinInputHigh(col_pins[x]);
+ }
+}
+
+static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) {
+ // Store last value of row prior to reading
+ matrix_row_t last_row_value = current_matrix[current_row];
+
+ // Clear data in matrix row
+ current_matrix[current_row] = 0;
+
+ // Select row and wait for row selecton to stabilize
+ select_row(current_row);
+ wait_us(30);
+
+ // For each col...
+ for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
+
+ // Select the col pin to read (active low)
+ uint8_t pin_state = readPin(col_pins[col_index]);
+
+ // Populate the matrix row with the state of the col pin
+ current_matrix[current_row] |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index);
+ }
+
+ // Unselect row
+ unselect_row(current_row);
+
+ return (last_row_value != current_matrix[current_row]);
+}
+
+#elif (DIODE_DIRECTION == ROW2COL)
+
+/* Cols 0 - 15
+ * col 0: F7
+ * col 1: F5
+ * col 2: F6
+ * col 3: F1
+ * col 4: F4
+ * col 5: F0
+ * These columns use a 74HC237D 3 to 8 bit demultiplexer. D4 is the enable pin, must be set high to use it.
+ * A0 A1 A2
+ * col / pin: PD2 PD1 PD0
+ * 6: 1 1 1
+ * col 7: D3
+ * col 8: B7
+ * 9: 0 1 1
+ * 10: 1 0 1
+ * 11: 0 0 1
+ * 12: 1 1 0
+ * 13: 0 1 0
+ * 14: 1 0 0
+ * 15: 0 0 0
+ */
+static void select_col(uint8_t col) {
+ switch (col) {
+ case 0:
+ writePinLow(F7);
+ break;
+ case 1:
+ writePinLow(F5);
+ break;
+ case 2:
+ writePinLow(F6);
+ break;
+ case 3:
+ writePinLow(F1);
+ break;
+ case 4:
+ writePinLow(F4);
+ break;
+ case 5:
+ writePinLow(F0);
+ break;
+ case 6:
+ writePinHigh(D4);
+ writePinHigh(D2);
+ writePinHigh(D1);
+ writePinHigh(D0);
+ break;
+ case 7:
+ writePinLow(D5);
+ break;
+ case 8:
+ writePinLow(D3);
+ break;
+ case 9:
+ writePinHigh(D4);
+ writePinHigh(D1);
+ writePinHigh(D0);
+ break;
+ case 10:
+ writePinHigh(D4);
+ writePinHigh(D2);
+ writePinHigh(D0);
+ break;
+ case 11:
+ writePinHigh(D4);
+ writePinHigh(D0);
+ break;
+ case 12:
+ writePinHigh(D4);
+ writePinHigh(D2);
+ writePinHigh(D1);
+ break;
+ case 13:
+ writePinHigh(D4);
+ writePinHigh(D1);
+ break;
+ case 14:
+ writePinHigh(D4);
+ writePinHigh(D2);
+ break;
+ case 15:
+ writePinHigh(D4);
+ break;
+ }
+}
+
+static void unselect_col(uint8_t col) {
+ switch (col) {
+ case 0:
+ writePinHigh(F7);
+ break;
+ case 1:
+ writePinHigh(F5);
+ break;
+ case 2:
+ writePinHigh(F6);
+ break;
+ case 3:
+ writePinHigh(F1);
+ break;
+ case 4:
+ writePinHigh(F4);
+ break;
+ case 5:
+ writePinHigh(F0);
+ break;
+ case 6:
+ writePinLow(D4);
+ writePinLow(D2);
+ writePinLow(D1);
+ writePinLow(D0);
+ break;
+ case 7:
+ writePinHigh(D5);
+ break;
+ case 8:
+ writePinHigh(D3);
+ break;
+ case 9:
+ writePinLow(D4);
+ writePinLow(D2);
+ writePinLow(D1);
+ writePinLow(D0);
+ break;
+ case 10:
+ writePinLow(D4);
+ writePinLow(D2);
+ writePinLow(D1);
+ writePinLow(D0);
+ break;
+ case 11:
+ writePinLow(D4);
+ writePinLow(D2);
+ writePinLow(D1);
+ writePinLow(D0);
+ break;
+ case 12:
+ writePinLow(D4);
+ writePinLow(D2);
+ writePinLow(D1);
+ writePinLow(D0);
+ break;
+ case 13:
+ writePinLow(D4);
+ writePinLow(D2);
+ writePinLow(D1);
+ writePinLow(D0);
+ break;
+ case 14:
+ writePinLow(D4);
+ writePinLow(D2);
+ writePinLow(D1);
+ writePinLow(D0);
+ break;
+ case 15:
+ writePinLow(D4);
+ writePinLow(D2);
+ writePinLow(D1);
+ writePinLow(D0);
+ break;
+ }
+}
+
+static void unselect_cols(void) {
+ //Native
+ writePinHigh(F7);
+ writePinHigh(F5);
+ writePinHigh(F6);
+ writePinHigh(F1);
+ writePinHigh(F4);
+ writePinHigh(F0);
+ writePinHigh(D3);
+ writePinHigh(D5);
+
+ //Demultiplexer
+ writePinLow(D4);
+ writePinLow(D2);
+ writePinLow(D1);
+ writePinLow(D0);
+}
+
+static void init_pins(void) {
+ unselect_cols();
+ for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
+ setPinInputHigh(row_pins[x]);
+ }
+ setPinOutput(D0);
+ setPinOutput(D1);
+ setPinOutput(D2);
+ setPinOutput(D3);
+ setPinOutput(F7);
+ setPinOutput(F5);
+ setPinOutput(F6);
+ setPinOutput(F1);
+ setPinOutput(F4);
+ setPinOutput(F0);
+ setPinOutput(D3);
+ setPinOutput(D5);
+ setPinOutput(D4);
+}
+
+static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) {
+ bool matrix_changed = false;
+
+ // Select col and wait for col selecton to stabilize
+ select_col(current_col);
+ wait_us(30);
+
+ // For each row...
+ for (uint8_t row_index = 0; row_index < MATRIX_ROWS; row_index++) {
+ // Store last value of row prior to reading
+ matrix_row_t last_row_value = current_matrix[row_index];
+
+ // Check row pin state
+ if (readPin(row_pins[row_index]) == 0) {
+ // Pin LO, set col bit
+ current_matrix[row_index] |= (MATRIX_ROW_SHIFTER << current_col);
+ } else {
+ // Pin HI, clear col bit
+ current_matrix[row_index] &= ~(MATRIX_ROW_SHIFTER << current_col);
+ }
+
+ // Determine if the matrix changed state
+ if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) {
+ matrix_changed = true;
+ }
+ }
+
+ // Unselect col
+ unselect_col(current_col);
+
+ return matrix_changed;
+}
+
+#endif
+
+void matrix_init_custom(void) {
+ // initialize key pins
+ init_pins();
+}
+
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
+ bool changed = false;
+
+#if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW)
+ // Set row, read cols
+ for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) {
+ changed |= read_cols_on_row(current_matrix, current_row);
+ }
+#elif (DIODE_DIRECTION == ROW2COL)
+ // Set col, read rows
+ for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
+ changed |= read_rows_on_col(current_matrix, current_col);
+ }
+#endif
+
+ return changed;
+}
diff --git a/keyboards/maartenwut/wasdat_code/readme.md b/keyboards/maartenwut/wasdat_code/readme.md
new file mode 100644
index 00000000000..403fabc684b
--- /dev/null
+++ b/keyboards/maartenwut/wasdat_code/readme.md
@@ -0,0 +1,19 @@
+# Wasdat Code
+
+A drop-in replacement controller for the WASD CODE TKL and fullsize models.
+
+* Keyboard Maintainer: [Maartenwut](https://github.com/Maartenwut)
+* Hardware Supported: WASD CODE TKL/Fullsize ANSI & ISO with Wasdat Code controller
+* Hardware Availability: [maartenwut.com](https://maartenwut.com/product/wasdat-code/)
+
+## Flashing
+
+The WASD has no reset button, so to put the controller in flashing mode, simply unplug the USB cable and plug it back in while holding the ESC key on the keyboard.
+
+---
+
+Make example for this keyboard (after setting up your build environment):
+
+ make maartenwut/wasdat_code:default
+
+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).
diff --git a/keyboards/maartenwut/wasdat_code/rules.mk b/keyboards/maartenwut/wasdat_code/rules.mk
new file mode 100644
index 00000000000..642f8dc5144
--- /dev/null
+++ b/keyboards/maartenwut/wasdat_code/rules.mk
@@ -0,0 +1,37 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = qmk-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+
+CUSTOM_MATRIX = lite
+SRC += matrix.c
+
+LAYOUTS = fullsize_ansi fullsize_iso tkl_ansi tkl_iso
diff --git a/keyboards/maartenwut/wasdat_code/wasdat_code.c b/keyboards/maartenwut/wasdat_code/wasdat_code.c
new file mode 100644
index 00000000000..044439fb518
--- /dev/null
+++ b/keyboards/maartenwut/wasdat_code/wasdat_code.c
@@ -0,0 +1,47 @@
+/* Copyright 2019 Maarten Dekkers
+ *
+ * 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 .
+ */
+#include "wasdat_code.h"
+
+// Optional override functions below.
+// You can leave any or all of these undefined.
+// These are only required if you want to perform custom actions.
+
+void matrix_init_kb(void) {
+ // put your keyboard start-up code here
+ // runs once when the firmware starts up
+
+ matrix_init_user();
+ led_init_ports();
+}
+
+void led_init_ports(void) {
+ setPinOutput(B1);
+ setPinOutput(B2);
+ setPinOutput(B3);
+ writePinHigh(B1);
+ writePinHigh(B2);
+ writePinHigh(B3);
+}
+
+bool led_update_kb(led_t led_state) {
+ if(led_update_user(led_state)) {
+ writePin(B1, !led_state.caps_lock);
+ writePin(B2, !led_state.scroll_lock);
+ writePin(B3, !led_state.num_lock);
+ }
+
+ return true;
+}
diff --git a/keyboards/maartenwut/wasdat_code/wasdat_code.h b/keyboards/maartenwut/wasdat_code/wasdat_code.h
new file mode 100644
index 00000000000..5b3ed20913a
--- /dev/null
+++ b/keyboards/maartenwut/wasdat_code/wasdat_code.h
@@ -0,0 +1,107 @@
+/* Copyright 2019 Maarten Dekkers
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "quantum.h"
+
+#define XXX KC_NO
+
+/* 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_all LAYOUT_fullsize_iso
+
+#define LAYOUT_fullsize_ansi( \
+ k05, k64, k62, k22, k02, k31, k0c, k2f, k6f, k6b, k3b, k0b, k5b, k33, k43, k41, \
+ k65, k35, k34, k32, k30, k60, k6a, k3a, k3c, k3f, k3d, k6d, k6c, k2b, k67, k6e, k66, k78, k77, k76, k56, \
+ k25, k45, k44, k42, k40, k20, k2a, k4a, k4c, k4f, k4d, k2d, k2c, k1b, k68, k3e, k36, k48, k47, k46, k4e, \
+ k24, k15, k14, k12, k10, k00, k0a, k1a, k1c, k1f, k1d, k0d, k7b, k28, k27, k26, \
+ k29, k75, k74, k72, k70, k50, k5a, k7a, k7c, k7f, k5d, k19, k0e, k18, k17, k16, k1e, \
+ k61, k21, k03, k08, k53, k11, k23, k71, k5e, k58, k57, k07, k06 \
+) \
+{ \
+ { k00, XXX, k02, k03, XXX, k05, k06, k07, k08, XXX, k0a, k0b, k0c, k0d, k0e, XXX }, \
+ { k10, k11, k12, XXX, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, XXX, k2f }, \
+ { k30, k31, k32, k33, k34, k35, k36, XXX, XXX, XXX, k3a, k3b, k3c, k3d, k3e, k3f }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, XXX, k4a, XXX, k4c, k4d, k4e, k4f }, \
+ { k50, XXX, XXX, k53, XXX, XXX, k56, k57, k58, XXX, k5a, k5b, XXX, k5d, k5e, XXX }, \
+ { k60, k61, k62, XXX, k64, k65, k66, k67, k68, XXX, k6a, k6b, k6c, k6d, k6e, k6f }, \
+ { k70, k71, k72, XXX, k74, k75, k76, k77, k78, XXX, k7a, k7b, k7c, XXX, XXX, k7f } \
+}
+
+#define LAYOUT_fullsize_iso( \
+ k05, k64, k62, k22, k02, k31, k0c, k2f, k6f, k6b, k3b, k0b, k5b, k33, k43, k41, \
+ k65, k35, k34, k32, k30, k60, k6a, k3a, k3c, k3f, k3d, k6d, k6c, k2b, k67, k6e, k66, k78, k77, k76, k56, \
+ k25, k45, k44, k42, k40, k20, k2a, k4a, k4c, k4f, k4d, k2d, k2c, k68, k3e, k36, k48, k47, k46, k4e, \
+ k24, k15, k14, k12, k10, k00, k0a, k1a, k1c, k1f, k1d, k0d, k1b, k7b, k28, k27, k26, \
+ k29, k04, k75, k74, k72, k70, k50, k5a, k7a, k7c, k7f, k5d, k19, k0e, k18, k17, k16, k1e, \
+ k61, k21, k03, k08, k53, k11, k23, k71, k5e, k58, k57, k07, k06 \
+) \
+{ \
+ { k00, XXX, k02, k03, k04, k05, k06, k07, k08, XXX, k0a, k0b, k0c, k0d, k0e, XXX }, \
+ { k10, k11, k12, XXX, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, XXX, k2f }, \
+ { k30, k31, k32, k33, k34, k35, k36, XXX, XXX, XXX, k3a, k3b, k3c, k3d, k3e, k3f }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, XXX, k4a, XXX, k4c, k4d, k4e, k4f }, \
+ { k50, XXX, XXX, k53, XXX, XXX, k56, k57, k58, XXX, k5a, k5b, XXX, k5d, k5e, XXX }, \
+ { k60, k61, k62, XXX, k64, k65, k66, k67, k68, XXX, k6a, k6b, k6c, k6d, k6e, k6f }, \
+ { k70, k71, k72, XXX, k74, k75, k76, k77, k78, XXX, k7a, k7b, k7c, XXX, XXX, k7f } \
+}
+
+#define LAYOUT_tkl_ansi( \
+ k05, k64, k62, k22, k02, k31, k0c, k2f, k6f, k6b, k3b, k0b, k5b, k33, k43, k41, \
+ k65, k35, k34, k32, k30, k60, k6a, k3a, k3c, k3f, k3d, k6d, k6c, k2b, k67, k6e, k66, \
+ k25, k45, k44, k42, k40, k20, k2a, k4a, k4c, k4f, k4d, k2d, k2c, k1b, k68, k3e, k36, \
+ k24, k15, k14, k12, k10, k00, k0a, k1a, k1c, k1f, k1d, k0d, k7b, \
+ k29, k75, k74, k72, k70, k50, k5a, k7a, k7c, k7f, k5d, k19, k0e, \
+ k61, k21, k03, k08, k53, k11, k23, k71, k5e, k58, k57 \
+) \
+{ \
+ { k00, XXX, k02, k03, XXX, k05, XXX, XXX, k08, XXX, k0a, k0b, k0c, k0d, k0e, XXX }, \
+ { k10, k11, k12, XXX, k14, k15, XXX, XXX, XXX, k19, k1a, k1b, k1c, k1d, XXX, k1f }, \
+ { k20, k21, k22, k23, k24, k25, XXX, XXX, XXX, k29, k2a, k2b, k2c, k2d, XXX, k2f }, \
+ { k30, k31, k32, k33, k34, k35, k36, XXX, XXX, XXX, k3a, k3b, k3c, k3d, k3e, k3f }, \
+ { k40, k41, k42, k43, k44, k45, XXX, XXX, XXX, XXX, k4a, XXX, k4c, k4d, XXX, k4f }, \
+ { k50, XXX, XXX, k53, XXX, XXX, XXX, k57, k58, XXX, k5a, k5b, XXX, k5d, k5e, XXX }, \
+ { k60, k61, k62, XXX, k64, k65, k66, k67, k68, XXX, k6a, k6b, k6c, k6d, k6e, k6f }, \
+ { k70, k71, k72, XXX, k74, k75, XXX, XXX, XXX, XXX, k7a, k7b, k7c, XXX, XXX, k7f } \
+}
+
+#define LAYOUT_tkl_iso( \
+ k05, k64, k62, k22, k02, k31, k0c, k2f, k6f, k6b, k3b, k0b, k5b, k33, k43, k41, \
+ k65, k35, k34, k32, k30, k60, k6a, k3a, k3c, k3f, k3d, k6d, k6c, k2b, k67, k6e, k66, \
+ k25, k45, k44, k42, k40, k20, k2a, k4a, k4c, k4f, k4d, k2d, k2c, k68, k3e, k36, \
+ k24, k15, k14, k12, k10, k00, k0a, k1a, k1c, k1f, k1d, k0d, k1b, k7b, \
+ k29, k04, k75, k74, k72, k70, k50, k5a, k7a, k7c, k7f, k5d, k19, k0e, \
+ k61, k21, k03, k08, k53, k11, k23, k71, k5e, k58, k57 \
+) \
+{ \
+ { k00, XXX, k02, k03, k04, k05, XXX, XXX, k08, XXX, k0a, k0b, k0c, k0d, k0e, XXX }, \
+ { k10, k11, k12, XXX, k14, k15, XXX, XXX, XXX, k19, k1a, k1b, k1c, k1d, XXX, k1f }, \
+ { k20, k21, k22, k23, k24, k25, XXX, XXX, XXX, k29, k2a, k2b, k2c, k2d, XXX, k2f }, \
+ { k30, k31, k32, k33, k34, k35, k36, XXX, XXX, XXX, k3a, k3b, k3c, k3d, k3e, k3f }, \
+ { k40, k41, k42, k43, k44, k45, XXX, XXX, XXX, XXX, k4a, XXX, k4c, k4d, XXX, k4f }, \
+ { k50, XXX, XXX, k53, XXX, XXX, XXX, k57, k58, XXX, k5a, k5b, XXX, k5d, k5e, XXX }, \
+ { k60, k61, k62, XXX, k64, k65, k66, k67, k68, XXX, k6a, k6b, k6c, k6d, k6e, k6f }, \
+ { k70, k71, k72, XXX, k74, k75, XXX, XXX, XXX, XXX, k7a, k7b, k7c, XXX, XXX, k7f } \
+}
diff --git a/keyboards/maartenwut/wonderland/config.h b/keyboards/maartenwut/wonderland/config.h
index 4da601257a8..a61d78c42b1 100755
--- a/keyboards/maartenwut/wonderland/config.h
+++ b/keyboards/maartenwut/wonderland/config.h
@@ -20,7 +20,7 @@ along with this program. If not, see .
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
+#define VENDOR_ID 0x4705
#define PRODUCT_ID 0xA71C
#define DEVICE_VER 0x0003
#define MANUFACTURER Maartenwut
diff --git a/keyboards/maartenwut/wonderland/keymaps/via/keymap.c b/keyboards/maartenwut/wonderland/keymaps/via/keymap.c
new file mode 100644
index 00000000000..85fde41a25c
--- /dev/null
+++ b/keyboards/maartenwut/wonderland/keymaps/via/keymap.c
@@ -0,0 +1,33 @@
+#include QMK_KEYBOARD_H
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_DEL, KC_BSPC,
+ KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_PGDN, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
+ KC_LCTL, KC_LAPO, KC_BSPC, KC_LGUI, KC_SPC, KC_RAPC, KC_RCTL
+ ),
+ [1] = LAYOUT(
+ RGB_TOG, VLK_TOG, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NO, RESET,
+ RGB_MOD, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ RGB_RMOD, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_UP, KC_NO,
+ _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RGHT, _______,
+ _______, KC_LALT, _______, _______, _______, KC_RALT, _______
+ ),
+ [2] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______
+ ),
+ [3] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/maartenwut/wonderland/keymaps/via/rules.mk b/keyboards/maartenwut/wonderland/keymaps/via/rules.mk
new file mode 100644
index 00000000000..36b7ba9cbc9
--- /dev/null
+++ b/keyboards/maartenwut/wonderland/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/maartenwut/wonderland/rules.mk b/keyboards/maartenwut/wonderland/rules.mk
index a01e466b891..3a7e92f4db3 100755
--- a/keyboards/maartenwut/wonderland/rules.mk
+++ b/keyboards/maartenwut/wonderland/rules.mk
@@ -19,7 +19,7 @@ MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = yes # Commands for debug and configuration
-NKRO_ENABLE = no # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
@@ -28,3 +28,4 @@ UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
AUTO_SHIFT_ENABLE = no
VELOCIKEY_ENABLE = yes
+
diff --git a/keyboards/massdrop/alt/keymaps/emptyflask/README.md b/keyboards/massdrop/alt/keymaps/emptyflask/README.md
new file mode 100644
index 00000000000..b07693ebac6
--- /dev/null
+++ b/keyboards/massdrop/alt/keymaps/emptyflask/README.md
@@ -0,0 +1,14 @@
+### Drop (Massdrop) ALT Layout
+
+This layout is for the [Drop ALT Keyboard](https://drop.com/buy/massdrop-alt-high-profile-mechanical-keyboard).
+
+Features:
+
+* Tap caps lock for ESC, hold for CTRL
+* Prefer grave/tilde to dedicated ESC key
+* Swap home and delete. It's more compatible with my keycaps, and closer to a traditional layout.
+* Numpad layer (FN-\ to enable)
+* Method for clearing all stuck-down mods (taken from favorable-mutation, for tapped modifiers)
+
+To do:
+* Customize RGB: solid colors by default, highlight numpad keys when using that layer.
diff --git a/keyboards/massdrop/alt/keymaps/emptyflask/config.h b/keyboards/massdrop/alt/keymaps/emptyflask/config.h
new file mode 100644
index 00000000000..b3152c42095
--- /dev/null
+++ b/keyboards/massdrop/alt/keymaps/emptyflask/config.h
@@ -0,0 +1,3 @@
+#pragma once
+
+#define ONESHOT_TIMEOUT 3000
diff --git a/keyboards/massdrop/alt/keymaps/emptyflask/keymap.c b/keyboards/massdrop/alt/keymaps/emptyflask/keymap.c
new file mode 100644
index 00000000000..6ef6e2aa5ed
--- /dev/null
+++ b/keyboards/massdrop/alt/keymaps/emptyflask/keymap.c
@@ -0,0 +1,292 @@
+#include QMK_KEYBOARD_H
+
+enum my_keycodes {
+ U_T_AUTO = SAFE_RANGE, // USB Extra Port Toggle Auto Detect / Always Active
+ U_T_AGCR, // USB Toggle Automatic GCR control
+ DBG_TOG, // DEBUG Toggle On / Off
+ DBG_MTRX, // DEBUG Toggle Matrix Prints
+ DBG_KBD, // DEBUG Toggle Keyboard Prints
+ DBG_MOU, // DEBUG Toggle Mouse Prints
+ MD_BOOT, // Restart into bootloader after hold timeout
+ HK_COSL, // Clear held-down keys
+ QWERTY, // Switch to QWERTY layout
+ COLEMAK, // Switch to Colemak layout
+ DVORAK, // Switch to Dvorak layout
+ WORKMAN, // Switch to Workman layout
+};
+
+enum my_layers {
+ _QWERTY = 0,
+ _COLEMAK,
+ _DVORAK,
+ _WORKMAN,
+ _FUNCTION,
+ _NUMPAD,
+ _LAYOUTS,
+};
+
+#define CTL_ESC LCTL_T(KC_ESC) // Tap for ESC, hold for CTRL
+#define MD_LOCK LCTL(LGUI(KC_Q)) // MacOS lock screen shortcut
+#define MO_FUNC MO(_FUNCTION) // Hold for function layer
+#define TG_NUMP TG(_NUMPAD) // Toggle numpad layer
+#define OSL_LAY OSL(_LAYOUTS) // One-shot layer to change layout
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* QWERTY
+ * ┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬────────────┬───────┐
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ BackSpace │ Home │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├───────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬─────────┼───────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ Del │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├──────────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─────────┼───────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ Ctrl/Esc │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Return │ PgUp │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────────────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴───────┬───────┼───────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ Up │ PgDn │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────────┬─────┴───┬───┴─────┬─┴───────┴───────┴───────┴───────┴───────┴─────┬─┴───────┼───────┴─┬──┬───────┼───────┼───────┤
+ * │ │ │ │ │ │ │▒▒│ │ │ │
+ * │ Ctrl │ GUI │ Alt │ Space │ Alt │ Func │▒▒│ Left │ Down │ Right │
+ * │ │ │ │ │ │ │▒▒│ │ │ │
+ * └─────────┴─────────┴─────────┴───────────────────────────────────────────────┴─────────┴─────────┴──┴───────┴───────┴───────┘
+ */
+ [_QWERTY] = LAYOUT_65_ansi_blocker(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+ CTL_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO_FUNC, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [_COLEMAK] = LAYOUT_65_ansi_blocker(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+ CTL_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO_FUNC, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [_DVORAK] = LAYOUT_65_ansi_blocker(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, KC_HOME,
+ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, KC_DEL,
+ CTL_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO_FUNC, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [_WORKMAN] = LAYOUT_65_ansi_blocker(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_SCLN, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+ CTL_ESC, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, KC_QUOT, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_Z, KC_X, KC_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO_FUNC, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ /* Function layer
+ * ┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬────────────┬───────┐
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ Esc │ F1 │ F2 │ F3 │ F4 │ F5 │ F6 │ F7 │ F8 │ F9 │ F10 │ F11 │ F12 │ Del │ End │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├───────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬─────────┼───────┤
+ * │ │ RGB │ RGB │ RGB │ RGB │ RGB │ │ USB │ USB │ │ │ │ │ │ │
+ * │ │ Speed │ Val │ Speed │ Hue │ Sat │ │ Port │ GCR │ │ PrtSc │ ScrLk │ Pause │ NumPad │ Mute │
+ * │ │ - │ + │ + │ + │ + │ │ │ │ │ │ │ │ │ │
+ * ├──────────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─────────┼───────┤
+ * │ │ RGB │ RGB │ RGB │ RGB │ RGB │ │ │ │ (Mac) │ │ │ │ │
+ * │ CapsLock │ Mode │ Val │ Mode │ Hue │ Sat │ │ │ │ Lock │ │ │ │ Vol+ │
+ * │ │ - │ - │ + │ - │ - │ │ │ │ │ │ │ │ │
+ * ├────────────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴───────┬───────┼───────┤
+ * │ │ RGB │ │ │ │ │ 6KRO/ │ │ │ │ │ │ │ │
+ * │ │ On/Off│ │ │ │Restart│ NKRO │ Debug │ │ │ Layout│ │ PgUp │ Vol- │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────────┬─────┴───┬───┴─────┬─┴───────┴───────┴───────┴───────┴───────┴─────┬─┴───────┼───────┴─┬──┬───────┼───────┼───────┤
+ * │ │ │ │ │ │ │▒▒│ │ │ │
+ * │ │ │ │ Clear modifiers │ │ │▒▒│ Home │ PgDn │ End │
+ * │ │ │ │ │ │ │▒▒│ │ │ │
+ * └─────────┴─────────┴─────────┴───────────────────────────────────────────────┴─────────┴─────────┴──┴───────┴───────┴───────┘
+ */
+ [_FUNCTION] = LAYOUT_65_ansi_blocker(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_END,
+ _______, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, _______, U_T_AUTO,U_T_AGCR,_______, KC_PSCR, KC_SLCK, KC_PAUS, TG_NUMP, KC_MUTE,
+ KC_CAPS, RGB_RMOD,RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, _______, _______, _______, MD_LOCK, _______, _______, _______, KC_VOLU,
+ _______, RGB_TOG, _______, _______, _______, MD_BOOT, NK_TOGG, DBG_TOG, _______, _______, OSL_LAY, _______, KC_PGUP, KC_VOLD,
+ _______, _______, _______, HK_COSL, _______, _______, KC_HOME, KC_PGDN, KC_END
+ ),
+
+ /* Number pad (FN-\ to toggle)
+ * ┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬────────────┬───────┐
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │ / │ * │ - │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├───────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬─────────┼───────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ 7 │ 8 │ 9 │ + │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├──────────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─────────┼───────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ 4 │ 5 │ 6 │ + │ │ │ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────────────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴───────┬───────┼───────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ 1 │ 2 │ 3 │ = │ │ │ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────────┬─────┴───┬───┴─────┬─┴───────┴───────┴───────┴───────┴───────┴─────┬─┴───────┼───────┴─┬──┬───────┼───────┼───────┤
+ * │ │ │ │ │ │ │▒▒│ │ │ │
+ * │ │ │ │ 0 │ . │ │▒▒│ │ │ │
+ * │ │ │ │ │ │ │▒▒│ │ │ │
+ * └─────────┴─────────┴─────────┴───────────────────────────────────────────────┴─────────┴─────────┴──┴───────┴───────┴───────┘
+ */
+ [_NUMPAD] = LAYOUT_65_ansi_blocker(
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PSLS, KC_PAST, KC_PMNS, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, KC_PPLS, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, KC_PPLS, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PEQL, _______, _______, _______,
+ _______, _______, _______, KC_P0, KC_PDOT, _______, _______, _______, _______
+ ),
+
+ /* Alternate layouts (FN-/ then one of [Q,C,D,W]) */
+ [_LAYOUTS] = LAYOUT_65_ansi_blocker(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, QWERTY, WORKMAN, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, DVORAK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, COLEMAK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ /* Template
+ * ┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬────────────┬───────┐
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├───────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬─────────┼───────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├──────────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─┬─────┴─────────┼───────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────────────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴──┬────┴───────┬───────┼───────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────────┬─────┴───┬───┴─────┬─┴───────┴───────┴───────┴───────┴───────┴─────┬─┴───────┼───────┴─┬──┬───────┼───────┼───────┤
+ * │ │ │ │ │ │ │▒▒│ │ │ │
+ * │ │ │ │ │ │ │▒▒│ │ │ │
+ * │ │ │ │ │ │ │▒▒│ │ │ │
+ * └─────────┴─────────┴─────────┴───────────────────────────────────────────────┴─────────┴─────────┴──┴───────┴───────┴───────┘
+ [X] = LAYOUT_65_ansi_blocker(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+ */
+};
+
+#define MODS_SHIFT (get_mods() & MOD_MASK_SHIFT)
+#define MODS_CTRL (get_mods() & MOD_MASK_CTRL)
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ static uint32_t key_timer;
+
+ switch (keycode) {
+ case QWERTY:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_QWERTY);
+ }
+ return true;
+ case COLEMAK:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_COLEMAK);
+ }
+ return true;
+ case DVORAK:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_DVORAK);
+ }
+ return true;
+ case WORKMAN:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_WORKMAN);
+ }
+ return true;
+ case HK_COSL:
+ clear_keyboard();
+ reset_oneshot_layer();
+ return true;
+ case U_T_AUTO:
+ if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
+ TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode");
+ }
+ return false;
+ case U_T_AGCR:
+ if (record->event.pressed && MODS_SHIFT && MODS_CTRL) {
+ TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode");
+ }
+ return false;
+ case DBG_TOG:
+ if (record->event.pressed) {
+ TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode");
+ }
+ return false;
+ case DBG_MTRX:
+ if (record->event.pressed) {
+ TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix");
+ }
+ return false;
+ case DBG_KBD:
+ if (record->event.pressed) {
+ TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard");
+ }
+ return false;
+ case DBG_MOU:
+ if (record->event.pressed) {
+ TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse");
+ }
+ return false;
+ case MD_BOOT:
+ if (record->event.pressed) {
+ key_timer = timer_read32();
+ } else {
+ if (timer_elapsed32(key_timer) >= 500) {
+ reset_keyboard();
+ }
+ }
+ return false;
+ case RGB_TOG:
+ if (record->event.pressed) {
+ switch (rgb_matrix_get_flags()) {
+ case LED_FLAG_ALL: {
+ rgb_matrix_set_flags(LED_FLAG_KEYLIGHT);
+ rgb_matrix_set_color_all(0, 0, 0);
+ }
+ break;
+ case LED_FLAG_KEYLIGHT: {
+ rgb_matrix_set_flags(LED_FLAG_UNDERGLOW);
+ rgb_matrix_set_color_all(0, 0, 0);
+ }
+ break;
+ case LED_FLAG_UNDERGLOW: {
+ rgb_matrix_set_flags(LED_FLAG_NONE);
+ rgb_matrix_disable_noeeprom();
+ }
+ break;
+ default: {
+ rgb_matrix_set_flags(LED_FLAG_ALL);
+ rgb_matrix_enable_noeeprom();
+ }
+ break;
+ }
+ }
+ return false;
+ default:
+ return true; //Process all other keycodes normally
+ }
+}
diff --git a/keyboards/massdrop/ctrl/info.json b/keyboards/massdrop/ctrl/info.json
index 2212540e525..5e7f92f5bb6 100644
--- a/keyboards/massdrop/ctrl/info.json
+++ b/keyboards/massdrop/ctrl/info.json
@@ -83,9 +83,9 @@
{"label":"FORWARD SLASH", "x":11.25, "y":4.5},
{"label":"RIGHT SHIFT", "x":12.25, "y":4.5, "w":2.75},
{"label":"UP ARROW", "x":16.5, "y":4.5},
- {"label":"LEFT CTRL", "x":0.005, "y":5.5, "w":1.24},
- {"label":"LEFT WIN", "x":1.255, "y":5.5, "w":1.24},
- {"label":"LEFT ALT", "x":2.505, "y":5.5, "w":1.24},
+ {"label":"LEFT CTRL", "x":0.005, "y":5.5, "w":1.25},
+ {"label":"LEFT WIN", "x":1.255, "y":5.5, "w":1.25},
+ {"label":"LEFT ALT", "x":2.505, "y":5.5, "w":1.25},
{"label":"SPACEBAR", "x":3.75, "y":5.5, "w":6.25},
{"label":"RIGHT ALT", "x":10, "y":5.5, "w":1.25},
{"label":"FN", "x":11.25, "y":5.5, "w":1.25},
diff --git a/keyboards/massdrop/ctrl/keymaps/default/keymap.c b/keyboards/massdrop/ctrl/keymaps/default/keymap.c
index 9f111725c45..51b7f3931bc 100644
--- a/keyboards/massdrop/ctrl/keymaps/default/keymap.c
+++ b/keyboards/massdrop/ctrl/keymaps/default/keymap.c
@@ -49,9 +49,9 @@ void matrix_init_user(void) {
void matrix_scan_user(void) {
};
-#define MODS_SHIFT (get_mods() & MOD_BIT(KC_LSHIFT) || get_mods() & MOD_BIT(KC_RSHIFT))
-#define MODS_CTRL (get_mods() & MOD_BIT(KC_LCTL) || get_mods() & MOD_BIT(KC_RCTRL))
-#define MODS_ALT (get_mods() & MOD_BIT(KC_LALT) || get_mods() & MOD_BIT(KC_RALT))
+#define MODS_SHIFT (get_mods() & MOD_MASK_SHIFT)
+#define MODS_CTRL (get_mods() & MOD_MASK_CTRL)
+#define MODS_ALT (get_mods() & MOD_MASK_ALT)
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
static uint32_t key_timer;
diff --git a/keyboards/mc_76k/config.h b/keyboards/mc_76k/config.h
index cccd6a8e933..cd14081f4d4 100644
--- a/keyboards/mc_76k/config.h
+++ b/keyboards/mc_76k/config.h
@@ -98,7 +98,5 @@ along with this program. If not, see .
*/
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
diff --git a/keyboards/mechlovin/adelais/adelais.c b/keyboards/mechlovin/adelais/adelais.c
new file mode 100644
index 00000000000..c4676007efe
--- /dev/null
+++ b/keyboards/mechlovin/adelais/adelais.c
@@ -0,0 +1,69 @@
+/* Copyright 2020 Team Mechlovin'
+ *
+ * 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 .
+ */
+
+#include "adelais.h"
+
+#ifdef RGB_MATRIX_ENABLE
+led_config_t g_led_config = { {
+ //Key Matrix to LED Index
+ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16},
+ {18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 0},
+ {33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, NO_LED, 45, 17},
+ {46, NO_LED, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 58, 60, 32},
+ {61, NO_LED, 62, NO_LED, 63, NO_LED, 64, NO_LED, 65, NO_LED, 66, NO_LED, NO_LED, 57, 67}
+}, {
+ //LED Index to Physical Positon
+ {0,0}, { 17, 0}, { 34, 0 }, { 51, 0 }, { 69, 0}, { 86, 0}, {100, 0}, {103, 0}, { 120, 0}, { 138, 0}, { 155, 0}, { 172, 0}, { 189, 0}, {207, 0}, {215, 0}, {223, 0}, {224, 0},
+ {0,16}, { 17, 16}, { 34,16 }, { 51,16 }, { 69,16}, { 86,16}, {103,16}, { 120,16}, { 138,16}, { 155,16}, { 172,16}, { 189,16}, {207, 16}, {215, 16}, {224,16},
+ {0,32}, { 17, 32}, { 34,32 }, { 51,32 }, { 69,32}, { 86,32}, {103,32}, { 120,32}, { 138,32}, { 155,32}, { 172,32}, { 189,32}, {207, 32}, {224,32},
+ { 17, 48}, { 34,48 }, { 51,48 }, { 69,48}, { 86,48}, {103,48}, { 120,48}, { 138,48}, { 155,48}, { 172,48}, { 189,48}, {207, 48}, {215, 48}, {224,48}, {224,48},
+ { 17, 64}, { 51,64 }, { 86,64}, { 103,64}, { 138,64}, { 172,64}, {224, 64},
+ {100,0}, { 69,0}, { 24, 0}, { 0,3}, { 0,16}, { 0,32}, { 0,51}, { 15,64 }, { 34,64}, { 69,64}, { 103,64}, {110,64}, { 120,64}, { 155,64}, { 189,64}, { 192,64}, { 224,58}, { 224,32}, { 224,16}, { 224,0}, { 207,0}, { 172,0}, { 138,0},
+}, {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+} };
+#endif
+
+void matrix_init_kb(void) {
+ // put your keyboard start-up code here
+ // runs once when the firmware starts up
+
+ matrix_init_user();
+ led_init_ports();
+}
+
+void led_init_ports(void) {
+ setPinOutput(B2);
+ writePinLow(B2);
+ setPinOutput(C15);
+ writePinLow(C15);
+ setPinOutput(B9);
+ writePinLow(B9);
+}
+
+bool led_update_kb(led_t led_state) {
+ if(led_update_user(led_state)) {
+ writePin(B2, led_state.caps_lock);
+ writePin(B9, led_state.scroll_lock);
+ writePin(C12, led_state.num_lock);
+ }
+
+ return true;
+}
diff --git a/keyboards/mechlovin/adelais/adelais.h b/keyboards/mechlovin/adelais/adelais.h
new file mode 100644
index 00000000000..d28502da264
--- /dev/null
+++ b/keyboards/mechlovin/adelais/adelais.h
@@ -0,0 +1,33 @@
+/* Copyright 2020 Team Mechlovin
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_all( \
+ K1E, K00, K01, K02, K03, K04, K05, K06, K07,K08,K09, K0A, K0B, K0C, K0D, K0E,\
+ K2E, K10, K11, K12, K13, K14, K15, K16,K17,K18, K19, K1A, K1B, K1C, K1D,\
+ K3E, K20, K21, K22, K23, K24, K25, K26,K27,K28, K29, K2A, K2B, K2D,\
+ K30, K32, K33, K34, K35, K36, K37,K38,K39, K3A, K3B, K3D, K3C, K4D,\
+ K40, K42, K44, K46, K48, K4A, K4E \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, K2E }, \
+ { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \
+ { K40, KC_NO, K42, KC_NO, K44, KC_NO, K46, KC_NO, K48, KC_NO, K4A, KC_NO, KC_NO, K4D, K4E }, \
+}
diff --git a/keyboards/mechlovin/adelais/config.h b/keyboards/mechlovin/adelais/config.h
new file mode 100644
index 00000000000..9ec688aef86
--- /dev/null
+++ b/keyboards/mechlovin/adelais/config.h
@@ -0,0 +1,46 @@
+/*
+Copyright 2020 Team Mechlovin
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x4D4C // "ML"
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Team.Mechlovin
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#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 { B1, A0, C13, A1, A2}
+#define MATRIX_COL_PINS { A10, A9, A8, B15, B14, B13, B12, B11, B10, B8, B4, B5, B3, C14, A15 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/mechlovin/adelais/info.json b/keyboards/mechlovin/adelais/info.json
new file mode 100644
index 00000000000..4babd9078ae
--- /dev/null
+++ b/keyboards/mechlovin/adelais/info.json
@@ -0,0 +1,81 @@
+{
+ "keyboard_name": "Adelais",
+ "url": "",
+ "maintainer": "Team Mechlovin'",
+ "width": 18.5,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_all": {
+ "key_count": 66,
+ "layout": [
+ {"label":"K1E", "x":0, "y":0},
+ {"label":"K00", "x":1.5, "y":0},
+ {"label":"K01", "x":2.5, "y":0},
+ {"label":"K02", "x":3.5, "y":0},
+ {"label":"K03", "x":4.5, "y":0},
+ {"label":"K04", "x":5.5, "y":0},
+ {"label":"K05", "x":6.5, "y":0},
+ {"label":"K06", "x":7.5, "y":0},
+ {"label":"K07", "x":10.5, "y":0},
+ {"label":"K08", "x":11.5, "y":0},
+ {"label":"K09", "x":12.5, "y":0},
+ {"label":"K0A", "x":13.5, "y":0},
+ {"label":"K0B", "x":14.5, "y":0},
+ {"label":"K0C", "x":15.5, "y":0},
+ {"label":"K0D", "x":16.5, "y":0},
+ {"label":"K0E", "x":17.5, "y":0},
+ {"label":"K2E", "x":0, "y":1},
+ {"label":"K10", "x":1.5, "y":1, "w":1.5},
+ {"label":"K11", "x":3, "y":1},
+ {"label":"K12", "x":4, "y":1},
+ {"label":"K13", "x":5, "y":1},
+ {"label":"K14", "x":6, "y":1},
+ {"label":"K15", "x":7, "y":1},
+ {"label":"K16", "x":10, "y":1},
+ {"label":"K17", "x":11, "y":1},
+ {"label":"K18", "x":12, "y":1},
+ {"label":"K19", "x":13, "y":1},
+ {"label":"K1A", "x":14, "y":1},
+ {"label":"K1B", "x":15, "y":1},
+ {"label":"K1C", "x":16, "y":1},
+ {"label":"K1D", "x":17, "y":1, "w":1.5},
+ {"label":"K3E", "x":0, "y":2},
+ {"label":"K20", "x":1.5, "y":2, "w":1.75},
+ {"label":"K21", "x":3.25, "y":2},
+ {"label":"K22", "x":4.25, "y":2},
+ {"label":"K23", "x":5.25, "y":2},
+ {"label":"K24", "x":6.25, "y":2},
+ {"label":"K25", "x":7.25, "y":2},
+ {"label":"K26", "x":10.25, "y":2},
+ {"label":"K27", "x":11.25, "y":2},
+ {"label":"K28", "x":12.25, "y":2},
+ {"label":"K29", "x":13.25, "y":2},
+ {"label":"K2A", "x":14.25, "y":2},
+ {"label":"K2B", "x":15.25, "y":2},
+ {"label":"K2D", "x":16.25, "y":2, "w":2.25},
+ {"label":"K30", "x":1.5, "y":3, "w":2.25},
+ {"label":"K32", "x":3.75, "y":3},
+ {"label":"K33", "x":4.75, "y":3},
+ {"label":"K34", "x":5.75, "y":3},
+ {"label":"K35", "x":6.75, "y":3},
+ {"label":"K36", "x":7.75, "y":3},
+ {"label":"K37", "x":9.75, "y":3},
+ {"label":"K38", "x":10.75, "y":3},
+ {"label":"K39", "x":11.75, "y":3},
+ {"label":"K3A", "x":12.75, "y":3},
+ {"label":"K3B", "x":13.75, "y":3},
+ {"label":"K4D", "x":14.75, "y":3},
+ {"label":"K3C", "x":15.75, "y":3, "w":1.75},
+ {"label":"K3D", "x":17.5, "y":3},
+ {"label":"K40", "x":1.5, "y":4, "w":1.5},
+ {"label":"K42", "x":4.5, "y":4, "w":1.25},
+ {"label":"K44", "x":5.75, "y":4, "w":2.25},
+ {"label":"K46", "x":8, "y":4, "w":1.25},
+ {"label":"K48", "x":9.75, "y":4, "w":2.75},
+ {"label":"K4A", "x":12.5, "y":4, "w":1.25},
+ {"label":"K4E", "x":17, "y":4, "w":1.5}
+ ]
+ }
+ }
+ ,"meta": "https://noroadsleft.github.io/kbf_qmk_converter/"
+}
diff --git a/keyboards/mechlovin/adelais/keymaps/default/keymap.c b/keyboards/mechlovin/adelais/keymaps/default/keymap.c
new file mode 100644
index 00000000000..7848a5709bc
--- /dev/null
+++ b/keyboards/mechlovin/adelais/keymaps/default/keymap.c
@@ -0,0 +1,32 @@
+/* Copyright 2020 Team Mechlovin
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_all(
+ KC_SPC, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
+ KC_SPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_SLSH,
+ KC_SPC, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_BSLS, MO(1), KC_RSFT, KC_UP,
+ KC_LCTL, KC_LALT, KC_SPC, MO(2), KC_SPC, KC_RALT, KC_RCTL ),
+ [0] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ),
+
+};
\ No newline at end of file
diff --git a/keyboards/mechlovin/adelais/keymaps/default/readme.md b/keyboards/mechlovin/adelais/keymaps/default/readme.md
new file mode 100644
index 00000000000..54d78d873b5
--- /dev/null
+++ b/keyboards/mechlovin/adelais/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for adelais
diff --git a/keyboards/mechlovin/adelais/keymaps/via/keymap.c b/keyboards/mechlovin/adelais/keymaps/via/keymap.c
new file mode 100644
index 00000000000..03636d02b30
--- /dev/null
+++ b/keyboards/mechlovin/adelais/keymaps/via/keymap.c
@@ -0,0 +1,44 @@
+/* Copyright 2020 Team Mechlovin
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_all(
+ KC_SPC, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
+ KC_SPC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_SLSH,
+ KC_SPC, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_BSLS, MO(1), KC_RSFT, KC_UP,
+ KC_LCTL, KC_LALT, KC_SPC, MO(2), KC_SPC, KC_RALT, KC_RCTL ),
+ [1] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ),
+ [2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ),
+ [3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ),
+
+};
\ No newline at end of file
diff --git a/keyboards/mechlovin/adelais/keymaps/via/readme.md b/keyboards/mechlovin/adelais/keymaps/via/readme.md
new file mode 100644
index 00000000000..a85ba709d78
--- /dev/null
+++ b/keyboards/mechlovin/adelais/keymaps/via/readme.md
@@ -0,0 +1 @@
+# The VIA keymap for adelais
diff --git a/keyboards/mechlovin/adelais/keymaps/via/rules.mk b/keyboards/mechlovin/adelais/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/mechlovin/adelais/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/mechlovin/adelais/readme.md b/keyboards/mechlovin/adelais/readme.md
new file mode 100644
index 00000000000..947d5a31d98
--- /dev/null
+++ b/keyboards/mechlovin/adelais/readme.md
@@ -0,0 +1,18 @@
+# Adelais / Adelais En Ciel
+
+
+
+Compatible with TGR Alice and all clone variants.
+`standard_led` (Adelais) comes with backlight and RGB underglow LEDs pre-soldered.
+`rgb_led` (Adelais En Ciel) comes with per-key RGB LEDs pre-soldered.
+
+* Keyboard Maintainer: [Team Mechlovin'](https://github.com/mechlovin)
+* Hardware Supported: Adelais, Adelais En Ciel
+* Hardware Availability: [Reddit GB](https://www.reddit.com/r/mechmarket/comments/fr7smq/gb_team_mechlovin_adelais_tgr_alice_clones/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make mechlovin/adelais/standard_led:default
+ make mechlovin/adelais/rgb_led:default
+
+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).
diff --git a/keyboards/mechlovin/adelais/rgb_led/config.h b/keyboards/mechlovin/adelais/rgb_led/config.h
new file mode 100644
index 00000000000..860bcee7c4e
--- /dev/null
+++ b/keyboards/mechlovin/adelais/rgb_led/config.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#define PRODUCT_ID 0xAEC1
+#define PRODUCT Adelais En Ciel
+#define DESCRIPTION Team.Mechlovin Adelais En Ciel
+
+#define RGB_DI_PIN A7
+#define DRIVER_LED_TOTAL 91
+#define RGB_MATRIX_KEYPRESSES // reacts to keypresses
+#define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
+#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+#define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
+#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended
+#define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
+#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 220 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
+#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_PINWHEEL // Sets the default mode, if none has been set
\ No newline at end of file
diff --git a/keyboards/mechlovin/adelais/rgb_led/rules.mk b/keyboards/mechlovin/adelais/rgb_led/rules.mk
new file mode 100644
index 00000000000..20256e2086f
--- /dev/null
+++ b/keyboards/mechlovin/adelais/rgb_led/rules.mk
@@ -0,0 +1 @@
+RGB_MATRIX_ENABLE = WS2812
diff --git a/keyboards/mechlovin/adelais/rules.mk b/keyboards/mechlovin/adelais/rules.mk
new file mode 100644
index 00000000000..4681ac31632
--- /dev/null
+++ b/keyboards/mechlovin/adelais/rules.mk
@@ -0,0 +1,23 @@
+# MCU name
+MCU = STM32F303
+
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+
+DEFAULT_FOLDER = mechlovin/adelais/standard_led
\ No newline at end of file
diff --git a/keyboards/mechlovin/adelais/standard_led/config.h b/keyboards/mechlovin/adelais/standard_led/config.h
new file mode 100644
index 00000000000..0de6cc6b408
--- /dev/null
+++ b/keyboards/mechlovin/adelais/standard_led/config.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#define PRODUCT_ID 0xAD01
+#define PRODUCT Adelais
+#define DESCRIPTION Team.Mechlovin Adelais
+
+#define BACKLIGHT_PIN B0
+#define BACKLIGHT_BREATHING
+#define BACKLIGHT_PWM_DRIVER PWMD3
+#define BACKLIGHT_PWM_CHANNEL 3
+
+#define RGB_DI_PIN A7
+#define RGBLED_NUM 23
+#define RGBLIGHT_LIMIT_VAL 255
+#define RGBLIGHT_ANIMATIONS
diff --git a/keyboards/mechlovin/adelais/standard_led/rules.mk b/keyboards/mechlovin/adelais/standard_led/rules.mk
new file mode 100644
index 00000000000..4ddc3524048
--- /dev/null
+++ b/keyboards/mechlovin/adelais/standard_led/rules.mk
@@ -0,0 +1,3 @@
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+BACKLIGHT_DRIVER = pwm
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
\ No newline at end of file
diff --git a/keyboards/mechlovin/hannah60rgb/config.h b/keyboards/mechlovin/hannah60rgb/config.h
new file mode 100644
index 00000000000..5ad16084f1b
--- /dev/null
+++ b/keyboards/mechlovin/hannah60rgb/config.h
@@ -0,0 +1,58 @@
+/*
+Copyright 2020 Mechlovin'
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x4D4C // ML-Mechlovin
+#define PRODUCT_ID 0x6001
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Team.Mechlovin
+#define PRODUCT Hannah60 RGB
+#define DESCRIPTION Team.Mechlovin Hannah60 RGB
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 14
+
+/*
+ * 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 { A4, A5, A3, A2, A1 }
+#define MATRIX_COL_PINS { B11, B10, B2, B1, B0, A7, A6, A0, C15, B4, B5, B3, C13, C14 }
+
+#define DIODE_DIRECTION COL2ROW
+
+#define RGB_DI_PIN A15
+#define DRIVER_LED_TOTAL 72
+#define RGB_MATRIX_KEYPRESSES // reacts to keypresses
+#define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
+#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+#define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
+#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended
+#define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
+#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200 // limits maximum brightness of LEDs to 200 out of 255. If not defined maximum brightness is set to 255
+#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_PINWHEEL // Sets the default mode, if none has been set
\ No newline at end of file
diff --git a/keyboards/mechlovin/hannah60rgb/hannah60rgb.c b/keyboards/mechlovin/hannah60rgb/hannah60rgb.c
new file mode 100644
index 00000000000..5acea8c665f
--- /dev/null
+++ b/keyboards/mechlovin/hannah60rgb/hannah60rgb.c
@@ -0,0 +1,54 @@
+/* Copyright 2020 Mechlovin'
+ *
+ * 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 .
+ */
+
+#include "hannah60rgb.h"
+
+void matrix_init_kb(void) {
+ // put your keyboard start-up code here
+ // runs once when the firmware starts up
+ matrix_init_user();
+ led_init_ports();
+};
+
+#ifdef RGB_MATRIX_ENABLE
+led_config_t g_led_config = { {
+ //Key Matrix to LED Index
+ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13},
+ {29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 15},
+ {30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 16, 43},
+ {59, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 44},
+ {60, 61, 62, NO_LED, 63, NO_LED, 64, NO_LED, 67, NO_LED, 68, 69, 70, 71}
+}, {
+ //LED Index to Physical Positon
+ { 0, 0}, { 16, 0}, { 32, 0 }, { 48, 0 }, { 64, 0}, { 80, 0}, { 96, 0}, { 112, 0}, { 128, 0}, { 144, 0}, { 160, 0}, { 176, 0}, {192, 0}, {208, 0}, {216, 0},
+ {220, 0}, {211, 16}, {200,16 }, {176,16 }, {160,16}, {144,16}, {128,16}, { 112,16}, { 96,16}, { 80,16}, { 64,16}, { 48,16}, {32, 16}, {16, 16}, {0,16},
+ { 0, 32}, { 16, 32}, { 32,32 }, { 48,32 }, { 64,32}, { 80,32}, { 96,32}, { 112,32}, { 128,32}, { 144,32}, { 160,32}, { 176,32}, {192, 32}, {208, 32}, {224,48},
+ {208, 48}, {192, 48}, {160,48 }, {144,48 }, {128,48}, {112,48}, {96,48}, { 80,48}, { 64,48}, { 48,48}, { 32,48}, { 16,48}, {8, 48}, {0, 48}, {0,48},
+ { 0, 64}, { 16, 64}, { 32,64 }, { 48,64 }, { 64,64}, { 80,64}, { 96,64}, { 112,64}, { 144,64}, { 160,64}, { 192,64}, { 224,64},
+}, {
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+} };
+
+void rgb_matrix_indicators_user(void) {
+ if (host_keyboard_led_state().caps_lock) {
+ rgb_matrix_set_color(30, 255, 255, 255);
+ }
+}
+#endif
\ No newline at end of file
diff --git a/keyboards/mechlovin/hannah60rgb/hannah60rgb.h b/keyboards/mechlovin/hannah60rgb/hannah60rgb.h
new file mode 100644
index 00000000000..8fd1c67979a
--- /dev/null
+++ b/keyboards/mechlovin/hannah60rgb/hannah60rgb.h
@@ -0,0 +1,63 @@
+/*
+Copyright 2020 Mechlovin'
+
+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 .
+*/
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_all( \
+K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K1D, \
+K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K2C, \
+K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
+K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
+K40, K41, K42, K44, K46, K48, K4A, K4B, K4C, K4D \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \
+ { K40, K41, K42, KC_NO, K44, KC_NO, K46, KC_NO, K48, KC_NO, K4A, K4B, K4C, K4D }, \
+}
+#define LAYOUT_60_ansi( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K2C, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \
+ K40, K41, K42, K46, K4A, K4B, K4C, K4D \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, KC_NO }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
+ { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, KC_NO }, \
+ { K40, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D }, \
+}
+#define LAYOUT_60_iso( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, \
+ K40, K41, K42, K46, K4A, K4B, K4C, K4D \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, KC_NO }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, KC_NO }, \
+ { K40, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D }, \
+}
+
+
+// generated by KBFirmware JSON to QMK Parser
+// https://noroadsleft.github.io/kbf_qmk_converter/
diff --git a/keyboards/mechlovin/hannah60rgb/info.json b/keyboards/mechlovin/hannah60rgb/info.json
new file mode 100644
index 00000000000..97d7b849228
--- /dev/null
+++ b/keyboards/mechlovin/hannah60rgb/info.json
@@ -0,0 +1,81 @@
+{
+ "keyboard_name": "hannah60rgb",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 15,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_all": {
+ "key_count": 66,
+ "layout": [
+ {"label":"K00 (B0,B5)", "x":2.75, "y":0},
+ {"label":"K01 (B0,B6)", "x":3.75, "y":0},
+ {"label":"K02 (B0,B7)", "x":4.75, "y":0},
+ {"label":"K03 (B0,C0)", "x":5.75, "y":0},
+ {"label":"K04 (B0,C1)", "x":6.75, "y":0},
+ {"label":"K05 (B0,C2)", "x":7.75, "y":0},
+ {"label":"K06 (B0,C3)", "x":8.75, "y":0},
+ {"label":"K07 (B0,C4)", "x":9.75, "y":0},
+ {"label":"K08 (B0,C5)", "x":10.75, "y":0},
+ {"label":"K09 (B0,C6)", "x":11.75, "y":0},
+ {"label":"K0A (B0,C7)", "x":12.75, "y":0},
+ {"label":"K0B (B0,D0)", "x":13.75, "y":0},
+ {"label":"K0C (B0,D1)", "x":14.75, "y":0},
+ {"label":"K0D (B0,F5)", "x":15.75, "y":0},
+ {"label":"K1D (B1,F5)", "x":16.75, "y":0},
+ {"label":"K10 (B1,B5)", "x":2.75, "y":1, "w":1.5},
+ {"label":"K11 (B1,B6)", "x":4.25, "y":1},
+ {"label":"K12 (B1,B7)", "x":5.25, "y":1},
+ {"label":"K13 (B1,C0)", "x":6.25, "y":1},
+ {"label":"K14 (B1,C1)", "x":7.25, "y":1},
+ {"label":"K15 (B1,C2)", "x":8.25, "y":1},
+ {"label":"K16 (B1,C3)", "x":9.25, "y":1},
+ {"label":"K17 (B1,C4)", "x":10.25, "y":1},
+ {"label":"K18 (B1,C5)", "x":11.25, "y":1},
+ {"label":"K19 (B1,C6)", "x":12.25, "y":1},
+ {"label":"K1A (B1,C7)", "x":13.25, "y":1},
+ {"label":"K1B (B1,D0)", "x":14.25, "y":1},
+ {"label":"K1C (B1,D1)", "x":15.25, "y":1},
+ {"label":"K2C (B2,D1)", "x":16.25, "y":1, "w":1.5},
+ {"label":"K20 (B2,B5)", "x":2.75, "y":2, "w":1.75},
+ {"label":"K21 (B2,B6)", "x":4.5, "y":2},
+ {"label":"K22 (B2,B7)", "x":5.5, "y":2},
+ {"label":"K23 (B2,C0)", "x":6.5, "y":2},
+ {"label":"K24 (B2,C1)", "x":7.5, "y":2},
+ {"label":"K25 (B2,C2)", "x":8.5, "y":2},
+ {"label":"K26 (B2,C3)", "x":9.5, "y":2},
+ {"label":"K27 (B2,C4)", "x":10.5, "y":2},
+ {"label":"K28 (B2,C5)", "x":11.5, "y":2},
+ {"label":"K29 (B2,C6)", "x":12.5, "y":2},
+ {"label":"K2A (B2,C7)", "x":13.5, "y":2},
+ {"label":"K2B (B2,D0)", "x":14.5, "y":2},
+ {"label":"K2D (B2,F5)", "x":15.5, "y":2, "w":2.25},
+ {"label":"K30 (B3,B5)", "x":2.75, "y":3, "w":1.25},
+ {"label":"K31 (B3,B6)", "x":4, "y":3},
+ {"label":"K32 (B3,B7)", "x":5, "y":3},
+ {"label":"K33 (B3,C0)", "x":6, "y":3},
+ {"label":"K34 (B3,C1)", "x":7, "y":3},
+ {"label":"K35 (B3,C2)", "x":8, "y":3},
+ {"label":"K36 (B3,C3)", "x":9, "y":3},
+ {"label":"K37 (B3,C4)", "x":10, "y":3},
+ {"label":"K38 (B3,C5)", "x":11, "y":3},
+ {"label":"K39 (B3,C6)", "x":12, "y":3},
+ {"label":"K3A (B3,C7)", "x":13, "y":3},
+ {"label":"K3B (B3,D0)", "x":14, "y":3},
+ {"label":"K3C (B3,D1)", "x":15, "y":3, "w":1.75},
+ {"label":"K3D (B3,F5)", "x":16.75, "y":3},
+ {"label":"K40 (B4,B5)", "x":2.75, "y":4, "w":1.25},
+ {"label":"K41 (B4,B6)", "x":4, "y":4, "w":1.25},
+ {"label":"K42 (B4,B7)", "x":5.25, "y":4, "w":1.25},
+ {"label":"K44 (B4,C1)", "x":6.5, "y":4, "w":2.75},
+ {"label":"K46 (B4,C3)", "x":9.25, "y":4, "w":1.25},
+ {"label":"K48 (B4,C5)", "x":10.5, "y":4, "w":2.25},
+ {"label":"K4A (B4,C7)", "x":12.75, "y":4, "w":1.25},
+ {"label":"K4B (B4,D0)", "x":14, "y":4, "w":1.25},
+ {"label":"K4C (B4,D1)", "x":15.25, "y":4, "w":1.25},
+ {"label":"K4D (B4,F5)", "x":16.5, "y":4, "w":1.25}
+ ]
+ }
+ }
+ ,"meta": "https://noroadsleft.github.io/kbf_qmk_converter/"
+}
diff --git a/keyboards/mechlovin/hannah60rgb/keymaps/default/keymap.c b/keyboards/mechlovin/hannah60rgb/keymaps/default/keymap.c
new file mode 100644
index 00000000000..5edcdd09972
--- /dev/null
+++ b/keyboards/mechlovin/hannah60rgb/keymaps/default/keymap.c
@@ -0,0 +1,26 @@
+/* Copyright 2020 Mechlovin'
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_all(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL ),
+
+};
diff --git a/keyboards/mechlovin/hannah60rgb/keymaps/default/readme.md b/keyboards/mechlovin/hannah60rgb/keymaps/default/readme.md
new file mode 100644
index 00000000000..9a101f5ace3
--- /dev/null
+++ b/keyboards/mechlovin/hannah60rgb/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for hannah60rgb
diff --git a/keyboards/mechlovin/hannah60rgb/keymaps/via/keymap.c b/keyboards/mechlovin/hannah60rgb/keymaps/via/keymap.c
new file mode 100644
index 00000000000..0e22b84f06c
--- /dev/null
+++ b/keyboards/mechlovin/hannah60rgb/keymaps/via/keymap.c
@@ -0,0 +1,44 @@
+/* Copyright 2020 Mechlovin'
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_all(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ LT(2,KC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL ),
+ [1] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ),
+ [2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ),
+ [3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS ),
+
+};
diff --git a/keyboards/mechlovin/hannah60rgb/keymaps/via/readme.md b/keyboards/mechlovin/hannah60rgb/keymaps/via/readme.md
new file mode 100644
index 00000000000..794a57963c1
--- /dev/null
+++ b/keyboards/mechlovin/hannah60rgb/keymaps/via/readme.md
@@ -0,0 +1 @@
+# The VIA keymap for hannah60rgb
diff --git a/keyboards/mechlovin/hannah60rgb/keymaps/via/rules.mk b/keyboards/mechlovin/hannah60rgb/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/mechlovin/hannah60rgb/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/mechlovin/hannah60rgb/readme.md b/keyboards/mechlovin/hannah60rgb/readme.md
new file mode 100644
index 00000000000..777be816a0d
--- /dev/null
+++ b/keyboards/mechlovin/hannah60rgb/readme.md
@@ -0,0 +1,15 @@
+# hannah60rgb
+
+
+
+A 60% PCB with per-key RGB, compatible with Poker and Unikorn cases.
+
+* Keyboard Maintainer: [Mechlovin'](https://github.com/mechlovin)
+* Hardware Supported: hannah60rgb PCB, STM32F303
+
+
+Make example for this keyboard (after setting up your build environment):
+
+ make mechlovin/hannah60rgb:default
+
+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).
diff --git a/keyboards/mechlovin/hannah60rgb/rules.mk b/keyboards/mechlovin/hannah60rgb/rules.mk
new file mode 100644
index 00000000000..1a5441fc705
--- /dev/null
+++ b/keyboards/mechlovin/hannah60rgb/rules.mk
@@ -0,0 +1,27 @@
+# MCU name
+MCU = STM32F303
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+RGB_MATRIX_ENABLE = WS2812
+
+# generated by KBFirmware JSON to QMK Parser
+# https://noroadsleft.github.io/kbf_qmk_converter/
diff --git a/keyboards/mechlovin/pisces/config.h b/keyboards/mechlovin/pisces/config.h
new file mode 100644
index 00000000000..37acff2c119
--- /dev/null
+++ b/keyboards/mechlovin/pisces/config.h
@@ -0,0 +1,76 @@
+/*
+Copyright 2020 Team Mechlovin'
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x4D4C // ML-Mechlovin
+#define PRODUCT_ID 0x6501
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Team.Mechlovin
+#define PRODUCT Pisces65
+#define DESCRIPTION Team.Mechlovin Pisces65
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#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, F0, F5, F6, F7 }
+#define MATRIX_COL_PINS { E6, B1, B3, D0, D1, D2, D3, D5, F4, F1, D4, D6, D7, B4, B5 }
+
+#define DIODE_DIRECTION COL2ROW
+
+#define BACKLIGHT_PIN B7
+// #define BACKLIGHT_BREATHING
+#define BACKLIGHT_LEVELS 3
+
+#define RGB_DI_PIN E2
+#ifdef RGB_DI_PIN
+ #define RGBLED_NUM 12
+ #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
+#endif
+
+// generated by KBFirmware JSON to QMK Parser
+// https://noroadsleft.github.io/kbf_qmk_converter/
diff --git a/keyboards/mechlovin/pisces/info.json b/keyboards/mechlovin/pisces/info.json
new file mode 100644
index 00000000000..5b32d1186e5
--- /dev/null
+++ b/keyboards/mechlovin/pisces/info.json
@@ -0,0 +1,80 @@
+{
+ "keyboard_name": "pisces",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 16,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 65,
+ "layout": [
+ {"label":"K00 (B0,E6)", "x":0, "y":0},
+ {"label":"K01 (B0,B1)", "x":1, "y":0},
+ {"label":"K02 (B0,B3)", "x":2, "y":0},
+ {"label":"K03 (B0,D0)", "x":3, "y":0},
+ {"label":"K04 (B0,D1)", "x":4, "y":0},
+ {"label":"K05 (B0,D2)", "x":5, "y":0},
+ {"label":"K06 (B0,D3)", "x":6, "y":0},
+ {"label":"K07 (B0,D5)", "x":7, "y":0},
+ {"label":"K08 (B0,F4)", "x":8, "y":0},
+ {"label":"K09 (B0,F1)", "x":9, "y":0},
+ {"label":"K0A (B0,D4)", "x":10, "y":0},
+ {"label":"K0B (B0,D6)", "x":11, "y":0},
+ {"label":"K0C (B0,D7)", "x":12, "y":0},
+ {"label":"K0D (B0,B4)", "x":13, "y":0, "w":2},
+ {"label":"K10 (F0,E6)", "x":0, "y":1, "w":1.5},
+ {"label":"K11 (F0,B1)", "x":1.5, "y":1},
+ {"label":"K12 (F0,B3)", "x":2.5, "y":1},
+ {"label":"K13 (F0,D0)", "x":3.5, "y":1},
+ {"label":"K14 (F0,D1)", "x":4.5, "y":1},
+ {"label":"K15 (F0,D2)", "x":5.5, "y":1},
+ {"label":"K16 (F0,D3)", "x":6.5, "y":1},
+ {"label":"K17 (F0,D5)", "x":7.5, "y":1},
+ {"label":"K18 (F0,F4)", "x":8.5, "y":1},
+ {"label":"K19 (F0,F1)", "x":9.5, "y":1},
+ {"label":"K1A (F0,D4)", "x":10.5, "y":1},
+ {"label":"K1B (F0,D6)", "x":11.5, "y":1},
+ {"label":"K1C (F0,D7)", "x":12.5, "y":1},
+ {"label":"K1D (F0,B4)", "x":13.5, "y":1, "w":1.5},
+ {"label":"K1E (F0,B5)", "x":15, "y":1},
+ {"label":"K20 (F5,E6)", "x":0, "y":2, "w":1.75},
+ {"label":"K21 (F5,B1)", "x":1.75, "y":2},
+ {"label":"K22 (F5,B3)", "x":2.75, "y":2},
+ {"label":"K23 (F5,D0)", "x":3.75, "y":2},
+ {"label":"K24 (F5,D1)", "x":4.75, "y":2},
+ {"label":"K25 (F5,D2)", "x":5.75, "y":2},
+ {"label":"K26 (F5,D3)", "x":6.75, "y":2},
+ {"label":"K27 (F5,D5)", "x":7.75, "y":2},
+ {"label":"K28 (F5,F4)", "x":8.75, "y":2},
+ {"label":"K29 (F5,F1)", "x":9.75, "y":2},
+ {"label":"K2A (F5,D4)", "x":10.75, "y":2},
+ {"label":"K2B (F5,D6)", "x":11.75, "y":2},
+ {"label":"K2D (F5,B4)", "x":12.75, "y":2, "w":2.25},
+ {"label":"K2E (F5,B5)", "x":15, "y":2},
+ {"label":"K30 (F6,E6)", "x":0, "y":3, "w":2.25},
+ {"label":"K32 (F6,B3)", "x":2.25, "y":3},
+ {"label":"K33 (F6,D0)", "x":3.25, "y":3},
+ {"label":"K34 (F6,D1)", "x":4.25, "y":3},
+ {"label":"K35 (F6,D2)", "x":5.25, "y":3},
+ {"label":"K36 (F6,D3)", "x":6.25, "y":3},
+ {"label":"K37 (F6,D5)", "x":7.25, "y":3},
+ {"label":"K38 (F6,F4)", "x":8.25, "y":3},
+ {"label":"K39 (F6,F1)", "x":9.25, "y":3},
+ {"label":"K3A (F6,D4)", "x":10.25, "y":3},
+ {"label":"K3B (F6,D6)", "x":11.25, "y":3},
+ {"label":"K3C (F6,D7)", "x":12.25, "y":3, "w":1.75},
+ {"label":"K3D (F6,B4)", "x":14, "y":3},
+ {"label":"K3E (F6,B5)", "x":15, "y":3},
+ {"label":"K40 (F7,E6)", "x":0, "y":4, "w":1.5},
+ {"label":"K42 (F7,B3)", "x":2.25, "y":4, "w":1.5},
+ {"label":"K46 (F7,D3)", "x":3.75, "y":4, "w":6.25},
+ {"label":"K4A (F7,D4)", "x":10, "y":4, "w":1.25},
+ {"label":"K4B (F7,D6)", "x":11.25, "y":4, "w":1.25},
+ {"label":"K4C (F7,D7)", "x":13, "y":4},
+ {"label":"K4D (F7,B4)", "x":14, "y":4},
+ {"label":"K4E (F7,B5)", "x":15, "y":4}
+ ]
+ }
+ }
+ ,"meta": "https://noroadsleft.github.io/kbf_qmk_converter/"
+}
diff --git a/keyboards/mechlovin/pisces/keymaps/default/keymap.c b/keyboards/mechlovin/pisces/keymaps/default/keymap.c
new file mode 100644
index 00000000000..d4890a11ada
--- /dev/null
+++ b/keyboards/mechlovin/pisces/keymaps/default/keymap.c
@@ -0,0 +1,34 @@
+/* Copyright 2020 Team Mechlovin'
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+ LCTL_T(KC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT(
+ KC_TRNS, BL_STEP, RGB_TOG, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+};
\ No newline at end of file
diff --git a/keyboards/mechlovin/pisces/keymaps/default/readme.md b/keyboards/mechlovin/pisces/keymaps/default/readme.md
new file mode 100644
index 00000000000..966b8fd8024
--- /dev/null
+++ b/keyboards/mechlovin/pisces/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for pisces
diff --git a/keyboards/mechlovin/pisces/keymaps/via/keymap.c b/keyboards/mechlovin/pisces/keymaps/via/keymap.c
new file mode 100644
index 00000000000..4ea597a9f10
--- /dev/null
+++ b/keyboards/mechlovin/pisces/keymaps/via/keymap.c
@@ -0,0 +1,48 @@
+/* Copyright 2020 Team Mechlovin'
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+ LCTL_T(KC_CAPS), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT(
+ KC_TRNS, BL_STEP, RGB_TOG, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [2] = LAYOUT(
+ KC_TRNS, BL_STEP, RGB_TOG, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [3] = LAYOUT(
+ KC_TRNS, BL_STEP, RGB_TOG, RGB_MOD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+};
\ No newline at end of file
diff --git a/keyboards/mechlovin/pisces/keymaps/via/readme.md b/keyboards/mechlovin/pisces/keymaps/via/readme.md
new file mode 100644
index 00000000000..33523d55921
--- /dev/null
+++ b/keyboards/mechlovin/pisces/keymaps/via/readme.md
@@ -0,0 +1 @@
+# The VIA keymap for pisces
diff --git a/keyboards/mechlovin/pisces/keymaps/via/rules.mk b/keyboards/mechlovin/pisces/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/mechlovin/pisces/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/mechlovin/pisces/pisces.c b/keyboards/mechlovin/pisces/pisces.c
new file mode 100644
index 00000000000..2a0a97f6d40
--- /dev/null
+++ b/keyboards/mechlovin/pisces/pisces.c
@@ -0,0 +1,42 @@
+/* Copyright 2020 Team Mechlovin'
+ *
+ * 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 .
+ */
+
+#include "pisces.h"
+
+// Optional override functions below.
+// You can leave any or all of these undefined.
+// These are only required if you want to perform custom actions.
+
+void matrix_init_kb(void) {
+ // put your keyboard start-up code here
+ // runs once when the firmware starts up
+
+ matrix_init_user();
+ led_init_ports();
+}
+
+void led_init_ports(void) {
+ setPinOutput(B2);
+ writePinLow(B2);
+}
+
+bool led_update_kb(led_t led_state) {
+ if(led_update_user(led_state)) {
+ writePin(B2, led_state.caps_lock);
+ }
+
+ return true;
+}
diff --git a/keyboards/mechlovin/pisces/pisces.h b/keyboards/mechlovin/pisces/pisces.h
new file mode 100644
index 00000000000..743b787b7cc
--- /dev/null
+++ b/keyboards/mechlovin/pisces/pisces.h
@@ -0,0 +1,36 @@
+/* Copyright 2020 Team Mechlovin'
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, K2E, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \
+ K40, K41, K42, K46, K4A, K4B, K4C, K4D, K4E \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, KC_NO }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, K2E }, \
+ { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \
+ { K40, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D, K4E }, \
+}
+
+// generated by KBFirmware JSON to QMK Parser
+// https://noroadsleft.github.io/kbf_qmk_converter/
\ No newline at end of file
diff --git a/keyboards/mechlovin/pisces/readme.md b/keyboards/mechlovin/pisces/readme.md
new file mode 100644
index 00000000000..3229f1a52f8
--- /dev/null
+++ b/keyboards/mechlovin/pisces/readme.md
@@ -0,0 +1,13 @@
+# pisces
+
+
+
+
+* Keyboard Maintainer: [Team Mechlovin'](https://github.com/mechlovin)
+* Hardware Availability: Private GB, [GH IC](https://geekhack.org/index.php?topic=103579.0)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make mechlovin/pisces:default
+
+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).
diff --git a/keyboards/mechlovin/pisces/rules.mk b/keyboards/mechlovin/pisces/rules.mk
new file mode 100644
index 00000000000..9afc1864f13
--- /dev/null
+++ b/keyboards/mechlovin/pisces/rules.mk
@@ -0,0 +1,32 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
diff --git a/keyboards/mechmini/v1/config.h b/keyboards/mechmini/v1/config.h
index 80a79bf8699..0df0066f151 100644
--- a/keyboards/mechmini/v1/config.h
+++ b/keyboards/mechmini/v1/config.h
@@ -22,8 +22,6 @@ along with this program. If not, see .
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0xCA40
#define DEVICE_VER 0x0001
-// TODO: share these strings with usbconfig.h
-// Edit usbconfig.h to change these.
#define MANUFACTURER MECHKEYS
#define PRODUCT Mechmini
#define DESCRIPTION 40% modular keyboard
diff --git a/keyboards/mechmini/v1/rules.mk b/keyboards/mechmini/v1/rules.mk
index 6f2adc2f818..d0275c946f4 100644
--- a/keyboards/mechmini/v1/rules.mk
+++ b/keyboards/mechmini/v1/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = atmel-dfu
BOOTMAGIC_ENABLE = yes
MOUSEKEY_ENABLE = yes
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
diff --git a/keyboards/mechmini/v1/usbconfig.h b/keyboards/mechmini/v1/usbconfig.h
deleted file mode 100644
index 85a915bb463..00000000000
--- a/keyboards/mechmini/v1/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/mehkee96/config.h b/keyboards/mehkee96/config.h
index afc9d0a7b17..dc8c593ada9 100644
--- a/keyboards/mehkee96/config.h
+++ b/keyboards/mehkee96/config.h
@@ -6,8 +6,8 @@
#define VENDOR_ID 0x20A0
#define PRODUCT_ID 0x422D
#define DEVICE_VER 0x0200
-#define MANUFACTURER mehkee
-#define PRODUCT 96kee
+#define MANUFACTURER Mehkee
+#define PRODUCT 96KEE
/* matrix size */
#define MATRIX_ROWS 8
diff --git a/keyboards/mehkee96/usbconfig.h b/keyboards/mehkee96/usbconfig.h
deleted file mode 100644
index 85a915bb463..00000000000
--- a/keyboards/mehkee96/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/melody96/keymaps/konstantin/rules.mk b/keyboards/melody96/keymaps/konstantin/rules.mk
index 995402cb053..5b36eef2cba 100644
--- a/keyboards/melody96/keymaps/konstantin/rules.mk
+++ b/keyboards/melody96/keymaps/konstantin/rules.mk
@@ -3,6 +3,7 @@ BOOTMAGIC_ENABLE = no
COMMAND_ENABLE = yes
CONSOLE_ENABLE = no
EXTRAKEY_ENABLE = yes
+GRAVE_ESC_ENABLE = no
MOUSEKEY_ENABLE = yes
NKRO_ENABLE = yes
RGBLIGHT_ENABLE = yes
diff --git a/keyboards/miller/gm862/config.h b/keyboards/miller/gm862/config.h
index fb44ed6c865..1a8eb265d97 100644
--- a/keyboards/miller/gm862/config.h
+++ b/keyboards/miller/gm862/config.h
@@ -28,11 +28,11 @@
#define UNUSED_PINS
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
+
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
-# define NO_ACTION_MACRO
-# define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 3
#ifdef RGB_MATRIX_ENABLE
diff --git a/keyboards/minidox/keymaps/bepo/config.h b/keyboards/minidox/keymaps/bepo/config.h
new file mode 100644
index 00000000000..7338c24c680
--- /dev/null
+++ b/keyboards/minidox/keymaps/bepo/config.h
@@ -0,0 +1,6 @@
+#pragma once
+
+#define USE_SERIAL
+
+#define EE_HANDS
+#define IGNORE_MOD_TAP_INTERRUPT
diff --git a/keyboards/minidox/keymaps/bepo/keymap.c b/keyboards/minidox/keymaps/bepo/keymap.c
new file mode 100644
index 00000000000..95b9ef30c0a
--- /dev/null
+++ b/keyboards/minidox/keymaps/bepo/keymap.c
@@ -0,0 +1,109 @@
+#include QMK_KEYBOARD_H
+#include "keymap_bepo.h"
+
+enum layers {
+ _BEPO,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+#define TABLO LT(_LOWER, KC_TAB)
+#define ENTRA LT(_RAISE, KC_ENTER)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* BEPO
+ *
+ * ,----------------------------------. ,----------------------------------.
+ * | B | W | P | O | ’ | | ^ | V | D | L | J |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | A | U | I | E | , | | C | T | S | R | N |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | Z/GUI| Y/Alt| X/Ctl| ./Sft| K | | M | Q/Sft| G/Ctl| H/Alt| F/GUI|
+ * `----------------------------------' `----------------------------------'
+ * ,------.------.------. ,------,------.------.
+ * | Del | Tab | | | |Enter |Escape|
+ * | | LOWER| Space| |BckSpc|RAISE | |
+ * `------'------| | | |------'------'
+ * | | | |
+ * `------' `------'
+ */
+[_BEPO] = LAYOUT(
+ BP_B, BP_W, BP_P, BP_O, BP_APOS, BP_DCRC, BP_V , BP_D, BP_L, BP_J,
+ BP_A, BP_U, BP_I, BP_E, BP_COMMA, BP_C, BP_T, BP_S, BP_R, BP_N,
+ LGUI_T(BP_Z), ALT_T(BP_Y), CTL_T(BP_X), SFT_T(BP_DOT), BP_K, BP_M, SFT_T(BP_Q), CTL_T(BP_G), ALT_T(BP_H), LGUI_T(BP_F),
+ KC_DEL, TABLO, KC_SPC, KC_BSPC, ENTRA , KC_ESC
+),
+
+/* Lower.
+ *
+ * ,----------------------------------. ,----------------------------------.
+ * | | | É | & | œ | È | | PgUp | Home | Up | End |ScrlUp|
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | æ | Ù | ¨ | € | $ | | PgDn | Left | Down | Right|ScrlDn|
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | À | Alt | Ctl | Shift| Ç | | | Shift| Ctl | Alt | |
+ * `----------------------------------' `----------------------------------'
+ * ,------,------,------. ,------,------,------.
+ * | | | | | | | |
+ * `------'------| | | |------'------'
+ * | | | |
+ * `------' `------'
+ */
+[_LOWER] = LAYOUT(
+ ALGR(BP_B), BP_E_ACUTE, ALGR(BP_P), ALGR(BP_O), BP_E_GRAVE, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_MS_WH_UP,
+ ALGR(BP_A), ALGR(BP_U), ALGR(BP_I), ALGR(BP_E), BP_DOLLAR, KC_PGDOWN, KC_LEFT, KC_DOWN, KC_RIGHT, KC_MS_WH_DOWN,
+ BP_AGRV, KC_LALT, KC_LCTL, KC_LSFT, BP_CCED, _______, KC_LSFT, KC_LCTL, KC_LALT, _______,
+ _______, _______, _______, _______, _______, _______
+),
+
+/* Raise
+ *
+ * ,----------------------------------. ,----------------------------------.
+ * | " | < | > | ( | ) | | @ | + | - | / | * |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | ` | { | } | [ | ] | | ~ | = | % | \ | # |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | | | Alt | Ctl | Shift| ' | | | Shift| Ctl | Alt | & |
+ * `----------------------------------' `----------------------------------'
+ * ,------,------,------. ,------,------,------.
+ * | | | | | | | |
+ * `------'------| _ | | |------'------'
+ * | | | |
+ * `------' `------'
+ */
+[_RAISE] = LAYOUT(
+ BP_DQOT, ALGR(BP_LGIL), ALGR(BP_RGIL), BP_LPRN, BP_RPRN, BP_AT, BP_PLUS, BP_MINUS, BP_SLASH, BP_ASTR,
+ S(BP_PERCENT), ALGR(BP_Y), ALGR(BP_X), ALGR(BP_LPRN), ALGR(BP_RPRN), ALGR(BP_K), BP_EQUAL, BP_PERCENT, ALGR(BP_A_GRAVE), S(BP_DOLLAR),
+ ALGR(BP_B), KC_LALT, KC_LCTL, KC_LSFT, ALGR(BP_COMM), _______, KC_LSFT, KC_LCTL, KC_LALT, ALGR(BP_P),
+ _______, _______, ALGR(KC_SPC), _______, _______, _______
+),
+
+/* Adjust (Lower + Raise)
+ * (GUI, ALT, Ctrl, Shft ONLY on left-hand home row)
+ *
+ * ,----------------------------------. ,----------------------------------.
+ * | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * | F11 | Alt | Ctl | Shift| | | | Shift| Ctl | Alt | F12 |
+ * `----------------------------------' `----------------------------------'
+ * ,------,------,------. ,------,------,------.
+ * | | | | | | | |
+ * `------'------| | | |------'------'
+ * | | | |
+ * `------' `------'
+ */
+[_ADJUST] = LAYOUT(
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,
+ S(BP_DQOT), S(BP_LGIL), S(BP_RGIL), S(BP_LPRN), S(BP_RPRN), S(BP_AT), S(BP_PLUS), S(BP_MINUS), S(BP_SLASH), S(BP_ASTR),
+ KC_F11, KC_LALT, KC_LCTL, KC_LSFT, _______, _______, KC_LSFT, KC_LCTL, KC_LALT, KC_F12 ,
+ _______, _______, _______, _______, _______, _______
+)
+};
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+}
diff --git a/keyboards/minidox/keymaps/bepo/readme.md b/keyboards/minidox/keymaps/bepo/readme.md
new file mode 100644
index 00000000000..f928c94471f
--- /dev/null
+++ b/keyboards/minidox/keymaps/bepo/readme.md
@@ -0,0 +1,31 @@
+# MiniDox Bepo
+
+As the minidox has a restricted number of keys as compared to regular keyboards, some adjustments were made.
+These adjustments allow for improved ergonomics when typing English and programming languages (in particular javascript).
+
+>Keys have been grouped and rearranged to meet the needs of principals programming usages. Most used groups are placed at the opposite of thumb layout-activation key, not to seek the same hand too much:
+ 1. **Arrows/Navigation:** most used with `2.` after standard characters. To navigate comfortably during a long time, the group is placed at the opposite of the thumb-activated layout key.
+ 2. **Programming blocks characters:** most used with `1.` after standard characters. *Group placed at the opposite of the thumb-activated layout key*.
+ 3. **Operators:** less used than navigation. *Same side of the thumb-activated layout key*.
+ 4. **French special characters:** to keep basic characters on main layout and because they are less used in programming and english, french special characters have been moved to a specific layout, counter to Bepo's original main layout. *Same side of the thumb-activated layout key.*
+
+*Here is a list of other ergonomic choices :*
+
+- `Alt` both sides (instead of `AltGr`), as special characters are now handled by layouts, and to comfortably get all shortcuts with both hands (e.g. `alt/tab`...).
+- Numbers on home row, and Function keys on corresponding upper row.
+- Greater/less-than-sign in place of `«` `»`, for easier programming, and because the majority of OS and softwares replace `"` with `«` `»`.
+- Mirror `&` and `|` on little finger, lower row, raise layout (`raiser + &` on little finger is more handy than `raiser + &` on index finger).
+- `’/?` in place of `È` to keep `M` on the right hand side.
+- Better reachability for `W` `Z` `~` `backtick`...
+
+## Firmware :
+[Recent bepo firmware](https://bepo.fr/wiki/Accueil) `1.1rc2` switched generic apostrophe and typographic one.
+As the majority of OS and softwares replace **`'`** with **`’`**, I personnaly do prefer 2008 bepo firmware which keeps generic apostrophe on main layout. In fact, the apostrophe get replaced in text editors, but not in the IDEs while programming.
+Or you also can [switch them by following those instructions.](https://bepo.fr/wiki/Apostrophe)
+
+## Layout :
+
+
+#### N.B.
+I have been using and fine tuned this layout for about a year, and I really enjoy it. 🙂
+
diff --git a/keyboards/mint60/config.h b/keyboards/mint60/config.h
index 19a17a7c5e0..1b11092eb5e 100644
--- a/keyboards/mint60/config.h
+++ b/keyboards/mint60/config.h
@@ -148,6 +148,7 @@ along with this program. If not, see .
#define RGB_DI_PIN D3
#define RGBLED_NUM 8
+#define RGBLIGHT_SPLIT
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
diff --git a/keyboards/montsinger/rebound/keymaps/rossman360/keymap.c b/keyboards/montsinger/rebound/keymaps/rossman360/keymap.c
deleted file mode 100644
index 8391ec8e147..00000000000
--- a/keyboards/montsinger/rebound/keymaps/rossman360/keymap.c
+++ /dev/null
@@ -1,55 +0,0 @@
-#include QMK_KEYBOARD_H
-#include "rossman360.h"
-
-#define PGMOD LT(_NUM, KC_PGDN)
-#define TABMOD LT(_FN1, KC_TAB)
-#define SPCMOD LT(_FN1, KC_SPACE)
-#define ENTMOD LT(_FN2, KC_ENTER)
-#define ESCMOD LT(_NUM, KC_ESC)
-#define RSMOD LT(_FN1, KC_RSHIFT)
-
-enum layer_names {
- _BASE,
- _DEL,
- _FN1,
- _FN2,
- _NUM,
-};
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-
-[_BASE] = LAYOUT_ortho_4x12(
- KC_ESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , NTAB ,
- JUMPBACK, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT,
- KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_MINS,
- CMDBSP , ALTDEL , KC_NO , CTRLSP , TABMOD , PGMOD , ENTMOD , SPCMOD , MO(_DEL),KC_NO , KC_BSPC, KC_DEL
- ),
-
-[_FN1] = LAYOUT_ortho_4x12(
- _______, TAB1 , TAB2 , TAB3 , TAB4 , _______, _______, UNDO , _______, _______, _______, CTAB ,
- KC_CAPS, _______, _______, _______, _______, _______, KC_HOME, KC_LEFT, KC_UP , KC_RIGHT,KC_END , KC_NO ,
- _______, _______, XPANDR , _______, _______, _______, _______, PMERGE , KC_DOWN, _______, _______, _______,
- WREFRESH,_______, _______, _______, LWORD , RWORD , RVOLD , RVOLU , _______, _______, _______, _______
- ),
-
-[_FN2] = LAYOUT_ortho_4x12(
- _______, SPEAK1 , SPEAK2 , SPEAK3 , SPEAK4 , _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______, PARADOWN, CSPEAK, _______, _______, _______, _______, _______, _______
- ),
-
-[_DEL] = LAYOUT_ortho_4x12(
- _______, _______, _______, _______, _______, _______, _______, UNDO , _______, _______, _______, CTAB ,
- REMCAPS, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_UP ,KC_RIGHT, _______, _______,
- _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______, _______, _______,
- _______, _______, _______, KC_DEL , KC_BSPC, BWORD , _______, _______, _______, _______, _______, _______
- ),
-
-[_NUM] = LAYOUT_ortho_4x12(
- _______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_MINS, KC_EQL,
- KC_CAPS, _______, _______, _______, _______, _______, KC_MINS, KC_4 , KC_5 , KC_6 , KC_COLN, _______,
- _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, KC_1 , KC_2 , KC_3 , KC_BSLS, _______,
- _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, KC_0 , _______, _______, _______
- )
-};
diff --git a/keyboards/montsinger/rebound/readme.md b/keyboards/montsinger/rebound/readme.md
index d634408cc9a..024b4a96b7e 100755
--- a/keyboards/montsinger/rebound/readme.md
+++ b/keyboards/montsinger/rebound/readme.md
@@ -5,11 +5,12 @@
A conjoined-split 40% 4x12 ortholinear keyboard made and sold by Montsinger. [More info on Montsinger.net](https://montsinger.net).
* Keyboard Maintainer: [Rossman360](https://github.com/rossman360)
-* Hardware Supported: Pro Micro, Elite-C
+* Hardware Supported: Rebound rev1 or rev2; Pro Micro or Elite-C
* Hardware Availability: [Montsinger.net](https://montsinger.net)
Make example for this keyboard (after setting up your build environment):
- make montsinger/rebound:default
+ make montsinger/rebound/rev1:default # for rev1
+ make montsinger/rebound/rev2:default # for rev2
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)
\ No newline at end of file
diff --git a/keyboards/montsinger/rebound/rebound.h b/keyboards/montsinger/rebound/rebound.h
index 0ba4c51cebb..c9fc2627782 100644
--- a/keyboards/montsinger/rebound/rebound.h
+++ b/keyboards/montsinger/rebound/rebound.h
@@ -14,26 +14,12 @@
* along with this program. If not, see .
*/
-#pragma once
+#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
- * 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_ortho_4x12( \
- K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
- K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
- K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,\
- K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B\
- ) { \
- { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B }, \
- { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B }, \
- { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B }, \
- { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B } \
-}
+#if defined(KEYBOARD_montsinger_rebound_rev1)
+ #include "rev1.h"
+#elif defined(KEYBOARD_montsinger_rebound_rev2)
+ #include "rev2.h"
+#endif
diff --git a/keyboards/montsinger/rebound/config.h b/keyboards/montsinger/rebound/rev1/config.h
similarity index 100%
rename from keyboards/montsinger/rebound/config.h
rename to keyboards/montsinger/rebound/rev1/config.h
diff --git a/keyboards/montsinger/rebound/rev1/info.json b/keyboards/montsinger/rebound/rev1/info.json
new file mode 100644
index 00000000000..5865aa66a30
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev1/info.json
@@ -0,0 +1,61 @@
+{
+ "keyboard": "montsinger/rebound/rev1",
+ "url": "https://montsinger.net",
+ "maintainer": "rossman360",
+ "width": 13,
+ "height": 4,
+ "layouts": {
+ "LAYOUT_ortho_4x12": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+ {"x":7, "y":0},
+ {"x":8, "y":0},
+ {"x":9, "y":0},
+ {"x":10, "y":0},
+ {"x":11, "y":0},
+ {"x":12, "y":0},
+ {"x":0, "y":1},
+ {"x":1, "y":1},
+ {"x":2, "y":1},
+ {"x":3, "y":1},
+ {"x":4, "y":1},
+ {"x":5, "y":1},
+ {"x":7, "y":1},
+ {"x":8, "y":1},
+ {"x":9, "y":1},
+ {"x":10, "y":1},
+ {"x":11, "y":1},
+ {"x":12, "y":1},
+ {"x":0, "y":2},
+ {"x":1, "y":2},
+ {"x":2, "y":2},
+ {"x":3, "y":2},
+ {"x":4, "y":2},
+ {"x":5, "y":2},
+ {"x":7, "y":2},
+ {"x":8, "y":2},
+ {"x":9, "y":2},
+ {"x":10, "y":2},
+ {"x":11, "y":2},
+ {"x":12, "y":2},
+ {"x":0, "y":3},
+ {"x":1, "y":3},
+ {"x":2, "y":3},
+ {"x":3, "y":3},
+ {"x":4, "y":3},
+ {"x":5, "y":3},
+ {"x":7, "y":3},
+ {"x":8, "y":3},
+ {"x":9, "y":3},
+ {"x":10, "y":3},
+ {"x":11, "y":3},
+ {"x":12, "y":3}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/montsinger/rebound/keymaps/curry/keymap.c b/keyboards/montsinger/rebound/rev1/keymaps/curry/keymap.c
similarity index 100%
rename from keyboards/montsinger/rebound/keymaps/curry/keymap.c
rename to keyboards/montsinger/rebound/rev1/keymaps/curry/keymap.c
diff --git a/keyboards/montsinger/rebound/keymaps/curry/rules.mk b/keyboards/montsinger/rebound/rev1/keymaps/curry/rules.mk
similarity index 100%
rename from keyboards/montsinger/rebound/keymaps/curry/rules.mk
rename to keyboards/montsinger/rebound/rev1/keymaps/curry/rules.mk
diff --git a/keyboards/montsinger/rebound/keymaps/default/keymap.c b/keyboards/montsinger/rebound/rev1/keymaps/default/keymap.c
similarity index 100%
rename from keyboards/montsinger/rebound/keymaps/default/keymap.c
rename to keyboards/montsinger/rebound/rev1/keymaps/default/keymap.c
diff --git a/keyboards/montsinger/rebound/rev1/rev1.h b/keyboards/montsinger/rebound/rev1/rev1.h
new file mode 100644
index 00000000000..a4e180e2ec2
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev1/rev1.h
@@ -0,0 +1,39 @@
+/* Copyright 2020 Ross Montsinger
+ *
+ * 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 .
+ */
+
+#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
+ * 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_ortho_4x12( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,\
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B\
+ ) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B } \
+}
diff --git a/keyboards/montsinger/rebound/rev1/rules.mk b/keyboards/montsinger/rebound/rev1/rules.mk
new file mode 100644
index 00000000000..9487213e8d5
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev1/rules.mk
@@ -0,0 +1,32 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+
+LAYOUTS = ortho_4x12
+LAYOUTS_HAS_RGB = no
\ No newline at end of file
diff --git a/keyboards/montsinger/rebound/rev2/config.h b/keyboards/montsinger/rebound/rev2/config.h
new file mode 100644
index 00000000000..39f5206f7f3
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev2/config.h
@@ -0,0 +1,65 @@
+/*
+Copyright 2020 Ross Montsinger
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x552F
+#define DEVICE_VER 0x0002
+#define MANUFACTURER Montsinger
+#define PRODUCT Rebound
+#define DESCRIPTION "A conjoined Let's Split"
+
+/* key matrix size */
+
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 12
+
+/*
+ * 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 { D1, B5, B2, B6, B0 }
+#define MATRIX_COL_PINS { D0, D4, C6, D7, E6, B4, B3, B1, F7, F6, F5, F4 }
+#define UNUSED_PINS { }
+
+#define ENCODERS_PAD_A { D2 }
+#define ENCODERS_PAD_B { D3 }
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION ROW2COL
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+/* 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
+
+/* Bootmagic Lite key configuration */
+// #define BOOTMAGIC_LITE_ROW 0
+// #define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/montsinger/rebound/rev2/info.json b/keyboards/montsinger/rebound/rev2/info.json
new file mode 100644
index 00000000000..3c9cdbe82c6
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev2/info.json
@@ -0,0 +1,128 @@
+{
+ "keyboard":"montsinger/rebound/rev2",
+ "url": "https://montsinger.net",
+ "maintainer": "rossman360",
+ "width": 13,
+ "height": 4,
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+
+ {"x":7, "y":0},
+ {"x":8, "y":0},
+ {"x":9, "y":0},
+ {"x":10, "y":0},
+ {"x":11, "y":0},
+ {"x":12, "y":0},
+
+ {"x":0, "y":1},
+ {"x":1, "y":1},
+ {"x":2, "y":1},
+ {"x":3, "y":1},
+ {"x":4, "y":1},
+ {"x":5, "y":1},
+
+ {"x":7, "y":1},
+ {"x":8, "y":1},
+ {"x":9, "y":1},
+ {"x":10, "y":1},
+ {"x":11, "y":1},
+ {"x":12, "y":1},
+
+ {"x":0, "y":2},
+ {"x":1, "y":2},
+ {"x":2, "y":2},
+ {"x":3, "y":2},
+ {"x":4, "y":2},
+ {"x":5, "y":2},
+
+ {"x":7, "y":2},
+ {"x":8, "y":2},
+ {"x":9, "y":2},
+ {"x":10, "y":2},
+ {"x":11, "y":2},
+ {"x":12, "y":2},
+
+ {"x":0, "y":3},
+ {"x":1, "y":3},
+ {"x":2, "y":3},
+ {"x":3, "y":3},
+ {"x":4, "y":3},
+ {"x":5, "y":3},
+ {"x":6, "y":3},
+ {"x":7, "y":3},
+ {"x":8, "y":3},
+ {"x":9, "y":3},
+ {"x":10, "y":3},
+ {"x":11, "y":3},
+ {"x":12, "y":3}
+ ]
+ },
+ "LAYOUT_ortho_4x12": {
+ "layout": [
+
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+
+ {"x":7, "y":0},
+ {"x":8, "y":0},
+ {"x":9, "y":0},
+ {"x":10, "y":0},
+ {"x":11, "y":0},
+ {"x":12, "y":0},
+
+ {"x":0, "y":1},
+ {"x":1, "y":1},
+ {"x":2, "y":1},
+ {"x":3, "y":1},
+ {"x":4, "y":1},
+ {"x":5, "y":1},
+
+ {"x":7, "y":1},
+ {"x":8, "y":1},
+ {"x":9, "y":1},
+ {"x":10, "y":1},
+ {"x":11, "y":1},
+ {"x":12, "y":1},
+
+ {"x":0, "y":2},
+ {"x":1, "y":2},
+ {"x":2, "y":2},
+ {"x":3, "y":2},
+ {"x":4, "y":2},
+ {"x":5, "y":2},
+
+ {"x":7, "y":2},
+ {"x":8, "y":2},
+ {"x":9, "y":2},
+ {"x":10, "y":2},
+ {"x":11, "y":2},
+ {"x":12, "y":2},
+
+ {"x":0, "y":3},
+ {"x":1, "y":3},
+ {"x":2, "y":3},
+ {"x":3, "y":3},
+ {"x":4, "y":3},
+ {"x":5, "y":3},
+
+ {"x":7, "y":3},
+ {"x":8, "y":3},
+ {"x":9, "y":3},
+ {"x":10, "y":3},
+ {"x":11, "y":3},
+ {"x":12, "y":3}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/montsinger/rebound/rev2/keymaps/default/keymap.c b/keyboards/montsinger/rebound/rev2/keymaps/default/keymap.c
new file mode 100644
index 00000000000..57feb197263
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev2/keymaps/default/keymap.c
@@ -0,0 +1,161 @@
+#include QMK_KEYBOARD_H
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+
+enum layer_names {
+ _QWERTY,
+ _COLEMAK,
+ _DVORAK,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+enum custom_keycodes {
+ QWERTY = SAFE_RANGE,
+ COLEMAK,
+ DVORAK
+};
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+#define ADJUST MO(_ADJUST)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = LAYOUT_all(
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT ,
+ ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_ENT, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+),
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | R | S | T | D | H | N | E | I | O | ' |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_COLEMAK] = LAYOUT_all(
+ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
+ KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT ,
+ ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_ENT, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+),
+
+/* Dvorak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab | ' | , | . | P | Y | F | G | C | R | L | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | O | E | U | I | D | H | T | N | S | / |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_DVORAK] = LAYOUT_all(
+ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC,
+ KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH,
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT ,
+ ADJUST, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_ENT, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+),
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = LAYOUT_all(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+),
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = LAYOUT_all(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+),
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * | | Reset| | | | | | | | | | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = LAYOUT_all(
+ _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL,
+ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+)
+
+
+};
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+}
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case QWERTY:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_QWERTY);
+ }
+ break;
+ case COLEMAK:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_COLEMAK);
+ }
+ break;
+ case DVORAK:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_DVORAK);
+ }
+ break;
+ }
+ return true;
+}
diff --git a/keyboards/montsinger/rebound/rev2/keymaps/rossman360/keymap.c b/keyboards/montsinger/rebound/rev2/keymaps/rossman360/keymap.c
new file mode 100644
index 00000000000..23bd7e4ec96
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev2/keymaps/rossman360/keymap.c
@@ -0,0 +1,57 @@
+#include QMK_KEYBOARD_H
+#include "rossman360.h"
+
+#define PGMOD LT(_NUM, KC_PGDN)
+#define TABMOD LT(_FN1, KC_TAB)
+#define SPCMOD LT(_FN1, KC_SPACE)
+#define ENTMOD LT(_FN2, KC_ENTER)
+#define ESCMOD LT(_NUM, KC_ESC)
+#define RSMOD LT(_FN1, KC_RSHIFT)
+
+enum layer_names {
+ _BASE,
+ _DEL,
+ _FN1,
+ _FN2,
+ _NUM,
+};
+
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[_BASE] = LAYOUT_all(
+ KC_ESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , NTAB ,
+ JUMPBACK, KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT,
+ KC_LSFT , KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_MINS,
+ CMDBSP , ALTDEL , KC_NO , CTRLSP , TABMOD , PGMOD , KC_Y , ENTMOD , SPCMOD , MO(_DEL),KC_NO , KC_BSPC, KC_DEL
+ ),
+
+[_FN1] = LAYOUT_all(
+ _______, TAB1 , TAB2 , TAB3 , TAB4 , _______, _______, UNDO , _______, _______, _______, CTAB ,
+ KC_CAPS, _______, _______, _______, _______, _______, KC_HOME, KC_LEFT, KC_UP , KC_RIGHT,KC_END , KC_NO ,
+ _______, _______, XPANDR , _______, _______, _______, _______, PMERGE , KC_DOWN, _______, _______, _______,
+ WREFRESH,_______, _______, _______, LWORD , RWORD , KC_Y , RVOLD , RVOLU , _______, _______, _______, _______
+ ),
+
+[_FN2] = LAYOUT_all(
+ _______, SPEAK1 , SPEAK2 , SPEAK3 , SPEAK4 , _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, PARADOWN, CSPEAK, KC_Y , _______, _______, _______, _______, _______, _______
+ ),
+
+[_DEL] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, UNDO , _______, _______, _______, CTAB ,
+ REMCAPS, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_UP ,KC_RIGHT, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______, _______, _______,
+ _______, _______, _______, KC_DEL , KC_BSPC, BWORD , KC_Y , _______, _______, _______, _______, _______, _______
+ ),
+
+[_NUM] = LAYOUT_all(
+ _______, KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_MINS, KC_EQL,
+ KC_CAPS, _______, _______, _______, _______, _______, KC_MINS, KC_4 , KC_5 , KC_6 , KC_COLN, _______,
+ _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, KC_1 , KC_2 , KC_3 , KC_BSLS, _______,
+ _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, KC_Y , _______, _______, KC_0 , _______, _______, _______
+ )
+};
diff --git a/keyboards/montsinger/rebound/rev2/rev2.h b/keyboards/montsinger/rebound/rev2/rev2.h
new file mode 100644
index 00000000000..16e0da23c9d
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev2/rev2.h
@@ -0,0 +1,53 @@
+/* Copyright 2020 Ross Montsinger
+ *
+ * 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 .
+ */
+
+#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
+ * 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_ortho_4x12( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,\
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B\
+ ) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \
+}
+
+#define LAYOUT_all( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B,\
+ K30, K31, K32, K33, K34, K35, K40, K36, K37, K38, K39, K3A, K3B\
+ ) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B }, \
+ { K40, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \
+}
diff --git a/keyboards/montsinger/rebound/rev2/rules.mk b/keyboards/montsinger/rebound/rev2/rules.mk
new file mode 100644
index 00000000000..f5505e25c4c
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev2/rules.mk
@@ -0,0 +1,33 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+ENCODER_ENABLE = yes
+
+LAYOUTS = ortho_4x12
+LAYOUTS_HAS_RGB = no
\ No newline at end of file
diff --git a/keyboards/montsinger/rebound/rules.mk b/keyboards/montsinger/rebound/rules.mk
index efa31330399..d277d184e18 100644
--- a/keyboards/montsinger/rebound/rules.mk
+++ b/keyboards/montsinger/rebound/rules.mk
@@ -1,32 +1 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-# Teensy halfkay
-# Pro Micro caterina
-# Atmel DFU atmel-dfu
-# LUFA DFU lufa-dfu
-# QMK DFU qmk-dfu
-# ATmega32A bootloadHID
-# ATmega328P USBasp
-BOOTLOADER = atmel-dfu
-
-BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
-# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-NKRO_ENABLE = no # USB Nkey Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
-MIDI_ENABLE = no # MIDI support
-BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = no # Audio output on port C6
-FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
-HD44780_ENABLE = no # Enable support for HD44780 based LCDs
-
-LAYOUTS = ortho_4x12
-LAYOUTS_HAS_RGB=no
+DEFAULT_FOLDER = montsinger/rebound/rev1
diff --git a/keyboards/mountainblocks/mb17/config.h b/keyboards/mountainblocks/mb17/config.h
new file mode 100644
index 00000000000..f469c9bd46a
--- /dev/null
+++ b/keyboards/mountainblocks/mb17/config.h
@@ -0,0 +1,151 @@
+/*
+Copyright 2020 mechmerlin
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x4D42
+#define PRODUCT_ID 0x0017
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Mountainblocks
+#define PRODUCT MB17
+#define DESCRIPTION A custom numpad
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 4
+
+/*
+ * 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 { F4, B1, B3, B2, B6 }
+#define MATRIX_COL_PINS { F7, E6, D7, C6 }
+#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
+
+
+
+/* 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 userful 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
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+/* defined by default; to change, uncomment and set to the combination you want */
+// #define IS_COMMAND() (get_mods() == MOD_MASK_SHIFT)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP H
+//#define MAGIC_KEY_HELP_ALT SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER0_ALT GRAVE
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER B
+//#define MAGIC_KEY_BOOTLOADER_ALT ESC
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_EEPROM_CLEAR BSPACE
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+
+/* disable these deprecated features by default */
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
diff --git a/keyboards/mountainblocks/mb17/info.json b/keyboards/mountainblocks/mb17/info.json
new file mode 100644
index 00000000000..02f40218493
--- /dev/null
+++ b/keyboards/mountainblocks/mb17/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "MB17",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 4,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_numpad_5x4": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}, {"x":3, "y":1, "h":2}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2, "y":3}, {"x":0, "y":4, "w":2}, {"x":2, "y":4}, {"x":3, "y":3, "h":2}]
+ }
+ }
+}
diff --git a/keyboards/mountainblocks/mb17/keymaps/default/keymap.c b/keyboards/mountainblocks/mb17/keymaps/default/keymap.c
new file mode 100644
index 00000000000..13c8cf81285
--- /dev/null
+++ b/keyboards/mountainblocks/mb17/keymaps/default/keymap.c
@@ -0,0 +1,60 @@
+/* Copyright 2020 mechmerlin
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┬───┬───┬───┐
+ * │TG1│ / │ * │ - │
+ * ├───┼───┼───┼───┤
+ * │ 7 │ 8 │ 9 │ │
+ * ├───┼───┼───┤ + │
+ * │ 4 │ 5 │ 6 │ │
+ * ├───┼───┼───┼───┤
+ * │ 1 │ 2 │ 3 │ │
+ * ├───┴───┼───┤Ent│
+ * │ 0 │ . │ │
+ * └───────┴───┴───┘
+ */
+ [0] = LAYOUT_numpad_5x4(
+ TG(1), KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_P1, KC_P2, KC_P3,
+ KC_P0, KC_PDOT, KC_PENT
+ ),
+
+ /*
+ * ┌───┬───┬───┬───┐
+ * │TG1│ / │ * │ - │
+ * ┌───┬───┬───┐───┤
+ * │Hom│ ↑ │PgU│ │
+ * ├───┼───┼───┤ + │
+ * │ ← │ │ → │ │
+ * ├───┼───┼───┤───┤
+ * │End│ ↓ │PgD│ │
+ * ├───┴───┼───┤Ent│
+ * │Insert │Del│ │
+ * └───────┴───┘───┘
+ */
+ [1] = LAYOUT_numpad_5x4(
+ _______, _______, _______, _______,
+ KC_HOME, KC_UP, KC_PGUP,
+ KC_LEFT, XXXXXXX, KC_RGHT, _______,
+ KC_END, KC_DOWN, KC_PGDN,
+ KC_INS, KC_DEL, _______
+ )
+};
\ No newline at end of file
diff --git a/keyboards/mountainblocks/mb17/keymaps/default/readme.md b/keyboards/mountainblocks/mb17/keymaps/default/readme.md
new file mode 100644
index 00000000000..fb963c63993
--- /dev/null
+++ b/keyboards/mountainblocks/mb17/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for mb17
diff --git a/keyboards/mountainblocks/mb17/keymaps/via/keymap.c b/keyboards/mountainblocks/mb17/keymaps/via/keymap.c
new file mode 100644
index 00000000000..5cee19cb234
--- /dev/null
+++ b/keyboards/mountainblocks/mb17/keymaps/via/keymap.c
@@ -0,0 +1,76 @@
+/* Copyright 2020 mechmerlin
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┬───┬───┬───┐
+ * │TG1│ / │ * │ - │
+ * ├───┼───┼───┼───┤
+ * │ 7 │ 8 │ 9 │ │
+ * ├───┼───┼───┤ + │
+ * │ 4 │ 5 │ 6 │ │
+ * ├───┼───┼───┼───┤
+ * │ 1 │ 2 │ 3 │ │
+ * ├───┴───┼───┤Ent│
+ * │ 0 │ . │ │
+ * └───────┴───┴───┘
+ */
+ [0] = LAYOUT_numpad_5x4(
+ TG(1), KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_P1, KC_P2, KC_P3,
+ KC_P0, KC_PDOT, KC_PENT
+ ),
+
+ /*
+ * ┌───┬───┬───┬───┐
+ * │TG1│ / │ * │ - │
+ * ┌───┬───┬───┐───┤
+ * │Hom│ ↑ │PgU│ │
+ * ├───┼───┼───┤ + │
+ * │ ← │ │ → │ │
+ * ├───┼───┼───┤───┤
+ * │End│ ↓ │PgD│ │
+ * ├───┴───┼───┤Ent│
+ * │Insert │Del│ │
+ * └───────┴───┘───┘
+ */
+ [1] = LAYOUT_numpad_5x4(
+ _______, _______, _______, _______,
+ KC_HOME, KC_UP, KC_PGUP,
+ KC_LEFT, XXXXXXX, KC_RGHT, _______,
+ KC_END, KC_DOWN, KC_PGDN,
+ KC_INS, KC_DEL, _______
+ ),
+
+ [2] = LAYOUT_numpad_5x4(
+ _______, _______, _______, _______,
+ _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______,
+ _______, _______, _______
+ ),
+
+ [3] = LAYOUT_numpad_5x4(
+ _______, _______, _______, _______,
+ _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______,
+ _______, _______, _______
+ )
+};
\ No newline at end of file
diff --git a/keyboards/mountainblocks/mb17/keymaps/via/rules.mk b/keyboards/mountainblocks/mb17/keymaps/via/rules.mk
new file mode 100644
index 00000000000..36b7ba9cbc9
--- /dev/null
+++ b/keyboards/mountainblocks/mb17/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/mountainblocks/mb17/mb17.c b/keyboards/mountainblocks/mb17/mb17.c
new file mode 100644
index 00000000000..abc6183cbfa
--- /dev/null
+++ b/keyboards/mountainblocks/mb17/mb17.c
@@ -0,0 +1,17 @@
+/* Copyright 2020 mechmerlin
+ *
+ * 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 .
+ */
+
+#include "mb17.h"
diff --git a/keyboards/mountainblocks/mb17/mb17.h b/keyboards/mountainblocks/mb17/mb17.h
new file mode 100644
index 00000000000..dbfb68a9321
--- /dev/null
+++ b/keyboards/mountainblocks/mb17/mb17.h
@@ -0,0 +1,35 @@
+/* Copyright 2020 mechmerlin
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+#define ___ KC_NO
+
+#define LAYOUT_numpad_5x4( \
+ k00, k01, k02, k03, \
+ k10, k11, k12, \
+ k20, k21, k22, k23, \
+ k30, k31, k32, \
+ k41, k42, k43 \
+){ \
+ { k00, k01, k02, k03 }, \
+ { k10, k11, k12, ___ }, \
+ { k20, k21, k22, k23 }, \
+ { k30, k31, k32, ___ }, \
+ { ___, k41, k42, k43 } \
+}
diff --git a/keyboards/mountainblocks/mb17/readme.md b/keyboards/mountainblocks/mb17/readme.md
new file mode 100644
index 00000000000..c1dfd2b88a9
--- /dev/null
+++ b/keyboards/mountainblocks/mb17/readme.md
@@ -0,0 +1,13 @@
+# MB17
+
+A single layout sandwich numpad.
+
+* Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin)
+* Hardware Supported: MB17
+* Hardware Availability: TBD
+
+Make example for this keyboard (after setting up your build environment):
+
+ make mountainblocks/mb17:default
+
+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).
diff --git a/keyboards/mountainblocks/mb17/rules.mk b/keyboards/mountainblocks/mb17/rules.mk
new file mode 100644
index 00000000000..0bdce956549
--- /dev/null
+++ b/keyboards/mountainblocks/mb17/rules.mk
@@ -0,0 +1,32 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
diff --git a/keyboards/mt40/config.h b/keyboards/mt40/config.h
index 5e3eaf935b2..3efa18292b3 100644
--- a/keyboards/mt40/config.h
+++ b/keyboards/mt40/config.h
@@ -27,7 +27,7 @@ along with this program. If not, see .
#define DEVICE_VER 0x0001
#define MANUFACTURER ThomasDehaeze
-#define PRODUCT mt40
+#define PRODUCT MT40
#define DESCRIPTION A Planck clone
diff --git a/keyboards/mt40/usbconfig.h b/keyboards/mt40/usbconfig.h
deleted file mode 100644
index e1f5f2ea42a..00000000000
--- a/keyboards/mt40/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'T', 'h', 'o', 'm', 'a', 's', 'D', 'e', 'h', 'a', 'e', 'z', 'e'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'c', 'u', 's', 't', 'o', 'm', '4', '8'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/murcielago/info.json b/keyboards/murcielago/info.json
new file mode 100644
index 00000000000..00eb326296f
--- /dev/null
+++ b/keyboards/murcielago/info.json
@@ -0,0 +1,73 @@
+{
+ "keyboard_name": "Murciélago",
+ "url": "",
+ "maintainer": "elagil",
+ "width": 15,
+ "height": 5.75,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"0,0", "x":0, "y":0.425},
+ {"label":"0,1", "x":1, "y":0.25},
+ {"label":"0,2", "x":2, "y":0.125},
+ {"label":"0,3", "x":3, "y":0.0},
+ {"label":"0,4", "x":4, "y":0.125},
+ {"label":"0,5", "x":5, "y":0.25},
+ {"label":"6,0", "x":9, "y":0.25},
+ {"label":"6,1", "x":10, "y":0.125},
+ {"label":"6,2", "x":11, "y":0.0},
+ {"label":"6,3", "x":12, "y":0.125},
+ {"label":"6,4", "x":13, "y":0.25},
+ {"label":"6,5", "x":14, "y":0.425},
+ {"label":"1,0", "x":0, "y":1.425},
+ {"label":"1,1", "x":1, "y":1.25},
+ {"label":"1,2", "x":2, "y":1.125},
+ {"label":"1,3", "x":3, "y":1.0},
+ {"label":"1,4", "x":4, "y":1.125},
+ {"label":"1,5", "x":5, "y":1.25},
+ {"label":"7,0", "x":9, "y":1.25},
+ {"label":"7,1", "x":10, "y":1.125},
+ {"label":"7,2", "x":11, "y":1.0},
+ {"label":"7,3", "x":12, "y":1.125},
+ {"label":"7,4", "x":13, "y":1.25},
+ {"label":"7,5", "x":14, "y":1.425},
+ {"label":"2,0", "x":0, "y":2.425},
+ {"label":"2,1", "x":1, "y":2.25},
+ {"label":"2,2", "x":2, "y":2.125},
+ {"label":"2,3", "x":3, "y":2.0},
+ {"label":"2,4", "x":4, "y":2.125},
+ {"label":"2,5", "x":5, "y":2.25},
+ {"label":"8,0", "x":9, "y":2.25},
+ {"label":"8,1", "x":10, "y":2.125},
+ {"label":"8,2", "x":11, "y":2.0},
+ {"label":"8,3", "x":12, "y":2.125},
+ {"label":"8,4", "x":13, "y":2.25},
+ {"label":"8,5", "x":14, "y":2.425},
+ {"label":"3,0", "x":0, "y":3.425},
+ {"label":"3,1", "x":1, "y":3.25},
+ {"label":"3,2", "x":2, "y":3.125},
+ {"label":"3,3", "x":3, "y":3.0},
+ {"label":"3,4", "x":4, "y":3.125},
+ {"label":"3,5", "x":5, "y":3.25},
+ {"label":"5,5", "x":6, "y":3.25},
+ {"label":"11,0", "x":8, "y":3.25},
+ {"label":"9,0", "x":9, "y":3.25},
+ {"label":"9,1", "x":10, "y":3.125},
+ {"label":"9,2", "x":11, "y":3.0},
+ {"label":"9,3", "x":12, "y":3.125},
+ {"label":"9,4", "x":13, "y":3.25},
+ {"label":"9,5", "x":14, "y":3.425},
+ {"label":"4,1", "x":1.7, "y":4.25},
+ {"label":"4,2", "x":2.7, "y":4.05},
+ {"label":"4,3", "x":3.7, "y":4.15},
+ {"label":"4,4", "x":4.7, "y":4.35},
+ {"label":"4,5", "x":5.8, "y":4.25, "h":1.5},
+ {"label":"10,0", "x":8.2, "y":4.25, "h":1.5},
+ {"label":"10,1", "x":9.3, "y":4.35},
+ {"label":"10,2", "x":10.3, "y":4.15},
+ {"label":"10,3", "x":11.3, "y":4.05},
+ {"label":"10,4", "x":12.3, "y":4.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/murcielago/murcielago.c b/keyboards/murcielago/murcielago.c
new file mode 100644
index 00000000000..30215c69cd5
--- /dev/null
+++ b/keyboards/murcielago/murcielago.c
@@ -0,0 +1,17 @@
+/* Copyright 2020 elagil
+ *
+ * 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 .
+ */
+
+#include "murcielago.h"
\ No newline at end of file
diff --git a/keyboards/murcielago/murcielago.h b/keyboards/murcielago/murcielago.h
new file mode 100644
index 00000000000..458df972f7e
--- /dev/null
+++ b/keyboards/murcielago/murcielago.h
@@ -0,0 +1,49 @@
+/* Copyright 2020 elagil
+ *
+ * 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 .
+ */
+
+#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.k
+ */
+
+#define LAYOUT( \
+ L00, L01, L02, L03, L04, L05, R01, R02, R03, R04, R05, R06, \
+ L10, L11, L12, L13, L14, L15, R11, R12, R13, R14, R15, R16, \
+ L20, L21, L22, L23, L24, L25, R21, R22, R23, R24, R25, R26, \
+ L30, L31, L32, L33, L34, L35, L36, R30, R31, R32, R33, R34, R35, R36, \
+ L41, L42, L43, L44, L45, R41, R42, R43, R44, R45 \
+) { \
+ { L00, L01, L02, L03, L04, L05 },\
+ { L10, L11, L12, L13, L14, L15 },\
+ { L20, L21, L22, L23, L24, L25 },\
+ { L30, L31, L32, L33, L34, L35 },\
+ { KC_NO, L41, L42, L43, L44, L45 },\
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, L36 },\
+ { R01, R02, R03, R04, R05, R06 },\
+ { R11, R12, R13, R14, R15, R16 },\
+ { R21, R22, R23, R24, R25, R26 },\
+ { R31, R32, R33, R34, R35, R36 },\
+ { R41, R42, R43, R44, R45, KC_NO },\
+ { R30, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \
+}
diff --git a/keyboards/murcielago/readme.md b/keyboards/murcielago/readme.md
new file mode 100644
index 00000000000..d7e99ee94de
--- /dev/null
+++ b/keyboards/murcielago/readme.md
@@ -0,0 +1,16 @@
+# Murciélago (the bat)
+
+The Murciélago is a split ortholinear keyboard with 60 keys in a 6x4 layout + 6 thumb keys (per side). At the upper thumb positions, rotary encoders can be used instead of switches.
+
+* Keyboard Maintainer: [elagil](https://github.com/elagil)
+* Hardware Supported: [murcielago](https://github.com/elagil/murcielago)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make murcielago/rev1:default
+
+For compiling a via-compatible keymap, use:
+
+ make murcielago/rev1:via
+
+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).
diff --git a/keyboards/murcielago/rev1/config.h b/keyboards/murcielago/rev1/config.h
new file mode 100644
index 00000000000..425c79e6c9f
--- /dev/null
+++ b/keyboards/murcielago/rev1/config.h
@@ -0,0 +1,97 @@
+/*
+Copyright 2020 elagil
+
+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 .
+*/
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x6166 // af
+#define PRODUCT_ID 0x0001
+#define DEVICE_VER 0x0002
+#define MANUFACTURER elagil
+#define PRODUCT Murciélago
+#define DESCRIPTION A custom keyboard with 60 keys
+
+/* key matrix size */
+#define MATRIX_ROWS 12
+#define MATRIX_COLS 6
+
+/* split options, use EEPROM for side detection */
+#define EE_HANDS
+#define SPLIT_USB_DETECT
+
+/*
+ * 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 { B4, D5, B3, B2, B1, B0 }
+#define MATRIX_COL_PINS { C6, B6, B5, D7, D6, D4 }
+#define MATRIX_ROW_PINS_RIGHT { B3, B7, D4, B6, C6, C7 }
+#define MATRIX_COL_PINS_RIGHT { D6, D7, D3, B2, B1, B0 }
+
+#define ENCODERS_PAD_A { F0 }
+#define ENCODERS_PAD_B { F1 }
+#define ENCODERS_PAD_A_RIGHT { F6 }
+#define ENCODERS_PAD_B_RIGHT { F7 }
+
+#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 E6
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+/* 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
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+
+/* disable these deprecated features by default */
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
+/* Bootmagic Lite key configuration */
+// #define BOOTMAGIC_LITE_ROW 0
+// #define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/murcielago/rev1/keymaps/default/keymap.c b/keyboards/murcielago/rev1/keymaps/default/keymap.c
new file mode 100644
index 00000000000..b3abed76316
--- /dev/null
+++ b/keyboards/murcielago/rev1/keymaps/default/keymap.c
@@ -0,0 +1,130 @@
+#include QMK_KEYBOARD_H
+
+enum layers {
+ BASE,
+ _RAISE,
+ _LOWER,
+ _POWER
+};
+
+#define PRE_WRD LCTL(KC_LEFT) // jump to next word
+#define NXT_WRD LCTL(KC_RGHT) // jump to previous word
+
+#define NXT_WDL LCTL(KC_DEL) // delete next word
+#define PRE_WDL LCTL(KC_BSPC) // delete previous word
+
+#define KC_EURO ALGR(KC_5)
+#define LA_CAP MT(MOD_LALT, KC_CAPS) // Left alt on hold, caps lock on tap
+#define RA_ENT MT(MOD_RALT, KC_ENT) // Right alt on hold, enter on tap
+
+#define RAISE MO(_RAISE) // Raise layer access
+#define LOWER MO(_LOWER) // Lower layer access
+#define POWER MO(_POWER) // Power layer access (raise and lower)
+
+/*
+ * This default keymap is aimed at users of the US international layout
+ */
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* BASE
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | =+ | 1! | 2@ | 3# | 4$ | 5% | | 6^ | 7& | 8* | 9( | 0) | -_ |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | [{ | Q | W | E | R | T | | Y | U | I | O | P | }] |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Del | A | S | D | F | G | | H | J | K | L | ;: | '" |
+ * |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
+ * | Sft | Z | X | C | V | B | GEsc | | Tab | N | M | ,< | .> | /? | Sft |
+ * `------------------------------------------------' `------------------------------------------------'
+ * | LA/CL| LGUI |LOWER | Back | Ctrl | |RA/Ent|Space |RAISE | RGUI | Play |
+ * `----------------------------------' `----------------------------------'
+ */
+ [BASE] = LAYOUT( /* qwerty */
+ KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ KC_LBRC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RBRC,
+ KC_DEL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_GESC, KC_TAB, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ LA_CAP, KC_LGUI, LOWER, KC_BSPC, KC_LCTL, RA_ENT, KC_SPC, RAISE, KC_RGUI, KC_MPLY
+ ),
+
+ /* RAISE
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | RST | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | ! | @ | # | $ | % | | |PRE W | UP |NXT W | | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | ( | [ | { | < | | | LEFT | DOWN |RIGHT | | |
+ * |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
+ * | | ~ | = | + | \ | | | | | |DEL PW| Ins |DEL NW| | |
+ * `------------------------------------------------' `------------------------------------------------'
+ * | | |POWER | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_RAISE] = LAYOUT( /* raise layer */
+ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, XXXXXXX, PRE_WRD, KC_UP, NXT_WRD, XXXXXXX, KC_F12,
+ _______, KC_PIPE, KC_LPRN, KC_LBRC, KC_LCBR, KC_LABK, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX,
+ _______, KC_TILD, KC_EQL, KC_PLUS, KC_BSLS, XXXXXXX, _______, _______, XXXXXXX, PRE_WDL, KC_INS, NXT_WDL, XXXXXXX, _______,
+ _______, _______, POWER, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ /* LOWER
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | RST | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | |PRE W | UP |NXT W | | | ^ | & | * | € | ? | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | LEFT | DOWN |RIGHT | | | > | } | ] | ) | | | |
+ * |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
+ * | | |DEL PW| Ins |DEL NW| | | | | | / | - | _ | ` | |
+ * `------------------------------------------------' `------------------------------------------------'
+ * | | | | | | | | |POWER | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_LOWER] = LAYOUT( /* lower layer */
+ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ _______, XXXXXXX, PRE_WRD, KC_UP, NXT_WRD, XXXXXXX, KC_CIRC, KC_AMPR, KC_ASTR, KC_EURO, KC_QUES, KC_F12,
+ _______, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, KC_RABK, KC_RCBR, KC_RBRC, KC_RPRN, KC_PIPE, XXXXXXX,
+ _______, XXXXXXX, PRE_WDL, KC_INS, NXT_WDL, XXXXXXX, _______, _______, XXXXXXX, KC_SLSH, KC_MINS, KC_UNDS, KC_GRV, _______,
+ _______, _______, _______, _______, _______, _______, _______, POWER, _______, _______
+ ),
+
+ /* POWER
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | RST | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | ! | @ | # | $ | % | | ^ | & | * | € | ? | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | ( | [ | { | < | | > | } | ] | ) | | | |
+ * |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
+ * | | ~ | = | + | \ | | | | | | / | - | _ | ` | |
+ * `------------------------------------------------' `------------------------------------------------'
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_POWER] = LAYOUT( /* lower and raise combined */
+ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_EURO, KC_QUES, KC_F12,
+ _______, KC_PIPE, KC_LPRN, KC_LBRC, KC_LCBR, KC_LABK, KC_RABK, KC_RCBR, KC_RBRC, KC_RPRN, KC_PIPE, XXXXXXX,
+ _______, KC_TILD, KC_EQL, KC_PLUS, KC_BSLS, XXXXXXX, _______, _______, XXXXXXX, KC_SLSH, KC_MINS, KC_UNDS, KC_GRV, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+
+};
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ switch (get_highest_layer(layer_state)) {
+ case _RAISE:
+ if (index == 0 || index == 1) { /* Left or right encoder */
+ // Next/previous track
+ clockwise ? tap_code(KC_MNXT) : tap_code(KC_MPRV);
+ }
+ break;
+
+ default:
+ if (index == 0 || index == 1) { /* Left or right encoder */
+ // Volume up or down
+ clockwise ? tap_code(KC_VOLU) : tap_code(KC_VOLD);
+ }
+ break;
+ }
+}
\ No newline at end of file
diff --git a/keyboards/murcielago/rev1/keymaps/via/keymap.c b/keyboards/murcielago/rev1/keymaps/via/keymap.c
new file mode 100644
index 00000000000..b3abed76316
--- /dev/null
+++ b/keyboards/murcielago/rev1/keymaps/via/keymap.c
@@ -0,0 +1,130 @@
+#include QMK_KEYBOARD_H
+
+enum layers {
+ BASE,
+ _RAISE,
+ _LOWER,
+ _POWER
+};
+
+#define PRE_WRD LCTL(KC_LEFT) // jump to next word
+#define NXT_WRD LCTL(KC_RGHT) // jump to previous word
+
+#define NXT_WDL LCTL(KC_DEL) // delete next word
+#define PRE_WDL LCTL(KC_BSPC) // delete previous word
+
+#define KC_EURO ALGR(KC_5)
+#define LA_CAP MT(MOD_LALT, KC_CAPS) // Left alt on hold, caps lock on tap
+#define RA_ENT MT(MOD_RALT, KC_ENT) // Right alt on hold, enter on tap
+
+#define RAISE MO(_RAISE) // Raise layer access
+#define LOWER MO(_LOWER) // Lower layer access
+#define POWER MO(_POWER) // Power layer access (raise and lower)
+
+/*
+ * This default keymap is aimed at users of the US international layout
+ */
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* BASE
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | =+ | 1! | 2@ | 3# | 4$ | 5% | | 6^ | 7& | 8* | 9( | 0) | -_ |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | [{ | Q | W | E | R | T | | Y | U | I | O | P | }] |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Del | A | S | D | F | G | | H | J | K | L | ;: | '" |
+ * |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
+ * | Sft | Z | X | C | V | B | GEsc | | Tab | N | M | ,< | .> | /? | Sft |
+ * `------------------------------------------------' `------------------------------------------------'
+ * | LA/CL| LGUI |LOWER | Back | Ctrl | |RA/Ent|Space |RAISE | RGUI | Play |
+ * `----------------------------------' `----------------------------------'
+ */
+ [BASE] = LAYOUT( /* qwerty */
+ KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ KC_LBRC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RBRC,
+ KC_DEL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_GESC, KC_TAB, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ LA_CAP, KC_LGUI, LOWER, KC_BSPC, KC_LCTL, RA_ENT, KC_SPC, RAISE, KC_RGUI, KC_MPLY
+ ),
+
+ /* RAISE
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | RST | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | ! | @ | # | $ | % | | |PRE W | UP |NXT W | | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | ( | [ | { | < | | | LEFT | DOWN |RIGHT | | |
+ * |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
+ * | | ~ | = | + | \ | | | | | |DEL PW| Ins |DEL NW| | |
+ * `------------------------------------------------' `------------------------------------------------'
+ * | | |POWER | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_RAISE] = LAYOUT( /* raise layer */
+ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, XXXXXXX, PRE_WRD, KC_UP, NXT_WRD, XXXXXXX, KC_F12,
+ _______, KC_PIPE, KC_LPRN, KC_LBRC, KC_LCBR, KC_LABK, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, XXXXXXX,
+ _______, KC_TILD, KC_EQL, KC_PLUS, KC_BSLS, XXXXXXX, _______, _______, XXXXXXX, PRE_WDL, KC_INS, NXT_WDL, XXXXXXX, _______,
+ _______, _______, POWER, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ /* LOWER
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | RST | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | |PRE W | UP |NXT W | | | ^ | & | * | € | ? | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | LEFT | DOWN |RIGHT | | | > | } | ] | ) | | | |
+ * |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
+ * | | |DEL PW| Ins |DEL NW| | | | | | / | - | _ | ` | |
+ * `------------------------------------------------' `------------------------------------------------'
+ * | | | | | | | | |POWER | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_LOWER] = LAYOUT( /* lower layer */
+ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ _______, XXXXXXX, PRE_WRD, KC_UP, NXT_WRD, XXXXXXX, KC_CIRC, KC_AMPR, KC_ASTR, KC_EURO, KC_QUES, KC_F12,
+ _______, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX, KC_RABK, KC_RCBR, KC_RBRC, KC_RPRN, KC_PIPE, XXXXXXX,
+ _______, XXXXXXX, PRE_WDL, KC_INS, NXT_WDL, XXXXXXX, _______, _______, XXXXXXX, KC_SLSH, KC_MINS, KC_UNDS, KC_GRV, _______,
+ _______, _______, _______, _______, _______, _______, _______, POWER, _______, _______
+ ),
+
+ /* POWER
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | RST | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | ! | @ | # | $ | % | | ^ | & | * | € | ? | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | ( | [ | { | < | | > | } | ] | ) | | | |
+ * |------+------+------+------+------+------+------. ,------+------+------+------+------+------+------|
+ * | | ~ | = | + | \ | | | | | | / | - | _ | ` | |
+ * `------------------------------------------------' `------------------------------------------------'
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_POWER] = LAYOUT( /* lower and raise combined */
+ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_EURO, KC_QUES, KC_F12,
+ _______, KC_PIPE, KC_LPRN, KC_LBRC, KC_LCBR, KC_LABK, KC_RABK, KC_RCBR, KC_RBRC, KC_RPRN, KC_PIPE, XXXXXXX,
+ _______, KC_TILD, KC_EQL, KC_PLUS, KC_BSLS, XXXXXXX, _______, _______, XXXXXXX, KC_SLSH, KC_MINS, KC_UNDS, KC_GRV, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+
+};
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ switch (get_highest_layer(layer_state)) {
+ case _RAISE:
+ if (index == 0 || index == 1) { /* Left or right encoder */
+ // Next/previous track
+ clockwise ? tap_code(KC_MNXT) : tap_code(KC_MPRV);
+ }
+ break;
+
+ default:
+ if (index == 0 || index == 1) { /* Left or right encoder */
+ // Volume up or down
+ clockwise ? tap_code(KC_VOLU) : tap_code(KC_VOLD);
+ }
+ break;
+ }
+}
\ No newline at end of file
diff --git a/keyboards/murcielago/rev1/keymaps/via/rules.mk b/keyboards/murcielago/rev1/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/murcielago/rev1/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/murcielago/rev1/rules.mk b/keyboards/murcielago/rev1/rules.mk
new file mode 100644
index 00000000000..f8faea6c3b2
--- /dev/null
+++ b/keyboards/murcielago/rev1/rules.mk
@@ -0,0 +1,34 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+SPLIT_KEYBOARD = yes # Enable split keyboard mode
+ENCODER_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/murcielago/rules.mk b/keyboards/murcielago/rules.mk
new file mode 100644
index 00000000000..661563697a6
--- /dev/null
+++ b/keyboards/murcielago/rules.mk
@@ -0,0 +1 @@
+DEFAULT_FOLDER = murcielago/rev1
\ No newline at end of file
diff --git a/keyboards/naked60/keymaps/333fred/config.h b/keyboards/naked60/keymaps/333fred/config.h
new file mode 100644
index 00000000000..d19e77f0443
--- /dev/null
+++ b/keyboards/naked60/keymaps/333fred/config.h
@@ -0,0 +1,24 @@
+/* Copyright 2018 Salicylic_acid3
+ *
+ * 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 .
+ */
+
+#pragma once
+
+
+
+/* Select hand configuration */
+
+#define TAPPING_FORCE_HOLD
+#define TAPPING_TERM 200
diff --git a/keyboards/naked60/keymaps/333fred/keymap.c b/keyboards/naked60/keymaps/333fred/keymap.c
new file mode 100644
index 00000000000..3331dee9b1f
--- /dev/null
+++ b/keyboards/naked60/keymaps/333fred/keymap.c
@@ -0,0 +1,53 @@
+#include QMK_KEYBOARD_H
+#include "333fred.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [BASE] = LAYOUT(
+ //,--------------------------------------------------------------------| |---------------------------------------------------------.
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ //|--------------+------------+------+--------+--------+---------------| |-------+--------+--------+-------+--------+--------------|
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ //|--------------+------------+------+--------+--------+---------------| |-------+--------+--------+-------+--------+--------------|
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ //|--------------+------------+------+--------+--------+---------------| |-------+--------+--------+-------+--------+--------------|
+ OSM(MOD_LSFT), CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, OSM(MOD_RSFT),
+ //|--------------+------------+------+--------+--------+---------------+-------+-------+-------+--------+--------+-------+--------+--------------|
+ KC_F4, KC_F5, KC_LALT, KC_BSPC, TD(TD_SYM_VIM), KC_DEL, KC_ENT, KC_SPC, KC_DOWN, KC_UP, KC_EQL, KC_LGUI
+ //`----------------------------------------------------------------------------------------------------------------'
+ ),
+
+
+ [SYMB] = LAYOUT(
+ //,-----------------------------------------------------| |-----------------------------------------------------.
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+-------+--------+--------|
+ _______, KC_EXLM, KC_AT, KC_LPRN, KC_RPRN, KC_PIPE, _______, KC_7, KC_8, KC_9, _______, KC_F12,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+-------+--------+--------|
+ _______, KC_HASH, KC_DLR, KC_LCBR, KC_RCBR, KC_GRV, KC_VOLU, KC_4, KC_5, KC_6, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+-------+--------+--------|
+ _______, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_VOLD, KC_1, KC_2, KC_3, _______, _______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-------+--------+--------|
+ _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC_0, KC_ENT, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ ),
+
+
+ [VIM] = LAYOUT( /* Base */
+ //,-----------------------------------------------------| |-----------------------------------------------------.
+ _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, KC_LSFT, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, DLEFT, DRIGHT, KC_LCTL, KC_LGUI, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______,
+ //|--------+--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ //`------------------------------------------------------------------------------------------------------------'
+ )
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ tap_dance_process_keycode(keycode);
+ return !try_handle_macro(keycode, record);
+}
diff --git a/keyboards/niu_mini/config.h b/keyboards/niu_mini/config.h
index be94fd9e7bd..84ccc6a6868 100644
--- a/keyboards/niu_mini/config.h
+++ b/keyboards/niu_mini/config.h
@@ -21,8 +21,8 @@ along with this program. If not, see .
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x6060
+#define VENDOR_ID 0x6E6D
+#define PRODUCT_ID 0x0001
#define DEVICE_VER 0x0001
#define MANUFACTURER KBDFans
#define PRODUCT NIU Mini
diff --git a/keyboards/niu_mini/keymaps/via/keymap.c b/keyboards/niu_mini/keymaps/via/keymap.c
new file mode 100644
index 00000000000..702e4199445
--- /dev/null
+++ b/keyboards/niu_mini/keymaps/via/keymap.c
@@ -0,0 +1,79 @@
+#include QMK_KEYBOARD_H
+
+#define LOWER FN_MO13
+#define RAISE FN_MO23
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* Layer 0
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | GUI | Caps | Alt |Layer1| Space| Space|Layer2| Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [0] = LAYOUT_ortho_4x12(
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ KC_LCTL, KC_LGUI, KC_CAPS, KC_LALT, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+
+ /* Layer 1
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | Vol- | Vol+ | Mute | | | | F11 | F12 | | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Reset| | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [1] = LAYOUT_ortho_4x12(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL,
+ _______, KC_VOLD, KC_VOLU, KC_MUTE, _______, _______, _______, KC_F11, KC_F12, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ /* Layer 2 (r_ Indicates RGB Controls)
+ * ,-----------------------------------------------------------------------------------.
+ * | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | |r_TOG |r_Mode|r_Hue+|r_Hue-| | | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | |BL_TOG|BL_STEP| | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [2] = LAYOUT_ortho_4x12(
+ _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
+ _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ _______, BL_TOGG, BL_STEP, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ /* Layer 3 (r_ Indicates RGB Controls)
+ * ,-----------------------------------------------------------------------------------.
+ * | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | |r_TOG |r_Mode|r_Hue+|r_Hue-| | | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | |BL_TOG|BL_STEP| | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | RESET| | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [3] = LAYOUT_ortho_4x12(
+ _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
+ _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ _______, BL_TOGG, BL_STEP, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+};
diff --git a/keyboards/niu_mini/keymaps/via/rules.mk b/keyboards/niu_mini/keymaps/via/rules.mk
new file mode 100644
index 00000000000..43061db1dd4
--- /dev/null
+++ b/keyboards/niu_mini/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/nk65/rules.mk b/keyboards/nk65/rules.mk
index 1b734161fc0..f7db412a243 100755
--- a/keyboards/nk65/rules.mk
+++ b/keyboards/nk65/rules.mk
@@ -30,4 +30,4 @@ SRC = keyboards/wilba_tech/wt_main.c \
keyboards/wilba_tech/wt_rgb_backlight.c \
drivers/issi/is31fl3733.c \
quantum/color.c \
- drivers/arm/i2c_master.c
+ drivers/chibios/i2c_master.c
diff --git a/keyboards/oddball/config.h b/keyboards/oddball/config.h
index b3679bea4ce..99d9f75d5fc 100644
--- a/keyboards/oddball/config.h
+++ b/keyboards/oddball/config.h
@@ -195,10 +195,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/pabile/p18/config.h b/keyboards/pabile/p18/config.h
new file mode 100644
index 00000000000..f7c258a5654
--- /dev/null
+++ b/keyboards/pabile/p18/config.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x6666
+#define PRODUCT_ID 0x6668
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Pabile
+#define PRODUCT P18 Macro Pad
+#define DESCRIPTION An 18-key DIY macropad kit
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 5
+
+/* pin-out for PROMICRO */
+#define MATRIX_ROW_PINS { D1, D0, D4, C6 }
+#define MATRIX_COL_PINS { D2, D7, E6, B4, B5 }
+#define UNUSED_PINS
+
+/* Encoder position for PROMICRO */
+#define ENCODERS_PAD_A { B6, F6 }
+#define ENCODERS_PAD_B { F4, F5 }
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/pabile/p18/info.json b/keyboards/pabile/p18/info.json
new file mode 100644
index 00000000000..3f215a45198
--- /dev/null
+++ b/keyboards/pabile/p18/info.json
@@ -0,0 +1,31 @@
+{
+ "keyboard_name": "Pabile 18",
+ "url": "https://pabileonline.blogspot.com/",
+ "maintainer": "Pabile",
+ "width": 5.25,
+ "height": 4,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"x":1.25, "y":0},
+ {"x":2.25, "y":0},
+ {"x":3.25, "y":0},
+ {"x":4.25, "y":0},
+ {"x":1.25, "y":1},
+ {"x":2.25, "y":1},
+ {"x":3.25, "y":1},
+ {"x":4.25, "y":1},
+ {"x":0, "y":2},
+ {"x":1.25, "y":2},
+ {"x":2.25, "y":2},
+ {"x":3.25, "y":2},
+ {"x":4.25, "y":2},
+ {"x":0, "y":3},
+ {"x":1.25, "y":3},
+ {"x":2.25, "y":3},
+ {"x":3.25, "y":3},
+ {"x":4.25, "y":3}
+ ]
+ }
+ }
+}
diff --git a/keyboards/pabile/p18/keymaps/default/keymap.c b/keyboards/pabile/p18/keymaps/default/keymap.c
new file mode 100644
index 00000000000..d47982e5627
--- /dev/null
+++ b/keyboards/pabile/p18/keymaps/default/keymap.c
@@ -0,0 +1,27 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_P7, KC_P8, KC_P9, KC_PMNS,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_MUTE, KC_P1, KC_P2, KC_P3, KC_TAB,
+ KC_ESC, KC_DEL, KC_P0, KC_PDOT, KC_PENT
+ )
+
+};
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) { /* First encoder below the controller */
+ if (clockwise) {
+ tap_code(KC_VOLD); /*volume down*/
+ } else {
+ tap_code(KC_VOLU); /*volume up*/
+ }
+ } else if (index == 1) { /* Second encoder */
+ if (clockwise) {
+ tap_code(KC_WH_U); /*mouse wheel up*/
+ } else {
+ tap_code(KC_WH_D); /*mouse wheel down*/
+ }
+ }
+}
diff --git a/keyboards/pabile/p18/p18.c b/keyboards/pabile/p18/p18.c
new file mode 100644
index 00000000000..94e74a83150
--- /dev/null
+++ b/keyboards/pabile/p18/p18.c
@@ -0,0 +1 @@
+#include "p18.h"
diff --git a/keyboards/pabile/p18/p18.h b/keyboards/pabile/p18/p18.h
new file mode 100644
index 00000000000..3be26191cec
--- /dev/null
+++ b/keyboards/pabile/p18/p18.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ k01, k02, k03, k04, \
+ k11, k12, k13, k14, \
+ k20, k21, k22, k23, k24, \
+ k30, k31, k32, k33, k34 \
+) \
+{ \
+ {KC_NO, k04, k03, k02, k01}, \
+ {KC_NO, k14, k13, k12, k11}, \
+ {k20, k24, k23, k22, k21}, \
+ {k30, k34, k33, k32, k31} \
+}
diff --git a/keyboards/pabile/p18/readme.md b/keyboards/pabile/p18/readme.md
new file mode 100644
index 00000000000..57478c23594
--- /dev/null
+++ b/keyboards/pabile/p18/readme.md
@@ -0,0 +1,15 @@
+# P18
+
+
+
+A 18-key DIY Hotswap Macropad that accepts both Pro Micro and Adafruit Feather 32u4 Bluefruit LE.
+
+* Keyboard Maintainer: [pabile](https://github.com/pabile)
+* Hardware Supported: Pabile P18 PCB with Pro Micro or Adafruit Feather 32u4 Bluefruit LE
+* Hardware Availability: [Info at pabileonline.blogspot.com](https://pabileonline.blogspot.com/search/label/pabile18)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make pabile/p18:default
+
+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).
diff --git a/keyboards/pabile/p18/rules.mk b/keyboards/pabile/p18/rules.mk
new file mode 100644
index 00000000000..4a84739de04
--- /dev/null
+++ b/keyboards/pabile/p18/rules.mk
@@ -0,0 +1,35 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+UNICODE_ENABLE = yes # Unicode
+IOS_DEVICE_ENABLE = no # connect to IOS Device
+ENCODER_ENABLE = yes
diff --git a/keyboards/pabile/p20/config.h b/keyboards/pabile/p20/config.h
new file mode 100644
index 00000000000..8a52c1bf1c5
--- /dev/null
+++ b/keyboards/pabile/p20/config.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x6666
+#define PRODUCT_ID 0x6667
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Pabile
+#define PRODUCT P20
+#define DESCRIPTION 5x4 Macropad
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 4
+
+/* pin-out */
+#define MATRIX_ROW_PINS { B3, B4, B5, D7, E6 }
+#define MATRIX_COL_PINS { D0, B2, D4, B6 }
+#define UNUSED_PINS
+
+#define ENCODERS_PAD_A { F5, F7 }
+#define ENCODERS_PAD_B { F6, B1 }
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/pabile/p20/keymaps/default/keymap.c b/keyboards/pabile/p20/keymaps/default/keymap.c
new file mode 100644
index 00000000000..6b815e72e8e
--- /dev/null
+++ b/keyboards/pabile/p20/keymaps/default/keymap.c
@@ -0,0 +1,38 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_ortho_5x4(
+ KC_PSLS, KC_PMNS, KC_PAST, KC_MPLY,
+ KC_P7, KC_P8, KC_P9, KC_PMNS,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_P1, KC_P2, KC_P3, KC_TAB,
+ LT(2,KC_P0), KC_PCMM, KC_PDOT, LT(1,KC_PENT)),
+ [1] = LAYOUT_ortho_5x4(
+ KC_NLCK, KC_UNDS, KC_NO, KC_NO,
+ KC_AMPR, KC_ASTR, KC_LPRN, KC_EQL,
+ KC_DLR, KC_PERC, KC_CIRC, KC_NO,
+ KC_EXLM, KC_AT, KC_HASH, KC_NO,
+ KC_RPRN, KC_NO, KC_PSLS, KC_NO),
+ [2] = LAYOUT_ortho_5x4(
+ KC_NLCK, KC_NO, KC_NO, KC_NO,
+ KC_BTN1, KC_MS_U, KC_BTN2, KC_NO,
+ KC_MS_L, KC_MS_D, KC_MS_R, KC_TAB,
+ KC_WH_U, KC_NO, KC_WH_D, KC_NO,
+ KC_NO, KC_NO, KC_DEL, KC_ESC)
+};
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) { /* First encoder */
+ if (clockwise) {
+ tap_code(KC_WH_U); /*mouse wheel up*/
+ } else {
+ tap_code(KC_WH_D); /*mouse wheel down */
+ }
+ } else if (index == 1) { /* Second encoder */
+ if (clockwise) {
+ tap_code(KC_VOLD); /*volume down*/
+ } else {
+ tap_code(KC_VOLU); /*volume up*/
+ }
+ }
+}
diff --git a/keyboards/pabile/p20/p20.c b/keyboards/pabile/p20/p20.c
new file mode 100644
index 00000000000..c17efac9b16
--- /dev/null
+++ b/keyboards/pabile/p20/p20.c
@@ -0,0 +1 @@
+#include "p20.h"
diff --git a/keyboards/pabile/p20/p20.h b/keyboards/pabile/p20/p20.h
new file mode 100644
index 00000000000..b7467dc150e
--- /dev/null
+++ b/keyboards/pabile/p20/p20.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_ortho_5x4( \
+ k00, k01, k02, k03, \
+ k10, k11, k12, k13, \
+ k20, k21, k22, k23, \
+ k30, k31, k32, k33, \
+ k40, k41, k42, k43 \
+) \
+{ \
+ {k00, k01, k02, k03}, \
+ {k10, k11, k12, k13}, \
+ {k20, k21, k22, k23}, \
+ {k30, k31, k32, k33}, \
+ {k40, k41, k42, k43} \
+}
diff --git a/keyboards/pabile/p20/readme.md b/keyboards/pabile/p20/readme.md
new file mode 100644
index 00000000000..256a4772ecd
--- /dev/null
+++ b/keyboards/pabile/p20/readme.md
@@ -0,0 +1,16 @@
+# P20
+
+
+
+
+A 5x4 grid keyboard with 2 rotary encoders.
+
+* Keyboard Maintainer: [pabile](https://github.com/pabile)
+* Hardware Supported: Pabile P20 PCB, Pro Micro
+* Hardware Availability: [Info at pabileonline.blogspot.com](https://pabileonline.blogspot.com/search/label/pabile20)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make pabile/p20:default
+
+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).
diff --git a/keyboards/pabile/p20/rules.mk b/keyboards/pabile/p20/rules.mk
new file mode 100644
index 00000000000..d4fa25323ad
--- /dev/null
+++ b/keyboards/pabile/p20/rules.mk
@@ -0,0 +1,37 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+UNICODE_ENABLE = yes # Unicode
+IOS_DEVICE_ENABLE = no # connect to IOS Device
+ENCODER_ENABLE = yes
+
+LAYOUTS = ortho_5x4
diff --git a/keyboards/pabile/p40/config.h b/keyboards/pabile/p40/config.h
new file mode 100644
index 00000000000..f4252f7ab03
--- /dev/null
+++ b/keyboards/pabile/p40/config.h
@@ -0,0 +1,29 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x6666
+#define PRODUCT_ID 0x6666
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Pabile
+#define PRODUCT P40 Keyboard
+#define DESCRIPTION 4x10 staggered keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 10
+
+/* pin-out
+for PCB ver0.01 452019 */
+#define MATRIX_ROW_PINS { F6, B3, B2, B6 }
+#define MATRIX_COL_PINS { F4, F5, B5, B4, E6, D7, C6, D4, D0, D1 }
+/*
+for pro micro facing back of pcb
+#define MATRIX_ROW_PINS { D4, E6, B4, B5 }
+#define MATRIX_COL_PINS { D1, D0, B6, B2, B3, B1, F7, F6, F5, F4 }
+*/
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/pabile/p40/info.json b/keyboards/pabile/p40/info.json
new file mode 100644
index 00000000000..42f9b4823e1
--- /dev/null
+++ b/keyboards/pabile/p40/info.json
@@ -0,0 +1,52 @@
+{
+ "keyboard_name": "Pabile 40",
+ "url": "https://pabileonline.blogspot.com/",
+ "maintainer": "Pabile",
+ "width": 10.75,
+ "height": 4,
+ "layouts": {
+ "LAYOUT_ortho_4x10": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+ {"x":6, "y":0},
+ {"x":7, "y":0},
+ {"x":8, "y":0},
+ {"x":9, "y":0},
+ {"x":0.25, "y":1},
+ {"x":1.25, "y":1},
+ {"x":2.25, "y":1},
+ {"x":3.25, "y":1},
+ {"x":4.25, "y":1},
+ {"x":5.25, "y":1},
+ {"x":6.25, "y":1},
+ {"x":7.25, "y":1},
+ {"x":8.25, "y":1},
+ {"x":9.25, "y":1},
+ {"x":0.5, "y":2},
+ {"x":1.5, "y":2},
+ {"x":2.5, "y":2},
+ {"x":3.5, "y":2},
+ {"x":4.5, "y":2},
+ {"x":5.5, "y":2},
+ {"x":6.5, "y":2},
+ {"x":7.5, "y":2},
+ {"x":8.5, "y":2},
+ {"x":9.5, "y":2},
+ {"x":0.75, "y":3},
+ {"x":1.75, "y":3},
+ {"x":2.75, "y":3},
+ {"x":3.75, "y":3},
+ {"x":4.75, "y":3},
+ {"x":5.75, "y":3},
+ {"x":6.75, "y":3},
+ {"x":7.75, "y":3},
+ {"x":8.75, "y":3},
+ {"x":9.75, "y":3}]
+ }
+ }
+}
diff --git a/keyboards/pabile/p40/keymaps/default/keymap.c b/keyboards/pabile/p40/keymaps/default/keymap.c
new file mode 100644
index 00000000000..80035fa07d6
--- /dev/null
+++ b/keyboards/pabile/p40/keymaps/default/keymap.c
@@ -0,0 +1,29 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_ortho_4x10(
+ KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
+ KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(3,KC_MINS),
+ KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, LT(4,KC_SLSH),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, LT(2,KC_BSPC), LT(1,KC_SPC), KC_ENT, KC_APP, KC_DEL, KC_ESC),
+ [1] = LAYOUT_ortho_4x10(
+ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
+ KC_TAB, KC_NO, KC_NO, KC_GRV, KC_LBRC, KC_RBRC, KC_BSLS, KC_SCLN, KC_QUOT, KC_MINS,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_EQL, KC_MINS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+ [2] = LAYOUT_ortho_4x10(
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,
+ KC_TAB, KC_F11, KC_F12, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_CAPS, KC_PSCR, KC_SLCK, KC_PAUS, KC_NO, KC_NLCK, KC_NO, KC_VOLD, KC_VOLU, KC_MUTE,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
+ [3] = LAYOUT_ortho_4x10(
+ KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_INS, KC_PGUP, KC_UP, KC_PGDN, KC_DEL,
+ KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_END, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO),
+ [4] = LAYOUT_ortho_4x10(
+ KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_BTN1, KC_MS_U, KC_BTN2, KC_DEL,
+ KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_U, KC_MS_L, KC_MS_D, KC_MS_R, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_D, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO)
+};
diff --git a/keyboards/pabile/p40/p40.c b/keyboards/pabile/p40/p40.c
new file mode 100644
index 00000000000..b1bfb7de2b6
--- /dev/null
+++ b/keyboards/pabile/p40/p40.c
@@ -0,0 +1 @@
+#include "p40.h"
diff --git a/keyboards/pabile/p40/p40.h b/keyboards/pabile/p40/p40.h
new file mode 100644
index 00000000000..4e1e08a6fc6
--- /dev/null
+++ b/keyboards/pabile/p40/p40.h
@@ -0,0 +1,16 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_ortho_4x10( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39 \
+) \
+{ \
+ {k00, k01, k02, k03, k04, k05, k06, k07, k08, k09}, \
+ {k10, k11, k12, k13, k14, k15, k16, k17, k18, k19}, \
+ {k20, k21, k22, k23, k24, k25, k26, k27, k28, k29}, \
+ {k30, k31, k32, k33, k34, k35, k36, k37, k38, k39} \
+}
diff --git a/keyboards/pabile/p40/readme.md b/keyboards/pabile/p40/readme.md
new file mode 100644
index 00000000000..33a657f384c
--- /dev/null
+++ b/keyboards/pabile/p40/readme.md
@@ -0,0 +1,15 @@
+# P40
+
+
+
+A compact 4x10 (40%) staggered DIY keyboard kit.
+
+* Keyboard Maintainer: [pabile](https://github.com/pabile)
+* Hardware Supported: Pabile P40 PCB, Pro Micro
+* Hardware Availability: [Info at pabileonline.blogspot.com](https://pabileonline.blogspot.com/search/label/pabile40)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make pabile/p40:default
+
+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).
diff --git a/keyboards/pabile/p40/rules.mk b/keyboards/pabile/p40/rules.mk
new file mode 100644
index 00000000000..2b5d9470a84
--- /dev/null
+++ b/keyboards/pabile/p40/rules.mk
@@ -0,0 +1,36 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI controls
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+UNICODE_ENABLE = yes # Unicode
+IOS_DEVICE_ENABLE = no # connect to IOS Device
+
+LAYOUTS = ortho_4x10
diff --git a/keyboards/palette1202/config.h b/keyboards/palette1202/config.h
index 65db763b4d6..7731455c612 100644
--- a/keyboards/palette1202/config.h
+++ b/keyboards/palette1202/config.h
@@ -41,6 +41,9 @@ along with this program. If not, see .
/* Encoders */
#define ENCODERS_PAD_A { F4, F6 }
#define ENCODERS_PAD_B { F5, F7 }
+#define ENCODER_RESOLUTION 2
+// if you want to reverse encoder direction
+// #define ENCODER_DIRECTION_FLIP
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5
diff --git a/keyboards/palette1202/keymaps/default/keymap.c b/keyboards/palette1202/keymaps/default/keymap.c
index 9c7bc745635..d7bd120ed25 100644
--- a/keyboards/palette1202/keymaps/default/keymap.c
+++ b/keyboards/palette1202/keymaps/default/keymap.c
@@ -116,55 +116,55 @@ void encoder_update_user(uint8_t index, bool clockwise) {
if (currentLayer % 2 == 0) {
// default layer
// Zoom
- tap_code16(!clockwise ? G(KC_EQL) : G(KC_MINS));
+ tap_code16(!clockwise ? G(KC_MINS) : G(KC_EQL));
} else {
// Fn Layer
// rotate canvas
- tap_code(!clockwise ? KC_QUOT : KC_MINS);
+ tap_code(!clockwise ? KC_MINS : KC_QUOT);
}
break;
case MAC_PS_1:
if (currentLayer % 2 == 0) {
// default layer
// Zoom
- tap_code16(!clockwise ? G(KC_EQL) : G(KC_MINS));
+ tap_code16(!clockwise ? G(KC_MINS) : G(KC_EQL));
} else {
// Fn Layer
// undo / redo
- tap_code16(!clockwise ? S(G(KC_Z)) : G(KC_Z));
+ tap_code16(!clockwise ? G(KC_Z) : S(G(KC_Z)));
}
break;
case WIN_CS_1:
if (currentLayer % 2 == 0) {
// default layer
// Zoom
- tap_code16(!clockwise ? C(KC_EQL) : C(KC_MINS));
+ tap_code16(!clockwise ? C(KC_MINS) : C(KC_EQL));
} else {
// Fn Layer
// rotate canvas
- tap_code(!clockwise ? KC_QUOT : KC_MINS);
+ tap_code(!clockwise ? KC_MINS : KC_QUOT);
}
break;
case WIN_PS_1:
if (currentLayer % 2 == 0) {
// default layer
// Zoom
- tap_code16(!clockwise ? C(KC_SCLN) : C(KC_MINS));
+ tap_code16(!clockwise ? C(KC_MINS) : C(KC_SCLN));
} else {
// Fn Layer
// undo / redo
- tap_code16(!clockwise ? C(S(KC_Z)) : C(KC_Z));
+ tap_code16(!clockwise ? C(KC_Z) : C(S(KC_Z)));
}
break;
case IOS_CS_1:
if (currentLayer % 2 == 0) {
// default layer
// Zoom
- tap_code16(!clockwise ? G(KC_SCLN) : G(KC_MINS));
+ tap_code16(!clockwise ? G(KC_MINS) : G(KC_SCLN));
} else {
// Fn Layer
// rotate canvas
- tap_code(!clockwise ? KC_EQL : KC_MINS);
+ tap_code(!clockwise ? KC_MINS : KC_EQL);
}
break;
default:
@@ -176,55 +176,55 @@ void encoder_update_user(uint8_t index, bool clockwise) {
if (currentLayer % 2 == 0) {
// default layer
// size of brush
- tap_code(!clockwise ? KC_RBRC : KC_LBRC);
+ tap_code(!clockwise ? KC_LBRC : KC_RBRC);
} else {
// Fn Layer
// opacity of brush
- tap_code16(!clockwise ? G(KC_RBRC) : G(KC_LBRC));
+ tap_code16(!clockwise ? G(KC_LBRC) : G(KC_RBRC));
}
break;
case MAC_PS_1:
if (currentLayer % 2 == 0) {
// default layer
// size of brush
- tap_code(!clockwise ? KC_RBRC : KC_LBRC);
+ tap_code(!clockwise ? KC_LBRC : KC_RBRC);
} else {
// Fn Layer
// opacity of brush
- tap_code16(!clockwise ? KC_RCBR : KC_LCBR);
+ tap_code16(!clockwise ? KC_LCBR : KC_RCBR);
}
break;
case WIN_CS_1:
if (currentLayer % 2 == 0) {
// default layer
// rotate canvas
- tap_code(!clockwise ? KC_RBRC : KC_LBRC);
+ tap_code(!clockwise ? KC_LBRC : KC_RBRC);
} else {
// Fn Layer
// opacity of brush
- tap_code16(!clockwise ? C(KC_RBRC) : C(KC_LBRC));
+ tap_code16(!clockwise ? C(KC_LBRC) : C(KC_RBRC));
}
break;
case WIN_PS_1:
if (currentLayer % 2 == 0) {
// default layer
// rotate canvas
- tap_code(!clockwise ? KC_RBRC : KC_LBRC);
+ tap_code(!clockwise ? KC_LBRC : KC_RBRC);
} else {
// Fn Layer
// opacity of brush
- tap_code16(!clockwise ? KC_RCBR : KC_LCBR);
+ tap_code16(!clockwise ? KC_LCBR : KC_RCBR);
}
break;
case IOS_CS_1:
if (currentLayer % 2 == 0) {
// default layer
// size of brush
- tap_code(!clockwise ? KC_BSLS : KC_RBRC);
+ tap_code(!clockwise ? KC_RBRC : KC_BSLS);
} else {
// Fn Layer
// opacity of brush
- tap_code16(!clockwise ? G(KC_BSLS) : G(KC_RBRC));
+ tap_code16(!clockwise ? G(KC_RBRC) : G(KC_BSLS));
}
break;
default:
diff --git a/keyboards/palette1202/readme.md b/keyboards/palette1202/readme.md
index 4451eac4984..227293ced6c 100644
--- a/keyboards/palette1202/readme.md
+++ b/keyboards/palette1202/readme.md
@@ -6,7 +6,7 @@ A left hand device with rotary encoder, for artists.
* Keyboard Maintainer: [niltea](https://github.com/niltea)
* Hardware Supported: Palette1202
-* Hardware Availability: [Pixiv Booth](https://booth.pm/)
+* Hardware Availability: [Pixiv Booth](https://niltea.booth.pm/)
* [PCB & Case](https://github.com/niltea/Palette1202)
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/panc60/config.h b/keyboards/panc60/config.h
index b3bcdc97334..002ff7cf967 100644
--- a/keyboards/panc60/config.h
+++ b/keyboards/panc60/config.h
@@ -23,7 +23,7 @@ along with this program. If not, see .
#define PRODUCT_ID 0x422D
#define DEVICE_VER 0x0200
#define MANUFACTURER Panc Interactive
-#define PRODUCT panc60
+#define PRODUCT Panc60
#define RGBLED_NUM 12
diff --git a/keyboards/panc60/rules.mk b/keyboards/panc60/rules.mk
index d3ed4998bc1..26b9f0ce4d9 100644
--- a/keyboards/panc60/rules.mk
+++ b/keyboards/panc60/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = no
MOUSEKEY_ENABLE = yes
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = no
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
diff --git a/keyboards/panc60/usbconfig.h b/keyboards/panc60/usbconfig.h
deleted file mode 100644
index e65d210ace8..00000000000
--- a/keyboards/panc60/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/pancake/config.h b/keyboards/pancake/config.h
index a83ef5d0cc8..5a01a572e4d 100644
--- a/keyboards/pancake/config.h
+++ b/keyboards/pancake/config.h
@@ -1,4 +1,4 @@
-/* Copyright 2019 Sebastian Williams
+/* Copyright 2019 Spaceman
*
* 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
@@ -20,7 +20,7 @@
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0xB195
#define DEVICE_VER 0x0001
-#define MANUFACTURER rionlion100
+#define MANUFACTURER Spaceman
#define PRODUCT Pancake
#define DESCRIPTION Choc Ortho Keyboard
diff --git a/keyboards/pancake/feather/config.h b/keyboards/pancake/feather/config.h
index fbb175758b6..eac91a5adaa 100644
--- a/keyboards/pancake/feather/config.h
+++ b/keyboards/pancake/feather/config.h
@@ -1,4 +1,4 @@
-/* Copyright 2019 Sebastian Williams
+/* Copyright 2019 Spaceman
*
* 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
diff --git a/keyboards/pancake/info.json b/keyboards/pancake/info.json
index c18e48b8b16..6d2b2a9bb40 100644
--- a/keyboards/pancake/info.json
+++ b/keyboards/pancake/info.json
@@ -2,7 +2,7 @@
"keyboard_name": "Pancake",
"keyboard_folder": "Pancake",
"url": "",
- "maintainer": "rionlion100",
+ "maintainer": "rionlion100 (Spaceman)",
"width": 12,
"height": 4,
"layouts": {
diff --git a/keyboards/pancake/pancake.c b/keyboards/pancake/pancake.c
index e01636016cc..d77dbfbe01e 100644
--- a/keyboards/pancake/pancake.c
+++ b/keyboards/pancake/pancake.c
@@ -1,4 +1,4 @@
-/* Copyright 2019 Sebastian Williams
+/* Copyright 2019 Spaceman
*
* 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
diff --git a/keyboards/pancake/pancake.h b/keyboards/pancake/pancake.h
index cb775699672..312d789b42b 100644
--- a/keyboards/pancake/pancake.h
+++ b/keyboards/pancake/pancake.h
@@ -1,4 +1,4 @@
-/* Copyright 2019 Sebastian Williams
+/* Copyright 2019 Spaceman
*
* 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
diff --git a/keyboards/pancake/promicro/config.h b/keyboards/pancake/promicro/config.h
index 3b65ced8181..ee02bff2b81 100644
--- a/keyboards/pancake/promicro/config.h
+++ b/keyboards/pancake/promicro/config.h
@@ -1,4 +1,4 @@
-/* Copyright 2019 Sebastian Williams
+/* Copyright 2019 Spaceman
*
* 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
diff --git a/keyboards/pancake/readme.md b/keyboards/pancake/readme.md
index bbf341b9722..3e3125f4d7a 100644
--- a/keyboards/pancake/readme.md
+++ b/keyboards/pancake/readme.md
@@ -2,7 +2,7 @@
Ortho 40% Ortho Keyboard with an option for the adafruit feather
-Keyboard Maintainer: [Rionlion100](https://github.com/rionlion100)
+Keyboard Maintainer: Spaceman AKA:[Rionlion100](https://github.com/rionlion100)
Hardware Availability: [GB](https://geekhack.org/index.php?topic=101371.0)
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/pdxkbc/config.h b/keyboards/pdxkbc/config.h
index c547bb0908f..336b1434aca 100644
--- a/keyboards/pdxkbc/config.h
+++ b/keyboards/pdxkbc/config.h
@@ -20,8 +20,8 @@ along with this program. If not, see .
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x0000
+#define VENDOR_ID 0x5044 // PD
+#define PRODUCT_ID 0x0001
#define DEVICE_VER 0x0001
#define MANUFACTURER Franklin Harding
#define PRODUCT pdxkbc
diff --git a/keyboards/pdxkbc/keymaps/via/keymap.c b/keyboards/pdxkbc/keymaps/via/keymap.c
new file mode 100644
index 00000000000..89d98dea893
--- /dev/null
+++ b/keyboards/pdxkbc/keymaps/via/keymap.c
@@ -0,0 +1,41 @@
+/* Copyright 2019 Franklin Harding
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ MACRO00, MACRO01,
+ MACRO02, MACRO03,
+ KC_VOLU, KC_VOLD
+ ),
+
+ [1] = LAYOUT(
+ _______, _______,
+ _______, _______,
+ _______, _______
+ ),
+
+ [2] = LAYOUT(
+ _______, _______,
+ _______, _______,
+ _______, _______
+ ),
+
+ [3] = LAYOUT(
+ _______, _______,
+ _______, _______,
+ _______, _______
+ ),
+};
diff --git a/keyboards/pdxkbc/keymaps/via/rules.mk b/keyboards/pdxkbc/keymaps/via/rules.mk
new file mode 100644
index 00000000000..36b7ba9cbc9
--- /dev/null
+++ b/keyboards/pdxkbc/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/pdxkbc/pdxkbc.c b/keyboards/pdxkbc/pdxkbc.c
index 26c2d2fe4fd..dd464c561af 100644
--- a/keyboards/pdxkbc/pdxkbc.c
+++ b/keyboards/pdxkbc/pdxkbc.c
@@ -14,38 +14,3 @@
* along with this program. If not, see .
*/
#include "pdxkbc.h"
-
-// Optional override functions below.
-// You can leave any or all of these undefined.
-// These are only required if you want to perform custom actions.
-
-/*
-
-void matrix_init_kb(void) {
- // put your keyboard start-up code here
- // runs once when the firmware starts up
-
- matrix_init_user();
-}
-
-void matrix_scan_kb(void) {
- // put your looping keyboard code here
- // runs every cycle (a lot)
-
- matrix_scan_user();
-}
-
-bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
- // put your per-action keyboard code here
- // runs for every action, just before processing by the firmware
-
- return process_record_user(keycode, record);
-}
-
-void led_set_kb(uint8_t usb_led) {
- // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
-
- led_set_user(usb_led);
-}
-
-*/
diff --git a/keyboards/pearl/rules.mk b/keyboards/pearl/rules.mk
index 79b783e4213..a9746c0d3dd 100644
--- a/keyboards/pearl/rules.mk
+++ b/keyboards/pearl/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = no
MOUSEKEY_ENABLE = no
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
diff --git a/keyboards/pearl/usbconfig.h b/keyboards/pearl/usbconfig.h
deleted file mode 100644
index e65d210ace8..00000000000
--- a/keyboards/pearl/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/percent/canoe/config.h b/keyboards/percent/canoe/config.h
index b6cc5df2376..c6720ea16d8 100644
--- a/keyboards/percent/canoe/config.h
+++ b/keyboards/percent/canoe/config.h
@@ -23,7 +23,7 @@ along with this program. If not, see .
#define VENDOR_ID 0x20A0
#define PRODUCT_ID 0x422D
#define DEVICE_VER 0x0200
-#define MANUFACTURER NotActuallyPercent
+#define MANUFACTURER Percent Studios
#define PRODUCT CANOE
#define RGBLED_NUM 2
diff --git a/keyboards/percent/canoe/rules.mk b/keyboards/percent/canoe/rules.mk
index 9661eaefeb2..8b30163be45 100644
--- a/keyboards/percent/canoe/rules.mk
+++ b/keyboards/percent/canoe/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = full
MOUSEKEY_ENABLE = no
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
diff --git a/keyboards/percent/canoe/usbconfig.h b/keyboards/percent/canoe/usbconfig.h
deleted file mode 100644
index 85a915bb463..00000000000
--- a/keyboards/percent/canoe/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/percent/skog/config.h b/keyboards/percent/skog/config.h
index cbfb2b6a567..099de6da216 100644
--- a/keyboards/percent/skog/config.h
+++ b/keyboards/percent/skog/config.h
@@ -21,7 +21,7 @@ along with this program. If not, see .
#define PRODUCT_ID 0x422D
#define DEVICE_VER 0x0200
-#define MANUFACTURER Percent
+#define MANUFACTURER Percent Studios
#define PRODUCT Skog TKL
/* matrix size */
diff --git a/keyboards/percent/skog/rules.mk b/keyboards/percent/skog/rules.mk
index 0d243b85810..02748456441 100644
--- a/keyboards/percent/skog/rules.mk
+++ b/keyboards/percent/skog/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = full
MOUSEKEY_ENABLE = no
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
diff --git a/keyboards/percent/skog/usbconfig.h b/keyboards/percent/skog/usbconfig.h
deleted file mode 100644
index 3a062865880..00000000000
--- a/keyboards/percent/skog/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'P','e','r','c','e','n','t'
-#define USB_CFG_VENDOR_NAME_LEN 7
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'S','k','o','g',' ','T','K','L'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/percent/skog_lite/config.h b/keyboards/percent/skog_lite/config.h
index a3d4a225f1a..625effca86f 100644
--- a/keyboards/percent/skog_lite/config.h
+++ b/keyboards/percent/skog_lite/config.h
@@ -22,7 +22,7 @@ along with this program. If not, see .
#define VENDOR_ID 0x20A0
#define PRODUCT_ID 0x422D
#define DEVICE_VER 0x0200
-#define MANUFACTURER Percent
+#define MANUFACTURER Percent Studios
#define PRODUCT Skog Lite
#define RGBLED_NUM 18
diff --git a/keyboards/percent/skog_lite/usbconfig.h b/keyboards/percent/skog_lite/usbconfig.h
deleted file mode 100644
index e65d210ace8..00000000000
--- a/keyboards/percent/skog_lite/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/pimentoso/paddino02/config.h b/keyboards/pimentoso/paddino02/config.h
new file mode 100644
index 00000000000..38be477a504
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/config.h
@@ -0,0 +1,20 @@
+/*
+Copyright 2020 Michele Ferri
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
diff --git a/keyboards/pimentoso/paddino02/readme.md b/keyboards/pimentoso/paddino02/readme.md
new file mode 100644
index 00000000000..1e9518351a3
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/readme.md
@@ -0,0 +1,33 @@
+# Paddino02
+
+10-keys DIY mechanical macropad/gamepad. Features staggered columns, 2 thumb keys, symmetric PCB (you can build right-handed and left-handed versions with the same PCB).
+
+Project page on Github, with build steps and 3d-printable files:
+
+https://github.com/Pimentoso/Paddino02
+
+* Keyboard Maintainer: [Michele Ferri](https://github.com/Pimentoso)
+* Hardware Supported: Paddino02 PCB rev1, rev2 + Arduino Pro Micro
+* Hardware Availability: the PCB is open source and can be freely printed at websites such as [JLCPCB](https://jlcpcb.com/)
+
+### To compile:
+
+`make pimentoso/paddino02/rev2/right:default`
+
+`make pimentoso/paddino02/rev2/left:default`
+
+`make pimentoso/paddino02/rev1:default` (legacy version of the PCB)
+
+### To flash:
+
+`make pimentoso/paddino02/rev2/right:default:flash`
+
+`make pimentoso/paddino02/rev2/left:default:flash`
+
+`make pimentoso/paddino02/rev1:default:flash` (legacy version of the PCB)
+
+### Default keymap
+
+
+
+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).
diff --git a/keyboards/pimentoso/paddino02/rev1/config.h b/keyboards/pimentoso/paddino02/rev1/config.h
new file mode 100755
index 00000000000..8dfc4ac051a
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/rev1/config.h
@@ -0,0 +1,45 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xD00D
+#define PRODUCT_ID 0x0020
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Pimentoso
+#define PRODUCT Paddino02 rev1
+#define DESCRIPTION 10-key ergo macropad
+
+/* key matrix size */
+#define MATRIX_ROWS 3
+#define MATRIX_COLS 4
+
+/* key matrix pins */
+#define MATRIX_ROW_PINS { D1, D0, D4 }
+#define MATRIX_COL_PINS { D7, E6, B4, B5 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION ROW2COL
+
+/* number of backlight levels */
+#define BACKLIGHT_LEVELS 3
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+#ifdef RGB_DI_PIN
+#define RGBLIGHT_ANIMATIONS
+
+#define RGBLED_NUM 0
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+#define RGBLIGHT_SLEEP
+#endif
diff --git a/keyboards/pimentoso/paddino02/rev1/keymaps/default/keymap.c b/keyboards/pimentoso/paddino02/rev1/keymaps/default/keymap.c
new file mode 100755
index 00000000000..343ae043b40
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/rev1/keymaps/default/keymap.c
@@ -0,0 +1,15 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ LAYOUT(
+ KC_ESC, KC_BTN1, KC_UP, KC_BTN2,
+ KC_LSFT, KC_LEFT, KC_DOWN, KC_RGHT,
+ MO(1), KC_SPC),
+
+ LAYOUT(
+ KC_MY_COMPUTER, KC_MPRV, KC_MPLY, KC_MNXT,
+ KC_WWW_HOME, KC_MUTE, KC_VOLD, KC_VOLU,
+ KC_TRNS, KC_ENT)
+
+};
diff --git a/keyboards/pimentoso/paddino02/rev1/rev1.c b/keyboards/pimentoso/paddino02/rev1/rev1.c
new file mode 100644
index 00000000000..9ebd22df794
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/rev1/rev1.c
@@ -0,0 +1,16 @@
+/* Copyright 2020 Michele Ferri
+ *
+ * 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 .
+ */
+#include "rev1.h"
diff --git a/keyboards/pimentoso/paddino02/rev1/rev1.h b/keyboards/pimentoso/paddino02/rev1/rev1.h
new file mode 100755
index 00000000000..cca4a3c2631
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/rev1/rev1.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K00, K01, K02, K03, \
+ K10, K11, K12, K13, \
+ K22, K23 \
+) { \
+ { K00, K01, K02, K03 }, \
+ { K10, K11, K12, K13 }, \
+ { KC_NO, KC_NO, K22, K23 } \
+}
diff --git a/keyboards/pimentoso/paddino02/rev1/rules.mk b/keyboards/pimentoso/paddino02/rev1/rules.mk
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/pimentoso/paddino02/rev2/left/config.h b/keyboards/pimentoso/paddino02/rev2/left/config.h
new file mode 100755
index 00000000000..43249d269cd
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/rev2/left/config.h
@@ -0,0 +1,45 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xD00D
+#define PRODUCT_ID 0x0021
+#define DEVICE_VER 0x0002
+#define MANUFACTURER Pimentoso
+#define PRODUCT Paddino02 rev2
+#define DESCRIPTION 10-key ergo macropad
+
+/* key matrix size */
+#define MATRIX_ROWS 3
+#define MATRIX_COLS 4
+
+/* key matrix pins */
+#define MATRIX_ROW_PINS { D0, D4, D1 }
+#define MATRIX_COL_PINS { D7, E6, B4, B5 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* number of backlight levels */
+#define BACKLIGHT_LEVELS 3
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+#ifdef RGB_DI_PIN
+#define RGBLIGHT_ANIMATIONS
+
+#define RGBLED_NUM 0
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+#define RGBLIGHT_SLEEP
+#endif
diff --git a/keyboards/pimentoso/paddino02/rev2/left/keymaps/default/keymap.c b/keyboards/pimentoso/paddino02/rev2/left/keymaps/default/keymap.c
new file mode 100755
index 00000000000..343ae043b40
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/rev2/left/keymaps/default/keymap.c
@@ -0,0 +1,15 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ LAYOUT(
+ KC_ESC, KC_BTN1, KC_UP, KC_BTN2,
+ KC_LSFT, KC_LEFT, KC_DOWN, KC_RGHT,
+ MO(1), KC_SPC),
+
+ LAYOUT(
+ KC_MY_COMPUTER, KC_MPRV, KC_MPLY, KC_MNXT,
+ KC_WWW_HOME, KC_MUTE, KC_VOLD, KC_VOLU,
+ KC_TRNS, KC_ENT)
+
+};
diff --git a/keyboards/pimentoso/paddino02/rev2/left/left.c b/keyboards/pimentoso/paddino02/rev2/left/left.c
new file mode 100644
index 00000000000..26e31efb895
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/rev2/left/left.c
@@ -0,0 +1,16 @@
+/* Copyright 2020 Michele Ferri
+ *
+ * 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 .
+ */
+#include "left.h"
diff --git a/keyboards/pimentoso/paddino02/rev2/left/left.h b/keyboards/pimentoso/paddino02/rev2/left/left.h
new file mode 100755
index 00000000000..cca4a3c2631
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/rev2/left/left.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K00, K01, K02, K03, \
+ K10, K11, K12, K13, \
+ K22, K23 \
+) { \
+ { K00, K01, K02, K03 }, \
+ { K10, K11, K12, K13 }, \
+ { KC_NO, KC_NO, K22, K23 } \
+}
diff --git a/keyboards/pimentoso/paddino02/rev2/left/rules.mk b/keyboards/pimentoso/paddino02/rev2/left/rules.mk
new file mode 100755
index 00000000000..e69de29bb2d
diff --git a/keyboards/pimentoso/paddino02/rev2/right/config.h b/keyboards/pimentoso/paddino02/rev2/right/config.h
new file mode 100755
index 00000000000..4ef42b97704
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/rev2/right/config.h
@@ -0,0 +1,45 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xD00D
+#define PRODUCT_ID 0x0022
+#define DEVICE_VER 0x0002
+#define MANUFACTURER Pimentoso
+#define PRODUCT Paddino02 rev2
+#define DESCRIPTION 10-key ergo macropad
+
+/* key matrix size */
+#define MATRIX_ROWS 3
+#define MATRIX_COLS 4
+
+/* key matrix pins */
+#define MATRIX_ROW_PINS { F4, F6, F5 }
+#define MATRIX_COL_PINS { B6, B2, B3, B1 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* number of backlight levels */
+#define BACKLIGHT_LEVELS 3
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+#ifdef RGB_DI_PIN
+#define RGBLIGHT_ANIMATIONS
+
+#define RGBLED_NUM 0
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+#define RGBLIGHT_SLEEP
+#endif
diff --git a/keyboards/pimentoso/paddino02/rev2/right/keymaps/default/keymap.c b/keyboards/pimentoso/paddino02/rev2/right/keymaps/default/keymap.c
new file mode 100755
index 00000000000..0cc38837d32
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/rev2/right/keymaps/default/keymap.c
@@ -0,0 +1,15 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ LAYOUT(
+ KC_ESC, KC_BTN2, KC_UP, KC_BTN1,
+ KC_LSFT, KC_RGHT, KC_DOWN, KC_LEFT,
+ MO(1), KC_SPC),
+
+ LAYOUT(
+ KC_MY_COMPUTER, KC_MNXT, KC_MPLY, KC_MPRV,
+ KC_WWW_HOME, KC_MUTE, KC_VOLU, KC_VOLD,
+ KC_TRNS, KC_ENT)
+
+};
diff --git a/keyboards/pimentoso/paddino02/rev2/right/right.c b/keyboards/pimentoso/paddino02/rev2/right/right.c
new file mode 100644
index 00000000000..872541271a8
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/rev2/right/right.c
@@ -0,0 +1,16 @@
+/* Copyright 2020 Michele Ferri
+ *
+ * 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 .
+ */
+#include "right.h"
diff --git a/keyboards/pimentoso/paddino02/rev2/right/right.h b/keyboards/pimentoso/paddino02/rev2/right/right.h
new file mode 100755
index 00000000000..ac7ed847de2
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/rev2/right/right.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K00, K01, K02, K03, \
+ K10, K11, K12, K13, \
+ K20, K21 \
+) { \
+ { K03, K02, K01, K00 }, \
+ { K13, K12, K11, K10 }, \
+ { K21, K20, KC_NO, KC_NO } \
+}
diff --git a/keyboards/pimentoso/paddino02/rev2/right/rules.mk b/keyboards/pimentoso/paddino02/rev2/right/rules.mk
new file mode 100755
index 00000000000..e69de29bb2d
diff --git a/keyboards/pimentoso/paddino02/rules.mk b/keyboards/pimentoso/paddino02/rules.mk
new file mode 100755
index 00000000000..4c2dab1eef4
--- /dev/null
+++ b/keyboards/pimentoso/paddino02/rules.mk
@@ -0,0 +1,27 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+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
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = no # Audio output on port C6
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
+KEY_LOCK_ENABLE = no # Allows locking any key.
diff --git a/keyboards/plaid/config.h b/keyboards/plaid/config.h
index 8005df2ce94..4d7bedee5fc 100644
--- a/keyboards/plaid/config.h
+++ b/keyboards/plaid/config.h
@@ -25,7 +25,7 @@ along with this program. If not, see .
#define PRODUCT_ID 0x27db
#define DEVICE_VER 0x0002
#define MANUFACTURER dm9records
-#define PRODUCT plaid
+#define PRODUCT Plaid
#define DESCRIPTION 12x4 ortholinear keyboard with through hole components
/* key matrix size */
diff --git a/keyboards/plaid/keymaps/via/config.h b/keyboards/plaid/keymaps/via/config.h
new file mode 100644
index 00000000000..4c84c55b848
--- /dev/null
+++ b/keyboards/plaid/keymaps/via/config.h
@@ -0,0 +1,6 @@
+// These VID/PID is not verified. Use at your own risk.
+#undef VENDOR_ID
+#undef PRODUCT_ID
+
+#define VENDOR_ID 0x0d39
+#define PRODUCT_ID 0x0001
diff --git a/keyboards/plaid/keymaps/via/keymap.c b/keyboards/plaid/keymaps/via/keymap.c
new file mode 100644
index 00000000000..7bb28c07edd
--- /dev/null
+++ b/keyboards/plaid/keymaps/via/keymap.c
@@ -0,0 +1,101 @@
+/* Copyright 2020 Takuya Urakawa (dm9records.com)
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+#define LOWER FN_MO13
+#define RAISE FN_MO23
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | RAlt | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[0] = LAYOUT_plaid_grid(
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT ,
+ KC_LCTL, KC_RALT, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+),
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | Home | End | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[1] = LAYOUT_plaid_grid(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_HOME, KC_END, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+),
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | DEL | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / |Pg Up |Pg Dn | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+[2] = LAYOUT_plaid_grid(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+),
+
+/*
+ * ,-----------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+[3] = LAYOUT_plaid_grid(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+)
+
+};
+bool led_update_user(led_t led_state) {
+ writePin(LED_RED, led_state.caps_lock);
+ writePin(LED_GREEN, led_state.scroll_lock);
+ return false;
+}
diff --git a/keyboards/plaid/keymaps/via/readme.md b/keyboards/plaid/keymaps/via/readme.md
new file mode 100644
index 00000000000..28dd6721114
--- /dev/null
+++ b/keyboards/plaid/keymaps/via/readme.md
@@ -0,0 +1,8 @@
+# The via keymap for plaid
+
+This is an experimental. Use at your own risk.
+
+Layer3 is activated when Layer1 and 2 are both on.
+
+LED RED : CAPSLOCK
+LED GREEN : SCROLLLOCK
diff --git a/keyboards/plaid/keymaps/via/rules.mk b/keyboards/plaid/keymaps/via/rules.mk
new file mode 100644
index 00000000000..930e3552ad0
--- /dev/null
+++ b/keyboards/plaid/keymaps/via/rules.mk
@@ -0,0 +1,3 @@
+VIA_ENABLE = yes
+MOUSEKEY_ENABLE = no
+EXTRAKEY_ENABLE = no
diff --git a/keyboards/plaid/usbconfig.h b/keyboards/plaid/usbconfig.h
deleted file mode 100644
index ba48a326493..00000000000
--- a/keyboards/plaid/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 0
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'd','m','9','r','e','c','o','r','d','s'
-#define USB_CFG_VENDOR_NAME_LEN 10
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'P', 'l', 'a', 'i', 'd'
-#define USB_CFG_DEVICE_NAME_LEN 5
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-#define USB_CFG_SERIAL_NUMBER 'd','m','9','r','e','c','o','r','d','s','.','c','o','m',':','p','1'
-#define USB_CFG_SERIAL_NUMBER_LEN 17
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-// #define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-// /* #define USB_INTR_CFG_CLR 0 */
-// /* #define USB_INTR_ENABLE EIMSK */
-// #define USB_INTR_ENABLE_BIT INT1
-// /* #define USB_INTR_PENDING EIFR */
-// #define USB_INTR_PENDING_BIT INTF1
-// #define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/planck/keymaps/oeywil/.gitignore b/keyboards/planck/keymaps/oeywil/.gitignore
deleted file mode 100644
index 03b2b466681..00000000000
--- a/keyboards/planck/keymaps/oeywil/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-secrets.h
diff --git a/keyboards/planck/keymaps/oeywil/config.h b/keyboards/planck/keymaps/oeywil/config.h
deleted file mode 100644
index 09b22e193e8..00000000000
--- a/keyboards/planck/keymaps/oeywil/config.h
+++ /dev/null
@@ -1,37 +0,0 @@
-#pragma once
-
-#ifdef AUDIO_ENABLE
- #define STARTUP_SONG SONG(PLANCK_SOUND)
- // #define STARTUP_SONG SONG(NO_SOUND)
-#endif
-
-/*
- * MIDI options
- */
-
-/* Prevent use of disabled MIDI features in the keymap */
-//#define MIDI_ENABLE_STRICT 1
-
-/* enable basic MIDI features:
- - MIDI notes can be sent when in Music mode is on
-*/
-
-#define MIDI_BASIC
-
-/* enable advanced MIDI features:
- - MIDI notes can be added to the keymap
- - Octave shift and transpose
- - Virtual sustain, portamento, and modulation wheel
- - etc.
-*/
-//#define MIDI_ADVANCED
-
-/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
-//#define MIDI_TONE_KEYCODE_OCTAVES 2
-
-// Leader Key
-#define LEADER_TIMEOUT 250
-#define LEADER_PER_KEY_TIMING
-
-// Tap dance
-#define TAPPING_TERM 200
diff --git a/keyboards/planck/keymaps/oeywil/keymap.c b/keyboards/planck/keymaps/oeywil/keymap.c
deleted file mode 100644
index 59e76cab12b..00000000000
--- a/keyboards/planck/keymaps/oeywil/keymap.c
+++ /dev/null
@@ -1,392 +0,0 @@
-#include QMK_KEYBOARD_H
-#include "no_keycodes.h"
-
-#if __has_include("secrets.h")
-# include "secrets.h"
-#else
-# define mail_str ""
-# define pwd_str ""
-#endif
-
-// layer definitions
-enum planck_layers {
- _DEFAULT,
- _LOWER,
- _RAISE,
- _GAME,
- _GLOW
-};
-
-// sounds
-#ifdef AUDIO_ENABLE
- float gamesong[][2] = SONG(MARIO_MUSHROOM);
- float defsong[][2] = SONG(PLOVER_GOODBYE_SOUND);
- float failed[][2] = SONG(TERMINAL_SOUND);
-#endif
-
-// leader key
-bool leader_succeed;
-bool leader_layer_game;
-bool leader_layer_def;
-LEADER_EXTERNS();
-
-void matrix_scan_user(void) {
- LEADER_DICTIONARY() {
- leader_succeed = leading = false;
- leader_layer_game = false;
- leader_layer_def = false;
-
- SEQ_TWO_KEYS(KC_P, KC_P) {
- SEND_STRING(pwd_str);
- leader_succeed = true;
- }
- SEQ_TWO_KEYS(KC_P, KC_M) {
- SEND_STRING(mail_str);
- leader_succeed = true;
- }
- SEQ_TWO_KEYS(KC_B, KC_B) {
- SEND_STRING("build"SS_TAP(X_ENTER));
- leader_succeed = true;
- }
- SEQ_TWO_KEYS(KC_B, KC_F) {
- SEND_STRING("flash"SS_TAP(X_ENTER));
- reset_keyboard();
- leader_succeed = true;
- }
- SEQ_TWO_KEYS(KC_L, KC_G) {
- layer_on(_GAME);
- leader_layer_game = true;
- }
- SEQ_TWO_KEYS(KC_L, KC_D) {
- layer_off(_GAME);
- leader_layer_def = true;
- }
- leader_end();
- }
-}
-
-void leader_end(void) {
- if (leader_succeed) {
- // do nothing
- } else if (leader_layer_game) {
- #ifdef AUDIO_ENABLE
- PLAY_SONG(gamesong);
- #endif
- } else if (leader_layer_def) {
- #ifdef AUDIO_ENABLE
- PLAY_SONG(defsong);
- #endif
- } else {
- #ifdef AUDIO_ENABLE
- PLAY_SONG(failed);
- #endif
- }
-}
-
-// tap dance definitions
-typedef struct {
- bool is_press_action;
- int state;
-} tap;
-
-enum {
- SINGLE_TAP = 1,
- SINGLE_HOLD = 2,
- DOUBLE_TAP = 3,
- DOUBLE_HOLD = 4,
- DOUBLE_SINGLE_TAP = 5,
- TRIPLE_TAP = 6,
- TRIPLE_HOLD = 7
-};
-
-enum {
- TD_LSFT = 0,
- TD_LCTL,
- TD_RSFT,
- TD_RCTL
-};
-
-int cur_dance (qk_tap_dance_state_t *state);
-void lsft_finished (qk_tap_dance_state_t *state, void *user_data);
-void lsft_reset (qk_tap_dance_state_t *state, void *user_data);
-void rsft_finished (qk_tap_dance_state_t *state, void *user_data);
-void rsft_reset (qk_tap_dance_state_t *state, void *user_data);
-void lctl_finished (qk_tap_dance_state_t *state, void *user_data);
-void lctl_reset (qk_tap_dance_state_t *state, void *user_data);
-void rctl_finished (qk_tap_dance_state_t *state, void *user_data);
-void rctl_reset (qk_tap_dance_state_t *state, void *user_data);
-
-// layer declarations
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- /* Default
- * ,-----------------------------------------------------------------------------------.
- * | Tab | Q | W | E | R | T | Y | U | I | O | Å | BkSp |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Esc | A | S | D | F | G | H | J | K | L | Ø | Æ |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Shift| Z | X | C | V | B | N | M | P | , | . | Shift|
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Ctrl | Lead | Win | Alt | Lower| Space| Enter| Raise| AltGr| App | Lead | Ctrl |
- * `-----------------------------------------------------------------------------------'
- */
- [_DEFAULT] = LAYOUT_planck_grid(
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, NO_AA, KC_BSPC,
- KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, NO_OE, NO_AE,
- TD(TD_LSFT), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_P, KC_COMM, KC_DOT, TD(TD_RSFT),
- TD(TD_LCTL), KC_LEAD, KC_LGUI, KC_LALT, MO(_LOWER), KC_SPC, KC_ENT, MO(_RAISE), KC_ALGR, KC_APP, KC_LEAD, TD(TD_RCTL)
- ),
- /* Lower
- * ,-----------------------------------------------------------------------------------.
- * | Tab | | PgUp | | | | F7 | F8 | F9 | Del |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | BkSp | Left | Down | Right| PgDn | | | | F4 | F5 | F6 | |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift| Home | | End | | | | | F1 | F2 | F3 | Shift|
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Ctrl | | Win | Alt | Lower| M_PP |M_Next| | | Mute | VolD | VolUp|
- * `-----------------------------------------------------------------------------------'
- */
- [_LOWER] = LAYOUT_planck_grid(
- KC_TRNS, LCTL(KC_LEFT), KC_UP, LCTL(KC_RIGHT), KC_PGUP, KC_NO, KC_NO, KC_NO, KC_F7, KC_F8, KC_F9, KC_DEL,
- KC_BSPC, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDN, KC_NO, KC_NO, KC_NO, KC_F4, KC_F5, KC_F6, KC_NO,
- KC_TRNS, KC_HOME, KC_NO, KC_END, KC_NO, KC_NO, KC_NO, KC_NO, KC_F1, KC_F2, KC_F3, KC_TRNS,
- KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_NO, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU
- ),
- /* Raise
- * ,-----------------------------------------------------------------------------------.
- * | Tab | ! | ? | # | * | | | = | / | 7 | 8 | 9 | Ins |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | BkSp | @ | & | $ | % | ~ | + | \ | 4 | 5 | 6 | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Shift| ' | " | ¨ | | | - | 0 | 1 | 2 | 3 | Shift|
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Ctrl | | Win | Alt | | Space| Enter| Raise| AltGr| | | |
- * `-----------------------------------------------------------------------------------'
- */
- [_RAISE] = LAYOUT_planck_grid(
- KC_TRNS, NO_EXCL, NO_QEST, NO_HASH, NO_ASTE, NO_PIPE, NO_EQUA, NO_FSLS, KC_7, KC_8, KC_9, KC_INS,
- KC_BSPC, NO_ALFA, NO_AMPE, NO_USDO, NO_PERC, NO_TILD, NO_PLUS, NO_BSLS, KC_4, KC_5, KC_6, KC_NO,
- KC_TRNS, NO_APOS, NO_QUOT, NO_UMLA, KC_NO, KC_NO, NO_DASH, KC_0, KC_1, KC_2, KC_3, KC_TRNS,
- KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_NO
- ),
- /* Game
- * ,-----------------------------------------------------------------------------------.
- * | Tab | Q | W | E | R | T | Y | U | I | O | | BkSp |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Esc | A | S | D | F | G | H | J | K | L | | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Shift| Z | X | C | V | B | N | M | P | , | . | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Ctrl | Lead | | Alt | Lower| Space| Enter| Lower| | | Lead | |
- * `-----------------------------------------------------------------------------------'
- */
- [_GAME] = LAYOUT_planck_grid(
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_NO, KC_BSPC,
- KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_NO, KC_NO,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_P, KC_COMM, KC_DOT, KC_NO,
- KC_LCTL, KC_LEAD, KC_NO, KC_LALT, MO(_GLOW), KC_SPC, KC_ENT, MO(_GLOW), KC_NO, KC_NO, KC_LEAD, KC_NO
- ),
- /* Game lower
- * ,-----------------------------------------------------------------------------------.
- * | Tab | 1 | 2 | 3 | | | | | | | | Steam|
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Esc | 4 | 5 | 6 | | | | | | | | F12 |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Shift| 7 | 8 | 9 | 0 | | | | | | | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Ctrl | | | Alt | | PlyPa| Next | | | Mute | VolD | VolUp|
- * `-----------------------------------------------------------------------------------'
- */
- [_GLOW] = LAYOUT_planck_grid(
- KC_TRNS, KC_1, KC_2, KC_3, KC_PPLS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, LSFT(KC_F7),
- KC_TRNS, KC_4, KC_5, KC_6, KC_PMNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_F12,
- KC_TRNS, KC_7, KC_8, KC_9, KC_0, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MUTE,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MNXT, KC_NO, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU
- )
-};
-
-// tap dance declarations
-int cur_dance (qk_tap_dance_state_t *state) {
- if (state->count == 1) {
- if (state->interrupted || !state->pressed) return SINGLE_TAP;
- else return SINGLE_HOLD;
- }
- else if (state->count == 2) {
- if (state->interrupted) return DOUBLE_SINGLE_TAP;
- else if (state->pressed) return DOUBLE_HOLD;
- else return DOUBLE_TAP;
- }
- if (state->count == 3) {
- if (state->interrupted || !state->pressed) return TRIPLE_TAP;
- else return TRIPLE_HOLD;
- }
- else return 8;
-}
-
-static tap xtap_state = {
- .is_press_action = true,
- .state = 0
-};
-
-void lsft_finished (qk_tap_dance_state_t *state, void *user_data) {
- xtap_state.state = cur_dance(state);
- switch (xtap_state.state) {
- case SINGLE_TAP:
- register_code16(LSFT(KC_8));
- break;
- case SINGLE_HOLD:
- register_code(KC_LSFT);
- break;
- case DOUBLE_TAP:
- register_code(KC_NUBS);
- break;
- case DOUBLE_SINGLE_TAP:
- register_code(KC_NUBS);
- break;
- }
-}
-
-void lsft_reset (qk_tap_dance_state_t *state, void *user_data) {
- switch (xtap_state.state) {
- case SINGLE_TAP:
- unregister_code16(LSFT(KC_8));
- break;
- case SINGLE_HOLD:
- unregister_code(KC_LSFT);
- break;
- case DOUBLE_TAP:
- unregister_code(KC_NUBS);
- break;
- case DOUBLE_SINGLE_TAP:
- unregister_code(KC_NUBS);
- break;
- }
- xtap_state.state = 0;
-}
-
-void rsft_finished (qk_tap_dance_state_t *state, void *user_data) {
- xtap_state.state = cur_dance(state);
- switch (xtap_state.state) {
- case SINGLE_TAP:
- register_code16(LSFT(KC_9));
- break;
- case SINGLE_HOLD:
- register_code(KC_RSFT);
- break;
- case DOUBLE_TAP:
- register_code16(LSFT(KC_NUBS));
- break;
- case DOUBLE_SINGLE_TAP:
- register_code16(LSFT(KC_NUBS));
- break;
- }
-}
-
-void rsft_reset (qk_tap_dance_state_t *state, void *user_data) {
- switch (xtap_state.state) {
- case SINGLE_TAP:
- unregister_code16(LSFT(KC_9));
- break;
- case SINGLE_HOLD:
- unregister_code(KC_RSFT);
- break;
- case DOUBLE_TAP:
- unregister_code16(LSFT(KC_NUBS));
- break;
- case DOUBLE_SINGLE_TAP:
- unregister_code16(LSFT(KC_NUBS));
- break;
- }
- xtap_state.state = 0;
-}
-
-void lctl_finished (qk_tap_dance_state_t *state, void *user_data) {
- xtap_state.state = cur_dance(state);
- switch (xtap_state.state) {
- case SINGLE_TAP:
- register_mods(MOD_BIT(KC_ALGR));
- register_code(KC_7);
- break;
- case SINGLE_HOLD:
- register_code(KC_LCTL);
- break;
- case DOUBLE_TAP:
- register_mods(MOD_BIT(KC_ALGR));
- register_code(KC_8);
- break;
- case DOUBLE_SINGLE_TAP:
- register_mods(MOD_BIT(KC_ALGR));
- register_code(KC_8);
-break;
- }
-}
-
-void lctl_reset (qk_tap_dance_state_t *state, void *user_data) {
- switch (xtap_state.state) {
- case SINGLE_TAP:
- unregister_code(KC_7);
- unregister_mods(MOD_BIT(KC_ALGR));
- break;
- case SINGLE_HOLD:
- unregister_code(KC_LCTL);
- break;
- case DOUBLE_TAP:
- unregister_code(KC_8);
- unregister_mods(MOD_BIT(KC_ALGR));
- break;
- case DOUBLE_SINGLE_TAP:
- unregister_code(KC_8);
- unregister_mods(MOD_BIT(KC_ALGR));
-break;
- }
- xtap_state.state = 0;
-}
-
-void rctl_finished (qk_tap_dance_state_t *state, void *user_data) {
- xtap_state.state = cur_dance(state);
- switch (xtap_state.state) {
- case SINGLE_TAP:
- register_mods(MOD_BIT(KC_ALGR));
- register_code(KC_0);
- break;
- case SINGLE_HOLD:
- register_code(KC_RCTL);
- break;
- case DOUBLE_TAP:
- register_mods(MOD_BIT(KC_ALGR));
- register_code(KC_9);
- break;
- case DOUBLE_SINGLE_TAP:
- register_mods(MOD_BIT(KC_ALGR));
- register_code(KC_9);
- break;
- }
-}
-
-void rctl_reset (qk_tap_dance_state_t *state, void *user_data) {
- switch (xtap_state.state) {
- case SINGLE_TAP:
- unregister_code(KC_0);
- unregister_mods(MOD_BIT(KC_ALGR));
- break;
- case SINGLE_HOLD:
- unregister_code(KC_RCTL);
- break;
- case DOUBLE_TAP:
- unregister_code(KC_9);
- unregister_mods(MOD_BIT(KC_ALGR));
- break;
- case DOUBLE_SINGLE_TAP:
- unregister_code(KC_9);
- unregister_mods(MOD_BIT(KC_ALGR));
- break;
- }
- xtap_state.state = 0;
-}
-
-qk_tap_dance_action_t tap_dance_actions[] = {
- [TD_LSFT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, lsft_finished, lsft_reset),
- [TD_RSFT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, rsft_finished, rsft_reset),
- [TD_LCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, lctl_finished, lctl_reset),
- [TD_RCTL] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, rctl_finished, rctl_reset),
-};
diff --git a/keyboards/planck/keymaps/oeywil/no_keycodes.h b/keyboards/planck/keymaps/oeywil/no_keycodes.h
deleted file mode 100644
index c412c35d81b..00000000000
--- a/keyboards/planck/keymaps/oeywil/no_keycodes.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// øæå
-#define NO_OE KC_SCLN
-#define NO_AE KC_QUOT
-#define NO_AA KC_LBRC
-// rename
-#define NO_ANBR KC_NUBS
-#define NO_APOS KC_BSLS
-#define NO_BSLS KC_EQL
-#define NO_DASH KC_SLSH
-#define NO_PLUS KC_MINS
-#define NO_UMLA KC_RBRC
-#define NO_PIPE KC_GRV
-// shifted
-#define NO_EXCL LSFT(KC_1)
-#define NO_QUOT LSFT(KC_2)
-#define NO_HASH LSFT(KC_3)
-#define NO_PERC LSFT(KC_5)
-#define NO_AMPE LSFT(KC_6)
-#define NO_FSLS LSFT(KC_7)
-#define NO_LPAR LSFT(KC_8)
-#define NO_RPAR LSFT(KC_9)
-#define NO_EQUA LSFT(KC_0)
-#define NO_QEST LSFT(KC_MINS)
-#define NO_ASTE LSFT(KC_BSLS)
-// altgr
-#define NO_ALFA ALGR(KC_2)
-#define NO_USDO ALGR(KC_4)
-#define NO_TILD ALGR(KC_RBRC)
diff --git a/keyboards/planck/keymaps/oeywil/readme.md b/keyboards/planck/keymaps/oeywil/readme.md
deleted file mode 100644
index 364f9422c71..00000000000
--- a/keyboards/planck/keymaps/oeywil/readme.md
+++ /dev/null
@@ -1,4 +0,0 @@
-About
-------
-
-A simple Norwegian grid layout using Leader Key, Tap Dance and audio.
diff --git a/keyboards/planck/keymaps/oeywil/rules.mk b/keyboards/planck/keymaps/oeywil/rules.mk
deleted file mode 100644
index 23b2611735b..00000000000
--- a/keyboards/planck/keymaps/oeywil/rules.mk
+++ /dev/null
@@ -1,11 +0,0 @@
-SRC += muse.c
-
-# Build Options
-NKRO_ENABLE = yes
-EXTRAKEY_ENABLE = yes
-LEADER_ENABLE = yes
-TAP_DANCE_ENABLE = yes
-AUDIO_ENABLE = yes
-COMMAND_ENABLE = no
-CONSOLE_ENABLE = no
-MOUSEKEY_ENABLE = no
diff --git a/keyboards/planck/keymaps/sigul/config.h b/keyboards/planck/keymaps/sigul/config.h
new file mode 100644
index 00000000000..6fa31cc8a76
--- /dev/null
+++ b/keyboards/planck/keymaps/sigul/config.h
@@ -0,0 +1,39 @@
+#pragma once
+
+#ifdef AUDIO_ENABLE
+ #define STARTUP_SONG SONG(PLANCK_SOUND)
+ // #define STARTUP_SONG SONG(NO_SOUND)
+
+ #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \
+ SONG(COLEMAK_SOUND), \
+ SONG(DVORAK_SOUND) \
+ }
+#endif
+
+/*
+ * MIDI options
+ */
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+
+#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 2
+
+// Most tactile encoders have detents every 4 stages
+#define ENCODER_RESOLUTION 4
+
diff --git a/keyboards/planck/keymaps/sigul/keymap.c b/keyboards/planck/keymaps/sigul/keymap.c
new file mode 100644
index 00000000000..b4b983d9c0e
--- /dev/null
+++ b/keyboards/planck/keymaps/sigul/keymap.c
@@ -0,0 +1,221 @@
+/*
+ *
+ * An Italian ANSI layout
+ * Version 0.3
+ *
+ * Created by Silvio Gulizia on the basis of the default Planck keymap.
+ * Thanks to SomeBuddyOnReddit, gepeirl, fauxpark, BXO511, drashna, and ridingqwerty.
+ *
+ * The layout is based on the original Planck layout when used with language set to Italian on your Mac.
+ * Accented vowels have been moverd on RAISE ("", "", and "") and LOWER ("", "", and "")
+ *
+ */
+
+#include QMK_KEYBOARD_H
+#include "muse.h"
+#include "keymap_italian_osx_ansi.h"
+#include "sigul.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * |Tab/FN| Q | W | E | R | T | Y | U | I | O | P | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |Esc/FN| A | S | D | F | G | H | J | K | L | ;: | '" |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | MS/B | N | M | ,< | .> | /! |S/Ent |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | FN | Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = LAYOUT_ortho_4x12(
+ TABFN, IT_Q, IT_W, IT_E, IT_R, IT_T, IT_Y, IT_U, IT_I, IT_O, IT_P, KC_BSPC,
+ ESCFN, IT_A, IT_S, IT_D, IT_F, IT_G, IT_H, IT_J, IT_K, IT_L, IT_SCCL, IT_APDQ,
+ KC_LSFT, IT_Z, IT_X, IT_C, IT_V, MS_B, IT_N, IT_M, IT_CMLS, IT_DTMR, IT_SLQS, MT(MOD_RSFT, KC_ENT),
+ FN, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+),
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | F1 | F2 | F3 | F4 | F5 | | _ | = | | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F6 | F7 | F8 | F9 | |NUMPAD| | | { | } | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+
+[_LOWER] = LAYOUT_ortho_4x12(
+ IT_TILDE, IT_EXLM, IT_AT, IT_SHRP, IT_DLR, IT_PERC, IT_CRC, IT_AMPR, IT_ASTR, IT_LPRN, IT_RPRN, KC_DEL,
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, S(IT_MINS), IT_EQL, S(IT_EACC), IT_OACC, IT_AACC,
+ _______, KC_F6, KC_F7, KC_F8, KC_F9, _______, NUMPAD, S(IT_UACC), IT_PLMN, IT_LCBR, IT_RCBR, IT_PIPE,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+),
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | SGCOM| DESK | | | | - | + | | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Caps | | PHONE| SVIV |VIVERE| |NUMPAD| | | [ | ] | \ |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | Home | PgDn | PgUp | End |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = LAYOUT_ortho_4x12(
+ IT_GRAVE, IT_1, IT_2, IT_3, IT_4, IT_5, IT_6, IT_7, IT_8, IT_9, IT_0, _______,
+ _______, _______, SECRET2, SECRET1, _______, _______, _______, IT_MINS, IT_PLUS, IT_EACC, IT_IACC, IT_UACC,
+ KC_CAPS, _______, SECRET0, SECRET3, SECRET4, _______, NUMPAD, _______, _______, IT_LBRC, IT_RBRC, IT_BSLS,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_PGUP, KC_END
+),
+
+/* Numpad
+ * ,-----------------------------------------------------------------------------------.
+ * | | | | | | | | 7 | 8 | 9 | - | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | | | 4 | 5 | 6 | + | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | |NUMPAD| 1 | 2 | 3 | = | Ent |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | 0 | / | * | |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_NUMPAD] = LAYOUT_ortho_4x12(
+ _______, _______, _______, _______, _______, _______, _______, IT_7, IT_8, IT_9, IT_MINS, KC_BSPC,
+ _______, _______, _______, _______, _______, _______, _______, IT_4, IT_5, IT_6, IT_PLUS, _______,
+ _______, _______, _______, _______, _______, _______, NUMPAD, IT_1, IT_2, IT_3, IT_EQL, KC_ENT,
+ _______, _______, _______, _______, _______, _______, _______, _______, IT_0, IT_SLSH, IT_ASTR, _______
+),
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * | |Querty| |ResetE|Reset | | | | | | | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | |Debug | | | | | | | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | | |Music |MusON |MusOff| | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | |Voice-|Aud On|Audoff|Voice+|
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = LAYOUT_ortho_4x12(
+ _______, DF(QWERTY), _______, EEP_RST, RESET, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, DEBUG, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, MU_MOD, MU_ON, MU_OFF, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, MUV_DE, AU_ON, AU_OFF, MUV_IN
+),
+
+
+/* Function
+ * ,-----------------------------------------------------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | F1 | F2 | F3 | F4 | F5 | Left | Down | Up | Right| | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F6 | F7 | F8 | F9 | F10 | F1 | F2 | F3 | F4 | F5 | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+
+[_FN] = LAYOUT_ortho_4x12(
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_DEL,
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______,
+ _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+),
+
+/* MOUSE
+ * ,-----------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | | | | But1 |Scr Up|Scr Do| But2 |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+
+[_MOUSE] = LAYOUT_ortho_4x12(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_BTN1, KC_MS_WH_DOWN, KC_MS_WH_UP, KC_MS_BTN2,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_LEFT, KC_MS_DOWN, KC_MS_UP, KC_MS_RIGHT
+)
+
+};
+
+#ifdef AUDIO_ENABLE
+ float plover_song[][2] = SONG(PLOVER_SOUND);
+ float plover_gb_song[][2] = SONG(PLOVER_GOODBYE_SOUND);
+#endif
+
+
+bool muse_mode = false;
+uint8_t last_muse_note = 0;
+uint16_t muse_counter = 0;
+uint8_t muse_offset = 70;
+uint16_t muse_tempo = 50;
+
+void encoder_update(bool clockwise) {
+ if (muse_mode) {
+ if (IS_LAYER_ON(_RAISE)) {
+ if (clockwise) {
+ muse_offset++;
+ } else {
+ muse_offset--;
+ }
+ } else {
+ if (clockwise) {
+ muse_tempo+=1;
+ } else {
+ muse_tempo-=1;
+ }
+ }
+ } else {
+ if (clockwise) {
+ #ifdef MOUSEKEY_ENABLE
+ tap_code(KC_MS_WH_DOWN);
+ #else
+ tap_code(KC_PGDN);
+ #endif
+ } else {
+ #ifdef MOUSEKEY_ENABLE
+ tap_code(KC_MS_WH_UP);
+ #else
+ tap_code(KC_PGUP);
+ #endif
+ }
+ }
+}
+
+void matrix_scan_user(void) {
+ #ifdef AUDIO_ENABLE
+ if (muse_mode) {
+ if (muse_counter == 0) {
+ uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()];
+ if (muse_note != last_muse_note) {
+ stop_note(compute_freq_for_midi_note(last_muse_note));
+ play_note(compute_freq_for_midi_note(muse_note), 0xF);
+ last_muse_note = muse_note;
+ }
+ }
+ muse_counter = (muse_counter + 1) % muse_tempo;
+ }
+ #endif
+}
+
+bool music_mask_user(uint16_t keycode) {
+ switch (keycode) {
+ case RAISE:
+ case LOWER:
+ return false;
+ default:
+ return true;
+ }
+}
diff --git a/keyboards/planck/keymaps/sigul/readme.md b/keyboards/planck/keymaps/sigul/readme.md
new file mode 100644
index 00000000000..11000967ed0
--- /dev/null
+++ b/keyboards/planck/keymaps/sigul/readme.md
@@ -0,0 +1,32 @@
+# An ANSI Italian Planck Layout
+by Silvio Gulizia
+
+The idea behind this layout is to have an American Keyboard with accented vowels (for Italian) to avoid switching language on the Mac every time you switch form English to Italian and being able to get the advantages that comes with the American (ANSI) keyboard when you write in English, code, or just want to use keybaord shorcuts (most of which are based on the American Keybaord).
+
+Some things I did, useful to you fi you want to have a look to the scheme or even replicate it for your language.
+
+- [x] add layer _FN with F keys and VI navigation
+- [x] add layer _MOUSE with mouse keys
+- [x] add "MOUSEKEY_ENABLE = yes" in rules.mk to enable mouse keys (moved to users/sigul/rules.mk)
+- [x] add definition to control the mouse movementes in config.h (moved to users/sigul/config.h)
+- [x] add layer _NUMPAD to have a numpad
+- [x] add keycode NUMPAD to toggle _NUMPAD (moved in users/sigul/sigul.h)
+- [x] modify layer ADJUST to simplify remembering commands (Reset on R, Eeprom reset on E and so)
+- [x] add custom keycodes ESCFN and TABFN on QUERTYi (default) layer to add the ability to use arrows with hjkl by activating layer FN when held with the definition LT(_FN,KC_ESC) and LT(_FN, KC_TAB)
+- [x] added "#define USB_MAX_POWER_CONSUMPTION 100" in config.h to use the keyboard with the iPad (moved to users/sigul/config.h)
+- [x] add "#define TAPPING_TOGGLE 3" in config.h to enable tapping toggle with 3 taps on LOWER and RAISE (moved to users/sigul/config.h)
+- [x] add tapping toggle to LOWER, RAISE and MOUSE keys
+- [x] add caps lock (KC_CAPS) to RAISE layer on the shift key
+- [x] Add del to a thumb layer
+- [x] Add MT(MOD_LSFT, KC_ENT) shift when pressed, enter when tapped
+- [x] add home, end, pgup and pgwon on _RAISE instead of arrows
+- [x] change LSFT to S for more legibility
+- [x] add secrets on RAISE to be able to output personal data such as email, phone number, credit cards number...
+- [x] remap F keys upon numbers on _FN
+
+To DO
+- [ ] Add Hyper on ESC or TAB to be able to use it for custom keyboard shortcuts
+- [ ] consider using layer configuration to have just one keymap (see as a reference qmk_firmware/layouts/community/ortho_4x12/bredfield/)
+- [ ] add brightness up (KC_BRMU or KC_BRIU) and down (KC_BRMD or KC_BRID)
+- [ ] consider adding AUTO_SHIFT_ENABLE = yes in rules.mk to be able to send shifted key depressing a key for twice the time
+- [ ] revert IT_ to KC_ where not required
diff --git a/keyboards/planck/keymaps/sigul/rules.mk b/keyboards/planck/keymaps/sigul/rules.mk
new file mode 100644
index 00000000000..dcf16bef399
--- /dev/null
+++ b/keyboards/planck/keymaps/sigul/rules.mk
@@ -0,0 +1 @@
+SRC += muse.c
diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_brett.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_brett.c
deleted file mode 100644
index cdebcd1433c..00000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_brett.c
+++ /dev/null
@@ -1,42 +0,0 @@
-#include "keymap.h"
-
-#define KC_MO1 MO(1)
-#define KC_MO2 MO(2)
-
-const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = KEYMAP(
- ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,
- LCTL, A, S, D, F, G, H, J, K, L, SCLN, ENT,
- LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT,
- TAB, LGUI, RSFT, LALT, MO2, SPC, MO1, LEFT, DOWN, UP, RGHT),
-[1] = KEYMAP( /* RAISE */
- GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, DEL,
- TRNS, F1, F2, F3, F4, F5, F6, 4, 5, 6, QUOT, TRNS,
- TRNS, F7, F8, F9, F10, F11, F12, 1, 2, 3, TRNS, PGUP,
- MPRV, MNXT, TRNS, MUTE, TRNS, TRNS, MO1, 0, 0, TRNS, PGDN),
-[2] = KEYMAP( /* LOWER */
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MINS,
- TRNS, TRNS, TRNS, PAUSE, TRNS, TRNS, TRNS, TRNS, LBRC, RBRC, BSLS, EQL,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
- MPLY, MSTP, VOLU, VOLD, MO2, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS),
-};
-const uint16_t PROGMEM fn_actions[] = {
- [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1),
- [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2),
- [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3),
- [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4),
- [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5),
- [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6),
- [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7),
- [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8),
- [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9),
- [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0),
- [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS),
- [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL),
- [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV),
- [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC),
- [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC),
- [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS),
-
- [29] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE),
-};
diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_dotcom.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_dotcom.c
deleted file mode 100644
index 5a85a6086ce..00000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_dotcom.c
+++ /dev/null
@@ -1,34 +0,0 @@
-#include "keymap.h"
-
-#define KC_MO1 MO(1)
-
-const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = KEYMAP(
- ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,
- MO1, A, S, D, F, G, H, J, K, L, SCLN, ENT,
- LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, LBRC,
- LCTL, BSLS, QUOT, LALT, FN22, SPC, LEFT, UP, DOWN, RGHT, RBRC),
-[1] = KEYMAP(
- GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, DEL,
- TRNS, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, TRNS, TRNS, TRNS,
- TRNS, FN18, FN19, FN22, EQL, MINS, FN20, TRNS, TRNS, TRNS, TRNS, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MO1, TRNS, VOLD, VOLU, TRNS),
-};
-const uint16_t PROGMEM fn_actions[] = {
- [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1),
- [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2),
- [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3),
- [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4),
- [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5),
- [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6),
- [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7),
- [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8),
- [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9),
- [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0),
- [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS),
- [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL),
- [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV),
- [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC),
- [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC),
- [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS),
-};
diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_jack.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_jack.c
deleted file mode 100644
index 14db7feaa06..00000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_jack.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include "keymap.h"
-
-#define KC_MO2 MO(2)
-#define KC_MO3 MO(3)
-
-const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = KEYMAP( /* Jack */
- TAB, Q, W, E, R, T, Y, U, I, O, P, BSPC,
- ESC, A, S, D, F, G, H, J, K, L, SCLN, QUOT,
- LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, ENT,
- RSFT, LCTL, LALT, LGUI, MO3, SPC, MO2, LEFT, DOWN, UP, RGHT),
-[1] = KEYMAP( /* Jack colemak */
- TAB, Q, W, F, P, G, J, L, U, Y, SCLN, BSPC,
- ESC, A, R, S, T, D, H, N, E, I, O, QUOT,
- LSFT, Z, X, C, V, B, K, M, COMM, DOT, SLSH, ENT,
- FN3, LCTL, LALT, LGUI, MO3, SPC, MO2, LEFT, DOWN, UP, RGHT),
-[2] = KEYMAP( /* Jack RAISE */
- GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC,
- TRNS, FN3, FN4, PAUSE, TRNS, TRNS, TRNS, MINS, EQL, LBRC, RBRC, BSLS,
- TRNS, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MO2, MNXT, VOLD, VOLU, MPLY),
-[3] = KEYMAP( /* Jack LOWER */
- FN22, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, BSPC,
- TRNS, FN3, FN4, PAUSE, TRNS, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28,
- TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS,
- TRNS, TRNS, TRNS, TRNS, MO3, TRNS, TRNS, MNXT, VOLD, VOLU, MPLY),
-};
-const uint16_t PROGMEM fn_actions[] = {
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
-
- [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1),
- [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2),
- [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3),
- [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4),
- [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5),
- [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6),
- [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7),
- [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8),
- [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9),
- [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0),
- [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS),
- [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL),
- [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV),
- [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC),
- [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC),
- [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS),
-
- [29] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE),
-};
diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_joe.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_joe.c
deleted file mode 100644
index efd188a8ee8..00000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_joe.c
+++ /dev/null
@@ -1,83 +0,0 @@
-#include "keymap.h"
-
-#define KC_MO2 MO(2)
-#define KC_MO3 MO(3)
-#define KC_MO4 MO(4)
-
-const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = KEYMAP( /* Joe qwerty */
- ESC, Q, W, E, R, T, Y, U, I, O, P, MINS,
- BSPC, A, S, D, F, G, H, J, K, L, SCLN, ENTER,
- FN7, Z, X, C, V, B, N, M, COMM, DOT, SLSH, QUOT,
- LCTL, LGUI, LALT, LSFT, MO3, SPC, MO2, LEFT, UP, DOWN, RGHT),
-[1] = KEYMAP( /* Joe colemak */
- ESC, Q, W, F, P, G, J, L, U, Y, SCLN, MINS,
- BSPC, A, R, S, T, D, H, N, E, I, O, ENTER,
- FN7, Z, X, C, V, B, K, M, COMM, DOT, SLSH, QUOT,
- LCTL, LGUI, LALT, LSFT, MO3, SPC, MO2, LEFT, UP, DOWN, RGHT),
-[2] = KEYMAP( /* Joe UPPER */
- F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12,
- DEL, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, MENU, CAPS, INS, PSCR, TRNS, FN5, FN6,
- TRNS, TRNS, TRNS, TRNS, MO4, TRNS, MO2, FN26, FN27, FN28, FN29),
-[3] = KEYMAP( /* Joe LOWER */
- GRV, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN8, FN9, FN30,
- BSPC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, TRNS,
- BSLS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, LBRC, RBRC, TRNS, EQL,
- TRNS, TRNS, TRNS, TRNS, MO3, TRNS, MO4, HOME, PGUP, PGDN, END),
-[4] = KEYMAP( /* Joe LOWER + UPPER */
- FN3, FN4, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, SLEP,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MUTE, VOLD, VOLU, MPLY),
-};
-
-enum macro_id {
- M_Q0,
- M_Q1,
- M_Q2
-};
-
-const uint16_t PROGMEM fn_actions[] = {
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
-
- [5] = ACTION_MODS_KEY(MOD_LCTL, KC_PGUP),
- [6] = ACTION_MODS_KEY(MOD_LCTL, KC_PGDN),
-
- /* tab on tap, shift on hold */
- [7] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB),
-
- [8] = ACTION_MACRO(M_Q0),
- [9] = ACTION_MACRO(M_Q1),
-
- [26] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT, KC_LEFT),
- [27] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT, KC_UP),
- [28] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT, KC_DOWN),
- [29] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT, KC_RGHT),
-
- [30] = ACTION_MACRO(M_Q2),
-};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- keyevent_t event = record->event;
- switch (id) {
- case M_Q0:
- /* :( | ): */
- return event.pressed ?
- MACRO( D(LSFT), T(P), T(9), T(SPC), T(SPC), T(0), T(P), U(LSFT), T(LEFT), T(LEFT), T(LEFT), END ) :
- MACRO_NONE;
- case M_Q1:
- /* (: | :) */
- return event.pressed ?
- MACRO( D(LSFT), T(9), T(P), T(SPC), T(SPC), T(P), T(0), U(LSFT), T(LEFT), T(LEFT), T(LEFT), END ) :
- MACRO_NONE;
- case M_Q2:
- /* :) */
- return event.pressed ?
- MACRO( D(LSFT), T(P), T(0), U(LSFT), END ) :
- MACRO_NONE;
- }
- return MACRO_NONE;
-}
diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_matthew.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_matthew.c
deleted file mode 100644
index fe0dfa619cd..00000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_matthew.c
+++ /dev/null
@@ -1,70 +0,0 @@
-// by Matthew Pepers - https://github.com/pepers
-
-/* grid planck layout - modified programmer dvorak
-,-----------------------------------------------------------------------------------------------.
-| pause | @ | | | ^ | | | | | * | # | $ | del |
-| esc | ; : | , < | . > | P | Y | F | G | G | C | R | bkspc |
-| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
-|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|
-| & | / | { | ( | [ | = | ! | ] | ) | } | \ | + |
-| ` ~ | A | O | E | U | I | D | H | T | N | S | - _ |
-| % | 7 | 5 | 3 | 1 | 9 | 0 | 2 | 4 | 6 | 8 | ? |
-|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|
-| | | | | | | | | | | | prtsc |
-| tab | ' " | Q | J | K | X | B | M | W | V | Z | retrn |
-| | | | | | | | | | | | insrt |
-|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|-------|
-| | | | | | | | | | | | |
-| lctrl | lgui | lalt | ralt | lower | shift | space | raise | left | down | up | right |
-| | | | | | | | | home | pgdn | pgup | end |
-`-----------------------------------------------------------------------------------------------'
-*/
-
-#include "keymap.h"
-
-#define KC_MO1 MO(1)
-#define KC_MO2 MO(2)
-
-const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- /* 0: dvorak */
- [0] = KEYMAP_GRID( ESC, SCLN, COMM, DOT, P, Y, F, G, C, R, L, BSPC, \
- GRV, A, O, E, U, I, D, H, T, N, S, MINS, \
- TAB, QUOT, Q, J, K, X, B, M, W, V, Z, ENT, \
- LCTL, LGUI, LALT, RALT, MO1, LSFT, SPC, MO2, LEFT, DOWN, UP, RGHT),
-
- /* 1: lower (FN1) */
- [1] = KEYMAP_GRID( F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, \
- FN17, 7, 5, 3, 1, 9, 0, 2, 4, 6, 8, FN18, \
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, INS, \
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, HOME, PGDN, PGUP, END),
-
- /* 2: raise (FN2) */
- [2] = KEYMAP_GRID(PAUS, FN19, FN20, FN21, TRNS, TRNS, TRNS, TRNS, FN22, FN23, FN24, DEL, \
- FN10, SLSH, FN11, FN12, LBRC, EQL, FN13, RBRC, FN14, FN15, BSLS, FN16, \
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, PSCR, \
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS),
-
-};
-
-const uint16_t PROGMEM fn_actions[] = {
- // lower row1
- [17] = ACTION_MODS_KEY(MOD_LSFT, KC_5), // %
- [18] = ACTION_MODS_KEY(MOD_LSFT, KC_SLASH), // ?
-
- // raise row0
- [19] = ACTION_MODS_KEY(MOD_LSFT, KC_2), // @
- [20] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLASH), // |
- [21] = ACTION_MODS_KEY(MOD_LSFT, KC_6), // ^
- [22] = ACTION_MODS_KEY(MOD_LSFT, KC_8), // *
- [23] = ACTION_MODS_KEY(MOD_LSFT, KC_3), // #
- [24] = ACTION_MODS_KEY(MOD_LSFT, KC_4), // $
-
- // raise row1
- [10] = ACTION_MODS_KEY(MOD_LSFT, KC_7), // &
- [11] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRACKET), // {
- [12] = ACTION_MODS_KEY(MOD_LSFT, KC_9), // (
- [13] = ACTION_MODS_KEY(MOD_LSFT, KC_1), // !
- [14] = ACTION_MODS_KEY(MOD_LSFT, KC_0), // )
- [15] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRACKET), // }
- [16] = ACTION_MODS_KEY(MOD_LSFT, KC_EQUAL), // +
-};
diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_nathan.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_nathan.c
deleted file mode 100644
index 7cc5e7f0ac8..00000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_nathan.c
+++ /dev/null
@@ -1,154 +0,0 @@
-// Author: Nathan Ross Powell
-// https://github.com/nathanrosspowell/tmk_keyboard/blob/planck-jack/keyboard/planck/keymap_nathan.c
-
-#include "keymap.h"
-
-#define KC_MO1 MO(1)
-#define KC_MO2 MO(2)
-
-const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- /* 0: main layer
- * ,-----------------------------------------------------------------------.
- * |Tab | q | w | e | r | t | y | u | i | o | p | BS |
- * |-----------------------------------------------------------------------|
- * |Ctrl | a | s | d | f | g | h | j | k | l | ; | Ret |
- * |-----------------------------------------------------------------------|
- * |Shift| z | x | c | v | b | n | m | [ | ( | { | < |
- * |-----------------------------------------------------------------------|
- * |Meta | \ | / | Alt |Lower|Space|Space|Upper|Left |Down | Up |Right|
- * `-----------------------------------------------------------------------'
- */
- [0] = KEYMAP_GRID(
- TAB, Q, W, E, R, T, Y, U, I, O, P, BSPC,
- LCTL, A, S, D, F, G, H, J, K, L, SCLN, ENT,
- RSFT, Z, X, C, V, B, N, M, LBRC, FN10, FN11, FN12,
- LGUI, BSLS, SLSH, LALT, MO1, SPC, SPC, MO2, LEFT, DOWN, UP, RGHT),
-
- /* 1: fn left/lower layer
- * The top row are Visual Studio combos:
- * 'Run', 'Breakpoint', 'Step over', 'Step into', 'Set cursor to line'
- * 2nd row are key combos:
- * 'ctrl-alt-delete', 'ctrl-shift-escape'
- * 3rd row are macros keys:
- * 'P0' - 'P5' execute a script on Windows machines
- * ,-----------------------------------------------------------------------.
- * | ESC | F5 | F9 | F10 | F11 |S+F11|CSF10|NLock|Num7 |Num8 |Num9 | Del |
- * |-----------------------------------------------------------------------|
- * | |C/A/D|C/S/E| Ins |Print|Pause|SLock|Num0 |Num4 |Num5 |Num6 |Num= |
- * |-----------------------------------------------------------------------|
- * | | P0 | P1 | P2 | P3 | P4 | P5 |Num. |Num1 |Num2 |Num3 |Num/ |
- * |-----------------------------------------------------------------------|
- * | |User | | | | | | |Home |PgDn |PgUp | End |
- * `-----------------------------------------------------------------------'
- */
- [1] = KEYMAP_GRID(
- ESC, F5, F9, F10, F11, FN30, FN31, NLCK, P7, P8, P9, DEL,
- TRNS, FN16, FN17, INS, PSCR, PAUS, SLCK, P0, P4, P5, P6, PEQL,
- TRNS, FN2, FN3, FN4, FN5, FN6, FN7, PDOT, P1, P2, P3, PSLS,
- TRNS, FN8, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, HOME, PGDN, PGUP, END ),
-
- /* 2: fn right/raise layer
- * ,-----------------------------------------------------------------------.
- * | F1 | F2 | F3 | F4 |F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
- * |-----------------------------------------------------------------------|
- * | | ! | @ | # | $ | % | ^ | & | * | - | + | = |
- * |-----------------------------------------------------------------------|
- * | | _ | ' | " | ` | ~ | , | . | ] | ) | } | > |
- * |-----------------------------------------------------------------------|
- * | |NextT|PrevT| | | | Esc | |Mute |Vol- |Vol+ | P/P |
- * `-----------------------------------------------------------------------'
- */
- [2] = KEYMAP_GRID(
- F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12,
- TRNS, FN18, FN19, FN20, FN21, FN22, FN23, FN24, FN25, MINS, FN26, PAST,
- TRNS, FN27, QUOT, FN28, GRV, FN29, COMM, DOT, RBRC, FN13, FN14, FN15,
- TRNS, MNXT, MPRV, TRNS, TRNS, TRNS, ESC, TRNS, MUTE, VOLD, VOLU, MPLY ),
-};
-
-enum macro_id {
- M_P0,
- M_P1,
- M_P2,
- M_P3,
- M_P4,
- M_P5,
- M_USERNAME
-};
-
-const uint16_t PROGMEM fn_actions[] = {
- // Program macros
- [2] = ACTION_MACRO(M_P0),
- [3] = ACTION_MACRO(M_P1),
- [4] = ACTION_MACRO(M_P2),
- [5] = ACTION_MACRO(M_P3),
- [6] = ACTION_MACRO(M_P4),
- [7] = ACTION_MACRO(M_P5),
- [8] = ACTION_MACRO(M_USERNAME),
- // Braces
- [10] = ACTION_MODS_KEY(MOD_LSFT, KC_9), // (
- [11] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), // {
- [12] = ACTION_MODS_KEY(MOD_LSFT, KC_COMMA), // <
- [13] = ACTION_MODS_KEY(MOD_LSFT, KC_0), // )
- [14] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // }
- [15] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT), // >
- // Combo
- [16] = ACTION_MODS_KEY(MOD_LALT | MOD_LCTL, KC_DEL), // Ctrl+Alt+Delete
- [17] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_ESC), // Ctrl+Shft+Escape
- // Symbols
- [18] = ACTION_MODS_KEY(MOD_LSFT, KC_1), // !
- [19] = ACTION_MODS_KEY(MOD_LSFT, KC_2), // @
- [20] = ACTION_MODS_KEY(MOD_LSFT, KC_3), // #
- [21] = ACTION_MODS_KEY(MOD_LSFT, KC_4), // $
- [22] = ACTION_MODS_KEY(MOD_LSFT, KC_5), // %
- [23] = ACTION_MODS_KEY(MOD_LSFT, KC_6), // ^
- [24] = ACTION_MODS_KEY(MOD_LSFT, KC_7), // &
- [25] = ACTION_MODS_KEY(MOD_LSFT, KC_8), // *
- [26] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // +
- [27] = ACTION_MODS_KEY(MOD_LSFT, KC_MINUS), // _
- [28] = ACTION_MODS_KEY(MOD_LSFT, KC_QUOTE), // "
- [29] = ACTION_MODS_KEY(MOD_LSFT, KC_GRAVE), // ~
- // Debugging
- [30] = ACTION_MODS_KEY(MOD_LSFT, KC_F11), // Step into
- [31] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_F10), // Set cursor to line
- };
-
-// Run a script and pass a key number to it. This is Windows specific and the script needs to be on your path.
-// *open run dialog* keypress.py [PRG_NUM]
-#define ADD_PYTHON_PROGRAM_ON_WIN( PRG_NUM ) MACRO( D(LGUI), T(R), U(LGUI), W(100), T(K), T(E), T(Y), T(P), T(R), T(E), T(S), T(S), T(DOT), T(P), T(Y), T(SPC), T(PRG_NUM), END )
-// *return*
-#define RUN_PYTHON_PROGRAM_ON_WIN MACRO( T(ENT), END )
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
- keyevent_t event = record->event;
- switch (id) {
- case M_P0:
- return event.pressed ?
- ADD_PYTHON_PROGRAM_ON_WIN( 0 ) :
- RUN_PYTHON_PROGRAM_ON_WIN;
- case M_P1:
- return event.pressed ?
- ADD_PYTHON_PROGRAM_ON_WIN( 1 ) :
- RUN_PYTHON_PROGRAM_ON_WIN;
- case M_P2:
- return event.pressed ?
- ADD_PYTHON_PROGRAM_ON_WIN( 2 ) :
- RUN_PYTHON_PROGRAM_ON_WIN;
- case M_P3:
- return event.pressed ?
- ADD_PYTHON_PROGRAM_ON_WIN( 3 ) :
- RUN_PYTHON_PROGRAM_ON_WIN;
- case M_P4:
- return event.pressed ?
- ADD_PYTHON_PROGRAM_ON_WIN( 4 ) :
- RUN_PYTHON_PROGRAM_ON_WIN;
- case M_P5:
- return event.pressed ?
- ADD_PYTHON_PROGRAM_ON_WIN( 5 ) :
- RUN_PYTHON_PROGRAM_ON_WIN;
- case M_USERNAME:
- return event.pressed ?
- MACRO( T(N), T(A), T(T), T(H), T(A), T(N), T(R), T(O), T(S), T(S), T(P), T(O), T(W), T(E), T(L), T(L), END ) :
- MACRO_NONE;
- }
- return MACRO_NONE;
-}
diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_paul.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_paul.c
deleted file mode 100644
index 829c047be6f..00000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_paul.c
+++ /dev/null
@@ -1,49 +0,0 @@
-#include "keymap.h"
-
-#define KC_MO1 MO(1)
-#define KC_MO2 MO(2)
-#define KC_MO3 MO(3)
-
-const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = KEYMAP( /* Paul */
- TAB, Q, W, E, R, T, Y, U, I, O, P, BSPC,
- MO1, A, S, D, F, G, H, J, K, L, SCLN, QUOT,
- LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, ENT,
- ESC, LCTL, LALT, LGUI, MO2, SPC, MO3, LEFT, DOWN, UP, RGHT),
-[1] = KEYMAP( /* Paul FN */
- TRNS, TRNS, TRNS, FN8, FN9, TRNS, TRNS, TRNS, TRNS, MUTE, VOLD, VOLU,
- MO1, TRNS, TRNS, HOME, END, TRNS, TRNS, TRNS, TRNS, MPRV, MPLY, MNXT,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, UP, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, LEFT, DOWN, RGHT),
-[2] = KEYMAP( /* Paul LOWER */
- FN22, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, BSPC,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28,
- TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS,
- TRNS, TRNS, TRNS, TRNS, MO2, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS),
-[3] = KEYMAP( /* Paul RAISE */
- GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MINS, EQL, LBRC, RBRC, BSLS,
- TRNS, F11, F12, F13, F14, F15, F16, F17, F18, F19, F20, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MO3, TRNS, TRNS, TRNS, TRNS),
-};
-const uint16_t PROGMEM fn_actions[] = {
- [8] = ACTION_MODS_KEY(MOD_LSFT, KC_HOME),
- [9] = ACTION_MODS_KEY(MOD_LSFT, KC_END),
- [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1),
- [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2),
- [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3),
- [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4),
- [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5),
- [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6),
- [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7),
- [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8),
- [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9),
- [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0),
- [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS),
- [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL),
- [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV),
- [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC),
- [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC),
- [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS),
-
-};
diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_peasant.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_peasant.c
deleted file mode 100644
index f6493e33a90..00000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_peasant.c
+++ /dev/null
@@ -1,51 +0,0 @@
-#include "keymap.h"
-
-const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [0] = KEYMAP( /* Native */
- ESC, Q, W, E, R, T, Y, U, I, O, P, FN2,
- BSPC, A, S, D, F, G, H, J, K, L, SCLN, QUOT,
- TAB, Z, X, C, V, B, N, M, COMM, DOT, SLSH, ENT,
- DEL, LCTL, NO, LSFT, LALT, SPC, NO, LEFT, DOWN, UP, RGHT),
- [1] = KEYMAP( /* QWERTY->PHOTOSHOP */
- DELETE, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, FN1,
- O, G, S, U, T, FN27, F21, F10, F11, F7, F8, F9,
- TAB, FN4, FN5, FN6, F1, FN7, F18, F19, F23, F20, F22, FN9,
- COMM, DOT, FN10, FN11, FN3, SPC, FN12, F2, FN8, F3, F14),
- [2] = KEYMAP( /* 2: FN3 PHOTOSHOP */
- ESC, FN25, FN26, NO, NO, NO, NO, NO, NO, NO, NO, NO,
- NO, NO, NO, NO, NO, NO, NO, NO, NO, FN19, FN20, FN21,
- C, NO, FN22, FN5, NO, FN23, NO, NO, NO, NO, FN13, NO,
- FN14, FN15, FN16, FN17, FN3, SPC, FN18, NO, NO, F24, NO),
-};
-
-const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_DEFAULT_LAYER_SET(0), // set Qwerty layout
- [2] = ACTION_DEFAULT_LAYER_SET(1), // set Photoshop presets
- [3] = ACTION_LAYER_ON_OFF(2), // Photoshop function layer
-
- [4] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F9), // photo folder AHK
- [5] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_I), // select inverse
- [6] = ACTION_MODS_KEY(MOD_LSFT, KC_M), // marquee select
- [7] = ACTION_MODS_KEY(MOD_LALT, KC_BSPC), // fill
- [8] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_X), // warp
- [9] = ACTION_MODS_KEY(MOD_LCTL | MOD_LALT | MOD_LSFT, KC_F12), // merge all new layer
- [10] = ACTION_MODS_KEY(MOD_LCTL, KC_MINS), // zoom out
- [11] = ACTION_MODS_KEY(MOD_LCTL, KC_H), // RBG sliders
- [12] = ACTION_MODS_KEY(MOD_LCTL, KC_S), // save
- [13] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_F5), // layer mask from transparancy
- [14] = ACTION_MODS_KEY(MOD_LALT, KC_LBRC), // prev layer
- [15] = ACTION_MODS_KEY(MOD_LALT, KC_RBRC), // next layer
- [16] = ACTION_MODS_KEY(MOD_LCTL, KC_EQL), // zoom in
- [17] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_H), // HSV sliders
- [18] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F11), // save as PNG
- [19] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F7), // gaussian blur
- [20] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL | MOD_LALT, KC_F8), // motion blur
- [21] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_X), // liquify filter
- [22] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // prev layer blending
- [23] = ACTION_MODS_KEY(MOD_LSFT | MOD_LALT, KC_N), // normal layer blending
- [24] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // next layer blending
- [25] = ACTION_MODS_KEY(MOD_LCTL, KC_Z), // step back
- [26] = ACTION_MODS_KEY(MOD_LCTL, KC_Y), // step forward
- [27] = ACTION_MODS_KEY(MOD_LCTL, KC_R), // rasterize
-
-};
diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_reed.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_reed.c
deleted file mode 100644
index 9e6e953e312..00000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_reed.c
+++ /dev/null
@@ -1,74 +0,0 @@
-#include "keymap.h"
-
-#define KC_MO2 MO(2)
-#define KC_MO3 MO(3)
-
-/*
- * BUILD:
- * Simply run the command below in the keyboards/planck directory
- * to build against this keymap
- *
- * make KEYMAP=reed COMMON_KEYMAP=true
- *
- *
- * DETAILS:
- *
- * This layout works off of Jack's layout, making some changes that I
- * feel significantly improve the function of the keyboard. Major changes
- * include adding a "gaming mode" that will allow users to still access
- * the number keys 1 through 4 easily for games that require it. Also
- * included is the ability to use the tap/hold function for easy use of
- * right shift and thumb shift with their tapped companions.
- *
- */
-const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = KEYMAP_GRID( /* Reed */
- ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,
- TAB, A, S, D, F, G, H, J, K, L, SCLN, QUOT,
- LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, FN5,
- LCTL, CAPS, LALT, LGUI, MO3, FN7, SPC, MO2, LEFT, DOWN, UP, RGHT),
-
-[1] = KEYMAP_GRID( /* Reed EXTREME GAMING */
- ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,
- TAB, A, S, D, F, G, H, J, K, L, SCLN, QUOT,
- LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, FN5,
- LCTL, 1, 2, 3, 4, SPC, MO3, MO2, LEFT, DOWN, UP, RGHT),
-
-[2] = KEYMAP_GRID( /* Reed RAISE */
- GRV, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC,
- TRNS, FN3, FN4, PAUSE, TRNS, TRNS, TRNS, MINS, EQL, LBRC, RBRC, BSLS,
- TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MO2, MNXT, VOLD, VOLU, MPLY),
-
-[3] = KEYMAP_GRID( /* Reed LOWER */
- TRNS, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, DEL,
- TRNS, TRNS, INS, HOME, PGUP, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28,
- TRNS, TRNS, DEL, END, PGDN, F11, F12, F13, TRNS, VOLD, VOLU, TRNS,
- TRNS, TRNS, TRNS, TRNS, MO3, TRNS, TRNS, TRNS, MPRV, MUTE, MPLY, MNXT),
-};
-const uint16_t PROGMEM fn_actions[] = {
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
- // Actions for the tap/hold modifiers listed above
- [5] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT),
- [7] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_BSPC),
-
- [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1),
- [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2),
- [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3),
- [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4),
- [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5),
- [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6),
- [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7),
- [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8),
- [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9),
- [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0),
- [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS),
- [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL),
- [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV),
- [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC),
- [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC),
- [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS),
-
- [29] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE),
-};
diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_sean.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_sean.c
deleted file mode 100644
index 10a112986e2..00000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_sean.c
+++ /dev/null
@@ -1,105 +0,0 @@
-#define KC_RESET 0x5000
-#include "keymap_common.h"
-
-enum planck_layers {
- _DVRK,
- _LOWER,
- _RAISE,
- _ADJUST
-};
-
-#define KC_LOWR MO(_LOWER)
-#define KC_RAIS MO(_RAISE)
-#define KC_ADJS MO(_ADJUST)
-
-const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-
-/* Dvorak
- * ,-----------------------------------------------------------------------------------.
- * | " | , | . | P | Y | / | = | F | G | C | R | L |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | A | O | E | U | I | ESC | BSPC | D | H | T | N | S |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | ; | Q | J | K | X | TAB | ENT | B | M | W | V | Z |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Sft | Ctl | Alt | Gui |Lower | Space |Raise | < | v | ^ | > |
- * `-----------------------------------------------------------------------------------'
- */
- [_DVRK] = KEYMAP(
- QUOT, COMM, DOT, P, Y, SLSH, EQL, F, G, C, R, L,
- A, O, E, U, I, ESC, BSPC, D, H, T, N, S,
- SCLN, Q, J, K, X, TAB, ENT, B, M, W, V, Z,
- LSFT, LCTL, LALT, LGUI, LOWR, SPC, RAIS,LEFT, DOWN, UP, RGHT),
-
-/* Lower
- * ,-----------------------------------------------------------------------------------.
- * | F1 | F2 | F3 | F4 | F5 | { | } | F6 | F7 | F8 | F9 | F10 |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | 1 | 2 | 3 | 4 | 5 | [ | ] | 6 | 7 | 8 | 9 | 0 |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | ~ | | | ` | - | _ | INS | DEL | ( | ) | + | = | \ |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Sft | Ctl | Alt | Gui |Lower | Space |Raise | | PgDn | PgUp | End |
- * `-----------------------------------------------------------------------------------'
- */
- [_LOWER] = KEYMAP( /* fn1 lower */
- F1, F2, F3, F4, F5, FN26, FN27, F6, F7, F8, F9, F10,
- 1, 2, 3, 4, 5, LBRC, RBRC, 6, 7, 8, 9, 0,
- FN23, FN25, GRV,MINS, FN24, INS, DEL, FN19, FN20, FN22, EQL, BSLS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, ADJS,HOME, PGDN, PGUP, END),
-
-/* Raise
- * ,-----------------------------------------------------------------------------------.
- * | F11 | F12 | F13 | F14 | F15 | - | _ | F16 | F17 | F18 | F19 | F20 |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | ! | @ | # | $ | % | | | ^ | & | * | ( | ) |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | | | | | | | | | | | | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | CAPS | | | | | | | | | | |
- * `-----------------------------------------------------------------------------------'
- */
- [_RAISE] = KEYMAP( /* fn2 raise */
- F11, F12, F13, F14, F15,MINS, FN24, F16, F17, F18, F19, F20,
- FN11, FN12, FN13, FN14, FN15, NO, NO, FN16, FN17, FN18, FN19, FN20,
- PWR, EJCT, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO,
- CAPS, TRNS, TRNS, TRNS, ADJS,TRNS, RAIS, NO, NO, NO, NO),
-/* Adjust (Lower + Raise or SLower + SRaise)
- * ,-----------------------------------------------------------------------------------.
- * | | Reset| | | | | | | | | | |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | PWR | EJCT | | | | | | CAPS | | | | |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * |DVORAK| | | | | | | | | | | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | | | | |
- * `-----------------------------------------------------------------------------------'
- */
-[_ADJUST] = KEYMAP(
- NO, RESET, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO,
- PWR, EJCT, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO,
- CAPS, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO,
- NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO),
-};
-
-const uint16_t PROGMEM fn_actions[] = {
- [3] = ACTION_DEFAULT_LAYER_SET(_DVRK),
- [11] = ACTION_MODS_KEY(MOD_LSFT, KC_1), //!
- [12] = ACTION_MODS_KEY(MOD_LSFT, KC_2), //@
- [13] = ACTION_MODS_KEY(MOD_LSFT, KC_3), //#
- [14] = ACTION_MODS_KEY(MOD_LSFT, KC_4), //$
- [15] = ACTION_MODS_KEY(MOD_LSFT, KC_5), //%
- [16] = ACTION_MODS_KEY(MOD_LSFT, KC_6), //^
- [17] = ACTION_MODS_KEY(MOD_LSFT, KC_7), //&
- [18] = ACTION_MODS_KEY(MOD_LSFT, KC_8), //*
- [19] = ACTION_MODS_KEY(MOD_LSFT, KC_9), //(
- [20] = ACTION_MODS_KEY(MOD_LSFT, KC_0), //)
- [21] = ACTION_MODS_KEY(MOD_LSFT, KC_SLSH), //?
- [22] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), //+
- [23] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), //~
- [24] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), //_
- [25] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), //|
- [26] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), //{
- [27] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), //}
- [28] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE),
-};
diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_shane.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_shane.c
deleted file mode 100644
index 69ce9b8e09f..00000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_shane.c
+++ /dev/null
@@ -1,99 +0,0 @@
-#include "keymap.h"
-#include "action_layer.h"
-#include "action.h"
-#include "action_util.h"
-
-#define KC_MO6 MO(6)
-#define KC_MO8 MO(8)
-
-/*
- Shane's Planck Layout
- http://www.keyboard-layout-editor.com/#/layouts/015d9011102619d7695c86ffe57cf441
-*/
-const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [0] = KEYMAP_AND_SWAP( /* Base */
- TAB, Q, W, E, R, T, Y, U, I, O, P, MINS,
- LCTL, A, S, D, F, G, H, J, K, L, SCLN, BSPC,
- LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, FN5,
- /*ALPHA*/FN3, /*HYPER*/ /*SUPER*/LGUI, /*META*/LALT, LCTL, MO8, FN6, MO6, LEFT, DOWN, UP, RGHT),
- [2] = KEYMAP_AND_SWAP( /* More modifiers */
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, RCTL, RALT, RGUI, TRNS),
- [4] = KEYMAP_AND_SWAP( /* WASD */
- TRNS, TRNS, UP, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
- TRNS, LEFT, DOWN, RIGHT, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS),
- [6] = KEYMAP_AND_SWAP( /* Raise/FN1 */
- FN23, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, EQL,
- TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, ENT,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, BSLS, TRNS,
- PAUS, TRNS, TRNS, TRNS, TRNS, BSPC, TRNS, MUTE, PGUP, PGDN, MNXT),
- [8] = KEYMAP_AND_SWAP( /* Lower/FN2 */
- ESC, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN19, FN20, TRNS,
- TRNS, TRNS, TRNS, TRNS, CAPS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, QUOT,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN24, FN25, LBRC, RBRC, TRNS, TRNS,
- FN4, TRNS, TRNS, TRNS, TRNS, ENT, TRNS, MPLY, VOLD, VOLU, MPRV),
-};
-
-enum function_id {
- SPACE_FN,
-};
-
-void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- switch (id) {
- case SPACE_FN:
- if (record->event.pressed) {
- // Change the keyboard maps.
- // Whatever even layer's are on, turn on the odd one's too.
- for (uint8_t i = 0; i < 9; i += 2) {
- if (layer_state & (1UL << i))
- layer_on(i + 1);
- }
- layer_on(1);
- } else {
- // turn off all the even layers.
- for (uint8_t i = 0; i < 9; i += 2)
- layer_off(i + 1);
-
- if (record->tap.count != 0) {
- // Space was tapped rather than used like a modifier.
- // So send a space up and down event.
- add_key(KC_SPC);
- send_keyboard_report();
- del_key(KC_SPC);
- send_keyboard_report();
- }
- }
- break;
- }
-}
-
-
-
-const uint16_t PROGMEM fn_actions[] = {
- [3] = ACTION_LAYER_TOGGLE(2), // toggle more modifiers
- [4] = ACTION_LAYER_TOGGLE(4), // toggle wasd
- [5] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT),
- [6] = ACTION_FUNCTION_TAP(SPACE_FN),
-
- [11] = ACTION_MODS_KEY(MOD_LSFT, KC_1),
- [12] = ACTION_MODS_KEY(MOD_LSFT, KC_2),
- [13] = ACTION_MODS_KEY(MOD_LSFT, KC_3),
- [14] = ACTION_MODS_KEY(MOD_LSFT, KC_4),
- [15] = ACTION_MODS_KEY(MOD_LSFT, KC_5),
- [16] = ACTION_MODS_KEY(MOD_LSFT, KC_6),
- [17] = ACTION_MODS_KEY(MOD_LSFT, KC_7),
- [18] = ACTION_MODS_KEY(MOD_LSFT, KC_8),
- [19] = ACTION_MODS_KEY(MOD_LSFT, KC_9),
- [20] = ACTION_MODS_KEY(MOD_LSFT, KC_0),
- [21] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS),
- [22] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL),
- [23] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV),
- [24] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC),
- [25] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC),
- [26] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS),
-};
diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_simon.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_simon.c
deleted file mode 100644
index fa948077cec..00000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_simon.c
+++ /dev/null
@@ -1,44 +0,0 @@
-#include "keymap.h"
-
-#define KC_MO1 MO(1)
-#define KC_MO2 MO(2)
-
-const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = KEYMAP( /* Jack */
- ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,
- TAB, A, S, D, F, G, H, J, K, L, DOT, ENT,
- LSFT, Z, X, C, V, B, N, M, COMM, DOT, SCLN, DEL,
- LCTL, ENT, LALT, CAPS, MO2, SPC, MO1, LEFT, DOWN, UP, RGHT),
-[1] = KEYMAP( /* Jack RAISE */
- TRNS, F1, F2, F3, F4, NO, FN11, FN9, FN12, NO, FN14, TRNS,
- TRNS, F5, F6, F7, F8, FN16, SLSH, MINS, EQL, LBRC, FN8, TRNS,
- TRNS, F9, F10, F11, F12, F15, F16, FN22, SCLN, MINS, QUOT, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS),
-[2] = KEYMAP( /* Jack LOWER */
- FN22, 1, 2, 3, FN13, FN14, FN15, FN16, FN17, FN18, FN19, BSPC,
- TRNS, 4, 5, 6, TRNS, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28,
- TRNS, 7, 8, 9, 0, FN28, FN15, F7, F8, F9, F10, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS),
-};
-const uint16_t PROGMEM fn_actions[] = {
- [8] = ACTION_MODS_KEY(MOD_LSFT, KC_SLSH),
- [9] = ACTION_MODS_KEY(MOD_LSFT, KC_QUOT),
- [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1),
- [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2),
- [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3),
- [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4),
- [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5),
- [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6),
- [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7),
- [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8),
- [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9),
- [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0),
- [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS),
- [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL),
- [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV),
- [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC),
- [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC),
- [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS),
-
- [29] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE),
-};
diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_tim.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_tim.c
deleted file mode 100644
index 5be56e72569..00000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_tim.c
+++ /dev/null
@@ -1,44 +0,0 @@
-#include "keymap.h"
-
-#define KC_MO2 MO(2)
-#define KC_MO3 MO(3)
-
-const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = KEYMAP(
- ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,
- TAB, A, S, D, F, G, H, J, K, L, SCLN, ENT,
- LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, RSFT,
- LCTL, LALT, DEL, LGUI, MO3, SPC, MO2, F2, F5, F9, F12),
-[2] = KEYMAP( /* RAISE */
- TRNS, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, BSPC,
- GRV, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MINS, EQL, LBRC, RBRC, BSLS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, QUOT, FN29, TRNS, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MO2, TRNS, TRNS, TRNS, TRNS),
-[3] = KEYMAP( /* LOWER */
- TRNS, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, BSPC,
- FN22, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN20, FN21, FN23, FN24, FN28,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, QUOT, FN29, TRNS, TRNS,
- TRNS, TRNS, TRNS, TRNS, MO3, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS),
-};
-const uint16_t PROGMEM fn_actions[] = {
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
-
- [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1),
- [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2),
- [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3),
- [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4),
- [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5),
- [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6),
- [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7),
- [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8),
- [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9),
- [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0),
- [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS),
- [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL),
- [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV),
- [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC),
- [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC),
- [28] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS),
- [29] = ACTION_MODS_KEY(MOD_LSFT, KC_QUOT),
-};
diff --git a/keyboards/planck/old_keymap_files/common_keymaps/keymap_wilba.c b/keyboards/planck/old_keymap_files/common_keymaps/keymap_wilba.c
deleted file mode 100644
index 054297b6362..00000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_wilba.c
+++ /dev/null
@@ -1,54 +0,0 @@
-#include "keymap.h"
-
-#define KC_MO2 MO(2)
-#define KC_MO3 MO(3)
-#define KC_BLTG BL_TOGG
-#define KC_BLIN BL_INC
-#define KC_BLDE BL_DEC
-
-const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = KEYMAP( /* Wilba */
- BLTG, BLIN, BLDE, E, R, T, Y, U, I, O, P, BSPC,
- TAB, A, S, D, F, G, H, J, K, L, SCLN, QUOT,
- LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, ENT,
- LCTL, LGUI, LALT, RSFT, MO2, SPC, MO3, LEFT, DOWN, UP, RGHT),
-[1] = KEYMAP( /* Wilba Alternate */
- ESC, Q, W, E, R, T, Y, U, I, O, P, BSPC,
- TAB, A, S, D, F, G, H, J, K, L, SCLN, QUOT,
- LSFT, Z, X, C, V, B, N, M, COMM, DOT, SLSH, ENT,
- LCTL, LGUI, LALT, RSFT, MO2, SPC, MO3, LEFT, DOWN, UP, RGHT),
-[2] = KEYMAP( /* Wilba LOWER */
- TRNS, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, TRNS,
- TRNS, F11, F12, LBRC, RBRC, FN20, EQL, FN23, FN24, MINS, FN21, TRNS,
- TRNS, BSLS, GRV, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
- TRNS, TRNS, TRNS, TRNS, MO2, TRNS, TRNS, MNXT, VOLD, VOLU, MPLY),
-[3] = KEYMAP( /* Wilba RAISE */
- TRNS, FN10, FN11, FN12, FN13, FN14, FN15, FN16, FN17, FN18, FN19, TRNS,
- TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, TRNS,
- TRNS, FN25, FN22, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS,
- TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, MO3, TRNS, TRNS, TRNS, TRNS),
-};
-const uint16_t PROGMEM fn_actions[] = {
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
-
- [10] = ACTION_MODS_KEY(MOD_LSFT, KC_1), // !
- [11] = ACTION_MODS_KEY(MOD_LSFT, KC_2), // @
- [12] = ACTION_MODS_KEY(MOD_LSFT, KC_3), // #
- [13] = ACTION_MODS_KEY(MOD_LSFT, KC_4), // $
- [14] = ACTION_MODS_KEY(MOD_LSFT, KC_5), // %
- [15] = ACTION_MODS_KEY(MOD_LSFT, KC_6), // ^
- [16] = ACTION_MODS_KEY(MOD_LSFT, KC_7), // &
- [17] = ACTION_MODS_KEY(MOD_LSFT, KC_8), // *
- [18] = ACTION_MODS_KEY(MOD_LSFT, KC_9), // (
- [19] = ACTION_MODS_KEY(MOD_LSFT, KC_0), // )
-
- [20] = ACTION_MODS_KEY(MOD_LSFT, KC_MINS), // _
- [21] = ACTION_MODS_KEY(MOD_LSFT, KC_EQL), // +
- [22] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // ~
- [23] = ACTION_MODS_KEY(MOD_LSFT, KC_LBRC), // {
- [24] = ACTION_MODS_KEY(MOD_LSFT, KC_RBRC), // }
- [25] = ACTION_MODS_KEY(MOD_LSFT, KC_BSLS), // |
-
- [26] = ACTION_MODS_KEY(MOD_LSFT | MOD_RSFT, KC_PAUSE)
-};
diff --git a/keyboards/planck/old_keymap_files/keymap_common.c b/keyboards/planck/old_keymap_files/keymap_common.c
deleted file mode 100644
index db4f18a95b4..00000000000
--- a/keyboards/planck/old_keymap_files/keymap_common.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
-Copyright 2012,2013 Jun Wako
-
-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 .
-*/
-#include "keymap.h"
-
-
-/* translates key to keycode */
-uint8_t keymap_key_to_keycode(uint8_t layer, keypos_t key)
-{
- return pgm_read_byte(&keymaps[(layer)][(key.row)][(key.col)]);
-}
-
-/* translates Fn keycode to action */
-action_t keymap_fn_to_action(uint8_t keycode)
-{
- return (action_t){ .code = pgm_read_word(&fn_actions[FN_INDEX(keycode)]) };
-}
diff --git a/keyboards/planck/old_keymap_files/keymap_common.h b/keyboards/planck/old_keymap_files/keymap_common.h
deleted file mode 100644
index d46df92876a..00000000000
--- a/keyboards/planck/old_keymap_files/keymap_common.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
-Copyright 2012,2013 Jun Wako
-
-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 .
-*/
-#ifndef KEYMAP_COMMON_H
-#define KEYMAP_COMMON_H
-
-#include
-#include
-#include
-#include "keycode.h"
-#include "action.h"
-#include "action_macro.h"
-#include "report.h"
-#include "host.h"
-// #include "print.h"
-#include "debug.h"
-#include "keymap.h"
-
-
-extern const uint8_t keymaps[][MATRIX_ROWS][MATRIX_COLS];
-extern const uint16_t fn_actions[];
-
-
-// MIT Layout
-/*
- * ,-----------------------------------------------------------------------.
- * | | | | | | | | | | | | |
- * |-----------------------------------------------------------------------|
- * | | | | | | | | | | | | |
- * |-----------------------------------------------------------------------|
- * | | | | | | | | | | | | |
- * |-----------------------------------------------------------------------|
- * | | | | | | | | | | | |
- * `-----------------------------------------------------------------------'
- */
-#define KEYMAP( \
- K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
- K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
- K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
- K30, K31, K32, K33, K34, K35, K37, K38, K39, K3A, K3B \
-) { \
- { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B }, \
- { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B }, \
- { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B }, \
- { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K35, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B } \
-}
-
-// Grid Layout
-/*
- * ,-----------------------------------------------------------------------.
- * | | | | | | | | | | | | |
- * |-----------------------------------------------------------------------|
- * | | | | | | | | | | | | |
- * |-----------------------------------------------------------------------|
- * | | | | | | | | | | | | |
- * |-----------------------------------------------------------------------|
- * | | | | | | | | | | | | |
- * `-----------------------------------------------------------------------'
- */
-#define KEYMAP_GRID( \
- K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
- K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
- K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
- K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B \
-) { \
- { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B }, \
- { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B }, \
- { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B }, \
- { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B } \
-}
-
-#define KEYMAP_REVERSE( \
- K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
- K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
- K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
- K30, K31, K32, K33, K34, K35, K37, K38, K39, K3A, K3B \
- ) { \
- { KC_##K0B, KC_##K0A, KC_##K09, KC_##K08, KC_##K07, KC_##K06, KC_##K05, KC_##K04, KC_##K03, KC_##K02, KC_##K01, KC_##K00 }, \
- { KC_##K1B, KC_##K1A, KC_##K19, KC_##K18, KC_##K17, KC_##K16, KC_##K15, KC_##K14, KC_##K13, KC_##K12, KC_##K11, KC_##K10 }, \
- { KC_##K2B, KC_##K2A, KC_##K29, KC_##K28, KC_##K27, KC_##K26, KC_##K25, KC_##K24, KC_##K23, KC_##K22, KC_##K21, KC_##K20 }, \
- { KC_##K3B, KC_##K3A, KC_##K39, KC_##K38, KC_##K37, KC_##K35, KC_##K35, KC_##K34, KC_##K33, KC_##K32, KC_##K31, KC_##K30 }, \
- }
-
-#define KEYMAP_AND_REVERSE(args...) KEYMAP(args), KEYMAP_REVERSE(args)
-
-#define KEYMAP_SWAP( \
- K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
- K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
- K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
- K30, K31, K32, K33, K34, K35, K37, K38, K39, K3A, K3B \
- ) { \
- { KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B, KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05 }, \
- { KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B, KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15 }, \
- { KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B, KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25 }, \
- { KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B, KC_##K35, KC_##K35, KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34 }, \
-}
-
-#define KEYMAP_AND_SWAP(args...) KEYMAP(args), KEYMAP_SWAP(args)
-
-/*
- Keymap for the Planck 48 key variant.
- */
-#define KEYMAP_48( \
- K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
- K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
- K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
- K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B \
-) { \
- { KC_##K00, KC_##K01, KC_##K02, KC_##K03, KC_##K04, KC_##K05, KC_##K06, KC_##K07, KC_##K08, KC_##K09, KC_##K0A, KC_##K0B }, \
- { KC_##K10, KC_##K11, KC_##K12, KC_##K13, KC_##K14, KC_##K15, KC_##K16, KC_##K17, KC_##K18, KC_##K19, KC_##K1A, KC_##K1B }, \
- { KC_##K20, KC_##K21, KC_##K22, KC_##K23, KC_##K24, KC_##K25, KC_##K26, KC_##K27, KC_##K28, KC_##K29, KC_##K2A, KC_##K2B }, \
- { KC_##K30, KC_##K31, KC_##K32, KC_##K33, KC_##K34, KC_##K35, KC_##K36, KC_##K37, KC_##K38, KC_##K39, KC_##K3A, KC_##K3B }, \
-}
-
-
-#endif
diff --git a/keyboards/preonic/keymaps/AlexDaigre/config.h b/keyboards/preonic/keymaps/AlexDaigre/config.h
new file mode 100644
index 00000000000..40a9524b469
--- /dev/null
+++ b/keyboards/preonic/keymaps/AlexDaigre/config.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#ifdef AUDIO_ENABLE
+ #define STARTUP_SONG SONG(PREONIC_SOUND)
+ // #define STARTUP_SONG SONG(NO_SOUND)
+
+ #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \
+ SONG(COLEMAK_SOUND), \
+ SONG(DVORAK_SOUND) \
+ }
+#endif
+
+#define MUSIC_MASK (keycode != KC_NO)
+
+/*
+ * MIDI options
+ */
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+
+#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 2
diff --git a/keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/adjust.json b/keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/adjust.json
new file mode 100644
index 00000000000..6dac52cb944
--- /dev/null
+++ b/keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/adjust.json
@@ -0,0 +1,80 @@
+[
+ {
+ "name": "Plank Don Gato Programming Raise Layer"
+ },
+ [
+ {
+ "a": 7
+ },
+ "F1",
+ "F2",
+ "F3",
+ "F4",
+ "F5",
+ "F6",
+ "F7",
+ "F8",
+ "F9",
+ "F10",
+ "F11",
+ "F12"
+ ],
+ [
+ "",
+ "Reset",
+ "Debug",
+ "",
+ "",
+ "",
+ "",
+ "Term On",
+ "Term Off",
+ "",
+ "",
+ ""
+ ],
+ [
+ "",
+ "",
+ "Mu Mod",
+ "Audio On",
+ "Audio Off",
+ "AG Norm",
+ "AG Swap",
+ "Qwerty",
+ "Colemak",
+ "Dvorak",
+ "",
+ ""
+ ],
+ [
+ "",
+ "Voice -",
+ "Voice +",
+ "Music On",
+ "Music Off",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ],
+ [
+ "",
+ "",
+ "",
+ "",
+ "",
+ {
+ "w": 2
+ },
+ "",
+ "",
+ "Next",
+ "Vol -",
+ "Vol +",
+ "Play"
+ ]
+]
\ No newline at end of file
diff --git a/keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/lower.json b/keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/lower.json
new file mode 100644
index 00000000000..ccf860653fc
--- /dev/null
+++ b/keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/lower.json
@@ -0,0 +1,80 @@
+[
+ {
+ "name": "Plank Don Gato Programming Lower Layer"
+ },
+ [
+ {
+ "a": 7
+ },
+ "Print Screen",
+ "Page Up",
+ "Page Down",
+ "Home",
+ "End",
+ "Insert",
+ "Scroll Lock",
+ "Num Lock",
+ "Pause",
+ "]",
+ "[",
+ "-"
+ ],
+ [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "Delete"
+ ],
+ [
+ "Caps Lock",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ],
+ [
+ "Right Shift",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "\\",
+ "Menu"
+ ],
+ [
+ "Right Ctrl",
+ "Right Alt",
+ "Right Os",
+ "",
+ "",
+ {
+ "w": 2
+ },
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+]
\ No newline at end of file
diff --git a/keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/main.json b/keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/main.json
new file mode 100644
index 00000000000..77589c205cd
--- /dev/null
+++ b/keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/main.json
@@ -0,0 +1,95 @@
+[
+ {
+ "name": "Plank Don Gato Programming Main Layer"
+ },
+ [
+ {
+ "a": 5
+ },
+ "~\n`",
+ "!\n1",
+ "@\n2",
+ "#\n3",
+ "$\n4",
+ "%\n5",
+ "^\n6",
+ "&\n7",
+ "*\n8",
+ "(\n9",
+ ")\n0",
+ "+\n="
+ ],
+ [
+ {
+ "a": 7
+ },
+ "Tab",
+ "Q",
+ "W",
+ "E",
+ "R",
+ "T",
+ "Y",
+ "U",
+ "I",
+ "O",
+ "P",
+ "Back Space"
+ ],
+ [
+ "Esc",
+ "A",
+ "S",
+ "D",
+ "F",
+ "G",
+ "H",
+ "J",
+ "K",
+ "L",
+ {
+ "a": 5
+ },
+ ":\n;",
+ "\"\n'"
+ ],
+ [
+ {
+ "a": 7
+ },
+ "Shift",
+ "Z",
+ "X",
+ "C",
+ "V",
+ "B",
+ "N",
+ "M",
+ {
+ "a": 5
+ },
+ "<\n,",
+ ">\n.",
+ {
+ "a": 7
+ },
+ "/",
+ "Return"
+ ],
+ [
+ "Ctrl",
+ "Alt",
+ "OS",
+ "Super",
+ "⇓",
+ {
+ "w": 2
+ },
+ "",
+ "⇑",
+ "←",
+ "↓",
+ "↑",
+ "→"
+ ]
+]
\ No newline at end of file
diff --git a/keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/raise.json b/keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/raise.json
new file mode 100644
index 00000000000..aae97d489fd
--- /dev/null
+++ b/keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/raise.json
@@ -0,0 +1,80 @@
+[
+ {
+ "name": "Plank Don Gato Programming Raise Layer"
+ },
+ [
+ {
+ "a": 7
+ },
+ "Print Screen",
+ "Page Up",
+ "Page Down",
+ "Home",
+ "End",
+ "Insert",
+ "Scroll Lock",
+ "Num Lock",
+ "Pause",
+ "{",
+ "}",
+ "_"
+ ],
+ [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "Delete"
+ ],
+ [
+ "Caps Lock",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ],
+ [
+ "Right Shift",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "|",
+ "Menu"
+ ],
+ [
+ "Right Ctrl",
+ "Right Alt",
+ "Right Os",
+ "",
+ "",
+ {
+ "w": 2
+ },
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+ ]
\ No newline at end of file
diff --git a/keyboards/preonic/keymaps/AlexDaigre/keymap.c b/keyboards/preonic/keymaps/AlexDaigre/keymap.c
new file mode 100644
index 00000000000..67d13005cfd
--- /dev/null
+++ b/keyboards/preonic/keymaps/AlexDaigre/keymap.c
@@ -0,0 +1,326 @@
+/* Copyright 2020 Alex Daigre
+ * Modified from layout provided by Jack Humbert
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+#include "muse.h"
+
+enum preonic_layers {
+ _QWERTY,
+ _COLEMAK,
+ _DVORAK,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+enum preonic_keycodes {
+ QWERTY = SAFE_RANGE,
+ COLEMAK,
+ DVORAK,
+ LOWER,
+ RAISE,
+ BACKLIT,
+ ADJUST
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | = |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt | GUI |Adjust| Lower| Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = LAYOUT_preonic_grid( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQUAL, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \
+ KC_LCTL, KC_LALT, KC_LGUI, ADJUST, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
+),
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | = |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | R | S | T | D | H | N | E | I | O | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt | GUI |Adjust| Lower| Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_COLEMAK] = LAYOUT_preonic_grid( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQUAL, \
+ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC, \
+ KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \
+ KC_LCTL, KC_LALT, KC_LGUI, ADJUST, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
+),
+
+/* Dvorak
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | = |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | " | , | . | P | Y | F | G | C | R | L | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | O | E | U | I | D | H | T | N | S | / |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | Alt | GUI |Adjust| Lower| Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_DVORAK] = LAYOUT_preonic_grid( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_EQUAL, \
+ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC, \
+ KC_ESC, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH, \
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT, \
+ KC_LCTL, KC_LALT, KC_LGUI, ADJUST, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
+),
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * |PrtScr| PgUp | PgDw | Home | End |Insert|ScrlLk|NumLck|Pause | [ | ] | - |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | | | | | | | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Caps | | | | | | | | | | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | | | | | | \ | Menu |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |RCtrl | RAlt | RGui | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = LAYOUT_preonic_grid( \
+ KC_PSCREEN, KC_PGUP, KC_PGDOWN, KC_HOME, KC_END, KC_INSERT, KC_SCROLLLOCK, KC_NUMLOCK, KC_PAUSE, KC_LBRACKET, KC_RBRACKET, KC_MINUS, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DELETE, \
+ KC_CAPSLOCK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ KC_RSHIFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_BSLASH, KC_MENU, \
+ KC_RCTRL, KC_RALT, KC_RGUI, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+),
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * |PrtScr| PgUp | PgDw | Home | End |Insert|ScrlLk|NumLck|Pause | { | } | _ |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Caps | | | | | | | | | | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | | | | | | | | Menu |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |RCtrl | RAlt | RGui | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = LAYOUT_preonic_grid( \
+ KC_PSCREEN, KC_PGUP, KC_PGDOWN, KC_HOME, KC_END, KC_INSERT, KC_SCROLLLOCK, KC_NUMLOCK, KC_PAUSE, KC_LEFT_CURLY_BRACE, KC_RIGHT_CURLY_BRACE, KC_UNDERSCORE, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DELETE, \
+ KC_CAPSLOCK, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ KC_RSHIFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PIPE, KC_MENU, \
+ KC_RCTRL, KC_RALT, KC_RGUI, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+),
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | Reset| | | | | | | | | | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | |Aud on|AudOff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | |Voice-|Voice+|Mus on|MusOff|MidiOn|MidOff| | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Light| | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = LAYOUT_preonic_grid( \
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, \
+ _______, RESET, DEBUG, _______, _______, _______, _______, TERM_ON, TERM_OFF,_______, _______, _______, \
+ _______, _______, MU_MOD, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \
+ _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, \
+ BACKLIT, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+)
+
+
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case QWERTY:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_QWERTY);
+ }
+ return false;
+ break;
+ case COLEMAK:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_COLEMAK);
+ }
+ return false;
+ break;
+ case DVORAK:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_DVORAK);
+ }
+ return false;
+ break;
+ case ADJUST:
+ if (record->event.pressed) {
+ layer_on(_RAISE);
+ layer_on(_LOWER);
+ layer_on(_ADJUST);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_RAISE);
+ layer_off(_LOWER);
+ layer_off(_ADJUST);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ return false;
+ break;
+ case LOWER:
+ if (record->event.pressed) {
+ layer_on(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ return false;
+ break;
+ case RAISE:
+ if (record->event.pressed) {
+ layer_on(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _ADJUST);
+ }
+ return false;
+ break;
+ case BACKLIT:
+ if (record->event.pressed) {
+ register_code(KC_RSFT);
+ #ifdef BACKLIGHT_ENABLE
+ backlight_step();
+ #endif
+ #ifdef __AVR__
+ writePinLow(E6);
+ #endif
+ } else {
+ unregister_code(KC_RSFT);
+ #ifdef __AVR__
+ writePinHigh(E6);
+ #endif
+ }
+ return false;
+ break;
+ }
+ return true;
+};
+
+bool muse_mode = false;
+uint8_t last_muse_note = 0;
+uint16_t muse_counter = 0;
+uint8_t muse_offset = 70;
+uint16_t muse_tempo = 50;
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (muse_mode) {
+ if (IS_LAYER_ON(_RAISE)) {
+ if (clockwise) {
+ muse_offset++;
+ } else {
+ muse_offset--;
+ }
+ } else {
+ if (clockwise) {
+ muse_tempo+=1;
+ } else {
+ muse_tempo-=1;
+ }
+ }
+ } else {
+ if (clockwise) {
+ register_code(KC_PGDN);
+ unregister_code(KC_PGDN);
+ } else {
+ register_code(KC_PGUP);
+ unregister_code(KC_PGUP);
+ }
+ }
+}
+
+void dip_switch_update_user(uint8_t index, bool active) {
+ switch (index) {
+ case 0:
+ if (active) {
+ layer_on(_ADJUST);
+ } else {
+ layer_off(_ADJUST);
+ }
+ break;
+ case 1:
+ if (active) {
+ muse_mode = true;
+ } else {
+ muse_mode = false;
+ }
+ }
+}
+
+
+void matrix_scan_user(void) {
+#ifdef AUDIO_ENABLE
+ if (muse_mode) {
+ if (muse_counter == 0) {
+ uint8_t muse_note = muse_offset + SCALE[muse_clock_pulse()];
+ if (muse_note != last_muse_note) {
+ stop_note(compute_freq_for_midi_note(last_muse_note));
+ play_note(compute_freq_for_midi_note(muse_note), 0xF);
+ last_muse_note = muse_note;
+ }
+ }
+ muse_counter = (muse_counter + 1) % muse_tempo;
+ } else {
+ if (muse_counter) {
+ stop_all_notes();
+ muse_counter = 0;
+ }
+ }
+#endif
+}
+
+bool music_mask_user(uint16_t keycode) {
+ switch (keycode) {
+ case RAISE:
+ case LOWER:
+ return false;
+ default:
+ return true;
+ }
+}
diff --git a/keyboards/preonic/keymaps/AlexDaigre/readme.md b/keyboards/preonic/keymaps/AlexDaigre/readme.md
new file mode 100644
index 00000000000..0aed8ebe092
--- /dev/null
+++ b/keyboards/preonic/keymaps/AlexDaigre/readme.md
@@ -0,0 +1,19 @@
+[Layout Images](https://imgur.com/a/k95XQlP)
+
+# Alex Daigre's programming Layout
+
+The default Preonic layout is suited to general english typing but not very convent to program on. This is my custom layout to re-optimise the keyboard for programming tasks.
+I have been programming with this keyboard layout at work and I found it much faster and easier to adjust to than the default layout.
+
+- Removed keys on the RAISE, LOWER, and ADJUST layers that duplicated keys on the main QWERTY layout.
+- Moved the control, alt, and gui keys to a more natural position.
+- Added the Caps-lock key on RAISE and LOWER in its position on a standard keyboard.
+- Moved {}[], -_, and \| (on RAISE and LOWER) to be close to to similar keys on the QWERTY layout to make them easier to remember. They are kept as close as possible to their locations on a standard layout so users won't have to ADJUST their muscle memory much.
+ - (), {}, and [] are all on the 9 and 0 keys. This is where () are placed naturally, so it is easy to find all of your braces.
+ - -_ are moved to the += key. Now you can remember that -, +, and = are all together. The keys are also right next to each-other on a standard layout, so it is a very small move.
+ - \ and | have beeb moved to the /? key. Easy to remember as / and \ are together.
+- Moved backspace to make room for +=.
+- Added delete to the backspace key on RAISE / LOWER
+- Removed backlight, from the main layer, and added an ADJUST key. As the Massdrop kits don't come with backlighting default, I think this is more useful for most users.
+- I have left the Colemak and Dvorak alternate layouts, but they won't map up as conveniently to the other layers.
+- I have included the keyboard layouts so that those wishing to make modifications or new versions of this layout can quickly update their images.
diff --git a/keyboards/preonic/keymaps/AlexDaigre/rules.mk b/keyboards/preonic/keymaps/AlexDaigre/rules.mk
new file mode 100644
index 00000000000..dcf16bef399
--- /dev/null
+++ b/keyboards/preonic/keymaps/AlexDaigre/rules.mk
@@ -0,0 +1 @@
+SRC += muse.c
diff --git a/keyboards/preonic/keymaps/elisiano/keymap.c b/keyboards/preonic/keymaps/elisiano/keymap.c
index 6da803ce629..a4e78d01559 100644
--- a/keyboards/preonic/keymaps/elisiano/keymap.c
+++ b/keyboards/preonic/keymaps/elisiano/keymap.c
@@ -56,7 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL,
CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSFT_T(KC_ENT),
EMOJI, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
@@ -77,7 +77,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL,
CTL_T(KC_ESC), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, RSFT_T(KC_ENT),
EMOJI, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
@@ -98,7 +98,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL,
CTL_T(KC_ESC), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_SLSH,
- KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT,
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, RSFT_T(KC_ENT),
EMOJI, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
diff --git a/keyboards/preonic/keymaps/pvillano/config.h b/keyboards/preonic/keymaps/pvillano/config.h
new file mode 100644
index 00000000000..a338a1da440
--- /dev/null
+++ b/keyboards/preonic/keymaps/pvillano/config.h
@@ -0,0 +1,32 @@
+#pragma once
+
+#ifdef AUDIO_ENABLE
+ #define STARTUP_SONG SONG(PREONIC_SOUND)
+#endif
+
+#define MUSIC_MASK (keycode != KC_NO)
+
+// #define MUSIC_MAP
+/*
+ * MIDI options
+ */
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+
+#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 2
diff --git a/keyboards/preonic/keymaps/pvillano/keymap.c b/keyboards/preonic/keymaps/pvillano/keymap.c
new file mode 100644
index 00000000000..093948e0938
--- /dev/null
+++ b/keyboards/preonic/keymaps/pvillano/keymap.c
@@ -0,0 +1,113 @@
+/* Do as you please
+ * - pvillano
+ */
+
+#include QMK_KEYBOARD_H
+#include "muse.h"
+
+ enum preonic_layers {
+ _QWERTY,
+ _GAME,
+ _ALT,
+ _FUN,
+ };
+
+ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* Qwerty
+ * ,-----------------------------------------------------------------------------------------------------------.
+ * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ * | ` | Q | W | E | R | T | Y | U | I | O | P | \ |
+ * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+--------|
+ * | Tab | A | S | D | F | G | H | J | K | L | ; | " |
+ * |--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
+ * | Shift | Z | X | C | V | B | N | M | , | . | / | Enter |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ * | Ctrl | GUI | Alt | Func |AltLayer| Space | _ |AltLayer| Left | Down | Up | Right |
+ * `-----------------------------------------------------------------------------------------------------------'
+ */
+ [_QWERTY] = LAYOUT_preonic_grid(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ KC_LCTL, KC_LGUI, KC_LALT, MO(_FUN),MO(_ALT),KC_SPC, KC_UNDS, MO(_ALT),KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+
+ /* Game
+ * ,-----------------------------------------------------------------------------------------------------------.
+ * | | | | | | | | | | | | |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ * | | | | | | | | | | | | |
+ * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+--------|
+ * | | | | | | | | | | | | |
+ * |--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
+ * | | | | | | | | | | | | |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ * | | NOOP | | | | | ALT | | | | | |
+ * `-----------------------------------------------------------------------------------------------------------'
+ */
+ [_GAME] = LAYOUT_preonic_grid(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, XXXXXXX, _______, _______, _______, _______, KC_LALT, _______, _______, _______, _______, _______
+ ),
+
+ /* Alt
+ * ,-----------------------------------------------------------------------------------------------------------.
+ * | | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ * | |Keypad 7|Keypad 8|Keypad 9| | | | - | + | { | } | |
+ * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+--------|
+ * | |Keypad 4|Keypad 5|Keypad 6| | | | - | = | [ | ] | |
+ * |--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
+ * | |Keypad 1|Keypad 2|Keypad 3| | | | | | < | > | |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ * | |Keypad 0|Keypad 0| | | | | | | | | |
+ * `-----------------------------------------------------------------------------------------------------------'
+ */
+ [_ALT] = LAYOUT_preonic_grid(
+ _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL,
+ _______, KC_P7, KC_P8, KC_P9, _______, _______, _______, KC_MINS, KC_PLUS, KC_LCBR, KC_RCBR, _______,
+ _______, KC_P4, KC_P5, KC_P6, _______, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______,
+ _______, KC_P1, KC_P2, KC_P3, _______, _______, _______, _______, _______, KC_LT, KC_GT, _______,
+ _______, KC_P0, KC_P0, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ /* Function
+ * ,-----------------------------------------------------------------------------------------------------------.
+ * | | F1 | F2 | F3 | F4 | | | | | | | Del |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ * | | F5 | F6 | F7 | F8 | | | | | |program | |
+ * |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+--------|
+ * | | F9 | F10 | F11 | F12 | Game | | | | | | |
+ * |--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------|
+ * | | | | | | |Num Lock| Music | | | | |
+ * |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ * | | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------------------------------'
+ */
+ [_FUN] = LAYOUT_preonic_grid(
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, _______, _______, _______, _______, _______, _______, KC_DEL,
+ _______, KC_F5, KC_F6, KC_F7, KC_F8, _______, _______, _______, _______, _______, RESET, _______,
+ _______, KC_F9, KC_F10, KC_F11, KC_F12, TG(_GAME),_______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, KC_NLCK, MU_TOG, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+ };
+
+
+ bool music_mask_user(uint16_t keycode) {
+ switch (keycode) {
+ case MO(_FUN):
+ case MO(_ALT):
+ case KC_SPC:
+ case KC_UNDS:
+ return false;
+ default:
+ return true;
+ }
+ }
diff --git a/keyboards/preonic/keymaps/pvillano/readme.md b/keyboards/preonic/keymaps/pvillano/readme.md
new file mode 100644
index 00000000000..a1d11f8acb7
--- /dev/null
+++ b/keyboards/preonic/keymaps/pvillano/readme.md
@@ -0,0 +1,25 @@
+# A preonic layout similar to the default,
+
+but with some extra conviences for programming and gaming
+
+## For programming
+
+* Underscore is next to space.
+* Backslash replaces Del on the default layer.
+* Brackets are easy to reach, and are arranged symmetrically.
+
+## For Gaming
+
+* Gaming mode disables OS key.
+* Gaming mode moves ALT to "right space", to be more easily reached.
+* Numpad is available with only the left hand (for emotes).
+
+## Personal taste
+
+* Esc is in the top left, where it belongs
+* Only one Alt layer and one Func layer
+* Function codes are mnemonic
+ * Func + G for Game mode
+ * Func + M for Music mode
+ * Func + N for Num lock
+* No multi-key combos with more than two keys
diff --git a/keyboards/preonic/keymaps/pvillano/rules.mk b/keyboards/preonic/keymaps/pvillano/rules.mk
new file mode 100644
index 00000000000..dcf16bef399
--- /dev/null
+++ b/keyboards/preonic/keymaps/pvillano/rules.mk
@@ -0,0 +1 @@
+SRC += muse.c
diff --git a/keyboards/projectkb/alice/alice.c b/keyboards/projectkb/alice/alice.c
index ca0c7da2be2..b82e2050e39 100644
--- a/keyboards/projectkb/alice/alice.c
+++ b/keyboards/projectkb/alice/alice.c
@@ -1,17 +1,17 @@
#include "alice.h"
void matrix_init_board(void){
- setPinOutput(A0);
- setPinOutput(A1);
- setPinOutput(A2);
+ setPinOutput(INDICATOR_PIN_0);
+ setPinOutput(INDICATOR_PIN_1);
+ setPinOutput(INDICATOR_PIN_2);
}
bool led_update_kb(led_t led_state) {
bool runDefault = led_update_user(led_state);
if (runDefault) {
- writePin(A0, !led_state.num_lock);
- writePin(A1, !led_state.caps_lock);
- writePin(A2, !led_state.scroll_lock);
+ writePin(INDICATOR_PIN_0, !led_state.num_lock);
+ writePin(INDICATOR_PIN_1, !led_state.caps_lock);
+ writePin(INDICATOR_PIN_2, !led_state.scroll_lock);
}
return runDefault;
}
diff --git a/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.c b/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.c
deleted file mode 100644
index 7c09bd997cb..00000000000
--- a/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/*
- * This file has been automatically generated using ChibiStudio board
- * generator plugin. Do not edit manually.
- */
-
-#include "hal.h"
-#include "stm32_gpio.h"
-
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/**
- * @brief Type of STM32 GPIO port setup.
- */
-typedef struct {
- uint32_t moder;
- uint32_t otyper;
- uint32_t ospeedr;
- uint32_t pupdr;
- uint32_t odr;
- uint32_t afrl;
- uint32_t afrh;
-} gpio_setup_t;
-
-/**
- * @brief Type of STM32 GPIO initialization data.
- */
-typedef struct {
-#if STM32_HAS_GPIOA || defined(__DOXYGEN__)
- gpio_setup_t PAData;
-#endif
-#if STM32_HAS_GPIOB || defined(__DOXYGEN__)
- gpio_setup_t PBData;
-#endif
-#if STM32_HAS_GPIOC || defined(__DOXYGEN__)
- gpio_setup_t PCData;
-#endif
-#if STM32_HAS_GPIOD || defined(__DOXYGEN__)
- gpio_setup_t PDData;
-#endif
-#if STM32_HAS_GPIOE || defined(__DOXYGEN__)
- gpio_setup_t PEData;
-#endif
-#if STM32_HAS_GPIOF || defined(__DOXYGEN__)
- gpio_setup_t PFData;
-#endif
-#if STM32_HAS_GPIOG || defined(__DOXYGEN__)
- gpio_setup_t PGData;
-#endif
-#if STM32_HAS_GPIOH || defined(__DOXYGEN__)
- gpio_setup_t PHData;
-#endif
-#if STM32_HAS_GPIOI || defined(__DOXYGEN__)
- gpio_setup_t PIData;
-#endif
-#if STM32_HAS_GPIOJ || defined(__DOXYGEN__)
- gpio_setup_t PJData;
-#endif
-#if STM32_HAS_GPIOK || defined(__DOXYGEN__)
- gpio_setup_t PKData;
-#endif
-} gpio_config_t;
-
-/**
- * @brief STM32 GPIO static initialization data.
- */
-static const gpio_config_t gpio_default_config = {
-#if STM32_HAS_GPIOA
- {VAL_GPIOA_MODER, VAL_GPIOA_OTYPER, VAL_GPIOA_OSPEEDR, VAL_GPIOA_PUPDR,
- VAL_GPIOA_ODR, VAL_GPIOA_AFRL, VAL_GPIOA_AFRH},
-#endif
-#if STM32_HAS_GPIOB
- {VAL_GPIOB_MODER, VAL_GPIOB_OTYPER, VAL_GPIOB_OSPEEDR, VAL_GPIOB_PUPDR,
- VAL_GPIOB_ODR, VAL_GPIOB_AFRL, VAL_GPIOB_AFRH},
-#endif
-#if STM32_HAS_GPIOC
- {VAL_GPIOC_MODER, VAL_GPIOC_OTYPER, VAL_GPIOC_OSPEEDR, VAL_GPIOC_PUPDR,
- VAL_GPIOC_ODR, VAL_GPIOC_AFRL, VAL_GPIOC_AFRH},
-#endif
-#if STM32_HAS_GPIOD
- {VAL_GPIOD_MODER, VAL_GPIOD_OTYPER, VAL_GPIOD_OSPEEDR, VAL_GPIOD_PUPDR,
- VAL_GPIOD_ODR, VAL_GPIOD_AFRL, VAL_GPIOD_AFRH},
-#endif
-#if STM32_HAS_GPIOE
- {VAL_GPIOE_MODER, VAL_GPIOE_OTYPER, VAL_GPIOE_OSPEEDR, VAL_GPIOE_PUPDR,
- VAL_GPIOE_ODR, VAL_GPIOE_AFRL, VAL_GPIOE_AFRH},
-#endif
-#if STM32_HAS_GPIOF
- {VAL_GPIOF_MODER, VAL_GPIOF_OTYPER, VAL_GPIOF_OSPEEDR, VAL_GPIOF_PUPDR,
- VAL_GPIOF_ODR, VAL_GPIOF_AFRL, VAL_GPIOF_AFRH},
-#endif
-#if STM32_HAS_GPIOG
- {VAL_GPIOG_MODER, VAL_GPIOG_OTYPER, VAL_GPIOG_OSPEEDR, VAL_GPIOG_PUPDR,
- VAL_GPIOG_ODR, VAL_GPIOG_AFRL, VAL_GPIOG_AFRH},
-#endif
-#if STM32_HAS_GPIOH
- {VAL_GPIOH_MODER, VAL_GPIOH_OTYPER, VAL_GPIOH_OSPEEDR, VAL_GPIOH_PUPDR,
- VAL_GPIOH_ODR, VAL_GPIOH_AFRL, VAL_GPIOH_AFRH},
-#endif
-#if STM32_HAS_GPIOI
- {VAL_GPIOI_MODER, VAL_GPIOI_OTYPER, VAL_GPIOI_OSPEEDR, VAL_GPIOI_PUPDR,
- VAL_GPIOI_ODR, VAL_GPIOI_AFRL, VAL_GPIOI_AFRH},
-#endif
-#if STM32_HAS_GPIOJ
- {VAL_GPIOJ_MODER, VAL_GPIOJ_OTYPER, VAL_GPIOJ_OSPEEDR, VAL_GPIOJ_PUPDR,
- VAL_GPIOJ_ODR, VAL_GPIOJ_AFRL, VAL_GPIOJ_AFRH},
-#endif
-#if STM32_HAS_GPIOK
- {VAL_GPIOK_MODER, VAL_GPIOK_OTYPER, VAL_GPIOK_OSPEEDR, VAL_GPIOK_PUPDR,
- VAL_GPIOK_ODR, VAL_GPIOK_AFRL, VAL_GPIOK_AFRH}
-#endif
-};
-
-/*===========================================================================*/
-/* Driver local functions. */
-/*===========================================================================*/
-
-static void gpio_init(stm32_gpio_t *gpiop, const gpio_setup_t *config) {
-
- gpiop->OTYPER = config->otyper;
- gpiop->OSPEEDR = config->ospeedr;
- gpiop->PUPDR = config->pupdr;
- gpiop->ODR = config->odr;
- gpiop->AFRL = config->afrl;
- gpiop->AFRH = config->afrh;
- gpiop->MODER = config->moder;
-}
-
-static void stm32_gpio_init(void) {
-
- /* Enabling GPIO-related clocks, the mask comes from the
- registry header file.*/
- rccResetAHB(STM32_GPIO_EN_MASK);
- rccEnableAHB(STM32_GPIO_EN_MASK, true);
-
- /* Initializing all the defined GPIO ports.*/
-#if STM32_HAS_GPIOA
- gpio_init(GPIOA, &gpio_default_config.PAData);
-#endif
-#if STM32_HAS_GPIOB
- gpio_init(GPIOB, &gpio_default_config.PBData);
-#endif
-#if STM32_HAS_GPIOC
- gpio_init(GPIOC, &gpio_default_config.PCData);
-#endif
-#if STM32_HAS_GPIOD
- gpio_init(GPIOD, &gpio_default_config.PDData);
-#endif
-#if STM32_HAS_GPIOE
- gpio_init(GPIOE, &gpio_default_config.PEData);
-#endif
-#if STM32_HAS_GPIOF
- gpio_init(GPIOF, &gpio_default_config.PFData);
-#endif
-#if STM32_HAS_GPIOG
- gpio_init(GPIOG, &gpio_default_config.PGData);
-#endif
-#if STM32_HAS_GPIOH
- gpio_init(GPIOH, &gpio_default_config.PHData);
-#endif
-#if STM32_HAS_GPIOI
- gpio_init(GPIOI, &gpio_default_config.PIData);
-#endif
-#if STM32_HAS_GPIOJ
- gpio_init(GPIOJ, &gpio_default_config.PJData);
-#endif
-#if STM32_HAS_GPIOK
- gpio_init(GPIOK, &gpio_default_config.PKData);
-#endif
-}
-
-/*===========================================================================*/
-/* Driver interrupt handlers. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported functions. */
-/*===========================================================================*/
-
-/**
- * @brief Early initialization code.
- * @details GPIO ports and system clocks are initialized before everything
- * else.
- */
-void __early_init(void) {
- extern void enter_bootloader_mode_if_requested(void);
- enter_bootloader_mode_if_requested();
- stm32_gpio_init();
- stm32_clock_init();
-}
-
-#if HAL_USE_SDC || defined(__DOXYGEN__)
-/**
- * @brief SDC card detection.
- */
-bool sdc_lld_is_card_inserted(SDCDriver *sdcp) {
-
- (void)sdcp;
- /* TODO: Fill the implementation.*/
- return true;
-}
-
-/**
- * @brief SDC card write protection detection.
- */
-bool sdc_lld_is_write_protected(SDCDriver *sdcp) {
-
- (void)sdcp;
- /* TODO: Fill the implementation.*/
- return false;
-}
-#endif /* HAL_USE_SDC */
-
-#if HAL_USE_MMC_SPI || defined(__DOXYGEN__)
-/**
- * @brief MMC_SPI card detection.
- */
-bool mmc_lld_is_card_inserted(MMCDriver *mmcp) {
-
- (void)mmcp;
- /* TODO: Fill the implementation.*/
- return true;
-}
-
-/**
- * @brief MMC_SPI card write protection detection.
- */
-bool mmc_lld_is_write_protected(MMCDriver *mmcp) {
-
- (void)mmcp;
- /* TODO: Fill the implementation.*/
- return false;
-}
-#endif
-
-/**
- * @brief Board-specific initialization code.
- * @todo Add your board-specific code, if any.
- */
-void boardInit(void) {
- SYSCFG->CFGR1 |= SYSCFG_CFGR1_I2C1_DMA_RMP;
- SYSCFG->CFGR1 &= ~(SYSCFG_CFGR1_SPI2_DMA_RMP);
-}
diff --git a/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.h b/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.h
deleted file mode 100644
index 57636d1f12f..00000000000
--- a/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.h
+++ /dev/null
@@ -1,940 +0,0 @@
-/*
- ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/*
- * This file has been automatically generated using ChibiStudio board
- * generator plugin. Do not edit manually.
- */
-
-#ifndef BOARD_H
-#define BOARD_H
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*
- * Setup for ST STM32F072B-Discovery board.
- */
-
-/*
- * Board identifier.
- */
-#define BOARD_ST_STM32F072B_DISCOVERY
-#define BOARD_NAME "ST STM32F072B-Discovery"
-
-/*
- * Board oscillators-related settings.
- * NOTE: HSE not fitted.
- */
-#if !defined(STM32_LSECLK)
-#define STM32_LSECLK 32768
-#endif
-
-#define STM32_LSEDRV (3U << 3U)
-
-#if !defined(STM32_HSECLK)
-#define STM32_HSECLK 0U
-#endif
-
-#define STM32_HSE_BYPASS
-
-/*
- * MCU type as defined in the ST header.
- */
-#define STM32F072xB
-
-/*
- * IO pins assignments.
- */
-#define GPIOA_BUTTON 0U
-#define GPIOA_PIN1 1U
-#define GPIOA_PIN2 2U
-#define GPIOA_PIN3 3U
-#define GPIOA_PIN4 4U
-#define GPIOA_PIN5 5U
-#define GPIOA_PIN6 6U
-#define GPIOA_PIN7 7U
-#define GPIOA_PIN8 8U
-#define GPIOA_PIN9 9U
-#define GPIOA_PIN10 10U
-#define GPIOA_USB_DM 11U
-#define GPIOA_USB_DP 12U
-#define GPIOA_SWDIO 13U
-#define GPIOA_SWCLK 14U
-#define GPIOA_PIN15 15U
-
-#define GPIOB_PIN0 0U
-#define GPIOB_PIN1 1U
-#define GPIOB_PIN2 2U
-#define GPIOB_PIN3 3U
-#define GPIOB_PIN4 4U
-#define GPIOB_PIN5 5U
-#define GPIOB_PIN6 6U
-#define GPIOB_PIN7 7U
-#define GPIOB_PIN8 8U
-#define GPIOB_PIN9 9U
-#define GPIOB_PIN10 10U
-#define GPIOB_PIN11 11U
-#define GPIOB_PIN12 12U
-#define GPIOB_SPI2_SCK 13U
-#define GPIOB_SPI2_MISO 14U
-#define GPIOB_SPI2_MOSI 15U
-
-#define GPIOC_MEMS_CS 0U
-#define GPIOC_PIN1 1U
-#define GPIOC_PIN2 2U
-#define GPIOC_PIN3 3U
-#define GPIOC_PIN4 4U
-#define GPIOC_PIN5 5U
-#define GPIOC_LED_RED 6U
-#define GPIOC_LED_BLUE 7U
-#define GPIOC_LED_ORANGE 8U
-#define GPIOC_LED_GREEN 9U
-#define GPIOC_PIN10 10U
-#define GPIOC_PIN11 11U
-#define GPIOC_PIN12 12U
-#define GPIOC_PIN13 13U
-#define GPIOC_OSC32_IN 14U
-#define GPIOC_OSC32_OUT 15U
-
-#define GPIOD_PIN0 0U
-#define GPIOD_PIN1 1U
-#define GPIOD_PIN2 2U
-#define GPIOD_PIN3 3U
-#define GPIOD_PIN4 4U
-#define GPIOD_PIN5 5U
-#define GPIOD_PIN6 6U
-#define GPIOD_PIN7 7U
-#define GPIOD_PIN8 8U
-#define GPIOD_PIN9 9U
-#define GPIOD_PIN10 10U
-#define GPIOD_PIN11 11U
-#define GPIOD_PIN12 12U
-#define GPIOD_PIN13 13U
-#define GPIOD_PIN14 14U
-#define GPIOD_PIN15 15U
-
-#define GPIOE_PIN0 0U
-#define GPIOE_PIN1 1U
-#define GPIOE_PIN2 2U
-#define GPIOE_PIN3 3U
-#define GPIOE_PIN4 4U
-#define GPIOE_PIN5 5U
-#define GPIOE_PIN6 6U
-#define GPIOE_PIN7 7U
-#define GPIOE_PIN8 8U
-#define GPIOE_PIN9 9U
-#define GPIOE_PIN10 10U
-#define GPIOE_PIN11 11U
-#define GPIOE_PIN12 12U
-#define GPIOE_PIN13 13U
-#define GPIOE_PIN14 14U
-#define GPIOE_PIN15 15U
-
-#define GPIOF_OSC_IN 0U
-#define GPIOF_OSC_OUT 1U
-#define GPIOF_PIN2 2U
-#define GPIOF_PIN3 3U
-#define GPIOF_PIN4 4U
-#define GPIOF_PIN5 5U
-#define GPIOF_PIN6 6U
-#define GPIOF_PIN7 7U
-#define GPIOF_PIN8 8U
-#define GPIOF_PIN9 9U
-#define GPIOF_PIN10 10U
-#define GPIOF_PIN11 11U
-#define GPIOF_PIN12 12U
-#define GPIOF_PIN13 13U
-#define GPIOF_PIN14 14U
-#define GPIOF_PIN15 15U
-
-/*
- * IO lines assignments.
- */
-#define LINE_BUTTON PAL_LINE(GPIOA, 0U)
-#define LINE_USB_DM PAL_LINE(GPIOA, 11U)
-#define LINE_USB_DP PAL_LINE(GPIOA, 12U)
-#define LINE_SWDIO PAL_LINE(GPIOA, 13U)
-#define LINE_SWCLK PAL_LINE(GPIOA, 14U)
-#define LINE_SPI2_SCK PAL_LINE(GPIOB, 13U)
-#define LINE_SPI2_MISO PAL_LINE(GPIOB, 14U)
-#define LINE_SPI2_MOSI PAL_LINE(GPIOB, 15U)
-#define LINE_MEMS_CS PAL_LINE(GPIOC, 0U)
-#define LINE_LED_RED PAL_LINE(GPIOC, 6U)
-#define LINE_LED_BLUE PAL_LINE(GPIOC, 7U)
-#define LINE_LED_ORANGE PAL_LINE(GPIOC, 8U)
-#define LINE_LED_GREEN PAL_LINE(GPIOC, 9U)
-#define LINE_OSC32_IN PAL_LINE(GPIOC, 14U)
-#define LINE_OSC32_OUT PAL_LINE(GPIOC, 15U)
-#define LINE_OSC_IN PAL_LINE(GPIOF, 0U)
-#define LINE_OSC_OUT PAL_LINE(GPIOF, 1U)
-
-/*===========================================================================*/
-/* Driver pre-compile time settings. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
-
-/*
- * I/O ports initial setup, this configuration is established soon after reset
- * in the initialization code.
- * Please refer to the STM32 Reference Manual for details.
- */
-#define PIN_MODE_INPUT(n) (0U << ((n) * 2U))
-#define PIN_MODE_OUTPUT(n) (1U << ((n) * 2U))
-#define PIN_MODE_ALTERNATE(n) (2U << ((n) * 2U))
-#define PIN_MODE_ANALOG(n) (3U << ((n) * 2U))
-#define PIN_ODR_LOW(n) (0U << (n))
-#define PIN_ODR_HIGH(n) (1U << (n))
-#define PIN_OTYPE_PUSHPULL(n) (0U << (n))
-#define PIN_OTYPE_OPENDRAIN(n) (1U << (n))
-#define PIN_OSPEED_VERYLOW(n) (0U << ((n) * 2U))
-#define PIN_OSPEED_LOW(n) (1U << ((n) * 2U))
-#define PIN_OSPEED_MEDIUM(n) (2U << ((n) * 2U))
-#define PIN_OSPEED_HIGH(n) (3U << ((n) * 2U))
-#define PIN_PUPDR_FLOATING(n) (0U << ((n) * 2U))
-#define PIN_PUPDR_PULLUP(n) (1U << ((n) * 2U))
-#define PIN_PUPDR_PULLDOWN(n) (2U << ((n) * 2U))
-#define PIN_AFIO_AF(n, v) ((v) << (((n) % 8U) * 4U))
-
-/*
- * GPIOA setup:
- *
- * PA0 - BUTTON (input floating).
- * PA1 - PIN1 (input pullup).
- * PA2 - PIN2 (input pullup).
- * PA3 - PIN3 (input pullup).
- * PA4 - PIN4 (input pullup).
- * PA5 - PIN5 (input pullup).
- * PA6 - PIN6 (input pullup).
- * PA7 - PIN7 (input pullup).
- * PA8 - PIN8 (input pullup).
- * PA9 - PIN9 (input pullup).
- * PA10 - PIN10 (input pullup).
- * PA11 - USB_DM (input floating).
- * PA12 - USB_DP (input floating).
- * PA13 - SWDIO (alternate 0).
- * PA14 - SWCLK (alternate 0).
- * PA15 - PIN15 (input pullup).
- */
-#define VAL_GPIOA_MODER (PIN_MODE_INPUT(GPIOA_BUTTON) | \
- PIN_MODE_INPUT(GPIOA_PIN1) | \
- PIN_MODE_INPUT(GPIOA_PIN2) | \
- PIN_MODE_INPUT(GPIOA_PIN3) | \
- PIN_MODE_INPUT(GPIOA_PIN4) | \
- PIN_MODE_INPUT(GPIOA_PIN5) | \
- PIN_MODE_INPUT(GPIOA_PIN6) | \
- PIN_MODE_INPUT(GPIOA_PIN7) | \
- PIN_MODE_INPUT(GPIOA_PIN8) | \
- PIN_MODE_INPUT(GPIOA_PIN9) | \
- PIN_MODE_INPUT(GPIOA_PIN10) | \
- PIN_MODE_INPUT(GPIOA_USB_DM) | \
- PIN_MODE_INPUT(GPIOA_USB_DP) | \
- PIN_MODE_ALTERNATE(GPIOA_SWDIO) | \
- PIN_MODE_ALTERNATE(GPIOA_SWCLK) | \
- PIN_MODE_INPUT(GPIOA_PIN15))
-#define VAL_GPIOA_OTYPER (PIN_OTYPE_PUSHPULL(GPIOA_BUTTON) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOA_USB_DM) | \
- PIN_OTYPE_PUSHPULL(GPIOA_USB_DP) | \
- PIN_OTYPE_PUSHPULL(GPIOA_SWDIO) | \
- PIN_OTYPE_PUSHPULL(GPIOA_SWCLK) | \
- PIN_OTYPE_PUSHPULL(GPIOA_PIN15))
-#define VAL_GPIOA_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOA_BUTTON) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOA_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOA_USB_DM) | \
- PIN_OSPEED_VERYLOW(GPIOA_USB_DP) | \
- PIN_OSPEED_HIGH(GPIOA_SWDIO) | \
- PIN_OSPEED_HIGH(GPIOA_SWCLK) | \
- PIN_OSPEED_HIGH(GPIOA_PIN15))
-#define VAL_GPIOA_PUPDR (PIN_PUPDR_FLOATING(GPIOA_BUTTON) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN10) | \
- PIN_PUPDR_FLOATING(GPIOA_USB_DM) | \
- PIN_PUPDR_FLOATING(GPIOA_USB_DP) | \
- PIN_PUPDR_PULLUP(GPIOA_SWDIO) | \
- PIN_PUPDR_PULLDOWN(GPIOA_SWCLK) | \
- PIN_PUPDR_PULLUP(GPIOA_PIN15))
-#define VAL_GPIOA_ODR (PIN_ODR_HIGH(GPIOA_BUTTON) | \
- PIN_ODR_HIGH(GPIOA_PIN1) | \
- PIN_ODR_HIGH(GPIOA_PIN2) | \
- PIN_ODR_HIGH(GPIOA_PIN3) | \
- PIN_ODR_HIGH(GPIOA_PIN4) | \
- PIN_ODR_HIGH(GPIOA_PIN5) | \
- PIN_ODR_HIGH(GPIOA_PIN6) | \
- PIN_ODR_HIGH(GPIOA_PIN7) | \
- PIN_ODR_HIGH(GPIOA_PIN8) | \
- PIN_ODR_HIGH(GPIOA_PIN9) | \
- PIN_ODR_HIGH(GPIOA_PIN10) | \
- PIN_ODR_HIGH(GPIOA_USB_DM) | \
- PIN_ODR_HIGH(GPIOA_USB_DP) | \
- PIN_ODR_HIGH(GPIOA_SWDIO) | \
- PIN_ODR_HIGH(GPIOA_SWCLK) | \
- PIN_ODR_HIGH(GPIOA_PIN15))
-#define VAL_GPIOA_AFRL (PIN_AFIO_AF(GPIOA_BUTTON, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN7, 0U))
-#define VAL_GPIOA_AFRH (PIN_AFIO_AF(GPIOA_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOA_USB_DM, 0U) | \
- PIN_AFIO_AF(GPIOA_USB_DP, 0U) | \
- PIN_AFIO_AF(GPIOA_SWDIO, 0U) | \
- PIN_AFIO_AF(GPIOA_SWCLK, 0U) | \
- PIN_AFIO_AF(GPIOA_PIN15, 0U))
-
-/*
- * GPIOB setup:
- *
- * PB0 - PIN0 (input pullup).
- * PB1 - PIN1 (input pullup).
- * PB2 - PIN2 (input pullup).
- * PB3 - PIN3 (input pullup).
- * PB4 - PIN4 (input pullup).
- * PB5 - PIN5 (input pullup).
- * PB6 - PIN6 (input pullup).
- * PB7 - PIN7 (input pullup).
- * PB8 - PIN8 (input pullup).
- * PB9 - PIN9 (input pullup).
- * PB10 - PIN10 (input pullup).
- * PB11 - PIN11 (input pullup).
- * PB12 - PIN12 (input pullup).
- * PB13 - SPI2_SCK (alternate 0).
- * PB14 - SPI2_MISO (alternate 0).
- * PB15 - SPI2_MOSI (alternate 0).
- */
-#define VAL_GPIOB_MODER (PIN_MODE_INPUT(GPIOB_PIN0) | \
- PIN_MODE_INPUT(GPIOB_PIN1) | \
- PIN_MODE_INPUT(GPIOB_PIN2) | \
- PIN_MODE_INPUT(GPIOB_PIN3) | \
- PIN_MODE_INPUT(GPIOB_PIN4) | \
- PIN_MODE_INPUT(GPIOB_PIN5) | \
- PIN_MODE_INPUT(GPIOB_PIN6) | \
- PIN_MODE_INPUT(GPIOB_PIN7) | \
- PIN_MODE_INPUT(GPIOB_PIN8) | \
- PIN_MODE_INPUT(GPIOB_PIN9) | \
- PIN_MODE_INPUT(GPIOB_PIN10) | \
- PIN_MODE_INPUT(GPIOB_PIN11) | \
- PIN_MODE_INPUT(GPIOB_PIN12) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_SCK) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_MISO) | \
- PIN_MODE_ALTERNATE(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_OTYPER (PIN_OTYPE_PUSHPULL(GPIOB_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOB_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_SCK) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MISO) | \
- PIN_OTYPE_PUSHPULL(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOB_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN1) | \
- PIN_OSPEED_HIGH(GPIOB_PIN2) | \
- PIN_OSPEED_HIGH(GPIOB_PIN3) | \
- PIN_OSPEED_HIGH(GPIOB_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOB_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_SCK) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_MISO) | \
- PIN_OSPEED_VERYLOW(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_PUPDR (PIN_PUPDR_PULLUP(GPIOB_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOB_PIN12) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_SCK) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_MISO) | \
- PIN_PUPDR_FLOATING(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_ODR (PIN_ODR_HIGH(GPIOB_PIN0) | \
- PIN_ODR_HIGH(GPIOB_PIN1) | \
- PIN_ODR_HIGH(GPIOB_PIN2) | \
- PIN_ODR_HIGH(GPIOB_PIN3) | \
- PIN_ODR_HIGH(GPIOB_PIN4) | \
- PIN_ODR_HIGH(GPIOB_PIN5) | \
- PIN_ODR_HIGH(GPIOB_PIN6) | \
- PIN_ODR_HIGH(GPIOB_PIN7) | \
- PIN_ODR_HIGH(GPIOB_PIN8) | \
- PIN_ODR_HIGH(GPIOB_PIN9) | \
- PIN_ODR_HIGH(GPIOB_PIN10) | \
- PIN_ODR_HIGH(GPIOB_PIN11) | \
- PIN_ODR_HIGH(GPIOB_PIN12) | \
- PIN_ODR_HIGH(GPIOB_SPI2_SCK) | \
- PIN_ODR_HIGH(GPIOB_SPI2_MISO) | \
- PIN_ODR_HIGH(GPIOB_SPI2_MOSI))
-#define VAL_GPIOB_AFRL (PIN_AFIO_AF(GPIOB_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN7, 0U))
-#define VAL_GPIOB_AFRH (PIN_AFIO_AF(GPIOB_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOB_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_SCK, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_MISO, 0U) | \
- PIN_AFIO_AF(GPIOB_SPI2_MOSI, 0U))
-
-/*
- * GPIOC setup:
- *
- * PC0 - MEMS_CS (output pushpull maximum).
- * PC1 - PIN1 (input pullup).
- * PC2 - PIN2 (input pullup).
- * PC3 - PIN3 (input pullup).
- * PC4 - PIN4 (input pullup).
- * PC5 - PIN5 (input pullup).
- * PC6 - LED_RED (output pushpull maximum).
- * PC7 - LED_BLUE (output pushpull maximum).
- * PC8 - LED_ORANGE (output pushpull maximum).
- * PC9 - LED_GREEN (output pushpull maximum).
- * PC10 - PIN10 (input pullup).
- * PC11 - PIN11 (input pullup).
- * PC12 - PIN12 (input pullup).
- * PC13 - PIN13 (input pullup).
- * PC14 - OSC32_IN (input floating).
- * PC15 - OSC32_OUT (input floating).
- */
-#define VAL_GPIOC_MODER (PIN_MODE_OUTPUT(GPIOC_MEMS_CS) | \
- PIN_MODE_INPUT(GPIOC_PIN1) | \
- PIN_MODE_INPUT(GPIOC_PIN2) | \
- PIN_MODE_INPUT(GPIOC_PIN3) | \
- PIN_MODE_INPUT(GPIOC_PIN4) | \
- PIN_MODE_INPUT(GPIOC_PIN5) | \
- PIN_MODE_OUTPUT(GPIOC_LED_RED) | \
- PIN_MODE_OUTPUT(GPIOC_LED_BLUE) | \
- PIN_MODE_OUTPUT(GPIOC_LED_ORANGE) | \
- PIN_MODE_OUTPUT(GPIOC_LED_GREEN) | \
- PIN_MODE_INPUT(GPIOC_PIN10) | \
- PIN_MODE_INPUT(GPIOC_PIN11) | \
- PIN_MODE_INPUT(GPIOC_PIN12) | \
- PIN_MODE_INPUT(GPIOC_PIN13) | \
- PIN_MODE_INPUT(GPIOC_OSC32_IN) | \
- PIN_MODE_INPUT(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_OTYPER (PIN_OTYPE_PUSHPULL(GPIOC_MEMS_CS) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_RED) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_BLUE) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_ORANGE) | \
- PIN_OTYPE_PUSHPULL(GPIOC_LED_GREEN) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOC_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOC_OSC32_IN) | \
- PIN_OTYPE_PUSHPULL(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_OSPEEDR (PIN_OSPEED_HIGH(GPIOC_MEMS_CS) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN5) | \
- PIN_OSPEED_HIGH(GPIOC_LED_RED) | \
- PIN_OSPEED_HIGH(GPIOC_LED_BLUE) | \
- PIN_OSPEED_HIGH(GPIOC_LED_ORANGE) | \
- PIN_OSPEED_HIGH(GPIOC_LED_GREEN) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOC_PIN13) | \
- PIN_OSPEED_HIGH(GPIOC_OSC32_IN) | \
- PIN_OSPEED_HIGH(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_PUPDR (PIN_PUPDR_FLOATING(GPIOC_MEMS_CS) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN5) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_RED) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_BLUE) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_ORANGE) | \
- PIN_PUPDR_FLOATING(GPIOC_LED_GREEN) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOC_PIN13) | \
- PIN_PUPDR_FLOATING(GPIOC_OSC32_IN) | \
- PIN_PUPDR_FLOATING(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_MEMS_CS) | \
- PIN_ODR_HIGH(GPIOC_PIN1) | \
- PIN_ODR_HIGH(GPIOC_PIN2) | \
- PIN_ODR_HIGH(GPIOC_PIN3) | \
- PIN_ODR_HIGH(GPIOC_PIN4) | \
- PIN_ODR_HIGH(GPIOC_PIN5) | \
- PIN_ODR_LOW(GPIOC_LED_RED) | \
- PIN_ODR_LOW(GPIOC_LED_BLUE) | \
- PIN_ODR_LOW(GPIOC_LED_ORANGE) | \
- PIN_ODR_LOW(GPIOC_LED_GREEN) | \
- PIN_ODR_HIGH(GPIOC_PIN10) | \
- PIN_ODR_HIGH(GPIOC_PIN11) | \
- PIN_ODR_HIGH(GPIOC_PIN12) | \
- PIN_ODR_HIGH(GPIOC_PIN13) | \
- PIN_ODR_HIGH(GPIOC_OSC32_IN) | \
- PIN_ODR_HIGH(GPIOC_OSC32_OUT))
-#define VAL_GPIOC_AFRL (PIN_AFIO_AF(GPIOC_MEMS_CS, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_RED, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_BLUE, 0U))
-#define VAL_GPIOC_AFRH (PIN_AFIO_AF(GPIOC_LED_ORANGE, 0U) | \
- PIN_AFIO_AF(GPIOC_LED_GREEN, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOC_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOC_OSC32_IN, 0U) | \
- PIN_AFIO_AF(GPIOC_OSC32_OUT, 0U))
-
-/*
- * GPIOD setup:
- *
- * PD0 - PIN0 (input pullup).
- * PD1 - PIN1 (input pullup).
- * PD2 - PIN2 (input pullup).
- * PD3 - PIN3 (input pullup).
- * PD4 - PIN4 (input pullup).
- * PD5 - PIN5 (input pullup).
- * PD6 - PIN6 (input pullup).
- * PD7 - PIN7 (input pullup).
- * PD8 - PIN8 (input pullup).
- * PD9 - PIN9 (input pullup).
- * PD10 - PIN10 (input pullup).
- * PD11 - PIN11 (input pullup).
- * PD12 - PIN12 (input pullup).
- * PD13 - PIN13 (input pullup).
- * PD14 - PIN14 (input pullup).
- * PD15 - PIN15 (input pullup).
- */
-#define VAL_GPIOD_MODER (PIN_MODE_INPUT(GPIOD_PIN0) | \
- PIN_MODE_INPUT(GPIOD_PIN1) | \
- PIN_MODE_INPUT(GPIOD_PIN2) | \
- PIN_MODE_INPUT(GPIOD_PIN3) | \
- PIN_MODE_INPUT(GPIOD_PIN4) | \
- PIN_MODE_INPUT(GPIOD_PIN5) | \
- PIN_MODE_INPUT(GPIOD_PIN6) | \
- PIN_MODE_INPUT(GPIOD_PIN7) | \
- PIN_MODE_INPUT(GPIOD_PIN8) | \
- PIN_MODE_INPUT(GPIOD_PIN9) | \
- PIN_MODE_INPUT(GPIOD_PIN10) | \
- PIN_MODE_INPUT(GPIOD_PIN11) | \
- PIN_MODE_INPUT(GPIOD_PIN12) | \
- PIN_MODE_INPUT(GPIOD_PIN13) | \
- PIN_MODE_INPUT(GPIOD_PIN14) | \
- PIN_MODE_INPUT(GPIOD_PIN15))
-#define VAL_GPIOD_OTYPER (PIN_OTYPE_PUSHPULL(GPIOD_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOD_PIN15))
-#define VAL_GPIOD_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOD_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOD_PIN15))
-#define VAL_GPIOD_PUPDR (PIN_PUPDR_PULLUP(GPIOD_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOD_PIN15))
-#define VAL_GPIOD_ODR (PIN_ODR_HIGH(GPIOD_PIN0) | \
- PIN_ODR_HIGH(GPIOD_PIN1) | \
- PIN_ODR_HIGH(GPIOD_PIN2) | \
- PIN_ODR_HIGH(GPIOD_PIN3) | \
- PIN_ODR_HIGH(GPIOD_PIN4) | \
- PIN_ODR_HIGH(GPIOD_PIN5) | \
- PIN_ODR_HIGH(GPIOD_PIN6) | \
- PIN_ODR_HIGH(GPIOD_PIN7) | \
- PIN_ODR_HIGH(GPIOD_PIN8) | \
- PIN_ODR_HIGH(GPIOD_PIN9) | \
- PIN_ODR_HIGH(GPIOD_PIN10) | \
- PIN_ODR_HIGH(GPIOD_PIN11) | \
- PIN_ODR_HIGH(GPIOD_PIN12) | \
- PIN_ODR_HIGH(GPIOD_PIN13) | \
- PIN_ODR_HIGH(GPIOD_PIN14) | \
- PIN_ODR_HIGH(GPIOD_PIN15))
-#define VAL_GPIOD_AFRL (PIN_AFIO_AF(GPIOD_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN7, 0U))
-#define VAL_GPIOD_AFRH (PIN_AFIO_AF(GPIOD_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOD_PIN15, 0U))
-
-/*
- * GPIOE setup:
- *
- * PE0 - PIN0 (input pullup).
- * PE1 - PIN1 (input pullup).
- * PE2 - PIN2 (input pullup).
- * PE3 - PIN3 (input pullup).
- * PE4 - PIN4 (input pullup).
- * PE5 - PIN5 (input pullup).
- * PE6 - PIN6 (input pullup).
- * PE7 - PIN7 (input pullup).
- * PE8 - PIN8 (input pullup).
- * PE9 - PIN9 (input pullup).
- * PE10 - PIN10 (input pullup).
- * PE11 - PIN11 (input pullup).
- * PE12 - PIN12 (input pullup).
- * PE13 - PIN13 (input pullup).
- * PE14 - PIN14 (input pullup).
- * PE15 - PIN15 (input pullup).
- */
-#define VAL_GPIOE_MODER (PIN_MODE_INPUT(GPIOE_PIN0) | \
- PIN_MODE_INPUT(GPIOE_PIN1) | \
- PIN_MODE_INPUT(GPIOE_PIN2) | \
- PIN_MODE_INPUT(GPIOE_PIN3) | \
- PIN_MODE_INPUT(GPIOE_PIN4) | \
- PIN_MODE_INPUT(GPIOE_PIN5) | \
- PIN_MODE_INPUT(GPIOE_PIN6) | \
- PIN_MODE_INPUT(GPIOE_PIN7) | \
- PIN_MODE_INPUT(GPIOE_PIN8) | \
- PIN_MODE_INPUT(GPIOE_PIN9) | \
- PIN_MODE_INPUT(GPIOE_PIN10) | \
- PIN_MODE_INPUT(GPIOE_PIN11) | \
- PIN_MODE_INPUT(GPIOE_PIN12) | \
- PIN_MODE_INPUT(GPIOE_PIN13) | \
- PIN_MODE_INPUT(GPIOE_PIN14) | \
- PIN_MODE_INPUT(GPIOE_PIN15))
-#define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOE_PIN15))
-#define VAL_GPIOE_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOE_PIN0) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN1) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOE_PIN15))
-#define VAL_GPIOE_PUPDR (PIN_PUPDR_PULLUP(GPIOE_PIN0) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN1) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOE_PIN15))
-#define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \
- PIN_ODR_HIGH(GPIOE_PIN1) | \
- PIN_ODR_HIGH(GPIOE_PIN2) | \
- PIN_ODR_HIGH(GPIOE_PIN3) | \
- PIN_ODR_HIGH(GPIOE_PIN4) | \
- PIN_ODR_HIGH(GPIOE_PIN5) | \
- PIN_ODR_HIGH(GPIOE_PIN6) | \
- PIN_ODR_HIGH(GPIOE_PIN7) | \
- PIN_ODR_HIGH(GPIOE_PIN8) | \
- PIN_ODR_HIGH(GPIOE_PIN9) | \
- PIN_ODR_HIGH(GPIOE_PIN10) | \
- PIN_ODR_HIGH(GPIOE_PIN11) | \
- PIN_ODR_HIGH(GPIOE_PIN12) | \
- PIN_ODR_HIGH(GPIOE_PIN13) | \
- PIN_ODR_HIGH(GPIOE_PIN14) | \
- PIN_ODR_HIGH(GPIOE_PIN15))
-#define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN1, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN7, 0U))
-#define VAL_GPIOE_AFRH (PIN_AFIO_AF(GPIOE_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOE_PIN15, 0U))
-
-/*
- * GPIOF setup:
- *
- * PF0 - OSC_IN (input floating).
- * PF1 - OSC_OUT (input floating).
- * PF2 - PIN2 (input pullup).
- * PF3 - PIN3 (input pullup).
- * PF4 - PIN4 (input pullup).
- * PF5 - PIN5 (input pullup).
- * PF6 - PIN6 (input pullup).
- * PF7 - PIN7 (input pullup).
- * PF8 - PIN8 (input pullup).
- * PF9 - PIN9 (input pullup).
- * PF10 - PIN10 (input pullup).
- * PF11 - PIN11 (input pullup).
- * PF12 - PIN12 (input pullup).
- * PF13 - PIN13 (input pullup).
- * PF14 - PIN14 (input pullup).
- * PF15 - PIN15 (input pullup).
- */
-#define VAL_GPIOF_MODER (PIN_MODE_INPUT(GPIOF_OSC_IN) | \
- PIN_MODE_INPUT(GPIOF_OSC_OUT) | \
- PIN_MODE_INPUT(GPIOF_PIN2) | \
- PIN_MODE_INPUT(GPIOF_PIN3) | \
- PIN_MODE_INPUT(GPIOF_PIN4) | \
- PIN_MODE_INPUT(GPIOF_PIN5) | \
- PIN_MODE_INPUT(GPIOF_PIN6) | \
- PIN_MODE_INPUT(GPIOF_PIN7) | \
- PIN_MODE_INPUT(GPIOF_PIN8) | \
- PIN_MODE_INPUT(GPIOF_PIN9) | \
- PIN_MODE_INPUT(GPIOF_PIN10) | \
- PIN_MODE_INPUT(GPIOF_PIN11) | \
- PIN_MODE_INPUT(GPIOF_PIN12) | \
- PIN_MODE_INPUT(GPIOF_PIN13) | \
- PIN_MODE_INPUT(GPIOF_PIN14) | \
- PIN_MODE_INPUT(GPIOF_PIN15))
-#define VAL_GPIOF_OTYPER (PIN_OTYPE_PUSHPULL(GPIOF_OSC_IN) | \
- PIN_OTYPE_PUSHPULL(GPIOF_OSC_OUT) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN2) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN3) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN4) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN5) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN6) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN7) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN8) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN9) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN10) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN11) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN12) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN13) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN14) | \
- PIN_OTYPE_PUSHPULL(GPIOF_PIN15))
-#define VAL_GPIOF_OSPEEDR (PIN_OSPEED_VERYLOW(GPIOF_OSC_IN) | \
- PIN_OSPEED_VERYLOW(GPIOF_OSC_OUT) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN2) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN3) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN4) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN5) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN6) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN7) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN8) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN9) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN10) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN11) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN12) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN13) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN14) | \
- PIN_OSPEED_VERYLOW(GPIOF_PIN15))
-#define VAL_GPIOF_PUPDR (PIN_PUPDR_FLOATING(GPIOF_OSC_IN) | \
- PIN_PUPDR_FLOATING(GPIOF_OSC_OUT) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN2) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN3) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN4) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN5) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN6) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN7) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN8) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN9) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN10) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN11) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN12) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN13) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN14) | \
- PIN_PUPDR_PULLUP(GPIOF_PIN15))
-#define VAL_GPIOF_ODR (PIN_ODR_HIGH(GPIOF_OSC_IN) | \
- PIN_ODR_HIGH(GPIOF_OSC_OUT) | \
- PIN_ODR_HIGH(GPIOF_PIN2) | \
- PIN_ODR_HIGH(GPIOF_PIN3) | \
- PIN_ODR_HIGH(GPIOF_PIN4) | \
- PIN_ODR_HIGH(GPIOF_PIN5) | \
- PIN_ODR_HIGH(GPIOF_PIN6) | \
- PIN_ODR_HIGH(GPIOF_PIN7) | \
- PIN_ODR_HIGH(GPIOF_PIN8) | \
- PIN_ODR_HIGH(GPIOF_PIN9) | \
- PIN_ODR_HIGH(GPIOF_PIN10) | \
- PIN_ODR_HIGH(GPIOF_PIN11) | \
- PIN_ODR_HIGH(GPIOF_PIN12) | \
- PIN_ODR_HIGH(GPIOF_PIN13) | \
- PIN_ODR_HIGH(GPIOF_PIN14) | \
- PIN_ODR_HIGH(GPIOF_PIN15))
-#define VAL_GPIOF_AFRL (PIN_AFIO_AF(GPIOF_OSC_IN, 0U) | \
- PIN_AFIO_AF(GPIOF_OSC_OUT, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN2, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN3, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN4, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN5, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN6, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN7, 0U))
-#define VAL_GPIOF_AFRH (PIN_AFIO_AF(GPIOF_PIN8, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN9, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN10, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN11, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN12, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN13, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN14, 0U) | \
- PIN_AFIO_AF(GPIOF_PIN15, 0U))
-
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
-
-#if !defined(_FROM_ASM_)
-#ifdef __cplusplus
-extern "C" {
-#endif
- void boardInit(void);
-#ifdef __cplusplus
-}
-#endif
-#endif /* _FROM_ASM_ */
-
-#endif /* BOARD_H */
diff --git a/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.mk b/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.mk
deleted file mode 100644
index b98dcdd26c6..00000000000
--- a/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/board.mk
+++ /dev/null
@@ -1,5 +0,0 @@
-# List of all the board related files.
-BOARDSRC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY/board.c
-
-# Required include directories
-BOARDINC = $(BOARD_PATH)/boards/ST_STM32F072B_DISCOVERY
diff --git a/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg b/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg
deleted file mode 100644
index 9c7cf4fd76a..00000000000
--- a/keyboards/projectkb/alice/boards/ST_STM32F072B_DISCOVERY/cfg/board.chcfg
+++ /dev/null
@@ -1,703 +0,0 @@
-
-
-
-
- resources/gencfg/processors/boards/stm32f0xx/templates
- ..
- 3.0.x
-
- ST STM32F072B-Discovery
- ST_STM32F072B_DISCOVERY
-
- STM32F072xB
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/keyboards/projectkb/alice/bootloader_defs.h b/keyboards/projectkb/alice/bootloader_defs.h
deleted file mode 100644
index 02c48c4e6dc..00000000000
--- a/keyboards/projectkb/alice/bootloader_defs.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Address for jumping to bootloader on STM32 chips. */
-/* It is chip dependent, the correct number can be looked up here (page 175):
- * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
- * This also requires a patch to chibios:
- * /tmk_core/tool/chibios/ch-bootloader-jump.patch
- */
-#define STM32_BOOTLOADER_ADDRESS 0x1FFFC800
diff --git a/keyboards/projectkb/alice/chconf.h b/keyboards/projectkb/alice/chconf.h
index 4640ff5332b..03f63da36a8 100644
--- a/keyboards/projectkb/alice/chconf.h
+++ b/keyboards/projectkb/alice/chconf.h
@@ -331,7 +331,7 @@
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE FALSE
+#define CH_CFG_USE_MEMCORE TRUE
#endif
/**
diff --git a/keyboards/projectkb/alice/config.h b/keyboards/projectkb/alice/config.h
deleted file mode 100644
index ed54af23945..00000000000
--- a/keyboards/projectkb/alice/config.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
-Copyright 2015 Jun Wako
-
-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 .
-*/
-
-#pragma once
-
-/* USB Device descriptor parameter */
-#define VENDOR_ID 0x0159
-#define PRODUCT_ID 0xA71C
-#define DEVICE_VER 0x0001
-#define MANUFACTURER ProjectKB
-#define PRODUCT Alice
-#define DESCRIPTION ProjectKB Alice
-
-/* key matrix size */
-#define MATRIX_ROWS 5
-#define MATRIX_COLS 16
-
-#define MATRIX_COL_PINS { B2, B10, B11, A9, A15, B3, B4, B5, B6, B7, B8, B9, C13, C14, C15, B12 }
-#define MATRIX_ROW_PINS { B1, B0, A7, A5, A4 }
-#define DIODE_DIRECTION COL2ROW
-
-#define BACKLIGHT_LEVELS 6
-#define BACKLIGHT_BREATHING
-#define BREATHING_PERIOD 6
-
-/* define if matrix has ghost */
-//#define MATRIX_HAS_GHOST
-
-/* Set 0 if debouncing isn't needed */
-#define DEBOUNCE 5
-
-/* 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
-
-#define RGBLIGHT_ANIMATIONS
-
-#define WS2812_LED_N 14
-#define RGBLED_NUM WS2812_LED_N
-#define PORT_WS2812 GPIOB
-#define PIN_WS2812 15
-#define WS2812_SPI SPID2
-
-// Backlight config starts after VIA's EEPROM usage,
-// dynamic keymaps start after this.
-#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 1
-
-// VIA lighting is handled by the keyboard-level code
-#define VIA_CUSTOM_LIGHTING_ENABLE
-
-// Let VIA handle the QMK RGBLIGHT
-#define VIA_QMK_RGBLIGHT_ENABLE
-
-/*
- * 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
-//#define NO_ACTION_MACRO
-//#define NO_ACTION_FUNCTION
diff --git a/keyboards/projectkb/alice/keymaps/keithlo/keymap.c b/keyboards/projectkb/alice/keymaps/keithlo/keymap.c
new file mode 100644
index 00000000000..c6801308aaf
--- /dev/null
+++ b/keyboards/projectkb/alice/keymaps/keithlo/keymap.c
@@ -0,0 +1,43 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+#define _BASE 0
+#define _FN1 1
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT_default(
+ KC_ESC, KC_TILD, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_DEL,
+ KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
+ KC_PGDN, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RGUI,
+ KC_LCTL, KC_LCMD, KC_SPC, MO(_FN1), KC_RCMD, KC_RALT, KC_RCTL
+ ),
+
+ [_FN1] = LAYOUT_default(
+ RGB_TOG, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_VOLD, KC_VOLU, _______, KC_MUTE,
+ RGB_MOD, _______, _______, KC_UP, _______, _______, _______, RGB_SAI, RGB_HUI, RGB_VAI, _______, KC_F11, KC_F12, _______, _______,
+ RGB_RMOD, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, KC_LEFT, KC_DOWN, KC_UP , KC_RIGHT, _______, _______, _______,
+ _______, BL_INC, BL_DEC, BL_TOGG, BL_BRTG, _______, RGB_SAD, RGB_HUD, RGB_VAD, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, RESET
+ )
+};
diff --git a/keyboards/projectkb/alice/keymaps/stanrc85/keymap.c b/keyboards/projectkb/alice/keymaps/stanrc85/keymap.c
new file mode 100644
index 00000000000..667ffe4f696
--- /dev/null
+++ b/keyboards/projectkb/alice/keymaps/stanrc85/keymap.c
@@ -0,0 +1,58 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+#include "stanrc85.h"
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT_default(
+ KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, _______, KC_BSPC,
+ KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_PGDN, KC_CTLE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN2_60),
+ KC_LCTL, KC_LALT, LT_BPCF, KC_LGUI, LT_SPCF, TD_TWIN, TD_TCTL
+ ),
+
+ [_DEFAULT] = LAYOUT_default(
+ KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, _______, KC_BSPC,
+ KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_PGDN, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(_FN2_60),
+ KC_LCTL, KC_LALT, KC_SPC, MO(_FN1_60), KC_SPC, KC_RALT, KC_RCTL
+ ),
+
+ [_FN1_60] = LAYOUT_default(
+ _______, KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, KC_DEL,
+ _______, _______, _______, CA_QUOT, KC_VOLU, CA_SCLN, _______, _______, KC_HOME, KC_UP, KC_END, KC_PSCR, _______, _______, KC_INS,
+ _______, KC_CAPS, _______, KC_MUTE, KC_VOLD, KC_MPLY, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______,
+ _______, KC_RDP, _______, _______, _______, _______, _______, _______, KC_WBAK, KC_WFWD, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [_FN2_60] = LAYOUT_default(
+ BL_TOGG, RGB_TOG, RGB_MOD, RGB_VAD, RGB_VAI, RGB_SAI, RGB_HUD, RGB_HUI, _______, _______, _______, _______, _______, _______, _______, _______,
+ BL_INC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET,
+ BL_DEC, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MAKE,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, TG(_DEFAULT)
+ )
+};
diff --git a/keyboards/projectkb/alice/keymaps/via/keymap.c b/keyboards/projectkb/alice/keymaps/via/keymap.c
new file mode 100644
index 00000000000..ff084d1fce9
--- /dev/null
+++ b/keyboards/projectkb/alice/keymaps/via/keymap.c
@@ -0,0 +1,56 @@
+/*
+Copyright 2020 Ryan Castillo
+
+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 .
+*/
+#include QMK_KEYBOARD_H
+
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_default(
+ KC_ESC, KC_TILD, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_DEL, KC_BSPC,
+ KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_PGDN, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RGUI,
+ KC_LCTL, KC_LALT, KC_SPC, MO(1), KC_SPC, KC_RALT, KC_RCTL
+ ),
+ [1] = LAYOUT_default(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [2] = LAYOUT_default(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [3] = LAYOUT_default(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+
+};
diff --git a/keyboards/projectkb/alice/keymaps/via/rules.mk b/keyboards/projectkb/alice/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/projectkb/alice/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/projectkb/alice/readme.md b/keyboards/projectkb/alice/readme.md
index 583ddf59203..193343b315c 100644
--- a/keyboards/projectkb/alice/readme.md
+++ b/keyboards/projectkb/alice/readme.md
@@ -7,7 +7,7 @@ Keyboard Maintainer: onefiftynine
Hardware Supported: STM32F072CBT6
Make example for this keyboard (after setting up your build environment):
- make projectkb/alice:default
+ make projectkb/alice/rev2:default
If you are flashing this keyboard/pcb for the first time:
diff --git a/keyboards/projectkb/alice/rev1/config.h b/keyboards/projectkb/alice/rev1/config.h
new file mode 100644
index 00000000000..549af292885
--- /dev/null
+++ b/keyboards/projectkb/alice/rev1/config.h
@@ -0,0 +1,84 @@
+/*
+Copyright 2015 Jun Wako
+
+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 .
+*/
+
+#pragma once
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x0159
+#define PRODUCT_ID 0xA71C
+#define DEVICE_VER 0x0001
+#define MANUFACTURER ProjectKB
+#define PRODUCT Alice
+#define DESCRIPTION ProjectKB Alice
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 16
+
+#define MATRIX_COL_PINS { B2, B10, B11, A9, A15, B3, B4, B5, B6, B7, B8, B9, C13, C14, C15, B12 }
+#define MATRIX_ROW_PINS { B1, B0, A7, A5, A4 }
+#define DIODE_DIRECTION COL2ROW
+
+#define BACKLIGHT_PIN A6
+#define BACKLIGHT_PWM_DRIVER PWMD3
+#define BACKLIGHT_PWM_CHANNEL 1
+#define BACKLIGHT_PAL_MODE 1
+#define BACKLIGHT_LEVELS 6
+#define BACKLIGHT_BREATHING
+#define BREATHING_PERIOD 6
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+#define RGBLIGHT_ANIMATIONS
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 14
+#define WS2812_SPI SPID2
+#define WS2812_SPI_MOSI_PAL_MODE 0
+
+#define INDICATOR_PIN_0 A0
+#define INDICATOR_PIN_1 A1
+#define INDICATOR_PIN_2 A2
+
+// 2 bits for 4 layout options
+#define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 2
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
diff --git a/keyboards/projectkb/alice/rev1/rules.mk b/keyboards/projectkb/alice/rev1/rules.mk
new file mode 100644
index 00000000000..258444db455
--- /dev/null
+++ b/keyboards/projectkb/alice/rev1/rules.mk
@@ -0,0 +1,27 @@
+# MCU name
+MCU = STM32F072
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+WS2812_DRIVER = spi
+
+
+# Enter lower-power sleep mode when on the ChibiOS idle thread
+OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
diff --git a/keyboards/projectkb/alice/rev2/config.h b/keyboards/projectkb/alice/rev2/config.h
new file mode 100644
index 00000000000..eb333202638
--- /dev/null
+++ b/keyboards/projectkb/alice/rev2/config.h
@@ -0,0 +1,85 @@
+/*
+Copyright 2015 Jun Wako
+
+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 .
+*/
+
+#pragma once
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x0159
+#define PRODUCT_ID 0xA71C
+#define DEVICE_VER 0x0001
+#define MANUFACTURER ProjectKB
+#define PRODUCT Alice
+#define DESCRIPTION ProjectKB Alice
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 16
+
+#define MATRIX_COL_PINS { B1, B0, A7, A1, A5, A4, A3, A10, B9, B8, B7, B6, B5, B4, B3, A15 }
+#define MATRIX_ROW_PINS { B2, B10, B11, A2, A0 }
+#define DIODE_DIRECTION COL2ROW
+
+#define BACKLIGHT_PIN A6
+#define BACKLIGHT_PWM_DRIVER PWMD3
+#define BACKLIGHT_PWM_CHANNEL 1
+#define BACKLIGHT_PAL_MODE 1
+#define BACKLIGHT_LEVELS 6
+#define BACKLIGHT_BREATHING
+#define BREATHING_PERIOD 6
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+#define RGBLIGHT_ANIMATIONS
+#define RGB_DI_PIN B15
+#define RGBLED_NUM 14
+#define WS2812_SPI SPID2
+#define WS2812_SPI_MOSI_PAL_MODE 0
+
+#define INDICATOR_PIN_0 A9
+#define INDICATOR_PIN_1 A8
+#define INDICATOR_PIN_2 B12
+
+
+// 2 bits for 4 layout options
+#define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 2
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
diff --git a/keyboards/projectkb/alice/rev2/rules.mk b/keyboards/projectkb/alice/rev2/rules.mk
new file mode 100644
index 00000000000..258444db455
--- /dev/null
+++ b/keyboards/projectkb/alice/rev2/rules.mk
@@ -0,0 +1,27 @@
+# MCU name
+MCU = STM32F072
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+WS2812_DRIVER = spi
+
+
+# Enter lower-power sleep mode when on the ChibiOS idle thread
+OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
diff --git a/keyboards/projectkb/alice/rules.mk b/keyboards/projectkb/alice/rules.mk
index 503bc7ad706..d6725769928 100644
--- a/keyboards/projectkb/alice/rules.mk
+++ b/keyboards/projectkb/alice/rules.mk
@@ -1,30 +1 @@
-# MCU name
-MCU = STM32F072
-BOARD = ST_STM32F072B_DISCOVERY
-
-# Build Options
-# comment out to disable the options.
-#
-
-# project specific files
-VPATH += keyboards/cannonkeys/stm32f072
-SRC = keyboard.c \
- led.c
-
-BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
-NKRO_ENABLE = yes # USB Nkey Rollover
-CUSTOM_MATRIX = no # Custom matrix file
-# BACKLIGHT_ENABLE = yes # This is broken on 072 for some reason
-RGBLIGHT_ENABLE = yes
-
-# RAW_ENABLE = yes
-# DYNAMIC_KEYMAP_ENABLE = yes
-
-
-# Enter lower-power sleep mode when on the ChibiOS idle thread
-OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
+DEFAULT_FOLDER = projectkb/alice/rev1
diff --git a/keyboards/quad_h/lb75/config.h b/keyboards/quad_h/lb75/config.h
new file mode 100644
index 00000000000..1c23ed5b362
--- /dev/null
+++ b/keyboards/quad_h/lb75/config.h
@@ -0,0 +1,196 @@
+/*
+Copyright 2019 Ryota Goto
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xA103
+#define PRODUCT_ID 0x0007
+#define DEVICE_VER 0x0001
+#define MANUFACTURER QUADH
+#define PRODUCT LB75
+#define DESCRIPTION Custom 75% keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 12
+#define MATRIX_COLS 8
+
+/*
+ * 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 { D4, D6, D7, B4, B5, B6, C6, C7, D3, D5, F0, E6 }
+#define MATRIX_COL_PINS { D2, D1, D0, F1, F4, F5, F6, F7 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+#define BACKLIGHT_PIN B7
+// #define BACKLIGHT_BREATHING
+#define BACKLIGHT_LEVELS 5
+
+#define RGB_DI_PIN B0
+#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 220 /* 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
+
+/* number of backlight levels */
+
+/* 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 userful 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
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+/* defined by default; to change, uncomment and set to the combination you want */
+// #define IS_COMMAND() (get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP H
+//#define MAGIC_KEY_HELP_ALT SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER0_ALT GRAVE
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER B
+//#define MAGIC_KEY_BOOTLOADER_ALT ESC
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_EEPROM_CLEAR BSPACE
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+/* Bootmagic Lite key configuration */
+// #define BOOTMAGIC_LITE_ROW 0
+// #define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/quad_h/lb75/info.json b/keyboards/quad_h/lb75/info.json
new file mode 100644
index 00000000000..b1eebad3805
--- /dev/null
+++ b/keyboards/quad_h/lb75/info.json
@@ -0,0 +1,187 @@
+{
+ "keyboard_name": "LB75",
+ "url": "",
+ "maintainer": "ai03",
+ "width": 16,
+ "height": 6,
+ "layouts": {
+ "LAYOUT_continuous_fnrow": {
+ "layout": [
+ {"label":"Esc", "x":0, "y":0},
+ {"label":"F1", "x":1, "y":0},
+ {"label":"F2", "x":2, "y":0},
+ {"label":"F3", "x":3, "y":0},
+ {"label":"F4", "x":4, "y":0},
+ {"label":"F5", "x":5, "y":0},
+ {"label":"F6", "x":6, "y":0},
+ {"label":"F7", "x":7, "y":0},
+ {"label":"F8", "x":8, "y":0},
+ {"label":"F9", "x":9, "y":0},
+ {"label":"F10", "x":10, "y":0},
+ {"label":"F11", "x":11, "y":0},
+ {"label":"F12", "x":12, "y":0},
+ {"label":"Print Screen", "x":13, "y":0},
+ {"label":"Scroll Lock", "x":14, "y":0},
+ {"label":"Pause", "x":15, "y":0},
+ {"label":"~", "x":0, "y":1},
+ {"label":"!", "x":1, "y":1},
+ {"label":"@", "x":2, "y":1},
+ {"label":"#", "x":3, "y":1},
+ {"label":"$", "x":4, "y":1},
+ {"label":"%", "x":5, "y":1},
+ {"label":"^", "x":6, "y":1},
+ {"label":"&", "x":7, "y":1},
+ {"label":"*", "x":8, "y":1},
+ {"label":"(", "x":9, "y":1},
+ {"label":")", "x":10, "y":1},
+ {"label":"_", "x":11, "y":1},
+ {"label":"+", "x":12, "y":1},
+ {"label":"Back Space", "x":13, "y":1},
+ {"label":"Delete", "x":14, "y":1},
+ {"label":"Home", "x":15, "y":1},
+ {"label":"Tab", "x":0, "y":2, "w":1.5},
+ {"label":"Q", "x":1.5, "y":2},
+ {"label":"W", "x":2.5, "y":2},
+ {"label":"E", "x":3.5, "y":2},
+ {"label":"R", "x":4.5, "y":2},
+ {"label":"T", "x":5.5, "y":2},
+ {"label":"Y", "x":6.5, "y":2},
+ {"label":"U", "x":7.5, "y":2},
+ {"label":"I", "x":8.5, "y":2},
+ {"label":"O", "x":9.5, "y":2},
+ {"label":"P", "x":10.5, "y":2},
+ {"label":"{", "x":11.5, "y":2},
+ {"label":"}", "x":12.5, "y":2},
+ {"label":"|", "x":13.5, "y":2, "w":1.5},
+ {"label":"End", "x":15, "y":2},
+ {"label":"Caps Lock", "x":0, "y":3, "w":1.75},
+ {"label":"A", "x":1.75, "y":3},
+ {"label":"S", "x":2.75, "y":3},
+ {"label":"D", "x":3.75, "y":3},
+ {"label":"F", "x":4.75, "y":3},
+ {"label":"G", "x":5.75, "y":3},
+ {"label":"H", "x":6.75, "y":3},
+ {"label":"J", "x":7.75, "y":3},
+ {"label":"K", "x":8.75, "y":3},
+ {"label":"L", "x":9.75, "y":3},
+ {"label":":", "x":10.75, "y":3},
+ {"label":"\"", "x":11.75, "y":3},
+ {"label":"Enter", "x":12.75, "y":3, "w":2.25},
+ {"label":"PgUp", "x":15, "y":3},
+ {"label":"Shift", "x":0, "y":4, "w":1.25},
+ {"label":"|", "x":1.25, "y":4},
+ {"label":"Z", "x":2.25, "y":4},
+ {"label":"X", "x":3.25, "y":4},
+ {"label":"C", "x":4.25, "y":4},
+ {"label":"V", "x":5.25, "y":4},
+ {"label":"B", "x":6.25, "y":4},
+ {"label":"N", "x":7.25, "y":4},
+ {"label":"M", "x":8.25, "y":4},
+ {"label":"<", "x":9.25, "y":4},
+ {"label":">", "x":10.25, "y":4},
+ {"label":"?", "x":11.25, "y":4},
+ {"label":"Shift", "x":12.25, "y":4, "w":1.75},
+ {"label":"↑", "x":14, "y":4},
+ {"label":"PgDn", "x":15, "y":4},
+ {"label":"Ctrl", "x":0, "y":5, "w":1.25},
+ {"label":"Win", "x":1.25, "y":5, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":5, "w":1.25},
+ {"x":3.75, "y":5, "w":6.25},
+ {"label":"Alt", "x":10, "y":5},
+ {"label":"Win", "x":11, "y":5},
+ {"label":"Ctrl", "x":12, "y":5},
+ {"label":"←", "x":13, "y":5},
+ {"label":"↓", "x":14, "y":5},
+ {"label":"→", "x":15, "y":5}
+ ]
+ },
+ "LAYOUT_divided_fnrow": {
+ "layout": [
+ {"label":"Esc", "x":0, "y":0},
+ {"label":"F1", "x":1.5, "y":0},
+ {"label":"F2", "x":2.5, "y":0},
+ {"label":"F3", "x":3.5, "y":0},
+ {"label":"F4", "x":4.5, "y":0},
+ {"label":"F5", "x":6, "y":0},
+ {"label":"F6", "x":7, "y":0},
+ {"label":"F7", "x":8, "y":0},
+ {"label":"F8", "x":9, "y":0},
+ {"label":"F9", "x":10.5, "y":0},
+ {"label":"F10", "x":11.5, "y":0},
+ {"label":"F11", "x":12.5, "y":0},
+ {"label":"F12", "x":13.5, "y":0},
+ {"label":"Print Screen", "x":15, "y":0},
+ {"label":"~", "x":0, "y":1},
+ {"label":"!", "x":1, "y":1},
+ {"label":"@", "x":2, "y":1},
+ {"label":"#", "x":3, "y":1},
+ {"label":"$", "x":4, "y":1},
+ {"label":"%", "x":5, "y":1},
+ {"label":"^", "x":6, "y":1},
+ {"label":"&", "x":7, "y":1},
+ {"label":"*", "x":8, "y":1},
+ {"label":"(", "x":9, "y":1},
+ {"label":")", "x":10, "y":1},
+ {"label":"_", "x":11, "y":1},
+ {"label":"+", "x":12, "y":1},
+ {"label":"Back Space", "x":13, "y":1},
+ {"label":"Delete", "x":14, "y":1},
+ {"label":"Home", "x":15, "y":1},
+ {"label":"Tab", "x":0, "y":2, "w":1.5},
+ {"label":"Q", "x":1.5, "y":2},
+ {"label":"W", "x":2.5, "y":2},
+ {"label":"E", "x":3.5, "y":2},
+ {"label":"R", "x":4.5, "y":2},
+ {"label":"T", "x":5.5, "y":2},
+ {"label":"Y", "x":6.5, "y":2},
+ {"label":"U", "x":7.5, "y":2},
+ {"label":"I", "x":8.5, "y":2},
+ {"label":"O", "x":9.5, "y":2},
+ {"label":"P", "x":10.5, "y":2},
+ {"label":"{", "x":11.5, "y":2},
+ {"label":"}", "x":12.5, "y":2},
+ {"label":"|", "x":13.5, "y":2, "w":1.5},
+ {"label":"End", "x":15, "y":2},
+ {"label":"Caps Lock", "x":0, "y":3, "w":1.75},
+ {"label":"A", "x":1.75, "y":3},
+ {"label":"S", "x":2.75, "y":3},
+ {"label":"D", "x":3.75, "y":3},
+ {"label":"F", "x":4.75, "y":3},
+ {"label":"G", "x":5.75, "y":3},
+ {"label":"H", "x":6.75, "y":3},
+ {"label":"J", "x":7.75, "y":3},
+ {"label":"K", "x":8.75, "y":3},
+ {"label":"L", "x":9.75, "y":3},
+ {"label":":", "x":10.75, "y":3},
+ {"label":"\"", "x":11.75, "y":3},
+ {"label":"Enter", "x":12.75, "y":3, "w":2.25},
+ {"label":"PgUp", "x":15, "y":3},
+ {"label":"Shift", "x":0, "y":4, "w":1.25},
+ {"label":"|", "x":1.25, "y":4},
+ {"label":"Z", "x":2.25, "y":4},
+ {"label":"X", "x":3.25, "y":4},
+ {"label":"C", "x":4.25, "y":4},
+ {"label":"V", "x":5.25, "y":4},
+ {"label":"B", "x":6.25, "y":4},
+ {"label":"N", "x":7.25, "y":4},
+ {"label":"M", "x":8.25, "y":4},
+ {"label":"<", "x":9.25, "y":4},
+ {"label":">", "x":10.25, "y":4},
+ {"label":"?", "x":11.25, "y":4},
+ {"label":"Shift", "x":12.25, "y":4, "w":1.75},
+ {"label":"↑", "x":14, "y":4},
+ {"label":"PgDn", "x":15, "y":4},
+ {"label":"Ctrl", "x":0, "y":5, "w":1.25},
+ {"label":"Win", "x":1.25, "y":5, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":5, "w":1.25},
+ {"x":3.75, "y":5, "w":6.25},
+ {"label":"Alt", "x":10, "y":5},
+ {"label":"Win", "x":11, "y":5},
+ {"label":"Ctrl", "x":12, "y":5},
+ {"label":"←", "x":13, "y":5},
+ {"label":"↓", "x":14, "y":5},
+ {"label":"→", "x":15, "y":5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/quad_h/lb75/keymaps/continuous_fnrow/keymap.c b/keyboards/quad_h/lb75/keymaps/continuous_fnrow/keymap.c
new file mode 100644
index 00000000000..817b3cbddb5
--- /dev/null
+++ b/keyboards/quad_h/lb75/keymaps/continuous_fnrow/keymap.c
@@ -0,0 +1,35 @@
+/* Copyright 2019 Ryota Goto
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_continuous_fnrow( /* Base */
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END,
+ MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_continuous_fnrow( /* Fn */
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_CAPS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, BL_TOGG, BL_STEP, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/quad_h/lb75/keymaps/continuous_fnrow/readme.md b/keyboards/quad_h/lb75/keymaps/continuous_fnrow/readme.md
new file mode 100644
index 00000000000..be0223d1a7f
--- /dev/null
+++ b/keyboards/quad_h/lb75/keymaps/continuous_fnrow/readme.md
@@ -0,0 +1,3 @@
+# The continuous fnrow keymap for LB75
+
+Non-blockered upper row
\ No newline at end of file
diff --git a/keyboards/quad_h/lb75/keymaps/default/keymap.c b/keyboards/quad_h/lb75/keymaps/default/keymap.c
new file mode 100644
index 00000000000..817b3cbddb5
--- /dev/null
+++ b/keyboards/quad_h/lb75/keymaps/default/keymap.c
@@ -0,0 +1,35 @@
+/* Copyright 2019 Ryota Goto
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_continuous_fnrow( /* Base */
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END,
+ MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_continuous_fnrow( /* Fn */
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_CAPS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, BL_TOGG, BL_STEP, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/quad_h/lb75/keymaps/default/readme.md b/keyboards/quad_h/lb75/keymaps/default/readme.md
new file mode 100644
index 00000000000..6d3bb42bcf5
--- /dev/null
+++ b/keyboards/quad_h/lb75/keymaps/default/readme.md
@@ -0,0 +1,3 @@
+# The default keymap for LB75
+
+Nothing special
\ No newline at end of file
diff --git a/keyboards/quad_h/lb75/keymaps/divided_fnrow/keymap.c b/keyboards/quad_h/lb75/keymaps/divided_fnrow/keymap.c
new file mode 100644
index 00000000000..5a3a58482db
--- /dev/null
+++ b/keyboards/quad_h/lb75/keymaps/divided_fnrow/keymap.c
@@ -0,0 +1,35 @@
+/* Copyright 2019 Ryota Goto
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_divided_fnrow( /* Base */
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END,
+ MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_divided_fnrow( /* Fn */
+ RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_CAPS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, BL_TOGG, BL_STEP, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/quad_h/lb75/keymaps/divided_fnrow/readme.md b/keyboards/quad_h/lb75/keymaps/divided_fnrow/readme.md
new file mode 100644
index 00000000000..0a2f0b5de8d
--- /dev/null
+++ b/keyboards/quad_h/lb75/keymaps/divided_fnrow/readme.md
@@ -0,0 +1,3 @@
+# The divided fnrow keymap for LB75
+
+Blockered upper row
\ No newline at end of file
diff --git a/keyboards/quad_h/lb75/keymaps/via/keymap.c b/keyboards/quad_h/lb75/keymaps/via/keymap.c
new file mode 100644
index 00000000000..9df605dbb6e
--- /dev/null
+++ b/keyboards/quad_h/lb75/keymaps/via/keymap.c
@@ -0,0 +1,51 @@
+/* Copyright 2019 Ryota Goto
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_continuous_fnrow( /* Base */
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END,
+ MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_continuous_fnrow( /* Fn */
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_CAPS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, BL_TOGG, BL_STEP, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+ [2] = LAYOUT_continuous_fnrow(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+ [3] = LAYOUT_continuous_fnrow(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/quad_h/lb75/keymaps/via/readme.md b/keyboards/quad_h/lb75/keymaps/via/readme.md
new file mode 100644
index 00000000000..943c015c189
--- /dev/null
+++ b/keyboards/quad_h/lb75/keymaps/via/readme.md
@@ -0,0 +1,3 @@
+# The via keymap for LB75
+
+For use with VIA configurator
\ No newline at end of file
diff --git a/keyboards/quad_h/lb75/keymaps/via/rules.mk b/keyboards/quad_h/lb75/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/quad_h/lb75/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/quad_h/lb75/lb75.c b/keyboards/quad_h/lb75/lb75.c
new file mode 100644
index 00000000000..a18f45adb84
--- /dev/null
+++ b/keyboards/quad_h/lb75/lb75.c
@@ -0,0 +1,39 @@
+/* Copyright 2019 Ryota Goto
+ *
+ * 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 .
+ */
+#include "lb75.h"
+
+
+void matrix_init_kb(void) {
+ // put your keyboard start-up code here
+ // runs once when the firmware starts up
+
+ setPinOutput(B1);
+ setPinOutput(B2);
+
+ matrix_init_user();
+}
+
+bool led_update_kb(led_t led_state) {
+ bool res = led_update_user(led_state);
+
+ if(res) {
+ writePin(B1, !led_state.caps_lock);
+ writePin(B2, !led_state.scroll_lock);
+ }
+
+ return res;
+}
+
diff --git a/keyboards/quad_h/lb75/lb75.h b/keyboards/quad_h/lb75/lb75.h
new file mode 100644
index 00000000000..697a5fbb21f
--- /dev/null
+++ b/keyboards/quad_h/lb75/lb75.h
@@ -0,0 +1,73 @@
+/* Copyright 2019 Ryota Goto
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "quantum.h"
+
+/* This 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_continuous_fnrow( \
+ K000, K010, K001, K011, K002, K012, K003, K013, K004, K014, K005, K015, K006, K016, K007, K017, \
+ K020, K030, K021, K031, K022, K032, K023, K033, K024, K034, K025, K035, K026, K036, K027, K037, \
+ K040, K050, K041, K051, K042, K052, K043, K053, K044, K054, K045, K055, K046, K047, K057, \
+ K060, K070, K061, K071, K062, K072, K063, K073, K064, K074, K065, K075, K076, K077, \
+ K080, K090, K081, K091, K082, K092, K083, K093, K084, K094, K085, K095, K086, K087, K097, \
+ K100, K110, K101, K103, K105, K115, K106, K116, K107, K117 \
+) \
+{ \
+ { K000, K001, K002, K003, K004, K005, K006, K007 }, \
+ { K010, K011, K012, K013, K014, K015, K016, K017 }, \
+ { K020, K021, K022, K023, K024, K025, K026, K027 }, \
+ { K030, K031, K032, K033, K034, K035, K036, K037 }, \
+ { K040, K041, K042, K043, K044, K045, K046, K047 }, \
+ { K050, K051, K052, K053, K054, K055, KC_NO, K057 }, \
+ { K060, K061, K062, K063, K064, K065, KC_NO, KC_NO }, \
+ { K070, K071, K072, K073, K074, K075, K076, K077 }, \
+ { K080, K081, K082, K083, K084, K085, K086, K087 }, \
+ { K090, K091, K092, K093, K094, K095, KC_NO, K097 }, \
+ { K100, K101, KC_NO, K103, KC_NO, K105, K106, K107 }, \
+ { K110, KC_NO, KC_NO, KC_NO, KC_NO, K115, K116, K117 } \
+}
+
+#define LAYOUT_divided_fnrow( \
+ K000, K010, K001, K011, K002, K003, K013, K004, K014, K005, K015, K006, K016, K017, \
+ K020, K030, K021, K031, K022, K032, K023, K033, K024, K034, K025, K035, K026, K036, K027, K037, \
+ K040, K050, K041, K051, K042, K052, K043, K053, K044, K054, K045, K055, K046, K047, K057, \
+ K060, K070, K061, K071, K062, K072, K063, K073, K064, K074, K065, K075, K076, K077, \
+ K080, K090, K081, K091, K082, K092, K083, K093, K084, K094, K085, K095, K086, K087, K097, \
+ K100, K110, K101, K103, K105, K115, K106, K116, K107, K117 \
+) \
+{ \
+ { K000, K001, K002, K003, K004, K005, K006, KC_NO }, \
+ { K010, K011, KC_NO, K013, K014, K015, K016, K017 }, \
+ { K020, K021, K022, K023, K024, K025, K026, K027 }, \
+ { K030, K031, K032, K033, K034, K035, K036, K037 }, \
+ { K040, K041, K042, K043, K044, K045, K046, K047 }, \
+ { K050, K051, K052, K053, K054, K055, KC_NO, K057 }, \
+ { K060, K061, K062, K063, K064, K065, KC_NO, KC_NO }, \
+ { K070, K071, K072, K073, K074, K075, K076, K077 }, \
+ { K080, K081, K082, K083, K084, K085, K086, K087 }, \
+ { K090, K091, K092, K093, K094, K095, KC_NO, K097 }, \
+ { K100, K101, KC_NO, K103, KC_NO, K105, K106, K107 }, \
+ { K110, KC_NO, KC_NO, KC_NO, KC_NO, K115, K116, K117 } \
+}
+
diff --git a/keyboards/quad_h/lb75/readme.md b/keyboards/quad_h/lb75/readme.md
new file mode 100644
index 00000000000..7f44499f640
--- /dev/null
+++ b/keyboards/quad_h/lb75/readme.md
@@ -0,0 +1,15 @@
+# LB75
+
+
+
+LB75 PCB for QUAD-H
+
+* Keyboard Maintainer: [ai03](https://github.com/ai03-2725)
+* Hardware Supported: The LB75 PCB
+* Hardware Availability: Private
+
+Make example for this keyboard (after setting up your build environment):
+
+ make quad_h/lb75:default
+
+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).
diff --git a/keyboards/quad_h/lb75/rules.mk b/keyboards/quad_h/lb75/rules.mk
new file mode 100644
index 00000000000..37a5d441a5c
--- /dev/null
+++ b/keyboards/quad_h/lb75/rules.mk
@@ -0,0 +1,33 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+
diff --git a/keyboards/retro_75/chconf.h b/keyboards/retro_75/chconf.h
index 8d66b51d235..85c1c9b3b9e 100644
--- a/keyboards/retro_75/chconf.h
+++ b/keyboards/retro_75/chconf.h
@@ -331,7 +331,7 @@
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE FALSE
+#define CH_CFG_USE_MEMCORE TRUE
#endif
/**
diff --git a/keyboards/reversestudio/decadepad/config.h b/keyboards/reversestudio/decadepad/config.h
new file mode 100644
index 00000000000..0e6622daae8
--- /dev/null
+++ b/keyboards/reversestudio/decadepad/config.h
@@ -0,0 +1,81 @@
+/*
+Copyright 2012 Jun Wako
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x5253
+#define PRODUCT_ID 0x4450
+#define DEVICE_VER 0x0001
+#define MANUFACTURER ReverseStudio
+#define PRODUCT DecadePad
+#define DESCRIPTION 6x4Pad
+
+/* key matrix size */
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 4
+
+/* NIU Mini PCB default pin-out */
+#define MATRIX_ROW_PINS { F0, F1, F4, F5, F6, F7 }
+#define MATRIX_COL_PINS { D0, D1, D2, D3 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+#define RGB_DI_PIN D5
+#ifdef RGB_DI_PIN
+ #define RGBLIGHT_ANIMATIONS
+ #define RGBLED_NUM 20
+ #define RGBLIGHT_HUE_STEP 8
+ #define RGBLIGHT_SAT_STEP 8
+ #define RGBLIGHT_VAL_STEP 8
+#endif
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
\ No newline at end of file
diff --git a/keyboards/reversestudio/decadepad/decadepad.c b/keyboards/reversestudio/decadepad/decadepad.c
new file mode 100644
index 00000000000..32a66e295cb
--- /dev/null
+++ b/keyboards/reversestudio/decadepad/decadepad.c
@@ -0,0 +1,16 @@
+#include "decadepad.h"
+void matrix_init_kb(void) {
+ led_init_ports();
+ matrix_init_user();
+};
+
+void led_init_ports(void) {
+ setPinOutput(D4);
+}
+
+bool led_update_kb(led_t led_state) {
+ if (led_update_user(led_state)){
+ writePin(D4, !led_state.num_lock);
+ }
+ return true;
+}
\ No newline at end of file
diff --git a/keyboards/reversestudio/decadepad/decadepad.h b/keyboards/reversestudio/decadepad/decadepad.h
new file mode 100644
index 00000000000..7da10094c7c
--- /dev/null
+++ b/keyboards/reversestudio/decadepad/decadepad.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "quantum.h"
+#define LAYOUT_numpad_6x4( \
+ k01, k02, k03, k04, \
+ k11, k12, k13, k14, \
+ k21, k22, k23, \
+ k31, k32, k33, k34, \
+ k41, k42, k43, \
+ k51, k53, k54 \
+) \
+{ \
+ { k01, k02, k03, k04 }, \
+ { k11, k12, k13, k14 }, \
+ { k21, k22, k23, KC_NO }, \
+ { k31, k32, k33, k34 }, \
+ { k41, k42, k43, KC_NO }, \
+ { k51, KC_NO, k53, k54 }, \
+}
diff --git a/keyboards/reversestudio/decadepad/info.json b/keyboards/reversestudio/decadepad/info.json
new file mode 100644
index 00000000000..6a2219a0f32
--- /dev/null
+++ b/keyboards/reversestudio/decadepad/info.json
@@ -0,0 +1,40 @@
+{
+ "keyboard_name": "DecadePad",
+ "url": "",
+ "maintainer": "huajijam",
+ "width": 6,
+ "height": 4,
+ "layouts": {
+ "LAYOUT_numpad_6x4": {
+ "key_count": 21,
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+
+ {"x":0, "y":1},
+ {"x":1, "y":1},
+ {"x":2, "y":1},
+ {"x":3, "y":1},
+
+ {"x":0, "y":2},
+ {"x":1, "y":2},
+ {"x":2, "y":2},
+
+ {"x":0, "y":3},
+ {"x":1, "y":3},
+ {"x":2, "y":3},
+ {"x":3, "y":2, "h":2},
+
+ {"x":0, "y":4},
+ {"x":1, "y":4},
+ {"x":2, "y":4},
+
+ {"x":0, "y":5, "w":2},
+ {"x":2, "y":5},
+ {"x":3, "y":4, "h":2}
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/reversestudio/decadepad/keymaps/default/keymap.c b/keyboards/reversestudio/decadepad/keymaps/default/keymap.c
new file mode 100644
index 00000000000..695ceac3012
--- /dev/null
+++ b/keyboards/reversestudio/decadepad/keymaps/default/keymap.c
@@ -0,0 +1,12 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_numpad_6x4(
+ RGB_TOG, RGB_MOD, RGB_VAI, RGB_M_R,
+ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_P1, KC_P2, KC_P3,
+ KC_P0, KC_PDOT, KC_PENT
+ )
+};
diff --git a/keyboards/reversestudio/decadepad/keymaps/via/keymap.c b/keyboards/reversestudio/decadepad/keymaps/via/keymap.c
new file mode 100644
index 00000000000..a9ca4191852
--- /dev/null
+++ b/keyboards/reversestudio/decadepad/keymaps/via/keymap.c
@@ -0,0 +1,36 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_numpad_6x4(
+ RGB_TOG, RGB_MOD, RGB_VAI, RGB_M_R,
+ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_P7, KC_P8, KC_P9,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_P1, KC_P2, KC_P3,
+ KC_P0, KC_PDOT, KC_PENT
+ ),
+ [1] = LAYOUT_numpad_6x4(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [2] = LAYOUT_numpad_6x4(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [3] = LAYOUT_numpad_6x4(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
diff --git a/keyboards/reversestudio/decadepad/keymaps/via/rules.mk b/keyboards/reversestudio/decadepad/keymaps/via/rules.mk
new file mode 100644
index 00000000000..bee21da5283
--- /dev/null
+++ b/keyboards/reversestudio/decadepad/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+MOUSEKEY_ENABLE = no
\ No newline at end of file
diff --git a/keyboards/reversestudio/decadepad/readme.md b/keyboards/reversestudio/decadepad/readme.md
new file mode 100644
index 00000000000..8b4c9c49114
--- /dev/null
+++ b/keyboards/reversestudio/decadepad/readme.md
@@ -0,0 +1,12 @@
+# DecadePad
+
+A 6x4 Standard Numpad
+
+* Keyboard Maintainer: [huajijam](https://github.com/huajijam)
+* Hardware Supported: DecadePad
+
+Make example for this keyboard (after setting up your build environment):
+
+ make reversestudio/decadepad:default
+
+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).
diff --git a/keyboards/reversestudio/decadepad/rules.mk b/keyboards/reversestudio/decadepad/rules.mk
new file mode 100644
index 00000000000..7730f09cdcc
--- /dev/null
+++ b/keyboards/reversestudio/decadepad/rules.mk
@@ -0,0 +1,38 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+UNICODE_ENABLE = yes # Unicode
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+
+LAYOUTS = numpad_6x4
\ No newline at end of file
diff --git a/keyboards/reviung39/keymaps/toshi0383/keymap.c b/keyboards/reviung39/keymaps/toshi0383/keymap.c
index e1783892551..f2586086c20 100644
--- a/keyboards/reviung39/keymaps/toshi0383/keymap.c
+++ b/keyboards/reviung39/keymaps/toshi0383/keymap.c
@@ -33,25 +33,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_SPC, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_RCTL, KC_DOT, KC_RALT, RGUI(KC_RSFT),
LOWER, KC_ENT, RAISE
),
-
+
[_LOWER] = LAYOUT_reviung39(
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, _______, _______, _______,
_______, KC_LT, KC_GT, KC_LPRN, KC_RPRN, KC_GRV, KC_MINS, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_PIPE,
KC_LALT, _______, _______, _______, KC_EQL, KC_QUES, KC_UNDS, KC_PLUS, KC_COMM, _______, KC_SLSH, _______,
_______, _______, KC_RGUI
),
-
+
[_RAISE] = LAYOUT_reviung39(
_______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
_______, KC_COLN, KC_SCLN, KC_DQT, KC_QUOT, KC_BSLS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______,
_______, _______, _______, _______, _______, _______, ADJUST, _______, _______, _______, _______, _______,
KC_LGUI, _______, _______
),
-
+
[_ADJUST] = LAYOUT_reviung39(
- RGB_VAI, RGB_SAI, RGB_HUI, RGB_MOD, XXXXXXX, RGB_TOG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- RGB_VAD, RGB_SAD, RGB_HUD, RGB_RMOD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
- _______, XXXXXXX, _______
+ RGB_VAI, RGB_SAI, RGB_HUI, RGB_MOD, XXXXXXX, RGB_TOG, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX,
+ RGB_VAD, RGB_SAD, RGB_HUD, RGB_RMOD, XXXXXXX, XXXXXXX, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX,
+ KC_MUTE, KC_VOLD, KC_VOLU, KC_BRID, KC_BRIU, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LANG1, KC_LANG2,
+ KC_LGUI, XXXXXXX, _______
),
};
diff --git a/keyboards/rgbkb/sol/keymaps/xulkal/config.h b/keyboards/rgbkb/sol/keymaps/xulkal/config.h
index a5c35cfae87..ab75c5419cc 100644
--- a/keyboards/rgbkb/sol/keymaps/xulkal/config.h
+++ b/keyboards/rgbkb/sol/keymaps/xulkal/config.h
@@ -29,3 +29,5 @@ along with this program. If not, see .
#define RGB_MATRIX_VAL_STEP 8
#define RGB_MATRIX_SPD_STEP 8
#endif
+
+#define ENCODER_RESOLUTION 2
diff --git a/keyboards/rgbkb/sol/keymaps/xulkal/rules.mk b/keyboards/rgbkb/sol/keymaps/xulkal/rules.mk
index 6a14a99af5b..da524e3dc95 100644
--- a/keyboards/rgbkb/sol/keymaps/xulkal/rules.mk
+++ b/keyboards/rgbkb/sol/keymaps/xulkal/rules.mk
@@ -5,7 +5,8 @@ RGBLIGHT_ENABLE = no # Enable global lighting effects. Do not ena
RGBLIGHT_ANIMATIONS = no # LED animations
LED_MIRRORED = no # Mirror LEDs across halves (enable DIP 1 on slave, and DIP 2 and 3 on master)
RGB_MATRIX_ENABLE = WS2812 # Enable per-key coordinate based RGB effects. Do not enable with RGBlight
-FULLHAND_ENABLE = yes # Enables the additional 24 Full Hand LEDs
+FULLHAND_ENABLE = no # Enables the additional 24 Full Hand LEDs
+SF_ENABLE = no # Enables the additional 38 Starfighter LEDs
# Misc
OLED_DRIVER_ENABLE = yes # Enable the OLED Driver
diff --git a/keyboards/rgbkb/zen/rev1/keymaps/333fred/rules.mk b/keyboards/rgbkb/zen/rev1/keymaps/333fred/rules.mk
index 1359e81c09f..f858bbe3daa 100644
--- a/keyboards/rgbkb/zen/rev1/keymaps/333fred/rules.mk
+++ b/keyboards/rgbkb/zen/rev1/keymaps/333fred/rules.mk
@@ -1,6 +1,4 @@
RGBLIGHT_ENABLE = yes
-NKRO_ENABLE = yes
KEY_LOCK_ENABLE = yes
-TAP_DANCE_ENABLE = yes
CONSOLE_ENABLE = no
EXTRAFLAGS += -flto
diff --git a/keyboards/shambles/config.h b/keyboards/shambles/config.h
new file mode 100644
index 00000000000..7714e4e6bd1
--- /dev/null
+++ b/keyboards/shambles/config.h
@@ -0,0 +1,43 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x4F42
+#define DEVICE_VER 0x0001
+#define MANUFACTURER OsciX
+#define PRODUCT Shambles TKL
+#define DESCRIPTION A minimalist keyboard with extra tenkeyless keys.
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 13
+
+/* key matrix pins */
+#define MATRIX_ROW_PINS { F5, B3, B1, F7 }
+#define MATRIX_COL_PINS { D3, D1, D0, D4, C6, D7, E6, B4, B5, B6, B2, F4, F6 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+/* key combination for command */
+
+
+#ifdef RGB_DI_PIN
+# define RGBLIGHT_ANIMATIONS
+# define RGBLED_NUM 0
+# define RGBLIGHT_HUE_STEP 8
+# define RGBLIGHT_SAT_STEP 8
+# define RGBLIGHT_VAL_STEP 8
+#endif
diff --git a/keyboards/shambles/info.json b/keyboards/shambles/info.json
new file mode 100644
index 00000000000..1f031cf7d2b
--- /dev/null
+++ b/keyboards/shambles/info.json
@@ -0,0 +1,13 @@
+{
+ "keyboard_name": "Shambles TKL",
+ "url": "",
+ "maintainer": "OsciX",
+ "width": 13.25,
+ "height": 4.5,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 47,
+ "layout": [{"label":"K00", "x":0, "y":0}, {"label":"K01", "x":1.5, "y":0}, {"label":"K02", "x":2.5, "y":0}, {"label":"K03", "x":3.5, "y":0}, {"label":"K04", "x":4.75, "y":0}, {"label":"K05", "x":5.75, "y":0}, {"label":"K06", "x":6.75, "y":0}, {"label":"K07", "x":8, "y":0}, {"label":"K08", "x":9, "y":0}, {"label":"K09", "x":10.25, "y":0}, {"label":"K10", "x":11.25, "y":0}, {"label":"K11", "x":12.25, "y":0}, {"label":"K12", "x":0, "y":1.5}, {"label":"K13", "x":1, "y":1.5}, {"label":"K14", "x":2, "y":1.5}, {"label":"K15", "x":3, "y":1.5}, {"label":"K16", "x":4, "y":1.5}, {"label":"K17", "x":5, "y":1.5}, {"label":"K18", "x":6, "y":1.5}, {"label":"K19", "x":7, "y":1.5}, {"label":"K20", "x":8, "y":1.5}, {"label":"K21", "x":9, "y":1.5}, {"label":"K22", "x":10.25, "y":1.25}, {"label":"K23", "x":11.25, "y":1.25}, {"label":"K24", "x":12.25, "y":1.25}, {"label":"K25", "x":0, "y":2.5}, {"label":"K26", "x":1, "y":2.5}, {"label":"K27", "x":2, "y":2.5}, {"label":"K28", "x":3, "y":2.5}, {"label":"K29", "x":4, "y":2.5}, {"label":"K30", "x":5, "y":2.5}, {"label":"K31", "x":6, "y":2.5}, {"label":"K32", "x":7, "y":2.5}, {"label":"K33", "x":8, "y":2.5}, {"label":"K34", "x":9, "y":2.5}, {"label":"K35", "x":11.25, "y":2.5}, {"label":"K36", "x":0.5, "y":3.5}, {"label":"K37", "x":1.5, "y":3.5}, {"label":"K38", "x":2.5, "y":3.5}, {"label":"K39", "x":3.5, "y":3.5}, {"label":"K40", "x":4.5, "y":3.5, "w":2}, {"label":"K41", "x":6.5, "y":3.5}, {"label":"K42", "x":7.5, "y":3.5}, {"label":"K43", "x":8.5, "y":3.5}, {"label":"K44", "x":10.25, "y":3.5}, {"label":"K45", "x":11.25, "y":3.5}, {"label":"K43", "x":12.25, "y":3.5}]
+ }
+ }
+}
diff --git a/keyboards/shambles/keymaps/default/keymap.c b/keyboards/shambles/keymaps/default/keymap.c
new file mode 100644
index 00000000000..6a076f7090c
--- /dev/null
+++ b/keyboards/shambles/keymaps/default/keymap.c
@@ -0,0 +1,10 @@
+#include "shambles.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_ENT, KC_RCTL, KC_RALT,
+ KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_RSFT, KC_UP,
+ KC_Z, KC_X, KC_C, KC_V, KC_SPC, KC_B, KC_N, KC_M, KC_LEFT, KC_DOWN, KC_RGHT)
+};
diff --git a/keyboards/shambles/readme.md b/keyboards/shambles/readme.md
new file mode 100644
index 00000000000..1b80263c668
--- /dev/null
+++ b/keyboards/shambles/readme.md
@@ -0,0 +1,15 @@
+# Shambles
+
+
+
+An Alpha28, with a numpad and nav cluster
+
+* Keyboard Maintainer: [OsciX](https://github.com/OsciX)
+* Hardware Supported: Shambles
+* Hardware Availability: [OsciX/shambles_qmk](https://github.com/OsciX/shambles_qmk)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make shambles:default
+
+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).
diff --git a/keyboards/shambles/rules.mk b/keyboards/shambles/rules.mk
new file mode 100644
index 00000000000..d029ee528f5
--- /dev/null
+++ b/keyboards/shambles/rules.mk
@@ -0,0 +1,32 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
diff --git a/keyboards/shambles/shambles.c b/keyboards/shambles/shambles.c
new file mode 100644
index 00000000000..b0ef6b8f992
--- /dev/null
+++ b/keyboards/shambles/shambles.c
@@ -0,0 +1 @@
+#include "shambles.h"
diff --git a/keyboards/shambles/shambles.h b/keyboards/shambles/shambles.h
new file mode 100644
index 00000000000..5fb13b63580
--- /dev/null
+++ b/keyboards/shambles/shambles.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K000, K001, K002, K003, K005, K006, K007, K008, K009, K010, K011, K012, \
+ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, \
+ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K211, \
+ K300, K301, K302, K303, K305, K306, K307, K308, K310, K311, K312 \
+) { \
+ { K000, K001, K002, K003, KC_NO, K005, K006, K007, K008, K009, K010, K011, K012 }, \
+ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \
+ { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, KC_NO, K211, KC_NO }, \
+ { K300, K301, K302, K303, KC_NO, K305, K306, K307, K308, KC_NO, K310, K311, K312 } \
+}
diff --git a/keyboards/signum/3_0/elitec/keymaps/default/layout.py b/keyboards/signum/3_0/elitec/keymaps/default/layout.py
index ab9bce42260..1e43e25c574 100644
--- a/keyboards/signum/3_0/elitec/keymaps/default/layout.py
+++ b/keyboards/signum/3_0/elitec/keymaps/default/layout.py
@@ -397,7 +397,7 @@ qmk_dict = {
"_sp_swp": "SHT(KC_SPC)",
# Unicode support (via X()) included implicitly
# Switching Unicode Input Modes
- "UC_win": "UC_M_WC", "UC_lnx": "UC_M_LN", "UC_osx": "UC_M_OS",
+ "UC_win": "UC_M_WC", "UC_lnx": "UC_M_LN", "UC_mac": "UC_M_MA",
# custom keys
"altF4": "LALT(KC_F4)",
diff --git a/keyboards/silverbullet44/config.h b/keyboards/silverbullet44/config.h
index 6872f5fb447..a7402a001bd 100644
--- a/keyboards/silverbullet44/config.h
+++ b/keyboards/silverbullet44/config.h
@@ -233,10 +233,10 @@ along with this program. If not, see .
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
-# define NO_ACTION_MACRO
-# define NO_ACTION_FUNCTION
-#endif
+
+/* disable these deprecated features by default */
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
/*
* MIDI options
diff --git a/keyboards/singa/usbconfig.h b/keyboards/singa/usbconfig.h
deleted file mode 100644
index e65d210ace8..00000000000
--- a/keyboards/singa/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/sirius/uni660/info.json b/keyboards/sirius/uni660/info.json
deleted file mode 100644
index 296626d06a2..00000000000
--- a/keyboards/sirius/uni660/info.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "keyboard_name": "Uni660",
- "url": "",
- "maintainer": "qmk",
- "width": 12,
- "height": 5.75,
- "layouts": {
- "LAYOUT": {
- "layout": [{"x":0, "y":0.75}, {"x":1, "y":0.25}, {"x":2, "y":0}, {"x":3, "y":0.25}, {"x":4, "y":0.125}, {"x":7, "y":0.125}, {"x":8, "y":0.25}, {"x":9, "y":0}, {"x":10, "y":0.25}, {"x":11, "y":0.75}, {"x":0, "y":1.75}, {"x":1, "y":1.25}, {"x":2, "y":1}, {"x":3, "y":1.25}, {"x":4, "y":1.125}, {"x":7, "y":1.125}, {"x":8, "y":1.25}, {"x":9, "y":1}, {"x":10, "y":1.25}, {"x":11, "y":1.75}, {"x":0, "y":2.75}, {"x":1, "y":2.25}, {"x":2, "y":2}, {"x":3, "y":2.25}, {"x":4, "y":2.125}, {"x":7, "y":2.125}, {"x":8, "y":2.25}, {"x":9, "y":2}, {"x":10, "y":2.25}, {"x":11, "y":2.75}, {"x":1.5, "y":3.75}, {"x":2.5, "y":3.75}, {"x":3.5, "y":3.75}, {"x":4.5, "y":3.75}, {"x":6.5, "y":3.75}, {"x":7.5, "y":3.75}, {"x":8.5, "y":3.75}, {"x":9.5, "y":3.75}, {"x":1.5, "y":4.75}, {"x":2.5, "y":4.75}, {"x":3.5, "y":4.75}, {"x":4.5, "y":4.75}, {"x":6.5, "y":4.75}, {"x":7.5, "y":4.75}, {"x":8.5, "y":4.75}, {"x":9.5, "y":4.75}]
- }
- }
-}
diff --git a/keyboards/sirius/uni660/readme.md b/keyboards/sirius/uni660/readme.md
index c3d2dbc1b36..4a45c6276f5 100644
--- a/keyboards/sirius/uni660/readme.md
+++ b/keyboards/sirius/uni660/readme.md
@@ -6,7 +6,11 @@ Join the KeyCommerce [Discord](https://discord.gg/GJ8bdM)
Make example:
- make sirius/uni660:default
+```
+qmk compile -kb sirius/uni660/rev1 -km default
+qmk compile -kb sirius/uni660/rev2/ansi -km default
+qmk compile -kb sirius/uni660/rev2/iso -km default
+```
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).
diff --git a/keyboards/sirius/uni660/config.h b/keyboards/sirius/uni660/rev1/config.h
similarity index 100%
rename from keyboards/sirius/uni660/config.h
rename to keyboards/sirius/uni660/rev1/config.h
diff --git a/keyboards/sirius/uni660/rev1/info.json b/keyboards/sirius/uni660/rev1/info.json
new file mode 100644
index 00000000000..aa6b01cdf07
--- /dev/null
+++ b/keyboards/sirius/uni660/rev1/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "Uni660",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 19,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"~", "x":1.5, "y":0}, {"label":"!", "x":2.5, "y":0}, {"label":"@", "x":3.5, "y":0}, {"label":"#", "x":4.5, "y":0}, {"label":"$", "x":5.5, "y":0}, {"label":"%", "x":6.5, "y":0}, {"label":"^", "x":7.5, "y":0}, {"label":"&", "x":9.5, "y":0}, {"label":"*", "x":10.5, "y":0}, {"label":"(", "x":11.5, "y":0}, {"label":")", "x":12.5, "y":0}, {"label":"_", "x":13.5, "y":0}, {"label":"+", "x":14.5, "y":0}, {"label":"Backspace", "x":15.5, "y":0, "w":2}, {"label":"Insert", "x":18, "y":0}, {"label":"F1", "x":0, "y":1}, {"label":"Tab", "x":1.5, "y":1, "w":1.5}, {"label":"Q", "x":3, "y":1}, {"label":"W", "x":4, "y":1}, {"label":"E", "x":5, "y":1}, {"label":"R", "x":6, "y":1}, {"label":"T", "x":7, "y":1}, {"label":"Y", "x":9, "y":1}, {"label":"U", "x":10, "y":1}, {"label":"I", "x":11, "y":1}, {"label":"O", "x":12, "y":1}, {"label":"P", "x":13, "y":1}, {"label":"{", "x":14, "y":1}, {"label":"}", "x":15, "y":1}, {"label":"|", "x":16, "y":1, "w":1.5}, {"label":"Delete", "x":18, "y":1}, {"label":"F2", "x":0, "y":2}, {"label":"Caps Lock", "x":1.5, "y":2, "w":1.75}, {"label":"A", "x":3.25, "y":2}, {"label":"S", "x":4.25, "y":2}, {"label":"D", "x":5.25, "y":2}, {"label":"F", "x":6.25, "y":2}, {"label":"G", "x":7.25, "y":2}, {"label":"H", "x":9.25, "y":2}, {"label":"J", "x":10.25, "y":2}, {"label":"K", "x":11.25, "y":2}, {"label":"L", "x":12.25, "y":2}, {"label":":", "x":13.25, "y":2}, {"label":"\"", "x":14.25, "y":2}, {"label":"Enter", "x":15.25, "y":2, "w":2.25}, {"label":"F3", "x":0, "y":3}, {"label":"Shift", "x":1.5, "y":3, "w":2.25}, {"label":"Z", "x":3.75, "y":3}, {"label":"X", "x":4.75, "y":3}, {"label":"C", "x":5.75, "y":3}, {"label":"V", "x":6.75, "y":3}, {"label":"B", "x":7.75, "y":3}, {"label":"N", "x":9.75, "y":3}, {"label":"M", "x":10.75, "y":3}, {"label":"<", "x":11.75, "y":3}, {"label":">", "x":12.75, "y":3}, {"label":"?", "x":13.75, "y":3}, {"label":"Shift", "x":14.75, "y":3, "w":2.25}, {"label":"Up", "x":17, "y":3}, {"label":"F4", "x":0, "y":4}, {"label":"Ctrl", "x":1.5, "y":4, "w":1.25}, {"label":"Win", "x":2.75, "y":4, "w":1.25}, {"label":"Alt", "x":4, "y":4, "w":1.25}, {"x":5.25, "y":4, "w":2.25}, {"label":"Fn", "x":7.5, "y":4}, {"x":9.5, "y":4, "w":2.75}, {"label":"Alt", "x":12.25, "y":4, "w":1.25}, {"label":"Menu", "x":13.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":14.75, "y":4, "w":1.25}, {"label":"Left", "x":16, "y":4}, {"label":"Down", "x":17, "y":4}, {"label":"Right", "x":18, "y":4}]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/sirius/uni660/keymaps/default/keymap.c b/keyboards/sirius/uni660/rev1/keymaps/default/keymap.c
similarity index 100%
rename from keyboards/sirius/uni660/keymaps/default/keymap.c
rename to keyboards/sirius/uni660/rev1/keymaps/default/keymap.c
diff --git a/keyboards/sirius/uni660/keymaps/via/keymap.c b/keyboards/sirius/uni660/rev1/keymaps/via/keymap.c
similarity index 100%
rename from keyboards/sirius/uni660/keymaps/via/keymap.c
rename to keyboards/sirius/uni660/rev1/keymaps/via/keymap.c
diff --git a/keyboards/sirius/uni660/rev1/keymaps/via/rules.mk b/keyboards/sirius/uni660/rev1/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/sirius/uni660/rev1/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/sirius/uni660/rev1/rev1.h b/keyboards/sirius/uni660/rev1/rev1.h
new file mode 100644
index 00000000000..22397b48b18
--- /dev/null
+++ b/keyboards/sirius/uni660/rev1/rev1.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#include "uni660.h"
+
+#include "quantum.h"
+
+// This a shortcut to help you visually see your layout.
+// The first section contains all of the arguments
+// The second converts the arguments into a two-dimensional array
+#define LAYOUT( \
+ k00, k01, k02, k03, k04, k05, k06, k46, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k3f,\
+ k10, k11, k12, k13, k14, k15, k16, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k2f,\
+ k20, k21, k22, k23, k24, k25, k26, k28, k29, k2a, k2b, k2c, k2d, k2e,\
+ k30, k31, k32, k33, k34, k35, k36, k38, k39, k3a, k3b, k3c, k3d, k3e, \
+ k40, k41, k42, k43, k44, k45, k48, k49, k4a, k4c, k4d, k4e, k4f \
+) \
+ { \
+ { k00, k01, k02, k03, k04, k05, k06, KC_NO, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f }, \
+ { k10, k11, k12, k13, k14, k15, k16, KC_NO, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f }, \
+ { k20, k21, k22, k23, k24, k25, k26, KC_NO, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f }, \
+ { k30, k31, k32, k33, k34, k35, k36, KC_NO, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f }, \
+ { k40, k41, k42, k43, k44, k45, k46, KC_NO, k48, k49, k4a, KC_NO, k4c, k4d, k4e, k4f } \
+ }
diff --git a/keyboards/sirius/uni660/rev1/rules.mk b/keyboards/sirius/uni660/rev1/rules.mk
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/sirius/uni660/rev2/ansi/ansi.h b/keyboards/sirius/uni660/rev2/ansi/ansi.h
new file mode 100644
index 00000000000..3e21b5c8430
--- /dev/null
+++ b/keyboards/sirius/uni660/rev2/ansi/ansi.h
@@ -0,0 +1,24 @@
+#pragma once
+
+#include "uni660.h"
+
+#include "quantum.h"
+
+// This a shortcut to help you visually see your layout.
+// The first section contains all of the arguments
+// The second converts the arguments into a two-dimensional array
+
+#define LAYOUT_ansi( \
+ k00, k01, k02, k03, k04, k05, k06, k46, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k3f,\
+ k10, k11, k12, k13, k14, k15, k16, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k2f,\
+ k20, k21, k22, k23, k24, k25, k26, k28, k29, k2a, k2b, k2c, k2d, k2e,\
+ k30, k31, k32, k33, k34, k35, k36, k38, k39, k3a, k3b, k3c, k3d, k3e, \
+ k40, k41, k42, k43, k44, k45, k48, k49, k4a, k4c, k4d, k4e, k4f \
+) \
+ { \
+ { k00, k01, k02, k03, k04, k05, k06, KC_NO, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f }, \
+ { k10, k11, k12, k13, k14, k15, k16, KC_NO, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f }, \
+ { k20, k21, k22, k23, k24, k25, k26, KC_NO, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f }, \
+ { k30, k31, k32, k33, k34, k35, k36, KC_NO, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f }, \
+ { k40, k41, k42, k43, k44, k45, k46, KC_NO, k48, k49, k4a, KC_NO, k4c, k4d, k4e, k4f } \
+ }
diff --git a/keyboards/sirius/uni660/rev2/ansi/config.h b/keyboards/sirius/uni660/rev2/ansi/config.h
new file mode 100644
index 00000000000..0032f61ccdc
--- /dev/null
+++ b/keyboards/sirius/uni660/rev2/ansi/config.h
@@ -0,0 +1,78 @@
+/*
+Copyright 2012 Jun Wako
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+
+#define VENDOR_ID 0x5352 // "SR"
+#define PRODUCT_ID 0x0202 // Second Product Second Version
+#define DEVICE_VER 0x2004 // 2020.12
+#define MANUFACTURER SiRius
+#define PRODUCT SiRius Uni660 V2
+#define DESCRIPTION SiRius Uni660 V2
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 16
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+//#define BACKLIGHT_LEVELS 3
+
+#define ONESHOT_TIMEOUT 500
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+//UART settings for communication with the RF microcontroller
+#define SERIAL_UART_BAUD 1000000
+#define SERIAL_UART_DATA UDR1
+#define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1)
+#define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1))
+#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
+#define SERIAL_UART_INIT() do { \
+ /* baud rate */ \
+ UBRR1L = SERIAL_UART_UBRR; \
+ /* baud rate */ \
+ UBRR1H = SERIAL_UART_UBRR >> 8; \
+ /* enable TX and RX */ \
+ UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
+ /* 8-bit data */ \
+ UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \
+ } while(0)
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 4
diff --git a/keyboards/sirius/uni660/rev2/ansi/info.json b/keyboards/sirius/uni660/rev2/ansi/info.json
new file mode 100644
index 00000000000..08d21d07755
--- /dev/null
+++ b/keyboards/sirius/uni660/rev2/ansi/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "Uni660",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 19,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_ansi": {
+ "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"~", "x":1.5, "y":0}, {"label":"!", "x":2.5, "y":0}, {"label":"@", "x":3.5, "y":0}, {"label":"#", "x":4.5, "y":0}, {"label":"$", "x":5.5, "y":0}, {"label":"%", "x":6.5, "y":0}, {"label":"^", "x":7.5, "y":0}, {"label":"&", "x":9.5, "y":0}, {"label":"*", "x":10.5, "y":0}, {"label":"(", "x":11.5, "y":0}, {"label":")", "x":12.5, "y":0}, {"label":"_", "x":13.5, "y":0}, {"label":"+", "x":14.5, "y":0}, {"label":"Backspace", "x":15.5, "y":0, "w":2}, {"label":"Insert", "x":18, "y":0}, {"label":"F1", "x":0, "y":1}, {"label":"Tab", "x":1.5, "y":1, "w":1.5}, {"label":"Q", "x":3, "y":1}, {"label":"W", "x":4, "y":1}, {"label":"E", "x":5, "y":1}, {"label":"R", "x":6, "y":1}, {"label":"T", "x":7, "y":1}, {"label":"Y", "x":9, "y":1}, {"label":"U", "x":10, "y":1}, {"label":"I", "x":11, "y":1}, {"label":"O", "x":12, "y":1}, {"label":"P", "x":13, "y":1}, {"label":"{", "x":14, "y":1}, {"label":"}", "x":15, "y":1}, {"label":"|", "x":16, "y":1, "w":1.5}, {"label":"Delete", "x":18, "y":1}, {"label":"F2", "x":0, "y":2}, {"label":"Caps Lock", "x":1.5, "y":2, "w":1.75}, {"label":"A", "x":3.25, "y":2}, {"label":"S", "x":4.25, "y":2}, {"label":"D", "x":5.25, "y":2}, {"label":"F", "x":6.25, "y":2}, {"label":"G", "x":7.25, "y":2}, {"label":"H", "x":9.25, "y":2}, {"label":"J", "x":10.25, "y":2}, {"label":"K", "x":11.25, "y":2}, {"label":"L", "x":12.25, "y":2}, {"label":":", "x":13.25, "y":2}, {"label":"\"", "x":14.25, "y":2}, {"label":"Enter", "x":15.25, "y":2, "w":2.25}, {"label":"F3", "x":0, "y":3}, {"label":"Shift", "x":1.5, "y":3, "w":2.25}, {"label":"Z", "x":3.75, "y":3}, {"label":"X", "x":4.75, "y":3}, {"label":"C", "x":5.75, "y":3}, {"label":"V", "x":6.75, "y":3}, {"label":"B", "x":7.75, "y":3}, {"label":"N", "x":9.75, "y":3}, {"label":"M", "x":10.75, "y":3}, {"label":"<", "x":11.75, "y":3}, {"label":">", "x":12.75, "y":3}, {"label":"?", "x":13.75, "y":3}, {"label":"Shift", "x":14.75, "y":3, "w":2.25}, {"label":"Up", "x":17, "y":3}, {"label":"F4", "x":0, "y":4}, {"label":"Ctrl", "x":1.5, "y":4, "w":1.25}, {"label":"Win", "x":2.75, "y":4, "w":1.25}, {"label":"Alt", "x":4, "y":4, "w":1.25}, {"x":5.25, "y":4, "w":2.25}, {"label":"Fn", "x":7.5, "y":4}, {"x":9.5, "y":4, "w":2.75}, {"label":"Alt", "x":12.25, "y":4, "w":1.25}, {"label":"Menu", "x":13.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":14.75, "y":4, "w":1.25}, {"label":"Left", "x":16, "y":4}, {"label":"Down", "x":17, "y":4}, {"label":"Right", "x":18, "y":4}]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/sirius/uni660/rev2/ansi/keymaps/default/keymap.c b/keyboards/sirius/uni660/rev2/ansi/keymaps/default/keymap.c
new file mode 100644
index 00000000000..ff45e7f2b74
--- /dev/null
+++ b/keyboards/sirius/uni660/rev2/ansi/keymaps/default/keymap.c
@@ -0,0 +1,11 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_ansi( /* Base */
+KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_INS,
+KC_F1, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+KC_F2, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+KC_F3, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+KC_F4, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_DEL, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT
+),
+};
diff --git a/keyboards/sirius/uni660/rev2/ansi/keymaps/via/keymap.c b/keyboards/sirius/uni660/rev2/ansi/keymaps/via/keymap.c
new file mode 100644
index 00000000000..26ec43d4783
--- /dev/null
+++ b/keyboards/sirius/uni660/rev2/ansi/keymaps/via/keymap.c
@@ -0,0 +1,35 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_ansi( /* Base */
+KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_INS,
+KC_F1, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+KC_F2, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+KC_F3, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+KC_F4, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_DEL, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT
+),
+
+[1] = LAYOUT_ansi( /* Layer 1 */
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RGUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+),
+
+[2] = LAYOUT_ansi( /* Layer 2 */
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RGUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+),
+
+[3] = LAYOUT_ansi( /* Layer 3 */
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RGUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+),
+};
diff --git a/keyboards/sirius/uni660/rev2/ansi/keymaps/via/rules.mk b/keyboards/sirius/uni660/rev2/ansi/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/sirius/uni660/rev2/ansi/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/sirius/uni660/rev2/ansi/rules.mk b/keyboards/sirius/uni660/rev2/ansi/rules.mk
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/sirius/uni660/rev2/iso/config.h b/keyboards/sirius/uni660/rev2/iso/config.h
new file mode 100644
index 00000000000..e31f8fb8eba
--- /dev/null
+++ b/keyboards/sirius/uni660/rev2/iso/config.h
@@ -0,0 +1,78 @@
+/*
+Copyright 2012 Jun Wako
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+
+#define VENDOR_ID 0x5352 // "SR"
+#define PRODUCT_ID 0x0203 // Second Product Third Version
+#define DEVICE_VER 0x2004 // 2020.12
+#define MANUFACTURER SiRius
+#define PRODUCT SiRius Uni660 V2
+#define DESCRIPTION SiRius Uni660 V2
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 16
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+//#define BACKLIGHT_LEVELS 3
+
+#define ONESHOT_TIMEOUT 500
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+//UART settings for communication with the RF microcontroller
+#define SERIAL_UART_BAUD 1000000
+#define SERIAL_UART_DATA UDR1
+#define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1)
+#define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1))
+#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
+#define SERIAL_UART_INIT() do { \
+ /* baud rate */ \
+ UBRR1L = SERIAL_UART_UBRR; \
+ /* baud rate */ \
+ UBRR1H = SERIAL_UART_UBRR >> 8; \
+ /* enable TX and RX */ \
+ UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
+ /* 8-bit data */ \
+ UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \
+ } while(0)
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 4
diff --git a/keyboards/sirius/uni660/rev2/iso/info.json b/keyboards/sirius/uni660/rev2/iso/info.json
new file mode 100644
index 00000000000..cd32c736905
--- /dev/null
+++ b/keyboards/sirius/uni660/rev2/iso/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "Uni660",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 19,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_iso": {
+ "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"\u00ac", "x":1.5, "y":0}, {"label":"!", "x":2.5, "y":0}, {"label":"\"", "x":3.5, "y":0}, {"label":"\u00a3", "x":4.5, "y":0}, {"label":"$", "x":5.5, "y":0}, {"label":"%", "x":6.5, "y":0}, {"label":"^", "x":7.5, "y":0}, {"label":"&", "x":9.5, "y":0}, {"label":"*", "x":10.5, "y":0}, {"label":"(", "x":11.5, "y":0}, {"label":")", "x":12.5, "y":0}, {"label":"_", "x":13.5, "y":0}, {"label":"+", "x":14.5, "y":0}, {"label":"Backspace", "x":15.5, "y":0, "w":2}, {"label":"Insert", "x":18, "y":0}, {"label":"F1", "x":0, "y":1}, {"label":"Tab", "x":1.5, "y":1, "w":1.5}, {"label":"Q", "x":3, "y":1}, {"label":"W", "x":4, "y":1}, {"label":"E", "x":5, "y":1}, {"label":"R", "x":6, "y":1}, {"label":"T", "x":7, "y":1}, {"label":"Y", "x":9, "y":1}, {"label":"U", "x":10, "y":1}, {"label":"I", "x":11, "y":1}, {"label":"O", "x":12, "y":1}, {"label":"P", "x":13, "y":1}, {"label":"{", "x":14, "y":1}, {"label":"}", "x":15, "y":1}, {"label":"Enter", "x":16.25, "y":1, "w":1.25, "h":2}, {"label":"Delete", "x":18, "y":1}, {"label":"F2", "x":0, "y":2}, {"label":"Caps Lock", "x":1.5, "y":2, "w":1.75}, {"label":"A", "x":3.25, "y":2}, {"label":"S", "x":4.25, "y":2}, {"label":"D", "x":5.25, "y":2}, {"label":"F", "x":6.25, "y":2}, {"label":"G", "x":7.25, "y":2}, {"label":"H", "x":9.25, "y":2}, {"label":"J", "x":10.25, "y":2}, {"label":"K", "x":11.25, "y":2}, {"label":"L", "x":12.25, "y":2}, {"label":":", "x":13.25, "y":2}, {"label":"@", "x":14.25, "y":2}, {"label":"~", "x":15.25, "y":2}, {"label":"F3", "x":0, "y":3}, {"label":"Shift", "x":1.5, "y":3, "w":1.25}, {"label":"|", "x":2.75, "y":3}, {"label":"Z", "x":3.75, "y":3}, {"label":"X", "x":4.75, "y":3}, {"label":"C", "x":5.75, "y":3}, {"label":"V", "x":6.75, "y":3}, {"label":"B", "x":7.75, "y":3}, {"label":"N", "x":9.75, "y":3}, {"label":"M", "x":10.75, "y":3}, {"label":"<", "x":11.75, "y":3}, {"label":">", "x":12.75, "y":3}, {"label":"?", "x":13.75, "y":3}, {"label":"Shift", "x":14.75, "y":3, "w":2.25}, {"label":"Up", "x":17, "y":3}, {"label":"F4", "x":0, "y":4}, {"label":"Ctrl", "x":1.5, "y":4, "w":1.25}, {"label":"Win", "x":2.75, "y":4, "w":1.25}, {"label":"Alt", "x":4, "y":4, "w":1.25}, {"x":5.25, "y":4, "w":2.25}, {"label":"Fn", "x":7.5, "y":4}, {"x":9.5, "y":4, "w":2.75}, {"label":"Alt", "x":12.25, "y":4, "w":1.25}, {"label":"Menu", "x":13.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":14.75, "y":4, "w":1.25}, {"label":"Left", "x":16, "y":4}, {"label":"Down", "x":17, "y":4}, {"label":"Right", "x":18, "y":4}]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/sirius/uni660/rev2/iso/iso.h b/keyboards/sirius/uni660/rev2/iso/iso.h
new file mode 100644
index 00000000000..b38bdfc9323
--- /dev/null
+++ b/keyboards/sirius/uni660/rev2/iso/iso.h
@@ -0,0 +1,24 @@
+#pragma once
+
+#include "uni660.h"
+
+#include "quantum.h"
+
+// This a shortcut to help you visually see your layout.
+// The first section contains all of the arguments
+// The second converts the arguments into a two-dimensional array
+
+#define LAYOUT_iso( \
+ k00, k01, k02, k03, k04, k05, k06, k46, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f, k3f,\
+ k10, k11, k12, k13, k14, k15, k16, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k2f,\
+ k20, k21, k22, k23, k24, k25, k26, k28, k29, k2a, k2b, k2c, k2d, k2e,\
+ k30, k31, k37, k32, k33, k34, k35, k36, k38, k39, k3a, k3b, k3c, k3d, k3e, \
+ k40, k41, k42, k43, k44, k45, k48, k49, k4a, k4c, k4d, k4e, k4f \
+) \
+ { \
+ { k00, k01, k02, k03, k04, k05, k06, KC_NO, k08, k09, k0a, k0b, k0c, k0d, k0e, k0f }, \
+ { k10, k11, k12, k13, k14, k15, k16, KC_NO, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f }, \
+ { k20, k21, k22, k23, k24, k25, k26, KC_NO, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f }, \
+ { k40, k41, k42, k43, k44, k45, k46, KC_NO, k48, k49, k4a, KC_NO, k4c, k4d, k4e, k4f } \
+ }
diff --git a/keyboards/sirius/uni660/rev2/iso/keymaps/default/keymap.c b/keyboards/sirius/uni660/rev2/iso/keymaps/default/keymap.c
new file mode 100644
index 00000000000..de8630eaa63
--- /dev/null
+++ b/keyboards/sirius/uni660/rev2/iso/keymaps/default/keymap.c
@@ -0,0 +1,11 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_iso( /* Base */
+KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_INS,
+KC_F1, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+KC_F2, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+KC_F3, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+KC_F4, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_DEL, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT
+),
+};
diff --git a/keyboards/sirius/uni660/rev2/iso/keymaps/via/keymap.c b/keyboards/sirius/uni660/rev2/iso/keymaps/via/keymap.c
new file mode 100644
index 00000000000..ac1d7c6d59c
--- /dev/null
+++ b/keyboards/sirius/uni660/rev2/iso/keymaps/via/keymap.c
@@ -0,0 +1,35 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_iso( /* Base */
+KC_ESC, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_INS,
+KC_F1, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+KC_F2, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+KC_F3, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+KC_F4, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_DEL, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT
+),
+
+[1] = LAYOUT_iso( /* Layer 1 */
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RGUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+),
+
+[2] = LAYOUT_iso( /* Layer 2 */
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RGUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+),
+
+[3] = LAYOUT_iso( /* Layer 3 */
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RGUI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+),
+};
diff --git a/keyboards/sirius/uni660/rev2/iso/keymaps/via/rules.mk b/keyboards/sirius/uni660/rev2/iso/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/sirius/uni660/rev2/iso/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/sirius/uni660/rev2/iso/rules.mk b/keyboards/sirius/uni660/rev2/iso/rules.mk
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/sirius/uni660/rules.mk b/keyboards/sirius/uni660/rules.mk
index 920d8a83dda..243916fa768 100644
--- a/keyboards/sirius/uni660/rules.mk
+++ b/keyboards/sirius/uni660/rules.mk
@@ -30,3 +30,4 @@ UNICODE_ENABLE = yes # Unicode
# project specific files
SRC += matrix.c
+
diff --git a/keyboards/sirius/uni660/uni660.h b/keyboards/sirius/uni660/uni660.h
index 81743adbd81..75813db7bd9 100644
--- a/keyboards/sirius/uni660/uni660.h
+++ b/keyboards/sirius/uni660/uni660.h
@@ -2,6 +2,14 @@
#include "quantum.h"
+#ifdef KEYBOARD_sirius_uni660_rev1
+ #include "rev1.h"
+#elif KEYBOARD_sirius_uni660_rev2_iso
+ #include "iso.h"
+#elif KEYBOARD_sirius_uni660_rev2_ansi
+ #include "ansi.h"
+#endif
+
#define red_led_off writePinHigh(F5)
#define red_led_on writePinLow(F5)
#define blu_led_off writePinHigh(F4)
@@ -41,21 +49,3 @@
#define set_led_cyan PORTF = PORTF & ~(1<
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x6464
+#define DEVICE_VER 0x0001
+#define MANUFACTIRER Reid Schneyer
+#define PRODUCT Splitish
+#define DESCRIPTION Keyboard firmware for Splitish
+
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 12
+
+#define MATRIX_COL_PINS { F4 , F5 , F6 , F7 , B1 , B3 , C6 , D4 , D0 , D1 , D2 , D3 }
+#define MATRIX_ROW_PINS { B4 , B5 , B2 , B6 }
+#define DIODE_DIRECTION COL2ROW
+#define UNUSED_PINS
+
+#define DEBOUNCE 5
+
+#define LOCKING_SUPPORT_ENABLE
+
+#define LOCKING_RESYNC_ENABLE
+
+
diff --git a/keyboards/splitish/keymaps/default/keymap.c b/keyboards/splitish/keymaps/default/keymap.c
new file mode 100644
index 00000000000..470bad9b8da
--- /dev/null
+++ b/keyboards/splitish/keymaps/default/keymap.c
@@ -0,0 +1,57 @@
+/*
+Copyright 2019 Reid Schneyer
+
+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 .
+*/
+
+#include QMK_KEYBOARD_H
+
+//Layer definitions
+enum layers {
+ BASE,
+ NUMS,
+ SYMB,
+ FNS
+};
+
+enum custom_keycodes {
+ QWERTY = SAFE_RANGE,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [BASE] = LAYOUT(
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ KC_ESC, KC_LGUI, KC_LALT, KC_LALT, MO(FNS), LT(SYMB, KC_SPC), LT(NUMS, KC_SPC), MO(FNS), KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
+ ),
+ [NUMS] = LAYOUT(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [SYMB] = LAYOUT(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+ [FNS] = LAYOUT(
+ KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_VOLU, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_DEL,
+ KC_TRNS, KC_F5, KC_F6, KC_F7, KC_F8, KC_MPLY, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END
+ )
+};
diff --git a/keyboards/splitish/keymaps/default/readme.md b/keyboards/splitish/keymaps/default/readme.md
new file mode 100644
index 00000000000..112456db1d4
--- /dev/null
+++ b/keyboards/splitish/keymaps/default/readme.md
@@ -0,0 +1,4 @@
+# The default keymap for splitish
+This is the default keymap for splitish
+
+
diff --git a/keyboards/splitish/readme.md b/keyboards/splitish/readme.md
new file mode 100644
index 00000000000..e3870adcb4e
--- /dev/null
+++ b/keyboards/splitish/readme.md
@@ -0,0 +1,18 @@
+# splitish
+
+
+A separated 4x12 ortho Kailh Choc keyboard
+
+Keyboard Maintainer: [Reid Schneyer](https://github.com/RSchneyer)
+
+Hardware Supported: Splitish PCB, Pro Micro
+
+Hardware Avaiability: [Gerber files](https://github.com/RSchneyer/splitish/tree/master/gerbers)
+
+Make example for splitish (after setting up your build environment):
+
+ make splitish:default
+
+See [build environment setup](https://docs.qmk.fm/install-build-tools) then the [make instructions](https://docs.qmk.fm/faq/build-compile-qmk) for more information.
+
+Please see [RSchneyer/splitish](https://www.github.com/RSchneyer/splitish) for **build instructions**, parts lists, and Gerber files.
diff --git a/keyboards/splitish/rules.mk b/keyboards/splitish/rules.mk
new file mode 100644
index 00000000000..4cba00bcc58
--- /dev/null
+++ b/keyboards/splitish/rules.mk
@@ -0,0 +1,23 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
diff --git a/keyboards/splitish/splitish.c b/keyboards/splitish/splitish.c
new file mode 100644
index 00000000000..b831a68c64e
--- /dev/null
+++ b/keyboards/splitish/splitish.c
@@ -0,0 +1 @@
+#include "splitish.h"
diff --git a/keyboards/splitish/splitish.h b/keyboards/splitish/splitish.h
new file mode 100644
index 00000000000..ff5a7d8412d
--- /dev/null
+++ b/keyboards/splitish/splitish.h
@@ -0,0 +1,14 @@
+#include "quantum.h"
+
+#define LAYOUT( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B \
+) \
+{ \
+ {K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B}, \
+ {K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B}, \
+ {K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B}, \
+ {K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B} \
+}
diff --git a/keyboards/splitreus62/config.h b/keyboards/splitreus62/config.h
new file mode 100644
index 00000000000..51b4af7179f
--- /dev/null
+++ b/keyboards/splitreus62/config.h
@@ -0,0 +1,77 @@
+/*
+Copyright 2012 Jun Wako
+Copyright 2015 Jack Humbert
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xBEEF
+#define PRODUCT_ID 0xFED0
+#define DEVICE_VER 0x0001
+#define MANUFACTURER NaCly
+#define PRODUCT Splitreus62
+#define DESCRIPTION Like you axed an atreus62
+
+/* key matrix size */
+// Rows are doubled-up
+#define MATRIX_ROWS 12
+#define MATRIX_COLS 6
+
+// wiring of each half
+#define MATRIX_ROW_PINS { D3, D2, D1, D4, C6, D7 }
+#define MATRIX_COL_PINS { E6, B4, B5, B6, B2, B3 }
+
+#define DIODE_DIRECTION ROW2COL
+
+#define SPLIT_HAND_PIN F4
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
+/* 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
+
+/* ws2812 RGB LED */
+#define RGB_DI_PIN B1
+
+#define RGBLED_NUM 12 // Number of LEDs
+
+#define RGBLED_SPLIT { 6, 6 }
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
diff --git a/keyboards/splitreus62/info.json b/keyboards/splitreus62/info.json
new file mode 100644
index 00000000000..b6f32b4d272
--- /dev/null
+++ b/keyboards/splitreus62/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "splitreus62",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 15,
+ "height": 5.7,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [{"x":0, "y":0.6}, {"x":1, "y":0.6}, {"x":2, "y":0.35}, {"x":3, "y":0}, {"x":4, "y":0.35}, {"x":5, "y":0.7}, {"x":9, "y":0.7}, {"x":10, "y":0.35}, {"x":11, "y":0}, {"x":12, "y":0.35}, {"x":13, "y":0.6}, {"x":14, "y":0.6}, {"x":0, "y":1.6}, {"x":1, "y":1.6}, {"x":2, "y":1.35}, {"x":3, "y":1}, {"x":4, "y":1.35}, {"x":5, "y":1.7}, {"x":9, "y":1.7}, {"x":10, "y":1.35}, {"x":11, "y":1}, {"x":12, "y":1.35}, {"x":13, "y":1.6}, {"x":14, "y":1.6}, {"x":0, "y":2.6}, {"x":1, "y":2.6}, {"x":2, "y":2.35}, {"x":3, "y":2}, {"x":4, "y":2.35}, {"x":5, "y":2.7}, {"x":9, "y":2.7}, {"x":10, "y":2.35}, {"x":11, "y":2}, {"x":12, "y":2.35}, {"x":13, "y":2.6}, {"x":14, "y":2.6}, {"x":0, "y":3.6}, {"x":1, "y":3.6}, {"x":2, "y":3.35}, {"x":3, "y":3}, {"x":4, "y":3.35}, {"x":5, "y":3.7}, {"x":9, "y":3.7}, {"x":10, "y":3.35}, {"x":11, "y":3}, {"x":12, "y":3.35}, {"x":13, "y":3.6}, {"x":14, "y":3.6}, {"x":0, "y":4.6}, {"x":1, "y":4.6}, {"x":2, "y":4.35}, {"x":3, "y":4}, {"x":4, "y":4.35}, {"x":5, "y":4.7}, {"x":6, "y":3.95, "h":1.5}, {"x":8, "y":3.95, "h":1.5}, {"x":9, "y":4.7}, {"x":10, "y":4.35}, {"x":11, "y":4}, {"x":12, "y":4.35}, {"x":13, "y":4.6}, {"x":14, "y":4.6}]
+ }
+ }
+ }
diff --git a/keyboards/splitreus62/keymaps/default/keymap.c b/keyboards/splitreus62/keymaps/default/keymap.c
new file mode 100644
index 00000000000..0137b7e3d9f
--- /dev/null
+++ b/keyboards/splitreus62/keymaps/default/keymap.c
@@ -0,0 +1,50 @@
+/* Copyright 2019 NaCly
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_LCTL, KC_A, KC_S, KC_D, LT(1,KC_F), KC_G, KC_H, LT(2,KC_J), KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_GRV, KC_EQL, KC_BSPC, KC_DEL, KC_ENT, KC_SPC, KC_LBRC, KC_RBRC, KC_HOME, KC_END, KC_ESC
+ ),
+ //Holding F
+ [1] = LAYOUT(
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_LCTL, KC_NO, KC_NO, KC_NO, _______, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO,
+ KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_RSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_NO, KC_NO, KC_NO, KC_NO, KC_HOME, KC_END, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO
+ ),
+ //Holding J
+ [2] = LAYOUT(
+ KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, _______, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_NO, KC_NO, KC_NO, KC_NO, KC_ENT, KC_SPC, KC_NO, KC_NO, KC_NO, KC_NO, TG(3)
+ ),
+ //game layer
+ [3] = LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, LT(2,KC_J), KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_NO, KC_LALT, KC_GRV, KC_SPC, KC_BSPC, KC_DEL, KC_ENT, KC_SPC, KC_LBRC, KC_RBRC, KC_HOME, KC_END, TO(0)
+ )
+};
diff --git a/keyboards/splitreus62/readme.md b/keyboards/splitreus62/readme.md
new file mode 100644
index 00000000000..34fda47535b
--- /dev/null
+++ b/keyboards/splitreus62/readme.md
@@ -0,0 +1,13 @@
+# splitreus62
+
+A split version of the [Atreus62](https://github.com/profet23/atreus62) by Profet23, which itself is based on Phil Hagelberg's [Atreus](https://github.com/technomancy/atreus). You can copy keymaps from Atreus62 and use them with this keyboard.
+
+* Keyboard Maintainer: [NaCly](https://github.com/Na-Cly)
+* Hardware Supported: splitreus62 PCBs, Pro Micro
+* Hardware Availability: https://github.com/Na-Cly/splitreus62
+
+Make example for this keyboard (after setting up your build environment):
+
+ make splitreus62:default
+
+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).
diff --git a/keyboards/splitreus62/rules.mk b/keyboards/splitreus62/rules.mk
new file mode 100644
index 00000000000..ad3095be416
--- /dev/null
+++ b/keyboards/splitreus62/rules.mk
@@ -0,0 +1,35 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI controls
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+UNICODE_ENABLE = no # Unicode
+
+SPLIT_KEYBOARD = yes
diff --git a/keyboards/splitreus62/splitreus62.c b/keyboards/splitreus62/splitreus62.c
new file mode 100644
index 00000000000..d6ea3f91354
--- /dev/null
+++ b/keyboards/splitreus62/splitreus62.c
@@ -0,0 +1 @@
+#include "splitreus62.h"
diff --git a/keyboards/splitreus62/splitreus62.h b/keyboards/splitreus62/splitreus62.h
new file mode 100644
index 00000000000..bc6c2a9131e
--- /dev/null
+++ b/keyboards/splitreus62/splitreus62.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT(\
+ L00, L01, L02, L03, L04, L05, R05, R04, R03, R02, R01, R00, \
+ L10, L11, L12, L13, L14, L15, R15, R14, R13, R12, R11, R10, \
+ L20, L21, L22, L23, L24, L25, R25, R24, R23, R22, R21, R20, \
+ L30, L31, L32, L33, L34, L35, R35, R34, R33, R32, R31, R30, \
+ L40, L41, L42, L43, L44, L45, L55, R55, R45, R44, R43, R42, R41, R40 \
+)\
+ {\
+ { L00, L01, L02, L03, L04, L05 }, \
+ { L10, L11, L12, L13, L14, L15 }, \
+ { L20, L21, L22, L23, L24, L25 }, \
+ { L30, L31, L32, L33, L34, L35 }, \
+ { L40, L41, L42, L43, L44, L45 }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, L55 }, \
+\
+ { R00, R01, R02, R03, R04, R05 }, \
+ { R10, R11, R12, R13, R14, R15 }, \
+ { R20, R21, R22, R23, R24, R25 }, \
+ { R30, R31, R32, R33, R34, R35 }, \
+ { R40, R41, R42, R43, R44, R45 }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, R55 } \
+}
diff --git a/keyboards/staryu/config.h b/keyboards/staryu/config.h
index dc7353fcce2..dbf2b867eae 100755
--- a/keyboards/staryu/config.h
+++ b/keyboards/staryu/config.h
@@ -65,7 +65,6 @@ along with this program. If not, see .
#define BACKLIGHT_PINS { C2, C7, D5, D6, B0 }
#define BACKLIGHT_LED_COUNT 5
#define BACKLIGHT_LEVELS 10
-#define BACKLIGHT_ON_STATE 1
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
diff --git a/keyboards/switchplate/southpaw_65/config.h b/keyboards/switchplate/southpaw_65/config.h
new file mode 100644
index 00000000000..58df7657c54
--- /dev/null
+++ b/keyboards/switchplate/southpaw_65/config.h
@@ -0,0 +1,239 @@
+/* Copyright 2019
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x4084
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Switchplate Peripherals
+#define PRODUCT Southpaw Extended 65%
+#define DESCRIPTION A Left Hand Number Pad 65% Keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 19
+
+/*
+ * 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
+
+#define BACKLIGHT_PIN B5
+#define BACKLIGHT_LEVELS 10
+// #define BACKLIGHT_BREATHING
+
+#define RGB_DI_PIN C7
+#define RGBLED_NUM 9
+#define RGBLIGHT_ANIMATIONS
+// #ifdef RGB_DI_PIN
+// #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
+// #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
+
+/* number of backlight levels */
+
+/* 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 userful 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
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+/* defined by default; to change, uncomment and set to the combination you want */
+// #define IS_COMMAND() (get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)))
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP1 H
+//#define MAGIC_KEY_HELP2 SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0_ALT1 ESC
+//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER PAUSE
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+/*
+ * MIDI options
+ */
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+//#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 1
+
+/*
+ * 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
+*/
+
+/* Bootmagic Lite key configuration */
+// #define BOOTMAGIC_LITE_ROW 0
+// #define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/switchplate/southpaw_65/dev.md b/keyboards/switchplate/southpaw_65/dev.md
new file mode 100644
index 00000000000..08a333f2d31
--- /dev/null
+++ b/keyboards/switchplate/southpaw_65/dev.md
@@ -0,0 +1,141 @@
+# Southpaw Extended 65%
+
+Development docs covering the following:
+- Kimera core
+- RGB
+- Backlight
+
+## Kimera core
+
+
+What little available info that was available for the qmk port
+- atmega32u4 16Mhz
+- board seems to have a 6Mhz crystal
+- 2x PCA9555 I2C IO expander
+
+Links:
+- [Schematic, BOM, Gerbers](/kairyu/kimera/blob/master/kimera_core)
+- [Original firmware](https://github.com/kairyu/tmk_keyboard_custom/tree/master/keyboard/kimera)
+
+```c
+/*
+Kimera_core_v1.0 Components
+
+ U1 (atmega32u4)
+ ,----------------.
+ TX --| TX0(PD3) RAW |--
+ RX --| RX1(PD2) GND |--
+ --| GND RESET |-- RST
+ --| GND VCC |--
+ SDA --| 2(PD1) (PF4)A3 |--
+ SCL --| 3(PD0) (PF5)A2 |--
+ (INT) --| 4(PD4) (PF6)A1 |--
+ --| 5(PC6) (PF7)A0 |--
+ --| 6(PD7) (PB1)15 |-- SCK
+ LED2 --| 7(PE6) (PB3)14 |-- MISO
+ LED1 --| 8(PB4) (PB2)16 |-- MOSI
+ LED3 --| 9(PB5) (PB6)10 |-- LED4
+ `----------------'
+
+ IC1 (PCA9555) IC2 (PCA9555)
+ ,----------. ,----------.
+ SDA --| SDA P00 |-- P1 SDA --| SDA P00 |-- P17
+ SCL --| SCL P01 |-- P2 SCL --| SCL P01 |-- P18
+ INT --| INT P02 |-- P3 INT --| INT P02 |-- P19
+ | P03 |-- P4 | P03 |-- P20
+ GND --| A0 P04 |-- P5 VCC --| A0 P04 |-- P21
+ SJ1 --| A1 P05 |-- P6 SJ1 --| A1 P05 |-- P22
+ SJ2 --| A2 P06 |-- P7 SJ2 --| A2 P06 |-- P23
+ | P07 |-- P8 | P07 |-- P24
+ | | | |
+ | P10 |-- P9 | P10 |-- P25
+ | P11 |-- P10 | P11 |-- P26
+ | P12 |-- P11 | P12 |-- P27
+ | P13 |-- P12 | P13 |-- P28
+ | P14 |-- P13 | P14 |-- P29
+ | P15 |-- P14 | P15 |-- P30
+ | P16 |-- P15 | P16 |-- P31
+ | P17 |-- P16 | P17 |-- P32
+ `----------' `----------'
+*/
+
+```
+
+### Bootloader
+Default bootloader is `atmel-dfu`.
+Reboot to bootloader via magnetic switch next to icsp header.
+Flash using regular dfu methods.
+
+### Southpaw Extended 65 pin mappings
+Taken from [kimera-config.json](https://github.com/kairyu/tkg/blob/master/keyboard/config/kimera-config.json)
+
+ "row_mapping": [ 2, 3, 4, 5, 6 ],
+ "col_mapping": [ 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 ],
+
+# RGB
+- PIN C7
+- Number of RGB LED 7
+
+# Backlight
+- PIN B5
+
+# Capslock
+- PIN B6
+
+# Numlock
+- PIN C6
+
+## Assumptions
+### Pin/Port mappings
+- All cols are on the same IC
+- All rows are on the same IC and port
+- Pins mapped sequentially
+- Each port only does row or column not a mixture of both
+ - No need to have complex port config
+ -
+
+| ROW index | Kimera Pin | PCA9555 |
+| ----------|------------|-------------------|
+| 0 | 2 | IC1 Port 0 pin 1 |
+| 1 | 3 | IC1 Port 0 pin 2 |
+| 2 | 4 | IC1 Port 0 pin 3 |
+| 3 | 5 | IC1 Port 0 pin 4 |
+| 4 | 6 | IC1 Port 0 pin 5 |
+
+- Safe enough to assume `row_index == pin`
+
+
+| COL index | Kimera Pin | PCA9555 |
+| ----------|------------|-------------------|
+| 0 | 13 | IC1 Port 1 pin 4 |
+| 1 | 14 | IC1 Port 1 pin 5 |
+| 2 | 15 | IC1 Port 1 pin 6 |
+| 3 | 16 | IC1 Port 1 pin 7 |
+| 4 | 17 | IC2 Port 0 pin 0 |
+| 5 | 18 | IC2 Port 0 pin 1 |
+| 6 | 19 | IC2 Port 0 pin 2 |
+| 7 | 20 | IC2 Port 0 pin 3 |
+| 8 | 21 | IC2 Port 0 pin 4 |
+| 9 | 22 | IC2 Port 0 pin 5 |
+| 10 | 23 | IC2 Port 0 pin 6 |
+| 11 | 24 | IC2 Port 0 pin 7 |
+| 12 | 25 | IC2 Port 1 pin 0 |
+| 13 | 26 | IC2 Port 1 pin 1 |
+| 14 | 27 | IC2 Port 1 pin 2 |
+| 15 | 28 | IC2 Port 1 pin 3 |
+| 16 | 29 | IC2 Port 1 pin 4 |
+| 17 | 30 | IC2 Port 1 pin 5 |
+| 18 | 31 | IC2 Port 1 pin 6 |
+
+- Need to read both ICs and corresponding port to compile the correct column data
+- All pins are mapped sequentially
+- maps to the usual practice of reading matrix columns
+- Needs uint32_t to read 19 columns of data
+
+## Notes
+[pca9555 datasheet](https://www.ti.com/lit/ds/symlink/pca9555.pdf)
+
+- Other Kimera based boards with non sequential pin mappings, pins mapped across ICs, or mixed row/col configs will need more complicated `pin -> i2c_addr,port,pin` logic as well as rather more complex pin functions.
+
+## Return to stock firmware
+To return back to stock TMK firmware, use [programming guide provided by Reconsiderit](https://geekhack.org/index.php?topic=92344.msg2625784#msg2625784)
diff --git a/keyboards/switchplate/southpaw_65/info.json b/keyboards/switchplate/southpaw_65/info.json
new file mode 100644
index 00000000000..e00f3a48072
--- /dev/null
+++ b/keyboards/switchplate/southpaw_65/info.json
@@ -0,0 +1,21 @@
+{
+ "keyboard_name": "Southpaw Extended 65%",
+ "url": "https://geekhack.org/index.php?topic=92344.0",
+ "maintainer": "qmk",
+ "width": 20,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_all": {
+ "key_count": 91,
+ "layout": [{"label":"Num Lock", "x":0, "y":0}, {"label":"/", "x":1, "y":0}, {"label":"*", "x":2, "y":0}, {"label":"-", "x":3, "y":0}, {"label":"Esc", "x":4, "y":0}, {"label":"!", "x":5, "y":0}, {"label":"@", "x":6, "y":0}, {"label":"#", "x":7, "y":0}, {"label":"$", "x":8, "y":0}, {"label":"%", "x":9, "y":0}, {"label":"^", "x":10, "y":0}, {"label":"&", "x":11, "y":0}, {"label":"*", "x":12, "y":0}, {"label":"(", "x":13, "y":0}, {"label":")", "x":14, "y":0}, {"label":"_", "x":15, "y":0}, {"label":"+", "x":16, "y":0}, {"label":"Backspace", "x":17, "y":0}, {"label":"Backspace", "x":18, "y":0}, {"label":"Home", "x":19, "y":0}, {"label":"7", "x":0, "y":1}, {"label":"8", "x":1, "y":1}, {"label":"9", "x":2, "y":1}, {"label":"+", "x":3, "y":1}, {"label":"Tab", "x":4, "y":1, "w":1.5}, {"label":"Q", "x":5.5, "y":1}, {"label":"W", "x":6.5, "y":1}, {"label":"E", "x":7.5, "y":1}, {"label":"R", "x":8.5, "y":1}, {"label":"T", "x":9.5, "y":1}, {"label":"Y", "x":10.5, "y":1}, {"label":"U", "x":11.5, "y":1}, {"label":"I", "x":12.5, "y":1}, {"label":"O", "x":13.5, "y":1}, {"label":"P", "x":14.5, "y":1}, {"label":"{", "x":15.5, "y":1}, {"label":"}", "x":16.5, "y":1}, {"label":"|", "x":17.5, "y":1, "w":1.5}, {"label":"End", "x":19, "y":1}, {"label":"4", "x":0, "y":2}, {"label":"5", "x":1, "y":2}, {"label":"6", "x":2, "y":2}, {"label":"+", "x":3, "y":2}, {"label":"Caps Lock", "x":4, "y":2, "w":1.75}, {"label":"A", "x":5.75, "y":2}, {"label":"S", "x":6.75, "y":2}, {"label":"D", "x":7.75, "y":2}, {"label":"F", "x":8.75, "y":2}, {"label":"G", "x":9.75, "y":2}, {"label":"H", "x":10.75, "y":2}, {"label":"J", "x":11.75, "y":2}, {"label":"K", "x":12.75, "y":2}, {"label":"L", "x":13.75, "y":2}, {"label":":", "x":14.75, "y":2}, {"label":"\"", "x":15.75, "y":2}, {"label":"~", "x":16.75, "y":2}, {"label":"Enter", "x":17.75, "y":2, "w":1.25}, {"label":"Page Up", "x":19, "y":2}, {"label":"1", "x":0, "y":3}, {"label":"2", "x":1, "y":3}, {"label":"3", "x":2, "y":3}, {"label":"Num Enter", "x":3, "y":3}, {"label":"LShift", "x":4, "y":3, "w":1.25}, {"label":"|", "x":5.25, "y":3}, {"label":"Z", "x":6.25, "y":3}, {"label":"X", "x":7.25, "y":3}, {"label":"C", "x":8.25, "y":3}, {"label":"V", "x":9.25, "y":3}, {"label":"B", "x":10.25, "y":3}, {"label":"N", "x":11.25, "y":3}, {"label":"M", "x":12.25, "y":3}, {"label":"<", "x":13.25, "y":3}, {"label":">", "x":14.25, "y":3}, {"label":"?", "x":15.25, "y":3}, {"label":"RShift", "x":16.25, "y":3, "w":1.75}, {"label":"Up", "x":18, "y":3}, {"label":"Page Down", "x":19, "y":3}, {"label":"0", "x":0, "y":4}, {"label":"0", "x":1, "y":4}, {"label":".", "x":2, "y":4}, {"label":"Num Enter", "x":3, "y":4}, {"label":"LCtrl", "x":4, "y":4, "w":1.25}, {"label":"Win", "x":5.25, "y":4, "w":1.25}, {"label":"LAlt", "x":6.5, "y":4, "w":1.25}, {"label":"Space", "x":7.75, "y":4, "w":6.25}, {"label":"RAlt", "x":14, "y":4}, {"label":"RCtrl", "x":15, "y":4}, {"label":"Fn0", "x":16, "y":4}, {"label":"Left", "x":17, "y":4}, {"label":"Down", "x":18, "y":4}, {"label":"Right", "x":19, "y":4}]
+ },
+ "LAYOUT_ansi": {
+ "key_count": 85,
+ "layout": [{"label":"Num Lock", "x":0, "y":0}, {"label":"/", "x":1, "y":0}, {"label":"*", "x":2, "y":0}, {"label":"-", "x":3, "y":0}, {"label":"Esc", "x":4, "y":0}, {"label":"!", "x":5, "y":0}, {"label":"@", "x":6, "y":0}, {"label":"#", "x":7, "y":0}, {"label":"$", "x":8, "y":0}, {"label":"%", "x":9, "y":0}, {"label":"^", "x":10, "y":0}, {"label":"&", "x":11, "y":0}, {"label":"*", "x":12, "y":0}, {"label":"(", "x":13, "y":0}, {"label":")", "x":14, "y":0}, {"label":"_", "x":15, "y":0}, {"label":"+", "x":16, "y":0}, {"label":"Backspace", "x":17, "y":0, "w":2}, {"label":"Home", "x":19, "y":0}, {"label":"7", "x":0, "y":1}, {"label":"8", "x":1, "y":1}, {"label":"9", "x":2, "y":1}, {"label":"+", "x":3, "y":1, "h":2}, {"label":"Tab", "x":4, "y":1, "w":1.5}, {"label":"Q", "x":5.5, "y":1}, {"label":"W", "x":6.5, "y":1}, {"label":"E", "x":7.5, "y":1}, {"label":"R", "x":8.5, "y":1}, {"label":"T", "x":9.5, "y":1}, {"label":"Y", "x":10.5, "y":1}, {"label":"U", "x":11.5, "y":1}, {"label":"I", "x":12.5, "y":1}, {"label":"O", "x":13.5, "y":1}, {"label":"P", "x":14.5, "y":1}, {"label":"{", "x":15.5, "y":1}, {"label":"}", "x":16.5, "y":1}, {"label":"|", "x":17.5, "y":1, "w":1.5}, {"label":"End", "x":19, "y":1}, {"label":"4", "x":0, "y":2}, {"label":"5", "x":1, "y":2}, {"label":"6", "x":2, "y":2}, {"label":"Caps Lock", "x":4, "y":2, "w":1.75}, {"label":"A", "x":5.75, "y":2}, {"label":"S", "x":6.75, "y":2}, {"label":"D", "x":7.75, "y":2}, {"label":"F", "x":8.75, "y":2}, {"label":"G", "x":9.75, "y":2}, {"label":"H", "x":10.75, "y":2}, {"label":"J", "x":11.75, "y":2}, {"label":"K", "x":12.75, "y":2}, {"label":"L", "x":13.75, "y":2}, {"label":":", "x":14.75, "y":2}, {"label":"\"", "x":15.75, "y":2}, {"label":"Enter", "x":16.75, "y":2, "w":2.25}, {"label":"Page Up", "x":19, "y":2}, {"label":"1", "x":0, "y":3}, {"label":"2", "x":1, "y":3}, {"label":"3", "x":2, "y":3}, {"label":"Num Enter", "x":3, "y":3, "h":2}, {"label":"LShift", "x":4, "y":3, "w":2.25}, {"label":"Z", "x":6.25, "y":3}, {"label":"X", "x":7.25, "y":3}, {"label":"C", "x":8.25, "y":3}, {"label":"V", "x":9.25, "y":3}, {"label":"B", "x":10.25, "y":3}, {"label":"N", "x":11.25, "y":3}, {"label":"M", "x":12.25, "y":3}, {"label":"<", "x":13.25, "y":3}, {"label":">", "x":14.25, "y":3}, {"label":"?", "x":15.25, "y":3}, {"label":"RShift", "x":16.25, "y":3, "w":1.75}, {"label":"Up", "x":18, "y":3}, {"label":"Page Down", "x":19, "y":3}, {"label":"0", "x":0, "y":4, "w":2}, {"label":".", "x":2, "y":4}, {"label":"LCtrl", "x":4, "y":4, "w":1.25}, {"label":"Win", "x":5.25, "y":4, "w":1.25}, {"label":"LAlt", "x":6.5, "y":4, "w":1.25}, {"label":"Space", "x":7.75, "y":4, "w":6.25}, {"label":"RAlt", "x":14, "y":4}, {"label":"RCtrl", "x":15, "y":4}, {"label":"Fn0", "x":16, "y":4}, {"label":"Left", "x":17, "y":4}, {"label":"Down", "x":18, "y":4}, {"label":"Right", "x":19, "y":4}]
+ },
+ "LAYOUT_iso": {
+ "key_count": 86,
+ "layout": [{"label":"Num Lock", "x":0, "y":0}, {"label":"/", "x":1, "y":0}, {"label":"*", "x":2, "y":0}, {"label":"-", "x":3, "y":0}, {"label":"Esc", "x":4, "y":0}, {"label":"!", "x":5, "y":0}, {"label":"@", "x":6, "y":0}, {"label":"#", "x":7, "y":0}, {"label":"$", "x":8, "y":0}, {"label":"%", "x":9, "y":0}, {"label":"^", "x":10, "y":0}, {"label":"&", "x":11, "y":0}, {"label":"*", "x":12, "y":0}, {"label":"(", "x":13, "y":0}, {"label":")", "x":14, "y":0}, {"label":"_", "x":15, "y":0}, {"label":"+", "x":16, "y":0}, {"label":"Backspace", "x":17, "y":0, "w":2}, {"label":"Home", "x":19, "y":0}, {"label":"7", "x":0, "y":1}, {"label":"8", "x":1, "y":1}, {"label":"9", "x":2, "y":1}, {"label":"+", "x":3, "y":1, "h":2}, {"label":"Tab", "x":4, "y":1, "w":1.5}, {"label":"Q", "x":5.5, "y":1}, {"label":"W", "x":6.5, "y":1}, {"label":"E", "x":7.5, "y":1}, {"label":"R", "x":8.5, "y":1}, {"label":"T", "x":9.5, "y":1}, {"label":"Y", "x":10.5, "y":1}, {"label":"U", "x":11.5, "y":1}, {"label":"I", "x":12.5, "y":1}, {"label":"O", "x":13.5, "y":1}, {"label":"P", "x":14.5, "y":1}, {"label":"{", "x":15.5, "y":1}, {"label":"}", "x":16.5, "y":1}, {"label":"End", "x":19, "y":1}, {"label":"4", "x":0, "y":2}, {"label":"5", "x":1, "y":2}, {"label":"6", "x":2, "y":2}, {"label":"Caps Lock", "x":4, "y":2, "w":1.75}, {"label":"A", "x":5.75, "y":2}, {"label":"S", "x":6.75, "y":2}, {"label":"D", "x":7.75, "y":2}, {"label":"F", "x":8.75, "y":2}, {"label":"G", "x":9.75, "y":2}, {"label":"H", "x":10.75, "y":2}, {"label":"J", "x":11.75, "y":2}, {"label":"K", "x":12.75, "y":2}, {"label":"L", "x":13.75, "y":2}, {"label":":", "x":14.75, "y":2}, {"label":"\"", "x":15.75, "y":2}, {"label":"~", "x":16.75, "y":2}, {"label":"Enter", "x":17.75, "y":1, "w":1.25, "h":2}, {"label":"Page Up", "x":19, "y":2}, {"label":"1", "x":0, "y":3}, {"label":"2", "x":1, "y":3}, {"label":"3", "x":2, "y":3}, {"label":"Num Enter", "x":3, "y":3, "h":2}, {"label":"LShift", "x":4, "y":3, "w":1.25}, {"label":"|", "x":5.25, "y":3}, {"label":"Z", "x":6.25, "y":3}, {"label":"X", "x":7.25, "y":3}, {"label":"C", "x":8.25, "y":3}, {"label":"V", "x":9.25, "y":3}, {"label":"B", "x":10.25, "y":3}, {"label":"N", "x":11.25, "y":3}, {"label":"M", "x":12.25, "y":3}, {"label":"<", "x":13.25, "y":3}, {"label":">", "x":14.25, "y":3}, {"label":"?", "x":15.25, "y":3}, {"label":"RShift", "x":16.25, "y":3, "w":1.75}, {"label":"Up", "x":18, "y":3}, {"label":"Page Down", "x":19, "y":3}, {"label":"0", "x":0, "y":4, "w":2}, {"label":".", "x":2, "y":4}, {"label":"LCtrl", "x":4, "y":4, "w":1.25}, {"label":"Win", "x":5.25, "y":4, "w":1.25}, {"label":"LAlt", "x":6.5, "y":4, "w":1.25}, {"label":"Space", "x":7.75, "y":4, "w":6.25}, {"label":"RAlt", "x":14, "y":4}, {"label":"RCtrl", "x":15, "y":4}, {"label":"Fn0", "x":16, "y":4}, {"label":"Left", "x":17, "y":4}, {"label":"Down", "x":18, "y":4}, {"label":"Right", "x":19, "y":4}]
+ }
+ }
+}
diff --git a/keyboards/switchplate/southpaw_65/keymaps/default/keymap.c b/keyboards/switchplate/southpaw_65/keymaps/default/keymap.c
new file mode 100644
index 00000000000..4be4bb5e7af
--- /dev/null
+++ b/keyboards/switchplate/southpaw_65/keymaps/default/keymap.c
@@ -0,0 +1,31 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_all(
+/* ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐ */
+ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_HOME,
+/* ├─────────┼─────────┼─────────┼─────────┼─────────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴─────────┼─────────┤ */
+ KC_P7, KC_P8, KC_P9, KC_PPLS, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END,
+/* ├─────────┼─────────┼─────────┼─────────┼──────────────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬───────────┼─────────┤ */
+ KC_P4, KC_P5, KC_P6, KC_PPLS, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGUP,
+/* ├─────────┼─────────┼─────────┼─────────┼───────────┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴─────────┴─┬─────────┼─────────┤ */
+ KC_P1, KC_P2, KC_P3, KC_PENT, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+/* ├─────────┼─────────┼─────────┼─────────┼───────────┼─────────┴─┬───────┴───┬─────┴─────────┴─────────┴─────────┴─────────┴─────────┴───────┬─┴───────┬─┴───────┬─┴───────┬─────────┼─────────┼─────────┤ */
+ KC_P0, KC_P0, KC_PDOT, KC_PENT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+/* └─────────┴─────────┴─────────┴─────────┴───────────┴───────────┴───────────┴───────────────────────────────────────────────────────────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘ */
+ ),
+
+ [1] = LAYOUT_all(
+/* ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐ */
+ _______, _______, _______, _______, KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL, KC_INS,
+/* ├─────────┼─────────┼─────────┼─────────┼─────────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴─────────┼─────────┤ */
+ _______, _______, _______, _______, RESET, BL_TOGG, BL_INC, BL_DEC, BL_BRTG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+/* ├─────────┼─────────┼─────────┼─────────┼──────────────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬───────────┼─────────┤ */
+ _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, EEP_RST, _______,
+/* ├─────────┼─────────┼─────────┼─────────┼───────────┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴─────────┴─┬─────────┼─────────┤ */
+ _______, _______, _______, _______, KC_LSFT, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, _______, _______, _______, _______, _______, KC_RSFT, _______, _______,
+/* ├─────────┼─────────┼─────────┼─────────┼───────────┼─────────┴─┬───────┴───┬─────┴─────────┴─────────┴─────────┴─────────┴─────────┴───────┬─┴───────┬─┴───────┬─┴───────┬─────────┼─────────┼─────────┤ */
+ _______, _______, _______, _______, KC_LCTL, _______, KC_LALT, _______, KC_RALT, KC_RCTL, KC_TRNS, _______, _______, _______
+/* └─────────┴─────────┴─────────┴─────────┴───────────┴───────────┴───────────┴───────────────────────────────────────────────────────────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘ */
+ ),
+};
diff --git a/keyboards/switchplate/southpaw_65/keymaps/default_ansi/keymap.c b/keyboards/switchplate/southpaw_65/keymaps/default_ansi/keymap.c
new file mode 100644
index 00000000000..bdd2d5129e9
--- /dev/null
+++ b/keyboards/switchplate/southpaw_65/keymaps/default_ansi/keymap.c
@@ -0,0 +1,31 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_ansi(
+/* ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐ */
+ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+/* ├─────────┼─────────┼─────────┼─────────┼─────────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬──────────────┼─────────┤ */
+ KC_P7, KC_P8, KC_P9, KC_PPLS, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END,
+/* ├─────────┼─────────┼─────────┤ ├──────────────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──────────────├─────────┤ */
+ KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
+/* ├─────────┼─────────┼─────────┼─────────┼─────────────────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───────────┬─────────┼─────────┤ */
+ KC_P1, KC_P2, KC_P3, KC_PENT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+/* ├─────────┴─────────┬─────────┤ ├───────────┬─────────┴─┬───────┴───┬─────┴─────────┴─────────┴─────────┴─────────┴─────────┴───────┬─┴───────┬─┴───────┬─┴───────┬─────────┼─────────┼─────────┤ */
+ KC_P0, KC_PDOT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+/* └───────────────────┴─────────┴─────────┴───────────┴───────────┴───────────┴───────────────────────────────────────────────────────────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘ */
+ ),
+
+ [1] = LAYOUT_ansi(
+/* ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┐ */
+ _______, _______, _______, _______, KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS,
+/* ├─────────┼─────────┼─────────┼─────────┼─────────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬──────────────┼─────────┤ */
+ _______, _______, _______, _______, RESET, BL_TOGG, BL_INC, BL_DEC, BL_BRTG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+/* ├─────────┼─────────┼─────────┤ ├──────────────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──────────────├─────────┤ */
+ _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, _______, _______, _______, _______, _______, _______, EEP_RST, _______,
+/* ├─────────┼─────────┼─────────┼─────────┼─────────────────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───────────┬─────────┼─────────┤ */
+ _______, _______, _______, _______, KC_LSFT, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, _______, _______, _______, _______, _______, KC_RSFT, _______, _______,
+/* ├─────────┴─────────┬─────────┤ ├───────────┬─────────┴─┬───────┴───┬─────┴─────────┴─────────┴─────────┴─────────┴─────────┴───────┬─┴───────┬─┴───────┬─┴───────┬─────────┼─────────┼─────────┤ */
+ _______, _______, KC_LCTL, _______, KC_LALT, _______, KC_RALT, KC_RCTL, KC_TRNS, _______, _______, _______
+/* └───────────────────┴─────────┴─────────┴───────────┴───────────┴───────────┴───────────────────────────────────────────────────────────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘ */
+ ),
+};
diff --git a/keyboards/switchplate/southpaw_65/keymaps/default_iso/keymap.c b/keyboards/switchplate/southpaw_65/keymaps/default_iso/keymap.c
new file mode 100644
index 00000000000..a8f080ca946
--- /dev/null
+++ b/keyboards/switchplate/southpaw_65/keymaps/default_iso/keymap.c
@@ -0,0 +1,32 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_iso(
+/* ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬───────────────────┬─────────┐ */
+ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+/* ├─────────┼─────────┼─────────┼─────────┼─────────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬──────────────┼─────────┤ */
+ KC_P7, KC_P8, KC_P9, KC_PPLS, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGUP,
+/* ├─────────┼─────────┼─────────┤ ├──────────────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬ ├─────────┤ */
+ KC_P4, KC_P5, KC_P6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN,
+/* ├─────────┼─────────┼─────────┼─────────┼───────────┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴─────────┴─┬─────────┼─────────┤ */
+ KC_P1, KC_P2, KC_P3, KC_PENT, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+/* ├─────────┴─────────┼─────────┤ ├───────────┼─────────┴─┬───────┴───┬─────┴─────────┴─────────┴─────────┴─────────┴─────────┴───────┬─┴───────┬─┴───────┬─┴───────┬─────────┼─────────┼─────────┤ */
+ KC_P0, KC_PDOT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+/* └───────────────────┴─────────┴─────────┴───────────┴───────────┴───────────┴───────────────────────────────────────────────────────────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘ */
+ ),
+
+ [1] = LAYOUT_iso(
+/* ┌─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬─────────┬───────────────────┬─────────┐ */
+ _______, _______, _______, _______, KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS,
+/* ├─────────┼─────────┼─────────┼─────────┼─────────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬────┴────┬──────────────┼─────────┤ */
+ _______, _______, _______, _______, RESET, BL_TOGG, BL_INC, BL_DEC, BL_BRTG, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+/* ├─────────┼─────────┼─────────┤ ├──────────────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬──────┴──┬ ├─────────┤ */
+ _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, EEP_RST, _______,
+/* ├─────────┼─────────┼─────────┼─────────┼───────────┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴───┬─────┴─────────┴─┬─────────┼─────────┤ */
+ _______, _______, _______, _______, KC_LSFT, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, _______, _______, _______, _______, _______, KC_RSFT, _______, _______,
+/* ├─────────┴─────────┼─────────┤ ├───────────┼─────────┴─┬───────┴───┬─────┴─────────┴─────────┴─────────┴─────────┴─────────┴───────┬─┴───────┬─┴───────┬─┴───────┬─────────┼─────────┼─────────┤ */
+ _______, _______, KC_LCTL, _______, KC_LALT, _______, KC_RALT, KC_RCTL, KC_TRNS, _______, _______, _______
+/* └───────────────────┴─────────┴─────────┴───────────┴───────────┴───────────┴───────────────────────────────────────────────────────────────┴─────────┴─────────┴─────────┴─────────┴─────────┴─────────┘ */
+ )
+};
diff --git a/keyboards/switchplate/southpaw_65/matrix.c b/keyboards/switchplate/southpaw_65/matrix.c
new file mode 100644
index 00000000000..e701d274f03
--- /dev/null
+++ b/keyboards/switchplate/southpaw_65/matrix.c
@@ -0,0 +1,95 @@
+/* Copyright 2019
+ *
+ * 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 .
+ */
+#include
+#include
+#include
+#include
+#include "matrix.h"
+#include "pca9555.h"
+#include "quantum.h"
+
+#include "debug.h"
+
+// PCA9555 slave addresses
+#define IC1 0x20
+#define IC2 0x21
+
+//_____Utility funcs___________________________________________________________
+
+static void init_pins(void) {
+ // init all rows - IC1 port0 input
+ pca9555_set_config(IC1, PCA9555_PORT0, ALL_INPUT); // same as initial state
+
+ // init all cols high - IC2 all input
+ pca9555_set_config(IC1, PCA9555_PORT1, ALL_INPUT); // same as initial state
+ pca9555_set_config(IC2, PCA9555_PORT0, ALL_INPUT); // same as initial state
+ pca9555_set_config(IC2, PCA9555_PORT1, ALL_INPUT); // same as initial state
+
+ pca9555_set_output(IC1, PCA9555_PORT0, ALL_LOW);
+}
+
+static void select_row(uint8_t row) {
+ // For the Southpaw Ext 65% pins 1-6 are used for the rows
+ uint8_t pin = row;
+ uint8_t mask = 2 << pin;
+
+ pca9555_set_config(IC1, PCA9555_PORT0, ALL_INPUT & (~mask));
+}
+
+static uint32_t read_cols(void) {
+ //Read column inputs. Pins 13-31 are used. Split across both ICs but they are sequential
+ uint32_t state_1 = pca9555_readPins(IC1, PCA9555_PORT1);
+ uint32_t state_2 = pca9555_readPins(IC2, PCA9555_PORT0);
+ uint32_t state_3 = pca9555_readPins(IC2, PCA9555_PORT1);
+
+ uint32_t state = (((state_3 & 0b01111111) << 12) | (state_2 << 4) | ((state_1 & 0b11110000) >> 4));
+ return ~state;
+}
+
+static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) {
+ // Store last value of row prior to reading
+ matrix_row_t last_row_value = current_matrix[current_row];
+
+ // Clear data in matrix row
+ current_matrix[current_row] = 0;
+
+ // Select row and wait for row selection to stabilize
+ select_row(current_row);
+ // Skip the wait_us(30); as i2c is slow enough to debounce the io changes
+
+ current_matrix[current_row] = read_cols();
+
+ // No need to Unselect row as the next `select_row` will blank everything
+
+ return (last_row_value != current_matrix[current_row]);
+}
+
+//_____CUSTOM MATRIX IMPLEMENTATION____________________________________________________
+
+void matrix_init_custom(void) {
+ pca9555_init(IC1);
+ pca9555_init(IC2);
+
+ init_pins();
+}
+
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
+ bool changed = false;
+ for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) {
+ changed |= read_cols_on_row(current_matrix, current_row);
+ }
+ return changed;
+}
diff --git a/keyboards/switchplate/southpaw_65/readme.md b/keyboards/switchplate/southpaw_65/readme.md
new file mode 100644
index 00000000000..3566744b261
--- /dev/null
+++ b/keyboards/switchplate/southpaw_65/readme.md
@@ -0,0 +1,23 @@
+# Southpaw Extended 65%
+
+
+
+Left Hand Number Pad Keyboard with 85 Keys & RGB LED Underglow
+- Designed by Reconsiderit
+- Up to 91 keys
+- iso and ansi support
+- Uses Kimera core
+
+* Keyboard Maintainer: QMK Community
+* Hardware Supported: Southpaw Extended 65%
+* Hardware Availability: [Geekhack GB Thread](https://geekhack.org/index.php?topic=92344.0)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make switchplate/southpaw_65:default_ansi
+
+Install examples:
+
+ make switchplate/southpaw_65:default_ansi: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).
diff --git a/keyboards/switchplate/southpaw_65/rules.mk b/keyboards/switchplate/southpaw_65/rules.mk
new file mode 100644
index 00000000000..3ede910c3ea
--- /dev/null
+++ b/keyboards/switchplate/southpaw_65/rules.mk
@@ -0,0 +1,41 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+LTO_ENABLE = yes
+
+# custom matrix setup
+CUSTOM_MATRIX = lite
+
+VPATH += drivers/gpio
+SRC += pca9555.c matrix.c
+QUANTUM_LIB_SRC += i2c_master.c
diff --git a/keyboards/switchplate/southpaw_65/southpaw_65.c b/keyboards/switchplate/southpaw_65/southpaw_65.c
new file mode 100644
index 00000000000..78df3b6653d
--- /dev/null
+++ b/keyboards/switchplate/southpaw_65/southpaw_65.c
@@ -0,0 +1,30 @@
+/* Copyright 2019
+ *
+ * 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 .
+ */
+#include "southpaw_65.h"
+
+void keyboard_pre_init_kb(void) {
+ setPinOutput(B6);
+
+ keyboard_pre_init_user();
+}
+
+bool led_update_kb(led_t led_state) {
+ bool res = led_update_user(led_state);
+ if(res) {
+ writePin(B6, !led_state.caps_lock);
+ }
+ return res;
+}
diff --git a/keyboards/switchplate/southpaw_65/southpaw_65.h b/keyboards/switchplate/southpaw_65/southpaw_65.h
new file mode 100644
index 00000000000..a2b58d8c153
--- /dev/null
+++ b/keyboards/switchplate/southpaw_65/southpaw_65.h
@@ -0,0 +1,69 @@
+/* Copyright 2019
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "quantum.h"
+#define ____ KC_NO
+
+/* This 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_all( \
+ K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, K118, K514, K119, \
+ K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219, \
+ K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, K318, K319, \
+ K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, K417, K418, K419, \
+ K501, K502, K503, K504, K505, K506, K507, K510, K515, K516, K513, K517, K518, K519 \
+) { \
+ { K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119 }, \
+ { K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219 }, \
+ { K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, K318, K319 }, \
+ { K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, K417, K418, K419 }, \
+ { K501, K502, K503, K504, K505, K506, K507, ____, ____, K510, ____, ____, K513, K514, K515, K516, K517, K518, K519 } \
+}
+
+#define LAYOUT_ansi( \
+ K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119, \
+ K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219, \
+ K301, K302, K303, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K318, K319, \
+ K401, K402, K403, K404, K405, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, K417, K418, K419, \
+ K501, K503, K505, K506, K507, K510, K515, K516, K513, K517, K518, K519 \
+) { \
+ { K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119 }, \
+ { K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219 }, \
+ { K301, K302, K303, ____, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, ____, K318, K319 }, \
+ { K401, K402, K403, K404, K405, ____, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, K417, K418, K419 }, \
+ { K501, ____, K503, ____, K505, K506, K507, ____, ____, K510, ____, ____, K513, ____, K515, K516, K517, K518, K519 } \
+}
+
+#define LAYOUT_iso( \
+ K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119, \
+ K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, K219, \
+ K301, K302, K303, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, K318, K319, \
+ K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, K417, K418, K419, \
+ K501, K503, K505, K506, K507, K510, K515, K516, K513, K517, K518, K519 \
+) { \
+ { K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119 }, \
+ { K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, ____, K219 }, \
+ { K301, K302, K303, ____, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, K318, K319 }, \
+ { K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, K417, K418, K419 }, \
+ { K501, ____, K503, ____, K505, K506, K507, ____, ____, K510, ____, ____, K513, ____, K515, K516, K517, K518, K519 } \
+}
diff --git a/keyboards/switchplate/southpaw_fullsize/config.h b/keyboards/switchplate/southpaw_fullsize/config.h
index adbb4f8db43..2d4fb9a9713 100644
--- a/keyboards/switchplate/southpaw_fullsize/config.h
+++ b/keyboards/switchplate/southpaw_fullsize/config.h
@@ -133,10 +133,8 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
/* Bootmagic Lite key configuration */
// #define BOOTMAGIC_LITE_ROW 0
diff --git a/keyboards/tada68/keymaps/dlg/keymap.c b/keyboards/tada68/keymaps/dlg/keymap.c
index 9cd6cb2f129..32532e0f3f9 100755
--- a/keyboards/tada68/keymaps/dlg/keymap.c
+++ b/keyboards/tada68/keymaps/dlg/keymap.c
@@ -3,11 +3,8 @@
#define _BL 0
#define _FL 1
#define _MAC 2
+#define _LA 3
-// investigate later - use lctl / lsft as up/down.
-// https://github.com/qmk/qmk_firmware/tree/master/keyboards/tada68/keymaps/fakb
-#define LCTL_MA LCTL_T(KC_UP)
-#define LSFT_MA LSFT_T(KC_DOWN)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap _BL: (Base Layer) Default Layer
@@ -27,19 +24,19 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* Win + Esc = `
*/
[_BL] = LAYOUT_ansi(
- KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_GRV, \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_ESC, \
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL , \
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP, \
- KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, KC_UP, KC_PGDN, \
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_RCTRL, KC_LEFT, KC_DOWN, KC_RGHT),
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN, \
+ KC_LCTL, KC_LGUI, LM(_LA, MOD_LALT), KC_SPC, KC_RALT, MO(_FL), KC_RCTRL, KC_LEFT, KC_DOWN, KC_RGHT),
/* Keymap _FL: Function Layer
* ,----------------------------------------------------------------.
* |`swp|F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| Del |`swp|
* |----------------------------------------------------------------|
- * | |BL |BL-|BL+|Brt| | | |mac| |PSc| | | |Ins |
+ * | |BL |BL-|BL+| | | | |mac| |PSc| | | |Ins |
* |----------------------------------------------------------------|
- * | | | | | | |<- |Dn |Up | ->| | | |Hme |
+ * | | | | | | |Lef|Dn |Up |Rig| | | |Hme |
* |----------------------------------------------------------------|
* | | | | | | | |MUT|V- |V+ | | |PUp|End |
* |----------------------------------------------------------------|
@@ -48,7 +45,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
[_FL] = LAYOUT_ansi(
MAGIC_UNSWAP_GRAVE_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, MAGIC_SWAP_GRAVE_ESC, \
- _______, BL_TOGG, BL_DEC, BL_INC , BL_BRTG, _______, _______, _______, TG(_MAC),_______, KC_PSCR, _______, _______, _______, KC_INS, \
+ _______, BL_TOGG, BL_DEC, BL_INC , _______, _______, _______, _______, TG(_MAC),_______, KC_PSCR, _______, _______, _______, KC_INS, \
_______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, KC_HOME, \
_______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, KC_PGUP, KC_END , \
_______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END ),
@@ -73,4 +70,23 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
KC_LCTL, KC_LALT, KC_LGUI, _______, KC_RGUI, _______, KC_RALT, _______, _______, _______),
+ /* Keymap _LA: Left Alt Layer - LALT-4 maps to LALT-F4 so I can quit apps
+ * ,----------------------------------------------------------------.
+ * | | | | |F4 | | | | | | | | | | |
+ * |----------------------------------------------------------------|
+ * | | | | | | | | | | | | | | | |
+ * |----------------------------------------------------------------|
+ * | | | | | | | | | | | | | | |
+ * |----------------------------------------------------------------|
+ * | | | | | | | | | | | | | | |
+ * |----------------------------------------------------------------|
+ * | | | | | | | | | | |
+ * `----------------------------------------------------------------'
+ */
+[_LA] = LAYOUT_ansi(
+ _______, _______, _______, _______, KC_F4, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
};
diff --git a/keyboards/tada68/keymaps/dlg/readme.md b/keyboards/tada68/keymaps/dlg/readme.md
index 1f1ae186711..9bb9d2496e4 100755
--- a/keyboards/tada68/keymaps/dlg/readme.md
+++ b/keyboards/tada68/keymaps/dlg/readme.md
@@ -4,13 +4,14 @@
+ Mac layer
+ Press Fn-I to align the bottom row to mac standards
+ volume controls moved to Fn+ M<>
- + [Space Cadet Shift](https://docs.qmk.fm/#/feature_space_cadet_shift) enabled
- + Fn+R for LED breathing
+ Fn+Del for Insert
+ `GRAVE_ESC_ALT_OVERRIDE` so cmd-opt-esc still works (thx [mattdicarlo](https://github.com/qmk/qmk_firmware/tree/master/keyboards/tada68/keymaps/mattdicarlo))
+ + `LALT` layer - LALT-4 maps to LALT-F4 so you can close windows in Windows
+
+
+### Base Layer
```
- Base Layer
,----------------------------------------------------------------.
|Esc | 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |~ ` |
|----------------------------------------------------------------|
@@ -22,15 +23,19 @@
|----------------------------------------------------------------|
|Ctrl|Win |Alt | Space |Alt|Fn |Ctrl|<- |Dn | -> |
`----------------------------------------------------------------'
-Note: Shift + Esc = ~ (tilde)
- Win + Esc = ` (grave)
+```
+Note:
+* Shift + Esc = ~ (tilde)
+* Win + Esc = ` (grave)
- Fn Layer
+### Fn Layer
+
+```
,----------------------------------------------------------------.
| |F1 |F2 |F3 |F4 |F5 |F6 |F7 |F8 |F9 |F10|F11|F12| Del | |
|----------------------------------------------------------------|
-| |BL |BL-|BL+|Brt| | | |mac| |PSc| | | |Ins |
+| |BL |BL-|BL+| | | | |mac| |PSc| | | |Ins |
|----------------------------------------------------------------|
| | | | | | |<- |Dn |Up | ->| | | |Hme |
|----------------------------------------------------------------|
@@ -38,8 +43,11 @@ Note: Shift + Esc = ~ (tilde)
|----------------------------------------------------------------|
| | | | | | | |Hme|PDn|End |
`----------------------------------------------------------------'
+```
-Mac Layer
+### Mac Layer
+
+```
,----------------------------------------------------------------.
| | | | | | | | | | | | | | | |
|----------------------------------------------------------------|
@@ -52,3 +60,19 @@ Mac Layer
|Ctrl|Alt |Win | |Win | |Alt| | | |
`----------------------------------------------------------------'
```
+
+### `LALT` Layer
+
+```
+,----------------------------------------------------------------.
+| | | | |F4 | | | | | | | | | | |
+|----------------------------------------------------------------|
+| | | | | | | | | | | | | | | |
+|----------------------------------------------------------------|
+| | | | | | | | | | | | | | |
+|----------------------------------------------------------------|
+| | | | | | | | | | | | | | |
+|----------------------------------------------------------------|
+| |Alt | | | | | | | | |
+`----------------------------------------------------------------'
+```
diff --git a/keyboards/tartan/usbconfig.h b/keyboards/tartan/usbconfig.h
deleted file mode 100644
index df896cfa915..00000000000
--- a/keyboards/tartan/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 0
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'd','m','9','r','e','c','o','r','d','s'
-#define USB_CFG_VENDOR_NAME_LEN 10
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'T', 'a', 'r', 't', 'a', 'n'
-#define USB_CFG_DEVICE_NAME_LEN 6
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-#define USB_CFG_SERIAL_NUMBER 'd','m','9','r','e','c','o','r','d','s','.','c','o','m',':','t','1'
-#define USB_CFG_SERIAL_NUMBER_LEN 17
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-// #define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-// /* #define USB_INTR_CFG_CLR 0 */
-// /* #define USB_INTR_ENABLE EIMSK */
-// #define USB_INTR_ENABLE_BIT INT1
-// /* #define USB_INTR_PENDING EIFR */
-// #define USB_INTR_PENDING_BIT INTF1
-// #define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/tenki/config.h b/keyboards/tenki/config.h
new file mode 100644
index 00000000000..b3c7201d892
--- /dev/null
+++ b/keyboards/tenki/config.h
@@ -0,0 +1,41 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x5058 // "PX"
+#define PRODUCT_ID 0x5445 // "TE"
+#define DEVICE_VER 0x1001
+#define MANUFACTURER Pixlup
+#define PRODUCT TENKI
+#define DESCRIPTION Customizable Mechanical Numpad
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 4
+
+/* key matrix pins */
+#define MATRIX_ROW_PINS { B1, B4, F6, B6, B2 }
+#define MATRIX_COL_PINS { F4, F5, D4, D0 }
+#define UNUSED_PINS
+
+#define DIODE_DIRECTION COL2ROW
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+
+/* ws2812 RGB LED */
+#define RGB_DI_PIN D1
+#define RGBLIGHT_ANIMATIONS
+#define RGBLED_NUM 3 // Number of LEDs
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 10
+#define RGBLIGHT_VAL_STEP 10
+#define RGBLIGHT_SLEEP
diff --git a/keyboards/tenki/info.json b/keyboards/tenki/info.json
new file mode 100644
index 00000000000..6c37a45605c
--- /dev/null
+++ b/keyboards/tenki/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "TENKI",
+ "url": "https://tokopedia.com/pixlup",
+ "maintainer": "eriqadams",
+ "width": 4,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_ortho_5x4": {
+ "layout": [{"label":"Num Lock", "x":0, "y":0}, {"label":"/", "x":1, "y":0}, {"label":"*", "x":2, "y":0}, {"label":"-", "x":3, "y":0}, {"label":"7", "x":0, "y":1}, {"label":"8", "x":1, "y":1}, {"label":"9", "x":2, "y":1}, {"label":"+", "x":3, "y":1}, {"label":"4", "x":0, "y":2}, {"label":"5", "x":1, "y":2}, {"label":"6", "x":2, "y":2}, {"label":"Bspc", "x":3, "y":2}, {"label":"1", "x":0, "y":3}, {"label":"2", "x":1, "y":3}, {"label":"3", "x":2, "y":3}, {"label":"=", "x":3, "y":3}, {"label":"0", "x":0, "y":4}, {"label":"PrtScr", "x":1, "y":4}, {"label":".", "x":2, "y":4}, {"label":"Enter", "x":3, "y":4}]
+ }
+ }
+}
diff --git a/keyboards/tenki/keymaps/default/keymap.c b/keyboards/tenki/keymaps/default/keymap.c
new file mode 100644
index 00000000000..85a8f32302c
--- /dev/null
+++ b/keyboards/tenki/keymaps/default/keymap.c
@@ -0,0 +1,19 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_ortho_5x4(
+ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,\
+ KC_P7, KC_P8, KC_P9, KC_PPLS,\
+ KC_P4, KC_P5, KC_P6, KC_BSPC,\
+ KC_P1, KC_P2, KC_P3, KC_PEQL,\
+ KC_P0, KC_PSCR , LT(1,KC_PDOT), KC_PENT
+ ),
+
+ [1] = LAYOUT_ortho_5x4(
+ KC_TRNS, RGB_HUI, RGB_HUD, RGB_VAD,\
+ KC_TRNS, KC_VOLU, RGB_TOG, RGB_VAI,\
+ KC_MPRV, KC_MUTE, KC_MNXT, KC_TRNS,\
+ KC_TRNS, KC_VOLD, KC_TRNS, KC_TRNS,\
+ RESET, KC_TRNS, KC_TRNS, RGB_MOD
+ )
+};
diff --git a/keyboards/tenki/keymaps/via/keymap.c b/keyboards/tenki/keymaps/via/keymap.c
new file mode 100644
index 00000000000..9180d8d97f8
--- /dev/null
+++ b/keyboards/tenki/keymaps/via/keymap.c
@@ -0,0 +1,38 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_ortho_5x4(
+ KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,\
+ KC_P7, KC_P8, KC_P9, KC_PPLS,\
+ KC_P4, KC_P5, KC_P6, KC_BSPC,\
+ KC_P1, KC_P2, KC_P3, KC_PEQL,\
+ KC_P0, KC_PSCR, LT(1,KC_PDOT), KC_PENT
+ ),
+
+ [1] = LAYOUT_ortho_5x4(
+ KC_TRNS, RGB_HUI, RGB_HUD, RGB_VAD,\
+ KC_TRNS, KC_VOLU, RGB_TOG, RGB_VAI,\
+ KC_MPRV, KC_MUTE, KC_MNXT, KC_TRNS,\
+ KC_TRNS, KC_VOLD, KC_TRNS, KC_TRNS,\
+ RESET, KC_TRNS, KC_TRNS, RGB_MOD
+ ),
+
+ [2] = LAYOUT_ortho_5x4(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [3] = LAYOUT_ortho_5x4(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,\
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+
+};
+
+
diff --git a/keyboards/tenki/keymaps/via/rules.mk b/keyboards/tenki/keymaps/via/rules.mk
new file mode 100644
index 00000000000..36b7ba9cbc9
--- /dev/null
+++ b/keyboards/tenki/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/tenki/readme.md b/keyboards/tenki/readme.md
new file mode 100644
index 00000000000..bb9d424065e
--- /dev/null
+++ b/keyboards/tenki/readme.md
@@ -0,0 +1,16 @@
+# TENKI
+
+
+TENKI is a customizable hotswap mechanical numpad.
+Supported layout:
+
+
+Keyboard Maintainer: [eriqadams](https://github.com/eriqadams)
+Hardware Supported: TENKI PCB, Pro Micro
+Hardware Availability: [If you're in Indonesia you can purchase here](https://tokopedia.com/pixlup)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make tenki:default
+
+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).
diff --git a/keyboards/tenki/rules.mk b/keyboards/tenki/rules.mk
new file mode 100644
index 00000000000..4c47d369bb8
--- /dev/null
+++ b/keyboards/tenki/rules.mk
@@ -0,0 +1,27 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+BOOTLOADER = caterina
+
+# Build Options
+# comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+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
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = no
+RGBLIGHT_ENABLE = yes
+
+LAYOUTS = ortho_5x4
diff --git a/keyboards/tenki/tenki.c b/keyboards/tenki/tenki.c
new file mode 100644
index 00000000000..318f8d4757a
--- /dev/null
+++ b/keyboards/tenki/tenki.c
@@ -0,0 +1 @@
+#include "tenki.h"
diff --git a/keyboards/tenki/tenki.h b/keyboards/tenki/tenki.h
new file mode 100644
index 00000000000..29ec6303ab9
--- /dev/null
+++ b/keyboards/tenki/tenki.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_ortho_5x4( \
+ K00, K01, K02, K03, \
+ K10, K11, K12, K13, \
+ K20, K21, K22, K23, \
+ K30, K31, K32, K33, \
+ K40, K41, K42, K43 \
+) { \
+ { K00, K01, K02, K03}, \
+ { K10, K11, K12, K13}, \
+ { K20, K21, K22, K23}, \
+ { K30, K31, K32, K33}, \
+ { K40, K41, K42, K43} \
+}
+
diff --git a/keyboards/tgr/910/910.c b/keyboards/tgr/910/910.c
new file mode 100644
index 00000000000..63b4a13f7de
--- /dev/null
+++ b/keyboards/tgr/910/910.c
@@ -0,0 +1,37 @@
+/* Copyright 2020 halfenergized
+ *
+ * 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 .
+ */
+
+#include "910.h"
+
+void keyboard_pre_init_kb(void) {
+ led_init_ports();
+ keyboard_pre_init_user();
+}
+
+void led_init_ports(void) {
+ setPinOutput(D0);
+ setPinOutput(D1);
+ setPinOutput(D6);
+}
+
+bool led_update_kb(led_t led_state) {
+ if (led_update_user(led_state)) {
+ writePin(D0, led_state.num_lock);
+ writePin(D1, led_state.caps_lock);
+ writePin(D6, led_state.scroll_lock);
+ }
+ return true;
+}
diff --git a/keyboards/tgr/910/910.h b/keyboards/tgr/910/910.h
new file mode 100644
index 00000000000..670999ac4c4
--- /dev/null
+++ b/keyboards/tgr/910/910.h
@@ -0,0 +1,84 @@
+/* Copyright 2020 halfenergized
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "quantum.h"
+
+#define ___ KC_NO
+
+#define LAYOUT_all( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k6d, k53, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k52, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k51, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k50, \
+ k40, k41, k42, k44, k45, k46, k47, k48, k49, k4b, k4c, k4d \
+){ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d }, \
+ { k40, k41, k42, ___, k44, k45, k46, k47, k48, k49, ___, k4b, k4c, k4d }, \
+ { k50, k51, k52, k53, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___ }, \
+ { ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, k6d } \
+}
+
+#define LAYOUT_ansi( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k52, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2d, k51, \
+ k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k50, \
+ k40, k41, k42, k45, k47, k48, k4b, k4c, k4d \
+){ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, ___, k2d }, \
+ { k30, ___, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d }, \
+ { k40, k41, k42, ___, ___, k45, ___, k47, k48, ___, ___, k4b, k4c, k4d }, \
+ { k50, k51, k52, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___ }, \
+ { ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___ } \
+}
+
+#define LAYOUT_ansi_split_bs( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k6d, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k52, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2d, k51, \
+ k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k50, \
+ k40, k41, k42, k45, k47, k48, k4b, k4c, k4d \
+){ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, ___, k2d }, \
+ { k30, ___, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d }, \
+ { k40, k41, k42, ___, ___, k45, ___, k47, k48, ___, ___, k4b, k4c, k4d }, \
+ { k50, k51, k52, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___ }, \
+ { ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, k6d } \
+}
+
+#define LAYOUT_iso( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k52, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k51, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k50, \
+ k40, k41, k42, k45, k47, k48, k4b, k4c, k4d \
+){ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, ___ }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d }, \
+ { k40, k41, k42, ___, ___, k45, ___, k47, k48, ___, ___, k4b, k4c, k4d }, \
+ { k50, k51, k52, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___ }, \
+ { ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___ } \
+}
diff --git a/keyboards/tgr/910/config.h b/keyboards/tgr/910/config.h
new file mode 100644
index 00000000000..995a6016a05
--- /dev/null
+++ b/keyboards/tgr/910/config.h
@@ -0,0 +1,53 @@
+/*
+Copyright 2020 halfenergized
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+#define VENDOR_ID 0x5447 //TG
+#define PRODUCT_ID 0x9100 //910
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Quadcube
+#define PRODUCT TGR-910
+#define DESCRIPTION 65% Keyboard
+
+#define RGBLED_NUM 19
+
+#define MATRIX_ROWS 7
+#define MATRIX_COLS 14
+
+// 0 1 2 3 4 5 6 7 8 9 A B C D
+#define MATRIX_ROW_PINS { B0, B1, B2, B3, B4, B5, B6 }
+#define MATRIX_COL_PINS { D7, C2, C3, C4, C5, C6, C7, A7, A6, A5, A4, A3, A1, A0 }
+#define UNUSED_PINS
+
+#define DIODE_DIRECTION COL2ROW
+#define DEBOUNCE 5
+
+#define BACKLIGHT_PIN D4
+#define BACKLIGHT_LEVELS 3
+
+#define RGBLIGHT_ANIMATIONS
+
+/* key combination for magic key command */
+/* defined by default; to change, uncomment and set to the combination you want */
+// #define IS_COMMAND() (get_mods() == MOD_MASK_SHIFT)
+
+/* Bootmagic Lite key configuration */
+// #define BOOTMAGIC_LITE_ROW 0
+// #define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/tgr/910/info.json b/keyboards/tgr/910/info.json
new file mode 100644
index 00000000000..b503478618a
--- /dev/null
+++ b/keyboards/tgr/910/info.json
@@ -0,0 +1,24 @@
+{
+ "keyboard_name": "TGR-910",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 16,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2}, {"x":13.75, "y":2, "w":1.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"x":11, "y":4}, {"x":12, "y":4}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}]
+ },
+
+ "LAYOUT_ansi": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}]
+ },
+
+ "LAYOUT_ansi_split_bs": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}]
+ },
+
+ "LAYOUT_iso": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2}, {"x":13.75, "y":1, "w":1.25, "h":2}, {"x":15, "y":2}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}]
+ }
+ }
+}
diff --git a/keyboards/tgr/910/keymaps/default/keymap.c b/keyboards/tgr/910/keymaps/default/keymap.c
new file mode 100644
index 00000000000..8abdb7e283b
--- /dev/null
+++ b/keyboards/tgr/910/keymaps/default/keymap.c
@@ -0,0 +1,25 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* layer 0: qwerty */
+ [0] = LAYOUT_ansi_split_bs(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_DEL,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(2),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [1] = LAYOUT_ansi_split_bs(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSLS, KC_DEL,
+ BL_TOGG, BL_STEP, BL_INC, BL_DEC, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME,
+ RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END,
+ KC_TRNS, RGB_RMOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [2] = LAYOUT_ansi_split_bs(
+ KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MSTP, KC_MNXT),
+ };
diff --git a/keyboards/tgr/910/keymaps/via/keymap.c b/keyboards/tgr/910/keymaps/via/keymap.c
new file mode 100644
index 00000000000..3aff12b5307
--- /dev/null
+++ b/keyboards/tgr/910/keymaps/via/keymap.c
@@ -0,0 +1,32 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* layer 0: qwerty */
+ [0] = LAYOUT_ansi_split_bs(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_DEL,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(2),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [1] = LAYOUT_ansi_split_bs(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSLS, KC_TRNS,
+ BL_TOGG, BL_STEP, BL_INC, BL_DEC, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME,
+ RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END,
+ KC_TRNS, RGB_RMOD, RGB_HUD, RGB_SAD, RGB_VAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [2] = LAYOUT_ansi_split_bs(
+ KC_GRV, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MSTP, KC_MNXT),
+
+ [3] = LAYOUT_ansi_split_bs(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+ };
diff --git a/keyboards/tgr/910/keymaps/via/rules.mk b/keyboards/tgr/910/keymaps/via/rules.mk
new file mode 100644
index 00000000000..9e1952e2368
--- /dev/null
+++ b/keyboards/tgr/910/keymaps/via/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+
+EXTRAKEY_ENABLE = no
diff --git a/keyboards/tgr/910/readme.md b/keyboards/tgr/910/readme.md
new file mode 100644
index 00000000000..63e86380b87
--- /dev/null
+++ b/keyboards/tgr/910/readme.md
@@ -0,0 +1,21 @@
+# TGR-910
+
+65% custom keyboard with a very nice design.
+
+* Keyboard Maintainer: [poisonking](https://github.com/halfenergized)
+* Hardware Supported: TGR-910 (Quadcube PCB)
+* Hardware Availability: [Geekhack GB](https://geekhack.org/index.php?topic=86047.0)
+
+**Only works with Quadcube PCB, will not work with [TGR 910 CE](../910ce) PCB (a.k.a. TGR Unicorn v1.2)**
+
+Make example for this keyboard (after setting up your build environment):
+
+ make tgr/910:default
+
+Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
+
+ make tgr/910:default:flash
+
+**Reset Key**: Hold down the key located at `k0d`, commonly programmed as *Backspace* while plugging in the keyboard.
+
+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).
diff --git a/keyboards/tgr/910/rules.mk b/keyboards/tgr/910/rules.mk
new file mode 100644
index 00000000000..a9746c0d3dd
--- /dev/null
+++ b/keyboards/tgr/910/rules.mk
@@ -0,0 +1,24 @@
+# MCU name
+MCU = atmega32a
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = bootloadHID
+
+# build options
+BOOTMAGIC_ENABLE = no
+MOUSEKEY_ENABLE = no
+EXTRAKEY_ENABLE = yes
+CONSOLE_ENABLE = no
+COMMAND_ENABLE = yes
+BACKLIGHT_ENABLE = yes
+RGBLIGHT_ENABLE = yes
+WS2812_DRIVER = i2c
+
+OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/tgr/910ce/910ce.c b/keyboards/tgr/910ce/910ce.c
new file mode 100644
index 00000000000..4b39131794d
--- /dev/null
+++ b/keyboards/tgr/910ce/910ce.c
@@ -0,0 +1,33 @@
+/* Copyright 2020 mechmerlin
+ *
+ * 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 .
+ */
+
+#include "910ce.h"
+
+void keyboard_pre_init_kb(void) {
+ led_init_ports();
+ keyboard_pre_init_user();
+}
+
+void led_init_ports(void) {
+ setPinOutput(D1);
+}
+
+bool led_update_kb(led_t led_state) {
+ if (led_update_user(led_state)) {
+ writePin(D1, led_state.caps_lock);
+ }
+ return true;
+}
\ No newline at end of file
diff --git a/keyboards/tgr/910ce/910ce.h b/keyboards/tgr/910ce/910ce.h
new file mode 100644
index 00000000000..f1592b02899
--- /dev/null
+++ b/keyboards/tgr/910ce/910ce.h
@@ -0,0 +1,75 @@
+/* Copyright 2020 mechmerlin
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "quantum.h"
+#define ___ KC_NO
+
+/* 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_all( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, k5e, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \
+ k40, k41, k42, k44, k45, k47, k49, k48, k4c, k4d, k4e \
+){ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e }, \
+ { k40, k41, k42, ___, k44, k45, ___, k47, k48, k49, ___, ___, k4c, k4d, k4e }, \
+ { ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, k5e }, \
+}
+
+#define LAYOUT_65_ansi_blocker( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k5e, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2d, k2e, \
+ k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \
+ k40, k41, k42, k45, k49, k48, k4c, k4d, k4e \
+) { \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, ___ }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, ___, k2d, k2e }, \
+ { k30, ___, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e }, \
+ { k40, k41, k42, ___, ___, k45, ___, ___, k48, k49, ___, ___, k4c, k4d, k4e }, \
+ { ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, k5e }, \
+}
+
+#define LAYOUT_65_iso_blocker( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k5e, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1e, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, \
+ k40, k41, k42, k45, k49, k48, k4c, k4d, k4e \
+) { \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, ___ }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, ___, k1e }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e }, \
+ { k40, k41, k42, ___, ___, k45, ___, ___, k48, k49, ___, ___, k4c, k4d, k4e }, \
+ { ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, k5e }, \
+}
+
+
diff --git a/keyboards/tgr/910ce/config.h b/keyboards/tgr/910ce/config.h
new file mode 100644
index 00000000000..b22dfd7111d
--- /dev/null
+++ b/keyboards/tgr/910ce/config.h
@@ -0,0 +1,49 @@
+/*
+Copyright 2020 mechmerlin
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+#define VENDOR_ID 0x5447 // TG
+#define PRODUCT_ID 0x910C
+#define DEVICE_VER 0x0001
+#define MANUFACTURER TGR
+#define PRODUCT 910CE
+#define DESCRIPTION A custom 65% keyboard
+
+#define RGBLED_NUM 18
+
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 15
+
+// 0 1 2 3 4 5 6 7 8 9 A B C D E
+#define MATRIX_ROW_PINS { B1, B2, B3, B4, B5, B6 }
+#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6, C5, C4, C3, C2, D7 }
+#define UNUSED_PINS {}
+
+#define DIODE_DIRECTION COL2ROW
+#define DEBOUNCE 5
+
+#define BACKLIGHT_PIN D4
+#define BACKLIGHT_LEVELS 3
+#define RGBLIGHT_ANIMATIONS
+
+/* disable these deprecated features by default */
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
diff --git a/keyboards/tgr/910ce/info.json b/keyboards/tgr/910ce/info.json
new file mode 100644
index 00000000000..ecc9a98e34e
--- /dev/null
+++ b/keyboards/tgr/910ce/info.json
@@ -0,0 +1,20 @@
+{
+ "keyboard_name": "TGR 910 CE",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 16,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2}, {"x":13.75, "y":2, "w":1.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":2.75}, {"x":6.5, "y":4, "w":1.25}, {"x":7.75, "y":4, "w":2.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}]
+ },
+
+ "LAYOUT_65_ansi_blocker": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":15, "y":2}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}]
+ },
+
+ "LAYOUT_65_iso_blocker": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0, "w":2}, {"x":15, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":15, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2}, {"x":13.75, "y":1, "w":1.25, "h":2}, {"x":15, "y":2}, {"x":0, "y":3, "w":1.25}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":15, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":13, "y":4}, {"x":14, "y":4}, {"x":15, "y":4}]
+ }
+ }
+}
diff --git a/keyboards/tgr/910ce/keymaps/default/keymap.c b/keyboards/tgr/910ce/keymaps/default/keymap.c
new file mode 100644
index 00000000000..85581d8e38e
--- /dev/null
+++ b/keyboards/tgr/910ce/keymaps/default/keymap.c
@@ -0,0 +1,47 @@
+/* Copyright 2020 mechmerlin
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│Hom│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │PgU│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │PgD│
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift│ ↑ │End│
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+ * │Ctrl│GUI │Alt │ │ Alt│Ctrl│ │ ← │ ↓ │ → │
+ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_65_ansi_blocker(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT_65_ansi_blocker(
+ KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_TRNS,
+ RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+};
\ No newline at end of file
diff --git a/keyboards/tgr/910ce/keymaps/via/keymap.c b/keyboards/tgr/910ce/keymaps/via/keymap.c
new file mode 100644
index 00000000000..f289ad82495
--- /dev/null
+++ b/keyboards/tgr/910ce/keymaps/via/keymap.c
@@ -0,0 +1,63 @@
+/* Copyright 2020 mechmerlin
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│Hom│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │PgU│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │PgD│
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift│ ↑ │End│
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+ * │Ctrl│GUI │Alt │ │ Alt│Ctrl│ │ ← │ ↓ │ → │
+ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_65_ansi_blocker(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT_65_ansi_blocker(
+ KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_TRNS,
+ RGB_TOG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ BL_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [2] = LAYOUT_65_ansi_blocker(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [3] = LAYOUT_65_ansi_blocker(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+};
\ No newline at end of file
diff --git a/keyboards/tgr/910ce/keymaps/via/rules.mk b/keyboards/tgr/910ce/keymaps/via/rules.mk
new file mode 100644
index 00000000000..71c94085a9b
--- /dev/null
+++ b/keyboards/tgr/910ce/keymaps/via/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+
+EXTRAKEY_ENABLE = no # Audio control and System control
\ No newline at end of file
diff --git a/keyboards/tgr/910ce/readme.md b/keyboards/tgr/910ce/readme.md
new file mode 100644
index 00000000000..6df25c8f8cc
--- /dev/null
+++ b/keyboards/tgr/910ce/readme.md
@@ -0,0 +1,19 @@
+# TGR 910 CE
+
+A 65% Bootmapper Client based keyboard with blocker and 910 logo on the top right.
+
+* Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin)
+* Hardware Supported: TGR 910 CE PCB labeled TGR-Unicorn PCB v1.2
+* Hardware Availability: [Geekhack GB](https://geekhack.org/index.php?topic=91498.0)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make tgr/910ce:default
+
+Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
+
+ make tgr/910ce:default:flash
+
+**Reset Key**: Short the pins labeled `FW_JP` underneath the tab key. This can only be done from the back of the board.
+
+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).
diff --git a/keyboards/tgr/910ce/rules.mk b/keyboards/tgr/910ce/rules.mk
new file mode 100644
index 00000000000..cbaa9da99c9
--- /dev/null
+++ b/keyboards/tgr/910ce/rules.mk
@@ -0,0 +1,28 @@
+# MCU name
+MCU = atmega32a
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = bootloadHID
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # 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 = yes # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+WS2812_DRIVER = i2c
+
+OPT_DEFS = -DDEBUG_LEVEL=0
+
+LAYOUTS = 65_ansi_blocker 65_iso_blocker
\ No newline at end of file
diff --git a/keyboards/tgr/alice/config.h b/keyboards/tgr/alice/config.h
index cf1f107a338..20f4c5970e1 100644
--- a/keyboards/tgr/alice/config.h
+++ b/keyboards/tgr/alice/config.h
@@ -20,10 +20,8 @@ along with this program. If not, see .
#define VENDOR_ID 0x20A0
#define PRODUCT_ID 0x422E
#define DEVICE_VER 0x0200
-// TODO: share these strings with usbconfig.h
-// Edit usbconfig.h to change these.
#define MANUFACTURER TGR
-#define PRODUCT TGR Alice
+#define PRODUCT Alice
/* matrix size */
#define MATRIX_ROWS 6
diff --git a/keyboards/tgr/alice/rules.mk b/keyboards/tgr/alice/rules.mk
index a8fea7efa7f..fd340f04ebc 100644
--- a/keyboards/tgr/alice/rules.mk
+++ b/keyboards/tgr/alice/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = full
MOUSEKEY_ENABLE = no
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
diff --git a/keyboards/tgr/alice/usbconfig.h b/keyboards/tgr/alice/usbconfig.h
deleted file mode 100644
index d2955d06215..00000000000
--- a/keyboards/tgr/alice/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'T', 'G', 'R'
-#define USB_CFG_VENDOR_NAME_LEN 3
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'T', 'G', 'R', ' ', 'A', 'l', 'i', 'c', 'e'
-#define USB_CFG_DEVICE_NAME_LEN 9
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/tgr/jane/config.h b/keyboards/tgr/jane/config.h
index 5fb9a90560a..ed8b39c38a3 100644
--- a/keyboards/tgr/jane/config.h
+++ b/keyboards/tgr/jane/config.h
@@ -19,8 +19,8 @@ along with this program. If not, see .
#include "config_common.h"
-#define VENDOR_ID 0x20A0
-#define PRODUCT_ID 0x422D
+#define VENDOR_ID 0x5447 // TG
+#define PRODUCT_ID 0x4A4E // JN
#define DEVICE_VER 0x0200
#define MANUFACTURER TGR
#define PRODUCT Jane
diff --git a/keyboards/tgr/jane/info.json b/keyboards/tgr/jane/info.json
index 6fab4db1ed6..000fda24f97 100644
--- a/keyboards/tgr/jane/info.json
+++ b/keyboards/tgr/jane/info.json
@@ -13,8 +13,16 @@
"layout": [{"x":0, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":8.5, "y":0}, {"x":9.5, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":17.25, "y":0}, {"x":0, "y":1.5}, {"x":1, "y":1.5}, {"x":2, "y":1.5}, {"x":3, "y":1.5}, {"x":4, "y":1.5}, {"x":5, "y":1.5}, {"x":6, "y":1.5}, {"x":7, "y":1.5}, {"x":8, "y":1.5}, {"x":9, "y":1.5}, {"x":10, "y":1.5}, {"x":11, "y":1.5}, {"x":12, "y":1.5}, {"x":13, "y":1.5, "w":2}, {"x":15.25, "y":1.5}, {"x":16.25, "y":1.5}, {"x":17.25, "y":1.5}, {"x":0, "y":2.5, "w":1.5}, {"x":1.5, "y":2.5}, {"x":2.5, "y":2.5}, {"x":3.5, "y":2.5}, {"x":4.5, "y":2.5}, {"x":5.5, "y":2.5}, {"x":6.5, "y":2.5}, {"x":7.5, "y":2.5}, {"x":8.5, "y":2.5}, {"x":9.5, "y":2.5}, {"x":10.5, "y":2.5}, {"x":11.5, "y":2.5}, {"x":12.5, "y":2.5}, {"x":13.5, "y":2.5, "w":1.5}, {"x":15.25, "y":2.5}, {"x":16.25, "y":2.5}, {"x":17.25, "y":2.5}, {"x":0, "y":3.5, "w":1.75}, {"x":1.75, "y":3.5}, {"x":2.75, "y":3.5}, {"x":3.75, "y":3.5}, {"x":4.75, "y":3.5}, {"x":5.75, "y":3.5}, {"x":6.75, "y":3.5}, {"x":7.75, "y":3.5}, {"x":8.75, "y":3.5}, {"x":9.75, "y":3.5}, {"x":10.75, "y":3.5}, {"x":11.75, "y":3.5}, {"x":12.75, "y":3.5, "w":2.25}, {"x":0, "y":4.5, "w":2.25}, {"x":2.25, "y":4.5}, {"x":3.25, "y":4.5}, {"x":4.25, "y":4.5}, {"x":5.25, "y":4.5}, {"x":6.25, "y":4.5}, {"x":7.25, "y":4.5}, {"x":8.25, "y":4.5}, {"x":9.25, "y":4.5}, {"x":10.25, "y":4.5}, {"x":11.25, "y":4.5}, {"x":12.25, "y":4.5, "w":2.75}, {"x":16.25, "y":4.5}, {"x":0, "y":5.5, "w":1.25}, {"x":1.25, "y":5.5, "w":1.25}, {"x":2.5, "y":5.5, "w":1.25}, {"x":3.75, "y":5.5, "w":6.25}, {"x":10, "y":5.5, "w":1.25}, {"x":11.25, "y":5.5, "w":1.25}, {"x":12.5, "y":5.5, "w":1.25}, {"x":13.75, "y":5.5, "w":1.25}, {"x":15.25, "y":5.5}, {"x":16.25, "y":5.5}, {"x":17.25, "y":5.5}]
},
+ "LAYOUT_tkl_ansi_tsangan": {
+ "layout": [{"x":0, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":8.5, "y":0}, {"x":9.5, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":17.25, "y":0}, {"x":0, "y":1.25}, {"x":1, "y":1.25}, {"x":2, "y":1.25}, {"x":3, "y":1.25}, {"x":4, "y":1.25}, {"x":5, "y":1.25}, {"x":6, "y":1.25}, {"x":7, "y":1.25}, {"x":8, "y":1.25}, {"x":9, "y":1.25}, {"x":10, "y":1.25}, {"x":11, "y":1.25}, {"x":12, "y":1.25}, {"x":13, "y":1.25, "w":2}, {"x":15.25, "y":1.25}, {"x":16.25, "y":1.25}, {"x":17.25, "y":1.25}, {"x":0, "y":2.25, "w":1.5}, {"x":1.5, "y":2.25}, {"x":2.5, "y":2.25}, {"x":3.5, "y":2.25}, {"x":4.5, "y":2.25}, {"x":5.5, "y":2.25}, {"x":6.5, "y":2.25}, {"x":7.5, "y":2.25}, {"x":8.5, "y":2.25}, {"x":9.5, "y":2.25}, {"x":10.5, "y":2.25}, {"x":11.5, "y":2.25}, {"x":12.5, "y":2.25}, {"x":13.5, "y":2.25, "w":1.5}, {"x":15.25, "y":2.25}, {"x":16.25, "y":2.25}, {"x":17.25, "y":2.25}, {"x":0, "y":3.25, "w":1.75}, {"x":1.75, "y":3.25}, {"x":2.75, "y":3.25}, {"x":3.75, "y":3.25}, {"x":4.75, "y":3.25}, {"x":5.75, "y":3.25}, {"x":6.75, "y":3.25}, {"x":7.75, "y":3.25}, {"x":8.75, "y":3.25}, {"x":9.75, "y":3.25}, {"x":10.75, "y":3.25}, {"x":11.75, "y":3.25}, {"x":12.75, "y":3.25, "w":2.25}, {"x":0, "y":4.25, "w":2.25}, {"x":2.25, "y":4.25}, {"x":3.25, "y":4.25}, {"x":4.25, "y":4.25}, {"x":5.25, "y":4.25}, {"x":6.25, "y":4.25}, {"x":7.25, "y":4.25}, {"x":8.25, "y":4.25}, {"x":9.25, "y":4.25}, {"x":10.25, "y":4.25}, {"x":11.25, "y":4.25}, {"x":12.25, "y":4.25, "w":1.75}, {"x":14, "y":4.25}, {"x":16.25, "y":4.25}, {"x":0, "y":5.25, "w":1.5}, {"x":1.5, "y":5.25}, {"x":2.5, "y":5.25, "w":1.5}, {"x":4, "y":5.25, "w":7}, {"x":11, "y":5.25, "w":1.5}, {"x":12.5, "y":5.25}, {"x":13.5, "y":5.25, "w":1.5}, {"x":15.25, "y":5.25}, {"x":16.25, "y":5.25}, {"x":17.25, "y":5.25}]
+ },
+
"LAYOUT_tkl_iso": {
"layout": [{"x":0, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":8.5, "y":0}, {"x":9.5, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":17.25, "y":0}, {"x":0, "y":1.5}, {"x":1, "y":1.5}, {"x":2, "y":1.5}, {"x":3, "y":1.5}, {"x":4, "y":1.5}, {"x":5, "y":1.5}, {"x":6, "y":1.5}, {"x":7, "y":1.5}, {"x":8, "y":1.5}, {"x":9, "y":1.5}, {"x":10, "y":1.5}, {"x":11, "y":1.5}, {"x":12, "y":1.5}, {"x":13, "y":1.5, "w":2}, {"x":15.25, "y":1.5}, {"x":16.25, "y":1.5}, {"x":17.25, "y":1.5}, {"x":0, "y":2.5, "w":1.5}, {"x":1.5, "y":2.5}, {"x":2.5, "y":2.5}, {"x":3.5, "y":2.5}, {"x":4.5, "y":2.5}, {"x":5.5, "y":2.5}, {"x":6.5, "y":2.5}, {"x":7.5, "y":2.5}, {"x":8.5, "y":2.5}, {"x":9.5, "y":2.5}, {"x":10.5, "y":2.5}, {"x":11.5, "y":2.5}, {"x":12.5, "y":2.5}, {"x":15.25, "y":2.5}, {"x":16.25, "y":2.5}, {"x":17.25, "y":2.5}, {"x":0, "y":3.5, "w":1.75}, {"x":1.75, "y":3.5}, {"x":2.75, "y":3.5}, {"x":3.75, "y":3.5}, {"x":4.75, "y":3.5}, {"x":5.75, "y":3.5}, {"x":6.75, "y":3.5}, {"x":7.75, "y":3.5}, {"x":8.75, "y":3.5}, {"x":9.75, "y":3.5}, {"x":10.75, "y":3.5}, {"x":11.75, "y":3.5}, {"x":12.75, "y":3.5}, {"x":13.75, "y":2.5, "w":1.25, "h":2}, {"x":0, "y":4.5, "w":1.25}, {"x":1.25, "y":4.5}, {"x":2.25, "y":4.5}, {"x":3.25, "y":4.5}, {"x":4.25, "y":4.5}, {"x":5.25, "y":4.5}, {"x":6.25, "y":4.5}, {"x":7.25, "y":4.5}, {"x":8.25, "y":4.5}, {"x":9.25, "y":4.5}, {"x":10.25, "y":4.5}, {"x":11.25, "y":4.5}, {"x":12.25, "y":4.5, "w":2.75}, {"x":16.25, "y":4.5}, {"x":0, "y":5.5, "w":1.25}, {"x":1.25, "y":5.5, "w":1.25}, {"x":2.5, "y":5.5, "w":1.25}, {"x":3.75, "y":5.5, "w":6.25}, {"x":10, "y":5.5, "w":1.25}, {"x":11.25, "y":5.5, "w":1.25}, {"x":12.5, "y":5.5, "w":1.25}, {"x":13.75, "y":5.5, "w":1.25}, {"x":15.25, "y":5.5}, {"x":16.25, "y":5.5}, {"x":17.25, "y":5.5}]
+ },
+
+ "LAYOUT_tkl_iso_tsangan": {
+ "layout": [{"x":0, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":8.5, "y":0}, {"x":9.5, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":17.25, "y":0}, {"x":0, "y":1.25}, {"x":1, "y":1.25}, {"x":2, "y":1.25}, {"x":3, "y":1.25}, {"x":4, "y":1.25}, {"x":5, "y":1.25}, {"x":6, "y":1.25}, {"x":7, "y":1.25}, {"x":8, "y":1.25}, {"x":9, "y":1.25}, {"x":10, "y":1.25}, {"x":11, "y":1.25}, {"x":12, "y":1.25}, {"x":13, "y":1.25, "w":2}, {"x":15.25, "y":1.25}, {"x":16.25, "y":1.25}, {"x":17.25, "y":1.25}, {"x":0, "y":2.25, "w":1.5}, {"x":1.5, "y":2.25}, {"x":2.5, "y":2.25}, {"x":3.5, "y":2.25}, {"x":4.5, "y":2.25}, {"x":5.5, "y":2.25}, {"x":6.5, "y":2.25}, {"x":7.5, "y":2.25}, {"x":8.5, "y":2.25}, {"x":9.5, "y":2.25}, {"x":10.5, "y":2.25}, {"x":11.5, "y":2.25}, {"x":12.5, "y":2.25}, {"x":13.75, "y":2.25, "w":1.25, "h":2}, {"x":15.25, "y":2.25}, {"x":16.25, "y":2.25}, {"x":17.25, "y":2.25}, {"x":0, "y":3.25, "w":1.75}, {"x":1.75, "y":3.25}, {"x":2.75, "y":3.25}, {"x":3.75, "y":3.25}, {"x":4.75, "y":3.25}, {"x":5.75, "y":3.25}, {"x":6.75, "y":3.25}, {"x":7.75, "y":3.25}, {"x":8.75, "y":3.25}, {"x":9.75, "y":3.25}, {"x":10.75, "y":3.25}, {"x":11.75, "y":3.25}, {"x":12.75, "y":3.25}, {"x":0, "y":4.25, "w":1.25}, {"x":1.25, "y":4.25}, {"x":2.25, "y":4.25}, {"x":3.25, "y":4.25}, {"x":4.25, "y":4.25}, {"x":5.25, "y":4.25}, {"x":6.25, "y":4.25}, {"x":7.25, "y":4.25}, {"x":8.25, "y":4.25}, {"x":9.25, "y":4.25}, {"x":10.25, "y":4.25}, {"x":11.25, "y":4.25}, {"x":12.25, "y":4.25, "w":1.75}, {"x":14, "y":4.25}, {"x":16.25, "y":4.25}, {"x":0, "y":5.25, "w":1.5}, {"x":1.5, "y":5.25}, {"x":2.5, "y":5.25, "w":1.5}, {"x":4, "y":5.25, "w":7}, {"x":11, "y":5.25, "w":1.5}, {"x":12.5, "y":5.25}, {"x":13.5, "y":5.25, "w":1.5}, {"x":15.25, "y":5.25}, {"x":16.25, "y":5.25}, {"x":17.25, "y":5.25}]
}
}
}
diff --git a/keyboards/tgr/jane/jane.h b/keyboards/tgr/jane/jane.h
index 2008d49d9a2..9691ea589ff 100644
--- a/keyboards/tgr/jane/jane.h
+++ b/keyboards/tgr/jane/jane.h
@@ -58,6 +58,24 @@
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k7C, k7D, k7E }, \
}
+#define LAYOUT_tkl_ansi_tsangan( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k6B, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k6C, k6D, k6E, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k7C, k7D, k7E, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3D, \
+ k40, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k2E, \
+ k50, k51, k52, k55, k58, k59, k5A, k5E, k3E, k4E \
+){ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, KC_NO }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, KC_NO, k3D, k3E }, \
+ { k40, KC_NO, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E }, \
+ { k50, k51, k52, KC_NO, KC_NO, k55, KC_NO, KC_NO, k58, k59, k5A, KC_NO, KC_NO, KC_NO, k5E }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k6B, k6C, k6D, k6E }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k7C, k7D, k7E }, \
+}
+
#define LAYOUT_tkl_iso( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k6B, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k6C, k6D, k6E, \
@@ -75,3 +93,21 @@
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k6B, k6C, k6D, k6E }, \
{ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k7C, k7D, k7E }, \
}
+
+#define LAYOUT_tkl_iso_tsangan( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k6B, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k6C, k6D, k6E, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k7C, k7D, k7E, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k2E, \
+ k50, k51, k52, k55, k58, k59, k5A, k5E, k3E, k4E \
+){ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, KC_NO }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, KC_NO, k2E }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, k3E }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E }, \
+ { k50, k51, k52, KC_NO, KC_NO, k55, KC_NO, KC_NO, k58, k59, k5A, KC_NO, KC_NO, KC_NO, k5E }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k6B, k6C, k6D, k6E }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, k7C, k7D, k7E }, \
+}
diff --git a/keyboards/tgr/jane/keymaps/via/config.h b/keyboards/tgr/jane/keymaps/via/config.h
new file mode 100644
index 00000000000..0865e452088
--- /dev/null
+++ b/keyboards/tgr/jane/keymaps/via/config.h
@@ -0,0 +1 @@
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
diff --git a/keyboards/tgr/jane/keymaps/via/keymap.c b/keyboards/tgr/jane/keymaps/via/keymap.c
new file mode 100644
index 00000000000..521a78f604a
--- /dev/null
+++ b/keyboards/tgr/jane/keymaps/via/keymap.c
@@ -0,0 +1,43 @@
+/* Copyright 2020 MechMerlin
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT_tkl_ansi(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_SLCK,KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_MINS, KC_EQL,KC_BSPC, KC_INS ,KC_HOME,KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,KC_LBRC,KC_RBRC,KC_BSLS, KC_DEL ,KC_END ,KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT,KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI, KC_APP,KC_RCTL, KC_LEFT,KC_DOWN,KC_RGHT),
+
+[1] = LAYOUT_tkl_ansi(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS),
+
+[2] = LAYOUT_tkl_ansi(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS),
+};
diff --git a/keyboards/tgr/jane/keymaps/via/rules.mk b/keyboards/tgr/jane/keymaps/via/rules.mk
new file mode 100644
index 00000000000..97010a994b6
--- /dev/null
+++ b/keyboards/tgr/jane/keymaps/via/rules.mk
@@ -0,0 +1,5 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+
+MOUSEKEY_ENABLE = no
+EXTRAKEY_ENABLE = no
diff --git a/keyboards/tgr/jane/rules.mk b/keyboards/tgr/jane/rules.mk
index c6a26d4a40b..8eeab33951e 100644
--- a/keyboards/tgr/jane/rules.mk
+++ b/keyboards/tgr/jane/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = no
MOUSEKEY_ENABLE = yes
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = no
diff --git a/keyboards/tgr/jane/usbconfig.h b/keyboards/tgr/jane/usbconfig.h
deleted file mode 100644
index e65d210ace8..00000000000
--- a/keyboards/tgr/jane/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/the_royal/liminal/config.h b/keyboards/the_royal/liminal/config.h
new file mode 100644
index 00000000000..09b8d501dc6
--- /dev/null
+++ b/keyboards/the_royal/liminal/config.h
@@ -0,0 +1,38 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x4B4B
+#define PRODUCT_ID 0x0002
+#define DEVICE_VER 0x0001
+#define MANUFACTURER TheRoyalSweatshirt
+#define PRODUCT Liminal
+#define DESCRIPTION "A 50% keyboard with focused around spectacular keycap compatibility."
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 14
+
+#define MATRIX_ROW_PINS { C6, B6, B7, C7 }
+#define MATRIX_COL_PINS { D6, C4, D3, D2, D1, D0, C2, B0, B1, B2, B3, B4, D5, C5 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+/* ws2812 RGB LED */
+#define RGB_DI_PIN D4
+#define RGBLED_NUM 1 // Number of LEDs
+
+#define RGBLIGHT_HUE_STEP 6
+#define RGBLIGHT_SAT_STEP 4
+#define RGBLIGHT_VAL_STEP 4
diff --git a/keyboards/the_royal/liminal/info.json b/keyboards/the_royal/liminal/info.json
new file mode 100644
index 00000000000..501158e8845
--- /dev/null
+++ b/keyboards/the_royal/liminal/info.json
@@ -0,0 +1,68 @@
+{
+ "keyboard_name": "liminal",
+ "url": "",
+ "maintainer": "TheRoyalSweatshirt",
+ "width": 15,
+ "height": 4,
+ "layouts": {
+ "LAYOUT_base_kit_all": {
+ "key_count": 52,
+ "layout": [
+ {"label":"k01", "x":0, "y":0, "w":1},
+ {"label":"k02", "x":1, "y":0, "w":1.5},
+ {"label":"k03", "x":2.5, "y":0, "w":1},
+ {"label":"k04", "x":3.5, "y":0, "w":1},
+ {"label":"k05", "x":4.5, "y":0, "w":1},
+ {"label":"k06", "x":5.5, "y":0, "w":1},
+ {"label":"k07", "x":6.5, "y":0, "w":1},
+ {"label":"k08", "x":7.5, "y":0, "w":1},
+ {"label":"k09", "x":8.5, "y":0, "w":1},
+ {"label":"k010", "x":9.5, "y":0, "w":1},
+ {"label":"k011", "x":10.5, "y":0, "w":1},
+ {"label":"k012", "x":11.5, "y":0, "w":1},
+ {"label":"k013", "x":12.5, "y":0, "w":1},
+ {"label":"k014", "x":13.5, "y":0, "w":1.5},
+ {"label":"k11", "x":0, "y":1, "w":1},
+ {"label":"k12", "x":1, "y":1, "w":1.75},
+ {"label":"k13", "x":2.75, "y":1, "w":1},
+ {"label":"k14", "x":3.75, "y":1, "w":1},
+ {"label":"k15", "x":4.75, "y":1, "w":1},
+ {"label":"k16", "x":5.75, "y":1, "w":1},
+ {"label":"k17", "x":6.75, "y":1, "w":1},
+ {"label":"k18", "x":7.75, "y":1, "w":1},
+ {"label":"k19", "x":8.75, "y":1, "w":1},
+ {"label":"k110", "x":9.75, "y":1, "w":1},
+ {"label":"k111", "x":10.75, "y":1, "w":1},
+ {"label":"k112", "x":11.75, "y":1, "w":1},
+ {"label":"k113", "x":12.75, "y":1, "w":1},
+ {"label":"k114", "x":13.75, "y":1, "w":1.25},
+ {"label":"k21", "x":0, "y":2, "w":1},
+ {"label":"k22", "x":1, "y":2, "w":1.25},
+ {"label":"k23", "x":2.25, "y":2, "w":1},
+ {"label":"k24", "x":3.25, "y":2, "w":1},
+ {"label":"k25", "x":4.25, "y":2, "w":1},
+ {"label":"k26", "x":5.25, "y":2, "w":1},
+ {"label":"k27", "x":6.25, "y":2, "w":1},
+ {"label":"k28", "x":7.25, "y":2, "w":1},
+ {"label":"k29", "x":8.25, "y":2, "w":1},
+ {"label":"k210", "x":9.25, "y":2, "w":1},
+ {"label":"k211", "x":10.25, "y":2, "w":1},
+ {"label":"k212", "x":11.25, "y":2, "w":1},
+ {"label":"k213", "x":12.25, "y":2, "w":1},
+ {"label":"k214", "x":13.25, "y":2, "w":1.75},
+ {"label":"k31", "x":0, "y":3, "w":1},
+ {"label":"k32", "x":1, "y":3, "w":1.5},
+ {"label":"k33", "x":2.5, "y":3, "w":1.25},
+ {"label":"k34", "x":3.75, "y":3, "w":1.5},
+ {"label":"k35", "x":5.25, "y":3, "w":2},
+ {"label":"k38", "x":7.25, "y":3, "w":2.25},
+ {"label":"k310", "x":9.5, "y":3, "w":1.5},
+ {"label":"k311", "x":11, "y":3, "w":1.25},
+ {"label":"k313", "x":12.25, "y":3, "w":1.25},
+ {"label":"k314", "x":13.5, "y":3, "w":1.5}
+ ]
+ }
+ }
+}
+
+
diff --git a/keyboards/the_royal/liminal/keymaps/default/config.h b/keyboards/the_royal/liminal/keymaps/default/config.h
new file mode 100644
index 00000000000..1cfc46c8169
--- /dev/null
+++ b/keyboards/the_royal/liminal/keymaps/default/config.h
@@ -0,0 +1,6 @@
+#pragma once
+
+
+#define PERMISSIVE_HOLD
+
+#define TAPPING_TERM_PER_KEY
diff --git a/keyboards/the_royal/liminal/keymaps/default/keymap.c b/keyboards/the_royal/liminal/keymaps/default/keymap.c
new file mode 100644
index 00000000000..d9d94974530
--- /dev/null
+++ b/keyboards/the_royal/liminal/keymaps/default/keymap.c
@@ -0,0 +1,161 @@
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+ _QWERTY,
+ _LOWER,
+ _RAISE,
+ _OTHER
+};
+
+
+//Tap Dance Declarations
+enum {
+ TD_RST,
+ TD_DBQT
+};
+
+void dance_rst_reset (qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count >= 2) {
+ reset_keyboard();
+ reset_tap_dance(state);
+ }
+}
+
+//All tap dance functions would go here. Only showing this one.
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_RST] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, NULL, dance_rst_reset),
+ [TD_DBQT] = ACTION_TAP_DANCE_DOUBLE (KC_QUOTE, KC_DQT)
+};
+
+enum custom_keycodes {
+ M_PAR = SAFE_RANGE,
+ M_BKT
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case M_PAR:
+ if (record->event.pressed) {
+ SEND_STRING("()" SS_TAP(X_LEFT));
+ }
+ break;
+ case M_BKT:
+ if (record->event.pressed) {
+ SEND_STRING("[]" SS_TAP(X_LEFT));
+ }
+ break;
+ }
+ return true;
+
+};
+
+#define OTHER MO(_OTHER)
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Default layer
+ * ┌─────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬──────┐
+ * │ Esc │Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ - │ BsPc │
+ * ├─────┼────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴──────┤
+ * │PgUp │Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ Enter │
+ * ├─────┼─────┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬────────┤
+ * │PgDn │LShift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Other │
+ * ├─────┼────┬──┴─┬──┴─┬──┴────┴────┴────┴────┴────┴───┬┴────┴┬───┴─┬──────┤
+ * │ END │Del │Gui │Alt │ Right KC = 7u/2.25u │Raise │Menu │ Lower│
+ * └─────┴────┴────┴────┴───────────────────────────────┴──────┴─────┴──────┘
+ */
+ [_QWERTY] = LAYOUT_base_kit_all(
+ KC_ESC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINUS, KC_BSPC,
+ KC_PGUP, KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOTE, KC_ENT,
+ KC_PGDN, KC_LSFT, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, OTHER,
+ KC_END, KC_DEL, KC_LGUI, KC_LALT, LOWER, KC_SPACE, KC_CAPS, RAISE, KC_RGUI, LOWER
+ ),
+
+ /* LOWER layer
+ * ┌─────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬──────┐
+ * │ ` │ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ _ │ │
+ * ├─────┼────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴──────┤
+ * │ ~ │ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │(..)│[..]│ ' and " │
+ * ├─────┼─────┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬────────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┼────┬──┴─┬──┴─┬──┴────┴────┴────┴────┴────┴───┬┴────┴┬───┴─┬──────┤
+ * │ │ │ │ │ │ │ │ │
+ * └─────┴────┴────┴────┴───────────────────────────────┴──────┴─────┴──────┘
+ */
+ [_LOWER] = LAYOUT_base_kit_all(
+ KC_GRAVE, _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_UNDS, _______,
+ KC_TILD, _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, M_PAR, M_BKT, _______, TD(TD_DBQT),
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ /* RAISE layer
+ * ┌─────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬──────┐
+ * │ \ │ │ │ │ │ │ │ │ │ │ │ │ = │ │
+ * ├─────┼────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴──────┤
+ * │ | │CAPS │ │ │ │ │ │ │ │ │ │ │ + │
+ * ├─────┼─────┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬────────┤
+ * │ │ │ │ │ │ │ │ │ │ │ [ │ ] │ │
+ * ├─────┼────┬──┴─┬──┴─┬──┴────┴────┴────┴────┴────┴───┬┴────┴┬───┴─┬──────┤
+ * │ │ │ │ │ │ │ │ │
+ * └─────┴────┴────┴────┴───────────────────────────────┴──────┴─────┴──────┘
+ */
+ [_RAISE] = LAYOUT_base_kit_all(
+ KC_BSLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_EQUAL, _______,
+ KC_PIPE, KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PLUS,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ /* OTHER layer
+ * ┌─────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬──────┐
+ * │HOME │ │ │ │ │ │ │ │ │ │ │ UP │ │ │
+ * ├─────┼────┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴──────┤
+ * │END │ │ │ │ │ │ │ │ │ │LEFT│RGHT│ │
+ * ├─────┼─────┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬────────┤
+ * │ │ │ │ │ │ │ │ │ │ │DOWN│ │ │
+ * ├─────┼────┬──┴─┬──┴─┬──┴────┴────┴────┴────┴────┴───┬┴────┴┬───┴─┬──────┤
+ * │RESET│ │ │ │ │ │ │ │
+ * └─────┴────┴────┴────┴───────────────────────────────┴──────┴─────┴──────┘
+ */
+ [_OTHER] = LAYOUT_base_kit_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_RIGHT, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______, _______,
+ TD(TD_RST), _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
+
+uint16_t get_tapping_term(uint16_t keycode) {
+ switch (keycode) {
+ case LT(_LOWER, KC_SPACE):
+ return 160;
+ case TD(TD_DBQT):
+ return 230;
+ default:
+#ifndef TAPPING_TERM
+ return 200;
+#else
+ return TAPPING_TERM;
+#endif
+ }
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ switch (get_highest_layer(state)) {
+ case _LOWER:
+ rgblight_setrgb (RGB_CORAL);
+ break;
+ case _RAISE:
+ rgblight_setrgb (RGB_RED);
+ break;
+ case _OTHER:
+ rgblight_setrgb (RGB_BLUE);
+ break;
+ default: // for any other layers, or the default layer
+ rgblight_setrgb (RGB_GREEN);
+ break;
+ }
+ return state;
+}
diff --git a/keyboards/the_royal/liminal/keymaps/default/rules.mk b/keyboards/the_royal/liminal/keymaps/default/rules.mk
new file mode 100644
index 00000000000..e5ddcae8d92
--- /dev/null
+++ b/keyboards/the_royal/liminal/keymaps/default/rules.mk
@@ -0,0 +1 @@
+TAP_DANCE_ENABLE = yes
diff --git a/keyboards/the_royal/liminal/keymaps/default_iso/config.h b/keyboards/the_royal/liminal/keymaps/default_iso/config.h
new file mode 100644
index 00000000000..1cfc46c8169
--- /dev/null
+++ b/keyboards/the_royal/liminal/keymaps/default_iso/config.h
@@ -0,0 +1,6 @@
+#pragma once
+
+
+#define PERMISSIVE_HOLD
+
+#define TAPPING_TERM_PER_KEY
diff --git a/keyboards/the_royal/liminal/keymaps/default_iso/keymap.c b/keyboards/the_royal/liminal/keymaps/default_iso/keymap.c
new file mode 100644
index 00000000000..3d8debee3d6
--- /dev/null
+++ b/keyboards/the_royal/liminal/keymaps/default_iso/keymap.c
@@ -0,0 +1,158 @@
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+ _QWERTY,
+ _LOWER,
+ _RAISE,
+ _OTHER
+};
+
+
+//Tap Dance Declarations
+enum {
+ TD_RST,
+ TD_DBQT
+};
+
+void dance_rst_reset (qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count >= 2) {
+ reset_keyboard();
+ reset_tap_dance(state);
+ }
+}
+
+//All tap dance functions would go here. Only showing this one.
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_RST] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, NULL, dance_rst_reset),
+ [TD_DBQT] = ACTION_TAP_DANCE_DOUBLE (KC_QUOTE, KC_DQT)
+};
+
+enum custom_keycodes {
+ M_PAR = SAFE_RANGE,
+ M_BKT
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case M_PAR:
+ if (record->event.pressed) {
+ SEND_STRING("()" SS_TAP(X_LEFT));
+ }
+ break;
+ case M_BKT:
+ if (record->event.pressed) {
+ SEND_STRING("[]" SS_TAP(X_LEFT));
+ }
+ break;
+ }
+ return true;
+
+};
+
+#define OTHER MO(_OTHER)
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Default layer
+ * ┌─────┬────┬─────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬──────┐
+ * │ Esc │Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ - │ BkSp │
+ * ├─────┼────┴─┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┐ │
+ * │PgUp │LCtrl │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ │
+ * ├─────┼────┬─┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─────┤
+ * │PgDn │Shft│ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Other │
+ * ├─────┼────┼───┴┬───┴─┬──┴────┴────┴────┴────┴────┴───┬┴────┴┬───┴─┬──────┤
+ * │ END │Del │Gui │ Alt │ Right KC = 7u/2.25u │Raise │Menu │ Lower│
+ * └─────┴────┴────┴─────┴───────────────────────────────┴──────┴─────┴──────┘
+ */
+ [_QWERTY] = LAYOUT_base_kit_all(
+ KC_ESC, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINUS, KC_BSPC,
+ KC_PGUP, KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOTE, KC_ENT,
+ KC_PGDN, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, OTHER,
+ KC_END, KC_DEL, KC_LGUI, KC_LALT, LOWER, KC_SPACE, KC_CAPS, RAISE, KC_MENU, LOWER
+ ),
+
+ /* LOWER layer
+ * ┌─────┬────┬─────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬──────┐
+ * │ ` │ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ _ │ ENTR │
+ * ├─────┼────┴─┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┐ │
+ * │ ~ │ │ ! │ " │ £ │ $ │ % │ ^ │ & │ * │(..)│ : │ @ │ │
+ * ├─────┼────┬─┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─────┤
+ * │ │ │ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ │ │
+ * ├─────┼────┼───┴┬───┴─┬──┴────┴────┴────┴────┴────┴───┬┴────┴┬───┴─┬──────┤
+ * │ │ │ │ │ │ │ │ │
+ * └─────┴────┴────┴─────┴───────────────────────────────┴──────┴─────┴──────┘
+ */
+ [_LOWER] = LAYOUT_base_kit_all(
+ KC_GRAVE, _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_UNDS, KC_ENT,
+ KC_TILD, _______, KC_EXLM, LSFT(KC_2), LSFT(KC_3), LSFT(KC_4), KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, M_PAR, KC_COLON, KC_AT, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ /* RAISE layer
+ * ┌─────┬────┬─────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬──────┐
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ = │ + │
+ * ├─────┼────┴─┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┐ │
+ * │ │ CAPS │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┼────┬─┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ [ │ ] │ │
+ * ├─────┼────┼───┴┬───┴─┬──┴────┴────┴────┴────┴────┴───┬┴────┴┬───┴─┬──────┤
+ * │ │ │ │ │ │ │ │ │
+ * └─────┴────┴────┴─────┴───────────────────────────────┴──────┴─────┴──────┘
+ */
+ [_RAISE] = LAYOUT_base_kit_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_EQUAL, KC_PLUS,
+ _______, KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ /* OTHER layer
+ * ┌─────┬────┬─────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬──────┐
+ * │HOME │ │ │ │ │ │ │ │ │ │ │ │ UP │ │
+ * ├─────┼────┴─┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┐ │
+ * │END │ │ │ │ │ │ │ │ │ │ │LEFT│RGHT│ │
+ * ├─────┼────┬─┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─┬──┴─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │DOWN│ │
+ * ├─────┼────┼───┴┬───┴─┬──┴────┴────┴────┴────┴────┴───┬┴────┴┬───┴─┬──────┤
+ * │RESET│ │ │ │ │ │ │ │
+ * └─────┴────┴────┴─────┴───────────────────────────────┴──────┴─────┴──────┘
+ */
+ [_OTHER] = LAYOUT_base_kit_all(
+ KC_HOME, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______,
+ KC_END, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_RIGHT, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______,
+ TD(TD_RST), _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+
+};
+
+uint16_t get_tapping_term(uint16_t keycode) {
+ switch (keycode) {
+ case LT(_LOWER, KC_SPACE):
+ return 160;
+ case TD(TD_DBQT):
+ return 230;
+ default:
+ return 200;
+ }
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ switch (get_highest_layer(state)) {
+ case _LOWER:
+ rgblight_setrgb (RGB_PURPLE);
+ break;
+ case _RAISE:
+ rgblight_setrgb (RGB_CYAN);
+ break;
+ case _OTHER:
+ rgblight_setrgb (RGB_ORANGE);
+ break;
+ default: // for any other layers, or the default layer
+ rgblight_setrgb (RGB_CORAL);
+ break;
+ }
+ return state;
+}
diff --git a/keyboards/the_royal/liminal/keymaps/default_iso/rules.mk b/keyboards/the_royal/liminal/keymaps/default_iso/rules.mk
new file mode 100644
index 00000000000..e5ddcae8d92
--- /dev/null
+++ b/keyboards/the_royal/liminal/keymaps/default_iso/rules.mk
@@ -0,0 +1 @@
+TAP_DANCE_ENABLE = yes
diff --git a/keyboards/the_royal/liminal/liminal.c b/keyboards/the_royal/liminal/liminal.c
new file mode 100644
index 00000000000..6e1e935d449
--- /dev/null
+++ b/keyboards/the_royal/liminal/liminal.c
@@ -0,0 +1 @@
+#include "liminal.h"
\ No newline at end of file
diff --git a/keyboards/the_royal/liminal/liminal.h b/keyboards/the_royal/liminal/liminal.h
new file mode 100644
index 00000000000..ba53b17011f
--- /dev/null
+++ b/keyboards/the_royal/liminal/liminal.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "quantum.h"
+
+#define XXX KC_NO
+
+#define LAYOUT_base_kit_all( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, \
+ k30, k31, k32, k33, k35, k37, k39, k3A, k3C, k3D \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D }, \
+ { k30, k31, k32, k33, XXX, k35, XXX, k37, XXX, k39, k3A, XXX, k3C, k3D } \
+}
+
diff --git a/keyboards/the_royal/liminal/readme.md b/keyboards/the_royal/liminal/readme.md
new file mode 100644
index 00000000000..c272cabdc9e
--- /dev/null
+++ b/keyboards/the_royal/liminal/readme.md
@@ -0,0 +1,14 @@
+# Liminal
+
+
+A 50% keyboard with superb keycap compatibility.
+
+* Keyboard Maintainer: [TheRoyalSweatshirt](https://github.com/TheRoyalSweatshirt) a.k.a [The_Royal](https://reddit.com/u/The_Royal)
+* Hardware Supported: rev 0.2 Liminal PCB
+* Hardware Availability: Through GB, Proxy, or Direct Message
+
+Make example for this keyboard (after setting up your build environment):
+
+ make the_royal/liminal:default
+
+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).
diff --git a/keyboards/the_royal/liminal/rules.mk b/keyboards/the_royal/liminal/rules.mk
new file mode 100644
index 00000000000..4d210280909
--- /dev/null
+++ b/keyboards/the_royal/liminal/rules.mk
@@ -0,0 +1,32 @@
+# MCU name
+MCU = atmega32u2
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# - change yes to no to disable
+
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
diff --git a/keyboards/the_royal/schwann/config.h b/keyboards/the_royal/schwann/config.h
new file mode 100644
index 00000000000..59453194260
--- /dev/null
+++ b/keyboards/the_royal/schwann/config.h
@@ -0,0 +1,39 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x3521
+#define DEVICE_VER 0x0001
+#define MANUFACTURER TheRoyalSweatshirt
+#define PRODUCT The Schwann PCB
+#define DESCRIPTION "A simple, HHKB-Styled, Ortholinear PCB Designed for use with the Neuron Keyboard by Worldspawn and Walletburner."
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 12
+
+#define MATRIX_ROW_PINS { F0, F1, F6, C7 }
+#define MATRIX_COL_PINS { F4, F5, D5, D3, D2, C6, B6, B5, B4, D7, D6, D1 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+/* ws2812 RGB LED */
+#define RGB_DI_PIN B3
+#define RGBLED_NUM 8 // Number of LEDs
+
+#define RGBLIGHT_ANIMATIONS
+#define RGBLIGHT_HUE_STEP 6
+#define RGBLIGHT_SAT_STEP 4
+#define RGBLIGHT_VAL_STEP 8
diff --git a/keyboards/the_royal/schwann/info.json b/keyboards/the_royal/schwann/info.json
new file mode 100644
index 00000000000..56db56e91da
--- /dev/null
+++ b/keyboards/the_royal/schwann/info.json
@@ -0,0 +1,156 @@
+{
+ "keyboard_name": "Schwann's PCB",
+ "url": "https://github.com/TheRoyalSweatshirt/The_Royal_Projects/tree/schwann/PCBs/Schwann_PCB",
+ "maintainer": "TheRoyalSweatshirt",
+ "width": 12,
+ "height": 4,
+ "layouts": {
+ "LAYOUT_mit": {
+ "key_count": 45,
+ "layout": [
+ {"label":"TAB", "x":0, "y":0},
+ {"label":"Q", "x":1, "y":0},
+ {"label":"W", "x":2, "y":0},
+ {"label":"E", "x":3, "y":0},
+ {"label":"R", "x":4, "y":0},
+ {"label":"T", "x":5, "y":0},
+ {"label":"Y", "x":6, "y":0},
+ {"label":"U", "x":7, "y":0},
+ {"label":"I", "x":8, "y":0},
+ {"label":"O", "x":9, "y":0},
+ {"label":"P", "x":10, "y":0},
+ {"label":"BSPC", "x":11, "y":0},
+ {"label":"LCtl", "x":0, "y":1},
+ {"label":"A", "x":1, "y":1},
+ {"label":"S", "x":2, "y":1},
+ {"label":"D", "x":3, "y":1},
+ {"label":"F", "x":4, "y":1},
+ {"label":"G", "x":5, "y":1},
+ {"label":"H", "x":6, "y":1},
+ {"label":"J", "x":7, "y":1},
+ {"label":"K", "x":8, "y":1},
+ {"label":"L", "x":9, "y":1},
+ {"label":"SCLN", "x":10, "y":1},
+ {"label":"QUOT", "x":11, "y":1},
+ {"label":"LSFT", "x":0, "y":2},
+ {"label":"Z", "x":1, "y":2},
+ {"label":"X", "x":2, "y":2},
+ {"label":"C", "x":3, "y":2},
+ {"label":"V", "x":4, "y":2},
+ {"label":"B", "x":5, "y":2},
+ {"label":"N", "x":6, "y":2},
+ {"label":"M", "x":7, "y":2},
+ {"label":"COMM", "x":8, "y":2},
+ {"label":"DOT", "x":9, "y":2},
+ {"label":"SLSH", "x":10, "y":2},
+ {"label":"ENTER", "x":11, "y":2},
+ {"label":"DEL", "x":1, "y":3},
+ {"label":"LGUI", "x":2, "y":3},
+ {"label":"LALT", "x":3, "y":3},
+ {"label":"LOWER", "x":4, "y":3},
+ {"label":" ", "x":5, "y":3, "w":2},
+ {"label":"RAISE", "x":7, "y":3},
+ {"label":"RALT", "x":8, "y":3},
+ {"label":"MENU", "x":9, "y":3},
+ {"label":"RCTL", "x":10, "y":3}
+ ]
+ },
+
+ "LAYOUT_full_ortho": {
+ "key_count": 46,
+ "layout": [
+ {"label":"TAB", "x":0, "y":0},
+ {"label":"Q", "x":1, "y":0},
+ {"label":"W", "x":2, "y":0},
+ {"label":"E", "x":3, "y":0},
+ {"label":"R", "x":4, "y":0},
+ {"label":"T", "x":5, "y":0},
+ {"label":"Y", "x":6, "y":0},
+ {"label":"U", "x":7, "y":0},
+ {"label":"I", "x":8, "y":0},
+ {"label":"O", "x":9, "y":0},
+ {"label":"P", "x":10, "y":0},
+ {"label":"BSPC", "x":11, "y":0},
+ {"label":"LCtl", "x":0, "y":1},
+ {"label":"A", "x":1, "y":1},
+ {"label":"S", "x":2, "y":1},
+ {"label":"D", "x":3, "y":1},
+ {"label":"F", "x":4, "y":1},
+ {"label":"G", "x":5, "y":1},
+ {"label":"H", "x":6, "y":1},
+ {"label":"J", "x":7, "y":1},
+ {"label":"K", "x":8, "y":1},
+ {"label":"L", "x":9, "y":1},
+ {"label":"SCLN", "x":10, "y":1},
+ {"label":"QUOT", "x":11, "y":1},
+ {"label":"LSFT", "x":0, "y":2},
+ {"label":"Z", "x":1, "y":2},
+ {"label":"X", "x":2, "y":2},
+ {"label":"C", "x":3, "y":2},
+ {"label":"V", "x":4, "y":2},
+ {"label":"B", "x":5, "y":2},
+ {"label":"N", "x":6, "y":2},
+ {"label":"M", "x":7, "y":2},
+ {"label":"COMM", "x":8, "y":2},
+ {"label":"DOT", "x":9, "y":2},
+ {"label":"SLSH", "x":10, "y":2},
+ {"label":"ENTER", "x":11, "y":2},
+ {"label":"DEL", "x":1, "y":3},
+ {"label":"LGUI", "x":2, "y":3},
+ {"label":"LALT", "x":3, "y":3},
+ {"label":"LOWER", "x":4, "y":3},
+ {"label":" ", "x":5, "y":3},
+ {"label":" ", "x":6, "y":3},
+ {"label":"RAISE", "x":7, "y":3},
+ {"label":"RALT", "x":8, "y":3},
+ {"label":"MENU", "x":9, "y":3},
+ {"label":"RCTL", "x":10, "y":3}
+ ]
+ },
+
+ "LAYOUT_big_boy": {
+ "key_count": 39,
+ "layout": [
+ {"label":"TAB", "x":0, "y":0},
+ {"label":"Q", "x":1, "y":0},
+ {"label":"W", "x":2, "y":0},
+ {"label":"E", "x":3, "y":0},
+ {"label":"R", "x":4, "y":0},
+ {"label":"T", "x":5, "y":0},
+ {"label":"Y", "x":6, "y":0},
+ {"label":"U", "x":7, "y":0},
+ {"label":"I", "x":8, "y":0},
+ {"label":"O", "x":9, "y":0},
+ {"label":"P", "x":10, "y":0},
+ {"label":"BSPC", "x":11, "y":0},
+ {"label":"LCtl", "x":0, "y":1},
+ {"label":"A", "x":1, "y":1},
+ {"label":"S", "x":2, "y":1},
+ {"label":"D", "x":3, "y":1},
+ {"label":"F", "x":4, "y":1},
+ {"label":"G", "x":5, "y":1},
+ {"label":"H", "x":6, "y":1},
+ {"label":"J", "x":7, "y":1},
+ {"label":"K", "x":8, "y":1},
+ {"label":"L", "x":9, "y":1},
+ {"label":"SCLN", "x":10, "y":1},
+ {"label":"QUOT", "x":11, "y":1},
+ {"label":"LSFT", "x":0, "y":2},
+ {"label":"Z", "x":1, "y":2},
+ {"label":"X", "x":2, "y":2},
+ {"label":"C", "x":3, "y":2},
+ {"label":"V", "x":4, "y":2},
+ {"label":"B", "x":5, "y":2},
+ {"label":"N", "x":6, "y":2},
+ {"label":"M", "x":7, "y":2},
+ {"label":"COMM", "x":8, "y":2},
+ {"label":"DOT", "x":9, "y":2},
+ {"label":"SLSH", "x":10, "y":2},
+ {"label":"ENTER", "x":11, "y":2},
+ {"label":"LOWER", "x":1, "y":3, "w":1.5},
+ {"label":" ", "x":2.5, "y":3, "w":7},
+ {"label":"RAISE", "x":9.5, "y":3, "w":1.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/the_royal/schwann/keymaps/default/keymap.c b/keyboards/the_royal/schwann/keymaps/default/keymap.c
new file mode 100644
index 00000000000..0422f2d6856
--- /dev/null
+++ b/keyboards/the_royal/schwann/keymaps/default/keymap.c
@@ -0,0 +1,136 @@
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+ _QWERTY,
+ _LOWER,
+ _RAISE,
+ _OTHER
+};
+
+enum schwann_keycodes {
+ QWERTY = SAFE_RANGE,
+ LOWER,
+ RAISE
+};
+
+//Tap Dance Declarations
+enum {
+ TD_RST
+};
+
+void dance_rst_reset (qk_tap_dance_state_t *state, void *user_data) {
+ if (state->count >= 2) {
+ reset_keyboard();
+ reset_tap_dance(state);
+ }
+}
+
+//All tap dance functions would go here. Only showing this one.
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_RST] = ACTION_TAP_DANCE_FN_ADVANCED (NULL, NULL, dance_rst_reset)
+};
+
+
+#define XXXXX KC_TRNS
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Default Layer
+ * ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
+ * │Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │BkSp│
+ * ├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ * │LCtl│ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │
+ * ├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ * │LSft│ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │Entr│
+ * └────┼────┼────┼────┼────┼────┴────┼────┼────┼────┼────┼────┘
+ * │Del │Gui │Alt │Lwr │ │Rse │Alt │Menu│Ctrl│
+ * └────┴────┴────┴────┴─────────┴────┴────┴────┴────┘
+ */
+
+ [_QWERTY] = LAYOUT_mit(
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
+ KC_DEL, KC_LGUI, KC_LALT, LOWER, KC_SPACE, RAISE, KC_RALT, KC_MENU, KC_RCTL
+ ),
+
+ /* Lower Layer
+ * ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
+ * │Esc │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ │
+ * ├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ * │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ " │
+ * ├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ * │ │ │ │ │ │ │ │ │ ` │ [ │ ] │ . │
+ * └────┼────┼────┼────┼────┼────┴────┼────┼────┼────┼────┼────┘
+ * │ │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────┴─────────┴────┴────┴────┴────┘
+ */
+ [_LOWER] = LAYOUT_mit(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DQT,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_GRAVE, KC_LBRC, KC_RBRC, KC_DOT,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ /* Raise Layer
+ * ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
+ * │ │ │ │ │ │ │ │ │ │ │ - │ │
+ * ├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ * │CAPS│ │ │ │ │ │ │ │ │ │ _ │ \ │
+ * ├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ * │PrSc│ │ │ │ │ │ │ │ │ UP │ │ = │
+ * └────┼────┼────┼────┼────┼────┴────┼────┼────┼────┼────┼────┘
+ * │ │ │ │ │ │ │Left│Down│Rght│
+ * └────┴────┴────┴────┴─────────┴────┴────┴────┴────┘
+ */
+ [_RAISE] = LAYOUT_mit(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MINS, _______,
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UNDS, KC_BSLS,
+ KC_PSCR, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, KC_EQUAL,
+ _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RIGHT
+),
+
+ /* Other Layer
+ * ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
+ * │RSET│ │ │ │ │ │ │ │ │SAT+│Hue+│Brt+│
+ * ├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ * │ │ │ │ │ │ │ │ │ │SAT-│Hue-│Brt-│
+ * ├────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┼────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │RGB!│
+ * └────┼────┼────┼────┼────┼────┴────┼────┼────┼────┼────┼────┘
+ * │ │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────┴─────────┴────┴────┴────┴────┘
+ */
+ [_OTHER] = LAYOUT_mit(
+ TD(TD_RST), _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAI, RGB_HUI, RGB_VAI,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_HUD, RGB_VAD,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case LOWER:
+ if (record->event.pressed) {
+ layer_on(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _OTHER);
+ } else {
+ layer_off(_LOWER);
+ update_tri_layer(_LOWER, _RAISE, _OTHER);
+ }
+ return false;
+ break;
+ case RAISE:
+ if (record->event.pressed) {
+ layer_on(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _OTHER);
+ } else {
+ layer_off(_RAISE);
+ update_tri_layer(_LOWER, _RAISE, _OTHER);
+ }
+ return false;
+ break;
+ }
+ return true;
+};
diff --git a/keyboards/the_royal/schwann/keymaps/default/rules.mk b/keyboards/the_royal/schwann/keymaps/default/rules.mk
new file mode 100644
index 00000000000..e5ddcae8d92
--- /dev/null
+++ b/keyboards/the_royal/schwann/keymaps/default/rules.mk
@@ -0,0 +1 @@
+TAP_DANCE_ENABLE = yes
diff --git a/keyboards/the_royal/schwann/readme.md b/keyboards/the_royal/schwann/readme.md
new file mode 100644
index 00000000000..bb0c27a9acf
--- /dev/null
+++ b/keyboards/the_royal/schwann/readme.md
@@ -0,0 +1,15 @@
+# Schwann PCB
+
+
+
+A simple, HHKB ortho PCB, designed for use with the Neuron Keyboard by Wallet Burner
+
+* Keyboard Maintainer: [TheRoyalSweatshirt](https://github.com/TheRoyalSweatshirt) a.k.a [The_Royal](https://reddit.com/u/The_Royal)
+* Hardware Supported: Rev0.2 and Rev0.5 Schwann PCB
+* Hardware Availability: Private Message, Group buy, or self-procurement via the open sourced [Schwann Documentation](https://github.com/TheRoyalSweatshirt/The_Royal_Projects/tree/schwann/PCBs/Schwann_PCB).
+
+Make example for this keyboard (after setting up your build environment):
+
+ make the_royal/schwann:default
+
+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).
diff --git a/keyboards/the_royal/schwann/rules.mk b/keyboards/the_royal/schwann/rules.mk
new file mode 100644
index 00000000000..9317699f51d
--- /dev/null
+++ b/keyboards/the_royal/schwann/rules.mk
@@ -0,0 +1,32 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+
diff --git a/keyboards/the_royal/schwann/schwann.c b/keyboards/the_royal/schwann/schwann.c
new file mode 100644
index 00000000000..1ef8c939743
--- /dev/null
+++ b/keyboards/the_royal/schwann/schwann.c
@@ -0,0 +1 @@
+#include "schwann.h"
diff --git a/keyboards/the_royal/schwann/schwann.h b/keyboards/the_royal/schwann/schwann.h
new file mode 100644
index 00000000000..933e903ec2c
--- /dev/null
+++ b/keyboards/the_royal/schwann/schwann.h
@@ -0,0 +1,44 @@
+#pragma once
+
+#include "quantum.h"
+
+#define XXX KC_NO
+
+#define LAYOUT_mit( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, \
+ k31, k32, k33, k34, k36, k37, k38, k39, k3A \
+) \
+{ \
+ {k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B}, \
+ {k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B}, \
+ {k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B}, \
+ {XXX, k31, k32, k33, k34, XXX, k36, k37, k38, k39, k3A, XXX} \
+}
+
+#define LAYOUT_full_ortho( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, \
+ k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A \
+) \
+{ \
+ {k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B}, \
+ {k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B}, \
+ {k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B}, \
+ {XXX, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, XXX} \
+}
+
+#define LAYOUT_big_boy( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, \
+ k31, k36, k3A \
+) \
+{ \
+ {k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B}, \
+ {k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B}, \
+ {k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B}, \
+ {XXX, k31, XXX, XXX, XXX, XXX, k36, XXX, XXX, XXX, k3A, XXX} \
+}
diff --git a/keyboards/thevankeyboards/minivan/config.h b/keyboards/thevankeyboards/minivan/config.h
index 7bc8192ed3a..9b3fc8e1aa7 100644
--- a/keyboards/thevankeyboards/minivan/config.h
+++ b/keyboards/thevankeyboards/minivan/config.h
@@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
-#ifndef CONFIG_H
-#define CONFIG_H
+#pragma once
#include "config_common.h"
@@ -70,5 +69,3 @@ along with this program. If not, see .
#define RGB_DI_PIN D0
#define RGBLED_NUM 3
#define RGBLIGHT_SLEEP
-
-#endif
diff --git a/keyboards/thevankeyboards/minivan/keymaps/via/keymap.json b/keyboards/thevankeyboards/minivan/keymaps/via/keymap.json
new file mode 100644
index 00000000000..1e9ef881030
--- /dev/null
+++ b/keyboards/thevankeyboards/minivan/keymaps/via/keymap.json
@@ -0,0 +1,11 @@
+{
+ "keyboard": "thevankeyboards/minivan",
+ "keymap": "via",
+ "layout": "LAYOUT",
+ "layers": [
+ ["KC_TAB", "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P", "KC_BSPC", "KC_NO", "KC_A", "KC_S", "KC_D", "KC_F", "KC_G", "KC_H", "KC_J", "KC_K", "KC_L", "KC_SCLN", "KC_NO", "KC_LSFT", "KC_Z", "KC_X", "KC_C", "KC_V", "KC_B", "KC_N", "KC_M", "KC_COMM", "KC_DOT", "KC_SLSH", "KC_NO", "KC_LCTL", "KC_NO", "KC_LGUI", "KC_ENT", "KC_SPC", "KC_RALT", "KC_ESC", "KC_NO"],
+ ["KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"],
+ ["KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"],
+ ["KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS", "KC_TRNS"]
+ ]
+}
diff --git a/keyboards/thevankeyboards/minivan/keymaps/via/rules.mk b/keyboards/thevankeyboards/minivan/keymaps/via/rules.mk
new file mode 100644
index 00000000000..f2e549c7b75
--- /dev/null
+++ b/keyboards/thevankeyboards/minivan/keymaps/via/rules.mk
@@ -0,0 +1,10 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+# These features are not (yet) supported by VIA
+LEADER_ENABLE = no
+FAUXCLICKY_ENABLE = no
+MIDI_ENABLE = no
+BLUETOOTH_ENABLE = no
+KEY_LOCK_ENABLE = no
+TERMINAL_ENABLE = no
+MOUSEKEY_ENABLE = no
diff --git a/keyboards/thevankeyboards/minivan/minivan.h b/keyboards/thevankeyboards/minivan/minivan.h
index eb9aa679384..dfd971aea3c 100644
--- a/keyboards/thevankeyboards/minivan/minivan.h
+++ b/keyboards/thevankeyboards/minivan/minivan.h
@@ -1,5 +1,4 @@
-#ifndef MINIVAN_H
-#define MINIVAN_H
+#pragma once
#include "quantum.h"
@@ -63,5 +62,3 @@
{ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B }, \
{ K30, K31, K32, K33, K34, KC_NO, KC_NO, K37, K38, K39, K3A, K3B } \
}
-
-#endif
diff --git a/keyboards/tkc1800/config.h b/keyboards/tkc1800/config.h
index a45fb677e54..5ba40bb35cd 100644
--- a/keyboards/tkc1800/config.h
+++ b/keyboards/tkc1800/config.h
@@ -20,8 +20,8 @@ along with this program. If not, see .
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x6060
+#define VENDOR_ID 0x544B // "TK"
+#define PRODUCT_ID 0x0001
#define DEVICE_VER 0x0003
#define MANUFACTURER The Key Company
#define PRODUCT TKC1800
diff --git a/keyboards/tkc1800/keymaps/via/config.h b/keyboards/tkc1800/keymaps/via/config.h
new file mode 100644
index 00000000000..579212d4a3a
--- /dev/null
+++ b/keyboards/tkc1800/keymaps/via/config.h
@@ -0,0 +1 @@
+#define DYNAMIC_KEYMAP_LAYER_COUNT 2
diff --git a/keyboards/tkc1800/keymaps/via/keymap.c b/keyboards/tkc1800/keymaps/via/keymap.c
new file mode 100644
index 00000000000..5455934a306
--- /dev/null
+++ b/keyboards/tkc1800/keymaps/via/keymap.c
@@ -0,0 +1,159 @@
+/* Copyright 2017 Mathias Andersson
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+#include "LUFA/Drivers/Peripheral/TWI.h"
+#include "i2c.h"
+#include "ssd1306.h"
+
+
+//Layers
+
+enum {
+ BASE = 0,
+ FUNCTION,
+};
+
+bool screenWorks = 0;
+
+//13 characters max without re-writing the "Layer: " format in iota_gfx_task_user()
+static char layer_lookup[][14] = {"Base","Function"};
+
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Keymap BASE: (Base Layer) Default Layer
+ * ,-------------------------------------------------------. ,-------------------.
+ * |Esc| F1| F2| F3| F4| | F5| F6| F7| F8| | F9|F10|F11|F12| |Ins |Home|PgUp|PrSc|
+ * `-------------------------------------------------------' |-------------------|
+ * |Del |End |PgDn|ScrL|
+ * ,-----------------------------------------------------------. |-------------------|
+ * | ~ | 1 | 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |NumL| / | * |Paus|
+ * |-----------------------------------------------------------| |-------------------|
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | | 7 | 8 | 9 | - |
+ * |-----------------------------------------------------------| |-------------------|
+ * |CAPS | A| S| D| F| G| H| J| K| L| ;| '|Return | | 4 | 5 | 6 | + |
+ * |-----------------------------------------------------------' |-------------------|
+ * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift | Up | 1 | 2 | 3 | Ent|
+ * |--------------------------------------------------------'----`--------------| |
+ * |Ctrl|Gui |Alt | Space |Alt |Fn |Ctr|Left |Down|Rght| 0 | . | |
+ * `---------------------------------------------------------------------------------'
+ */
+ [BASE] = LAYOUT(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_HOME, KC_PGUP, KC_PSCR, \
+ KC_DEL, KC_END, KC_PGDN, KC_SLCK, \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, XXXXXXX, KC_NLCK, KC_PSLS, KC_PAST, KC_PAUS, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PMNS, \
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, XXXXXXX, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS, \
+ KC_LSFT, XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, XXXXXXX, \
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(FUNCTION), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT \
+ ),
+ /* Keymap FUNCTION: (Function Layer)
+ * ,-------------------------------------------------------. ,-------------------.
+ * | | | | | | | | | | | | | | | | | | | | |
+ * `-------------------------------------------------------' |-------------------|
+ * | | | | |
+ * ,-----------------------------------------------------------. |-------------------|
+ * | | | | | | | | | | | | | | RESET | | | | | |
+ * |-----------------------------------------------------------| |-------------------|
+ * | | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------| |-------------------|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------' |-------------------|
+ * | |Tog|Mod|Hu+|Hu-|Sa+|Sa-|Va+|Va-|Stp| | | | | | | |
+ * |--------------------------------------------------------'----`--------------| |
+ * | | | | | | | | | | | | . | |
+ * `---------------------------------------------------------------------------------'
+ */
+ [FUNCTION] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, XXXXXXX, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, XXXXXXX, _______, _______, _______, _______, _______, \
+ _______, XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, BL_STEP, _______, _______, _______, _______, _______, _______, XXXXXXX, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+ ),
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ return true;
+}
+
+void led_set_user(uint8_t usb_led) {
+
+}
+
+void matrix_init_user(void) {
+ #ifdef USE_I2C
+ i2c_master_init();
+ #ifdef SSD1306OLED
+ // calls code for the SSD1306 OLED
+ _delay_ms(400);
+ TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 800000));
+ if ( iota_gfx_init() ) { // turns on the display
+ screenWorks = 1;
+ }
+ #endif
+ #endif
+ #ifdef AUDIO_ENABLE
+ startup_user();
+ #endif
+}
+
+void matrix_scan_user(void) {
+ #ifdef SSD1306OLED
+ if ( screenWorks ) {
+ iota_gfx_task(); // this is what updates the display continuously
+ };
+ #endif
+}
+
+void matrix_update(struct CharacterMatrix *dest,
+ const struct CharacterMatrix *source) {
+ if (memcmp(dest->display, source->display, sizeof(dest->display))) {
+ memcpy(dest->display, source->display, sizeof(dest->display));
+ dest->dirty = true;
+ }
+}
+
+void iota_gfx_task_user(void) {
+ #if DEBUG_TO_SCREEN
+ if (debug_enable) {
+ return;
+ }
+ #endif
+
+ struct CharacterMatrix matrix;
+
+ matrix_clear(&matrix);
+ matrix_write_P(&matrix, PSTR("TKC1800"));
+
+ uint8_t layer = biton32(layer_state);
+
+ char buf[40];
+ snprintf(buf,sizeof(buf), "Undef-%d", layer);
+ matrix_write_P(&matrix, PSTR("\nLayer: "));
+ matrix_write(&matrix, layer_lookup[layer]);
+
+ // Host Keyboard LED Status
+ char led[40];
+ snprintf(led, sizeof(led), "\n\n%s %s %s",
+ (host_keyboard_leds() & (1< .
-*/
-
-#pragma once
-
-#include "config_common.h"
-
-/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0xDFA5
-#define DEVICE_VER 0x0010
-#define MANUFACTURER marksard
-#define PRODUCT treadstone32
-#define DESCRIPTION Minimal Symmetrical staggered 32-Key Keyboard
-
-/* key matrix size */
-#define MATRIX_ROWS 8
-#define MATRIX_COLS 5
-
-/*
- * 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 { F1, F0, E6, B2, B4, D7, D6, D4 }
-#define MATRIX_COL_PINS { F4, F5, F6, F7, C7 }
-#define UNUSED_PINS
-
-/* COL2ROW, ROW2COL */
-#define DIODE_DIRECTION COL2ROW
-
-/* 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
-
-/* ws2812 RGB LED */
-#define RGB_DI_PIN D3
-#define RGBLIGHT_TIMER
-#define ws2812_PORTREG PORTD
-#define ws2812_DDRREG DDRD
-
-#define RGBLED_NUM 6
-
-#ifndef IOS_DEVICE_ENABLE
- #define RGBLIGHT_LIMIT_VAL 200
- #define RGBLIGHT_VAL_STEP 17
-#else
- #define RGBLIGHT_LIMIT_VAL 50
- #define RGBLIGHT_VAL_STEP 4
-#endif
-#define RGBLIGHT_HUE_STEP 10
-#define RGBLIGHT_SAT_STEP 17
-
-#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE)
-// USB_MAX_POWER_CONSUMPTION value for treadstone32 keyboard
-// 120 RGBoff
-// 330 RGB 6
-// 300 RGB 32
- #define USB_MAX_POWER_CONSUMPTION 400
-#else
- // fix iPhone and iPad power adapter issue
- // iOS device need lessthan 100
- #define USB_MAX_POWER_CONSUMPTION 100
-#endif
-
-/*
- * 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
-//#define NO_ACTION_MACRO
-//#define NO_ACTION_FUNCTION
diff --git a/keyboards/treadstone32/keymaps/default/config.h b/keyboards/treadstone32/keymaps/default/config.h
index a6363f9b9a5..863588c5aa6 100644
--- a/keyboards/treadstone32/keymaps/default/config.h
+++ b/keyboards/treadstone32/keymaps/default/config.h
@@ -1,22 +1,18 @@
-/*
-This is the c configuration file for the keymap
-
-Copyright 2012 Jun Wako
-Copyright 2015 Jack Humbert
-
-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 .
-*/
+/* Copyright 2019 marksard
+ *
+ * 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 .
+ */
#pragma once
@@ -30,7 +26,6 @@ along with this program. If not, see .
#ifdef MOUSEKEY_ENABLE
#undef MOUSEKEY_INTERVAL
#define MOUSEKEY_INTERVAL 1
-
#undef MOUSEKEY_TIME_TO_MAX
#define MOUSEKEY_TIME_TO_MAX 150
@@ -43,16 +38,3 @@ along with this program. If not, see .
#undef MOUSEKEY_DELAY
#define MOUSEKEY_DELAY 0
#endif
-
-// Selection of RGBLIGHT MODE to use.
-#if defined(LED_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
-#endif
diff --git a/keyboards/treadstone32/keymaps/default/keymap.c b/keyboards/treadstone32/keymaps/default/keymap.c
index b49e55f27c5..7ca797fcc00 100644
--- a/keyboards/treadstone32/keymaps/default/keymap.c
+++ b/keyboards/treadstone32/keymaps/default/keymap.c
@@ -38,12 +38,12 @@ enum custom_keycodes {
#define KC_Z_CT LCTL_T(KC_Z)
#define KC_X_AL LALT_T(KC_X)
#define KC_C_GU LGUI_T(KC_C)
-#define KC_SSCT LCTL_T(KC_SLSH)
-#define KC_ENSF LSFT_T(KC_ENT)
+#define KC_SSCT RCTL_T(KC_SLSH)
+#define KC_ENSF RSFT_T(KC_ENT)
// Lower layer mod tap
#define KC_F6SF LSFT_T(KC_F6)
-#define KC_BSSF LSFT_T(KC_BSLS)
+#define KC_QUSF RSFT_T(KC_QUOT)
#define KC_11CT LCTL_T(KC_F11)
#define KC_12AL LALT_T(KC_F12)
@@ -77,9 +77,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//,---------------------------------------------------------------------------------------------------.
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
- KC_F6SF, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, XXXXXXX, KC_SCLN, KC_QUOT,
+ KC_F6SF, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, XXXXXXX, KC_SCLN, KC_QUSF,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
- KC_11CT, KC_12AL, KC_ESC, KC_TAB, KANJI, KC_DEL, XXXXXXX, XXXXXXX, XXXXXXX, KC_GRV,
+ KC_11CT, KC_12AL, KC_ESC, KC_TAB, KANJI, KC_DEL, XXXXXXX, XXXXXXX, KC_RO, KC_GRV,
//`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------'
_______, KC_MLAD
// `---------|---------'
@@ -99,9 +99,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_ADJUST] = LAYOUT(
//,---------------------------------------------------------------------------------------------------.
- RESET, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ RESET, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_INS, KC_PSCR,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
- RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX,
+ RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_NLCK,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX,
//`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------'
diff --git a/keyboards/treadstone32/keymaps/default/rules.mk b/keyboards/treadstone32/keymaps/default/rules.mk
index 5ca4c525866..882ddd69773 100644
--- a/keyboards/treadstone32/keymaps/default/rules.mk
+++ b/keyboards/treadstone32/keymaps/default/rules.mk
@@ -2,10 +2,9 @@
# change to "no" to disable the options, or define them in the Makefile in
# the appropriate keymap folder that will get included automatically
#
+
# If your custom treadstone32 pcb, you can rewrite to yes.
RGBLIGHT_ENABLE = yes # LED underglow (Enable WS2812 RGB underlight.)
-LED_ANIMATIONS = yes # LED animations
-
# Other selectable option
IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone)
diff --git a/keyboards/treadstone32/keymaps/like_jis/config.h b/keyboards/treadstone32/keymaps/like_jis/config.h
index a6363f9b9a5..863588c5aa6 100644
--- a/keyboards/treadstone32/keymaps/like_jis/config.h
+++ b/keyboards/treadstone32/keymaps/like_jis/config.h
@@ -1,22 +1,18 @@
-/*
-This is the c configuration file for the keymap
-
-Copyright 2012 Jun Wako
-Copyright 2015 Jack Humbert
-
-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 .
-*/
+/* Copyright 2019 marksard
+ *
+ * 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 .
+ */
#pragma once
@@ -30,7 +26,6 @@ along with this program. If not, see .
#ifdef MOUSEKEY_ENABLE
#undef MOUSEKEY_INTERVAL
#define MOUSEKEY_INTERVAL 1
-
#undef MOUSEKEY_TIME_TO_MAX
#define MOUSEKEY_TIME_TO_MAX 150
@@ -43,16 +38,3 @@ along with this program. If not, see .
#undef MOUSEKEY_DELAY
#define MOUSEKEY_DELAY 0
#endif
-
-// Selection of RGBLIGHT MODE to use.
-#if defined(LED_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
-#endif
diff --git a/keyboards/treadstone32/keymaps/like_jis/keymap.c b/keyboards/treadstone32/keymaps/like_jis/keymap.c
index 891f484469c..a738226d991 100644
--- a/keyboards/treadstone32/keymaps/like_jis/keymap.c
+++ b/keyboards/treadstone32/keymaps/like_jis/keymap.c
@@ -39,12 +39,12 @@ enum custom_keycodes {
#define KC_Z_CT LCTL_T(KC_Z)
#define KC_X_AL LALT_T(KC_X)
#define KC_C_GU LGUI_T(KC_C)
-#define KC_SSCT LCTL_T(KC_SLSH)
-#define KC_ENSF LSFT_T(KC_ENT)
+#define KC_SSCT RCTL_T(KC_SLSH)
+#define KC_ENSF RSFT_T(KC_ENT)
// Lower layer mod tap
#define KC_F6SF LSFT_T(KC_F6)
-#define KC_BSSF LSFT_T(KC_BSLS)
+#define KC_BSSF RSFT_T(KC_BSLS)
#define KC_11CT LCTL_T(KC_F11)
#define KC_12AL LALT_T(KC_F12)
@@ -80,7 +80,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
KC_F6SF, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, KC_SCLN, KC_QUOT, KC_BSSF,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
- KC_11CT, KC_12AL, KC_ESC, KC_TAB, KANJI, KC_DEL, XXXXXXX, XXXXXXX, XXXXXXX, KC_RO,
+ KC_11CT, KC_12AL, KC_ESC, KC_TAB, KANJI, KC_DEL, XXXXXXX, XXXXXXX, KC_GRV, KC_RO,
//`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------'
_______, KC_MLAD
// `---------|---------'
@@ -100,9 +100,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_ADJUST] = LAYOUT(
//,---------------------------------------------------------------------------------------------------.
- RESET, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ RESET, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_INS, KC_PSCR,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
- RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX,
+ RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_NLCK,
//|---------+---------+---------+---------+---------+---------+---------+---------+---------+---------|
RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, XXXXXXX, XXXXXXX,
//`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------'
diff --git a/keyboards/treadstone32/keymaps/like_jis/rules.mk b/keyboards/treadstone32/keymaps/like_jis/rules.mk
index 8c4541fa197..882ddd69773 100644
--- a/keyboards/treadstone32/keymaps/like_jis/rules.mk
+++ b/keyboards/treadstone32/keymaps/like_jis/rules.mk
@@ -1,14 +1,10 @@
-
# Build Options
# change to "no" to disable the options, or define them in the Makefile in
# the appropriate keymap folder that will get included automatically
#
-TAP_DANCE_ENABLE = no
# If your custom treadstone32 pcb, you can rewrite to yes.
RGBLIGHT_ENABLE = yes # LED underglow (Enable WS2812 RGB underlight.)
-LED_ANIMATIONS = yes # LED animations
-
# Other selectable option
IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone)
@@ -20,6 +16,3 @@ endif
ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes)
OPT_DEFS += -DIOS_DEVICE_ENABLE
endif
-
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
diff --git a/keyboards/treadstone32/lite/config.h b/keyboards/treadstone32/lite/config.h
new file mode 100644
index 00000000000..f7c9b2e0d43
--- /dev/null
+++ b/keyboards/treadstone32/lite/config.h
@@ -0,0 +1,96 @@
+/*
+Copyright 2020 marksard
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0xDFA5
+#define DEVICE_VER 0x0015
+#define MANUFACTURER marksard
+#define PRODUCT treadstone32 lite
+#define DESCRIPTION Minimal Symmetrical staggered 32-Key Keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 5
+
+/*
+ * 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 { B6, B2, F7, F6, B3, B1, F4, F5 }
+#define MATRIX_COL_PINS { B5, B4, E6, D7, C6 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
+#define DIODE_DIRECTION COL2ROW
+#define RGB_DI_PIN D3
+#ifdef RGB_DI_PIN
+ #define RGBLED_NUM 6
+ #ifndef IOS_DEVICE_ENABLE
+ #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
+ #define RGBLIGHT_VAL_STEP 8
+ #else
+ #define RGBLIGHT_LIMIT_VAL 50
+ #define RGBLIGHT_VAL_STEP 4
+ #endif
+ #define RGBLIGHT_HUE_STEP 8
+ #define RGBLIGHT_SAT_STEP 8
+ #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
+
+#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE)
+// USB_MAX_POWER_CONSUMPTION value for treadstone32 keyboard
+// 120 RGBoff
+// 330 RGB 6
+// 300 RGB 32
+ #define USB_MAX_POWER_CONSUMPTION 400
+#else
+ // fix iPhone and iPad power adapter issue
+ // iOS device need lessthan 100
+ #define USB_MAX_POWER_CONSUMPTION 100
+#endif
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
diff --git a/keyboards/treadstone32/lite/lite.c b/keyboards/treadstone32/lite/lite.c
new file mode 100644
index 00000000000..a1997feff0b
--- /dev/null
+++ b/keyboards/treadstone32/lite/lite.c
@@ -0,0 +1,16 @@
+/* Copyright 2019 marksard
+ *
+ * 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 .
+ */
+#include "lite.h"
diff --git a/keyboards/treadstone32/treadstone32.h b/keyboards/treadstone32/lite/lite.h
similarity index 100%
rename from keyboards/treadstone32/treadstone32.h
rename to keyboards/treadstone32/lite/lite.h
diff --git a/keyboards/treadstone32/lite/rules.mk b/keyboards/treadstone32/lite/rules.mk
new file mode 100644
index 00000000000..4bdc53c1108
--- /dev/null
+++ b/keyboards/treadstone32/lite/rules.mk
@@ -0,0 +1,9 @@
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
diff --git a/keyboards/treadstone32/readme.md b/keyboards/treadstone32/readme.md
index 989a29c204b..99cbe4e0145 100644
--- a/keyboards/treadstone32/readme.md
+++ b/keyboards/treadstone32/readme.md
@@ -10,9 +10,12 @@ Hardware Availability: links to where you can find this hardware
Make example for this keyboard (after setting up your build environment):
- make treadstone32:default:dfu
+ make treadstone32:default
+ or
+ make treadstone32/lite:default
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).
[Build guide](https://github.com/marksard/Keyboards/blob/master/treadstone32/documents/treadstone32_buildguide.md)
+[Build guide (lite)](https://github.com/marksard/Keyboards/blob/master/treadstone32/documents/treadstone32lite_buildguide.md)
[Firmware](https://github.com/marksard/qmk_firmware/tree/my_customize/keyboards/treadstone32)
diff --git a/keyboards/treadstone32/rev1/config.h b/keyboards/treadstone32/rev1/config.h
new file mode 100644
index 00000000000..caec9c5825a
--- /dev/null
+++ b/keyboards/treadstone32/rev1/config.h
@@ -0,0 +1,97 @@
+/*
+Copyright 2019 marksard
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0xDFA5
+#define DEVICE_VER 0x0010
+#define MANUFACTURER marksard
+#define PRODUCT treadstone32
+#define DESCRIPTION Minimal Symmetrical staggered 32-Key Keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 5
+
+/*
+ * 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 { F1, F0, E6, B2, B4, D7, D6, D4 }
+#define MATRIX_COL_PINS { F4, F5, F6, F7, C7 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+#define RGB_DI_PIN D3
+#ifdef RGB_DI_PIN
+ #define RGBLED_NUM 6
+ #ifndef IOS_DEVICE_ENABLE
+ #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
+ #define RGBLIGHT_VAL_STEP 8
+ #else
+ #define RGBLIGHT_LIMIT_VAL 50
+ #define RGBLIGHT_VAL_STEP 4
+ #endif
+ #define RGBLIGHT_HUE_STEP 8
+ #define RGBLIGHT_SAT_STEP 8
+ #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
+
+#if defined(RGBLIGHT_ENABLE) && !defined(IOS_DEVICE_ENABLE)
+// USB_MAX_POWER_CONSUMPTION value for treadstone32 keyboard
+// 120 RGBoff
+// 330 RGB 6
+// 300 RGB 32
+ #define USB_MAX_POWER_CONSUMPTION 400
+#else
+ // fix iPhone and iPad power adapter issue
+ // iOS device need lessthan 100
+ #define USB_MAX_POWER_CONSUMPTION 100
+#endif
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
diff --git a/keyboards/treadstone32/rev1/rev1.c b/keyboards/treadstone32/rev1/rev1.c
new file mode 100644
index 00000000000..bf41abddbe8
--- /dev/null
+++ b/keyboards/treadstone32/rev1/rev1.c
@@ -0,0 +1,16 @@
+/* Copyright 2019 marksard
+ *
+ * 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 .
+ */
+#include "rev1.h"
diff --git a/keyboards/treadstone32/rev1/rev1.h b/keyboards/treadstone32/rev1/rev1.h
new file mode 100644
index 00000000000..90181124c09
--- /dev/null
+++ b/keyboards/treadstone32/rev1/rev1.h
@@ -0,0 +1,45 @@
+/* Copyright 2019 marksard.
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "quantum.h"
+
+#define K_N KC_NO
+
+/* This 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( \
+ L09, L08, L07, L06, L05, L04, L03, L02, L01, L00, \
+ L19, L18, L17, L16, L15, L14, L13, L12, L11, L10, \
+ L29, L28, L27, L26, L25, L24, L23, L22, L21, L20, \
+ L35, L34 \
+ ) \
+ { \
+ { L00, L01, L02, L03, L04 }, \
+ { L10, L11, L12, L13, L14 }, \
+ { L20, L21, L22, L23, L24 }, \
+ { K_N, K_N, K_N, K_N, L34 }, \
+ { L05, L06, L07, L08, L09 }, \
+ { L15, L16, L17, L18, L19 }, \
+ { L25, L26, L27, L28, L29 }, \
+ { L35, K_N, K_N, K_N, K_N } \
+ }
diff --git a/keyboards/treadstone32/rules.mk b/keyboards/treadstone32/rules.mk
index d779e70020b..64ca6a72141 100644
--- a/keyboards/treadstone32/rules.mk
+++ b/keyboards/treadstone32/rules.mk
@@ -27,3 +27,5 @@ UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
LEADER_ENABLE = no
+
+DEFAULT_FOLDER = treadstone32/rev1
diff --git a/keyboards/treadstone32/treadstone32.c b/keyboards/treadstone32/treadstone32.c
deleted file mode 100644
index 9d27f86ffed..00000000000
--- a/keyboards/treadstone32/treadstone32.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Copyright 2019 marksard
- *
- * 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 .
- */
-#include "treadstone32.h"
-
-void matrix_init_kb(void) {
- // put your keyboard start-up code here
- // runs once when the firmware starts up
-
- matrix_init_user();
-}
-
-void matrix_scan_kb(void) {
- // put your looping keyboard code here
- // runs every cycle (a lot)
-
- matrix_scan_user();
-}
-
-bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
- // put your per-action keyboard code here
- // runs for every action, just before processing by the firmware
-
- return process_record_user(keycode, record);
-}
-
-void led_set_kb(uint8_t usb_led) {
- // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
-
- led_set_user(usb_led);
-}
diff --git a/keyboards/treadstone48/keymaps/default/keymap.c b/keyboards/treadstone48/keymaps/default/keymap.c
index 100434246d9..41f8f399f1e 100644
--- a/keyboards/treadstone48/keymaps/default/keymap.c
+++ b/keyboards/treadstone48/keymaps/default/keymap.c
@@ -14,16 +14,8 @@
* along with this program. If not, see .
*/
#include QMK_KEYBOARD_H
-#include "keymap_jp.h"
#include "../common/oled_helper.h"
-#ifdef RGBLIGHT_ENABLE
-//Following line allows macro to read current RGB settings
-extern rgblight_config_t rgblight_config;
-#endif
-
-extern uint8_t is_master;
-
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
@@ -43,83 +35,65 @@ enum custom_keycodes {
RGBRST
};
-enum tapdances{
- TD_SCCL = 0,
- TD_SLRO,
-};
-
-// Layer Mode aliases
-#define _____ KC_TRNS
-#define XXXXX KC_NO
-
#define KC_TBSF LSFT_T(KC_TAB)
-// #define KC_SPSF LSFT_T(KC_SPC)
#define KC_ALAP LALT_T(KC_APP)
-#define KC_JEQL LSFT(KC_MINS)
-
-#define KC_SCCL TD(TD_SCCL)
-#define KC_SLRO TD(TD_SLRO)
-
-qk_tap_dance_action_t tap_dance_actions[] = {
- [TD_SCCL] = ACTION_TAP_DANCE_DOUBLE(KC_SCLN, KC_QUOT),
- [TD_SLRO] = ACTION_TAP_DANCE_DOUBLE(KC_SLSH, KC_RO),
-};
+#define KC_GRSF RSFT_T(KC_GRV)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_base( \
//,--------------------------------------------------------------------------------------------------------------------.
- KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS,\
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------|
- KC_TBSF, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCCL, KC_ENT,\
+ KC_TBSF, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLRO, KC_UP, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, \
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- KC_LCTRL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_ALAP, KC_LEFT, KC_DOWN, KC_RGHT,\
+ KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_ALAP, KC_LEFT, KC_DOWN, KC_RGHT,\
//`-------------------------------------------------------------------------------------------------------------------'
- KC_DEL \
- // ExtraKey: Split backspace key or it is below the enter key.
+ KC_GRSF \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
),
[_LOWER] = LAYOUT_base( \
//,--------------------------------------------------------------------------------------------------------------------.
- _____, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,\
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------|
- _____, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXX, XXXXX, XXXXX, KC_SCLN, KC_QUOT, _____,\
+ _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, XXXXXXX, KC_SCLN, KC_QUOT, _______,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- _____, KC_F11, KC_F12, XXXXX, KANJI, KC_ENT, XXXXX, XXXXX, KC_COMM, KC_DOT, KC_GRV, KC_PGUP, \
+ _______, KC_F11, KC_F12, XXXXXXX, XXXXXXX, KANJI, XXXXXXX, XXXXXXX, KC_COMM, KC_DOT, KC_GRV, KC_PGUP, \
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- _____, _____, _____, _____, KC_DEL, _____, _____, XXXXX, KC_HOME, KC_PGDN, KC_END,\
+ _______, _______, _______, _______, KC_DEL, _______, _______, XXXXXXX, KC_HOME, KC_PGDN, KC_END,\
//`-------------------------------------------------------------------------------------------------------------------'
- XXXXX \
- // ExtraKey: Split backspace key or it is below the enter key.
+ _______ \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
),
[_RAISE] = LAYOUT_base( \
//,--------------------------------------------------------------------------------------------------------------------.
- _____, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, XXXXX,\
+ _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, XXXXXXX,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------|
- _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, KC_4, KC_5, KC_6, KC_QUOT, _____,\
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_4, KC_5, KC_6, KC_QUOT, _______,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, KC_1, KC_2, KC_3, KC_RO, XXXXX, \
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_1, KC_2, KC_3, KC_RO, XXXXXXX, \
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- _____, _____, _____, _____, _____, _____, _____, KC_0, KC_DOT, KC_COMM, KC_SLSH,\
+ _______, _______, _______, _______, _______, _______, _______, KC_0, KC_DOT, KC_COMM, KC_SLSH,\
//`-------------------------------------------------------------------------------------------------------------------'
- XXXXX \
- // ExtraKey: Split backspace key or it is below the enter key.
+ _______ \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
),
[_ADJUST] = LAYOUT_base( \
//,--------------------------------------------------------------------------------------------------------------------.
- XXXXX, RESET, RGBRST, AG_NORM, AG_SWAP, XXXXX, XXXXX, KC_WH_L, KC_WH_U, KC_HOME, KC_PGUP, XXXXX,\
+ XXXXXXX, RESET, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_U, KC_HOME, KC_PGUP, XXXXXXX,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------|
- XXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXX, XXXXX, KC_WH_R, KC_WH_D, KC_END, KC_PGDN, XXXXX,\
+ XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, KC_WH_R, KC_WH_D, KC_END, KC_PGDN, XXXXXXX,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- _____, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXX, XXXXX, XXXXX, KC_BTN1, KC_BTN2, XXXXX, KC_MS_U, \
+ _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, KC_MS_U, \
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- _____, _____, _____, _____, XXXXX, XXXXX, _____, XXXXX, KC_MS_L, KC_MS_D, KC_MS_R,\
+ _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R,\
//`-------------------------------------------------------------------------------------------------------------------'
- XXXXX \
- // ExtraKey: Split backspace key or it is below the enter key.
+ _______ \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
)
};
diff --git a/keyboards/treadstone48/keymaps/default/readme_jp.md b/keyboards/treadstone48/keymaps/default/readme_jp.md
index 6043c93cbce..93aaa190e38 100644
--- a/keyboards/treadstone48/keymaps/default/readme_jp.md
+++ b/keyboards/treadstone48/keymaps/default/readme_jp.md
@@ -19,17 +19,12 @@ Layer Tapはタップで指定したキー、長押しで指定したレイヤ
Mod Tapはタップで視程したキー、長押しで視程したレイヤーに移動します。
例:LSFT_T(KC_Z) → タップでZ、長押しで左シフト
-Tap Danceは指定した二つのキーをシングルタップ、ダブルタップで切り替えられます。
-例:[TD_CODO] = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_DOT) → シングルタップでCOMM、ダブルタップでDOT
-
もう少し詳しい内容についてはQMK Documentをお読みいただくかネットを検索すれば情報が載っていますので別途検索してみてください。
## 機能
QWERTYキーマップをベースにしていて、LowerレイヤーとRaiseレイヤーに他のキーを配置しています。
LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来ます。
- DOTの横、SLROと書いてあるのはシングルタップで/記号、ダブルタップで\記号が入力出来るようになっています。
- Lの横、SCCLと書いてあるのはシングルタップで;記号、ダブルタップで:記号が入力出来るようになっています。
マウスキーの割り当てがありますので、もし使用したい場合はrules.mkでMOUSEKEY_ENABLE = yesにしてmakeすると使用することができます。
## 48キー目について
@@ -39,11 +34,11 @@ Tap Danceは指定した二つのキーをシングルタップ、ダブルタ
各レイヤーの最下段の
```c
- XXXXX \
- // ExtraKey: Split backspace key or it is below the enter key.
+ XXXXXXX \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
```
- のXXXXXに任意のキーを入れることでPの右隣のキーとして動作するようになっています。その右隣りに従来のキーが配置されています。
+ のXXXXXXXに任意のキーを入れることでPの右隣のキーとして動作するようになっています。その右隣りに従来のキーが配置されています。
## OS切り替え方法
diff --git a/keyboards/treadstone48/keymaps/default/rules.mk b/keyboards/treadstone48/keymaps/default/rules.mk
index 474e71ab113..26bacb0cfe2 100644
--- a/keyboards/treadstone48/keymaps/default/rules.mk
+++ b/keyboards/treadstone48/keymaps/default/rules.mk
@@ -1,8 +1,7 @@
MOUSEKEY_ENABLE = yes # Mouse keys
-TAP_DANCE_ENABLE = yes
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
-OLED_DRIVER_ENABLE = no
+OLED_DRIVER_ENABLE = yes
LTO_ENABLE = yes
# If you want to change the display of OLED, you need to change here
diff --git a/keyboards/treadstone48/keymaps/like_jis/keymap.c b/keyboards/treadstone48/keymaps/like_jis/keymap.c
index 6cde28d24b6..bbc6351bc24 100644
--- a/keyboards/treadstone48/keymaps/like_jis/keymap.c
+++ b/keyboards/treadstone48/keymaps/like_jis/keymap.c
@@ -14,16 +14,8 @@
* along with this program. If not, see .
*/
#include QMK_KEYBOARD_H
-#include "keymap_jp.h"
#include "../common/oled_helper.h"
-#ifdef RGBLIGHT_ENABLE
-//Following line allows macro to read current RGB settings
-extern rgblight_config_t rgblight_config;
-#endif
-
-extern uint8_t is_master;
-
// Each layer gets a name for readability, which is then used in the keymap matrix below.
// The underscores don't mean anything - you can have a layer called STUFF or any other name.
// Layer names don't all need to be of the same length, obviously, and you can also skip them
@@ -43,83 +35,65 @@ enum custom_keycodes {
RGBRST
};
-enum tapdances{
- TD_SCCL = 0,
- TD_SLRO,
-};
-
-// Layer Mode aliases
-#define _____ KC_TRNS
-#define XXXXX KC_NO
-
#define KC_TBSF LSFT_T(KC_TAB)
-// #define KC_SPSF LSFT_T(KC_SPC)
#define KC_ALAP LALT_T(KC_APP)
-#define KC_JEQL LSFT(KC_MINS)
-
-#define KC_SCCL TD(TD_SCCL)
-#define KC_SLRO TD(TD_SLRO)
-
-qk_tap_dance_action_t tap_dance_actions[] = {
- [TD_SCCL] = ACTION_TAP_DANCE_DOUBLE(KC_SCLN, KC_QUOT),
- [TD_SLRO] = ACTION_TAP_DANCE_DOUBLE(KC_SLSH, KC_RO),
-};
+#define KC_ROSF RSFT_T(KC_RO)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_base( \
//,--------------------------------------------------------------------------------------------------------------------.
- KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS,\
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------|
- KC_TBSF, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCCL, KC_ENT,\
+ KC_TBSF, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLRO, KC_UP, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, \
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- KC_LCTRL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_ALAP, KC_LEFT, KC_DOWN, KC_RGHT,\
+ KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_ALAP, KC_LEFT, KC_DOWN, KC_RGHT,\
//`-------------------------------------------------------------------------------------------------------------------'
- KC_DEL \
- // ExtraKey: Split backspace key or it is below the enter key.
+ KC_ROSF \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
),
[_LOWER] = LAYOUT_base( \
//,--------------------------------------------------------------------------------------------------------------------.
- _____, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, KC_JYEN, KC_LBRC, KC_RBRC, KC_DEL,\
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, KC_JYEN, KC_LBRC, KC_RBRC, KC_DEL,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------|
- _____, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXX, XXXXX, KC_SCLN, KC_QUOT, KC_BSLS, _____,\
+ _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, KC_SCLN, KC_QUOT, KC_BSLS, _______,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- _____, KC_F11, KC_F12, XXXXX, KANJI, KC_ENT, XXXXX, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_PGUP, \
+ _______, KC_F11, KC_F12, XXXXXXX, XXXXXXX, KANJI, XXXXXXX, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_PGUP, \
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- _____, _____, _____, _____, KC_DEL, _____, _____, XXXXX, KC_HOME, KC_PGDN, KC_END,\
+ _______, _______, _______, _______, KC_DEL, _______, _______, XXXXXXX, KC_HOME, KC_PGDN, KC_END,\
//`-------------------------------------------------------------------------------------------------------------------'
- XXXXX \
- // ExtraKey: Split backspace key or it is below the enter key.
+ _______ \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
),
[_RAISE] = LAYOUT_base( \
//,--------------------------------------------------------------------------------------------------------------------.
- _____, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, XXXXX,\
+ _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, XXXXXXX,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------|
- _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, KC_4, KC_5, KC_6, KC_QUOT, _____,\
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_4, KC_5, KC_6, KC_QUOT, _______,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, KC_1, KC_2, KC_3, KC_RO, XXXXX, \
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_1, KC_2, KC_3, KC_RO, XXXXXXX, \
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- _____, _____, _____, _____, _____, _____, _____, KC_0, KC_DOT, KC_COMM, KC_SLSH,\
+ _______, _______, _______, _______, _______, _______, _______, KC_0, KC_DOT, KC_COMM, KC_SLSH,\
//`-------------------------------------------------------------------------------------------------------------------'
- XXXXX \
- // ExtraKey: Split backspace key or it is below the enter key.
+ _______ \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
),
[_ADJUST] = LAYOUT_base( \
//,--------------------------------------------------------------------------------------------------------------------.
- XXXXX, RESET, RGBRST, AG_NORM, AG_SWAP, XXXXX, XXXXX, KC_WH_L, KC_WH_U, KC_HOME, KC_PGUP, XXXXX,\
+ XXXXXXX, RESET, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_U, KC_HOME, KC_PGUP, XXXXXXX,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------|
- XXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXX, XXXXX, KC_WH_R, KC_WH_D, KC_END, KC_PGDN, XXXXX,\
+ XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, KC_WH_R, KC_WH_D, KC_END, KC_PGDN, XXXXXXX,\
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- _____, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXX, XXXXX, XXXXX, KC_BTN1, KC_BTN2, XXXXX, KC_MS_U, \
+ _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, KC_MS_U, \
//|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------|
- _____, _____, _____, _____, XXXXX, XXXXX, _____, XXXXX, KC_MS_L, KC_MS_D, KC_MS_R,\
+ _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R,\
//`-------------------------------------------------------------------------------------------------------------------'
- XXXXX \
- // ExtraKey: Split backspace key or it is below the enter key.
+ _______ \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
)
};
diff --git a/keyboards/treadstone48/keymaps/like_jis/readme_jp.md b/keyboards/treadstone48/keymaps/like_jis/readme_jp.md
index 305ded471da..5ae638b0d1d 100644
--- a/keyboards/treadstone48/keymaps/like_jis/readme_jp.md
+++ b/keyboards/treadstone48/keymaps/like_jis/readme_jp.md
@@ -19,17 +19,12 @@ Layer Tapはタップで指定したキー、長押しで指定したレイヤ
Mod Tapはタップで視程したキー、長押しで視程したレイヤーに移動します。
例:LSFT_T(KC_Z) → タップでZ、長押しで左シフト
-Tap Danceは指定した二つのキーをシングルタップ、ダブルタップで切り替えられます。
-例:[TD_CODO] = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_DOT) → シングルタップでCOMM、ダブルタップでDOT
-
もう少し詳しい内容についてはQMK Documentをお読みいただくかネットを検索すれば情報が載っていますので別途検索してみてください。
## 機能
QWERTYキーマップをベースにしていて、LowerレイヤーとRaiseレイヤーに他のキーを配置しています。
LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来ます。
- DOTの横、SLROと書いてあるのはシングルタップで/記号、ダブルタップで\記号が入力出来るようになっています。
- Lの横、SCCLと書いてあるのはシングルタップで;記号、ダブルタップで:記号が入力出来るようになっています。
マウスキーの割り当てがありますので、もし使用したい場合はrules.mkでMOUSEKEY_ENABLE = yesにしてmakeすると使用することができます。
## 48キー目について
@@ -39,8 +34,8 @@ Tap Danceは指定した二つのキーをシングルタップ、ダブルタ
各レイヤーの最下段の
```c
- XXXXX \
- // ExtraKey: Split backspace key or it is below the enter key.
+ XXXXXXX \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
```
のXXXXXに任意のキーを入れることでPの右隣のキーとして動作するようになっています。その右隣りに従来のキーが配置されています。
diff --git a/keyboards/treadstone48/keymaps/like_jis/rules.mk b/keyboards/treadstone48/keymaps/like_jis/rules.mk
index 474e71ab113..26bacb0cfe2 100644
--- a/keyboards/treadstone48/keymaps/like_jis/rules.mk
+++ b/keyboards/treadstone48/keymaps/like_jis/rules.mk
@@ -1,8 +1,7 @@
MOUSEKEY_ENABLE = yes # Mouse keys
-TAP_DANCE_ENABLE = yes
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
-OLED_DRIVER_ENABLE = no
+OLED_DRIVER_ENABLE = yes
LTO_ENABLE = yes
# If you want to change the display of OLED, you need to change here
diff --git a/keyboards/treadstone48/keymaps/like_jis_rs/keymap.c b/keyboards/treadstone48/keymaps/like_jis_rs/keymap.c
deleted file mode 100644
index 354e40146f9..00000000000
--- a/keyboards/treadstone48/keymaps/like_jis_rs/keymap.c
+++ /dev/null
@@ -1,320 +0,0 @@
-/* Copyright 2020 marksard
- *
- * 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 .
- */
-#include QMK_KEYBOARD_H
-#include "keymap_jp.h"
-#include "../common/oled_helper.h"
-
-#ifdef RGBLIGHT_ENABLE
-//Following line allows macro to read current RGB settings
-extern rgblight_config_t rgblight_config;
-#endif
-
-extern uint8_t is_master;
-
-// Each layer gets a name for readability, which is then used in the keymap matrix below.
-// The underscores don't mean anything - you can have a layer called STUFF or any other name.
-// Layer names don't all need to be of the same length, obviously, and you can also skip them
-// entirely and just use numbers.
-enum layer_number {
- _BASE = 0,
- _BASES,
- _LOWER,
- _LOWRS,
- _RAISE,
- _ADJUST,
-};
-
-enum custom_keycodes {
- BASE = SAFE_RANGE,
- BASES,
- LOWER,
- LOWRS,
- RAISE,
- ADJUST,
- KANJI,
- RGBRST
-};
-
-enum tapdances{
- TD_SCCL = 0,
- TD_SLRO,
-};
-
-// Layer Mode aliases
-#define _____ KC_TRNS
-#define XXXXX KC_NO
-
-#define KC_TBSF LSFT_T(KC_TAB)
-// #define KC_SPSF LSFT_T(KC_SPC)
-#define KC_ALAP LALT_T(KC_APP)
-#define KC_JEQL LSFT(KC_MINS)
-#define KC_SFUC LSFT(KC_RO)
-#define KC_RSBR LSFT(KC_8)
-#define KC_REBR LSFT(KC_9)
-
-#define KC_ZSFT LSFT_T(KC_Z)
-#define KC_ESCT LCTL_T(KC_ESC)
-#define KC_TBAL LALT_T(KC_TAB)
-#define KC_11SF LSFT_T(KC_F11)
-
-#define KC_SCCL TD(TD_SCCL)
-#define KC_SLRO TD(TD_SLRO)
-
-qk_tap_dance_action_t tap_dance_actions[] = {
- [TD_SCCL] = ACTION_TAP_DANCE_DOUBLE(KC_SCLN, KC_QUOT),
- [TD_SLRO] = ACTION_TAP_DANCE_DOUBLE(KC_SLSH, KC_RO),
-};
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [_BASE] = LAYOUT_rs( \
- // Treadstone48 Rhymestone
- //,--------------------------------------------------------------------------------------------------------------------. --------------------------------------------.
- KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, KC_P7, KC_P8, KC_P9, KC_PSLS, KC_NLCK,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------| --------+--------+--------+--------+--------|
- KC_TBSF, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCCL, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PAST, KC_TAB,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLRO, KC_UP, KC_P1, KC_P2, KC_P3, KC_PMNS, KC_PENT,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
- KC_LCTRL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_ALAP, KC_LEFT, KC_DOWN, KC_RGHT, LOWER, KC_P0, KC_PDOT, KC_PPLS, KC_BSPC,\
- //`--------------------------------------------------------------------------------------------------------------------' --------------------------------------------'
- KC_DEL \
- // ExtraKey: Split backspace key or it is below the enter key.
- ),
-
- [_LOWER] = LAYOUT_rs( \
- // Treadstone48 Rhymestone
- //,--------------------------------------------------------------------------------------------------------------------. --------------------------------------------.
- _____, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, KC_JYEN, KC_LBRC, KC_RBRC, KC_DEL, KC_A, KC_B, KC_C, KC_JYEN, KC_HASH,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------| --------+--------+--------+--------+--------|
- _____, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXX, XXXXX, KC_SCLN, KC_QUOT, KC_BSLS, _____, KC_D, KC_E, KC_F, KC_PERC, KC_SFUC,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
- _____, KC_F11, KC_F12, BASES, KANJI, KC_ENT, XXXXX, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_PGUP, KC_RSBR, KC_REBR, KC_RBRC, KC_QUOT, _____,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
- _____, _____, _____, _____, KC_DEL, _____, _____, XXXXX, KC_HOME, KC_PGDN, KC_END, _____, XXXXX, KC_COMM, KC_JEQL, KC_DEL,\
- //`--------------------------------------------------------------------------------------------------------------------' --------------------------------------------'
- XXXXX \
- // ExtraKey: Split backspace key or it is below the enter key.
- ),
-
- [_BASES] = LAYOUT_rs( \
- // Treadstone48 Rhymestone
- //,--------------------------------------------------------------------------------------------------------------------. --------------------------------------------.
- KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, KC_Q, KC_W, KC_E, KC_R, KC_T,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------| --------+--------+--------+--------+--------|
- KC_TBSF, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCCL, KC_ENT, KC_A, KC_S, KC_D, KC_F, KC_G,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLRO, KC_UP, KC_ZSFT, KC_X, KC_C, KC_V, KC_B,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
- KC_LCTRL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_ALAP, KC_LEFT, KC_DOWN, KC_RGHT, KC_ESCT, KC_TBAL, KC_LGUI, LOWRS, KC_BSPC,\
- //`--------------------------------------------------------------------------------------------------------------------' --------------------------------------------'
- KC_DEL \
- // ExtraKey: Split backspace key or it is below the enter key.
- ),
-
- [_LOWRS] = LAYOUT_rs( \
- // Treadstone48 Rhymestone
- //,--------------------------------------------------------------------------------------------------------------------. --------------------------------------------.
- _____, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, KC_JYEN, KC_LBRC, KC_RBRC, KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------| --------+--------+--------+--------+--------|
- _____, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXX, XXXXX, KC_SCLN, KC_QUOT, KC_BSLS, _____, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
- _____, KC_F11, KC_F12, BASE, KANJI, KC_ENT, XXXXX, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_PGUP, KC_11SF, KC_F12, BASE, KANJI, KC_ENT,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
- _____, _____, _____, _____, KC_DEL, _____, _____, XXXXX, KC_HOME, KC_PGDN, KC_END, _____, _____, _____, _____, KC_DEL,\
- //`--------------------------------------------------------------------------------------------------------------------' --------------------------------------------'
- XXXXX \
- // ExtraKey: Split backspace key or it is below the enter key.
- ),
-
- [_RAISE] = LAYOUT_rs( \
- // Treadstone48 Rhymestone
- //,--------------------------------------------------------------------------------------------------------------------. --------------------------------------------.
- _____, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------| --------+--------+--------+--------+--------|
- _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, KC_4, KC_5, KC_6, KC_QUOT, _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
- _____, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, KC_1, KC_2, KC_3, KC_RO, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
- _____, _____, _____, _____, _____, _____, _____, KC_0, KC_DOT, KC_COMM, KC_SLSH, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
- //`--------------------------------------------------------------------------------------------------------------------' --------------------------------------------'
- XXXXX \
- // ExtraKey: Split backspace key or it is below the enter key.
- ),
-
- [_ADJUST] = LAYOUT_rs( \
- // Treadstone48 Rhymestone
- //,--------------------------------------------------------------------------------------------------------------------. --------------------------------------------.
- XXXXX, RESET, RGBRST, AG_NORM, AG_SWAP, XXXXX, XXXXX, KC_WH_L, KC_WH_U, KC_HOME, KC_PGUP, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------| --------+--------+--------+--------+--------|
- XXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXX, XXXXX, KC_WH_R, KC_WH_D, KC_END, KC_PGDN, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
- _____, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXX, XXXXX, XXXXX, KC_BTN1, KC_BTN2, XXXXX, KC_MS_U, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
- //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
- _____, _____, _____, _____, XXXXX, XXXXX, _____, XXXXX, KC_MS_L, KC_MS_D, KC_MS_R, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,\
- //`--------------------------------------------------------------------------------------------------------------------' --------------------------------------------'
- XXXXX \
- // ExtraKey: Split backspace key or it is below the enter key.
- )
-};
-
-#define L_BASE _BASE
-#define L_BASES (1<<_BASES)
-#define L_LOWER (1<<_LOWER)
-#define L_LOWRS (1<<_LOWRS)
-#define L_RAISE (1<<_RAISE)
-#define L_ADJUST (1<<_ADJUST)
-#define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER)
-
-#ifdef OLED_DRIVER_ENABLE
-#include
-#include
-
-typedef struct {
- uint8_t state;
- char name[8];
-}LAYER_DISPLAY_NAME;
-
-#define LAYER_DISPLAY_MAX 7
-const LAYER_DISPLAY_NAME layer_display_name[LAYER_DISPLAY_MAX] = {
- {L_BASE, "Base"},
- {L_BASE + 1, "Base"},
- {L_BASES, "BaseSpl"},
- {L_LOWER, "Lower"},
- {L_LOWRS, "LowrSpl"},
- {L_RAISE, "Raise"},
- {L_ADJUST_TRI, "Adjust"}
-};
-
-static inline const char* get_leyer_status(void) {
-
- for (uint8_t i = 0; i < LAYER_DISPLAY_MAX; ++i) {
- if (layer_state == 0 && layer_display_name[i].state == default_layer_state) {
-
- return layer_display_name[i].name;
- } else if (layer_state != 0 && layer_display_name[i].state == layer_state) {
-
- return layer_display_name[i].name;
- }
- }
-
- return "?";
-}
-
-static char layer_status_buf[24] = "Layer state ready.\n";
-static inline void update_keymap_status(void) {
-
- snprintf(layer_status_buf, sizeof(layer_status_buf) - 1, "OS:%s Layer:%s\n",
- keymap_config.swap_lalt_lgui? "win" : "mac", get_leyer_status());
-}
-
-static inline void render_keymap_status(void) {
-
- oled_write(layer_status_buf, false);
-}
-
-#define UPDATE_KEYMAP_STATUS() update_keymap_status()
-
-static inline void render_status(void) {
-
- UPDATE_LED_STATUS();
- RENDER_LED_STATUS();
- render_keymap_status();
- UPDATE_LOCK_STATUS();
- RENDER_LOCK_STATUS();
- RENDER_KEY_STATUS();
-}
-
-oled_rotation_t oled_init_user(oled_rotation_t rotation) {
-
-// if (is_keyboard_master())
-// return OLED_ROTATION_180; // flips the display 180 degrees if offhand
- return rotation;
-}
-
-void oled_task_user(void) {
-
- if (is_keyboard_master()) {
- render_status();
- } else {
- render_logo();
- }
-}
-
-#else
-
-#define UPDATE_KEYMAP_STATUS()
-
-#endif
-
-void update_change_layer(bool pressed, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
-
- pressed ? layer_on(layer1) : layer_off(layer1);
- IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2) ? layer_on(layer3) : layer_off(layer3);
-}
-
-int RGB_current_mode;
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
-
- UPDATE_KEY_STATUS(keycode, record);
-
- bool result = false;
- switch (keycode) {
- case LOWER:
- update_change_layer(record->event.pressed, _LOWER, _RAISE, _ADJUST);
- break;
- case RAISE:
- update_change_layer(record->event.pressed, _RAISE, _LOWER, _ADJUST);
- break;
- case BASE:
- if (record->event.pressed) {
- default_layer_set(L_BASE);
- }
- break;
- case BASES:
- if (record->event.pressed) {
- default_layer_set(L_BASES);
- }
- break;
- case LOWRS:
- update_change_layer(record->event.pressed, _LOWRS, _RAISE, _ADJUST);
- break;
- case KANJI:
- if (record->event.pressed) {
- if (keymap_config.swap_lalt_lgui == false) {
- register_code(KC_LANG2);
- } else {
- SEND_STRING(SS_LALT("`"));
- }
- } else {
- unregister_code(KC_LANG2);
- }
- break;
- #ifdef RGBLIGHT_ENABLE
- case RGBRST:
- if (record->event.pressed) {
- eeconfig_update_rgblight_default();
- rgblight_enable();
- }
- break;
- #endif
- default:
- result = true;
- break;
- }
-
- UPDATE_KEYMAP_STATUS();
- return result;
-}
diff --git a/keyboards/treadstone48/keymaps/like_jis_rs/readme_jp.md b/keyboards/treadstone48/keymaps/like_jis_rs/readme_jp.md
deleted file mode 100644
index d3ce8eb3f80..00000000000
--- a/keyboards/treadstone48/keymaps/like_jis_rs/readme_jp.md
+++ /dev/null
@@ -1,84 +0,0 @@
-# JISキーボードライクなキーマップ
-
-## 概要
-
- デフォルトキーマップの記号類をJISライクな配置に揃えなおしたものです。
- オプションのRhymestone用のマップを使用するために拡張しています。RhymestoneのpromicroにもTreadstone48のキーマップを入れてください。
- Rhymestoneは基本的には左手側を使うことを想定していますが、右手側を使用する場合はconfig.hの以下の行を有効にしてください。
-
-```#define RHYMESTONE_RIGHTHAND```
-
-## キーマップの見かた
-
-qmk_firmware\tmk_core\common\keycode.h
-に基本的なキーコードがあります。また、Keymap.cの上部にカスタムしたKC_で始まるものを登録しています。
-キーマップに書くときは「KC_」を省略して書いています。
-例:KC_A → A
-
-Leyer Tap、Mod Tap、Tap DanceというQMKの機能を使っています。
-
-Layer Tapはタップで指定したキー、長押しで指定したレイヤーに移動します。
-例:LT(RAISE, KC_V) → タップでV、長押しでRAISEレイヤー移動
-
-Mod Tapはタップで視程したキー、長押しで視程したレイヤーに移動します。
-例:LSFT_T(KC_Z) → タップでZ、長押しで左シフト
-
-Tap Danceは指定した二つのキーをシングルタップ、ダブルタップで切り替えられます。
-例:[TD_CODO] = ACTION_TAP_DANCE_DOUBLE(KC_COMM, KC_DOT) → シングルタップでCOMM、ダブルタップでDOT
-
-もう少し詳しい内容についてはQMK Documentをお読みいただくかネットを検索すれば情報が載っていますので別途検索してみてください。
-
-## 機能
-
- QWERTYキーマップをベースにしていて、LowerレイヤーとRaiseレイヤーに他のキーを配置しています。
- LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来ます。
- DOTの横、SLROと書いてあるのはシングルタップで/記号、ダブルタップで\記号が入力出来るようになっています。
- Lの横、SCCLと書いてあるのはシングルタップで;記号、ダブルタップで:記号が入力出来るようになっています。
- マウスキーの割り当てがありますので、もし使用したい場合はrules.mkでMOUSEKEY_ENABLE = yesにしてmakeすると使用することができます。
-
-## 48キー目について
-
- このキーボードはEnterキーの上の2Uキーを1Ux2個にして使用する事が出来るようになっています。 使用する場合はキーマップの書き換えが必要です。
-
- 各レイヤーの最下段の
-
-```c
- XXXXX \
- // ExtraKey: Split backspace key or it is below the enter key.
-```
-
- のXXXXXに任意のキーを入れることでPの右隣のキーとして動作するようになっています。その右隣りに従来のキーが配置されています。
-
-## OS切り替え方法
-
- Adjustレイヤーにあります。LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来ます。
-
-- KNRM: QMKのノーマル状態です。macだと正常に使える(はず)です
-- KSWP: ノーマル状態のままWindowsで使用するとALTキーとGUI(win)キーが逆ですので、それを入れ換えます。Windowsユーザーはこちらのモードにしてください
-
-## NUMPADモードについて
-
- Lower + DLNPキーを一度押下するとNumpadモードになります。通常モードに戻す場合はDLBSキーを押下してください。
-
-## IME切り替え方法
-
- Winの場合、LowerレイヤーにKANJIキー(半角/全角 漢字)がありますので、Lower+KANJIで切り替えてください。
-
-## ソフトウェアリセットについて
-
- キーボードにはハードウェアのリセットボタンが付いていますが、ソフトウェアリセットをかけられます。
- LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来、AdjustレイヤーのRSTを押下するとリセットがかかります。
-
-## LEDの点灯切り替え方法
-
- Adjustレイヤーにあります。LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来ます。
-
-- RGBRST: LEDのリセット
-- RGB_TOG: LEDのON/OFF切り替え
-- RGB_MOD: LEDの光り方の変更
-- RGB_HUI: Hue+ 色合いを変更
-- RGB_HUD: Hue- 色合いを変更
-- RGB_SAI: Saturation+ 色の濃さを変更
-- RGB_SAD: Saturation- 色の濃さを変更
-- RGB_VAI: Value+ 明るさを変更
-- RGB_VAD: Value- 明るさを変更
diff --git a/keyboards/treadstone48/keymaps/like_jis_rs/rules.mk b/keyboards/treadstone48/keymaps/like_jis_rs/rules.mk
deleted file mode 100644
index 3f116d1902f..00000000000
--- a/keyboards/treadstone48/keymaps/like_jis_rs/rules.mk
+++ /dev/null
@@ -1,12 +0,0 @@
-MOUSEKEY_ENABLE = yes # Mouse keys
-TAP_DANCE_ENABLE = yes
-
-RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
-OLED_DRIVER_ENABLE = no
-LTO_ENABLE = yes
-
-# If you use connection the Rhymestone, please enable RS_EXTRA_LED
-OPT_DEFS += -DRS_EXTRA_LED
-
-# If you want to change the display of OLED, you need to change here
-SRC += ./common/oled_helper.c \
diff --git a/keyboards/treadstone48/readme.md b/keyboards/treadstone48/readme.md
index eef39c39b33..432ef33fe91 100644
--- a/keyboards/treadstone48/readme.md
+++ b/keyboards/treadstone48/readme.md
@@ -11,8 +11,11 @@ Hardware Availability: links to where you can find this hardware
Make example for this keyboard (after setting up your build environment):
make treadstone48:default
+ or
+ make treadstone48/rev2:default
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).
-[Build guide](https://github.com/marksard/Keyboards/blob/master/treadstpne48/documents/treadstone48_buildguide.md)
+[Build guide](https://github.com/marksard/Keyboards/blob/master/treadstone48/documents/treadstone48_buildguide.md)
+[Build guide (rev2)](https://github.com/marksard/Keyboards/blob/master/treadstone48/documents/treadstone48rev2_buildguide.md)
[Firmware](https://github.com/marksard/qmk_firmware/tree/my_customize/keyboards/treadstone48)
diff --git a/keyboards/treadstone48/rev1/config.h b/keyboards/treadstone48/rev1/config.h
index 56ffbaef016..3ea285836c1 100644
--- a/keyboards/treadstone48/rev1/config.h
+++ b/keyboards/treadstone48/rev1/config.h
@@ -198,10 +198,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/treadstone48/keymaps/like_jis_rs/config.h b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/config.h
similarity index 100%
rename from keyboards/treadstone48/keymaps/like_jis_rs/config.h
rename to keyboards/treadstone48/rev1/keymaps/like_jis_rs/config.h
diff --git a/keyboards/treadstone48/rev1/keymaps/like_jis_rs/keymap.c b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/keymap.c
new file mode 100644
index 00000000000..171e0345565
--- /dev/null
+++ b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/keymap.c
@@ -0,0 +1,295 @@
+/* Copyright 2020 marksard
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+#include "../common/oled_helper.h"
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layer_number {
+ _BASE = 0,
+ _BASES,
+ _LOWER,
+ _LOWRS,
+ _RAISE,
+ _ADJUST,
+};
+
+enum custom_keycodes {
+ BASE = SAFE_RANGE,
+ BASES,
+ LOWER,
+ LOWRS,
+ RAISE,
+ ADJUST,
+ KANJI,
+ RGBRST
+};
+
+#define KC_TBSF LSFT_T(KC_TAB)
+#define KC_ALAP LALT_T(KC_APP)
+
+#define KC_JEQL LSFT(KC_MINS)
+#define KC_SFUC LSFT(KC_RO)
+#define KC_RSBR LSFT(KC_8)
+#define KC_REBR LSFT(KC_9)
+
+#define KC_ZSFT LSFT_T(KC_Z)
+#define KC_ESCT LCTL_T(KC_ESC)
+#define KC_TBAL LALT_T(KC_TAB)
+#define KC_11SF LSFT_T(KC_F11)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT_rs( \
+ // Treadstone48 Rhymestone
+ //,--------------------------------------------------------------------------------------------------------------------. --------------------------------------------.
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_P7, KC_P8, KC_P9, KC_PSLS, KC_NLCK,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------| --------+--------+--------+--------+--------|
+ KC_TBSF, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PAST, KC_TAB,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_P1, KC_P2, KC_P3, KC_PMNS, KC_PENT,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
+ KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_ALAP, KC_LEFT, KC_DOWN, KC_RGHT, LOWER, KC_P0, KC_PDOT, KC_PPLS, KC_BSPC,\
+ //`--------------------------------------------------------------------------------------------------------------------' --------------------------------------------'
+ KC_DEL \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
+ ),
+
+ [_LOWER] = LAYOUT_rs( \
+ // Treadstone48 Rhymestone
+ //,--------------------------------------------------------------------------------------------------------------------. --------------------------------------------.
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, KC_JYEN, KC_LBRC, KC_RBRC, KC_DEL, KC_A, KC_B, KC_C, KC_JYEN, KC_HASH,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------| --------+--------+--------+--------+--------|
+ _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, KC_SCLN, KC_QUOT, KC_BSLS, _______, KC_D, KC_E, KC_F, KC_PERC, KC_SFUC,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
+ _______, KC_F11, KC_F12, BASES, KANJI, KC_ENT, XXXXXXX, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_PGUP, KC_RSBR, KC_REBR, KC_RBRC, KC_QUOT, _______,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
+ _______, _______, _______, _______, KC_DEL, _______, _______, XXXXXXX, KC_HOME, KC_PGDN, KC_END, _______, XXXXXXX, KC_COMM, KC_JEQL, KC_DEL,\
+ //`--------------------------------------------------------------------------------------------------------------------' --------------------------------------------'
+ _______ \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
+ ),
+
+ [_BASES] = LAYOUT_rs( \
+ // Treadstone48 Rhymestone
+ //,--------------------------------------------------------------------------------------------------------------------. --------------------------------------------.
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, KC_Q, KC_W, KC_E, KC_R, KC_T,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------| --------+--------+--------+--------+--------|
+ KC_TBSF, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT, KC_A, KC_S, KC_D, KC_F, KC_G,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP, KC_ZSFT, KC_X, KC_C, KC_V, KC_B,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
+ KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_BSPC, KC_SPC, RAISE, KC_ALAP, KC_LEFT, KC_DOWN, KC_RGHT, KC_ESCT, KC_TBAL, KC_LGUI, LOWRS, KC_BSPC,\
+ //`--------------------------------------------------------------------------------------------------------------------' --------------------------------------------'
+ KC_DEL \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
+ ),
+
+ [_LOWRS] = LAYOUT_rs( \
+ // Treadstone48 Rhymestone
+ //,--------------------------------------------------------------------------------------------------------------------. --------------------------------------------.
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_MINS, KC_EQL, KC_JYEN, KC_LBRC, KC_RBRC, KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------| --------+--------+--------+--------+--------|
+ _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, KC_SCLN, KC_QUOT, KC_BSLS, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
+ _______, KC_F11, KC_F12, BASE, KANJI, KC_ENT, XXXXXXX, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_PGUP, KC_11SF, KC_F12, BASE, KANJI, KC_ENT,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
+ _______, _______, _______, _______, KC_DEL, _______, _______, XXXXXXX, KC_HOME, KC_PGDN, KC_END, _______, _______, _______, _______, KC_DEL,\
+ //`--------------------------------------------------------------------------------------------------------------------' --------------------------------------------'
+ _______ \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
+ ),
+
+ [_RAISE] = LAYOUT_rs( \
+ // Treadstone48 Rhymestone
+ //,--------------------------------------------------------------------------------------------------------------------. --------------------------------------------.
+ _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------| --------+--------+--------+--------+--------|
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_4, KC_5, KC_6, KC_QUOT, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_1, KC_2, KC_3, KC_RO, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
+ _______, _______, _______, _______, _______, _______, _______, KC_0, KC_DOT, KC_COMM, KC_SLSH, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
+ //`--------------------------------------------------------------------------------------------------------------------' --------------------------------------------'
+ _______ \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
+ ),
+
+ [_ADJUST] = LAYOUT_rs( \
+ // Treadstone48 Rhymestone
+ //,--------------------------------------------------------------------------------------------------------------------. --------------------------------------------.
+ XXXXXXX, RESET, RGBRST, AG_NORM, AG_SWAP, XXXXXXX, XXXXXXX, KC_WH_L, KC_WH_U, KC_HOME, KC_PGUP, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+-----------------| --------+--------+--------+--------+--------|
+ XXXXXXX, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, XXXXXXX, XXXXXXX, KC_WH_R, KC_WH_D, KC_END, KC_PGDN, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
+ _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX, KC_BTN1, KC_BTN2, XXXXXXX, KC_MS_U, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
+ //|--------+--------+--------+--------+--------+--------|--------+--------+--------+--------+--------+--------+--------| --------+--------+--------+--------+--------|
+ _______, _______, _______, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_R, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,\
+ //`--------------------------------------------------------------------------------------------------------------------' --------------------------------------------'
+ _______ \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
+ )
+};
+
+#define L_BASE _BASE
+#define L_BASES (1<<_BASES)
+#define L_LOWER (1<<_LOWER)
+#define L_LOWRS (1<<_LOWRS)
+#define L_RAISE (1<<_RAISE)
+#define L_ADJUST (1<<_ADJUST)
+#define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER)
+
+#ifdef OLED_DRIVER_ENABLE
+#include
+#include
+
+typedef struct {
+ uint8_t state;
+ char name[8];
+}LAYER_DISPLAY_NAME;
+
+#define LAYER_DISPLAY_MAX 7
+const LAYER_DISPLAY_NAME layer_display_name[LAYER_DISPLAY_MAX] = {
+ {L_BASE, "Base"},
+ {L_BASE + 1, "Base"},
+ {L_BASES, "BaseSpl"},
+ {L_LOWER, "Lower"},
+ {L_LOWRS, "LowrSpl"},
+ {L_RAISE, "Raise"},
+ {L_ADJUST_TRI, "Adjust"}
+};
+
+static inline const char* get_leyer_status(void) {
+
+ for (uint8_t i = 0; i < LAYER_DISPLAY_MAX; ++i) {
+ if (layer_state == 0 && layer_display_name[i].state == default_layer_state) {
+
+ return layer_display_name[i].name;
+ } else if (layer_state != 0 && layer_display_name[i].state == layer_state) {
+
+ return layer_display_name[i].name;
+ }
+ }
+
+ return "?";
+}
+
+static char layer_status_buf[24] = "Layer state ready.\n";
+static inline void update_keymap_status(void) {
+
+ snprintf(layer_status_buf, sizeof(layer_status_buf) - 1, "OS:%s Layer:%s\n",
+ keymap_config.swap_lalt_lgui? "win" : "mac", get_leyer_status());
+}
+
+static inline void render_keymap_status(void) {
+
+ oled_write(layer_status_buf, false);
+}
+
+#define UPDATE_KEYMAP_STATUS() update_keymap_status()
+
+static inline void render_status(void) {
+
+ UPDATE_LED_STATUS();
+ RENDER_LED_STATUS();
+ render_keymap_status();
+ UPDATE_LOCK_STATUS();
+ RENDER_LOCK_STATUS();
+ RENDER_KEY_STATUS();
+}
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+
+// if (is_keyboard_master())
+// return OLED_ROTATION_180; // flips the display 180 degrees if offhand
+ return rotation;
+}
+
+void oled_task_user(void) {
+
+ if (is_keyboard_master()) {
+ render_status();
+ } else {
+ render_logo();
+ }
+}
+
+#else
+
+#define UPDATE_KEYMAP_STATUS()
+
+#endif
+
+void update_change_layer(bool pressed, uint8_t layer1, uint8_t layer2, uint8_t layer3) {
+
+ pressed ? layer_on(layer1) : layer_off(layer1);
+ IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2) ? layer_on(layer3) : layer_off(layer3);
+}
+
+int RGB_current_mode;
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+
+ UPDATE_KEY_STATUS(keycode, record);
+
+ bool result = false;
+ switch (keycode) {
+ case LOWER:
+ update_change_layer(record->event.pressed, _LOWER, _RAISE, _ADJUST);
+ break;
+ case RAISE:
+ update_change_layer(record->event.pressed, _RAISE, _LOWER, _ADJUST);
+ break;
+ case BASE:
+ if (record->event.pressed) {
+ default_layer_set(L_BASE);
+ }
+ break;
+ case BASES:
+ if (record->event.pressed) {
+ default_layer_set(L_BASES);
+ }
+ break;
+ case LOWRS:
+ update_change_layer(record->event.pressed, _LOWRS, _RAISE, _ADJUST);
+ break;
+ case KANJI:
+ if (record->event.pressed) {
+ if (keymap_config.swap_lalt_lgui == false) {
+ register_code(KC_LANG2);
+ } else {
+ SEND_STRING(SS_LALT("`"));
+ }
+ } else {
+ unregister_code(KC_LANG2);
+ }
+ break;
+ #ifdef RGBLIGHT_ENABLE
+ case RGBRST:
+ if (record->event.pressed) {
+ eeconfig_update_rgblight_default();
+ rgblight_enable();
+ }
+ break;
+ #endif
+ default:
+ result = true;
+ break;
+ }
+
+ UPDATE_KEYMAP_STATUS();
+ return result;
+}
diff --git a/keyboards/treadstone48/keymaps/like_jis_rs/readme.md b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme.md
similarity index 100%
rename from keyboards/treadstone48/keymaps/like_jis_rs/readme.md
rename to keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme.md
diff --git a/keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme_jp.md b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme_jp.md
new file mode 100644
index 00000000000..81c5e017ec7
--- /dev/null
+++ b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme_jp.md
@@ -0,0 +1,79 @@
+# JISキーボードライクなキーマップ
+
+## 概要
+
+ デフォルトキーマップの記号類をJISライクな配置に揃えなおしたものです。
+ オプションのRhymestone用のマップを使用するために拡張しています。RhymestoneのpromicroにもTreadstone48のキーマップを入れてください。
+ Rhymestoneは基本的には左手側を使うことを想定していますが、右手側を使用する場合はconfig.hの以下の行を有効にしてください。
+
+```#define RHYMESTONE_RIGHTHAND```
+
+## キーマップの見かた
+
+qmk_firmware\tmk_core\common\keycode.h
+に基本的なキーコードがあります。また、Keymap.cの上部にカスタムしたKC_で始まるものを登録しています。
+キーマップに書くときは「KC_」を省略して書いています。
+例:KC_A → A
+
+Leyer Tap、Mod Tap、Tap DanceというQMKの機能を使っています。
+
+Layer Tapはタップで指定したキー、長押しで指定したレイヤーに移動します。
+例:LT(RAISE, KC_V) → タップでV、長押しでRAISEレイヤー移動
+
+Mod Tapはタップで視程したキー、長押しで視程したレイヤーに移動します。
+例:LSFT_T(KC_Z) → タップでZ、長押しで左シフト
+
+もう少し詳しい内容についてはQMK Documentをお読みいただくかネットを検索すれば情報が載っていますので別途検索してみてください。
+
+## 機能
+
+ QWERTYキーマップをベースにしていて、LowerレイヤーとRaiseレイヤーに他のキーを配置しています。
+ LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来ます。
+ マウスキーの割り当てがありますので、もし使用したい場合はrules.mkでMOUSEKEY_ENABLE = yesにしてmakeすると使用することができます。
+
+## 48キー目について
+
+ このキーボードはEnterキーの上の2Uキーを1Ux2個にして使用する事が出来るようになっています。 使用する場合はキーマップの書き換えが必要です。
+
+ 各レイヤーの最下段の
+
+```c
+ XXXXXXX \
+ // ExtraKey: This key is an extra key. REV1 is a split back space. REV2 is to the right of the arrow-up key.
+```
+
+ のXXXXXに任意のキーを入れることでPの右隣のキーとして動作するようになっています。その右隣りに従来のキーが配置されています。
+
+## OS切り替え方法
+
+ Adjustレイヤーにあります。LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来ます。
+
+- KNRM: QMKのノーマル状態です。macだと正常に使える(はず)です
+- KSWP: ノーマル状態のままWindowsで使用するとALTキーとGUI(win)キーが逆ですので、それを入れ換えます。Windowsユーザーはこちらのモードにしてください
+
+## NUMPADモードについて
+
+ Lower + DLNPキーを一度押下するとNumpadモードになります。通常モードに戻す場合はDLBSキーを押下してください。
+
+## IME切り替え方法
+
+ Winの場合、LowerレイヤーにKANJIキー(半角/全角 漢字)がありますので、Lower+KANJIで切り替えてください。
+
+## ソフトウェアリセットについて
+
+ キーボードにはハードウェアのリセットボタンが付いていますが、ソフトウェアリセットをかけられます。
+ LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来、AdjustレイヤーのRSTを押下するとリセットがかかります。
+
+## LEDの点灯切り替え方法
+
+ Adjustレイヤーにあります。LowerとRaiseを同時押しでAdjustレイヤーを使うことが出来ます。
+
+- RGBRST: LEDのリセット
+- RGB_TOG: LEDのON/OFF切り替え
+- RGB_MOD: LEDの光り方の変更
+- RGB_HUI: Hue+ 色合いを変更
+- RGB_HUD: Hue- 色合いを変更
+- RGB_SAI: Saturation+ 色の濃さを変更
+- RGB_SAD: Saturation- 色の濃さを変更
+- RGB_VAI: Value+ 明るさを変更
+- RGB_VAD: Value- 明るさを変更
diff --git a/keyboards/treadstone48/rev1/keymaps/like_jis_rs/rules.mk b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/rules.mk
new file mode 100644
index 00000000000..7380582ca12
--- /dev/null
+++ b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/rules.mk
@@ -0,0 +1,11 @@
+MOUSEKEY_ENABLE = yes # Mouse keys
+
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+OLED_DRIVER_ENABLE = yes
+LTO_ENABLE = yes
+
+# If you use connection the Rhymestone, please enable RS_EXTRA_LED
+OPT_DEFS += -DRS_EXTRA_LED
+
+# If you want to change the display of OLED, you need to change here
+SRC += ./common/oled_helper.c \
diff --git a/keyboards/treadstone48/rev2/config.h b/keyboards/treadstone48/rev2/config.h
new file mode 100644
index 00000000000..fb5011a0be4
--- /dev/null
+++ b/keyboards/treadstone48/rev2/config.h
@@ -0,0 +1,250 @@
+/*
+Copyright 2020 marksard
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0xDFA3
+#define DEVICE_VER 0x0020
+#define MANUFACTURER marksard
+#define PRODUCT treadstone48
+#define DESCRIPTION Symmetrical staggered 48 Keys Keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 6
+
+/*
+ * 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 { F4, F5, F6, F7, B1, B3, B2, B6 }
+#define MATRIX_COL_PINS { D4, C6, D7, E6, B4, B5 }
+#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 D2 // or D1, D2, D3, E6
+
+// #define BACKLIGHT_PIN B7
+// #define BACKLIGHT_BREATHING
+// #define BACKLIGHT_LEVELS 3
+
+#define RGB_DI_PIN D3
+#ifdef RGB_DI_PIN
+ #define RGBLED_NUM 12
+ #define RGBLIGHT_HUE_STEP 8
+ #define RGBLIGHT_SAT_STEP 8
+ #define RGBLIGHT_VAL_STEP 8
+ #define RGBLIGHT_LIMIT_VAL 220 /* 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 userful 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
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+/* defined by default; to change, uncomment and set to the combination you want */
+// #define IS_COMMAND() (get_mods() == MOD_MASK_SHIFT)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP H
+//#define MAGIC_KEY_HELP_ALT SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER0_ALT GRAVE
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER B
+//#define MAGIC_KEY_BOOTLOADER_ALT ESC
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_EEPROM_CLEAR BSPACE
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+
+/* disable these deprecated features by default */
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+/*
+ * MIDI options
+ */
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+//#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 1
+
+/*
+ * 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
+*/
+
+/* Bootmagic Lite key configuration */
+// #define BOOTMAGIC_LITE_ROW 0
+// #define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/treadstone48/rev2/info.json b/keyboards/treadstone48/rev2/info.json
new file mode 100644
index 00000000000..df9e7591b50
--- /dev/null
+++ b/keyboards/treadstone48/rev2/info.json
@@ -0,0 +1,261 @@
+{
+ "keyboard_name": "Treadstone48",
+ "url": "https://github.com/marksard/Keyboards",
+ "maintainer": "marksard",
+ "width": 14.75,
+ "height": 4,
+ "layouts": {
+ "LAYOUT_base": {
+ "layout": [
+ {
+ "label": "Esc",
+ "x": 1,
+ "y": 0
+ },
+ {
+ "label": "Q",
+ "x": 2.25,
+ "y": 0
+ },
+ {
+ "label": "W",
+ "x": 3.25,
+ "y": 0
+ },
+ {
+ "label": "E",
+ "x": 4.25,
+ "y": 0
+ },
+ {
+ "label": "R",
+ "x": 5.25,
+ "y": 0
+ },
+ {
+ "label": "T",
+ "x": 6.25,
+ "y": 0
+ },
+ {
+ "label": "Y",
+ "x": 7.75,
+ "y": 0
+ },
+ {
+ "label": "U",
+ "x": 8.75,
+ "y": 0
+ },
+ {
+ "label": "I",
+ "x": 9.75,
+ "y": 0
+ },
+ {
+ "label": "O",
+ "x": 10.75,
+ "y": 0
+ },
+ {
+ "label": "P",
+ "x": 11.75,
+ "y": 0
+ },
+ {
+ "label": "-",
+ "x": 13.75,
+ "y": 0
+ },
+ {
+ "label": "Tab",
+ "x": 1,
+ "y": 1,
+ "w": 1.5
+ },
+ {
+ "label": "A",
+ "x": 2.5,
+ "y": 1
+ },
+ {
+ "label": "S",
+ "x": 3.5,
+ "y": 1
+ },
+ {
+ "label": "D",
+ "x": 4.5,
+ "y": 1
+ },
+ {
+ "label": "F",
+ "x": 5.5,
+ "y": 1
+ },
+ {
+ "label": "G",
+ "x": 6.5,
+ "y": 1
+ },
+ {
+ "label": "H",
+ "x": 7.5,
+ "y": 1
+ },
+ {
+ "label": "J",
+ "x": 8.5,
+ "y": 1
+ },
+ {
+ "label": "K",
+ "x": 9.5,
+ "y": 1
+ },
+ {
+ "label": "L",
+ "x": 10.5,
+ "y": 1
+ },
+ {
+ "label": ":",
+ "x": 11.5,
+ "y": 1
+ },
+ {
+ "label": "Enter",
+ "x": 12.5,
+ "y": 1,
+ "w": 2.25
+ },
+ {
+ "label": "Shift",
+ "x": 0,
+ "y": 2,
+ "w": 2.25
+ },
+ {
+ "label": "Z",
+ "x": 2.25,
+ "y": 2
+ },
+ {
+ "label": "X",
+ "x": 3.25,
+ "y": 2
+ },
+ {
+ "label": "C",
+ "x": 4.25,
+ "y": 2
+ },
+ {
+ "label": "V",
+ "x": 5.25,
+ "y": 2
+ },
+ {
+ "label": "B",
+ "x": 6.25,
+ "y": 2
+ },
+ {
+ "label": "N",
+ "x": 7.75,
+ "y": 2
+ },
+ {
+ "label": "M",
+ "x": 8.75,
+ "y": 2
+ },
+ {
+ "label": "<",
+ "x": 9.75,
+ "y": 2
+ },
+ {
+ "label": ">",
+ "x": 10.75,
+ "y": 2
+ },
+ {
+ "label": "?",
+ "x": 11.75,
+ "y": 2
+ },
+ {
+ "label": "\u2191",
+ "x": 12.75,
+ "y": 2
+ },
+ {
+ "label": "Ctrl",
+ "x": 0.75,
+ "y": 3,
+ "w": 1.25
+ },
+ {
+ "label": "Win",
+ "x": 2,
+ "y": 3,
+ "w": 1.25
+ },
+ {
+ "label": "Alt",
+ "x": 3.25,
+ "y": 3,
+ "w": 1.25
+ },
+ {
+ "label": "Lower",
+ "x": 4.5,
+ "y": 3
+ },
+ {
+ "label": "BackSpace",
+ "x": 5.5,
+ "y": 3,
+ "w": 2
+ },
+ {
+ "x": 7.5,
+ "y": 3,
+ "w": 2
+ },
+ {
+ "label": "Raise",
+ "x": 9.5,
+ "y": 3
+ },
+ {
+ "label": "Menu",
+ "x": 10.5,
+ "y": 3,
+ "w": 1.25
+ },
+ {
+ "label": "\u2190",
+ "x": 11.75,
+ "y": 3
+ },
+ {
+ "label": "\u2193",
+ "x": 12.75,
+ "y": 3
+ },
+ {
+ "label": "\u2192",
+ "x": 13.75,
+ "y": 3
+ },
+ {
+ "label": "_",
+ "x": 12.75,
+ "y": 0
+ }
+ ]
+ }
+ }
+}
diff --git a/keyboards/treadstone48/rev2/rev2.c b/keyboards/treadstone48/rev2/rev2.c
new file mode 100644
index 00000000000..f7e7bc77021
--- /dev/null
+++ b/keyboards/treadstone48/rev2/rev2.c
@@ -0,0 +1,17 @@
+/* Copyright 2020 marksard
+ *
+ * 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 .
+ */
+
+#include "rev2.h"
diff --git a/keyboards/treadstone48/rev2/rev2.h b/keyboards/treadstone48/rev2/rev2.h
new file mode 100644
index 00000000000..651468c4a58
--- /dev/null
+++ b/keyboards/treadstone48/rev2/rev2.h
@@ -0,0 +1,48 @@
+/* Copyright 2020 marksard
+ *
+ * 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 .
+ */
+
+#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_base( \
+ L00, L01, L02, L03, L04, L05, L40, L41, L42, L43, L44, L45, \
+ L10, L11, L12, L13, L14, L15, L50, L51, L52, L53, L54, L55, \
+ L20, L21, L22, L23, L24, L25, L60, L61, L62, L63, L64, L65, \
+ L30, L31, L32, L33, L34, L35, L70, L71, L72, L73, L74, L75 \
+ ) \
+ { \
+ { L45, L44, L43, L42, L41, L40 }, \
+ { L55, L54, L53, L52, L51, L50 }, \
+ { L65, L64, L63, L62, L61, L60 }, \
+ { L75, L74, L73, L72, L71, L70 }, \
+ { L05, L04, L03, L02, L01, L00 }, \
+ { L15, L14, L13, L12, L11, L10 }, \
+ { L25, L24, L23, L22, L21, L20 }, \
+ { L35, L34, L33, L32, L31, L30 } \
+ }
+
+// full Keymap
+#define LAYOUT_full LAYOUT_base
diff --git a/keyboards/treadstone48/rev2/rules.mk b/keyboards/treadstone48/rev2/rules.mk
new file mode 100644
index 00000000000..d29d9074a01
--- /dev/null
+++ b/keyboards/treadstone48/rev2/rules.mk
@@ -0,0 +1 @@
+SPLIT_KEYBOARD = no
diff --git a/keyboards/underscore33/config.h b/keyboards/underscore33/config.h
new file mode 100644
index 00000000000..5733f30d00e
--- /dev/null
+++ b/keyboards/underscore33/config.h
@@ -0,0 +1,42 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x6A50
+#define DEVICE_VER 0x0001
+#define MANUFACTURER tominabox1
+#define PRODUCT underscore33
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 10
+
+/*
+ * 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 { F5, F6, C6, D0 }
+#define MATRIX_COL_PINS { B4, B5, D5, F7, B1, F4, B3, D7, B0, B2 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION ROW2COL
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+/* 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
+
+/* #define RGB_DI_PIN B6
+ #define RGBLED_NUM 1 */
diff --git a/keyboards/underscore33/info.json b/keyboards/underscore33/info.json
new file mode 100644
index 00000000000..4e97a63802a
--- /dev/null
+++ b/keyboards/underscore33/info.json
@@ -0,0 +1,16 @@
+{
+ "keyboard_name": "underscore33",
+ "url": "",
+ "maintainer": "tominabox1",
+ "width": 10,
+ "height": 4,
+ "layouts": {
+ "LAYOUT_33_big_space": {
+ "layout": [{"label":"Q", "x":0, "y":0}, {"label":"W", "x":1, "y":0}, {"label":"E", "x":2, "y":0}, {"label":"R", "x":3, "y":0}, {"label":"T", "x":4, "y":0}, {"label":"Y", "x":5, "y":0}, {"label":"U", "x":6, "y":0}, {"label":"I", "x":7, "y":0}, {"label":"O", "x":8, "y":0}, {"label":"P", "x":9, "y":0},{"label":"A", "x":0, "y":1}, {"label":"S", "x":1, "y":1}, {"label":"D", "x":2, "y":1}, {"label":"F", "x":3, "y":1}, {"label":"G", "x":4, "y":1}, {"label":"H", "x":5, "y":1}, {"label":"J", "x":6, "y":1}, {"label":"K", "x":7, "y":1}, {"label":"L", "x":8, "y":1}, {"label":";", "x":9, "y":1}, {"label":"Z", "x":0, "y":2}, {"label":"X", "x":1, "y":2}, {"label":"C", "x":2, "y":2}, {"label":"V", "x":3, "y":2}, {"label":"B", "x":4, "y":2}, {"label":"N", "x":5, "y":2}, {"label":"M", "x":6, "y":2}, {"label":"<", "x":7, "y":2}, {"label":">", "x":8, "y":2}, {"label":"?", "x":9, "y":2}, {"label":"", "x":0.65, "y":3, "w":1.25}, {"label":"", "x":1.9, "y":3, "w":6.25}, {"label":"", "x":8.15, "y":3, "w":1.25}]
+ },
+
+ "LAYOUT_33_split_space": {
+ "layout": [{"label":"Q", "x":0, "y":0}, {"label":"W", "x":1, "y":0}, {"label":"E", "x":2, "y":0}, {"label":"R", "x":3, "y":0}, {"label":"T", "x":4, "y":0}, {"label":"Y", "x":5, "y":0}, {"label":"U", "x":6, "y":0}, {"label":"I", "x":7, "y":0}, {"label":"O", "x":8, "y":0}, {"label":"P", "x":9, "y":0},{"label":"A", "x":0, "y":1}, {"label":"S", "x":1, "y":1}, {"label":"D", "x":2, "y":1}, {"label":"F", "x":3, "y":1}, {"label":"G", "x":4, "y":1}, {"label":"H", "x":5, "y":1}, {"label":"J", "x":6, "y":1}, {"label":"K", "x":7, "y":1}, {"label":"L", "x":8, "y":1}, {"label":";", "x":9, "y":1}, {"label":"Z", "x":0, "y":2}, {"label":"X", "x":1, "y":2}, {"label":"C", "x":2, "y":2}, {"label":"V", "x":3, "y":2}, {"label":"B", "x":4, "y":2}, {"label":"N", "x":5, "y":2}, {"label":"M", "x":6, "y":2}, {"label":"<", "x":7, "y":2}, {"label":">", "x":8, "y":2}, {"label":"?", "x":9, "y":2}, {"label":"", "x":0.65, "y":3, "w":1.25}, {"label":"", "x":1.9, "y":3, "w":2.25}, {"label":"", "x":4.15, "y":3, "w":1.75}, {"label":"", "x":5.9, "y":3, "w":2.25}, {"label":"", "x":8.15, "y":3, "w":1.25}]
+ }
+ }
+}
diff --git a/keyboards/underscore33/keymaps/default/keymap.c b/keyboards/underscore33/keymaps/default/keymap.c
new file mode 100644
index 00000000000..8fab8623a2a
--- /dev/null
+++ b/keyboards/underscore33/keymaps/default/keymap.c
@@ -0,0 +1,44 @@
+#include QMK_KEYBOARD_H
+
+enum layers{
+ _BASE,
+ _NUM_SYM,
+ _NAV
+};
+
+enum custom_keycodes{
+ RGBRST = SAFE_RANGE,
+};
+
+#define KC_NUM_SPC LT(_NUM_SYM, KC_SPC)
+#define KC_GA LGUI_T(KC_A)
+#define KC_AS LALT_T(KC_S)
+#define KC_CD LCTL_T(KC_D)
+#define KC_SF LSFT_T(KC_F)
+#define KC_SJ RSFT_T(KC_J)
+#define KC_CK RCTL_T(KC_K)
+#define KC_AL RALT_T(KC_L)
+#define KC_GSCLN RGUI_T(KC_SCLN)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT_33_split_space(
+ KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
+ KC_GA, KC_AS, KC_CD, KC_SF, KC_G, KC_H, KC_SJ, KC_CK, KC_AL, KC_GSCLN,
+ KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,
+ KC_LCTL, KC_LALT, KC_NUM_SPC, MO(_NAV), KC_RGUI
+ ),
+
+ [_NUM_SYM] = LAYOUT_33_split_space(
+ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
+ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_EQUAL, KC_MINS,
+ KC_BSLS, KC_LCBR, KC_LBRC, KC_LPRN, KC_UNDS, KC_RPRN, KC_RBRC, KC_RCBR, KC_DOT, KC_GRV,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [_NAV] = LAYOUT_33_split_space(
+ RESET, RGBRST, AG_NORM, AG_SWAP, DEBUG, KC_GRV, KC_PGDN, KC_UP, KC_PGUP, KC_SCLN,
+ RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, KC_NO, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END,
+ RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, KC_NO, KC_MINS, KC_RO, KC_COMM, KC_DOT, KC_BSLS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+};
diff --git a/keyboards/underscore33/keymaps/default/readme.md b/keyboards/underscore33/keymaps/default/readme.md
new file mode 100644
index 00000000000..7ef72915ed7
--- /dev/null
+++ b/keyboards/underscore33/keymaps/default/readme.md
@@ -0,0 +1,5 @@
+
+
+# Default _33 Layout
+
+This is the recommended default layout. It is not a fully functional layout without backspace, tab, esc and so on. It is recommended to use combos to access the additional modifiers when using the large spacebar layout option, however combos are not enabled in the default firmware.
diff --git a/keyboards/underscore33/readme.md b/keyboards/underscore33/readme.md
new file mode 100644
index 00000000000..153329d84e4
--- /dev/null
+++ b/keyboards/underscore33/readme.md
@@ -0,0 +1,15 @@
+# underscore33 (stylized as "_33")
+
+
+
+A little bitty 30% (10x4) ortholinear keyboard designed by tominabox1. The board supports an RGB LED strip with DI on port B6. There is an error on the initial 25 PCBs that incorrectly indicates PF0 for the RGB. The appropriate port is commented out in config.h for proper LED support.
+
+* Keyboard Maintainer: [TJ Campie](https://github.com/tominabox1)
+* Hardware Supported: _33 PCB and Plate limited buy (Open source available ca. Apirl 2020)
+* Hardware Availability: [3D printed open sourced](https://github.com/tominabox1/_33-Keyboard)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make underscore33:default
+
+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).
diff --git a/keyboards/underscore33/rules.mk b/keyboards/underscore33/rules.mk
new file mode 100644
index 00000000000..a5c12fdadb0
--- /dev/null
+++ b/keyboards/underscore33/rules.mk
@@ -0,0 +1,25 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+TAP_DANCE_ENABLE = no
diff --git a/keyboards/underscore33/underscore33.c b/keyboards/underscore33/underscore33.c
new file mode 100644
index 00000000000..9d690be9abd
--- /dev/null
+++ b/keyboards/underscore33/underscore33.c
@@ -0,0 +1 @@
+#include "underscore33.h"
diff --git a/keyboards/underscore33/underscore33.h b/keyboards/underscore33/underscore33.h
new file mode 100644
index 00000000000..5c774cfa855
--- /dev/null
+++ b/keyboards/underscore33/underscore33.h
@@ -0,0 +1,31 @@
+#pragma once
+
+#include "quantum.h"
+
+#define XXX KC_NO
+
+#define LAYOUT_33_big_space( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, \
+ K31, K34, K38 \
+) \
+{ \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09 }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19 }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29 }, \
+ { XXX, K31, XXX, XXX, K34, XXX, XXX, XXX, K38, XXX } \
+}
+
+#define LAYOUT_33_split_space( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, \
+ K31, K32, K34, K36, K38 \
+) \
+{ \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09 }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19 }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29 }, \
+ { XXX, K31, K32, XXX, K34, XXX, K36, XXX, K38, XXX } \
+}
diff --git a/keyboards/unikorn/config.h b/keyboards/unikorn/config.h
index e6bdbe7f2fc..c68a857d5e9 100644
--- a/keyboards/unikorn/config.h
+++ b/keyboards/unikorn/config.h
@@ -19,11 +19,11 @@ along with this program. If not, see .
#include "config_common.h"
-#define VENDOR_ID 0x20A0
-#define PRODUCT_ID 0x422D
+#define VENDOR_ID 0x5354 // Singa x TGR (ST)
+#define PRODUCT_ID 0x556B // UK
#define DEVICE_VER 0x0200
-#define MANUFACTURER Singa and TGR
-#define PRODUCT Unikorn 60
+#define MANUFACTURER Singa x TGR
+#define PRODUCT Unikorn60
#define MATRIX_ROWS 5
#define MATRIX_COLS 15
diff --git a/keyboards/unikorn/keymaps/via/keymap.c b/keyboards/unikorn/keymaps/via/keymap.c
new file mode 100644
index 00000000000..99310e861b7
--- /dev/null
+++ b/keyboards/unikorn/keymaps/via/keymap.c
@@ -0,0 +1,53 @@
+/* Copyright 2019 MechMerlin
+ *
+ * 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 .
+ */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_60_ansi(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL
+ ),
+
+ [1] = LAYOUT_60_ansi(
+ KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
+ RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [2] = LAYOUT_60_ansi(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [3] = LAYOUT_60_ansi(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+};
diff --git a/keyboards/unikorn/keymaps/via/rules.mk b/keyboards/unikorn/keymaps/via/rules.mk
new file mode 100644
index 00000000000..7b439d08c66
--- /dev/null
+++ b/keyboards/unikorn/keymaps/via/rules.mk
@@ -0,0 +1,7 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+
+MOUSEKEY_ENABLE = no
+EXTRAKEY_ENABLE = no
+RGBLIGHT_ENABLE = yes
+
diff --git a/keyboards/unikorn/rules.mk b/keyboards/unikorn/rules.mk
index e57c21c856b..a0ffab29015 100644
--- a/keyboards/unikorn/rules.mk
+++ b/keyboards/unikorn/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = no
MOUSEKEY_ENABLE = yes
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = no
diff --git a/keyboards/unikorn/usbconfig.h b/keyboards/unikorn/usbconfig.h
deleted file mode 100644
index 3dcd1ccde71..00000000000
--- a/keyboards/unikorn/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 's', 'i', 'n', 'g', 'a', 't', 'g', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 8
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'u', 'n', 'i', 'k', 'o', 'r', 'n'
-#define USB_CFG_DEVICE_NAME_LEN 7
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/uranuma/config.h b/keyboards/uranuma/config.h
new file mode 100644
index 00000000000..e4a62d88e56
--- /dev/null
+++ b/keyboards/uranuma/config.h
@@ -0,0 +1,236 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x112D
+#define DEVICE_VER 0x0001
+#define MANUFACTURER yohewi
+#define PRODUCT UraNuma
+#define DESCRIPTION Series of numa
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 10
+
+/*
+ * 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 { C6, D7, E6, B4, B5 }
+#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B6, D2, D4 }
+#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 BACKLIGHT_PIN B7
+// #define BACKLIGHT_BREATHING
+// #define BACKLIGHT_LEVELS 3
+
+// #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
+
+// fix iPhone and iPad power adapter issue
+// iOS device need lessthan 100
+#define USB_MAX_POWER_CONSUMPTION 100
+
+/* 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 userful 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
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+/* defined by default; to change, uncomment and set to the combination you want */
+// #define IS_COMMAND() (get_mods() == MOD_MASK_SHIFT)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP H
+//#define MAGIC_KEY_HELP_ALT SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER0_ALT GRAVE
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER B
+//#define MAGIC_KEY_BOOTLOADER_ALT ESC
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_EEPROM_CLEAR BSPACE
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/*
+ * 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
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+/*
+ * MIDI options
+ */
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+//#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 1
+
+/*
+ * 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
+*/
+
+/* Bootmagic Lite key configuration */
+// #define BOOTMAGIC_LITE_ROW 0
+// #define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/uranuma/info.json b/keyboards/uranuma/info.json
new file mode 100644
index 00000000000..8c4f5cb48e7
--- /dev/null
+++ b/keyboards/uranuma/info.json
@@ -0,0 +1,63 @@
+{
+ "keyboard_name": "Uranuma",
+ "url": "",
+ "maintainer": "yohewi",
+ "width": 13,
+ "height": 5.7,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"k00", "x":0 , "y":0.62},
+ {"label":"k01", "x":1 , "y":0.36},
+ {"label":"k02", "x":2 , "y":0},
+ {"label":"k03", "x":3 , "y":0.09},
+ {"label":"k04", "x":4 , "y":0.70},
+ {"label":"k05", "x":8 , "y":0.70},
+ {"label":"k06", "x":9 , "y":0.09},
+ {"label":"k07", "x":10, "y":0},
+ {"label":"k08", "x":11, "y":0.36},
+ {"label":"k09", "x":12, "y":0.62},
+
+ {"label":"k10", "x":0 , "y":1.62},
+ {"label":"k11", "x":1 , "y":1.36},
+ {"label":"k12", "x":2 , "y":1},
+ {"label":"k13", "x":3 , "y":1.09},
+ {"label":"k14", "x":4 , "y":1.70},
+ {"label":"k15", "x":8 , "y":1.70},
+ {"label":"k16", "x":9 , "y":1.09},
+ {"label":"k17", "x":10, "y":1},
+ {"label":"k18", "x":11, "y":1.36},
+ {"label":"k19", "x":12, "y":1.62},
+
+ {"label":"k20", "x":0 , "y":2.62},
+ {"label":"k21", "x":1 , "y":2.36},
+ {"label":"k22", "x":2 , "y":2},
+ {"label":"k23", "x":3 , "y":2.09},
+ {"label":"k24", "x":4 , "y":2.70},
+ {"label":"k25", "x":8 , "y":2.70},
+ {"label":"k26", "x":9 , "y":2.09},
+ {"label":"k27", "x":10, "y":2},
+ {"label":"k28", "x":11, "y":2.36},
+ {"label":"k29", "x":12, "y":2.62},
+
+ {"label":"k30", "x":0 , "y":3.62},
+ {"label":"k31", "x":1 , "y":3.36},
+ {"label":"k32", "x":2 , "y":3},
+ {"label":"k33", "x":3 , "y":3.09},
+ {"label":"k34", "x":4 , "y":3.70},
+ {"label":"k44", "x":5, "y":2.44, "h":2},
+ {"label":"k45", "x":7, "y":2.44, "h":2},
+ {"label":"k35", "x":8 , "y":3.70},
+ {"label":"k36", "x":9 , "y":3.09},
+ {"label":"k37", "x":10, "y":3},
+ {"label":"k38", "x":11, "y":3.36},
+ {"label":"k39", "x":12, "y":3.62},
+
+ {"label":"k40", "x":0, "y":4.70, "w":1.5},
+ {"label":"k41", "x":1.5, "y":4.70},
+ {"label":"k48", "x":10.5, "y":4.70},
+ {"label":"k49", "x":11.5, "y":4.70, "w":1.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/uranuma/keymaps/default/keymap.c b/keyboards/uranuma/keymaps/default/keymap.c
new file mode 100644
index 00000000000..c2ac4d8bf9e
--- /dev/null
+++ b/keyboards/uranuma/keymaps/default/keymap.c
@@ -0,0 +1,65 @@
+#include QMK_KEYBOARD_H
+
+enum layer_number {
+ _BASE,
+ _LOWER,
+ _RAISE,
+};
+
+enum custom_keycodes {
+ KANJI = SAFE_RANGE,
+};
+
+// Layer Mode aliases
+#define KC_ZSFT LSFT_T(KC_Z)
+#define KC_MNSF LSFT_T(KC_MINS)
+#define KC_ESCT LCTL_T(KC_ESC)
+#define KC_TBAL LALT_T(KC_TAB)
+#define ALT_GRV LALT(KC_GRV)
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT(
+ //.--------------------------------------------. .--------------------------------------------.
+ KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
+ //|--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_BSLS,
+ //|--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ KC_ZSFT, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_MNSF,
+ //|--------+--------+--------+--------+--------+--------. .--------+--------+--------+--------+--------+--------|
+ KC_ESCT, KC_TBAL, KC_PSCR, KC_LALT, KC_SPC, KC_BSPC, KC_ENT, KC_ENT, ALT_GRV, KC_SLSH, KC_BSLS, KC_RBRC,
+ //|--------+--------+--------+--------+--------+--------' '--------+--------+--------+--------+--------+--------|
+ KC_LSFT, LOWER, RAISE, KC_RCTL
+ //'-----------------' '-----------------'
+ ),
+
+ [_LOWER] = LAYOUT(
+ //.--------------------------------------------. .--------------------------------------------.
+ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
+ //|--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,
+ //|--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_SCLN, KC_UP, KC_EQL,
+ //|--------+--------+--------+--------+--------+--------. .--------+--------+--------+--------+--------+--------|
+ KC_ESCT, KC_TBAL, KC_LGUI, KC_ENT, KC_BSPC, KC_SPC, KC_ENT, KC_LALT, KANJI, KC_LEFT, KC_DOWN, KC_RGHT,
+ //|--------+--------+--------+--------+--------+--------' '--------+--------+--------+--------+--------+--------|
+ KC_LSFT, LOWER, RAISE, KC_RCTL
+ //'-----------------' '-----------------'
+ ),
+
+ [_RAISE] = LAYOUT(
+ //.--------------------------------------------. .--------------------------------------------.
+ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
+ //|--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,
+ //|--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ KC_F11, KC_F12, XXXXXXX, KANJI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_UP, KC_RO,
+ //|--------+--------+--------+--------+--------+--------. .--------+--------+--------+--------+--------+--------|
+ KC_ESCT, KC_TBAL, KC_LGUI, LOWER, KC_BSPC, KC_SPC, KC_ENT, KC_ENT, KANJI, KC_LEFT, KC_DOWN, KC_RGHT,
+ //|--------+--------+--------+--------+--------+--------' '--------+--------+--------+--------+--------+--------|
+ KC_RSFT, LOWER, RAISE, KC_RCTL
+ //'-----------------' '-----------------'
+ ),
+
+};
diff --git a/keyboards/uranuma/readme.md b/keyboards/uranuma/readme.md
new file mode 100644
index 00000000000..3e78fa6fe64
--- /dev/null
+++ b/keyboards/uranuma/readme.md
@@ -0,0 +1,15 @@
+# uranuma
+
+It is a keyboard to input using fingers and palms.
+
+
+* Keyboard Maintainer: yohewi(yohewi@gmail.com)
+* Hardware Supported: UraNuma PCB
+* Github [github.com/yohewi](https://github.com/yohewi)
+* Hardware Availability: PCB, [Booth Shop](https://rt421.booth.pm/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make uranuma:default
+
+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).
diff --git a/keyboards/uranuma/rules.mk b/keyboards/uranuma/rules.mk
new file mode 100644
index 00000000000..d30114df48e
--- /dev/null
+++ b/keyboards/uranuma/rules.mk
@@ -0,0 +1,36 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+
+#COMBO_ENABLE = yes
+#SRC += .nicola.c \
diff --git a/keyboards/uranuma/uranuma.c b/keyboards/uranuma/uranuma.c
new file mode 100644
index 00000000000..e439177af78
--- /dev/null
+++ b/keyboards/uranuma/uranuma.c
@@ -0,0 +1 @@
+#include "uranuma.h"
diff --git a/keyboards/uranuma/uranuma.h b/keyboards/uranuma/uranuma.h
new file mode 100644
index 00000000000..8b2e4c6930e
--- /dev/null
+++ b/keyboards/uranuma/uranuma.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#include "quantum.h"
+
+/* This 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, k03, k04, k05, k06, k07, k08, k09, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, \
+ k30, k31, k32, k33, k34, k44, k45, k35, k36, k37, k38, k39, \
+ k40, k41, k48, k49 \
+) { \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09 }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19 }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29 }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39 }, \
+ { k40, k41, KC_NO, KC_NO, k44, k45, KC_NO, KC_NO, k48, k49 } \
+}
diff --git a/keyboards/vitamins_included/keymaps/default/keymap.c b/keyboards/vitamins_included/keymaps/default/keymap.c
index 52780d64686..d6db6ffe612 100644
--- a/keyboards/vitamins_included/keymaps/default/keymap.c
+++ b/keyboards/vitamins_included/keymaps/default/keymap.c
@@ -1,16 +1,18 @@
#include QMK_KEYBOARD_H
+#define TG_NKRO MAGIC_TOGGLE_NKRO
-// Each layer gets a name for readability, which is then used in the keymap matrix below.
-// The underscores don't mean anything - you can have a layer called STUFF or any other name.
-// Layer names don't all need to be of the same length, obviously, and you can also skip them
-// entirely and just use numbers.
-#define _QWERTY 0
-#define _COLEMAK 1
-#define _DVORAK 2
-#define _LOWER 3
-#define _RAISE 4
-#define _ADJUST 16
+
+// Layer names
+
+enum layer_names {
+ _QWERTY,
+ _COLEMAK,
+ _DVORAK,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
enum custom_keycodes {
QWERTY = SAFE_RANGE,
@@ -38,7 +40,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \
KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \
- KC_LCTRL,KC_LGUI, KC_LALT, ADJUST, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
+ KC_LCTRL,KC_LGUI, KC_LALT, ADJUST, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
),
/* Colemak
@@ -85,14 +87,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+------|------+------+------+------+------+------|
* |RESET | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * |TGNKRO| | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
*/
[_LOWER] = LAYOUT_ortho_4x12( \
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \
KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
- RESET, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______, \
- _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+ RESET, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______,_______,_______, \
+ TG_NKRO, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
),
/* Raise
@@ -101,7 +103,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+-------------+------+------+------+------+------|
* | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
* |------+------+------+------+------+------|------+------+------+------+------+------|
- * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |RESET |
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | |TGNKRO|RESET |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | Next | Vol- | Vol+ | Play |
* `-----------------------------------------------------------------------------------'
@@ -109,26 +111,26 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_RAISE] = LAYOUT_ortho_4x12( \
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \
KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
- _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, _______, RESET, \
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, TG_NKRO, RESET, \
_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
),
/* Adjust (Lower + Raise)
* ,-----------------------------------------------------------------------------------.
- * | | RESET| | | | | | | | | RESET| Del |
+ * | |Qwerty|Colemk|Dvorak| | | | | | | | |
* |------+------+------+------+------+-------------+------+------+------+------+------|
- * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
+ * | | | | | | | |Qwerty|Colemk|Dvorak| | |
* |------+------+------+------+------+------|------+------+------+------+------+------|
* | | | | | | | | | | | | |
* |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | | | |RGBMOD|
+ * | | | | | |Audoff Audon | | | | |RGBMOD|
* `-----------------------------------------------------------------------------------'
*/
[_ADJUST] = LAYOUT_ortho_4x12( \
- _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, RESET, KC_DEL, \
- _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \
+ _______, QWERTY, COLEMAK, DVORAK, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD \
+ _______, _______, _______, _______, _______, AU_OFF, AU_ON, _______, _______, _______, _______, RGB_MOD \
)
diff --git a/keyboards/vitamins_included/keymaps/via/keymap.c b/keyboards/vitamins_included/keymaps/via/keymap.c
new file mode 100644
index 00000000000..925c8d92ebe
--- /dev/null
+++ b/keyboards/vitamins_included/keymaps/via/keymap.c
@@ -0,0 +1,85 @@
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+ _QWERTY,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | Esc | Q | W | E | R | T | Y | U | I | O | P | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Tab | A | S | D | F | G | H | J | K | L | ; | ' |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | GUI | Alt |Adjust|Lower |Space |Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = LAYOUT_ortho_4x12( \
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \
+ KC_LCTRL,KC_LGUI, KC_LALT,MO(_ADJUST),MO(_LOWER),KC_SPC,KC_SPC,MO(_RAISE),KC_LEFT,KC_DOWN, KC_UP, KC_RGHT \
+),
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | | \ | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |RESET | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |NKTOGG| | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = LAYOUT_ortho_4x12( \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
+ RESET, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______,_______,_______, \
+ NK_TOGG, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | |NKTOGG|RESET |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = LAYOUT_ortho_4x12( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, _______, NK_TOGG, RESET, \
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Adjust
+ * ,-----------------------------------------------------------------------------------.
+ * | | RESET| | | | | | | | | RESET| Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | |RGBMOD|
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = LAYOUT_ortho_4x12( \
+ _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, RESET, KC_DEL, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, AU_OFF, AU_ON, _______, _______, _______, _______, _______, RGB_MOD \
+)
+};
diff --git a/keyboards/vitamins_included/keymaps/via/rules.mk b/keyboards/vitamins_included/keymaps/via/rules.mk
new file mode 100644
index 00000000000..036bd6d1c3e
--- /dev/null
+++ b/keyboards/vitamins_included/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
\ No newline at end of file
diff --git a/keyboards/vitamins_included/keymaps/vitavim/config.h b/keyboards/vitamins_included/keymaps/vitavim/config.h
new file mode 100644
index 00000000000..95dd8ec4643
--- /dev/null
+++ b/keyboards/vitamins_included/keymaps/vitavim/config.h
@@ -0,0 +1,42 @@
+/*
+This is the c configuration file for the keymap
+
+Copyright 2012 Jun Wako
+Copyright 2015 Jack Humbert
+
+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 .
+*/
+
+#pragma once
+
+/* Use I2C or Serial. Default is Serial */
+// #define USE_I2C
+
+/* Select hand configuration */
+// Defaults:
+// Rev1: EE_HANDS
+// Rev2: SPLIT_HAND_PIN B4
+
+// You can override the defaults (rev1 doesn't support SPLIT_HAND_PIN)
+//#define EE_HANDS
+//#define MASTER_LEFT
+//#define MASTER_RIGHT
+
+
+#ifdef AUDIO_ENABLE
+ #define DEFAULT_LAYER_SONGS { SONG(QWERTY_SOUND), \
+ SONG(DVORAK_SOUND), \
+ SONG(COLEMAK_SOUND) \
+ }
+#endif
diff --git a/keyboards/vitamins_included/keymaps/vitavim/keymap.c b/keyboards/vitamins_included/keymaps/vitavim/keymap.c
new file mode 100644
index 00000000000..e90f0e076eb
--- /dev/null
+++ b/keyboards/vitamins_included/keymaps/vitavim/keymap.c
@@ -0,0 +1,106 @@
+#include QMK_KEYBOARD_H
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+enum layers {
+ _ALPHAS,
+ _MODS,
+ _VIM,
+ _NUMPAD,
+ _CODE,
+};
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Alphas
+ * ,--------------------------------------------------------------------------------------------.
+ * | Tab | q | w | e | r | t | y | u | i | o | p | ins |
+ * |--------+------+-----+------+---------+------+------+-------+------+------+--------+--------|
+ * |ctl(esc)| a | s | d | f | g | h | j | k | l |LT(2,;:)|sft(ent)|
+ * |--------+------+-----+------+---------+------|------+-------+------+------+--------+--------|
+ * |LSPO | z | x | c | v | b | n | m | ,< | .> | up | RSPC |
+ * |--------+------+-----+------+---------+------+------+-------+------+------+--------+--------|
+ * | ctl | GUI | alt |MO(1) |lt(3,del)|Space |Space |bckspc |MO(4) | left | down | right |
+ * `--------------------------------------------------------------------------------------------'
+ */
+[_ALPHAS] = LAYOUT_ortho_4x12(
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_INS,
+ LCTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(2,KC_SCLN), RSFT_T(KC_ENT),
+ KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_UP, KC_RSPC,
+ KC_LCTL, KC_LGUI, KC_LALT, MO(1), LT(3,KC_DEL), KC_SPC, KC_SPC, KC_BSPC, MO(4), KC_LEFT, KC_DOWN, KC_RGHT
+),
+
+/* MODS
+ * ,-----------------------------------------------------------------------------------.
+ * | `~ | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 |PrtSc |
+ * |-------+------+------+------+------+-------------+------+------+------+------+------|
+ * |Meh(F7)| ! | * | # | $ | % | ^ | & | * | '" | " | \| |
+ * |-------+------+------+------+------+------|------+------+------+------+------+------|
+ * | LS/( | z | x | [{ | ] | b | -_ | =+ | /? | \| | PgUp | RS/) |
+ * |-------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Ctrl | | | | | spc | _ |bckspc| | Home |PgDwn | End |
+ * `------------------------------------------------------------------------------------'
+ */
+[_MODS] = LAYOUT_ortho_4x12(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_PSCR,
+ MEH(KC_F7), KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_QUOT, KC_DQUO, KC_BSLS,
+ LSFT_T(KC_LCBR), KC_Z, KC_X, KC_LBRC, KC_RBRC, KC_B, KC_MINS, KC_EQL, KC_SLSH, KC_BSLS, KC_PGUP, RSFT_T(KC_RCBR),
+ KC_LCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_UNDS, KC_BSPC, KC_NO, KC_HOME, KC_PGDN, KC_END
+),
+
+/* VIM layer that adds vim navigation by holding the ; key. Includes keys like $,^ for end/beg of line and b,w,e,d,y. Also includes
+ * quick keys for excel like alt(=) for sum, ctl(+) & ctl(-) to add/remove columns/rows.
+ * ,--------------------------------------------------------------------------------------.
+ * | Tab | "' | b | w | e | d | y | Vol- | Vol+ | TO(0)| TG(2) |reset |
+ * |--------+------+-----+-----+--------+-----+------+------+------+------+--------+------|
+ * |Ctl(Esc)| Home |Home |Pg Up|Pg Down | End | Left | Down | Up |Right |LT(2,;:)|Enter |
+ * |--------+------+-----+-----+--------+-----|------+------+------+------+--------+------|
+ * | sft | ;: | q | ^ | $ | x |alt(=)|ctl(+)|ctl(-)| | | |
+ * |--------+------+-----+-----+--------+-----+------+------+------+------+--------+------|
+ * | Ctl | GUI | alt | sft |sft(ctl)| spc | del | bspc | | | | |
+ * `--------------------------------------------------------------------------------------'
+ */
+[_VIM] = LAYOUT_ortho_4x12(
+ KC_TAB, KC_QUOT, KC_B, KC_W, KC_E, KC_D, KC_Y, KC_VOLD, KC_VOLU, TO(0), TG(2), RESET,
+ LCTL_T(KC_ESC), KC_HOME, KC_HOME, KC_PGUP, KC_PGDN, KC_END, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, LT(2,KC_SCLN), KC_ENT,
+ KC_LSFT, KC_SCLN, KC_Q, KC_CIRC, KC_DLR, KC_X, RALT(KC_EQL), RCTL(KC_PLUS), RCTL(KC_PMNS), KC_NO, KC_NO, KC_TRNS,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, LSFT(KC_LCTL), KC_SPC, KC_DEL, KC_BSPC, KC_NO, KC_NO, KC_NO, KC_TRNS
+),
+
+/* NUMPAD: Numpad with operators and other keys
+ * ,-------------------------------------------------------------------------------------.
+ * | [{ | ! | @ | # | $ | % | ( | 7 | 8 | 9 | ) | ]} |
+ * |------+------+------+------+------+-------------+------+------+------+------+--------|
+ * | { | / | * | - | + | | = | 4 | 5 | 6 | ;: | } |
+ * |------+------+------+------+------+------|------+------+------+------+------+--------|
+ * | sft( | | | | | | | 1 | 2 | 3 | |kc_sft()|
+ * |------+------+------+------+------+------+------+------+------+------+------+--------|
+ * | | | | | |Space |Space | 0 | | | | |
+ * `-------------------------------------------------------------------------------------'
+ */
+[_NUMPAD] = LAYOUT_ortho_4x12(
+ KC_LBRC, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_LPRN, KC_7, KC_8, KC_9, KC_RPRN, KC_RBRC,
+ KC_LCBR, KC_PSLS, KC_PAST, KC_PMNS, KC_PPLS, KC_NO, KC_EQL, KC_4, KC_5, KC_6, KC_SCLN, KC_RCBR,
+ KC_LSPO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_1, KC_2, KC_3, KC_PEQL, KC_RSPC,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_0, KC_NO, KC_NO, KC_NO, KC_NO
+),
+
+/* CODE
+ * ,---------------------------------------------------------------------------.
+ * | ~` | F11 | F12 | 3 | 4 | 5 | 6 | : | - | > | 0 | Del |
+ * |----+-----+-----+----+-----+-------------+------+-----+------+------+------|
+ * | | / | * | { | [{ | ( | ) | ]} | } | '" | ]} | \| |
+ * |----+-----+-----+----+-----+-----|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | ~ | = | \ |RGBTOG|RGBHUI|RGBHUD|
+ * |----+-----+-----+----+-----+-----+------+------+------+------+------+------|
+ * | | | | | | | | | |RGBVAD|RBGVAI|RGBMOD|
+ * `---------------------------------------------------------------------------'
+ */
+[_CODE] = LAYOUT_ortho_4x12(
+ KC_GRV, KC_F11, KC_F12, KC_3, KC_4, KC_5, KC_6, KC_COLN, KC_MINS, KC_GT, KC_0, KC_DEL,
+ KC_TRNS, KC_PSLS, KC_PAST, KC_LCBR, KC_LBRC, KC_LPRN, KC_RPRN, KC_RBRC, KC_RCBR, KC_QUOT, KC_RBRC, KC_BSLS,
+ KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_TILD, KC_EQL, KC_NUBS, RGB_TOG, RGB_HUI, RGB_HUD,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, RGB_VAI, RGB_MOD
+)
+
+};
diff --git a/keyboards/vitamins_included/rev2/config.h b/keyboards/vitamins_included/rev2/config.h
index d0f9e64003e..e3d30519880 100644
--- a/keyboards/vitamins_included/rev2/config.h
+++ b/keyboards/vitamins_included/rev2/config.h
@@ -56,8 +56,9 @@ along with this program. If not, see .
/* ws2812 RGB LED */
#define RGB_DI_PIN F0
-#define RGBLED_NUM 12 // Number of LEDs
+#define RGBLED_NUM 12
#define RGBLIGHT_ANIMATIONS
+#define RGBLED_SPLIT { 6, 6 }
/* Audio settings */
#ifdef AUDIO_ENABLE
diff --git a/keyboards/vitamins_included/rules.mk b/keyboards/vitamins_included/rules.mk
index 0d615b41f07..3eb3a1c306a 100644
--- a/keyboards/vitamins_included/rules.mk
+++ b/keyboards/vitamins_included/rules.mk
@@ -15,7 +15,7 @@ DEBUG_ENABLE = no # Enable more debug info
EXTRAKEY_ENABLE = yes # Audio control and System control
MIDI_ENABLE = no # MIDI controls
MOUSEKEY_ENABLE = no # Mouse keys
-NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
UNICODE_ENABLE = no # Unicode
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
diff --git a/keyboards/wallaby/config.h b/keyboards/wallaby/config.h
index 0f142f18f2c..11fa674a834 100644
--- a/keyboards/wallaby/config.h
+++ b/keyboards/wallaby/config.h
@@ -192,10 +192,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/walletburner/neuron/info.json b/keyboards/walletburner/neuron/info.json
index 4ea4bcb941e..9c0b4e2ef25 100644
--- a/keyboards/walletburner/neuron/info.json
+++ b/keyboards/walletburner/neuron/info.json
@@ -6,7 +6,7 @@
"height": 4,
"layouts": {
"LAYOUT": {
- "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"Q", "x":1, "y":0}, {"label":"W", "x":2, "y":0}, {"label":"E", "x":3, "y":0}, {"label":"R", "x":4, "y":0}, {"label":"T", "x":5, "y":0}, {"label":"Y", "x":6, "y":0}, {"label":"U", "x":7, "y":0}, {"label":"I", "x":8, "y":0}, {"label":"O\u2191", "x":9, "y":0}, {"label":"P", "x":10, "y":0}, {"label":"Back Space", "x":11, "y":0}, {"label":"Ctrl", "x":0, "y":1, "w":1.25}, {"label":"A", "x":1.25, "y":1}, {"label":"S", "x":2.25, "y":1}, {"label":"D", "x":3.25, "y":1}, {"label":"F", "x":4.25, "y":1}, {"label":"G", "x":5.25, "y":1}, {"label":"H", "x":6.25, "y":1}, {"label":"J", "x":7.25, "y":1}, {"label":"K\u2190", "x":8.25, "y":1}, {"label":"L\u2192", "x":9.25, "y":1}, {"label":"Enter", "x":10.25, "y":1, "w":1.75}, {"label":"Shift", "x":0, "y":2, "w":1.75}, {"label":"Z", "x":1.75, "y":2}, {"label":"X", "x":2.75, "y":2}, {"label":"C", "x":3.75, "y":2}, {"label":"V", "x":4.75, "y":2}, {"label":"B", "x":5.75, "y":2}, {"label":"N", "x":6.75, "y":2}, {"label":"M", "x":7.75, "y":2}, {"label":"<\u2193,", "x":8.75, "y":2}, {"label":">.", "x":9.75, "y":2}, {"label":"Fn", "x":10.75, "y":2, "w":1.25}, {"label":"Super", "x":1, "y":3}, {"label":"Meta", "x":2, "y":3, "w":1.5}, {"x":3.5, "y":3, "w":2.25}, {"x":5.75, "y":3, "w":2.75}, {"label":"Meta", "x":8.5, "y":3, "w":1.5}, {"label":"Alt Gr", "x":10, "y":3}]
+ "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"Q", "x":1, "y":0}, {"label":"W", "x":2, "y":0}, {"label":"E", "x":3, "y":0}, {"label":"R", "x":4, "y":0}, {"label":"T", "x":5, "y":0}, {"label":"Y", "x":6, "y":0}, {"label":"U", "x":7, "y":0}, {"label":"I", "x":8, "y":0}, {"label":"O", "x":9, "y":0}, {"label":"P", "x":10, "y":0}, {"label":"Back Space", "x":11, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.25}, {"label":"A", "x":1.25, "y":1}, {"label":"S", "x":2.25, "y":1}, {"label":"D", "x":3.25, "y":1}, {"label":"F", "x":4.25, "y":1}, {"label":"G", "x":5.25, "y":1}, {"label":"H", "x":6.25, "y":1}, {"label":"J", "x":7.25, "y":1}, {"label":"K", "x":8.25, "y":1}, {"label":"L", "x":9.25, "y":1}, {"label":"Enter", "x":10.25, "y":1, "w":1.75}, {"label":"Shift", "x":0, "y":2, "w":1.75}, {"label":"Z", "x":1.75, "y":2}, {"label":"X", "x":2.75, "y":2}, {"label":"C", "x":3.75, "y":2}, {"label":"V", "x":4.75, "y":2}, {"label":"B", "x":5.75, "y":2}, {"label":"N", "x":6.75, "y":2}, {"label":"M", "x":7.75, "y":2}, {"label":"<", "x":8.75, "y":2}, {"label":"Shift", "x":9.75, "y":2, "w":1.25}, {"label":"Fn", "x":11, "y":2}, {"label":"Hyper", "x":1, "y":3, "w":1.25}, {"label":"Super", "x":2.25, "y":3, "w":1.25}, {"x":3.5, "y":3, "w":1.75}, {"x":5.25, "y":3}, {"x":6.25, "y":3, "w":2.25}, {"label":"Meta", "x":8.5, "y":3, "w":1.25}, {"label":"Super", "x":9.75, "y":3, "w":1.25}]
}
}
-}
\ No newline at end of file
+}
diff --git a/keyboards/westfoxtrot/cypher/rev5/config.h b/keyboards/westfoxtrot/cypher/rev5/config.h
index 111771ae86c..367b5f4f3fb 100644
--- a/keyboards/westfoxtrot/cypher/rev5/config.h
+++ b/keyboards/westfoxtrot/cypher/rev5/config.h
@@ -21,7 +21,7 @@ along with this program. If not, see .
/* USB Device descriptor parameter */
#define VENDOR_ID 0x21FF
-#define PRODUCT_ID 0xAA97
+#define PRODUCT_ID 0xAA98
#define DEVICE_VER 0x0002
#define MANUFACTURER westfoxtrot
#define PRODUCT cypher
diff --git a/keyboards/westfoxtrot/cypher/rev5/keymaps/via/keymap.c b/keyboards/westfoxtrot/cypher/rev5/keymaps/via/keymap.c
new file mode 100644
index 00000000000..93be29fbdc7
--- /dev/null
+++ b/keyboards/westfoxtrot/cypher/rev5/keymaps/via/keymap.c
@@ -0,0 +1,35 @@
+/* VIA Layout > http://www.keyboard-layout-editor.com/#/gists/0e8d4957e77f3179aa09bd6e195f7afa */
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[0] = LAYOUT_all(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PEQL,
+ KC_LSFT, KC_BSLS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RALT, MO(1), KC_LEFT,KC_DOWN,KC_RGHT, KC_P0, KC_PDOT, KC_BSPC),
+
+[1] = LAYOUT_all(
+ RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, BL_TOGG, BL_STEP, BL_ON, BL_OFF, BL_INC, BL_DEC, BL_BRTG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+[2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+[3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+};
diff --git a/keyboards/westfoxtrot/cypher/rev5/keymaps/via/rules.mk b/keyboards/westfoxtrot/cypher/rev5/keymaps/via/rules.mk
new file mode 100644
index 00000000000..36b7ba9cbc9
--- /dev/null
+++ b/keyboards/westfoxtrot/cypher/rev5/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/wete/chconf.h b/keyboards/wete/chconf.h
index 4640ff5332b..03f63da36a8 100644
--- a/keyboards/wete/chconf.h
+++ b/keyboards/wete/chconf.h
@@ -331,7 +331,7 @@
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE FALSE
+#define CH_CFG_USE_MEMCORE TRUE
#endif
/**
diff --git a/keyboards/wete/keymaps/via/config.h b/keyboards/wete/keymaps/via/config.h
new file mode 100644
index 00000000000..4dadf6a1695
--- /dev/null
+++ b/keyboards/wete/keymaps/via/config.h
@@ -0,0 +1 @@
+#define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR 2047
diff --git a/keyboards/wete/keymaps/via/keymap.c b/keyboards/wete/keymaps/via/keymap.c
new file mode 100644
index 00000000000..0f1a0bedb1c
--- /dev/null
+++ b/keyboards/wete/keymaps/via/keymap.c
@@ -0,0 +1,53 @@
+/*
+Copyright 2012,2013 Jun Wako
+
+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 .
+*/
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_ansi_rhnp(
+ KC_INSERT, KC_PSCREEN, KC_PAUSE, KC_SLCK, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
+ KC_NUMLOCK, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+ KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_PLUS, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END,
+ KC_KP_4, KC_KP_5, KC_KP_6, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER, KC_PGUP,
+ KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_ENTER, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_KP_0, KC_KP_DOT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RIGHT
+ ),
+ [1] = LAYOUT_ansi_rhnp(
+ KC_NO, KC_NO, KC_NO, KC_NO, BL_TOGG, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, RESET,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, BL_INC, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, BL_OFF, BL_DEC, BL_ON
+ ),
+ [2] = LAYOUT_ansi_rhnp(
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO
+ ),
+ [3] = LAYOUT_ansi_rhnp(
+ KC_NO, KC_NO, KC_NO, KC_NO, BL_TOGG, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO
+ )
+};
diff --git a/keyboards/wete/keymaps/via/rules.mk b/keyboards/wete/keymaps/via/rules.mk
new file mode 100644
index 00000000000..ee1e4ceeb4b
--- /dev/null
+++ b/keyboards/wete/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+BOOTMAGIC_ENABLE = lite
diff --git a/keyboards/wete/wete.h b/keyboards/wete/wete.h
index e9f44e185dd..46daf6d6f1f 100644
--- a/keyboards/wete/wete.h
+++ b/keyboards/wete/wete.h
@@ -16,14 +16,14 @@
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2i, k2j, \
k30, k31, k32, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f, k3i, k3j, \
k40, k41, k42, k43, k44, k46, k47, k48, k49, k4a, k4b, k4c, k4d, k4e, k4f, k4h, k4i, k4j, \
- k50, k52, k54, k55, k56, k5a, k5d, k5e, k5h, k5i, k5j \
+ k50, k52, k54, k55, k56, k5a, k5d, k5f, k5h, k5i, k5j \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, XXX, k0a, k0b, k0c, k0d, XXX, k0f, k0g, k0h, k0i, k0j }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k1g, k1h, XXX, k1j }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, XXX, k2i, k2j }, \
{ k30, k31, k32, XXX, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f, XXX, XXX, k3i, k3j }, \
{ k40, k41, k42, k43, k44, XXX, k46, k47, k48, k49, k4a, k4b, k4c, k4d, k4e, k4f, XXX, k4h, k4i, k4j }, \
- { k50, XXX, k52, XXX, k54, k55, k56, XXX, XXX, XXX, k5a, XXX, XXX, k5d, k5e, XXX, XXX, k5h, k5i, k5j } \
+ { k50, XXX, k52, XXX, k54, k55, k56, XXX, XXX, XXX, k5a, XXX, XXX, k5d, XXX, k5f, XXX, k5h, k5i, k5j } \
}
// ANSI layout
@@ -37,14 +37,14 @@
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2i, k2j, \
k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f, k3i, k3j, \
k40, k41, k42, k43, k44, k46, k47, k48, k49, k4a, k4b, k4c, k4d, k4e, k4f, k4h, k4i, k4j, \
- k51, k52, k54, k55, k56, k5a, k5d, k5e, k5h, k5i, k5j \
+ k51, k52, k54, k55, k56, k5a, k5d, k5f, k5h, k5i, k5j \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, XXX, k0a, k0b, k0c, k0d, XXX, k0f, k0g, k0h, k0i, k0j }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k1g, k1h, XXX, k1j }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, XXX, k2i, k2j }, \
{ XXX, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f, XXX, XXX, k3i, k3j }, \
{ k40, k41, k42, k43, k44, XXX, k46, k47, k48, k49, k4a, k4b, k4c, k4d, k4e, k4f, XXX, k4h, k4i, k4j }, \
- { XXX, k51, k52, XXX, k54, k55, k56, XXX, XXX, XXX, k5a, XXX, XXX, k5d, k5e, XXX, XXX, k5h, k5i, k5j } \
+ { XXX, k51, k52, XXX, k54, k55, k56, XXX, XXX, XXX, k5a, XXX, XXX, k5d, XXX, k5f, XXX, k5h, k5i, k5j } \
}
// ANSI layout
@@ -58,14 +58,14 @@
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2i, k2j, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f, k3i, k3j, \
k40, k41, k42, k43, k44, k46, k47, k48, k49, k4a, k4b, k4c, k4d, k4e, k4f, k4h, k4i, k4j, \
- k50, k51, k52, k53, k54, k55, k56, k5a, k5d, k5e, k5h, k5i, k5j \
+ k50, k51, k52, k53, k54, k55, k56, k5a, k5d, k5f, k5h, k5i, k5j \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, XXX, k0a, k0b, k0c, k0d, XXX, k0f, k0g, k0h, k0i, k0j }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k1g, k1h, XXX, k1j }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, XXX, k2i, k2j }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f, XXX, XXX, k3i, k3j }, \
{ k40, k41, k42, k43, k44, XXX, k46, k47, k48, k49, k4a, k4b, k4c, k4d, k4e, k4f, XXX, k4h, k4i, k4j }, \
- { k50, k51, k52, k53, k54, k55, k56, XXX, XXX, XXX, k5a, XXX, XXX, k5d, k5e, XXX, XXX, k5h, k5i, k5j } \
+ { k50, k51, k52, k53, k54, k55, k56, XXX, XXX, XXX, k5a, XXX, XXX, k5d, XXX, k5f, XXX, k5h, k5i, k5j } \
}
@@ -82,14 +82,14 @@
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2i, k2j, \
k30, k31, k32, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f, k3i, k3j, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4d, k4e, k4f, k4h, k4i, k4j, \
- k50, k52, k54, k55, k56, k5a, k5d, k5e, k5h, k5i, k5j \
+ k50, k52, k54, k55, k56, k5a, k5d, k5f, k5h, k5i, k5j \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, XXX, k0a, k0b, k0c, k0d, XXX, k0f, k0g, k0h, k0i, k0j }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k1g, k1h, XXX, k1j }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, XXX, k2i, k2j }, \
{ k30, k31, k32, XXX, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f, XXX, XXX, k3i, k3j }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4d, k4e, k4f, XXX, k4h, k4i, k4j }, \
- { k50, XXX, k52, XXX, k54, k55, k56, XXX, XXX, XXX, k5a, XXX, XXX, k5d, k5e, XXX, XXX, k5h, k5i, k5j } \
+ { k50, XXX, k52, XXX, k54, k55, k56, XXX, XXX, XXX, k5a, XXX, XXX, k5d, XXX, k5f, XXX, k5h, k5i, k5j } \
}
// ISO layout
@@ -104,14 +104,14 @@
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2i, k2j, \
k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f, k3i, k3j, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4d, k4e, k4f, k4h, k4i, k4j, \
- k51, k52, k54, k55, k56, k5a, k5d, k5e, k5h, k5i, k5j \
+ k51, k52, k54, k55, k56, k5a, k5d, k5f, k5h, k5i, k5j \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, XXX, k0a, k0b, k0c, k0d, XXX, k0f, k0g, k0h, k0i, k0j }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k1g, k1h, XXX, k1j }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, XXX, k2i, k2j }, \
{ XXX, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f, XXX, XXX, k3i, k3j }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4d, k4e, k4f, XXX, k4h, k4i, k4j }, \
- { XXX, k51, k52, XXX, k54, k55, k56, XXX, XXX, XXX, k5a, XXX, XXX, k5d, k5e, XXX, XXX, k5h, k5i, k5j } \
+ { XXX, k51, k52, XXX, k54, k55, k56, XXX, XXX, XXX, k5a, XXX, XXX, k5d, XXX, k5f, XXX, k5h, k5i, k5j } \
}
// ISO layout
@@ -126,14 +126,14 @@
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, k2i, k2j, \
k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f, k3i, k3j, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4d, k4e, k4f, k4h, k4i, k4j, \
- k50, k51, k52, k53, k54, k55, k56, k5a, k5d, k5e, k5h, k5i, k5j \
+ k50, k51, k52, k53, k54, k55, k56, k5a, k5d, k5f, k5h, k5i, k5j \
) { \
{ k00, k01, k02, k03, k04, k05, k06, k07, k08, XXX, k0a, k0b, k0c, k0d, XXX, k0f, k0g, k0h, k0i, k0j }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1d, k1e, k1f, k1g, k1h, XXX, k1j }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2d, k2e, k2f, k2g, XXX, k2i, k2j }, \
{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e, k3f, XXX, XXX, k3i, k3j }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, k4d, k4e, k4f, XXX, k4h, k4i, k4j }, \
- { k50, k51, k52, k53, k54, k55, k56, XXX, XXX, XXX, k5a, XXX, XXX, k5d, k5e, XXX, XXX, k5h, k5i, k5j } \
+ { k50, k51, k52, k53, k54, k55, k56, XXX, XXX, XXX, k5a, XXX, XXX, k5d, XXX, k5f, XXX, k5h, k5i, k5j } \
}
//////////////////////////////// JIS ////////////////////////////////
diff --git a/keyboards/wheatfield/blocked65/blocked65.c b/keyboards/wheatfield/blocked65/blocked65.c
new file mode 100644
index 00000000000..81da8005b0b
--- /dev/null
+++ b/keyboards/wheatfield/blocked65/blocked65.c
@@ -0,0 +1 @@
+#include "blocked65.h"
diff --git a/keyboards/wheatfield/blocked65/blocked65.h b/keyboards/wheatfield/blocked65/blocked65.h
new file mode 100644
index 00000000000..09fe673a667
--- /dev/null
+++ b/keyboards/wheatfield/blocked65/blocked65.h
@@ -0,0 +1,18 @@
+#pragma once
+#include "quantum.h"
+
+// readability
+#define _x_ KC_NO
+#define LAYOUT_65_ansi_blocker( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, K2E, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \
+ K40, K41, K42, K46, K4A, K4B, K4C, K4D, K4E \
+){ \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, _x_, K2D, K2E }, \
+ { K30, _x_, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \
+ { K40, K41, K42, _x_, _x_, _x_, K46, _x_, _x_, _x_, K4A, K4B, K4C, K4D, K4E }, \
+}
diff --git a/keyboards/wheatfield/blocked65/config.h b/keyboards/wheatfield/blocked65/config.h
new file mode 100644
index 00000000000..ea5c3161125
--- /dev/null
+++ b/keyboards/wheatfield/blocked65/config.h
@@ -0,0 +1,61 @@
+/*
+Copyright 2019 Maarten Dekkers
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x6060
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Dou
+#define PRODUCT Blocked65
+#define DESCRIPTION 65% keyboard with arrow cluster blocker
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 15
+
+// ROWS: Top to bottom, COLS: Left to right
+
+#define MATRIX_ROW_PINS { B0, B1, B2, B3, B7 }
+#define MATRIX_COL_PINS { D0, D1, D2, D3, D5, D4, D6, D7, B4, F7, F6, F5, F4, F1, F0 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION ROW2COL
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+#define BACKLIGHT_PIN B6
+#define BACKLIGHT_LEVELS 6
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+/* 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
+
+/* Backlight configuration
+ */
+#define RGB_DI_PIN E2
+#define RGBLIGHT_ANIMATIONS
+#define RGBLED_NUM 14
diff --git a/keyboards/wheatfield/blocked65/info.json b/keyboards/wheatfield/blocked65/info.json
new file mode 100644
index 00000000000..75e15f524b4
--- /dev/null
+++ b/keyboards/wheatfield/blocked65/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "Wheatfield blocked 65% keyboard",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 16,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_65_ansi_blocker": {
+ "layout": [{"label":"Esc", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"PrScr", "x":15, "y":0}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"label":"Del", "x":15, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"PgUp", "x":15, "y":2}, {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":1.75}, {"label":"\u2191", "x":14, "y":3}, {"label":"PgDn", "x":15, "y":3}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"Fn", "x":10, "y":4, "w":1.25}, {"label":"Alt", "x":11.25, "y":4, "w":1.25}, {"label":"\u2190", "x":13, "y":4}, {"label":"\u2193", "x":14, "y":4}, {"label":"\u2192", "x":15, "y":4}]
+ }
+ }
+}
diff --git a/keyboards/wheatfield/blocked65/keymaps/default/keymap.c b/keyboards/wheatfield/blocked65/keymaps/default/keymap.c
new file mode 100644
index 00000000000..c38a103101e
--- /dev/null
+++ b/keyboards/wheatfield/blocked65/keymaps/default/keymap.c
@@ -0,0 +1,31 @@
+#include QMK_KEYBOARD_H
+
+// Each layer gets a name for readability, which is then used in the keymap matrix below.
+// The underscores don't mean anything - you can have a layer called STUFF or any other name.
+// Layer names don't all need to be of the same length, obviously, and you can also skip them
+// entirely and just use numbers.
+
+enum layers {
+ _BL,
+ _FL
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_BL] = LAYOUT_65_ansi_blocker(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FL), KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [_FL] = LAYOUT_65_ansi_blocker(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_PSCR,
+ KC_TRNS, KC_NO, KC_UP, KC_NO, RGB_TOG, RGB_VAI, RGB_HUI, RGB_SAI, KC_INS, RESET, KC_PSCR, KC_SLCK, KC_PAUS, KC_BSLS, KC_SLCK,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, RGB_MOD, RGB_VAD, RGB_HUD, RGB_SAD, KC_NO, KC_NO, KC_F14, KC_F15, KC_INS, KC_HOME,
+ KC_LSFT, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO, BL_TOGG, KC_NO, KC_MUTE, KC_VOLD, KC_VOLU, KC_NO, KC_RSFT, RGB_MOD, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, RESET, KC_RALT, KC_TRNS, KC_HOME, BL_STEP, KC_END
+ )
+
+};
diff --git a/keyboards/wheatfield/blocked65/readme.md b/keyboards/wheatfield/blocked65/readme.md
new file mode 100644
index 00000000000..42cf5b24e25
--- /dev/null
+++ b/keyboards/wheatfield/blocked65/readme.md
@@ -0,0 +1,13 @@
+# Wheatfield Blocked65%
+
+A 65% PCB sold via TaoBao, commonly sold as part of the Canoe clone referred to as Fanoe.
+
+* Keyboard Maintainer: QMK Community
+* Hardware Supported: Wheatfield Blocked65%
+* Hardware Availability: [taobao.com](https://item.taobao.com/item.htm?id=570827341563&spm=1101.1101.N.N.b124829)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make wheatfield/blocked65:default
+
+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).
diff --git a/keyboards/wheatfield/blocked65/rules.mk b/keyboards/wheatfield/blocked65/rules.mk
new file mode 100644
index 00000000000..b572f2e41e9
--- /dev/null
+++ b/keyboards/wheatfield/blocked65/rules.mk
@@ -0,0 +1,35 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI controls
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+UNICODE_ENABLE = no # Unicode
+
+LAYOUTS = 65_ansi_blocker
diff --git a/keyboards/wheatfield/split75/README.md b/keyboards/wheatfield/split75/README.md
new file mode 100644
index 00000000000..ec8c7ee9ea9
--- /dev/null
+++ b/keyboards/wheatfield/split75/README.md
@@ -0,0 +1,28 @@
+# split75
+
+
+
+This is a port of the QMK firmware for the split75 keyboard, also known as the ve.a taobao split clone. It runs on
+ps2avrGB firmware, like the [ps2avrGB keyboard](https://www.keyclack.com/product/gb-ps2avrgb/) or the ones sold
+by [Winkeyless](http://winkeyless.kr/product/ps2avrgb-parts/).
+
+Original work performed by Michael L. Walker, all credit goes to him. I've tidied up the keymap (removed 3 extra keys), a couple of functions, info.json and this Readme.
+
+* Keyboard Maintainer: [Michael L. Walker](https://github.com/walkerstop)
+* Hardware Availability: https://a.aliexpress.com/_BT9raf https://item.taobao.com/item.htm?id=556970472669&toSite=main
+
+Make example for this keyboard (after setting up your build environment):
+
+ make wheatfield/split75:default
+
+Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
+
+ make wheatfield/split75:default:flash
+
+or
+
+ bootloadHID -r split75_default.hex
+
+**Reset Key**: Hold down the key located at 3rd left position in the bottom row, commonly programmed as Left Control while plugging in the keyboard.
+
+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).
diff --git a/keyboards/wheatfield/split75/config.h b/keyboards/wheatfield/split75/config.h
new file mode 100644
index 00000000000..ccc6a9c44f4
--- /dev/null
+++ b/keyboards/wheatfield/split75/config.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#define VENDOR_ID 0x594D
+#define PRODUCT_ID 0x0001
+#define DEVICE_VER 0x0001
+#define MANUFACTURER YMDK
+#define PRODUCT Split75
+#define DESCRIPTION VE.A Clone
+
+/* matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 14
+
+#define RGBLED_NUM 8
+#define RGBLIGHT_ANIMATIONS
+#define RGBLIGHT_SLEEP
+
+#define BACKLIGHT_PIN D4
diff --git a/keyboards/wheatfield/split75/info.json b/keyboards/wheatfield/split75/info.json
new file mode 100644
index 00000000000..1524f212450
--- /dev/null
+++ b/keyboards/wheatfield/split75/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "split75",
+ "url": "",
+ "maintainer": "Michael L. Walker",
+ "width": 19.25,
+ "height": 6,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [{"label":"ESC", "x":2.25, "y":0}, {"label":"F1", "x":3.25, "y":0}, {"label":"F2", "x":4.25, "y":0}, {"label":"F3", "x":5.25, "y":0}, {"label":"F4", "x":6.25, "y":0}, {"label":"F5", "x":7.25, "y":0}, {"label":"F6", "x":8.25, "y":0}, {"label":"F7", "x":10.25, "y":0}, {"label":"F8", "x":11.25, "y":0}, {"label":"F9", "x":12.25, "y":0}, {"label":"F10", "x":13.25, "y":0}, {"label":"F11", "x":14.25, "y":0}, {"label":"F12", "x":15.25, "y":0}, {"label":"Prt", "x":16.25, "y":0}, {"label":"Ins", "x":17.25, "y":0}, {"label":"Del", "x":18.25, "y":0}, {"label":"8", "x":0, "y":1}, {"label":"9", "x":1, "y":1}, {"label":"~", "x":2.25, "y":1}, {"label":"!", "x":3.25, "y":1}, {"label":"@", "x":4.25, "y":1}, {"label":"#", "x":5.25, "y":1}, {"label":"$", "x":6.25, "y":1}, {"label":"%", "x":7.25, "y":1}, {"label":"^", "x":8.25, "y":1}, {"label":"&", "x":10.25, "y":1}, {"label":"*", "x":11.25, "y":1}, {"label":"(", "x":12.25, "y":1}, {"label":")", "x":13.25, "y":1}, {"label":"_", "x":14.25, "y":1}, {"label":"+", "x":15.25, "y":1}, {"label":"Backspace", "x":16.25, "y":1, "w":2}, {"label":"Home", "x":18.25, "y":1}, {"label":"6", "x":0, "y":2}, {"label":"7", "x":1, "y":2}, {"label":"Tab", "x":2.25, "y":2, "w":1.5}, {"label":"Q", "x":3.75, "y":2}, {"label":"W", "x":4.75, "y":2}, {"label":"E", "x":5.75, "y":2}, {"label":"R", "x":6.75, "y":2}, {"label":"T", "x":7.75, "y":2}, {"label":"Y", "x":9.75, "y":2}, {"label":"U", "x":10.75, "y":2}, {"label":"I", "x":11.75, "y":2}, {"label":"O", "x":12.75, "y":2}, {"label":"P", "x":13.75, "y":2}, {"label":"{", "x":14.75, "y":2}, {"label":"}", "x":15.75, "y":2}, {"label":"|", "x":16.75, "y":2, "w":1.5}, {"label":"PgUp", "x":18.25, "y":2}, {"label":"4", "x":0, "y":3}, {"label":"5", "x":1, "y":3}, {"label":"Caps Lock", "x":2.25, "y":3, "w":1.75}, {"label":"A", "x":4, "y":3}, {"label":"S", "x":5, "y":3}, {"label":"D", "x":6, "y":3}, {"label":"F", "x":7, "y":3}, {"label":"G", "x":8, "y":3}, {"label":"H", "x":10, "y":3}, {"label":"J", "x":11, "y":3}, {"label":"K", "x":12, "y":3}, {"label":"L", "x":13, "y":3}, {"label":":", "x":14, "y":3}, {"label":"\"", "x":15, "y":3}, {"label":"Enter", "x":16, "y":3, "w":2.25}, {"label":"PgDn", "x":18.25, "y":3}, {"label":"2", "x":0, "y":4}, {"label":"3", "x":1, "y":4}, {"label":"Shift", "x":2.25, "y":4, "w":2.25}, {"label":"Z", "x":4.5, "y":4}, {"label":"X", "x":5.5, "y":4}, {"label":"C", "x":6.5, "y":4}, {"label":"V", "x":7.5, "y":4}, {"label":"B", "x":8.5, "y":4}, {"label":"N", "x":10.5, "y":4}, {"label":"M", "x":11.5, "y":4}, {"label":"<", "x":12.5, "y":4}, {"label":">", "x":13.5, "y":4}, {"label":"?", "x":14.5, "y":4}, {"label":"Shift", "x":15.5, "y":4, "w":1.75}, {"label":"\u2191", "x":17.25, "y":4}, {"label":"End", "x":18.25, "y":4}, {"label":"0", "x":0, "y":5}, {"label":"1", "x":1, "y":5}, {"label":"Ctrl", "x":2.25, "y":5, "w":1.25}, {"label":"Win", "x":3.5, "y":5, "w":1.25}, {"label":"Alt", "x":4.75, "y":5, "w":1.25}, {"x":6, "y":5, "w":2}, {"x":8, "y":5}, {"x":10, "y":5, "w":2.75}, {"label":"Alt", "x":12.75, "y":5, "w":1.25}, {"label":"Fn", "x":14, "y":5}, {"label":"Ctrl", "x":15, "y":5, "w":1.25}, {"label":"\u2190", "x":16.25, "y":5}, {"label":"\u2193", "x":17.25, "y":5}, {"label":"\u2192", "x":18.25, "y":5}]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/wheatfield/split75/keymaps/art/keymap.c b/keyboards/wheatfield/split75/keymaps/art/keymap.c
new file mode 100644
index 00000000000..e540f1cb62f
--- /dev/null
+++ b/keyboards/wheatfield/split75/keymaps/art/keymap.c
@@ -0,0 +1,189 @@
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+ BASE,
+ QWERTY_MOD,
+ QWERTY,
+ WORKMAN,
+ MOD,
+ MEDIA
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* Base ,-----------------------------------------. ,-----------------------------------------------------.
+ * | ESC | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |Print| Ins | Home|
+ * ,-----------. |-----+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+-----------+-----|
+ * | 8 | 9 | | ~ | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | Backspac | Del |
+ * |-----+-----| |-----------------------------------------' ,--------------------------------------------------+-----|
+ * | 6 | 7 | | Tab | Q | W | E | R | T | | Y | U | I | O | P | [ | ] | \ | End |
+ * |-----+-----| |---------------------------------------. `--------------------------------------------------+-----|
+ * | 4 | 5 | | Caps | A | S | D | F | G | | H | J | K | L | ; | ' | Enter | PgUp|
+ * |-----+-----| |-----------------------------------------. `-------------------------------------------------+-----|
+ * | 2 | 3 | | Shift | Z | X | C | V | B | | N | M | , | . | / | Shift | Up | PgDn|
+ * |-----+-----| |-----------------------------------------' ,-------------------------------------------+-----+-----|
+ * | 0 | 1 | | Ctrl | GUI | Alt | Space |Space| | Space | Alt |QW_ON| Ctrl | Left| Down|Right|
+ * `-----------' `---------------------------------------' `-------------------------------------------------------'
+ */
+ [BASE] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------| |--------------------------------Right Hand------------------------------------------------
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_INS, KC_HOME,
+KC_8, KC_9, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL, KC_BSPC, KC_DEL,
+KC_6, KC_7, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END,
+KC_4, KC_5, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER, KC_PGUP,
+KC_2, KC_3, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+KC_0, KC_1, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(QWERTY_MOD), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT
+ ),
+
+ /*QWERT On + Mod ,-----------------------------------------. ,-----------------------------------------------------.
+ * | | | | | | | | | | | | | | | | | |
+ * ,-----------. |-----+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+-----------+-----|
+ * | | | | | | | | | | | | | | | | | | | |
+ * |-----+-----| |-----------------------------------------' ,--------------------------------------------------+-----|
+ * | | | | |MePrv| Vol+|MeNxt| | | | | | | | | | | | |
+ * |-----+-----| |---------------------------------------. `--------------------------------------------------+-----|
+ * | | | | | | Vol-| | | | | | | | | | | | |
+ * |-----+-----| |-----------------------------------------. `-------------------------------------------------+-----|
+ * | | | | | | Vol0|MePly| | | | | | | | | | | |
+ * |-----+-----| |-----------------------------------------' ,-------------------------------------------+-----+-----|
+ * | | | | QWERTY | | | | | | | | | | | | |
+ * `-----------' `---------------------------------------' `-------------------------------------------------------'
+ */
+ [QWERTY_MOD] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, KC_MPRV, KC_VOLU, KC_MNXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, KC_VOLD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, KC_MUTE, KC_MPLY, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, TO(QWERTY),_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ /* QWERTY ,-----------------------------------------. ,-----------------------------------------------------.
+ * | ESC | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |Print| Ins | Home|
+ * ,-----------. |-----+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+-----------+-----|
+ * | 8 | 9 | | ~ | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | Backspac | Del |
+ * |-----+-----| |-----------------------------------------' ,--------------------------------------------------+-----|
+ * | 6 | 7 | | Tab | Q | W | E | R | T | | Y | U | I | O | P | [ | ] | \ | End |
+ * |-----+-----| |---------------------------------------. `--------------------------------------------------+-----|
+ * | 4 | 5 | | Caps | A | S | D | F | G | | H | J | K | L | ; | ' | Enter | PgUp|
+ * |-----+-----| |-----------------------------------------. `-------------------------------------------------+-----|
+ * | 2 | 3 | | Shift | Z | X | C | V | B | | N | M | , | . | / | Shift | Up | PgDn|
+ * |-----+-----| |-----------------------------------------' ,-------------------------------------------+-----+-----|
+ * | 0 | 1 | | Ctrl | GUI | Alt |Spac/MEDIA | BSPC| | MOD | Alt | MOD | Ctrl | Left| Down|Right|
+ * `-----------' `---------------------------------------' `-------------------------------------------------------'
+ */
+ [QWERTY] = LAYOUT(
+//--------------------------------Left Hand------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_INS, KC_HOME,
+KC_8, KC_9, KC_GRAVE, KC_1, KC_2, LGUI_T(KC_3), LALT_T(KC_4), LCTL_T(KC_5), KC_6, KC_7, LCTL_T(KC_8), LALT_T(KC_9), LGUI_T(KC_0), KC_MINUS, KC_EQUAL, KC_BSPC, KC_DEL,
+KC_6, KC_7, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_END,
+KC_4, KC_5, KC_CAPS, KC_A, KC_S ,KC_D ,KC_F ,KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_ENTER, KC_PGUP,
+KC_2, KC_3, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_PGDN,
+KC_0, KC_1, KC_LCTL, KC_LGUI, KC_LALT, LT(MEDIA, KC_SPC),KC_BSPC, MO(MOD), KC_RALT, MO(MOD),KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT
+ ),
+
+ /* WORKMAN ,-----------------------------------------. ,-----------------------------------------------------.
+ * | | | | | | | | | | | | | | | | | |
+ * ,-----------. |-----+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+-----------+-----|
+ * | | | | | | | | | | | | | | | | | | | |
+ * |-----+-----| |-----------------------------------------' ,--------------------------------------------------+-----|
+ * | | | | | | | | | | | | | | | | | | | |
+ * |-----+-----| |---------------------------------------. `--------------------------------------------------+-----|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----+-----| |-----------------------------------------. `-------------------------------------------------+-----|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----+-----| |-----------------------------------------' ,-------------------------------------------+-----+-----|
+ * | | | | BASE | | | | | | | | | | | | |
+ * `-----------' `---------------------------------------' `-------------------------------------------------------'
+ */
+ [WORKMAN] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_SCLN,_______,_______, _______, _______,
+_______, _______, _______, KC_A, KC_S, KC_H, KC_T, KC_G, KC_Y, KC_N, KC_E, KC_O, KC_I, _______, _______, _______,
+_______, _______, _______, KC_Z, KC_X, KC_C, KC_V, KC_M, KC_K, KC_L, KC_COMM,KC_DOT, KC_SLSH, _______, _______, _______,
+_______, _______, TO(BASE), _______,_______,_______, _______, _______, _______, TO(QWERTY), _______, _______, _______, _______
+ ),
+
+ /* MOD ,-----------------------------------------. ,-----------------------------------------------------.
+ * | | | | | | | | | | | | | | | | | |
+ * ,-----------. |-----+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+-----------+-----|
+ * | | | | | | | | | | | | | | | | | | | |
+ * |-----+-----| |-----------------------------------------' ,--------------------------------------------------+-----|
+ * | | | | | | | | | | | | | | | | | | | |
+ * |-----+-----| |---------------------------------------. `--------------------------------------------------+-----|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----+-----| |-----------------------------------------. `-------------------------------------------------+-----|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----+-----| |-----------------------------------------' ,-------------------------------------------+-----+-----|
+ * | | | | BASE | | | | | | | | | | | | |
+ * `-----------' `---------------------------------------' `-------------------------------------------------------'
+ */
+ [MOD] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, KC_HOME, KC_UP, KC_END, KC_PGUP, _______, KC_MS_BTN1,KC_MS_UP, KC_MS_BTN3,KC_MS_BTN2,_______,_______, _______, _______,
+_______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDOWN, _______,KC_MS_LEFT,KC_MS_DOWN,KC_MS_RIGHT,KC_APPLICATION, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, TO(WORKMAN),TO(BASE), KC_MS_ACCEL0,KC_MS_ACCEL1,KC_MS_ACCEL2, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ /* MEDIA ,-----------------------------------------. ,-----------------------------------------------------.
+ * | | | | | | | | | | | | | | | | | |
+ * ,-----------. |-----+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+-----------+-----|
+ * | | | | | | | | | | | | | | | | | | | |
+ * |-----+-----| |-----------------------------------------' ,--------------------------------------------------+-----|
+ * | | | | | | | | | | | | | | | | | | | |
+ * |-----+-----| |---------------------------------------. `--------------------------------------------------+-----|
+ * | | | | | | | | | | | | | | | | | | |
+ * |-----+-----| |-----------------------------------------. `-------------------------------------------------+-----|
+ * | | | | | | | Play| | | | | | | | | | | |
+ * |-----+-----| |-----------------------------------------' ,-------------------------------------------+-----+-----|
+ * | | | | BASE | | | | | | | | | | | | |
+ * `-----------' `---------------------------------------' `-------------------------------------------------------'
+ */
+ [MEDIA] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, KC_MPRV, KC_VOLU, KC_MNXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, KC_VOLD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, KC_MUTE, KC_MPLY, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
+
+bool led_update_user(led_t led_state) {
+ writePin(CAPSLOCK_LED_PIN, led_state.caps_lock);
+ return false;
+}
+
+void keyboard_pre_init_user(void) {
+ writePinHigh(SCROLLLOCK_LED_PIN);
+ wait_ms(50);
+ writePinHigh(CAPSLOCK_LED_PIN);
+ wait_ms(50);
+ writePinHigh(NUMLOCK_LED_PIN);
+ wait_ms(50);
+ writePinLow(SCROLLLOCK_LED_PIN);
+ wait_ms(50);
+ writePinLow(CAPSLOCK_LED_PIN);
+ wait_ms(50);
+ writePinLow(NUMLOCK_LED_PIN);
+
+ layer_state_set_user(layer_state);
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ writePinLow(NUMLOCK_LED_PIN);
+ writePinLow(SCROLLLOCK_LED_PIN);
+ switch (get_highest_layer(state)) {
+ case BASE:
+ writePinHigh(SCROLLLOCK_LED_PIN);
+ break;
+ }
+ return state;
+}
diff --git a/keyboards/wheatfield/split75/keymaps/default/keymap.c b/keyboards/wheatfield/split75/keymaps/default/keymap.c
new file mode 100644
index 00000000000..069eb6bd10b
--- /dev/null
+++ b/keyboards/wheatfield/split75/keymaps/default/keymap.c
@@ -0,0 +1,30 @@
+#include QMK_KEYBOARD_H
+
+#define BASE 0
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* Base ,-----------------------------------------. ,-----------------------------------------------------.
+ * | ESC | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |Print| Ins | Del |
+ * ,-----------. |-----+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+-----------+-----|
+ * | 8 | 9 | | ~ | 1 | 2 | 3 | 4 | 5 | 6 | | 7 | 8 | 9 | 0 | - | = | Backspac | Home|
+ * |-----+-----| |-----------------------------------------' ,--------------------------------------------------+-----|
+ * | 6 | 7 | | Tab | Q | W | E | R | T | | Y | U | I | O | P | [ | ] | \ | PgUp|
+ * |-----+-----| |---------------------------------------. `--------------------------------------------------+-----|
+ * | 4 | 5 | | Caps | A | S | D | F | G | | H | J | K | L | ; | ' | Enter | PgDn|
+ * |-----+-----| |-----------------------------------------. `-------------------------------------------------+-----|
+ * | 2 | 3 | | Shift | Z | X | C | V | B | | N | M | , | . | / | Shift | Up | End |
+ * |-----+-----| |-----------------------------------------' ,-------------------------------------------+-----+-----|
+ * | 0 | 1 | | Ctrl | GUI | Alt | Space |Space| | Space | Alt | | Ctrl | Left| Down|Right|
+ * `-----------' `---------------------------------------' `-------------------------------------------------------'
+ */
+ [BASE] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------| |--------------------------------Right Hand------------------------------------------------
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_INS, KC_DEL,
+KC_8, KC_9, KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQUAL, KC_BSPC, KC_HOME,
+KC_6, KC_7, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+KC_4, KC_5, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER, KC_PGDN,
+KC_2, KC_3, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+KC_0, KC_1, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, _______,KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT
+ )
+};
diff --git a/keyboards/wheatfield/split75/matrix.c b/keyboards/wheatfield/split75/matrix.c
new file mode 100644
index 00000000000..9e86bfc376a
--- /dev/null
+++ b/keyboards/wheatfield/split75/matrix.c
@@ -0,0 +1,155 @@
+/*
+Copyright 2017 Luiz Ribeiro
+
+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 .
+*/
+
+#include
+#include
+#include "quantum.h"
+#include "i2c_master.h"
+#include "split75.h"
+
+#define RIGHT_HALF
+
+
+void matrix_set_row_status(uint8_t row);
+
+
+#if defined(RIGHT_HALF)
+#define I2C_TIMEOUT 10
+#define MCP23018_TWI_ADDRESS 0b0100000
+#define TW_READ 1
+#define TW_WRITE 0
+#define TWI_ADDR_WRITE ( (MCP23018_TWI_ADDRESS<<1) | TW_WRITE )
+#define TWI_ADDR_READ ( (MCP23018_TWI_ADDRESS<<1) | TW_READ )
+#define IODIRA 0x00 // i/o direction register
+#define IODIRB 0x01
+#define IODIRA 0x00 // i/o direction register
+#define IODIRB 0x01
+#define GPPUA 0x0C // GPIO pull-up resistor register
+#define GPPUB 0x0D
+#define GPIOA 0x12 // general purpose i/o port register (write modifies OLAT)
+#define GPIOB 0x13
+#define OLATA 0x14 // output latch register
+#define OLATB 0x15
+#define MCP_ROWS_START 8
+
+static uint8_t mcp23018_init(void) {
+ uint8_t ret;
+ uint8_t data[3];
+ // set pin direction
+ // - unused : input : 1
+ // - input : input : 1
+ // - driving : output : 0
+ data[0] = IODIRA;
+ data[1] = 0b00000000; // IODIRA
+ data[2] = (0b11111111); // IODIRB
+
+ ret = i2c_transmit(TWI_ADDR_WRITE, (uint8_t *)data, 3, I2C_TIMEOUT);
+ if (ret) goto out; // make sure we got an ACK
+
+ // set pull-up
+ // - unused : on : 1
+ // - input : on : 1
+ // - driving : off : 0
+ data[0] = GPPUA;
+ data[1] = 0b00000000; // IODIRA
+ data[2] = (0b11111111); // IODIRB
+
+ ret = i2c_transmit(TWI_ADDR_WRITE, (uint8_t *)data, 3, I2C_TIMEOUT);
+ if (ret) goto out; // make sure we got an ACK
+
+ // set logical value (doesn't matter on inputs)
+ // - unused : hi-Z : 1
+ // - input : hi-Z : 1
+ // - driving : hi-Z : 1
+ data[0] = OLATA;
+ data[1] = 0b11111111; // IODIRA
+ data[2] = (0b11111111); // IODIRB
+
+ ret = i2c_transmit(TWI_ADDR_WRITE, (uint8_t *)data, 3, I2C_TIMEOUT);
+
+out:
+ return ret;
+}
+#endif
+
+void matrix_init_custom(void) {
+ // Set rows as output starting high
+ DDRB = 0xFF;
+ PORTB = 0xFF;
+
+ // Set columns as inputs with pull-up enabled
+ DDRA = 0x00;
+ PORTA = 0xFF;
+
+ // Initialize i2c communication
+ i2c_init();
+
+#if defined(RIGHT_HALF)
+ // Initialize the chip on the other half
+ mcp23018_init();
+#endif
+
+}
+
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
+ bool matrix_has_changed = false;
+
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ // Store last value of row prior to reading
+ matrix_row_t last_row_value = current_matrix[row];
+
+ matrix_row_t cols = 0;
+ // Select the row to scan
+ matrix_set_row_status(row);
+
+ matrix_io_delay();
+ //Set the local row
+
+#if defined(RIGHT_HALF)
+ // Initialize to 0x7F in case I2C read fails,
+ // as 0x75 would be no keys pressed
+ uint8_t data = 0x7F;
+ // Receive the columns from right half
+ i2c_receive(TWI_ADDR_WRITE, &data, 1, I2C_TIMEOUT);
+#endif
+
+ cols |= ((~(PINA | 0x80)) & 0x7F);
+#if defined(RIGHT_HALF)
+ cols |= (((~(data | 0x80)) & 0x7F) << 7);
+#endif
+
+ current_matrix[row] = cols;
+ matrix_has_changed |= (last_row_value != current_matrix[row]);
+ }
+
+ return matrix_has_changed;
+}
+
+void matrix_set_row_status(uint8_t row) {
+#if defined(RIGHT_HALF)
+ uint8_t txdata[3];
+
+ //Set the remote row on port A
+ txdata[0] = (GPIOA);
+ txdata[1] = ( 0xFF & ~(1<
.
+ */
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x6582 // wilba.tech
+#define PRODUCT_ID 0x60C0 // 60-C
+#define DEVICE_VER 0x0001
+#define MANUFACTURER wilba.tech
+#define PRODUCT wilba.tech WT60-C
+#define DESCRIPTION wilba.tech WT60-C
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 14
+
+/*
+ * 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 { F0, F1, F4, F6, F7 }
+#define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+
+/* 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
+
+
+// IS31FL3731 driver
+#define DRIVER_COUNT 2
+#define DRIVER_LED_TOTAL 72
+
+#define RGB_BACKLIGHT_ENABLED 1
+
+// This conditionally compiles the backlight code for WT60-BX specifics
+// Note: WT60-C is the same RGB matrix as WT60-BX
+#define RGB_BACKLIGHT_WT60_BX
+
+// enable/disable LEDs based on layout
+// they aren't really used if RGB_BACKLIGHT_WT60_BX defined
+#define RGB_BACKLIGHT_USE_SPLIT_BACKSPACE 0
+#define RGB_BACKLIGHT_USE_SPLIT_LEFT_SHIFT 0
+#define RGB_BACKLIGHT_USE_SPLIT_RIGHT_SHIFT 0
+#define RGB_BACKLIGHT_USE_7U_SPACEBAR 0
+#define RGB_BACKLIGHT_USE_ISO_ENTER 0
+#define RGB_BACKLIGHT_DISABLE_HHKB_BLOCKER_LEDS 0
+
+// disable backlight when USB suspended (PC sleep/hibernate/shutdown)
+#define RGB_BACKLIGHT_DISABLE_WHEN_USB_SUSPENDED 0
+
+// disable backlight after timeout in minutes, 0 = no timeout
+#define RGB_BACKLIGHT_DISABLE_AFTER_TIMEOUT 0
+
+// the default brightness
+#define RGB_BACKLIGHT_BRIGHTNESS 255
+
+// the default effect (RGB test)
+#define RGB_BACKLIGHT_EFFECT 255
+
+// the default effect speed (0-3)
+#define RGB_BACKLIGHT_EFFECT_SPEED 0
+
+// the default color1 and color2
+#define RGB_BACKLIGHT_COLOR_1 { .h = 0, .s = 255 }
+#define RGB_BACKLIGHT_COLOR_2 { .h = 127, .s = 255 }
+
+// These define which keys in the matrix are alphas/mods
+// Used for backlight effects so colors are different for
+// alphas vs. mods
+// Each value is for a row, bit 0 is column 0
+// Alpha=0 Mod=1
+#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_0 0b0000000000000001
+#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_1 0b0010000000000001
+#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_2 0b0011000000000001
+#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_3 0b0011000000000001
+#define RGB_BACKLIGHT_ALPHAS_MODS_ROW_4 0b0011100000000111
+
+#define RGB_BACKLIGHT_CAPS_LOCK_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
+#define RGB_BACKLIGHT_LAYER_1_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
+#define RGB_BACKLIGHT_LAYER_2_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
+#define RGB_BACKLIGHT_LAYER_3_INDICATOR { .color = { .h = 0, .s = 0 }, .index = 255 }
+
+// Backlight config starts after VIA's EEPROM usage,
+// dynamic keymaps start after this.
+#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 31
+
+// VIA lighting is handled by the keyboard-level code
+#define VIA_CUSTOM_LIGHTING_ENABLE
diff --git a/keyboards/wilba_tech/wt60_c/info.json b/keyboards/wilba_tech/wt60_c/info.json
new file mode 100644
index 00000000000..9567d517e82
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_c/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "wilba.tech WT60-C",
+ "url": "https://wilba.tech",
+ "maintainer": "Wilba",
+ "width": 15,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":1.75}, {"x":14, "y":3}, {"x":0, "y":4, "w":1.5}, {"x":1.5, "y":4}, {"x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":7}, {"x":11, "y":4, "w":1.5}, {"x":12.5, "y":4}, {"x":13.5, "y":4, "w":1.5}]
+ }
+ }
+}
\ No newline at end of file
diff --git a/keyboards/wilba_tech/wt60_c/keymaps/default/keymap.c b/keyboards/wilba_tech/wt60_c/keymaps/default/keymap.c
new file mode 100644
index 00000000000..cba25bb8faa
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_c/keymaps/default/keymap.c
@@ -0,0 +1,34 @@
+// Default layout for WT60-C
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[0] = LAYOUT_all(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, FN_MO13,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, FN_MO23, KC_RCTL),
+
+[1] = LAYOUT_all(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL,
+ KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+[2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+[3] = LAYOUT_all(
+ KC_TRNS, EF_DEC, EF_INC, H1_DEC, H1_INC, H2_DEC, H2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC, BR_INC, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC, S1_INC, S2_DEC, S2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, ES_DEC, ES_INC, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+};
diff --git a/keyboards/wilba_tech/wt60_c/keymaps/via/keymap.c b/keyboards/wilba_tech/wt60_c/keymaps/via/keymap.c
new file mode 100644
index 00000000000..cba25bb8faa
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_c/keymaps/via/keymap.c
@@ -0,0 +1,34 @@
+// Default layout for WT60-C
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+[0] = LAYOUT_all(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, FN_MO13,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, FN_MO23, KC_RCTL),
+
+[1] = LAYOUT_all(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_DEL,
+ KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_EJCT, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+[2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+[3] = LAYOUT_all(
+ KC_TRNS, EF_DEC, EF_INC, H1_DEC, H1_INC, H2_DEC, H2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, BR_DEC, BR_INC, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, S1_DEC, S1_INC, S2_DEC, S2_INC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, ES_DEC, ES_INC, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+};
diff --git a/keyboards/wilba_tech/wt60_c/keymaps/via/rules.mk b/keyboards/wilba_tech/wt60_c/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_c/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/wt60_c/readme.md b/keyboards/wilba_tech/wt60_c/readme.md
new file mode 100644
index 00000000000..ea72c1cd0e4
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_c/readme.md
@@ -0,0 +1,13 @@
+# wilba.tech WT60-C
+
+WT60-C is a keyboard PCB supporting 60% layout. [More info at wilba.tech](https://wilba.tech/)
+
+* Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582)
+* Hardware Supported: wilba.tech WT60-C
+* Hardware Availability: Custom keyboard group buys
+
+Make example for this keyboard (after setting up your build environment):
+
+ make wilba_tech/wt60_c:default
+
+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).
\ No newline at end of file
diff --git a/keyboards/wilba_tech/wt60_c/rules.mk b/keyboards/wilba_tech/wt60_c/rules.mk
new file mode 100644
index 00000000000..50faab968ca
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_c/rules.mk
@@ -0,0 +1,46 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Do not put the microcontroller into power saving mode
+# when we get USB suspend event. We want it to keep updating
+# backlight effects.
+OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
+
+# Build Options
+# change to "no" to disable the options, or define them in the Makefile in
+# the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = yes # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+MIDI_ENABLE = no # MIDI controls
+AUDIO_ENABLE = no # Audio output on port C6
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
+
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+
+CIE1931_CURVE = yes
+
+# project specific files
+SRC = keyboards/wilba_tech/wt_main.c \
+ keyboards/wilba_tech/wt_rgb_backlight.c \
+ quantum/color.c \
+ drivers/issi/is31fl3731.c \
+ drivers/avr/i2c_master.c
diff --git a/keyboards/wilba_tech/wt60_c/wt60_c.c b/keyboards/wilba_tech/wt60_c/wt60_c.c
new file mode 100644
index 00000000000..9b1cfe46e54
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_c/wt60_c.c
@@ -0,0 +1 @@
+#include "wt60_c.h"
diff --git a/keyboards/wilba_tech/wt60_c/wt60_c.h b/keyboards/wilba_tech/wt60_c/wt60_c.h
new file mode 100644
index 00000000000..2b5fe7fe11d
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_c/wt60_c.h
@@ -0,0 +1,37 @@
+/* Copyright 2020 Jason Williams (Wilba)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "quantum.h"
+#include "keyboards/wilba_tech/wt_rgb_backlight_keycodes.h"
+#include "via.h"
+
+#define ____ KC_NO
+
+#define LAYOUT_all( \
+ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K213, \
+ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, \
+ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \
+ K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, \
+ K400, K401, K402, K407, K411, K412, K413 \
+) { \
+ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013 }, \
+ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113 }, \
+ { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213 }, \
+ { K300, ____, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313 }, \
+ { K400, K401, K402, ____, ____, ____, ____, K407, ____, ____, ____, K411, K412, K413 } \
+}
diff --git a/keyboards/wilba_tech/wt60_d/wt60_d.c b/keyboards/wilba_tech/wt60_d/wt60_d.c
index 52a7733683f..534511565b5 100644
--- a/keyboards/wilba_tech/wt60_d/wt60_d.c
+++ b/keyboards/wilba_tech/wt60_d/wt60_d.c
@@ -1 +1,14 @@
#include "wt60_d.h"
+
+void keyboard_pre_init_kb(void) {
+ setPinOutput(F1);
+
+ keyboard_pre_init_user();
+}
+
+bool led_update_kb(led_t led_state) {
+ if (led_update_user(led_state)) {
+ writePin(F1, led_state.caps_lock);
+ }
+ return true;
+}
diff --git a/keyboards/wilba_tech/wt69_a/wt69_a.c b/keyboards/wilba_tech/wt69_a/wt69_a.c
index ccff6d62c94..4397a97d1a8 100644
--- a/keyboards/wilba_tech/wt69_a/wt69_a.c
+++ b/keyboards/wilba_tech/wt69_a/wt69_a.c
@@ -14,4 +14,17 @@
* along with this program. If not, see .
*/
-// Nothing to see here, move along... ;-)
+#include "wt69_a.h"
+
+void keyboard_pre_init_kb(void) {
+ setPinOutput(F1);
+
+ keyboard_pre_init_user();
+}
+
+bool led_update_kb(led_t led_state) {
+ if (led_update_user(led_state)) {
+ writePin(F1, led_state.caps_lock);
+ }
+ return true;
+}
diff --git a/keyboards/wilba_tech/wt80_bc/config.h b/keyboards/wilba_tech/wt80_bc/config.h
new file mode 100644
index 00000000000..d0d5762f527
--- /dev/null
+++ b/keyboards/wilba_tech/wt80_bc/config.h
@@ -0,0 +1,56 @@
+/* Copyright 2020 Jason Williams (Wilba)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x6582 // wilba.tech
+#define PRODUCT_ID 0x80B0 // 80-BC
+#define DEVICE_VER 0x0001
+#define MANUFACTURER wilba.tech
+#define PRODUCT wilba.tech WT80-BC
+#define DESCRIPTION wilba.tech WT80-BC
+
+/* key matrix size */
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 17
+
+/*
+ * 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 { F1, F0, E6, F4, F6, F7 }
+#define MATRIX_COL_PINS { F5, D5, B1, B2, B3, D3, D2, C7, C6, B6, B5, B4, D7, D6, D4, B7, B0 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+/* 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
diff --git a/keyboards/wilba_tech/wt80_bc/info.json b/keyboards/wilba_tech/wt80_bc/info.json
new file mode 100644
index 00000000000..34bee2dc146
--- /dev/null
+++ b/keyboards/wilba_tech/wt80_bc/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "wilba.tech WT80-BC",
+ "url": "https://wilba.tech",
+ "maintainer": "Wilba",
+ "width": 18.25,
+ "height": 6.25,
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [{"x":0, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6.5, "y":0}, {"x":7.5, "y":0}, {"x":8.5, "y":0}, {"x":9.5, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":17.25, "y":0}, {"x":0, "y":1.25}, {"x":1, "y":1.25}, {"x":2, "y":1.25}, {"x":3, "y":1.25}, {"x":4, "y":1.25}, {"x":5, "y":1.25}, {"x":6, "y":1.25}, {"x":7, "y":1.25}, {"x":8, "y":1.25}, {"x":9, "y":1.25}, {"x":10, "y":1.25}, {"x":11, "y":1.25}, {"x":12, "y":1.25}, {"x":13, "y":1.25, "w":2}, {"x":15.25, "y":1.25}, {"x":16.25, "y":1.25}, {"x":17.25, "y":1.25}, {"x":0, "y":2.25, "w":1.5}, {"x":1.5, "y":2.25}, {"x":2.5, "y":2.25}, {"x":3.5, "y":2.25}, {"x":4.5, "y":2.25}, {"x":5.5, "y":2.25}, {"x":6.5, "y":2.25}, {"x":7.5, "y":2.25}, {"x":8.5, "y":2.25}, {"x":9.5, "y":2.25}, {"x":10.5, "y":2.25}, {"x":11.5, "y":2.25}, {"x":12.5, "y":2.25}, {"x":13.5, "y":2.25, "w":1.5}, {"x":15.25, "y":2.25}, {"x":16.25, "y":2.25}, {"x":17.25, "y":2.25}, {"x":0, "y":3.25, "w":1.75}, {"x":1.75, "y":3.25}, {"x":2.75, "y":3.25}, {"x":3.75, "y":3.25}, {"x":4.75, "y":3.25}, {"x":5.75, "y":3.25}, {"x":6.75, "y":3.25}, {"x":7.75, "y":3.25}, {"x":8.75, "y":3.25}, {"x":9.75, "y":3.25}, {"x":10.75, "y":3.25}, {"x":11.75, "y":3.25}, {"x":12.75, "y":3.25, "w":2.25}, {"x":0, "y":4.25, "w":2.25}, {"x":2.25, "y":4.25}, {"x":3.25, "y":4.25}, {"x":4.25, "y":4.25}, {"x":5.25, "y":4.25}, {"x":6.25, "y":4.25}, {"x":7.25, "y":4.25}, {"x":8.25, "y":4.25}, {"x":9.25, "y":4.25}, {"x":10.25, "y":4.25}, {"x":11.25, "y":4.25}, {"x":12.25, "y":4.25, "w":2.75}, {"x":16.25, "y":4.25}, {"x":0, "y":5.25, "w":1.5}, {"x":1.5, "y":5.25}, {"x":2.5, "y":5.25, "w":1.5}, {"x":4, "y":5.25, "w":7}, {"x":11, "y":5.25, "w":1.5}, {"x":12.5, "y":5.25}, {"x":13.5, "y":5.25, "w":1.5}, {"x":15.25, "y":5.25}, {"x":16.25, "y":5.25}, {"x":17.25, "y":5.25}]
+ }
+ }
+}
diff --git a/keyboards/wilba_tech/wt80_bc/keymaps/default/keymap.c b/keyboards/wilba_tech/wt80_bc/keymaps/default/keymap.c
new file mode 100644
index 00000000000..3e6b4546dba
--- /dev/null
+++ b/keyboards/wilba_tech/wt80_bc/keymaps/default/keymap.c
@@ -0,0 +1,37 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [1] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+};
diff --git a/keyboards/wilba_tech/wt80_bc/keymaps/via/keymap.c b/keyboards/wilba_tech/wt80_bc/keymaps/via/keymap.c
new file mode 100644
index 00000000000..3e6b4546dba
--- /dev/null
+++ b/keyboards/wilba_tech/wt80_bc/keymaps/via/keymap.c
@@ -0,0 +1,37 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [1] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+};
diff --git a/keyboards/wilba_tech/wt80_bc/keymaps/via/rules.mk b/keyboards/wilba_tech/wt80_bc/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/wilba_tech/wt80_bc/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/wt80_bc/readme.md b/keyboards/wilba_tech/wt80_bc/readme.md
new file mode 100644
index 00000000000..aa995a754f4
--- /dev/null
+++ b/keyboards/wilba_tech/wt80_bc/readme.md
@@ -0,0 +1,13 @@
+# wilba.tech WT80-BC
+
+WT80-BC is a keyboard PCB supporting TKL layout with 0.25U gaps. [More info at wilba.tech](https://wilba.tech/)
+
+Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582)
+Hardware Supported: wilba.tech WT80-BC
+Hardware Availability: Custom keyboard group buys
+
+Make example for this keyboard (after setting up your build environment):
+
+ make wilba_tech/wt80_bc:default
+
+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).
\ No newline at end of file
diff --git a/keyboards/wilba_tech/wt80_bc/rules.mk b/keyboards/wilba_tech/wt80_bc/rules.mk
new file mode 100644
index 00000000000..4aa749422c4
--- /dev/null
+++ b/keyboards/wilba_tech/wt80_bc/rules.mk
@@ -0,0 +1,34 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE = no # MIDI support
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+
+# project specific files
+SRC = keyboards/wilba_tech/wt_main.c
diff --git a/keyboards/wilba_tech/wt80_bc/wt80_bc.c b/keyboards/wilba_tech/wt80_bc/wt80_bc.c
new file mode 100644
index 00000000000..1245a2fd0a7
--- /dev/null
+++ b/keyboards/wilba_tech/wt80_bc/wt80_bc.c
@@ -0,0 +1,17 @@
+/* Copyright 2020 Jason Williams (Wilba)
+ *
+ * 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 .
+ */
+
+// Nothing to see here, move along... ;-)
diff --git a/keyboards/wilba_tech/wt80_bc/wt80_bc.h b/keyboards/wilba_tech/wt80_bc/wt80_bc.h
new file mode 100644
index 00000000000..0b0d38b4861
--- /dev/null
+++ b/keyboards/wilba_tech/wt80_bc/wt80_bc.h
@@ -0,0 +1,38 @@
+/* Copyright 2020 Jason Williams (Wilba)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+#define ____ KC_NO
+
+
+#define LAYOUT_all( \
+ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K014, K015, K016, \
+ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, \
+ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, \
+ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, \
+ K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K415, \
+ K500, K501, K502, K507, K511, K512, K513, K514, K515, K516 \
+) { \
+ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, ____, K014, K015, K016 }, \
+ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116 }, \
+ { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216 }, \
+ { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, ____, ____, ____, ____ }, \
+ { K400, ____, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, ____, ____, K415, ____ }, \
+ { K500, K501, K502, ____, ____, ____, ____, K507, ____, ____, ____, K511, K512, K513, K514, K515, K516 } \
+}
diff --git a/keyboards/wilba_tech/wt_rgb_backlight.c b/keyboards/wilba_tech/wt_rgb_backlight.c
index 9db4478efbd..1a8bd8981a5 100644
--- a/keyboards/wilba_tech/wt_rgb_backlight.c
+++ b/keyboards/wilba_tech/wt_rgb_backlight.c
@@ -49,7 +49,7 @@
#else
#include "ch.h"
#include "hal.h"
-#include "drivers/arm/i2c_master.h"
+#include "drivers/chibios/i2c_master.h"
#endif
#if defined(RGB_BACKLIGHT_DAWN60)
diff --git a/keyboards/winkeyless/bface/config.h b/keyboards/winkeyless/bface/config.h
index 68ecaafc1ef..27ee761e9b7 100644
--- a/keyboards/winkeyless/bface/config.h
+++ b/keyboards/winkeyless/bface/config.h
@@ -19,12 +19,10 @@ along with this program. If not, see .
#pragma once
#define VENDOR_ID 0x20A0
-#define PRODUCT_ID 0x422D
+#define PRODUCT_ID 0x4246 // BF
#define DEVICE_VER 0x0200
-// You can edit those at usbconfig.h about line 250. These values will
-// unforunatly be ignored so far
-#define MANUFACTURER winkeyless.kr
-#define PRODUCT b.face
+#define MANUFACTURER Winkeyless
+#define PRODUCT B.face
/* matrix size */
#define MATRIX_ROWS 8
diff --git a/keyboards/winkeyless/bface/keymaps/via/config.h b/keyboards/winkeyless/bface/keymaps/via/config.h
new file mode 100644
index 00000000000..0865e452088
--- /dev/null
+++ b/keyboards/winkeyless/bface/keymaps/via/config.h
@@ -0,0 +1 @@
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
diff --git a/keyboards/winkeyless/bface/keymaps/via/keymap.c b/keyboards/winkeyless/bface/keymaps/via/keymap.c
new file mode 100644
index 00000000000..1d472e05567
--- /dev/null
+++ b/keyboards/winkeyless/bface/keymaps/via/keymap.c
@@ -0,0 +1,43 @@
+/*
+Copyright 2020 MechMerlin
+
+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 .
+*/
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_60_ansi(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSLS,
+ KC_F1, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_ENT,
+ KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL,KC_LALT,KC_LGUI, KC_SPC, KC_RALT,KC_RGUI,MO(1), KC_RCTL
+ ),
+ [1] = LAYOUT_60_ansi(
+ KC_TRNS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,BL_INC, BL_DEC, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+ KC_TRNS,KC_TRNS,RGB_MOD,KC_TRNS,BL_ON, BL_OFF, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS
+ ),
+
+ [2] = LAYOUT_60_ansi(
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS
+ ),
+};
diff --git a/keyboards/winkeyless/bface/keymaps/via/rules.mk b/keyboards/winkeyless/bface/keymaps/via/rules.mk
new file mode 100644
index 00000000000..97010a994b6
--- /dev/null
+++ b/keyboards/winkeyless/bface/keymaps/via/rules.mk
@@ -0,0 +1,5 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+
+MOUSEKEY_ENABLE = no
+EXTRAKEY_ENABLE = no
diff --git a/keyboards/winkeyless/bface/usbconfig.h b/keyboards/winkeyless/bface/usbconfig.h
deleted file mode 100644
index 5ff26399b09..00000000000
--- a/keyboards/winkeyless/bface/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'b', '.', 'f', 'a', 'c', 'e'
-#define USB_CFG_DEVICE_NAME_LEN 6
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/winkeyless/bmini/bmini.h b/keyboards/winkeyless/bmini/bmini.h
index 7bdf66fd250..82b9ec01c9e 100644
--- a/keyboards/winkeyless/bmini/bmini.h
+++ b/keyboards/winkeyless/bmini/bmini.h
@@ -14,9 +14,7 @@ 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 .
*/
-
-#ifndef BMINI_H
-#define BMINI_H
+#pragma once
#include "quantum.h"
@@ -56,23 +54,3 @@ along with this program. If not, see .
{ K07, K17, K27, K37, K47, K57, K67, K77, KC_NO, KC_NO, KA7, KB7, KC7, KD7, KE7 } \
}
-#define LAYOUT_kc( \
- K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, \
- K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, \
- K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, KD3, K67, \
- K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KD2, KE0, \
- K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, \
- K00, K10, K20, K56, K57, KB0, KC0, K66, K76, K96 \
-) \
-{ \
- { KC_##K00, KC_##K10, KC_##K20, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KB0, KC_##KC0, KC_##KD0, KC_##KE0 }, \
- { KC_##K01, KC_##K11, KC_##K21, KC_##K31, KC_##K41, KC_##K51, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KA1, KC_##KB1, KC_NO, KC_##KD1, KC_##KE1 }, \
- { KC_##K02, KC_##K12, KC_##K22, KC_##K32, KC_##K42, KC_##K52, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KA2, KC_##KB2, KC_NO, KC_##KD2, KC_##KE2 }, \
- { KC_##K03, KC_##K13, KC_##K23, KC_##K33, KC_##K43, KC_##K53, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KA3, KC_##KB3, KC_##KC3, KC_##KD3, KC_NO }, \
- { KC_##K04, KC_##K14, KC_##K24, KC_##K34, KC_##K44, KC_##K54, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KA4, KC_##KB4, KC_##KC4, KC_NO, KC_##KE4 }, \
- { KC_##K05, KC_NO, KC_##K25, KC_##K35, KC_##K45, KC_##K55, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_##KB5, KC_##KC5, KC_##KD5, KC_##KE5 }, \
- { KC_##K06, KC_##K16, KC_##K26, KC_##K36, KC_##K46, KC_##K56, KC_##K66, KC_##K76, KC_##K86, KC_##K96, KC_##KA6, KC_##KB6, KC_##KC6, KC_##KD6, KC_##KE6 }, \
- { KC_##K07, KC_##K17, KC_##K27, KC_##K37, KC_##K47, KC_##K57, KC_##K67, KC_##K77, KC_NO, KC_NO, KC_##KA7, KC_##KB7, KC_##KC7, KC_##KD7, KC_##KE7 } \
-}
-
-#endif
diff --git a/keyboards/winkeyless/bmini/config.h b/keyboards/winkeyless/bmini/config.h
index 6d46cdecbe2..6e91241af8e 100644
--- a/keyboards/winkeyless/bmini/config.h
+++ b/keyboards/winkeyless/bmini/config.h
@@ -20,9 +20,9 @@ along with this program. If not, see .
#include "config_common.h"
#define VENDOR_ID 0x20A0
-#define PRODUCT_ID 0x422D
+#define PRODUCT_ID 0x424D // BM
#define DEVICE_VER 0x0200
-#define MANUFACTURER winkeyless.kr
+#define MANUFACTURER Winkeyless
#define PRODUCT B.mini
#define RGBLED_NUM 16
diff --git a/keyboards/winkeyless/bmini/keymaps/via/config.h b/keyboards/winkeyless/bmini/keymaps/via/config.h
new file mode 100644
index 00000000000..0865e452088
--- /dev/null
+++ b/keyboards/winkeyless/bmini/keymaps/via/config.h
@@ -0,0 +1 @@
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
diff --git a/keyboards/winkeyless/bmini/keymaps/via/keymap.c b/keyboards/winkeyless/bmini/keymaps/via/keymap.c
new file mode 100644
index 00000000000..75ba043e5d4
--- /dev/null
+++ b/keyboards/winkeyless/bmini/keymaps/via/keymap.c
@@ -0,0 +1,46 @@
+/*
+Copyright 2020 MechMerlin
+
+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 .
+*/
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_HOME,KC_END,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_DEL,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_BSLS, KC_INS,
+ MO(0), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_ENT, KC_PGUP,
+ KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT, KC_UP, KC_PGDN,
+ KC_LCTL,KC_LALT,KC_LGUI, KC_SPC, KC_RGUI,KC_RALT,KC_RCTL,KC_LEFT,KC_DOWN,KC_RGHT
+ ),
+ [1] = LAYOUT(
+ KC_TRNS,RGB_TOG,RGB_MOD,RGB_HUI,RGB_SAI,RGB_VAI,RGB_HUD,RGB_SAD,RGB_VAD,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_END,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_DEL,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_INS,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_RGHT
+ ),
+
+ [2] = LAYOUT(
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_END,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_DEL,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_INS,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS,
+ KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_RGHT
+ ),
+};
diff --git a/keyboards/winkeyless/bmini/keymaps/via/rules.mk b/keyboards/winkeyless/bmini/keymaps/via/rules.mk
new file mode 100644
index 00000000000..97010a994b6
--- /dev/null
+++ b/keyboards/winkeyless/bmini/keymaps/via/rules.mk
@@ -0,0 +1,5 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+
+MOUSEKEY_ENABLE = no
+EXTRAKEY_ENABLE = no
diff --git a/keyboards/winkeyless/bmini/rules.mk b/keyboards/winkeyless/bmini/rules.mk
index a8fea7efa7f..fd340f04ebc 100644
--- a/keyboards/winkeyless/bmini/rules.mk
+++ b/keyboards/winkeyless/bmini/rules.mk
@@ -15,7 +15,7 @@ BOOTLOADER = bootloadHID
BOOTMAGIC_ENABLE = full
MOUSEKEY_ENABLE = no
EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = yes
+CONSOLE_ENABLE = no
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
diff --git a/keyboards/winkeyless/bmini/usbconfig.h b/keyboards/winkeyless/bmini/usbconfig.h
deleted file mode 100644
index 85a915bb463..00000000000
--- a/keyboards/winkeyless/bmini/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/winkeyless/bminiex/bminiex.h b/keyboards/winkeyless/bminiex/bminiex.h
index 8d897f639fe..b9532f2f0e6 100644
--- a/keyboards/winkeyless/bminiex/bminiex.h
+++ b/keyboards/winkeyless/bminiex/bminiex.h
@@ -72,23 +72,3 @@ along with this program. If not, see .
{ K06, K16, K26, K36, K46, K56, K66, K76, K86, K96, KA6, KB6, KC6, KD6, KE6 }, \
{ K07, K17, K27, K37, K47, K57, K67, K77, KC_NO, KC_NO, KA7, KB7, KC7, KD7, KE7 } \
}
-
-#define LAYOUT_kc( \
- K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, K65, K75, K85, K95, \
- K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, K64, K74, K84, K94, \
- K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, KD3, K67, K63, K73, K83, \
- K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KC2, KD2, KE0, K62, K72, K82, K92, \
- K01, K30, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, K61, K71, K81, \
- K00, K10, K20, K56, K57, KB0, KC0, K66, K76, K96, K60, K80, K90 \
-) \
-{ \
- { KC_##K00, KC_##K10, KC_##K20, KC_##K30, KC_NO, KC_NO, KC_##K60, KC_NO, KC_##K80, KC_##K90, KC_NO, KC_##KB0, KC_##KC0, KC_##KD0, KC_##KE0 }, \
- { KC_##K01, KC_##K11, KC_##K21, KC_##K31, KC_##K41, KC_##K51, KC_##K61, KC_##K71, KC_##K81, KC_NO, KC_##KA1, KC_##KB1, KC_NO, KC_##KD1, KC_##KE1 }, \
- { KC_##K02, KC_##K12, KC_##K22, KC_##K32, KC_##K42, KC_##K52, KC_##K62, KC_##K72, KC_##K82, KC_##K92, KC_##KA2, KC_##KB2, KC_##KC2, KC_##KD2, KC_##KE2 }, \
- { KC_##K03, KC_##K13, KC_##K23, KC_##K33, KC_##K43, KC_##K53, KC_##K63, KC_##K73, KC_##K83, KC_NO, KC_##KA3, KC_##KB3, KC_##KC3, KC_##KD3, KC_NO }, \
- { KC_##K04, KC_##K14, KC_##K24, KC_##K34, KC_##K44, KC_##K54, KC_##K64, KC_##K74, KC_##K84, KC_##K94, KC_##KA4, KC_##KB4, KC_##KC4, KC_NO, KC_##KE4 }, \
- { KC_##K05, KC_NO, KC_##K25, KC_##K35, KC_##K45, KC_##K55, KC_##K65, KC_##K75, KC_##K85, KC_##K95, KC_NO, KC_##KB5, KC_##KC5, KC_##KD5, KC_##KE5 }, \
- { KC_##K06, KC_##K16, KC_##K26, KC_##K36, KC_##K46, KC_##K56, KC_##K66, KC_##K76, KC_##K86, KC_##K96, KC_##KA6, KC_##KB6, KC_##KC6, KC_##KD6, KC_##KE6 }, \
- { KC_##K07, KC_##K17, KC_##K27, KC_##K37, KC_##K47, KC_##K57, KC_##K67, KC_##K77, KC_NO, KC_NO, KC_##KA7, KC_##KB7, KC_##KC7, KC_##KD7, KC_##KE7 } \
-}
-
diff --git a/keyboards/winkeyless/bminiex/config.h b/keyboards/winkeyless/bminiex/config.h
index 2da785214bc..7c9c11c1116 100644
--- a/keyboards/winkeyless/bminiex/config.h
+++ b/keyboards/winkeyless/bminiex/config.h
@@ -20,10 +20,10 @@ along with this program. If not, see .
#include "config_common.h"
#define VENDOR_ID 0x20A0
-#define PRODUCT_ID 0x422E
+#define PRODUCT_ID 0x4258 // BX
#define DEVICE_VER 0x0200
-#define MANUFACTURER winkeyless.kr
-#define PRODUCT B.mini Ex
+#define MANUFACTURER Winkeyless
+#define PRODUCT B.mini EX
#define RGBLED_NUM 20
diff --git a/keyboards/winkeyless/bminiex/keymaps/via/config.h b/keyboards/winkeyless/bminiex/keymaps/via/config.h
new file mode 100644
index 00000000000..0865e452088
--- /dev/null
+++ b/keyboards/winkeyless/bminiex/keymaps/via/config.h
@@ -0,0 +1 @@
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
diff --git a/keyboards/winkeyless/bminiex/keymaps/via/keymap.c b/keyboards/winkeyless/bminiex/keymaps/via/keymap.c
new file mode 100644
index 00000000000..d612843f816
--- /dev/null
+++ b/keyboards/winkeyless/bminiex/keymaps/via/keymap.c
@@ -0,0 +1,47 @@
+/*
+Copyright 2020 MechMerlin
+
+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 .
+*/
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR,KC_HOME,KC_END, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,KC_EQL, KC_BSPC, KC_DEL, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,KC_RBRC,KC_NO, KC_INS, KC_P7, KC_P8, KC_P9,
+ KC_LCAP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,KC_NUHS,KC_ENT, KC_PGUP, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_LSFT,KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_RSFT, KC_UP, KC_PGDN, KC_P1, KC_P2, KC_P3,
+ KC_LCTL,KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_APP ,KC_RCTL,KC_LEFT,KC_DOWN,KC_RGHT, KC_P0, KC_PDOT, KC_PENT
+ ),
+
+ [1] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_RBRC,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS ,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [2] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_RBRC,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS ,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+};
diff --git a/keyboards/winkeyless/bminiex/keymaps/via/rules.mk b/keyboards/winkeyless/bminiex/keymaps/via/rules.mk
new file mode 100644
index 00000000000..97010a994b6
--- /dev/null
+++ b/keyboards/winkeyless/bminiex/keymaps/via/rules.mk
@@ -0,0 +1,5 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+
+MOUSEKEY_ENABLE = no
+EXTRAKEY_ENABLE = no
diff --git a/keyboards/winkeyless/bminiex/usbconfig.h b/keyboards/winkeyless/bminiex/usbconfig.h
deleted file mode 100644
index 85a915bb463..00000000000
--- a/keyboards/winkeyless/bminiex/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/winkeyless/readme.md b/keyboards/winkeyless/readme.md
index 91719f6da0e..a4eb6d6bd5d 100644
--- a/keyboards/winkeyless/readme.md
+++ b/keyboards/winkeyless/readme.md
@@ -10,4 +10,4 @@ Most Winkeyless boards were low profile and constructed out of acrylic showcasin
In late 2018, Winkeyless closed its doors. The numerous unlicensed implementations of its hardware and software were cited as one
of many reasons for shutting down.
-This directory contains official Winkeyless boards that have had QMK firmware ported to work with them.
+This directory contains official Winkeyless boards that have had QMK firmware and VIA support added.
diff --git a/keyboards/wsk/gothic50/rules.mk b/keyboards/wsk/gothic50/rules.mk
index 6a1221aa1a1..ea21d62b3f2 100644
--- a/keyboards/wsk/gothic50/rules.mk
+++ b/keyboards/wsk/gothic50/rules.mk
@@ -7,7 +7,8 @@ MCU = atmega32u4
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
-# atmega32a bootloadHID
+# ATmega32A bootloadHID
+# ATmega328P USBasp
BOOTLOADER = atmel-dfu
# Build Options
diff --git a/keyboards/wsk/gothic70/rules.mk b/keyboards/wsk/gothic70/rules.mk
index 6a1221aa1a1..ea21d62b3f2 100644
--- a/keyboards/wsk/gothic70/rules.mk
+++ b/keyboards/wsk/gothic70/rules.mk
@@ -7,7 +7,8 @@ MCU = atmega32u4
# Atmel DFU atmel-dfu
# LUFA DFU lufa-dfu
# QMK DFU qmk-dfu
-# atmega32a bootloadHID
+# ATmega32A bootloadHID
+# ATmega328P USBasp
BOOTLOADER = atmel-dfu
# Build Options
diff --git a/keyboards/wsk/houndstooth/houndstooth.h b/keyboards/wsk/houndstooth/houndstooth.h
index ae9d73476f2..41a680ec9ba 100644
--- a/keyboards/wsk/houndstooth/houndstooth.h
+++ b/keyboards/wsk/houndstooth/houndstooth.h
@@ -3,18 +3,18 @@
#include "quantum.h"
#define LAYOUT( \
- K00, K01, K02, K03, K04, K05, K20, K21, K22, K23, K24, K25, \
- K40, K41, K42, K43, K44, K45, K60, K61, K62, K63, K64, K65, \
- K10, K11, K12, K13, K14, K15, K30, K31, K32, K33, K34, K35, \
- K50, K51, K52, K53, K54, K55, K70, K71, K72, K73, K74, K75 \
+ K00, K01, K02, K03, K04, K05, K40, K41, K42, K43, K44, K45,\
+ K10, K11, K12, K13, K14, K15, K50, K51, K52, K53, K54, K55,\
+ K20, K21, K22, K23, K24, K25, K60, K61, K62, K63, K64, K65,\
+ K30, K31, K32, K33, K34, K35, K70, K71, K72, K73, K74, K75 \
) { \
- { K00, K01, K02, K03, K04, K05 }, \
- { K10, K11, K12, K13, K14, K15 }, \
- { K20, K21, K22, K23, K24, K25 }, \
- { K30, K31, K32, K33, K34, K35 }, \
- { K40, K41, K42, K43, K44, K45 }, \
- { K50, K51, K52, K53, K54, K55 }, \
- { K60, K61, K62, K63, K64, K65 }, \
- { K70, K71, K72, K73, K74, K75 } \
+ { K00, K01, K02, K03, K04, K05 }, \
+ { K10, K11, K12, K13, K14, K15 }, \
+ { K20, K21, K22, K23, K24, K25 }, \
+ { K30, K31, K32, K33, K34, K35 }, \
+ { K40, K41, K42, K43, K44, K45 }, \
+ { K50, K51, K52, K53, K54, K55 }, \
+ { K60, K61, K62, K63, K64, K65 }, \
+ { K70, K71, K72, K73, K74, K75 } \
}
diff --git a/keyboards/xd002/config.h b/keyboards/xd002/config.h
new file mode 100644
index 00000000000..c17d816cfce
--- /dev/null
+++ b/keyboards/xd002/config.h
@@ -0,0 +1,60 @@
+/* Copyright 2020 zvecr
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x7844 // "XD"
+#define PRODUCT_ID 0x0202
+#define DEVICE_VER 0x0001
+#define MANUFACTURER XIUDI
+#define PRODUCT XD002
+
+/* matrix size */
+#define MATRIX_ROWS 1
+#define MATRIX_COLS 2
+
+/*
+ * Keyboard Matrix Assignments
+ *
+ * On this board we have direct connection: no diodes.
+ */
+#define DIRECT_PINS {{ B0, B1 }}
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCE 5
+
+#define RGBLED_NUM 2
+#define RGB_DI_PIN B2
+
+// Save as much space as we can...
+#define LAYER_STATE_8BIT
+#define NO_ACTION_LAYER
+#define NO_ACTION_TAPPING
+#define NO_ACTION_ONESHOT
+#define NO_RESET
+
+// usbconfig.h overrides
+#define USB_CFG_IOPORTNAME B
+#define USB_CFG_DMINUS_BIT 3
+#define USB_CFG_DPLUS_BIT 4
+#define USB_COUNT_SOF 0
+#define USB_INTR_CFG PCMSK
+#define USB_INTR_CFG_SET (1<event.pressed) {
+ switch (keycode) {
+ case QMKURL:
+ // Using SEND_STRING here adds 400bytes ...
+ // SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER));
+ tap_code(KC_H);
+ tap_code(KC_T);
+ tap_code(KC_T);
+ tap_code(KC_P);
+ tap_code(KC_S);
+ tap_code16(KC_COLON);
+ tap_code(KC_SLASH);
+ tap_code(KC_SLASH);
+ tap_code(KC_Q);
+ tap_code(KC_M);
+ tap_code(KC_K);
+ tap_code(KC_DOT);
+ tap_code(KC_F);
+ tap_code(KC_M);
+ tap_code(KC_SLASH);
+ tap_code(KC_ENTER);
+ break;
+ }
+ }
+ return true;
+}
+
+void keyboard_post_init_user(void) {
+ rgblight_enable_noeeprom(); // enables Rgb, without saving settings
+ rgblight_sethsv_noeeprom(180, 255, 255); // sets the color to teal/cyan without saving
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT); // sets mode to Fast breathing without saving
+}
diff --git a/keyboards/xd002/keymaps/rgb/rules.mk b/keyboards/xd002/keymaps/rgb/rules.mk
new file mode 100644
index 00000000000..1e3cebb1451
--- /dev/null
+++ b/keyboards/xd002/keymaps/rgb/rules.mk
@@ -0,0 +1 @@
+RGBLIGHT_ENABLE = yes
diff --git a/keyboards/xd002/keymaps/rgb_lite/keymap.c b/keyboards/xd002/keymaps/rgb_lite/keymap.c
new file mode 100644
index 00000000000..ed9185e3b52
--- /dev/null
+++ b/keyboards/xd002/keymaps/rgb_lite/keymap.c
@@ -0,0 +1,31 @@
+#include QMK_KEYBOARD_H
+#include "rgblite.h"
+
+// Defines the keycodes used by our macros in process_record_user
+enum custom_keycodes {
+ QMKURL = SAFE_RANGE,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ RGB_HUI, QMKURL
+ )
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ switch (keycode) {
+ case RGB_HUI:
+ rgblight_increase_hue();
+ break;
+ case QMKURL:
+ SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER));
+ break;
+ }
+ }
+ return true;
+}
+
+void keyboard_post_init_user(void) {
+ rgblight_increase_hue();
+}
diff --git a/keyboards/xd002/keymaps/rgb_lite/rgblite.h b/keyboards/xd002/keymaps/rgb_lite/rgblite.h
new file mode 100644
index 00000000000..ca98484b818
--- /dev/null
+++ b/keyboards/xd002/keymaps/rgb_lite/rgblite.h
@@ -0,0 +1,26 @@
+#pragma once
+
+#include "ws2812.h"
+#include "rgblight_list.h"
+
+static inline void rgblight_setrgb(uint8_t _r, uint8_t _g, uint8_t _b) {
+ LED_TYPE leds[RGBLED_NUM] = {{.r = _r, .g = _g, .b = _b}, {.r = _r, .g = _g, .b = _b}};
+ ws2812_setleds(leds, RGBLED_NUM);
+}
+
+static void rgblight_increase_hue(void) {
+ static uint8_t state = 0;
+
+ state = (state + 1) % 3;
+ switch (state) {
+ case 1:
+ rgblight_setrgb_red();
+ break;
+ case 2:
+ rgblight_setrgb_blue();
+ break;
+ default:
+ rgblight_setrgb_green();
+ break;
+ }
+}
diff --git a/keyboards/xd002/keymaps/rgb_lite/rules.mk b/keyboards/xd002/keymaps/rgb_lite/rules.mk
new file mode 100644
index 00000000000..227bbcae32d
--- /dev/null
+++ b/keyboards/xd002/keymaps/rgb_lite/rules.mk
@@ -0,0 +1 @@
+SRC += ws2812.c
diff --git a/keyboards/xd002/keymaps/tap_dance/config.h b/keyboards/xd002/keymaps/tap_dance/config.h
new file mode 100644
index 00000000000..b86e862d30d
--- /dev/null
+++ b/keyboards/xd002/keymaps/tap_dance/config.h
@@ -0,0 +1,3 @@
+#pragma once
+
+#define TAPPING_TERM 500
diff --git a/keyboards/xd002/keymaps/tap_dance/keymap.c b/keyboards/xd002/keymaps/tap_dance/keymap.c
new file mode 100644
index 00000000000..0f384ce99fe
--- /dev/null
+++ b/keyboards/xd002/keymaps/tap_dance/keymap.c
@@ -0,0 +1,19 @@
+#include QMK_KEYBOARD_H
+
+enum layers {
+ _BASE = 0,
+};
+
+enum {
+ TD_BC = 0
+};
+
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [TD_BC] = ACTION_TAP_DANCE_DOUBLE(KC_B, KC_C)
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT(
+ KC_A, TD(TD_BC)
+ )
+};
diff --git a/keyboards/xd002/keymaps/tap_dance/rules.mk b/keyboards/xd002/keymaps/tap_dance/rules.mk
new file mode 100644
index 00000000000..e5ddcae8d92
--- /dev/null
+++ b/keyboards/xd002/keymaps/tap_dance/rules.mk
@@ -0,0 +1 @@
+TAP_DANCE_ENABLE = yes
diff --git a/keyboards/xd002/keymaps/volume/keymap.c b/keyboards/xd002/keymaps/volume/keymap.c
new file mode 100644
index 00000000000..2365d7b245a
--- /dev/null
+++ b/keyboards/xd002/keymaps/volume/keymap.c
@@ -0,0 +1,7 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_VOLU, KC_VOLD
+ )
+};
diff --git a/keyboards/xd002/keymaps/volume/rules.mk b/keyboards/xd002/keymaps/volume/rules.mk
new file mode 100644
index 00000000000..fcfd2225bcf
--- /dev/null
+++ b/keyboards/xd002/keymaps/volume/rules.mk
@@ -0,0 +1 @@
+EXTRAKEY_ENABLE = yes
diff --git a/keyboards/xd002/readme.md b/keyboards/xd002/readme.md
new file mode 100644
index 00000000000..6358bc754e4
--- /dev/null
+++ b/keyboards/xd002/readme.md
@@ -0,0 +1,49 @@
+# xd002
+
+
+
+2% Custom mechanical keyboard. ATtiny85 powered, with 2*WS2812 LEDs, and the micronucleus bootloader.
+
+**Note**: Due to limited firmware space, a _**lot**_ of features have to be disabled to get a functioning QMK based keyboard.
+
+* Keyboard Maintainer: [zvecr](https://github.com/zvecr)
+* Hardware Supported: xd002
+* Hardware Availability: [kprepublic](https://kprepublic.com/products/xd002-xiudi-2-custom-mechanical-keyboard-2-keys-underglow-and-switch-rgb-pcb-programmed-hot-swappable-macro-key-aluminum-case)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make xd002:default
+
+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).
+
+## Flashing
+### Prerequisites
+
+```bash
+git clone https://github.com/micronucleus/micronucleus.git
+cd micronucleus/commandline/
+sudo make install
+```
+
+On Linux, you’ll need proper privileges to access the MCU. You can either use sudo when flashing firmware, or place [these files](https://github.com/micronucleus/micronucleus/blob/master/commandline/49-micronucleus.rules) in /etc/udev/rules.d/. Once added run the following:
+
+```bash
+sudo udevadm control --reload-rules
+sudo udevadm trigger
+```
+
+### Instructions
+
+**Reset Key**: Hold down key nearest to the USB socket while plugging in the keyboard.
+
+```bash
+make xd002:default:flash
+
+# or directly with...
+micronucleus --run
+```
+
+### Recovery
+
+* [Original Firmware](https://github.com/xiudi/Attiny85_vusb_pad_test)
+* [Bootloader Repair](https://digistump.com/wiki/digispark/tutorials/proisp)
diff --git a/keyboards/xd002/rules.mk b/keyboards/xd002/rules.mk
new file mode 100644
index 00000000000..1142142bfcb
--- /dev/null
+++ b/keyboards/xd002/rules.mk
@@ -0,0 +1,34 @@
+# MCU name
+MCU = attiny85
+
+# Bootloader selection
+BOOTLOADER = micronucleus
+OPT_DEFS += -DBOOTLOADER_SIZE=1862
+PROGRAM_CMD = micronucleus --run $(BUILD_DIR)/$(TARGET).hex
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = no # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+
+# Save as much space as we can...
+LTO_ENABLE = yes
+GRAVE_ESC_ENABLE = no
+MAGIC_ENABLE = no
+SPACE_CADET_ENABLE = no
diff --git a/keyboards/xd002/xd002.c b/keyboards/xd002/xd002.c
new file mode 100644
index 00000000000..e679b97243a
--- /dev/null
+++ b/keyboards/xd002/xd002.c
@@ -0,0 +1,16 @@
+/* Copyright 2020 zvecr
+ *
+ * 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 .
+ */
+#include "xd002.h"
diff --git a/keyboards/xd002/xd002.h b/keyboards/xd002/xd002.h
new file mode 100644
index 00000000000..3d780191bb3
--- /dev/null
+++ b/keyboards/xd002/xd002.h
@@ -0,0 +1,33 @@
+/* Copyright 2020 zvecr
+ *
+ * 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 .
+ */
+#pragma once
+
+#include "quantum.h"
+
+/* This 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( \
+ K01, K02 \
+) \
+{ \
+ { K01, K02 }, \
+}
diff --git a/keyboards/xd60/rev2/config.h b/keyboards/xd60/rev2/config.h
index 26dbb50e30b..22aa95b291a 100644
--- a/keyboards/xd60/rev2/config.h
+++ b/keyboards/xd60/rev2/config.h
@@ -48,6 +48,7 @@ along with this program. If not, see .
/* Backlight Setup */
#define BACKLIGHT_PIN F5
#define BACKLIGHT_LEVELS 6
+#define BACKLIGHT_ON_STATE 0
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/xd60/rev3/config.h b/keyboards/xd60/rev3/config.h
index 861755e45c1..4628b5a0c82 100644
--- a/keyboards/xd60/rev3/config.h
+++ b/keyboards/xd60/rev3/config.h
@@ -48,6 +48,7 @@ along with this program. If not, see .
/* Backlight Setup */
#define BACKLIGHT_PIN F5
#define BACKLIGHT_LEVELS 6
+#define BACKLIGHT_ON_STATE 0
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/xd68/config.h b/keyboards/xd68/config.h
index f0a78c1fd2d..c86bb56225d 100644
--- a/keyboards/xd68/config.h
+++ b/keyboards/xd68/config.h
@@ -52,6 +52,7 @@ along with this program. If not, see .
#define BACKLIGHT_LEVELS 6
#define BACKLIGHT_BREATHING
#define BREATHING_PERIOD 6
+#define BACKLIGHT_ON_STATE 0
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5
diff --git a/keyboards/xd75/config.h b/keyboards/xd75/config.h
index 7f8b71c45c9..b3a1882becd 100644
--- a/keyboards/xd75/config.h
+++ b/keyboards/xd75/config.h
@@ -51,6 +51,7 @@ along with this program. If not, see .
#define BACKLIGHT_PIN F5
#define BACKLIGHT_LEVELS 6
+#define BACKLIGHT_ON_STATE 0
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5
diff --git a/keyboards/xd75/keymaps/buzzlighter1/keymap.c b/keyboards/xd75/keymaps/buzzlighter1/keymap.c
index f96edce013e..09eea933e1b 100644
--- a/keyboards/xd75/keymaps/buzzlighter1/keymap.c
+++ b/keyboards/xd75/keymaps/buzzlighter1/keymap.c
@@ -10,6 +10,8 @@ enum custom_keycodes {
QMKURL
};
+#define FN_CAPS LT(_FN, KC_CAPS)
+
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* QWERTY
@@ -18,18 +20,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
* | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | Mute |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------|
- * | TT(1) | A | S | D | F | G | H | J | K | L | ; | ' | Vol- | Vol+ | ENTER |
+ * | FN(CPS)| A | S | D | F | G | H | J | K | L | ; | ' | Vol- | Vol+ | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------|
* | LSHIFT | Z | X | C | V | B | N | M | , | . | / | Home | PGUP | UP | PGDWN |
* |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------|
- * | LCTRL | Prev | Next | LALT | SPACE | End | LEFT | DOWN | RIGHT |
+ * | LCTRL | Del | ENTER | LALT | SPACE | End | LEFT | DOWN | RIGHT |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[_QW] = LAYOUT_ortho_5x15( /* QWERTY */
KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_DEL, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_MUTE,
- TT(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_VOLD, KC_VOLU, KC_ENT,
+ FN_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_VOLD, KC_VOLU, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_HOME, KC_PGUP, KC_UP, KC_PGDN,
KC_LCTL, KC_MPRV, KC_MNXT, KC_LALT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, KC_END, KC_LEFT, KC_DOWN, KC_RGHT
),
@@ -38,22 +40,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* .--------------------------------------------------------------------------------------------------------------------------------------.
* | XXXXXXX| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | _______| _______|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | P* | P7 | P8 | P9 | + | NumLk | PR SCR | SCR LK | PAUSE | XXXXXXX| XXXXXXX| BL_DEC | BL_INC | RGB HD | RGB HI |
+ * | _______| P7 | P8 | P9 | + | P* | XXXXXXX| PR SCR | SCR LK | PAUSE | XXXXXXX| BL_DEC | BL_INC | RGB HD | RGB HI |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | _______| P4 | P5 | P6 | PENT | CALC | XXXXXXX| POWER | XXXXXXX| RESET | XXXXXXX| BL_BRTG| BL_STEP| RGB SD | RGB SI |
+ * | _______| P4 | P5 | P6 | NumLk | CALC | XXXXXXX| POWER | XXXXXXX| RESET | XXXXXXX| BL_BRTG| BL_STEP| RGB SD | RGB SI |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | P/ | P1 | P2 | P3 | - | OS | XXXXXXX| XXXXXXX| XXXXXXX| XXXXXXX| XXXXXXX| BL_OFF | BL_ON | RGB VD | RGB VI |
+ * | _______| P1 | P2 | P3 | - | P/ | XXXXXXX| OS | PLAY | PREV | NXT | BL_OFF | BL_ON | RGB VD | RGB VI |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | CPSLCK | P0 | P. | _______| SPACE | BL_TOGG| RGB TG | RGB RMD| RGB MD |
+ * | _______| P0 | P. | PENT | SPACE | BL_TOGG| RGB TG | RGB RMD| RGB MD |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
[_FN] = LAYOUT_ortho_5x15( /* FUNCTION */
XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______,
- KC_PAST, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_NLCK, KC_PSCR, KC_SLCK, KC_PAUS, XXXXXXX, XXXXXXX, BL_DEC, BL_INC, RGB_HUD, RGB_HUI,
- _______, KC_P4, KC_P5, KC_P6, KC_PENT, KC_CALC, XXXXXXX, KC_PWR, XXXXXXX, RESET, XXXXXXX, BL_BRTG, BL_STEP, RGB_SAD, RGB_SAI,
- KC_PSLS, KC_P1, KC_P2, KC_P3, KC_PMNS, KC_LWIN, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, BL_OFF, BL_ON, RGB_VAD, RGB_VAI,
- KC_CAPS, KC_P0, KC_PDOT, _______, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, BL_TOGG, RGB_TOG, RGB_RMOD,RGB_MOD
+ _______, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_PAST, XXXXXXX, KC_SLCK, KC_PAUS, XXXXXXX, XXXXXXX, BL_DEC, BL_INC, RGB_HUD, RGB_HUI,
+ _______, KC_P4, KC_P5, KC_P6, KC_NLCK, KC_CALC, XXXXXXX, KC_PWR, XXXXXXX, RESET, XXXXXXX, BL_BRTG, BL_STEP, RGB_SAD, RGB_SAI,
+ _______, KC_P1, KC_P2, KC_P3, KC_PMNS, KC_PSLS, XXXXXXX, KC_LWIN, KC_MPLY, KC_MPRV, KC_MNXT, BL_OFF, BL_ON, RGB_VAD, RGB_VAI,
+ _______, KC_P0, KC_PDOT, KC_PENT, XXXXXXX, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, XXXXXXX, XXXXXXX, BL_TOGG, RGB_TOG, RGB_RMOD,RGB_MOD
)
};
diff --git a/keyboards/xd75/keymaps/buzzlighter1/readme.md b/keyboards/xd75/keymaps/buzzlighter1/readme.md
index 3ba121aa029..947acca1015 100644
--- a/keyboards/xd75/keymaps/buzzlighter1/readme.md
+++ b/keyboards/xd75/keymaps/buzzlighter1/readme.md
@@ -1,41 +1,54 @@
# XD75 with 7U spacebar for EN-RU gamers
+ * Standard QWERTY made for gamers with a Russian alternative input.
+ * The keys for extra letters in RU alphabet are where they are expected.
+ * Full 2x4 nav cluster.
+ * Volume/mute control are on base layer, Win key is on function layer.
+ * FN_CAPS provides fast F-keys access while gaming. Lefthanded Numpad operation.
+ * NKRO is on (forced).
-Standard QWERTY oriented on gamers with a Russian alternative input.
-Base layout is as close to classic layout as possible due to RU alphabet having more letters (thus the need for those extra keys remain on the right side).
-Full uncut 2x4 nav cluster.
-Caps Lock and Win keys sent to the Function layer.
-TT(1) - Function layer tap-toggle at CapsLock position provides fast F-keys access in a heat of a battle. As well as easy access to a Numpad.
-
+## Layout
+```c
/* QWERTY
* .--------------------------------------------------------------------------------------------------------------------------------------.
* | GESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | Del | BACKSP |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------|
* | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | Mute |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+-----------------+--------|
- * | TT(1) | A | S | D | F | G | H | J | K | L | ; | '' | Vol- | Vol+ | ENTER |
+ * | FN(CPS)| A | S | D | F | G | H | J | K | L | ; | ' | Vol- | Vol+ | ENTER |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------------------------+--------|
* | LSHIFT | Z | X | C | V | B | N | M | , | . | / | Home | PGUP | UP | PGDWN |
* |--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+-----------------+--------+--------|
- * | LCTRL | Prev | Next | LALT | SPACE | End | LEFT | DOWN | RIGHT |
+ * | LCTRL | Del | ENTER | LALT | SPACE | End | LEFT | DOWN | RIGHT |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
-
+```
+```c
/* FUNCTION
* .--------------------------------------------------------------------------------------------------------------------------------------.
* | XXXXXXX| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | _______| _______|
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | P* | P7 | P8 | P9 | + | NumLk | PR SCR | SCR LK | PAUSE | XXXXXXX| XXXXXXX| BL_DEC | BL_INC | RGB HD | RGB HI |
+ * | _______| P7 | P8 | P9 | + | P* | XXXXXXX| PR SCR | SCR LK | PAUSE | XXXXXXX| BL_DEC | BL_INC | RGB HD | RGB HI |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | _______| P4 | P5 | P6 | PENT | CALC | XXXXXXX| POWER | XXXXXXX| RESET | XXXXXXX| BL_BRTG| BL_STEP| RGB SD | RGB SI |
+ * | _______| P4 | P5 | P6 | NumLk | CALC | XXXXXXX| POWER | XXXXXXX| RESET | XXXXXXX| BL_BRTG| BL_STEP| RGB SD | RGB SI |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | P/ | P1 | P2 | P3 | - | OS | XXXXXXX| XXXXXXX| XXXXXXX| XXXXXXX| XXXXXXX| BL_OFF | BL_ON | RGB VD | RGB VI |
+ * | _______| P1 | P2 | P3 | - | P/ | XXXXXXX| OS | PLAY | PREV | NXT | BL_OFF | BL_ON | RGB VD | RGB VI |
* |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- * | CPSLCK | P0 | P. | _______| SPACE | BL_TOGG| RGB TG | RGB RMD| RGB MD |
+ * | _______| P0 | P. | PENT | SPACE | BL_TOGG| RGB TG | RGB RMD| RGB MD |
* '--------------------------------------------------------------------------------------------------------------------------------------'
*/
-
-
-## LED control
-
+```
+## LEDs
Top left LED - Function layer active.
Mid left LED - CapsLock active.
+
+## Compile
+
+go to qmk top directory.
+```
+$ cd qmk_firmware
+```
+
+build
+```
+$ make xd75:buzzlighter1
+```
\ No newline at end of file
diff --git a/keyboards/xd75/keymaps/ericgebhart/config.h b/keyboards/xd75/keymaps/ericgebhart/config.h
new file mode 100644
index 00000000000..77f83e83fd4
--- /dev/null
+++ b/keyboards/xd75/keymaps/ericgebhart/config.h
@@ -0,0 +1,12 @@
+#pragma once
+
+#undef RGBLED_NUM
+#define RGBLED_NUM 6
+#define RGBLIGHT_LAYERS
+
+#undef RGBLIGHT_ANIMATIONS
+//#define RGBLIGHT_HUE_STEP 8
+//#define RGBLIGHT_SAT_STEP 8
+
+
+// place overrides here
diff --git a/keyboards/xd75/keymaps/ericgebhart/keymap.c b/keyboards/xd75/keymaps/ericgebhart/keymap.c
new file mode 100644
index 00000000000..9661972bfac
--- /dev/null
+++ b/keyboards/xd75/keymaps/ericgebhart/keymap.c
@@ -0,0 +1,242 @@
+/*
+ Copyright 2018 Eric Gebhart
+
+ 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 .
+*/
+
+#include "keymap_bepo.h"
+#include "ericgebhart.h"
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [DVORAK] = LAYOUT_ortho_5x15_wrapper(
+ KC_GRV, ___ORTHO_15_N___, KC_EQL,
+ KC_LOCK, ___13_DVORAK_1___, KC_SLASH,
+ TAB_BKTAB, ___13_DVORAK_2___, KC_MINUS,
+ KC_LSFT, ___13_DVORAK_3___, KC_RSFT,
+ ___ORTHO_15_BOTTOM___
+ ),
+
+ [QWERTY] = LAYOUT_ortho_5x15_wrapper(
+ KC_GRV, ___ORTHO_15_N___, KC_EQL,
+ KC_LOCK, ___13_QWERTY_1___, KC_SLASH,
+ TAB_BKTAB, ___13_QWERTY_2___, KC_MINUS,
+ KC_LSFT, ___13_QWERTY_3___, KC_RSFT,
+ ___ORTHO_15_BOTTOM___
+ ),
+
+ [COLEMAK] = LAYOUT_ortho_5x15_wrapper(
+ KC_GRV, ___ORTHO_15_N___, KC_EQL,
+ KC_LOCK, ___13_COLEMAK_1___, KC_SLASH,
+ TAB_BKTAB, ___13_COLEMAK_2___, KC_MINUS,
+ KC_LSFT, ___13_COLEMAK_3___, KC_RSFT,
+ ___ORTHO_15_BOTTOM___
+ ),
+
+ [WORKMAN] = LAYOUT_ortho_5x15_wrapper(
+ KC_GRV, ___ORTHO_15_N___, KC_EQL,
+ KC_LOCK, ___13_WORKMAN_1___, KC_SLASH,
+ TAB_BKTAB, ___13_WORKMAN_2___, KC_MINUS,
+ KC_LSFT, ___13_WORKMAN_3___, KC_RSFT,
+ ___ORTHO_15_BOTTOM___
+ ),
+
+ [NORMAN] = LAYOUT_ortho_5x15_wrapper(
+ KC_GRV, ___ORTHO_15_N___, KC_EQL,
+ KC_LOCK, ___13_NORMAN_1___, KC_SLASH,
+ TAB_BKTAB, ___13_NORMAN_2___, KC_MINUS,
+ KC_LSFT, ___13_NORMAN_3___, KC_RSFT,
+ ___ORTHO_15_BOTTOM___
+ ),
+
+ [DVORAK_ON_BEPO] = LAYOUT_ortho_5x15_wrapper(
+ DB_GRV, ___ORTHO_15_B_N___, DB_EQL,
+ KC_LOCK, ___13_DVORAK_B_1___, DB_SLASH,
+ TAB_BKTAB, ___13_DVORAK_B_2___, DB_MINUS,
+ KC_LSFT, ___13_DVORAK_B_3___, KC_RSFT,
+ ___ORTHO_15_BOTTOM_FR___
+ ),
+
+ [XMONAD] = LAYOUT_ortho_5x15_wrapper(
+ ___ORTHO_15_FUNC_1_12___,
+ ___, ___13_DVORAK_1___, ___,
+ ___, ___13_DVORAK_2___, ___,
+ ___, ___13_DVORAK_3___, ___,
+ ___15___
+ ),
+
+ [XMONAD_FR] = LAYOUT_ortho_5x15_wrapper(
+ ___ORTHO_15_FUNC_1_12___,
+ ___, ___13_DVORAK_B_1___, ___,
+ ___, ___13_DVORAK_B_2___, ___,
+ ___, ___13_DVORAK_B_3___, ___,
+ ___15___
+ ),
+
+ [BEPO] = LAYOUT_ortho_5x15_wrapper(
+ ___ORTHO_15_B_SYMB___,
+ KC_LOCK, ___13_BEPO_1___, BP_W,
+ TAB_BKTAB, ___13_BEPO_2___, BP_CCED,
+ BP_SFT_T_ECRC, ___13_BEPO_3___, BP_SFT_T_W,
+ ___ORTHO_15_BOTTOM_BP___
+ ),
+
+ // SYMBOLS
+ [SYMB] = LAYOUT_ortho_5x15_wrapper(
+ ___ORTHO_15_FUNC_1_12___,
+ ___15_SYMB_1___,
+ ___15_SYMB_2___,
+ ___15_SYMB_3___,
+ ___15_SYMB_4___
+ ),
+
+ [KEYPAD] = LAYOUT_ortho_5x15_wrapper(
+ ___ORTHO_15_FUNC_1_12___,
+ ___15_KP_1___,
+ ___15_KP_2___,
+ ___15_KP_3___,
+ ___15_KP_4___
+ ),
+
+ [KEYPAD_ON_BEPO] = LAYOUT_ortho_5x15_wrapper(
+ ___ORTHO_15_FUNC_1_12___,
+ ___15_KP_B_1___,
+ ___15_KP_B_2___,
+ ___15_KP_B_3___,
+ ___15_KP_B_4___
+ ),
+
+ [SYMB_ON_BEPO] = LAYOUT_ortho_5x15_wrapper(
+ ___ORTHO_15_FUNC_1_12___,
+ ___15_SYMB_B_1___,
+ ___15_SYMB_B_2___,
+ ___15_SYMB_B_3___,
+ ___15_SYMB_B_4___
+ ),
+
+ // MEDIA AND MOUSE
+ [MDIA] = LAYOUT_ortho_5x15_wrapper(
+ ___ORTHO_15_FUNC_1_12___,
+ ___15_MDIA_1___,
+ ___15_MDIA_2___,
+ ___15_MDIA_3___,
+ ___15_MDIA_4___
+ ),
+
+ [LAYERS] = LAYOUT_ortho_5x15_wrapper(
+ ___ORTHO_15_FUNC_1_12___,
+ ___15_LAYERS_1___,
+ ___15_LAYERS_2___,
+ ___15_LAYERS_3___,
+ ___15___
+ ),
+
+ [_RGB] = LAYOUT_ortho_5x15_wrapper(
+ ___ORTHO_15_FUNC_1_12___,
+ ___15_RGB_1___,
+ ___15_RGB_2___,
+ ___15_RGB_3___,
+ ___15___
+ ),
+};
+
+
+/********************************************************************************/
+/* Using layers to do RGB underlighting */
+/********************************************************************************/
+
+const rgblight_segment_t PROGMEM on_bepo[] = RGBLIGHT_LAYER_SEGMENTS(
+ {0, 2, HSV_AZURE}
+ );
+
+const rgblight_segment_t PROGMEM bepo[] = RGBLIGHT_LAYER_SEGMENTS(
+ {3, 2, HSV_MAGENTA}
+ );
+
+const rgblight_segment_t PROGMEM dvorak[] = RGBLIGHT_LAYER_SEGMENTS(
+ {3, 2, HSV_AZURE}
+ );
+
+const rgblight_segment_t PROGMEM media[] = RGBLIGHT_LAYER_SEGMENTS(
+ {5, 1, HSV_GREEN}
+ );
+
+const rgblight_segment_t PROGMEM symbol[] = RGBLIGHT_LAYER_SEGMENTS(
+ {4, 2, HSV_GOLD}
+ );
+
+const rgblight_segment_t PROGMEM keypad[] = RGBLIGHT_LAYER_SEGMENTS(
+ {4, 2, HSV_BLUE}
+ );
+
+const rgblight_segment_t PROGMEM layers[] = RGBLIGHT_LAYER_SEGMENTS(
+ {5, 1, HSV_RED}
+ );
+
+const rgblight_segment_t PROGMEM rgb[] = RGBLIGHT_LAYER_SEGMENTS(
+ {5, 1, HSV_ORANGE}
+ );
+
+const rgblight_segment_t* const PROGMEM rgb_layers[] = RGBLIGHT_LAYERS_LIST(on_bepo, bepo, dvorak, media, symbol,
+ keypad, layers, rgb);
+
+void keyboard_post_init_user(void) {
+ rgblight_sethsv_noeeprom(HSV_PURPLE);
+ rgblight_layers = rgb_layers;
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ // rgblight_set_layer_state(0, !on_qwerty());
+ rgblight_set_layer_state(0, layer_state_cmp(state, DVORAK));
+
+ rgblight_set_layer_state(1, layer_state_cmp(state, BEPO));
+ rgblight_set_layer_state(2, layer_state_cmp(state, DVORAK));
+ //|| layer_state_cmp(state, DVORAK_ON_BEPO)));
+ rgblight_set_layer_state(3, layer_state_cmp(state, MDIA));
+ rgblight_set_layer_state(4, layer_state_cmp(state, SYMB) );
+
+ //(layer_state_cmp(state, SYMB) || (layer_state_cmp(state, SYMB_ON_BEPO))));
+ rgblight_set_layer_state(5, layer_state_cmp(state, KEYPAD) );
+ ///(layer_state_cmp(state, KEYPAD) || (layer_state_cmp(state, KEYPAD_ON_BEPO))));
+ rgblight_set_layer_state(6, layer_state_cmp(state, LAYERS));
+ rgblight_set_layer_state(7, layer_state_cmp(state, _RGB));
+ return state;
+}
+
+/* void suspend_power_down_user(void) { */
+/* rgblight_disable(); */
+/* } */
+
+/* void suspend_wakeup_init_user(void) { */
+/* rgblight_enable(); */
+/* } */
+
+/* bool is_shift_pressed = false; */
+
+/* bool led_update_user(led_t led_state) { */
+/* rgblight_set_layer_state(2, is_shift_pressed != led_state.caps_lock); */
+/* return true; */
+/* } */
+
+/* bool process_record_user(uint16_t keycode, keyrecord_t* record) { */
+/* switch (keycode) { */
+/* case KC_LSFT: */
+/* case KC_RSFT: */
+/* is_shift_pressed = record->event.pressed; */
+/* rgblight_set_layer_state(2, is_shift_pressed != host_keyboard_led_state().caps_lock); */
+/* default: */
+/* return true; */
+/* } */
+/* } */
diff --git a/keyboards/xd75/keymaps/ericgebhart/readme.md b/keyboards/xd75/keymaps/ericgebhart/readme.md
new file mode 100644
index 00000000000..a1c0236ed9c
--- /dev/null
+++ b/keyboards/xd75/keymaps/ericgebhart/readme.md
@@ -0,0 +1 @@
+# The default keymap for xd75, with led controls
\ No newline at end of file
diff --git a/keyboards/xd75/keymaps/ericgebhart/rules.mk b/keyboards/xd75/keymaps/ericgebhart/rules.mk
new file mode 100644
index 00000000000..11871f9c9da
--- /dev/null
+++ b/keyboards/xd75/keymaps/ericgebhart/rules.mk
@@ -0,0 +1,3 @@
+RGBLIGHT_ENABLE = yes
+RGBLIGHT_ANIMATION = yes
+# BACKLIGHT_ENABLE = yes
diff --git a/keyboards/xd75/keymaps/scheiklp/config.h b/keyboards/xd75/keymaps/scheiklp/config.h
new file mode 100644
index 00000000000..68f5a3ee110
--- /dev/null
+++ b/keyboards/xd75/keymaps/scheiklp/config.h
@@ -0,0 +1,41 @@
+/* Copyright 2017 Benjamin Kesselring
+ *
+ * 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 .
+ */
+
+#pragma once
+// place overrides here
+#define AUTO_SHIFT_TIMEOUT 175
+#define NO_AUTO_SHIFT_SPECIAL
+
+// Mouse control
+// constant mode (velocity)
+#define MK_3_SPEED
+// KC_ACL0 < KC_ACL1 < unmodified < KC_ACL2
+// Cursor offset per movement (unmodified)
+#define MK_C_OFFSET_UNMOD 16
+// Time between cursor movements (unmodified)
+#define MK_C_INTERVAL_UNMOD 16
+// Cursor offset per movement (KC_ACL0)
+#define MK_C_OFFSET_0 1
+// Time between cursor movements (KC_ACL0)
+#define MK_C_INTERVAL_0 32
+// Cursor offset per movement (KC_ACL1)
+#define MK_C_OFFSET_1 4
+// Time between cursor movements (KC_ACL1)
+#define MK_C_INTERVAL_1 16
+// Cursor offset per movement (KC_ACL2)
+#define MK_C_OFFSET_2 32
+// Time between cursor movements (KC_ACL2)
+#define MK_C_INTERVAL_2 16
diff --git a/keyboards/xd75/keymaps/scheiklp/keymap.c b/keyboards/xd75/keymaps/scheiklp/keymap.c
new file mode 100644
index 00000000000..a757c2e49ca
--- /dev/null
+++ b/keyboards/xd75/keymaps/scheiklp/keymap.c
@@ -0,0 +1,112 @@
+/* Copyright 2017 Wunder
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+#include "koy_keys_on_quertz_de_latin1.h"
+// Layer shorthand
+#define _1 0
+#define _3 1
+#define _4 2
+#define _7 3
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Layer 1
+ * .---------------------------------------------------------------------------------------------------------------------------------------------------.
+ * | ESC | 1 | 2 | 3 | 4 | 5 | Record 1 | Play 1 | 6 | 7 | 8 | 9 | 0 | DEL | BACKSP |
+ * |---------+---------+--------+--------+--------+--------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | TAB | K | . | O | , | Y | Record 2 | Play 2P | V | G | C | L | ẞ | Z | |
+ * |---------+---------+--------+--------+--------+--------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | Layer 3 | H | A | E | I | U | Undo | Stop Rec. | D | T | R | N | S | F | Layer 3 |
+ * |---------+---------+--------+--------+--------+--------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | LSHIFT | X | Q | Ä | Ü | Ö | Copy | Cut | B | P | W | M | J | RSHIFT | RSHIFT |
+ * |---------+---------+--------+--------+--------+--------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | LCTRL | Layer 4 | | LGUI | LALT | SPACE | Paste | SPACE | SPACE | Layer 4 | RCTRL | | | KEYLOCK | Layer 7 |
+ * '---------------------------------------------------------------------------------------------------------------------------------------------------'
+ */
+
+ [_1] = LAYOUT_ortho_5x15( /* KOY */
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, DM_REC1, DM_PLY1, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, KC_BSPC,
+ KC_TAB, KC_K, KC_DOT, KC_O, KC_COMM, N_Y, DM_REC2, DM_PLY2, KC_V, KC_G, KC_C, KC_L, N_SS, N_Z, KC_TRNS,
+ MO(_3), KC_H, KC_A, KC_E, KC_I, KC_U, N_UNDO, DM_RSTP, KC_D, KC_T, KC_R, KC_N, KC_S, KC_F, MO(_3),
+ KC_LSFT, KC_X, KC_Q, N_AE, N_UE, N_OE, N_COPY, N_CUT, KC_B, KC_P, KC_W, KC_M, KC_J, KC_RSFT, KC_RSFT,
+ KC_LCTL, MO(_4), KC_TRNS, KC_LGUI, KC_LALT, KC_SPC, N_PASTE, KC_SPC, KC_SPC, MO(_4), KC_RCTL, KC_TRNS, KC_TRNS,KC_LOCK, MO(_7)
+ ),
+
+/* Layer 3
+ * .---------------------------------------------------------------------------------------------------------------------------------------------------.
+ * | ESC | F1 | F2 | F3 | F4 | F5 | | | F6 | F7 | F8 | F9 | F0 | DEL | BACKSP |
+ * |---------+---------+--------+--------+--------+--------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | TAB | … | _ | [ | ] | ^ | | | ! | < | > | = | & | | |
+ * |---------+---------+--------+--------+--------+--------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | Layer 5 | \ | / | { | } | * | | | ? | ( | ) | - | : | @ | Layer 5 |
+ * |---------+---------+--------+--------+--------+--------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | LSHIFT | # | $ | | | ~ | ` | | | + | % | " | ' | ; | RSHIFT | RSHIFT |
+ * |---------+---------+--------+--------+--------+--------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | LCTRL | | | | LALT | | | | | | | | | | |
+ * '---------------------------------------------------------------------------------------------------------------------------------------------------'
+ */
+ [_3] = LAYOUT_ortho_5x15( /* Layer 3 */
+ KC_ESC, KC_F1, KC_F3, KC_F4, KC_F5, KC_F6, KC_TRNS, KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS,
+ KC_TAB, N_DOTS, N_USC, N_LSQBR, N_RSQBR, N_CIRC, KC_TRNS, KC_TRNS, N_EXKL, N_LT, N_GT, N_EQ, N_AMP, KC_TRNS, KC_TRNS,
+ KC_TRNS, N_BSLS, N_SLSH, N_LCUBR, N_RCUBR, N_ASTR, KC_TRNS, KC_TRNS, N_QUES, N_LPARN, N_RPARN, N_MINS, N_COLN, N_AT, KC_TRNS,
+ KC_LSFT, N_HASH, N_DLR, N_PIPE, N_TILD, N_GRAVE, KC_TRNS, KC_TRNS, N_PLUS, N_PERC, N_QUOT, N_SING, N_SEMI, KC_RSFT, KC_RSFT,
+ KC_LCTL, KC_TRNS, KC_TRNS, KC_LALT, KC_TRNS, KC_SPC, KC_TRNS, KC_SPC, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+/* Layer 4
+ * .------------------------------------------------------------------------------------------------------------------------------------------------------.
+ * | ESC | | | | | | | | | | | | | | |
+ * |---------+---------+--------+--------+--------+-----------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | TAB | Page up | BACKSP | Up | DEL | Page down | | | / | 7 | 8 | 9 | − | | |
+ * |---------+---------+--------+--------+--------+-----------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | | Home | Left | Down | Right | End | | | * | 4 | 5 | 6 | . | | |
+ * |---------+---------+--------+--------+--------+-----------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | LSHIFT | ESC | TAB | Insert | Enter | Undo | | | Enter | 1 | 2 | 3 | ; | RSHIFT | RSHIFT |
+ * |---------+---------+--------+--------+--------+-----------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | LCTRL | | | LALT | | 0 | | 0 | 0 | | | | | | |
+ * '------------------------------------------------------------------------------------------------------------------------------------------------------'
+ */
+ [_4] = LAYOUT_ortho_5x15( /* Layer 4 */
+ KC_ESC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TAB, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_TRNS, KC_TRNS, KC_KP_SLASH, KC_7, KC_8, KC_9, KC_KP_MINUS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_END, KC_TRNS, KC_TRNS, KC_KP_ASTERISK, KC_4, KC_5, KC_6, KC_KP_PLUS, KC_TRNS, KC_TRNS,
+ KC_LSFT, KC_ESC, KC_TAB, KC_INS, KC_ENTER, N_UNDO, KC_TRNS, KC_TRNS, KC_KP_ENTER, KC_1, KC_2, KC_3, KC_KP_DOT, KC_RSFT, KC_RSFT,
+ KC_LCTL, KC_TRNS, KC_TRNS, KC_LALT, KC_TRNS, KC_0, KC_TRNS, KC_0, KC_0, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+/* Layer 7
+ * .--------------------------------------------------------------------------------------------------------------------------------------------------------------.
+ * | ESC | | | Button 3 | | | | | | | | | | | RESET |
+ * |---------+----------+----------+----------+----------+------------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | TAB | Wheel up | Button 2 | Up | Button 1 | Wheel down | | | | | | | | | |
+ * |---------+----------+----------+----------+----------+------------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | | Veloc 0 | Left | Down | Right | | | | | | | | | | |
+ * |---------+----------+----------+----------+----------+------------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | LSHIFT | Veloc 1 | | | | | | | | | | | | | |
+ * |---------+----------+----------+----------+----------+------------+-----------+-----------+--------+---------+--------+--------+--------+-----------+---------|
+ * | LCTRL | Veloc 2 | | LALT | | | | | | | | | | | |
+ * '--------------------------------------------------------------------------------------------------------------------------------------------------------------'
+ */
+ [_7] = LAYOUT_ortho_5x15( /* Layer 7 */
+ KC_ESC, KC_TRNS, KC_TRNS, KC_MS_BTN3, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET,
+ KC_TAB, KC_MS_WH_UP, KC_MS_BTN2, KC_MS_UP, KC_MS_BTN1, KC_MS_WH_DOWN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_MS_ACCEL0, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_LSFT, KC_MS_ACCEL1, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_LCTL, KC_MS_ACCEL2, KC_TRNS, KC_LALT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+
+};
+
diff --git a/keyboards/xd75/keymaps/scheiklp/readme.md b/keyboards/xd75/keymaps/scheiklp/readme.md
new file mode 100644
index 00000000000..58c65f0884d
--- /dev/null
+++ b/keyboards/xd75/keymaps/scheiklp/readme.md
@@ -0,0 +1,9 @@
+# KOY Layout for the xd75 pcb board
+Compile the layout
+```bash
+qmk compile -kb xd75 -km scheiklp
+```
+and flash it to the board
+```bash
+qmk flash -kb xd75 -km scheiklp
+```
diff --git a/keyboards/xd75/keymaps/scheiklp/rules.mk b/keyboards/xd75/keymaps/scheiklp/rules.mk
new file mode 100644
index 00000000000..6e07de471ac
--- /dev/null
+++ b/keyboards/xd75/keymaps/scheiklp/rules.mk
@@ -0,0 +1,6 @@
+BOOTMAGIC_ENABLE = no
+COMMAND_ENABLE = no
+RGBLIGHT_ENABLE = no
+DYNAMIC_MACRO_ENABLE = yes
+AUTO_SHIFT_ENABLE = yes
+KEY_LOCK_ENABLE = yes
diff --git a/keyboards/xd87/config.h b/keyboards/xd87/config.h
index 438da93fb2d..e943dcbeab5 100644
--- a/keyboards/xd87/config.h
+++ b/keyboards/xd87/config.h
@@ -53,6 +53,7 @@ along with this program. If not, see .
#define BACKLIGHT_PIN D0
// #define BACKLIGHT_BREATHING
#define BACKLIGHT_LEVELS 3
+#define BACKLIGHT_ON_STATE 0
#define RGB_DI_PIN B7
#ifdef RGB_DI_PIN
diff --git a/keyboards/xelus/snap96/config.h b/keyboards/xelus/snap96/config.h
new file mode 100644
index 00000000000..0ebc75e3911
--- /dev/null
+++ b/keyboards/xelus/snap96/config.h
@@ -0,0 +1,31 @@
+#pragma once
+
+#include "config_common.h"
+
+// USB Device descriptor parameter
+#define VENDOR_ID 0x5845 // XE
+#define PRODUCT_ID 0x5396 // Snap96
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Xelus
+#define PRODUCT Snap96
+#define DESCRIPTION Snap96
+
+// key matrix size
+#define MATRIX_ROWS 12
+#define MATRIX_COLS 10
+
+// key matrix pins
+#define MATRIX_ROW_PINS { B2, B1, B0, C7, F6, F7, B3, D1, D2, D7, B6, C6 }
+#define MATRIX_COL_PINS { E6, D5, B7, D0, F5, D3, B4, B5, D4, D6 }
+#define UNUSED_PINS
+
+// COL2ROW or ROW2COL
+#define DIODE_DIRECTION COL2ROW
+
+// Set 0 if debouncing isn't needed
+#define DEBOUNCE 5
+
+// 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
diff --git a/keyboards/xelus/snap96/keymaps/default/keymap.c b/keyboards/xelus/snap96/keymaps/default/keymap.c
new file mode 100644
index 00000000000..31c7a2ff28f
--- /dev/null
+++ b/keyboards/xelus/snap96/keymaps/default/keymap.c
@@ -0,0 +1,22 @@
+// Default layout for Snap96
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, KC_PSCR, KC_SLCK, KC_HOME, KC_END,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
+ ),
+
+ [1] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/xelus/snap96/keymaps/via/config.h b/keyboards/xelus/snap96/keymaps/via/config.h
new file mode 100644
index 00000000000..96c85573df1
--- /dev/null
+++ b/keyboards/xelus/snap96/keymaps/via/config.h
@@ -0,0 +1,2 @@
+// 3 layers or else it will not fit in EEPROM
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
diff --git a/keyboards/xelus/snap96/keymaps/via/keymap.c b/keyboards/xelus/snap96/keymaps/via/keymap.c
new file mode 100644
index 00000000000..03547d5fd1a
--- /dev/null
+++ b/keyboards/xelus/snap96/keymaps/via/keymap.c
@@ -0,0 +1,31 @@
+// VIA layout for Snap96
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_all(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, KC_PSCR, KC_SLCK, KC_HOME, KC_END,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT
+ ),
+
+ [1] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [2] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/xelus/snap96/keymaps/via/rules.mk b/keyboards/xelus/snap96/keymaps/via/rules.mk
new file mode 100644
index 00000000000..1e5b99807cb
--- /dev/null
+++ b/keyboards/xelus/snap96/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/xelus/snap96/readme.md b/keyboards/xelus/snap96/readme.md
new file mode 100644
index 00000000000..55751c1c5f9
--- /dev/null
+++ b/keyboards/xelus/snap96/readme.md
@@ -0,0 +1,13 @@
+# Snap96
+
+A 96 Keyboard which supports various layouts and is able to be "snapped" to smaller layouts.
+
+* Keyboard Maintainer: [Xelus22](https://github.com/Xelus22)
+* Hardware Supported: Snap96
+* Hardware Availability: Custom Project
+
+Make example for this keyboard (after setting up your build environment):
+
+ make xelus/snap96:default
+
+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).
diff --git a/keyboards/xelus/snap96/rules.mk b/keyboards/xelus/snap96/rules.mk
new file mode 100644
index 00000000000..a52c97b2d52
--- /dev/null
+++ b/keyboards/xelus/snap96/rules.mk
@@ -0,0 +1,33 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+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
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by default
+MIDI_ENABLE = no # MIDI support
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. - We have custom RGB underglow
+
diff --git a/keyboards/xelus/snap96/snap96.c b/keyboards/xelus/snap96/snap96.c
new file mode 100644
index 00000000000..e7c728bb05d
--- /dev/null
+++ b/keyboards/xelus/snap96/snap96.c
@@ -0,0 +1 @@
+#include "snap96.h"
diff --git a/keyboards/xelus/snap96/snap96.h b/keyboards/xelus/snap96/snap96.h
new file mode 100644
index 00000000000..cbdbc97cb33
--- /dev/null
+++ b/keyboards/xelus/snap96/snap96.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_all( \
+ K0000, K0001, K0002, K0003, K0004, K0005, K0006, K0007, K0008, K0009, K0600, K0601, K0602, K0603, K0604, K0605, K0606, K0607, K0608, \
+ K0100, K0101, K0102, K0103, K0104, K0105, K0106, K0107, K0108, K0109, K0700, K0701, K0702, K0703, K0704, K0705, K0706, K0707, K0708, \
+ K0200, K0201, K0202, K0203, K0204, K0205, K0206, K0207, K0208, K0209, K0800, K0801, K0802, K0804, K0805, K0806, K0807, K0808, \
+ K0300, K0301, K0302, K0303, K0304, K0305, K0306, K0307, K0308, K0309, K0900, K0901, K0903, K0905, K0906, K0907, K0908, \
+ K0400, K0401, K0402, K0403, K0404, K0405, K0406, K0407, K0408, K0409, K1000, K1001, K1003, K1004, K1005, K1006, K1007, K1008, \
+ K0500, K0501, K0502, K0505, K0506, K0509, K1100, K1101, K1102, K1103, K1104, K1105, K1106, K1107, K1108 \
+) { \
+ { K0000, K0001, K0002, K0003, K0004, K0005, K0006, K0007, K0008, K0009 }, \
+ { K0100, K0101, K0102, K0103, K0104, K0105, K0106, K0107, K0108, K0109 }, \
+ { K0200, K0201, K0202, K0203, K0204, K0205, K0206, K0207, K0208, K0209 }, \
+ { K0300, K0301, K0302, K0303, K0304, K0305, K0306, K0307, K0308, K0309 }, \
+ { K0400, K0401, K0402, K0403, K0404, K0405, K0406, K0407, K0408, K0409 }, \
+ { K0500, K0501, K0502, KC_NO, KC_NO, K0505, K0506, KC_NO, KC_NO, K0509 }, \
+ { K0600, K0601, K0602, K0603, K0604, K0605, K0606, K0607, K0608, KC_NO }, \
+ { K0700, K0701, K0702, K0703, K0704, K0705, K0706, K0707, K0708, KC_NO }, \
+ { K0800, K0801, K0802, KC_NO, K0804, K0805, K0806, K0807, K0808, KC_NO }, \
+ { K0900, K0901, KC_NO, K0903, KC_NO, K0905, K0906, K0907, K0908, KC_NO }, \
+ { K1000, K1001, KC_NO, K1003, K1004, K1005, K1006, K1007, K1008, KC_NO }, \
+ { K1100, K1101, K1102, K1103, K1104, K1105, K1106, K1107, K1108, KC_NO } \
+}
diff --git a/keyboards/xiaomi/mk02/chconf.h b/keyboards/xiaomi/mk02/chconf.h
index 8d66b51d235..85c1c9b3b9e 100644
--- a/keyboards/xiaomi/mk02/chconf.h
+++ b/keyboards/xiaomi/mk02/chconf.h
@@ -331,7 +331,7 @@
* @note The default is @p TRUE.
*/
#if !defined(CH_CFG_USE_MEMCORE)
-#define CH_CFG_USE_MEMCORE FALSE
+#define CH_CFG_USE_MEMCORE TRUE
#endif
/**
diff --git a/keyboards/yd60mq/12led/config.h b/keyboards/yd60mq/12led/config.h
new file mode 100644
index 00000000000..dde57aafec5
--- /dev/null
+++ b/keyboards/yd60mq/12led/config.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#define DEVICE_VER 0x0001
+
+#define RGBLED_NUM 12
diff --git a/keyboards/yd60mq/12led/readme.md b/keyboards/yd60mq/12led/readme.md
new file mode 100644
index 00000000000..11706906154
--- /dev/null
+++ b/keyboards/yd60mq/12led/readme.md
@@ -0,0 +1,3 @@
+# YD60MQ – 12 LED
+
+Code specific to the YD60MQ variant with 12 RGB LEDs on the back (unknown revision number).
diff --git a/keyboards/yd60mq/12led/rules.mk b/keyboards/yd60mq/12led/rules.mk
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/yd60mq/16led/config.h b/keyboards/yd60mq/16led/config.h
new file mode 100644
index 00000000000..11ce3aeb27f
--- /dev/null
+++ b/keyboards/yd60mq/16led/config.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#define DEVICE_VER 0x0002
+
+#define RGBLED_NUM 16
diff --git a/keyboards/yd60mq/16led/readme.md b/keyboards/yd60mq/16led/readme.md
new file mode 100644
index 00000000000..a03d6259e43
--- /dev/null
+++ b/keyboards/yd60mq/16led/readme.md
@@ -0,0 +1,3 @@
+# YD60MQ – 16 LED
+
+Code specific to the YD60MQ variant with 16 RGB LEDs on the back (unknown revision number).
diff --git a/keyboards/yd60mq/16led/rules.mk b/keyboards/yd60mq/16led/rules.mk
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/keyboards/yd60mq/config.h b/keyboards/yd60mq/config.h
index 75e697802b5..26c39a5b028 100644
--- a/keyboards/yd60mq/config.h
+++ b/keyboards/yd60mq/config.h
@@ -5,7 +5,6 @@
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
-#define DEVICE_VER 0x0001
#define MANUFACTURER YMDK
#define PRODUCT YD60MQ
#define DESCRIPTION Keyboard
@@ -37,10 +36,8 @@
/* prevent stuck modifiers */
#define RGB_DI_PIN E2
-#ifdef RGB_DI_PIN
#define RGBLIGHT_ANIMATIONS
-#define RGBLED_NUM 12
#define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_VAL_STEP 8
-#endif
+// RGBLED_NUM is defined in revisions
diff --git a/keyboards/yd60mq/info.json b/keyboards/yd60mq/info.json
index 79d5e9d9813..60a62af7aa4 100644
--- a/keyboards/yd60mq/info.json
+++ b/keyboards/yd60mq/info.json
@@ -78,6 +78,143 @@
{"label":"Down", "x":13, "y":4},
{"label":"Right", "x":14, "y":4}
]
+ },
+ "LAYOUT_60_ansi": {
+ "key_count": 61,
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+ {"x":6, "y":0},
+ {"x":7, "y":0},
+ {"x":8, "y":0},
+ {"x":9, "y":0},
+ {"x":10, "y":0},
+ {"x":11, "y":0},
+ {"x":12, "y":0},
+ {"x":13, "y":0, "w":2},
+ {"x":0, "y":1, "w":1.5},
+ {"x":1.5, "y":1},
+ {"x":2.5, "y":1},
+ {"x":3.5, "y":1},
+ {"x":4.5, "y":1},
+ {"x":5.5, "y":1},
+ {"x":6.5, "y":1},
+ {"x":7.5, "y":1},
+ {"x":8.5, "y":1},
+ {"x":9.5, "y":1},
+ {"x":10.5, "y":1},
+ {"x":11.5, "y":1},
+ {"x":12.5, "y":1},
+ {"x":13.5, "y":1, "w":1.5},
+ {"x":0, "y":2, "w":1.75},
+ {"x":1.75, "y":2},
+ {"x":2.75, "y":2},
+ {"x":3.75, "y":2},
+ {"x":4.75, "y":2},
+ {"x":5.75, "y":2},
+ {"x":6.75, "y":2},
+ {"x":7.75, "y":2},
+ {"x":8.75, "y":2},
+ {"x":9.75, "y":2},
+ {"x":10.75, "y":2},
+ {"x":11.75, "y":2},
+ {"x":12.75, "y":2, "w":2.25},
+ {"x":0, "y":3, "w":2.25},
+ {"x":2.25, "y":3},
+ {"x":3.25, "y":3},
+ {"x":4.25, "y":3},
+ {"x":5.25, "y":3},
+ {"x":6.25, "y":3},
+ {"x":7.25, "y":3},
+ {"x":8.25, "y":3},
+ {"x":9.25, "y":3},
+ {"x":10.25, "y":3},
+ {"x":11.25, "y":3},
+ {"x":12.25, "y":3, "w":2.75},
+ {"x":0, "y":4, "w":1.25},
+ {"x":1.25, "y":4, "w":1.25},
+ {"x":2.5, "y":4, "w":1.25},
+ {"x":3.75, "y":4, "w":6.25},
+ {"x":10, "y":4, "w":1.25},
+ {"x":11.25, "y":4, "w":1.25},
+ {"x":12.5, "y":4, "w":1.25},
+ {"x":13.75, "y":4, "w":1.25}
+ ]
+ },
+ "LAYOUT_60_iso": {
+ "key_count": 62,
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+ {"x":6, "y":0},
+ {"x":7, "y":0},
+ {"x":8, "y":0},
+ {"x":9, "y":0},
+ {"x":10, "y":0},
+ {"x":11, "y":0},
+ {"x":12, "y":0},
+ {"x":13, "y":0, "w":2},
+
+ {"x":0, "y":1, "w":1.5},
+ {"x":1.5, "y":1},
+ {"x":2.5, "y":1},
+ {"x":3.5, "y":1},
+ {"x":4.5, "y":1},
+ {"x":5.5, "y":1},
+ {"x":6.5, "y":1},
+ {"x":7.5, "y":1},
+ {"x":8.5, "y":1},
+ {"x":9.5, "y":1},
+ {"x":10.5, "y":1},
+ {"x":11.5, "y":1},
+ {"x":12.5, "y":1},
+
+ {"x":0, "y":2, "w":1.75},
+ {"x":1.75, "y":2},
+ {"x":2.75, "y":2},
+ {"x":3.75, "y":2},
+ {"x":4.75, "y":2},
+ {"x":5.75, "y":2},
+ {"x":6.75, "y":2},
+ {"x":7.75, "y":2},
+ {"x":8.75, "y":2},
+ {"x":9.75, "y":2},
+ {"x":10.75, "y":2},
+ {"x":11.75, "y":2},
+ {"x":12.75, "y":2},
+ {"x":13.75, "y":1, "w":1.25, "h":2},
+
+ {"x":0, "y":3, "w":1.25},
+ {"x":1.25, "y":3},
+ {"x":2.25, "y":3},
+ {"x":3.25, "y":3},
+ {"x":4.25, "y":3},
+ {"x":5.25, "y":3},
+ {"x":6.25, "y":3},
+ {"x":7.25, "y":3},
+ {"x":8.25, "y":3},
+ {"x":9.25, "y":3},
+ {"x":10.25, "y":3},
+ {"x":11.25, "y":3},
+ {"x":12.25, "y":3, "w":2.75},
+
+ {"x":0, "y":4, "w":1.25},
+ {"x":1.25, "y":4, "w":1.25},
+ {"x":2.5, "y":4, "w":1.25},
+ {"x":3.75, "y":4, "w":6.25},
+ {"x":10, "y":4, "w":1.25},
+ {"x":11.25, "y":4, "w":1.25},
+ {"x":12.5, "y":4, "w":1.25},
+ {"x":13.75, "y":4, "w":1.25}
+ ]
}
}
}
diff --git a/keyboards/yd60mq/keymaps/iso/keymap.c b/keyboards/yd60mq/keymaps/iso/keymap.c
new file mode 100644
index 00000000000..9a4debed77f
--- /dev/null
+++ b/keyboards/yd60mq/keymaps/iso/keymap.c
@@ -0,0 +1,28 @@
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+ _BL,
+ _FL,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ //,: Base Layer
+ [0] = LAYOUT_60_iso(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,
+ MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, LT(1,KC_RGHT)
+ ),
+
+ //,: Function Layer
+ [1] = LAYOUT_60_iso(
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
+ XXXXXXX, KC_BTN1, KC_MS_U, KC_BTN2, KC_WH_U, XXXXXXX, XXXXXXX, XXXXXXX, KC_UP, XXXXXXX, KC_PGUP, KC_HOME, KC_PSCR,
+ KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_WH_D, RGB_HUI, RGB_SAI, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_END, XXXXXXX, KC_MNXT,
+ KC_TRNS, RGB_MOD, RGB_RMOD, RGB_VAI, RGB_VAD, RGB_HUD, RGB_SAD, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY, KC_MPRV,
+ KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_SPI, RGB_SPD, XXXXXXX, KC_TRNS
+ )
+
+};
\ No newline at end of file
diff --git a/keyboards/yd60mq/readme.md b/keyboards/yd60mq/readme.md
index 0802c9d16f6..32073da6315 100644
--- a/keyboards/yd60mq/readme.md
+++ b/keyboards/yd60mq/readme.md
@@ -5,15 +5,25 @@
Customizable 60% PCB by [YMDK](https://ymdk.aliexpress.com/store/429151?spm=2114.10010108.0.0.3ab23641lIkgzm).
* Keyboard Maintainer: QMK Community
-* Hardware Supported: YD60MQ PCB, ATmega32U4
+* Hardware Supported: YD60MQ PCB
+ * 12led (unknown revision number, has 12 RGB LEDs on the back) – _default variant_
+ * 16led (unknown revision number, has 16 RGB LEDs on the back)
* Hardware Availability: [YMDK on AliExpress](https://www.aliexpress.com/i/32869207240.html)
Make example for this keyboard (after setting up your build environment):
- make yd60mq:default
+```sh
+make yd60mq:default # builds the 12 LED variant
+make yd60mq/12led:default # also builds the 12 LED variant
+make yd60mq/16led:default # builds the 16 LED variant
+```
The keyboard uses a DFU bootloader. To make a keymap and use dfu to flash it:
- make yd60mq:default:flash
+```sh
+make yd60mq:default:flash # builds and flashes the 12 LED variant
+make yd60mq/12led:default:flash # also builds and flashes the 12 LED variant
+make yd60mq/16led:default:flash # builds and flashes the 16 LED variant
+```
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).
diff --git a/keyboards/yd60mq/rules.mk b/keyboards/yd60mq/rules.mk
index 5159ae59f78..6619c187f4f 100644
--- a/keyboards/yd60mq/rules.mk
+++ b/keyboards/yd60mq/rules.mk
@@ -30,3 +30,7 @@ BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
AUDIO_ENABLE = no # Audio output on port C6
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+
+LAYOUTS = 60_ansi 60_iso
+
+DEFAULT_FOLDER = yd60mq/12led
diff --git a/keyboards/yd60mq/yd60mq.c b/keyboards/yd60mq/yd60mq.c
index a39af530d7d..bfe6b6c2de4 100644
--- a/keyboards/yd60mq/yd60mq.c
+++ b/keyboards/yd60mq/yd60mq.c
@@ -1,10 +1,12 @@
#include "yd60mq.h"
+__attribute__((weak))
void matrix_init_kb(void){
setPinOutput(F4);
writePinHigh(F4);
}
+__attribute__((weak))
bool led_update_kb(led_t led_state) {
bool res = led_update_user(led_state);
if (res) {
diff --git a/keyboards/yd60mq/yd60mq.h b/keyboards/yd60mq/yd60mq.h
index 850cf8d22c5..6b3824baa37 100644
--- a/keyboards/yd60mq/yd60mq.h
+++ b/keyboards/yd60mq/yd60mq.h
@@ -16,4 +16,33 @@
{ K40, K41, K42, K43, KC_NO, KC_NO, KC_NO, K47, K48, K49, K4A, K4B, K4C, K4D, KC_NO } \
}
+#define LAYOUT_60_ansi( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0E, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \
+ K40, K41, K42, K47, K49, K4A, K4C, K4D \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, KC_NO, K0E }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, KC_NO }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO }, \
+ { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, K3D, KC_NO }, \
+ { K40, K41, K42, KC_NO, KC_NO, KC_NO, KC_NO, K47, KC_NO, K49, K4A, KC_NO, K4C, K4D, KC_NO } \
+}
+
+#define LAYOUT_60_iso( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0E, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, K1c, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2c, K1d, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, K3d, \
+ K40, K41, K42, K47, K49, K4A, K4C, K4D \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, KC_NO, K0E }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1a, K1b, K1c, KC_NO, }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2a, K2b, K2c, K1d }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3a, K3b, KC_NO, K3d, KC_NO }, \
+ { K40, K41, K42, KC_NO, KC_NO, KC_NO, KC_NO, K47, KC_NO, K49, K4A, KC_NO, K4C, K4D, KC_NO } \
+}
+
+
#define LAYOUT LAYOUT_all
diff --git a/keyboards/ymd75/README.md b/keyboards/ymd75/README.md
index 9a618c59437..7c4779c9f55 100644
--- a/keyboards/ymd75/README.md
+++ b/keyboards/ymd75/README.md
@@ -1,19 +1,19 @@
# YMD75 / MT84
-75% keyboard from YMDK. YMDK sell the board and name it "YMD75", however the PCB has "MT84" printed on both sides.
+75% keyboard from YMDK. YMDK sell the board and name it "YMD75", however revision 1 of the PCB has "MT84" printed on both sides.
* Keyboard Maintainer: [Wayne K Jones](github.com/WarmCatUK)
-* Hardware Supported: YMD75/MT84 with the ATmega32a chip.
+* Hardware Supported: YMD75/MT84 (rev1 and rev2) with the ATmega32a chip.
* Hardware Availability:
Make example for this keyboard (after setting up your build environment):
- make ymd75:default
+ make ymd75/rev1:default
Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
- make ymd75:default:flash
+ make ymd75/rev1:default:flash
-**Reset Key**: Hold down the key located at *Key below the top right key*, commonly programmed as *Backspace* while plugging in the keyboard.
+**Reset Key**: Hold down the key located at *Key below the top right key*, commonly programmed as *Backspace* while plugging in the keyboard. On PCB revision 2, enter the bootloader by holding `L_CTRL` while plugging in the keyboard.
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).
diff --git a/keyboards/ymd75/config.h b/keyboards/ymd75/config.h
index ef7171cae6f..0ea23bc4632 100644
--- a/keyboards/ymd75/config.h
+++ b/keyboards/ymd75/config.h
@@ -25,18 +25,10 @@ along with this program. If not, see .
#define PRODUCT_ID 0x422D
#define DEVICE_VER 0x0200
-// TODO: share these strings with usbconfig.h
-// Edit usbconfig.h to change these.
#define MANUFACTURER YMDK
-#define PRODUCT ymd75 / mt84
+#define PRODUCT YMD75 / MT84
#define DESCRIPTION 75% Keyboard
-/* matrix size */
-#define MATRIX_ROWS 8
-#define MATRIX_COLS 15
-#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 DIODE_DIRECTION COL2ROW
#define BACKLIGHT_PIN D4
#define BACKLIGHT_LEVELS 12
diff --git a/keyboards/ymd75/keymaps/default/keymap.c b/keyboards/ymd75/keymaps/default/keymap.c
index 17c5244bd28..2b641246811 100644
--- a/keyboards/ymd75/keymaps/default/keymap.c
+++ b/keyboards/ymd75/keymaps/default/keymap.c
@@ -82,12 +82,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
switch(keycode) {
case P_MACRO:
- SEND_STRING(SS_DOWN(X_LALT));
- SEND_STRING(SS_TAP(X_KP_1));
- SEND_STRING(SS_TAP(X_KP_5));
- SEND_STRING(SS_TAP(X_KP_6));
- SEND_STRING(SS_UP(X_LALT));
- return false; break;
+ register_code(KC_LALT);
+ tap_code(KC_KP_1);
+ tap_code(KC_KP_5);
+ tap_code(KC_KP_6);
+ unregister_code(KC_LALT);
+ return false;
}
}
return true;
diff --git a/keyboards/ymd75/rev1/config.h b/keyboards/ymd75/rev1/config.h
new file mode 100644
index 00000000000..e9009ee0eb0
--- /dev/null
+++ b/keyboards/ymd75/rev1/config.h
@@ -0,0 +1,27 @@
+/*
+Base Copyright 2017 Luiz Ribeiro
+Modified 2017 Andrew Novak
+Modified 2018 Wayne Jones (WarmCatUK)
+
+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 .
+*/
+
+#pragma once
+
+/* matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 15
+#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 DIODE_DIRECTION COL2ROW
diff --git a/keyboards/ymd75/rev1/rev1.c b/keyboards/ymd75/rev1/rev1.c
new file mode 100644
index 00000000000..0870a6cc027
--- /dev/null
+++ b/keyboards/ymd75/rev1/rev1.c
@@ -0,0 +1,34 @@
+/*
+Copyright 2017 Luiz Ribeiro
+
+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 .
+*/
+
+#include "ymd75.h"
+
+void keyboard_pre_init_kb(void) {
+ led_init_ports();
+ keyboard_pre_init_user();
+}
+
+void led_init_ports(void) {
+ setPinOutput(D1);
+}
+
+bool led_update_kb(led_t led_state) {
+ if (led_update_user(led_state)) {
+ writePin(D1, led_state.caps_lock);
+ }
+ return true;
+}
diff --git a/keyboards/ymd75/rev1/rev1.h b/keyboards/ymd75/rev1/rev1.h
new file mode 100644
index 00000000000..0a426ffa571
--- /dev/null
+++ b/keyboards/ymd75/rev1/rev1.h
@@ -0,0 +1,39 @@
+/*
+Base Copyright 2017 Luiz Ribeiro
+Modified 2017 Andrew Novak
+Modified 2018 Wayne Jones (WarmCatUK)
+
+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 .
+*/
+
+#pragma once
+#include "quantum.h"
+
+#define LAYOUT( \
+K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, \
+K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, \
+K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, KD3, K67, \
+K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KD2, KE0, \
+K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, \
+K00, K10, K20, K56, K57, KB0, KC0, K96, K76, K66 \
+){ \
+{ K00, K10, K20, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KB0, KC0, KD0, KC_NO }, \
+{ K01, K11, K21, K31, K41, K51, KC_NO, KC_NO, KC_NO, KC_NO, KA1, KB1, KC_NO, KD1, KE1 }, \
+{ K02, K12, K22, K32, K42, K52, KC_NO, KC_NO, KC_NO, KC_NO, KA2, KB2, KC_NO, KD2, KE2 }, \
+{ K03, K13, K23, K33, K43, K53, KC_NO, KC_NO, KC_NO, KC_NO, KA3, KB3, KC3, KD3, KC_NO }, \
+{ K04, K14, K24, K34, K44, K54, KC_NO, KC_NO, KC_NO, KC_NO, KA4, KB4, KC4, KC_NO, KE4 }, \
+{ K05, KC_NO, K25, K35, K45, K55, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KB5, KC5, KD5, KE5 }, \
+{ K06, K16, K26, K36, K46, K56, K66, K76, K86, K96, KA6, KB6, KC6, KD6, KE6 }, \
+{ K07, K17, K27, K37, K47, K57, K67, K77, KE0, KC_NO, KA7, KB7, KC7, KD7, KE7 } \
+}
diff --git a/keyboards/ymd75/rev1/rules.mk b/keyboards/ymd75/rev1/rules.mk
new file mode 100644
index 00000000000..66ffbb499dd
--- /dev/null
+++ b/keyboards/ymd75/rev1/rules.mk
@@ -0,0 +1,15 @@
+# build options
+BOOTMAGIC_ENABLE = yes
+MOUSEKEY_ENABLE = no
+EXTRAKEY_ENABLE = yes
+CONSOLE_ENABLE = no
+COMMAND_ENABLE = yes
+BACKLIGHT_ENABLE = yes
+RGBLIGHT_ENABLE = yes
+WS2812_DRIVER = i2c
+NKRO_ENABLE = no
+# Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+
+KEY_LOCK_ENABLE = yes
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
diff --git a/keyboards/ymd75/rev2/config.h b/keyboards/ymd75/rev2/config.h
new file mode 100644
index 00000000000..9718b19dd1d
--- /dev/null
+++ b/keyboards/ymd75/rev2/config.h
@@ -0,0 +1,8 @@
+#pragma once
+
+/* matrix size */
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 15
+#define MATRIX_ROW_PINS { B7, B6, B5, B4, B3, B0 }
+#define MATRIX_COL_PINS { A0, A1, A2, A3, A4, A5, A6, A7, C7, C6, C5, C4, C3, C2, D7 }
+#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/ymd75/rev2/rev2.c b/keyboards/ymd75/rev2/rev2.c
new file mode 100644
index 00000000000..0870a6cc027
--- /dev/null
+++ b/keyboards/ymd75/rev2/rev2.c
@@ -0,0 +1,34 @@
+/*
+Copyright 2017 Luiz Ribeiro
+
+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 .
+*/
+
+#include "ymd75.h"
+
+void keyboard_pre_init_kb(void) {
+ led_init_ports();
+ keyboard_pre_init_user();
+}
+
+void led_init_ports(void) {
+ setPinOutput(D1);
+}
+
+bool led_update_kb(led_t led_state) {
+ if (led_update_user(led_state)) {
+ writePin(D1, led_state.caps_lock);
+ }
+ return true;
+}
diff --git a/keyboards/ymd75/rev2/rev2.h b/keyboards/ymd75/rev2/rev2.h
new file mode 100644
index 00000000000..b2dd7b8e1cd
--- /dev/null
+++ b/keyboards/ymd75/rev2/rev2.h
@@ -0,0 +1,18 @@
+#pragma once
+#include "quantum.h"
+
+#define LAYOUT( \
+ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K514, \
+ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K114, K513, \
+ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, \
+ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K313, K314, \
+ K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, \
+ K500, K501, K502, K505, K506, K507, K508, K509, K510, K511 \
+) { \
+ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014 }, \
+ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, KC_NO, K114 }, \
+ { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214 }, \
+ { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, KC_NO, K313, K314 }, \
+ { K400, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414 }, \
+ { K500, K501, K502, KC_NO, KC_NO, K505, K506, K507, K508, K509, K510, K511, KC_NO, K513, K514 } \
+}
diff --git a/keyboards/ymd75/rev2/rules.mk b/keyboards/ymd75/rev2/rules.mk
new file mode 100644
index 00000000000..66ffbb499dd
--- /dev/null
+++ b/keyboards/ymd75/rev2/rules.mk
@@ -0,0 +1,15 @@
+# build options
+BOOTMAGIC_ENABLE = yes
+MOUSEKEY_ENABLE = no
+EXTRAKEY_ENABLE = yes
+CONSOLE_ENABLE = no
+COMMAND_ENABLE = yes
+BACKLIGHT_ENABLE = yes
+RGBLIGHT_ENABLE = yes
+WS2812_DRIVER = i2c
+NKRO_ENABLE = no
+# Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+
+KEY_LOCK_ENABLE = yes
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
diff --git a/keyboards/ymd75/rules.mk b/keyboards/ymd75/rules.mk
index 9d584b2b418..437f9f4a52c 100644
--- a/keyboards/ymd75/rules.mk
+++ b/keyboards/ymd75/rules.mk
@@ -11,20 +11,4 @@ MCU = atmega32a
# ATmega328P USBasp
BOOTLOADER = bootloadHID
-# build options
-BOOTMAGIC_ENABLE = yes
-MOUSEKEY_ENABLE = no
-EXTRAKEY_ENABLE = yes
-CONSOLE_ENABLE = no
-COMMAND_ENABLE = yes
-BACKLIGHT_ENABLE = yes
-RGBLIGHT_ENABLE = yes
-WS2812_DRIVER = i2c
-NKRO_ENABLE = no
-# Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-
-DISABLE_WS2812 = no
-
-KEY_LOCK_ENABLE = yes
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+DEFAULT_FOLDER = ymd75/rev1
diff --git a/keyboards/ymd75/usbconfig.h b/keyboards/ymd75/usbconfig.h
deleted file mode 100644
index 0e570b9ec12..00000000000
--- a/keyboards/ymd75/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'Y', 'M', 'D', 'K'
-#define USB_CFG_VENDOR_NAME_LEN 4
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'Y','M','D','7','5',' ','K','e','y','b','o','a','r','d'
-#define USB_CFG_DEVICE_NAME_LEN 14
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/ymd75/ymd75.c b/keyboards/ymd75/ymd75.c
index 0870a6cc027..2fca021f785 100644
--- a/keyboards/ymd75/ymd75.c
+++ b/keyboards/ymd75/ymd75.c
@@ -1,34 +1 @@
-/*
-Copyright 2017 Luiz Ribeiro
-
-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 .
-*/
-
#include "ymd75.h"
-
-void keyboard_pre_init_kb(void) {
- led_init_ports();
- keyboard_pre_init_user();
-}
-
-void led_init_ports(void) {
- setPinOutput(D1);
-}
-
-bool led_update_kb(led_t led_state) {
- if (led_update_user(led_state)) {
- writePin(D1, led_state.caps_lock);
- }
- return true;
-}
diff --git a/keyboards/ymd75/ymd75.h b/keyboards/ymd75/ymd75.h
index 0c9fff58cbe..afeb095670f 100644
--- a/keyboards/ymd75/ymd75.h
+++ b/keyboards/ymd75/ymd75.h
@@ -1,55 +1,9 @@
-/*
-Base Copyright 2017 Luiz Ribeiro
-Modified 2017 Andrew Novak
-Modified 2018 Wayne Jones (WarmCatUK)
-
-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 .
-*/
-
-#ifndef KEYMAP_COMMON_H
-#define KEYMAP_COMMON_H
+#pragma once
#include "quantum.h"
-#include "quantum_keycodes.h"
-#include "keycode.h"
-#include "action.h"
-
-#define LAYOUT( \
-K05, K25, K35, K45, K55, K06, KA6, KA7, K07, KB5, KC5, KD5, KE5, KD1, KE1, KE2, \
-K04, K14, K24, K34, K44, K54, K16, KB6, KB7, K17, KA4, KB4, KC4, KE4, KD0, \
-K03, K13, K23, K33, K43, K53, K26, KC6, KC7, K27, KA3, KB3, KC3, KD3, K67, \
-K02, K12, K22, K32, K42, K52, K36, KD6, KD7, K37, KA2, KB2, KD2, KE0, \
-K01, K11, K21, K31, K41, K51, K46, KE6, KE7, K47, KA1, KB1, K86, K77, \
-K00, K10, K20, K56, K57, KB0, KC0, K96, K76, K66 \
-){ \
-{ K00, K10, K20, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KB0, KC0, KD0, KC_NO }, \
-{ K01, K11, K21, K31, K41, K51, KC_NO, KC_NO, KC_NO, KC_NO, KA1, KB1, KC_NO, KD1, KE1 }, \
-{ K02, K12, K22, K32, K42, K52, KC_NO, KC_NO, KC_NO, KC_NO, KA2, KB2, KC_NO, KD2, KE2 }, \
-{ K03, K13, K23, K33, K43, K53, KC_NO, KC_NO, KC_NO, KC_NO, KA3, KB3, KC3, KD3, KC_NO }, \
-{ K04, K14, K24, K34, K44, K54, KC_NO, KC_NO, KC_NO, KC_NO, KA4, KB4, KC4, KC_NO, KE4 }, \
-{ K05, KC_NO, K25, K35, K45, K55, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KB5, KC5, KD5, KE5 }, \
-{ K06, K16, K26, K36, K46, K56, K66, K76, K86, K96, KA6, KB6, KC6, KD6, KE6 }, \
-{ K07, K17, K27, K37, K47, K57, K67, K77, KE0, KC_NO, KA7, KB7, KC7, KD7, KE7 } \
-}
+#if defined(KEYBOARD_ymd75_rev1)
+ #include "rev1.h"
+#elif defined(KEYBOARD_ymd75_rev2)
+ #include "rev2.h"
#endif
-
-
-
-
-
-
-
-
-
diff --git a/keyboards/ymd96/config.h b/keyboards/ymd96/config.h
index ebb60242bea..6f50c7324dd 100644
--- a/keyboards/ymd96/config.h
+++ b/keyboards/ymd96/config.h
@@ -23,9 +23,8 @@ along with this program. If not, see .
#define VENDOR_ID 0x20A0
#define PRODUCT_ID 0x422D
#define DEVICE_VER 0x0200
-// Edit usbconfig.h to change these.
-#define MANUFACTURER ymdkey
-#define PRODUCT ymd96
+#define MANUFACTURER YMDK
+#define PRODUCT YMD96
/* matrix size */
#define MATRIX_ROWS 8
diff --git a/keyboards/ymd96/usbconfig.h b/keyboards/ymd96/usbconfig.h
deleted file mode 100644
index 83613384d7f..00000000000
--- a/keyboards/ymd96/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'y','m','d','k','e','y'
-#define USB_CFG_VENDOR_NAME_LEN 6
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'y','m','d','9','6'
-#define USB_CFG_DEVICE_NAME_LEN 5
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/ymdk/bface/config.h b/keyboards/ymdk/bface/config.h
index 0c12c328ecc..dfcfbcaa121 100644
--- a/keyboards/ymdk/bface/config.h
+++ b/keyboards/ymdk/bface/config.h
@@ -20,10 +20,8 @@ along with this program. If not, see .
#define VENDOR_ID 0x20A0
#define PRODUCT_ID 0x422D
#define DEVICE_VER 0x0200
-// You can edit those at usbconfig.h about line 250. These values will
-// unforunatly be ignored so far
#define MANUFACTURER YMDK
-#define PRODUCT bface
+#define PRODUCT B.face
/* matrix size */
#define MATRIX_ROWS 5
diff --git a/keyboards/ymdk/bface/usbconfig.h b/keyboards/ymdk/bface/usbconfig.h
deleted file mode 100644
index 7768c5cae51..00000000000
--- a/keyboards/ymdk/bface/usbconfig.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'Y', 'M', 'D', 'K'
-#define USB_CFG_VENDOR_NAME_LEN 4
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'b', 'f', 'a', 'c', 'e'
-#define USB_CFG_DEVICE_NAME_LEN 5
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/keyboards/ymdk/ymd09/config.h b/keyboards/ymdk/ymd09/config.h
index b7e5539df2b..372046b8bc4 100644
--- a/keyboards/ymdk/ymd09/config.h
+++ b/keyboards/ymdk/ymd09/config.h
@@ -60,7 +60,5 @@ along with this program. If not, see .
#define LOCKING_RESYNC_ENABLE
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
diff --git a/keyboards/ymdk_np21/config.h b/keyboards/ymdk_np21/config.h
index 291e6a896ba..3796634316b 100644
--- a/keyboards/ymdk_np21/config.h
+++ b/keyboards/ymdk_np21/config.h
@@ -22,10 +22,8 @@ along with this program. If not, see .
#define VENDOR_ID 0x20A0
#define PRODUCT_ID 0x422D
#define DEVICE_VER 0x0200
-// TODO: share these strings with usbconfig.h
-// Edit usbconfig.h to change these.
-#define MANUFACTURER ymdk
-#define PRODUCT np21
+#define MANUFACTURER YMDK
+#define PRODUCT NP21
/* matrix size */
#define MATRIX_ROWS 4
diff --git a/keyboards/ymdk_np21/usbconfig.h b/keyboards/ymdk_np21/usbconfig.h
deleted file mode 100644
index 4599c03dc90..00000000000
--- a/keyboards/ymdk_np21/usbconfig.h
+++ /dev/null
@@ -1,386 +0,0 @@
-/* Name: usbconfig.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2005-04-01
- * Tabsize: 4
- * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
- */
-
-#ifndef __usbconfig_h_included__
-#define __usbconfig_h_included__
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'j', 'j', '4', '0'
-#define USB_CFG_DEVICE_NAME_LEN 4
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
-
-#endif /* __usbconfig_h_included__ */
diff --git a/keyboards/yosino58/config.h b/keyboards/yosino58/config.h
index 4357a218d4a..fb1cdf3962a 100644
--- a/keyboards/yosino58/config.h
+++ b/keyboards/yosino58/config.h
@@ -24,11 +24,5 @@ along with this program. If not, see .
#define USE_I2C
#define USE_SERIAL
-#ifdef USE_Link_Time_Optimization
- // LTO has issues with macros (action_get_macro) and "functions" (fn_actions),
- // so just disable them
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-
- #define DISABLE_LEADER
-#endif // USE_Link_Time_Optimization
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
diff --git a/keyboards/yosino58/ssd1306.h b/keyboards/yosino58/ssd1306.h
index de0a9a02aa5..acaf6217ef0 100644
--- a/keyboards/yosino58/ssd1306.h
+++ b/keyboards/yosino58/ssd1306.h
@@ -2,7 +2,6 @@
#include
#include
-#include "pincontrol.h"
#include "action.h"
enum ssd1306_cmds {
@@ -93,4 +92,4 @@ void matrix_write_ln(struct CharacterMatrix *matrix, const char *data);
void matrix_write_P(struct CharacterMatrix *matrix, const char *data);
void matrix_render(struct CharacterMatrix *matrix);
-bool process_record_gfx(uint16_t keycode, keyrecord_t *record);
\ No newline at end of file
+bool process_record_gfx(uint16_t keycode, keyrecord_t *record);
diff --git a/keyboards/yurei/config.h b/keyboards/yurei/config.h
index da37d3ce88d..24d6229bdd1 100644
--- a/keyboards/yurei/config.h
+++ b/keyboards/yurei/config.h
@@ -192,10 +192,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/keyboards/yushakobo/quick7/config.h b/keyboards/yushakobo/quick7/config.h
new file mode 100644
index 00000000000..4fb8ba6d96d
--- /dev/null
+++ b/keyboards/yushakobo/quick7/config.h
@@ -0,0 +1,252 @@
+/*
+Copyright 2020 yushakobo
+
+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 .
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x3265
+#define PRODUCT_ID 0x0002
+#define DEVICE_VER 0x0001
+#define MANUFACTURER yushakobo
+#define PRODUCT quick7
+#define DESCRIPTION A simple macropad with rotary encoders.
+
+/* key matrix size */
+#define MATRIX_ROWS 3
+#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 DIRECT_PINS { \
+ { D2, D4, F4 }, \
+ { D7, B1, B3 }, \
+ { E6, B4, B2 }, \
+}
+
+#define ENCODERS_PAD_A { D1, F5 }
+#define ENCODERS_PAD_B { D0, F6 }
+
+#define UNUSED_PINS
+
+
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+#ifdef RGBLIGHT_ENABLE
+# define RGB_DI_PIN D3
+# define RGBLED_NUM 13
+# 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 userful 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
+
+/*
+ * Magic Key Options
+ *
+ * Magic keys are hotkey commands that allow control over firmware functions of
+ * the keyboard. They are best used in combination with the HID Listen program,
+ * found here: https://www.pjrc.com/teensy/hid_listen.html
+ *
+ * The options below allow the magic key functionality to be changed. This is
+ * useful if your keyboard/keypad is missing keys and you want magic key support.
+ *
+ */
+
+/* key combination for magic key command */
+/* defined by default; to change, uncomment and set to the combination you want */
+// #define IS_COMMAND() (get_mods() == MOD_MASK_SHIFT)
+
+/* control how magic key switches layers */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
+
+/* override magic key keymap */
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
+//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
+//#define MAGIC_KEY_HELP H
+//#define MAGIC_KEY_HELP_ALT SLASH
+//#define MAGIC_KEY_DEBUG D
+//#define MAGIC_KEY_DEBUG_MATRIX X
+//#define MAGIC_KEY_DEBUG_KBD K
+//#define MAGIC_KEY_DEBUG_MOUSE M
+//#define MAGIC_KEY_VERSION V
+//#define MAGIC_KEY_STATUS S
+//#define MAGIC_KEY_CONSOLE C
+//#define MAGIC_KEY_LAYER0 0
+//#define MAGIC_KEY_LAYER0_ALT GRAVE
+//#define MAGIC_KEY_LAYER1 1
+//#define MAGIC_KEY_LAYER2 2
+//#define MAGIC_KEY_LAYER3 3
+//#define MAGIC_KEY_LAYER4 4
+//#define MAGIC_KEY_LAYER5 5
+//#define MAGIC_KEY_LAYER6 6
+//#define MAGIC_KEY_LAYER7 7
+//#define MAGIC_KEY_LAYER8 8
+//#define MAGIC_KEY_LAYER9 9
+//#define MAGIC_KEY_BOOTLOADER B
+//#define MAGIC_KEY_BOOTLOADER_ALT ESC
+//#define MAGIC_KEY_LOCK CAPS
+//#define MAGIC_KEY_EEPROM E
+//#define MAGIC_KEY_EEPROM_CLEAR BSPACE
+//#define MAGIC_KEY_NKRO N
+//#define MAGIC_KEY_SLEEP_LED Z
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+
+/* disable these deprecated features by default */
+#ifndef LINK_TIME_OPTIMIZATION_ENABLE
+ #define NO_ACTION_MACRO
+ #define NO_ACTION_FUNCTION
+#endif
+/*
+ * MIDI options
+ */
+
+/* Prevent use of disabled MIDI features in the keymap */
+//#define MIDI_ENABLE_STRICT 1
+
+/* enable basic MIDI features:
+ - MIDI notes can be sent when in Music mode is on
+*/
+//#define MIDI_BASIC
+
+/* enable advanced MIDI features:
+ - MIDI notes can be added to the keymap
+ - Octave shift and transpose
+ - Virtual sustain, portamento, and modulation wheel
+ - etc.
+*/
+//#define MIDI_ADVANCED
+
+/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
+//#define MIDI_TONE_KEYCODE_OCTAVES 1
+
+/*
+ * 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
+*/
+
+/* Bootmagic Lite key configuration */
+// #define BOOTMAGIC_LITE_ROW 0
+// #define BOOTMAGIC_LITE_COLUMN 0
diff --git a/keyboards/yushakobo/quick7/info.json b/keyboards/yushakobo/quick7/info.json
new file mode 100644
index 00000000000..fd0f94a4ed9
--- /dev/null
+++ b/keyboards/yushakobo/quick7/info.json
@@ -0,0 +1,16 @@
+{
+ "keyboard_name": "quick7",
+ "url": "",
+ "maintainer": "yushakobo",
+ "width": 3,
+ "height": 2,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0},
+ {"x":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1},
+ {"x":0, "y":2}, {"x":1, "y":2}, {"x":2, "y":2}
+ ]
+ }
+ }
+}
diff --git a/keyboards/yushakobo/quick7/keymaps/default/keymap.c b/keyboards/yushakobo/quick7/keymaps/default/keymap.c
new file mode 100644
index 00000000000..3137f5853d2
--- /dev/null
+++ b/keyboards/yushakobo/quick7/keymaps/default/keymap.c
@@ -0,0 +1,72 @@
+/* Copyright 2020 yushakobo
+ *
+ * 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 .
+ */
+#include QMK_KEYBOARD_H
+
+// Defines names for use in layer keycodes and the keymap
+enum layer_names {
+ _BASE,
+ _FUNC1
+};
+
+// Defines the keycodes used by our macros in process_record_user
+enum custom_keycodes {
+ YUSHAURL = SAFE_RANGE
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Base */
+ [_BASE] = LAYOUT(
+ KC_MUTE, MO(_FUNC1), RGB_MOD,
+ S(KC_TAB), KC_UP, KC_TAB,
+ KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [_FUNC1] = LAYOUT(
+ RESET, KC_TRNS, RGB_TOG,
+ KC_HOME, KC_VOLU, KC_END,
+ KC_MPRV, KC_VOLD, KC_MNXT
+ )
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case YUSHAURL:
+ if (record->event.pressed) {
+ // when keycode QMKURL is pressed
+ SEND_STRING("https://yushakobo.jp/\n");
+ } else {
+ // when keycode QMKURL is released
+ }
+ break;
+ }
+ return true;
+}
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) { // Left encoder
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ }
+ else if (index == 1) { // Right encoder
+ if (clockwise) {
+ rgblight_decrease_hue_noeeprom();
+ } else {
+ rgblight_increase_hue_noeeprom();
+ }
+ }
+}
diff --git a/keyboards/yushakobo/quick7/keymaps/default/readme.md b/keyboards/yushakobo/quick7/keymaps/default/readme.md
new file mode 100644
index 00000000000..9db29d7ae6e
--- /dev/null
+++ b/keyboards/yushakobo/quick7/keymaps/default/readme.md
@@ -0,0 +1,25 @@
+# The default keymap for quick7
+
+### Base Layer
+```
+Left Encoder(CW: Vol+, CCW: Vol-)
+Right Encoder(CW: RGB HUE-, CCW: RGB HUE+)
+,----------- --------- ------------,
+| MUTE | Func1 | RGB MODE |
+ ----------- --------- ------------
+| Shift+Tab | UP | TAB |
+ ----------- --------- ------------
+| LEFT | DOWN | RIGHT |
+`----------- --------- ------------'
+```
+
+### Func1 Layer
+```
+,----------- --------- ------------,
+| RESET | Func1 | RGB TOGGLE |
+ ----------- --------- ------------
+| HOME | VOL+ | END |
+ ----------- --------- ------------
+| MEDIA << | VOL- | MEDIA >> |
+`----------- --------- ------------'
+```
\ No newline at end of file
diff --git a/keyboards/yushakobo/quick7/quick7.c b/keyboards/yushakobo/quick7/quick7.c
new file mode 100644
index 00000000000..632bcf1ae52
--- /dev/null
+++ b/keyboards/yushakobo/quick7/quick7.c
@@ -0,0 +1,17 @@
+/* Copyright 2020 yushakobo
+ *
+ * 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 .
+ */
+
+#include "quick7.h"
diff --git a/keyboards/yushakobo/quick7/quick7.h b/keyboards/yushakobo/quick7/quick7.h
new file mode 100644
index 00000000000..2e86487c7f5
--- /dev/null
+++ b/keyboards/yushakobo/quick7/quick7.h
@@ -0,0 +1,38 @@
+/* Copyright 2020 yushakobo
+ *
+ * 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 .
+ */
+
+#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, k11, k12, \
+ k20, k21, k22 \
+) \
+{ \
+ { k00, k01, k02 }, \
+ { k10, k11, k12 }, \
+ { k20, k21, k22 } \
+}
diff --git a/keyboards/yushakobo/quick7/readme.md b/keyboards/yushakobo/quick7/readme.md
new file mode 100644
index 00000000000..5e9f85c248e
--- /dev/null
+++ b/keyboards/yushakobo/quick7/readme.md
@@ -0,0 +1,15 @@
+# quick7
+
+
+
+A simple macropad for the beginners.
+
+* Keyboard Maintainer: [yushakobo](https://github.com/yushakobo)
+* Hardware Supported: quick7, Pro Micro (ATmega32U4)
+* Hardware Availability: (Under Preparation)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make yushakobo/quick7:default
+
+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).
diff --git a/keyboards/yushakobo/quick7/rules.mk b/keyboards/yushakobo/quick7/rules.mk
new file mode 100644
index 00000000000..3812422e1cf
--- /dev/null
+++ b/keyboards/yushakobo/quick7/rules.mk
@@ -0,0 +1,34 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# ATmega32A bootloadHID
+# ATmega328P USBasp
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+# if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no # USB Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+
+ENCODER_ENABLE = yes # Enable support for Rotary Encoder
diff --git a/keyboards/zinc/config.h b/keyboards/zinc/config.h
index 9c60d631bce..712db0ac6d2 100644
--- a/keyboards/zinc/config.h
+++ b/keyboards/zinc/config.h
@@ -40,11 +40,7 @@ along with this program. If not, see .
// ./tmk_core
// ......
-#ifdef USE_Link_Time_Optimization
- // LTO has issues with macros (action_get_macro) and "functions" (fn_actions),
- // so just disable them
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif // USE_Link_Time_Optimization
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
//#endif /* CONFIG_H */
diff --git a/keyboards/zinc/keymaps/toshi0383/keymap.c b/keyboards/zinc/keymaps/toshi0383/keymap.c
index 45863a71e02..72c3fee6f30 100644
--- a/keyboards/zinc/keymaps/toshi0383/keymap.c
+++ b/keyboards/zinc/keymaps/toshi0383/keymap.c
@@ -13,77 +13,32 @@ enum layer_names {
#define RAISE MO(_RAISE)
#define ADJUST MO(_ADJUST)
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { \
- /* Qwerty
- * ,-----------------------------------------. ,-----------------------------------------.
- * | Esc | Q | W | E | R | T | | Y | U | I | O | P |BSpace|
- * |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | Tab | A | S | D | F | G | | H | J | K | L |Shift | GUI |
- * |------+------+------+------+------+------| |------+------+------+------+------+------|
- * |Space | Z | X | C | V | B | | N | M | Ctrl | . | Alt | SCMD |
- * |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | GUI | | | |Lower |Enter | |Enter |Raise | | | | |
- * `-----------------------------------------' `-----------------------------------------'
- */
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_BASE] = LAYOUT_ortho_4x12(
- KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPACE, \
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPACE,
KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, SFT_T(KC_SCLN), KC_RGUI,
- KC_SPC, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_RCTL, KC_DOT, KC_RALT, RGUI(KC_RSFT), \
- KC_RGUI, _______, _______, _______, LOWER, KC_ENT, KC_ENT, RAISE, _______, _______, _______, _______ \
+ KC_SPC, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_RCTL, KC_DOT, KC_RALT, RGUI(KC_RSFT),
+ KC_LGUI, KC_LALT, _______, _______, LOWER, KC_ENT, KC_ENT, RAISE, _______, _______, _______, _______
),
- /* Lower
- * ,-----------------------------------------. ,-----------------------------------------.
- * | ~ | ! | @ | # | $ | % | | ^ | & | * | | | |
- * |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | < | > | ( | ) | ` | | - | { | } | [ | ] | | |
- * |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | | | | = | ? | | _ | + | , | . | / | |
- * |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | | | |------| TRSP | | TRSP | GUI | | | | |
- * `-----------------------------------------' `-----------------------------------------'
- */
- [_LOWER] = LAYOUT_ortho_4x12( \
- KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, _______, _______, _______,\
- _______, KC_LT, KC_GT, KC_LPRN, KC_RPRN, KC_GRV, KC_MINS, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_PIPE, \
- KC_LALT, _______, _______, _______, KC_EQL, KC_QUES, KC_UNDS, KC_PLUS, KC_COMM, _______, KC_SLSH, _______, \
- _______, _______, _______, KC_TRNS, _______, KC_TRNS, ADJUST, KC_RGUI, _______, _______, _______, _______ \
- ),
+ [_LOWER] = LAYOUT_ortho_4x12(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, _______, _______, _______,
+ _______, KC_LT, KC_GT, KC_LPRN, KC_RPRN, KC_GRV, KC_MINS, KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, KC_PIPE,
+ KC_LALT, _______, _______, _______, KC_EQL, KC_QUES, KC_UNDS, KC_PLUS, KC_COMM, _______, KC_SLSH, _______,
+ _______, _______, _______, _______, _______, KC_TRNS, KC_TRNS, KC_RGUI, _______, _______, _______, _______
+ ),
- /* Raise
- * ,-----------------------------------------. ,-----------------------------------------.
- * | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
- * |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | : | ; | " | ' | \ | | Left | Down | Up |Right | | |
- * |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | | | | | | |ADJUST| | | | | |
- * |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | | | | GUI |Shift | |Shift |------| | | | |
- * `-----------------------------------------' `-----------------------------------------'
- */
- [_RAISE] = LAYOUT_ortho_4x12( \
- _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \
- _______, KC_COLN, KC_SCLN, KC_DQT, KC_QUOT, KC_BSLS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, \
- _______, _______, _______, _______, _______, _______, ADJUST, _______, _______, _______, _______, _______, \
- _______, _______, _______, _______, KC_LGUI, KC_LSFT, KC_LSFT, _______, _______, _______, _______, _______ \
- ),
-
- /* Adjust (Lower + Raise)
- * ,-----------------------------------------. ,-----------------------------------------.
- * | | | | | | | | | | | | | |
- * |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | | | | | | | | | | | | |
- * |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | | | | | | | | | | | | |
- * |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | | | | |RESET | |------| | | | | |
- * `-----------------------------------------' `-----------------------------------------'
- */
- [_ADJUST] = LAYOUT_ortho_4x12( \
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
- _______, _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______ \
- ),
+ [_RAISE] = LAYOUT_ortho_4x12(
+ _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
+ _______, KC_COLN, KC_SCLN, KC_DQT, KC_QUOT, KC_BSLS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______,
+ _______, _______, _______, _______, _______, _______, ADJUST, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, KC_LGUI, KC_TRNS, KC_TRNS, _______, _______, _______, _______, _______
+ ),
+ [_ADJUST] = LAYOUT_ortho_4x12(
+ RGB_VAI, RGB_SAI, RGB_HUI, RGB_MOD, XXXXXXX, RGB_TOG, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX,
+ RGB_VAD, RGB_SAD, RGB_HUD, RGB_RMOD, XXXXXXX, XXXXXXX, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX,
+ KC_MUTE, KC_VOLD, KC_VOLU, KC_BRID, KC_BRIU, RESET, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LANG1, KC_LANG2,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_KANA
+ ),
};
diff --git a/layouts/community/60_ansi_split_bs_rshift/bcat/keymap.c b/layouts/community/60_ansi_split_bs_rshift/bcat/keymap.c
index ac5f2dcef71..c52302aeca6 100644
--- a/layouts/community/60_ansi_split_bs_rshift/bcat/keymap.c
+++ b/layouts/community/60_ansi_split_bs_rshift/bcat/keymap.c
@@ -2,12 +2,12 @@
enum layer {
LAYER_DEFAULT,
- LAYER_FUNCTION,
- LAYER_ADJUST,
+ LAYER_FUNCTION_1,
+ LAYER_FUNCTION_2,
};
-#define LY_FUNC MO(LAYER_FUNCTION)
-#define LY_ADJST MO(LAYER_ADJUST)
+#define LY_FN1 MO(LAYER_FUNCTION_1)
+#define LY_FN2 MO(LAYER_FUNCTION_2)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Default layer: http://www.keyboard-layout-editor.com/#/gists/327b41b5a933b3d44bf60ca9822e85dc */
@@ -15,25 +15,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, LY_FUNC,
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, LY_ADJST, KC_APP, KC_RCTL
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, LY_FN1,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, LY_FN2, KC_APP, KC_RCTL
),
- /* Function layer: http://www.keyboard-layout-editor.com/#/gists/c7a55e75285d474b6301140eaf53f915 */
- [LAYER_FUNCTION] = LAYOUT_60_ansi_split_bs_rshift(
+ /* Function 1 layer: http://www.keyboard-layout-editor.com/#/gists/c7a55e75285d474b6301140eaf53f915 */
+ [LAYER_FUNCTION_1] = LAYOUT_60_ansi_split_bs_rshift(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, _______,
- _______, _______, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, KC_DOWN, _______, _______,
+ _______, KC_APP, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, KC_DOWN, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
),
- /* Adjust layer: http://www.keyboard-layout-editor.com/#/gists/6e1068e4f91bbacccaf5ac0acbeec79c */
- [LAYER_ADJUST] = LAYOUT_60_ansi_split_bs_rshift(
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, BL_BRTG, KC_MPLY, KC_VOLU, KC_MSTP, _______, EEP_RST, RESET, _______, _______, _______, RGB_VAI, _______, _______,
- _______, BL_INC, KC_MPRV, KC_VOLD, KC_MNXT, _______, _______, RGB_SPI, RGB_HUI, RGB_SAI, RGB_RMOD, RGB_MOD, RGB_TOG,
- _______, BL_DEC, _______, KC_MUTE, _______, _______, _______, RGB_SPD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______,
+ /* Function 2 layer: http://www.keyboard-layout-editor.com/#/gists/6e1068e4f91bbacccaf5ac0acbeec79c */
+ [LAYER_FUNCTION_2] = LAYOUT_60_ansi_split_bs_rshift(
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
+ _______, _______, KC_MPLY, KC_VOLU, KC_MSTP, BL_BRTG, EEP_RST, RESET, _______, _______, _______, RGB_VAI, _______, _______,
+ _______, _______, KC_MPRV, KC_VOLD, KC_MNXT, BL_INC, _______, RGB_SPI, RGB_HUI, RGB_SAI, RGB_RMOD, RGB_MOD, RGB_TOG,
+ _______, _______, _______, KC_MUTE, _______, BL_DEC, _______, RGB_SPD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
),
};
diff --git a/layouts/community/60_ansi_split_bs_rshift/bcat/readme.md b/layouts/community/60_ansi_split_bs_rshift/bcat/readme.md
index d08ddb136d5..645da6cd0bb 100644
--- a/layouts/community/60_ansi_split_bs_rshift/bcat/readme.md
+++ b/layouts/community/60_ansi_split_bs_rshift/bcat/readme.md
@@ -1,26 +1,24 @@
# bcat's 60% ANSI split backspace/right-shift layout
-This is a hybrid of an HHKB layout and a standard ANSI bottom row. It's nice if
-you want to fill out a 60% case with no blockers, or just really want a 6.25U
-spacebar. The arrow and navigation keys match a standard HHKB layout using the
-Fn key next to the right shift key. Additionally, the redundant Fn key on the
-bottom row activates an adjust layer with controls for RGB underglow and
-backlight, as well as media keys centered around the ESDF cluster.
+This is a hybrid of a Tsangan/HHKB layout and a standard ANSI bottom row. It's
+not my favorite layout, but it's nice enough if you only have a 6.25u spacebar.
+Other than the bottom row, this is identical to my regular [Tsangan
+layout](https://github.com/qmk/qmk_firmware/tree/master/layouts/community/60_tsangan_hhkb/bcat).
## Default layer
-
+
([KLE](http://www.keyboard-layout-editor.com/#/gists/327b41b5a933b3d44bf60ca9822e85dc))
-## Function layer
+## Function 1 layer
-
+
([KLE](http://www.keyboard-layout-editor.com/#/gists/c7a55e75285d474b6301140eaf53f915))
-## Adjust layer
+## Function 2 layer
-
+
([KLE](http://www.keyboard-layout-editor.com/#/gists/6e1068e4f91bbacccaf5ac0acbeec79c))
diff --git a/layouts/community/60_tsangan_hhkb/bcat/keymap.c b/layouts/community/60_tsangan_hhkb/bcat/keymap.c
index ab639b05ff9..aa70c913295 100644
--- a/layouts/community/60_tsangan_hhkb/bcat/keymap.c
+++ b/layouts/community/60_tsangan_hhkb/bcat/keymap.c
@@ -2,12 +2,12 @@
enum layer {
LAYER_DEFAULT,
- LAYER_FUNCTION,
- LAYER_ADJUST,
+ LAYER_FUNCTION_1,
+ LAYER_FUNCTION_2,
};
-#define LY_FUNC MO(LAYER_FUNCTION)
-#define LY_ADJST LT(LAYER_ADJUST, KC_APP)
+#define LY_FN1 MO(LAYER_FUNCTION_1)
+#define LY_FN2 MO(LAYER_FUNCTION_2)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Default layer: http://www.keyboard-layout-editor.com/#/gists/86b33d75aa6f56d8781ab3d8475f4e77 */
@@ -15,25 +15,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, LY_FUNC,
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, LY_ADJST, KC_RCTL
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, LY_FN1,
+ KC_LCTL, LY_FN2, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
),
- /* Function layer: http://www.keyboard-layout-editor.com/#/gists/f6311fd7e315de781143b80eb040a551 */
- [LAYER_FUNCTION] = LAYOUT_60_tsangan_hhkb(
+ /* Function 1 layer: http://www.keyboard-layout-editor.com/#/gists/f6311fd7e315de781143b80eb040a551 */
+ [LAYER_FUNCTION_1] = LAYOUT_60_tsangan_hhkb(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, _______,
- _______, _______, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, KC_DOWN, _______, _______,
+ _______, KC_APP, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, KC_DOWN, _______, _______,
_______, _______, _______, _______, _______, _______, _______
),
- /* Adjust layer: http://www.keyboard-layout-editor.com/#/gists/65ac939caec878401603bc36290852d4 */
- [LAYER_ADJUST] = LAYOUT_60_tsangan_hhkb(
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, BL_BRTG, KC_MPLY, KC_VOLU, KC_MSTP, _______, EEP_RST, RESET, _______, _______, _______, RGB_VAI, _______, _______,
- _______, BL_INC, KC_MPRV, KC_VOLD, KC_MNXT, _______, _______, RGB_SPI, RGB_HUI, RGB_SAI, RGB_RMOD, RGB_MOD, RGB_TOG,
- _______, BL_DEC, _______, KC_MUTE, _______, _______, _______, RGB_SPD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______,
+ /* Function 2 layer: http://www.keyboard-layout-editor.com/#/gists/65ac939caec878401603bc36290852d4 */
+ [LAYER_FUNCTION_2] = LAYOUT_60_tsangan_hhkb(
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
+ _______, _______, KC_MPLY, KC_VOLU, KC_MSTP, BL_BRTG, EEP_RST, RESET, _______, _______, _______, RGB_VAI, _______, _______,
+ _______, _______, KC_MPRV, KC_VOLD, KC_MNXT, BL_INC, _______, RGB_SPI, RGB_HUI, RGB_SAI, RGB_RMOD, RGB_MOD, RGB_TOG,
+ _______, _______, _______, KC_MUTE, _______, BL_DEC, _______, RGB_SPD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______,
_______, _______, _______, _______, _______, _______, _______
),
};
diff --git a/layouts/community/60_tsangan_hhkb/bcat/readme.md b/layouts/community/60_tsangan_hhkb/bcat/readme.md
index eb6722261e3..b4eddfcf045 100644
--- a/layouts/community/60_tsangan_hhkb/bcat/readme.md
+++ b/layouts/community/60_tsangan_hhkb/bcat/readme.md
@@ -1,25 +1,44 @@
# bcat's 60% Tsangan HHKB layout
-This is a normal Tsangan/HHKB (split backspace, split right shift) layout with
-arrow and navigation keys that match a standard HHKB layout. Additionally, the
-redundant right Super key on the bottom row actives an adjust layer with
-controls for RGB underglow and backlight, as well as media keys centered around
-the ESDF cluster.
+This is a Tsangan/HHKB (split backspace, split right shift) layout following
+the [traditional HHKB layout](https://deskthority.net/wiki/HHKB_Professional2)
+with a few changes:
+
+* The Delete key is mapped as Backspace (HHKB DIP switch 3).
+
+* The Alt and Super keys are swapped to put Alt directly adjacent to the
+spacebar (HHKB DIP switch 5).
+
+* The left Super key is replaced with another Function key (HHKB DIP switch 2).
+Unlike on the real HHKB, this key triggers a different Function 2 layer. (This
+also helps prevent accidental Super key presses while gaming.)
+
+* The Function 2 layer contains reset keys, RGB underglow and backlight
+controls (in place of the arrow and navigation keys), and media controls
+(centered around the ESDF cluster).
+
+* The Function 2 layer also has the F1-F12 keys mapped just like the Function 1
+layer. This is a concession to gaming because it enables these keys to be
+easily typed with the left hand, without taking the right hand off the mouse.
+
+* The leftmost and rightmost bottom row keys are mapped to Ctrl rather than
+anything more useful because most of my Tsangan PCBs actually have HHKB plates
+and/or blockers, so there aren't switches installed in those positions.
## Default layer
-
+
([KLE](http://www.keyboard-layout-editor.com/#/gists/86b33d75aa6f56d8781ab3d8475f4e77))
-## Function layer
+## Function 1 layer
-
+
([KLE](http://www.keyboard-layout-editor.com/#/gists/f6311fd7e315de781143b80eb040a551))
-## Adjust layer
+## Function 2 layer
-
+
([KLE](http://www.keyboard-layout-editor.com/#/gists/65ac939caec878401603bc36290852d4))
diff --git a/layouts/community/60_tsangan_hhkb/yanfali_wkl/keymap.c b/layouts/community/60_tsangan_hhkb/yanfali_wkl/keymap.c
new file mode 100644
index 00000000000..697807bdab4
--- /dev/null
+++ b/layouts/community/60_tsangan_hhkb/yanfali_wkl/keymap.c
@@ -0,0 +1,25 @@
+#include QMK_KEYBOARD_H
+
+enum layer {
+ BASE,
+ FN,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [BASE] = LAYOUT_60_tsangan_hhkb(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ LCTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(FN),
+ KC_LALT, KC_NO, KC_LGUI, KC_SPC, KC_RGUI, KC_NO, KC_RALT
+ ),
+
+ [FN] = LAYOUT_60_tsangan_hhkb(
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
+ _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, EEP_RST, RESET,
+ KC_CAPS, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______
+ ),
+
+};
diff --git a/layouts/community/65_ansi_blocker_split_bs/bcat/keymap.c b/layouts/community/65_ansi_blocker_split_bs/bcat/keymap.c
new file mode 100644
index 00000000000..221fcfba598
--- /dev/null
+++ b/layouts/community/65_ansi_blocker_split_bs/bcat/keymap.c
@@ -0,0 +1,28 @@
+#include QMK_KEYBOARD_H
+
+enum layer {
+ LAYER_DEFAULT,
+ LAYER_FUNCTION,
+};
+
+#define LY_FN MO(LAYER_FUNCTION)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Default layer: http://www.keyboard-layout-editor.com/#/gists/dd675b40cc4df2c7bb78847ac29f5988 */
+ [LAYER_DEFAULT] = LAYOUT_65_ansi_blocker_split_bs(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_PGUP,
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, LY_FN, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ /* Function layer: http://www.keyboard-layout-editor.com/#/gists/f29128427f674c43777f045e363d1b44 */
+ [LAYER_FUNCTION] = LAYOUT_65_ansi_blocker_split_bs(
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, _______,
+ KC_CAPS, _______, KC_MPLY, KC_VOLU, KC_MSTP, _______, EEP_RST, RESET, KC_PSCR, KC_SLCK, KC_PAUS, _______, _______, _______, _______,
+ _______, _______, KC_MPRV, KC_VOLD, KC_MNXT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_APP, _______, KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+};
diff --git a/layouts/community/65_ansi_blocker_split_bs/bcat/readme.md b/layouts/community/65_ansi_blocker_split_bs/bcat/readme.md
new file mode 100644
index 00000000000..c7ea966d8d4
--- /dev/null
+++ b/layouts/community/65_ansi_blocker_split_bs/bcat/readme.md
@@ -0,0 +1,17 @@
+# bcat's 65% ANSI blocker split backspace layout
+
+This is a standard 65% keyboard layout, with a blocker to the left of the arrow
+keys, an HHKB-style (split) backspace, and media controls in the function layer
+(centered around the ESDF cluster).
+
+## Default layer
+
+
+
+([KLE](http://www.keyboard-layout-editor.com/#/gists/dd675b40cc4df2c7bb78847ac29f5988))
+
+## Function layer
+
+
+
+([KLE](http://www.keyboard-layout-editor.com/#/gists/f29128427f674c43777f045e363d1b44))
diff --git a/layouts/community/75_ansi/spidey3/keymap.c b/layouts/community/75_ansi/spidey3/keymap.c
new file mode 100644
index 00000000000..fbb6a980621
--- /dev/null
+++ b/layouts/community/75_ansi/spidey3/keymap.c
@@ -0,0 +1,44 @@
+#include "spidey3.h"
+
+#define CH_MENU A(S(KC_S))
+#define OSX_PSC G(S(KC_4))
+#define FN_MENU LT(_FN,KC_APP)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ // Linux / Win layout
+ [_BASE] = LAYOUT_75_ansi(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_INS, KC_DEL,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, FN_MENU, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ // OSX layout
+ [_OSX] = LAYOUT_75_ansi(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, OSX_PSC, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_LALT, KC_LGUI, _______, _______, _______, _______, _______, _______, _______
+ ),
+ // Numpad
+ [_NUMPAD] = LAYOUT_75_ansi(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_NUMLOCK, KC_PEQL, KC_PSLS, KC_PAST, XXXXXXX, XXXXXXX, _______, _______, _______,
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_NUMLOCK, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_7, KC_KP_8, KC_KP_9, KC_PSLS, KC_PMNS, KC_PEQL, _______, _______,
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_4, KC_KP_5, KC_KP_6, KC_PAST, _______, _______, _______, _______,
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_1, KC_KP_2, KC_KP_3, KC_PMNS, KC_SCLN, KC_PENT, _______,
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_KP_0, KC_PDOT, KC_PCMM, KC_PPLS, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+ // FN
+ [_FN] = LAYOUT_75_ansi(
+ RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_SLEP, KC_WAKE, KC_PWR,
+ EEP_RST, _______, _______, _______, _______, _______, _______, _______, X_BUL, KC_MPRV, KC_MNXT, X_DASH, _______, KC_PAUS, KC_SLCK,
+ _______, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, RGB_SPD, RGB_SPI, VLK_TOG, _______, _______, KC_BRIU,
+ _______, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_G, RGB_M_T, SPI_LNX, _______, _______, _______, KC_BRID,
+ _______, SPI_GLO, _______, SPI_WIN, _______, NK_TOGG, TG(_NUMPAD),SPI_OSX, X(LARR), X(RARR), DEBUG, _______, KC_VOLU, KC_MUTE,
+ _______, _______, _______, KC_MPLY, KC_APP, _______, CH_MENU, KC_MPRV, KC_VOLD, KC_MNXT
+ )
+};
diff --git a/layouts/community/75_ansi/spidey3/readme.md b/layouts/community/75_ansi/spidey3/readme.md
new file mode 100644
index 00000000000..409d6e5f81f
--- /dev/null
+++ b/layouts/community/75_ansi/spidey3/readme.md
@@ -0,0 +1,14 @@
+Copyright 2020 Joshua Diamond josh@windowoffire.com @spidey3
+
+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 .
diff --git a/layouts/community/75_ansi/spidey3/rules.mk b/layouts/community/75_ansi/spidey3/rules.mk
new file mode 100644
index 00000000000..fdb44b3ea55
--- /dev/null
+++ b/layouts/community/75_ansi/spidey3/rules.mk
@@ -0,0 +1,18 @@
+# Build Options
+# comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = no
+RGBLIGHT_ENABLE = yes
+UNICODEMAP_ENABLE = yes
+VELOCIKEY_ENABLE = yes
+
+# The following disabled to save space
+SPACE_CADET_ENABLE = no
diff --git a/layouts/community/ergodox/333fred/config.h b/layouts/community/ergodox/333fred/config.h
index 82255e05ec7..5a91ea3aa4e 100644
--- a/layouts/community/ergodox/333fred/config.h
+++ b/layouts/community/ergodox/333fred/config.h
@@ -1,7 +1,6 @@
#pragma once
#include QMK_KEYBOARD_CONFIG_H
-#include "333fred_config.h"
#undef TAPPING_TERM
#define TAPPING_TERM 200
diff --git a/layouts/community/ergodox/333fred/rules.mk b/layouts/community/ergodox/333fred/rules.mk
index 1549bcfc84d..f6c71feb462 100644
--- a/layouts/community/ergodox/333fred/rules.mk
+++ b/layouts/community/ergodox/333fred/rules.mk
@@ -1,7 +1,5 @@
LCD_BACKLIGHT_ENABLE = yes
LCD_ENABLE = yes
BACKLIGHT_ENABLE = yes
-NKRO_ENABLE = yes
KEY_LOCK_ENABLE = yes
-TAP_DANCE_ENABLE = yes
CONSOLE_ENABLE = no
diff --git a/layouts/community/ergodox/drashna/config.h b/layouts/community/ergodox/drashna/config.h
index ce25b0646bf..8f1c9f6a2a6 100644
--- a/layouts/community/ergodox/drashna/config.h
+++ b/layouts/community/ergodox/drashna/config.h
@@ -15,7 +15,7 @@
#define PRODUCT DrashnaDox - Hacked ErgoDox EZ Hybrid Monstrosity
#undef DEBOUNCE
-#define DEBOUNCE 30
+#define DEBOUNCE 60
#define TAPPING_TERM_PER_KEY
diff --git a/layouts/community/ergodox/drashna/rules.mk b/layouts/community/ergodox/drashna/rules.mk
index 78a3d15840a..387bd20f68d 100644
--- a/layouts/community/ergodox/drashna/rules.mk
+++ b/layouts/community/ergodox/drashna/rules.mk
@@ -1,8 +1,7 @@
BOOTMAGIC_ENABLE = lite
-TAP_DANCE_ENABLE = no
-SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+TAP_DANCE_ENABLE = yes
COMMAND_ENABLE = no # Commands for debug and configuration
-CONSOLE_ENABLE = no
+CONSOLE_ENABLE =
SPACE_CADET_ENABLE = no
ifeq ($(strip $(KEYBOARD)), ergodox_ez)
@@ -10,7 +9,7 @@ ifeq ($(strip $(KEYBOARD)), ergodox_ez)
RGB_MATRIX_ENABLE = yes
RGBLIGHT_TWINKLE = no
INDICATOR_LIGHTS = no
- RGBLIGHT_STARTUP_ANIMATION = no
+ RGBLIGHT_STARTUP_ANIMATION = yes
endif
UNICODE_ENABLE = yes
diff --git a/layouts/community/ergodox/j3rn/keymap.c b/layouts/community/ergodox/j3rn/keymap.c
index 8209c9c63e8..ae084b6e92a 100644
--- a/layouts/community/ergodox/j3rn/keymap.c
+++ b/layouts/community/ergodox/j3rn/keymap.c
@@ -10,11 +10,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
*
* ,--------------------------------------------------. ,--------------------------------------------------.
- * | Grv | 1 | 2 | 3 | 4 | 5 | [ | | ] | 6 | 7 | 8 | 9 | 0 | BkSp |
+ * | Sleep | 1 | 2 | 3 | 4 | 5 | [ | | ] | 6 | 7 | 8 | 9 | 0 | BkSp |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
- * | Tab | Q | W | E | R | T | - | | = | Y | U | I | O | P | \ |
+ * | Esc | Q | W | E | R | T | - | | = | Y | U | I | O | P | \ |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
- * |Ctrl/Esc| A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
+ * |Ctrl/Esc| A | S/Sft| D/Ctl| F/Alt| G |------| |------| H | J/Alt| K/Ctl| L/Sft| ; | ' |
* |--------+------+------+------+------+------| Hyper| | Meh |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
@@ -32,21 +32,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// Otherwise, it needs KC_*
[BASE] = LAYOUT_ergodox( // layer 0 : default
// left hand
- KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LBRC,
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_MINS,
- CTL_T(KC_ESC), KC_A, KC_S, KC_D, KC_F, KC_G,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
- MO(SYMB), KC_LALT, LALT(KC_LSFT), KC_LEFT,KC_RGHT,
+ KC_SLEP, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LBRC,
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_MINS,
+ CTL_T(KC_ESC), KC_A, LSFT_T(KC_S), LCTL_T(KC_D), LALT_T(KC_F), KC_G,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
+ MO(SYMB), KC_LALT, LALT(KC_LSFT), KC_LEFT, KC_RGHT,
- ALT_T(KC_APP), KC_HOME,
+ ALT_T(KC_APP), KC_HOME,
KC_END,
KC_SPC,KC_LGUI,MO(MDIA),
// right hand
- KC_RBRC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
- KC_EQL, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
- KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
- MEH_T(KC_NO),KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT,
- KC_UP, KC_DOWN,RALT(KC_RSFT), KC_RALT, MO(SYMB),
+ KC_RBRC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_EQL, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_H, RALT_T(KC_J), RCTL_T(KC_K), RSFT_T(KC_L), KC_SCLN, KC_QUOT,
+ MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_UP, KC_DOWN, RALT(KC_RSFT), KC_RALT, MO(SYMB),
KC_PGUP, CTL_T(KC_ESC),
KC_PGDN,
diff --git a/layouts/community/ergodox/j3rn/readme.md b/layouts/community/ergodox/j3rn/readme.md
index 92883b4516f..23071482a33 100644
--- a/layouts/community/ergodox/j3rn/readme.md
+++ b/layouts/community/ergodox/j3rn/readme.md
@@ -1,8 +1,8 @@
-# J3RN's Mac-Centric ErgoDox EZ keymap
+# J3RN's ErgoDox EZ keymap
## Motivation
-Essentially, I wanted to switch to a layout that was less jarring than the default ErgoDox EZ layout, and did not require finger gymnastics to perform common OS X shortcuts (most of which involve the CMD (LGui) key).
+I wanted a layout that was gave easy access to the CMD (LGui) key, and did not require finger gymnastics to use my beloved Emacs shortcuts.
## How is it different from the default ErgoDox EZ default_osx layout?
@@ -10,24 +10,28 @@ This layout more closely resembles that of the Mac keyboard, and has some other
### Mac-like changes
-- **The key to the left of "1" is "~" instead of "=".**
- **The key to the right of "0" is Backspace instead of "-"** (misleadingly labeled "delete" on the Mac's keyboard). There was no room to fit in "-" and "=" between "0" and Backspace, unfortunately.
-- **The key to the left of "Q" is Tab instead of Delete.**
- **The rightmost big key on the left thumb is CMD (LGui) instead of Backspace.**
- **The key to the left of Alt-Shift is an Alt key**. This is close to it's position on the Mac keyboard, though slightly further left.
+### Emacs changes
+- **Holding "S" sends "left shift," holding "D" sends "left control," and holding "F" sends "left alt." This is mirrored on the right side with "J," "K," and "L."** This should make it easy to use those crazy Escape-Meta-Alt-Control-Shift bindings.
+
### Other changes
+- **The button in the top-left is "Sleep."** Before macOS High Sierra, the power button was part of the key combination for triggering sleep. Since there's no power key in my layout, I was unable to sleep my laptop with this keyboard. By adding a dedicated sleep key, I fixed this. Now I just need a cool moon keycap for that key.
+- **The middle-most big key on the right thumb is "Tab."** I use tab *a lot*, so I decided to make it incredibly convenient.
+- **The button to the left of "Q" is Esc.** There is no functional reason for this other than to train me to use the tab under my right thumb.
- **The button to the left of "A" is Ctrl/Esc instead of Backspace.** This is actually how I have the keyboard on my Macbook set up to be, since it's loads more convenient than a CAPS LOCK key. This is the Ctrl key I find myself using most.
- **Mouse uses Vim-style navigation**. This allows you to move the mouse around with hjkl just like in Vim. Additionally, right and left click are the conveniently placed 'i' and 'o' keys.
- **The key to the right of "5" and the key to left of "6" are "[" and "]", respectively, instead of Left and Right.** There is a more convenient set of Left and Right already present. Truth be told, I don't really use these keys, as they are a stretch to reach.
- **The Toggle L1 keys in the center of the keyboard have been replaced by the otherwise displaced "-" and "=".** They are laid out, left-to-right, in the same order as on the Mac keyboard. Honestly, they are not terribly conveniently placed, and their placement might change in a later version. I found that the ~L1 would be better situated elsewhere.
-- **The "~" key in the extreme bottom-left is now just momentary L1.** The "~" key was moved to the top-left as mentioned before, and I like to keep my multi-use keys to a minimum due to the latency for them to switch from "press" to "hold."
+- **The "~" key in the extreme bottom-left is now just momentary L1.** I go to L1 (the symbol layer) to get to "~".
- **The Home and End buttons have been shifted up on the left thumb, and ~L2 inserted below them.** Nearly all of my media layer changes are on the right side, so the ~L2 key is on the left side.
- **The Page Up and Page Down buttons have been shifted up on the right thumb, and ~L1 inserted below them.** I don't use either of the "Page" keys often, and use this ~L1 more than any other.
- **Traditional numpad layout.** The base of most numpads is a double-wide "0" key to the left of a "." key. This is reflected in my layout by having two "0" keys to the left of a "." key.
- **The function keys (F1-F12) have been moved to L2.** They were in the way in L1.
- **⏯ lives on ',' in the media layer, between ⏪ on 'm' and ⏩ on '.'.** This is the way they are laid out on the mac keyboard, and makes the most sense to me.
-- **The keys on the bottom-right that were formerly "[" and "]" are now Alt-Shift and Alt, respectively.** This enables me to do those `C-M-` bindings in emacs. I use L1 for "[" and "]".
+- **The keys on the bottom-right that were formerly "[" and "]" are now Alt-Shift and Alt, respectively.** This was originally for convenience with Emacs bindings, but since I've moved the modifiers to the home row the only purpose for this change is that the symmetry makes me happy.
**I'm always open to feedback and/or suggestions!**
diff --git a/layouts/community/ergodox/xyverz/keymap.c b/layouts/community/ergodox/xyverz/keymap.c
index 3131c30640b..c77920bb13f 100644
--- a/layouts/community/ergodox/xyverz/keymap.c
+++ b/layouts/community/ergodox/xyverz/keymap.c
@@ -1,9 +1,11 @@
/*
* About this keymap:
- *
- * The Dvorak layout shown herestems from my early Kinesis years, using the Contour PS/2 with a Dvorak
+ *
+ * The Dvorak layout shown here stems from my early Kinesis years, using the Contour PS/2 with a Dvorak
* software layout. Because of this, the RBRC and LBRC were on opposite sides of the board in the corner
- * keys. I've decided to continue using this layout with my ErgoDox.
+ * keys. When I originally set up this keymap, I'd decided to continue using this layout with my ErgoDox.
+ * I've since modified my layout to be more effective for me and to more closely match my other ortho
+ * keyboard layouts
*
* The QWERTY layout shown here is based entirely on the Kinesis Advantage layout, with the additional
* keys as shown in the diagrams. The Colemak layout is merely an adaptation of that.
@@ -11,39 +13,47 @@
* I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar to the default Planck
* layouts.
*
+ * What's New:
+ *
+ * I've overhauled this Dvorak layout a bit to more match what I've got on my other Ortho boards. For
+ * some keys, I'm moving away from my old Kinesis keymap and adding the brackets and braces to the
+ * inner column vertical keys. I figure this will help me have better ease of use. In this update, I
+ * have also removed the keypad layer since I no longer use that at all, and have remapped the MEDIA
+ * layer a bit.
+ *
*/
#include QMK_KEYBOARD_H
-#include "debug.h"
-#include "action_layer.h"
-#include "eeconfig.h"
-extern keymap_config_t keymap_config;
+enum layer_names {
+ _DVORAK,
+ _QWERTY,
+ _COLEMAK,
+ _MEDIA,
+};
-#define _DV 0 // Dvorak layer
-#define _QW 1 // Qwerty layer
-#define _CM 2 // Colemak layer
-#define _MD 3 // Media Layer
-#define _KP 4 // Keypad Layer
+enum custom_keycodes { DVORAK = SAFE_RANGE, QWERTY, COLEMAK };
-// Macro name shortcuts
-#define DVORAK M(_DV)
-#define QWERTY M(_QW)
-#define COLEMAK M(_CM)
+// Aliases to make the keymap more uniform
+#define GUI_END GUI_T(KC_END)
+#define MEDIA MO(_MEDIA)
+#define MACLOCK LGUI(LCTL(KC_Q))
+
+// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layer 0 : Dvorak
* ,--------------------------------------------------. ,--------------------------------------------------.
- * | = | 1 | 2 | 3 | 4 | 5 | ESC | | ESC | 6 | 7 | 8 | 9 | 0 | / |
+ * | ESC | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | ~ |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | ' | , | . | P | Y | | | | F | G | C | R | L | \ |
- * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * |--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------|
* | CapsLk | A | O | E | U | I |------| |------| D | H | T | N | S | - |
- * |--------+------+------+------+------+------| _MD | | _KP |------+------+------+------+------+--------|
+ * |--------+------+------+------+------+------| { | | } |------+------+------+------+------+--------|
* | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
- * | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI |
+ * |MEDIA | ` | ~ | Left | Rght | | Up | Dn | / | = | MEDIA|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
* | LCTL | LALT | | RALT | RCTL |
@@ -54,65 +64,69 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `--------------------' `--------------------'
*
*/
-[_DV] = LAYOUT_ergodox(
+
+[_DVORAK] = LAYOUT_ergodox(
// left hand
- KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC,
- KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, XXXXXXX,
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, XXXXXXX,
+ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_LBRC,
KC_CAPS, KC_A, KC_O, KC_E, KC_U, KC_I,
- KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, MO(_MD),
- KC_LGUI, KC_GRV, KC_INS, KC_LEFT, KC_RGHT,
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_LCBR,
+ MEDIA, KC_GRV, KC_TILD, KC_LEFT, KC_RGHT,
+ // left thumb
KC_LCTL, KC_LALT,
KC_HOME,
- KC_BSPC, KC_DEL, KC_END,
+ KC_BSPC, KC_DEL, GUI_END,
// right hand
- KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SLSH,
- XXXXXXX, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS,
+ XXXXXXX, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SLSH,
+ KC_RBRC, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSLS,
KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINS,
- MO(_KP), KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT,
- KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, KC_RGUI,
- KC_RALT, KC_RCTL,
+ KC_RCBR, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT,
+ KC_UP, KC_DOWN, KC_SLSH, KC_EQL, MEDIA,
+ // right thumb
+ KC_RGUI, KC_RCTL,
KC_PGUP,
KC_PGDN, KC_ENT, KC_SPC
),
-
/* Layer 1: QWERTY
* ,--------------------------------------------------. ,--------------------------------------------------.
- * | = | 1 | 2 | 3 | 4 | 5 | ESC | | ESC | 6 | 7 | 8 | 9 | 0 | - |
+ * | ESC | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | E | R | T | | | | Y | U | I | O | P | \ |
- * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * |--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------|
* | CapsLk | A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
- * |--------+------+------+------+------+------| _MD | | _KP |------+------+------+------+------+--------|
+ * |--------+------+------+------+------+------| { | | } |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
- * | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI |
+ * |MEDIA | ` | = | Left | Rght | | Up | Dn | [ | ] | MEDIA|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
- * | LCTL | LALT | | RALT | RCTL |
+ * | LCTL | LALT | | RGUI | RCTL |
* ,------|------|------| |------+------+------.
* | | | Home | | PgUp | | |
* | BkSp | Del |------| |------| Enter| Space|
* | | | End | | PgDn | | |
* `--------------------' `--------------------'
*/
-[_QW] = LAYOUT_ergodox(
+[_QWERTY] = LAYOUT_ergodox(
// left hand
- KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT,
- KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, XXXXXXX,
- KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MO(_MD),
- KC_LGUI, KC_GRV, KC_INS, KC_LEFT, KC_RGHT,
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, XXXXXXX,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LBRC,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCBR,
+ MEDIA, KC_GRV, KC_EQL, KC_LEFT, KC_RGHT,
+ // left thumb
KC_LCTL, KC_LALT,
KC_HOME,
KC_BSPC, KC_DEL, KC_END,
// right hand
- KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
- XXXXXXX, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ XXXXXXX, KC_6, KC_7, KC_8, KC_9, KC_0, KC_SLSH,
+ KC_RBRC, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
- MO(_KP), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
- KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, KC_RGUI,
- KC_LALT, KC_LCTL,
+ KC_RCBR, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, MEDIA,
+ // right thumb
+ KC_RGUI, KC_RCTL,
KC_PGUP,
KC_PGDN, KC_ENT, KC_SPC
),
@@ -120,41 +134,43 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layer 2 : Colemak
* ,--------------------------------------------------. ,--------------------------------------------------.
- * | = | 1 | 2 | 3 | 4 | 5 | ESC | | ESC | 6 | 7 | 8 | 9 | 0 | - |
+ * | ESC | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | - |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
* | Tab | Q | W | F | P | G | | | | J | L | U | Y | ; | \ |
- * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * |--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------|
* | BkSpc | A | R | S | T | D |------| |------| H | N | E | I | O | ' |
- * |--------+------+------+------+------+------| _MD | | _KP |------+------+------+------+------+--------|
+ * |--------+------+------+------+------+------| { | | } |------+------+------+------+------+--------|
* | LShift | Z | X | C | V | B | | | | K | M | , | . | / | RShift |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
- * | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI |
+ * | MEDIA| ` | = | Left | Rght | | Up | Dn | [ | ] | MEDIA|
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
- * | LCTL | LALT | | RALT | RCTL |
+ * | LCTL | LALT | | RGUI | RCTL |
* ,------|------|------| |------+------+------.
* | | | Home | | PgUp | | |
* | BkSp | Del |------| |------| Enter| Space|
* | | | End | | PgDn | | |
* `--------------------' `--------------------'
*/
-[_CM] = LAYOUT_ergodox(
+[_COLEMAK] = LAYOUT_ergodox(
// left hand
- KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT,
- KC_DEL, KC_Q, KC_W, KC_F, KC_P, KC_G, XXXXXXX,
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, XXXXXXX,
+ KC_DEL, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_LBRC,
KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MO(_MD),
- KC_LGUI, KC_GRV, KC_INS, KC_LEFT, KC_RGHT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCBR,
+ MEDIA, KC_GRV, KC_EQL, KC_LEFT, KC_RGHT,
+ // left thumb
KC_LCTL, KC_LALT,
KC_HOME,
KC_BSPC, KC_DEL, KC_END,
// right hand
- KC_ESC, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
- XXXXXXX, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS,
+ XXXXXXX, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ KC_RBRC, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSLS,
KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
- MO(_KP), KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
- KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, KC_RGUI,
- KC_LALT, KC_LCTL,
+ KC_RCBR, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, MEDIA,
+ // right thumb
+ KC_RGUI, KC_RCTL,
KC_PGUP,
KC_PGDN, KC_ENT, KC_SPC
),
@@ -162,115 +178,64 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layer 3 : Media layer
* ,--------------------------------------------------. ,--------------------------------------------------.
- * | TEENSY | F1 | F2 | F3 | F4 | F5 | F11 | | F12 | F6 | F7 | F8 | F9 | F10 | |
+ * | F11 | F1 | F2 | F3 | F4 | F5 |TEENSY| | | F6 | F7 | F8 | F9 | F10 | F11 |
* |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
- * | | | PrSc | ScLk | Paus | | | | | | Mute | Vol- | Vol+ | | |
+ * | | | | | | | | | | | PrSc | ScLk | Paus | | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
- * | | | | | | |------| |------| Stop | Prev | Play | Next | Sel | |
+ * | CapsLk | | Mute | Vol- | Vol+ | |------| |------| |Dvorak|Qwerty|Colmak| | |
* |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
- * | | |Dvorak|Qwerty|Colemk| | | | | | | | | | |
+ * | | Stop | Prev | Play | Next | Sel | | | | | | | | | |
* `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
* | | | | | | | | | | | |
* `----------------------------------' `----------------------------------'
* ,-------------. ,-------------.
- * | | | | | |
+ * | |MacLck| |MacLck| |
* ,------|------|------| |------+------+------.
* | | | | | | | |
* | | |------| |------| | |
* | | | | | | | |
* `--------------------' `--------------------'
*/
-[_MD] = LAYOUT_ergodox(
+[_MEDIA] = LAYOUT_ergodox(
// left hand
- RESET, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F11,
- _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, _______, _______,
- _______, _______, _______, _______, _______, _______,
- _______, _______, DVORAK, QWERTY, COLEMAK, _______, _______,
+ KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, RESET,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______,
+ KC_CAPS, KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MSEL, _______,
_______, _______, _______, _______, _______,
- _______, _______,
+ _______, MACLOCK,
_______,
_______, _______, _______,
// right hand
- KC_F12, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______,
- _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______,
- KC_MSTP, KC_MPRV, KC_MPLY, KC_MNXT, KC_MSEL, _______,
+ _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12,
+ _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, _______, _______,
+ _______, DVORAK, QWERTY, COLEMAK, _______, _______,
_______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______,
- _______, _______,
+ MACLOCK, _______,
_______,
- _______, _______, _______
- ),
-
-
-/* Layer 4 : Keypad layer
- * ,--------------------------------------------------. ,--------------------------------------------------.
- * | Power | | | | | | | | | | NmLk | KP = | KP / | KP * | |
- * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
- * | Sleep | | | | | | | | | | KP 7 | KP 8 | KP 9 | KP - | |
- * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
- * | Wake | | | | | |------| |------| | KP 4 | KP 5 | KP 6 | KP + | |
- * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
- * | | | | | | | | | | | KP 1 | KP 2 | KP 3 |KP Ent| |
- * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
- * | | | | | | | KP 0 | | KP . |KP Ent| |
- * `----------------------------------' `----------------------------------'
- * ,-------------. ,-------------.
- * | | | | | |
- * ,------|------|------| |------+------+------.
- * | | | | | | | |
- * | | |------| |------| | |
- * | | | | | | | |
- * `--------------------' `--------------------'
- */
-[_KP] = LAYOUT_ergodox(
- // left hand
- KC_PWR, _______, _______, _______, _______, _______, _______,
- KC_SLEP, _______, _______, _______, _______, _______, _______,
- KC_WAKE, _______, _______, _______, _______, _______,
- _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______, _______,
- _______, _______,
- _______,
- _______, _______, _______,
- // right hand
- _______, _______, KC_NLCK, KC_PEQL, KC_PSLS, KC_PAST, _______,
- _______, _______, KC_P7, KC_P8, KC_P9, KC_PMNS, _______,
- _______, KC_P4, KC_P5, KC_P6, KC_PPLS, _______,
- _______, _______, KC_P1, KC_P2, KC_P3, KC_PENT, _______,
- KC_P0, _______, KC_PDOT, KC_PENT, _______,
- _______, _______,
- _______,
- _______, _______, _______
+ _______, _______, KC_INS
),
};
-void persistent_default_layer_set(uint16_t default_layer) {
- eeconfig_update_default_layer(default_layer);
- default_layer_set(default_layer);
-}
+// clang-format on
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- switch(id) {
- case _DV:
- if (record->event.pressed) {
- persistent_default_layer_set(1UL<<_DV);
- }
- break;
- case _QW:
- if (record->event.pressed) {
- persistent_default_layer_set(1UL<<_QW);
- }
- break;
- case _CM:
- if (record->event.pressed) {
- persistent_default_layer_set(1UL<<_CM);
- }
- break;
- }
- return MACRO_NONE;
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ switch (keycode) {
+ case DVORAK:
+ set_single_persistent_default_layer(_DVORAK);
+ return false;
+ case QWERTY:
+ set_single_persistent_default_layer(_QWERTY);
+ return false;
+ case COLEMAK:
+ set_single_persistent_default_layer(_COLEMAK);
+ return false;
+ }
+ }
+ return true;
};
// Runs just one time when the keyboard initializes.
diff --git a/layouts/community/ergodox/xyverz/readme.md b/layouts/community/ergodox/xyverz/readme.md
index 134fb50afdb..51315803b68 100644
--- a/layouts/community/ergodox/xyverz/readme.md
+++ b/layouts/community/ergodox/xyverz/readme.md
@@ -2,12 +2,16 @@
## About this keymap:
-The Dvorak layout shown here stems from my early Kinesis years, using the Contour PS/2 with a Dvorak software layout. ~~Because of this, the RBRC and LBRC were on opposite sides of the board in the corner keys. I've decided to continue using this layout with my ErgoDox.~~ I've decided do give the normal placing of the SLSH, EQL, and xBRC keys a try, after using a different keyboard for a while...
+The Dvorak layout shown here stems from my early Kinesis years, using the Contour PS/2 with a Dvorak software layout. Because of this, the RBRC and LBRC were on opposite sides of the board in the corner keys. When I originally set up this keymap, I had decided to continue using this layout with my ErgoDox. I've since modified my layout to be more effective for me and to more closely match my other ortholinear keyboard layouts
The QWERTY layout shown here is based entirely on the Kinesis Advantage layout, with the additional keys as shown in the diagrams. The Colemak layout is merely an adaptation of that.
I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar to the default Planck layouts.
+## What's New:
+
+* I've overhauled this Dvorak layout a bit to more match what I've got on my other Ortho boards. For some keys, I'm moving away from my old Kinesis keymap and adding the brackets and braces to the inner column vertical keys. I figure this will help me have better ease of use. In this update, I have also removed the keypad layer since I no longer use that at all, and have remapped the MEDIA layer a bit.
+
## Still to do:
* Need to figure out a better position for the ESC key.
@@ -16,107 +20,84 @@ I've enabled persistent keymaps for Qwerty, Dvorak and Colemak layers, similar t
### Layer 0: Dvorak layer
- ,--------------------------------------------------.,--------------------------------------------------.
- | = | 1 | 2 | 3 | 4 | 5 | ESC || ESC | 6 | 7 | 8 | 9 | 0 | / |
- |--------+------+------+------+------+-------------||------+------+------+------+------+------+--------|
- | Tab | ' | , | . | P | Y | || | F | G | C | R | L | \ |
- |--------+------+------+------+------+------| || |------+------+------+------+------+--------|
- | CapsLk | A | O | E | U | I |------||------| D | H | T | N | S | - |
- |--------+------+------+------+------+------| _MD || _KP |------+------+------+------+------+--------|
- | LShift | Z | X | C | V | X | || | B | M | W | V | Z | RShift |
- `--------+------+------+------+------+-------------'`-------------+------+------+------+------+--------'
- | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI |
- `----------------------------------' `----------------------------------'
- ,-------------.,-------------.
- | LCtr | LAlt || Ralt | RCtr |
- ,------|------|------||------+------+------.
- | | | Home || PgUp | | |
- | BkSp | Del |------||------| Enter| Space|
- | | | End || PgDn | | |
- `--------------------'`--------------------'
+ ,--------------------------------------------------. ,--------------------------------------------------.
+ | ESC | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | ~ |
+ |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ | Tab | ' | , | . | P | Y | | | | F | G | C | R | L | \ |
+ |--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------|
+ | CapsLk | A | O | E | U | I |------| |------| D | H | T | N | S | - |
+ |--------+------+------+------+------+------| { | | } |------+------+------+------+------+--------|
+ | LShift | ; | Q | J | K | X | | | | B | M | W | V | Z | RShift |
+ `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ |MEDIA | ` | ~ | Left | Rght | | Up | Dn | / | = | MEDIA|
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ | LCTL | LALT | | RGUI | RCTL |
+ ,------|------|------| |------+------+------.
+ | | | Home | | PgUp | | |
+ | BkSp | Del |------| |------| Enter| Space|
+ | | | End | | PgDn | | |
+ `--------------------' `--------------------'
### Layer 1: QWERTY layer
- ,--------------------------------------------------.,--------------------------------------------------.
- | = | 1 | 2 | 3 | 4 | 5 | ESC || ESC | 6 | 7 | 8 | 9 | 0 | - |
- |--------+------+------+------+------+-------------||------+------+------+------+------+------+--------|
- | Tab | Q | W | E | R | T | || | Y | U | I | O | P | \ |
- |--------+------+------+------+------+------| || |------+------+------+------+------+--------|
- | CapsLk | A | S | D | F | G |------||------| H | J | K | L | ; | ' |
- |--------+------+------+------+------+------| _MD || _KP |------+------+------+------+------+--------|
- | LShift | Z | X | C | V | B | || | N | M | , | . | / | RShift |
- `--------+------+------+------+------+-------------'`-------------+------+------+------+------+--------'
- | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI |
- `----------------------------------' `----------------------------------'
- ,-------------.,-------------.
- | LCtr | LAlt || Ralt | RCtr |
- ,------|------|------||------+------+------.
- | | | Home || PgUp | | |
- | BkSp | Del |------||------| Enter| Space|
- | | | End || PgDn | | |
- `--------------------'`--------------------'
+ ,--------------------------------------------------. ,--------------------------------------------------.
+ | ESC | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | - |
+ |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ | Tab | Q | W | E | R | T | | | | Y | U | I | O | P | \ |
+ |--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------|
+ | CapsLk | A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
+ |--------+------+------+------+------+------| { | | } |------+------+------+------+------+--------|
+ | LShift | Z | X | C | V | B | | | | N | M | , | . | / | RShift |
+ `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ |MEDIA | ` | = | Left | Rght | | Up | Dn | [ | ] | MEDIA|
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ | LCTL | LALT | | RGUI | RCTL |
+ ,------|------|------| |------+------+------.
+ | | | Home | | PgUp | | |
+ | BkSp | Del |------| |------| Enter| Space|
+ | | | End | | PgDn | | |
+ `--------------------' `--------------------'
### Keymap 2: Colemak layer
- ,--------------------------------------------------.,--------------------------------------------------.
- | = | 1 | 2 | 3 | 4 | 5 | ESC || ESC | 6 | 7 | 8 | 9 | 0 | - |
- |--------+------+------+------+------+-------------||------+------+------+------+------+------+--------|
- | Tab | Q | W | F | P | G | || | J | L | U | Y | ; | \ |
- |--------+------+------+------+------+------| || |------+------+------+------+------+--------|
- | BkSpc | A | R | S | T | D |------||------| H | N | E | I | O | ' |
- |--------+------+------+------+------+------| _MD || _KP |------+------+------+------+------+--------|
- | LShift | Z | X | C | V | B | || | K | M | , | . | / | RShift |
- `--------+------+------+------+------+-------------'`-------------+------+------+------+------+--------'
- | LGUI | ` | INS | Left | Rght | | Up | Dn | [ | ] | RGUI |
- `----------------------------------' `----------------------------------'
- ,-------------.,-------------.
- | LCtr | LAlt || Ralt | RCtr |
- ,------|------|------||------+------+------.
- | | | Home || PgUp | | |
- | BkSp | Del |------||------| Enter| Space|
- | | | End || PgDn | | |
- `--------------------'`--------------------'
+ ,--------------------------------------------------. ,--------------------------------------------------.
+ | ESC | 1 | 2 | 3 | 4 | 5 | | | | 6 | 7 | 8 | 9 | 0 | - |
+ |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ | Tab | Q | W | F | P | G | | | | J | L | U | Y | ; | \ |
+ |--------+------+------+------+------+------| [ | | ] |------+------+------+------+------+--------|
+ | BkSpc | A | R | S | T | D |------| |------| H | N | E | I | O | ' |
+ |--------+------+------+------+------+------| { | | } |------+------+------+------+------+--------|
+ | LShift | Z | X | C | V | B | | | | K | M | , | . | / | RShift |
+ `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ | MEDIA| ` | = | Left | Rght | | Up | Dn | [ | ] | MEDIA|
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ | LCTL | LALT | | RGUI | RCTL |
+ ,------|------|------| |------+------+------.
+ | | | Home | | PgUp | | |
+ | BkSp | Del |------| |------| Enter| Space|
+ | | | End | | PgDn | | |
+ `--------------------' `--------------------'
### layer 3 : Media layer
- ,--------------------------------------------------.,--------------------------------------------------.
- | TEENSY | F1 | F2 | F3 | F4 | F5 | F11 || F12 | F6 | F7 | F8 | F9 | F10 | |
- |--------+------+------+------+------+-------------||------+------+------+------+------+------+--------|
- | | | PrSc | ScLk | Paus | | || | | Mute | Vol- | Vol+ | | |
- |--------+------+------+------+------+------| || |------+------+------+------+------+--------|
- | | | | | | |------||------| Stop | Prev | Play | Next | Sel | |
- |--------+------+------+------+------+------| || |------+------+------+------+------+--------|
- | | |Dvorak|Qwerty|Colemk| | || | | | | | | |
- `--------+------+------+------+------+-------------'`-------------+------+------+------+------+--------'
- | | | | | | | | | | | |
- `----------------------------------' `----------------------------------'
- ,-------------.,-------------.
- | | || | |
- ,------|------|------||------+------+------.
- | | | || | | |
- | | |------||------| | |
- | | | || | | |
- `--------------------'`--------------------'
-
-
-
-### Keymap 4: Keypad layer
-
- ,--------------------------------------------------.,--------------------------------------------------.
- | Power | | | | | | || | | NmLk | KP = | KP / | KP * | |
- |--------+------+------+------+------+-------------||------+------+------+------+------+------+--------|
- | Sleep | | | | | | || | | KP 7 | KP 8 | KP 9 | KP - | |
- |--------+------+------+------+------+------| || |------+------+------+------+------+--------|
- | Wake | | | | | |------||------| | KP 4 | KP 5 | KP 6 | KP + | |
- |--------+------+------+------+------+------| || |------+------+------+------+------+--------|
- | | | | | | | || | | KP 1 | KP 2 | KP 3 |KP Ent| |
- `--------+------+------+------+------+-------------'`-------------+------+------+------+------+--------'
- | | | | | | | KP 0 | | KP . |KP Ent| |
- `----------------------------------' `----------------------------------'
- ,-------------.,-------------.
- | | || | |
- ,------|------|------||------+------+------.
- | | | || | | |
- | | |------||------| | |
- | | | || | | |
- `--------------------'`--------------------'
+ ,--------------------------------------------------. ,--------------------------------------------------.
+ | F11 | F1 | F2 | F3 | F4 | F5 |TEENSY| | | F6 | F7 | F8 | F9 | F10 | F11 |
+ |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ | | | | | | | | | | | PrSc | ScLk | Paus | | |
+ |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ | CapsLk | | Mute | Vol- | Vol+ | |------| |------| |Dvorak|Qwerty|Colmak| | |
+ |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ | | Stop | Prev | Play | Next | Sel | | | | | | | | | |
+ `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ | | | | | | | | | | | |
+ `----------------------------------' `----------------------------------'
+ ,-------------. ,-------------.
+ | |MacLck| |MacLck| |
+ ,------|------|------| |------+------+------.
+ | | | | | | | |
+ | | |------| |------| | |
+ | | | | | | | |
+ `--------------------' `--------------------'
\ No newline at end of file
diff --git a/layouts/community/ortho_4x12/drashna/config.h b/layouts/community/ortho_4x12/drashna/config.h
index 663708afa60..5342549e548 100644
--- a/layouts/community/ortho_4x12/drashna/config.h
+++ b/layouts/community/ortho_4x12/drashna/config.h
@@ -62,6 +62,8 @@
# endif
#endif
+#define EEPROM_I2C_RM24C512C
+
#define ENCODER_DIRECTION_FLIP
/*
* MIDI options
diff --git a/layouts/community/ortho_4x12/drashna/rules.mk b/layouts/community/ortho_4x12/drashna/rules.mk
index e4fe905341a..3383cfd35f3 100644
--- a/layouts/community/ortho_4x12/drashna/rules.mk
+++ b/layouts/community/ortho_4x12/drashna/rules.mk
@@ -18,8 +18,10 @@ else
CONSOLE_ENABLE = yes
COMMAND_ENABLE = yes
RGBLIGHT_ENABLE = yes
+ RGBLIGHT_STARTUP_ANIMATION = yes
RGB_MATRIX_ENABLE = no
AUDIO_ENABLE = yes
+ EEPROM_DRIVER = i2c
endif
ifeq ($(strip $(KEYBOARD)), planck/light)
RGB_MATRIX_ENABLE = yes
diff --git a/layouts/community/ortho_4x12/jotix/keymap.c b/layouts/community/ortho_4x12/jotix/keymap.c
index 2247c848173..600772288ee 100644
--- a/layouts/community/ortho_4x12/jotix/keymap.c
+++ b/layouts/community/ortho_4x12/jotix/keymap.c
@@ -8,7 +8,7 @@ enum layers {
#define LOWER MO(_LOWER)
#define RAISE MO(_RAISE)
-#define TGLOWER TG(_LOWER)
+#define SHRAISE LM(_RAISE, MOD_LSFT)
static bool is_ctl_pressed;
static bool is_esc_pressed;
@@ -20,35 +20,35 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// ┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┐
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
// ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
- KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_ENT,
// ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
- KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,KC_ENT,
+ KC_LSFT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_UP, KC_SLSH,
// ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
- KC_LCTL,KC_LGUI,KC_LALT,KC_DEL, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT,KC_DOWN,KC_UP, KC_RGHT
+ KC_LCTL,KC_LGUI,KC_LALT,KC_RALT,LOWER, KC_SPC, KC_SPC, RAISE, SHRAISE,KC_LEFT,KC_DOWN,KC_RGHT
// └───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘
),
[_LOWER] = LAYOUT_ortho_4x12 (
// ┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┐
- _______,KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
+ _______,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,_______,
// ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
- _______,KC_MINS,KC_EQL, KC_LBRC,KC_RBRC,KC_BSLS,KC_GRV, _______,_______,_______,_______,_______,
+ _______,KC_F11, KC_F12, KC_INS, KC_HOME,KC_PGUP,_______,_______,_______,_______,_______,_______,
// ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
- _______,KC_UNDS,KC_PLUS,KC_LCBR,KC_RCBR,KC_PIPE,KC_TILD,_______,_______,_______,_______,_______,
+ _______,_______,_______,KC_DEL, KC_END, KC_PGDN,_______,_______,_______,KC_BTN1,KC_MS_U,KC_BTN2,
// ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
- _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______
+ _______,_______,_______,_______,_______,_______,_______,_______,_______,KC_MS_L,KC_MS_D,KC_MS_R
// └───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘
),
[_RAISE] = LAYOUT_ortho_4x12 (
// ┌───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┬───────┐
- _______,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL,
// ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
- _______,KC_F11, KC_F12, _______,_______,_______,KC_HOME,KC_PGUP,_______,_______,_______,_______,
+ KC_CAPS,_______,_______,_______,_______,_______,KC_LBRC,KC_RBRC,KC_BSLS,KC_QUOT,_______,_______,
// ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
- _______,_______,_______,KC_CAPS,_______,KC_PGDN,KC_END, KC_PGDN,_______,KC_BTN1,KC_BTN2,_______,
+ _______,_______,_______,_______,_______,_______,KC_MINS,KC_EQL, _______,_______,KC_VOLU,_______,
// ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
- _______,_______,_______,_______,TGLOWER,_______,_______,_______,KC_MS_L,KC_MS_D,KC_MS_U,KC_MS_R
+ _______,_______,_______,_______,_______,_______,_______,_______,_______,KC_BSPC,KC_VOLD,KC_MUTE
// └───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘
),
@@ -56,11 +56,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
uint32_t layer_state_set_user(uint32_t state) {
#ifdef JOTANCK_LEDS
- if (biton32(state) == _LOWER) {
- writePinHigh(JOTANCK_LED1);
- } else {
- writePinLow(JOTANCK_LED1);
- }
+ writePin(JOTANCK_LED2, (get_highest_layer(state) == _RAISE));
#endif
return state;
}
@@ -74,11 +70,7 @@ bool led_update_user(led_t led_state) {
#ifdef JOTANCK_LEDS
// CapsLock led
- if (led_state.caps_lock) {
- writePinHigh(JOTANCK_LED2);
- } else {
- writePinLow(JOTANCK_LED2);
- }
+ writePin(JOTANCK_LED1, led_state.caps_lock);
#endif
return true;
}
diff --git a/layouts/community/ortho_4x12/junonum/keymap.c b/layouts/community/ortho_4x12/junonum/keymap.c
index 365b8ad4ef6..619de0d782a 100644
--- a/layouts/community/ortho_4x12/junonum/keymap.c
+++ b/layouts/community/ortho_4x12/junonum/keymap.c
@@ -32,26 +32,27 @@ enum planck_keycodes {
#define RAISE MO(_RAISE)
#define SPACEFN LT(_FN1, KC_SPC)
#define DPADNUM MO(_DPADNUM)
+#define CTRLTAB CTL_T(KC_TAB)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT_ortho_4x12(
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
- KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ CTRLTAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SHIFTEN,
- _______, KC_LCTL, KC_LGUI, KC_LALT, LOWER, SPACEFN, SPACEFN, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
- ),
+ _______, KC_LCTL, KC_LGUI, KC_LALT, LOWER, SPACEFN, SPACEFN, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
+ ),
[_COLEMAK] = LAYOUT_ortho_4x12(
KC_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_BSPC,
- KC_TAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
+ CTRLTAB, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, SHIFTEN,
_______, KC_LCTL, KC_LGUI, KC_LALT, LOWER, SPACEFN, SPACEFN, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
),
[_DVORAK] = LAYOUT_ortho_4x12(
KC_ESC, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_BSPC,
- KC_TAB, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_QUOT,
+ CTRLTAB, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_QUOT,
KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, SHIFTEN,
_______, KC_LCTL, KC_LGUI, KC_LALT, LOWER, SPACEFN, SPACEFN, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
),
diff --git a/layouts/community/ortho_4x12/junonum/readme.md b/layouts/community/ortho_4x12/junonum/readme.md
index f6c148596da..747646d9ee1 100644
--- a/layouts/community/ortho_4x12/junonum/readme.md
+++ b/layouts/community/ortho_4x12/junonum/readme.md
@@ -2,9 +2,10 @@
A universal ortholinear 4x12 keymap created by Juno Nguyen
## Features:
-* Successor to *juno*
-* Numpad-like cluster for the numerics.
-* ESDF and IJKL arrow cluster from SpaceFn
+* Successor to *juno*.
+* Numpad-like cluster for numerics.
+* ESDF and IJKL arrow cluster from SpaceFn.
+* CtrlTab for even more HHKB-ness.
* Huge amount of omissions of the redundant keys.
* minimalism (not really).
diff --git a/layouts/community/ortho_4x12/xyverz/keymap.c b/layouts/community/ortho_4x12/xyverz/keymap.c
index c9811ea4b1f..727ea00806a 100644
--- a/layouts/community/ortho_4x12/xyverz/keymap.c
+++ b/layouts/community/ortho_4x12/xyverz/keymap.c
@@ -2,12 +2,15 @@
enum layer_names { _QWERTY, _COLEMAK, _DVORAK, _LOWER, _RAISE, _ADJUST };
-enum custom_keycodes { QWERTY = SAFE_RANGE, COLEMAK, DVORAK, LOWER, RAISE, ADJUST };
+enum custom_keycodes { QWERTY = SAFE_RANGE, COLEMAK, DVORAK, ADJUST };
// Aliases to keep the keymap tidy
#define GUIBSPC GUI_T(KC_BSPC) // GUI when held, BSPC when tapped.
#define RGB_SWR RGB_M_SW // Swirl Animation alias
#define RGB_SNK RGB_M_SN // Snake Animation alias
+#define MACLOCK LGUI(LCTL(KC_Q)) // Lock my MacBook!
+#define RAISE MO(_RAISE)
+#define LOWER MO(_LOWER)
// clang-format off
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@@ -78,8 +81,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `-----------------------------------------------------------------------------------'
*/
[_LOWER] = LAYOUT_ortho_4x12 ( \
- KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \
- KC_CAPS, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE, \
+ KC_CAPS, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, _______, \
_______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, _______, _______, _______, _______, \
BL_STEP, _______, KC_HOME, KC_END, _______, KC_DEL, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______ \
),
@@ -96,8 +99,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `-----------------------------------------------------------------------------------'
*/
[_RAISE] = LAYOUT_ortho_4x12 ( \
- KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______, \
- KC_CAPS, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSLS, \
+ KC_CAPS, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, _______, \
_______, _______, KC_MPRV, KC_MPLY, KC_MNXT, _______, _______, _______, _______, _______, _______, _______, \
BL_STEP, _______, KC_HOME, KC_END, _______, KC_DEL, KC_INS, _______, KC_PGUP, KC_PGDN, _______, _______ \
),
@@ -110,14 +113,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |------+------+------+------+------+------|------+------+------+------+------+------|
* |RGB ON| MODE |RGB SW|RGB KN|RGB GR| HUE- | HUE+ | HUE- | SAT+ | SAT- | VAL+ | VAL- |
* |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | | | | | |
+ * | | | | | |MacLck| | | | | | |
* `-----------------------------------------------------------------------------------'
*/
[_ADJUST] = LAYOUT_ortho_4x12 ( \
KC_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F12 , \
_______, RESET, RGB_M_P, RGB_M_B, RGB_M_R, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \
RGB_TOG, RGB_MOD, RGB_SWR, RGB_M_K, RGB_M_G, RGB_HUI, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, \
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+ _______, _______, _______, _______, MACLOCK, _______, _______, _______, _______, _______, _______, _______ \
)
};
// clang-format on
diff --git a/layouts/community/ortho_4x12/xyverz/readme.md b/layouts/community/ortho_4x12/xyverz/readme.md
index d6614d956dd..2ee86792ec7 100644
--- a/layouts/community/ortho_4x12/xyverz/readme.md
+++ b/layouts/community/ortho_4x12/xyverz/readme.md
@@ -6,9 +6,12 @@ I'm moving all my 4x12s to the same keymap since I pretty much use it across all
This revision includes this documentation and introduction of the individual RGB mode keys in the `ADJUST` layer.
+## What's New?
+ * Added the Mac Lock macro of CMD+CTRL+Q to lock the screen on my mac.
+ * Changed the location of the `pipe` and `backslash` keys to match my other layouts.
+
## Still to do:
- * Update layout files to match current standards.
* Enjoy this revision; figure out new things later.
### Qwerty layer
@@ -57,9 +60,9 @@ This revision includes this documentation and introduction of the individual RGB
```
,-----------------------------------------------------------------------------------.
- | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | |
+ | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | | |
|------+------+------+------+------+-------------+------+------+------+------+------|
- | Caps | | Mute | Vol- | Vol+ | | | _ | + | { | } | | |
+ | Caps | | Mute | Vol- | Vol+ | | | _ | + | { | } | |
|------+------+------+------+------+------|------+------+------+------+------+------|
| | | Prev | Play | Next | | | | | | | |
|------+------+------+------+------+------+------+------+------+------+------+------|
@@ -71,9 +74,9 @@ This revision includes this documentation and introduction of the individual RGB
```
,-----------------------------------------------------------------------------------.
- | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | |
+ | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | \ |
|------+------+------+------+------+-------------+------+------+------+------+------|
- | Caps | | Mute | Vol- | Vol+ | | | - | = | [ | ] | \ |
+ | Caps | | Mute | Vol- | Vol+ | | | - | = | [ | ] | |
|------+------+------+------+------+------|------+------+------+------+------+------|
| | | Prev | Play | Next | | | | | | | |
|------+------+------+------+------+------+------+------+------+------+------+------|
@@ -91,6 +94,6 @@ This revision includes this documentation and introduction of the individual RGB
|------+------+------+------+------+------|------+------+------+------+------+------|
|RGB ON| MODE |RGB SW|RGB KN|RGB GR| HUE- | HUE+ | HUE- | SAT+ | SAT- | VAL+ | VAL- |
|------+------+------+------+------+------+------+------+------+------+------+------|
- | | | | | | | | | | | | |
+ | | | | | |MacLck| | | | | | |
`-----------------------------------------------------------------------------------'
```
diff --git a/layouts/community/ortho_4x4/jotix/keymap.c b/layouts/community/ortho_4x4/jotix/keymap.c
index 91d0ed74dce..9035860da7d 100644
--- a/layouts/community/ortho_4x4/jotix/keymap.c
+++ b/layouts/community/ortho_4x4/jotix/keymap.c
@@ -1,41 +1,74 @@
#include QMK_KEYBOARD_H
-extern keymap_config_t keymap_config;
+enum layers {
+ _NUMPAD,
+ _GAMEPAD,
+ _FN
+};
-// Each layer gets a name for readability, which is then used in the keymap matrix below.
-// The underscores don't mean anything - you can have a layer called STUFF or any other name.
-// Layer names don't all need to be of the same length, obviously, and you can also skip them
-// entirely and just use numbers.
+static bool is_p0_pressed;
+static bool is_p7_pressed;
+static bool is_pmns_pressed;
-#define _NUMPAD 0
-#define _LOWER 1
-#define LOWER LT(_LOWER, KC_PENT)
+#define TGGAME TG(_GAMEPAD)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-/* Numpad
- * +-------+-------+-------+-------+
- * | 7 | 8 | 9 | - |
- * +-------+-------+-------+-------+
- * | 4 | 5 | 6 | + |
- * +-------+-------+-------+-------+
- * | 1 | 2 | 3 | / |
- * +-------+-------+-------+-------+
- * | | 0 | . | * |
- * +-------+-------+-------+-------+
- */
[_NUMPAD] = LAYOUT_ortho_4x4 (
- KC_P7, KC_P8, KC_P9, KC_PMNS,
- KC_P4, KC_P5, KC_P6, KC_PPLS,
- KC_P1, KC_P2, KC_P3, KC_PSLS,
- LOWER, KC_P0, KC_PDOT,KC_PAST
+ KC_P7, KC_P8, KC_P9, KC_PMNS,
+ KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_P1, KC_P2, KC_P3, MO(_FN),
+ KC_P0, KC_PDOT,KC_PSLS,KC_PAST
),
-/* Lower */
-[_LOWER] = LAYOUT_ortho_4x4 (
- KC_NLCK,_______,_______,RESET ,
- _______,_______,_______,_______,
- _______,_______,_______,_______,
- _______,_______,_______,_______
+[_GAMEPAD] = LAYOUT_ortho_4x4 (
+ KC_5, KC_6, KC_7, KC_8,
+ KC_1, KC_2, KC_3, KC_4,
+ KC_Q, KC_W, KC_E, _______,
+ KC_A, KC_S, KC_D, KC_SPC
),
+
+[_FN] = LAYOUT_ortho_4x4 (
+ KC_PERC,KC_CIRC,KC_AMPR,KC_ASTR,
+ KC_EXLM,KC_AT, KC_HASH,KC_DLR,
+ KC_Z, KC_X, KC_C, _______,
+ KC_NLCK,_______,_______,TGGAME
+)
};
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+#ifdef JOTPAD16_LEDS
+ writePin(JOTPAD16_LED1, (get_highest_layer(state) == _FN));
+ writePin(JOTPAD16_LED2, (get_highest_layer(state) == _GAMEPAD));
+#endif
+ return state;
+}
+
+bool led_update_user(led_t led_state) {
+ // NumLock allways on
+ if (!led_state.num_lock) {
+ tap_code(KC_NUMLOCK);
+ }
+ return true;
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case KC_P0:
+ is_p0_pressed = record->event.pressed;
+ break;
+ case KC_P7:
+ is_p7_pressed = record->event.pressed;
+ break;
+ case KC_PMNS:
+ is_pmns_pressed = record->event.pressed;
+ break;
+ };
+ return true;
+}
+
+void matrix_scan_user(void) {
+ if (is_p0_pressed && is_p7_pressed && is_pmns_pressed) {
+ reset_keyboard();
+ }
+}
diff --git a/layouts/community/ortho_4x4/jotix/readme.md b/layouts/community/ortho_4x4/jotix/readme.md
index 0624f621551..b4b56b58df3 100644
--- a/layouts/community/ortho_4x4/jotix/readme.md
+++ b/layouts/community/ortho_4x4/jotix/readme.md
@@ -1,6 +1,3 @@
# Jotix ortho 4x4 keymap
-
-
-Enter is 'Lower' on hold.
-
+Tested on jotpad16
\ No newline at end of file
diff --git a/layouts/community/ortho_5x12/333fred/config.h b/layouts/community/ortho_5x12/333fred/config.h
index 7835fa1f07d..2e5dfe2e297 100644
--- a/layouts/community/ortho_5x12/333fred/config.h
+++ b/layouts/community/ortho_5x12/333fred/config.h
@@ -1,7 +1,5 @@
#pragma once
-#include "333fred_config.h"
-
#define USE_SERIAL
#define MASTER_LEFT
diff --git a/layouts/community/ortho_5x12/333fred/rules.mk b/layouts/community/ortho_5x12/333fred/rules.mk
index 0cfb234665e..9a3e2b97e59 100644
--- a/layouts/community/ortho_5x12/333fred/rules.mk
+++ b/layouts/community/ortho_5x12/333fred/rules.mk
@@ -1,4 +1,2 @@
KEY_LOCK_ENABLE = yes
-NKRO_ENABLE = yes
CONSOLE_ENABLE = no
-TAP_DANCE_ENABLE = yes
diff --git a/layouts/default/65_ansi_blocker_split_bs/default_65_ansi_blocker_split_bs/keymap.c b/layouts/default/65_ansi_blocker_split_bs/default_65_ansi_blocker_split_bs/keymap.c
new file mode 100644
index 00000000000..34e10d54703
--- /dev/null
+++ b/layouts/default/65_ansi_blocker_split_bs/default_65_ansi_blocker_split_bs/keymap.c
@@ -0,0 +1,24 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │Bsp│Bsp│Hom│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │PgU│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │PgD│
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift│ ↑ │End│
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤
+ * │Ctrl│GUI │Alt │ │ Alt│Ctrl│ │ ← │ ↓ │ → │
+ * └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_65_ansi_blocker_split_bs(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/layouts/default/65_ansi_blocker_split_bs/info.json b/layouts/default/65_ansi_blocker_split_bs/info.json
new file mode 100644
index 00000000000..a388086b1e6
--- /dev/null
+++ b/layouts/default/65_ansi_blocker_split_bs/info.json
@@ -0,0 +1,85 @@
+{
+ "keyboard_name": "65% ANSI layout with blocker and split Backspace",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 16,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_65_ansi_blocker_split_bs": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+ {"x":6, "y":0},
+ {"x":7, "y":0},
+ {"x":8, "y":0},
+ {"x":9, "y":0},
+ {"x":10, "y":0},
+ {"x":11, "y":0},
+ {"x":12, "y":0},
+ {"x":13, "y":0},
+ {"x":14, "y":0},
+ {"x":15, "y":0},
+
+ {"x":0, "y":1, "w":1.5},
+ {"x":1.5, "y":1},
+ {"x":2.5, "y":1},
+ {"x":3.5, "y":1},
+ {"x":4.5, "y":1},
+ {"x":5.5, "y":1},
+ {"x":6.5, "y":1},
+ {"x":7.5, "y":1},
+ {"x":8.5, "y":1},
+ {"x":9.5, "y":1},
+ {"x":10.5, "y":1},
+ {"x":11.5, "y":1},
+ {"x":12.5, "y":1},
+ {"x":13.5, "y":1, "w":1.5},
+ {"x":15, "y":1},
+
+ {"x":0, "y":2, "w":1.75},
+ {"x":1.75, "y":2},
+ {"x":2.75, "y":2},
+ {"x":3.75, "y":2},
+ {"x":4.75, "y":2},
+ {"x":5.75, "y":2},
+ {"x":6.75, "y":2},
+ {"x":7.75, "y":2},
+ {"x":8.75, "y":2},
+ {"x":9.75, "y":2},
+ {"x":10.75, "y":2},
+ {"x":11.75, "y":2},
+ {"x":12.75, "y":2, "w":2.25},
+ {"x":15, "y":2},
+
+ {"x":0, "y":3, "w":2.25},
+ {"x":2.25, "y":3},
+ {"x":3.25, "y":3},
+ {"x":4.25, "y":3},
+ {"x":5.25, "y":3},
+ {"x":6.25, "y":3},
+ {"x":7.25, "y":3},
+ {"x":8.25, "y":3},
+ {"x":9.25, "y":3},
+ {"x":10.25, "y":3},
+ {"x":11.25, "y":3},
+ {"x":12.25, "y":3, "w":1.75},
+ {"x":14, "y":3},
+ {"x":15, "y":3},
+
+ {"x":0, "y":4, "w":1.25},
+ {"x":1.25, "y":4, "w":1.25},
+ {"x":2.5, "y":4, "w":1.25},
+ {"x":3.75, "y":4, "w":6.25},
+ {"x":10, "y":4, "w":1.25},
+ {"x":11.25, "y":4, "w":1.25},
+ {"x":13, "y":4},
+ {"x":14, "y":4},
+ {"x":15, "y":4}
+ ]
+ }
+ }
+}
diff --git a/layouts/default/65_ansi_blocker_split_bs/layout.json b/layouts/default/65_ansi_blocker_split_bs/layout.json
new file mode 100644
index 00000000000..93486ce97dd
--- /dev/null
+++ b/layouts/default/65_ansi_blocker_split_bs/layout.json
@@ -0,0 +1,5 @@
+[{a:7},"","","","","","","","","","","","","","","",""],
+[{w:1.5},"","","","","","","","","","","","","",{w:1.5},"",""],
+[{w:1.75},"","","","","","","","","","","","",{w:2.25},"",""],
+[{w:2.25},"","","","","","","","","","","",{w:1.75},"","",""],
+[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"",{w:1.25},"",{w:1.25},"",{x:0.5},"","",""]
diff --git a/layouts/default/65_ansi_blocker_split_bs/readme.md b/layouts/default/65_ansi_blocker_split_bs/readme.md
new file mode 100644
index 00000000000..7c49f42b953
--- /dev/null
+++ b/layouts/default/65_ansi_blocker_split_bs/readme.md
@@ -0,0 +1,5 @@
+# 65_ansi_blocker_split_bs
+
+ LAYOUT_65_ansi_blocker_split_bs
+
+This is the 65% ANSI layout with a blocker next to the arrows and split Backspace.
diff --git a/layouts/default/65_ansi_blocker_tsangan/default_65_ansi_blocker_tsangan/keymap.c b/layouts/default/65_ansi_blocker_tsangan/default_65_ansi_blocker_tsangan/keymap.c
new file mode 100644
index 00000000000..ed7cec1e17f
--- /dev/null
+++ b/layouts/default/65_ansi_blocker_tsangan/default_65_ansi_blocker_tsangan/keymap.c
@@ -0,0 +1,24 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│Hom│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │PgU│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │PgD│
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift│ ↑ │End│
+ * ├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬─┬───┼───┼───┤
+ * │Ctrl │GUI│Alt │ │ Alt│ │ ← │ ↓ │ → │
+ * └─────┴───┴─────┴───────────────────────────┴─────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_65_ansi_blocker_tsangan(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/layouts/default/65_ansi_blocker_tsangan/info.json b/layouts/default/65_ansi_blocker_tsangan/info.json
new file mode 100644
index 00000000000..cec0ca8134b
--- /dev/null
+++ b/layouts/default/65_ansi_blocker_tsangan/info.json
@@ -0,0 +1,83 @@
+{
+ "keyboard_name": "65% ANSI Tsangan layout with blocker",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 16,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_65_ansi_blocker_tsangan": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+ {"x":4, "y":0},
+ {"x":5, "y":0},
+ {"x":6, "y":0},
+ {"x":7, "y":0},
+ {"x":8, "y":0},
+ {"x":9, "y":0},
+ {"x":10, "y":0},
+ {"x":11, "y":0},
+ {"x":12, "y":0},
+ {"x":13, "y":0, "w":2},
+ {"x":15, "y":0},
+
+ {"x":0, "y":1, "w":1.5},
+ {"x":1.5, "y":1},
+ {"x":2.5, "y":1},
+ {"x":3.5, "y":1},
+ {"x":4.5, "y":1},
+ {"x":5.5, "y":1},
+ {"x":6.5, "y":1},
+ {"x":7.5, "y":1},
+ {"x":8.5, "y":1},
+ {"x":9.5, "y":1},
+ {"x":10.5, "y":1},
+ {"x":11.5, "y":1},
+ {"x":12.5, "y":1},
+ {"x":13.5, "y":1, "w":1.5},
+ {"x":15, "y":1},
+
+ {"x":0, "y":2, "w":1.75},
+ {"x":1.75, "y":2},
+ {"x":2.75, "y":2},
+ {"x":3.75, "y":2},
+ {"x":4.75, "y":2},
+ {"x":5.75, "y":2},
+ {"x":6.75, "y":2},
+ {"x":7.75, "y":2},
+ {"x":8.75, "y":2},
+ {"x":9.75, "y":2},
+ {"x":10.75, "y":2},
+ {"x":11.75, "y":2},
+ {"x":12.75, "y":2, "w":2.25},
+ {"x":15, "y":2},
+
+ {"x":0, "y":3, "w":2.25},
+ {"x":2.25, "y":3},
+ {"x":3.25, "y":3},
+ {"x":4.25, "y":3},
+ {"x":5.25, "y":3},
+ {"x":6.25, "y":3},
+ {"x":7.25, "y":3},
+ {"x":8.25, "y":3},
+ {"x":9.25, "y":3},
+ {"x":10.25, "y":3},
+ {"x":11.25, "y":3},
+ {"x":12.25, "y":3, "w":1.75},
+ {"x":14, "y":3},
+ {"x":15, "y":3},
+
+ {"x":0, "y":4, "w":1.5},
+ {"x":1.5, "y":4},
+ {"x":2.5, "y":4, "w":1.5},
+ {"x":4, "y":4, "w":7},
+ {"x":11, "y":4, "w":1.5},
+ {"x":13, "y":4},
+ {"x":14, "y":4},
+ {"x":15, "y":4}
+ ]
+ }
+ }
+}
diff --git a/layouts/default/65_ansi_blocker_tsangan/layout.json b/layouts/default/65_ansi_blocker_tsangan/layout.json
new file mode 100644
index 00000000000..519b6538520
--- /dev/null
+++ b/layouts/default/65_ansi_blocker_tsangan/layout.json
@@ -0,0 +1,5 @@
+[{a:7},"","","","","","","","","","","","","",{w:2},"",""],
+[{w:1.5},"","","","","","","","","","","","","",{w:1.5},"",""],
+[{w:1.75},"","","","","","","","","","","","",{w:2.25},"",""],
+[{w:2.25},"","","","","","","","","","","",{w:1.75},"","",""],
+[{w:1.5},"","",{w:1.5},"",{w:7},"",{w:1.5},"",{x:0.5},"","",""]
diff --git a/layouts/default/65_ansi_blocker_tsangan/readme.md b/layouts/default/65_ansi_blocker_tsangan/readme.md
new file mode 100644
index 00000000000..879742fee85
--- /dev/null
+++ b/layouts/default/65_ansi_blocker_tsangan/readme.md
@@ -0,0 +1,6 @@
+# 65_ansi_blocker_tsangan
+
+ LAYOUT_65_ansi_blocker_tsangan
+
+This is a Tsangan-inspired 65% ANSI layout with a blocker next to the arrows and 1.5u-1u-1.5u-7u-1.5u bottom row.
+
\ No newline at end of file
diff --git a/lib/python/kle2xy.py b/lib/python/kle2xy.py
index bff1d025b76..608d1b98090 100644
--- a/lib/python/kle2xy.py
+++ b/lib/python/kle2xy.py
@@ -14,7 +14,7 @@ class KLE2xy(list):
self.name = name
self.invert_y = invert_y
self.key_width = Decimal('19.05')
- self.key_skel = {'decal': False, 'border_color': 'none', 'keycap_profile': '', 'keycap_color': 'grey', 'label_color': 'black', 'label_size': 3, 'label_style': 4, 'width': Decimal('1'), 'height': Decimal('1'), 'x': Decimal('0'), 'y': Decimal('0')}
+ self.key_skel = {'decal': False, 'border_color': 'none', 'keycap_profile': '', 'keycap_color': 'grey', 'label_color': 'black', 'label_size': 3, 'label_style': 4, 'width': Decimal('1'), 'height': Decimal('1')}
self.rows = Decimal(0)
self.columns = Decimal(0)
@@ -55,8 +55,6 @@ class KLE2xy(list):
current_key = self.key_skel.copy()
current_row = Decimal(0)
current_col = Decimal(0)
- current_x = 0
- current_y = self.key_width / 2
if isinstance(layout[0], dict):
self.attrs(layout[0])
@@ -76,18 +74,9 @@ class KLE2xy(list):
if 'h' in key and key['h'] != Decimal(1):
current_key['height'] = Decimal(key['h'])
if 'a' in key:
- current_key['label_style'] = self.key_skel['label_style'] = int(key['a'])
- if current_key['label_style'] < 0:
- current_key['label_style'] = 0
- elif current_key['label_style'] > 9:
- current_key['label_style'] = 9
+ current_key['label_style'] = self.key_skel['label_style'] = max(min(int(key['a']), 9), 0)
if 'f' in key:
- font_size = int(key['f'])
- if font_size > 9:
- font_size = 9
- elif font_size < 1:
- font_size = 1
- current_key['label_size'] = self.key_skel['label_size'] = font_size
+ current_key['label_size'] = self.key_skel['label_size'] = max(min(int(key['f']), 9), 1)
if 'p' in key:
current_key['keycap_profile'] = self.key_skel['keycap_profile'] = key['p']
if 'c' in key:
@@ -101,28 +90,21 @@ class KLE2xy(list):
current_key['label_color'] = self.key_skel['label_color'] = key['t']
if 'x' in key:
current_col += Decimal(key['x'])
- current_x += Decimal(key['x']) * self.key_width
if 'y' in key:
current_row += Decimal(key['y'])
- current_y += Decimal(key['y']) * self.key_width
if 'd' in key:
current_key['decal'] = True
else:
current_key['name'] = key
- current_key['row'] = current_row
- current_key['column'] = current_col
+ current_key['row'] = round(current_row, 2)
+ current_key['column'] = round(current_col, 2)
- # Determine the X center
- x_center = (current_key['width'] * self.key_width) / 2
- current_x += x_center
- current_key['x'] = current_x
- current_x += x_center
-
- # Determine the Y center
- y_center = (current_key['height'] * self.key_width) / 2
- y_offset = y_center - (self.key_width / 2)
- current_key['y'] = (current_y + y_offset)
+ # x,y (units mm) is the center of the key
+ x_center = current_col + current_key['width'] / 2
+ y_center = current_row + current_key['height'] / 2
+ current_key['x'] = x_center * self.key_width
+ current_key['y'] = y_center * self.key_width
# Tend to our row/col count
current_col += current_key['width']
@@ -138,8 +120,6 @@ class KLE2xy(list):
current_key = self.key_skel.copy()
# Move to the next row
- current_x = 0
- current_y += self.key_width
current_col = Decimal(0)
current_row += Decimal(1)
if current_row > self.rows:
diff --git a/lib/python/milc.py b/lib/python/milc.py
index 83edfc7f515..eb18984eb3f 100644
--- a/lib/python/milc.py
+++ b/lib/python/milc.py
@@ -242,15 +242,24 @@ class SubparserWrapper(object):
This also stores the default for the argument in `self.cli.default_arguments`.
"""
- if 'action' in kwargs and kwargs['action'] == 'store_boolean':
+ if kwargs.get('action') == 'store_boolean':
# Store boolean will call us again with the enable/disable flag arguments
return handle_store_boolean(self, *args, **kwargs)
self.cli.acquire_lock()
+ argument_name = self.cli.get_argument_name(*args, **kwargs)
+
self.subparser.add_argument(*args, **kwargs)
+
+ if kwargs.get('action') == 'store_false':
+ self.cli._config_store_false.append(argument_name)
+
+ if kwargs.get('action') == 'store_true':
+ self.cli._config_store_true.append(argument_name)
+
if self.submodule not in self.cli.default_arguments:
self.cli.default_arguments[self.submodule] = {}
- self.cli.default_arguments[self.submodule][self.cli.get_argument_name(*args, **kwargs)] = kwargs.get('default')
+ self.cli.default_arguments[self.submodule][argument_name] = kwargs.get('default')
self.cli.release_lock()
@@ -268,11 +277,13 @@ class MILC(object):
# Define some basic info
self.acquire_lock()
+ self._config_store_true = []
+ self._config_store_false = []
self._description = None
self._entrypoint = None
self._inside_context_manager = False
self.ansi = ansi_colors
- self.arg_only = []
+ self.arg_only = {}
self.config = self.config_source = None
self.config_file = None
self.default_arguments = {}
@@ -377,7 +388,7 @@ class MILC(object):
self.add_argument('--log-file', help='File to write log messages to')
self.add_argument('--color', action='store_boolean', default=True, help='color in output')
self.add_argument('--config-file', help='The location for the configuration file')
- self.arg_only.append('config_file')
+ self.arg_only['config_file'] = ['general']
def add_subparsers(self, title='Sub-commands', **kwargs):
if self._inside_context_manager:
@@ -427,17 +438,20 @@ class MILC(object):
raise RuntimeError('You must run this before the with statement!')
def argument_function(handler):
- if 'arg_only' in kwargs and kwargs['arg_only']:
+ subcommand_name = handler.__name__.replace("_", "-")
+
+ if kwargs.get('arg_only'):
arg_name = self.get_argument_name(*args, **kwargs)
- self.arg_only.append(arg_name)
+ if arg_name not in self.arg_only:
+ self.arg_only[arg_name] = []
+ self.arg_only[arg_name].append(subcommand_name)
del kwargs['arg_only']
- name = handler.__name__.replace("_", "-")
if handler is self._entrypoint:
self.add_argument(*args, **kwargs)
- elif name in self.subcommands:
- self.subcommands[name].add_argument(*args, **kwargs)
+ elif subcommand_name in self.subcommands:
+ self.subcommands[subcommand_name].add_argument(*args, **kwargs)
else:
raise RuntimeError('Decorated function is not entrypoint or subcommand!')
@@ -511,35 +525,37 @@ class MILC(object):
if argument in ('subparsers', 'entrypoint'):
continue
- if argument not in self.arg_only:
- # Find the argument's section
- # Underscores in command's names are converted to dashes during initialization.
- # TODO(Erovia) Find a better solution
- entrypoint_name = self._entrypoint.__name__.replace("_", "-")
- if entrypoint_name in self.default_arguments and argument in self.default_arguments[entrypoint_name]:
- argument_found = True
- section = self._entrypoint.__name__
- if argument in self.default_arguments['general']:
- argument_found = True
- section = 'general'
+ # Find the argument's section
+ # Underscores in command's names are converted to dashes during initialization.
+ # TODO(Erovia) Find a better solution
+ entrypoint_name = self._entrypoint.__name__.replace("_", "-")
+ if entrypoint_name in self.default_arguments and argument in self.default_arguments[entrypoint_name]:
+ argument_found = True
+ section = self._entrypoint.__name__
+ if argument in self.default_arguments['general']:
+ argument_found = True
+ section = 'general'
- if not argument_found:
- raise RuntimeError('Could not find argument in `self.default_arguments`. This should be impossible!')
- exit(1)
+ if not argument_found:
+ raise RuntimeError('Could not find argument in `self.default_arguments`. This should be impossible!')
+ exit(1)
+
+ if argument not in self.arg_only or section not in self.arg_only[argument]:
+ # Determine the arg value and source
+ arg_value = getattr(self.args, argument)
+ if argument in self._config_store_true and arg_value:
+ passed_on_cmdline = True
+ elif argument in self._config_store_false and not arg_value:
+ passed_on_cmdline = True
+ elif arg_value is not None:
+ passed_on_cmdline = True
+ else:
+ passed_on_cmdline = False
# Merge this argument into self.config
- if argument in self.default_arguments['general'] or argument in self.default_arguments[entrypoint_name]:
- arg_value = getattr(self.args, argument)
- if arg_value is not None:
- self.config[section][argument] = arg_value
- self.config_source[section][argument] = 'argument'
- else:
- if argument not in self.config[entrypoint_name]:
- # Check if the argument exist for this section
- arg = getattr(self.args, argument)
- if arg is not None:
- self.config[section][argument] = arg
- self.config_source[section][argument] = 'argument'
+ if passed_on_cmdline and (argument in self.default_arguments['general'] or argument in self.default_arguments[entrypoint_name] or argument not in self.config[entrypoint_name]):
+ self.config[section][argument] = arg_value
+ self.config_source[section][argument] = 'argument'
self.release_lock()
diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py
index eb524217cde..394a1353bc4 100644
--- a/lib/python/qmk/cli/__init__.py
+++ b/lib/python/qmk/cli/__init__.py
@@ -2,6 +2,8 @@
We list each subcommand here explicitly because all the reliable ways of searching for modules are slow and delay startup.
"""
+import sys
+
from milc import cli
from . import cformat
@@ -19,5 +21,6 @@ from . import new
from . import pyformat
from . import pytest
-if not hasattr(cli, 'config_source'):
- cli.log.warning("Your QMK CLI is out of date. Please upgrade with `pip3 install --upgrade qmk` or by using your package manager.")
+if sys.version_info[0] != 3 or sys.version_info[1] < 6:
+ cli.log.error('Your Python is too old! Please upgrade to Python 3.6 or later.')
+ exit(127)
diff --git a/lib/python/qmk/cli/cformat.py b/lib/python/qmk/cli/cformat.py
index 7e3a91dcf07..0cd8b6192a0 100644
--- a/lib/python/qmk/cli/cformat.py
+++ b/lib/python/qmk/cli/cformat.py
@@ -22,9 +22,8 @@ def cformat_run(files, all_files):
cli.log.warn('No changes detected. Use "qmk cformat -a" to format all files')
return False
if files and all_files:
- cli.log.warning('Filenames passed with -a, only formatting: %s', ','.join(cli.args.files))
- # 3.6+: Can remove the str casting, python will cast implicitly
- subprocess.run(clang_format + [str(file) for file in files], check=True)
+ cli.log.warning('Filenames passed with -a, only formatting: %s', ','.join(files))
+ subprocess.run(clang_format + [file for file in files], check=True)
cli.log.info('Successfully formatted the C code.')
except subprocess.CalledProcessError:
@@ -35,7 +34,7 @@ def cformat_run(files, all_files):
@cli.argument('-a', '--all-files', arg_only=True, action='store_true', help='Format all core files.')
@cli.argument('-b', '--base-branch', default='origin/master', help='Branch to compare to diffs to.')
@cli.argument('files', nargs='*', arg_only=True, help='Filename(s) to format.')
-@cli.subcommand("Format C code according to QMK's style.")
+@cli.subcommand("Format C code according to QMK's style.", hidden=False if cli.config.user.developer else True)
def cformat(cli):
"""Format C code according to QMK's style.
"""
diff --git a/lib/python/qmk/cli/docs.py b/lib/python/qmk/cli/docs.py
index 163c8b80155..58161065040 100644
--- a/lib/python/qmk/cli/docs.py
+++ b/lib/python/qmk/cli/docs.py
@@ -7,7 +7,7 @@ from milc import cli
@cli.argument('-p', '--port', default=8936, type=int, help='Port number to use.')
-@cli.subcommand('Run a local webserver for QMK documentation.')
+@cli.subcommand('Run a local webserver for QMK documentation.', hidden=False if cli.config.user.developer else True)
def docs(cli):
"""Spin up a local HTTPServer instance for the QMK docs.
"""
diff --git a/lib/python/qmk/cli/doctor.py b/lib/python/qmk/cli/doctor.py
index 9b81c8508be..636e49dab32 100755
--- a/lib/python/qmk/cli/doctor.py
+++ b/lib/python/qmk/cli/doctor.py
@@ -10,21 +10,41 @@ from pathlib import Path
from milc import cli
from qmk import submodules
from qmk.questions import yesno
+from qmk.commands import run
ESSENTIAL_BINARIES = {
'dfu-programmer': {},
'avrdude': {},
'dfu-util': {},
- 'avr-gcc': {},
- 'arm-none-eabi-gcc': {},
+ 'avr-gcc': {
+ 'version_arg': '-dumpversion'
+ },
+ 'arm-none-eabi-gcc': {
+ 'version_arg': '-dumpversion'
+ },
'bin/qmk': {},
}
ESSENTIAL_SUBMODULES = ['lib/chibios', 'lib/lufa']
-def _udev_rule(vid, pid=None):
+def _udev_rule(vid, pid=None, *args):
""" Helper function that return udev rules
"""
+ rule = ""
+ if pid:
+ rule = 'SUBSYSTEMS=="usb", ATTRS{idVendor}=="%s", ATTRS{idProduct}=="%s", TAG+="uaccess", RUN{builtin}+="uaccess"' % (vid, pid)
+ else:
+ rule = 'SUBSYSTEMS=="usb", ATTRS{idVendor}=="%s", TAG+="uaccess", RUN{builtin}+="uaccess"' % vid
+ if args:
+ rule = ', '.join([rule, *args])
+ return rule
+
+
+def _deprecated_udev_rule(vid, pid=None):
+ """ Helper function that return udev rules
+
+ Note: these are no longer the recommended rules, this is just used to check for them
+ """
if pid:
return 'SUBSYSTEMS=="usb", ATTRS{idVendor}=="%s", ATTRS{idProduct}=="%s", MODE:="0666"' % (vid, pid)
else:
@@ -35,9 +55,7 @@ def check_arm_gcc_version():
"""Returns True if the arm-none-eabi-gcc version is not known to cause problems.
"""
if 'output' in ESSENTIAL_BINARIES['arm-none-eabi-gcc']:
- first_line = ESSENTIAL_BINARIES['arm-none-eabi-gcc']['output'].split('\n')[0]
- second_half = first_line.split(')', 1)[1].strip()
- version_number = second_half.split()[0]
+ version_number = ESSENTIAL_BINARIES['arm-none-eabi-gcc']['output'].strip()
cli.log.info('Found arm-none-eabi-gcc version %s', version_number)
return True # Right now all known arm versions are ok
@@ -47,8 +65,7 @@ def check_avr_gcc_version():
"""Returns True if the avr-gcc version is not known to cause problems.
"""
if 'output' in ESSENTIAL_BINARIES['avr-gcc']:
- first_line = ESSENTIAL_BINARIES['avr-gcc']['output'].split('\n')[0]
- version_number = first_line.split()[2]
+ version_number = ESSENTIAL_BINARIES['avr-gcc']['output'].strip()
major, minor, rest = version_number.split('.', 2)
if int(major) > 8:
@@ -61,6 +78,33 @@ def check_avr_gcc_version():
return False
+def check_avrdude_version():
+ if 'output' in ESSENTIAL_BINARIES['avrdude']:
+ last_line = ESSENTIAL_BINARIES['avrdude']['output'].split('\n')[-2]
+ version_number = last_line.split()[2][:-1]
+ cli.log.info('Found avrdude version %s', version_number)
+
+ return True
+
+
+def check_dfu_util_version():
+ if 'output' in ESSENTIAL_BINARIES['dfu-util']:
+ first_line = ESSENTIAL_BINARIES['dfu-util']['output'].split('\n')[0]
+ version_number = first_line.split()[1]
+ cli.log.info('Found dfu-util version %s', version_number)
+
+ return True
+
+
+def check_dfu_programmer_version():
+ if 'output' in ESSENTIAL_BINARIES['dfu-programmer']:
+ first_line = ESSENTIAL_BINARIES['dfu-programmer']['output'].split('\n')[0]
+ version_number = first_line.split()[1]
+ cli.log.info('Found dfu-programmer version %s', version_number)
+
+ return True
+
+
def check_binaries():
"""Iterates through ESSENTIAL_BINARIES and tests them.
"""
@@ -99,32 +143,48 @@ def check_udev_rules():
udev_dir = Path("/etc/udev/rules.d/")
desired_rules = {
'dfu': {_udev_rule("03eb", "2ff4"), _udev_rule("03eb", "2ffb"), _udev_rule("03eb", "2ff0")},
- 'tmk': {_udev_rule("feed")},
- 'input_club': {_udev_rule("1c11")},
+ 'input_club': {_udev_rule("1c11", "b007")},
'stm32': {_udev_rule("1eaf", "0003"), _udev_rule("0483", "df11")},
- 'caterina': {'ATTRS{idVendor}=="2a03", ENV{ID_MM_DEVICE_IGNORE}="1"', 'ATTRS{idVendor}=="2341", ENV{ID_MM_DEVICE_IGNORE}="1"'},
+ 'bootloadhid': {_udev_rule("16c0", "05df")},
+ 'caterina': {
+ _udev_rule("2341", "0036", 'ENV{ID_MM_DEVICE_IGNORE}="1"'),
+ _udev_rule("1b4f", "9205", 'ENV{ID_MM_DEVICE_IGNORE}="1"'),
+ _udev_rule("1b4f", "9203", 'ENV{ID_MM_DEVICE_IGNORE}="1"'),
+ _udev_rule("2a03", "0036", 'ENV{ID_MM_DEVICE_IGNORE}="1"')
+ }
+ }
+
+ # These rules are no longer recommended, only use them to check for their presence.
+ deprecated_rules = {
+ 'dfu': {_deprecated_udev_rule("03eb", "2ff4"), _deprecated_udev_rule("03eb", "2ffb"), _deprecated_udev_rule("03eb", "2ff0")},
+ 'input_club': {_deprecated_udev_rule("1c11")},
+ 'stm32': {_deprecated_udev_rule("1eaf", "0003"), _deprecated_udev_rule("0483", "df11")},
+ 'bootloadhid': {_deprecated_udev_rule("16c0", "05df")},
+ 'caterina': {'ATTRS{idVendor}=="2a03", ENV{ID_MM_DEVICE_IGNORE}="1"', 'ATTRS{idVendor}=="2341", ENV{ID_MM_DEVICE_IGNORE}="1"'}
}
if udev_dir.exists():
- udev_rules = [str(rule_file) for rule_file in udev_dir.glob('*.rules')]
+ udev_rules = [rule_file for rule_file in udev_dir.glob('*.rules')]
current_rules = set()
# Collect all rules from the config files
for rule_file in udev_rules:
- with open(rule_file, "r") as fd:
- for line in fd.readlines():
- line = line.strip()
- if not line.startswith("#") and len(line):
- current_rules.add(line)
+ for line in rule_file.read_text().split('\n'):
+ line = line.strip()
+ if not line.startswith("#") and len(line):
+ current_rules.add(line)
# Check if the desired rules are among the currently present rules
for bootloader, rules in desired_rules.items():
+ # For caterina, check if ModemManager is running
+ if bootloader == "caterina":
+ if check_modem_manager():
+ ok = False
+ cli.log.warn("{bg_yellow}Detected ModemManager without the necessary udev rules. Please either disable it or set the appropriate udev rules if you are using a Pro Micro.")
if not rules.issubset(current_rules):
- # If the rules for catalina are not present, check if ModemManager is running
- if bootloader == "caterina":
- if check_modem_manager():
- ok = False
- cli.log.warn("{bg_yellow}Detected ModemManager without udev rules. Please either disable it or set the appropriate udev rules if you are using a Pro Micro.")
+ deprecated_rule = deprecated_rules.get(bootloader)
+ if deprecated_rule and deprecated_rule.issubset(current_rules):
+ cli.log.warn("{bg_yellow}Found old, deprecated udev rules for '%s' boards. The new rules on https://docs.qmk.fm/#/faq_build?id=linux-udev-rules offer better security with the same functionality.", bootloader)
else:
cli.log.warn("{bg_yellow}Missing udev rules for '%s' boards. You'll need to use `sudo` in order to flash them.", bootloader)
@@ -135,7 +195,7 @@ def check_modem_manager():
"""Returns True if ModemManager is running.
"""
if shutil.which("systemctl"):
- mm_check = subprocess.run(["systemctl", "--quiet", "is-active", "ModemManager.service"], timeout=10)
+ mm_check = run(["systemctl", "--quiet", "is-active", "ModemManager.service"], timeout=10)
if mm_check.returncode == 0:
return True
@@ -153,14 +213,16 @@ def is_executable(command):
return False
# Make sure the command can be executed
- check = subprocess.run([command, '--version'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=5, universal_newlines=True)
+ version_arg = ESSENTIAL_BINARIES[command].get('version_arg', '--version')
+ check = run([command, version_arg], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=5, universal_newlines=True)
+
ESSENTIAL_BINARIES[command]['output'] = check.stdout
if check.returncode in [0, 1]: # Older versions of dfu-programmer exit 1
cli.log.debug('Found {fg_cyan}%s', command)
return True
- cli.log.error("{fg_red}Can't run `%s --version`", command)
+ cli.log.error("{fg_red}Can't run `%s %s`", command, version_arg)
return False
@@ -207,19 +269,19 @@ def doctor(cli):
ok = True
# Determine our OS and run platform specific tests
- OS = platform.platform().lower() # noqa (N806), uppercase name is ok in this instance
+ platform_id = platform.platform().lower()
- if 'darwin' in OS or 'macos' in OS:
+ if 'darwin' in platform_id or 'macos' in platform_id:
if not os_test_macos():
ok = False
- elif 'linux' in OS:
+ elif 'linux' in platform_id:
if not os_test_linux():
ok = False
- elif 'windows' in OS:
+ elif 'windows' in platform_id:
if not os_test_windows():
ok = False
else:
- cli.log.error('Unsupported OS detected: %s', OS)
+ cli.log.error('Unsupported OS detected: %s', platform_id)
ok = False
# Make sure the basic CLI tools we need are available and can be executed.
@@ -227,7 +289,7 @@ def doctor(cli):
if not bin_ok:
if yesno('Would you like to install dependencies?', default=True):
- subprocess.run(['util/qmk_install.sh'])
+ run(['util/qmk_install.sh'])
bin_ok = check_binaries()
if bin_ok:
@@ -236,11 +298,9 @@ def doctor(cli):
ok = False
# Make sure the tools are at the correct version
- if not check_arm_gcc_version():
- ok = False
-
- if not check_avr_gcc_version():
- ok = False
+ for check in (check_arm_gcc_version, check_avr_gcc_version, check_avrdude_version, check_dfu_util_version, check_dfu_programmer_version):
+ if not check():
+ ok = False
# Check out the QMK submodules
sub_ok = check_submodules()
diff --git a/lib/python/qmk/cli/hello.py b/lib/python/qmk/cli/hello.py
index bee28c30133..5119188a079 100755
--- a/lib/python/qmk/cli/hello.py
+++ b/lib/python/qmk/cli/hello.py
@@ -6,7 +6,7 @@ from milc import cli
@cli.argument('-n', '--name', default='World', help='Name to greet.')
-@cli.subcommand('QMK Hello World.')
+@cli.subcommand('QMK Hello World.', hidden=False if cli.config.user.developer else True)
def hello(cli):
"""Log a friendly greeting.
"""
diff --git a/lib/python/qmk/cli/json/keymap.py b/lib/python/qmk/cli/json/keymap.py
index 6e25b7862bb..c97a2d04625 100755
--- a/lib/python/qmk/cli/json/keymap.py
+++ b/lib/python/qmk/cli/json/keymap.py
@@ -8,7 +8,7 @@ from milc import cli
@cli.argument('-o', '--output', arg_only=True, type=Path, help='File to write to')
@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages")
@cli.argument('filename', arg_only=True, help='Configurator JSON file')
-@cli.subcommand('Creates a keymap.c from a QMK Configurator export.')
+@cli.subcommand('Creates a keymap.c from a QMK Configurator export.', hidden=True)
def json_keymap(cli):
"""Renamed to `qmk json2c`.
"""
diff --git a/lib/python/qmk/cli/json2c.py b/lib/python/qmk/cli/json2c.py
index 46c4d04bb70..52184050707 100755
--- a/lib/python/qmk/cli/json2c.py
+++ b/lib/python/qmk/cli/json2c.py
@@ -10,29 +10,27 @@ import qmk.path
@cli.argument('-o', '--output', arg_only=True, type=qmk.path.normpath, help='File to write to')
@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages")
-@cli.argument('filename', arg_only=True, help='Configurator JSON file')
+@cli.argument('filename', type=qmk.path.normpath, arg_only=True, help='Configurator JSON file')
@cli.subcommand('Creates a keymap.c from a QMK Configurator export.')
def json2c(cli):
"""Generate a keymap.c from a configurator export.
This command uses the `qmk.keymap` module to generate a keymap.c from a configurator export. The generated keymap is written to stdout, or to a file if -o is provided.
"""
- cli.args.filename = qmk.path.normpath(cli.args.filename)
-
# Error checking
if not cli.args.filename.exists():
cli.log.error('JSON file does not exist!')
cli.print_usage()
exit(1)
- if str(cli.args.filename) == '-':
+ if cli.args.filename.name == '-':
# TODO(skullydazed/anyone): Read file contents from STDIN
cli.log.error('Reading from STDIN is not (yet) supported.')
cli.print_usage()
exit(1)
# Environment processing
- if cli.args.output == ('-'):
+ if cli.args.output.name == ('-'):
cli.args.output = None
# Parse the configurator json
diff --git a/lib/python/qmk/cli/kle2json.py b/lib/python/qmk/cli/kle2json.py
index 00f63d36223..798f95fd196 100755
--- a/lib/python/qmk/cli/kle2json.py
+++ b/lib/python/qmk/cli/kle2json.py
@@ -26,7 +26,7 @@ class CustomJSONEncoder(json.JSONEncoder):
@cli.argument('filename', help='The KLE raw txt to convert')
@cli.argument('-f', '--force', action='store_true', help='Flag to overwrite current info.json')
-@cli.subcommand('Convert a KLE layout to a Configurator JSON')
+@cli.subcommand('Convert a KLE layout to a Configurator JSON', hidden=False if cli.config.user.developer else True)
def kle2json(cli):
"""Convert a KLE layout to QMK's layout format.
""" # If filename is a path
@@ -37,12 +37,12 @@ def kle2json(cli):
file_path = Path(os.environ['ORIG_CWD'], cli.args.filename)
# Check for valid file_path for more graceful failure
if not file_path.exists():
- return cli.log.error('File {fg_cyan}%s{style_reset_all} was not found.', str(file_path))
+ return cli.log.error('File {fg_cyan}%s{style_reset_all} was not found.', file_path)
out_path = file_path.parent
raw_code = file_path.open().read()
# Check if info.json exists, allow overwrite with force
if Path(out_path, "info.json").exists() and not cli.args.force:
- cli.log.error('File {fg_cyan}%s/info.json{style_reset_all} already exists, use -f or --force to overwrite.', str(out_path))
+ cli.log.error('File {fg_cyan}%s/info.json{style_reset_all} already exists, use -f or --force to overwrite.', out_path)
return False
try:
# Convert KLE raw to x/y coordinates (using kle2xy package from skullydazed)
@@ -69,7 +69,7 @@ def kle2json(cli):
# Replace layout in keyboard json
keyboard = keyboard.replace('"LAYOUT_JSON_HERE"', layout)
# Write our info.json
- file = open(str(out_path) + "/info.json", "w")
+ file = open(out_path / "info.json", "w")
file.write(keyboard)
file.close()
- cli.log.info('Wrote out {fg_cyan}%s/info.json', str(out_path))
+ cli.log.info('Wrote out {fg_cyan}%s/info.json', out_path)
diff --git a/lib/python/qmk/cli/new/keymap.py b/lib/python/qmk/cli/new/keymap.py
index 5ae26285659..474fe7974f8 100755
--- a/lib/python/qmk/cli/new/keymap.py
+++ b/lib/python/qmk/cli/new/keymap.py
@@ -40,7 +40,7 @@ def new_keymap(cli):
exit(1)
# create user directory with default keymap files
- shutil.copytree(str(keymap_path_default), str(keymap_path_new), symlinks=True)
+ shutil.copytree(keymap_path_default, keymap_path_new, symlinks=True)
# end message to user
cli.log.info("%s keymap directory created in: %s", keymap, keymap_path_new)
diff --git a/lib/python/qmk/cli/pyformat.py b/lib/python/qmk/cli/pyformat.py
index a53ba40c0a6..14644438045 100755
--- a/lib/python/qmk/cli/pyformat.py
+++ b/lib/python/qmk/cli/pyformat.py
@@ -5,7 +5,7 @@ from milc import cli
import subprocess
-@cli.subcommand("Format python code according to QMK's style.")
+@cli.subcommand("Format python code according to QMK's style.", hidden=False if cli.config.user.developer else True)
def pyformat(cli):
"""Format python code according to QMK's style.
"""
diff --git a/lib/python/qmk/cli/pytest.py b/lib/python/qmk/cli/pytest.py
index 09611d750fc..5417a9cb34a 100644
--- a/lib/python/qmk/cli/pytest.py
+++ b/lib/python/qmk/cli/pytest.py
@@ -7,7 +7,7 @@ import subprocess
from milc import cli
-@cli.subcommand('QMK Python Unit Tests')
+@cli.subcommand('QMK Python Unit Tests', hidden=False if cli.config.user.developer else True)
def pytest(cli):
"""Run several linting/testing commands.
"""
diff --git a/lib/python/qmk/commands.py b/lib/python/qmk/commands.py
index 3d4ed161636..5d2a03c9a8a 100644
--- a/lib/python/qmk/commands.py
+++ b/lib/python/qmk/commands.py
@@ -1,6 +1,11 @@
"""Helper functions for commands.
"""
import json
+import os
+import platform
+import subprocess
+import shlex
+import shutil
import qmk.keymap
@@ -24,11 +29,12 @@ def create_make_command(keyboard, keymap, target=None):
A command that can be run to make the specified keyboard and keymap
"""
make_args = [keyboard, keymap]
+ make_cmd = 'gmake' if shutil.which('gmake') else 'make'
if target:
make_args.append(target)
- return ['make', ':'.join(make_args)]
+ return [make_cmd, ':'.join(make_args)]
def compile_configurator_json(user_keymap, bootloader=None):
@@ -61,3 +67,19 @@ def parse_configurator_json(configurator_file):
user_keymap = json.load(configurator_file)
return user_keymap
+
+
+def run(command, *args, **kwargs):
+ """Run a command with subprocess.run
+ """
+ platform_id = platform.platform().lower()
+
+ if isinstance(command, str):
+ raise TypeError('`command` must be a non-text sequence such as list or tuple.')
+
+ if 'windows' in platform_id:
+ safecmd = map(shlex.quote, command)
+ safecmd = ' '.join(safecmd)
+ command = [os.environ['SHELL'], '-c', safecmd]
+
+ return subprocess.run(command, *args, **kwargs)
diff --git a/lib/python/qmk/keymap.py b/lib/python/qmk/keymap.py
index b91ba89bedd..69cdc8d5b5a 100644
--- a/lib/python/qmk/keymap.py
+++ b/lib/python/qmk/keymap.py
@@ -1,6 +1,5 @@
"""Functions that help you work with QMK keymaps.
"""
-import os
from pathlib import Path
import qmk.path
@@ -11,7 +10,7 @@ DEFAULT_KEYMAP_C = """#include QMK_KEYBOARD_H
/* THIS FILE WAS GENERATED!
*
- * This file was generated by qmk-compile-json. You may or may not want to
+ * This file was generated by qmk json2c. You may or may not want to
* edit it directly.
*/
@@ -39,6 +38,15 @@ def template(keyboard):
return DEFAULT_KEYMAP_C
+def _strip_any(keycode):
+ """Remove ANY() from a keycode.
+ """
+ if keycode.startswith('ANY(') and keycode.endswith(')'):
+ keycode = keycode[4:-1]
+
+ return keycode
+
+
def generate(keyboard, layout, layers):
"""Returns a keymap.c for the specified keyboard, layout, and layers.
@@ -53,9 +61,12 @@ def generate(keyboard, layout, layers):
An array of arrays describing the keymap. Each item in the inner array should be a string that is a valid QMK keycode.
"""
layer_txt = []
+
for layer_num, layer in enumerate(layers):
if layer_num != 0:
layer_txt[-1] = layer_txt[-1] + ','
+
+ layer = map(_strip_any, layer)
layer_keys = ', '.join(layer)
layer_txt.append('\t[%s] = %s(%s)' % (layer_num, layout, layer_keys))
@@ -115,7 +126,7 @@ def list_keymaps(keyboard_name):
while kb_path != keyboards_dir:
keymaps_dir = kb_path / "keymaps"
if keymaps_dir.exists():
- names = names.union([keymap for keymap in os.listdir(str(keymaps_dir)) if (keymaps_dir / keymap / "keymap.c").is_file()])
+ names = names.union([keymap for keymap in keymaps_dir.iterdir() if (keymaps_dir / keymap / "keymap.c").is_file()])
kb_path = kb_path.parent
# if community layouts are supported, get them
@@ -123,6 +134,6 @@ def list_keymaps(keyboard_name):
for layout in rules_mk["LAYOUTS"].split():
cl_path = Path.cwd() / "layouts" / "community" / layout
if cl_path.exists():
- names = names.union([keymap for keymap in os.listdir(str(cl_path)) if (cl_path / keymap / "keymap.c").is_file()])
+ names = names.union([keymap for keymap in cl_path.iterdir() if (cl_path / keymap / "keymap.c").is_file()])
return sorted(names)
diff --git a/lib/python/qmk/tests/test_cli_commands.py b/lib/python/qmk/tests/test_cli_commands.py
index a2595eb7887..3b4e66a211d 100644
--- a/lib/python/qmk/tests/test_cli_commands.py
+++ b/lib/python/qmk/tests/test_cli_commands.py
@@ -1,9 +1,10 @@
import subprocess
+from qmk.commands import run
def check_subcommand(command, *args):
cmd = ['bin/qmk', command] + list(args)
- return subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
+ return run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
def test_cformat():
diff --git a/quantum/audio/audio.c b/quantum/audio/audio_avr.c
similarity index 100%
rename from quantum/audio/audio.c
rename to quantum/audio/audio_avr.c
diff --git a/quantum/audio/audio_arm.c b/quantum/audio/audio_chibios.c
similarity index 100%
rename from quantum/audio/audio_arm.c
rename to quantum/audio/audio_chibios.c
diff --git a/quantum/audio/song_list.h b/quantum/audio/song_list.h
index 3d0e0e51ed8..b20acd11441 100644
--- a/quantum/audio/song_list.h
+++ b/quantum/audio/song_list.h
@@ -112,7 +112,7 @@
/* Title: La Campanella
* Author/Composer: Frank Lizst
- + License: Public Domain
+ * License: Public Domain
*/
#define CAMPANELLA \
Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS5), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_CS5), E__NOTE(_CS5), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_G4), E__NOTE(_G4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_DS4), E__NOTE(_DS4), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_E5), E__NOTE(_E5), E__NOTE(_DS6), Q__NOTE(_DS5), E__NOTE(_DS5), E__NOTE(_DS6), Q__NOTE(_CS5), E__NOTE(_CS5), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_B4), E__NOTE(_B4), E__NOTE(_DS6), Q__NOTE(_AS4), E__NOTE(_AS4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_G4), E__NOTE(_G4), E__NOTE(_DS6), Q__NOTE(_GS4), E__NOTE(_GS4), E__NOTE(_DS6), Q__NOTE(_AS4), \
@@ -128,12 +128,18 @@
/* Title: Nocturne Op. 9 No. 1 in B flat minor
* Author/Composer: Chopin
- License: Public Domain
-*/
+ * License: Public Domain
+ */
#define NOCTURNE_OP_9_NO_1 \
H__NOTE(_BF5), H__NOTE(_C6), H__NOTE(_DF6), H__NOTE(_A5), H__NOTE(_BF5), H__NOTE(_GF5), W__NOTE(_F5), W__NOTE(_F5), W__NOTE(_F5), W__NOTE(_F5), H__NOTE(_GF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_C5), B__NOTE(_DF5), W__NOTE(_BF4), Q__NOTE(_BF5), Q__NOTE(_C6), Q__NOTE(_DF6), Q__NOTE(_A5), Q__NOTE(_BF5), Q__NOTE(_A5), Q__NOTE(_GS5), Q__NOTE(_A5), Q__NOTE(_C6), Q__NOTE(_BF5), Q__NOTE(_GF5), Q__NOTE(_F5), Q__NOTE(_GF5), Q__NOTE(_E5), Q__NOTE(_F5), Q__NOTE(_BF5), Q__NOTE(_A5), Q__NOTE(_AF5), Q__NOTE(_G5), Q__NOTE(_GF5), Q__NOTE(_F5), Q__NOTE(_E5), Q__NOTE(_EF5), Q__NOTE(_D5), Q__NOTE(_DF5), Q__NOTE(_C5), Q__NOTE(_DF5), Q__NOTE(_C5), Q__NOTE(_B4), Q__NOTE(_C5), Q__NOTE(_F5), Q__NOTE(_E5), Q__NOTE(_EF5), B__NOTE(_DF5), W__NOTE(_BF4), W__NOTE(_BF5), W__NOTE(_BF5), W__NOTE(_BF5), BD_NOTE(_AF5), W__NOTE(_DF5), H__NOTE(_BF4), H__NOTE(_C5), H__NOTE(_DF5), H__NOTE(_GF5), H__NOTE(_GF5), BD_NOTE(_F5), W__NOTE(_EF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_DF5), H__NOTE(_A4), B__NOTE(_AF4), \
W__NOTE(_DF5), W__NOTE(_EF5), H__NOTE(_F5), H__NOTE(_EF5), H__NOTE(_DF5), H__NOTE(_EF5), BD_NOTE(_F5),
+/* Title: State Anthem of the Soviet Union
+ * Author/Composer: Alexander Alexandrov
+ * License: Public Domain
+ */
+#define USSR_ANTHEM B__NOTE(_G6), B__NOTE(_C7), W__NOTE(_G6), H__NOTE(_A6), B__NOTE(_B6), W__NOTE(_E6), W__NOTE(_E6), B__NOTE(_A6), W__NOTE(_G6), H__NOTE(_F6), B__NOTE(_G6), W__NOTE(_C6), W__NOTE(_C6), B__NOTE(_D6), W__NOTE(_D6), W__NOTE(_E6), B__NOTE(_D6), W__NOTE(_D6), W__NOTE(_G6), B__NOTE(_F6), W__NOTE(_G6), W__NOTE(_A6), B__NOTE(_B6),
+
/* Removed sounds
+ This list is here solely for compatibility, so that removed songs don't just break things
* If you think that any of these songs were wrongfully removed, let us know and provide
diff --git a/quantum/backlight/backlight_arm.c b/quantum/backlight/backlight_chibios.c
similarity index 100%
rename from quantum/backlight/backlight_arm.c
rename to quantum/backlight/backlight_chibios.c
diff --git a/quantum/config_common.h b/quantum/config_common.h
index f981f3f8cbd..9861c867809 100644
--- a/quantum/config_common.h
+++ b/quantum/config_common.h
@@ -21,7 +21,7 @@
#define ROW2COL 1
// useful for direct pin mapping
-#define NO_PIN (~0)
+#define NO_PIN (pin_t)(~0)
#ifdef __AVR__
# ifndef __ASSEMBLER__
@@ -63,6 +63,9 @@
# define PINB_ADDRESS 0x3
# define PINC_ADDRESS 0x6
# define PIND_ADDRESS 0x9
+# elif defined(__AVR_ATtiny85__)
+# define ADDRESS_BASE 0x10
+# define PINB_ADDRESS 0x6
# else
# error "Pins are not defined"
# endif
diff --git a/quantum/debounce/eager_pk.c b/quantum/debounce/eager_pk.c
index 76b978d059e..93a40ad4411 100644
--- a/quantum/debounce/eager_pk.c
+++ b/quantum/debounce/eager_pk.c
@@ -27,13 +27,7 @@ No further inputs are accepted until DEBOUNCE milliseconds have occurred.
# define DEBOUNCE 5
#endif
-#if (MATRIX_COLS <= 8)
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define ROW_SHIFTER ((uint32_t)1)
-#endif
+#define ROW_SHIFTER ((matrix_row_t)1)
#define debounce_counter_t uint8_t
@@ -44,6 +38,16 @@ static bool matrix_need_update;
#define DEBOUNCE_ELAPSED 251
#define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1)
+static uint8_t wrapping_timer_read(void) {
+ static uint16_t time = 0;
+ static uint8_t last_result = 0;
+ uint16_t new_time = timer_read();
+ uint16_t diff = new_time - time;
+ time = new_time;
+ last_result = (last_result + diff) % (MAX_DEBOUNCE + 1);
+ return last_result;
+}
+
void update_debounce_counters(uint8_t num_rows, uint8_t current_time);
void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time);
@@ -59,7 +63,7 @@ void debounce_init(uint8_t num_rows) {
}
void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) {
- uint8_t current_time = timer_read() % MAX_DEBOUNCE;
+ uint8_t current_time = wrapping_timer_read();
if (counters_need_update) {
update_debounce_counters(num_rows, current_time);
}
diff --git a/quantum/debounce/eager_pr.c b/quantum/debounce/eager_pr.c
index 173ad15ee92..d12931fddbf 100644
--- a/quantum/debounce/eager_pr.c
+++ b/quantum/debounce/eager_pr.c
@@ -36,6 +36,16 @@ static bool counters_need_update;
#define DEBOUNCE_ELAPSED 251
#define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1)
+static uint8_t wrapping_timer_read(void) {
+ static uint16_t time = 0;
+ static uint8_t last_result = 0;
+ uint16_t new_time = timer_read();
+ uint16_t diff = new_time - time;
+ time = new_time;
+ last_result = (last_result + diff) % (MAX_DEBOUNCE + 1);
+ return last_result;
+}
+
void update_debounce_counters(uint8_t num_rows, uint8_t current_time);
void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time);
@@ -48,7 +58,7 @@ void debounce_init(uint8_t num_rows) {
}
void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) {
- uint8_t current_time = timer_read() % MAX_DEBOUNCE;
+ uint8_t current_time = wrapping_timer_read();
bool needed_update = counters_need_update;
if (counters_need_update) {
update_debounce_counters(num_rows, current_time);
diff --git a/quantum/debounce/sym_pk.c b/quantum/debounce/sym_pk.c
new file mode 100644
index 00000000000..f404cf9c44a
--- /dev/null
+++ b/quantum/debounce/sym_pk.c
@@ -0,0 +1,111 @@
+/*
+Copyright 2017 Alex Ong
+Copyright 2020 Andrei Purdea
+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 .
+*/
+
+/*
+Basic symmetric per-key algorithm. Uses an 8-bit counter per key.
+When no state changes have occured for DEBOUNCE milliseconds, we push the state.
+*/
+
+#include "matrix.h"
+#include "timer.h"
+#include "quantum.h"
+#include
+
+#ifndef DEBOUNCE
+# define DEBOUNCE 5
+#endif
+
+#define ROW_SHIFTER ((matrix_row_t)1)
+
+#define debounce_counter_t uint8_t
+
+static debounce_counter_t *debounce_counters;
+static bool counters_need_update;
+
+#define DEBOUNCE_ELAPSED 251
+#define MAX_DEBOUNCE (DEBOUNCE_ELAPSED - 1)
+
+static uint8_t wrapping_timer_read(void) {
+ static uint16_t time = 0;
+ static uint8_t last_result = 0;
+ uint16_t new_time = timer_read();
+ uint16_t diff = new_time - time;
+ time = new_time;
+ last_result = (last_result + diff) % (MAX_DEBOUNCE + 1);
+ return last_result;
+}
+
+void update_debounce_counters_and_transfer_if_expired(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time);
+void start_debounce_counters(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time);
+
+// we use num_rows rather than MATRIX_ROWS to support split keyboards
+void debounce_init(uint8_t num_rows) {
+ debounce_counters = (debounce_counter_t *)malloc(num_rows * MATRIX_COLS * sizeof(debounce_counter_t));
+ int i = 0;
+ for (uint8_t r = 0; r < num_rows; r++) {
+ for (uint8_t c = 0; c < MATRIX_COLS; c++) {
+ debounce_counters[i++] = DEBOUNCE_ELAPSED;
+ }
+ }
+}
+
+void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) {
+ uint8_t current_time = wrapping_timer_read();
+ if (counters_need_update) {
+ update_debounce_counters_and_transfer_if_expired(raw, cooked, num_rows, current_time);
+ }
+
+ if (changed) {
+ start_debounce_counters(raw, cooked, num_rows, current_time);
+ }
+}
+
+void update_debounce_counters_and_transfer_if_expired(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) {
+ counters_need_update = false;
+ debounce_counter_t *debounce_pointer = debounce_counters;
+ for (uint8_t row = 0; row < num_rows; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ if (*debounce_pointer != DEBOUNCE_ELAPSED) {
+ if (TIMER_DIFF(current_time, *debounce_pointer, MAX_DEBOUNCE) >= DEBOUNCE) {
+ *debounce_pointer = DEBOUNCE_ELAPSED;
+ cooked[row] = (cooked[row] & ~(ROW_SHIFTER << col)) | (raw[row] & (ROW_SHIFTER << col));
+ } else {
+ counters_need_update = true;
+ }
+ }
+ debounce_pointer++;
+ }
+ }
+}
+
+void start_debounce_counters(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, uint8_t current_time) {
+ debounce_counter_t *debounce_pointer = debounce_counters;
+ for (uint8_t row = 0; row < num_rows; row++) {
+ matrix_row_t delta = raw[row] ^ cooked[row];
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ if (delta & (ROW_SHIFTER << col)) {
+ if (*debounce_pointer == DEBOUNCE_ELAPSED) {
+ *debounce_pointer = current_time;
+ counters_need_update = true;
+ }
+ } else {
+ *debounce_pointer = DEBOUNCE_ELAPSED;
+ }
+ debounce_pointer++;
+ }
+ }
+}
+
+bool debounce_active(void) { return true; }
diff --git a/quantum/dip_switch.c b/quantum/dip_switch.c
index ab74222d100..66c166ce45d 100644
--- a/quantum/dip_switch.c
+++ b/quantum/dip_switch.c
@@ -52,13 +52,13 @@ void dip_switch_read(bool forced) {
for (uint8_t i = 0; i < NUMBER_OF_DIP_SWITCHES; i++) {
dip_switch_state[i] = !readPin(dip_switch_pad[i]);
dip_switch_mask |= dip_switch_state[i] << i;
- if (last_dip_switch_state[i] ^ dip_switch_state[i] || forced) {
+ if (last_dip_switch_state[i] != dip_switch_state[i] || forced) {
has_dip_state_changed = true;
dip_switch_update_kb(i, dip_switch_state[i]);
}
}
if (has_dip_state_changed) {
dip_switch_update_mask_kb(dip_switch_mask);
+ memcpy(last_dip_switch_state, dip_switch_state, sizeof(dip_switch_state));
}
- memcpy(last_dip_switch_state, dip_switch_state, sizeof(&dip_switch_state));
}
diff --git a/quantum/keymap_common.c b/quantum/keymap_common.c
index f34ba26e5ac..570d4798deb 100644
--- a/quantum/keymap_common.c
+++ b/quantum/keymap_common.c
@@ -51,17 +51,23 @@ action_t action_for_key(uint8_t layer, keypos_t key) {
action_t action = {};
uint8_t action_layer, when, mod;
+ (void)action_layer;
+ (void)when;
+ (void)mod;
+
switch (keycode) {
case KC_A ... KC_EXSEL:
case KC_LCTRL ... KC_RGUI:
action.code = ACTION_KEY(keycode);
break;
+#ifdef EXTRAKEY_ENABLE
case KC_SYSTEM_POWER ... KC_SYSTEM_WAKE:
action.code = ACTION_USAGE_SYSTEM(KEYCODE2SYSTEM(keycode));
break;
case KC_AUDIO_MUTE ... KC_BRIGHTNESS_DOWN:
action.code = ACTION_USAGE_CONSUMER(KEYCODE2CONSUMER(keycode));
break;
+#endif
#ifdef MOUSEKEY_ENABLE
case KC_MS_UP ... KC_MS_ACCEL2:
action.code = ACTION_MOUSEKEY(keycode);
@@ -93,6 +99,7 @@ action_t action_for_key(uint8_t layer, keypos_t key) {
action.code = ACTION_MACRO(keycode & 0xFF);
break;
#endif
+#ifndef NO_ACTION_LAYER
case QK_LAYER_TAP ... QK_LAYER_TAP_MAX:
action.code = ACTION_LAYER_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
break;
@@ -117,6 +124,8 @@ action_t action_for_key(uint8_t layer, keypos_t key) {
action_layer = keycode & 0xFF;
action.code = ACTION_LAYER_TOGGLE(action_layer);
break;
+#endif
+#ifndef NO_ACTION_ONESHOT
case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX:;
// OSL(action_layer) - One-shot action_layer
action_layer = keycode & 0xFF;
@@ -127,6 +136,8 @@ action_t action_for_key(uint8_t layer, keypos_t key) {
mod = mod_config(keycode & 0xFF);
action.code = ACTION_MODS_ONESHOT(mod);
break;
+#endif
+#ifndef NO_ACTION_LAYER
case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX:
action.code = ACTION_LAYER_TAP_TOGGLE(keycode & 0xFF);
break;
@@ -135,10 +146,13 @@ action_t action_for_key(uint8_t layer, keypos_t key) {
action_layer = (keycode >> 4) & 0xF;
action.code = ACTION_LAYER_MODS(action_layer, mod);
break;
+#endif
+#ifndef NO_ACTION_TAPPING
case QK_MOD_TAP ... QK_MOD_TAP_MAX:
mod = mod_config((keycode >> 0x8) & 0x1F);
action.code = ACTION_MODS_TAP_KEY(mod, keycode & 0xFF);
break;
+#endif
#ifdef SWAP_HANDS_ENABLE
case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX:
action.code = ACTION(ACT_SWAP_HANDS, keycode & 0xff);
diff --git a/quantum/keymap_extras/keymap_belgian.h b/quantum/keymap_extras/keymap_belgian.h
index a6912afef54..c6363a4377c 100644
--- a/quantum/keymap_extras/keymap_belgian.h
+++ b/quantum/keymap_extras/keymap_belgian.h
@@ -111,7 +111,7 @@
#define BE_8 S(BE_EXLM) // 8
#define BE_9 S(BE_CCED) // 9
#define BE_0 S(BE_AGRV) // 0
-#define BE_RNGA S(BE_RPRN) // °
+#define BE_DEG S(BE_RPRN) // °
#define BE_UNDS S(BE_MINS) // _
// Row 2
#define BE_DIAE S(BE_DCIR) // ¨ (dead)
@@ -163,7 +163,7 @@
#define BE_PARA BE_SECT
#define BE_MU BE_MICR
#define BE_LESS BE_LABK
-#define BE_OVRR BE_RNGA
+#define BE_OVRR BE_DEG
#define BE_UMLT BE_DIAE
#define BE_GRTR BE_RABK
#define BE_LSBR BE_LBRC
diff --git a/quantum/keymap_extras/keymap_bepo.h b/quantum/keymap_extras/keymap_bepo.h
index 718baaa6838..ea04aed3c1d 100644
--- a/quantum/keymap_extras/keymap_bepo.h
+++ b/quantum/keymap_extras/keymap_bepo.h
@@ -1,4 +1,4 @@
-/* Copyright 2016 Didier Loiseau
+/* Copyright 2020
*
* 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
@@ -13,305 +13,393 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-/* Keymap macros for the French BÉPO layout - http://bepo.fr */
-#ifndef KEYMAP_BEPO_H
-#define KEYMAP_BEPO_H
+
+#pragma once
#include "keymap.h"
-// Normal characters
-// First row (on usual keyboards)
-#define BP_DOLLAR KC_GRAVE // $
-#define BP_DLR BP_DOLLAR
-#define BP_DOUBLE_QUOTE KC_1 // "
-#define BP_DQOT BP_DOUBLE_QUOTE
-#define BP_LEFT_GUILLEMET KC_2 // «
-#define BP_LGIL BP_LEFT_GUILLEMET
-#define BP_RIGHT_GUILLEMET KC_3 // »
-#define BP_RGIL BP_RIGHT_GUILLEMET
-#define BP_LEFT_PAREN KC_4 // (
-#define BP_LPRN BP_LEFT_PAREN
-#define BP_RIGHT_PAREN KC_5 // )
-#define BP_RPRN BP_RIGHT_PAREN
-#define BP_AT KC_6 // @
-#define BP_PLUS KC_7 // +
-#define BP_MINUS KC_8 // -
-#define BP_MINS BP_MINUS
-#define BP_SLASH KC_9 // /
-#define BP_SLSH BP_SLASH
-#define BP_ASTERISK KC_0 // *
-#define BP_ASTR BP_ASTERISK
-#define BP_EQUAL KC_MINUS // =
-#define BP_EQL BP_EQUAL
-#define BP_PERCENT KC_EQUAL // %
-#define BP_PERC BP_PERCENT
+// clang-format off
-// Second row
-#define BP_B KC_Q
-#define BP_E_ACUTE KC_W // é
-#define BP_ECUT BP_E_ACUTE
-#define BP_P KC_E
-#define BP_O KC_R
-#define BP_E_GRAVE KC_T // è
-#define BP_EGRV BP_E_GRAVE
-#define BP_DEAD_CIRCUMFLEX KC_Y // dead ^
-#define BP_DCRC BP_DEAD_CIRCUMFLEX
-#define BP_V KC_U
-#define BP_D KC_I
-#define BP_L KC_O
-#define BP_J KC_P
-#define BP_Z KC_LBRACKET
-#define BP_W KC_RBRACKET
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ $ │ " │ « │ » │ ( │ ) │ @ │ + │ - │ / │ * │ = │ % │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ B │ É │ P │ O │ È │ ^ │ V │ D │ L │ J │ Z │ W │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ U │ I │ E │ , │ C │ T │ S │ R │ N │ M │ Ç │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ Ê │ À │ Y │ X │ . │ K │ ' │ Q │ G │ H │ F │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define BP_DLR KC_GRV // $
+#define BP_DQUO KC_1 // "
+#define BP_LDAQ KC_2 // «
+#define BP_RDAQ KC_3 // »
+#define BP_LPRN KC_4 // (
+#define BP_RPRN KC_5 // )
+#define BP_AT KC_6 // @
+#define BP_PLUS KC_7 // +
+#define BP_MINS KC_8 // -
+#define BP_SLSH KC_9 // /
+#define BP_ASTR KC_0 // *
+#define BP_EQL KC_MINS // =
+#define BP_PERC KC_EQL // %
+// Row 2
+#define BP_B KC_Q // B
+#define BP_EACU KC_W // É
+#define BP_P KC_E // P
+#define BP_O KC_R // O
+#define BP_EGRV KC_T // È
+#define BP_DCIR KC_Y // ^ (dead)
+#define BP_V KC_U // V
+#define BP_D KC_I // D
+#define BP_L KC_O // L
+#define BP_J KC_P // J
+#define BP_Z KC_LBRC // Z
+#define BP_W KC_RBRC // W
+// Row 3
+#define BP_A KC_A // A
+#define BP_U KC_S // U
+#define BP_I KC_D // I
+#define BP_E KC_F // E
+#define BP_COMM KC_G // ,
+#define BP_C KC_H // C
+#define BP_T KC_J // T
+#define BP_S KC_K // S
+#define BP_R KC_L // R
+#define BP_N KC_SCLN // N
+#define BP_M KC_QUOT // M
+#define BP_CCED KC_BSLS // Ç
+// Row 4
+#define BP_ECIR KC_NUBS // Ê
+#define BP_AGRV KC_Z // À
+#define BP_Y KC_X // Y
+#define BP_X KC_C // X
+#define BP_DOT KC_V // .
+#define BP_K KC_B // K
+#define BP_QUOT KC_N // '
+#define BP_Q KC_M // Q
+#define BP_G KC_COMM // G
+#define BP_H KC_DOT // H
+#define BP_F KC_SLSH // F
-// Third row
-#define BP_A KC_A
-#define BP_U KC_S
-#define BP_I KC_D
-#define BP_E KC_F
-#define BP_COMMA KC_G // ,
-#define BP_COMM BP_COMMA
-#define BP_C KC_H
-#define BP_T KC_J
-#define BP_S KC_K
-#define BP_R KC_L
-#define BP_N KC_SCOLON
-#define BP_M KC_QUOTE
-#define BP_C_CEDILLA KC_BSLASH // ç
-#define BP_CCED BP_C_CEDILLA
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ # │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ° │ ` │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ ! │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ ; │ │ │ │ │ │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ : │ │ ? │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define BP_HASH S(BP_DLR) // #
+#define BP_1 S(BP_DQUO) // 1
+#define BP_2 S(BP_LDAQ) // 2
+#define BP_3 S(BP_RDAQ) // 3
+#define BP_4 S(BP_LPRN) // 4
+#define BP_5 S(BP_RPRN) // 5
+#define BP_6 S(BP_AT) // 6
+#define BP_7 S(BP_PLUS) // 7
+#define BP_8 S(BP_MINS) // 8
+#define BP_9 S(BP_SLSH) // 9
+#define BP_0 S(BP_ASTR) // 0
+#define BP_DEG S(BP_EQL) // °
+#define BP_GRV S(BP_PERC) // `
+// Row 2
+#define BP_EXLM S(BP_DCIR) // !
+// Row 3
+#define BP_SCLN S(BP_COMM) // ;
+// Row 4
+#define BP_COLN S(BP_DOT) // :
+#define BP_QUES S(BP_QUOT) // ?
+// Row 5
+#define BP_NBSP S(KC_SPC) // (non-breaking space)
-// Fourth row
-#define BP_E_CIRCUMFLEX KC_NONUS_BSLASH // ê
-#define BP_ECRC BP_E_CIRCUMFLEX
-#define BP_A_GRAVE KC_Z // à
-#define BP_AGRV BP_A_GRAVE
-#define BP_Y KC_X
-#define BP_X KC_C
-#define BP_DOT KC_V // .
-#define BP_K KC_B
-#define BP_APOSTROPHE KC_N
-#define BP_APOS BP_APOSTROPHE // '
-#define BP_Q KC_M
-#define BP_G KC_COMMA
-#define BP_H KC_DOT
-#define BP_F KC_SLASH
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ – │ — │ < │ > │ [ │ ] │ ^ │ ± │ − │ ÷ │ × │ ≠ │ ‰ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ | │ ´ │ & │ Œ │ ` │ ¡ │ ˇ │ Ð │ / │ IJ │ Ə │ ˘ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ Æ │ Ù │ ¨ │ € │ │ © │ Þ │ ẞ │ ® │ ~ │ ¯ │ ¸ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ \ │ { │ } │ … │ ~ │ ¿ │ ° │ │ † │ ˛ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ _ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define BP_NDSH ALGR(BP_DLR) // –
+#define BP_MDSH ALGR(BP_DQUO) // —
+#define BP_LABK ALGR(BP_LDAQ) // <
+#define BP_RABK ALGR(BP_RDAQ) // >
+#define BP_LBRC ALGR(BP_LPRN) // [
+#define BP_RBRC ALGR(BP_RPRN) // ]
+#define BP_CIRC ALGR(BP_AT) // ^
+#define BP_PLMN ALGR(BP_PLUS) // ±
+#define BP_MMNS ALGR(BP_MINS) // −
+#define BP_DIV ALGR(BP_SLSH) // ÷
+#define BP_MUL ALGR(BP_ASTR) // ×
+#define BP_NEQL ALGR(BP_EQL) // ≠
+#define BP_PERM ALGR(BP_PERC) // ‰
+// Row 2
+#define BP_PIPE ALGR(BP_B) // |
+#define BP_ACUT ALGR(BP_EACU) // ´ (dead)
+#define BP_AMPR ALGR(BP_P) // &
+#define BP_OE ALGR(BP_O) // Œ
+#define BP_DGRV ALGR(BP_EGRV) // ` (dead)
+#define BP_IEXL ALGR(BP_DCIR) // ¡
+#define BP_CARN ALGR(BP_V) // ˇ (dead)
+#define BP_ETH ALGR(BP_D) // Ð
+#define BP_DSLS ALGR(BP_L) // / (dead)
+#define BP_IJ ALGR(BP_J) // IJ
+#define BP_SCHW ALGR(BP_Z) // Ə
+#define BP_BREV ALGR(BP_W) // ˘ (dead)
+// Row 3
+#define BP_AE ALGR(BP_A) // Æ
+#define BP_UGRV ALGR(BP_U) // Ù
+#define BP_DIAE ALGR(BP_I) // ¨ (dead)
+#define BP_EURO ALGR(BP_E) // €
+#define BP_COPY ALGR(BP_C) // ©
+#define BP_THRN ALGR(BP_T) // Þ
+#define BP_SS ALGR(BP_S) // ẞ
+#define BP_REGD ALGR(BP_R) // ®
+#define BP_DTIL ALGR(BP_N) // ~ (dead)
+#define BP_MACR ALGR(BP_M) // ¯ (dead)
+#define BP_CEDL ALGR(BP_CCED) // ¸ (dead)
+// Row 4
+#define BP_BSLS ALGR(BP_AGRV) // (backslash)
+#define BP_LCBR ALGR(BP_Y) // {
+#define BP_RCBR ALGR(BP_X) // }
+#define BP_ELLP ALGR(BP_DOT) // …
+#define BP_TILD ALGR(BP_K) // ~
+#define BP_IQUE ALGR(BP_QEST) // ¿
+#define BP_RNGA ALGR(BP_Q) // ° (dead)
+#define BP_DGRK ALGR(BP_G) // µ (dead Greek key)
+#define BP_DAGG ALGR(BP_H) // †
+#define BP_OGON ALGR(BP_F) // ˛ (dead)
+// Row 5
+#define BP_UNDS ALGR(KC_SPC) // _
-// Shifted characters
-// First row
-#define BP_HASH LSFT(BP_DOLLAR) // #
-#define BP_1 LSFT(KC_1)
-#define BP_2 LSFT(KC_2)
-#define BP_3 LSFT(KC_3)
-#define BP_4 LSFT(KC_4)
-#define BP_5 LSFT(KC_5)
-#define BP_6 LSFT(KC_6)
-#define BP_7 LSFT(KC_7)
-#define BP_8 LSFT(KC_8)
-#define BP_9 LSFT(KC_9)
-#define BP_0 LSFT(KC_0)
-#define BP_DEGREE LSFT(BP_EQUAL) // °
-#define BP_DEGR BP_DEGREE
-#define BP_GRAVE LSFT(BP_PERCENT) // `
-#define BP_GRV BP_GRAVE
+/* Shift+AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ¶ │ „ │ “ │ ” │ ≤ │ ≥ │ │ ¬ │ ¼ │ ½ │ ¾ │ ′ │ ″ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ ¦ │ ˝ │ § │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ ˙ │ ¤ │ ̛ │ ſ │ │ │ ™ │ │ º │ , │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ ‘ │ ’ │ · │ ⌨ │ ̉ │ ̣ │ │ ‡ │ ª │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define BP_PARA S(ALGR(BP_DLR)) // ¶
+#define BP_DLQU S(ALGR(BP_DQUO)) // „
+#define BP_LDQU S(ALGR(BP_LDAQ)) // “
+#define BP_RDQU S(ALGR(BP_RDAQ)) // ”
+#define BP_LEQL S(ALGR(BP_LPRN)) // ≤
+#define BP_GEQL S(ALGR(BP_RPRN)) // ≥
+#define BP_NOT S(ALGR(BP_PLUS)) // ¬
+#define BP_QRTR S(ALGR(BP_MINS)) // ¼
+#define BP_HALF S(ALGR(BP_SLSH)) // ½
+#define BP_TQTR S(ALGR(BP_ASTR)) // ¾
+#define BP_PRIM S(ALGR(BP_EQL)) // ′
+#define BP_DPRM S(ALGR(BP_PERC)) // ″
+// Row 2
+#define BP_BRKP S(ALGR(BP_B)) // ¦
+#define BP_DACU S(ALGR(BP_EACU)) // ˝ (dead)
+#define BP_SECT S(ALGR(BP_P)) // §
+// Row 3
+#define BP_DOTA S(ALGR(BP_I)) // ˙ (dead)
+#define BP_CURR S(ALGR(BP_E)) // ¤ (dead)
+#define BP_HORN S(ALGR(BP_COMM)) // ̛ (dead)
+#define BP_LNGS S(ALGR(BP_C)) // ſ
+#define BP_TM S(ALGR(BP_R)) // ™
+#define BP_MORD S(ALGR(BP_M)) // º
+#define BP_DCMM S(ALGR(BP_CCED)) // , (dead)
+// Row 4
+#define BP_LSQU S(ALGR(BP_Y)) // ‘
+#define BP_RSQU S(ALGR(BP_X)) // ’
+#define BP_MDDT S(ALGR(BP_DOT)) // ·
+#define BP_KEYB S(ALGR(BP_K)) // ⌨
+#define BP_HOKA S(ALGR(BP_QUOT)) // ̉ (dead)
+#define BP_DOTB S(ALGR(BP_Q)) // ̣ (dead)
+#define BP_DDAG S(ALGR(BP_H)) // ‡
+#define BP_FORD S(ALGR(BP_F)) // ª
+// Row 5
+#define BP_NNBS S(ALGR(BP_)) // (narrow non-breaking space)
-// Second row
-#define BP_EXCLAIM LSFT(BP_DEAD_CIRCUMFLEX) // !
-#define BP_EXLM BP_EXCLAIM
-
-// Third row
-#define BP_SCOLON LSFT(BP_COMMA) // ;
-#define BP_SCLN BP_SCOLON
-
-// Fourth row
-#define BP_COLON LSFT(BP_DOT) // :
-#define BP_COLN BP_COLON
-#define BP_QUESTION LSFT(BP_APOS) // ?
-#define BP_QEST BP_QUESTION
-
-// Space bar
-#define BP_NON_BREAKING_SPACE LSFT(KC_SPACE)
-#define BP_NBSP BP_NON_BREAKING_SPACE
-
-// AltGr-ed characters
-// First row
-#define BP_EN_DASH ALGR(BP_DOLLAR) // –
-#define BP_NDSH BP_EN_DASH
-#define BP_EM_DASH ALGR(KC_1) // —
-#define BP_MDSH BP_EM_DASH
-#define BP_LESS ALGR(KC_2) // <
-#define BP_GREATER ALGR(KC_3) // >
-#define BP_GRTR BP_GREATER
-#define BP_LBRACKET ALGR(KC_4) // [
-#define BP_LBRC BP_LBRACKET
-#define BP_RBRACKET ALGR(KC_5) // ]
-#define BP_RBRC BP_RBRACKET
-#define BP_CIRCUMFLEX ALGR(KC_6) // ^
-#define BP_CIRC BP_CIRCUMFLEX
-#define BP_PLUS_MINUS ALGR(KC_7) // ±
-#define BP_PSMS BP_PLUS_MINUS
-#define BP_MATH_MINUS ALGR(KC_8) // −
-#define BP_MMNS BP_MATH_MINUS
-#define BP_OBELUS ALGR(KC_9) // ÷
-#define BP_OBEL BP_OBELUS
-// more conventional name of the symbol
-#define BP_DIVISION_SIGN BP_OBELUS
-#define BP_DVSN BP_DIVISION_SIGN
-#define BP_TIMES ALGR(KC_0) // ×
-#define BP_TIMS BP_TIMES
-#define BP_DIFFERENT ALGR(BP_EQUAL) // ≠
-#define BP_DIFF BP_DIFFERENT
-#define BP_PERMILLE ALGR(BP_PERCENT) // ‰
-#define BP_PMIL BP_PERMILLE
-
-// Second row
-#define BP_PIPE ALGR(BP_B) // |
-#define BP_DEAD_ACUTE ALGR(BP_E_ACUTE) // dead ´
-#define BP_DACT BP_DEAD_ACUTE
-#define BP_AMPERSAND ALGR(BP_P) // &
-#define BP_AMPR BP_AMPERSAND
-#define BP_OE_LIGATURE ALGR(BP_O) // œ
-#define BP_OE BP_OE_LIGATURE
-#define BP_DEAD_GRAVE ALGR(BP_E_GRAVE) // `
-#define BP_DGRV BP_DEAD_GRAVE
-#define BP_INVERTED_EXCLAIM ALGR(BP_DEAD_CIRCUMFLEX) // ¡
-#define BP_IXLM BP_INVERTED_EXCLAIM
-#define BP_DEAD_CARON ALGR(BP_V) // dead ˇ
-#define BP_DCAR BP_DEAD_CARON
-#define BP_ETH ALGR(BP_D) // ð
-#define BP_DEAD_SLASH ALGR(BP_L) // dead /
-#define BP_DSLH BP_DEAD_SLASH
-#define BP_IJ_LIGATURE ALGR(BP_J) // ij
-#define BP_IJ BP_IJ_LIGATURE
-#define BP_SCHWA ALGR(BP_Z) // ə
-#define BP_SCWA BP_SCHWA
-#define BP_DEAD_BREVE ALGR(BP_W) // dead ˘
-#define BP_DBRV BP_DEAD_BREVE
-
-// Third row
-#define BP_AE_LIGATURE ALGR(BP_A) // æ
-#define BP_AE BP_AE_LIGATURE
-#define BP_U_GRAVE ALGR(BP_U) // ù
-#define BP_UGRV BP_U_GRAVE
-#define BP_DEAD_TREMA ALGR(BP_I) // dead ¨ (trema/umlaut/diaresis)
-#define BP_DTRM BP_DEAD_TREMA
-#define BP_EURO ALGR(BP_E) // €
-#define BP_TYPOGRAPHICAL_APOSTROPHE ALGR(BP_COMMA) // ’
-#define BP_TAPO BP_TYPOGRAPHICAL_APOSTROPHE
-#define BP_COPYRIGHT ALGR(BP_C) // ©
-#define BP_CPRT BP_COPYRIGHT
-#define BP_THORN ALGR(BP_T) // þ
-#define BP_THRN BP_THORN
-#define BP_SHARP_S ALGR(BP_S) // ß
-#define BP_SRPS BP_SHARP_S
-#define BP_REGISTERED_TRADEMARK ALGR(BP_R) // ®
-#define BP_RTM BP_REGISTERED_TRADEMARK
-#define BP_DEAD_TILDE ALGR(BP_N) // dead ~
-#define BP_DTLD BP_DEAD_TILDE
-#define BP_DEAD_MACRON ALGR(BP_M) // dead ¯
-#define BP_DMCR BP_DEAD_MACRON
-#define BP_DEAD_CEDILLA ALGR(BP_C_CEDILLA) // dead ¸
-#define BP_DCED BP_DEAD_CEDILLA
-
-// Fourth row
-#define BP_NONUS_SLASH ALGR(BP_E_CIRCUMFLEX) // / on non-us backslash key (102nd key, ê in bépo)
-#define BP_NUSL BP_NONUS_SLASH
-#define BP_BACKSLASH ALGR(BP_A_GRAVE) /* \ */
-#define BP_BSLS BP_BACKSLASH
-#define BP_LEFT_CURLY_BRACE ALGR(BP_Y) // {
-#define BP_LCBR BP_LEFT_CURLY_BRACE
-#define BP_RIGHT_CURLY_BRACE ALGR(BP_X) // }
-#define BP_RCBR BP_RIGHT_CURLY_BRACE
-#define BP_ELLIPSIS ALGR(BP_DOT) // …
-#define BP_ELPS BP_ELLIPSIS
-#define BP_TILDE ALGR(BP_K) // ~
-#define BP_TILD BP_TILDE
-#define BP_INVERTED_QUESTION ALGR(BP_QUESTION) // ¿
-#define BP_IQST BP_INVERTED_QUESTION
-#define BP_DEAD_RING ALGR(BP_Q) // dead °
-#define BP_DRNG BP_DEAD_RING
-#define BP_DEAD_GREEK ALGR(BP_G) // dead Greek key (following key will make a Greek letter)
-#define BP_DGRK BP_DEAD_GREEK
-#define BP_DAGGER ALGR(BP_H) // †
-#define BP_DAGR BP_DAGGER
-#define BP_DEAD_OGONEK ALGR(BP_F) // dead ˛
-#define BP_DOGO BP_DEAD_OGONEK
-
-// Space bar
-#define BP_UNDERSCORE ALGR(KC_SPACE) // _
-#define BP_UNDS BP_UNDERSCORE
-
-// AltGr-Shifted characters (different from capitalised AltGr-ed characters)
-// First row
-#define BP_PARAGRAPH ALGR(BP_HASH) // ¶
-#define BP_PARG BP_PARAGRAPH
-#define BP_LOW_DOUBLE_QUOTE ALGR(BP_1) // „
-#define BP_LWQT BP_LOW_DOUBLE_QUOTE
-#define BP_LEFT_DOUBLE_QUOTE ALGR(BP_2) // “
-#define BP_LDQT BP_LEFT_DOUBLE_QUOTE
-#define BP_RIGHT_DOUBLE_QUOTE ALGR(BP_3) // ”
-#define BP_RDQT BP_RIGHT_DOUBLE_QUOTE
-#define BP_LESS_OR_EQUAL ALGR(BP_4) // ≤
-#define BP_LEQL BP_LESS_OR_EQUAL
-#define BP_GREATER_OR_EQUAL ALGR(BP_5) // ≥
-#define BP_GEQL BP_GREATER_OR_EQUAL
-// nothing on ALGR(BP_6)
-#define BP_NEGATION ALGR(BP_7) // ¬
-#define BP_NEGT BP_NEGATION
-#define BP_ONE_QUARTER ALGR(BP_8) // ¼
-#define BP_1QRT BP_ONE_QUARTER
-#define BP_ONE_HALF ALGR(BP_9) // ½
-#define BP_1HLF BP_ONE_HALF
-#define BP_THREE_QUARTERS ALGR(BP_0) // ¾
-#define BP_3QRT BP_THREE_QUARTERS
-#define BP_MINUTES ALGR(BP_DEGREE) // ′
-#define BP_MNUT BP_MINUTES
-#define BP_SECONDS ALGR(BP_GRAVE) // ″
-#define BP_SCND BP_SECONDS
-
-// Second row
-#define BP_BROKEN_PIPE LSFT(BP_PIPE) // ¦
-#define BP_BPIP BP_BROKEN_PIPE
-#define BP_DEAD_DOUBLE_ACUTE LSFT(BP_DEAD_ACUTE) // ˝
-#define BP_DDCT BP_DEAD_DOUBLE_ACUTE
-#define BP_SECTION ALGR(LSFT(BP_P)) // §
-#define BP_SECT BP_SECTION
-// LSFT(BP_DEAD_GRAVE) is actually the same character as LSFT(BP_PERCENT)
-#define BP_GRAVE_BIS LSFT(BP_DEAD_GRAVE) // `
-#define BP_GRVB BP_GRAVE_BIS
-
-// Third row
-#define BP_DEAD_DOT_ABOVE LSFT(BP_DEAD_TREMA) // dead ˙
-#define BP_DDTA BP_DEAD_DOT_ABOVE
-#define BP_DEAD_CURRENCY LSFT(BP_EURO) // dead ¤ (next key will generate a currency code like ¥ or £)
-#define BP_DCUR BP_DEAD_CURRENCY
-#define BP_DEAD_HORN LSFT(ALGR(BP_COMMA)) // dead ̛
-#define BP_DHRN BP_DEAD_HORN
-#define BP_LONG_S LSFT(ALGR(BP_C)) // ſ
-#define BP_LNGS BP_LONG_S
-#define BP_TRADEMARK LSFT(BP_REGISTERED_TRADEMARK) // ™
-#define BP_TM BP_TRADEMARK
-#define BP_ORDINAL_INDICATOR_O LSFT(ALGR(BP_M)) // º
-#define BP_ORDO BP_ORDINAL_INDICATOR_O
-#define BP_DEAD_COMMA LSFT(BP_DEAD_CEDILLA) // dead ˛
-#define BP_DCOM BP_DEAD_COMMA
-
-// Fourth row
-#define BP_LEFT_QUOTE LSFT(ALGR(BP_Y)) // ‘
-#define BP_LQOT BP_LEFT_QUOTE
-#define BP_RIGHT_QUOTE LSFT(ALGR(BP_X)) // ’
-#define BP_RQOT BP_RIGHT_QUOTE
-#define BP_INTERPUNCT LSFT(ALGR(BP_DOT)) // ·
-#define BP_IPCT BP_INTERPUNCT
-#define BP_DEAD_HOOK_ABOVE LSFT(ALGR(BP_QUESTION)) // dead ̉
-#define BP_DHKA BP_DEAD_HOOK_ABOVE
-#define BP_DEAD_UNDERDOT LSFT(BP_DEAD_RING) // dead ̣
-#define BP_DUDT BP_DEAD_UNDERDOT
-#define BP_DOUBLE_DAGGER LSFT(BP_DAGGER) // ‡
-#define BP_DDGR BP_DOUBLE_DAGGER
-#define BP_ORDINAL_INDICATOR_A LSFT(ALGR(BP_F)) // ª
-#define BP_ORDA BP_ORDINAL_INDICATOR_A
-
-// Space bar
-#define BP_NARROW_NON_BREAKING_SPACE ALGR(BP_NON_BREAKING_SPACE)
-#define BP_NNBS BP_NARROW_NON_BREAKING_SPACE
-
-#endif
+// DEPRECATED
+#define BP_DOLLAR BP_DLR
+#define BP_DOUBLE_QUOTE BP_DQUO
+#define BP_DQOT BP_DQUO
+#define BP_LEFT_GUILLEMET BP_LDAQ
+#define BP_LGIL BP_LDAQ
+#define BP_RIGHT_GUILLEMET BP_RDAQ
+#define BP_RGIL BP_RDAQ
+#define BP_LEFT_PAREN BP_LPRN
+#define BP_RIGHT_PAREN BP_RPRN
+#define BP_MINUS BP_MINS
+#define BP_SLASH BP_SLSH
+#define BP_ASTERISK BP_ASTR
+#define BP_EQUAL BP_EQL
+#define BP_PERCENT BP_PERC
+#define BP_E_ACUTE BP_EACU
+#define BP_ECUT BP_EACU
+#define BP_E_GRAVE BP_EGRV
+#define BP_DEAD_CIRCUMFLEX BP_DCIR
+#define BP_DCRC BP_DCIR
+#define BP_COMMA BP_COMM
+#define BP_C_CEDILLA BP_CCED
+#define BP_E_CIRCUMFLEX BP_ECIR
+#define BP_ECRC BP_ECIR
+#define BP_A_GRAVE BP_AGRV
+#define BP_APOSTROPHE BP_QUOT
+#define BP_APOS BP_QUOT
+#define BP_DEGREE BP_DEG
+#define BP_DEGR BP_DEG
+#define BP_GRAVE BP_GRV
+#define BP_EXCLAIM BP_EXLM
+#define BP_SCOLON BP_SCLN
+#define BP_COLON BP_COLN
+#define BP_QUESTION BP_QUES
+#define BP_QEST BP_QUES
+#define BP_NON_BREAKING_SPACE BP_NBSP
+#define BP_EN_DASH BP_NDSH
+#define BP_EM_DASH BP_MDSH
+#define BP_LESS BP_LABK
+#define BP_GREATER BP_RABK
+#define BP_GRTR BP_RABK
+#define BP_LBRACKET BP_LBRC
+#define BP_RBRACKET BP_RBRC
+#define BP_CIRCUMFLEX CIRC
+#define BP_PLUS_MINUS BP_PLMN
+#define BP_PSMS BP_PLMN
+#define BP_MATH_MINUS BP_MMNS
+#define BP_OBELUS BP_DIV
+#define BP_OBEL BP_DIV
+#define BP_DIVISION_SIGN BP_DIV
+#define BP_DVSN BP_DIV
+#define BP_TIMES BP_MUL
+#define BP_TIMS BP_MUL
+#define BP_DIFFERENT BP_NEQL
+#define BP_DIFF BP_NEQL
+#define BP_PERMILLE BP_PERM
+#define BP_PMIL BP_PERM
+#define BP_DEAD_ACUTE BP_ACUT
+#define BP_DACT BP_ACUT
+#define BP_AMPERSAND BP_AMPR
+#define BP_OE_LIGATURE BP_OE
+#define BP_DEAD_GRAVE BP_DGRV
+#define BP_INVERTED_EXCLAIM BP_IEXL
+#define BP_IXLM BP_IEXL
+#define BP_DEAD_CARON BP_CARN
+#define BP_DCAR BP_CARN
+#define BP_DEAD_SLASH BP_DSLS
+#define BP_DSLH BP_DSLS
+#define BP_IJ_LIGATURE BP_IJ
+#define BP_SCHWA BP_SCHW
+#define BP_SCWA BP_SCHW
+#define BP_DEAD_BREVE BP_BREV
+#define BP_DBRV BP_BREV
+#define BP_AE_LIGATURE BP_AE
+#define BP_U_GRAVE BP_UGRV
+#define BP_DEAD_TREMA BP_DIAE
+#define BP_DTRM BP_DIAE
+#define BP_TYPOGRAPHICAL_APOSTROPHE BP_COMM
+#define BP_TAPO BP_COMM
+#define BP_COPYRIGHT BP_COPY
+#define BP_CPRT BP_COPY
+#define BP_THORN BP_THRN
+#define BP_SHARP_S BP_SS
+#define BP_SRPS BP_SS
+#define BP_REGISTERED_TRADEMARK BP_REGD
+#define BP_RTM BP_REGD
+#define BP_DEAD_TILDE BP_DTIL
+#define BP_DTLD BP_DTIL
+#define BP_DEAD_MACRON BP_MACR
+#define BP_DMCR BP_MACR
+#define BP_DEAD_CEDILLA BP_CEDL
+#define BP_DCED BP_CEDL
+#define BP_NONUS_SLASH BP_SLSH
+#define BP_NUSL BP_SLSH
+#define BP_BACKSLASH BP_BSLS
+#define BP_LEFT_CURLY_BRACE BP_LCBR
+#define BP_RIGHT_CURLY_BRACE BP_RCBR
+#define BP_ELLIPSIS BP_ELLP
+#define BP_ELPS BP_ELLP
+#define BP_TILDE BP_TILD
+#define BP_INVERTED_QUESTION BP_IQUE
+#define BP_IQST BP_IQUE
+#define BP_DEAD_RING BP_RNGA
+#define BP_DRNG BP_RNGA
+#define BP_DEAD_GREEK BP_DGRK
+#define BP_DAGGER BP_DAGG
+#define BP_DAGR BP_DAGG
+#define BP_DEAD_OGONEK BP_OGON
+#define BP_DOGO BP_OGON
+#define BP_UNDERSCORE BP_UNDS
+#define BP_PARAGRAPH BP_PARA
+#define BP_PARG BP_PARA
+#define BP_LOW_DOUBLE_QUOTE BP_DLQU
+#define BP_LWQT BP_DLQU
+#define BP_LEFT_DOUBLE_QUOTE BP_RDQU
+#define BP_RIGHT_DOUBLE_QUOTE BP_RDQU
+#define BP_LESS_OR_EQUAL BP_LEQL
+#define BP_GREATER_OR_EQUAL BP_GEQL
+#define BP_NEGATION BP_NOT
+#define BP_NEGT BP_NOT
+#define BP_ONE_QUARTER BP_QRTR
+#define BP_1QRT BP_QRTR
+#define BP_ONE_HALF BP_HALF
+#define BP_1HLF BP_HALF
+#define BP_THREE_QUARTERS TQTR
+#define BP_3QRT BP_TQTR
+#define BP_MINUTES BP_PRIM
+#define BP_MNUT BP_PRIM
+#define BP_SECONDS BP_DPRM
+#define BP_SCND BP_DPRM
+#define BP_BROKEN_PIPE BP_BRKP
+#define BP_BPIP BP_BRKP
+#define BP_DEAD_DOUBLE_ACUTE BP_DACU
+#define BP_DDCT BP_DACU
+#define BP_SECTION BP_SECT
+#define BP_GRAVE_BIS BP_GRV
+#define BP_GRVB BP_GRV
+#define BP_DEAD_DOT_ABOVE BP_DOTA
+#define BP_DDTA BP_DOTA
+#define BP_DEAD_CURRENCY BP_CURR
+#define BP_DCUR BP_CURR
+#define BP_DEAD_HORN BP_HORN
+#define BP_DHRN BP_HORN
+#define BP_LONG_S BP_LNGS
+#define BP_TRADEMARK BP_TM
+#define BP_ORDINAL_INDICATOR_O MORD
+#define BP_ORDO BP_MORD
+#define BP_DEAD_COMMA BP_DCMM
+#define BP_DCOM BP_DCMM
+#define BP_LEFT_QUOTE BP_LSQU
+#define BP_LQOT BP_LSQU
+#define BP_RIGHT_QUOTE BP_RSQU
+#define BP_RQOT BP_RSQU
+#define BP_INTERPUNCT BP_MDDT
+#define BP_IPCT BP_MDDT
+#define BP_DEAD_HOOK_ABOVE BP_HOKA
+#define BP_DHKA BP_HOKA
+#define BP_DEAD_UNDERDOT BP_DOTB
+#define BP_DUDT BP_DOTB
+#define BP_DOUBLE_DAGGER BP_DDAG
+#define BP_DDGR BP_DDAG
+#define BP_ORDINAL_INDICATOR_A BP_FORD
+#define BP_ORDA BP_FORD
+#define BP_NARROW_NON_BREAKING_SPACE BP_NNBS
diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h
index 4fc174e7352..d980dc2e417 100644
--- a/quantum/keymap_extras/keymap_canadian_multilingual.h
+++ b/quantum/keymap_extras/keymap_canadian_multilingual.h
@@ -1,4 +1,4 @@
-/* Copyright 2016 Didier Loiseau
+/* Copyright 2020
*
* 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
@@ -13,247 +13,421 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-#ifndef KEYMAP_CANADIAN_MULTILINGUAL_H
-#define KEYMAP_CANADIAN_MULTILINGUAL_H
+
+#pragma once
#include "keymap.h"
-#ifndef GR2A
-# define GR2A(kc) RCTL(kc)
-#endif
+// clang-format off
-// Normal characters
-// First row
-#define CSA_SLASH KC_GRV // /
-#define CSA_SLSH CSA_SLASH
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ / │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ ^ │ Ç │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ È │ À │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ Ù │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ É │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define CA_SLSH KC_GRV // /
+#define CA_1 KC_1 // 1
+#define CA_2 KC_2 // 2
+#define CA_3 KC_3 // 3
+#define CA_4 KC_4 // 4
+#define CA_5 KC_5 // 5
+#define CA_6 KC_6 // 6
+#define CA_7 KC_7 // 7
+#define CA_8 KC_8 // 8
+#define CA_9 KC_9 // 9
+#define CA_0 KC_0 // 0
+#define CA_MINS KC_MINS // -
+#define CA_EQL KC_EQL // =
+// Row 2
+#define CA_Q KC_Q // Q
+#define CA_W KC_W // W
+#define CA_E KC_E // E
+#define CA_R KC_R // R
+#define CA_T KC_T // T
+#define CA_Y KC_Y // Y
+#define CA_U KC_U // U
+#define CA_I KC_I // I
+#define CA_O KC_O // O
+#define CA_P KC_P // P
+#define CA_CIRC KC_LBRC // ^ (dead)
+#define CA_CCED KC_RBRC // Ç
+// Row 3
+#define CA_A KC_A // A
+#define CA_S KC_S // S
+#define CA_D KC_D // D
+#define CA_F KC_F // F
+#define CA_G KC_G // G
+#define CA_H KC_H // H
+#define CA_J KC_J // J
+#define CA_K KC_K // K
+#define CA_L KC_L // L
+#define CA_SCLN KC_SCLN // ;
+#define CA_EGRV KC_QUOT // É
+#define CA_AGRV KC_NUHS // À
+// Row 4
+#define CA_UGRV KC_NUBS // Ù
+#define CA_Z KC_Z // Z
+#define CA_X KC_X // X
+#define CA_C KC_C // C
+#define CA_V KC_V // V
+#define CA_B KC_B // B
+#define CA_N KC_N // N
+#define CA_M KC_M // M
+#define CA_COMM KC_COMM // ,
+#define CA_DOT KC_DOT // .
+#define CA_EACU KC_SLSH // É
-// Second row
-#define CSA_DEAD_CIRCUMFLEX KC_LBRACKET // dead ^
-#define CSA_DCRC CSA_DEAD_CIRCUMFLEX
-#define CSA_C_CEDILLA KC_RBRACKET // Ç
-#define CSA_CCED CSA_C_CEDILLA
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ \ │ ! │ @ │ # │ $ │ % │ ? │ & │ * │ ( │ ) │ _ │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ ¨ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ : │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ │ │ │ │ ' │ " │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define CA_BSLS S(CA_SLSH) // (backslash)
+#define CA_EXLM S(CA_1) // !
+#define CA_AT S(CA_2) // @
+#define CA_HASH S(CA_3) // #
+#define CA_DLR S(CA_4) // $
+#define CA_PERC S(CA_5) // %
+#define CA_QUES S(CA_6) // ?
+#define CA_AMPR S(CA_7) // &
+#define CA_ASTR S(CA_8) // *
+#define CA_LPRN S(CA_9) // (
+#define CA_RPRN S(CA_0) // )
+#define CA_UNDS S(CA_MINS) // _
+#define CA_PLUS S(CA_EQL) // +
+// Row 2
+#define CA_DIAE S(CA_CIRC) // ¨ (dead)
+// Row 3
+#define CA_COLN S(CA_SCLN) // :
+// Row 4
+#define CA_QUOT S(CA_COMM) // '
+#define CA_DQUO S(CA_DOT) // "
-// Third row
-#define CSA_E_GRAVE KC_QUOT // è
-#define CSA_EGRV CSA_E_GRAVE
-#define CSA_A_GRAVE KC_BSLASH // à
-#define CSA_AGRV CSA_A_GRAVE
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ | │ │ │ │ ¤ │ │ │ { │ } │ [ │ ] │ │ ¬ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ € │ │ │ │ │ │ │ │ ` │ ~ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ ° │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ « │ » │ │ │ │ │ │ < │ > │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define CA_PIPE ALGR(CA_SLSH) // |
+#define CA_CURR ALGR(CA_4) // ¤
+#define CA_LCBR ALGR(CA_7) // {
+#define CA_RCBR ALGR(CA_8) // }
+#define CA_LBRC ALGR(CA_9) // [
+#define CA_RBRC ALGR(CA_0) // ]
+#define CA_NOT ALGR(CA_EQL) // ¬
+// Row 2
+#define CA_EURO ALGR(CA_E) // €
+#define CA_GRV ALGR(CA_CIRC) // ` (dead)
+#define CA_DTIL ALGR(CA_CCED) // ~ (dead)
+// Row 3
+#define CA_DEG ALGR(CA_SCLN) // °
+// Row 4
+#define CA_LDAQ ALGR(CA_X) // «
+#define CA_RDAQ ALGR(CA_C) // »
+#define CA_LABK ALGR(CA_DOT) // <
+#define CA_RABK ALGR(CA_COMM) // >
-// Fourth row
-#define CSA_U_GRAVE KC_NONUS_BSLASH // ù
-#define CSA_UGRV CSA_U_GRAVE
-#define CSA_E_ACUTE KC_SLSH // é
-#define CSA_ECUT CSA_E_ACUTE
+/* Right Ctrl symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ ¹ │ ² │ ³ │ ¼ │ ½ │ ¾ │ │ │ │ │ │ ¸ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Ω │ Ł │ Œ │ ¶ │ Ŧ │ ← │ ↓ │ → │ Ø │ Þ │ │ ~ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ Æ │ ß │ Ð │ │ Ŋ │ Ħ │ IJ │ ĸ │ Ŀ │ ´ │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ ¢ │ “ │ ” │ ʼn │ μ │ ― │ ˙ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define CA_SUP1 RCTL(CA_1) // ¹
+#define CA_SUP2 RCTL(CA_2) // ²
+#define CA_SUP3 RCTL(CA_3) // ³
+#define CA_QRTR RCTL(CA_4) // ¼
+#define CA_HALF RCTL(CA_5) // ½
+#define CA_TQTR RCTL(CA_6) // ¾
+#define CA_CEDL RCTL(CA_EQL) // ¸ (dead)
+// Row 2
+#define CA_OMEG RCTL(CA_Q) // Ω
+#define CA_LSTR RCTL(CA_W) // Ł
+#define CA_OE RCTL(CA_E) // Œ
+#define CA_PARA RCTL(CA_R) // ¶
+#define CA_TSTR RCTL(CA_T) // Ŧ
+#define CA_LARR RCTL(CA_Y) // ←
+#define CA_DARR RCTL(CA_U) // ↓
+#define CA_RARR RCTL(CA_I) // →
+#define CA_OSTR RCTL(CA_O) // Ø
+#define CA_THRN RCTL(CA_P) // Þ
+#define CA_TILD RCTL(CA_CCED) // ~
+// Row 3
+#define CA_AE RCTL(CA_A) // Æ
+#define CA_SS RCTL(CA_S) // ß
+#define CA_ETH RCTL(CA_D) // Ð
+#define CA_ENG RCTL(CA_G) // Ŋ
+#define CA_HSTR RCTL(CA_H) // Ħ
+#define CA_IJ RCTL(CA_J) // IJ
+#define CA_KRA RCTL(CA_K) // ĸ
+#define CA_LMDT RCTL(CA_L) // Ŀ
+#define CA_ACUT RCTL(CA_SCLN) // ´ (dead)
+// Row 4
+#define CA_CENT RCTL(CA_C) // ¢
+#define CA_LDQU RCTL(CA_V) // “
+#define CA_RDQU RCTL(CA_B) // ”
+#define CA_APSN RCTL(CA_N) // ʼn
+#define CA_MICR RCTL(CA_M) // μ
+#define CA_HRZB RCTL(CA_COMM) // ―
+#define CA_DOTA ALGR(CA_DOT) // ˙ (dead)
-// Shifted characters
-// First row
-#define CSA_BACKSLASH LSFT(CSA_SLASH) /* \ */
-#define CSA_BSLS CSA_BACKSLASH
-#define CSA_QUESTION LSFT(KC_6) // ?
-#define CSA_QEST CSA_QUESTION
+/* Shift+Right Ctrl symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ - │ ¡ │ │ £ │ │ ⅜ │ ⅝ │ ⅞ │ ™ │ ± │ │ ¿ │ ˛ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ ® │ │ ¥ │ ↑ │ ı │ │ │ ° │ ¯ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ § │ │ ª │ │ │ │ │ │ ˝ │ ˇ │ ˘ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ ¦ │ │ │ © │ ‘ │ ’ │ ♪ │ º │ × │ ÷ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define CA_SHYP RCTL(S(CA_SLSH)) // (soft hyphen)
+#define CA_IEXL RCTL(S(CA_1)) // ¡
+#define CA_PND RCTL(S(CA_3)) // £
+#define CA_TEIG RCTL(S(CA_5)) // ⅜
+#define CA_FEIG RCTL(S(CA_6)) // ⅝
+#define CA_SEIG RCTL(S(CA_7)) // ⅞
+#define CA_TM RCTL(S(CA_8)) // ™
+#define CA_PLMN RCTL(S(CA_9)) // ±
+#define CA_IQUE RCTL(S(CA_MINS)) // ¿
+#define CA_OGON RCTL(S(CA_EQL)) // ˛ (dead)
+// Row 2
+#define CA_REGD RCTL(S(CA_R)) // ®
+#define CA_YEN RCTL(S(CA_Y)) // ¥
+#define CA_UARR RCTL(S(CA_U)) // ↑
+#define CA_DLSI RCTL(S(CA_I)) // ı
+#define CA_RNGA RCTL(S(CA_CIRC)) // ° (dead)
+#define CA_MACR RCTL(S(CA_CCED)) // ¯ (dead)
+// Row 3
+#define CA_SECT RCTL(S(CA_S)) // §
+#define CA_FORD RCTL(S(CA_F)) // ª
+#define CA_DACU RCTL(S(CA_SCLN)) // ˝ (dead)
+#define CA_CARN RCTL(S(CA_EGRV)) // ˇ (dead)
+#define CA_BREV RCTL(S(CA_AGRV)) // ˘ (dead)
+// Row 4
+#define CA_BRKP RCTL(S(CA_UGRV)) // ¦
+#define CA_COPY RCTL(S(CA_C)) // ©
+#define CA_LSQU RCTL(S(CA_V)) // ‘
+#define CA_RSQU RCTL(S(CA_B)) // ’
+#define CA_ENOT RCTL(S(CA_N)) // ♪
+#define CA_MORD RCTL(S(CA_M)) // º
+#define CA_MUL RCTL(S(CA_COMM)) // ×
+#define CA_DIV RCTL(S(CA_DOT)) // ÷
-// Second row
-#define CSA_DEAD_TREMA LSFT(CSA_DEAD_CIRCUMFLEX) // dead trema/umlaut/diaresis for ä ë ï ö ü
-#define CSA_DTRM CSA_DEAD_TREMA
-
-// Third row
-// all same as US-QWERTY, or capitalised character of the non-shifted key
-
-// Fourth row
-#define CSA_APOSTROPHE LSFT(KC_COMMA) // '
-#define CSA_APOS CSA_APOSTROPHE
-#define CSA_DOUBLE_QUOTE LSFT(KC_DOT) // "
-#define CSA_DQOT CSA_DOUBLE_QUOTE
-
-// Alt Gr-ed characters
-// First row
-#define CSA_PIPE ALGR(CSA_SLASH) // |
-#define CSA_CURRENCY ALGR(KC_4) // ¤
-#define CSA_CURR CSA_CURRENCY
-#define CSA_LEFT_CURLY_BRACE ALGR(KC_7) // {
-#define CSA_LCBR CSA_LEFT_CURLY_BRACE
-#define CSA_RIGHT_CURLY_BRACE ALGR(KC_8) // }
-#define CSA_RCBR CSA_RIGHT_CURLY_BRACE
-#define CSA_LBRACKET ALGR(KC_9) // [
-#define CSA_LBRC CSA_LBRACKET
-#define CSA_RBRACKET ALGR(KC_0) // ]
-#define CSA_RBRC CSA_RBRACKET
-#define CSA_NEGATION ALGR(KC_EQUAL) // ¬
-#define CSA_NEGT CSA_NEGATION
-
-// Second row
-// euro symbol not available on Linux? (X.org)
-#define CSA_EURO ALGR(KC_E) // €
-#define CSA_DEAD_GRAVE ALGR(CSA_DEAD_CIRCUMFLEX)
-#define CSA_DGRV CSA_DEAD_GRAVE // dead `
-#define CSA_DEAD_TILDE ALGR(CSA_C_CEDILLA) // ~
-#define CSA_DTLD CSA_DEAD_TILDE
-
-// Third row
-#define CSA_DEGREE ALGR(KC_SCOLON) // °
-#define CSA_DEGR CSA_DEGREE
-
-// Fourth row
-#define CSA_LEFT_GUILLEMET ALGR(KC_Z) // «
-#define CSA_LGIL CSA_LEFT_GUILLEMET
-#define CSA_RIGHT_GUILLEMET ALGR(KC_X) // »
-#define CSA_RGIL CSA_RIGHT_GUILLEMET
-#define CSA_LESS ALGR(KC_COMMA) // <
-#define CSA_GREATER ALGR(KC_DOT) // >
-#define CSA_GRTR CSA_GREATER
-
-// Space bar
-#define CSA_NON_BREAKING_SPACE ALGR(KC_SPACE)
-#define CSA_NBSP CSA_NON_BREAKING_SPACE
-
-// GR2A-ed characters
-// First row
-#define CSA_SUPERSCRIPT_ONE GR2A(KC_1) // ¹
-#define CSA_SUP1 CSA_SUPERSCRIPT_ONE
-#define CSA_SUPERSCRIPT_TWO GR2A(KC_2) // ²
-#define CSA_SUP2 CSA_SUPERSCRIPT_TWO
-#define CSA_SUPERSCRIPT_THREE GR2A(KC_3) // ³
-#define CSA_SUP3 CSA_SUPERSCRIPT_THREE
-#define CSA_ONE_QUARTER GR2A(KC_4) // ¼
-#define CSA_1QRT CSA_ONE_QUARTER
-#define CSA_ONE_HALF GR2A(KC_5) // ½
-#define CSA_1HLF CSA_ONE_HALF
-#define CSA_THREE_QUARTERS GR2A(KC_6) // ¾
-#define CSA_3QRT CSA_THREE_QUARTERS
-// nothing on 7-0 and -
-#define CSA_DEAD_CEDILLA GR2A(KC_EQUAL) // dead ¸
-#define CSA_DCED CSA_DEAD_CEDILLA
-
-// Second row
-#define CSA_OMEGA GR2A(KC_Q) // ω
-#define CSA_OMEG CSA_OMEGA
-#define CSA_L_STROKE GR2A(KC_W) // ł
-#define CSA_LSTK CSA_L_STROKE
-#define CSA_OE_LIGATURE GR2A(KC_E) // œ
-#define CSA_OE CSA_OE_LIGATURE
-#define CSA_PARAGRAPH GR2A(KC_R) // ¶
-#define CSA_PARG CSA_PARAGRAPH
-#define CSA_T_STROKE GR2A(KC_T) // ŧ
-#define CSA_LEFT_ARROW GR2A(KC_Y) // ←
-#define CSA_LARW CSA_LEFT_ARROW
-#define CSA_DOWN_ARROW GR2A(KC_U) // ↓
-#define CSA_DARW CSA_DOWN_ARROW
-#define CSA_RIGHT_ARROW GR2A(KC_I) // →
-#define CSA_RARW CSA_RIGHT_ARROW
-#define CSA_O_STROKE GR2A(KC_O) // ø
-#define CSA_OSTK CSA_O_STROKE
-#define CSA_THORN GR2A(KC_P) // þ
-#define CSA_THRN CSA_THORN
-// nothing on ^
-#define CSA_TILDE GR2A(CSA_C_CEDILLA) // dead ~
-#define CSA_TILD CSA_TILDE
-
-// Third row
-#define CSA_AE_LIGATURE GR2A(KC_A) // æ
-#define CSA_AE CSA_AE_LIGATURE
-#define CSA_SHARP_S GR2A(KC_S) // ß
-#define CSA_SRPS CSA_SHARP_S
-#define CSA_ETH GR2A(KC_D) // ð
-// nothing on F
-#define CSA_ENG GR2A(KC_G) // ŋ
-#define CSA_H_SRTOKE GR2A(KC_H) // ħ
-#define CSA_HSTK CSA_H_SRTOKE
-#define CSA_IJ_LIGATURE GR2A(KC_J) // ij
-#define CSA_IJ CSA_IJ_LIGATURE
-#define CSA_KRA GR2A(KC_K) // ĸ
-#define CSA_L_FLOWN_DOT GR2A(KC_L) // ŀ
-#define CSA_LFLD CSA_L_FLOWN_DOT
-#define CSA_DEAD_ACUTE GR2A(KC_SCLN) // dead acute accent
-#define CSA_DACT CSA_DEAD_ACUTE
-// nothing on È & À
-
-// Fourth row
-#define CSA_CENT GR2A(KC_C) // ¢
-#define CSA_LEFT_DOUBLE_QUOTE GR2A(KC_V) // “
-#define CSA_LDQT CSA_LEFT_DOUBLE_QUOTE
-#define CSA_RIGHT_DOUBLE_QUOTE GR2A(KC_B) // ”
-#define CSA_RDQT CSA_RIGHT_DOUBLE_QUOTE
-#define CSA_N_APOSTROPHE GR2A(KC_N) // ʼn (deprecated unicode codepoint)
-#define CSA_NAPO CSA_N_APOSTROPHE
-#define CSA_MU GR2A(KC_M) // μ
-#define CSA_HORIZONTAL_BAR GR2A(KC_COMMA) // ―
-#define CSA_HZBR CSA_HORIZONTAL_BAR
-#define CSA_DEAD_DOT_ABOVE GR2A(KC_DOT) // dead ˙
-#define CSA_DDTA CSA_DEAD_DOT_ABOVE
-
-// GR2A-shifted characters (different from capitalised GR2A-ed characters)
-// First row
-#define CSA_SOFT_HYPHEN GR2A(LSFT(CSA_SLASH)) // soft-hyphen, appears as a hyphen in wrapped word
-#define CSA_SHYP CSA_SOFT_HYPHEN
-#define CSA_INVERTED_EXCLAIM GR2A(KC_EXCLAIM) // ¡
-#define CSA_IXLM CSA_INVERTED_EXCLAIM
-// nothing on 2
-#define CSA_POUND GR2A(LSFT(KC_3)) // £
-#define CSA_GBP CSA_POUND_SIGN
-// already on ALGR(KC_E)
-#define CSA_EURO_BIS GR2A(LSFT(KC_4)) // €
-#define CSA_EURB CSA_EURO_BIS
-#define CSA_THREE_EIGHTHS GR2A(LSFT(KC_5)) // ⅜
-#define CSA_3ON8 CSA_THREE_EIGHTHS
-#define CSA_FIVE_EIGHTHS GR2A(LSFT(KC_6)) // ⅝
-#define CSA_5ON8 CSA_FIVE_EIGHTHS
-#define CSA_SEVEN_EIGHTHS GR2A(LSFT(KC_7)) // ⅞
-#define CSA_7ON8 CSA_SEVEN_EIGHTHS
-#define CSA_TRADEMARK GR2A(LSFT(KC_8)) // ™
-#define CSA_TM CSA_TRADEMARK
-#define CSA_PLUS_MINUS GR2A(LSFT(KC_9)) // ±
-#define CSA_PSMS CSA_PLUS_MINUS
-// nothing on 0
-#define CSA_INVERTED_QUESTION GR2A(LSFT(KC_MINUS)) // ¿
-#define CSA_IQST CSA_INVERTED_QUESTION
-#define CSA_DEAD_OGONEK GR2A(LSFT(KC_EQUAL)) // dead ˛
-#define CSA_DOGO CSA_DEAD_OGONEK
-
-// Second row
-#define CSA_REGISTERED_TRADEMARK GR2A(LSFT(KC_R)) // ®
-#define CSA_RTM CSA_REGISTERED_TRADEMARK
-#define CSA_YEN GR2A(LSFT(KC_Y)) // ¥
-#define CSA_YUAN CSA_YEN
-#define CSA_UP_ARROW LSFT(CSA_DOWN_ARROW) // ↑
-#define CSA_DOTLESS_I GR2A(LSFT(KC_I)) // ı
-#define CSA_DLSI CSA_DOTLESS_I
-#define CSA_DEAD_RING GR2A(LSFT(CSA_DCRC)) // dead °
-#define CSA_DRNG CSA_DEAD_RING
-#define CSA_DEAD_MACRON GR2A(LSFT(CSA_C_CEDILLA)) // dead ¯
-#define CSA_DMCR CSA_DEAD_MACRON
-
-// Third row
-#define CSA_SECTION GR2A(LSFT(KC_S)) // §
-#define CSA_SECT CSA_SECTION
-#define CSA_ORDINAL_INDICATOR_A GR2A(LSFT(KC_F)) // ª
-#define CSA_ORDA CSA_ORDINAL_INDICATOR_A
-#define CSA_DEAD_DOUBLE_ACUTE LSFT(CSA_DEAD_ACUTE) // ˝
-#define CSA_DDCT CSA_DEAD_DOUBLE_ACUTE
-#define CSA_DEAD_CARON GR2A(LSFT(CSA_E_GRAVE)) // dead ˇ
-#define CSA_DCAR CSA_DEAD_CARON
-#define CSA_DEAD_BREVE GR2A(LSFT(CSA_A_GRAVE)) // dead ˘
-#define CSA_DBRV CSA_DEAD_BREVE
-
-// Fourth row
-#define CSA_BROKEN_PIPE GR2A(LSFT(CSA_U_GRAVE)) // ¦
-#define CSA_BPIP CSA_BROKEN_PIPE
-#define CSA_COPYRIGHT GR2A(LSFT(KC_C)) // ©
-#define CSA_CPRT CSA_COPYRIGHT
-#define CSA_LEFT_QUOTE GR2A(LSFT(KC_V)) // ‘
-#define CSA_LQOT CSA_LEFT_QUOTE
-#define CSA_RIGHT_QUOTE GR2A(LSFT(KC_B)) // ’
-#define CSA_RQOT CSA_RIGHT_QUOTE
-#define CSA_EIGHTH_NOTE GR2A(LSFT(KC_N)) // ♪
-#define CSA_8NOT CSA_EIGHTH_NOTE
-#define CSA_ORDINAL_INDICATOR_O GR2A(LSFT(KC_M)) // º
-#define CSA_ORDO CSA_ORDINAL_INDICATOR_O
-#define CSA_TIMES GR2A(LSFT(KC_COMMA)) // ×
-#define CSA_TIMS CSA_TIMES
-#define CSA_OBELUS GR2A(LSFT(KC_DOT)) // ÷
-#define CSA_OBEL CSA_OBELUS
-// more conventional name of the symbol
-#define CSA_DIVISION_SIGN CSA_OBELUS
-#define CSA_DVSN CSA_DIVISION_SIGN
-// TODO GR2A(LSFT(CSA_E_ACUTE))
-
-#endif
+// DEPRECATED
+#define GR2A(kc) RCTL(kc)
+#define CSA_SLASH CA_SLSH
+#define CSA_SLSH CA_SLSH
+#define CSA_DEAD_CIRCUMFLEX CA_CIRC
+#define CSA_DCRC CA_CIRC
+#define CSA_C_CEDILLA CA_CCED
+#define CSA_CCED CA_CCED
+#define CSA_E_GRAVE CA_EGRV
+#define CSA_EGRV CA_EGRV
+#define CSA_A_GRAVE CA_AGRV
+#define CSA_AGRV CA_AGRV
+#define CSA_U_GRAVE CA_UGRV
+#define CSA_UGRV CA_UGRV
+#define CSA_E_ACUTE CA_EACU
+#define CSA_ECUT CA_EACU
+#define CSA_BACKSLASH CA_BSLS
+#define CSA_BSLS CA_BSLS
+#define CSA_QUESTION CA_QUES
+#define CSA_QEST CA_QUES
+#define CSA_DEAD_TREMA CA_DIAE
+#define CSA_DTRM CA_DIAE
+#define CSA_APOSTROPHE CA_QUOT
+#define CSA_APOS CA_QUOT
+#define CSA_DOUBLE_QUOTE CA_DQUO
+#define CSA_DQOT CA_DQUO
+#define CSA_PIPE CA_PIPE
+#define CSA_CURRENCY CA_CURR
+#define CSA_CURR CA_CURR
+#define CSA_LEFT_CURLY_BRACE CA_LCBR
+#define CSA_LCBR CA_LCBR
+#define CSA_RIGHT_CURLY_BRACE CA_RCBR
+#define CSA_RCBR CA_RCBR
+#define CSA_LBRACKET CA_LBRC
+#define CSA_LBRC CA_LBRC
+#define CSA_RBRACKET CA_RBRC
+#define CSA_RBRC CA_RBRC
+#define CSA_NEGATION CA_NOT
+#define CSA_NEGT CA_NOT
+#define CSA_EURO CA_EURO
+#define CSA_DEAD_GRAVE CA_GRV
+#define CSA_DGRV CA_GRV
+#define CSA_DEAD_TILDE CA_DTIL
+#define CSA_DTLD CA_DTIL
+#define CSA_DEGREE CA_DEG
+#define CSA_DEGR CA_DEG
+#define CSA_LEFT_GUILLEMET CA_LDAQ
+#define CSA_LGIL CA_LDAQ
+#define CSA_RIGHT_GUILLEMET CA_RDAQ
+#define CSA_RGIL CA_RDAQ
+#define CSA_LESS CA_LABK
+#define CSA_GREATER CA_RABK
+#define CSA_GRTR CA_RABK
+#define CSA_NON_BREAKING_SPACE ALGR(KC_SPC)
+#define CSA_NBSP ALGR(KC_SPC)
+#define CSA_SUPERSCRIPT_ONE CA_SUP1
+#define CSA_SUP1 CA_SUP1
+#define CSA_SUPERSCRIPT_TWO CA_SUP2
+#define CSA_SUP2 CA_SUP2
+#define CSA_SUPERSCRIPT_THREE CA_SUP3
+#define CSA_SUP3 CA_SUP3
+#define CSA_ONE_QUARTER CA_QRTR
+#define CSA_1QRT CA_QRTR
+#define CSA_ONE_HALF CA_HALF
+#define CSA_1HLF CA_HALF
+#define CSA_THREE_QUARTERS CA_TQTR
+#define CSA_3QRT CA_TQTR
+#define CSA_DEAD_CEDILLA CA_CEDL
+#define CSA_DCED CA_CEDL
+#define CSA_OMEGA CA_OMEG
+#define CSA_OMEG CA_OMEG
+#define CSA_L_STROKE CA_LSTR
+#define CSA_LSTK CA_LSTR
+#define CSA_OE_LIGATURE CA_OE
+#define CSA_OE CA_OE
+#define CSA_PARAGRAPH CA_PARA
+#define CSA_PARG CA_PARA
+#define CSA_T_STROKE CA_TSTR
+#define CSA_LEFT_ARROW CA_LARR
+#define CSA_LARW CA_LARR
+#define CSA_DOWN_ARROW CA_DARR
+#define CSA_DARW CA_DARR
+#define CSA_RIGHT_ARROW CA_RARR
+#define CSA_RARW CA_RARR
+#define CSA_O_STROKE CA_OSTR
+#define CSA_OSTK CA_OSTR
+#define CSA_THORN CA_THRN
+#define CSA_THRN CA_THRN
+#define CSA_TILDE CA_TILD
+#define CSA_TILD CA_TILD
+#define CSA_AE_LIGATURE CA_AE
+#define CSA_AE CA_AE
+#define CSA_SHARP_S CA_SS
+#define CSA_SRPS CA_SS
+#define CSA_ETH CA_ETH
+#define CSA_ENG CA_ENG
+#define CSA_H_SRTOKE CA_HSTR
+#define CSA_HSTK CA_HSTR
+#define CSA_IJ_LIGATURE CA_IJ
+#define CSA_IJ CA_IJ
+#define CSA_KRA CA_KRA
+#define CSA_L_FLOWN_DOT CA_LMDT
+#define CSA_LFLD CA_LMDT
+#define CSA_DEAD_ACUTE CA_ACUT
+#define CSA_DACT CA_ACUT
+#define CSA_CENT CA_CENT
+#define CSA_LEFT_DOUBLE_QUOTE CA_LDQU
+#define CSA_LDQT CA_LDQU
+#define CSA_RIGHT_DOUBLE_QUOTE CA_RDQU
+#define CSA_RDQT CA_RDQU
+#define CSA_N_APOSTROPHE CA_APSN
+#define CSA_NAPO CA_APSN
+#define CSA_MU CA_MICR
+#define CSA_HORIZONTAL_BAR CA_HRZB
+#define CSA_HZBR CA_HRZB
+#define CSA_DEAD_DOT_ABOVE CA_DOTA
+#define CSA_DDTA CA_DOTA
+#define CSA_SOFT_HYPHEN CA_SHYP
+#define CSA_SHYP CA_SHYP
+#define CSA_INVERTED_EXCLAIM CA_IEXL
+#define CSA_IXLM CA_IEXL
+#define CSA_POUND CA_PND
+#define CSA_GBP CA_PND
+#define CSA_EURO_BIS CA_EURO
+#define CSA_EURB CA_EURO
+#define CSA_THREE_EIGHTHS CA_TEIG
+#define CSA_3ON8 CA_TEIG
+#define CSA_FIVE_EIGHTHS CA_FEIG
+#define CSA_5ON8 CA_FEIG
+#define CSA_SEVEN_EIGHTHS CA_SEIG
+#define CSA_7ON8 CA_SEIG
+#define CSA_TRADEMARK CA_TM
+#define CSA_TM CA_TM
+#define CSA_PLUS_MINUS CA_PLMN
+#define CSA_PSMS CA_PLMN
+#define CSA_INVERTED_QUESTION CA_IQUE
+#define CSA_IQST CA_IQUE
+#define CSA_DEAD_OGONEK CA_OGON
+#define CSA_DOGO CA_OGON
+#define CSA_REGISTERED_TRADEMARK CA_REGD
+#define CSA_RTM CA_REGD
+#define CSA_YEN CA_YEN
+#define CSA_YUAN CA_YEN
+#define CSA_UP_ARROW CA_UARR
+#define CSA_DOTLESS_I CA_DLSI
+#define CSA_DLSI CA_DLSI
+#define CSA_DEAD_RING CA_RNGA
+#define CSA_DRNG CA_RNGA
+#define CSA_DEAD_MACRON CA_MACR
+#define CSA_DMCR CA_MACR
+#define CSA_SECTION CA_SECT
+#define CSA_SECT CA_SECT
+#define CSA_ORDINAL_INDICATOR_A CA_FORD
+#define CSA_ORDA CA_FORD
+#define CSA_DEAD_DOUBLE_ACUTE CA_DACU
+#define CSA_DDCT CA_DACU
+#define CSA_DEAD_CARON CA_CARN
+#define CSA_DCAR CA_CARN
+#define CSA_DEAD_BREVE CA_BREV
+#define CSA_DBRV CA_BREV
+#define CSA_BROKEN_PIPE CA_BRKP
+#define CSA_BPIP CA_BRKP
+#define CSA_COPYRIGHT CA_COPY
+#define CSA_CPRT CA_COPY
+#define CSA_LEFT_QUOTE CA_LSQU
+#define CSA_LQOT CA_LSQU
+#define CSA_RIGHT_QUOTE CA_RSQU
+#define CSA_RQOT CA_RSQU
+#define CSA_EIGHTH_NOTE CA_ENOT
+#define CSA_8NOT CA_ENOT
+#define CSA_ORDINAL_INDICATOR_O CA_MORD
+#define CSA_ORDO CA_MORD
+#define CSA_TIMES CA_MUL
+#define CSA_TIMS CA_MUL
+#define CSA_OBELUS CA_DIV
+#define CSA_OBEL CA_DIV
+#define CSA_DIVISION_SIGN CA_DIV
+#define CSA_DVSN CA_DIV
diff --git a/quantum/keymap_extras/keymap_croatian.h b/quantum/keymap_extras/keymap_croatian.h
new file mode 100644
index 00000000000..4af5dc5875e
--- /dev/null
+++ b/quantum/keymap_extras/keymap_croatian.h
@@ -0,0 +1,163 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ¸ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ' │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Z │ U │ I │ O │ P │ Š │ Đ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Č │ Ć │ Ž │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ < │ Y │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define HR_CEDL KC_GRV // ¸ (dead)
+#define HR_1 KC_1 // 1
+#define HR_2 KC_2 // 2
+#define HR_3 KC_3 // 3
+#define HR_4 KC_4 // 4
+#define HR_5 KC_5 // 5
+#define HR_6 KC_6 // 6
+#define HR_7 KC_7 // 7
+#define HR_8 KC_8 // 8
+#define HR_9 KC_9 // 9
+#define HR_0 KC_0 // 0
+#define HR_QUOT KC_MINS // '
+#define HR_PLUS KC_EQL // +
+// Row 2
+#define HR_Q KC_Q // Q
+#define HR_W KC_W // W
+#define HR_E KC_E // E
+#define HR_R KC_R // R
+#define HR_T KC_T // T
+#define HR_Z KC_Y // Z
+#define HR_U KC_U // U
+#define HR_I KC_I // I
+#define HR_O KC_O // O
+#define HR_P KC_P // P
+#define HR_SCAR KC_LBRC // Š
+#define HR_DSTR KC_RBRC // Đ
+// Row 3
+#define HR_A KC_A // A
+#define HR_S KC_S // S
+#define HR_D KC_D // D
+#define HR_F KC_F // F
+#define HR_G KC_G // G
+#define HR_H KC_H // H
+#define HR_J KC_J // J
+#define HR_K KC_K // K
+#define HR_L KC_L // L
+#define HR_CCAR KC_SCLN // Č
+#define HR_CACU KC_QUOT // Ć
+#define HR_ZCAR KC_NUHS // Ž
+// Row 4
+#define HR_LABK KC_NUBS // <
+#define HR_Y KC_Z // Y
+#define HR_X KC_X // X
+#define HR_C KC_C // C
+#define HR_V KC_V // V
+#define HR_B KC_B // B
+#define HR_N KC_N // N
+#define HR_M KC_M // M
+#define HR_COMM KC_COMM // ,
+#define HR_DOT KC_DOT // .
+#define HR_MINS KC_SLSH // -
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ¨ │ ! │ " │ # │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ * │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define HR_DIAE S(HR_CEDL) // ¨ (dead)
+#define HR_EXLM S(HR_1) // !
+#define HR_DQUO S(HR_2) // "
+#define HR_HASH S(HR_3) // #
+#define HR_DLR S(HR_4) // $
+#define HR_PERC S(HR_5) // %
+#define HR_AMPR S(HR_6) // &
+#define HR_SLSH S(HR_7) // /
+#define HR_LPRN S(HR_8) // (
+#define HR_RPRN S(HR_9) // )
+#define HR_EQL S(HR_0) // =
+#define HR_QUES S(HR_QUOT) // ?
+#define HR_ASTR S(HR_PLUS) // *
+// Row 4
+#define HR_RABK S(HR_LABK) // >
+#define HR_SCLN S(HR_COMM) // ;
+#define HR_COLN S(HR_DOT) // :
+#define HR_UNDS S(HR_MINS) // _
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ ~ │ ˇ │ ^ │ ˘ │ ° │ ˛ │ ` │ ˙ │ ´ │ ˝ │ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ \ │ | │ € │ │ │ │ │ │ │ │ ÷ │ × │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ [ │ ] │ │ │ ł │ Ł │ │ ß │ ¤ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ @ │ { │ } │ § │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define HR_TILD ALGR(HR_1) // ~
+#define HR_CARN ALGR(HR_2) // ˇ (dead)
+#define HR_CIRC ALGR(HR_3) // ^ (dead)
+#define HR_BREV ALGR(HR_4) // ˘ (dead)
+#define HR_RNGA ALGR(HR_5) // ° (dead)
+#define HR_OGON ALGR(HR_6) // ˛ (dead)
+#define HR_GRV ALGR(HR_7) // `
+#define HR_DOTA ALGR(HR_8) // ˙ (dead)
+#define HR_ACUT ALGR(HR_9) // ´ (dead)
+#define HR_DACU ALGR(HR_0) // ˝ (dead)
+// Row 2
+#define HR_BSLS ALGR(HR_Q) // (backslash)
+#define HR_PIPE ALGR(HR_W) // |
+#define HR_EURO ALGR(HR_E) // €
+#define HR_DIV ALGR(HR_SCAR) // ÷
+#define HR_MUL ALGR(HR_DSTR) // ×
+// Row 3
+#define HR_LBRC ALGR(HR_F) // [
+#define HR_RBRC ALGR(HR_G) // ]
+#define HR_LLST ALGR(HR_K) // ł
+#define HR_CLST ALGR(HR_L) // Ł
+#define HR_SS ALGR(HR_CACU) // ß
+#define HR_CURR ALGR(HR_ZCAR) // ¤
+// Row 4
+#define HR_AT ALGR(HR_V) // @
+#define HR_LCBR ALGR(HR_B) // {
+#define HR_RCBR ALGR(HR_N) // }
+#define HR_SECT ALGR(HR_M) // §
diff --git a/quantum/keymap_extras/keymap_czech.h b/quantum/keymap_extras/keymap_czech.h
new file mode 100644
index 00000000000..7e9d299f499
--- /dev/null
+++ b/quantum/keymap_extras/keymap_czech.h
@@ -0,0 +1,173 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ; │ + │ ě │ š │ č │ ř │ ž │ ý │ á │ í │ é │ = │ ´ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Z │ U │ I │ O │ P │ ú │ ) │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ů │ § │ ¨ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ \ │ Y │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define CZ_SCLN KC_GRV // ;
+#define CZ_PLUS KC_1 // +
+#define CZ_ECAR KC_2 // ě
+#define CZ_SCAR KC_3 // š
+#define CZ_CCAR KC_4 // č
+#define CZ_RCAR KC_5 // ř
+#define CZ_ZCAR KC_6 // ž
+#define CZ_YACU KC_7 // ý
+#define CZ_AACU KC_8 // á
+#define CZ_IACU KC_9 // í
+#define CZ_EACU KC_0 // é
+#define CZ_EQL KC_MINS // =
+#define CZ_ACUT KC_EQL // ´ (dead)
+// Row 2
+#define CZ_Q KC_Q // Q
+#define CZ_W KC_W // W
+#define CZ_E KC_E // E
+#define CZ_R KC_R // R
+#define CZ_T KC_T // T
+#define CZ_Z KC_Y // Z
+#define CZ_U KC_U // U
+#define CZ_I KC_I // I
+#define CZ_O KC_O // O
+#define CZ_P KC_P // P
+#define CZ_UACU KC_LBRC // ú
+#define CZ_RPRN KC_RBRC // )
+// Row 3
+#define CZ_A KC_A // A
+#define CZ_S KC_S // S
+#define CZ_D KC_D // D
+#define CZ_F KC_F // F
+#define CZ_G KC_G // G
+#define CZ_H KC_H // H
+#define CZ_J KC_J // J
+#define CZ_K KC_K // K
+#define CZ_L KC_L // L
+#define CZ_URNG KC_SCLN // ů
+#define CZ_SECT KC_QUOT // §
+#define CZ_DIAE KC_NUHS // ¨ (dead)
+// Row 4
+#define CZ_BSLS KC_NUBS // (backslash)
+#define CZ_Y KC_Z // Y
+#define CZ_X KC_X // X
+#define CZ_C KC_C // C
+#define CZ_V KC_V // V
+#define CZ_B KC_B // B
+#define CZ_N KC_N // N
+#define CZ_M KC_M // M
+#define CZ_COMM KC_COMM // ,
+#define CZ_DOT KC_DOT // .
+#define CZ_MINS KC_SLSH // -
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ° │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ % │ ˇ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ / │ ( │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ " │ ! │ ' │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ | │ │ │ │ │ │ │ │ ; │ : │ _ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define CZ_RNGA S(CZ_SCLN) // ° (dead)
+#define CZ_1 S(CZ_PLUS) // 1
+#define CZ_2 S(CZ_ECAR) // 2
+#define CZ_3 S(CZ_SCAR) // 3
+#define CZ_4 S(CZ_CCAR) // 4
+#define CZ_5 S(CZ_RCAR) // 5
+#define CZ_6 S(CZ_ZCAR) // 6
+#define CZ_7 S(CZ_YACU) // 7
+#define CZ_8 S(CZ_AACU) // 8
+#define CZ_9 S(CZ_IACU) // 9
+#define CZ_0 S(CZ_EACU) // 0
+#define CZ_PERC S(CZ_PLUS) // %
+#define CZ_CARN S(CZ_ACUT) // ˇ (dead)
+// Row 2
+#define CZ_SLSH S(CZ_UACU) // /
+#define CZ_LPRN S(CZ_RPRN) // (
+// Row 3
+#define CZ_DQUO S(CZ_URNG) // "
+#define CZ_EXLM S(CZ_SECT) // !
+#define CZ_QUOT S(CZ_DIAE) // '
+// Row 4
+#define CZ_PIPE S(CZ_BSLS) // |
+#define CZ_SCLN S(CZ_COMM) // ;
+#define CZ_COLN S(CZ_DOT) // :
+#define CZ_UNDS S(CZ_MINS) // _
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ ~ │ │ ^ │ ˘ │ │ ˛ │ ` │ ˙ │ │ ˝ │ │ ¸ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ € │ │ │ │ │ │ │ │ ÷ │ × │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ đ │ Đ │ [ │ ] │ │ │ ł │ Ł │ $ │ ß │ ¤ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ # │ & │ @ │ { │ } │ │ < │ > │ * │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define CZ_TILD ALGR(CZ_PLUS) // ~
+#define CZ_CIRC ALGR(CZ_SCAR) // ^ (dead)
+#define CZ_BREV ALGR(CZ_CCAR) // ˘ (dead)
+#define CZ_OGON ALGR(CZ_ZCAR) // ˛ (dead)
+#define CZ_GRV ALGR(CZ_YACU) // ` (dead)
+#define CZ_DOTA ALGR(CZ_AACU) // ˙ (dead)
+#define CZ_DACU ALGR(CZ_EACU) // ˝ (dead)
+#define CZ_CEDL ALGR(CZ_ACUT) // ¸ (dead)
+// Row 2
+#define CZ_EURO ALGR(CZ_E) // €
+#define CZ_DIV ALGR(CZ_UACU) // ÷
+#define CZ_MUL ALGR(CZ_RPRN) // ×
+// Row 3
+#define CZ_LDST ALGR(CZ_S) // đ
+#define CZ_CDST ALGR(CZ_D) // Đ
+#define CZ_LBRC ALGR(CZ_F) // [
+#define CZ_RBRC ALGR(CZ_G) // ]
+#define CZ_LLST ALGR(CZ_K) // ł
+#define CZ_CLST ALGR(CZ_L) // Ł
+#define CZ_DLR ALGR(CZ_URNG) // $
+#define CZ_SS ALGR(CZ_SECT) // ß
+#define CZ_CURR ALGR(CZ_DIAE) // ¤
+// Row 4
+#define CZ_HASH ALGR(CZ_X) // #
+#define CZ_AMPR ALGR(CZ_C) // &
+#define CZ_AT ALGR(CZ_V) // @
+#define CZ_LCBR ALGR(CZ_B) // {
+#define CZ_RCBR ALGR(CZ_N) // }
+#define CZ_LABK ALGR(CZ_COMM) // <
+#define CZ_RABK ALGR(CZ_DOT) // >
+#define CZ_ASTR ALGR(CZ_MINS) // *
diff --git a/quantum/keymap_extras/keymap_dvp.h b/quantum/keymap_extras/keymap_dvp.h
index 4b60a67d4db..99c69a4af5d 100644
--- a/quantum/keymap_extras/keymap_dvp.h
+++ b/quantum/keymap_extras/keymap_dvp.h
@@ -14,85 +14,112 @@
* along with this program. If not, see .
*/
-#ifndef KEYMAP_DVP_H
-#define KEYMAP_DVP_H
+#pragma once
#include "keymap.h"
-// Normal characters
-#define DP_DLR KC_GRV
-#define DP_AMPR KC_1
-#define DP_LBRC KC_2
-#define DP_LCBR KC_3
-#define DP_RCBR KC_4
-#define DP_LPRN KC_5
-#define DP_EQL KC_6
-#define DP_ASTR KC_7
-#define DP_RPRN KC_8
-#define DP_PLUS KC_9
-#define DP_RBRC KC_0
-#define DP_EXLM KC_MINS
-#define DP_HASH KC_EQL
+// clang-format off
-#define DP_SCLN KC_Q
-#define DP_COMM KC_W
-#define DP_DOT KC_E
-#define DP_P KC_R
-#define DP_Y KC_T
-#define DP_F KC_Y
-#define DP_G KC_U
-#define DP_C KC_I
-#define DP_R KC_O
-#define DP_L KC_P
-#define DP_SLSH KC_LBRC
-#define DP_AT KC_RBRC
-#define DP_BSLS KC_BSLS
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ $ │ & │ [ │ { │ } │ ( │ = │ * │ ) │ + │ ] │ ! │ # │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ ; │ , │ . │ P │ Y │ F │ G │ C │ R │ L │ / │ @ │ \ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ A │ O │ E │ U │ I │ D │ H │ T │ N │ S │ - │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ ' │ Q │ J │ K │ X │ B │ M │ W │ V │ Z │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define DP_DLR KC_GRV // $
+#define DP_AMPR KC_1 // &
+#define DP_LBRC KC_2 // [
+#define DP_LCBR KC_3 // {
+#define DP_RCBR KC_4 // }
+#define DP_LPRN KC_5 // (
+#define DP_EQL KC_6 // =
+#define DP_ASTR KC_7 // *
+#define DP_RPRN KC_8 // )
+#define DP_PLUS KC_9 // +
+#define DP_RBRC KC_0 // ]
+#define DP_EXLM KC_MINS // !
+#define DP_HASH KC_EQL // #
+// Row 2
+#define DP_SCLN KC_Q // ;
+#define DP_COMM KC_W // ,
+#define DP_DOT KC_E // .
+#define DP_P KC_R // P
+#define DP_Y KC_T // Y
+#define DP_F KC_Y // F
+#define DP_G KC_U // G
+#define DP_C KC_I // C
+#define DP_R KC_O // R
+#define DP_L KC_P // L
+#define DP_SLSH KC_LBRC // /
+#define DP_AT KC_RBRC // @
+#define DP_BSLS KC_BSLS // (backslash)
+// Row 3
+#define DP_A KC_A // A
+#define DP_O KC_S // O
+#define DP_E KC_D // E
+#define DP_U KC_F // U
+#define DP_I KC_G // I
+#define DP_D KC_H // D
+#define DP_H KC_J // H
+#define DP_T KC_K // T
+#define DP_N KC_L // N
+#define DP_S KC_SCLN // S
+#define DP_MINS KC_QUOT // -
+// Row 4
+#define DP_QUOT KC_Z // '
+#define DP_Q KC_X // Q
+#define DP_J KC_C // J
+#define DP_K KC_V // K
+#define DP_X KC_B // X
+#define DP_B KC_N // B
+#define DP_M KC_M // M
+#define DP_W KC_COMM // W
+#define DP_V KC_DOT // V
+#define DP_Z KC_SLSH // Z
-#define DP_A KC_A
-#define DP_O KC_S
-#define DP_E KC_D
-#define DP_U KC_F
-#define DP_I KC_G
-#define DP_D KC_H
-#define DP_H KC_J
-#define DP_T KC_K
-#define DP_N KC_L
-#define DP_S KC_SCLN
-#define DP_MINS KC_QUOT
-
-#define DP_QUOT KC_Z
-#define DP_Q KC_X
-#define DP_J KC_C
-#define DP_K KC_V
-#define DP_X KC_B
-#define DP_B KC_N
-#define DP_M KC_M
-#define DP_W KC_COMM
-#define DP_V KC_DOT
-#define DP_Z KC_SLSH
-
-// Shifted characters
-#define DP_TILD LSFT(DP_DLR)
-#define DP_PERC LSFT(DP_AMPR)
-#define DP_7 LSFT(DP_LBRC)
-#define DP_5 LSFT(DP_LCBR)
-#define DP_3 LSFT(DP_RCBR)
-#define DP_1 LSFT(DP_LPRN)
-#define DP_9 LSFT(DP_EQL)
-#define DP_0 LSFT(DP_ASTR)
-#define DP_2 LSFT(DP_RPRN)
-#define DP_4 LSFT(DP_PLUS)
-#define DP_6 LSFT(DP_RBRC)
-#define DP_8 LSFT(DP_EXLM)
-#define DP_GRV LSFT(DP_HASH)
-
-#define DP_COLN LSFT(DP_SCLN)
-#define DP_LABK LSFT(DP_COMM)
-#define DP_RABK LSFT(DP_DOT)
-#define DP_QUES LSFT(DP_SLSH)
-#define DP_CIRC LSFT(DP_AT)
-#define DP_PIPE LSFT(DP_BSLS)
-#define DP_UNDS LSFT(DP_MINS)
-#define DP_DQUO LSFT(DP_QUOT)
-
-#endif
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ % │ 7 │ 5 │ 3 │ 1 │ 9 │ 0 │ 2 │ 4 │ 6 │ 8 │ ` │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ : │ < │ > │ │ │ │ │ │ │ │ ? │ ^ │ | │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ _ │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ " │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define DP_TILD S(DP_DLR) // ~
+#define DP_PERC S(DP_AMPR) // %
+#define DP_7 S(DP_LBRC) // 7
+#define DP_5 S(DP_LCBR) // 5
+#define DP_3 S(DP_RCBR) // 3
+#define DP_1 S(DP_LPRN) // 1
+#define DP_9 S(DP_EQL) // 9
+#define DP_0 S(DP_ASTR) // 0
+#define DP_2 S(DP_RPRN) // 2
+#define DP_4 S(DP_PLUS) // 4
+#define DP_6 S(DP_RBRC) // 6
+#define DP_8 S(DP_EXLM) // 8
+#define DP_GRV S(DP_HASH) // `
+// Row 2
+#define DP_COLN S(DP_SCLN) // :
+#define DP_LABK S(DP_COMM) // <
+#define DP_RABK S(DP_DOT) // >
+#define DP_QUES S(DP_SLSH) // ?
+#define DP_CIRC S(DP_AT) // ^
+#define DP_PIPE S(DP_BSLS) // |
+// Row 3
+#define DP_UNDS S(DP_MINS) // _
+// Row 4
+#define DP_DQUO S(DP_QUOT) // "
diff --git a/quantum/keymap_extras/keymap_estonian.h b/quantum/keymap_extras/keymap_estonian.h
new file mode 100644
index 00000000000..e806c51fedc
--- /dev/null
+++ b/quantum/keymap_extras/keymap_estonian.h
@@ -0,0 +1,155 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ˇ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ + │ ´ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ Ü │ Õ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ö │ Ä │ ' │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ < │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define EE_CARN KC_GRV // ˇ (dead)
+#define EE_1 KC_1 // 1
+#define EE_2 KC_2 // 2
+#define EE_3 KC_3 // 3
+#define EE_4 KC_4 // 4
+#define EE_5 KC_5 // 5
+#define EE_6 KC_6 // 6
+#define EE_7 KC_7 // 7
+#define EE_8 KC_8 // 8
+#define EE_9 KC_9 // 9
+#define EE_0 KC_0 // 0
+#define EE_PLUS KC_MINS // +
+#define EE_ACUT KC_EQL // ´ (dead)
+// Row 2
+#define EE_Q KC_Q // Q
+#define EE_W KC_W // W
+#define EE_E KC_E // E
+#define EE_R KC_R // R
+#define EE_T KC_T // T
+#define EE_Y KC_Y // Y
+#define EE_U KC_U // U
+#define EE_I KC_I // I
+#define EE_O KC_O // O
+#define EE_P KC_P // P
+#define EE_UDIA KC_LBRC // Ü
+#define EE_OTIL KC_RBRC // Õ
+// Row 3
+#define EE_A KC_A // A
+#define EE_S KC_S // S
+#define EE_D KC_D // D
+#define EE_F KC_F // F
+#define EE_G KC_G // G
+#define EE_H KC_H // H
+#define EE_J KC_J // J
+#define EE_K KC_K // K
+#define EE_L KC_L // L
+#define EE_ODIA KC_SCLN // Ö
+#define EE_ADIA KC_QUOT // Ä
+#define EE_QUOT KC_NUHS // '
+// Row 4
+#define EE_LABK KC_NUBS // <
+#define EE_Z KC_Z // Z
+#define EE_X KC_X // X
+#define EE_C KC_C // C
+#define EE_V KC_V // V
+#define EE_B KC_B // B
+#define EE_N KC_N // N
+#define EE_M KC_M // M
+#define EE_COMM KC_COMM // ,
+#define EE_DOT KC_DOT // .
+#define EE_MINS KC_SLSH // -
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ ! │ " │ # │ ¤ │ % │ & │ / │ ( │ ) │ = │ ? │ ` │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ * │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define EE_TILD S(EE_CARN) // ~ (dead)
+#define EE_EXLM S(EE_1) // !
+#define EE_DQUO S(EE_2) // "
+#define EE_HASH S(EE_3) // #
+#define EE_CURR S(EE_4) // ¤
+#define EE_PERC S(EE_5) // %
+#define EE_AMPR S(EE_6) // &
+#define EE_SLSH S(EE_7) // /
+#define EE_LPRN S(EE_8) // (
+#define EE_RPRN S(EE_9) // )
+#define EE_EQL S(EE_0) // =
+#define EE_QUES S(EE_PLUS) // ?
+#define EE_GRV S(EE_ACUT) // ` (dead)
+// Row 3
+#define EE_ASTR S(EE_QUOT) // *
+// Row 4
+#define EE_RABK S(EE_LABK) // >
+#define EE_SCLN S(EE_COMM) // ;
+#define EE_COLN S(EE_DOT) // :
+#define EE_UNDS S(EE_MINS) // _
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ │ @ │ £ │ $ │ € │ │ { │ [ │ ] │ } │ \ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ § │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ š │ │ │ │ │ │ │ │ │ ^ │ ½ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ | │ ž │ │ │ │ │ │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define EE_AT ALGR(EE_2) // @
+#define EE_PND ALGR(EE_3) // £
+#define EE_DLR ALGR(EE_4) // $
+#define EE_EURO ALGR(EE_5) // €
+#define EE_LCBR ALGR(EE_7) // {
+#define EE_LBRC ALGR(EE_8) // [
+#define EE_RBRC ALGR(EE_9) // ]
+#define EE_RCBR ALGR(EE_0) // }
+#define EE_BSLS ALGR(EE_PLUS) // (backslash)
+// Row 2
+#define EE_SECT ALGR(EE_OTIL) // §
+// Row 3
+#define EE_SCAR ALGR(EE_S) // š
+#define EE_CIRC ALGR(EE_ADIA) // ^ (dead)
+#define EE_HALF ALGR(EE_QUOT) // ½
+// Row 4
+#define EE_PIPE ALGR(EE_LABK) // |
+#define EE_ZCAR ALGR(EE_Z) // ž
diff --git a/quantum/keymap_extras/keymap_finnish.h b/quantum/keymap_extras/keymap_finnish.h
new file mode 100644
index 00000000000..81a8027ff4e
--- /dev/null
+++ b/quantum/keymap_extras/keymap_finnish.h
@@ -0,0 +1,153 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ § │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ + │ ´ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ Å │ ¨ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ö │ Ä │ ' │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ < │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define FI_SECT KC_GRV // §
+#define FI_1 KC_1 // 1
+#define FI_2 KC_2 // 2
+#define FI_3 KC_3 // 3
+#define FI_4 KC_4 // 4
+#define FI_5 KC_5 // 5
+#define FI_6 KC_6 // 6
+#define FI_7 KC_7 // 7
+#define FI_8 KC_8 // 8
+#define FI_9 KC_9 // 9
+#define FI_0 KC_0 // 0
+#define FI_PLUS KC_MINS // +
+#define FI_ACUT KC_EQL // ´ (dead)
+// Row 2
+#define FI_Q KC_Q // Q
+#define FI_W KC_W // W
+#define FI_E KC_E // E
+#define FI_R KC_R // R
+#define FI_T KC_T // T
+#define FI_Y KC_Y // Y
+#define FI_U KC_U // U
+#define FI_I KC_I // I
+#define FI_O KC_O // O
+#define FI_P KC_P // P
+#define FI_ARNG KC_LBRC // Å
+#define FI_DIAE KC_RBRC // ¨ (dead)
+// Row 3
+#define FI_A KC_A // A
+#define FI_S KC_S // S
+#define FI_D KC_D // D
+#define FI_F KC_F // F
+#define FI_G KC_G // G
+#define FI_H KC_H // H
+#define FI_J KC_J // J
+#define FI_K KC_K // K
+#define FI_L KC_L // L
+#define FI_ODIA KC_SCLN // Ö
+#define FI_ADIA KC_QUOT // Ä
+#define FI_QUOT KC_NUHS // '
+// Row 4
+#define FI_LABK KC_NUBS // <
+#define FI_Z KC_Z // Z
+#define FI_X KC_X // X
+#define FI_C KC_C // C
+#define FI_V KC_V // V
+#define FI_B KC_B // B
+#define FI_N KC_N // N
+#define FI_M KC_M // M
+#define FI_COMM KC_COMM // ,
+#define FI_DOT KC_DOT // .
+#define FI_MINS KC_SLSH // -
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ½ │ ! │ " │ # │ ¤ │ % │ & │ / │ ( │ ) │ = │ ? │ ` │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ ^ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ * │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define FI_HALF S(FI_SECT) // ½
+#define FI_EXLM S(FI_1) // !
+#define FI_DQUO S(FI_2) // "
+#define FI_HASH S(FI_3) // #
+#define FI_CURR S(FI_4) // ¤
+#define FI_PERC S(FI_5) // %
+#define FI_AMPR S(FI_6) // &
+#define FI_SLSH S(FI_7) // /
+#define FI_LPRN S(FI_8) // (
+#define FI_RPRN S(FI_9) // )
+#define FI_EQL S(FI_0) // =
+#define FI_QUES S(FI_PLUS) // ?
+#define FI_GRV S(FI_ACUT) // ` (dead)
+// Row 2
+#define FI_CIRC S(FI_DIAE) // ^ (dead)
+// Row 3
+#define FI_ASTR S(FI_QUOT) // *
+// Row 4
+#define FI_RABK S(FI_LABK) // >
+#define FI_SCLN S(FI_COMM) // ;
+#define FI_COLN S(FI_DOT) // :
+#define FI_UNDS S(FI_MINS) // _
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ │ @ │ £ │ $ │ € │ │ { │ [ │ ] │ } │ \ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ ~ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ | │ │ │ │ │ │ │ µ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define FI_AT ALGR(FI_2) // @
+#define FI_PND ALGR(FI_3) // £
+#define FI_DLR ALGR(FI_4) // $
+#define FI_EURO ALGR(FI_5) // €
+#define FI_LCBR ALGR(FI_7) // {
+#define FI_LBRC ALGR(FI_8) // [
+#define FI_RBRC ALGR(FI_9) // ]
+#define FI_RCBR ALGR(FI_0) // }
+#define FI_BSLS ALGR(FI_PLUS) // (backslash)
+// Row 2
+#define FI_TILD ALGR(FI_DIAE) // ~ (dead)
+// Row 4
+#define FI_PIPE ALGR(FI_LABK) // |
+#define FI_MICR ALGR(FI_M) // µ
diff --git a/quantum/keymap_extras/keymap_fr_ch.h b/quantum/keymap_extras/keymap_fr_ch.h
index 8da5ae6aa50..02ee22a12e8 100644
--- a/quantum/keymap_extras/keymap_fr_ch.h
+++ b/quantum/keymap_extras/keymap_fr_ch.h
@@ -13,97 +13,226 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-#ifndef KEYMAP_FR_CH
-#define KEYMAP_FR_CH
+
+#pragma once
#include "keymap.h"
-// normal characters
-#define FR_CH_Z KC_Y
-#define FR_CH_Y KC_Z
+// clang-format off
-#define FR_CH_A KC_A
-#define FR_CH_B KC_B
-#define FR_CH_C KC_C
-#define FR_CH_D KC_D
-#define FR_CH_E KC_E
-#define FR_CH_F KC_F
-#define FR_CH_G KC_G
-#define FR_CH_H KC_H
-#define FR_CH_I KC_I
-#define FR_CH_J KC_J
-#define FR_CH_K KC_K
-#define FR_CH_L KC_L
-#define FR_CH_M KC_M
-#define FR_CH_N KC_N
-#define FR_CH_O KC_O
-#define FR_CH_P KC_P
-#define FR_CH_Q KC_Q
-#define FR_CH_R KC_R
-#define FR_CH_S KC_S
-#define FR_CH_T KC_T
-#define FR_CH_U KC_U
-#define FR_CH_V KC_V
-#define FR_CH_W KC_W
-#define FR_CH_X KC_X
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ § │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ' │ ^ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Z │ U │ I │ O │ P │ è │ ¨ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ é │ à │ $ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ < │ Y │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define CH_SECT KC_GRV // §
+#define CH_1 KC_1 // 1
+#define CH_2 KC_2 // 2
+#define CH_3 KC_3 // 3
+#define CH_4 KC_4 // 4
+#define CH_5 KC_5 // 5
+#define CH_6 KC_6 // 6
+#define CH_7 KC_7 // 7
+#define CH_8 KC_8 // 8
+#define CH_9 KC_9 // 9
+#define CH_0 KC_0 // 0
+#define CH_QUOT KC_MINS // '
+#define CH_CIRC KC_EQL // ^ (dead)
+// Row 2
+#define CH_Q KC_Q // Q
+#define CH_W KC_W // W
+#define CH_E KC_E // E
+#define CH_R KC_R // R
+#define CH_T KC_T // T
+#define CH_Z KC_Y // Z
+#define CH_U KC_U // U
+#define CH_I KC_I // I
+#define CH_O KC_O // O
+#define CH_P KC_P // P
+#define CH_EGRV KC_LBRC // è
+#define CH_DIAE KC_RBRC // ¨ (dead)
+// Row 3
+#define CH_A KC_A // A
+#define CH_S KC_S // S
+#define CH_D KC_D // D
+#define CH_F KC_F // F
+#define CH_G KC_G // G
+#define CH_H KC_H // H
+#define CH_J KC_J // J
+#define CH_K KC_K // K
+#define CH_L KC_L // L
+#define CH_EACU KC_SCLN // é
+#define CH_AGRV KC_QUOT // à
+#define CH_DLR KC_NUHS // $
+// Row 4
+#define CH_LABK KC_NUBS // <
+#define CH_Y KC_Z // Y
+#define CH_X KC_X // X
+#define CH_C KC_C // C
+#define CH_V KC_V // V
+#define CH_B KC_B // B
+#define CH_N KC_N // N
+#define CH_M KC_M // M
+#define CH_COMM KC_COMM // ,
+#define CH_DOT KC_DOT // .
+#define CH_MINS KC_SLSH // -
-#define FR_CH_0 KC_0
-#define FR_CH_1 KC_1
-#define FR_CH_2 KC_2
-#define FR_CH_3 KC_3
-#define FR_CH_4 KC_4
-#define FR_CH_5 KC_5
-#define FR_CH_6 KC_6
-#define FR_CH_7 KC_7
-#define FR_CH_8 KC_8
-#define FR_CH_9 KC_9
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ° │ + │ " │ * │ ç │ % │ & │ / │ ( │ ) │ = │ ? │ ` │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ ü │ ! │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ ö │ ä │ £ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define CH_DEG S(CH_SECT) // °
+#define CH_PLUS S(CH_1) // +
+#define CH_DQUO S(CH_2) // "
+#define CH_ASTR S(CH_3) // *
+#define CH_CCED S(CH_4) // ç
+#define CH_PERC S(CH_5) // %
+#define CH_AMPR S(CH_6) // &
+#define CH_SLSH S(CH_7) // /
+#define CH_LPRN S(CH_8) // (
+#define CH_RPRN S(CH_9) // )
+#define CH_EQL S(CH_0) // =
+#define CH_QUES S(CH_QUOT) // ?
+#define CH_GRV S(CH_CIRC) // ` (dead)
+// Row 2
+#define CH_UDIA S(CH_EGRV) // ü
+#define CH_EXLM S(CH_DIAE) // !
+// Row 3
+#define CH_ODIA S(CH_EACU) // ö
+#define CH_ADIA S(CH_AGRV) // ä
+#define CH_PND S(CH_DLR) // £
+// Row 4
+#define CH_RABK S(CH_LABK) // >
+#define CH_SCLN S(CH_COMM) // ;
+#define CH_COLN S(CH_DOT) // :
+#define CH_UNDS S(CH_MINS) // _
-#define FR_CH_DOT KC_DOT
-#define FR_CH_COMM KC_COMM
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ ¦ │ @ │ # │ │ │ ¬ │ | │ ¢ │ │ │ ´ │ ~ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ € │ │ │ │ │ │ │ │ [ │ ] │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ \ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define CH_BRKP ALGR(CH_1) // ¦
+#define CH_AT ALGR(CH_2) // @
+#define CH_HASH ALGR(CH_3) // #
+#define CH_NOT ALGR(CH_6) // ¬
+#define CH_PIPE ALGR(CH_7) // |
+#define CH_CENT ALGR(CH_8) // ¢
+#define CH_ACUT ALGR(CH_QUOT) // ´ (dead)
+#define CH_TILD ALGR(CH_CIRC) // ~ (dead)
+// Row 2
+#define CH_EURO ALGR(CH_E) // €
+#define CH_LBRC ALGR(CH_EGRV) // [
+#define CH_RBRC ALGR(CH_DIAE) // ]
+// Row 3
+#define CH_LCBR ALGR(CH_AGRV) // {
+#define CH_RCBR ALGR(CH_DLR) // }
+// Row 4
+#define CH_BSLS ALGR(CH_LABK) // (backslash)
-#define FR_CH_QUOT KC_MINS
-#define FR_CH_AE KC_QUOT
-#define FR_CH_UE KC_LBRC
-#define FR_CH_OE KC_SCLN
-
-#define FR_CH_CIRC KC_EQL // accent circumflex ^ and grave ` and ~
-#define FR_CH_LESS KC_NUBS // < and > and backslash
-#define FR_CH_MINS KC_SLSH // - and _
-#define FR_CH_DLR KC_BSLS // $, £ and }
-#define FR_CH_PARA KC_GRV // § and ring °
-#define FR_CH_DIAE KC_RBRC // accent ¨
-
-// shifted characters
-#define FR_CH_RING LSFT(KC_GRV) // °
-#define FR_CH_EXLM LSFT(KC_RBRC) // !
-#define FR_CH_PLUS LSFT(KC_1) // +
-#define FR_CH_DQOT LSFT(KC_2) // "
-#define FR_CH_ASTR LSFT(KC_3) // *
-#define FR_CH_PERC LSFT(KC_5) // %
-#define FR_CH_AMPR LSFT(KC_6) // &
-#define FR_CH_SLSH LSFT(KC_7) // /
-#define FR_CH_LPRN LSFT(KC_8) // (
-#define FR_CH_RPRN LSFT(KC_9) // )
-#define FR_CH_EQL LSFT(KC_0) // =
-#define FR_CH_QST LSFT(FR_CH_QUOT) // ?
-#define FR_CH_MORE LSFT(FR_CH_LESS) // >
-#define FR_CH_COLN LSFT(KC_DOT) // :
-#define FR_CH_SCLN LSFT(KC_COMM) // ;
-#define FR_CH_UNDS LSFT(FR_CH_MINS) // _
-#define FR_CH_CCED LSFT(KC_4) // ç
-#define FR_CH_GRV LSFT(FR_CH_CIRC) // accent grave `
-
-// Alt Gr-ed characters
-#define FR_CH_LCBR ALGR(KC_QUOT) // {
-#define FR_CH_LBRC ALGR(KC_LBRC) // [
-#define FR_CH_RBRC ALGR(KC_9) // ]
-#define FR_CH_RCBR ALGR(KC_0) // }
-#define FR_CH_BSLS ALGR(FR_CH_LESS) // backslash
-#define FR_CH_AT ALGR(KC_2) // @
-#define FR_CH_EURO ALGR(KC_E) // €
-#define FR_CH_TILD ALGR(FR_CH_CIRC) // ~
-#define FR_CH_PIPE ALGR(KC_1) // |
-#define FR_CH_HASH ALGR(KC_3) // #
-#define FR_CH_ACUT ALGR(FR_CH_QUOT) // accent acute ´
-
-#endif
+// DEPRECATED
+#define FR_CH_Z CH_Z
+#define FR_CH_Y CH_Y
+#define FR_CH_A CH_A
+#define FR_CH_B CH_B
+#define FR_CH_C CH_C
+#define FR_CH_D CH_D
+#define FR_CH_E CH_E
+#define FR_CH_F CH_F
+#define FR_CH_G CH_G
+#define FR_CH_H CH_H
+#define FR_CH_I CH_I
+#define FR_CH_J CH_J
+#define FR_CH_K CH_K
+#define FR_CH_L CH_L
+#define FR_CH_M CH_M
+#define FR_CH_N CH_N
+#define FR_CH_O CH_O
+#define FR_CH_P CH_P
+#define FR_CH_Q CH_Q
+#define FR_CH_R CH_R
+#define FR_CH_S CH_S
+#define FR_CH_T CH_T
+#define FR_CH_U CH_U
+#define FR_CH_V CH_V
+#define FR_CH_W CH_W
+#define FR_CH_X CH_X
+#define FR_CH_0 CH_0
+#define FR_CH_1 CH_1
+#define FR_CH_2 CH_2
+#define FR_CH_3 CH_3
+#define FR_CH_4 CH_4
+#define FR_CH_5 CH_5
+#define FR_CH_6 CH_6
+#define FR_CH_7 CH_7
+#define FR_CH_8 CH_8
+#define FR_CH_9 CH_9
+#define FR_CH_DOT CH_DOT
+#define FR_CH_COMM CH_COMM
+#define FR_CH_QUOT CH_QUOT
+#define FR_CH_AE CH_AGRV
+#define FR_CH_UE CH_EGRV
+#define FR_CH_OE CH_EACU
+#define FR_CH_CIRC CH_CIRC
+#define FR_CH_LESS CH_LABK
+#define FR_CH_MINS CH_MINS
+#define FR_CH_DLR CH_DLR
+#define FR_CH_PARA CH_SECT
+#define FR_CH_DIAE CH_DIAE
+#define FR_CH_RING CH_DEG
+#define FR_CH_EXLM CH_EXLM
+#define FR_CH_PLUS CH_PLUS
+#define FR_CH_DQOT CH_DQUO
+#define FR_CH_ASTR CH_ASTR
+#define FR_CH_PERC CH_PERC
+#define FR_CH_AMPR CH_AMPR
+#define FR_CH_SLSH CH_SLSH
+#define FR_CH_LPRN CH_LPRN
+#define FR_CH_RPRN CH_RPRN
+#define FR_CH_EQL CH_EQL
+#define FR_CH_QST CH_QUES
+#define FR_CH_MORE CH_RABK
+#define FR_CH_COLN CH_COLN
+#define FR_CH_SCLN CH_SCLN
+#define FR_CH_UNDS CH_UNDS
+#define FR_CH_CCED CH_CCED
+#define FR_CH_GRV CH_GRV
+#define FR_CH_LCBR CH_LCBR
+#define FR_CH_LBRC CH_LBRC
+#define FR_CH_RBRC CH_RBRC
+#define FR_CH_RCBR CH_RCBR
+#define FR_CH_BSLS CH_BSLS
+#define FR_CH_AT CH_AT
+#define FR_CH_EURO CH_EURO
+#define FR_CH_TILD CH_TILD
+#define FR_CH_PIPE CH_PIPE
+#define FR_CH_HASH CH_HASH
+#define FR_CH_ACUT CH_ACUT
diff --git a/quantum/keymap_extras/keymap_french_osx.h b/quantum/keymap_extras/keymap_french_osx.h
index 3a231874a42..d0132a2d855 100644
--- a/quantum/keymap_extras/keymap_french_osx.h
+++ b/quantum/keymap_extras/keymap_french_osx.h
@@ -13,80 +13,248 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-#ifndef KEYMAP_FRENCH_OSX_H
-#define KEYMAP_FRENCH_OSX_H
+
+#pragma once
#include "keymap.h"
-// Normal characters
-#define FR_AT KC_GRV
-#define FR_AMP KC_1
-#define FR_EACU KC_2
-#define FR_QUOT KC_3
-#define FR_APOS KC_4
-#define FR_LPRN KC_5
-#define FR_SECT KC_6
-#define FR_EGRV KC_7
-#define FR_EXLM KC_8
-#define FR_CCED KC_9
-#define FR_AGRV KC_0
-#define FR_RPRN KC_MINS
-#define FR_MINS KC_EQL
+// clang-format off
-#define FR_A KC_Q
-#define FR_Z KC_W
-#define FR_CIRC KC_LBRC
-#define FR_DLR KC_RBRC
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ @ │ & │ é │ " │ ' │ ( │ § │ è │ ! │ ç │ à │ ) │ - │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ A │ Z │ E │ R │ T │ Y │ U │ I │ O │ P │ ^ │ $ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ Q │ S │ D │ F │ G │ H │ J │ K │ L │ M │ ù │ ` │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │ │ < │ W │ X │ C │ V │ B │ N │ , │ ; │ : │ = │ │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define FR_AT KC_GRV // @
+#define FR_AMPR KC_1 // &
+#define FR_LEAC KC_2 // é
+#define FR_DQUO KC_3 // "
+#define FR_QUOT KC_4 // '
+#define FR_LPRN KC_5 // (
+#define FR_SECT KC_6 // §
+#define FR_LEGR KC_7 // è
+#define FR_EXLM KC_8 // !
+#define FR_LCCE KC_9 // ç
+#define FR_LAGR KC_0 // à
+#define FR_RPRN KC_MINS // )
+#define FR_MINS KC_EQL // -
+// Row 2
+#define FR_A KC_Q // A
+#define FR_Z KC_W // Z
+#define FR_E KC_E // E
+#define FR_R KC_R // R
+#define FR_T KC_T // T
+#define FR_Y KC_Y // Y
+#define FR_U KC_U // U
+#define FR_I KC_I // I
+#define FR_O KC_O // O
+#define FR_P KC_P // P
+#define FR_CIRC KC_LBRC // ^
+#define FR_DLR KC_RBRC // $
+// Row 3
+#define FR_Q KC_A // Q
+#define FR_S KC_S // S
+#define FR_D KC_D // D
+#define FR_F KC_F // F
+#define FR_G KC_G // G
+#define FR_H KC_H // H
+#define FR_J KC_J // J
+#define FR_K KC_K // K
+#define FR_L KC_L // L
+#define FR_M KC_SCLN // M
+#define FR_LUGR KC_QUOT // ù
+#define FR_GRV KC_NUHS // `
+// Row 4
+#define FR_LABK KC_NUBS // <
+#define FR_W KC_Z // W
+#define FR_X KC_X // X
+#define FR_C KC_C // C
+#define FR_V KC_V // V
+#define FR_B KC_B // B
+#define FR_N KC_N // N
+#define FR_COMM KC_M // ,
+#define FR_SCLN KC_COMM // ;
+#define FR_COLN KC_DOT // :
+#define FR_EQL KC_SLSH // =
-#define FR_Q KC_A
-#define FR_M KC_SCLN
-#define FR_UGRV KC_QUOT
-#define FR_GRV KC_NUHS
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ # │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ° │ _ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ ¨ │ * │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ % │ £ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │ │ > │ │ │ │ │ │ │ ? │ . │ / │ + │ │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define FR_HASH S(FR_AT) // #
+#define FR_1 S(FR_AMPR) // 1
+#define FR_2 S(FR_LEAC) // 2
+#define FR_3 S(FR_DQUO) // 3
+#define FR_4 S(FR_QUOT) // 4
+#define FR_5 S(FR_LPRN) // 5
+#define FR_6 S(FR_SECT) // 6
+#define FR_7 S(FR_LEGR) // 7
+#define FR_8 S(FR_EXLM) // 8
+#define FR_9 S(FR_LCCE) // 9
+#define FR_0 S(FR_LAGR) // 0
+#define FR_DEG S(FR_RPRN) // °
+#define FR_UNDS S(FR_MINS) // _
+// Row 2
+#define FR_DIAE S(FR_CIRC) // ¨ (dead)
+#define FR_ASTR S(FR_DLR) // *
+// Row 3
+#define FR_PERC S(FR_LUGR) // %
+#define FR_PND S(FR_GRV) // £
+// Row 4
+#define FR_RABK S(FR_LABK) // >
+#define FR_QUES S(FR_COMM) // ?
+#define FR_DOT S(FR_SCLN) // .
+#define FR_SLSH S(FR_COLN) // /
+#define FR_PLUS S(FR_EQL) // +
-#define FR_LESS KC_NUBS
-#define FR_W KC_Z
-#define FR_COMM KC_M
-#define FR_SCLN KC_COMM
-#define FR_COLN KC_DOT
-#define FR_EQL KC_SLSH
+/* Alted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ • │ │ ë │ “ │ ‘ │ { │ ¶ │ « │ ¡ │ Ç │ Ø │ } │ — │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ Æ │  │ Ê │ ® │ † │ Ú │ º │ î │ Œ │ π │ Ô │ € │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ ‡ │ Ò │ ∂ │ ƒ │ fi │ Ì │ Ï │ È │ ¬ │ µ │ Ù │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │ │ ≤ │ ‹ │ ≈ │ © │ ◊ │ ß │ ~ │ ∞ │ … │ ÷ │ ≠ │ │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define FR_BULT A(FR_AT) // •
+#define FR_APPL A(FR_AMPR) // (Apple logo)
+#define FR_LEDI A(FR_LEAC) // ë
+#define FR_LDQU A(FR_DQUO) // “
+#define FR_LSQU A(FR_QUOT) // ‘
+#define FR_LCBR A(FR_LPRN) // {
+#define FR_PILC A(FR_SECT) // ¶
+#define FR_LDAQ A(FR_LEGR) // «
+#define FR_IEXL A(FR_EXLM) // ¡
+#define FR_CCCE A(FR_LCCE) // Ç
+#define FR_OSTR A(FR_LAGR) // Ø
+#define FR_RCBR A(FR_RPRN) // }
+#define FR_MDSH A(FR_MINS) // —
+// Row 2
+#define FR_AE A(FR_A) // Æ
+#define FR_CACI A(FR_Z) // Â
+#define FR_ECIR A(FR_E) // Ê
+#define FR_REGD A(FR_R) // ®
+#define FR_DAGG A(FR_T) // †
+#define FR_CUAC A(FR_Y) // Ú
+#define FR_MORD A(FR_U) // º
+#define FR_LICI A(FR_I) // î
+#define FR_OE A(FR_O) // Œ
+#define FR_PI A(FR_P) // π
+#define FR_OCIR A(FR_CIRC) // Ô
+#define FR_EURO A(FR_DLR) // €
+// Row 3
+#define FR_DDAG A(FR_Q) // ‡
+#define FR_COGR A(FR_S) // Ò
+#define FR_PDIF A(FR_D) // ∂
+#define FR_FHK A(FR_F) // ƒ
+#define FR_FI A(FR_G) // fi
+#define FR_CIGR A(FR_H) // Ì
+#define FR_CIDI A(FR_J) // Ï
+#define FR_CEGR A(FR_K) // È
+#define FR_NOT A(FR_L) // ¬
+#define FR_MICR A(FR_M) // µ
+#define FR_CUGR A(FR_LUGR) // Ù
+// Row 4
+#define FR_LTEQ A(FR_LABK) // ≤
+#define FR_LSAQ A(FR_W) // ‹
+#define FR_AEQL A(FR_X) // ≈
+#define FR_COPY A(FR_C) // ©
+#define FR_LOZN A(FR_V) // ◊
+#define FR_SS A(FR_B) // ß
+#define FR_TILD A(FR_N) // ~ (dead)
+#define FR_INFN A(FR_COMM) // ∞
+#define FR_ELLP A(FR_SCLN) // …
+#define FR_DIV A(FR_COLN) // ÷
+#define FR_NEQL A(FR_EQL) // ≠
-// Shifted characters
-#define FR_HASH LSFT(KC_GRV)
-#define FR_1 LSFT(KC_1)
-#define FR_2 LSFT(KC_2)
-#define FR_3 LSFT(KC_3)
-#define FR_4 LSFT(KC_4)
-#define FR_5 LSFT(KC_5)
-#define FR_6 LSFT(KC_6)
-#define FR_7 LSFT(KC_7)
-#define FR_8 LSFT(KC_8)
-#define FR_9 LSFT(KC_9)
-#define FR_0 LSFT(KC_0)
-#define FR_UNDS LSFT(FR_MINS)
+/* Shift+Alted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ Ÿ │ ´ │ „ │ │ │ [ │ å │ » │ Û │ Á │ │ ] │ – │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ │ Å │ │ ‚ │ ™ │ │ ª │ ï │ │ ∏ │ │ ¥ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ Ω │ ∑ │ ∆ │ · │ fl │ Î │ Í │ Ë │ | │ Ó │ ‰ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │ │ ≥ │ › │ ⁄ │ ¢ │ √ │ ∫ │ ı │ ¿ │ │ \ │ ± │ │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define FR_CYDI S(A(FR_AT)) // Ÿ
+#define FR_ACUT S(A(FR_AMPR)) // ´ (dead)
+#define FR_DLQU S(A(FR_LEAC)) // „
+#define FR_LBRC S(A(FR_LPRN)) // [
+#define FR_LARI S(A(FR_SECT)) // å
+#define FR_RDAQ S(A(FR_LEGR)) // »
+#define FR_CUCI S(A(FR_EXLM)) // Û
+#define FR_CAAC S(A(FR_LCCE)) // Á
+#define FR_RBRC S(A(FR_RPRN)) // ]
+#define FR_NDSH S(A(FR_MINS)) // –
+// Row 2
+#define FR_CARI S(A(FR_Z)) // Å
+#define FR_SLQU S(A(FR_R)) // ‚
+#define FR_TM S(A(FR_T)) // ™
+#define FR_FORD S(A(FR_U)) // ª
+#define FR_LIDI S(A(FR_I)) // ï
+#define FR_NARP S(A(FR_P)) // ∏
+#define FR_YEN S(A(FR_DLR)) // ¥
+// Row 3
+#define FR_OMEG S(A(FR_Q)) // Ω
+#define FR_NARS S(A(FR_S)) // ∑
+#define FR_INCR S(A(FR_D)) // ∆
+#define FR_MDDT S(A(FR_F)) // ·
+#define FR_FL S(A(FR_G)) // fl
+#define FR_CICI S(A(FR_H)) // Î
+#define FR_CIAC S(A(FR_J)) // Í
+#define FR_CEDI S(A(FR_K)) // Ë
+#define FR_PIPE S(A(FR_L)) // |
+#define FR_COAC S(A(FR_M)) // Ó
+#define FR_PERM S(A(FR_LUGR)) // ‰
+// Row 4
+#define FR_GTEQ S(A(FR_LABK)) // ≥
+#define FR_LSAQ S(A(FR_W)) // ›
+#define FR_FRSL S(A(FR_X)) // ⁄
+#define FR_CENT S(A(FR_C)) // ¢
+#define FR_SQRT S(A(FR_V)) // √
+#define FR_INTG S(A(FR_B)) // ∫
+#define FR_DLSI S(A(FR_N)) // ı
+#define FR_IQUE S(A(FR_COMM)) // ¿
+#define FR_BSLS S(A(FR_COLN)) // (backslash)
+#define FR_PLMN S(A(FR_EQL)) // ±
-#define FR_UMLT LSFT(FR_CIRC)
-#define FR_ASTR LSFT(FR_DLR)
-
-#define FR_PERC LSFT(FR_UGRV)
-#define FR_PND LSFT(FR_GRV)
-
-#define FR_GRTR LSFT(FR_LESS)
-#define FR_QUES LSFT(FR_COMM)
-#define FR_DOT LSFT(FR_SCLN)
-#define FR_SLSH LSFT(FR_COLN)
-#define FR_PLUS LSFT(FR_EQL)
-
-// Alted characters
-#define FR_LCBR LALT(KC_5)
-#define FR_RCBR LALT(FR_RPRN)
-#define FR_EURO LALT(KC_E)
-#define FR_BULT LALT(FR_DLR)
-#define FR_TILD LALT(KC_N)
-
-// Shift+Alt-ed characters
-#define FR_LBRC LSFT(LALT(KC_5))
-#define FR_RBRC LSFT(LALT(FR_RPRN))
-#define FR_PIPE LSFT(LALT(KC_L))
-#define FR_BSLS LSFT(LALT(FR_COLN))
-
-#endif
+// DEPRECATED
+#define FR_AMP FR_AMPR
+#define FR_EACU FR_LEAC
+#define FR_APOS FR_QUOT
+#define FR_EGRV FR_LEGR
+#define FR_CCED FR_LCCE
+#define FR_AGRV FR_LAGR
+#define FR_UGRV FR_LUGR
+#define FR_LESS FR_LABK
+#define FR_UMLT FR_DIAE
+#define FR_GRTR FR_RABK
diff --git a/quantum/keymap_extras/keymap_german_ch.h b/quantum/keymap_extras/keymap_german_ch.h
index 19b3627587d..07f4503a14b 100644
--- a/quantum/keymap_extras/keymap_german_ch.h
+++ b/quantum/keymap_extras/keymap_german_ch.h
@@ -13,105 +13,170 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-#ifndef KEYMAP_SWISS_GERMAN
-#define KEYMAP_SWISS_GERMAN
+
+#pragma once
#include "keymap.h"
-// normal characters
-#define CH_Z KC_Y
-#define CH_Y KC_Z
+// clang-format off
-#define CH_A KC_A
-#define CH_B KC_B
-#define CH_C KC_C
-#define CH_D KC_D
-#define CH_E KC_E
-#define CH_F KC_F
-#define CH_G KC_G
#ifdef CH_H
// The ChibiOS ch.h file defines this...
# undef CH_H
#endif
-#define CH_H KC_H
-#define CH_I KC_I
-#define CH_J KC_J
-#define CH_K KC_K
-#define CH_L KC_L
-#define CH_M KC_M
-#define CH_N KC_N
-#define CH_O KC_O
-#define CH_P KC_P
-#define CH_Q KC_Q
-#define CH_R KC_R
-#define CH_S KC_S
-#define CH_T KC_T
-#define CH_U KC_U
-#define CH_V KC_V
-#define CH_W KC_W
-#define CH_X KC_X
-#define CH_0 KC_0
-#define CH_1 KC_1
-#define CH_2 KC_2
-#define CH_3 KC_3
-#define CH_4 KC_4
-#define CH_5 KC_5
-#define CH_6 KC_6
-#define CH_7 KC_7
-#define CH_8 KC_8
-#define CH_9 KC_9
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ § │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ' │ ^ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Z │ U │ I │ O │ P │ ü │ ¨ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ö │ ä │ $ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ < │ Y │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define CH_SECT KC_GRV // §
+#define CH_1 KC_1 // 1
+#define CH_2 KC_2 // 2
+#define CH_3 KC_3 // 3
+#define CH_4 KC_4 // 4
+#define CH_5 KC_5 // 5
+#define CH_6 KC_6 // 6
+#define CH_7 KC_7 // 7
+#define CH_8 KC_8 // 8
+#define CH_9 KC_9 // 9
+#define CH_0 KC_0 // 0
+#define CH_QUOT KC_MINS // '
+#define CH_CIRC KC_EQL // ^ (dead)
+// Row 2
+#define CH_Q KC_Q // Q
+#define CH_W KC_W // W
+#define CH_E KC_E // E
+#define CH_R KC_R // R
+#define CH_T KC_T // T
+#define CH_Z KC_Y // Z
+#define CH_U KC_U // U
+#define CH_I KC_I // I
+#define CH_O KC_O // O
+#define CH_P KC_P // P
+#define CH_UDIA KC_LBRC // ü
+#define CH_DIAE KC_RBRC // ¨ (dead)
+// Row 3
+#define CH_A KC_A // A
+#define CH_S KC_S // S
+#define CH_D KC_D // D
+#define CH_F KC_F // F
+#define CH_G KC_G // G
+#define CH_H KC_H // H
+#define CH_J KC_J // J
+#define CH_K KC_K // K
+#define CH_L KC_L // L
+#define CH_ODIA KC_SCLN // ö
+#define CH_ADIA KC_QUOT // ä
+#define CH_DLR KC_NUHS // $
+// Row 4
+#define CH_LABK KC_NUBS // <
+#define CH_Y KC_Z // Y
+#define CH_X KC_X // X
+#define CH_C KC_C // C
+#define CH_V KC_V // V
+#define CH_B KC_B // B
+#define CH_N KC_N // N
+#define CH_M KC_M // M
+#define CH_COMM KC_COMM // ,
+#define CH_DOT KC_DOT // .
+#define CH_MINS KC_SLSH // -
-#define CH_DOT KC_DOT
-#define CH_COMM KC_COMM
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ° │ + │ " │ * │ ç │ % │ & │ / │ ( │ ) │ = │ ? │ ` │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ è │ ! │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ é │ à │ £ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define CH_DEG S(CH_SECT) // °
+#define CH_PLUS S(CH_1) // +
+#define CH_DQUO S(CH_2) // "
+#define CH_ASTR S(CH_3) // *
+#define CH_CCED S(CH_4) // ç
+#define CH_PERC S(CH_5) // %
+#define CH_AMPR S(CH_6) // &
+#define CH_SLSH S(CH_7) // /
+#define CH_LPRN S(CH_8) // (
+#define CH_RPRN S(CH_9) // )
+#define CH_EQL S(CH_0) // =
+#define CH_QUES S(CH_QUOT) // ?
+#define CH_GRV S(CH_CIRC) // ` (dead)
+// Row 2
+#define CH_EGRV S(CH_UDIA) // è
+#define CH_EXLM S(CH_DIAE) // !
+// Row 3
+#define CH_EACU S(CH_ODIA) // é
+#define CH_AGRV S(CH_ADIA) // à
+#define CH_PND S(CH_DLR) // £
+// Row 4
+#define CH_RABK S(CH_LABK) // >
+#define CH_SCLN S(CH_COMM) // ;
+#define CH_COLN S(CH_DOT) // :
+#define CH_UNDS S(CH_MINS) // _
-#define CH_QUOT KC_MINS // ' ? ´
-#define CH_AE KC_QUOT
-#define CH_UE KC_LBRC
-#define CH_OE KC_SCLN
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ ¦ │ @ │ # │ │ │ ¬ │ | │ ¢ │ │ │ ´ │ ~ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ € │ │ │ │ │ │ │ │ [ │ ] │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ \ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define CH_BRKP ALGR(CH_1) // ¦
+#define CH_AT ALGR(CH_2) // @
+#define CH_HASH ALGR(CH_3) // #
+#define CH_NOT ALGR(CH_6) // ¬
+#define CH_PIPE ALGR(CH_7) // |
+#define CH_CENT ALGR(CH_8) // ¢
+#define CH_ACUT ALGR(CH_QUOT) // ´ (dead)
+#define CH_TILD ALGR(CH_CIRC) // ~ (dead)
+// Row 2
+#define CH_EURO ALGR(CH_E) // €
+#define CH_LBRC ALGR(CH_UDIA) // [
+#define CH_RBRC ALGR(CH_DIAE) // ]
+// Row 3
+#define CH_LCBR ALGR(CH_ADIA) // {
+#define CH_RCBR ALGR(CH_DLR) // }
+// Row 4
+#define CH_BSLS ALGR(CH_LABK) // (backslash)
-#define CH_PARA KC_GRAVE // secction sign § and °
-#define CH_CARR KC_EQL // carret ^ ` ~
-#define CH_DIER KC_RBRC // dieresis ¨ ! ]
-#define CH_DLR KC_BSLS // $ £ }
-#define CH_LESS KC_NUBS // < and > and backslash
-#define CH_MINS KC_SLSH // - and _
-
-// shifted characters
-#define CH_RING LSFT(CH_PARA) // °
-#define CH_PLUS LSFT(KC_1) // +
-#define CH_DQOT LSFT(KC_2) // "
-#define CH_PAST LSFT(KC_3) // *
-#define CH_CELA LSFT(KC_4) // ç
-#define CH_PERC LSFT(KC_5) // %
-#define CH_AMPR LSFT(KC_6) // &
-#define CH_SLSH LSFT(KC_7) // /
-#define CH_LPRN LSFT(KC_8) // (
-#define CH_RPRN LSFT(KC_9) // )
-#define CH_EQL LSFT(KC_0) // =
-#define CH_QST LSFT(CH_QUOT) // ?
-#define CH_GRV LSFT(CH_CARR) // `
-#define CH_EXLM LSFT(CH_DIER) // !
-#define CH_POND LSFT(CH_DLR) // £
-#define CH_MORE LSFT(CH_LESS) // >
-#define CH_COLN LSFT(KC_DOT) // :
-#define CH_SCLN LSFT(KC_COMM) // ;
-#define CH_UNDS LSFT(CH_MINS) // _
-
-// Alt Gr-ed characters
-#define CH_BRBR ALGR(KC_1) // ¦ brocken bar
-#define CH_AT ALGR(KC_2) // @
-#define CH_HASH ALGR(KC_3) // #
-#define CH_NOTL ALGR(KC_6) // ¬ negative logic
-#define CH_PIPE ALGR(KC_7) // |
-#define CH_CENT ALGR(KC_8) // ¢ cent
-#define CH_ACUT ALGR(CH_QUOT) // ´
-#define CH_TILD ALGR(CH_CARR) // ~
-#define CH_EURO ALGR(KC_E) // €
-#define CH_LBRC ALGR(CH_UE) // [
-#define CH_RBRC ALGR(CH_DIER) // ]
-#define CH_LCBR ALGR(CH_AE) // {
-#define CH_RCBR ALGR(CH_DLR) // }
-#define CH_BSLS ALGR(CH_LESS) // backslash
-
-#endif
+// DEPRECATED
+#define CH_AE CH_ADIA
+#define CH_UE CH_UDIA
+#define CH_OE CH_ODIA
+#define CH_PARA CH_SECT
+#define CH_CARR CH_CIRC
+#define CH_DIER CH_DIAE
+#define CH_LESS CH_LABK
+#define CH_RING CH_DEG
+#define CH_DQOT CH_DQUO
+#define CH_PAST CH_ASTR
+#define CH_CELA CH_CCED
+#define CH_QST CH_QUES
+#define CH_POND CH_PND
+#define CH_MORE CH_RABK
+#define CH_BRBR CH_BRKP
+#define CH_NOTL CH_NOT
diff --git a/quantum/keymap_extras/keymap_german_osx.h b/quantum/keymap_extras/keymap_german_osx.h
index 29dee07ee03..0d15532e40e 100644
--- a/quantum/keymap_extras/keymap_german_osx.h
+++ b/quantum/keymap_extras/keymap_german_osx.h
@@ -13,100 +13,311 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-#ifndef KEYMAP_GERMAN_OSX
-#define KEYMAP_GERMAN_OSX
+
+#pragma once
#include "keymap.h"
-// Alt gr
+// clang-format off
-// normal characters
-#define DE_OSX_Z KC_Y
-#define DE_OSX_Y KC_Z
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ ^ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ß │ ´ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ Q │ W │ E │ R │ T │ Z │ U │ I │ O │ P │ Ü │ + │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ö │ Ä │ # │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │ │ < │ Y │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define DE_CIRC KC_GRV // ^ (dead)
+#define DE_1 KC_1 // 1
+#define DE_2 KC_2 // 2
+#define DE_3 KC_3 // 3
+#define DE_4 KC_4 // 4
+#define DE_5 KC_5 // 5
+#define DE_6 KC_6 // 6
+#define DE_7 KC_7 // 7
+#define DE_8 KC_8 // 8
+#define DE_9 KC_9 // 9
+#define DE_0 KC_0 // 0
+#define DE_SS KC_MINS // ß
+#define DE_ACUT KC_EQL // ´ (dead)
+// Row 2
+#define DE_Q KC_Q // Q
+#define DE_W KC_W // W
+#define DE_E KC_E // E
+#define DE_R KC_R // R
+#define DE_T KC_T // T
+#define DE_Z KC_Y // Z
+#define DE_U KC_U // U
+#define DE_I KC_I // I
+#define DE_O KC_O // O
+#define DE_P KC_P // P
+#define DE_UDIA KC_LBRC // Ü
+#define DE_PLUS KC_RBRC // +
+// Row 3
+#define DE_A KC_A // A
+#define DE_S KC_S // S
+#define DE_D KC_D // D
+#define DE_F KC_F // F
+#define DE_G KC_G // G
+#define DE_H KC_H // H
+#define DE_J KC_J // J
+#define DE_K KC_K // K
+#define DE_L KC_L // L
+#define DE_ODIA KC_SCLN // Ö
+#define DE_ADIA KC_QUOT // Ä
+#define DE_HASH KC_NUHS // #
+// Row 4
+#define DE_LABK KC_NUBS // <
+#define DE_Y KC_Z // Y
+#define DE_X KC_X // X
+#define DE_C KC_C // C
+#define DE_V KC_V // V
+#define DE_B KC_B // B
+#define DE_N KC_N // N
+#define DE_M KC_M // M
+#define DE_COMM KC_COMM // ,
+#define DE_DOT KC_DOT // .
+#define DE_MINS KC_SLSH // -
-#define DE_OSX_A KC_A
-#define DE_OSX_B KC_B
-#define DE_OSX_C KC_C
-#define DE_OSX_D KC_D
-#define DE_OSX_E KC_E
-#define DE_OSX_F KC_F
-#define DE_OSX_G KC_G
-#define DE_OSX_H KC_H
-#define DE_OSX_I KC_I
-#define DE_OSX_J KC_J
-#define DE_OSX_K KC_K
-#define DE_OSX_L KC_L
-#define DE_OSX_M KC_M
-#define DE_OSX_N KC_N
-#define DE_OSX_O KC_O
-#define DE_OSX_P KC_P
-#define DE_OSX_Q KC_Q
-#define DE_OSX_R KC_R
-#define DE_OSX_S KC_S
-#define DE_OSX_T KC_T
-#define DE_OSX_U KC_U
-#define DE_OSX_V KC_V
-#define DE_OSX_W KC_W
-#define DE_OSX_X KC_X
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ ° │ ! │ " │ § │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ ` │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ * │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ ' │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define DE_DEG S(DE_CIRC) // °
+#define DE_EXLM S(DE_1) // !
+#define DE_DQUO S(DE_2) // "
+#define DE_SECT S(DE_3) // §
+#define DE_DLR S(DE_4) // $
+#define DE_PERC S(DE_5) // %
+#define DE_AMPR S(DE_6) // &
+#define DE_SLSH S(DE_7) // /
+#define DE_LPRN S(DE_8) // (
+#define DE_RPRN S(DE_9) // )
+#define DE_EQL S(DE_0) // =
+#define DE_QUES S(DE_SS) // ?
+#define DE_GRV S(DE_ACUT) // ` (dead)
+// Row 2
+#define DE_ASTR S(DE_PLUS) // *
+// Row 3
+#define DE_QUOT S(DE_HASH) // '
+// Row 4
+#define DE_RABK S(DE_LABK) // >
+#define DE_SCLN S(DE_COMM) // ;
+#define DE_COLN S(DE_DOT) // :
+#define DE_UNDS S(DE_MINS) // _
-#define DE_OSX_0 KC_0
-#define DE_OSX_1 KC_1
-#define DE_OSX_2 KC_2
-#define DE_OSX_3 KC_3
-#define DE_OSX_4 KC_4
-#define DE_OSX_5 KC_5
-#define DE_OSX_6 KC_6
-#define DE_OSX_7 KC_7
-#define DE_OSX_8 KC_8
-#define DE_OSX_9 KC_9
+/* Alted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ „ │ ¡ │ “ │ ¶ │ ¢ │ [ │ ] │ | │ { │ } │ ≠ │ ¿ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ « │ ∑ │ € │ ® │ † │ Ω │ ¨ │ ⁄ │ Ø │ π │ • │ ± │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ Å │ ‚ │ ∂ │ ƒ │ © │ ª │ º │ ∆ │ @ │ Œ │ Æ │ ‘ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │ │ ≤ │ ¥ │ ≈ │ Ç │ √ │ ∫ │ ~ │ µ │ ∞ │ … │ – │ │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define DE_DLQU A(DE_CIRC) // „
+#define DE_IEXL A(DE_1) // ¡
+#define DE_LDQU A(DE_2) // “
+#define DE_PILC A(DE_3) // ¶
+#define DE_CENT A(DE_4) // ¢
+#define DE_LBRC A(DE_5) // [
+#define DE_RBRC A(DE_6) // ]
+#define DE_PIPE A(DE_7) // |
+#define DE_LCBR A(DE_8) // {
+#define DE_RCBR A(DE_9) // }
+#define DE_NEQL A(DE_0) // ≠
+#define DE_IQUE A(DE_SS) // ¿
+// Row 2
+#define DE_LDAQ A(DE_Q) // «
+#define DE_NARS A(DE_W) // ∑
+#define DE_EURO A(DE_E) // €
+#define DE_REGD A(DE_R) // ®
+#define DE_DAGG A(DE_T) // †
+#define DE_OMEG A(DE_Z) // Ω
+#define DE_DIAE A(DE_U) // ¨ (dead)
+#define DE_FRSL A(DE_I) // ⁄
+#define DE_OSTR A(DE_O) // Ø
+#define DE_PI A(DE_P) // π
+#define DE_BULT A(DE_UDIA) // •
+#define DE_PLMN A(DE_PLUS) // ±
+// Row 3
+#define DE_ARNG A(DE_A) // Å
+#define DE_SLQU A(DE_S) // ‚
+#define DE_PDIF A(DE_D) // ∂
+#define DE_FHK A(DE_F) // ƒ
+#define DE_COPY A(DE_G) // ©
+#define DE_FORD A(DE_H) // ª
+#define DE_MORD A(DE_J) // º
+#define DE_INCR A(DE_K) // ∆
+#define DE_AT A(DE_L) // @
+#define DE_OE A(DE_ODIA) // Œ
+#define DE_AE A(DE_ADIA) // Æ
+#define DE_LSQU A(DE_HASH) // ‘
+// Row 4
+#define DE_LTEQ A(DE_LABK) // ≤
+#define DE_YEN A(DE_Y) // ¥
+#define DE_AEQL A(DE_X) // ≈
+#define DE_CCCE A(DE_C) // Ç
+#define DE_SQRT A(DE_V) // √
+#define DE_INTG A(DE_B) // ∫
+#define DE_TILD A(DE_N) // ~ (dead)
+#define DE_MICR A(DE_M) // µ
+#define DE_INFN A(DE_COMM) // ∞
+#define DE_ELLP A(DE_DOT) // …
+#define DE_NDSH A(DE_MINS) // –
-#define DE_OSX_DOT KC_DOT
-#define DE_OSX_COMM KC_COMM
+/* Shift+Alted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ │ ¬ │ ” │ │ £ │ fi │ │ \ │ ˜ │ · │ ¯ │ ˙ │ ˚ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ » │ │ ‰ │ ¸ │ ˝ │ ˇ │ Á │ Û │ │ ∏ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ Í │ ™ │ Ï │ Ì │ Ó │ ı │ │ fl │ │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │ │ ≥ │ ‡ │ Ù │ │ ◊ │ ‹ │ › │ ˘ │ ˛ │ ÷ │ — │ │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define DE_NOT S(A(DE_1)) // ¬
+#define DE_RDQU S(A(DE_2)) // ”
+#define DE_PND S(A(DE_4)) // £
+#define DE_FI S(A(DE_5)) // fi
+#define DE_BSLS S(A(DE_7)) // (backslash)
+#define DE_STIL S(A(DE_8)) // ˜
+#define DE_MDDT S(A(DE_9)) // ·
+#define DE_MACR S(A(DE_0)) // ¯
+#define DE_DOTA S(A(DE_SS)) // ˙
+#define DE_RNGA S(A(DE_ACUT)) // ˚
+// Row 2
+#define DE_RDAQ S(A(DE_Q)) // »
+#define DE_PERM S(A(DE_E)) // ‰
+#define DE_CEDL S(A(DE_R)) // ¸
+#define DE_DACU S(A(DE_T)) // ˝
+#define DE_CARN S(A(DE_Z)) // ˇ
+#define DE_AACU S(A(DE_U)) // Á
+#define DE_UCIR S(A(DE_I)) // Û
+#define DE_NARP S(A(DE_P)) // ∏
+#define DE_APPL S(A(DE_PLUS)) // (Apple logo)
+// Row 3
+#define DE_IACU S(A(DE_S)) // Í
+#define DE_TM S(A(DE_D)) // ™
+#define DE_IDIA S(A(DE_F)) // Ï
+#define DE_IGRV S(A(DE_G)) // Ì
+#define DE_OACU S(A(DE_H)) // Ó
+#define DE_DLSI S(A(DE_J)) // ı
+#define DE_FL S(A(DE_L)) // fl
+// Row 4
+#define DE_GTEQ S(A(DE_LABK)) // ≥
+#define DE_DDAG S(A(DE_Y)) // ‡
+#define DE_UGRV S(A(DE_X)) // Ù
+#define DE_LOZN S(A(DE_V)) // ◊
+#define DE_LSAQ S(A(DE_B)) // ‹
+#define DE_RSAQ S(A(DE_N)) // ›
+#define DE_BREV S(A(DE_M)) // ˘
+#define DE_OGON S(A(DE_COMM)) // ˛
+#define DE_DIV S(A(DE_DOT)) // ÷
+#define DE_MDSH S(A(DE_MINS)) // —
-#define DE_OSX_SS KC_MINS
-#define DE_OSX_AE KC_QUOT
-#define DE_OSX_UE KC_LBRC
-#define DE_OSX_OE KC_SCLN
+// DEPRECATED
+#define DE_OSX_CIRC DE_CIRC
+#define DE_OSX_1 DE_1
+#define DE_OSX_2 DE_2
+#define DE_OSX_3 DE_3
+#define DE_OSX_4 DE_4
+#define DE_OSX_5 DE_5
+#define DE_OSX_6 DE_6
+#define DE_OSX_7 DE_7
+#define DE_OSX_8 DE_8
+#define DE_OSX_9 DE_9
+#define DE_OSX_0 DE_0
+#define DE_OSX_SS DE_SS
+#define DE_OSX_ACUT DE_ACUT
+#define DE_OSX_Q DE_Q
+#define DE_OSX_W DE_W
+#define DE_OSX_E DE_E
+#define DE_OSX_R DE_R
+#define DE_OSX_T DE_T
+#define DE_OSX_Z DE_Z
+#define DE_OSX_U DE_U
+#define DE_OSX_I DE_I
+#define DE_OSX_O DE_O
+#define DE_OSX_P DE_P
+#define DE_OSX_UE DE_UDIA
+#define DE_OSX_PLUS DE_PLUS
+#define DE_OSX_A DE_A
+#define DE_OSX_S DE_S
+#define DE_OSX_D DE_D
+#define DE_OSX_F DE_F
+#define DE_OSX_G DE_G
+#define DE_OSX_H DE_H
+#define DE_OSX_J DE_J
+#define DE_OSX_K DE_K
+#define DE_OSX_L DE_L
+#define DE_OSX_OE DE_ODIA
+#define DE_OSX_AE DE_ADIA
+#define DE_OSX_HASH DE_HASH
+#define DE_OSX_LESS DE_LABK
+#define DE_OSX_Y DE_Y
+#define DE_OSX_X DE_X
+#define DE_OSX_C DE_C
+#define DE_OSX_V DE_V
+#define DE_OSX_B DE_B
+#define DE_OSX_N DE_N
+#define DE_OSX_M DE_M
+#define DE_OSX_COMM DE_COMM
+#define DE_OSX_DOT DE_DOT
+#define DE_OSX_MINS DE_MINS
-#define DE_OSX_CIRC KC_NUBS // accent circumflex ^ and ring °
-#define DE_OSX_ACUT KC_EQL // accent acute ´ and grave `
-#define DE_OSX_PLUS KC_RBRC // + and * and ~
-#define DE_OSX_HASH KC_BSLS // # and '
-#define DE_OSX_LESS KC_GRV // < and > and |
-#define DE_OSX_MINS KC_SLSH // - and _
+#define DE_OSX_RING DE_DEG
+#define DE_OSX_EXLM DE_EXLM
+#define DE_OSX_DQOT DE_DQUO
+#define DE_OSX_PARA DE_SECT
+#define DE_OSX_DLR DE_DLR
+#define DE_OSX_PERC DE_PERC
+#define DE_OSX_AMPR DE_AMPR
+#define DE_OSX_SLSH DE_SLSH
+#define DE_OSX_LPRN DE_LPRN
+#define DE_OSX_RPRN DE_RPRN
+#define DE_OSX_EQL DE_EQL
+#define DE_OSX_QST DE_QUES
+#define DE_OSX_GRV DE_GRV
+#define DE_OSX_ASTR DE_ASTR
+#define DE_OSX_QUOT DE_QUOT
+#define DE_OSX_MORE DE_RABK
+#define DE_OSX_COLN DE_COLN
+#define DE_OSX_SCLN DE_SCLN
+#define DE_OSX_UNDS DE_UNDS
-// shifted characters
-#define DE_OSX_RING LSFT(DE_OSX_CIRC) // °
-#define DE_OSX_EXLM LSFT(KC_1) // !
-#define DE_OSX_DQOT LSFT(KC_2) // "
-#define DE_OSX_PARA LSFT(KC_3) // §
-#define DE_OSX_DLR LSFT(KC_4) // $
-#define DE_OSX_PERC LSFT(KC_5) // %
-#define DE_OSX_AMPR LSFT(KC_6) // &
-#define DE_OSX_SLSH LSFT(KC_7) // /
-#define DE_OSX_LPRN LSFT(KC_8) // (
-#define DE_OSX_RPRN LSFT(KC_9) // )
-#define DE_OSX_EQL LSFT(KC_0) // =
-#define DE_OSX_QST LSFT(DE_OSX_SS) // ?
-#define DE_OSX_GRV LSFT(DE_OSX_ACUT) // `
-#define DE_OSX_ASTR LSFT(DE_OSX_PLUS) // *
-#define DE_OSX_QUOT LSFT(DE_OSX_HASH) // '
-#define DE_OSX_MORE LSFT(DE_OSX_LESS) // >
-#define DE_OSX_COLN LSFT(KC_DOT) // :
-#define DE_OSX_SCLN LSFT(KC_COMM) // ;
-#define DE_OSX_UNDS LSFT(DE_OSX_MINS) // _
-
-// Alt-ed characters
-//#define DE_OSX_SQ2 LALT(KC_2) // ²
-//#define DE_OSX_SQ3 LALT(KC_3) // ³
-#define DE_OSX_LCBR LALT(KC_8) // {
-#define DE_OSX_LBRC LALT(KC_5) // [
-#define DE_OSX_RBRC LALT(KC_6) // ]
-#define DE_OSX_RCBR LALT(KC_9) // }
-#define DE_OSX_BSLS LALT(LSFT(KC_7)) // backslash
-#define DE_OSX_AT LALT(DE_OSX_L) // @
-#define DE_OSX_EURO LALT(KC_E) // €
-#define DE_OSX_TILD LALT(DE_OSX_N) // ~
-#define DE_OSX_PIPE LALT(DE_OSX_7) // |
-
-#endif
+#define DE_OSX_LBRC DE_LBRC
+#define DE_OSX_RBRC DE_RBRC
+#define DE_OSX_PIPE DE_PIPE
+#define DE_OSX_LCBR DE_LCBR
+#define DE_OSX_RCBR DE_RCBR
+#define DE_OSX_AT DE_AT
+#define DE_OSX_EURO DE_EURO
+#define DE_OSX_TILD DE_TILD
+#define DE_OSX_BSLS DE_BSLS
diff --git a/quantum/keymap_extras/keymap_greek.h b/quantum/keymap_extras/keymap_greek.h
new file mode 100644
index 00000000000..a2525959bc9
--- /dev/null
+++ b/quantum/keymap_extras/keymap_greek.h
@@ -0,0 +1,162 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ ; │ ς │ Ε │ Ρ │ Τ │ Υ │ Θ │ Ι │ Ο │ Π │ [ │ ] │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ Α │ Σ │ Δ │ Φ │ Γ │ Η │ Ξ │ Κ │ Λ │ ΄ │ ' │ \ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ Ζ │ Χ │ Ψ │ Ω │ Β │ Ν │ Μ │ , │ . │ / │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define GR_GRV KC_GRV // `
+#define GR_1 KC_1 // 1
+#define GR_2 KC_2 // 2
+#define GR_3 KC_3 // 3
+#define GR_4 KC_4 // 4
+#define GR_5 KC_5 // 5
+#define GR_6 KC_6 // 6
+#define GR_7 KC_7 // 7
+#define GR_8 KC_8 // 8
+#define GR_9 KC_9 // 9
+#define GR_0 KC_0 // 0
+#define GR_MINS KC_MINS // -
+#define GR_EQL KC_EQL // =
+// Row 2
+#define GR_SCLN KC_Q // ;
+#define GR_FSIG KC_W // ς
+#define GR_EPSL KC_E // Ε
+#define GR_RHO KC_R // Ρ
+#define GR_TAU KC_T // Τ
+#define GR_UPSL KC_Y // Υ
+#define GR_THET KC_U // Θ
+#define GR_IOTA KC_I // Ι
+#define GR_OMCR KC_O // Ο
+#define GR_PI KC_P // Π
+#define GR_LBRC KC_LBRC // [
+#define GR_RBRC KC_RBRC // ]
+// Row 3
+#define GR_ALPH KC_A // Α
+#define GR_SIGM KC_S // Σ
+#define GR_DELT KC_D // Δ
+#define GR_PHI KC_F // Φ
+#define GR_GAMM KC_G // Γ
+#define GR_ETA KC_H // Η
+#define GR_XI KC_J // Ξ
+#define GR_KAPP KC_K // Κ
+#define GR_LAMB KC_L // Λ
+#define GR_TONS KC_SCLN // ΄ (dead)
+#define GR_QUOT KC_QUOT // '
+#define GR_BSLS KC_NUHS // (backslash)
+// Row 4
+#define GR_ZETA KC_Z // Ζ
+#define GR_CHI KC_X // Χ
+#define GR_PSI KC_C // Ψ
+#define GR_OMEG KC_V // Ω
+#define GR_BETA KC_B // Β
+#define GR_NU KC_N // Ν
+#define GR_MU KC_M // Μ
+#define GR_COMM KC_COMM // ,
+#define GR_DOT KC_DOT // .
+#define GR_SLSH KC_SLSH // /
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ : │ ΅ │ │ │ │ │ │ │ │ │ { │ } │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ ¨ │ " │ | │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ │ │ │ │ < │ > │ ? │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define GR_TILD S(GR_GRV) // ~
+#define GR_EXLM S(GR_1) // !
+#define GR_AT S(GR_2) // @
+#define GR_HASH S(GR_3) // #
+#define GR_DLR S(GR_4) // $
+#define GR_PERC S(GR_5) // %
+#define GR_CIRC S(GR_6) // ^
+#define GR_AMPR S(GR_7) // &
+#define GR_ASTR S(GR_8) // *
+#define GR_LPRN S(GR_9) // (
+#define GR_RPRN S(GR_0) // )
+#define GR_UNDS S(GR_MINS) // _
+#define GR_PLUS S(GR_EQL) // +
+// Row 2
+#define GR_COLN S(GR_SCLN) // :
+#define GR_DIAT S(GR_FSIG) // ΅ (dead)
+#define GR_LCBR S(GR_LBRC) // {
+#define GR_RCBR S(GR_RBRC) // }
+// Row 3
+#define GR_DIAE S(GR_TONS) // ¨ (dead)
+#define GR_DQUO S(GR_QUOT) // "
+#define GR_PIPE S(GR_BSLS) // |
+// Row 4
+#define GR_LABK S(GR_COMM) // <
+#define GR_RABK S(GR_DOT) // >
+#define GR_QUES S(GR_SLSH) // ?
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ │ ² │ ³ │ £ │ § │ ¶ │ │ ¤ │ ¦ │ ° │ ± │ ½ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ € │ ® │ │ ¥ │ │ │ │ │ « │ » │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ ¬ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ © │ │ │ │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define GR_SUP2 ALGR(GR_2) // ²
+#define GR_SUP3 ALGR(GR_3) // ³
+#define GR_PND ALGR(GR_4) // £
+#define GR_SECT ALGR(GR_5) // §
+#define GR_PILC ALGR(GR_6) // ¶
+#define GR_CURR ALGR(GR_8) // ¤
+#define GR_BRKP ALGR(GR_9) // ¦
+#define GR_DEG ALGR(GR_0) // °
+#define GR_PLMN ALGR(GR_MINS) // ±
+#define GR_HALF ALGR(GR_EQL) // ½
+// Row 2
+#define GR_EURO ALGR(GR_EPSL) // €
+#define GR_REGD ALGR(GR_RHO) // ®
+#define GR_YEN ALGR(GR_UPSL) // ¥
+#define GR_LDAQ ALGR(GR_LBRC) // «
+#define GR_RDAQ ALGR(GR_RBRC) // »
+// Row 3
+#define GR_NOT ALGR(GR_BSLS) // ¬
+// Row 4
+#define GR_COPY ALGR(GR_PSI) // ©
diff --git a/quantum/keymap_extras/keymap_icelandic.h b/quantum/keymap_extras/keymap_icelandic.h
new file mode 100644
index 00000000000..2ccb4b543ce
--- /dev/null
+++ b/quantum/keymap_extras/keymap_icelandic.h
@@ -0,0 +1,153 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ° │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ Ö │ - │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ Ð │ ' │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Æ │ ´ │ + │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ < │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ Þ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define IS_RNGA KC_GRV // ° (dead)
+#define IS_1 KC_1 // 1
+#define IS_2 KC_2 // 2
+#define IS_3 KC_3 // 3
+#define IS_4 KC_4 // 4
+#define IS_5 KC_5 // 5
+#define IS_6 KC_6 // 6
+#define IS_7 KC_7 // 7
+#define IS_8 KC_8 // 8
+#define IS_9 KC_9 // 9
+#define IS_0 KC_0 // 0
+#define IS_ODIA KC_MINS // Ö
+#define IS_MINS KC_EQL // -
+// Row 2
+#define IS_Q KC_Q // Q
+#define IS_W KC_W // W
+#define IS_E KC_E // E
+#define IS_R KC_R // R
+#define IS_T KC_T // T
+#define IS_Y KC_Y // Y
+#define IS_U KC_U // U
+#define IS_I KC_I // I
+#define IS_O KC_O // O
+#define IS_P KC_P // P
+#define IS_ETH KC_LBRC // Ð
+#define IS_QUOT KC_RBRC // '
+// Row 3
+#define IS_A KC_A // A
+#define IS_S KC_S // S
+#define IS_D KC_D // D
+#define IS_F KC_F // F
+#define IS_G KC_G // G
+#define IS_H KC_H // H
+#define IS_J KC_J // J
+#define IS_K KC_K // K
+#define IS_L KC_L // L
+#define IS_AE KC_SCLN // Æ
+#define IS_ACUT KC_QUOT // ´ (dead)
+#define IS_PLUS KC_NUHS // +
+// Row 4
+#define IS_LABK KC_NUBS // <
+#define IS_Z KC_Z // Z
+#define IS_X KC_X // X
+#define IS_C KC_C // C
+#define IS_V KC_V // V
+#define IS_B KC_B // B
+#define IS_N KC_N // N
+#define IS_M KC_M // M
+#define IS_COMM KC_COMM // ,
+#define IS_DOT KC_DOT // .
+#define IS_THRN KC_SLSH // Þ
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ¨ │ ! │ " │ # │ $ │ % │ & │ / │ ( │ ) │ = │ │ _ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ ? │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ * │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ > │ │ │ │ │ │ │ │ ; │ : │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define IS_DIAE S(IS_RNGA) // ¨ (dead)
+#define IS_EXLM S(IS_1) // !
+#define IS_DQUO S(IS_2) // "
+#define IS_HASH S(IS_3) // #
+#define IS_DLR S(IS_4) // $
+#define IS_PERC S(IS_5) // %
+#define IS_AMPR S(IS_6) // &
+#define IS_SLSH S(IS_7) // /
+#define IS_LPRN S(IS_8) // (
+#define IS_RPRN S(IS_9) // )
+#define IS_EQL S(IS_0) // =
+#define IS_UNDS S(IS_MINS) // _
+// Row 2
+#define IS_QUES S(IS_QUOT) // ?
+// Row 3
+#define IS_ASTR S(IS_PLUS) // *
+// Row 4
+#define IS_RABK S(IS_LABK) // >
+#define IS_SCLN S(IS_COMM) // ;
+#define IS_COLN S(IS_DOT) // :
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ° │ │ │ │ │ │ │ { │ [ │ ] │ } │ \ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ @ │ │ € │ │ │ │ │ │ │ │ │ ~ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ ^ │ ` │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ | │ │ │ │ │ │ │ µ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define IS_DEG ALGR(IS_RNGA) // °
+#define IS_LCBR ALGR(IS_7) // {
+#define IS_LBRC ALGR(IS_8) // [
+#define IS_RBRC ALGR(IS_9) // ]
+#define IS_RCBR ALGR(IS_0) // }
+#define IS_BSLS ALGR(IS_ODIA) // (backslash)
+// Row 2
+#define IS_AT ALGR(IS_Q) // @
+#define IS_EURO ALGR(IS_E) // €
+#define IS_TILD ALGR(IS_QUOT) // ~
+// Row 3
+#define IS_CIRC ALGR(IS_ACUT) // ^ (dead)
+#define IS_GRV ALGR(IS_PLUS) // ` (dead)
+// Row 4
+#define IS_PIPE ALGR(IS_LABK) // |
+#define IS_MICR ALGR(IS_M) // µ
diff --git a/quantum/keymap_extras/keymap_irish.h b/quantum/keymap_extras/keymap_irish.h
new file mode 100644
index 00000000000..6825d4311f1
--- /dev/null
+++ b/quantum/keymap_extras/keymap_irish.h
@@ -0,0 +1,152 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ # │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define IE_GRV KC_GRV // `
+#define IE_1 KC_1 // 1
+#define IE_2 KC_2 // 2
+#define IE_3 KC_3 // 3
+#define IE_4 KC_4 // 4
+#define IE_5 KC_5 // 5
+#define IE_6 KC_6 // 6
+#define IE_7 KC_7 // 7
+#define IE_8 KC_8 // 8
+#define IE_9 KC_9 // 9
+#define IE_0 KC_0 // 0
+#define IE_MINS KC_MINS // -
+#define IE_EQL KC_EQL // =
+// Row 2
+#define IE_Q KC_Q // Q
+#define IE_W KC_W // W
+#define IE_E KC_E // E
+#define IE_R KC_R // R
+#define IE_T KC_T // T
+#define IE_Y KC_Y // Y
+#define IE_U KC_U // U
+#define IE_I KC_I // I
+#define IE_O KC_O // O
+#define IE_P KC_P // P
+#define IE_LBRC KC_LBRC // [
+#define IE_RBRC KC_RBRC // ]
+// Row 3
+#define IE_A KC_A // A
+#define IE_S KC_S // S
+#define IE_D KC_D // D
+#define IE_F KC_F // F
+#define IE_G KC_G // G
+#define IE_H KC_H // H
+#define IE_J KC_J // J
+#define IE_K KC_K // K
+#define IE_L KC_L // L
+#define IE_SCLN KC_SCLN // ;
+#define IE_QUOT KC_QUOT // '
+#define IE_HASH KC_NUHS // #
+// Row 4
+#define IE_BSLS KC_NUBS // (backslash)
+#define IE_Z KC_Z // Z
+#define IE_X KC_X // X
+#define IE_C KC_C // C
+#define IE_V KC_V // V
+#define IE_B KC_B // B
+#define IE_N KC_N // N
+#define IE_M KC_M // M
+#define IE_COMM KC_COMM // ,
+#define IE_DOT KC_DOT // .
+#define IE_SLSH KC_SLSH // /
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ¬ │ ! │ " │ £ │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ : │ @ │ ~ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ | │ │ │ │ │ │ │ │ < │ > │ ? │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define IE_NOT S(IE_GRV) // ¬
+#define IE_EXLM S(IE_1) // !
+#define IE_DQUO S(IE_2) // "
+#define IE_PND S(IE_3) // £
+#define IE_DLR S(IE_4) // $
+#define IE_PERC S(IE_5) // %
+#define IE_CIRC S(IE_6) // ^
+#define IE_AMPR S(IE_7) // &
+#define IE_ASTR S(IE_8) // *
+#define IE_LPRN S(IE_9) // (
+#define IE_RPRN S(IE_0) // )
+#define IE_UNDS S(IE_MINS) // _
+#define IE_PLUS S(IE_EQL) // +
+// Row 2
+#define IE_LCBR S(IE_LBRC) // {
+#define IE_RCBR S(IE_RBRC) // }
+// Row 3
+#define IE_COLN S(IE_SCLN) // :
+#define IE_AT S(IE_QUOT) // @
+#define IE_TILD S(IE_HASH) // ~
+// Row 4
+#define IE_PIPE S(IE_BSLS) // |
+#define IE_LABK S(IE_COMM) // <
+#define IE_RABK S(IE_DOT) // >
+#define IE_QUES S(IE_SLSH) // ?
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ¦ │ │ │ │ € │ │ │ │ │ │ │ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ É │ │ │ │ Ú │ Í │ Ó │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ Á │ │ │ │ │ │ │ │ │ │ ´ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define IE_BRKP ALGR(IE_GRV) // ¦
+#define IE_EURO ALGR(IE_4) // €
+// Row 2
+#define IE_EACU ALGR(IE_E) // É
+#define IE_UACU ALGR(IE_U) // Ú
+#define IE_IACU ALGR(IE_I) // Í
+#define IE_OACU ALGR(IE_O) // Ó
+// Row 3
+#define IE_AACU ALGR(IE_A) // Á
+#define IE_ACUT ALGR(IE_QUOT) // ´ (dead)
diff --git a/quantum/keymap_extras/keymap_italian.h b/quantum/keymap_extras/keymap_italian.h
index 71c2b2e33ac..616b6dfce99 100644
--- a/quantum/keymap_extras/keymap_italian.h
+++ b/quantum/keymap_extras/keymap_italian.h
@@ -166,7 +166,7 @@
// DEPRECATED
#define IT_BKSL IT_BSLS
-#define IT_QUOT IT_APOS
+#define IT_APOS IT_QUOT
#define IT_IACC IT_IGRV
#define IT_EACC IT_EGRV
#define IT_OACC IT_OGRV
diff --git a/quantum/keymap_extras/keymap_italian_osx_ansi.h b/quantum/keymap_extras/keymap_italian_osx_ansi.h
index fa12d05dce6..1f7fe8afc96 100644
--- a/quantum/keymap_extras/keymap_italian_osx_ansi.h
+++ b/quantum/keymap_extras/keymap_italian_osx_ansi.h
@@ -14,100 +14,255 @@
* along with this program. If not, see .
*/
-// This is a clone of quantum/keymap_extra/keymap_italian.h intended to be used with Apple devices
-
-#ifndef KEYMAP_ITALIAN
-#define KEYMAP_ITALIAN
+#pragma once
#include "keymap.h"
-// normal characters
-#define IT_A KC_A
-#define IT_B KC_B
-#define IT_C KC_C
-#define IT_D KC_D
-#define IT_E KC_E
-#define IT_F KC_F
-#define IT_G KC_G
-#define IT_H KC_H
-#define IT_I KC_I
-#define IT_J KC_J
-#define IT_K KC_K
-#define IT_L KC_L
-#define IT_M KC_M
-#define IT_N KC_N
-#define IT_O KC_O
-#define IT_P KC_P
-#define IT_Q KC_Q
-#define IT_R KC_R
-#define IT_S KC_S
-#define IT_T KC_T
-#define IT_U KC_U
-#define IT_V KC_V
-#define IT_W KC_W
-#define IT_X KC_X
-#define IT_Y KC_Y
-#define IT_Z KC_Z
+// clang-format off
-#define IT_0 KC_0
-#define IT_1 KC_1
-#define IT_2 KC_2
-#define IT_3 KC_3
-#define IT_4 KC_4
-#define IT_5 KC_5
-#define IT_6 KC_6
-#define IT_7 KC_7
-#define IT_8 KC_8
-#define IT_9 KC_9
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ < │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ' │ ì │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ è │ + │ ù │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ò │ à │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──────┤
+ * │ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
+ * ├─────┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define IT_LABK KC_GRV // <
+#define IT_1 KC_1 // 1
+#define IT_2 KC_2 // 2
+#define IT_3 KC_3 // 3
+#define IT_4 KC_4 // 4
+#define IT_5 KC_5 // 5
+#define IT_6 KC_6 // 6
+#define IT_7 KC_7 // 7
+#define IT_8 KC_8 // 8
+#define IT_9 KC_9 // 9
+#define IT_0 KC_0 // 0
+#define IT_QUOT KC_MINS // '
+#define IT_IGRV KC_EQL // ì
+// Row 2
+#define IT_Q KC_Q // Q
+#define IT_W KC_W // W
+#define IT_E KC_E // E
+#define IT_R KC_R // R
+#define IT_T KC_T // T
+#define IT_Y KC_Y // Y
+#define IT_U KC_U // U
+#define IT_I KC_I // I
+#define IT_O KC_O // O
+#define IT_P KC_P // P
+#define IT_EGRV KC_LBRC // è
+#define IT_PLUS KC_RBRC // +
+#define IT_UGRV KC_BSLS // ù
+// Row 3
+#define IT_A KC_A // A
+#define IT_S KC_S // S
+#define IT_D KC_D // D
+#define IT_F KC_F // F
+#define IT_G KC_G // G
+#define IT_H KC_H // H
+#define IT_J KC_J // J
+#define IT_K KC_K // K
+#define IT_L KC_L // L
+#define IT_OGRV KC_SCLN // ò
+#define IT_AGRV KC_QUOT // à
+// Row 4
+#define IT_BSLS KC_NUBS // (backslash, not physically present)
+#define IT_Z KC_Z // Z
+#define IT_X KC_X // X
+#define IT_C KC_C // C
+#define IT_V KC_V // V
+#define IT_B KC_B // B
+#define IT_N KC_N // N
+#define IT_M KC_M // M
+#define IT_COMM KC_COMM // ,
+#define IT_DOT KC_DOT // .
+#define IT_MINS KC_SLSH // -
-// punctuation
-#define IT_DOT KC_DOT // . and :
-#define IT_COMM KC_COMM // , and ;
-#define IT_APOS KC_MINS // ' and ?
-#define IT_BSLS KC_NUBS // \ and |
-#define IT_LESS KC_GRV // < and >
-#define IT_MINS KC_SLSH // - and _
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ > │ ! │ " │ £ │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ ^ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ é │ * │ § │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
+ * │ │ │ │ │ │ │ │ │ │ │ ç │ ° │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──────┤
+ * │ │ │ │ │ │ │ │ │ ; │ : │ _ │ │
+ * ├─────┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define IT_RABK S(IT_LABK) // >
+#define IT_EXLM S(IT_1) // !
+#define IT_DQUO S(IT_2) // "
+#define IT_PND S(IT_3) // £
+#define IT_DLR S(IT_4) // $
+#define IT_PERC S(IT_5) // %
+#define IT_AMPR S(IT_6) // &
+#define IT_SLSH S(IT_7) // /
+#define IT_LPRN S(IT_8) // (
+#define IT_RPRN S(IT_9) // )
+#define IT_EQL S(IT_0) // =
+#define IT_QUES S(IT_QUOT) // ?
+#define IT_CIRC S(IT_IGRV) // ^
+// Row 2
+#define IT_EACU S(IT_EGRV) // é
+#define IT_ASTR S(IT_PLUS) // *
+#define IT_SECT S(IT_UGRV) // §
+// Row 3
+#define IT_LCCE S(IT_OGRV) // ç
+#define IT_DEG S(IT_AGRV) // °
+// Row 4
+#define IT_PIPE S(IT_BSLS) // | (not physically present)
+#define IT_SCLN S(IT_COMM) // ;
+#define IT_COLN S(IT_DOT) // :
+#define IT_UNDS S(IT_MINS) // _
-// accented vowels (regular, with shift, with option, with option and shift)
-#define IT_EACC KC_LBRC // è, é, [, {
-#define IT_PLUS KC_RBRC // +, *, ], }
-#define IT_OACC KC_SCLN // ò, ç, @, Ç
-#define IT_AACC KC_QUOT // à, °, #, ∞
-#define IT_UACC KC_BSLS // ù, §, ¶, ◊
-#define IT_IACC KC_EQL // ì, ^, ˆ, ±
+/* Alted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ ≤ │ « │ “ │ ‘ │ ¥ │ ~ │ ‹ │ ÷ │ ´ │ ` │ ≠ │ ¡ │ ˆ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ „ │ Ω │ € │ ® │ ™ │ Æ │ ¨ │ Œ │ Ø │ π │ [ │ ] │ ¶ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
+ * │ │ Å │ ß │ ∂ │ ƒ │ ∞ │ ∆ │ ª │ º │ ¬ │ @ │ # │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──────┤
+ * │ │ ∑ │ † │ © │ √ │ ∫ │ ˜ │ µ │ … │ • │ – │ │
+ * ├─────┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define IT_LTEQ A(IT_LABK) // ≤
+#define IT_LDAQ A(IT_1) // «
+#define IT_LDQU A(IT_2) // “
+#define IT_LSQU A(IT_3) // ‘
+#define IT_YEN A(IT_4) // ¥
+#define IT_TILD A(IT_5) // ~
+#define IT_LSAQ A(IT_6) // ‹
+#define IT_DIV A(IT_7) // ÷
+#define IT_ACUT A(IT_8) // ´ (dead)
+#define IT_DGRV A(IT_9) // ` (dead)
+#define IT_NEQL A(IT_0) // ≠
+#define IT_IEXL A(IT_QUOT) // ¡
+#define IT_DCIR A(IT_IGRV) // ˆ (dead)
+// Row 2
+#define IT_DLQU A(IT_Q) // „
+#define IT_OMEG A(IT_W) // Ω
+#define IT_EURO A(IT_E) // €
+#define IT_REGD A(IT_R) // ®
+#define IT_TM A(IT_T) // ™
+#define IT_AE A(IT_Y) // Æ
+#define IT_DIAE A(IT_U) // ¨ (dead)
+#define IT_OE A(IT_I) // Œ
+#define IT_OSTR A(IT_O) // Ø
+#define IT_PI A(IT_P) // π
+#define IT_LBRC A(IT_EGRV) // [
+#define IT_RBRC A(IT_PLUS) // ]
+// Row 3
+#define IT_ARNG A(IT_A) // Å
+#define IT_SS A(IT_S) // ß
+#define IT_PDIF A(IT_D) // ∂
+#define IT_FHK A(IT_F) // ƒ
+#define IT_INFN A(IT_G) // ∞
+#define IT_INCR A(IT_H) // ∆
+#define IT_FORD A(IT_J) // ª
+#define IT_MORD A(IT_K) // º
+#define IT_NOT A(IT_L) // ¬
+#define IT_AT A(IT_OGRV) // @
+#define IT_HASH A(IT_AGRV) // #
+#define IT_PILC A(IT_UGRV) // ¶
+// Row 4
+#define IT_GRV A(IT_BSLS) // ` (not physically present)
+#define IT_NARS A(IT_Z) // ∑
+#define IT_DAGG A(IT_X) // †
+#define IT_COPY A(IT_C) // ©
+#define IT_SQRT A(IT_V) // √
+#define IT_INTG A(IT_B) // ∫
+#define IT_STIL A(IT_N) // ˜ (dead)
+#define IT_MICR A(IT_M) // µ
+#define IT_ELLP A(IT_COMM) // …
+#define IT_BULT A(IT_DOT) // •
+#define IT_NDSH A(IT_MINS) // –
-// shifted characters
-#define IT_EXLM LSFT(KC_1) // !
-#define IT_DQOT LSFT(KC_2) // "
-#define IT_STRL LSFT(KC_3) // £
-#define IT_DLR LSFT(KC_4) // $
-#define IT_PERC LSFT(KC_5) // %
-#define IT_AMPR LSFT(KC_6) // &
-#define IT_SLSH LSFT(KC_7) // /
-#define IT_LPRN LSFT(KC_8) // (
-#define IT_RPRN LSFT(KC_9) // )
-#define IT_EQL LSFT(KC_0) // =
-#define IT_DEGR LSFT(IT_AACC) // °
-#define IT_QST LSFT(IT_APOS) // ?
-#define IT_CRC LSFT(IT_IACC) // ^
-#define IT_ASTR LSFT(IT_PLUS) // *
-#define IT_MORE LSFT(IT_LESS) // >
-#define IT_COLN LSFT(IT_DOT) // :
-#define IT_SCLN LSFT(IT_COMM) // ;
-#define IT_UNDS LSFT(IT_MINS) // _
-#define IT_LCBR LSFT(IT_LBRC) // {
-#define IT_RCBR LSFT(IT_RBRC) // }
-#define IT_PIPE LSFT(IT_BSLS) // |
+/* Shift+Alted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ ≥ │ » │ ” │ ’ │ ¢ │ ‰ │ › │ ⁄ │ │ │ ≈ │ ¿ │ ± │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ ‚ │ À │ È │ Ì │ Ò │ │ Ù │ │ │ ∏ │ { │ } │ ◊ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴───┤
+ * │ │ │ ¯ │ ˘ │ ˙ │ ˚ │ ¸ │ ˝ │ ˛ │ ˇ │ Ç │ ∞ │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴──────┤
+ * │ │ │ ‡ │ Á │ É │ Í │ Ó │ Ú │ │ · │ — │ │
+ * ├─────┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define IT_GTEQ S(A(IT_LABK)) // ≥
+#define IT_RDAQ S(A(IT_1)) // »
+#define IT_RDQU S(A(IT_2)) // ”
+#define IT_RSQU S(A(IT_3)) // ’
+#define IT_CENT S(A(IT_4)) // ¢
+#define IT_PERM S(A(IT_5)) // ‰
+#define IT_RSAQ S(A(IT_6)) // ›
+#define IT_FRSL S(A(IT_7)) // ⁄
+#define IT_APPL S(A(IT_8)) // (Apple logo)
+#define IT_AEQL S(A(IT_0)) // ≈
+#define IT_IQUE S(A(IT_QUOT)) // ¿
+#define IT_PLMN S(A(IT_IGRV)) // ±
+// Row 2
+#define IT_SLQU S(A(IT_Q)) // ‚
+#define IT_CAGR S(A(IT_W)) // À
+#define IT_CEGR S(A(IT_E)) // È
+#define IT_CIGR S(A(IT_R)) // Ì
+#define IT_COGR S(A(IT_T)) // Ò
+#define IT_CUGR S(A(IT_U)) // Ù
+#define IT_NARP S(A(IT_P)) // ∏
+#define IT_LCBR S(A(IT_EGRV)) // {
+#define IT_RCBR S(A(IT_PLUS)) // }
+#define IT_LOZN S(A(IT_UGRV)) // ◊
+// Row 3
+#define IT_MACR S(A(IT_S)) // ¯
+#define IT_BREV S(A(IT_D)) // ˘
+#define IT_DOTA S(A(IT_F)) // ˙
+#define IT_RGNA S(A(IT_G)) // ˚
+#define IT_CEDL S(A(IT_H)) // ¸
+#define IT_DACU S(A(IT_J)) // ˝
+#define IT_OGON S(A(IT_K)) // ˛
+#define IT_CARN S(A(IT_L)) // ˇ
+#define IT_CCCE S(A(IT_OGRV)) // Ç
+// Row 4
+#define IT_DDAG S(A(IT_X)) // ‡
+#define IT_CAAC S(A(IT_C)) // Á
+#define IT_CEAC S(A(IT_V)) // É
+#define IT_CIAC S(A(IT_B)) // Í
+#define IT_COAC S(A(IT_N)) // Ó
+#define IT_CUAC S(A(IT_M)) // Ú
+#define IT_MDDT S(A(IT_DOT)) // ·
+#define IT_MDSH S(A(IT_MINS)) // —
-// Alt -ed characters
-#define IT_LBRC LALT(IT_EACC) // [
-#define IT_RBRC LALT(IT_PLUS) // ]
-#define IT_AT LALT(IT_OACC) // @
-#define IT_EURO LALT(KC_E) // €
-#define IT_SHRP LALT(IT_AACC) // #
-#define IT_ACUT LALT(KC_8) // ´
-#define IT_GRAVE LALT(KC_9) // `
-#define IT_TILDE LALT(KC_5) // ~
-#define IT_PLMN LALT(LSFT(IT_IACC)) // ±
-
-#endif
+// DEPRECATED
+#define IT_LESS IT_LABK
+#define IT_APOS IT_QUOT
+#define IT_IACC IT_IGRV
+#define IT_EACC IT_EGRV
+#define IT_UACC IT_UGRV
+#define IT_OACC IT_OGRV
+#define IT_AACC IT_AGRV
+#define IT_MORE IT_RABK
+#define IT_DQOT IT_DQUO
+#define IT_STRL IT_PND
+#define IT_QST IT_QUES
+#define IT_CRC IT_CIRC
+#define IT_DEGR IT_DEG
+#define IT_TILDE IT_TILD
+#define IT_GRAVE IT_GRV
+#define IT_SHRP IT_HASH
diff --git a/quantum/keymap_extras/keymap_italian_osx_iso.h b/quantum/keymap_extras/keymap_italian_osx_iso.h
index a9b36f16e6e..5ed1e3abd48 100644
--- a/quantum/keymap_extras/keymap_italian_osx_iso.h
+++ b/quantum/keymap_extras/keymap_italian_osx_iso.h
@@ -14,100 +14,256 @@
* along with this program. If not, see .
*/
-// This is a clone of quantum/keymap_extra/keymap_italian.h intended to be used with Apple devices
-
-#ifndef KEYMAP_ITALIAN
-#define KEYMAP_ITALIAN
+#pragma once
#include "keymap.h"
-// normal characters
-#define IT_A KC_A
-#define IT_B KC_B
-#define IT_C KC_C
-#define IT_D KC_D
-#define IT_E KC_E
-#define IT_F KC_F
-#define IT_G KC_G
-#define IT_H KC_H
-#define IT_I KC_I
-#define IT_J KC_J
-#define IT_K KC_K
-#define IT_L KC_L
-#define IT_M KC_M
-#define IT_N KC_N
-#define IT_O KC_O
-#define IT_P KC_P
-#define IT_Q KC_Q
-#define IT_R KC_R
-#define IT_S KC_S
-#define IT_T KC_T
-#define IT_U KC_U
-#define IT_V KC_V
-#define IT_W KC_W
-#define IT_X KC_X
-#define IT_Y KC_Y
-#define IT_Z KC_Z
+// clang-format off
-#define IT_0 KC_0
-#define IT_1 KC_1
-#define IT_2 KC_2
-#define IT_3 KC_3
-#define IT_4 KC_4
-#define IT_5 KC_5
-#define IT_6 KC_6
-#define IT_7 KC_7
-#define IT_8 KC_8
-#define IT_9 KC_9
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ \ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ' │ ì │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ è │ + │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ò │ à │ ù │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │ │ < │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define IT_BSLS KC_GRV // (backslash)
+#define IT_1 KC_1 // 1
+#define IT_2 KC_2 // 2
+#define IT_3 KC_3 // 3
+#define IT_4 KC_4 // 4
+#define IT_5 KC_5 // 5
+#define IT_6 KC_6 // 6
+#define IT_7 KC_7 // 7
+#define IT_8 KC_8 // 8
+#define IT_9 KC_9 // 9
+#define IT_0 KC_0 // 0
+#define IT_QUOT KC_MINS // '
+#define IT_IGRV KC_EQL // ì
+// Row 2
+#define IT_Q KC_Q // Q
+#define IT_W KC_W // W
+#define IT_E KC_E // E
+#define IT_R KC_R // R
+#define IT_T KC_T // T
+#define IT_Y KC_Y // Y
+#define IT_U KC_U // U
+#define IT_I KC_I // I
+#define IT_O KC_O // O
+#define IT_P KC_P // P
+#define IT_EGRV KC_LBRC // è
+#define IT_PLUS KC_RBRC // +
+// Row 3
+#define IT_A KC_A // A
+#define IT_S KC_S // S
+#define IT_D KC_D // D
+#define IT_F KC_F // F
+#define IT_G KC_G // G
+#define IT_H KC_H // H
+#define IT_J KC_J // J
+#define IT_K KC_K // K
+#define IT_L KC_L // L
+#define IT_OGRV KC_SCLN // ò
+#define IT_AGRV KC_QUOT // à
+#define IT_UGRV KC_NUHS // ù
+// Row 4
+#define IT_LABK KC_NUBS // <
+#define IT_Z KC_Z // Z
+#define IT_X KC_X // X
+#define IT_C KC_C // C
+#define IT_V KC_V // V
+#define IT_B KC_B // B
+#define IT_N KC_N // N
+#define IT_M KC_M // M
+#define IT_COMM KC_COMM // ,
+#define IT_DOT KC_DOT // .
+#define IT_MINS KC_SLSH // -
-// punctuation
-#define IT_DOT KC_DOT // . and :
-#define IT_COMM KC_COMM // , and ;
-#define IT_APOS KC_MINS // ' and ?
-#define IT_BSLS KC_GRV // \ and |
-#define IT_LESS KC_NUBS // < and >
-#define IT_MINS KC_SLSH // - and _
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ | │ ! │ " │ £ │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ ^ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ é │ * │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ ç │ ° │ § │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define IT_PIPE S(IT_BSLS) // |
+#define IT_EXLM S(IT_1) // !
+#define IT_DQUO S(IT_2) // "
+#define IT_PND S(IT_3) // £
+#define IT_DLR S(IT_4) // $
+#define IT_PERC S(IT_5) // %
+#define IT_AMPR S(IT_6) // &
+#define IT_SLSH S(IT_7) // /
+#define IT_LPRN S(IT_8) // (
+#define IT_RPRN S(IT_9) // )
+#define IT_EQL S(IT_0) // =
+#define IT_QUES S(IT_QUOT) // ?
+#define IT_CIRC S(IT_IGRV) // ^
+// Row 2
+#define IT_EACU S(IT_EGRV) // é
+#define IT_ASTR S(IT_PLUS) // *
+// Row 3
+#define IT_LCCE S(IT_OGRV) // ç
+#define IT_DEG S(IT_AGRV) // °
+#define IT_SECT S(IT_UGRV) // §
+// Row 4
+#define IT_RABK S(IT_LABK) // >
+#define IT_SCLN S(IT_COMM) // ;
+#define IT_COLN S(IT_DOT) // :
+#define IT_UNDS S(IT_MINS) // _
-// accented vowels (regular, with shift, with option, with option and shift)
-#define IT_EACC KC_LBRC // è, é, [, {
-#define IT_PLUS KC_RBRC // +, *, ], }
-#define IT_OACC KC_SCLN // ò, ç, @, Ç
-#define IT_AACC KC_QUOT // à, °, #, ∞
-#define IT_UACC KC_BSLS // ù, §, ¶, ◊
-#define IT_IACC KC_EQL // ì, ^, ˆ, ±
+/* Alted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ ` │ « │ “ │ ‘ │ ¥ │ ~ │ ‹ │ ÷ │ ´ │ ` │ ≠ │ ¡ │ ˆ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ „ │ Ω │ € │ ® │ ™ │ Æ │ ¨ │ Œ │ Ø │ π │ [ │ ] │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ Å │ ß │ ∂ │ ƒ │ ∞ │ ∆ │ ª │ º │ ¬ │ @ │ # │ ¶ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │ │ ≤ │ ∑ │ † │ © │ √ │ ∫ │ ˜ │ µ │ … │ • │ – │ │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define IT_GRV A(IT_BSLS) // `
+#define IT_LDAQ A(IT_1) // «
+#define IT_LDQU A(IT_2) // “
+#define IT_LSQU A(IT_3) // ‘
+#define IT_YEN A(IT_4) // ¥
+#define IT_TILD A(IT_5) // ~
+#define IT_LSAQ A(IT_6) // ‹
+#define IT_DIV A(IT_7) // ÷
+#define IT_ACUT A(IT_8) // ´ (dead)
+#define IT_DGRV A(IT_9) // ` (dead)
+#define IT_NEQL A(IT_0) // ≠
+#define IT_IEXL A(IT_QUOT) // ¡
+#define IT_DCIR A(IT_IGRV) // ˆ (dead)
+// Row 2
+#define IT_DLQU A(IT_Q) // „
+#define IT_OMEG A(IT_W) // Ω
+#define IT_EURO A(IT_E) // €
+#define IT_REGD A(IT_R) // ®
+#define IT_TM A(IT_T) // ™
+#define IT_AE A(IT_Y) // Æ
+#define IT_DIAE A(IT_U) // ¨ (dead)
+#define IT_OE A(IT_I) // Œ
+#define IT_OSTR A(IT_O) // Ø
+#define IT_PI A(IT_P) // π
+#define IT_LBRC A(IT_EGRV) // [
+#define IT_RBRC A(IT_PLUS) // ]
+// Row 3
+#define IT_ARNG A(IT_A) // Å
+#define IT_SS A(IT_S) // ß
+#define IT_PDIF A(IT_D) // ∂
+#define IT_FHK A(IT_F) // ƒ
+#define IT_INFN A(IT_G) // ∞
+#define IT_INCR A(IT_H) // ∆
+#define IT_FORD A(IT_J) // ª
+#define IT_MORD A(IT_K) // º
+#define IT_NOT A(IT_L) // ¬
+#define IT_AT A(IT_OGRV) // @
+#define IT_HASH A(IT_AGRV) // #
+#define IT_PILC A(IT_UGRV) // ¶
+// Row 4
+#define IT_LTEQ A(IT_LABK) // ≤
+#define IT_NARS A(IT_Z) // ∑
+#define IT_DAGG A(IT_X) // †
+#define IT_COPY A(IT_C) // ©
+#define IT_SQRT A(IT_V) // √
+#define IT_INTG A(IT_B) // ∫
+#define IT_STIL A(IT_N) // ˜ (dead)
+#define IT_MICR A(IT_M) // µ
+#define IT_ELLP A(IT_COMM) // …
+#define IT_BULT A(IT_DOT) // •
+#define IT_NDSH A(IT_MINS) // –
-// shifted characters
-#define IT_EXLM LSFT(KC_1) // !
-#define IT_DQOT LSFT(KC_2) // "
-#define IT_STRL LSFT(KC_3) // £
-#define IT_DLR LSFT(KC_4) // $
-#define IT_PERC LSFT(KC_5) // %
-#define IT_AMPR LSFT(KC_6) // &
-#define IT_SLSH LSFT(KC_7) // /
-#define IT_LPRN LSFT(KC_8) // (
-#define IT_RPRN LSFT(KC_9) // )
-#define IT_EQL LSFT(KC_0) // =
-#define IT_DEGR LSFT(IT_AACC) // °
-#define IT_QST LSFT(IT_APOS) // ?
-#define IT_CRC LSFT(IT_IACC) // ^
-#define IT_ASTR LSFT(IT_PLUS) // *
-#define IT_MORE LSFT(IT_LESS) // >
-#define IT_COLN LSFT(IT_DOT) // :
-#define IT_SCLN LSFT(IT_COMM) // ;
-#define IT_UNDS LSFT(IT_MINS) // _
-#define IT_LCBR LSFT(IT_LBRC) // {
-#define IT_RCBR LSFT(IT_RBRC) // }
-#define IT_PIPE LSFT(IT_BSLS) // |
+/* Shift+Alted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
+ * │ ı │ » │ ” │ ’ │ ¢ │ ‰ │ › │ ⁄ │ │ │ ≈ │ ¿ │ ± │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
+ * │ │ ‚ │ À │ È │ Ì │ Ò │ │ Ù │ │ │ ∏ │ { │ } │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ ¯ │ ˘ │ ˙ │ ˚ │ ¸ │ ˝ │ ˛ │ ˇ │ Ç │ │ ◊ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
+ * │ │ ≥ │ │ ‡ │ Á │ É │ Í │ Ó │ Ú │ │ · │ — │ │
+ * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
+ * │ │ │ │ │ │ │ │
+ * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
+ */
+// Row 1
+#define IT_DLSI S(A(IT_BSLS)) // ı
+#define IT_RDAQ S(A(IT_1)) // »
+#define IT_RDQU S(A(IT_2)) // ”
+#define IT_RSQU S(A(IT_3)) // ’
+#define IT_CENT S(A(IT_4)) // ¢
+#define IT_PERM S(A(IT_5)) // ‰
+#define IT_RSAQ S(A(IT_6)) // ›
+#define IT_FRSL S(A(IT_7)) // ⁄
+#define IT_APPL S(A(IT_8)) // (Apple logo)
+#define IT_AEQL S(A(IT_0)) // ≈
+#define IT_IQUE S(A(IT_QUOT)) // ¿
+#define IT_PLMN S(A(IT_IGRV)) // ±
+// Row 2
+#define IT_SLQU S(A(IT_Q)) // ‚
+#define IT_CAGR S(A(IT_W)) // À
+#define IT_CEGR S(A(IT_E)) // È
+#define IT_CIGR S(A(IT_R)) // Ì
+#define IT_COGR S(A(IT_T)) // Ò
+#define IT_CUGR S(A(IT_U)) // Ù
+#define IT_NARP S(A(IT_P)) // ∏
+#define IT_LCBR S(A(IT_EGRV)) // {
+#define IT_RCBR S(A(IT_PLUS)) // }
+// Row 3
+#define IT_MACR S(A(IT_S)) // ¯
+#define IT_BREV S(A(IT_D)) // ˘
+#define IT_DOTA S(A(IT_F)) // ˙
+#define IT_RNGA S(A(IT_G)) // ˚
+#define IT_CEDL S(A(IT_H)) // ¸
+#define IT_DACU S(A(IT_J)) // ˝
+#define IT_OGON S(A(IT_K)) // ˛
+#define IT_CARN S(A(IT_L)) // ˇ
+#define IT_CCCE S(A(IT_OGRV)) // Ç
+#define IT_LOZN S(A(IT_UGRV)) // ◊
+// Row 4
+#define IT_GTEQ S(A(IT_LABK)) // ≥
+#define IT_DDAG S(A(IT_X)) // ‡
+#define IT_CAAC S(A(IT_C)) // Á
+#define IT_CEAC S(A(IT_V)) // É
+#define IT_CIAC S(A(IT_B)) // Í
+#define IT_COAC S(A(IT_N)) // Ó
+#define IT_CUAC S(A(IT_M)) // Ú
+#define IT_MDDT S(A(IT_DOT)) // ·
+#define IT_MDSH S(A(IT_MINS)) // —
-// Alt -ed characters
-#define IT_LBRC LALT(IT_EACC) // [
-#define IT_RBRC LALT(IT_PLUS) // ]
-#define IT_AT LALT(IT_OACC) // @
-#define IT_EURO LALT(KC_E) // €
-#define IT_SHRP LALT(IT_AACC) // #
-#define IT_ACUT LALT(KC_8) // ´
-#define IT_GRAVE LALT(KC_9) // `
-#define IT_TILDE LALT(KC_5) // ~
-#define IT_PLMN LALT(LSFT(IT_IACC)) // ±
-
-#endif
+// DEPRECATED
+#define IT_APOS IT_QUOT
+#define IT_IACC IT_IGRV
+#define IT_EACC IT_EGRV
+#define IT_OACC IT_OGRV
+#define IT_AACC IT_AGRV
+#define IT_UACC IT_UGRV
+#define IT_LESS IT_LABK
+#define IT_DQOT IT_DQUO
+#define IT_STRL IT_PND
+#define IT_QST IT_QUES
+#define IT_CRC IT_CIRC
+#define IT_DEGR IT_DEG
+#define IT_MORE IT_RABK
+#define IT_TILDE IT_TILD
+#define IT_GRAVE IT_GRV
+#define IT_SHRP IT_HASH
diff --git a/quantum/keymap_extras/keymap_jp.h b/quantum/keymap_extras/keymap_jp.h
index 01586d5674f..e608481d873 100644
--- a/quantum/keymap_extras/keymap_jp.h
+++ b/quantum/keymap_extras/keymap_jp.h
@@ -20,55 +20,129 @@
* note: This website is written in Japanese.
*/
-#ifndef KEYMAP_JP_H
-#define KEYMAP_JP_H
+#pragma once
#include "keymap.h"
-#define JP_ZHTG KC_GRV // hankaku/zenkaku|kanzi
-#define JP_YEN KC_INT3 // yen, |
-#define JP_CIRC KC_EQL // ^, ~
-#define JP_AT KC_LBRC // @, `
-#define JP_LBRC KC_RBRC // [, {
-#define JP_COLN KC_QUOT // :, *
-#define JP_RBRC KC_NUHS // ], }
-#define JP_BSLS KC_INT1 // \, _
-#define JP_MHEN KC_INT5 // muhenkan
-#define JP_HENK KC_INT4 // henkan
-#define JP_KANA KC_INT2 // katakana/hiragana|ro-mazi
+// clang-format off
-#define JP_MKANA KC_LANG1 // kana on MacOSX
-#define JP_MEISU KC_LANG2 // eisu on MacOSX
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+ * │Z↔︎H│ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ ^ │ ¥ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ @ │ [ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ Eisū │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ : │ ] │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┤
+ * │ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ \ │ │
+ * ├─────┬──┴┬──┴──┬┴───┴┬──┴───┴──┬┴───┴┬──┴┬──┴┬──┴┬──┴┬─────┤
+ * │ │ │ │Muhen│ │ Hen │K↔H│ │ │ │ │
+ * └─────┴───┴─────┴─────┴─────────┴─────┴───┴───┴───┴───┴─────┘
+ */
+// Row 1
+#define JP_ZKHK KC_GRV // Zenkaku ↔︎ Hankaku ↔ Kanji (半角 ↔ 全角 ↔ 漢字)
+#define JP_1 KC_1 // 1
+#define JP_2 KC_2 // 2
+#define JP_3 KC_3 // 3
+#define JP_4 KC_4 // 4
+#define JP_5 KC_5 // 5
+#define JP_6 KC_6 // 6
+#define JP_7 KC_7 // 7
+#define JP_8 KC_8 // 8
+#define JP_9 KC_9 // 9
+#define JP_0 KC_0 // 0
+#define JP_MINS KC_MINS // -
+#define JP_CIRC KC_EQL // ^
+#define JP_YEN KC_INT3 // ¥
+// Row 2
+#define JP_Q KC_Q // Q
+#define JP_W KC_W // W
+#define JP_E KC_E // E
+#define JP_R KC_R // R
+#define JP_T KC_T // T
+#define JP_Y KC_Y // Y
+#define JP_U KC_U // U
+#define JP_I KC_I // I
+#define JP_O KC_O // O
+#define JP_P KC_P // P
+#define JP_AT KC_LBRC // @
+#define JP_LBRC KC_RBRC // [
+// Row 3
+#define JP_EISU KC_CAPS // Eisū (英数)
+#define JP_A KC_A // A
+#define JP_S KC_S // S
+#define JP_D KC_D // D
+#define JP_F KC_F // F
+#define JP_G KC_G // G
+#define JP_H KC_H // H
+#define JP_J KC_J // J
+#define JP_K KC_K // K
+#define JP_L KC_L // L
+#define JP_SCLN KC_SCLN // ;
+#define JP_COLN KC_QUOT // :
+#define JP_RBRC KC_NUHS // ]
+// Row 4
+#define JP_Z KC_Z // Z
+#define JP_X KC_X // X
+#define JP_C KC_C // C
+#define JP_V KC_V // V
+#define JP_B KC_B // B
+#define JP_N KC_N // N
+#define JP_M KC_M // M
+#define JP_COMM KC_COMM // ,
+#define JP_DOT KC_DOT // .
+#define JP_SLSH KC_SLSH // /
+#define JP_BSLS KC_INT1 // (backslash)
+// Row 5
+#define JP_MHEN KC_INT5 // Muhenkan (無変換)
+#define JP_HENK KC_INT4 // Henkan (変換)
+#define JP_KANA KC_INT2 // Katakana ↔ Hiragana ↔ Rōmaji (カタカナ ↔ ひらがな ↔ ローマ字)
-// Aliases for shifted symbols
-#define JP_DQT LSFT(KC_2) // "
-#define JP_AMPR LSFT(KC_6) // &
-#define JP_QUOT LSFT(KC_7) // '
-#define JP_LPRN LSFT(KC_8) // (
-#define JP_RPRN LSFT(KC_9) // )
-#define JP_EQL LSFT(KC_MINS) // =
-#define JP_TILD LSFT(JP_CIRC) // ~
-#define JP_PIPE LSFT(JP_YEN) // |
-#define JP_GRV LSFT(JP_AT) // `
-#define JP_LCBR LSFT(JP_LBRC) // {
-#define JP_PLUS LSFT(KC_SCLN) // +
-#define JP_ASTR LSFT(JP_COLN) // *
-#define JP_RCBR LSFT(JP_RBRC) // }
-#define JP_UNDS LSFT(JP_BSLS) // _
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+ * │ │ ! │ " │ # │ $ │ % │ & │ ' │ ( │ ) │ │ = │ ~ │ | │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ ` │ { │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ Caps │ │ │ │ │ │ │ │ │ │ + │ * │ } │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┤
+ * │ │ │ │ │ │ │ │ │ < │ > │ ? │ _ │ │
+ * ├─────┬──┴┬──┴──┬┴───┴┬──┴───┴──┬┴───┴┬──┴┬──┴┬──┴┬──┴┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │
+ * └─────┴───┴─────┴─────┴─────────┴─────┴───┴───┴───┴───┴─────┘
+ */
+// Row 1
+#define JP_EXLM S(JP_1) // !
+#define JP_DQUO S(JP_2) // "
+#define JP_HASH S(JP_3) // #
+#define JP_DLR S(JP_4) // $
+#define JP_PERC S(JP_5) // %
+#define JP_AMPR S(JP_6) // &
+#define JP_QUOT S(JP_7) // '
+#define JP_LPRN S(JP_8) // (
+#define JP_RPRN S(JP_9) // )
+#define JP_EQL S(JP_MINS) // =
+#define JP_TILD S(JP_CIRC) // ~
+#define JP_PIPE S(JP_YEN) // |
+// Row 2
+#define JP_GRV S(JP_AT) // `
+#define JP_LCBR S(JP_LBRC) // {
+// Row 3
+#define JP_CAPS S(JP_EISU) // Caps Lock
+#define JP_PLUS S(JP_SCLN) // +
+#define JP_ASTR S(JP_COLN) // *
+#define JP_RCBR S(JP_RBRC) // }
+// Row 4
+#define JP_LABK S(JP_COMM) // <
+#define JP_RABK S(JP_DOT) // >
+#define JP_QUES S(JP_SLSH) // ?
+#define JP_UNDS S(JP_BSLS) // _
-// These symbols are correspond to US101-layout.
-#define JP_MINS KC_MINS // -
-#define JP_SCLN KC_SCLN // ;
-#define JP_COMM KC_COMM // ,
-#define JP_DOT KC_DOT // .
-#define JP_SLSH KC_SLSH // /
-// shifted
-#define JP_EXLM KC_EXLM // !
-#define JP_HASH KC_HASH // #
-#define JP_DLR KC_DLR // $
-#define JP_PERC KC_PERC // %
-#define JP_LT KC_LT // <
-#define JP_GT KC_GT // >
-#define JP_QUES KC_QUES // ?
+// DEPRECATED
+#define JP_ZHTG JP_ZKHK
+#define JP_DQT JP_DQUO
+#define JP_LT JP_LABK
+#define JP_GT JP_RABK
-#endif
+#define JP_MEISU KC_LANG2 // Eisū (英数) on macOS
+#define JP_MKANA KC_LANG1 // Kana (かな) on macOS
diff --git a/quantum/keymap_extras/keymap_korean.h b/quantum/keymap_extras/keymap_korean.h
new file mode 100644
index 00000000000..da914767b8a
--- /dev/null
+++ b/quantum/keymap_extras/keymap_korean.h
@@ -0,0 +1,128 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ ₩ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ │
+ * ├─────┬──┴┬──┴──┬┴──┬┴───┴───┴───┴──┬┴──┬┴───┴┬──┴┬───┬─────┤
+ * │ │ │ │Hnj│ │H↔Y│ │ │ │ │
+ * └─────┴───┴─────┴───┴───────────────┴───┴─────┴───┴───┴─────┘
+ */
+// Row 1
+#define KR_GRV KC_GRV // `
+#define KR_1 KC_1 // 1
+#define KR_2 KC_2 // 2
+#define KR_3 KC_3 // 3
+#define KR_4 KC_4 // 4
+#define KR_5 KC_5 // 5
+#define KR_6 KC_6 // 6
+#define KR_7 KC_7 // 7
+#define KR_8 KC_8 // 8
+#define KR_9 KC_9 // 9
+#define KR_0 KC_0 // 0
+#define KR_MINS KC_MINS // -
+#define KR_EQL KC_EQL // =
+// Row 2
+#define KR_Q KC_Q // Q
+#define KR_W KC_W // W
+#define KR_E KC_E // E
+#define KR_R KC_R // R
+#define KR_T KC_T // T
+#define KR_Y KC_Y // Y
+#define KR_U KC_U // U
+#define KR_I KC_I // I
+#define KR_O KC_O // O
+#define KR_P KC_P // P
+#define KR_LBRC KC_LBRC // [
+#define KR_RBRC KC_RBRC // ]
+#define KR_WON KC_BSLS // ₩
+// Row 3
+#define KR_A KC_A // A
+#define KR_S KC_S // S
+#define KR_D KC_D // D
+#define KR_F KC_F // F
+#define KR_G KC_G // G
+#define KR_H KC_H // H
+#define KR_J KC_J // J
+#define KR_K KC_K // K
+#define KR_L KC_L // L
+#define KR_SCLN KC_SCLN // ;
+#define KR_QUOT KC_QUOT // '
+// Row 4
+#define KR_Z KC_Z // Z
+#define KR_X KC_X // X
+#define KR_C KC_C // C
+#define KR_V KC_V // V
+#define KR_B KC_B // B
+#define KR_N KC_N // N
+#define KR_M KC_M // M
+#define KR_COMM KC_COMM // ,
+#define KR_DOT KC_DOT // .
+#define KR_SLSH KC_SLSH // /
+// Row 5
+#define KR_HANJ KC_LANG2 // Hanja (한자)
+#define KR_HAEN KC_LANG1 // Han ↔ Yeong (한 ↔ 영)
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ | │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ : │ " │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ │ │ │ │ │ │ │ < │ > │ ? │ │
+ * ├─────┬──┴┬──┴──┬┴──┬┴───┴───┴───┴──┬┴──┬┴───┴┬──┴┬───┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │
+ * └─────┴───┴─────┴───┴───────────────┴───┴─────┴───┴───┴─────┘
+ */
+// Row 1
+#define KR_TILD S(KR_GRV) // ~
+#define KR_EXLM S(KR_1) // !
+#define KR_AT S(KR_2) // @
+#define KR_HASH S(KR_3) // #
+#define KR_DLR S(KR_4) // $
+#define KR_PERC S(KR_5) // %
+#define KR_CIRC S(KR_6) // ^
+#define KR_AMPR S(KR_7) // &
+#define KR_ASTR S(KR_8) // *
+#define KR_LPRN S(KR_9) // (
+#define KR_RPRN S(KR_0) // )
+#define KR_UNDS S(KR_MINS) // _
+#define KR_PLUS S(KR_EQL) // +
+// Row 2
+#define KR_LCBR S(KR_LBRC) // {
+#define KR_RCBR S(KR_RBRC) // }
+#define KR_PIPE S(KR_WON) // |
+// Row 3
+#define KR_COLN S(KR_SCLN) // :
+#define KR_DQUO S(KR_COLN) // "
+// Row 4
+#define KR_LABK S(KR_COMM) // <
+#define KR_RABK S(KR_DOT) // >
+#define KR_QUES S(KR_SLSH) // ?
diff --git a/quantum/keymap_extras/keymap_latvian.h b/quantum/keymap_extras/keymap_latvian.h
new file mode 100644
index 00000000000..452e9167bcc
--- /dev/null
+++ b/quantum/keymap_extras/keymap_latvian.h
@@ -0,0 +1,187 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ \ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define LV_GRV KC_GRV // `
+#define LV_1 KC_1 // 1
+#define LV_2 KC_2 // 2
+#define LV_3 KC_3 // 3
+#define LV_4 KC_4 // 4
+#define LV_5 KC_5 // 5
+#define LV_6 KC_6 // 6
+#define LV_7 KC_7 // 7
+#define LV_8 KC_8 // 8
+#define LV_9 KC_9 // 9
+#define LV_0 KC_0 // 0
+#define LV_MINS KC_MINS // -
+#define LV_EQL KC_EQL // =
+// Row 2
+#define LV_Q KC_Q // Q
+#define LV_W KC_W // W
+#define LV_E KC_E // E
+#define LV_R KC_R // R
+#define LV_T KC_T // T
+#define LV_Y KC_Y // Y
+#define LV_U KC_U // U
+#define LV_I KC_I // I
+#define LV_O KC_O // O
+#define LV_P KC_P // P
+#define LV_LBRC KC_LBRC // [
+#define LV_RBRC KC_RBRC // ]
+// Row 3
+#define LV_A KC_A // A
+#define LV_S KC_S // S
+#define LV_D KC_D // D
+#define LV_F KC_F // F
+#define LV_G KC_G // G
+#define LV_H KC_H // H
+#define LV_J KC_J // J
+#define LV_K KC_K // K
+#define LV_L KC_L // L
+#define LV_SCLN KC_SCLN // ;
+#define LV_QUOT KC_QUOT // ' (dead)
+#define LV_BSLS KC_NUHS // (backslash)
+// Row 4
+#define LV_NUBS KC_NUBS // (backslash)
+#define LV_Z KC_Z // Z
+#define LV_X KC_X // X
+#define LV_C KC_C // C
+#define LV_V KC_V // V
+#define LV_B KC_B // B
+#define LV_N KC_N // N
+#define LV_M KC_M // M
+#define LV_COMM KC_COMM // ,
+#define LV_DOT KC_DOT // .
+#define LV_SLSH KC_SLSH // /
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ : │ " │ | │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ │ │ │ │ < │ > │ ? │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define LV_TILD S(LV_GRV) // ~
+#define LV_EXLM S(LV_1) // !
+#define LV_AT S(LV_2) // @
+#define LV_HASH S(LV_3) // #
+#define LV_DLR S(LV_4) // $
+#define LV_PERC S(LV_5) // %
+#define LV_CIRC S(LV_6) // ^
+#define LV_AMPR S(LV_7) // &
+#define LV_ASTR S(LV_8) // *
+#define LV_LPRN S(LV_9) // (
+#define LV_RPRN S(LV_0) // )
+#define LV_UNDS S(LV_MINS) // _
+#define LV_PLUS S(LV_EQL) // +
+// Row 2
+#define LV_LCBR S(LV_LBRC) // {
+#define LV_RCBR S(LV_RBRC) // }
+// Row 3
+#define LV_COLN S(LV_SCLN) // :
+#define LV_DQUO S(LV_QUOT) // " (dead)
+#define LV_PIPE S(LV_BSLS) // |
+// Row 4
+#define LV_LABK S(LV_COMM) // <
+#define LV_RABK S(LV_DOT) // >
+#define LV_QUES S(LV_SLSH) // ?
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ - │ │ « │ » │ € │ │ ’ │ │ │ │ │ – │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ Ē │ Ŗ │ │ │ Ū │ Ī │ Ō │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ Ā │ Š │ │ │ Ģ │ │ │ Ķ │ Ļ │ │ ´ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ Ž │ │ Č │ │ │ Ņ │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define LV_SHYP ALGR(LV_GRV) // - (soft hyphen)
+#define LV_NBSP ALGR(LV_1) // (non-breaking space)
+#define LV_LDAQ ALGR(LV_2) // «
+#define LV_RDAQ ALGR(LV_3) // »
+#define LV_EURO ALGR(LV_4) // €
+#define LV_RSQU ALGR(LV_6) // ’
+#define LV_NDSH ALGR(LV_MINS) // –
+// Row 2
+#define LV_EMAC ALGR(LV_E) // Ē
+#define LV_RCED ALGR(LV_R) // Ŗ
+#define LV_UMAC ALGR(LV_U) // Ū
+#define LV_IMAC ALGR(LV_I) // Ī
+#define LV_OMAC ALGR(LV_O) // Ō
+// Row 3
+#define LV_AMAC ALGR(LV_A) // Ā
+#define LV_SCAR ALGR(LV_S) // Š
+#define LV_GCED ALGR(LV_G) // Ģ
+#define LV_KCED ALGR(LV_K) // Ķ
+#define LV_LCED ALGR(LV_L) // Ļ
+#define LV_ACUT ALGR(LV_QUOT) // ´ (dead)
+// Row 4
+#define LV_ZCAR ALGR(LV_Z) // Ž
+#define LV_CCAR ALGR(LV_Z) // Č
+#define LV_NCED ALGR(LV_Z) // Ņ
+
+/* Shift+AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ │ │ │ § │ ° │ │ ± │ × │ │ │ — │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ ¨ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define LV_SECT S(ALGR(LV_4)) // §
+#define LV_DEG S(ALGR(LV_5)) // °
+#define LV_PLMN S(ALGR(LV_7)) // ±
+#define LV_MUL S(ALGR(LV_8)) // ×
+#define LV_MDSH S(ALGR(LV_MINS)) // —
+// Row 3
+#define LV_DIAE S(ALGR(LV_QUOT)) // ¨ (dead)
diff --git a/quantum/keymap_extras/keymap_lithuanian_azerty.h b/quantum/keymap_extras/keymap_lithuanian_azerty.h
new file mode 100644
index 00000000000..68bcd6dc1ec
--- /dev/null
+++ b/quantum/keymap_extras/keymap_lithuanian_azerty.h
@@ -0,0 +1,156 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ` │ ! │ - │ / │ ; │ : │ , │ . │ = │ ( │ ) │ ? │ X │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Ą │ Ž │ E │ R │ T │ Y │ U │ I │ O │ P │ Į │ W │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ Š │ G │ H │ J │ K │ L │ Ų │ Ė │ Q │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ < │ Z │ Ū │ C │ V │ B │ N │ M │ Č │ F │ Ę │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define LT_GRV KC_GRV // `
+#define LT_EXLM KC_1 // !
+#define LT_MINS KC_2 // -
+#define LT_SLSH KC_3 // /
+#define LT_SCLN KC_4 // ;
+#define LT_COLN KC_5 // :
+#define LT_COMM KC_6 // ,
+#define LT_DOT KC_7 // .
+#define LT_EQL KC_8 // =
+#define LT_LPRN KC_9 // (
+#define LT_RPRN KC_0 // )
+#define LT_QUES KC_MINS // ?
+#define LT_X KC_EQL // X
+// Row 2
+#define LT_AOGO KC_Q // Ą
+#define LT_ZCAR KC_W // Ž
+#define LT_E KC_E // E
+#define LT_R KC_R // R
+#define LT_T KC_T // T
+#define LT_Y KC_Y // Y
+#define LT_U KC_U // U
+#define LT_I KC_I // I
+#define LT_O KC_O // O
+#define LT_P KC_P // P
+#define LT_IOGO KC_LBRC // Į
+#define LT_W KC_RBRC // W
+// Row 3
+#define LT_A KC_A // A
+#define LT_S KC_S // S
+#define LT_D KC_D // D
+#define LT_SCAR KC_F // Š
+#define LT_G KC_G // G
+#define LT_H KC_H // H
+#define LT_J KC_J // J
+#define LT_K KC_K // K
+#define LT_L KC_L // L
+#define LT_UOGO KC_SCLN // Ų
+#define LT_EDOT KC_QUOT // Ė
+#define LT_Q KC_NUHS // Q
+// Row 4
+#define LT_LABK KC_NUBS // <
+#define LT_Z KC_Z // Z
+#define LT_UMAC KC_X // Ū
+#define LT_C KC_C // C
+#define LT_V KC_V // V
+#define LT_B KC_B // B
+#define LT_N KC_N // N
+#define LT_M KC_M // M
+#define LT_CCAR KC_COMM // Č
+#define LT_F KC_DOT // F
+#define LT_EOGO KC_SLSH // Ę
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ + │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ > │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define LT_TILD S(LT_GRV) // ~
+#define LT_1 S(LT_EXLM) // 1
+#define LT_2 S(LT_MINS) // 2
+#define LT_3 S(LT_SLSH) // 3
+#define LT_4 S(LT_SCLN) // 4
+#define LT_5 S(LT_COLN) // 5
+#define LT_6 S(LT_COMM) // 6
+#define LT_7 S(LT_DOT) // 7
+#define LT_8 S(LT_EQL) // 8
+#define LT_9 S(LT_LPRN) // 9
+#define LT_0 S(LT_RPRN) // 0
+#define LT_PLUS S(LT_QUES) // +
+// Row 4
+#define LT_RABK S(LT_LABK) // >
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ´ │ @ │ _ │ # │ $ │ § │ ^ │ & │ * │ [ │ ] │ ' │ % │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ € │ │ │ │ │ │ │ │ { │ } │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ " │ | │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ – │ │ │ │ │ │ │ │ „ │ “ │ \ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define LT_ACUT ALGR(LT_GRV) // ´
+#define LT_AT ALGR(LT_EXLM) // @
+#define LT_UNDS ALGR(LT_MINS) // _
+#define LT_HASH ALGR(LT_SLSH) // #
+#define LT_DLR ALGR(LT_SCLN) // $
+#define LT_SECT ALGR(LT_COLN) // §
+#define LT_CIRC ALGR(LT_COMM) // ^
+#define LT_AMPR ALGR(LT_DOT) // &
+#define LT_ASTR ALGR(LT_EQL) // *
+#define LT_LBRC ALGR(LT_LRPN) // [
+#define LT_RBRC ALGR(LT_RPRN) // ]
+#define LT_QUOT ALGR(LT_QUES) // '
+#define LT_PERC ALGR(LT_X) // %
+// Row 2
+#define LT_EURO ALGR(LT_E) // €
+#define LT_LCBR ALGR(LT_IOGO) // {
+#define LT_RCBR ALGR(LT_W) // }
+// Row 3
+#define LT_DQUO ALGR(LT_EDOT) // "
+#define LT_PIPE ALGR(LT_Q) // |
+// Row 4
+#define LT_NDSH ALGR(LT_LABK) // –
+#define LT_DLQU ALGR(LT_CCAR) // „
+#define LT_LDQU ALGR(LT_F) // “
+#define LT_BSLS ALGR(LT_EOGO) // (backslash)
diff --git a/quantum/keymap_extras/keymap_lithuanian_qwerty.h b/quantum/keymap_extras/keymap_lithuanian_qwerty.h
new file mode 100644
index 00000000000..0f92562a130
--- /dev/null
+++ b/quantum/keymap_extras/keymap_lithuanian_qwerty.h
@@ -0,0 +1,166 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ` │ Ą │ Č │ Ę │ Ė │ Į │ Š │ Ų │ Ū │ 9 │ 0 │ - │ Ž │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ \ │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define LT_GRV KC_GRV // `
+#define LT_AOGO KC_1 // Ą
+#define LT_CCAR KC_2 // Č
+#define LT_EOGO KC_3 // Ę
+#define LT_EDOT KC_4 // Ė
+#define LT_IOGO KC_5 // Į
+#define LT_SCAR KC_6 // Š
+#define LT_UOGO KC_7 // Ų
+#define LT_UMAC KC_8 // Ū
+#define LT_9 KC_9 // 9
+#define LT_0 KC_0 // 0
+#define LT_MINS KC_MINS // -
+#define LT_ZCAR KC_EQL // Ž
+// Row 2
+#define LT_Q KC_Q // Q
+#define LT_W KC_W // W
+#define LT_E KC_E // E
+#define LT_R KC_R // R
+#define LT_T KC_T // T
+#define LT_Y KC_Y // Y
+#define LT_U KC_U // U
+#define LT_I KC_I // I
+#define LT_O KC_O // O
+#define LT_P KC_P // P
+#define LT_LBRC KC_LBRC // [
+#define LT_RBRC KC_RBRC // ]
+// Row 3
+#define LT_A KC_A // A
+#define LT_S KC_S // S
+#define LT_D KC_D // D
+#define LT_F KC_F // F
+#define LT_G KC_G // G
+#define LT_H KC_H // H
+#define LT_J KC_J // J
+#define LT_K KC_K // K
+#define LT_L KC_L // L
+#define LT_SCLN KC_SCLN // ;
+#define LT_QUOT KC_QUOT // '
+#define LT_BSLS KC_NUHS // (backslash)
+// Row 4
+#define LT_Z KC_Z // Z
+#define LT_X KC_X // X
+#define LT_C KC_C // C
+#define LT_V KC_V // V
+#define LT_B KC_B // B
+#define LT_N KC_N // N
+#define LT_M KC_M // M
+#define LT_COMM KC_COMM // ,
+#define LT_DOT KC_DOT // .
+#define LT_SLSH KC_SLSH // /
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ │ │ │ │ │ │ │ │ ( │ ) │ _ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ : │ " │ | │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ │ │ │ < │ > │ ? │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define LT_TILD S(LT_GRV) // ~
+#define LT_LPRN S(LT_9) // (
+#define LT_RPRN S(LT_0) // )
+#define LT_UNDS S(LT_MINS) // *
+// Row 2
+#define LT_LCBR S(LT_LBRC) // {
+#define LT_RCBR S(LT_RBRC) // }
+// Row 3
+#define LT_COLN S(LT_SCLN) // ;
+#define LT_DQUO S(LT_QUOT) // "
+#define LT_PIPE S(LT_BSLS) // |
+// Row 4
+#define LT_LABK S(LT_COMM) // <
+#define LT_RABK S(LT_DOT) // >
+#define LT_QUES S(LT_SLSH) // ?
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ │ │ │ = │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ € │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define LT_1 ALGR(LT_AOGO) // 1
+#define LT_2 ALGR(LT_CCAR) // 2
+#define LT_3 ALGR(LT_EOGO) // 3
+#define LT_4 ALGR(LT_EDOT) // 4
+#define LT_5 ALGR(LT_IOGO) // 5
+#define LT_6 ALGR(LT_SCAR) // 6
+#define LT_7 ALGR(LT_UOGO) // 7
+#define LT_8 ALGR(LT_UMAC) // 8
+#define LT_EQL ALGR(LT_PLUS) // =
+// Row 2
+#define LT_EURO ALGR(LT_E) // €
+
+/* Shift+AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ │ │ │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define LT_EXLM S(ALGR(LT_AOGO)) // !
+#define LT_AT S(ALGR(LT_CCAR)) // @
+#define LT_HASH S(ALGR(LT_EOGO)) // #
+#define LT_DLR S(ALGR(LT_EDOT)) // $
+#define LT_PERC S(ALGR(LT_IOGO)) // %
+#define LT_CIRC S(ALGR(LT_SCAR)) // ^
+#define LT_AMPR S(ALGR(LT_UOGO)) // &
+#define LT_ASTR S(ALGR(LT_UMAC)) // *
+#define LT_PLUS S(ALGR(LT_PLUS)) // +
diff --git a/quantum/keymap_extras/keymap_neo2.h b/quantum/keymap_extras/keymap_neo2.h
index 818a739c76e..8e6e2b77a22 100644
--- a/quantum/keymap_extras/keymap_neo2.h
+++ b/quantum/keymap_extras/keymap_neo2.h
@@ -13,66 +13,130 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-#ifndef KEYMAP_NEO2
-#define KEYMAP_NEO2
+
+#pragma once
#include "keymap.h"
-#include "keymap_german.h"
-#define NEO_A KC_D
-#define NEO_B KC_N
-#define NEO_C KC_R
-#define NEO_D DE_OE
-#define NEO_E KC_F
-#define NEO_F KC_O
-#define NEO_G KC_I
-#define NEO_H KC_U
-#define NEO_I KC_S
-#define NEO_J DE_MINS
-#define NEO_K DE_Z
-#define NEO_L KC_E
-#define NEO_M KC_M
-#define NEO_N KC_J
-#define NEO_O KC_G
-#define NEO_P KC_V
-#define NEO_Q KC_P
-#define NEO_R KC_K
-#define NEO_S KC_H
-#define NEO_T KC_L
-#define NEO_U KC_A
-#define NEO_V KC_W
-#define NEO_W KC_T
-#define NEO_X KC_Q
-#define NEO_Y DE_AE
-#define NEO_Z KC_B
-#define NEO_AE KC_C
-#define NEO_OE KC_X
-#define NEO_UE DE_Y
-#define NEO_SS DE_UE
+// clang-format off
-#define NEO_DOT DE_DOT
-#define NEO_COMM DE_COMM
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ^ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ ` │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ X │ V │ L │ C │ W │ K │ H │ G │ F │ Q │ ß │ ´ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ L3 │ U │ I │ A │ E │ O │ S │ N │ R │ T │ D │ Y │ L3│ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │L4 │ Ü │ Ö │ Ä │ P │ Z │ B │ M │ , │ . │ J │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ L4 │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define NE_CIRC KC_GRV // ^ (dead)
+#define NE_1 KC_1 // 1
+#define NE_2 KC_2 // 2
+#define NE_3 KC_3 // 3
+#define NE_4 KC_4 // 4
+#define NE_5 KC_5 // 5
+#define NE_6 KC_6 // 6
+#define NE_7 KC_7 // 7
+#define NE_8 KC_8 // 8
+#define NE_9 KC_9 // 9
+#define NE_0 KC_0 // 0
+#define NE_MINS KC_MINS // -
+#define NE_GRV KC_EQL // ` (dead)
+// Row 2
+#define NE_X KC_Q // X
+#define NE_V KC_W // V
+#define NE_L KC_E // L
+#define NE_C KC_R // C
+#define NE_W KC_T // W
+#define NE_K KC_Y // K
+#define NE_H KC_U // H
+#define NE_H KC_I // G
+#define NE_F KC_O // F
+#define NE_Q KC_P // Q
+#define NE_SS KC_LBRC // ß
+#define NE_ACUT KC_RBRC // ´ (dead)
+// Row 3
+#define NE_L3L KC_CAPS // (layer 3)
+#define NE_U KC_A // U
+#define NE_I KC_S // I
+#define NE_A KC_D // A
+#define NE_E KC_F // E
+#define NE_O KC_G // O
+#define NE_S KC_H // S
+#define NE_N KC_J // N
+#define NE_R KC_K // R
+#define NE_T KC_L // T
+#define NE_D KC_SCLN // D
+#define NE_Y KC_QUOT // Y
+#define NE_L3R KC_NUHS // (layer 3)
+// Row 4
+#define NE_L4L KC_NUBS // (layer 4)
+#define NE_UDIA KC_Z // Ü
+#define NE_ODIA KC_X // Ö
+#define NE_ADIA KC_C // Ä
+#define NE_P KC_V // P
+#define NE_Z KC_B // Z
+#define NE_B KC_N // B
+#define NE_M KC_M // M
+#define NE_COMM KC_COMM // ,
+#define NE_DOT KC_DOT // .
+#define NE_J KC_SLSH // J
+// Row 5
+#define NE_L4R KC_ALGR // (layer 4)
-#define NEO_1 DE_1
-#define NEO_2 DE_2
-#define NEO_3 DE_3
-#define NEO_4 DE_4
-#define NEO_5 DE_5
-#define NEO_6 DE_6
-#define NEO_7 DE_7
-#define NEO_8 DE_8
-#define NEO_9 DE_9
-#define NEO_0 DE_0
-#define NEO_MINS DE_SS
-
-#define NEO_ACUT DE_PLUS
-#define NEO_GRV DE_ACUT
-#define NEO_CIRC DE_CIRC
-
-#define NEO_L1_L KC_CAPS
-#define NEO_L1_R DE_HASH
-
-#define NEO_L2_L DE_LESS
-#define NEO_L2_R KC_ALGR
-
-#endif
+// DEPRECATED
+#define NEO_A NE_A
+#define NEO_B NE_B
+#define NEO_C NE_C
+#define NEO_D NE_D
+#define NEO_E NE_E
+#define NEO_F NE_F
+#define NEO_G NE_G
+#define NEO_H NE_H
+#define NEO_I NE_I
+#define NEO_J NE_J
+#define NEO_K NE_K
+#define NEO_L NE_L
+#define NEO_M NE_M
+#define NEO_N NE_N
+#define NEO_O NE_O
+#define NEO_P NE_P
+#define NEO_Q NE_Q
+#define NEO_R NE_R
+#define NEO_S NE_S
+#define NEO_T NE_T
+#define NEO_U NE_U
+#define NEO_V NE_V
+#define NEO_W NE_W
+#define NEO_X NE_X
+#define NEO_Y NE_Y
+#define NEO_Z NE_Z
+#define NEO_AE NE_ADIA
+#define NEO_OE NE_ODIA
+#define NEO_UE NE_UDIA
+#define NEO_SS NE_SS
+#define NEO_DOT NE_DOT
+#define NEO_COMM NE_COMM
+#define NEO_1 NE_1
+#define NEO_2 NE_2
+#define NEO_3 NE_3
+#define NEO_4 NE_4
+#define NEO_5 NE_5
+#define NEO_6 NE_6
+#define NEO_7 NE_7
+#define NEO_8 NE_8
+#define NEO_9 NE_9
+#define NEO_0 NE_0
+#define NEO_MINS NE_MINS
+#define NEO_ACUT NE_ACUT
+#define NEO_GRV NE_GRV
+#define NEO_CIRC NE_CIRC
+#define NEO_L1_L NE_L3L
+#define NEO_L1_R NE_L3R
+#define NEO_L2_L NE_L4L
+#define NEO_L2_R NE_L4R
diff --git a/quantum/keymap_extras/keymap_polish.h b/quantum/keymap_extras/keymap_polish.h
new file mode 100644
index 00000000000..a5c5cec5433
--- /dev/null
+++ b/quantum/keymap_extras/keymap_polish.h
@@ -0,0 +1,152 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define PL_GRV KC_GRV // `
+#define PL_1 KC_1 // 1
+#define PL_2 KC_2 // 2
+#define PL_3 KC_3 // 3
+#define PL_4 KC_4 // 4
+#define PL_5 KC_5 // 5
+#define PL_6 KC_6 // 6
+#define PL_7 KC_7 // 7
+#define PL_8 KC_8 // 8
+#define PL_9 KC_9 // 9
+#define PL_0 KC_0 // 0
+#define PL_MINS KC_MINS // -
+#define PL_EQL KC_EQL // =
+// Row 2
+#define PL_Q KC_Q // Q
+#define PL_W KC_W // W
+#define PL_E KC_E // E
+#define PL_R KC_R // R
+#define PL_T KC_T // T
+#define PL_Y KC_Y // Y
+#define PL_U KC_U // U
+#define PL_I KC_I // I
+#define PL_O KC_O // O
+#define PL_P KC_P // P
+#define PL_LBRC KC_LBRC // [
+#define PL_RBRC KC_RBRC // ]
+#define PL_BSLS KC_BSLS // (backslash)
+// Row 3
+#define PL_A KC_A // A
+#define PL_S KC_S // S
+#define PL_D KC_D // D
+#define PL_F KC_F // F
+#define PL_G KC_G // G
+#define PL_H KC_H // H
+#define PL_J KC_J // J
+#define PL_K KC_K // K
+#define PL_L KC_L // L
+#define PL_SCLN KC_SCLN // ;
+#define PL_QUOT KC_QUOT // '
+// Row 4
+#define PL_Z KC_Z // Z
+#define PL_X KC_X // X
+#define PL_C KC_C // C
+#define PL_V KC_V // V
+#define PL_B KC_B // B
+#define PL_N KC_N // N
+#define PL_M KC_M // M
+#define PL_COMM KC_COMM // ,
+#define PL_DOT KC_DOT // .
+#define PL_SLSH KC_SLSH // /
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ | │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ : │ " │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ │ │ │ │ │ │ │ < │ > │ ? │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define PL_TILD S(PL_GRV) // ~
+#define PL_EXLM S(PL_1) // !
+#define PL_AT S(PL_2) // @
+#define PL_HASH S(PL_3) // #
+#define PL_DLR S(PL_4) // $
+#define PL_PERC S(PL_5) // %
+#define PL_CIRC S(PL_6) // ^
+#define PL_AMPR S(PL_7) // &
+#define PL_ASTR S(PL_8) // *
+#define PL_LPRN S(PL_9) // (
+#define PL_RPRN S(PL_0) // )
+#define PL_UNDS S(PL_MINS) // _
+#define PL_PLUS S(PL_EQL) // +
+// Row 2
+#define PL_LCBR S(PL_LBRC) // {
+#define PL_RCBR S(PL_RBRC) // }
+#define PL_PIPE S(PL_BSLS) // |
+// Row 3
+#define PL_COLN S(PL_SCLN) // :
+#define PL_DQUO S(PL_QUOT) // "
+// Row 4
+#define PL_LABK S(PL_COMM) // <
+#define PL_RABK S(PL_DOT) // >
+#define PL_QUES S(PL_SLSH) // ?
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ Ę │ │ │ │ € │ │ Ó │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ Ą │ Ś │ │ │ │ │ │ │ Ł │ │ │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ Ż │ Ź │ Ć │ │ │ Ń │ │ │ │ │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 2
+#define PL_EOGO ALGR(PL_E) // Ę
+#define PL_EURO ALGR(PL_U) // €
+#define PL_OACU ALGR(PL_O) // Ó
+// Row 3
+#define PL_AOGO ALGR(PL_A) // Ą
+#define PL_SACU ALGR(PL_S) // Ś
+#define PL_LSTR ALGR(PL_L) // Ł
+// Row 4
+#define PL_ZDOT ALGR(PL_Z) // Ż
+#define PL_ZACU ALGR(PL_X) // Ź
+#define PL_CACU ALGR(PL_C) // Ć
+#define PL_NACU ALGR(PL_N) // Ń
diff --git a/quantum/keymap_extras/keymap_portuguese.h b/quantum/keymap_extras/keymap_portuguese.h
index 19d7dcd8170..84851b334a8 100644
--- a/quantum/keymap_extras/keymap_portuguese.h
+++ b/quantum/keymap_extras/keymap_portuguese.h
@@ -22,15 +22,15 @@
/*
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
- * │ \ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ' │ « │ │
+ * │ \ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ' │ « │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
- * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ + │ ´ │ │
- * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
- * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ç │ º │ ~ │ │
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ + │ ´ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ç │ º │ ~ │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
- * │ │ < │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
+ * │ │ < │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
- * │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
*/
// Row 1
@@ -88,15 +88,15 @@
/* Shifted symbols
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
- * │ | │ ! │ " │ # │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ » │ │
+ * │ | │ ! │ " │ # │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ » │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
- * │ │ │ │ │ │ │ │ │ │ │ │ * │ ` │ │
- * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
- * │ │ │ │ │ │ │ │ │ │ │ │ ª │ ^ │ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ * │ ` │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ ª │ ^ │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
- * │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │
+ * │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
- * │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
*/
// Row 1
@@ -127,15 +127,15 @@
/* AltGr symbols
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
- * │ │ │ @ │ £ │ § │ │ │ { │ [ │ ] │ } │ │ │ │
+ * │ │ │ @ │ £ │ § │ │ │ { │ [ │ ] │ } │ │ │ │
* ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
- * │ │ │ │ € │ │ │ │ │ │ │ │ ¨ │ │ │
- * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
- * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ │ │ │ € │ │ │ │ │ │ │ │ ¨ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
* ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
- * │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │
* ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
- * │ │ │ │ │ │ │ │ │
+ * │ │ │ │ │ │ │ │ │
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
*/
// Row 1
diff --git a/quantum/keymap_extras/keymap_romanian.h b/quantum/keymap_extras/keymap_romanian.h
new file mode 100644
index 00000000000..e2b8483dfd2
--- /dev/null
+++ b/quantum/keymap_extras/keymap_romanian.h
@@ -0,0 +1,188 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ „ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ Ă │ Î │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Ș │ Ț │ Â │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define RO_DLQU KC_GRV // „
+#define RO_1 KC_1 // 1
+#define RO_2 KC_2 // 2
+#define RO_3 KC_3 // 3
+#define RO_4 KC_4 // 4
+#define RO_5 KC_5 // 5
+#define RO_6 KC_6 // 6
+#define RO_7 KC_7 // 7
+#define RO_8 KC_8 // 8
+#define RO_9 KC_9 // 9
+#define RO_0 KC_0 // 0
+#define RO_MINS KC_MINS // -
+#define RO_EQL KC_EQL // =
+// Row 2
+#define RO_Q KC_Q // Q
+#define RO_W KC_W // W
+#define RO_E KC_E // E
+#define RO_R KC_R // R
+#define RO_T KC_T // T
+#define RO_Y KC_Y // Y
+#define RO_U KC_U // U
+#define RO_I KC_I // I
+#define RO_O KC_O // O
+#define RO_P KC_P // P
+#define RO_ABRV KC_LBRC // Ă
+#define RO_ICIR KC_RBRC // Î
+// Row 3
+#define RO_A KC_A // A
+#define RO_S KC_S // S
+#define RO_D KC_D // D
+#define RO_F KC_F // F
+#define RO_G KC_G // G
+#define RO_H KC_H // H
+#define RO_J KC_J // J
+#define RO_K KC_K // K
+#define RO_L KC_L // L
+#define RO_SCOM KC_SCLN // Ș
+#define RO_TCOM KC_QUOT // Ț
+#define RO_ACIR KC_NUHS // Â
+// Row 4
+#define RO_BSLS KC_NUBS // (backslash)
+#define RO_Z KC_Z // Z
+#define RO_X KC_X // X
+#define RO_C KC_C // C
+#define RO_V KC_V // V
+#define RO_B KC_B // B
+#define RO_N KC_N // N
+#define RO_M KC_M // M
+#define RO_COMM KC_COMM // ,
+#define RO_DOT KC_DOT // .
+#define RO_SLSH KC_SLSH // /
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ” │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ | │ │ │ │ │ │ │ │ ; │ : │ ? │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define RO_RDQU S(RO_DLQU) // ”
+#define RO_EXLM S(RO_1) // !
+#define RO_AT S(RO_2) // @
+#define RO_HASH S(RO_3) // #
+#define RO_DLR S(RO_4) // $
+#define RO_PERC S(RO_5) // %
+#define RO_CIRC S(RO_6) // ^
+#define RO_AMPR S(RO_7) // &
+#define RO_ASTR S(RO_8) // *
+#define RO_LPRN S(RO_9) // (
+#define RO_RPRN S(RO_0) // )
+#define RO_UNDS S(RO_MINS) // _
+#define RO_PLUS S(RO_EQL) // +
+// Row 4
+#define RO_PIPE S(RO_BSLS) // |
+#define RO_SCLN S(RO_COMM) // ;
+#define RO_COLN S(RO_DOT) // :
+#define RO_QUES S(RO_SLSH) // ?
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ` │ ~ │ ˇ │ ^ │ ˘ │ ° │ ˛ │ ` │ ˙ │ ´ │ ˝ │ ¨ │ ¸ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ € │ │ │ │ │ │ │ § │ [ │ ] │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ ß │ Đ │ │ │ │ │ │ Ł │ │ ' │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ © │ │ │ │ │ < │ > │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define RO_GRV ALGR(RO_DLQU) // `
+#define RO_DTIL ALGR(RO_1) // ~ (dead)
+#define RO_CARN ALGR(RO_2) // ˇ (dead)
+#define RO_DCIR ALGR(RO_3) // ^ (dead)
+#define RO_BREV ALGR(RO_4) // ˘ (dead)
+#define RO_RNGA ALGR(RO_5) // ° (dead)
+#define RO_OGON ALGR(RO_6) // ˛ (dead)
+#define RO_DGRV ALGR(RO_7) // ` (dead)
+#define RO_DOTA ALGR(RO_8) // ˙ (dead)
+#define RO_ACUT ALGR(RO_9) // ´ (dead)
+#define RO_DACU ALGR(RO_0) // ˝ (dead)
+#define RO_DIAE ALGR(RO_MINS) // ¨ (dead)
+#define RO_CEDL ALGR(RO_EQL) // ¸ (dead)
+// Row 2
+#define RO_EURO ALGR(RO_E) // €
+#define RO_SECT ALGR(RO_P) // §
+#define RO_LBRC ALGR(RO_ABRV) // [
+#define RO_RBRC ALGR(RO_ICIR) // ]
+// Row 3
+#define RO_SS ALGR(RO_S) // ß
+#define RO_DSTR ALGR(RO_D) // Đ
+#define RO_LSTR ALGR(RO_L) // Ł
+#define RO_QUOT ALGR(RO_TCOM) // '
+// Row 4
+#define RO_COPY ALGR(RO_C) // ©
+#define RO_LABK ALGR(RO_COMM) // <
+#define RO_RABK ALGR(RO_DOT) // >
+
+/* Shift+AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ │ │ │ │ │ │ │ │ │ │ – │ ± │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ " │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ │ │ │ │ « │ » │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define RO_TILD S(ALGR(RO_DLQU)) // ~
+#define RO_NDSH S(ALGR(RO_MINS)) // –
+#define RO_PLMN S(ALGR(RO_EQL)) // ±
+// Row 2
+#define RO_LCBR S(ALGR(RO_ABRV)) // {
+#define RO_RCBR S(ALGR(RO_ICIR)) // }
+// Row 3
+#define RO_DQUO S(ALGR(RO_TCOM)) // "
+// Row 4
+#define RO_LDAQ S(ALGR(RO_COMM)) // «
+#define RO_RDAQ S(ALGR(RO_DOT)) // »
diff --git a/quantum/keymap_extras/keymap_russian.h b/quantum/keymap_extras/keymap_russian.h
new file mode 100644
index 00000000000..eb0581147c4
--- /dev/null
+++ b/quantum/keymap_extras/keymap_russian.h
@@ -0,0 +1,133 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ Ё │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Й │ Ц │ У │ К │ Е │ Н │ Г │ Ш │ Щ │ З │ Х │ Ъ │ \ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ Ф │ Ы │ В │ А │ П │ Р │ О │ Л │ Д │ Ж │ Э │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ Я │ Ч │ С │ М │ И │ Т │ Ь │ Б │ Ю │ . │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define RU_YO KC_GRV // Ё
+#define RU_1 KC_1 // 1
+#define RU_2 KC_2 // 2
+#define RU_3 KC_3 // 3
+#define RU_4 KC_4 // 4
+#define RU_5 KC_5 // 5
+#define RU_6 KC_6 // 6
+#define RU_7 KC_7 // 7
+#define RU_8 KC_8 // 8
+#define RU_9 KC_9 // 9
+#define RU_0 KC_0 // 0
+#define RU_MINS KC_MINS // -
+#define RU_EQL KC_EQL // =
+// Row 2
+#define RU_SHTI KC_Q // Й
+#define RU_TSE KC_W // Ц
+#define RU_U KC_E // У
+#define RU_KA KC_R // К
+#define RU_IE KC_T // Е
+#define RU_EN KC_Y // Н
+#define RU_GHE KC_U // Г
+#define RU_SHA KC_I // Ш
+#define RU_SHCH KC_O // Щ
+#define RU_ZE KC_P // З
+#define RU_HA KC_LBRC // Х
+#define RU_HARD KC_RBRC // Ъ
+#define RU_BSLS KC_BSLS // (backslash)
+// Row 3
+#define RU_EF KC_A // Ф
+#define RU_YERU KC_S // Ы
+#define RU_VE KC_D // В
+#define RU_A KC_F // А
+#define RU_PE KC_G // П
+#define RU_ER KC_H // Р
+#define RU_O KC_J // О
+#define RU_EL KC_K // Л
+#define RU_DE KC_L // Д
+#define RU_ZHE KC_SCLN // Ж
+#define RU_E KC_QUOT // Э
+// Row 4
+#define RU_YA KC_Z // Я
+#define RU_CHE KC_X // Ч
+#define RU_ES KC_C // С
+#define RU_EM KC_V // М
+#define RU_I KC_B // И
+#define RU_TE KC_N // Т
+#define RU_SOFT KC_M // Ь
+#define RU_BE KC_COMM // Б
+#define RU_YU KC_DOT // Ю
+#define RU_DOT KC_SLSH // .
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ ! │ " │ № │ ; │ % │ : │ ? │ * │ ( │ ) │ _ │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ / │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ │ │ │ │ │ │ │ │ │ , │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define RU_EXLM S(RU_1) // !
+#define RU_DQUO S(RU_2) // "
+#define RU_NUM S(RU_3) // №
+#define RU_SCLN S(RU_4) // ;
+#define RU_PERC S(RU_5) // %
+#define RU_COLN S(RU_6) // :
+#define RU_QUES S(RU_7) // ?
+#define RU_ASTR S(RU_8) // *
+#define RU_LPRN S(RU_9) // (
+#define RU_RPRN S(RU_0) // )
+#define RU_UNDS S(RU_MINS) // _
+#define RU_PLUS S(RU_EQL) // +
+// Row 2
+#define RU_SLSH S(RU_BSLS) // /
+// Row 4
+#define RU_COMM S(RU_DOT) // ,
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ │ │ │ │ │ │ │ ₽ │ │ │ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define RU_RUBL ALGR(RU_8) // ₽
diff --git a/quantum/keymap_extras/keymap_serbian.h b/quantum/keymap_extras/keymap_serbian.h
new file mode 100644
index 00000000000..738a2d4afb3
--- /dev/null
+++ b/quantum/keymap_extras/keymap_serbian.h
@@ -0,0 +1,136 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ' │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Љ │ Њ │ Е │ Р │ Т │ З │ У │ И │ О │ П │ Ш │ Ђ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ А │ С │ Д │ Ф │ Г │ Х │ Ј │ К │ Л │ Ч │ Ћ │ Ж │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ < │ Ѕ │ Џ │ Ц │ В │ Б │ Н │ М │ , │ . │ - │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define RS_GRV KC_GRV // `
+#define RS_1 KC_1 // 1
+#define RS_2 KC_2 // 2
+#define RS_3 KC_3 // 3
+#define RS_4 KC_4 // 4
+#define RS_5 KC_5 // 5
+#define RS_6 KC_6 // 6
+#define RS_7 KC_7 // 7
+#define RS_8 KC_8 // 8
+#define RS_9 KC_9 // 9
+#define RS_0 KC_0 // 0
+#define RS_QUOT KC_MINS // ' (dead)
+#define RS_PLUS KC_EQL // +
+// Row 2
+#define RS_LJE KC_Q // Љ
+#define RS_NJE KC_W // Њ
+#define RS_IE KC_E // Е
+#define RS_ER KC_R // Р
+#define RS_TE KC_T // Т
+#define RS_ZE KC_Y // З
+#define RS_U KC_U // У
+#define RS_I KC_I // И
+#define RS_O KC_O // О
+#define RS_PE KC_P // П
+#define RS_SHA KC_LBRC // Ш
+#define RS_DJE KC_RBRC // Ђ
+// Row 3
+#define RS_A KC_A // А
+#define RS_ES KC_S // С
+#define RS_DE KC_D // Д
+#define RS_EF KC_F // Ф
+#define RS_GHE KC_G // Г
+#define RS_HA KC_H // Х
+#define RS_JE KC_J // Ј
+#define RS_KA KC_K // К
+#define RS_EL KC_L // Л
+#define RS_CHE KC_SCLN // Ч
+#define RS_TSHE KC_QUOT // Ћ
+#define RS_ZHE KC_NUHS // Ж
+// Row 4
+#define RS_LABK KC_NUBS // <
+#define RS_DZE KC_Z // Ѕ
+#define RS_DZHE KC_X // Џ
+#define RS_TSE KC_C // Ц
+#define RS_VE KC_V // В
+#define RS_BE KC_B // Б
+#define RS_EN KC_N // Н
+#define RS_EM KC_M // М
+#define RS_COMM KC_COMM // ,
+#define RS_DOT KC_DOT // .
+#define RS_MINS KC_SLSH // -
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ ! │ " │ # │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ * │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define RS_TILD S(RS_GRV) // ~
+#define RS_EXLM S(RS_1) // !
+#define RS_DQUO S(RS_2) // "
+#define RS_HASH S(RS_3) // #
+#define RS_DLR S(RS_4) // $
+#define RS_PERC S(RS_5) // %
+#define RS_AMPR S(RS_6) // &
+#define RS_SLSH S(RS_7) // /
+#define RS_LPRN S(RS_8) // (
+#define RS_RPRN S(RS_9) // )
+#define RS_EQL S(RS_0) // =
+#define RS_QUES S(RS_QUOT) // ?
+#define RS_ASTR S(RS_PLUS) // *
+// Row 4
+#define RS_RABK S(RS_LABK) // >
+#define RS_SCLN S(RS_COMM) // ;
+#define RS_COLN S(RS_DOT) // :
+#define RS_UNDS S(RS_MINS) // _
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ € │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 2
+#define RS_EURO ALGR(RS_IE) // €
diff --git a/quantum/keymap_extras/keymap_serbian_latin.h b/quantum/keymap_extras/keymap_serbian_latin.h
new file mode 100644
index 00000000000..b514102c02d
--- /dev/null
+++ b/quantum/keymap_extras/keymap_serbian_latin.h
@@ -0,0 +1,164 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ‚ │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ' │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Z │ U │ I │ O │ P │ Š │ Đ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ Č │ Ć │ Ž │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ < │ Y │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define RS_SLQU KC_GRV // ‚ (dead)
+#define RS_1 KC_1 // 1
+#define RS_2 KC_2 // 2
+#define RS_3 KC_3 // 3
+#define RS_4 KC_4 // 4
+#define RS_5 KC_5 // 5
+#define RS_6 KC_6 // 6
+#define RS_7 KC_7 // 7
+#define RS_8 KC_8 // 8
+#define RS_9 KC_9 // 9
+#define RS_0 KC_0 // 0
+#define RS_QUOT KC_MINS // '
+#define RS_PLUS KC_EQL // +
+// Row 2
+#define RS_Q KC_Q // Q
+#define RS_W KC_W // W
+#define RS_E KC_E // E
+#define RS_R KC_R // R
+#define RS_T KC_T // T
+#define RS_Z KC_Y // Z
+#define RS_U KC_U // U
+#define RS_I KC_I // I
+#define RS_O KC_O // O
+#define RS_P KC_P // P
+#define RS_SCAR KC_LBRC // Š
+#define RS_DSTR KC_RBRC // Đ
+// Row 3
+#define RS_A KC_A // A
+#define RS_S KC_S // S
+#define RS_D KC_D // D
+#define RS_F KC_F // F
+#define RS_G KC_G // G
+#define RS_H KC_H // H
+#define RS_J KC_J // J
+#define RS_K KC_K // K
+#define RS_L KC_L // L
+#define RS_CCAR KC_SCLN // Č
+#define RS_CACU KC_QUOT // Ć
+#define RS_ZCAR KC_NUHS // Ž
+// Row 4
+#define RS_LABK KC_NUBS // <
+#define RS_Y KC_Z // Y
+#define RS_X KC_X // X
+#define RS_C KC_C // C
+#define RS_V KC_V // V
+#define RS_B KC_B // B
+#define RS_N KC_N // N
+#define RS_M KC_M // M
+#define RS_COMM KC_COMM // ,
+#define RS_DOT KC_DOT // .
+#define RS_MINS KC_SLSH // -
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ ! │ " │ # │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ * │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ > │ │ │ │ │ │ │ │ ; │ : │ _ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define RS_TILD S(RS_SLQU) // ~
+#define RS_EXLM S(RS_1) // !
+#define RS_DQUO S(RS_2) // "
+#define RS_HASH S(RS_3) // #
+#define RS_DLR S(RS_4) // $
+#define RS_PERC S(RS_5) // %
+#define RS_AMPR S(RS_6) // &
+#define RS_SLSH S(RS_7) // /
+#define RS_LPRN S(RS_8) // (
+#define RS_RPRN S(RS_9) // )
+#define RS_EQL S(RS_0) // =
+#define RS_QUES S(RS_QUOT) // ?
+#define RS_ASTR S(RS_PLUS) // *
+// Row 4
+#define RS_RABK S(RS_LABK) // >
+#define RS_SCLN S(RS_COMM) // ;
+#define RS_COLN S(RS_DOT) // :
+#define RS_UNDS S(RS_MINS) // _
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ │ ˇ │ ^ │ ˘ │ ° │ ˛ │ ` │ ˙ │ ´ │ ˝ │ ¨ │ ¸ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ \ │ | │ € │ │ │ │ │ │ │ │ ÷ │ × │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ [ │ ] │ │ │ ł │ Ł │ │ ß │ ¤ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ @ │ { │ } │ § │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define RS_CARN ALGR(RS_2) // ˇ (dead)
+#define RS_CIRC ALGR(RS_3) // ^ (dead)
+#define RS_BREV ALGR(RS_4) // ˘ (dead)
+#define RS_RNGA ALGR(RS_5) // ° (dead)
+#define RS_OGON ALGR(RS_6) // ˛ (dead)
+#define RS_GRV ALGR(RS_7) // `
+#define RS_DOTA ALGR(RS_8) // ˙ (dead)
+#define RS_ACUT ALGR(RS_9) // ´ (dead)
+#define RS_DACU ALGR(RS_0) // ˝ (dead)
+#define RS_DIAE ALGR(RS_QUOT) // ¨ (dead)
+#define RS_CEDL ALGR(RS_PLUS) // ¸ (dead)
+// Row 2
+#define RS_BSLS ALGR(RS_Q) // (backslash)
+#define RS_PIPE ALGR(RS_W) // |
+#define RS_EURO ALGR(RS_E) // €
+#define RS_DIV ALGR(RS_SCAR) // ÷
+#define RS_MUL ALGR(RS_DSTR) // ×
+// Row 3
+#define RS_LBRC ALGR(RS_F) // [
+#define RS_RBRC ALGR(RS_G) // ]
+#define RS_LLST ALGR(RS_K) // ł
+#define RS_CLST ALGR(RS_L) // Ł
+#define RS_SS ALGR(RS_CACU) // ß
+#define RS_CURR ALGR(RS_ZCAR) // ¤
+// Row 4
+#define RS_AT ALGR(RS_V) // @
+#define RS_LCBR ALGR(RS_B) // {
+#define RS_RCBR ALGR(RS_N) // }
+#define RS_SECT ALGR(RS_M) // §
diff --git a/quantum/keymap_extras/keymap_slovak.h b/quantum/keymap_extras/keymap_slovak.h
new file mode 100644
index 00000000000..f0bd6ae5137
--- /dev/null
+++ b/quantum/keymap_extras/keymap_slovak.h
@@ -0,0 +1,176 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ; │ + │ ľ │ š │ č │ ť │ ž │ ý │ á │ í │ é │ = │ ´ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Z │ U │ I │ O │ P │ ú │ ä │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ô │ § │ ň │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ & │ Y │ X │ C │ V │ B │ N │ M │ , │ . │ - │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define SK_SCLN KC_GRV // ;
+#define SK_PLUS KC_1 // +
+#define SK_LCAR KC_2 // ľ
+#define SK_SCAR KC_3 // š
+#define SK_CCAR KC_4 // č
+#define SK_TCAR KC_5 // ť
+#define SK_ZCAR KC_6 // ž
+#define SK_YACU KC_7 // ý
+#define SK_AACU KC_8 // á
+#define SK_IACU KC_9 // í
+#define SK_EACU KC_0 // é
+#define SK_EQL KC_MINS // =
+#define SK_ACUT KC_EQL // ´ (dead)
+// Row 2
+#define SK_Q KC_Q // Q
+#define SK_W KC_W // W
+#define SK_E KC_E // E
+#define SK_R KC_R // R
+#define SK_T KC_T // T
+#define SK_Z KC_Y // Z
+#define SK_U KC_U // U
+#define SK_I KC_I // I
+#define SK_O KC_O // O
+#define SK_P KC_P // P
+#define SK_UACU KC_LBRC // ú
+#define SK_ADIA KC_RBRC // ä
+// Row 3
+#define SK_A KC_A // A
+#define SK_S KC_S // S
+#define SK_D KC_D // D
+#define SK_F KC_F // F
+#define SK_G KC_G // G
+#define SK_H KC_H // H
+#define SK_J KC_J // J
+#define SK_K KC_K // K
+#define SK_L KC_L // L
+#define SK_OCIR KC_SCLN // ô
+#define SK_SECT KC_QUOT // §
+#define SK_NCAR KC_NUHS // ň
+// Row 4
+#define SK_AMPR KC_NUBS // &
+#define SK_Y KC_Z // Y
+#define SK_X KC_X // X
+#define SK_C KC_C // C
+#define SK_V KC_V // V
+#define SK_B KC_B // B
+#define SK_N KC_N // N
+#define SK_M KC_M // M
+#define SK_COMM KC_COMM // ,
+#define SK_DOT KC_DOT // .
+#define SK_MINS KC_SLSH // -
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ° │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ % │ ˇ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ / │ ( │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ " │ ! │ ) │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ * │ │ │ │ │ │ │ │ ? │ : │ _ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define SK_RNGA S(SK_SCLN) // ° (dead)
+#define SK_1 S(SK_PLUS) // 1
+#define SK_2 S(SK_LACU) // 2
+#define SK_3 S(SK_SCAR) // 3
+#define SK_4 S(SK_CCAR) // 4
+#define SK_5 S(SK_TACU) // 5
+#define SK_6 S(SK_ZCAR) // 6
+#define SK_7 S(SK_YACU) // 7
+#define SK_8 S(SK_AACU) // 8
+#define SK_9 S(SK_IACU) // 9
+#define SK_0 S(SK_EACU) // 0
+#define SK_PERC S(SK_EQL) // %
+#define SK_CARN S(SK_ACUT) // ˇ (dead)
+// Row 2
+#define SK_SLSH S(SK_UACU) // /
+#define SK_LPRN S(SK_ADIA) // (
+// Row 3
+#define SK_DQUO S(SK_OCIR) // "
+#define SK_EXLM S(SK_SECT) // !
+#define SK_RPRN S(SK_NCAR) // )
+// Row 4
+#define SK_ASTR S(SK_AMPR) // *
+#define SK_QUES S(SK_COMM) // ?
+#define SK_COLN S(SK_DOT) // :
+#define SK_UNDS S(SK_MINS) // _
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ ~ │ │ ^ │ ˘ │ ° │ ˛ │ ` │ ˙ │ │ ˝ │ ¨ │ ¸ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ \ │ | │ € │ │ │ │ │ │ │ ' │ ÷ │ × │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ đ │ Đ │ [ │ ] │ │ │ ł │ Ł │ $ │ ß │ ¤ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ < │ > │ # │ │ @ │ { │ } │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define SK_TILD ALGR(SK_PLUS) // ~
+#define SK_CIRC ALGR(SK_LCAR) // ^ (dead)
+#define SK_BREV ALGR(SK_SCAR) // ˘ (dead)
+#define SK_RNGA ALGR(SK_CCAR) // ° (dead)
+#define SK_OGON ALGR(SK_TCAR) // ˛ (dead)
+#define SK_GRV ALGR(SK_ZCAR) // `
+#define SK_DOTA ALGR(SK_YACU) // ˙ (dead)
+#define SK_DACU ALGR(SK_EACU) // ˝ (dead)
+#define SK_DIAE ALGR(SK_EQL) // ¨ (dead)
+#define SK_CEDL ALGR(SK_ACUT) // ¸ (dead)
+// Row 2
+#define SK_BSLS ALGR(SK_Q) // (backslash)
+#define SK_PIPE ALGR(SK_W) // |
+#define SK_EURO ALGR(SK_E) // €
+#define SK_QUOT ALGR(SK_P) // '
+#define SK_DIV ALGR(SK_UACU) // ÷
+#define SK_MUL ALGR(SK_ADIA) // ×
+// Row 3
+#define SK_LDST ALGR(SK_S) // đ
+#define SK_CDST ALGR(SK_D) // Đ
+#define SK_LBRC ALGR(SK_F) // [
+#define SK_RBRC ALGR(SK_G) // ]
+#define SK_LLST ALGR(SK_K) // ł
+#define SK_CLST ALGR(SK_L) // Ł
+#define SK_DLR ALGR(SK_OCIR) // $
+#define SK_SS ALGR(SK_SECT) // ß
+#define SK_CURR ALGR(SK_NCAR) // ¤
+// Row 4
+#define SK_LABK ALGR(SK_AMPR) // <
+#define SK_RABK ALGR(SK_Y) // >
+#define SK_HASH ALGR(SK_X) // #
+#define SK_AT ALGR(SK_V) // @
+#define SK_LCBR ALGR(SK_B) // {
+#define SK_RCBR ALGR(SK_N) // }
diff --git a/quantum/keymap_extras/keymap_slovenian.h b/quantum/keymap_extras/keymap_slovenian.h
index c479cc07ba4..d24c9c6355e 100644
--- a/quantum/keymap_extras/keymap_slovenian.h
+++ b/quantum/keymap_extras/keymap_slovenian.h
@@ -137,11 +137,11 @@
#define SI_CARN ALGR(SI_2) // ˇ (dead)
#define SI_CIRC ALGR(SI_3) // ^ (dead)
#define SI_BREV ALGR(SI_4) // ˘ (dead)
-#define SI_DEG ALGR(SI_5) // ° (dead)
+#define SI_RNGA ALGR(SI_5) // ° (dead)
#define SI_OGON ALGR(SI_6) // ˛ (dead)
#define SI_GRV ALGR(SI_7) // `
#define SI_DOTA ALGR(SI_8) // ˙ (dead)
-#define SI_ACCU ALGR(SI_9) // ´ (dead)
+#define SI_ACUT ALGR(SI_9) // ´ (dead)
#define SI_DACU ALGR(SI_0) // ˝ (dead)
// Row 2
#define SI_BSLS ALGR(SI_Q) // (backslash)
diff --git a/quantum/keymap_extras/keymap_spanish_dvorak.h b/quantum/keymap_extras/keymap_spanish_dvorak.h
new file mode 100644
index 00000000000..b6bc734c372
--- /dev/null
+++ b/quantum/keymap_extras/keymap_spanish_dvorak.h
@@ -0,0 +1,153 @@
+/* Copyright 2020 José Andrés García
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ º │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ' │ ¡ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ . │ , │ Ñ │ P │ Y │ F │ G │ C │ H │ L │ ` │ + │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ O │ E │ U │ I │ D │ R │ T │ N │ S │ ' │ Ç │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ < │ - │ Q │ J │ K │ X │ B │ M │ W │ V │ Z │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define DV_MORD KC_GRV // º
+#define DV_1 KC_1 // 1
+#define DV_2 KC_2 // 2
+#define DV_3 KC_3 // 3
+#define DV_4 KC_4 // 4
+#define DV_5 KC_5 // 5
+#define DV_6 KC_6 // 6
+#define DV_7 KC_7 // 7
+#define DV_8 KC_8 // 8
+#define DV_9 KC_9 // 9
+#define DV_0 KC_0 // 0
+#define DV_QUOT KC_MINS // '
+#define DV_IEXL KC_EQL // ¡
+// Row 2
+#define DV_DOT KC_Q // .
+#define DV_COMM KC_W // ,
+#define DV_NTIL KC_E // Ñ
+#define DV_P KC_R // P
+#define DV_Y KC_T // Y
+#define DV_F KC_Y // F
+#define DV_G KC_U // G
+#define DV_C KC_I // C
+#define DV_H KC_O // H
+#define DV_L KC_P // L
+#define DV_GRV KC_LBRC // ` (dead)
+#define DV_PLUS KC_RBRC // +
+// Row 3
+#define DV_A KC_A // A
+#define DV_O KC_S // O
+#define DV_E KC_D // E
+#define DV_U KC_F // U
+#define DV_I KC_G // I
+#define DV_D KC_H // D
+#define DV_R KC_J // R
+#define DV_T KC_K // T
+#define DV_N KC_L // N
+#define DV_S KC_SCLN // S
+#define DV_ACUT KC_QUOT // ´ (dead)
+#define DV_CCED KC_NUHS // Ç
+// Row 4
+#define DV_LABK KC_NUBS // <
+#define DV_MINS KC_Z // -
+#define DV_Q KC_X // Q
+#define DV_J KC_C // J
+#define DV_K KC_V // K
+#define DV_X KC_B // X
+#define DV_B KC_N // B
+#define DV_M KC_M // M
+#define DV_W KC_COMM // W
+#define DV_V KC_DOT // V
+#define DV_Z KC_SLSH // Z
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ª │ ! │ " │ · │ $ │ % │ & │ / │ ( │ ) │ = │ ? │ ¿ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ : │ ; │ │ │ │ │ │ │ │ │ ^ │ * │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ ¨ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ > │ _ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define DV_FORD S(DV_MORD) // ª
+#define DV_EXLM S(DV_1) // !
+#define DV_DQUO S(DV_2) // "
+#define DV_BULT S(DV_3) // ·
+#define DV_DLR S(DV_4) // $
+#define DV_PERC S(DV_5) // %
+#define DV_AMPR S(DV_6) // &
+#define DV_SLSH S(DV_7) // /
+#define DV_LPRN S(DV_8) // (
+#define DV_RPRN S(DV_9) // )
+#define DV_EQL S(DV_0) // =
+#define DV_QUES S(DV_QUOT) // ?
+#define DV_IQUE S(DV_IEXL) // ¿
+// Row 2
+#define DV_COLN S(KC_DOT) // :
+#define DV_SCLN S(KC_COMM) // ;
+#define DV_CIRC S(DV_GRV) // ^ (dead)
+#define DV_ASTR S(DV_PLUS) // *
+// Row 3
+#define DV_DIAE S(DV_GRV) // ¨ (dead)
+// Row 4
+#define DV_RABK S(DV_LABK) // >
+#define DV_UNDS S(DV_MINS) // _
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ \ │ | │ @ │ # │ ~ │ € │ ¬ │ │ │ │ │ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ [ │ ] │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define DV_BSLS ALGR(DV_MORD) // (backslash)
+#define DV_PIPE ALGR(DV_1) // |
+#define DV_AT ALGR(DV_2) // @
+#define DV_HASH ALGR(DV_3) // #
+#define DV_TILD ALGR(DV_4) // ~
+#define DV_EURO ALGR(DV_5) // €
+#define DV_NOT ALGR(DV_6) // ¬
+// Row 2
+#define DV_LBRC ALGR(DV_GRV) // [
+#define DV_RBRC ALGR(DV_PLUS) // ]
+// Row 3
+#define DV_LCBR ALGR(DV_ACUT) // {
+#define DV_RCBR ALGR(DV_CCED) // }
diff --git a/quantum/keymap_extras/keymap_swedish.h b/quantum/keymap_extras/keymap_swedish.h
index 86e0761f26d..4d2eaa97838 100644
--- a/quantum/keymap_extras/keymap_swedish.h
+++ b/quantum/keymap_extras/keymap_swedish.h
@@ -155,24 +155,25 @@
// DEPRECATED
#include "keymap_nordic.h"
-#undef NO_AE
-#undef NO_CIRC
-#undef NO_OSLH
-
-#define NO_AE SE_AE
-#define NO_CIRC SE_CIRC
-#define NO_OSLH SE_ODIA
-#define NO_AA SE_ARNG
-#define NO_ASTR SE_ASTR
+#define SE_OSLH SE_ODIA
+#define SE_APOS SE_QUOT
+#define SE_LESS SE_LABK
+#define SE_QUO2 SE_DQUO
+#define SE_BULT SE_CURR
+#define SE_GRTR SE_RABK
+#define SE_AA SE_ARNG
+#define SE_AE SE_ADIA
+#define SE_AM SE_ARNG
+#define SE_MU SE_MICR
// Swedish macOS symbols (not vetted)
-#define NO_ACUT_MAC SE_ACUT
-#define NO_APOS_MAC SE_LABK
-#define NO_AT_MAC SE_ADIA
-#define NO_BSLS_MAC S(SE_LCBR)
-#define NO_DLR_MAC SE_CURR
-#define NO_GRV_MAC SE_BSLS
-#define NO_GRTR_MAC SE_HALF
-#define NO_LCBR_MAC S(SE_LBRC)
-#define NO_LESS_MAC SE_SECT
-#define NO_PIPE_MAC SE_LCBR
-#define NO_RCBR_MAC S(SE_RBRC)
+#define SE_ACUT_MAC SE_ACUT
+#define SE_APOS_MAC SE_LABK
+#define SE_AT_MAC SE_ADIA
+#define SE_BSLS_MAC S(SE_LCBR)
+#define SE_DLR_MAC SE_CURR
+#define SE_GRV_MAC SE_BSLS
+#define SE_GRTR_MAC SE_HALF
+#define SE_LCBR_MAC S(SE_LBRC)
+#define SE_LESS_MAC SE_SECT
+#define SE_PIPE_MAC SE_LCBR
+#define SE_RCBR_MAC S(SE_RBRC)
diff --git a/quantum/keymap_extras/keymap_uk.h b/quantum/keymap_extras/keymap_uk.h
index d4329e547d4..d790179ab3a 100644
--- a/quantum/keymap_extras/keymap_uk.h
+++ b/quantum/keymap_extras/keymap_uk.h
@@ -13,165 +13,214 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-#ifndef KEYMAP_UK_H
-#define KEYMAP_UK_H
+
+#pragma once
#include "keymap.h"
-// Normal characters
-#define UK_HASH KC_NUHS
-#define UK_BSLS KC_NUBS
+// clang-format off
-// Shifted characters
-#define UK_NOT LSFT(KC_GRV)
-#define UK_DQUO LSFT(KC_2)
-#define UK_PND LSFT(KC_3)
-#define UK_AT LSFT(KC_QUOT)
-#define UK_TILD LSFT(KC_NUHS)
-#define UK_PIPE LSFT(KC_NUBS)
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ # │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ \ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define UK_GRV KC_GRV // `
+#define UK_1 KC_1 // 1
+#define UK_2 KC_2 // 2
+#define UK_3 KC_3 // 3
+#define UK_4 KC_4 // 4
+#define UK_5 KC_5 // 5
+#define UK_6 KC_6 // 6
+#define UK_7 KC_7 // 7
+#define UK_8 KC_8 // 8
+#define UK_9 KC_9 // 9
+#define UK_0 KC_0 // 0
+#define UK_MINS KC_MINS // -
+#define UK_EQL KC_EQL // =
+// Row 2
+#define UK_Q KC_Q // Q
+#define UK_W KC_W // W
+#define UK_E KC_E // E
+#define UK_R KC_R // R
+#define UK_T KC_T // T
+#define UK_Y KC_Y // Y
+#define UK_U KC_U // U
+#define UK_I KC_I // I
+#define UK_O KC_O // O
+#define UK_P KC_P // P
+#define UK_LBRC KC_LBRC // [
+#define UK_RBRC KC_RBRC // ]
+// Row 3
+#define UK_A KC_A // A
+#define UK_S KC_S // S
+#define UK_D KC_D // D
+#define UK_F KC_F // F
+#define UK_G KC_G // G
+#define UK_H KC_H // H
+#define UK_J KC_J // J
+#define UK_K KC_K // K
+#define UK_L KC_L // L
+#define UK_SCLN KC_SCLN // ;
+#define UK_QUOT KC_QUOT // '
+#define UK_HASH KC_NUHS // #
+// Row 4
+#define UK_BSLS KC_NUBS // (backslash)
+#define UK_Z KC_Z // Z
+#define UK_X KC_X // X
+#define UK_C KC_C // C
+#define UK_V KC_V // V
+#define UK_B KC_B // B
+#define UK_N KC_N // N
+#define UK_M KC_M // M
+#define UK_COMM KC_COMM // ,
+#define UK_DOT KC_DOT // .
+#define UK_SLSH KC_SLSH // /
-// Alt Gr-ed characters
-#define UK_BRKP ALGR(KC_GRV)
-#define UK_EURO ALGR(KC_4)
-#define UK_EACT ALGR(KC_E)
-#define UK_UACT ALGR(KC_U)
-#define UK_IACT ALGR(KC_I)
-#define UK_OACT ALGR(KC_O)
-#define UK_AACT ALGR(KC_A)
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ¬ │ ! │ " │ £ │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ │ │ │ │ │ │ │ │ │ : │ @ │ ~ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ | │ │ │ │ │ │ │ │ < │ > │ ? │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define UK_NOT S(UK_GRV) // ¬
+#define UK_EXLM S(UK_1) // !
+#define UK_DQUO S(UK_2) // "
+#define UK_PND S(UK_3) // £
+#define UK_DLR S(UK_4) // $
+#define UK_PERC S(UK_5) // %
+#define UK_CIRC S(UK_6) // ^
+#define UK_AMPR S(UK_7) // &
+#define UK_ASTR S(UK_8) // *
+#define UK_LPRN S(UK_9) // (
+#define UK_RPRN S(UK_0) // )
+#define UK_UNDS S(UK_MINS) // _
+#define UK_PLUS S(UK_EQL) // +
+// Row 2
+#define UK_LCBR S(UK_LBRC) // {
+#define UK_RCBR S(UK_RBRC) // }
+// Row 3
+#define UK_COLN S(UK_SCLN) // :
+#define UK_AT S(UK_QUOT) // @
+#define UK_TILD S(UK_HASH) // ~
+// Row 4
+#define UK_PIPE S(UK_BSLS) // |
+#define UK_LABK S(UK_COMM) // <
+#define UK_RABK S(UK_DOT) // >
+#define UK_QUES S(UK_SLSH) // ?
-// Duplicate US keyboard so that we don't have to use it
-#define UK_A KC_A
-#define UK_B KC_B
-#define UK_C KC_C
-#define UK_D KC_D
-#define UK_E KC_E
-#define UK_F KC_F
-#define UK_G KC_G
-#define UK_H KC_H
-#define UK_I KC_I
-#define UK_J KC_J
-#define UK_K KC_K
-#define UK_L KC_L
-#define UK_M KC_M
-#define UK_N KC_N
-#define UK_O KC_O
-#define UK_P KC_P
-#define UK_Q KC_Q
-#define UK_R KC_R
-#define UK_S KC_S
-#define UK_T KC_T
-#define UK_U KC_U
-#define UK_V KC_V
-#define UK_W KC_W
-#define UK_X KC_X
-#define UK_Y KC_Y
-#define UK_Z KC_Z
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ¦ │ │ │ │ € │ │ │ │ │ │ │ │ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ É │ │ │ │ Ú │ Í │ Ó │ │ │ │ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐ │
+ * │ │ Á │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define UK_BRKP ALGR(UK_GRV) // ¦
+#define UK_EURO ALGR(UK_4) // €
+// Row 2
+#define UK_EACU ALGR(KC_E) // É
+#define UK_UACU ALGR(KC_U) // Ú
+#define UK_IACU ALGR(KC_I) // Í
+#define UK_OACU ALGR(KC_O) // Ó
+// Row 3
+#define UK_AACU ALGR(KC_A) // Á
-#define UK_1 KC_1
-#define UK_2 KC_2
-#define UK_3 KC_3
-#define UK_4 KC_4
-#define UK_5 KC_5
-#define UK_6 KC_6
-#define UK_7 KC_7
-#define UK_8 KC_8
-#define UK_9 KC_9
-#define UK_0 KC_0
-
-#define UK_F1 KC_F1
-#define UK_F2 KC_F2
-#define UK_F3 KC_F3
-#define UK_F4 KC_F4
-#define UK_F5 KC_F5
-#define UK_F6 KC_F6
-#define UK_F7 KC_F7
-#define UK_F8 KC_F8
-#define UK_F9 KC_F9
-#define UK_F10 KC_F10
-#define UK_F11 KC_F11
-#define UK_F12 KC_F12
-#define UK_F13 KC_F13
-#define UK_F14 KC_F14
-#define UK_F15 KC_F15
-#define UK_F16 KC_F16
-#define UK_F17 KC_F17
-#define UK_F18 KC_F18
-#define UK_F19 KC_F19
-#define UK_F20 KC_F20
-#define UK_F21 KC_F21
-#define UK_F22 KC_F22
-#define UK_F23 KC_F23
-#define UK_F24 KC_F24
-
-#define UK_SCLN KC_SCLN
-#define UK_COMM KC_COMM
-#define UK_DOT KC_DOT
-#define UK_SLSH KC_SLSH
-#define UK_EXLM KC_EXLM
-#define UK_UNDS KC_UNDS
-#define UK_MINS KC_MINS
-#define UK_LCBR KC_LCBR
-#define UK_RCBR KC_RCBR
-#define UK_DLR KC_DLR
-#define UK_PERC KC_PERC
-#define UK_PLUS KC_PLUS
-#define UK_EQL KC_EQL
-#define UK_LPRN KC_LPRN
-#define UK_RPRN KC_RPRN
-#define UK_CIRC KC_CIRC
-#define UK_AMPR KC_AMPR
-#define UK_LABK KC_LABK
-#define UK_LBRC KC_LBRC
-#define UK_RBRC KC_RBRC
-#define UK_RABK KC_RABK
-#define UK_GRV KC_GRV
-#define UK_ASTR KC_ASTR
-#define UK_QUOT KC_QUOT
-
-#define UK_P1 KC_P1
-#define UK_P2 KC_P2
-#define UK_P3 KC_P3
-#define UK_P4 KC_P4
-#define UK_P5 KC_P5
-#define UK_P6 KC_P6
-#define UK_P7 KC_P7
-#define UK_P8 KC_P8
-#define UK_P9 KC_P9
-#define UK_P0 KC_P0
-#define UK_PDOT KC_PDOT
-#define UK_PCMM KC_PCMM
+// DEPRECATED
+#define UK_ESC KC_ESC
+#define UK_F1 KC_F1
+#define UK_F2 KC_F2
+#define UK_F3 KC_F3
+#define UK_F4 KC_F4
+#define UK_F5 KC_F5
+#define UK_F6 KC_F6
+#define UK_F7 KC_F7
+#define UK_F8 KC_F8
+#define UK_F9 KC_F9
+#define UK_F10 KC_F10
+#define UK_F11 KC_F11
+#define UK_F12 KC_F12
+#define UK_PSCR KC_PSCR
+#define UK_SLCK KC_SLCK
+#define UK_PAUS KC_PAUS
+#define UK_BSPC KC_BSPC
+#define UK_TAB KC_TAB
+#define UK_ENT KC_ENT
+#define UK_LSFT KC_LSFT
+#define UK_RSFT KC_RSFT
+#define UK_LCTL KC_LCTL
+#define UK_LGUI KC_LGUI
+#define UK_LALT KC_LALT
+#define UK_SPC KC_SPC
+#define UK_RALT KC_RALT
+#define UK_RGUI KC_RGUI
+#define UK_RCTL KC_RCTL
+#define UK_INS KC_INS
+#define UK_DEL KC_DEL
+#define UK_HOME KC_HOME
+#define UK_END KC_END
+#define UK_PGUP KC_PGUP
+#define UK_PGDN KC_PGDN
+#define UK_UP KC_UP
+#define UK_LEFT KC_LEFT
+#define UK_DOWN KC_DOWN
+#define UK_RGHT KC_RGHT
#define UK_PSLS KC_PSLS
#define UK_PAST KC_PAST
#define UK_PMNS KC_PMNS
#define UK_PPLS KC_PPLS
-#define UK_PEQL KC_PEQL
#define UK_PENT KC_PENT
-
-#define UK_TAB KC_TAB
-#define UK_ENT KC_ENT
-#define UK_LSFT KC_LSFT
-#define UK_LCTL KC_LCTL
-#define UK_LALT KC_LALT
-#define UK_LGUI KC_LGUI
-#define UK_SPC KC_SPC
-#define UK_DEL KC_DEL
-#define UK_BSPC KC_BSPC
-#define UK_RSFT KC_RSFT
-#define UK_RCTL KC_RCTL
-#define UK_RALT KC_RALT
-#define UK_RGUI KC_RGUI
-#define UK_ESC KC_ESC
-#define UK_PSCR KC_PSCR
-#define UK_SLCK KC_SLCK
-#define UK_PAUS KC_PAUS
-#define UK_INS KC_INS
-#define UK_HOME KC_HOME
-#define UK_PGUP KC_PGUP
-#define UK_END KC_END
-#define UK_PGDN KC_PGDN
-#define UK_LEFT KC_LEFT
-#define UK_RGHT KC_RGHT
-#define UK_UP KC_UP
-#define UK_DOWN KC_DOWN
-
-#endif
+#define UK_P1 KC_P1
+#define UK_P2 KC_P2
+#define UK_P3 KC_P3
+#define UK_P4 KC_P4
+#define UK_P5 KC_P5
+#define UK_P6 KC_P6
+#define UK_P7 KC_P7
+#define UK_P8 KC_P8
+#define UK_P9 KC_P9
+#define UK_P0 KC_P0
+#define UK_PDOT KC_PDOT
+#define UK_PEQL KC_PEQL
+#define UK_PCMM KC_PCMM
+#define UK_F13 KC_F13
+#define UK_F14 KC_F14
+#define UK_F15 KC_F15
+#define UK_F16 KC_F16
+#define UK_F17 KC_F17
+#define UK_F18 KC_F18
+#define UK_F19 KC_F19
+#define UK_F20 KC_F20
+#define UK_F21 KC_F21
+#define UK_F22 KC_F22
+#define UK_F23 KC_F23
+#define UK_F24 KC_F24
+#define UK_EACT UK_EACU
+#define UK_UACT UK_UACU
+#define UK_IACT UK_IACU
+#define UK_OACT UK_OACU
+#define UK_AACT UK_OACU
diff --git a/quantum/keymap_extras/keymap_us_international.h b/quantum/keymap_extras/keymap_us_international.h
new file mode 100644
index 00000000000..f8e470216fb
--- /dev/null
+++ b/quantum/keymap_extras/keymap_us_international.h
@@ -0,0 +1,206 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define US_GRV KC_GRV // ` (dead)
+#define US_1 KC_1 // 1
+#define US_2 KC_2 // 2
+#define US_3 KC_3 // 3
+#define US_4 KC_4 // 4
+#define US_5 KC_5 // 5
+#define US_6 KC_6 // 6
+#define US_7 KC_7 // 7
+#define US_8 KC_8 // 8
+#define US_9 KC_9 // 9
+#define US_0 KC_0 // 0
+#define US_MINS KC_MINS // -
+#define US_EQL KC_EQL // =
+// Row 2
+#define US_Q KC_Q // Q
+#define US_W KC_W // W
+#define US_E KC_E // E
+#define US_R KC_R // R
+#define US_T KC_T // T
+#define US_Y KC_Y // Y
+#define US_U KC_U // U
+#define US_I KC_I // I
+#define US_O KC_O // O
+#define US_P KC_P // P
+#define US_LBRC KC_LBRC // [
+#define US_RBRC KC_LBRC // ]
+#define US_BSLS KC_BSLS // (backslash)
+// Row 3
+#define US_A KC_A // A
+#define US_S KC_S // S
+#define US_D KC_D // D
+#define US_F KC_F // F
+#define US_G KC_G // G
+#define US_H KC_H // H
+#define US_J KC_J // J
+#define US_K KC_K // K
+#define US_L KC_L // L
+#define US_SCLN KC_SCLN // ;
+#define US_QUOT KC_QUOT // ' (dead)
+// Row 4
+#define US_Z KC_Z // Z
+#define US_X KC_X // X
+#define US_C KC_C // C
+#define US_V KC_V // V
+#define US_B KC_B // B
+#define US_N KC_N // N
+#define US_M KC_M // M
+#define US_COMM KC_COMM // ,
+#define US_DOT KC_DOT // .
+#define US_SLSH KC_SLSH // /
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ { │ } │ | │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ : │ " │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ │ │ │ │ │ │ │ < │ > │ ? │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define US_TILD S(US_GRV) // ~ (dead)
+#define US_EXLM S(US_1) // !
+#define US_AT S(US_2) // "
+#define US_HASH S(US_3) // #
+#define US_DLR S(US_4) // $
+#define US_PERC S(US_5) // %
+#define US_CIRC S(US_6) // ^
+#define US_AMPR S(US_7) // &
+#define US_ASTR S(US_8) // *
+#define US_LPRN S(US_9) // (
+#define US_RPRN S(US_0) // )
+#define US_UNDS S(US_MINS) // _
+#define US_PLUS S(US_EQL) // +
+// Row 2
+#define US_LCBR S(US_LBRC) // {
+#define US_RCBR S(US_RBRC) // }
+#define US_PIPE S(US_BSLS) // |
+// Row 3
+#define US_COLN S(US_SCLN) // :
+#define US_DQUO S(US_QUOT) // " (dead)
+// Row 4
+#define US_LABK S(US_COMM) // <
+#define US_RABK S(US_DOT) // >
+#define US_QUES S(US_SLSH) // ?
+
+/* AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ ¡ │ ² │ ³ │ ¤ │ € │ ¼ │ ½ │ ¾ │ ‘ │ ’ │ ¥ │ × │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Ä │ Å │ É │ ® │ Þ │ Ü │ Ú │ Í │ Ó │ Ö │ « │ » │ ¬ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ Á │ ß │ Ð │ │ │ │ │ │ Ø │ ¶ │ ´ │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ Æ │ │ © │ │ │ Ñ │ µ │ Ç │ │ ¿ │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define US_IEXL ALGR(US_1) // ¡
+#define US_SUP2 ALGR(US_2) // ²
+#define US_SUP3 ALGR(US_3) // ³
+#define US_CURR ALGR(US_4) // ¤
+#define US_EURO ALGR(US_5) // €
+#define US_QRTR ALGR(US_6) // ¼
+#define US_HALF ALGR(US_7) // ½
+#define US_TQTR ALGR(US_8) // ¾
+#define US_LSQU ALGR(US_9) // ‘
+#define US_RSQU ALGR(US_0) // ’
+#define US_YEN ALGR(US_MINS) // ¥
+#define US_MUL ALGR(US_EQL) // ×
+// Row 2
+#define US_ADIA ALGR(US_Q) // Ä
+#define US_ARNG ALGR(US_W) // Å
+#define US_EACU ALGR(US_E) // É
+#define US_REGD ALGR(US_R) // ®
+#define US_THRN ALGR(US_T) // Þ
+#define US_UDIA ALGR(US_Y) // Ü
+#define US_UACU ALGR(US_U) // Ú
+#define US_IACU ALGR(US_I) // Í
+#define US_OACU ALGR(US_O) // Ó
+#define US_ODIA ALGR(US_P) // Ö
+#define US_LDAQ ALGR(US_LBRC) // «
+#define US_RDAQ ALGR(US_RBRC) // »
+#define US_NOT ALGR(US_BSLS) // ¬
+// Row 3
+#define US_AACU ALGR(US_A) // Á
+#define US_SS ALGR(US_S) // ß
+#define US_ETH ALGR(US_D) // Ð
+#define US_OSTR ALGR(US_L) // Ø
+#define US_PILC ALGR(US_SCLN) // ¶
+#define US_ACUT ALGR(US_QUOT) // ´
+// Row 4
+#define US_AE ALGR(US_Z) // Æ
+#define US_COPY ALGR(US_C) // ©
+#define US_NTIL ALGR(US_N) // Ñ
+#define US_MICR ALGR(US_M) // µ
+#define US_CCED ALGR(US_COMM) // Ç
+#define US_IQUE ALGR(US_SLSH) // ¿
+
+/* Shift+AltGr symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ │ ¹ │ │ │ £ │ │ │ │ │ │ │ │ ÷ │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │ │ ¦ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ │ § │ │ │ │ │ │ │ │ ° │ ¨ │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ │ │ ¢ │ │ │ │ │ │ │ │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define US_SUP1 S(ALGR(US_1)) // ¹
+#define US_PND S(ALGR(US_4)) // £
+#define US_DIV S(ALGR(US_EQL)) // ÷
+// Row 2
+#define US_BRKP S(ALGR(US_BSLS)) // ¦
+// Row 3
+#define US_SECT S(ALGR(US_S)) // §
+#define US_DEG S(ALGR(US_SCLN)) // °
+#define US_DIAE S(ALGR(US_QUOT)) // ¨
+// Row 4
+#define US_CENT S(ALGR(US_C)) // ¢
diff --git a/quantum/keymap_extras/keymap_workman_zxcvm.h b/quantum/keymap_extras/keymap_workman_zxcvm.h
new file mode 100644
index 00000000000..4ba2ada9e72
--- /dev/null
+++ b/quantum/keymap_extras/keymap_workman_zxcvm.h
@@ -0,0 +1,125 @@
+/* Copyright 2018 Jacob Jerrell
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "keymap.h"
+
+// clang-format off
+
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ Q │ D │ R │ W │ B │ J │ F │ U │ P │ ; │ [ │ ] │ \ │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ A │ S │ H │ T │ G │ Y │ N │ E │ O │ I │ ' │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ Z │ X │ C │ V │ M │ K │ L │ , │ . │ / │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define WK_GRV KC_GRV // `
+#define WK_1 KC_1 // 1
+#define WK_2 KC_2 // 2
+#define WK_3 KC_3 // 3
+#define WK_4 KC_4 // 4
+#define WK_5 KC_5 // 5
+#define WK_6 KC_6 // 6
+#define WK_7 KC_7 // 7
+#define WK_8 KC_8 // 8
+#define WK_9 KC_9 // 9
+#define WK_0 KC_0 // 0
+#define WK_MINS KC_MINS // -
+#define WK_EQL KC_EQL // =
+// Row 2
+#define WK_Q KC_Q // Q
+#define WK_D KC_W // D
+#define WK_R KC_E // R
+#define WK_W KC_R // W
+#define WK_B KC_T // B
+#define WK_J KC_Y // J
+#define WK_F KC_U // F
+#define WK_U KC_I // U
+#define WK_P KC_O // P
+#define WK_SCLN KC_P // ;
+#define WK_LBRC KC_LBRC // [
+#define WK_RBRC KC_RBRC // ]
+#define WK_BSLS KC_BSLS // (backslash)
+// Row 3
+#define WK_A KC_A // A
+#define WK_S KC_S // S
+#define WK_H KC_D // H
+#define WK_T KC_F // T
+#define WK_G KC_G // G
+#define WK_Y KC_H // Y
+#define WK_N KC_J // N
+#define WK_E KC_K // E
+#define WK_O KC_L // O
+#define WK_I KC_SCLN // I
+#define WK_QUOT KC_QUOT // '
+// Row 4
+#define WK_Z KC_Z // Z
+#define WK_X KC_X // X
+#define WK_C KC_C // C
+#define WK_V KC_V // V
+#define WK_M KC_B // M
+#define WK_K KC_N // K
+#define WK_L KC_M // L
+#define WK_COMM KC_COMM // ,
+#define WK_DOT KC_DOT // .
+#define WK_SLSH KC_SLSH // /
+
+/* Shifted symbols
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
+ * │ ~ │ ! │ @ │ # │ $ │ % │ ^ │ & │ * │ ( │ ) │ _ │ + │ │
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ : │ { │ } │ | │
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ " │ │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤
+ * │ │ │ │ │ │ │ │ │ < │ > │ ? │ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤
+ * │ │ │ │ │ │ │ │ │
+ * └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘
+ */
+// Row 1
+#define WK_TILD S(WK_GRV) // ~
+#define WK_EXLM S(WK_1) // !
+#define WK_AT S(WK_2) // @
+#define WK_HASH S(WK_3) // #
+#define WK_DLR S(WK_4) // $
+#define WK_PERC S(WK_5) // %
+#define WK_CIRC S(WK_6) // ^
+#define WK_AMPR S(WK_7) // &
+#define WK_ASTR S(WK_8) // *
+#define WK_LPRN S(WK_9) // (
+#define WK_RPRN S(WK_0) // )
+#define WK_UNDS S(WK_MINS) // _
+#define WK_PLUS S(WK_EQL) // +
+// Row 2
+#define WK_COLN S(WK_SCLN) // :
+#define WK_LCBR S(WK_LBRC) // {
+#define WK_RCBR S(WK_RBRC) // }
+#define WK_PIPE S(WK_BSLS) // |
+// Row 3
+#define WK_DQUO S(WK_QUOT) // "
+// Row 4
+#define WK_LABK S(WK_COMM) // <
+#define WK_RABK S(WK_DOT) // >
+#define WK_QUES S(WK_SLSH) // ?
diff --git a/quantum/keymap_extras/sendstring_bepo.h b/quantum/keymap_extras/sendstring_bepo.h
index f0cc88bd223..8119cd9f540 100644
--- a/quantum/keymap_extras/sendstring_bepo.h
+++ b/quantum/keymap_extras/sendstring_bepo.h
@@ -40,7 +40,7 @@ const uint8_t ascii_to_shift_lut[16] PROGMEM = {
KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
- KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
};
const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
@@ -60,7 +60,7 @@ const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
- KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
};
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
@@ -74,13 +74,13 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
// ! " # $ % & '
- KC_SPC, BP_DCRC, BP_DQOT, BP_DLR, BP_DLR, BP_PERC, BP_P, BP_APOS,
+ KC_SPC, BP_DCIR, BP_DQUO, BP_DLR, BP_DLR, BP_PERC, BP_P, BP_QUOT,
// ( ) * + , - . /
BP_LPRN, BP_RPRN, BP_ASTR, BP_PLUS, BP_COMM, BP_MINS, BP_DOT, BP_SLSH,
// 0 1 2 3 4 5 6 7
- BP_ASTR, BP_DQOT, BP_LGIL, BP_RGIL, BP_LPRN, BP_RPRN, BP_AT, BP_PLUS,
+ BP_ASTR, BP_DQUO, BP_LDAQ, BP_RDAQ, BP_LPRN, BP_RPRN, BP_AT, BP_PLUS,
// 8 9 : ; < = > ?
- BP_MINS, BP_SLSH, BP_DOT, BP_COMM, BP_LGIL, BP_EQL, BP_RGIL, BP_APOS,
+ BP_MINS, BP_SLSH, BP_DOT, BP_COMM, BP_LDAQ, BP_EQL, BP_RDAQ, BP_QUOT,
// @ A B C D E F G
BP_AT, BP_A, BP_B, BP_C, BP_D, BP_E, BP_F, BP_G,
// H I J K L M N O
diff --git a/quantum/keymap_extras/sendstring_canadian_multilingual.h b/quantum/keymap_extras/sendstring_canadian_multilingual.h
new file mode 100644
index 00000000000..c3fcc62c377
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_canadian_multilingual.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Canadian Multilingual layouts
+
+#pragma once
+
+#include "keymap_canadian_multilingual.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 1, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 1, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, CA_1, CA_DOT, CA_3, CA_4, CA_5, CA_7, CA_COMM,
+ // ( ) * + , - . /
+ CA_9, CA_0, CA_8, CA_EQL, CA_COMM, CA_MINS, CA_DOT, CA_SLSH,
+ // 0 1 2 3 4 5 6 7
+ CA_0, CA_1, CA_2, CA_3, CA_4, CA_5, CA_6, CA_7,
+ // 8 9 : ; < = > ?
+ CA_8, CA_9, CA_SCLN, CA_SCLN, CA_DOT, CA_EQL, CA_COMM, CA_6,
+ // @ A B C D E F G
+ CA_2, CA_A, CA_B, CA_C, CA_D, CA_E, CA_F, CA_G,
+ // H I J K L M N O
+ CA_H, CA_I, CA_J, CA_K, CA_L, CA_M, CA_N, CA_O,
+ // P Q R S T U V W
+ CA_P, CA_Q, CA_R, CA_S, CA_T, CA_U, CA_V, CA_W,
+ // X Y Z [ \ ] ^ _
+ CA_X, CA_Y, CA_Z, CA_9, CA_SLSH, CA_0, CA_CIRC, CA_MINS,
+ // ` a b c d e f g
+ CA_CIRC, CA_A, CA_B, CA_C, CA_D, CA_E, CA_F, CA_G,
+ // h i j k l m n o
+ CA_H, CA_I, CA_J, CA_K, CA_L, CA_M, CA_N, CA_O,
+ // p q r s t u v w
+ CA_P, CA_Q, CA_R, CA_S, CA_T, CA_U, CA_V, CA_W,
+ // x y z { | } ~ DEL
+ CA_X, CA_Y, CA_Z, CA_7, CA_SLSH, CA_8, CA_CCED, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_croatian.h b/quantum/keymap_extras/sendstring_croatian.h
new file mode 100644
index 00000000000..67f75992aea
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_croatian.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Croatian layouts
+
+#pragma once
+
+#include "keymap_croatian.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 1, 1, 0, 1, 1, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, HR_1, HR_2, HR_3, HR_4, HR_5, HR_6, HR_QUOT,
+ // ( ) * + , - . /
+ HR_8, HR_9, HR_PLUS, HR_PLUS, HR_COMM, HR_MINS, HR_DOT, HR_7,
+ // 0 1 2 3 4 5 6 7
+ HR_0, HR_1, HR_2, HR_3, HR_4, HR_5, HR_6, HR_7,
+ // 8 9 : ; < = > ?
+ HR_8, HR_9, HR_DOT, HR_COMM, HR_LABK, HR_0, HR_LABK, HR_QUOT,
+ // @ A B C D E F G
+ HR_V, HR_A, HR_B, HR_C, HR_D, HR_E, HR_F, HR_G,
+ // H I J K L M N O
+ HR_H, HR_I, HR_J, HR_K, HR_L, HR_M, HR_N, HR_O,
+ // P Q R S T U V W
+ HR_P, HR_Q, HR_R, HR_S, HR_T, HR_U, HR_V, HR_W,
+ // X Y Z [ \ ] ^ _
+ HR_X, HR_Y, HR_Z, HR_F, HR_Q, HR_G, HR_3, HR_MINS,
+ // ` a b c d e f g
+ HR_7, HR_A, HR_B, HR_C, HR_D, HR_E, HR_F, HR_G,
+ // h i j k l m n o
+ HR_H, HR_I, HR_J, HR_K, HR_L, HR_M, HR_N, HR_O,
+ // p q r s t u v w
+ HR_P, HR_Q, HR_R, HR_S, HR_T, HR_U, HR_V, HR_W,
+ // x y z { | } ~ DEL
+ HR_X, HR_Y, HR_Z, HR_B, HR_W, HR_N, HR_1, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_czech.h b/quantum/keymap_extras/sendstring_czech.h
new file mode 100644
index 00000000000..94879dfd4ec
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_czech.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Czech layouts
+
+#pragma once
+
+#include "keymap_czech.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 0, 0, 1, 0, 1),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 0, 1, 0),
+ KCLUT_ENTRY(0, 0, 1, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 1, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 1, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 1, 0),
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, CZ_SECT, CZ_URNG, CZ_X, CZ_URNG, CZ_EQL, CZ_C, CZ_DIAE,
+ // ( ) * + , - . /
+ CZ_LPRN, CZ_LPRN, CZ_MINS, CZ_PLUS, CZ_COMM, CZ_MINS, CZ_DOT, CZ_UACU,
+ // 0 1 2 3 4 5 6 7
+ CZ_EACU, CZ_PLUS, CZ_ECAR, CZ_SCAR, CZ_CCAR, CZ_RCAR, CZ_ZCAR, CZ_YACU,
+ // 8 9 : ; < = > ?
+ CZ_AACU, CZ_IACU, CZ_DOT, CZ_SCLN, CZ_COMM, CZ_EQL, CZ_DOT, CZ_COMM,
+ // @ A B C D E F G
+ CZ_V, CZ_A, CZ_B, CZ_C, CZ_D, CZ_E, CZ_F, CZ_G,
+ // H I J K L M N O
+ CZ_H, CZ_I, CZ_J, CZ_K, CZ_L, CZ_M, CZ_N, CZ_O,
+ // P Q R S T U V W
+ CZ_P, CZ_Q, CZ_R, CZ_S, CZ_T, CZ_U, CZ_V, CZ_W,
+ // X Y Z [ \ ] ^ _
+ CZ_X, CZ_Y, CZ_Z, CZ_F, CZ_BSLS, CZ_G, CZ_SCAR, CZ_MINS,
+ // ` a b c d e f g
+ CZ_YACU, CZ_A, CZ_B, CZ_C, CZ_D, CZ_E, CZ_F, CZ_G,
+ // h i j k l m n o
+ CZ_H, CZ_I, CZ_J, CZ_K, CZ_L, CZ_M, CZ_N, CZ_O,
+ // p q r s t u v w
+ CZ_P, CZ_Q, CZ_R, CZ_S, CZ_T, CZ_U, CZ_V, CZ_W,
+ // x y z { | } ~ DEL
+ CZ_X, CZ_Y, CZ_Z, CZ_B, CZ_BSLS, CZ_N, CZ_PLUS, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_danish.h b/quantum/keymap_extras/sendstring_danish.h
index 43b6a56cf85..0ec5b108a57 100644
--- a/quantum/keymap_extras/sendstring_danish.h
+++ b/quantum/keymap_extras/sendstring_danish.h
@@ -40,7 +40,7 @@ const uint8_t ascii_to_shift_lut[16] PROGMEM = {
KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
- KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
};
const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
@@ -60,7 +60,7 @@ const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
- KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
};
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
diff --git a/quantum/keymap_extras/sendstring_dvp.h b/quantum/keymap_extras/sendstring_dvp.h
new file mode 100644
index 00000000000..74b595524da
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_dvp.h
@@ -0,0 +1,80 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Programmer Dvorak layouts
+
+#pragma once
+
+#include "keymap_dvp.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 1, 0, 0, 1, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 1, 0, 1, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 1, 1),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, DP_EXLM, DP_QUOT, DP_HASH, DP_DLR, DP_AMPR, DP_AMPR, DP_QUOT,
+ // ( ) * + , - . /
+ DP_LPRN, DP_RPRN, DP_ASTR, DP_PLUS, DP_COMM, DP_MINS, DP_DOT, DP_SLSH,
+ // 0 1 2 3 4 5 6 7
+ DP_ASTR, DP_LPRN, DP_RPRN, DP_RCBR, DP_PLUS, DP_LCBR, DP_RBRC, DP_LBRC,
+ // 8 9 : ; < = > ?
+ DP_EXLM, DP_EQL, DP_SCLN, DP_SCLN, DP_COMM, DP_EQL, DP_DOT, DP_SLSH,
+ // @ A B C D E F G
+ DP_AT, DP_A, DP_B, DP_C, DP_D, DP_E, DP_F, DP_G,
+ // H I J K L M N O
+ DP_H, DP_I, DP_J, DP_K, DP_L, DP_M, DP_N, DP_O,
+ // P Q R S T U V W
+ DP_P, DP_Q, DP_R, DP_S, DP_T, DP_U, DP_V, DP_W,
+ // X Y Z [ \ ] ^ _
+ DP_X, DP_Y, DP_Z, DP_LBRC, DP_BSLS, DP_RBRC, DP_AT, DP_MINS,
+ // ` a b c d e f g
+ DP_HASH, DP_A, DP_B, DP_C, DP_D, DP_E, DP_F, DP_G,
+ // h i j k l m n o
+ DP_H, DP_I, DP_J, DP_K, DP_L, DP_M, DP_N, DP_O,
+ // p q r s t u v w
+ DP_P, DP_Q, DP_R, DP_S, DP_T, DP_U, DP_V, DP_W,
+ // x y z { | } ~ DEL
+ DP_X, DP_Y, DP_Z, DP_LCBR, DP_BSLS, DP_RCBR, DP_DLR, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_estonian.h b/quantum/keymap_extras/sendstring_estonian.h
new file mode 100644
index 00000000000..24d853fb596
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_estonian.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Estonian layouts
+
+#pragma once
+
+#include "keymap_estonian.h"
+#include "quantum"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 1, 0, 1, 1, 0),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 1, 1, 0, 1, 1, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, EE_1, EE_2, EE_3, EE_4, EE_5, EE_6, EE_QUOT,
+ // ( ) * + , - . /
+ EE_8, EE_9, EE_QUOT, EE_PLUS, EE_COMM, EE_MINS, EE_DOT, EE_7,
+ // 0 1 2 3 4 5 6 7
+ EE_0, EE_1, EE_2, EE_3, EE_4, EE_5, EE_6, EE_7,
+ // 8 9 : ; < = > ?
+ EE_8, EE_9, EE_DOT, EE_COMM, EE_LABK, EE_0, EE_LABK, EE_PLUS,
+ // @ A B C D E F G
+ EE_2, EE_A, EE_B, EE_C, EE_D, EE_E, EE_F, EE_G,
+ // H I J K L M N O
+ EE_H, EE_I, EE_J, EE_K, EE_L, EE_M, EE_N, EE_O,
+ // P Q R S T U V W
+ EE_P, EE_Q, EE_R, EE_S, EE_T, EE_U, EE_V, EE_W,
+ // X Y Z [ \ ] ^ _
+ EE_X, EE_Y, EE_Z, EE_8, EE_PLUS, EE_9, EE_ADIA, EE_MINS,
+ // ` a b c d e f g
+ EE_ACUT, EE_A, EE_B, EE_C, EE_D, EE_E, EE_F, EE_G,
+ // h i j k l m n o
+ EE_H, EE_I, EE_J, EE_K, EE_L, EE_M, EE_N, EE_O,
+ // p q r s t u v w
+ EE_P, EE_Q, EE_R, EE_S, EE_T, EE_U, EE_V, EE_W,
+ // x y z { | } ~ DEL
+ EE_X, EE_Y, EE_Z, EE_7, EE_LABK, EE_0, EE_CARN, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_finnish.h b/quantum/keymap_extras/sendstring_finnish.h
new file mode 100644
index 00000000000..cf23483843f
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_finnish.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Finnish layouts
+
+#pragma once
+
+#include "keymap_finnish.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 1, 0, 1, 1, 0),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 1, 1, 0, 1, 1, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 1, 1),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, FI_1, FI_2, FI_3, FI_4, FI_5, FI_6, FI_QUOT,
+ // ( ) * + , - . /
+ FI_8, FI_9, FI_QUOT, FI_PLUS, FI_COMM, FI_MINS, FI_DOT, FI_7,
+ // 0 1 2 3 4 5 6 7
+ FI_0, FI_1, FI_2, FI_3, FI_4, FI_5, FI_6, FI_7,
+ // 8 9 : ; < = > ?
+ FI_8, FI_9, FI_DOT, FI_COMM, FI_LABK, FI_0, FI_LABK, FI_PLUS,
+ // @ A B C D E F G
+ FI_2, FI_A, FI_B, FI_C, FI_D, FI_E, FI_F, FI_G,
+ // H I J K L M N O
+ FI_H, FI_I, FI_J, FI_K, FI_L, FI_M, FI_N, FI_O,
+ // P Q R S T U V W
+ FI_P, FI_Q, FI_R, FI_S, FI_T, FI_U, FI_V, FI_W,
+ // X Y Z [ \ ] ^ _
+ FI_X, FI_Y, FI_Z, FI_8, FI_PLUS, FI_9, FI_DIAE, FI_MINS,
+ // ` a b c d e f g
+ FI_ACUT, FI_A, FI_B, FI_C, FI_D, FI_E, FI_F, FI_G,
+ // h i j k l m n o
+ FI_H, FI_I, FI_J, FI_K, FI_L, FI_M, FI_N, FI_O,
+ // p q r s t u v w
+ FI_P, FI_Q, FI_R, FI_S, FI_T, FI_U, FI_V, FI_W,
+ // x y z { | } ~ DEL
+ FI_X, FI_Y, FI_Z, FI_7, FI_LABK, FI_0, FI_DIAE, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_fr_ch.h b/quantum/keymap_extras/sendstring_fr_ch.h
new file mode 100644
index 00000000000..2acce5663b6
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_fr_ch.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Swiss French layouts
+
+#pragma once
+
+#include "keymap_fr_ch.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 0, 0, 1, 1, 0),
+ KCLUT_ENTRY(1, 1, 1, 1, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 1, 1, 0, 1, 1, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, CH_DIAE, CH_2, CH_3, CH_DLR, CH_5, CH_6, CH_QUOT,
+ // ( ) * + , - . /
+ CH_8, CH_9, CH_3, CH_0, CH_COMM, CH_MINS, CH_DOT, CH_7,
+ // 0 1 2 3 4 5 6 7
+ CH_0, CH_1, CH_2, CH_3, CH_4, CH_5, CH_6, CH_7,
+ // 8 9 : ; < = > ?
+ CH_8, CH_9, CH_DOT, CH_COMM, CH_LABK, CH_0, CH_LABK, CH_QUOT,
+ // @ A B C D E F G
+ CH_2, CH_A, CH_B, CH_C, CH_D, CH_E, CH_F, CH_G,
+ // H I J K L M N O
+ CH_H, CH_I, CH_J, CH_K, CH_L, CH_M, CH_N, CH_O,
+ // P Q R S T U V W
+ CH_P, CH_Q, CH_R, CH_S, CH_T, CH_U, CH_V, CH_W,
+ // X Y Z [ \ ] ^ _
+ CH_X, CH_Y, CH_Z, CH_EGRV, CH_LABK, CH_DIAE, CH_CIRC, CH_MINS,
+ // ` a b c d e f g
+ CH_CIRC, CH_A, CH_B, CH_C, CH_D, CH_E, CH_F, CH_G,
+ // h i j k l m n o
+ CH_H, CH_I, CH_J, CH_K, CH_L, CH_M, CH_N, CH_O,
+ // p q r s t u v w
+ CH_P, CH_Q, CH_R, CH_S, CH_T, CH_U, CH_V, CH_W,
+ // x y z { | } ~ DEL
+ CH_X, CH_Y, CH_Z, CH_AGRV, CH_7, CH_DLR, CH_CIRC, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_french.h b/quantum/keymap_extras/sendstring_french.h
index a02f114b4ea..17ea3ed4545 100644
--- a/quantum/keymap_extras/sendstring_french.h
+++ b/quantum/keymap_extras/sendstring_french.h
@@ -74,7 +74,7 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
// ! " # $ % & '
- KC_SPC, FR_EXLM, FR_QUOT, FR_DQUO, FR_DLR, FR_UGRV, FR_AMP, FR_QUOT,
+ KC_SPC, FR_EXLM, FR_QUOT, FR_DQUO, FR_DLR, FR_UGRV, FR_AMPR, FR_QUOT,
// ( ) * + , - . /
FR_LPRN, FR_RPRN, FR_ASTR, FR_EQL, FR_COMM, FR_MINS, FR_SCLN, FR_COLN,
// 0 1 2 3 4 5 6 7
diff --git a/quantum/keymap_extras/sendstring_french_osx.h b/quantum/keymap_extras/sendstring_french_osx.h
new file mode 100644
index 00000000000..6cadbac1532
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_french_osx.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for macOS French (AZERTY) layouts
+
+#pragma once
+
+#include "keymap_french_osx.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 0, 0),
+ KCLUT_ENTRY(0, 0, 1, 1, 0, 0, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 0, 0, 0, 0, 1, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, FR_EXLM, FR_DQUO, FR_AT, FR_DLR, FR_LUGR, FR_AMPR, FR_QUOT,
+ // ( ) * + , - . /
+ FR_LPRN, FR_RPRN, FR_DLR, FR_EQL, FR_COMM, FR_MINS, FR_SCLN, FR_COLN,
+ // 0 1 2 3 4 5 6 7
+ FR_LAGR, FR_AMPR, FR_LEAC, FR_DQUO, FR_QUOT, FR_LPRN, FR_SECT, FR_LEGR,
+ // 8 9 : ; < = > ?
+ FR_EXLM, FR_LCCE, FR_COLN, FR_SCLN, FR_LABK, FR_EQL, FR_LABK, FR_COMM,
+ // @ A B C D E F G
+ FR_AT, FR_A, FR_B, FR_C, FR_D, FR_E, FR_F, FR_G,
+ // H I J K L M N O
+ FR_H, FR_I, FR_J, FR_K, FR_L, FR_M, FR_N, FR_O,
+ // P Q R S T U V W
+ FR_P, FR_Q, FR_R, FR_S, FR_T, FR_U, FR_V, FR_W,
+ // X Y Z [ \ ] ^ _
+ FR_X, FR_Y, FR_Z, FR_LPRN, FR_COLN, FR_RPRN, FR_CIRC, FR_MINS,
+ // ` a b c d e f g
+ FR_GRV, FR_A, FR_B, FR_C, FR_D, FR_E, FR_F, FR_G,
+ // h i j k l m n o
+ FR_H, FR_I, FR_J, FR_K, FR_L, FR_M, FR_N, FR_O,
+ // p q r s t u v w
+ FR_P, FR_Q, FR_R, FR_S, FR_T, FR_U, FR_V, FR_W,
+ // x y z { | } ~ DEL
+ FR_X, FR_Y, FR_Z, FR_LPRN, FR_L, FR_RPRN, FR_N, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_german_ch.h b/quantum/keymap_extras/sendstring_german_ch.h
new file mode 100644
index 00000000000..1e1327c511d
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_german_ch.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Swiss German layouts
+
+#pragma once
+
+#include "keymap_german_ch.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 0, 0, 1, 1, 0),
+ KCLUT_ENTRY(1, 1, 1, 1, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 1, 1, 0, 1, 1, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, CH_DIAE, CH_2, CH_3, CH_DLR, CH_5, CH_6, CH_QUOT,
+ // ( ) * + , - . /
+ CH_8, CH_9, CH_3, CH_1, CH_COMM, CH_MINS, CH_DOT, CH_7,
+ // 0 1 2 3 4 5 6 7
+ CH_0, CH_1, CH_2, CH_3, CH_4, CH_5, CH_6, CH_7,
+ // 8 9 : ; < = > ?
+ CH_8, CH_9, CH_DOT, CH_COMM, CH_LABK, CH_0, CH_LABK, CH_QUOT,
+ // @ A B C D E F G
+ CH_2, CH_A, CH_B, CH_C, CH_D, CH_E, CH_F, CH_G,
+ // H I J K L M N O
+ CH_H, CH_I, CH_J, CH_K, CH_L, CH_M, CH_N, CH_O,
+ // P Q R S T U V W
+ CH_P, CH_Q, CH_R, CH_S, CH_T, CH_U, CH_V, CH_W,
+ // X Y Z [ \ ] ^ _
+ CH_X, CH_Y, CH_Z, CH_UDIA, CH_LABK, CH_DIAE, CH_CIRC, CH_MINS,
+ // ` a b c d e f g
+ CH_CIRC, CH_A, CH_B, CH_C, CH_D, CH_E, CH_F, CH_G,
+ // h i j k l m n o
+ CH_H, CH_I, CH_J, CH_K, CH_L, CH_M, CH_N, CH_O,
+ // p q r s t u v w
+ CH_P, CH_Q, CH_R, CH_S, CH_T, CH_U, CH_V, CH_W,
+ // x y z { | } ~ DEL
+ CH_X, CH_Y, CH_Z, CH_ADIA, CH_7, CH_DLR, CH_CIRC, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_german_osx.h b/quantum/keymap_extras/sendstring_german_osx.h
new file mode 100644
index 00000000000..03f54da2afa
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_german_osx.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for macOS German layouts
+
+#pragma once
+
+#include "keymap_german_osx.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 0, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 1, 1, 0, 1, 1, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 1, 0, 0, 1),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, DE_1, DE_2, DE_HASH, DE_4, DE_5, DE_6, DE_HASH,
+ // ( ) * + , - . /
+ DE_8, DE_9, DE_PLUS, DE_PLUS, DE_COMM, DE_MINS, DE_DOT, DE_7,
+ // 0 1 2 3 4 5 6 7
+ DE_0, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7,
+ // 8 9 : ; < = > ?
+ DE_8, DE_9, DE_DOT, DE_COMM, DE_LABK, DE_0, DE_LABK, DE_SS,
+ // @ A B C D E F G
+ DE_L, DE_A, DE_B, DE_C, DE_D, DE_E, DE_F, DE_G,
+ // H I J K L M N O
+ DE_H, DE_I, DE_J, DE_K, DE_L, DE_M, DE_N, DE_O,
+ // P Q R S T U V W
+ DE_P, DE_Q, DE_R, DE_S, DE_T, DE_U, DE_V, DE_W,
+ // X Y Z [ \ ] ^ _
+ DE_X, DE_Y, DE_Z, DE_5, DE_7, DE_6, DE_CIRC, DE_MINS,
+ // ` a b c d e f g
+ DE_ACUT, DE_A, DE_B, DE_C, DE_D, DE_E, DE_F, DE_G,
+ // h i j k l m n o
+ DE_H, DE_I, DE_J, DE_K, DE_L, DE_M, DE_N, DE_O,
+ // p q r s t u v w
+ DE_P, DE_Q, DE_R, DE_S, DE_T, DE_U, DE_V, DE_W,
+ // x y z { | } ~ DEL
+ DE_X, DE_Y, DE_Z, DE_8, DE_7, DE_9, DE_N, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_icelandic.h b/quantum/keymap_extras/sendstring_icelandic.h
new file mode 100644
index 00000000000..867eb8743c8
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_icelandic.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Icelandic layouts
+
+#pragma once
+
+#include "keymap_icelandic.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 1, 1, 0, 1, 1, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, IS_1, IS_2, IS_3, IS_4, IS_5, IS_6, IS_QUOT,
+ // ( ) * + , - . /
+ IS_8, IS_9, IS_PLUS, IS_PLUS, IS_COMM, IS_MINS, IS_DOT, IS_7,
+ // 0 1 2 3 4 5 6 7
+ IS_0, IS_1, IS_2, IS_3, IS_4, IS_5, IS_6, IS_7,
+ // 8 9 : ; < = > ?
+ IS_8, IS_9, IS_DOT, IS_COMM, IS_LABK, IS_0, IS_LABK, IS_QUOT,
+ // @ A B C D E F G
+ IS_Q, IS_A, IS_B, IS_C, IS_D, IS_E, IS_F, IS_G,
+ // H I J K L M N O
+ IS_H, IS_I, IS_J, IS_K, IS_L, IS_M, IS_N, IS_O,
+ // P Q R S T U V W
+ IS_P, IS_Q, IS_R, IS_S, IS_T, IS_U, IS_V, IS_W,
+ // X Y Z [ \ ] ^ _
+ IS_X, IS_Y, IS_Z, IS_8, IS_ODIA, IS_9, IS_ACUT, IS_MINS,
+ // ` a b c d e f g
+ IS_PLUS, IS_A, IS_B, IS_C, IS_D, IS_E, IS_F, IS_G,
+ // h i j k l m n o
+ IS_H, IS_I, IS_J, IS_K, IS_L, IS_M, IS_N, IS_O,
+ // p q r s t u v w
+ IS_P, IS_Q, IS_R, IS_S, IS_T, IS_U, IS_V, IS_W,
+ // x y z { | } ~ DEL
+ IS_X, IS_Y, IS_Z, IS_7, IS_LABK, IS_0, IS_QUOT, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_italian_osx_ansi.h b/quantum/keymap_extras/sendstring_italian_osx_ansi.h
new file mode 100644
index 00000000000..c61874015f5
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_italian_osx_ansi.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for macOS Italian ANSI layouts
+
+#pragma once
+
+#include "keymap_italian_osx_ansi.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 0, 1, 1, 1, 0),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 1, 1, 0, 1, 1, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 1, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, IT_1, IT_2, IT_AGRV, IT_4, IT_5, IT_6, IT_QUOT,
+ // ( ) * + , - . /
+ IT_8, IT_9, IT_PLUS, IT_PLUS, IT_COMM, IT_MINS, IT_DOT, IT_7,
+ // 0 1 2 3 4 5 6 7
+ IT_0, IT_1, IT_2, IT_3, IT_4, IT_5, IT_6, IT_7,
+ // 8 9 : ; < = > ?
+ IT_8, IT_9, IT_DOT, IT_COMM, IT_LABK, IT_0, IT_LABK, IT_QUOT,
+ // @ A B C D E F G
+ IT_OGRV, IT_A, IT_B, IT_C, IT_D, IT_E, IT_F, IT_G,
+ // H I J K L M N O
+ IT_H, IT_I, IT_J, IT_K, IT_L, IT_M, IT_N, IT_O,
+ // P Q R S T U V W
+ IT_P, IT_Q, IT_R, IT_S, IT_T, IT_U, IT_V, IT_W,
+ // X Y Z [ \ ] ^ _
+ IT_X, IT_Y, IT_Z, IT_EGRV, IT_BSLS, IT_PLUS, IT_IGRV, IT_MINS,
+ // ` a b c d e f g
+ IT_BSLS, IT_A, IT_B, IT_C, IT_D, IT_E, IT_F, IT_G,
+ // h i j k l m n o
+ IT_H, IT_I, IT_J, IT_K, IT_L, IT_M, IT_N, IT_O,
+ // p q r s t u v w
+ IT_P, IT_Q, IT_R, IT_S, IT_T, IT_U, IT_V, IT_W,
+ // x y z { | } ~ DEL
+ IT_X, IT_Y, IT_Z, IT_EGRV, IT_BSLS, IT_PLUS, IT_5, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_italian_osx_iso.h b/quantum/keymap_extras/sendstring_italian_osx_iso.h
new file mode 100644
index 00000000000..eb5853b0069
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_italian_osx_iso.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for macOS Italian ISO layouts
+
+#pragma once
+
+#include "keymap_italian_osx_iso.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 0, 1, 1, 1, 0),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 1, 1, 0, 1, 1, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 1, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, IT_1, IT_2, IT_AGRV, IT_4, IT_5, IT_6, IT_QUOT,
+ // ( ) * + , - . /
+ IT_8, IT_9, IT_PLUS, IT_PLUS, IT_COMM, IT_MINS, IT_DOT, IT_7,
+ // 0 1 2 3 4 5 6 7
+ IT_0, IT_1, IT_2, IT_3, IT_4, IT_5, IT_6, IT_7,
+ // 8 9 : ; < = > ?
+ IT_8, IT_9, IT_DOT, IT_COMM, IT_LABK, IT_0, IT_LABK, IT_QUOT,
+ // @ A B C D E F G
+ IT_OGRV, IT_A, IT_B, IT_C, IT_D, IT_E, IT_F, IT_G,
+ // H I J K L M N O
+ IT_H, IT_I, IT_J, IT_K, IT_L, IT_M, IT_N, IT_O,
+ // P Q R S T U V W
+ IT_P, IT_Q, IT_R, IT_S, IT_T, IT_U, IT_V, IT_W,
+ // X Y Z [ \ ] ^ _
+ IT_X, IT_Y, IT_Z, IT_EGRV, IT_BSLS, IT_PLUS, IT_IGRV, IT_MINS,
+ // ` a b c d e f g
+ IT_BSLS, IT_A, IT_B, IT_C, IT_D, IT_E, IT_F, IT_G,
+ // h i j k l m n o
+ IT_H, IT_I, IT_J, IT_K, IT_L, IT_M, IT_N, IT_O,
+ // p q r s t u v w
+ IT_P, IT_Q, IT_R, IT_S, IT_T, IT_U, IT_V, IT_W,
+ // x y z { | } ~ DEL
+ IT_X, IT_Y, IT_Z, IT_EGRV, IT_BSLS, IT_PLUS, IT_5, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_jis.h b/quantum/keymap_extras/sendstring_jis.h
index 8b0dc99561c..58335ad41d0 100644
--- a/quantum/keymap_extras/sendstring_jis.h
+++ b/quantum/keymap_extras/sendstring_jis.h
@@ -40,7 +40,7 @@ const uint8_t ascii_to_shift_lut[16] PROGMEM = {
KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
- KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
};
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
diff --git a/quantum/keymap_extras/sendstring_latvian.h b/quantum/keymap_extras/sendstring_latvian.h
new file mode 100644
index 00000000000..61f788693ce
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_latvian.h
@@ -0,0 +1,59 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Latvian layouts
+
+#pragma once
+
+#include "keymap_latvian.h"
+
+// clang-format off
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, LV_1, LV_QUOT, LV_3, LV_4, LV_5, LV_7, LV_QUOT,
+ // ( ) * + , - . /
+ LV_9, LV_0, LV_8, LV_EQL, LV_COMM, LV_MINS, LV_DOT, LV_SLSH,
+ // 0 1 2 3 4 5 6 7
+ LV_0, LV_1, LV_2, LV_3, LV_4, LV_5, LV_6, LV_7,
+ // 8 9 : ; < = > ?
+ LV_8, LV_9, LV_SCLN, LV_SCLN, LV_COMM, LV_EQL, LV_DOT, LV_SLSH,
+ // @ A B C D E F G
+ LV_2, LV_A, LV_B, LV_C, LV_D, LV_E, LV_F, LV_G,
+ // H I J K L M N O
+ LV_H, LV_I, LV_J, LV_K, LV_L, LV_M, LV_N, LV_O,
+ // P Q R S T U V W
+ LV_P, LV_Q, LV_R, LV_S, LV_T, LV_U, LV_V, LV_W,
+ // X Y Z [ \ ] ^ _
+ LV_X, LV_Y, LV_Z, LV_LBRC, LV_BSLS, LV_RBRC, LV_6, LV_MINS,
+ // ` a b c d e f g
+ LV_GRV, LV_A, LV_B, LV_C, LV_D, LV_E, LV_F, LV_G,
+ // h i j k l m n o
+ LV_H, LV_I, LV_J, LV_K, LV_L, LV_M, LV_N, LV_O,
+ // p q r s t u v w
+ LV_P, LV_Q, LV_R, LV_S, LV_T, LV_U, LV_V, LV_W,
+ // x y z { | } ~ DEL
+ LV_X, LV_Y, LV_Z, LV_LBRC, LV_BSLS, LV_RBRC, LV_GRV, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_lithuanian_azerty.h b/quantum/keymap_extras/sendstring_lithuanian_azerty.h
new file mode 100644
index 00000000000..7498a3dc4de
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_lithuanian_azerty.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Lithuanian ĄŽERTY layouts
+
+#pragma once
+
+#include "keymap_lithuanian_azerty.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 0, 0, 0, 0, 1, 0),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 1, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(0, 0, 1, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 0, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, LT_EXLM, LT_EDOT, LT_SLSH, LT_SCLN, LT_X, LT_DOT, LT_QUES,
+ // ( ) * + , - . /
+ LT_LRPN, LT_RPRN, LT_EQL, LT_QUES, LT_COMM, LT_MINS, LT_DOT, LT_SLSH,
+ // 0 1 2 3 4 5 6 7
+ LT_RPRN, LT_EXLM, LT_MINS, LT_SLSH, LT_SLCN, LT_COLN, LT_COMM, LT_DOT,
+ // 8 9 : ; < = > ?
+ LT_EQL, LT_LPRN, LT_COLN, LT_SCLN, LT_LABK, LT_EQL, LT_LABK, LT_QUES,
+ // @ A B C D E F G
+ LT_EXLM, LT_A, LT_B, LT_C, LT_D, LT_E, LT_F, LT_G,
+ // H I J K L M N O
+ LT_H, LT_I, LT_J, LT_K, LT_L, LT_M, LT_N, LT_O,
+ // P Q R S T U V W
+ LT_P, LT_Q, LT_R, LT_S, LT_T, LT_U, LT_V, LT_W,
+ // X Y Z [ \ ] ^ _
+ LT_X, LT_Y, LT_Z, LT_LPRN, LT_EOGO, LT_RPRN, LT_COMM, LT_MINS,
+ // ` a b c d e f g
+ LT_GRV, LT_A, LT_B, LT_C, LT_D, LT_E, LT_F, LT_G,
+ // h i j k l m n o
+ LT_H, LT_I, LT_J, LT_K, LT_L, LT_M, LT_N, LT_O,
+ // p q r s t u v w
+ LT_P, LT_Q, LT_R, LT_S, LT_T, LT_U, LT_V, LT_W,
+ // x y z { | } ~ DEL
+ LT_X, LT_Y, LT_Z, LT_IOGO, LT_Q, LT_W, LT_GRV, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_lithuanian_qwerty.h b/quantum/keymap_extras/sendstring_lithuanian_qwerty.h
new file mode 100644
index 00000000000..69cb94de713
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_lithuanian_qwerty.h
@@ -0,0 +1,80 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Lithuanian QWERTY layouts
+
+#pragma once
+
+#include "keymap_lithuanian_qwerty.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 0, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(0, 0, 1, 1, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 1, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 1, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, LT_1, LT_QUOT, LT_3, LT_4, LT_5, LT_7, LT_QUOT,
+ // ( ) * + , - . /
+ LT_9, LT_0, LT_8, LT_ZCAR, LT_COMM, LT_MINS, LT_DOT, LT_SLSH,
+ // 0 1 2 3 4 5 6 7
+ LT_0, LT_AOGO, LT_CCAR, LT_EOGO, LT_EDOT, LT_IOGO, LT_SCAR, LT_UOGO,
+ // 8 9 : ; < = > ?
+ LT_UMAC, LT_9, LT_SCLN, LT_SCLN, LT_COMM, LT_PLUS, LT_DOT, LT_SLSH,
+ // @ A B C D E F G
+ LT_CCAR, LT_A, LT_B, LT_C, LT_D, LT_E, LT_F, LT_G,
+ // H I J K L M N O
+ LT_H, LT_I, LT_J, LT_K, LT_L, LT_M, LT_N, LT_O,
+ // P Q R S T U V W
+ LT_P, LT_Q, LT_R, LT_S, LT_T, LT_U, LT_V, LT_W,
+ // X Y Z [ \ ] ^ _
+ LT_X, LT_Y, LT_Z, LT_LBRC, LT_BSLS, LT_RBRC, LT_SCAR, LT_MINS,
+ // ` a b c d e f g
+ LT_GRV, LT_A, LT_B, LT_C, LT_D, LT_E, LT_F, LT_G,
+ // h i j k l m n o
+ LT_H, LT_I, LT_J, LT_K, LT_L, LT_M, LT_N, LT_O,
+ // p q r s t u v w
+ LT_P, LT_Q, LT_R, LT_S, LT_T, LT_U, LT_V, LT_W,
+ // x y z { | } ~ DEL
+ LT_X, LT_Y, LT_Z, LT_LBRC, LT_BSLS, LT_RBRC, LT_GRV, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_portuguese.h b/quantum/keymap_extras/sendstring_portuguese.h
index 9b5d49313d0..bec9b2c680c 100644
--- a/quantum/keymap_extras/sendstring_portuguese.h
+++ b/quantum/keymap_extras/sendstring_portuguese.h
@@ -40,7 +40,7 @@ const uint8_t ascii_to_shift_lut[16] PROGMEM = {
KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
- KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 0, 0)
};
const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
@@ -60,7 +60,7 @@ const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
- KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 0, 0)
};
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
diff --git a/quantum/keymap_extras/sendstring_romanian.h b/quantum/keymap_extras/sendstring_romanian.h
new file mode 100644
index 00000000000..9b5bee4a13e
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_romanian.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Romanian layouts
+
+#pragma once
+
+#include "keymap_romanian.h"
+#include "quantum"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(1, 1, 1, 1, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 1, 1, 0, 0, 0, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 1, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 1, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 1, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, RO_1, RO_TCOM, RO_3, RO_4, RO_5, RO_7, RO_TCOM,
+ // ( ) * + , - . /
+ RO_9, RO_0, RO_8, RO_EQL, RO_COMM, RO_MINS, RO_DOT, RO_SLSH,
+ // 0 1 2 3 4 5 6 7
+ RO_0, RO_1, RO_2, RO_3, RO_4, RO_5, RO_6, RO_7,
+ // 8 9 : ; < = > ?
+ RO_8, RO_9, RO_DOT, RO_COMM, RO_COMM, RO_EQL, RO_DOT, RO_SLSH,
+ // @ A B C D E F G
+ RO_2, RO_A, RO_B, RO_C, RO_D, RO_E, RO_F, RO_G,
+ // H I J K L M N O
+ RO_H, RO_I, RO_J, RO_K, RO_L, RO_M, RO_N, RO_O,
+ // P Q R S T U V W
+ RO_P, RO_Q, RO_R, RO_S, RO_T, RO_U, RO_V, RO_W,
+ // X Y Z [ \ ] ^ _
+ RO_X, RO_Y, RO_Z, RO_ABRV, RO_BSLS, RO_ICIR, RO_6, RO_MINS,
+ // ` a b c d e f g
+ RO_DLQU, RO_A, RO_B, RO_C, RO_D, RO_E, RO_F, RO_G,
+ // h i j k l m n o
+ RO_H, RO_I, RO_J, RO_K, RO_L, RO_M, RO_N, RO_O,
+ // p q r s t u v w
+ RO_P, RO_Q, RO_R, RO_S, RO_T, RO_U, RO_V, RO_W,
+ // x y z { | } ~ DEL
+ RO_X, RO_Y, RO_Z, RO_ABRV, RO_BSLS, RO_ICIR, RO_DLQU, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_serbian_latin.h b/quantum/keymap_extras/sendstring_serbian_latin.h
new file mode 100644
index 00000000000..40e2a9ea0c2
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_serbian_latin.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Serbian (Latin) layouts
+
+#pragma once
+
+#include "keymap_serbian_latin.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 1, 1, 0, 1, 1, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, RS_1, RS_2, RS_3, RS_4, RS_5, RS_6, RS_QUOT,
+ // ( ) * + , - . /
+ RS_8, RS_9, RS_PLUS, RS_PLUS, RS_COMM, RS_MINS, RS_DOT, RS_7,
+ // 0 1 2 3 4 5 6 7
+ RS_0, RS_1, RS_2, RS_3, RS_4, RS_5, RS_6, RS_7,
+ // 8 9 : ; < = > ?
+ RS_8, RS_9, RS_DOT, RS_COMM, RS_LABK, RS_0, RS_LABK, RS_QUOT,
+ // @ A B C D E F G
+ RS_V, RS_A, RS_B, RS_C, RS_D, RS_E, RS_F, RS_G,
+ // H I J K L M N O
+ RS_H, RS_I, RS_J, RS_K, RS_L, RS_M, RS_N, RS_O,
+ // P Q R S T U V W
+ RS_P, RS_Q, RS_R, RS_S, RS_T, RS_U, RS_V, RS_W,
+ // X Y Z [ \ ] ^ _
+ RS_X, RS_Y, RS_Z, RS_F, RS_Q, RS_G, RS_3, RS_MINS,
+ // ` a b c d e f g
+ RS_7, RS_A, RS_B, RS_C, RS_D, RS_E, RS_F, RS_G,
+ // h i j k l m n o
+ RS_H, RS_I, RS_J, RS_K, RS_L, RS_M, RS_N, RS_O,
+ // p q r s t u v w
+ RS_P, RS_Q, RS_R, RS_S, RS_T, RS_U, RS_V, RS_W,
+ // x y z { | } ~ DEL
+ RS_X, RS_Y, RS_Z, RS_B, RS_W, RS_N, RS_1, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_slovak.h b/quantum/keymap_extras/sendstring_slovak.h
new file mode 100644
index 00000000000..72eeb86a539
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_slovak.h
@@ -0,0 +1,100 @@
+/* Copyright 2020
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Slovak layouts
+
+#pragma once
+
+#include "keymap_slovak.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 0, 1, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, SK_SECT, SK_OCIR, SK_X, SK_OCIR, SK_EQL, SK_AMPR, SK_P,
+ // ( ) * + , - . /
+ SK_ADIA, SK_NCAR, SK_AMPR, SK_PLUS, SK_COMM, SK_MINS, SK_DOT, SK_UACU,
+ // 0 1 2 3 4 5 6 7
+ SK_EACU, SK_PLUS, SK_LACU, SK_SCAR, SK_CCAR, SK_TACU, SK_ZCAR, SK_YACU,
+ // 8 9 : ; < = > ?
+ SK_AACU, SK_IACU, SK_DOT, SK_SCLN, SK_AMPR, SK_EQL, SK_Y, SK_COMM,
+ // @ A B C D E F G
+ SK_V, SK_A, SK_B, SK_C, SK_D, SK_E, SK_F, SK_G,
+ // H I J K L M N O
+ SK_H, SK_I, SK_J, SK_K, SK_L, SK_M, SK_N, SK_O,
+ // P Q R S T U V W
+ SK_P, SK_Q, SK_R, SK_S, SK_T, SK_U, SK_V, SK_W,
+ // X Y Z [ \ ] ^ _
+ SK_X, SK_Y, SK_Z, SK_F, SK_Q, SK_G, SK_3, SK_MINS,
+ // ` a b c d e f g
+ SK_7, SK_A, SK_B, SK_C, SK_D, SK_E, SK_F, SK_G,
+ // h i j k l m n o
+ SK_H, SK_I, SK_J, SK_K, SK_L, SK_M, SK_N, SK_O,
+ // p q r s t u v w
+ SK_P, SK_Q, SK_R, SK_S, SK_T, SK_U, SK_V, SK_W,
+ // x y z { | } ~ DEL
+ SK_X, SK_Y, SK_Z, SK_B, SK_W, SK_N, SK_1, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_spanish.h b/quantum/keymap_extras/sendstring_spanish.h
index 405cf9b0a37..b984a6f463e 100644
--- a/quantum/keymap_extras/sendstring_spanish.h
+++ b/quantum/keymap_extras/sendstring_spanish.h
@@ -96,5 +96,5 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
// p q r s t u v w
ES_P, ES_Q, ES_R, ES_S, ES_T, ES_U, ES_V, ES_W,
// x y z { | } ~ DEL
- ES_X, ES_Y, ES_Z, ES_ACUT, ES_1, ES_CCED, ES_NTIL, KC_DEL
+ ES_X, ES_Y, ES_Z, ES_ACUT, ES_1, ES_CCED, ES_4, KC_DEL
};
diff --git a/quantum/keymap_extras/sendstring_spanish_dvorak.h b/quantum/keymap_extras/sendstring_spanish_dvorak.h
new file mode 100644
index 00000000000..87d582491c1
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_spanish_dvorak.h
@@ -0,0 +1,100 @@
+/* Copyright 2020 José Andrés García
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Spanish Dvorak layout
+
+#pragma once
+
+#include "keymap_spanish_dvorak.h"
+#include "quantum.h"
+
+// clang-format off
+
+const uint8_t ascii_to_shift_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 1, 1, 0, 1, 1, 1, 0),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 0, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 1, 1, 0, 1, 1, 1),
+ KCLUT_ENTRY(0, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 1, 1, 1, 1, 1),
+ KCLUT_ENTRY(1, 1, 1, 0, 0, 0, 1, 1),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
+};
+
+const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+
+ KCLUT_ENTRY(0, 0, 0, 1, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
+};
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, DV_1, DV_2, DV_3, DV_4, DV_5, DV_6, DV_QUOT,
+ // ( ) * + , - . /
+ DV_8, DV_9, DV_PLUS, DV_PLUS, DV_COMM, DV_MINS, DV_DOT, DV_7,
+ // 0 1 2 3 4 5 6 7
+ DV_0, DV_1, DV_2, DV_3, DV_4, DV_5, DV_6, DV_7,
+ // 8 9 : ; < = > ?
+ DV_8, DV_9, DV_DOT, DV_COMM, DV_LABK, DV_0, DV_LABK, DV_QUOT,
+ // @ A B C D E F G
+ DV_2, DV_A, DV_B, DV_C, DV_D, DV_E, DV_F, DV_G,
+ // H I J K L M N O
+ DV_H, DV_I, DV_J, DV_K, DV_L, DV_M, DV_N, DV_O,
+ // P Q R S T U V W
+ DV_P, DV_Q, DV_R, DV_S, DV_T, DV_U, DV_V, DV_W,
+ // X Y Z [ \ ] ^ _
+ DV_X, DV_Y, DV_Z, DV_GRV, DV_MORD, DV_PLUS, DV_GRV, DV_MINS,
+ // ` a b c d e f g
+ DV_GRV, DV_A, DV_B, DV_C, DV_D, DV_E, DV_F, DV_G,
+ // h i j k l m n o
+ DV_H, DV_I, DV_J, DV_K, DV_L, DV_M, DV_N, DV_O,
+ // p q r s t u v w
+ DV_P, DV_Q, DV_R, DV_S, DV_T, DV_U, DV_V, DV_W,
+ // x y z { | } ~ DEL
+ DV_X, DV_Y, DV_Z, DV_ACUT, DV_1, DV_CCED, DV_4, KC_DEL
+};
diff --git a/quantum/keymap_extras/sendstring_turkish_f.h b/quantum/keymap_extras/sendstring_turkish_f.h
index 5eec73bdedb..8d6dc778fd9 100644
--- a/quantum/keymap_extras/sendstring_turkish_f.h
+++ b/quantum/keymap_extras/sendstring_turkish_f.h
@@ -40,7 +40,7 @@ const uint8_t ascii_to_shift_lut[16] PROGMEM = {
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
- KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
};
const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
@@ -60,7 +60,7 @@ const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
- KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
};
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
diff --git a/quantum/keymap_extras/sendstring_turkish_q.h b/quantum/keymap_extras/sendstring_turkish_q.h
index 97c990c12aa..1a409c1e03f 100644
--- a/quantum/keymap_extras/sendstring_turkish_q.h
+++ b/quantum/keymap_extras/sendstring_turkish_q.h
@@ -40,7 +40,7 @@ const uint8_t ascii_to_shift_lut[16] PROGMEM = {
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
- KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
+ KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0)
};
const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
@@ -60,7 +60,7 @@ const uint8_t ascii_to_altgr_lut[16] PROGMEM = {
KCLUT_ENTRY(1, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
- KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
};
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
diff --git a/quantum/keymap_extras/sendstring_uk.h b/quantum/keymap_extras/sendstring_uk.h
index 733c5f8600e..bbd30769b00 100644
--- a/quantum/keymap_extras/sendstring_uk.h
+++ b/quantum/keymap_extras/sendstring_uk.h
@@ -40,7 +40,7 @@ const uint8_t ascii_to_shift_lut[16] PROGMEM = {
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
KCLUT_ENTRY(0, 0, 0, 0, 0, 0, 0, 0),
- KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0),
+ KCLUT_ENTRY(0, 0, 0, 1, 1, 1, 1, 0)
};
const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
@@ -54,7 +54,7 @@ const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
// ! " # $ % & '
- UK_SPC, UK_1, UK_2, UK_HASH, UK_4, UK_5, UK_7, UK_QUOT,
+ KC_SPC, UK_1, UK_2, UK_HASH, UK_4, UK_5, UK_7, UK_QUOT,
// ( ) * + , - . /
UK_9, UK_0, UK_8, UK_EQL, UK_COMM, UK_MINS, UK_DOT, UK_SLSH,
// 0 1 2 3 4 5 6 7
diff --git a/quantum/keymap_extras/sendstring_workman_zxcvm.h b/quantum/keymap_extras/sendstring_workman_zxcvm.h
new file mode 100644
index 00000000000..e7605d7cce1
--- /dev/null
+++ b/quantum/keymap_extras/sendstring_workman_zxcvm.h
@@ -0,0 +1,59 @@
+/* Copyright 2018 Jacob Jerrell
+ *
+ * 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 .
+ */
+
+// Sendstring lookup tables for Workman ZXCVM layouts
+
+#pragma once
+
+#include "keymap_workman_zxcvm.h"
+
+// clang-format off
+
+const uint8_t ascii_to_keycode_lut[128] PROGMEM = {
+ // NUL SOH STX ETX EOT ENQ ACK BEL
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // BS TAB LF VT FF CR SO SI
+ KC_BSPC, KC_TAB, KC_ENT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // DLE DC1 DC2 DC3 DC4 NAK SYN ETB
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ // CAN EM SUB ESC FS GS RS US
+ XXXXXXX, XXXXXXX, XXXXXXX, KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ // ! " # $ % & '
+ KC_SPC, WK_1, WK_QUOT, WK_3, WK_4, WK_5, WK_7, WK_QUOT,
+ // ( ) * + , - . /
+ WK_9, WK_0, WK_8, WK_EQL, WK_COMM, WK_MINS, WK_DOT, WK_SLSH,
+ // 0 1 2 3 4 5 6 7
+ WK_0, WK_1, WK_2, WK_3, WK_4, WK_5, WK_6, WK_7,
+ // 8 9 : ; < = > ?
+ WK_8, WK_9, WK_SCLN, WK_SCLN, WK_COMM, WK_EQL, WK_DOT, WK_SLSH,
+ // @ A B C D E F G
+ WK_2, WK_A, WK_B, WK_C, WK_D, WK_E, WK_F, WK_G,
+ // H I J K L M N O
+ WK_H, WK_I, WK_J, WK_K, WK_L, WK_M, WK_N, WK_O,
+ // P Q R S T U V W
+ WK_P, WK_Q, WK_R, WK_S, WK_T, WK_U, WK_V, WK_W,
+ // X Y Z [ \ ] ^ _
+ WK_X, WK_Y, WK_Z, WK_LBRC, WK_BSLS, WK_RBRC, WK_6, WK_MINS,
+ // ` a b c d e f g
+ WK_GRV, WK_A, WK_B, WK_C, WK_D, WK_E, WK_F, WK_G,
+ // h i j k l m n o
+ WK_H, WK_I, WK_J, WK_K, WK_L, WK_M, WK_N, WK_O,
+ // p q r s t u v w
+ WK_P, WK_Q, WK_R, WK_S, WK_T, WK_U, WK_V, WK_W,
+ // x y z { | } ~ DEL
+ WK_X, WK_Y, WK_Z, WK_LBRC, WK_BSLS, WK_RBRC, WK_GRV, KC_DEL
+};
diff --git a/quantum/mcu_selection.mk b/quantum/mcu_selection.mk
index f15a4f58c08..33de162bb16 100644
--- a/quantum/mcu_selection.mk
+++ b/quantum/mcu_selection.mk
@@ -213,6 +213,8 @@ ifneq ($(findstring STM32F103, $(MCU)),)
endif
ifneq (,$(filter $(MCU),atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb1286))
+ PROTOCOL = LUFA
+
# Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the
# processor frequency in Hz. You can then use this symbol in your source code to
@@ -285,3 +287,18 @@ ifneq (,$(filter $(MCU),atmega328p))
NO_UART ?= yes
NO_SUSPEND_POWER_DOWN ?= yes
endif
+
+ifneq (,$(filter $(MCU),attiny85))
+ PROTOCOL = VUSB
+
+ # Processor frequency.
+ # This will define a symbol, F_CPU, in all source code files equal to the
+ # processor frequency in Hz. You can then use this symbol in your source code to
+ # calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+ # automatically to create a 32-bit value in your source code.
+ F_CPU ?= 16500000
+
+ # unsupported features for now
+ NO_UART ?= yes
+ NO_SUSPEND_POWER_DOWN ?= yes
+endif
diff --git a/quantum/pincontrol.h b/quantum/pincontrol.h
deleted file mode 100644
index 204fddf30c5..00000000000
--- a/quantum/pincontrol.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/* Copyright 2016 Wez Furlong
- *
- * 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 .
- */
-#pragma once
-// Some helpers for controlling gpio pins
-#include
-
-enum {
- PinDirectionInput = 0,
- PinDirectionOutput = 1,
- PinLevelHigh = 1,
- PinLevelLow = 0,
-};
-
-// ex: pinMode(B0, PinDirectionOutput);
-static inline void pinMode(uint8_t pin, int mode) {
- uint8_t bv = _BV(pin & 0xf);
- if (mode == PinDirectionOutput) {
- _SFR_IO8((pin >> 4) + 1) |= bv;
- } else {
- _SFR_IO8((pin >> 4) + 1) &= ~bv;
- _SFR_IO8((pin >> 4) + 2) &= ~bv;
- }
-}
-
-// ex: digitalWrite(B0, PinLevelHigh);
-static inline void digitalWrite(uint8_t pin, int mode) {
- uint8_t bv = _BV(pin & 0xf);
- if (mode == PinLevelHigh) {
- _SFR_IO8((pin >> 4) + 2) |= bv;
- } else {
- _SFR_IO8((pin >> 4) + 2) &= ~bv;
- }
-}
-
-// Return true if the pin is HIGH
-// digitalRead(B0)
-static inline bool digitalRead(uint8_t pin) { return _SFR_IO8(pin >> 4) & _BV(pin & 0xf); }
diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c
index f40ca745252..c4e299958af 100644
--- a/quantum/process_keycode/process_combo.c
+++ b/quantum/process_keycode/process_combo.c
@@ -17,9 +17,12 @@
#include "print.h"
#include "process_combo.h"
-__attribute__((weak)) combo_t key_combos[COMBO_COUNT] = {
-
-};
+#ifndef COMBO_VARIABLE_LEN
+__attribute__((weak)) combo_t key_combos[COMBO_COUNT] = {};
+#else
+extern combo_t key_combos[];
+extern int COMBO_LEN;
+#endif
__attribute__((weak)) void process_combo_event(uint8_t combo_index, bool pressed) {}
@@ -141,8 +144,11 @@ bool process_combo(uint16_t keycode, keyrecord_t *record) {
if (!is_combo_enabled()) {
return true;
}
-
+#ifndef COMBO_VARIABLE_LEN
for (current_combo_index = 0; current_combo_index < COMBO_COUNT; ++current_combo_index) {
+#else
+ for (current_combo_index = 0; current_combo_index < COMBO_LEN; ++current_combo_index) {
+#endif
combo_t *combo = &key_combos[current_combo_index];
is_combo_key |= process_single_combo(combo, keycode, record);
no_combo_keys_pressed = no_combo_keys_pressed && NO_COMBO_KEYS_ARE_DOWN;
diff --git a/quantum/process_keycode/process_rgb.c b/quantum/process_keycode/process_rgb.c
index 627e5986fba..21164b8f9fc 100644
--- a/quantum/process_keycode/process_rgb.c
+++ b/quantum/process_keycode/process_rgb.c
@@ -56,7 +56,7 @@ bool process_rgb(const uint16_t keycode, const keyrecord_t *record) {
// Split keyboards need to trigger on key-up for edge-case issue
if (!record->event.pressed) {
#endif
- uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT));
+ uint8_t shifted = get_mods() & MOD_MASK_SHIFT;
switch (keycode) {
case RGB_TOG:
rgblight_toggle();
diff --git a/quantum/process_keycode/process_unicode_common.c b/quantum/process_keycode/process_unicode_common.c
index fc392813ae8..fb502150120 100644
--- a/quantum/process_keycode/process_unicode_common.c
+++ b/quantum/process_keycode/process_unicode_common.c
@@ -24,8 +24,8 @@ uint8_t unicode_saved_mods;
#if UNICODE_SELECTED_MODES != -1
static uint8_t selected[] = {UNICODE_SELECTED_MODES};
-static uint8_t selected_count = sizeof selected / sizeof *selected;
-static uint8_t selected_index;
+static int8_t selected_count = sizeof selected / sizeof *selected;
+static int8_t selected_index;
#endif
void unicode_input_mode_init(void) {
@@ -33,7 +33,7 @@ void unicode_input_mode_init(void) {
#if UNICODE_SELECTED_MODES != -1
# if UNICODE_CYCLE_PERSIST
// Find input_mode in selected modes
- uint8_t i;
+ int8_t i;
for (i = 0; i < selected_count; i++) {
if (selected[i] == unicode_config.input_mode) {
selected_index = i;
@@ -60,9 +60,12 @@ void set_unicode_input_mode(uint8_t mode) {
dprintf("Unicode input mode set to: %u\n", unicode_config.input_mode);
}
-void cycle_unicode_input_mode(uint8_t offset) {
+void cycle_unicode_input_mode(int8_t offset) {
#if UNICODE_SELECTED_MODES != -1
- selected_index = (selected_index + offset) % selected_count;
+ selected_index = (selected_index + offset) % selected_count;
+ if (selected_index < 0) {
+ selected_index += selected_count;
+ }
unicode_config.input_mode = selected[selected_index];
# if UNICODE_CYCLE_PERSIST
persist_unicode_input_mode();
@@ -78,8 +81,8 @@ __attribute__((weak)) void unicode_input_start(void) {
clear_mods(); // Unregister mods to start from a clean state
switch (unicode_config.input_mode) {
- case UC_OSX:
- register_code(UNICODE_KEY_OSX);
+ case UC_MAC:
+ register_code(UNICODE_KEY_MAC);
break;
case UC_LNX:
tap_code16(UNICODE_KEY_LNX);
@@ -99,8 +102,8 @@ __attribute__((weak)) void unicode_input_start(void) {
__attribute__((weak)) void unicode_input_finish(void) {
switch (unicode_config.input_mode) {
- case UC_OSX:
- unregister_code(UNICODE_KEY_OSX);
+ case UC_MAC:
+ unregister_code(UNICODE_KEY_MAC);
break;
case UC_LNX:
tap_code(KC_SPC);
@@ -118,8 +121,8 @@ __attribute__((weak)) void unicode_input_finish(void) {
__attribute__((weak)) void unicode_input_cancel(void) {
switch (unicode_config.input_mode) {
- case UC_OSX:
- unregister_code(UNICODE_KEY_OSX);
+ case UC_MAC:
+ unregister_code(UNICODE_KEY_MAC);
break;
case UC_LNX:
case UC_WINC:
@@ -168,6 +171,8 @@ void register_hex32(uint32_t hex) {
}
}
+// clang-format off
+
void send_unicode_hex_string(const char *str) {
if (!str) {
return;
@@ -175,12 +180,11 @@ void send_unicode_hex_string(const char *str) {
while (*str) {
// Find the next code point (token) in the string
- for (; *str == ' '; str++)
- ;
+ for (; *str == ' '; str++); // Skip leading spaces
size_t n = strcspn(str, " "); // Length of the current token
- char code_point[n + 1];
- strncpy(code_point, str, n);
- code_point[n] = '\0'; // Make sure it's null-terminated
+ char code_point[n+1];
+ strncpy(code_point, str, n); // Copy token into buffer
+ code_point[n] = '\0'; // Make sure it's null-terminated
// Normalize the code point: make all hex digits lowercase
for (char *p = code_point; *p; p++) {
@@ -196,8 +200,10 @@ void send_unicode_hex_string(const char *str) {
}
}
+// clang-format on
+
// Borrowed from https://nullprogram.com/blog/2017/10/06/
-const char *decode_utf8(const char *str, int32_t *code_point) {
+static const char *decode_utf8(const char *str, int32_t *code_point) {
const char *next;
if (str[0] < 0x80) { // U+0000-007F
@@ -231,7 +237,6 @@ void send_unicode_string(const char *str) {
}
int32_t code_point = 0;
-
while (*str) {
str = decode_utf8(str, &code_point);
@@ -243,53 +248,70 @@ void send_unicode_string(const char *str) {
}
}
+// clang-format off
+
+static void audio_helper(void) {
+#ifdef AUDIO_ENABLE
+ switch (get_unicode_input_mode()) {
+# ifdef UNICODE_SONG_MAC
+ static float song_mac[][2] = UNICODE_SONG_MAC;
+ case UC_MAC:
+ PLAY_SONG(song_mac);
+ break;
+# endif
+# ifdef UNICODE_SONG_LNX
+ static float song_lnx[][2] = UNICODE_SONG_LNX;
+ case UC_LNX:
+ PLAY_SONG(song_lnx);
+ break;
+# endif
+# ifdef UNICODE_SONG_WIN
+ static float song_win[][2] = UNICODE_SONG_WIN;
+ case UC_WIN:
+ PLAY_SONG(song_win);
+ break;
+# endif
+# ifdef UNICODE_SONG_BSD
+ static float song_bsd[][2] = UNICODE_SONG_BSD;
+ case UC_BSD:
+ PLAY_SONG(song_bsd);
+ break;
+# endif
+# ifdef UNICODE_SONG_WINC
+ static float song_winc[][2] = UNICODE_SONG_WINC;
+ case UC_WINC:
+ PLAY_SONG(song_winc);
+ break;
+# endif
+ }
+#endif
+}
+
+// clang-format on
+
bool process_unicode_common(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
+ bool shifted = get_mods() & MOD_MASK_SHIFT;
switch (keycode) {
case UNICODE_MODE_FORWARD:
- cycle_unicode_input_mode(+1);
+ cycle_unicode_input_mode(shifted ? -1 : +1);
+ audio_helper();
break;
case UNICODE_MODE_REVERSE:
- cycle_unicode_input_mode(-1);
+ cycle_unicode_input_mode(shifted ? +1 : -1);
+ audio_helper();
break;
- case UNICODE_MODE_OSX:
- set_unicode_input_mode(UC_OSX);
-#if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_OSX)
- static float song_osx[][2] = UNICODE_SONG_OSX;
- PLAY_SONG(song_osx);
-#endif
- break;
- case UNICODE_MODE_LNX:
- set_unicode_input_mode(UC_LNX);
-#if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_LNX)
- static float song_lnx[][2] = UNICODE_SONG_LNX;
- PLAY_SONG(song_lnx);
-#endif
- break;
- case UNICODE_MODE_WIN:
- set_unicode_input_mode(UC_WIN);
-#if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_WIN)
- static float song_win[][2] = UNICODE_SONG_WIN;
- PLAY_SONG(song_win);
-#endif
- break;
- case UNICODE_MODE_BSD:
- set_unicode_input_mode(UC_BSD);
-#if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_BSD)
- static float song_bsd[][2] = UNICODE_SONG_BSD;
- PLAY_SONG(song_bsd);
-#endif
- break;
- case UNICODE_MODE_WINC:
- set_unicode_input_mode(UC_WINC);
-#if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_WINC)
- static float song_winc[][2] = UNICODE_SONG_WINC;
- PLAY_SONG(song_winc);
-#endif
+ case UNICODE_MODE_MAC ... UNICODE_MODE_WINC: {
+ // Keycodes and input modes follow the same ordering
+ uint8_t delta = keycode - UNICODE_MODE_MAC;
+ set_unicode_input_mode(UC_MAC + delta);
+ audio_helper();
break;
+ }
}
}
+
#if defined(UNICODE_ENABLE)
return process_unicode(keycode, record);
#elif defined(UNICODEMAP_ENABLE)
diff --git a/quantum/process_keycode/process_unicode_common.h b/quantum/process_keycode/process_unicode_common.h
index 13b6431bf04..4579fde8d5d 100644
--- a/quantum/process_keycode/process_unicode_common.h
+++ b/quantum/process_keycode/process_unicode_common.h
@@ -23,8 +23,8 @@
#endif
// Keycodes used for starting Unicode input on different platforms
-#ifndef UNICODE_KEY_OSX
-# define UNICODE_KEY_OSX KC_LALT
+#ifndef UNICODE_KEY_MAC
+# define UNICODE_KEY_MAC KC_LALT
#endif
#ifndef UNICODE_KEY_LNX
# define UNICODE_KEY_LNX LCTL(LSFT(KC_U))
@@ -49,8 +49,17 @@
# define UNICODE_TYPE_DELAY 10
#endif
+// Deprecated aliases
+#if !defined(UNICODE_KEY_MAC) && defined(UNICODE_KEY_OSX)
+# define UNICODE_KEY_MAC UNICODE_KEY_OSX
+#endif
+#if !defined(UNICODE_SONG_MAC) && defined(UNICODE_SONG_OSX)
+# define UNICODE_SONG_MAC UNICODE_SONG_OSX
+#endif
+#define UC_OSX UC_MAC
+
enum unicode_input_modes {
- UC_OSX, // Mac OS X using Unicode Hex Input
+ UC_MAC, // macOS using Unicode Hex Input
UC_LNX, // Linux using IBus
UC_WIN, // Windows using EnableHexNumpad
UC_BSD, // BSD (not implemented)
@@ -71,7 +80,7 @@ extern uint8_t unicode_saved_mods;
void unicode_input_mode_init(void);
uint8_t get_unicode_input_mode(void);
void set_unicode_input_mode(uint8_t mode);
-void cycle_unicode_input_mode(uint8_t offset);
+void cycle_unicode_input_mode(int8_t offset);
void persist_unicode_input_mode(void);
void unicode_input_start(void);
diff --git a/quantum/process_keycode/process_unicodemap.c b/quantum/process_keycode/process_unicodemap.c
index 1be51a995c3..2f402a2fd23 100644
--- a/quantum/process_keycode/process_unicodemap.c
+++ b/quantum/process_keycode/process_unicodemap.c
@@ -21,7 +21,8 @@ __attribute__((weak)) uint16_t unicodemap_index(uint16_t keycode) {
// Keycode is a pair: extract index based on Shift / Caps Lock state
uint16_t index = keycode - QK_UNICODEMAP_PAIR;
- bool shift = unicode_saved_mods & MOD_MASK_SHIFT, caps = IS_HOST_LED_ON(USB_LED_CAPS_LOCK);
+ bool shift = unicode_saved_mods & MOD_MASK_SHIFT;
+ bool caps = IS_HOST_LED_ON(USB_LED_CAPS_LOCK);
if (shift ^ caps) {
index >>= 7;
}
@@ -43,7 +44,7 @@ bool process_unicodemap(uint16_t keycode, keyrecord_t *record) {
if (code > 0x10FFFF || (code > 0xFFFF && input_mode == UC_WIN)) {
// Character is out of range supported by the platform
unicode_input_cancel();
- } else if (code > 0xFFFF && input_mode == UC_OSX) {
+ } else if (code > 0xFFFF && input_mode == UC_MAC) {
// Convert to UTF-16 surrogate pair on Mac
code -= 0x10000;
uint32_t lo = code & 0x3FF, hi = (code & 0xFFC00) >> 10;
diff --git a/quantum/quantum.c b/quantum/quantum.c
index e06448d9e4a..2053a1a5f47 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -120,6 +120,10 @@ __attribute__((weak)) bool process_record_kb(uint16_t keycode, keyrecord_t *reco
__attribute__((weak)) bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; }
+__attribute__((weak)) void post_process_record_kb(uint16_t keycode, keyrecord_t *record) { post_process_record_user(keycode, record); }
+
+__attribute__((weak)) void post_process_record_user(uint16_t keycode, keyrecord_t *record) {}
+
void reset_keyboard(void) {
clear_keyboard();
#if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
@@ -140,27 +144,26 @@ void reset_keyboard(void) {
#endif
#ifdef HAPTIC_ENABLE
haptic_shutdown();
-#endif
-// this is also done later in bootloader.c - not sure if it's neccesary here
-#ifdef BOOTLOADER_CATERINA
- *(uint16_t *)0x0800 = 0x7777; // these two are a-star-specific
#endif
bootloader_jump();
}
/* Convert record into usable keycode via the contained event. */
-uint16_t get_record_keycode(keyrecord_t *record) { return get_event_keycode(record->event); }
+uint16_t get_record_keycode(keyrecord_t *record, bool update_layer_cache) { return get_event_keycode(record->event, update_layer_cache); }
/* Convert event into usable keycode. Checks the layer cache to ensure that it
* retains the correct keycode after a layer change, if the key is still pressed.
+ * "update_layer_cache" is to ensure that it only updates the layer cache when
+ * appropriate, otherwise, it will update it and cause layer tap (and other keys)
+ * from triggering properly.
*/
-uint16_t get_event_keycode(keyevent_t event) {
+uint16_t get_event_keycode(keyevent_t event, bool update_layer_cache) {
#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
/* TODO: Use store_or_get_action() or a similar function. */
if (!disable_action_cache) {
uint8_t layer;
- if (event.pressed) {
+ if (event.pressed && update_layer_cache) {
layer = layer_switch_get_layer(event.key);
update_source_layers_cache(event.key, layer);
} else {
@@ -172,11 +175,17 @@ uint16_t get_event_keycode(keyevent_t event) {
return keymap_key_to_keycode(layer_switch_get_layer(event.key), event.key);
}
-/* Main keycode processing function. Hands off handling to other functions,
- * then processes internal Quantum keycodes, then processes ACTIONs.
- */
+/* Get keycode, and then call keyboard function */
+void post_process_record_quantum(keyrecord_t *record) {
+ uint16_t keycode = get_record_keycode(record, false);
+ post_process_record_kb(keycode, record);
+}
+
+/* Core keycode function, hands off handling to other functions,
+ then processes internal quantum keycodes, and then processes
+ ACTIONs. */
bool process_record_quantum(keyrecord_t *record) {
- uint16_t keycode = get_record_keycode(record);
+ uint16_t keycode = get_record_keycode(record, true);
// This is how you use actions here
// if (keycode == KC_LEAD) {
@@ -192,6 +201,12 @@ bool process_record_quantum(keyrecord_t *record) {
}
#endif
+#ifdef WPM_ENABLE
+ if (record->event.pressed) {
+ update_wpm(keycode);
+ }
+#endif
+
#ifdef TAP_DANCE_ENABLE
preprocess_tap_dance(keycode, record);
#endif
@@ -272,9 +287,11 @@ bool process_record_quantum(keyrecord_t *record) {
if (record->event.pressed) {
switch (keycode) {
+#ifndef NO_RESET
case RESET:
reset_keyboard();
return false;
+#endif
#ifndef NO_DEBUG
case DEBUG:
debug_enable ^= 1;
@@ -581,32 +598,6 @@ void tap_random_base64(void) {
}
}
-__attribute__((weak)) void bootmagic_lite(void) {
- // The lite version of TMK's bootmagic based on Wilba.
- // 100% less potential for accidentally making the
- // keyboard do stupid things.
-
- // We need multiple scans because debouncing can't be turned off.
- matrix_scan();
-#if defined(DEBOUNCE) && DEBOUNCE > 0
- wait_ms(DEBOUNCE * 2);
-#else
- wait_ms(30);
-#endif
- matrix_scan();
-
- // If the Esc and space bar are held down on power up,
- // reset the EEPROM valid state and jump to bootloader.
- // Assumes Esc is at [0,0].
- // This isn't very generalized, but we need something that doesn't
- // rely on user's keymaps in firmware or EEPROM.
- if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
- eeconfig_disable();
- // Jump to bootloader.
- bootloader_jump();
- }
-}
-
void matrix_init_quantum() {
#ifdef BOOTMAGIC_LITE
bootmagic_lite();
@@ -671,6 +662,10 @@ void matrix_scan_quantum() {
encoder_read();
#endif
+#ifdef WPM_ENABLE
+ decay_wpm();
+#endif
+
#ifdef HAPTIC_ENABLE
haptic_task();
#endif
diff --git a/quantum/quantum.h b/quantum/quantum.h
index d03ba5942a0..17d1d41cc9a 100644
--- a/quantum/quantum.h
+++ b/quantum/quantum.h
@@ -178,6 +178,10 @@ extern layer_state_t layer_state;
# include "via.h"
#endif
+#ifdef WPM_ENABLE
+# include "wpm.h"
+#endif
+
// Function substitutions to ease GPIO manipulation
#if defined(__AVR__)
typedef uint8_t pin_t;
@@ -193,6 +197,8 @@ typedef uint8_t pin_t;
# define readPin(pin) ((bool)(PINx_ADDRESS(pin) & _BV((pin)&0xF)))
+# define togglePin(pin) (PORTx_ADDRESS(pin) ^= _BV((pin)&0xF))
+
#elif defined(PROTOCOL_CHIBIOS)
typedef ioline_t pin_t;
@@ -206,6 +212,8 @@ typedef ioline_t pin_t;
# define writePin(pin, level) ((level) ? writePinHigh(pin) : writePinLow(pin))
# define readPin(pin) palReadLine(pin)
+
+# define togglePin(pin) palToggleLine(pin)
#endif
#define SEND_STRING(string) send_string_P(PSTR(string))
@@ -248,11 +256,13 @@ void matrix_init_kb(void);
void matrix_scan_kb(void);
void matrix_init_user(void);
void matrix_scan_user(void);
-uint16_t get_record_keycode(keyrecord_t *record);
-uint16_t get_event_keycode(keyevent_t event);
+uint16_t get_record_keycode(keyrecord_t *record, bool update_layer_cache);
+uint16_t get_event_keycode(keyevent_t event, bool update_layer_cache);
bool process_action_kb(keyrecord_t *record);
bool process_record_kb(uint16_t keycode, keyrecord_t *record);
bool process_record_user(uint16_t keycode, keyrecord_t *record);
+void post_process_record_kb(uint16_t keycode, keyrecord_t *record);
+void post_process_record_user(uint16_t keycode, keyrecord_t *record);
#ifndef BOOTMAGIC_LITE_COLUMN
# define BOOTMAGIC_LITE_COLUMN 0
diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h
index 54428fe1f24..d8f1fa4bbbc 100644
--- a/quantum/quantum_keycodes.h
+++ b/quantum/quantum_keycodes.h
@@ -459,7 +459,7 @@ enum quantum_keycodes {
UNICODE_MODE_FORWARD,
UNICODE_MODE_REVERSE,
- UNICODE_MODE_OSX,
+ UNICODE_MODE_MAC,
UNICODE_MODE_LNX,
UNICODE_MODE_WIN,
UNICODE_MODE_BSD,
@@ -521,13 +521,15 @@ enum quantum_keycodes {
#define LSFT(kc) (QK_LSFT | (kc))
#define LALT(kc) (QK_LALT | (kc))
#define LGUI(kc) (QK_LGUI | (kc))
+#define LOPT(kc) LALT(kc)
#define LCMD(kc) LGUI(kc)
#define LWIN(kc) LGUI(kc)
#define RCTL(kc) (QK_RCTL | (kc))
#define RSFT(kc) (QK_RSFT | (kc))
#define RALT(kc) (QK_RALT | (kc))
-#define ALGR(kc) RALT(kc)
#define RGUI(kc) (QK_RGUI | (kc))
+#define ALGR(kc) RALT(kc)
+#define ROPT(kc) RALT(kc)
#define RCMD(kc) RGUI(kc)
#define RWIN(kc) RGUI(kc)
@@ -736,8 +738,11 @@ enum quantum_keycodes {
#define LALT_T(kc) MT(MOD_LALT, kc)
#define RALT_T(kc) MT(MOD_RALT, kc)
-#define ALT_T(kc) LALT_T(kc)
+#define LOPT_T(kc) LALT_T(kc)
+#define ROPT_T(kc) RALT_T(kc)
#define ALGR_T(kc) RALT_T(kc)
+#define ALT_T(kc) LALT_T(kc)
+#define OPT_T(kc) LOPT_T(kc)
#define LGUI_T(kc) MT(MOD_LGUI, kc)
#define RGUI_T(kc) MT(MOD_RGUI, kc)
@@ -777,7 +782,9 @@ enum quantum_keycodes {
#define UC_MOD UNICODE_MODE_FORWARD
#define UC_RMOD UNICODE_MODE_REVERSE
-#define UC_M_OS UNICODE_MODE_OSX
+#define UC_M_MA UNICODE_MODE_MAC
+#define UNICODE_MODE_OSX UNICODE_MODE_MAC // Deprecated alias
+#define UC_M_OS UNICODE_MODE_MAC // Deprecated alias
#define UC_M_LN UNICODE_MODE_LNX
#define UC_M_WI UNICODE_MODE_WIN
#define UC_M_BS UNICODE_MODE_BSD
@@ -787,6 +794,7 @@ enum quantum_keycodes {
# define SH_T(kc) (QK_SWAP_HANDS | (kc))
# define SH_TG (QK_SWAP_HANDS | OP_SH_TOGGLE)
# define SH_TT (QK_SWAP_HANDS | OP_SH_TAP_TOGGLE)
+# define SH_OS (QK_SWAP_HANDS | OP_SH_ONESHOT)
# define SH_MON (QK_SWAP_HANDS | OP_SH_ON_OFF)
# define SH_MOFF (QK_SWAP_HANDS | OP_SH_OFF_ON)
# define SH_ON (QK_SWAP_HANDS | OP_SH_ON)
diff --git a/quantum/rgb_matrix.c b/quantum/rgb_matrix.c
index 1a9cf82e5fc..3fae9d73786 100644
--- a/quantum/rgb_matrix.c
+++ b/quantum/rgb_matrix.c
@@ -111,7 +111,6 @@ const point_t k_rgb_matrix_center = RGB_MATRIX_CENTER;
# define RGB_MATRIX_STARTUP_SPD UINT8_MAX / 2
#endif
-
bool g_suspend_state = false;
rgb_config_t rgb_matrix_config;
diff --git a/quantum/rgblight.c b/quantum/rgblight.c
index cc35b01ed4d..64123774c73 100644
--- a/quantum/rgblight.c
+++ b/quantum/rgblight.c
@@ -15,6 +15,7 @@
*/
#include
#include
+#include
#ifdef __AVR__
# include
# include
@@ -107,23 +108,19 @@ LED_TYPE led[RGBLED_NUM];
rgblight_segment_t const *const *rgblight_layers = NULL;
#endif
-static uint8_t clipping_start_pos = 0;
-static uint8_t clipping_num_leds = RGBLED_NUM;
-static uint8_t effect_start_pos = 0;
-static uint8_t effect_end_pos = RGBLED_NUM;
-static uint8_t effect_num_leds = RGBLED_NUM;
+rgblight_ranges_t rgblight_ranges = {0, RGBLED_NUM, 0, RGBLED_NUM, RGBLED_NUM};
void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds) {
- clipping_start_pos = start_pos;
- clipping_num_leds = num_leds;
+ rgblight_ranges.clipping_start_pos = start_pos;
+ rgblight_ranges.clipping_num_leds = num_leds;
}
void rgblight_set_effect_range(uint8_t start_pos, uint8_t num_leds) {
if (start_pos >= RGBLED_NUM) return;
if (start_pos + num_leds > RGBLED_NUM) return;
- effect_start_pos = start_pos;
- effect_end_pos = start_pos + num_leds;
- effect_num_leds = num_leds;
+ rgblight_ranges.effect_start_pos = start_pos;
+ rgblight_ranges.effect_end_pos = start_pos + num_leds;
+ rgblight_ranges.effect_num_leds = num_leds;
}
void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1) {
@@ -468,15 +465,15 @@ void rgblight_sethsv_eeprom_helper(uint8_t hue, uint8_t sat, uint8_t val, bool w
# else
uint8_t range = RGBLED_GRADIENT_RANGES[delta / 2];
# endif
- for (uint8_t i = 0; i < effect_num_leds; i++) {
- uint8_t _hue = ((uint16_t)i * (uint16_t)range) / effect_num_leds;
+ for (uint8_t i = 0; i < rgblight_ranges.effect_num_leds; i++) {
+ uint8_t _hue = ((uint16_t)i * (uint16_t)range) / rgblight_ranges.effect_num_leds;
if (direction) {
_hue = hue + _hue;
} else {
_hue = hue - _hue;
}
dprintf("rgblight rainbow set hsv: %d,%d,%d,%u\n", i, _hue, direction, range);
- sethsv(_hue, sat, val, (LED_TYPE *)&led[i + effect_start_pos]);
+ sethsv(_hue, sat, val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]);
}
rgblight_set();
}
@@ -530,7 +527,7 @@ void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) {
return;
}
- for (uint8_t i = effect_start_pos; i < effect_end_pos; i++) {
+ for (uint8_t i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) {
led[i].r = r;
led[i].g = g;
led[i].b = b;
@@ -565,7 +562,7 @@ void rgblight_sethsv_at(uint8_t hue, uint8_t sat, uint8_t val, uint8_t index) {
rgblight_setrgb_at(tmp_led.r, tmp_led.g, tmp_led.b, index);
}
-#if defined(RGBLIGHT_EFFECT_BREATHING) || defined(RGBLIGHT_EFFECT_RAINBOW_MOOD) || defined(RGBLIGHT_EFFECT_RAINBOW_SWIRL) || defined(RGBLIGHT_EFFECT_SNAKE) || defined(RGBLIGHT_EFFECT_KNIGHT)
+#if defined(RGBLIGHT_EFFECT_BREATHING) || defined(RGBLIGHT_EFFECT_RAINBOW_MOOD) || defined(RGBLIGHT_EFFECT_RAINBOW_SWIRL) || defined(RGBLIGHT_EFFECT_SNAKE) || defined(RGBLIGHT_EFFECT_KNIGHT) || defined(RGBLIGHT_EFFECT_TWINKLE)
static uint8_t get_interval_time(const uint8_t *default_interval_address, uint8_t velocikey_min, uint8_t velocikey_max) {
return
@@ -616,7 +613,7 @@ void rgblight_sethsv_slave(uint8_t hue, uint8_t sat, uint8_t val) { rgblight_set
#ifdef RGBLIGHT_LAYERS
void rgblight_set_layer_state(uint8_t layer, bool enabled) {
- uint8_t mask = 1 << layer;
+ rgblight_layer_mask_t mask = 1 << layer;
if (enabled) {
rgblight_status.enabled_layer_mask |= mask;
} else {
@@ -630,7 +627,7 @@ void rgblight_set_layer_state(uint8_t layer, bool enabled) {
}
bool rgblight_get_layer_state(uint8_t layer) {
- uint8_t mask = 1 << layer;
+ rgblight_layer_mask_t mask = 1 << layer;
return (rgblight_status.enabled_layer_mask & mask) != 0;
}
@@ -662,12 +659,39 @@ static void rgblight_layers_write(void) {
}
}
}
+
+# ifdef RGBLIGHT_LAYER_BLINK
+uint8_t _blinked_layer_mask = 0;
+uint16_t _blink_duration = 0;
+static uint16_t _blink_timer;
+
+void rgblight_blink_layer(uint8_t layer, uint16_t duration_ms) {
+ rgblight_set_layer_state(layer, true);
+ _blinked_layer_mask |= 1 << layer;
+ _blink_timer = timer_read();
+ _blink_duration = duration_ms;
+}
+
+void rgblight_unblink_layers(void) {
+ if (_blinked_layer_mask != 0 && timer_elapsed(_blink_timer) > _blink_duration) {
+ for (uint8_t layer = 0; layer < RGBLIGHT_MAX_LAYERS; layer++) {
+ if ((_blinked_layer_mask & 1 << layer) != 0) {
+ rgblight_set_layer_state(layer, false);
+ }
+ }
+ _blinked_layer_mask = 0;
+ }
+}
+# endif
+
#endif
+__attribute__((weak)) void rgblight_call_driver(LED_TYPE *start_led, uint8_t num_leds) { ws2812_setleds(start_led, num_leds); }
+
#ifndef RGBLIGHT_CUSTOM_DRIVER
void rgblight_set(void) {
LED_TYPE *start_led;
- uint16_t num_leds = clipping_num_leds;
+ uint8_t num_leds = rgblight_ranges.clipping_num_leds;
# ifdef RGBLIGHT_LAYERS
if (rgblight_layers != NULL) {
@@ -676,7 +700,7 @@ void rgblight_set(void) {
# endif
if (!rgblight_config.enable) {
- for (uint8_t i = effect_start_pos; i < effect_end_pos; i++) {
+ for (uint8_t i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) {
led[i].r = 0;
led[i].g = 0;
led[i].b = 0;
@@ -691,9 +715,9 @@ void rgblight_set(void) {
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
led0[i] = led[pgm_read_byte(&led_map[i])];
}
- start_led = led0 + clipping_start_pos;
+ start_led = led0 + rgblight_ranges.clipping_start_pos;
# else
- start_led = led + clipping_start_pos;
+ start_led = led + rgblight_ranges.clipping_start_pos;
# endif
# ifdef RGBW
@@ -701,7 +725,7 @@ void rgblight_set(void) {
convert_rgb_to_rgbw(&start_led[i]);
}
# endif
- ws2812_setleds(start_led, num_leds);
+ rgblight_call_driver(start_led, num_leds);
}
#endif
@@ -881,6 +905,12 @@ void rgblight_task(void) {
interval_time = 500;
effect_func = (effect_func_t)rgblight_effect_alternating;
}
+# endif
+# ifdef RGBLIGHT_EFFECT_TWINKLE
+ else if (rgblight_status.base_mode == RGBLIGHT_MODE_TWINKLE) {
+ interval_time = get_interval_time(&RGBLED_TWINKLE_INTERVALS[delta % 3], 5, 50);
+ effect_func = (effect_func_t)rgblight_effect_twinkle;
+ }
# endif
if (animation_status.restart) {
animation_status.restart = false;
@@ -911,6 +941,10 @@ void rgblight_task(void) {
# endif
}
}
+
+# ifdef RGBLIGHT_LAYER_BLINK
+ rgblight_unblink_layers();
+# endif
}
#endif /* RGBLIGHT_USE_TIMER */
@@ -961,9 +995,9 @@ void rgblight_effect_rainbow_swirl(animation_status_t *anim) {
uint8_t hue;
uint8_t i;
- for (i = 0; i < effect_num_leds; i++) {
- hue = (RGBLIGHT_RAINBOW_SWIRL_RANGE / effect_num_leds * i + anim->current_hue);
- sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + effect_start_pos]);
+ for (i = 0; i < rgblight_ranges.effect_num_leds; i++) {
+ hue = (RGBLIGHT_RAINBOW_SWIRL_RANGE / rgblight_ranges.effect_num_leds * i + anim->current_hue);
+ sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]);
}
rgblight_set();
@@ -991,7 +1025,7 @@ void rgblight_effect_snake(animation_status_t *anim) {
# if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC)
if (anim->pos == 0) { // restart signal
if (increment == 1) {
- pos = effect_num_leds - 1;
+ pos = rgblight_ranges.effect_num_leds - 1;
} else {
pos = 0;
}
@@ -999,8 +1033,8 @@ void rgblight_effect_snake(animation_status_t *anim) {
}
# endif
- for (i = 0; i < effect_num_leds; i++) {
- LED_TYPE *ledp = led + i + effect_start_pos;
+ for (i = 0; i < rgblight_ranges.effect_num_leds; i++) {
+ LED_TYPE *ledp = led + i + rgblight_ranges.effect_start_pos;
ledp->r = 0;
ledp->g = 0;
ledp->b = 0;
@@ -1013,7 +1047,7 @@ void rgblight_effect_snake(animation_status_t *anim) {
k = k % RGBLED_NUM;
}
if (k < 0) {
- k = k + effect_num_leds;
+ k = k + rgblight_ranges.effect_num_leds;
}
if (i == k) {
sethsv(rgblight_config.hue, rgblight_config.sat, (uint8_t)(rgblight_config.val * (RGBLIGHT_EFFECT_SNAKE_LENGTH - j) / RGBLIGHT_EFFECT_SNAKE_LENGTH), ledp);
@@ -1023,7 +1057,7 @@ void rgblight_effect_snake(animation_status_t *anim) {
rgblight_set();
if (increment == 1) {
if (pos - 1 < 0) {
- pos = effect_num_leds - 1;
+ pos = rgblight_ranges.effect_num_leds - 1;
# if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC)
anim->pos = 0;
# endif
@@ -1034,7 +1068,7 @@ void rgblight_effect_snake(animation_status_t *anim) {
# endif
}
} else {
- pos = (pos + 1) % effect_num_leds;
+ pos = (pos + 1) % rgblight_ranges.effect_num_leds;
# if defined(RGBLIGHT_SPLIT) && !defined(RGBLIGHT_SPLIT_NO_ANIMATION_SYNC)
anim->pos = pos;
# endif
@@ -1060,7 +1094,7 @@ void rgblight_effect_knight(animation_status_t *anim) {
}
# endif
// Set all the LEDs to 0
- for (i = effect_start_pos; i < effect_end_pos; i++) {
+ for (i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) {
led[i].r = 0;
led[i].g = 0;
led[i].b = 0;
@@ -1070,7 +1104,7 @@ void rgblight_effect_knight(animation_status_t *anim) {
}
// Determine which LEDs should be lit up
for (i = 0; i < RGBLIGHT_EFFECT_KNIGHT_LED_NUM; i++) {
- cur = (i + RGBLIGHT_EFFECT_KNIGHT_OFFSET) % effect_num_leds + effect_start_pos;
+ cur = (i + RGBLIGHT_EFFECT_KNIGHT_OFFSET) % rgblight_ranges.effect_num_leds + rgblight_ranges.effect_start_pos;
if (i >= low_bound && i <= high_bound) {
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[cur]);
@@ -1107,9 +1141,9 @@ void rgblight_effect_christmas(animation_status_t *anim) {
uint8_t i;
anim->current_offset = (anim->current_offset + 1) % 2;
- for (i = 0; i < effect_num_leds; i++) {
+ for (i = 0; i < rgblight_ranges.effect_num_leds; i++) {
hue = 0 + ((i / RGBLIGHT_EFFECT_CHRISTMAS_STEP + anim->current_offset) % 2) * 85;
- sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + effect_start_pos]);
+ sethsv(hue, rgblight_config.sat, rgblight_config.val, (LED_TYPE *)&led[i + rgblight_ranges.effect_start_pos]);
}
rgblight_set();
}
@@ -1148,11 +1182,11 @@ void rgblight_effect_rgbtest(animation_status_t *anim) {
#ifdef RGBLIGHT_EFFECT_ALTERNATING
void rgblight_effect_alternating(animation_status_t *anim) {
- for (int i = 0; i < effect_num_leds; i++) {
- LED_TYPE *ledp = led + i + effect_start_pos;
- if (i < effect_num_leds / 2 && anim->pos) {
+ for (int i = 0; i < rgblight_ranges.effect_num_leds; i++) {
+ LED_TYPE *ledp = led + i + rgblight_ranges.effect_start_pos;
+ if (i < rgblight_ranges.effect_num_leds / 2 && anim->pos) {
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, ledp);
- } else if (i >= effect_num_leds / 2 && !anim->pos) {
+ } else if (i >= rgblight_ranges.effect_num_leds / 2 && !anim->pos) {
sethsv(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, ledp);
} else {
sethsv(rgblight_config.hue, rgblight_config.sat, 0, ledp);
@@ -1162,3 +1196,58 @@ void rgblight_effect_alternating(animation_status_t *anim) {
anim->pos = (anim->pos + 1) % 2;
}
#endif
+
+#ifdef RGBLIGHT_EFFECT_TWINKLE
+__attribute__((weak)) const uint8_t RGBLED_TWINKLE_INTERVALS[] PROGMEM = {50, 25, 10};
+
+typedef struct PACKED {
+ HSV hsv;
+ uint8_t life;
+ bool up;
+} TwinkleState;
+
+static TwinkleState led_twinkle_state[RGBLED_NUM];
+
+void rgblight_effect_twinkle(animation_status_t *anim) {
+ bool random_color = anim->delta / 3;
+ bool restart = anim->pos == 0;
+ anim->pos = 1;
+
+ for (uint8_t i = 0; i < rgblight_ranges.effect_num_leds; i++) {
+ TwinkleState *t = &(led_twinkle_state[i]);
+ HSV * c = &(t->hsv);
+ if (restart) {
+ // Restart
+ t->life = 0;
+ t->hsv.v = 0;
+ } else if (t->life) {
+ // This LED is already on, either brightening or dimming
+ t->life--;
+ uint8_t on = t->up ? RGBLIGHT_EFFECT_TWINKLE_LIFE - t->life : t->life;
+ c->v = (uint16_t)rgblight_config.val * on / RGBLIGHT_EFFECT_TWINKLE_LIFE;
+ if (t->life == 0 && t->up) {
+ t->up = false;
+ t->life = RGBLIGHT_EFFECT_TWINKLE_LIFE;
+ }
+ if (!random_color) {
+ c->h = rgblight_config.hue;
+ c->s = rgblight_config.sat;
+ }
+ } else if (rand() < RAND_MAX * RGBLIGHT_EFFECT_TWINKLE_PROBABILITY) {
+ // This LED is off, but was randomly selected to start brightening
+ c->h = random_color ? rand() % 0xFF : rgblight_config.hue;
+ c->s = random_color ? (rand() % (rgblight_config.sat / 2)) + (rgblight_config.sat / 2) : rgblight_config.sat;
+ c->v = 0;
+ t->life = RGBLIGHT_EFFECT_TWINKLE_LIFE;
+ t->up = true;
+ } else {
+ // This LED is off, and was NOT selected to start brightening
+ }
+
+ LED_TYPE *ledp = led + i + rgblight_ranges.effect_start_pos;
+ sethsv(c->h, c->s, c->v, ledp);
+ }
+
+ rgblight_set();
+}
+#endif
diff --git a/quantum/rgblight.h b/quantum/rgblight.h
index 97882c5b296..6fc3b6f1776 100644
--- a/quantum/rgblight.h
+++ b/quantum/rgblight.h
@@ -59,6 +59,12 @@
| 34 | RGBLIGHT_MODE_STATIC_GRADIENT + 9 |
| 35 | RGBLIGHT_MODE_RGB_TEST |
| 36 | RGBLIGHT_MODE_ALTERNATING |
+| 37 | RGBLIGHT_MODE_TWINKLE |
+| 38 | RGBLIGHT_MODE_TWINKLE + 1 |
+| 39 | RGBLIGHT_MODE_TWINKLE + 2 |
+| 40 | RGBLIGHT_MODE_TWINKLE + 3 |
+| 41 | RGBLIGHT_MODE_TWINKLE + 4 |
+| 42 | RGBLIGHT_MODE_TWINKLE + 5 |
|-----------------|-----------------------------------|
*****/
@@ -73,6 +79,7 @@
# define RGBLIGHT_EFFECT_STATIC_GRADIENT
# define RGBLIGHT_EFFECT_RGB_TEST
# define RGBLIGHT_EFFECT_ALTERNATING
+# define RGBLIGHT_EFFECT_TWINKLE
#endif
#ifdef RGBLIGHT_STATIC_PATTERNS
@@ -89,7 +96,8 @@
|| defined(RGBLIGHT_EFFECT_KNIGHT) \
|| defined(RGBLIGHT_EFFECT_CHRISTMAS) \
|| defined(RGBLIGHT_EFFECT_RGB_TEST) \
- || defined(RGBLIGHT_EFFECT_ALTERNATING)
+ || defined(RGBLIGHT_EFFECT_ALTERNATING) \
+ || defined(RGBLIGHT_EFFECT_TWINKLE)
# define RGBLIGHT_USE_TIMER
#endif
@@ -130,7 +138,7 @@ enum RGBLIGHT_EFFECT_MODE {
# endif
# ifndef RGBLIGHT_EFFECT_KNIGHT_LED_NUM
-# define RGBLIGHT_EFFECT_KNIGHT_LED_NUM (effect_num_leds)
+# define RGBLIGHT_EFFECT_KNIGHT_LED_NUM (rgblight_ranges.effect_num_leds)
# endif
# ifndef RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL
@@ -141,6 +149,14 @@ enum RGBLIGHT_EFFECT_MODE {
# define RGBLIGHT_EFFECT_CHRISTMAS_STEP 2
# endif
+# ifndef RGBLIGHT_EFFECT_TWINKLE_LIFE
+# define RGBLIGHT_EFFECT_TWINKLE_LIFE 75
+# endif
+
+# ifndef RGBLIGHT_EFFECT_TWINKLE_PROBABILITY
+# define RGBLIGHT_EFFECT_TWINKLE_PROBABILITY 1 / 127
+# endif
+
# ifndef RGBLIGHT_HUE_STEP
# define RGBLIGHT_HUE_STEP 8
# endif
@@ -160,9 +176,7 @@ enum RGBLIGHT_EFFECT_MODE {
# include
# include
# include "eeconfig.h"
-# ifndef RGBLIGHT_CUSTOM_DRIVER
-# include "ws2812.h"
-# endif
+# include "ws2812.h"
# include "color.h"
# include "rgblight_list.h"
@@ -182,7 +196,20 @@ typedef struct {
# define RGBLIGHT_END_SEGMENT_INDEX (255)
# define RGBLIGHT_END_SEGMENTS \
{ RGBLIGHT_END_SEGMENT_INDEX, 0, 0, 0 }
-# define RGBLIGHT_MAX_LAYERS 8
+# ifndef RGBLIGHT_MAX_LAYERS
+# define RGBLIGHT_MAX_LAYERS 8
+# endif
+# if RGBLIGHT_MAX_LAYERS <= 0
+# error invalid RGBLIGHT_MAX_LAYERS value (must be >= 1)
+# elif RGBLIGHT_MAX_LAYERS <= 8
+typedef uint8_t rgblight_layer_mask_t;
+# elif RGBLIGHT_MAX_LAYERS <= 16
+typedef uint16_t rgblight_layer_mask_t;
+# elif RGBLIGHT_MAX_LAYERS <= 32
+typedef uint32_t rgblight_layer_mask_t;
+# else
+# error invalid RGBLIGHT_MAX_LAYERS value (must be <= 32)
+# endif
# define RGBLIGHT_LAYER_SEGMENTS(...) \
{ __VA_ARGS__, RGBLIGHT_END_SEGMENTS }
# define RGBLIGHT_LAYERS_LIST(...) \
@@ -194,6 +221,12 @@ bool rgblight_get_layer_state(uint8_t layer);
// Point this to an array of rgblight_segment_t arrays in keyboard_post_init_user to use rgblight layers
extern const rgblight_segment_t *const *rgblight_layers;
+
+# ifdef RGBLIGHT_LAYER_BLINK
+# define RGBLIGHT_USE_TIMER
+void rgblight_blink_layer(uint8_t layer, uint16_t duration_ms);
+# endif
+
# endif
extern LED_TYPE led[RGBLED_NUM];
@@ -204,6 +237,7 @@ extern const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[3] PROGMEM;
extern const uint8_t RGBLED_SNAKE_INTERVALS[3] PROGMEM;
extern const uint8_t RGBLED_KNIGHT_INTERVALS[3] PROGMEM;
extern const uint16_t RGBLED_RGBTEST_INTERVALS[1] PROGMEM;
+extern const uint8_t RGBLED_TWINKLE_INTERVALS[3] PROGMEM;
extern bool is_rgblight_initialized;
// Should stay in sycn with rgb matrix config as we reuse eeprom storage for both (for now)
@@ -226,10 +260,23 @@ typedef struct _rgblight_status_t {
uint8_t change_flags;
# endif
# ifdef RGBLIGHT_LAYERS
- uint8_t enabled_layer_mask;
+ rgblight_layer_mask_t enabled_layer_mask;
# endif
} rgblight_status_t;
+/*
+ * Structure for RGB Light clipping ranges
+ */
+typedef struct _rgblight_ranges_t {
+ uint8_t clipping_start_pos;
+ uint8_t clipping_num_leds;
+ uint8_t effect_start_pos;
+ uint8_t effect_end_pos;
+ uint8_t effect_num_leds;
+} rgblight_ranges_t;
+
+extern rgblight_ranges_t rgblight_ranges;
+
/* === Utility Functions ===*/
void sethsv(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1);
void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1); // without RGBLIGHT_LIMIT_VAL check
@@ -381,6 +428,7 @@ void rgblight_effect_knight(animation_status_t *anim);
void rgblight_effect_christmas(animation_status_t *anim);
void rgblight_effect_rgbtest(animation_status_t *anim);
void rgblight_effect_alternating(animation_status_t *anim);
+void rgblight_effect_twinkle(animation_status_t *anim);
# endif
diff --git a/quantum/rgblight_modes.h b/quantum/rgblight_modes.h
index 40c9ce4980a..7abdb87bc6e 100644
--- a/quantum/rgblight_modes.h
+++ b/quantum/rgblight_modes.h
@@ -53,6 +53,14 @@ _RGBM_SINGLE_DYNAMIC(RGB_TEST)
# ifdef RGBLIGHT_EFFECT_ALTERNATING
_RGBM_SINGLE_DYNAMIC(ALTERNATING)
# endif
+# ifdef RGBLIGHT_EFFECT_TWINKLE
+_RGBM_MULTI_DYNAMIC(TWINKLE)
+_RGBM_TMP_DYNAMIC(twinkle_38, TWINKLE)
+_RGBM_TMP_DYNAMIC(twinkle_39, TWINKLE)
+_RGBM_TMP_DYNAMIC(twinkle_40, TWINKLE)
+_RGBM_TMP_DYNAMIC(twinkle_41, TWINKLE)
+_RGBM_TMP_DYNAMIC(TWINKLE_end, TWINKLE)
+# endif
//// Add a new mode here.
// #ifdef RGBLIGHT_EFFECT_
// _RGBM__( )
diff --git a/quantum/send_string_keycodes.h b/quantum/send_string_keycodes.h
index 86dc8bf00c2..1e8a8e9ff5b 100644
--- a/quantum/send_string_keycodes.h
+++ b/quantum/send_string_keycodes.h
@@ -96,11 +96,13 @@
/* Modifiers */
#define X_LCTL X_LCTRL
#define X_LSFT X_LSHIFT
+#define X_LOPT X_LALT
#define X_LCMD X_LGUI
#define X_LWIN X_LGUI
#define X_RCTL X_RCTRL
#define X_RSFT X_RSHIFT
#define X_ALGR X_RALT
+#define X_ROPT X_RALT
#define X_RCMD X_RGUI
#define X_RWIN X_RGUI
diff --git a/quantum/split_common/transport.c b/quantum/split_common/transport.c
index ab421adc4a4..467ff81a97c 100644
--- a/quantum/split_common/transport.c
+++ b/quantum/split_common/transport.c
@@ -35,6 +35,9 @@ typedef struct _I2C_slave_buffer_t {
# ifdef ENCODER_ENABLE
uint8_t encoder_state[NUMBER_OF_ENCODERS];
# endif
+# ifdef WPM_ENABLE
+ uint8_t current_wpm;
+# endif
} I2C_slave_buffer_t;
static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_reg;
@@ -43,6 +46,7 @@ static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_re
# define I2C_RGB_START offsetof(I2C_slave_buffer_t, rgblight_sync)
# define I2C_KEYMAP_START offsetof(I2C_slave_buffer_t, smatrix)
# define I2C_ENCODER_START offsetof(I2C_slave_buffer_t, encoder_state)
+# define I2C_WPM_START offsetof(I2C_slave_buffer_t, current_wpm)
# define TIMEOUT 100
@@ -79,6 +83,14 @@ bool transport_master(matrix_row_t matrix[]) {
encoder_update_raw(i2c_buffer->encoder_state);
# endif
+# ifdef WPM_ENABLE
+ uint8_t current_wpm = get_current_wpm();
+ if (current_wpm != i2c_buffer->current_wpm) {
+ if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_WPM_START, (void *)¤t_wpm, sizeof(current_wpm), TIMEOUT) >= 0) {
+ i2c_buffer->current_wpm = current_wpm;
+ }
+ }
+# endif
return true;
}
@@ -102,6 +114,10 @@ void transport_slave(matrix_row_t matrix[]) {
# ifdef ENCODER_ENABLE
encoder_state_raw(i2c_buffer->encoder_state);
# endif
+
+# ifdef WPM_ENABLE
+ set_current_wpm(i2c_buffer->current_wpm);
+# endif
}
void transport_master_init(void) { i2c_init(); }
@@ -126,6 +142,9 @@ typedef struct _Serial_m2s_buffer_t {
# ifdef BACKLIGHT_ENABLE
uint8_t backlight_level;
# endif
+# ifdef WPM_ENABLE
+ uint8_t current_wpm;
+# endif
} Serial_m2s_buffer_t;
# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
@@ -228,6 +247,10 @@ bool transport_master(matrix_row_t matrix[]) {
encoder_update_raw((uint8_t *)serial_s2m_buffer.encoder_state);
# endif
+# ifdef WPM_ENABLE
+ // Write wpm to slave
+ serial_m2s_buffer.current_wpm = get_current_wpm();
+# endif
return true;
}
@@ -244,6 +267,10 @@ void transport_slave(matrix_row_t matrix[]) {
# ifdef ENCODER_ENABLE
encoder_state_raw((uint8_t *)serial_s2m_buffer.encoder_state);
# endif
+
+# ifdef WPM_ENABLE
+ set_current_wpm(serial_m2s_buffer.current_wpm);
+# endif
}
#endif
diff --git a/quantum/stm32/halconf.h b/quantum/stm32/halconf.h
index 106f0f5755f..533803a25f1 100644
--- a/quantum/stm32/halconf.h
+++ b/quantum/stm32/halconf.h
@@ -156,7 +156,7 @@
* @brief Enables the SPI subsystem.
*/
# if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
-# define HAL_USE_SPI FALSE
+# define HAL_USE_SPI TRUE
# endif
/**
diff --git a/quantum/stm32/mcuconf.h b/quantum/stm32/mcuconf.h
index ca4ad7b515e..71994a98e09 100644
--- a/quantum/stm32/mcuconf.h
+++ b/quantum/stm32/mcuconf.h
@@ -227,7 +227,7 @@
* SPI driver system settings.
*/
#define STM32_SPI_USE_SPI1 FALSE
-#define STM32_SPI_USE_SPI2 FALSE
+#define STM32_SPI_USE_SPI2 TRUE
#define STM32_SPI_USE_SPI3 FALSE
#define STM32_SPI_SPI1_DMA_PRIORITY 1
#define STM32_SPI_SPI2_DMA_PRIORITY 1
diff --git a/quantum/template/avr/config.h b/quantum/template/avr/config.h
index 7e4a014495e..88402fbdd06 100644
--- a/quantum/template/avr/config.h
+++ b/quantum/template/avr/config.h
@@ -192,10 +192,9 @@ along with this program. If not, see .
//#define NO_ACTION_ONESHOT
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
/*
* MIDI options
*/
diff --git a/quantum/template/avr/rules.mk b/quantum/template/avr/rules.mk
index ea0c83c68a1..2ea91a30139 100644
--- a/quantum/template/avr/rules.mk
+++ b/quantum/template/avr/rules.mk
@@ -11,16 +11,6 @@ MCU = atmega32u4
# ATmega328P USBasp
BOOTLOADER = atmel-dfu
-# If you don't know the bootloader type, then you can specify the
-# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line
-# Otherwise, delete this section
-# Teensy halfKay 512
-# Teensy++ halfKay 1024
-# Atmel DFU loader 4096
-# LUFA bootloader 4096
-# USBaspLoader 2048
-# OPT_DEFS += -DBOOTLOADER_SIZE=4096
-
# Build Options
# change yes to no to disable
#
@@ -37,6 +27,6 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
MIDI_ENABLE = no # MIDI support
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = no # Audio output on port C6
+AUDIO_ENABLE = no # Audio output
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
HD44780_ENABLE = no # Enable support for HD44780 based LCDs
diff --git a/quantum/template/ps2avrgb/config.h b/quantum/template/ps2avrgb/config.h
index 2eb4844226f..3f3fd5fd767 100644
--- a/quantum/template/ps2avrgb/config.h
+++ b/quantum/template/ps2avrgb/config.h
@@ -43,10 +43,8 @@ along with this program. If not, see .
#define RGBLIGHT_ANIMATIONS
/* disable these deprecated features by default */
-#ifndef LINK_TIME_OPTIMIZATION_ENABLE
- #define NO_ACTION_MACRO
- #define NO_ACTION_FUNCTION
-#endif
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
/* key combination for magic key command */
/* defined by default; to change, uncomment and set to the combination you want */
diff --git a/quantum/template/ps2avrgb/usbconfig.h b/quantum/template/ps2avrgb/usbconfig.h
deleted file mode 100644
index 83ad06544dc..00000000000
--- a/quantum/template/ps2avrgb/usbconfig.h
+++ /dev/null
@@ -1,373 +0,0 @@
-#pragma once
-
-#include "config.h"
-
-/*
-General Description:
-This file is an example configuration (with inline documentation) for the USB
-driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
-also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
-wire the lines to any other port, as long as D+ is also wired to INT0 (or any
-other hardware interrupt, as long as it is the highest level interrupt, see
-section at the end of this file).
-*/
-
-/* ---------------------------- Hardware Config ---------------------------- */
-
-#define USB_CFG_IOPORTNAME D
-/* This is the port where the USB bus is connected. When you configure it to
- * "B", the registers PORTB, PINB and DDRB will be used.
- */
-#define USB_CFG_DMINUS_BIT 3
-/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
- * This may be any bit in the port.
- */
-#define USB_CFG_DPLUS_BIT 2
-/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
- * This may be any bit in the port. Please note that D+ must also be connected
- * to interrupt pin INT0! [You can also use other interrupts, see section
- * "Optional MCU Description" below, or you can connect D- to the interrupt, as
- * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
- * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
- * markers every millisecond.]
- */
-#define USB_CFG_CLOCK_KHZ (F_CPU / 1000)
-/* Clock rate of the AVR in kHz. Legal values are 12000, 12800, 15000, 16000,
- * 16500, 18000 and 20000. The 12.8 MHz and 16.5 MHz versions of the code
- * require no crystal, they tolerate +/- 1% deviation from the nominal
- * frequency. All other rates require a precision of 2000 ppm and thus a
- * crystal!
- * Since F_CPU should be defined to your actual clock rate anyway, you should
- * not need to modify this setting.
- */
-#define USB_CFG_CHECK_CRC 0
-/* Define this to 1 if you want that the driver checks integrity of incoming
- * data packets (CRC checks). CRC checks cost quite a bit of code size and are
- * currently only available for 18 MHz crystal clock. You must choose
- * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
- */
-
-/* ----------------------- Optional Hardware Config ------------------------ */
-
-/* #define USB_CFG_PULLUP_IOPORTNAME D */
-/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
- * V+, you can connect and disconnect the device from firmware by calling
- * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
- * This constant defines the port on which the pullup resistor is connected.
- */
-/* #define USB_CFG_PULLUP_BIT 4 */
-/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
- * above) where the 1.5k pullup resistor is connected. See description
- * above for details.
- */
-
-/* --------------------------- Functional Range ---------------------------- */
-
-#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
-/* Define this to 1 if you want to compile a version with two endpoints: The
- * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
- * number).
- */
-#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
-/* Define this to 1 if you want to compile a version with three endpoints: The
- * default control endpoint 0, an interrupt-in endpoint 3 (or the number
- * configured below) and a catch-all default interrupt-in endpoint as above.
- * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
- */
-#define USB_CFG_EP3_NUMBER 3
-/* If the so-called endpoint 3 is used, it can now be configured to any other
- * endpoint number (except 0) with this macro. Default if undefined is 3.
- */
-/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
-/* The above macro defines the startup condition for data toggling on the
- * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
- * Since the token is toggled BEFORE sending any data, the first packet is
- * sent with the oposite value of this configuration!
- */
-#define USB_CFG_IMPLEMENT_HALT 0
-/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
- * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
- * it is required by the standard. We have made it a config option because it
- * bloats the code considerably.
- */
-#define USB_CFG_SUPPRESS_INTR_CODE 0
-/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
- * want to send any data over them. If this macro is defined to 1, functions
- * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
- * you need the interrupt-in endpoints in order to comply to an interface
- * (e.g. HID), but never want to send any data. This option saves a couple
- * of bytes in flash memory and the transmit buffers in RAM.
- */
-#define USB_CFG_IS_SELF_POWERED 0
-/* Define this to 1 if the device has its own power supply. Set it to 0 if the
- * device is powered from the USB bus.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 1
-/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
- * transfers. Set it to 0 if you don't need it and want to save a couple of
- * bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_READ 0
-/* Set this to 1 if you need to send control replies which are generated
- * "on the fly" when usbFunctionRead() is called. If you only want to send
- * data from a static buffer, set it to 0 and return the data from
- * usbFunctionSetup(). This saves a couple of bytes.
- */
-#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
-/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
- * You must implement the function usbFunctionWriteOut() which receives all
- * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
- * can be found in 'usbRxToken'.
- */
-#define USB_CFG_HAVE_FLOWCONTROL 0
-/* Define this to 1 if you want flowcontrol over USB data. See the definition
- * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
- * usbdrv.h.
- */
-#define USB_CFG_DRIVER_FLASH_PAGE 0
-/* If the device has more than 64 kBytes of flash, define this to the 64 k page
- * where the driver's constants (descriptors) are located. Or in other words:
- * Define this to 1 for boot loaders on the ATMega128.
- */
-#define USB_CFG_LONG_TRANSFERS 0
-/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
- * in a single control-in or control-out transfer. Note that the capability
- * for long transfers increases the driver size.
- */
-/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
-/* This macro is a hook if you want to do unconventional things. If it is
- * defined, it's inserted at the beginning of received message processing.
- * If you eat the received message and don't want default processing to
- * proceed, do a return after doing your things. One possible application
- * (besides debugging) is to flash a status LED on each packet.
- */
-/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
-/* This macro is a hook if you need to know when an USB RESET occurs. It has
- * one parameter which distinguishes between the start of RESET state and its
- * end.
- */
-/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
-/* This macro (if defined) is executed when a USB SET_ADDRESS request was
- * received.
- */
-#define USB_COUNT_SOF 1
-/* define this macro to 1 if you need the global variable "usbSofCount" which
- * counts SOF packets. This feature requires that the hardware interrupt is
- * connected to D- instead of D+.
- */
-/* #ifdef __ASSEMBLER__
- * macro myAssemblerMacro
- * in YL, TCNT0
- * sts timer0Snapshot, YL
- * endm
- * #endif
- * #define USB_SOF_HOOK myAssemblerMacro
- * This macro (if defined) is executed in the assembler module when a
- * Start Of Frame condition is detected. It is recommended to define it to
- * the name of an assembler macro which is defined here as well so that more
- * than one assembler instruction can be used. The macro may use the register
- * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
- * immediately after an SOF pulse may be lost and must be retried by the host.
- * What can you do with this hook? Since the SOF signal occurs exactly every
- * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
- * designs running on the internal RC oscillator.
- * Please note that Start Of Frame detection works only if D- is wired to the
- * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
- */
-#define USB_CFG_CHECK_DATA_TOGGLING 0
-/* define this macro to 1 if you want to filter out duplicate data packets
- * sent by the host. Duplicates occur only as a consequence of communication
- * errors, when the host does not receive an ACK. Please note that you need to
- * implement the filtering yourself in usbFunctionWriteOut() and
- * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
- * for each control- and out-endpoint to check for duplicate packets.
- */
-#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
-/* define this macro to 1 if you want the function usbMeasureFrameLength()
- * compiled in. This function can be used to calibrate the AVR's RC oscillator.
- */
-#define USB_USE_FAST_CRC 0
-/* The assembler module has two implementations for the CRC algorithm. One is
- * faster, the other is smaller. This CRC routine is only used for transmitted
- * messages where timing is not critical. The faster routine needs 31 cycles
- * per byte while the smaller one needs 61 to 69 cycles. The faster routine
- * may be worth the 32 bytes bigger code size if you transmit lots of data and
- * run the AVR close to its limit.
- */
-
-/* -------------------------- Device Description --------------------------- */
-
-#define USB_CFG_VENDOR_ID (VENDOR_ID & 0xFF), ((VENDOR_ID >> 8) & 0xFF)
-/* USB vendor ID for the device, low byte first. If you have registered your
- * own Vendor ID, define it here. Otherwise you may use one of obdev's free
- * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_ID (PRODUCT_ID & 0xFF), ((PRODUCT_ID >> 8) & 0xFF)
-/* This is the ID of the product, low byte first. It is interpreted in the
- * scope of the vendor ID. If you have registered your own VID with usb.org
- * or if you have licensed a PID from somebody else, define it here. Otherwise
- * you may use one of obdev's free shared VID/PID pairs. See the file
- * USB-IDs-for-free.txt for details!
- * *** IMPORTANT NOTE ***
- * This template uses obdev's shared VID/PID pair for Vendor Class devices
- * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
- * the implications!
- */
-#define USB_CFG_DEVICE_VERSION (DEVICE_VER & 0xFF), ((DEVICE_VER >> 8) & 0xFF)
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'w', 'i', 'n', 'k', 'e', 'y', 'l', 'e', 's', 's', '.', 'k', 'r'
-#define USB_CFG_VENDOR_NAME_LEN 13
-/* These two values define the vendor name returned by the USB device. The name
- * must be given as a list of characters under single quotes. The characters
- * are interpreted as Unicode (UTF-16) entities.
- * If you don't want a vendor name string, undefine these macros.
- * ALWAYS define a vendor name containing your Internet domain name if you use
- * obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
- * details.
- */
-#define USB_CFG_DEVICE_NAME 'p', 's', '2', 'a', 'v', 'r', 'G', 'B'
-#define USB_CFG_DEVICE_NAME_LEN 8
-/* Same as above for the device name. If you don't want a device name, undefine
- * the macros. See the file USB-IDs-for-free.txt before you assign a name if
- * you use a shared VID/PID.
- */
-/*#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e' */
-/*#define USB_CFG_SERIAL_NUMBER_LEN 0 */
-/* Same as above for the serial number. If you don't want a serial number,
- * undefine the macros.
- * It may be useful to provide the serial number through other means than at
- * compile time. See the section about descriptor properties below for how
- * to fine tune control over USB descriptors such as the string descriptor
- * for the serial number.
- */
-#define USB_CFG_DEVICE_CLASS 0
-#define USB_CFG_DEVICE_SUBCLASS 0
-/* See USB specification if you want to conform to an existing device class.
- * Class 0xff is "vendor specific".
- */
-#define USB_CFG_INTERFACE_CLASS 3 /* HID */
-#define USB_CFG_INTERFACE_SUBCLASS 1 /* Boot */
-#define USB_CFG_INTERFACE_PROTOCOL 1 /* Keyboard */
-/* See USB specification if you want to conform to an existing device class or
- * protocol. The following classes must be set at interface level:
- * HID class is 3, no subclass and protocol required (but may be useful!)
- * CDC class is 2, use subclass 2 and protocol 1 for ACM
- */
-#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
-/* Define this to the length of the HID report descriptor, if you implement
- * an HID device. Otherwise don't define it or define it to 0.
- * If you use this define, you must add a PROGMEM character array named
- * "usbHidReportDescriptor" to your code which contains the report descriptor.
- * Don't forget to keep the array and this define in sync!
- */
-
-/* #define USB_PUBLIC static */
-/* Use the define above if you #include usbdrv.c instead of linking against it.
- * This technique saves a couple of bytes in flash memory.
- */
-
-/* ------------------- Fine Control over USB Descriptors ------------------- */
-/* If you don't want to use the driver's default USB descriptors, you can
- * provide our own. These can be provided as (1) fixed length static data in
- * flash memory, (2) fixed length static data in RAM or (3) dynamically at
- * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
- * information about this function.
- * Descriptor handling is configured through the descriptor's properties. If
- * no properties are defined or if they are 0, the default descriptor is used.
- * Possible properties are:
- * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
- * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
- * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
- * you want RAM pointers.
- * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
- * in static memory is in RAM, not in flash memory.
- * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
- * the driver must know the descriptor's length. The descriptor itself is
- * found at the address of a well known identifier (see below).
- * List of static descriptor names (must be declared PROGMEM if in flash):
- * char usbDescriptorDevice[];
- * char usbDescriptorConfiguration[];
- * char usbDescriptorHidReport[];
- * char usbDescriptorString0[];
- * int usbDescriptorStringVendor[];
- * int usbDescriptorStringDevice[];
- * int usbDescriptorStringSerialNumber[];
- * Other descriptors can't be provided statically, they must be provided
- * dynamically at runtime.
- *
- * Descriptor properties are or-ed or added together, e.g.:
- * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
- *
- * The following descriptors are defined:
- * USB_CFG_DESCR_PROPS_DEVICE
- * USB_CFG_DESCR_PROPS_CONFIGURATION
- * USB_CFG_DESCR_PROPS_STRINGS
- * USB_CFG_DESCR_PROPS_STRING_0
- * USB_CFG_DESCR_PROPS_STRING_VENDOR
- * USB_CFG_DESCR_PROPS_STRING_PRODUCT
- * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
- * USB_CFG_DESCR_PROPS_HID
- * USB_CFG_DESCR_PROPS_HID_REPORT
- * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
- *
- * Note about string descriptors: String descriptors are not just strings, they
- * are Unicode strings prefixed with a 2 byte header. Example:
- * int serialNumberDescriptor[] = {
- * USB_STRING_DESCRIPTOR_HEADER(6),
- * 'S', 'e', 'r', 'i', 'a', 'l'
- * };
- */
-
-#define USB_CFG_DESCR_PROPS_DEVICE 0
-#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#define USB_CFG_DESCR_PROPS_STRINGS 0
-#define USB_CFG_DESCR_PROPS_STRING_0 0
-#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
-//#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#define USB_CFG_DESCR_PROPS_UNKNOWN 0
-
-#define usbMsgPtr_t unsigned short
-/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
- * a scalar type here because gcc generates slightly shorter code for scalar
- * arithmetics than for pointer arithmetics. Remove this define for backward
- * type compatibility or define it to an 8 bit type if you use data in RAM only
- * and all RAM is below 256 bytes (tiny memory model in IAR CC).
- */
-
-/* ----------------------- Optional MCU Description ------------------------ */
-
-/* The following configurations have working defaults in usbdrv.h. You
- * usually don't need to set them explicitly. Only if you want to run
- * the driver on a device which is not yet supported or with a compiler
- * which is not fully supported (such as IAR C) or if you use a differnt
- * interrupt than INT0, you may have to define some of these.
- */
-/* #define USB_INTR_CFG MCUCR */
-/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE GIMSK */
-/* #define USB_INTR_ENABLE_BIT INT0 */
-/* #define USB_INTR_PENDING GIFR */
-/* #define USB_INTR_PENDING_BIT INTF0 */
-/* #define USB_INTR_VECTOR INT0_vect */
-
-/* Set INT1 for D- falling edge to count SOF */
-/* #define USB_INTR_CFG EICRA */
-#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
-/* #define USB_INTR_CFG_CLR 0 */
-/* #define USB_INTR_ENABLE EIMSK */
-#define USB_INTR_ENABLE_BIT INT1
-/* #define USB_INTR_PENDING EIFR */
-#define USB_INTR_PENDING_BIT INTF1
-#define USB_INTR_VECTOR INT1_vect
diff --git a/quantum/via.c b/quantum/via.c
index f85af8d9e18..f2599d1d21b 100644
--- a/quantum/via.c
+++ b/quantum/via.c
@@ -92,36 +92,6 @@ void via_eeprom_reset(void) {
eeconfig_disable();
}
-// Override bootmagic_lite() so it can flag EEPROM as invalid
-// as well as jump to bootloader, thus performing a "factory reset"
-// of dynamic keymaps and optionally backlight/other settings.
-void bootmagic_lite(void) {
- // The lite version of TMK's bootmagic based on Wilba.
- // 100% less potential for accidentally making the
- // keyboard do stupid things.
-
- // We need multiple scans because debouncing can't be turned off.
- matrix_scan();
-#if defined(DEBOUNCE) && DEBOUNCE > 0
- wait_ms(DEBOUNCE * 2);
-#else
- wait_ms(30);
-#endif
- matrix_scan();
-
- // If the Esc and space bar are held down on power up,
- // reset the EEPROM valid state and jump to bootloader.
- // Assumes Esc is at [0,0].
- // This isn't very generalized, but we need something that doesn't
- // rely on user's keymaps in firmware or EEPROM.
- if (matrix_get_row(BOOTMAGIC_LITE_ROW) & (1 << BOOTMAGIC_LITE_COLUMN)) {
- // This is the only difference from the default implementation.
- via_eeprom_reset();
- // Jump to bootloader.
- bootloader_jump();
- }
-}
-
// Override this at the keyboard code level to check
// VIA's EEPROM valid state and reset to defaults as needed.
// Used by keyboards that store their own state in EEPROM,
@@ -141,7 +111,7 @@ void via_init(void) {
if (via_eeprom_is_valid()) {
} else {
// This resets the layout options
- via_set_layout_options(0);
+ via_set_layout_options(VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT);
// This resets the keymaps in EEPROM to what is in flash.
dynamic_keymap_reset();
// This resets the macros in EEPROM to nothing.
diff --git a/quantum/via.h b/quantum/via.h
index 012547e055b..373843f901a 100644
--- a/quantum/via.h
+++ b/quantum/via.h
@@ -37,6 +37,14 @@
# define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 1
#endif
+// Allow override of the layout options default value.
+// This requires advanced knowledge of how VIA stores layout options
+// and is only really useful for setting a boolean layout option
+// state to true by default.
+#ifndef VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT
+# define VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT 0x00000000
+#endif
+
// The end of the EEPROM memory used by VIA
// By default, dynamic keymaps will start at this if there is no
// custom config
diff --git a/quantum/wpm.c b/quantum/wpm.c
new file mode 100644
index 00000000000..da30bd252ce
--- /dev/null
+++ b/quantum/wpm.c
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2020 Richard Sutherland (rich@brickbots.com)
+ *
+ * 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 .
+ */
+
+#include "wpm.h"
+
+// WPM Stuff
+static uint8_t current_wpm = 0;
+static uint8_t latest_wpm = 0;
+static uint16_t wpm_timer = 0;
+
+// This smoothing is 40 keystrokes
+static const float wpm_smoothing = 0.0487;
+
+void set_current_wpm(uint8_t new_wpm) { current_wpm = new_wpm; }
+
+uint8_t get_current_wpm(void) { return current_wpm; }
+
+bool wpm_keycode(uint16_t keycode) { return wpm_keycode_kb(keycode); }
+
+__attribute__((weak)) bool wpm_keycode_kb(uint16_t keycode) { return wpm_keycode_user(keycode); }
+
+__attribute__((weak)) bool wpm_keycode_user(uint16_t keycode) {
+ if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX) || (keycode >= QK_MODS && keycode <= QK_MODS_MAX)) {
+ keycode = keycode & 0xFF;
+ } else if (keycode > 0xFF) {
+ keycode = 0;
+ }
+ if ((keycode >= KC_A && keycode <= KC_0) || (keycode >= KC_TAB && keycode <= KC_SLASH)) {
+ return true;
+ }
+
+ return false;
+}
+
+void update_wpm(uint16_t keycode) {
+ if (wpm_keycode(keycode)) {
+ if (wpm_timer > 0) {
+ latest_wpm = 60000 / timer_elapsed(wpm_timer) / 5;
+ current_wpm = (latest_wpm - current_wpm) * wpm_smoothing + current_wpm;
+ }
+ wpm_timer = timer_read();
+ }
+}
+
+void decay_wpm(void) {
+ if (timer_elapsed(wpm_timer) > 1000) {
+ current_wpm = (0 - current_wpm) * wpm_smoothing + current_wpm;
+ wpm_timer = timer_read();
+ }
+}
diff --git a/quantum/wpm.h b/quantum/wpm.h
new file mode 100644
index 00000000000..15ab4ffcd1b
--- /dev/null
+++ b/quantum/wpm.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2020 Richard Sutherland (rich@brickbots.com)
+ *
+ * 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 .
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+bool wpm_keycode(uint16_t keycode);
+bool wpm_keycode_kb(uint16_t keycode);
+bool wpm_keycode_user(uint16_t keycode);
+
+void set_current_wpm(uint8_t);
+uint8_t get_current_wpm(void);
+void update_wpm(uint16_t);
+
+void decay_wpm(void);
diff --git a/requirements-dev.txt b/requirements-dev.txt
new file mode 100644
index 00000000000..1db3b6d7331
--- /dev/null
+++ b/requirements-dev.txt
@@ -0,0 +1,8 @@
+# Install the necessary requirements
+-r requirements.txt
+
+# Python development requirements
+nose2
+flake8
+pep8-naming
+yapf
diff --git a/requirements.txt b/requirements.txt
index 074b11a8cee..aa6ee1ba329 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -4,6 +4,3 @@ appdirs
argcomplete
colorama
hjson
-nose2
-flake8
-pep8-naming
diff --git a/tmk_core/avr.mk b/tmk_core/avr.mk
index 1525391a45d..04ae1622469 100644
--- a/tmk_core/avr.mk
+++ b/tmk_core/avr.mk
@@ -98,34 +98,6 @@ ifndef TEENSY_LOADER_CLI
endif
endif
-# Generate a .qmk for the QMK-FF
-qmk: $(BUILD_DIR)/$(TARGET).hex
- zip $(TARGET).qmk -FSrj $(KEYMAP_PATH)/*
- zip $(TARGET).qmk -u $<
- printf "@ $<\n@=firmware.hex\n" | zipnote -w $(TARGET).qmk
- printf "{\n \"generated\": \"%s\"\n}" "$$(date)" > $(BUILD_DIR)/$(TARGET).json
- if [ -f $(KEYBOARD_PATH_5)/info.json ]; then \
- jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_5)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
- fi
- if [ -f $(KEYBOARD_PATH_4)/info.json ]; then \
- jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_4)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
- fi
- if [ -f $(KEYBOARD_PATH_3)/info.json ]; then \
- jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_3)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
- fi
- if [ -f $(KEYBOARD_PATH_2)/info.json ]; then \
- jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_2)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
- fi
- if [ -f $(KEYBOARD_PATH_1)/info.json ]; then \
- jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_1)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
- fi
- zip $(TARGET).qmk -urj $(BUILD_DIR)/$(TARGET).json
- printf "@ $(TARGET).json\n@=info.json\n" | zipnote -w $(TARGET).qmk
-
-# Program the device.
-program: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep check-size
- $(PROGRAM_CMD)
-
define EXEC_TEENSY
$(TEENSY_LOADER_CLI) -mmcu=$(MCU) -w -v $(BUILD_DIR)/$(TARGET).hex
endef
@@ -133,13 +105,6 @@ endef
teensy: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware
$(call EXEC_TEENSY)
-BATCHISP ?= batchisp
-
-flip: $(BUILD_DIR)/$(TARGET).hex check-size
- $(BATCHISP) -hardware usb -device $(MCU) -operation erase f
- $(BATCHISP) -hardware usb -device $(MCU) -operation loadbuffer $(BUILD_DIR)/$(TARGET).hex program
- $(BATCHISP) -hardware usb -device $(MCU) -operation start reset 0
-
DFU_PROGRAMMER ?= dfu-programmer
GREP ?= grep
@@ -174,13 +139,6 @@ dfu-start:
$(DFU_PROGRAMMER) $(MCU) reset
$(DFU_PROGRAMMER) $(MCU) start
-flip-ee: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep
- $(COPY) $(BUILD_DIR)/$(TARGET).eep $(BUILD_DIR)/$(TARGET)eep.hex
- $(BATCHISP) -hardware usb -device $(MCU) -operation memory EEPROM erase
- $(BATCHISP) -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(BUILD_DIR)/$(TARGET)eep.hex program
- $(BATCHISP) -hardware usb -device $(MCU) -operation start reset 0
- $(REMOVE) $(BUILD_DIR)/$(TARGET)eep.hex
-
dfu-ee: $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).eep
if $(DFU_PROGRAMMER) --version 2>&1 | $(GREP) -q 0.7 ; then\
$(DFU_PROGRAMMER) $(MCU) flash --eeprom $(BUILD_DIR)/$(TARGET).eep;\
@@ -198,17 +156,20 @@ dfu-split-right: $(BUILD_DIR)/$(TARGET).hex cpfirmware check-size
define EXEC_AVRDUDE
USB= ;\
if $(GREP) -q -s Microsoft /proc/version; then \
- echo 'ERROR: AVR flashing cannot be automated within the Windows Subsystem for Linux (WSL) currently. Instead, take the .hex file generated and flash it using AVRDUDE, AVRDUDESS, or XLoader.'; \
+ echo 'ERROR: AVR flashing cannot be automated within the Windows Subsystem for Linux (WSL) currently. Instead, take the .hex file generated and flash it using QMK Toolbox, AVRDUDE, AVRDUDESS, or XLoader.'; \
else \
printf "Detecting USB port, reset your controller now."; \
- ls /dev/tty* > /tmp/1; \
+ TMP1=`mktemp`; \
+ TMP2=`mktemp`; \
+ ls /dev/tty* > $$TMP1; \
while [ -z $$USB ]; do \
sleep 0.5; \
printf "."; \
- ls /dev/tty* > /tmp/2; \
- USB=`comm -13 /tmp/1 /tmp/2 | $(GREP) -o '/dev/tty.*'`; \
- mv /tmp/2 /tmp/1; \
+ ls /dev/tty* > $$TMP2; \
+ USB=`comm -13 $$TMP1 $$TMP2 | $(GREP) -o '/dev/tty.*'`; \
+ mv $$TMP2 $$TMP1; \
done; \
+ rm $$TMP1; \
echo ""; \
echo "Device $$USB has appeared; assuming it is the controller."; \
if $(GREP) -q -s 'MINGW\|MSYS' /proc/version; then \
@@ -338,7 +299,9 @@ production: $(BUILD_DIR)/$(TARGET).hex bootloader cpfirmware
$(SIZE) $(TARGET).hex $(TARGET)_bootloader.hex $(TARGET)_production.hex
flash: $(BUILD_DIR)/$(TARGET).hex check-size cpfirmware
-ifeq ($(strip $(BOOTLOADER)), caterina)
+ifneq ($(strip $(PROGRAM_CMD)),)
+ $(PROGRAM_CMD)
+else ifeq ($(strip $(BOOTLOADER)), caterina)
$(call EXEC_AVRDUDE)
else ifeq ($(strip $(BOOTLOADER)), halfkay)
$(call EXEC_TEENSY)
diff --git a/tmk_core/chibios.mk b/tmk_core/chibios.mk
index 577603080b1..d0f1032acb4 100644
--- a/tmk_core/chibios.mk
+++ b/tmk_core/chibios.mk
@@ -24,6 +24,7 @@ endif
#
# Imported source files and paths
+OPT_OS = chibios
CHIBIOS = $(TOP_DIR)/lib/chibios
CHIBIOS_CONTRIB = $(TOP_DIR)/lib/chibios-contrib
# Startup files. Try a few different locations, for compability with old versions and
@@ -49,6 +50,34 @@ PLATFORM_MK = $(CHIBIOS_CONTRIB)/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)/$(PLAT
endif
include $(PLATFORM_MK)
+# Bootloader address
+ifdef STM32_BOOTLOADER_ADDRESS
+ OPT_DEFS += -DSTM32_BOOTLOADER_ADDRESS=$(STM32_BOOTLOADER_ADDRESS)
+endif
+
+ifneq ("$(wildcard $(KEYBOARD_PATH_5)/bootloader_defs.h)","")
+ OPT_DEFS += -include $(KEYBOARD_PATH_5)/bootloader_defs.h
+else ifneq ("$(wildcard $(KEYBOARD_PATH_5)/boards/$(BOARD)/bootloader_defs.h)","")
+ OPT_DEFS += -include $(KEYBOARD_PATH_5)/boards/$(BOARD)/bootloader_defs.h
+else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/bootloader_defs.h)","")
+ OPT_DEFS += -include $(KEYBOARD_PATH_4)/bootloader_defs.h
+else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/boards/$(BOARD)/bootloader_defs.h)","")
+ OPT_DEFS += -include $(KEYBOARD_PATH_4)/boards/$(BOARD)/bootloader_defs.h
+else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/bootloader_defs.h)","")
+ OPT_DEFS += -include $(KEYBOARD_PATH_3)/bootloader_defs.h
+else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/boards/$(BOARD)/bootloader_defs.h)","")
+ OPT_DEFS += -include $(KEYBOARD_PATH_3)/boards/$(BOARD)/bootloader_defs.h
+else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/bootloader_defs.h)","")
+ OPT_DEFS += -include $(KEYBOARD_PATH_2)/bootloader_defs.h
+else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/boards/$(BOARD)/bootloader_defs.h)","")
+ OPT_DEFS += -include $(KEYBOARD_PATH_2)/boards/$(BOARD)/bootloader_defs.h
+else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/bootloader_defs.h)","")
+ OPT_DEFS += -include $(KEYBOARD_PATH_1)/bootloader_defs.h
+else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/boards/$(BOARD)/bootloader_defs.h)","")
+ OPT_DEFS += -include $(KEYBOARD_PATH_1)/boards/$(BOARD)/bootloader_defs.h
+else ifneq ("$(wildcard $(TOP_DIR)/drivers/boards/$(BOARD)/bootloader_defs.h)","")
+ OPT_DEFS += -include $(TOP_DIR)/drivers/boards/$(BOARD)/bootloader_defs.h
+endif
BOARD_MK :=
@@ -179,7 +208,7 @@ HEX = $(OBJCOPY) -O $(FORMAT)
EEP =
BIN = $(OBJCOPY) -O binary
-COMMON_VPATH += $(DRIVER_PATH)/arm
+COMMON_VPATH += $(DRIVER_PATH)/chibios
THUMBFLAGS = -DTHUMB_PRESENT -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -mthumb -DTHUMB
@@ -204,7 +233,6 @@ LDFLAGS += -mno-thumb-interwork -mthumb
LDSYMBOLS =,--defsym=__process_stack_size__=$(USE_PROCESS_STACKSIZE)
LDSYMBOLS :=$(LDSYMBOLS),--defsym=__main_stack_size__=$(USE_EXCEPTIONS_STACKSIZE)
LDFLAGS += -Wl,--script=$(LDSCRIPT)$(LDSYMBOLS)
-LDFLAGS += --specs=nano.specs
OPT_DEFS += -DPROTOCOL_CHIBIOS
@@ -244,30 +272,6 @@ EXTRALIBDIRS = $(RULESPATH)/ld
DFU_UTIL ?= dfu-util
ST_LINK_CLI ?= st-link_cli
-# Generate a .qmk for the QMK-FF
-qmk: $(BUILD_DIR)/$(TARGET).bin
- zip $(TARGET).qmk -FSrj $(KEYMAP_PATH)/*
- zip $(TARGET).qmk -u $<
- printf "@ $<\n@=firmware.bin\n" | zipnote -w $(TARGET).qmk
- printf "{\n \"generated\": \"%s\"\n}" "$$(date)" > $(BUILD_DIR)/$(TARGET).json
- if [ -f $(KEYBOARD_PATH_5)/info.json ]; then \
- jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_5)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
- fi
- if [ -f $(KEYBOARD_PATH_4)/info.json ]; then \
- jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_4)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
- fi
- if [ -f $(KEYBOARD_PATH_3)/info.json ]; then \
- jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_3)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
- fi
- if [ -f $(KEYBOARD_PATH_2)/info.json ]; then \
- jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_2)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
- fi
- if [ -f $(KEYBOARD_PATH_1)/info.json ]; then \
- jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_1)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
- fi
- zip $(TARGET).qmk -urj $(BUILD_DIR)/$(TARGET).json
- printf "@ $(TARGET).json\n@=info.json\n" | zipnote -w $(TARGET).qmk
-
define EXEC_DFU_UTIL
until $(DFU_UTIL) -l | grep -q "Found DFU"; do\
printf "$(MSG_BOOTLOADER_NOT_FOUND)" ;\
@@ -322,7 +326,9 @@ bin: $(BUILD_DIR)/$(TARGET).bin sizeafter
flash: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter
-ifeq ($(strip $(BOOTLOADER)),dfu)
+ifneq ($(strip $(PROGRAM_CMD)),)
+ $(PROGRAM_CMD)
+else ifeq ($(strip $(BOOTLOADER)),dfu)
$(call EXEC_DFU_UTIL)
else ifeq ($(strip $(MCU_FAMILY)),KINETIS)
$(call EXEC_TEENSY)
diff --git a/tmk_core/common.mk b/tmk_core/common.mk
index 6863929cee5..aa8a0eb7ad7 100644
--- a/tmk_core/common.mk
+++ b/tmk_core/common.mk
@@ -1,13 +1,5 @@
COMMON_DIR = common
-ifeq ($(PLATFORM),AVR)
- PLATFORM_COMMON_DIR = $(COMMON_DIR)/avr
-else ifeq ($(PLATFORM),CHIBIOS)
- PLATFORM_COMMON_DIR = $(COMMON_DIR)/chibios
-else ifeq ($(PLATFORM),ARM_ATSAM)
- PLATFORM_COMMON_DIR = $(COMMON_DIR)/arm_atsam
-else
- PLATFORM_COMMON_DIR = $(COMMON_DIR)/test
-endif
+PLATFORM_COMMON_DIR = $(COMMON_DIR)/$(PLATFORM_KEY)
TMK_COMMON_SRC += $(COMMON_DIR)/host.c \
$(COMMON_DIR)/keyboard.c \
@@ -18,6 +10,7 @@ TMK_COMMON_SRC += $(COMMON_DIR)/host.c \
$(COMMON_DIR)/action_util.c \
$(COMMON_DIR)/print.c \
$(COMMON_DIR)/debug.c \
+ $(COMMON_DIR)/sendchar_null.c \
$(COMMON_DIR)/util.c \
$(COMMON_DIR)/eeconfig.c \
$(COMMON_DIR)/report.c \
@@ -42,6 +35,8 @@ ifneq ($(strip $(BOOTMAGIC_ENABLE)), no)
endif
ifeq ($(strip $(BOOTMAGIC_ENABLE)), lite)
TMK_COMMON_DEFS += -DBOOTMAGIC_LITE
+ TMK_COMMON_SRC += $(COMMON_DIR)/bootmagic_lite.c
+
TMK_COMMON_DEFS += -DMAGIC_ENABLE
TMK_COMMON_SRC += $(COMMON_DIR)/magic.c
else
@@ -168,17 +163,8 @@ ifeq ($(strip $(LINK_TIME_OPTIMIZATION_ENABLE)), yes)
endif
EXTRAFLAGS += -flto
TMK_COMMON_DEFS += -DLINK_TIME_OPTIMIZATION_ENABLE
- TMK_COMMON_DEFS += -DNO_ACTION_MACRO
- TMK_COMMON_DEFS += -DNO_ACTION_FUNCTION
-endif
-
-# Bootloader address
-ifdef STM32_BOOTLOADER_ADDRESS
- TMK_COMMON_DEFS += -DSTM32_BOOTLOADER_ADDRESS=$(STM32_BOOTLOADER_ADDRESS)
endif
# Search Path
VPATH += $(TMK_PATH)/$(COMMON_DIR)
-ifeq ($(PLATFORM),CHIBIOS)
-VPATH += $(TMK_PATH)/$(COMMON_DIR)/chibios
-endif
+VPATH += $(TMK_PATH)/$(PLATFORM_COMMON_DIR)
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c
index 555a71ebc62..3b1268dc940 100644
--- a/tmk_core/common/action.c
+++ b/tmk_core/common/action.c
@@ -98,6 +98,11 @@ void action_exec(keyevent_t event) {
if (has_oneshot_mods_timed_out()) {
clear_oneshot_mods();
}
+# ifdef SWAP_HANDS_ENABLE
+ if (has_oneshot_swaphands_timed_out()) {
+ clear_oneshot_swaphands();
+ }
+# endif
# endif
#endif
@@ -151,6 +156,8 @@ void process_record_nocache(keyrecord_t *record) { process_record(record); }
__attribute__((weak)) bool process_record_quantum(keyrecord_t *record) { return true; }
+__attribute__((weak)) void post_process_record_quantum(keyrecord_t *record) {}
+
#ifndef NO_ACTION_TAPPING
/** \brief Allows for handling tap-hold actions immediately instead of waiting for TAPPING_TERM or another keypress.
*
@@ -163,6 +170,8 @@ void process_record_tap_hint(keyrecord_t *record) {
# ifdef SWAP_HANDS_ENABLE
case ACT_SWAP_HANDS:
switch (action.swap.code) {
+ case OP_SH_ONESHOT:
+ break;
case OP_SH_TAP_TOGGLE:
default:
swap_hands = !swap_hands;
@@ -185,6 +194,11 @@ void process_record(keyrecord_t *record) {
if (!process_record_quantum(record)) return;
+ process_record_handler(record);
+ post_process_record_quantum(record);
+}
+
+void process_record_handler(keyrecord_t *record) {
action_t action = store_or_get_action(record->event.pressed, record->event.key);
dprint("ACTION: ");
debug_action(action);
@@ -217,7 +231,11 @@ void process_action(keyrecord_t *record, action_t action) {
#ifndef NO_ACTION_ONESHOT
bool do_release_oneshot = false;
// notice we only clear the one shot layer if the pressed key is not a modifier.
- if (is_oneshot_layer_active() && event.pressed && !IS_MOD(action.key.code)) {
+ if (is_oneshot_layer_active() && event.pressed && !IS_MOD(action.key.code)
+# ifdef SWAP_HANDS_ENABLE
+ && !(action.kind.id == ACT_SWAP_HANDS && action.swap.code == OP_SH_ONESHOT)
+# endif
+ ) {
clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
do_release_oneshot = !is_oneshot_layer_active();
}
@@ -317,7 +335,7 @@ void process_action(keyrecord_t *record, action_t action) {
# if !defined(IGNORE_MOD_TAP_INTERRUPT) || defined(IGNORE_MOD_TAP_INTERRUPT_PER_KEY)
if (
# ifdef IGNORE_MOD_TAP_INTERRUPT_PER_KEY
- !get_ignore_mod_tap_interrupt(get_event_keycode(record->event)) &&
+ !get_ignore_mod_tap_interrupt(get_event_keycode(record->event, false)) &&
# endif
record->tap.interrupted) {
dprint("mods_tap: tap: cancel: add_mods\n");
@@ -562,8 +580,6 @@ void process_action(keyrecord_t *record, action_t action) {
action_macro_play(action_get_macro(record, action.func.id, action.func.opt));
break;
#endif
- case ACT_COMMAND:
- break;
#ifdef SWAP_HANDS_ENABLE
case ACT_SWAP_HANDS:
switch (action.swap.code) {
@@ -588,6 +604,14 @@ void process_action(keyrecord_t *record, action_t action) {
swap_hands = false;
}
break;
+ case OP_SH_ONESHOT:
+ if (event.pressed) {
+ set_oneshot_swaphands();
+ } else {
+ release_oneshot_swaphands();
+ }
+ break;
+
# ifndef NO_ACTION_TAPPING
case OP_SH_TAP_TOGGLE:
/* tap toggle */
@@ -676,6 +700,12 @@ void process_action(keyrecord_t *record, action_t action) {
# endif
#endif
+#ifdef SWAP_HANDS_ENABLE
+ if (event.pressed && !(action.kind.id == ACT_SWAP_HANDS && action.swap.code == OP_SH_ONESHOT)) {
+ use_oneshot_swaphands();
+ }
+#endif
+
#ifndef NO_ACTION_ONESHOT
/* Because we switch layers after a oneshot event, we need to release the
* key before we leave the layer or no key up event will be generated.
@@ -770,11 +800,12 @@ void register_code(uint8_t code) {
add_mods(MOD_BIT(code));
send_keyboard_report();
}
+#ifdef EXTRAKEY_ENABLE
else if
IS_SYSTEM(code) { host_system_send(KEYCODE2SYSTEM(code)); }
else if
IS_CONSUMER(code) { host_consumer_send(KEYCODE2CONSUMER(code)); }
-
+#endif
#ifdef MOUSEKEY_ENABLE
else if
IS_MOUSEKEY(code) {
@@ -864,7 +895,7 @@ void tap_code(uint8_t code) {
/** \brief Adds the given physically pressed modifiers and sends a keyboard report immediately.
*
- * \param mods A bitfield of modifiers to unregister.
+ * \param mods A bitfield of modifiers to register.
*/
void register_mods(uint8_t mods) {
if (mods) {
@@ -990,7 +1021,6 @@ bool is_tap_action(action_t action) {
* FIXME: Needs documentation.
*/
void debug_event(keyevent_t event) { dprintf("%04X%c(%u)", (event.key.row << 8 | event.key.col), (event.pressed ? 'd' : 'u'), event.time); }
-
/** \brief Debug print (FIXME: Needs better description)
*
* FIXME: Needs documentation.
@@ -1041,9 +1071,6 @@ void debug_action(action_t action) {
case ACT_MACRO:
dprint("ACT_MACRO");
break;
- case ACT_COMMAND:
- dprint("ACT_COMMAND");
- break;
case ACT_FUNCTION:
dprint("ACT_FUNCTION");
break;
diff --git a/tmk_core/common/action.h b/tmk_core/common/action.h
index 15f4ce15c04..c82c9c81be4 100644
--- a/tmk_core/common/action.h
+++ b/tmk_core/common/action.h
@@ -28,6 +28,16 @@ along with this program. If not, see .
extern "C" {
#endif
+/* Disable macro and function features when LTO is enabled, since they break */
+#ifdef LINK_TIME_OPTIMIZATION_ENABLE
+# ifndef NO_ACTION_MACRO
+# define NO_ACTION_MACRO
+# endif
+# ifndef NO_ACTION_FUNCTION
+# define NO_ACTION_FUNCTION
+# endif
+#endif
+
/* tapping count and state */
typedef struct {
bool interrupted : 1;
@@ -84,6 +94,8 @@ void process_hand_swap(keyevent_t *record);
void process_record_nocache(keyrecord_t *record);
void process_record(keyrecord_t *record);
+void process_record_handler(keyrecord_t *record);
+void post_process_record_quantum(keyrecord_t *record);
void process_action(keyrecord_t *record, action_t action);
void register_code(uint8_t code);
void unregister_code(uint8_t code);
diff --git a/tmk_core/common/action_code.h b/tmk_core/common/action_code.h
index 6c005b76d14..eea554ff216 100644
--- a/tmk_core/common/action_code.h
+++ b/tmk_core/common/action_code.h
@@ -87,9 +87,7 @@ along with this program. If not, see .
* 1100|1111| id(8) Macro record?
*
* 1101|xxxx xxxx xxxx (reserved)
- *
- * ACT_COMMAND(1110):
- * 1110|opt | id(8) Built-in Command exec
+ * 1110|xxxx xxxx xxxx (reserved)
*
* ACT_FUNCTION(1111):
* 1111| address(12) Function?
@@ -115,7 +113,6 @@ enum action_kind_id {
ACT_LAYER_TAP_EXT = 0b1011, /* Layer 16-31 */
/* Extensions */
ACT_MACRO = 0b1100,
- ACT_COMMAND = 0b1110,
ACT_FUNCTION = 0b1111
};
@@ -167,11 +164,6 @@ typedef union {
uint8_t page : 2;
uint8_t kind : 4;
} usage;
- struct action_command {
- uint8_t id : 8;
- uint8_t opt : 4;
- uint8_t kind : 4;
- } command;
struct action_function {
uint8_t id : 8;
uint8_t opt : 4;
@@ -287,8 +279,6 @@ enum layer_param_tap_op {
#define ACTION_MACRO(id) ACTION(ACT_MACRO, (id))
#define ACTION_MACRO_TAP(id) ACTION(ACT_MACRO, FUNC_TAP << 8 | (id))
#define ACTION_MACRO_OPT(id, opt) ACTION(ACT_MACRO, (opt) << 8 | (id))
-/* Command */
-#define ACTION_COMMAND(id, opt) ACTION(ACT_COMMAND, (opt) << 8 | (id))
/* Function */
enum function_opts {
FUNC_TAP = 0x8, /* indciates function is tappable */
@@ -304,11 +294,13 @@ enum swap_hands_param_tap_op {
OP_SH_OFF_ON,
OP_SH_OFF,
OP_SH_ON,
+ OP_SH_ONESHOT,
};
#define ACTION_SWAP_HANDS() ACTION_SWAP_HANDS_ON_OFF()
#define ACTION_SWAP_HANDS_TOGGLE() ACTION(ACT_SWAP_HANDS, OP_SH_TOGGLE)
#define ACTION_SWAP_HANDS_TAP_TOGGLE() ACTION(ACT_SWAP_HANDS, OP_SH_TAP_TOGGLE)
+#define ACTION_SWAP_HANDS_ONESHOT() ACTION(ACT_SWAP_HANDS, OP_SH_ONESHOT)
#define ACTION_SWAP_HANDS_TAP_KEY(key) ACTION(ACT_SWAP_HANDS, key)
#define ACTION_SWAP_HANDS_ON_OFF() ACTION(ACT_SWAP_HANDS, OP_SH_ON_OFF)
#define ACTION_SWAP_HANDS_OFF_ON() ACTION(ACT_SWAP_HANDS, OP_SH_OFF_ON)
diff --git a/tmk_core/common/action_layer.c b/tmk_core/common/action_layer.c
index 81f86f0f345..af2d7d964b7 100644
--- a/tmk_core/common/action_layer.c
+++ b/tmk_core/common/action_layer.c
@@ -257,7 +257,7 @@ uint8_t layer_switch_get_layer(keypos_t key) {
layer_state_t layers = layer_state | default_layer_state;
/* check top layer first */
- for (int8_t i = sizeof(layer_state_t) * 8 - 1; i >= 0; i--) {
+ for (int8_t i = MAX_LAYER - 1; i >= 0; i--) {
if (layers & (1UL << i)) {
action = action_for_key(i, key);
if (action.code != ACTION_TRANSPARENT) {
diff --git a/tmk_core/common/action_layer.h b/tmk_core/common/action_layer.h
index b8562f5a46f..16922c1ff92 100644
--- a/tmk_core/common/action_layer.h
+++ b/tmk_core/common/action_layer.h
@@ -23,12 +23,24 @@ along with this program. If not, see .
#if defined(LAYER_STATE_8BIT)
typedef uint8_t layer_state_t;
+# define MAX_LAYER_BITS 3
+# ifndef MAX_LAYER
+# define MAX_LAYER 8
+# endif
# define get_highest_layer(state) biton(state)
#elif defined(LAYER_STATE_16BIT)
typedef uint16_t layer_state_t;
+# define MAX_LAYER_BITS 4
+# ifndef MAX_LAYER
+# define MAX_LAYER 16
+# endif
# define get_highest_layer(state) biton16(state)
#else
typedef uint32_t layer_state_t;
+# define MAX_LAYER_BITS 5
+# ifndef MAX_LAYER
+# define MAX_LAYER 32
+# endif
# define get_highest_layer(state) biton32(state)
#endif
@@ -82,13 +94,13 @@ void layer_xor(layer_state_t state);
# define layer_debug()
# define layer_clear()
-# define layer_move(layer)
-# define layer_on(layer)
-# define layer_off(layer)
-# define layer_invert(layer)
-# define layer_or(state)
-# define layer_and(state)
-# define layer_xor(state)
+# define layer_move(layer) (void)layer
+# define layer_on(layer) (void)layer
+# define layer_off(layer) (void)layer
+# define layer_invert(layer) (void)layer
+# define layer_or(state) (void)state
+# define layer_and(state) (void)state
+# define layer_xor(state) (void)state
#endif
layer_state_t layer_state_set_user(layer_state_t state);
@@ -96,8 +108,7 @@ layer_state_t layer_state_set_kb(layer_state_t state);
/* pressed actions cache */
#if !defined(NO_ACTION_LAYER) && !defined(STRICT_LAYER_RELEASE)
-/* The number of bits needed to represent the layer number: log2(32). */
-# define MAX_LAYER_BITS 5
+
void update_source_layers_cache(keypos_t key, uint8_t layer);
uint8_t read_source_layers_cache(keypos_t key);
#endif
diff --git a/tmk_core/common/action_tapping.c b/tmk_core/common/action_tapping.c
index acce3ee5157..34f08d89048 100644
--- a/tmk_core/common/action_tapping.c
+++ b/tmk_core/common/action_tapping.c
@@ -22,7 +22,7 @@
__attribute__((weak)) uint16_t get_tapping_term(uint16_t keycode) { return TAPPING_TERM; }
# ifdef TAPPING_TERM_PER_KEY
-# define WITHIN_TAPPING_TERM(e) (TIMER_DIFF_16(e.time, tapping_key.event.time) < get_tapping_term(get_event_keycode(tapping_key.event)))
+# define WITHIN_TAPPING_TERM(e) (TIMER_DIFF_16(e.time, tapping_key.event.time) < get_tapping_term(get_event_keycode(tapping_key.event, false)))
# else
# define WITHIN_TAPPING_TERM(e) (TIMER_DIFF_16(e.time, tapping_key.event.time) < TAPPING_TERM)
# endif
@@ -122,10 +122,10 @@ bool process_tapping(keyrecord_t *keyp) {
# if defined(TAPPING_TERM_PER_KEY) || (TAPPING_TERM >= 500) || defined(PERMISSIVE_HOLD) || defined(PERMISSIVE_HOLD_PER_KEY)
else if (
# ifdef TAPPING_TERM_PER_KEY
- (get_tapping_term(get_event_keycode(tapping_key.event)) >= 500) &&
+ (get_tapping_term(get_event_keycode(tapping_key.event, false)) >= 500) &&
# endif
# ifdef PERMISSIVE_HOLD_PER_KEY
- !get_permissive_hold(get_event_keycode(tapping_key.event), keyp) &&
+ !get_permissive_hold(get_event_keycode(tapping_key.event, false), keyp) &&
# endif
IS_RELEASED(event) && waiting_buffer_typed(event)) {
debug("Tapping: End. No tap. Interfered by typing key\n");
@@ -246,7 +246,7 @@ bool process_tapping(keyrecord_t *keyp) {
# if !defined(TAPPING_FORCE_HOLD) || defined(TAPPING_FORCE_HOLD_PER_KEY)
if (
# ifdef TAPPING_FORCE_HOLD_PER_KEY
- !get_tapping_force_hold(get_event_keycode(tapping_key.event), keyp) &&
+ !get_tapping_force_hold(get_event_keycode(tapping_key.event, false), keyp) &&
# endif
!tapping_key.tap.interrupted && tapping_key.tap.count > 0) {
// sequential tap.
diff --git a/tmk_core/common/action_tapping.h b/tmk_core/common/action_tapping.h
index 509d5eabd84..5eaef1c5f09 100644
--- a/tmk_core/common/action_tapping.h
+++ b/tmk_core/common/action_tapping.h
@@ -32,7 +32,7 @@ along with this program. If not, see .
#define WAITING_BUFFER_SIZE 8
#ifndef NO_ACTION_TAPPING
-uint16_t get_event_keycode(keyevent_t event);
+uint16_t get_event_keycode(keyevent_t event, bool update_layer_cache);
uint16_t get_tapping_term(uint16_t keycode);
void action_tapping_process(keyrecord_t record);
#endif
diff --git a/tmk_core/common/action_util.c b/tmk_core/common/action_util.c
index 335aa36e62a..371acfa610b 100644
--- a/tmk_core/common/action_util.c
+++ b/tmk_core/common/action_util.c
@@ -83,9 +83,63 @@ static int8_t oneshot_layer_data = 0;
inline uint8_t get_oneshot_layer(void) { return oneshot_layer_data >> 3; }
inline uint8_t get_oneshot_layer_state(void) { return oneshot_layer_data & 0b111; }
+# ifdef SWAP_HANDS_ENABLE
+enum {
+ SHO_OFF,
+ SHO_ACTIVE, // Swap hands button was pressed, and we didn't send any swapped keys yet
+ SHO_PRESSED, // Swap hands button is currently pressed
+ SHO_USED, // Swap hands button is still pressed, and we already sent swapped keys
+} swap_hands_oneshot = SHO_OFF;
+# endif
+
# if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
static uint16_t oneshot_layer_time = 0;
inline bool has_oneshot_layer_timed_out() { return TIMER_DIFF_16(timer_read(), oneshot_layer_time) >= ONESHOT_TIMEOUT && !(get_oneshot_layer_state() & ONESHOT_TOGGLED); }
+# ifdef SWAP_HANDS_ENABLE
+static uint16_t oneshot_swaphands_time = 0;
+inline bool has_oneshot_swaphands_timed_out() { return TIMER_DIFF_16(timer_read(), oneshot_swaphands_time) >= ONESHOT_TIMEOUT && !(swap_hands_oneshot >= SHO_PRESSED); }
+# endif
+# endif
+
+# ifdef SWAP_HANDS_ENABLE
+
+void set_oneshot_swaphands(void) {
+ swap_hands_oneshot = SHO_PRESSED;
+ swap_hands = true;
+# if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
+ oneshot_swaphands_time = timer_read();
+ if (oneshot_layer_time != 0) {
+ oneshot_layer_time = oneshot_swaphands_time;
+ }
+# endif
+}
+
+void release_oneshot_swaphands(void) {
+ if (swap_hands_oneshot == SHO_PRESSED) {
+ swap_hands_oneshot = SHO_ACTIVE;
+ }
+ if (swap_hands_oneshot == SHO_USED) {
+ clear_oneshot_swaphands();
+ }
+}
+
+void use_oneshot_swaphands(void) {
+ if (swap_hands_oneshot == SHO_PRESSED) {
+ swap_hands_oneshot = SHO_USED;
+ }
+ if (swap_hands_oneshot == SHO_ACTIVE) {
+ clear_oneshot_swaphands();
+ }
+}
+
+void clear_oneshot_swaphands(void) {
+ swap_hands_oneshot = SHO_OFF;
+ swap_hands = false;
+# if (defined(ONESHOT_TIMEOUT) && (ONESHOT_TIMEOUT > 0))
+ oneshot_swaphands_time = 0;
+# endif
+}
+
# endif
/** \brief Set oneshot layer
diff --git a/tmk_core/common/action_util.h b/tmk_core/common/action_util.h
index 1ce03ed0e44..5dd8393da48 100644
--- a/tmk_core/common/action_util.h
+++ b/tmk_core/common/action_util.h
@@ -77,6 +77,7 @@ void reset_oneshot_layer(void);
bool is_oneshot_layer_active(void);
uint8_t get_oneshot_layer_state(void);
bool has_oneshot_layer_timed_out(void);
+bool has_oneshot_swaphands_timed_out(void);
void oneshot_locked_mods_changed_user(uint8_t mods);
void oneshot_locked_mods_changed_kb(uint8_t mods);
@@ -88,6 +89,13 @@ void oneshot_layer_changed_kb(uint8_t layer);
/* inspect */
uint8_t has_anymod(void);
+#ifdef SWAP_HANDS_ENABLE
+void set_oneshot_swaphands(void);
+void release_oneshot_swaphands(void);
+void use_oneshot_swaphands(void);
+void clear_oneshot_swaphands(void);
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/tmk_core/common/avr/bootloader.c b/tmk_core/common/avr/bootloader.c
index ca9746f327d..7e5d2b05794 100644
--- a/tmk_core/common/avr/bootloader.c
+++ b/tmk_core/common/avr/bootloader.c
@@ -237,17 +237,17 @@ void bootloader_jump(void) {
"bootloader_startup_loop%=: \n\t"
"rjmp bootloader_startup_loop%= \n\t"
:
- : [ mcucsrio ] "I"(_SFR_IO_ADDR(MCUCSR)),
+ : [mcucsrio] "I"(_SFR_IO_ADDR(MCUCSR)),
# if (FLASHEND > 131071)
- [ ramendhi ] "M"(((RAMEND - 2) >> 8) & 0xff), [ ramendlo ] "M"(((RAMEND - 2) >> 0) & 0xff), [ bootaddrhi ] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 16) & 0xff),
+ [ramendhi] "M"(((RAMEND - 2) >> 8) & 0xff), [ramendlo] "M"(((RAMEND - 2) >> 0) & 0xff), [bootaddrhi] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 16) & 0xff),
# else
- [ ramendhi ] "M"(((RAMEND - 1) >> 8) & 0xff), [ ramendlo ] "M"(((RAMEND - 1) >> 0) & 0xff),
+ [ramendhi] "M"(((RAMEND - 1) >> 8) & 0xff), [ramendlo] "M"(((RAMEND - 1) >> 0) & 0xff),
# endif
- [ bootaddrme ] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 8) & 0xff), [ bootaddrlo ] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 0) & 0xff));
+ [bootaddrme] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 8) & 0xff), [bootaddrlo] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 0) & 0xff));
#else // Assume remaining boards are DFU, even if the flag isn't set
-# if !(defined(__AVR_ATmega32A__) || defined(__AVR_ATmega328P__)) // no USB - maybe BOOTLOADER_BOOTLOADHID instead though?
+# if !(defined(__AVR_ATmega32A__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATtiny85__)) // no USB - maybe BOOTLOADER_BOOTLOADHID instead though?
UDCON = 1;
USBCON = (1 << FRZCLK); // disable USB
UCSR1B = 0;
diff --git a/tmk_core/common/avr/sleep_led.c b/tmk_core/common/avr/sleep_led.c
index 61fa70dc3ec..63dcc2afd93 100644
--- a/tmk_core/common/avr/sleep_led.c
+++ b/tmk_core/common/avr/sleep_led.c
@@ -5,6 +5,30 @@
#include "led.h"
#include "sleep_led.h"
+#ifndef SLEEP_LED_TIMER
+# define SLEEP_LED_TIMER 1
+#endif
+
+#if SLEEP_LED_TIMER == 1
+# define TCCRxB TCCR1B
+# define TIMERx_COMPA_vect TIMER1_COMPA_vect
+# if defined(__AVR_ATmega32A__) // This MCU has only one TIMSK register
+# define TIMSKx TIMSK
+# else
+# define TIMSKx TIMSK1
+# endif
+# define OCIExA OCIE1A
+# define OCRxx OCR1A
+#elif SLEEP_LED_TIMER == 3
+# define TCCRxB TCCR3B
+# define TIMERx_COMPA_vect TIMER3_COMPA_vect
+# define TIMSKx TIMSK3
+# define OCIExA OCIE3A
+# define OCRxx OCR3A
+#else
+error("Invalid SLEEP_LED_TIMER config")
+#endif
+
/* Software PWM
* ______ ______ __
* | ON |___OFF___| ON |___OFF___| ....
@@ -25,15 +49,14 @@
void sleep_led_init(void) {
/* Timer1 setup */
/* CTC mode */
- TCCR1B |= _BV(WGM12);
+ TCCRxB |= _BV(WGM12);
/* Clock selelct: clk/1 */
- TCCR1B |= _BV(CS10);
+ TCCRxB |= _BV(CS10);
/* Set TOP value */
uint8_t sreg = SREG;
cli();
- OCR1AH = (SLEEP_LED_TIMER_TOP >> 8) & 0xff;
- OCR1AL = SLEEP_LED_TIMER_TOP & 0xff;
- SREG = sreg;
+ OCRxx = SLEEP_LED_TIMER_TOP;
+ SREG = sreg;
}
/** \brief Sleep LED enable
@@ -42,7 +65,7 @@ void sleep_led_init(void) {
*/
void sleep_led_enable(void) {
/* Enable Compare Match Interrupt */
- TIMSK1 |= _BV(OCIE1A);
+ TIMSKx |= _BV(OCIExA);
}
/** \brief Sleep LED disable
@@ -51,7 +74,7 @@ void sleep_led_enable(void) {
*/
void sleep_led_disable(void) {
/* Disable Compare Match Interrupt */
- TIMSK1 &= ~_BV(OCIE1A);
+ TIMSKx &= ~_BV(OCIExA);
}
/** \brief Sleep LED toggle
@@ -60,7 +83,7 @@ void sleep_led_disable(void) {
*/
void sleep_led_toggle(void) {
/* Disable Compare Match Interrupt */
- TIMSK1 ^= _BV(OCIE1A);
+ TIMSKx ^= _BV(OCIExA);
}
/** \brief Breathing Sleep LED brighness(PWM On period) table
@@ -72,7 +95,7 @@ void sleep_led_toggle(void) {
*/
static const uint8_t breathing_table[64] PROGMEM = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 6, 10, 15, 23, 32, 44, 58, 74, 93, 113, 135, 157, 179, 199, 218, 233, 245, 252, 255, 252, 245, 233, 218, 199, 179, 157, 135, 113, 93, 74, 58, 44, 32, 23, 15, 10, 6, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-ISR(TIMER1_COMPA_vect) {
+ISR(TIMERx_COMPA_vect) {
/* Software PWM
* timer:1111 1111 1111 1111
* \_____/\/ \_______/____ count(0-255)
diff --git a/tmk_core/common/avr/timer.c b/tmk_core/common/avr/timer.c
index 88fa1dfa65f..c2e6c6e0812 100644
--- a/tmk_core/common/avr/timer.c
+++ b/tmk_core/common/avr/timer.c
@@ -45,19 +45,26 @@ void timer_init(void) {
# error "Timer prescaler value is not valid"
#endif
-#ifndef __AVR_ATmega32A__
+#if defined(__AVR_ATmega32A__)
+ // Timer0 CTC mode
+ TCCR0 = _BV(WGM01) | prescaler;
+
+ OCR0 = TIMER_RAW_TOP;
+ TIMSK = _BV(OCIE0);
+#elif defined(__AVR_ATtiny85__)
+ // Timer0 CTC mode
+ TCCR0A = _BV(WGM01);
+ TCCR0B = prescaler;
+
+ OCR0A = TIMER_RAW_TOP;
+ TIMSK = _BV(OCIE0A);
+#else
// Timer0 CTC mode
TCCR0A = _BV(WGM01);
TCCR0B = prescaler;
OCR0A = TIMER_RAW_TOP;
TIMSK0 = _BV(OCIE0A);
-#else
- // Timer0 CTC mode
- TCCR0 = _BV(WGM01) | prescaler;
-
- OCR0 = TIMER_RAW_TOP;
- TIMSK = _BV(OCIE0);
#endif
}
diff --git a/tmk_core/common/bootmagic_lite.c b/tmk_core/common/bootmagic_lite.c
new file mode 100644
index 00000000000..38275cdd307
--- /dev/null
+++ b/tmk_core/common/bootmagic_lite.c
@@ -0,0 +1,51 @@
+#include "quantum.h"
+
+bool is_keyboard_left(void);
+
+/** \brief Reset eeprom
+ *
+ * ...just incase someone wants to only change the eeprom behaviour
+ */
+__attribute__((weak)) void bootmagic_lite_reset_eeprom(void) {
+#if defined(VIA_ENABLE)
+ via_eeprom_reset();
+#else
+ eeconfig_disable();
+#endif
+}
+
+/** \brief The lite version of TMK's bootmagic based on Wilba.
+ *
+ * 100% less potential for accidentally making the keyboard do stupid things.
+ */
+__attribute__((weak)) void bootmagic_lite(void) {
+ // We need multiple scans because debouncing can't be turned off.
+ matrix_scan();
+#if defined(DEBOUNCE) && DEBOUNCE > 0
+ wait_ms(DEBOUNCE * 2);
+#else
+ wait_ms(30);
+#endif
+ matrix_scan();
+
+ // If the configured key (commonly Esc) is held down on power up,
+ // reset the EEPROM valid state and jump to bootloader.
+ // This isn't very generalized, but we need something that doesn't
+ // rely on user's keymaps in firmware or EEPROM.
+ uint8_t row = BOOTMAGIC_LITE_ROW;
+ uint8_t col = BOOTMAGIC_LITE_COLUMN;
+
+#if defined(SPLIT_KEYBOARD) && defined(BOOTMAGIC_LITE_ROW_RIGHT) && defined(BOOTMAGIC_LITE_COLUMN_RIGHT)
+ if (!is_keyboard_left()) {
+ row = BOOTMAGIC_LITE_ROW_RIGHT;
+ col = BOOTMAGIC_LITE_COLUMN_RIGHT;
+ }
+#endif
+
+ if (matrix_get_row(row) & (1 << col)) {
+ bootmagic_lite_reset_eeprom();
+
+ // Jump to bootloader.
+ bootloader_jump();
+ }
+}
\ No newline at end of file
diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c
index a767d9c8773..53d08959e85 100644
--- a/tmk_core/common/keyboard.c
+++ b/tmk_core/common/keyboard.c
@@ -213,6 +213,13 @@ void keyboard_setup(void) {
*/
__attribute__((weak)) bool is_keyboard_master(void) { return true; }
+/** \brief should_process_keypress
+ *
+ * Override this function if you have a condition where keypresses processing should change:
+ * - splits where the slave side needs to process for rgb/oled functionality
+ */
+__attribute__((weak)) bool should_process_keypress(void) { return is_keyboard_master(); }
+
/** \brief keyboard_init
*
* FIXME: needs doc
@@ -292,7 +299,7 @@ void keyboard_task(void) {
matrix_scan();
#endif
- if (is_keyboard_master()) {
+ if (should_process_keypress()) {
for (uint8_t r = 0; r < MATRIX_ROWS; r++) {
matrix_row = matrix_get_row(r);
matrix_change = matrix_row ^ matrix_prev[r];
diff --git a/tmk_core/common/keycode.h b/tmk_core/common/keycode.h
index e1059fadf0c..5c8ba8fe60e 100644
--- a/tmk_core/common/keycode.h
+++ b/tmk_core/common/keycode.h
@@ -152,11 +152,13 @@ along with this program. If not, see .
/* Modifiers */
#define KC_LCTL KC_LCTRL
#define KC_LSFT KC_LSHIFT
+#define KC_LOPT KC_LALT
#define KC_LCMD KC_LGUI
#define KC_LWIN KC_LGUI
#define KC_RCTL KC_RCTRL
#define KC_RSFT KC_RSHIFT
#define KC_ALGR KC_RALT
+#define KC_ROPT KC_RALT
#define KC_RCMD KC_RGUI
#define KC_RWIN KC_RGUI
diff --git a/tmk_core/common/progmem.h b/tmk_core/common/progmem.h
index a06d0f940fb..39a918fe989 100644
--- a/tmk_core/common/progmem.h
+++ b/tmk_core/common/progmem.h
@@ -4,7 +4,12 @@
# include
#else
# define PROGMEM
-# define pgm_read_byte(p) *((unsigned char*)(p))
-# define pgm_read_word(p) *((uint16_t*)(p))
-# define pgm_read_dword(p) *((uint32_t*)(p))
+# define memcpy_P(dest, src, n) memcpy(dest, src, n)
+# define pgm_read_byte(address_short) *((uint8_t*)(address_short))
+# define pgm_read_word(address_short) *((uint16_t*)(address_short))
+# define pgm_read_dword(address_short) *((uint32_t*)(address_short))
+# define pgm_read_ptr(address_short) *((void**)(address_short))
+# define strcmp_P(s1, s2) strcmp(s1, s2)
+# define strcpy_P(dest, src) strcpy(dest, src)
+# define strlen_P(src) strlen(src)
#endif
diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h
index b7d104a4592..c2b1b7c7101 100644
--- a/tmk_core/common/report.h
+++ b/tmk_core/common/report.h
@@ -15,66 +15,85 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
-#ifndef REPORT_H
-#define REPORT_H
+#pragma once
#include
#include
#include "keycode.h"
-/* report id */
-#define REPORT_ID_KEYBOARD 1
-#define REPORT_ID_MOUSE 2
-#define REPORT_ID_SYSTEM 3
-#define REPORT_ID_CONSUMER 4
-#define REPORT_ID_NKRO 5
+// clang-format off
-/* mouse buttons */
-#define MOUSE_BTN1 (1 << 0)
-#define MOUSE_BTN2 (1 << 1)
-#define MOUSE_BTN3 (1 << 2)
-#define MOUSE_BTN4 (1 << 3)
-#define MOUSE_BTN5 (1 << 4)
+/* HID report IDs */
+enum hid_report_ids {
+ REPORT_ID_KEYBOARD = 1,
+ REPORT_ID_MOUSE,
+ REPORT_ID_SYSTEM,
+ REPORT_ID_CONSUMER,
+ REPORT_ID_NKRO
+};
-/* Consumer Page(0x0C)
- * following are supported by Windows: http://msdn.microsoft.com/en-us/windows/hardware/gg463372.aspx
- * see also https://docs.microsoft.com/en-us/windows-hardware/drivers/hid/display-brightness-control
+/* Mouse buttons */
+enum mouse_buttons {
+ MOUSE_BTN1 = (1 << 0),
+ MOUSE_BTN2 = (1 << 1),
+ MOUSE_BTN3 = (1 << 2),
+ MOUSE_BTN4 = (1 << 3),
+ MOUSE_BTN5 = (1 << 4)
+};
+
+/* Consumer Page (0x0C)
+ *
+ * See https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf#page=75
*/
-#define AUDIO_MUTE 0x00E2
-#define AUDIO_VOL_UP 0x00E9
-#define AUDIO_VOL_DOWN 0x00EA
-#define TRANSPORT_NEXT_TRACK 0x00B5
-#define TRANSPORT_PREV_TRACK 0x00B6
-#define TRANSPORT_STOP 0x00B7
-#define TRANSPORT_STOP_EJECT 0x00CC
-#define TRANSPORT_PLAY_PAUSE 0x00CD
-#define BRIGHTNESS_UP 0x006F
-#define BRIGHTNESS_DOWN 0x0070
-/* application launch */
-#define AL_CC_CONFIG 0x0183
-#define AL_EMAIL 0x018A
-#define AL_CALCULATOR 0x0192
-#define AL_LOCAL_BROWSER 0x0194
-/* application control */
-#define AC_SEARCH 0x0221
-#define AC_HOME 0x0223
-#define AC_BACK 0x0224
-#define AC_FORWARD 0x0225
-#define AC_STOP 0x0226
-#define AC_REFRESH 0x0227
-#define AC_BOOKMARKS 0x022A
-/* supplement for Bluegiga iWRAP HID(not supported by Windows?) */
-#define AL_LOCK 0x019E
-#define TRANSPORT_RECORD 0x00B2
-#define TRANSPORT_FAST_FORWARD 0x00B3
-#define TRANSPORT_REWIND 0x00B4
-#define TRANSPORT_EJECT 0x00B8
-#define AC_MINIMIZE 0x0206
+enum consumer_usages {
+ // 15.5 Display Controls (https://www.usb.org/sites/default/files/hutrr41_0.pdf)
+ BRIGHTNESS_UP = 0x06F,
+ BRIGHTNESS_DOWN = 0x070,
+ // 15.7 Transport Controls
+ TRANSPORT_RECORD = 0x0B2,
+ TRANSPORT_FAST_FORWARD = 0x0B3,
+ TRANSPORT_REWIND = 0x0B4,
+ TRANSPORT_NEXT_TRACK = 0x0B5,
+ TRANSPORT_PREV_TRACK = 0x0B6,
+ TRANSPORT_STOP = 0x0B7,
+ TRANSPORT_EJECT = 0x0B8,
+ TRANSPORT_STOP_EJECT = 0x0CC,
+ TRANSPORT_PLAY_PAUSE = 0x0CD,
+ // 15.9.1 Audio Controls - Volume
+ AUDIO_MUTE = 0x0E2,
+ AUDIO_VOL_UP = 0x0E9,
+ AUDIO_VOL_DOWN = 0x0EA,
+ // 15.15 Application Launch Buttons
+ AL_CC_CONFIG = 0x183,
+ AL_EMAIL = 0x18A,
+ AL_CALCULATOR = 0x192,
+ AL_LOCAL_BROWSER = 0x194,
+ AL_LOCK = 0x19E,
+ AL_CONTROL_PANEL = 0x19F,
+ AL_ASSISTANT = 0x1CB,
+ // 15.16 Generic GUI Application Controls
+ AC_MINIMIZE = 0x206,
+ AC_SEARCH = 0x221,
+ AC_HOME = 0x223,
+ AC_BACK = 0x224,
+ AC_FORWARD = 0x225,
+ AC_STOP = 0x226,
+ AC_REFRESH = 0x227,
+ AC_BOOKMARKS = 0x22A
+};
-/* Generic Desktop Page(0x01) - system power control */
-#define SYSTEM_POWER_DOWN 0x0081
-#define SYSTEM_SLEEP 0x0082
-#define SYSTEM_WAKE_UP 0x0083
+/* Generic Desktop Page (0x01)
+ *
+ * See https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf#page=26
+ */
+enum desktop_usages {
+ // 4.5.1 System Controls - Power Controls
+ SYSTEM_POWER_DOWN = 0x81,
+ SYSTEM_SLEEP = 0x82,
+ SYSTEM_WAKE_UP = 0x83
+};
+
+// clang-format on
#define NKRO_SHARED_EP
/* key report size(NKRO or boot mode) */
@@ -253,5 +272,3 @@ void clear_keys_from_report(report_keyboard_t* keyboard_report);
#ifdef __cplusplus
}
#endif
-
-#endif
diff --git a/tmk_core/common/sendchar_null.c b/tmk_core/common/sendchar_null.c
index f6cab1b9d1f..fb67f70866a 100644
--- a/tmk_core/common/sendchar_null.c
+++ b/tmk_core/common/sendchar_null.c
@@ -16,4 +16,4 @@ along with this program. If not, see .
*/
#include "sendchar.h"
-int8_t sendchar(uint8_t c) { return 0; }
+__attribute__((weak)) int8_t sendchar(uint8_t c) { return 0; }
diff --git a/tmk_core/common/timer.h b/tmk_core/common/timer.h
index bbaae109d0f..52bc1cc671c 100644
--- a/tmk_core/common/timer.h
+++ b/tmk_core/common/timer.h
@@ -25,7 +25,7 @@ along with this program. If not, see .
# include "avr/timer_avr.h"
#endif
-#define TIMER_DIFF(a, b, max) ((a) >= (b) ? (a) - (b) : (max) - (b) + (a))
+#define TIMER_DIFF(a, b, max) ((max == UINT8_MAX) ? ((uint8_t)((a) - (b))) : ((max == UINT16_MAX) ? ((uint16_t)((a) - (b))) : ((max == UINT32_MAX) ? ((uint32_t)((a) - (b))) : ((a) >= (b) ? (a) - (b) : (max) + 1 - (b) + (a)))))
#define TIMER_DIFF_8(a, b) TIMER_DIFF(a, b, UINT8_MAX)
#define TIMER_DIFF_16(a, b) TIMER_DIFF(a, b, UINT16_MAX)
#define TIMER_DIFF_32(a, b) TIMER_DIFF(a, b, UINT32_MAX)
diff --git a/tmk_core/common/util.c b/tmk_core/common/util.c
index f4f018de8d6..861cca0054f 100644
--- a/tmk_core/common/util.c
+++ b/tmk_core/common/util.c
@@ -18,7 +18,7 @@ along with this program. If not, see .
#include "util.h"
// bit population - return number of on-bit
-uint8_t bitpop(uint8_t bits) {
+__attribute__((noinline)) uint8_t bitpop(uint8_t bits) {
uint8_t c;
for (c = 0; bits; c++) bits &= bits - 1;
return c;
@@ -42,7 +42,7 @@ uint8_t bitpop32(uint32_t bits) {
// most significant on-bit - return highest location of on-bit
// NOTE: return 0 when bit0 is on or all bits are off
-uint8_t biton(uint8_t bits) {
+__attribute__((noinline)) uint8_t biton(uint8_t bits) {
uint8_t n = 0;
if (bits >> 4) {
bits >>= 4;
@@ -105,7 +105,7 @@ uint8_t biton32(uint32_t bits) {
return n;
}
-uint8_t bitrev(uint8_t bits) {
+__attribute__((noinline)) uint8_t bitrev(uint8_t bits) {
bits = (bits & 0x0f) << 4 | (bits & 0xf0) >> 4;
bits = (bits & 0b00110011) << 2 | (bits & 0b11001100) >> 2;
bits = (bits & 0b01010101) << 1 | (bits & 0b10101010) >> 1;
diff --git a/tmk_core/protocol/arm_atsam/main_arm_atsam.c b/tmk_core/protocol/arm_atsam/main_arm_atsam.c
index e952a427eff..e4e79d35104 100644
--- a/tmk_core/protocol/arm_atsam/main_arm_atsam.c
+++ b/tmk_core/protocol/arm_atsam/main_arm_atsam.c
@@ -206,10 +206,17 @@ void main_subtask_usb_extra_device(void) {
}
}
+#ifdef RAW_ENABLE
+void main_subtask_raw(void) { udi_hid_raw_receive_report(); }
+#endif
+
void main_subtasks(void) {
main_subtask_usb_state();
main_subtask_power_check();
main_subtask_usb_extra_device();
+#ifdef RAW_ENABLE
+ main_subtask_raw();
+#endif
}
int main(void) {
diff --git a/tmk_core/protocol/arm_atsam/usb/conf_usb.h b/tmk_core/protocol/arm_atsam/usb/conf_usb.h
index f23c2a80dda..184a2e81dc3 100644
--- a/tmk_core/protocol/arm_atsam/usb/conf_usb.h
+++ b/tmk_core/protocol/arm_atsam/usb/conf_usb.h
@@ -116,36 +116,35 @@
* @{
*/
//! Interface callback definition
-#ifdef KBD
-# define UDI_HID_KBD_ENABLE_EXT() main_kbd_enable()
-# define UDI_HID_KBD_DISABLE_EXT() main_kbd_disable()
-//#define UDI_HID_KBD_CHANGE_LED(value) ui_kbd_led(value)
-#endif
+#define UDI_HID_KBD_ENABLE_EXT() main_kbd_enable()
+#define UDI_HID_KBD_DISABLE_EXT() main_kbd_disable()
+//#define UDI_HID_KBD_CHANGE_LED(value) ui_kbd_led(value)
-#ifdef NKRO
+#ifdef NKRO_ENABLE
# define UDI_HID_NKRO_ENABLE_EXT() main_nkro_enable()
# define UDI_HID_NKRO_DISABLE_EXT() main_nkro_disable()
-//#define UDI_HID_NKRO_CHANGE_LED(value) ui_kbd_led(value)
+//#define UDI_HID_NKRO_CHANGE_LED(value) ui_kbd_led(value)
#endif
-#ifdef EXK
+#ifdef EXTRAKEY_ENABLE
# define UDI_HID_EXK_ENABLE_EXT() main_exk_enable()
# define UDI_HID_EXK_DISABLE_EXT() main_exk_disable()
#endif
-#ifdef CON
+#ifdef CONSOLE_ENABLE
# define UDI_HID_CON_ENABLE_EXT() main_con_enable()
# define UDI_HID_CON_DISABLE_EXT() main_con_disable()
#endif
-#ifdef MOU
+#ifdef MOUSE_ENABLE
# define UDI_HID_MOU_ENABLE_EXT() main_mou_enable()
# define UDI_HID_MOU_DISABLE_EXT() main_mou_disable()
#endif
-#ifdef RAW
+#ifdef RAW_ENABLE
# define UDI_HID_RAW_ENABLE_EXT() main_raw_enable()
# define UDI_HID_RAW_DISABLE_EXT() main_raw_disable()
+# define UDI_HID_RAW_RECEIVE(buffer, len) main_raw_receive(buffer, len)
#endif
//@}
diff --git a/tmk_core/protocol/arm_atsam/usb/main_usb.c b/tmk_core/protocol/arm_atsam/usb/main_usb.c
index 82ab123fd0f..5fcb9a9c612 100644
--- a/tmk_core/protocol/arm_atsam/usb/main_usb.c
+++ b/tmk_core/protocol/arm_atsam/usb/main_usb.c
@@ -19,6 +19,10 @@ along with this program. If not, see .
#include "conf_usb.h"
#include "udd.h"
+#ifdef RAW_ENABLE
+# include "raw_hid.h"
+#endif
+
uint8_t keyboard_protocol = 1;
void main_suspend_action(void) { ui_powerdown(); }
@@ -31,7 +35,6 @@ void main_remotewakeup_enable(void) { ui_wakeup_enable(); }
void main_remotewakeup_disable(void) { ui_wakeup_disable(); }
-#ifdef KBD
volatile bool main_b_kbd_enable = false;
bool main_kbd_enable(void) {
main_b_kbd_enable = true;
@@ -39,9 +42,8 @@ bool main_kbd_enable(void) {
}
void main_kbd_disable(void) { main_b_kbd_enable = false; }
-#endif
-#ifdef NKRO
+#ifdef NKRO_ENABLE
volatile bool main_b_nkro_enable = false;
bool main_nkro_enable(void) {
main_b_nkro_enable = true;
@@ -51,7 +53,7 @@ bool main_nkro_enable(void) {
void main_nkro_disable(void) { main_b_nkro_enable = false; }
#endif
-#ifdef EXK
+#ifdef EXTRAKEY_ENABLE
volatile bool main_b_exk_enable = false;
bool main_exk_enable(void) {
main_b_exk_enable = true;
@@ -61,7 +63,7 @@ bool main_exk_enable(void) {
void main_exk_disable(void) { main_b_exk_enable = false; }
#endif
-#ifdef CON
+#ifdef CONSOLE_ENABLE
volatile bool main_b_con_enable = false;
bool main_con_enable(void) {
main_b_con_enable = true;
@@ -71,7 +73,7 @@ bool main_con_enable(void) {
void main_con_disable(void) { main_b_con_enable = false; }
#endif
-#ifdef MOU
+#ifdef MOUSE_ENABLE
volatile bool main_b_mou_enable = false;
bool main_mou_enable(void) {
main_b_mou_enable = true;
@@ -81,7 +83,7 @@ bool main_mou_enable(void) {
void main_mou_disable(void) { main_b_mou_enable = false; }
#endif
-#ifdef RAW
+#ifdef RAW_ENABLE
volatile bool main_b_raw_enable = false;
bool main_raw_enable(void) {
main_b_raw_enable = true;
@@ -89,4 +91,6 @@ bool main_raw_enable(void) {
}
void main_raw_disable(void) { main_b_raw_enable = false; }
+
+void main_raw_receive(uint8_t *buffer, uint8_t len) { raw_hid_receive(buffer, len); }
#endif
diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc.c b/tmk_core/protocol/arm_atsam/usb/udi_cdc.c
index 8271f3b97fa..27db4017c44 100644
--- a/tmk_core/protocol/arm_atsam/usb/udi_cdc.c
+++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc.c
@@ -57,7 +57,7 @@
#include "stdarg.h"
#include "tmk_core/protocol/arm_atsam/clks.h"
-#ifdef CDC
+#ifdef VIRTSER_ENABLE
# ifdef UDI_CDC_LOW_RATE
# ifdef USB_DEVICE_HS_SUPPORT
diff --git a/tmk_core/protocol/arm_atsam/usb/udi_cdc.h b/tmk_core/protocol/arm_atsam/usb/udi_cdc.h
index 9135bab546e..406023980c7 100644
--- a/tmk_core/protocol/arm_atsam/usb/udi_cdc.h
+++ b/tmk_core/protocol/arm_atsam/usb/udi_cdc.h
@@ -47,7 +47,7 @@
#ifndef _UDI_CDC_H_
#define _UDI_CDC_H_
-#ifdef CDC
+#ifdef VIRTSER_ENABLE
# include "conf_usb.h"
# include "usb_protocol.h"
@@ -346,7 +346,7 @@ typedef struct {
char buf[CDC_INBUF_SIZE];
} inbuf_t;
-#else // CDC
+#else // VIRTSER_ENABLE
// keep these to accommodate calls if remaining
# define CDC_PRINTBUF_SIZE 1
@@ -362,7 +362,7 @@ typedef struct {
extern inbuf_t inbuf;
-#endif // CDC
+#endif // VIRTSER_ENABLE
uint32_t CDC_print(char* printbuf);
int CDC_printf(const char* _Format, ...);
diff --git a/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h b/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h
index 80556205f2a..505db47b06c 100644
--- a/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h
+++ b/tmk_core/protocol/arm_atsam/usb/udi_device_conf.h
@@ -23,77 +23,36 @@ along with this program. If not, see .
#include "compiler.h"
#include "usb_protocol_hid.h"
-#define DEVICE_CLASS 0
-#define DEVICE_SUBCLASS 0
-#define DEVICE_PROTOCOL 0
-
-#define KBD
-
-//#define MOUSE_ENABLE //rules.mk
-#ifdef MOUSE_ENABLE
-# define MOU
-#endif
-
-//#define EXTRAKEY_ENABLE //rules.mk
-#ifdef EXTRAKEY_ENABLE
-# define EXK
-#endif
-
-//#define RAW_ENABLE //rules.mk
-#ifdef RAW_ENABLE
-# define RAW
-#endif
-
-//#define CONSOLE_ENABLE //rules.mk
-#ifdef CONSOLE_ENABLE
-# define CON
-#endif
-
-//#define NKRO_ENABLE //rules.mk
-#ifdef NKRO_ENABLE
-# define NKRO
-#endif
-
-//#define MIDI_ENABLE //deferred implementation
-//#ifdef MIDI_ENABLE
-//#define MIDI
-//#endif
-
-//#define VIRTSER_ENABLE //rules.mk
#ifdef VIRTSER_ENABLE
-# define CDC
// because CDC uses IAD (interface association descriptor
// per USB Interface Association Descriptor Device Class Code and Use Model 7/23/2003 Rev 1.0)
-# undef DEVICE_CLASS
# define DEVICE_CLASS 0xEF
-# undef DEVICE_SUBCLASS
# define DEVICE_SUBCLASS 0x02
-# undef DEVICE_PROTOCOL
# define DEVICE_PROTOCOL 0x01
+#else
+# define DEVICE_CLASS 0x00
+# define DEVICE_SUBCLASS 0x00
+# define DEVICE_PROTOCOL 0x00
#endif
/* number of interfaces */
#define NEXT_INTERFACE_0 0
-#ifdef KBD
-# define KEYBOARD_INTERFACE NEXT_INTERFACE_0
-# define NEXT_INTERFACE_1 (KEYBOARD_INTERFACE + 1)
-# define UDI_HID_KBD_IFACE_NUMBER KEYBOARD_INTERFACE
-#else
-# define NEXT_INTERFACE_1 NEXT_INTERFACE_0
-#endif
+#define KEYBOARD_INTERFACE NEXT_INTERFACE_0
+#define NEXT_INTERFACE_1 (KEYBOARD_INTERFACE + 1)
+#define UDI_HID_KBD_IFACE_NUMBER KEYBOARD_INTERFACE
// It is important that the Raw HID interface is at a constant
// interface number, to support Linux/OSX platforms and chrome.hid
// If Raw HID is enabled, let it be always 1.
-#ifdef RAW
+#ifdef RAW_ENABLE
# define RAW_INTERFACE NEXT_INTERFACE_1
# define NEXT_INTERFACE_2 (RAW_INTERFACE + 1)
#else
# define NEXT_INTERFACE_2 NEXT_INTERFACE_1
#endif
-#ifdef MOU
+#ifdef MOUSE_ENABLE
# define MOUSE_INTERFACE NEXT_INTERFACE_2
# define UDI_HID_MOU_IFACE_NUMBER MOUSE_INTERFACE
# define NEXT_INTERFACE_3 (MOUSE_INTERFACE + 1)
@@ -101,7 +60,7 @@ along with this program. If not, see .
# define NEXT_INTERFACE_3 NEXT_INTERFACE_2
#endif
-#ifdef EXK
+#ifdef EXTRAKEY_ENABLE
# define EXTRAKEY_INTERFACE NEXT_INTERFACE_3
# define NEXT_INTERFACE_4 (EXTRAKEY_INTERFACE + 1)
# define UDI_HID_EXK_IFACE_NUMBER EXTRAKEY_INTERFACE
@@ -109,7 +68,7 @@ along with this program. If not, see .
# define NEXT_INTERFACE_4 NEXT_INTERFACE_3
#endif
-#ifdef CON
+#ifdef CONSOLE_ENABLE
# define CON_INTERFACE NEXT_INTERFACE_4
# define NEXT_INTERFACE_5 (CON_INTERFACE + 1)
# define UDI_HID_CON_IFACE_NUMBER CON_INTERFACE
@@ -117,7 +76,7 @@ along with this program. If not, see .
# define NEXT_INTERFACE_5 NEXT_INTERFACE_4
#endif
-#ifdef NKRO
+#ifdef NKRO_ENABLE
# define NKRO_INTERFACE NEXT_INTERFACE_5
# define NEXT_INTERFACE_6 (NKRO_INTERFACE + 1)
# define UDI_HID_NKRO_IFACE_NUMBER NKRO_INTERFACE
@@ -125,7 +84,7 @@ along with this program. If not, see .
# define NEXT_INTERFACE_6 NEXT_INTERFACE_5
#endif
-#ifdef MIDI
+#ifdef MIDI_ENABLE
# define AC_INTERFACE NEXT_INTERFACE_6
# define AS_INTERFACE (AC_INTERFACE + 1)
# define NEXT_INTERFACE_7 (AS_INTERFACE + 1)
@@ -133,7 +92,7 @@ along with this program. If not, see .
# define NEXT_INTERFACE_7 NEXT_INTERFACE_6
#endif
-#ifdef CDC
+#ifdef VIRTSER_ENABLE
# define CCI_INTERFACE NEXT_INTERFACE_7
# define CDI_INTERFACE (CCI_INTERFACE + 1)
# define NEXT_INTERFACE_8 (CDI_INTERFACE + 1)
@@ -155,20 +114,16 @@ along with this program. If not, see .
#define NEXT_IN_EPNUM_0 1
#define NEXT_OUT_EPNUM_0 1
-#ifdef KBD
-# define KEYBOARD_IN_EPNUM NEXT_IN_EPNUM_0
-# define UDI_HID_KBD_EP_IN KEYBOARD_IN_EPNUM
-# define NEXT_IN_EPNUM_1 (KEYBOARD_IN_EPNUM + 1)
-# define UDI_HID_KBD_EP_SIZE KEYBOARD_EPSIZE
-# define KBD_POLLING_INTERVAL 10
-# ifndef UDI_HID_KBD_STRING_ID
-# define UDI_HID_KBD_STRING_ID 0
-# endif
-#else
-# define NEXT_IN_EPNUM_1 NEXT_IN_EPNUM_0
+#define KEYBOARD_IN_EPNUM NEXT_IN_EPNUM_0
+#define UDI_HID_KBD_EP_IN KEYBOARD_IN_EPNUM
+#define NEXT_IN_EPNUM_1 (KEYBOARD_IN_EPNUM + 1)
+#define UDI_HID_KBD_EP_SIZE KEYBOARD_EPSIZE
+#define KBD_POLLING_INTERVAL 10
+#ifndef UDI_HID_KBD_STRING_ID
+# define UDI_HID_KBD_STRING_ID 0
#endif
-#ifdef MOU
+#ifdef MOUSE_ENABLE
# define MOUSE_IN_EPNUM NEXT_IN_EPNUM_1
# define NEXT_IN_EPNUM_2 (MOUSE_IN_EPNUM + 1)
# define UDI_HID_MOU_EP_IN MOUSE_IN_EPNUM
@@ -181,7 +136,7 @@ along with this program. If not, see .
# define NEXT_IN_EPNUM_2 NEXT_IN_EPNUM_1
#endif
-#ifdef EXK
+#ifdef EXTRAKEY_ENABLE
# define EXTRAKEY_IN_EPNUM NEXT_IN_EPNUM_2
# define UDI_HID_EXK_EP_IN EXTRAKEY_IN_EPNUM
# define NEXT_IN_EPNUM_3 (EXTRAKEY_IN_EPNUM + 1)
@@ -194,7 +149,7 @@ along with this program. If not, see .
# define NEXT_IN_EPNUM_3 NEXT_IN_EPNUM_2
#endif
-#ifdef RAW
+#ifdef RAW_ENABLE
# define RAW_IN_EPNUM NEXT_IN_EPNUM_3
# define UDI_HID_RAW_EP_IN RAW_IN_EPNUM
# define NEXT_IN_EPNUM_4 (RAW_IN_EPNUM + 1)
@@ -210,7 +165,7 @@ along with this program. If not, see .
# define NEXT_OUT_EPNUM_1 NEXT_OUT_EPNUM_0
#endif
-#ifdef CON
+#ifdef CONSOLE_ENABLE
# define CON_IN_EPNUM NEXT_IN_EPNUM_4
# define UDI_HID_CON_EP_IN CON_IN_EPNUM
# define NEXT_IN_EPNUM_5 (CON_IN_EPNUM + 1)
@@ -226,7 +181,7 @@ along with this program. If not, see .
# define NEXT_OUT_EPNUM_2 NEXT_OUT_EPNUM_1
#endif
-#ifdef NKRO
+#ifdef NKRO_ENABLE
# define NKRO_IN_EPNUM NEXT_IN_EPNUM_5
# define UDI_HID_NKRO_EP_IN NKRO_IN_EPNUM
# define NEXT_IN_EPNUM_6 (NKRO_IN_EPNUM + 1)
@@ -239,7 +194,7 @@ along with this program. If not, see .
# define NEXT_IN_EPNUM_6 NEXT_IN_EPNUM_5
#endif
-#ifdef MIDI
+#ifdef MIDI_ENABLE
# define MIDI_STREAM_IN_EPNUM NEXT_IN_EPNUM_6
# define NEXT_IN_EPNUM_7 (MIDI_STREAM_IN_EPNUM + 1)
# define MIDI_STREAM_OUT_EPNUM NEXT_OUT_EPNUM_2
@@ -250,7 +205,7 @@ along with this program. If not, see .
# define NEXT_OUT_EPNUM_3 NEXT_OUT_EPNUM_2
#endif
-#ifdef CDC
+#ifdef VIRTSER_ENABLE
# define CDC_NOTIFICATION_EPNUM NEXT_IN_EPNUM_7
# define CDC_ACM_ENDPOINT CDC_NOTIFICATION_EPNUM
# define CDC_TX_ENDPOINT (CDC_NOTIFICATION_EPNUM + 1)
@@ -285,8 +240,6 @@ along with this program. If not, see .
// **********************************************************************
// KBD Descriptor structure and content
// **********************************************************************
-#ifdef KBD
-
COMPILER_PACK_SET(1)
typedef struct {
@@ -299,8 +252,40 @@ typedef struct {
uint8_t array[59];
} udi_hid_kbd_report_desc_t;
-# define UDI_HID_KBD_DESC \
- { .iface.bLength = sizeof(usb_iface_desc_t), .iface.bDescriptorType = USB_DT_INTERFACE, .iface.bInterfaceNumber = UDI_HID_KBD_IFACE_NUMBER, .iface.bAlternateSetting = 0, .iface.bNumEndpoints = 1, .iface.bInterfaceClass = HID_CLASS, .iface.bInterfaceSubClass = HID_SUB_CLASS_BOOT, .iface.bInterfaceProtocol = HID_PROTOCOL_KEYBOARD, .iface.iInterface = UDI_HID_KBD_STRING_ID, .hid.bLength = sizeof(usb_hid_descriptor_t), .hid.bDescriptorType = USB_DT_HID, .hid.bcdHID = LE16(USB_HID_BDC_V1_11), .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE, .hid.bNumDescriptors = USB_HID_NUM_DESC, .hid.bRDescriptorType = USB_DT_HID_REPORT, .hid.wDescriptorLength = LE16(sizeof(udi_hid_kbd_report_desc_t)), .ep.bLength = sizeof(usb_ep_desc_t), .ep.bDescriptorType = USB_DT_ENDPOINT, .ep.bEndpointAddress = UDI_HID_KBD_EP_IN | USB_EP_DIR_IN, .ep.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep.wMaxPacketSize = LE16(UDI_HID_KBD_EP_SIZE), .ep.bInterval = KBD_POLLING_INTERVAL, }
+// clang-format off
+
+# define UDI_HID_KBD_DESC { \
+ .iface = { \
+ .bLength = sizeof(usb_iface_desc_t), \
+ .bDescriptorType = USB_DT_INTERFACE, \
+ .bInterfaceNumber = UDI_HID_KBD_IFACE_NUMBER, \
+ .bAlternateSetting = 0, \
+ .bNumEndpoints = 1, \
+ .bInterfaceClass = HID_CLASS, \
+ .bInterfaceSubClass = HID_SUB_CLASS_BOOT, \
+ .bInterfaceProtocol = HID_PROTOCOL_KEYBOARD, \
+ .iInterface = UDI_HID_KBD_STRING_ID, \
+ }, \
+ .hid = { \
+ .bLength = sizeof(usb_hid_descriptor_t), \
+ .bDescriptorType = USB_DT_HID, \
+ .bcdHID = LE16(USB_HID_BDC_V1_11), \
+ .bCountryCode = USB_HID_NO_COUNTRY_CODE, \
+ .bNumDescriptors = USB_HID_NUM_DESC, \
+ .bRDescriptorType = USB_DT_HID_REPORT, \
+ .wDescriptorLength = LE16(sizeof(udi_hid_kbd_report_desc_t)), \
+ }, \
+ .ep = { \
+ .bLength = sizeof(usb_ep_desc_t), \
+ .bDescriptorType = USB_DT_ENDPOINT, \
+ .bEndpointAddress = UDI_HID_KBD_EP_IN | USB_EP_DIR_IN, \
+ .bmAttributes = USB_EP_TYPE_INTERRUPT, \
+ .wMaxPacketSize = LE16(UDI_HID_KBD_EP_SIZE), \
+ .bInterval = KBD_POLLING_INTERVAL \
+ } \
+}
+
+// clang-format on
// set report buffer (from host)
extern uint8_t udi_hid_kbd_report_set;
@@ -311,12 +296,10 @@ extern uint8_t udi_hid_kbd_report[UDI_HID_KBD_REPORT_SIZE];
COMPILER_PACK_RESET()
-#endif // KBD
-
// **********************************************************************
// EXK Descriptor structure and content
// **********************************************************************
-#ifdef EXK
+#ifdef EXTRAKEY_ENABLE
COMPILER_PACK_SET(1)
@@ -330,8 +313,40 @@ typedef struct {
uint8_t array[50];
} udi_hid_exk_report_desc_t;
-# define UDI_HID_EXK_DESC \
- { .iface.bLength = sizeof(usb_iface_desc_t), .iface.bDescriptorType = USB_DT_INTERFACE, .iface.bInterfaceNumber = UDI_HID_EXK_IFACE_NUMBER, .iface.bAlternateSetting = 0, .iface.bNumEndpoints = 1, .iface.bInterfaceClass = HID_CLASS, .iface.bInterfaceSubClass = HID_SUB_CLASS_BOOT, .iface.bInterfaceProtocol = HID_PROTOCOL_GENERIC, .iface.iInterface = UDI_HID_EXK_STRING_ID, .hid.bLength = sizeof(usb_hid_descriptor_t), .hid.bDescriptorType = USB_DT_HID, .hid.bcdHID = LE16(USB_HID_BDC_V1_11), .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE, .hid.bNumDescriptors = USB_HID_NUM_DESC, .hid.bRDescriptorType = USB_DT_HID_REPORT, .hid.wDescriptorLength = LE16(sizeof(udi_hid_exk_report_desc_t)), .ep.bLength = sizeof(usb_ep_desc_t), .ep.bDescriptorType = USB_DT_ENDPOINT, .ep.bEndpointAddress = UDI_HID_EXK_EP_IN | USB_EP_DIR_IN, .ep.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep.wMaxPacketSize = LE16(UDI_HID_EXK_EP_SIZE), .ep.bInterval = EXTRAKEY_POLLING_INTERVAL, }
+// clang-format off
+
+# define UDI_HID_EXK_DESC { \
+ .iface = { \
+ .bLength = sizeof(usb_iface_desc_t), \
+ .bDescriptorType = USB_DT_INTERFACE, \
+ .bInterfaceNumber = UDI_HID_EXK_IFACE_NUMBER, \
+ .bAlternateSetting = 0, \
+ .bNumEndpoints = 1, \
+ .bInterfaceClass = HID_CLASS, \
+ .bInterfaceSubClass = HID_SUB_CLASS_BOOT, \
+ .bInterfaceProtocol = HID_PROTOCOL_GENERIC, \
+ .iInterface = UDI_HID_EXK_STRING_ID \
+ }, \
+ .hid = { \
+ .bLength = sizeof(usb_hid_descriptor_t), \
+ .bDescriptorType = USB_DT_HID, \
+ .bcdHID = LE16(USB_HID_BDC_V1_11), \
+ .bCountryCode = USB_HID_NO_COUNTRY_CODE, \
+ .bNumDescriptors = USB_HID_NUM_DESC, \
+ .bRDescriptorType = USB_DT_HID_REPORT, \
+ .wDescriptorLength = LE16(sizeof(udi_hid_exk_report_desc_t)) \
+ }, \
+ .ep = { \
+ .bLength = sizeof(usb_ep_desc_t), \
+ .bDescriptorType = USB_DT_ENDPOINT, \
+ .bEndpointAddress = UDI_HID_EXK_EP_IN | USB_EP_DIR_IN, \
+ .bmAttributes = USB_EP_TYPE_INTERRUPT, \
+ .wMaxPacketSize = LE16(UDI_HID_EXK_EP_SIZE), \
+ .bInterval = EXTRAKEY_POLLING_INTERVAL \
+ } \
+}
+
+// clang-format on
// set report buffer (from host)
extern uint8_t udi_hid_exk_report_set;
@@ -351,12 +366,12 @@ extern udi_hid_exk_report_t udi_hid_exk_report;
COMPILER_PACK_RESET()
-#endif // EXK
+#endif // EXTRAKEY_ENABLE
// **********************************************************************
// NKRO Descriptor structure and content
// **********************************************************************
-#ifdef NKRO
+#ifdef NKRO_ENABLE
COMPILER_PACK_SET(1)
@@ -370,8 +385,40 @@ typedef struct {
uint8_t array[57];
} udi_hid_nkro_report_desc_t;
-# define UDI_HID_NKRO_DESC \
- { .iface.bLength = sizeof(usb_iface_desc_t), .iface.bDescriptorType = USB_DT_INTERFACE, .iface.bInterfaceNumber = UDI_HID_NKRO_IFACE_NUMBER, .iface.bAlternateSetting = 0, .iface.bNumEndpoints = 1, .iface.bInterfaceClass = HID_CLASS, .iface.bInterfaceSubClass = HID_SUB_CLASS_NOBOOT, .iface.bInterfaceProtocol = HID_PROTOCOL_KEYBOARD, .iface.iInterface = UDI_HID_NKRO_STRING_ID, .hid.bLength = sizeof(usb_hid_descriptor_t), .hid.bDescriptorType = USB_DT_HID, .hid.bcdHID = LE16(USB_HID_BDC_V1_11), .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE, .hid.bNumDescriptors = USB_HID_NUM_DESC, .hid.bRDescriptorType = USB_DT_HID_REPORT, .hid.wDescriptorLength = LE16(sizeof(udi_hid_nkro_report_desc_t)), .ep.bLength = sizeof(usb_ep_desc_t), .ep.bDescriptorType = USB_DT_ENDPOINT, .ep.bEndpointAddress = UDI_HID_NKRO_EP_IN | USB_EP_DIR_IN, .ep.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep.wMaxPacketSize = LE16(UDI_HID_NKRO_EP_SIZE), .ep.bInterval = NKRO_POLLING_INTERVAL, }
+// clang-format off
+
+# define UDI_HID_NKRO_DESC { \
+ .iface = { \
+ .bLength = sizeof(usb_iface_desc_t), \
+ .bDescriptorType = USB_DT_INTERFACE, \
+ .bInterfaceNumber = UDI_HID_NKRO_IFACE_NUMBER, \
+ .bAlternateSetting = 0, \
+ .bNumEndpoints = 1, \
+ .bInterfaceClass = HID_CLASS, \
+ .bInterfaceSubClass = HID_SUB_CLASS_NOBOOT, \
+ .bInterfaceProtocol = HID_PROTOCOL_KEYBOARD, \
+ .iInterface = UDI_HID_NKRO_STRING_ID \
+ }, \
+ .hid = { \
+ .bLength = sizeof(usb_hid_descriptor_t), \
+ .bDescriptorType = USB_DT_HID, \
+ .bcdHID = LE16(USB_HID_BDC_V1_11), \
+ .bCountryCode = USB_HID_NO_COUNTRY_CODE, \
+ .bNumDescriptors = USB_HID_NUM_DESC, \
+ .bRDescriptorType = USB_DT_HID_REPORT, \
+ .wDescriptorLength = LE16(sizeof(udi_hid_nkro_report_desc_t)) \
+ }, \
+ .ep = { \
+ .bLength = sizeof(usb_ep_desc_t), \
+ .bDescriptorType = USB_DT_ENDPOINT, \
+ .bEndpointAddress = UDI_HID_NKRO_EP_IN | USB_EP_DIR_IN, \
+ .bmAttributes = USB_EP_TYPE_INTERRUPT, \
+ .wMaxPacketSize = LE16(UDI_HID_NKRO_EP_SIZE), \
+ .bInterval = NKRO_POLLING_INTERVAL \
+ } \
+}
+
+// clang-format on
// set report buffer
extern uint8_t udi_hid_nkro_report_set;
@@ -382,12 +429,12 @@ extern uint8_t udi_hid_nkro_report[UDI_HID_NKRO_REPORT_SIZE];
COMPILER_PACK_RESET()
-#endif // NKRO
+#endif // NKRO_ENABLE
// **********************************************************************
// MOU Descriptor structure and content
// **********************************************************************
-#ifdef MOU
+#ifdef MOUSE_ENABLE
COMPILER_PACK_SET(1)
@@ -401,10 +448,40 @@ typedef struct {
uint8_t array[77]; // MOU PDS
} udi_hid_mou_report_desc_t;
-# define UDI_HID_MOU_DESC \
- { .iface.bLength = sizeof(usb_iface_desc_t), .iface.bDescriptorType = USB_DT_INTERFACE, .iface.bInterfaceNumber = MOUSE_INTERFACE, .iface.bAlternateSetting = 0, .iface.bNumEndpoints = 1, .iface.bInterfaceClass = HID_CLASS, .iface.bInterfaceSubClass = HID_SUB_CLASS_BOOT, .iface.bInterfaceProtocol = HID_PROTOCOL_MOUSE, .iface.iInterface = UDI_HID_MOU_STRING_ID, .hid.bLength = sizeof(usb_hid_descriptor_t), .hid.bDescriptorType = USB_DT_HID, .hid.bcdHID = LE16(USB_HID_BDC_V1_11), .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE, .hid.bNumDescriptors = USB_HID_NUM_DESC, .hid.bRDescriptorType = USB_DT_HID_REPORT, .hid.wDescriptorLength = LE16(sizeof(udi_hid_mou_report_desc_t)), .ep.bLength = sizeof(usb_ep_desc_t), .ep.bDescriptorType = USB_DT_ENDPOINT, .ep.bEndpointAddress = UDI_HID_MOU_EP_IN | USB_EP_DIR_IN, .ep.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep.wMaxPacketSize = LE16(UDI_HID_MOU_EP_SIZE), .ep.bInterval = MOU_POLLING_INTERVAL, }
+// clang-format off
-// no set report buffer
+# define UDI_HID_MOU_DESC { \
+ .iface = { \
+ .bLength = sizeof(usb_iface_desc_t), \
+ .bDescriptorType = USB_DT_INTERFACE, \
+ .bInterfaceNumber = MOUSE_INTERFACE, \
+ .bAlternateSetting = 0, \
+ .bNumEndpoints = 1, \
+ .bInterfaceClass = HID_CLASS, \
+ .bInterfaceSubClass = HID_SUB_CLASS_BOOT, \
+ .bInterfaceProtocol = HID_PROTOCOL_MOUSE, \
+ .iInterface = UDI_HID_MOU_STRING_ID \
+ }, \
+ .hid = { \
+ .bLength = sizeof(usb_hid_descriptor_t), \
+ .bDescriptorType = USB_DT_HID, \
+ .bcdHID = LE16(USB_HID_BDC_V1_11), \
+ .bCountryCode = USB_HID_NO_COUNTRY_CODE, \
+ .bNumDescriptors = USB_HID_NUM_DESC, \
+ .bRDescriptorType = USB_DT_HID_REPORT, \
+ .wDescriptorLength = LE16(sizeof(udi_hid_mou_report_desc_t)) \
+ }, \
+ .ep = { \
+ .bLength = sizeof(usb_ep_desc_t), \
+ .bDescriptorType = USB_DT_ENDPOINT, \
+ .bEndpointAddress = UDI_HID_MOU_EP_IN | USB_EP_DIR_IN, \
+ .bmAttributes = USB_EP_TYPE_INTERRUPT, \
+ .wMaxPacketSize = LE16(UDI_HID_MOU_EP_SIZE), \
+ .bInterval = MOU_POLLING_INTERVAL \
+ } \
+}
+
+// clang-format on
// report buffer
# define UDI_HID_MOU_REPORT_SIZE 5 // MOU PDS
@@ -412,12 +489,12 @@ extern uint8_t udi_hid_mou_report[UDI_HID_MOU_REPORT_SIZE];
COMPILER_PACK_RESET()
-#endif // MOU
+#endif // MOUSE_ENABLE
// **********************************************************************
// RAW Descriptor structure and content
// **********************************************************************
-#ifdef RAW
+#ifdef RAW_ENABLE
COMPILER_PACK_SET(1)
@@ -432,11 +509,48 @@ typedef struct {
uint8_t array[26];
} udi_hid_raw_report_desc_t;
-# define UDI_HID_RAW_DESC \
- { \
- .iface.bLength = sizeof(usb_iface_desc_t), .iface.bDescriptorType = USB_DT_INTERFACE, .iface.bInterfaceNumber = RAW_INTERFACE, .iface.bAlternateSetting = 0, .iface.bNumEndpoints = 2, .iface.bInterfaceClass = HID_CLASS, .iface.bInterfaceSubClass = HID_SUB_CLASS_NOBOOT, .iface.bInterfaceProtocol = HID_SUB_CLASS_NOBOOT, .iface.iInterface = UDI_HID_RAW_STRING_ID, .hid.bLength = sizeof(usb_hid_descriptor_t), .hid.bDescriptorType = USB_DT_HID, .hid.bcdHID = LE16(USB_HID_BDC_V1_11), .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE, .hid.bNumDescriptors = USB_HID_NUM_DESC, .hid.bRDescriptorType = USB_DT_HID_REPORT, .hid.wDescriptorLength = LE16(sizeof(udi_hid_raw_report_desc_t)), .ep_out.bLength = sizeof(usb_ep_desc_t), .ep_out.bDescriptorType = USB_DT_ENDPOINT, .ep_out.bEndpointAddress = UDI_HID_RAW_EP_OUT | USB_EP_DIR_OUT, .ep_out.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep_out.wMaxPacketSize = LE16(RAW_EPSIZE), .ep_out.bInterval = RAW_POLLING_INTERVAL, \
- .ep_in.bLength = sizeof(usb_ep_desc_t), .ep_in.bDescriptorType = USB_DT_ENDPOINT, .ep_in.bEndpointAddress = UDI_HID_RAW_EP_IN | USB_EP_DIR_IN, .ep_in.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep_in.wMaxPacketSize = LE16(RAW_EPSIZE), .ep_in.bInterval = RAW_POLLING_INTERVAL, \
- }
+// clang-format off
+
+# define UDI_HID_RAW_DESC { \
+ .iface = { \
+ .bLength = sizeof(usb_iface_desc_t), \
+ .bDescriptorType = USB_DT_INTERFACE, \
+ .bInterfaceNumber = RAW_INTERFACE, \
+ .bAlternateSetting = 0, \
+ .bNumEndpoints = 2, \
+ .bInterfaceClass = HID_CLASS, \
+ .bInterfaceSubClass = HID_SUB_CLASS_NOBOOT, \
+ .bInterfaceProtocol = HID_SUB_CLASS_NOBOOT, \
+ .iInterface = UDI_HID_RAW_STRING_ID \
+ }, \
+ .hid = { \
+ .bLength = sizeof(usb_hid_descriptor_t), \
+ .bDescriptorType = USB_DT_HID, \
+ .bcdHID = LE16(USB_HID_BDC_V1_11), \
+ .bCountryCode = USB_HID_NO_COUNTRY_CODE, \
+ .bNumDescriptors = USB_HID_NUM_DESC, \
+ .bRDescriptorType = USB_DT_HID_REPORT, \
+ .wDescriptorLength = LE16(sizeof(udi_hid_raw_report_desc_t)) \
+ }, \
+ .ep_out = { \
+ .bLength = sizeof(usb_ep_desc_t), \
+ .bDescriptorType = USB_DT_ENDPOINT, \
+ .bEndpointAddress = UDI_HID_RAW_EP_OUT | USB_EP_DIR_OUT, \
+ .bmAttributes = USB_EP_TYPE_INTERRUPT, \
+ .wMaxPacketSize = LE16(RAW_EPSIZE), \
+ .bInterval = RAW_POLLING_INTERVAL \
+ }, \
+ .ep_in = { \
+ .bLength = sizeof(usb_ep_desc_t), \
+ .bDescriptorType = USB_DT_ENDPOINT, \
+ .bEndpointAddress = UDI_HID_RAW_EP_IN | USB_EP_DIR_IN, \
+ .bmAttributes = USB_EP_TYPE_INTERRUPT, \
+ .wMaxPacketSize = LE16(RAW_EPSIZE), \
+ .bInterval = RAW_POLLING_INTERVAL \
+ } \
+}
+
+// clang-format on
# define UDI_HID_RAW_REPORT_SIZE RAW_EPSIZE
@@ -447,12 +561,12 @@ extern uint8_t udi_hid_raw_report[UDI_HID_RAW_REPORT_SIZE];
COMPILER_PACK_RESET()
-#endif // RAW
+#endif // RAW_ENABLE
// **********************************************************************
// CON Descriptor structure and content
// **********************************************************************
-#ifdef CON
+#ifdef CONSOLE_ENABLE
COMPILER_PACK_SET(1)
@@ -467,11 +581,48 @@ typedef struct {
uint8_t array[34];
} udi_hid_con_report_desc_t;
-# define UDI_HID_CON_DESC \
- { \
- .iface.bLength = sizeof(usb_iface_desc_t), .iface.bDescriptorType = USB_DT_INTERFACE, .iface.bInterfaceNumber = UDI_HID_CON_IFACE_NUMBER, .iface.bAlternateSetting = 0, .iface.bNumEndpoints = 2, .iface.bInterfaceClass = HID_CLASS, .iface.bInterfaceSubClass = HID_SUB_CLASS_NOBOOT, .iface.bInterfaceProtocol = HID_SUB_CLASS_NOBOOT, .iface.iInterface = UDI_HID_CON_STRING_ID, .hid.bLength = sizeof(usb_hid_descriptor_t), .hid.bDescriptorType = USB_DT_HID, .hid.bcdHID = LE16(USB_HID_BDC_V1_11), .hid.bCountryCode = USB_HID_NO_COUNTRY_CODE, .hid.bNumDescriptors = USB_HID_NUM_DESC, .hid.bRDescriptorType = USB_DT_HID_REPORT, .hid.wDescriptorLength = LE16(sizeof(udi_hid_con_report_desc_t)), .ep_out.bLength = sizeof(usb_ep_desc_t), .ep_out.bDescriptorType = USB_DT_ENDPOINT, .ep_out.bEndpointAddress = UDI_HID_CON_EP_OUT | USB_EP_DIR_OUT, .ep_out.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep_out.wMaxPacketSize = LE16(CONSOLE_EPSIZE), .ep_out.bInterval = CON_POLLING_INTERVAL, \
- .ep_in.bLength = sizeof(usb_ep_desc_t), .ep_in.bDescriptorType = USB_DT_ENDPOINT, .ep_in.bEndpointAddress = UDI_HID_CON_EP_IN | USB_EP_DIR_IN, .ep_in.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep_in.wMaxPacketSize = LE16(CONSOLE_EPSIZE), .ep_in.bInterval = CON_POLLING_INTERVAL, \
- }
+// clang-format off
+
+# define UDI_HID_CON_DESC { \
+ .iface = { \
+ .bLength = sizeof(usb_iface_desc_t), \
+ .bDescriptorType = USB_DT_INTERFACE, \
+ .bInterfaceNumber = UDI_HID_CON_IFACE_NUMBER, \
+ .bAlternateSetting = 0, \
+ .bNumEndpoints = 2, \
+ .bInterfaceClass = HID_CLASS, \
+ .bInterfaceSubClass = HID_SUB_CLASS_NOBOOT, \
+ .bInterfaceProtocol = HID_SUB_CLASS_NOBOOT, \
+ .iInterface = UDI_HID_CON_STRING_ID \
+ }, \
+ .hid = { \
+ .bLength = sizeof(usb_hid_descriptor_t), \
+ .bDescriptorType = USB_DT_HID, \
+ .bcdHID = LE16(USB_HID_BDC_V1_11), \
+ .bCountryCode = USB_HID_NO_COUNTRY_CODE, \
+ .bNumDescriptors = USB_HID_NUM_DESC, \
+ .bRDescriptorType = USB_DT_HID_REPORT, \
+ .wDescriptorLength = LE16(sizeof(udi_hid_con_report_desc_t)) \
+ }, \
+ .ep_out = { \
+ .bLength = sizeof(usb_ep_desc_t), \
+ .bDescriptorType = USB_DT_ENDPOINT, \
+ .bEndpointAddress = UDI_HID_CON_EP_OUT | USB_EP_DIR_OUT, \
+ .bmAttributes = USB_EP_TYPE_INTERRUPT, \
+ .wMaxPacketSize = LE16(CONSOLE_EPSIZE), \
+ .bInterval = CON_POLLING_INTERVAL \
+ }, \
+ .ep_in = { \
+ .bLength = sizeof(usb_ep_desc_t), \
+ .bDescriptorType = USB_DT_ENDPOINT, \
+ .bEndpointAddress = UDI_HID_CON_EP_IN | USB_EP_DIR_IN, \
+ .bmAttributes = USB_EP_TYPE_INTERRUPT, \
+ .wMaxPacketSize = LE16(CONSOLE_EPSIZE), \
+ .bInterval = CON_POLLING_INTERVAL \
+ } \
+}
+
+// clang-format on
# define UDI_HID_CON_REPORT_SIZE CONSOLE_EPSIZE
@@ -482,12 +633,12 @@ extern uint8_t udi_hid_con_report[UDI_HID_CON_REPORT_SIZE];
COMPILER_PACK_RESET()
-#endif // CON
+#endif // CONSOLE_ENABLE
// **********************************************************************
// CDC Descriptor structure and content
// **********************************************************************
-#ifdef CDC
+#ifdef VIRTSER_ENABLE
COMPILER_PACK_SET(1)
@@ -534,16 +685,98 @@ typedef struct {
usb_ep_desc_t ep_rx;
} udi_cdc_desc_t;
-# define CDC_DESCRIPTOR \
- { \
- .iaface.bLength = sizeof(usb_association_desc_t), .iaface.bDescriptorType = USB_DT_IAD, .iaface.bFirstInterface = CDC_STATUS_INTERFACE, .iaface.bInterfaceCount = 2, .iaface.bFunctionClass = CDC_CLASS_DEVICE, .iaface.bFunctionSubClass = CDC_SUBCLASS_ACM, .iaface.bFunctionProtocol = CDC_PROTOCOL_V25TER, .iaface.iFunction = 0, .iface_c.bLength = sizeof(usb_iface_desc_t), .iface_c.bDescriptorType = USB_DT_INTERFACE, .iface_c.bInterfaceNumber = CDC_STATUS_INTERFACE, .iface_c.bAlternateSetting = 0, .iface_c.bNumEndpoints = 1, .iface_c.bInterfaceClass = 0x02, .iface_c.bInterfaceSubClass = 0x02, .iface_c.bInterfaceProtocol = CDC_PROTOCOL_V25TER, .iface_c.iInterface = 0, .fd.bFunctionLength = sizeof(usb_cdc_hdr_desc_t), .fd.bDescriptorType = CDC_CS_INTERFACE, .fd.bDescriptorSubtype = CDC_SCS_HEADER, .fd.bcdCDC = 0x0110, .mfd.bFunctionLength = sizeof(usb_cdc_call_mgmt_desc_t), .mfd.bDescriptorType = CDC_CS_INTERFACE, .mfd.bDescriptorSubtype = CDC_SCS_CALL_MGMT, \
- .mfd.bmCapabilities = CDC_CALL_MGMT_SUPPORTED, .mfd.bDataInterface = CDC_DATA_INTERFACE, .acmd.bFunctionLength = sizeof(usb_cdc_acm_desc_t), .acmd.bDescriptorType = CDC_CS_INTERFACE, .acmd.bDescriptorSubtype = CDC_SCS_ACM, .acmd.bmCapabilities = CDC_ACM_SUPPORT_LINE_REQUESTS, .ufd.bFunctionLength = sizeof(usb_cdc_union_desc_t), .ufd.bDescriptorType = CDC_CS_INTERFACE, .ufd.bDescriptorSubtype = CDC_SCS_UNION, .ufd.bMasterInterface = CDC_STATUS_INTERFACE, .ufd.bSlaveInterface0 = CDC_DATA_INTERFACE, .ep_c.bLength = sizeof(usb_ep_desc_t), .ep_c.bDescriptorType = USB_DT_ENDPOINT, .ep_c.bEndpointAddress = CDC_ACM_ENDPOINT | USB_EP_DIR_IN, .ep_c.bmAttributes = USB_EP_TYPE_INTERRUPT, .ep_c.wMaxPacketSize = LE16(CDC_ACM_SIZE), .ep_c.bInterval = CDC_EP_INTERVAL_STATUS, .iface_d.bLength = sizeof(usb_iface_desc_t), .iface_d.bDescriptorType = USB_DT_INTERFACE, .iface_d.bInterfaceNumber = CDC_DATA_INTERFACE, .iface_d.bAlternateSetting = 0, .iface_d.bNumEndpoints = 2, \
- .iface_d.bInterfaceClass = CDC_CLASS_DATA, .iface_d.bInterfaceSubClass = 0, .iface_d.bInterfaceProtocol = 0, .iface_d.iInterface = 0, .ep_rx.bLength = sizeof(usb_ep_desc_t), .ep_rx.bDescriptorType = USB_DT_ENDPOINT, .ep_rx.bEndpointAddress = CDC_RX_ENDPOINT | USB_EP_DIR_OUT, .ep_rx.bmAttributes = USB_EP_TYPE_BULK, .ep_rx.wMaxPacketSize = LE16(CDC_RX_SIZE), .ep_rx.bInterval = CDC_EP_INTERVAL_DATA, .ep_tx.bLength = sizeof(usb_ep_desc_t), .ep_tx.bDescriptorType = USB_DT_ENDPOINT, .ep_tx.bEndpointAddress = CDC_TX_ENDPOINT | USB_EP_DIR_IN, .ep_tx.bmAttributes = USB_EP_TYPE_BULK, .ep_tx.wMaxPacketSize = LE16(CDC_TX_SIZE), .ep_tx.bInterval = CDC_EP_INTERVAL_DATA, \
- }
+// clang-format off
+
+# define CDC_DESCRIPTOR { \
+ .iaface = { \
+ .bLength = sizeof(usb_association_desc_t), \
+ .bDescriptorType = USB_DT_IAD, \
+ .bFirstInterface = CDC_STATUS_INTERFACE, \
+ .bInterfaceCount = 2, \
+ .bFunctionClass = CDC_CLASS_DEVICE, \
+ .bFunctionSubClass = CDC_SUBCLASS_ACM, \
+ .bFunctionProtocol = CDC_PROTOCOL_V25TER, \
+ .iFunction = 0 \
+ }, \
+ .iface_c = { \
+ .bLength = sizeof(usb_iface_desc_t), \
+ .bDescriptorType = USB_DT_INTERFACE, \
+ .bInterfaceNumber = CDC_STATUS_INTERFACE, \
+ .bAlternateSetting = 0, \
+ .bNumEndpoints = 1, \
+ .bInterfaceClass = 0x02, \
+ .bInterfaceSubClass = 0x02, \
+ .bInterfaceProtocol = CDC_PROTOCOL_V25TER, \
+ .iInterface = 0 \
+ }, \
+ .fd = { \
+ .bFunctionLength = sizeof(usb_cdc_hdr_desc_t), \
+ .bDescriptorType = CDC_CS_INTERFACE, \
+ .bDescriptorSubtype = CDC_SCS_HEADER, \
+ .bcdCDC = 0x0110 \
+ }, \
+ .mfd = { \
+ .bFunctionLength = sizeof(usb_cdc_call_mgmt_desc_t), \
+ .bDescriptorType = CDC_CS_INTERFACE, \
+ .bDescriptorSubtype = CDC_SCS_CALL_MGMT, \
+ .bmCapabilities = CDC_CALL_MGMT_SUPPORTED, \
+ .bDataInterface = CDC_DATA_INTERFACE \
+ }, \
+ .acmd = { \
+ .bFunctionLength = sizeof(usb_cdc_acm_desc_t), \
+ .bDescriptorType = CDC_CS_INTERFACE, \
+ .bDescriptorSubtype = CDC_SCS_ACM, \
+ .bmCapabilities = CDC_ACM_SUPPORT_LINE_REQUESTS \
+ }, \
+ .ufd = { \
+ .bFunctionLength = sizeof(usb_cdc_union_desc_t), \
+ .bDescriptorType = CDC_CS_INTERFACE, \
+ .bDescriptorSubtype = CDC_SCS_UNION, \
+ .bMasterInterface = CDC_STATUS_INTERFACE, \
+ .bSlaveInterface0 = CDC_DATA_INTERFACE \
+ }, \
+ .ep_c = { \
+ .bLength = sizeof(usb_ep_desc_t), \
+ .bDescriptorType = USB_DT_ENDPOINT, \
+ .bEndpointAddress = CDC_ACM_ENDPOINT | USB_EP_DIR_IN, \
+ .bmAttributes = USB_EP_TYPE_INTERRUPT, \
+ .wMaxPacketSize = LE16(CDC_ACM_SIZE), \
+ .bInterval = CDC_EP_INTERVAL_STATUS \
+ }, \
+ .iface_d = { \
+ .bLength = sizeof(usb_iface_desc_t), \
+ .bDescriptorType = USB_DT_INTERFACE, \
+ .bInterfaceNumber = CDC_DATA_INTERFACE, \
+ .bAlternateSetting = 0, \
+ .bNumEndpoints = 2, \
+ .bInterfaceClass = CDC_CLASS_DATA, \
+ .bInterfaceSubClass = 0, \
+ .bInterfaceProtocol = 0, \
+ .iInterface = 0 \
+ }, \
+ .ep_rx = { \
+ .bLength = sizeof(usb_ep_desc_t), \
+ .bDescriptorType = USB_DT_ENDPOINT, \
+ .bEndpointAddress = CDC_RX_ENDPOINT | USB_EP_DIR_OUT, \
+ .bmAttributes = USB_EP_TYPE_BULK, \
+ .wMaxPacketSize = LE16(CDC_RX_SIZE), \
+ .bInterval = CDC_EP_INTERVAL_DATA \
+ }, \
+ .ep_tx = { \
+ .bLength = sizeof(usb_ep_desc_t), \
+ .bDescriptorType = USB_DT_ENDPOINT, \
+ .bEndpointAddress = CDC_TX_ENDPOINT | USB_EP_DIR_IN, \
+ .bmAttributes = USB_EP_TYPE_BULK, \
+ .wMaxPacketSize = LE16(CDC_TX_SIZE), \
+ .bInterval = CDC_EP_INTERVAL_DATA \
+ } \
+}
+
+// clang-format on
COMPILER_PACK_RESET()
-#endif // CDC
+#endif // VIRTSER_ENABLE
// **********************************************************************
// CONFIGURATION Descriptor structure and content
@@ -552,28 +785,26 @@ COMPILER_PACK_SET(1)
typedef struct {
usb_conf_desc_t conf;
-#ifdef KBD
udi_hid_kbd_desc_t hid_kbd;
-#endif
-#ifdef MOU
+#ifdef MOUSE_ENABLE
udi_hid_mou_desc_t hid_mou;
#endif
-#ifdef EXK
+#ifdef EXTRAKEY_ENABLE
udi_hid_exk_desc_t hid_exk;
#endif
-#ifdef RAW
+#ifdef RAW_ENABLE
udi_hid_raw_desc_t hid_raw;
#endif
-#ifdef CON
+#ifdef CONSOLE_ENABLE
udi_hid_con_desc_t hid_con;
#endif
-#ifdef NKRO
+#ifdef NKRO_ENABLE
udi_hid_nkro_desc_t hid_nkro;
#endif
-#ifdef MIDI
+#ifdef MIDI_ENABLE
udi_hid_midi_desc_t hid_midi;
#endif
-#ifdef CDC
+#ifdef VIRTSER_ENABLE
udi_cdc_desc_t cdc_serial;
#endif
} udc_desc_t;
diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c
index cf9297dc781..3e9fbfdbed2 100644
--- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c
+++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c
@@ -59,8 +59,6 @@
//***************************************************************************
// KBD
//***************************************************************************
-#ifdef KBD
-
bool udi_hid_kbd_enable(void);
void udi_hid_kbd_disable(void);
bool udi_hid_kbd_setup(void);
@@ -196,12 +194,10 @@ static void udi_hid_kbd_setreport_valid(void) {
// UDI_HID_KBD_CHANGE_LED(udi_hid_kbd_report_set);
}
-#endif // KBD
-
//********************************************************************************************
// NKRO Keyboard
//********************************************************************************************
-#ifdef NKRO
+#ifdef NKRO_ENABLE
bool udi_hid_nkro_enable(void);
void udi_hid_nkro_disable(void);
@@ -336,12 +332,12 @@ static void udi_hid_nkro_setreport_valid(void) {
// UDI_HID_NKRO_CHANGE_LED(udi_hid_nkro_report_set);
}
-#endif // NKRO
+#endif // NKRO_ENABLE
//********************************************************************************************
// EXK (extra-keys) SYS-CTRL Keyboard
//********************************************************************************************
-#ifdef EXK
+#ifdef EXTRAKEY_ENABLE
bool udi_hid_exk_enable(void);
void udi_hid_exk_disable(void);
@@ -467,12 +463,12 @@ static void udi_hid_exk_report_sent(udd_ep_status_t status, iram_size_t nb_sent,
static void udi_hid_exk_setreport_valid(void) {}
-#endif // EXK
+#endif // EXTRAKEY_ENABLE
//********************************************************************************************
// MOU Mouse
//********************************************************************************************
-#ifdef MOU
+#ifdef MOUSE_ENABLE
bool udi_hid_mou_enable(void);
void udi_hid_mou_disable(void);
@@ -601,12 +597,12 @@ static void udi_hid_mou_report_sent(udd_ep_status_t status, iram_size_t nb_sent,
}
}
-#endif // MOU
+#endif // MOUSE_ENABLE
//********************************************************************************************
// RAW
//********************************************************************************************
-#ifdef RAW
+#ifdef RAW_ENABLE
bool udi_hid_raw_enable(void);
void udi_hid_raw_disable(void);
@@ -640,6 +636,9 @@ static bool udi_hid_raw_b_report_trans_ongoing;
COMPILER_WORD_ALIGNED
static uint8_t udi_hid_raw_report_trans[UDI_HID_RAW_REPORT_SIZE];
+COMPILER_WORD_ALIGNED
+static uint8_t udi_hid_raw_report_recv[UDI_HID_RAW_REPORT_SIZE];
+
COMPILER_WORD_ALIGNED
UDC_DESC_STORAGE udi_hid_raw_report_desc_t udi_hid_raw_report_desc = {{
0x06, 0x60, 0xFF, // Usage Page (Vendor Defined)
@@ -663,6 +662,7 @@ static bool udi_hid_raw_setreport(void);
static void udi_hid_raw_setreport_valid(void);
static void udi_hid_raw_report_sent(udd_ep_status_t status, iram_size_t nb_sent, udd_ep_id_t ep);
+static void udi_hid_raw_report_rcvd(udd_ep_status_t status, iram_size_t nb_rcvd, udd_ep_id_t ep);
bool udi_hid_raw_enable(void) {
// Initialize internal values
@@ -719,12 +719,35 @@ static void udi_hid_raw_report_sent(udd_ep_status_t status, iram_size_t nb_sent,
static void udi_hid_raw_setreport_valid(void) {}
-#endif // RAW
+void raw_hid_send(uint8_t *data, uint8_t length) {
+ if (main_b_raw_enable && !udi_hid_raw_b_report_trans_ongoing && length == UDI_HID_RAW_REPORT_SIZE) {
+ memcpy(udi_hid_raw_report, data, UDI_HID_RAW_REPORT_SIZE);
+ udi_hid_raw_send_report();
+ }
+}
+
+bool udi_hid_raw_receive_report(void) {
+ if (!main_b_raw_enable) {
+ return false;
+ }
+
+ return udd_ep_run(UDI_HID_RAW_EP_OUT | USB_EP_DIR_OUT, false, udi_hid_raw_report_recv, UDI_HID_RAW_REPORT_SIZE, udi_hid_raw_report_rcvd);
+}
+
+static void udi_hid_raw_report_rcvd(udd_ep_status_t status, iram_size_t nb_rcvd, udd_ep_id_t ep) {
+ UNUSED(ep);
+
+ if (status == UDD_EP_TRANSFER_OK && nb_rcvd == UDI_HID_RAW_REPORT_SIZE) {
+ UDI_HID_RAW_RECEIVE(udi_hid_raw_report_recv, UDI_HID_RAW_REPORT_SIZE);
+ }
+}
+
+#endif // RAW_ENABLE
//********************************************************************************************
// CON
//********************************************************************************************
-#ifdef CON
+#ifdef CONSOLE_ENABLE
bool udi_hid_con_enable(void);
void udi_hid_con_disable(void);
@@ -839,4 +862,4 @@ static void udi_hid_con_report_sent(udd_ep_status_t status, iram_size_t nb_sent,
static void udi_hid_con_setreport_valid(void) {}
-#endif // CON
+#endif // CONSOLE_ENABLE
diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h
index 82b1cbfe072..a2d2281628a 100644
--- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h
+++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.h
@@ -57,61 +57,60 @@ extern "C" {
//******************************************************************************
// Keyboard interface definitions
//******************************************************************************
-#ifdef KBD
extern UDC_DESC_STORAGE udi_api_t udi_api_hid_kbd;
extern bool udi_hid_kbd_b_report_valid;
extern volatile bool udi_hid_kbd_b_report_trans_ongoing;
extern uint8_t udi_hid_kbd_report_set;
bool udi_hid_kbd_send_report(void);
-#endif // KBD
//********************************************************************************************
// NKRO Keyboard
//********************************************************************************************
-#ifdef NKRO
+#ifdef NKRO_ENABLE
extern UDC_DESC_STORAGE udi_api_t udi_api_hid_nkro;
extern bool udi_hid_nkro_b_report_valid;
extern volatile bool udi_hid_nkro_b_report_trans_ongoing;
bool udi_hid_nkro_send_report(void);
-#endif // NKRO
+#endif // NKRO_ENABLE
//********************************************************************************************
// SYS-CTRL interface
//********************************************************************************************
-#ifdef EXK
+#ifdef EXTRAKEY_ENABLE
extern UDC_DESC_STORAGE udi_api_t udi_api_hid_exk;
extern bool udi_hid_exk_b_report_valid;
extern uint8_t udi_hid_exk_report_set;
bool udi_hid_exk_send_report(void);
-#endif // EXK
+#endif // EXTRAKEY_ENABLE
//********************************************************************************************
// CON Console
//********************************************************************************************
-#ifdef CON
+#ifdef CONSOLE_ENABLE
extern UDC_DESC_STORAGE udi_api_t udi_api_hid_con;
extern bool udi_hid_con_b_report_valid;
extern uint8_t udi_hid_con_report_set[UDI_HID_CON_REPORT_SIZE];
extern volatile bool udi_hid_con_b_report_trans_ongoing;
bool udi_hid_con_send_report(void);
-#endif // CON
+#endif // CONSOLE_ENABLE
//********************************************************************************************
// MOU Mouse
//********************************************************************************************
-#ifdef MOU
+#ifdef MOUSE_ENABLE
extern UDC_DESC_STORAGE udi_api_t udi_api_hid_mou;
extern bool udi_hid_mou_b_report_valid;
bool udi_hid_mou_send_report(void);
-#endif // MOU
+#endif // MOUSE_ENABLE
//********************************************************************************************
// RAW Raw
//********************************************************************************************
-#ifdef RAW
+#ifdef RAW_ENABLE
extern UDC_DESC_STORAGE udi_api_t udi_api_hid_raw;
bool udi_hid_raw_send_report(void);
-#endif // RAW
+bool udi_hid_raw_receive_report(void);
+#endif // RAW_ENABLE
//@}
diff --git a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c
index 4e7deaaa381..a3fb46a3d49 100644
--- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c
+++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd_desc.c
@@ -120,49 +120,45 @@ UDC_DESC_STORAGE udc_desc_t udc_desc = {
.conf.iConfiguration = 0,
.conf.bmAttributes = /* USB_CONFIG_ATTR_MUST_SET | */ USB_DEVICE_ATTR,
.conf.bMaxPower = USB_CONFIG_MAX_POWER(USB_DEVICE_POWER),
-#ifdef KBD
.hid_kbd = UDI_HID_KBD_DESC,
-#endif
-#ifdef RAW
+#ifdef RAW_ENABLE
.hid_raw = UDI_HID_RAW_DESC,
#endif
-#ifdef MOU
+#ifdef MOUSE_ENABLE
.hid_mou = UDI_HID_MOU_DESC,
#endif
-#ifdef EXK
+#ifdef EXTRAKEY_ENABLE
.hid_exk = UDI_HID_EXK_DESC,
#endif
-#ifdef CON
+#ifdef CONSOLE_ENABLE
.hid_con = UDI_HID_CON_DESC,
#endif
-#ifdef NKRO
+#ifdef NKRO_ENABLE
.hid_nkro = UDI_HID_NKRO_DESC,
#endif
-#ifdef CDC
+#ifdef VIRTSER_ENABLE
.cdc_serial = CDC_DESCRIPTOR,
#endif
};
UDC_DESC_STORAGE udi_api_t *udi_apis[USB_DEVICE_NB_INTERFACE] = {
-#ifdef KBD
&udi_api_hid_kbd,
-#endif
-#ifdef RAW
+#ifdef RAW_ENABLE
&udi_api_hid_raw,
#endif
-#ifdef MOU
+#ifdef MOUSE_ENABLE
&udi_api_hid_mou,
#endif
-#ifdef EXK
+#ifdef EXTRAKEY_ENABLE
&udi_api_hid_exk,
#endif
-#ifdef CON
+#ifdef CONSOLE_ENABLE
&udi_api_hid_con,
#endif
-#ifdef NKRO
+#ifdef NKRO_ENABLE
&udi_api_hid_nkro,
#endif
-#ifdef CDC
+#ifdef VIRTSER_ENABLE
&udi_api_cdc_comm, &udi_api_cdc_data,
#endif
};
diff --git a/tmk_core/protocol/arm_atsam/usb/usb_main.h b/tmk_core/protocol/arm_atsam/usb/usb_main.h
index e1ffa3e1846..d8461c6c9f6 100644
--- a/tmk_core/protocol/arm_atsam/usb/usb_main.h
+++ b/tmk_core/protocol/arm_atsam/usb/usb_main.h
@@ -63,40 +63,39 @@ void main_remotewakeup_enable(void);
// Called by UDC when USB Host request to disable remote wakeup
void main_remotewakeup_disable(void);
-#ifdef KBD
extern volatile bool main_b_kbd_enable;
bool main_kbd_enable(void);
void main_kbd_disable(void);
-#endif // KBD
-#ifdef NKRO
+#ifdef NKRO_ENABLE
extern volatile bool main_b_nkro_enable;
bool main_nkro_enable(void);
void main_nkro_disable(void);
-#endif // NKRO
+#endif // NKRO_ENABLE
-#ifdef EXK
+#ifdef EXTRAKEY_ENABLE
extern volatile bool main_b_exk_enable;
bool main_exk_enable(void);
void main_exk_disable(void);
-#endif // EXK
+#endif // EXTRAKEY_ENABLE
-#ifdef CON
+#ifdef CONSOLE_ENABLE
extern volatile bool main_b_con_enable;
bool main_con_enable(void);
void main_con_disable(void);
-#endif // CON
+#endif // CONSOLE_ENABLE
-#ifdef MOU
+#ifdef MOUSE_ENABLE
extern volatile bool main_b_mou_enable;
bool main_mou_enable(void);
void main_mou_disable(void);
-#endif // MOU
+#endif // MOUSE_ENABLE
-#ifdef RAW
+#ifdef RAW_ENABLE
extern volatile bool main_b_raw_enable;
bool main_raw_enable(void);
void main_raw_disable(void);
-#endif // RAW
+void main_raw_receive(uint8_t *buffer, uint8_t len);
+#endif // RAW_ENABLE
#endif // _MAIN_H_
diff --git a/tmk_core/protocol/arm_atsam/usb/usb_protocol_cdc.h b/tmk_core/protocol/arm_atsam/usb/usb_protocol_cdc.h
index aa639a6e5d2..f35503a3be5 100644
--- a/tmk_core/protocol/arm_atsam/usb/usb_protocol_cdc.h
+++ b/tmk_core/protocol/arm_atsam/usb/usb_protocol_cdc.h
@@ -48,7 +48,7 @@
#include "compiler.h"
-#ifdef CDC
+#ifdef VIRTSER_ENABLE
# define CDC_CLASS_DEVICE 0x02 //!< USB Communication Device Class
# define CDC_CLASS_COMM 0x02 //!< CDC Communication Class Interface
diff --git a/tmk_core/protocol/bluefruit.mk b/tmk_core/protocol/bluefruit.mk
deleted file mode 100644
index 13a0693c572..00000000000
--- a/tmk_core/protocol/bluefruit.mk
+++ /dev/null
@@ -1,11 +0,0 @@
-BLUEFRUIT_DIR = protocol/bluefruit
-
-SRC += $(BLUEFRUIT_DIR)/main.c \
- $(BLUEFRUIT_DIR)/bluefruit.c \
- serial_uart.c
-
-# Search Path
-VPATH += $(TMK_DIR)/$(BLUEFRUIT_DIR)
-#VPATH += $(TMK_DIR)/$(BLUEFRUIT_DIR)/usb_debug_only
-
-OPT_DEFS += -DPROTOCOL_BLUEFRUIT
diff --git a/tmk_core/protocol/bluefruit/bluefruit.c b/tmk_core/protocol/bluefruit/bluefruit.c
deleted file mode 100644
index fb001855ea4..00000000000
--- a/tmk_core/protocol/bluefruit/bluefruit.c
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
-Bluefruit Protocol for TMK firmware
-Author: Benjamin Gould, 2013
-Based on code Copyright 2011 Jun Wako
-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 .
-*/
-
-#include
-#include "host.h"
-#include "report.h"
-#include "print.h"
-#include "debug.h"
-#include "host_driver.h"
-#include "serial.h"
-#include "bluefruit.h"
-
-#define BLUEFRUIT_TRACE_SERIAL 1
-
-static uint8_t bluefruit_keyboard_leds = 0;
-
-static void bluefruit_serial_send(uint8_t);
-
-void bluefruit_keyboard_print_report(report_keyboard_t *report) {
- if (!debug_keyboard) return;
- dprintf("keys: ");
- for (int i = 0; i < KEYBOARD_REPORT_KEYS; i++) {
- debug_hex8(report->keys[i]);
- dprintf(" ");
- }
- dprintf(" mods: ");
- debug_hex8(report->mods);
- dprintf(" reserved: ");
- debug_hex8(report->reserved);
- dprintf("\n");
-}
-
-#ifdef BLUEFRUIT_TRACE_SERIAL
-static void bluefruit_trace_header() {
- dprintf("+------------------------------------+\n");
- dprintf("| HID report to Bluefruit via serial |\n");
- dprintf("+------------------------------------+\n|");
-}
-
-static void bluefruit_trace_footer() { dprintf("|\n+------------------------------------+\n\n"); }
-#endif
-
-static void bluefruit_serial_send(uint8_t data) {
-#ifdef BLUEFRUIT_TRACE_SERIAL
- dprintf(" ");
- debug_hex8(data);
- dprintf(" ");
-#endif
- serial_send(data);
-}
-
-/*------------------------------------------------------------------*
- * Host driver
- *------------------------------------------------------------------*/
-
-static uint8_t keyboard_leds(void);
-static void send_keyboard(report_keyboard_t *report);
-static void send_mouse(report_mouse_t *report);
-static void send_system(uint16_t data);
-static void send_consumer(uint16_t data);
-
-void sendString(char string[], int length) {
- for (int i = 0; i < length; i++) {
- serial_send(string[i]);
- }
-}
-
-static host_driver_t driver = {keyboard_leds, send_keyboard, send_mouse, send_system, send_consumer};
-
-host_driver_t *bluefruit_driver(void) { return &driver; }
-
-static uint8_t keyboard_leds(void) { return bluefruit_keyboard_leds; }
-
-static void send_keyboard(report_keyboard_t *report) {
-#ifdef BLUEFRUIT_TRACE_SERIAL
- bluefruit_trace_header();
-#endif
- bluefruit_serial_send(0xFD);
- for (uint8_t i = 0; i < KEYBOARD_REPORT_SIZE; i++) {
- bluefruit_serial_send(report->raw[i]);
- }
-#ifdef BLUEFRUIT_TRACE_SERIAL
- bluefruit_trace_footer();
-#endif
-}
-
-static void send_mouse(report_mouse_t *report) {
-#ifdef BLUEFRUIT_TRACE_SERIAL
- bluefruit_trace_header();
-#endif
- bluefruit_serial_send(0xFD);
- bluefruit_serial_send(0x00);
- bluefruit_serial_send(0x03);
- bluefruit_serial_send(report->buttons);
- bluefruit_serial_send(report->x);
- bluefruit_serial_send(report->y);
- bluefruit_serial_send(report->v); // should try sending the wheel v here
- bluefruit_serial_send(report->h); // should try sending the wheel h here
- bluefruit_serial_send(0x00);
-#ifdef BLUEFRUIT_TRACE_SERIAL
- bluefruit_trace_footer();
-#endif
-}
-
-static void send_system(uint16_t data) {}
-
-/*
-+-----------------+-------------------+-------+
-| Consumer Key | Bit Map | Hex |
-+-----------------+-------------------+-------+
-| Home | 00000001 00000000 | 01 00 |
-| KeyboardLayout | 00000010 00000000 | 02 00 |
-| Search | 00000100 00000000 | 04 00 |
-| Snapshot | 00001000 00000000 | 08 00 |
-| VolumeUp | 00010000 00000000 | 10 00 |
-| VolumeDown | 00100000 00000000 | 20 00 |
-| Play/Pause | 01000000 00000000 | 40 00 |
-| Fast Forward | 10000000 00000000 | 80 00 |
-| Rewind | 00000000 00000001 | 00 01 |
-| Scan Next Track | 00000000 00000010 | 00 02 |
-| Scan Prev Track | 00000000 00000100 | 00 04 |
-| Random Play | 00000000 00001000 | 00 08 |
-| Stop | 00000000 00010000 | 00 10 |
-+-------------------------------------+-------+
-*/
-#define CONSUMER2BLUEFRUIT(usage) (usage == AUDIO_MUTE ? 0x0000 : (usage == AUDIO_VOL_UP ? 0x1000 : (usage == AUDIO_VOL_DOWN ? 0x2000 : (usage == TRANSPORT_NEXT_TRACK ? 0x0002 : (usage == TRANSPORT_PREV_TRACK ? 0x0004 : (usage == TRANSPORT_STOP ? 0x0010 : (usage == TRANSPORT_STOP_EJECT ? 0x0000 : (usage == TRANSPORT_PLAY_PAUSE ? 0x4000 : (usage == AL_CC_CONFIG ? 0x0000 : (usage == AL_EMAIL ? 0x0000 : (usage == AL_CALCULATOR ? 0x0000 : (usage == AL_LOCAL_BROWSER ? 0x0000 : (usage == AC_SEARCH ? 0x0400 : (usage == AC_HOME ? 0x0100 : (usage == AC_BACK ? 0x0000 : (usage == AC_FORWARD ? 0x0000 : (usage == AC_STOP ? 0x0000 : (usage == AC_REFRESH ? 0x0000 : (usage == AC_BOOKMARKS ? 0x0000 : 0)))))))))))))))))))
-
-static void send_consumer(uint16_t data) {
- static uint16_t last_data = 0;
- if (data == last_data) return;
- last_data = data;
-
- uint16_t bitmap = CONSUMER2BLUEFRUIT(data);
-
-#ifdef BLUEFRUIT_TRACE_SERIAL
- dprintf("\nData: ");
- debug_hex16(data);
- dprintf("; bitmap: ");
- debug_hex16(bitmap);
- dprintf("\n");
- bluefruit_trace_header();
-#endif
- bluefruit_serial_send(0xFD);
- bluefruit_serial_send(0x00);
- bluefruit_serial_send(0x02);
- bluefruit_serial_send((bitmap >> 8) & 0xFF);
- bluefruit_serial_send(bitmap & 0xFF);
- bluefruit_serial_send(0x00);
- bluefruit_serial_send(0x00);
- bluefruit_serial_send(0x00);
- bluefruit_serial_send(0x00);
-#ifdef BLUEFRUIT_TRACE_SERIAL
- bluefruit_trace_footer();
-#endif
-}
\ No newline at end of file
diff --git a/tmk_core/protocol/bluefruit/bluefruit.h b/tmk_core/protocol/bluefruit/bluefruit.h
deleted file mode 100644
index 7b636abb955..00000000000
--- a/tmk_core/protocol/bluefruit/bluefruit.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-Bluefruit Protocol for TMK firmware
-Author: Benjamin Gould, 2013
-Based on code Copyright 2011 Jun Wako
-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 .
-*/
-
-#ifndef VUSB_H
-#define VUSB_H
-
-#include "host_driver.h"
-
-host_driver_t *bluefruit_driver(void);
-
-#endif
\ No newline at end of file
diff --git a/tmk_core/protocol/bluefruit/main.c b/tmk_core/protocol/bluefruit/main.c
deleted file mode 100644
index aca46206d5a..00000000000
--- a/tmk_core/protocol/bluefruit/main.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-Bluefruit Protocol for TMK firmware
-Author: Benjamin Gould, 2013
-Based on code Copyright 2011 Jun Wako
-
-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 .
-*/
-
-#include
-#include
-#include
-#include
-#include
-#include "../serial.h"
-#include "keyboard.h"
-#include "host.h"
-#include "timer.h"
-#include "print.h"
-#include "debug.h"
-#include "sendchar.h"
-#include "suspend.h"
-#include "bluefruit.h"
-
-#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
-
-int main(void) {
- CPU_PRESCALE(0);
-
- // DDRD = _BV(PD5);
- // DDRB = _BV(PB0);
-
- // PORTD = _BV(PD5);
- // PORTB = _BV(PB0);
-
- print_set_sendchar(sendchar);
-
- keyboard_setup();
-
- dprintf("Initializing keyboard...\n");
- keyboard_init();
-
- dprintf("Setting host driver to bluefruit...\n");
- host_set_driver(bluefruit_driver());
-
- dprintf("Initializing serial...\n");
- serial_init();
-
- // char swpa[] = "+++\r\n";
- // for (int i = 0; i < 5; i++) {
- // serial_send(swpa[i]);
- // }
-
- // char ble_enable[] = "AT+BLEKEYBOARDEN=1\r\n";
- // for (int i = 0; i < 20; i++) {
- // serial_send(ble_enable[i]);
- // }
-
- // char reset[] = "ATZ\r\n";
- // for (int i = 0; i < 5; i++) {
- // serial_send(reset[i]);
- // }
-
- // for (int i = 0; i < 5; i++) {
- // serial_send(swpa[i]);
- // }
-
- // wait an extra second for the PC's operating system
- // to load drivers and do whatever it does to actually
- // be ready for input
- _delay_ms(1000);
- // PORTD = ~_BV(PD5);
- dprintf("Starting main loop");
- while (1) {
- keyboard_task();
- }
-}
diff --git a/tmk_core/protocol/chibios/init_hooks.h b/tmk_core/protocol/chibios/init_hooks.h
new file mode 100644
index 00000000000..fffced913a6
--- /dev/null
+++ b/tmk_core/protocol/chibios/init_hooks.h
@@ -0,0 +1,5 @@
+#pragma once
+
+// Override the initialisation functions inside the ChibiOS board.c files
+#define __early_init __chibios_override___early_init
+#define boardInit __chibios_override_boardInit
diff --git a/tmk_core/protocol/chibios/main.c b/tmk_core/protocol/chibios/main.c
index 6479fd09df2..61665eb6f4b 100644
--- a/tmk_core/protocol/chibios/main.c
+++ b/tmk_core/protocol/chibios/main.c
@@ -33,6 +33,11 @@
#include "debug.h"
#include "printf.h"
+#ifndef EARLY_INIT_PERFORM_BOOTLOADER_JUMP
+// Change this to be TRUE once we've migrated keyboards to the new init system
+# define EARLY_INIT_PERFORM_BOOTLOADER_JUMP FALSE
+#endif
+
#ifdef SLEEP_LED_ENABLE
# include "sleep_led.h"
#endif
@@ -101,6 +106,39 @@ void midi_ep_task(void);
// }
// }
+/* Early initialisation
+ */
+__attribute__((weak)) void early_hardware_init_pre(void) {
+#if EARLY_INIT_PERFORM_BOOTLOADER_JUMP
+ void enter_bootloader_mode_if_requested(void);
+ enter_bootloader_mode_if_requested();
+#endif // EARLY_INIT_PERFORM_BOOTLOADER_JUMP
+}
+
+__attribute__((weak)) void early_hardware_init_post(void) {}
+
+__attribute__((weak)) void board_init(void) {}
+
+// This overrides what's normally in ChibiOS board definitions
+void __early_init(void) {
+ early_hardware_init_pre();
+
+ // This is the renamed equivalent of __early_init in the board.c file
+ void __chibios_override___early_init(void);
+ __chibios_override___early_init();
+
+ early_hardware_init_post();
+}
+
+// This overrides what's normally in ChibiOS board definitions
+void boardInit(void) {
+ // This is the renamed equivalent of boardInit in the board.c file
+ void __chibios_override_boardInit(void);
+ __chibios_override_boardInit();
+
+ board_init();
+}
+
/* Main thread
*/
int main(void) {
diff --git a/tmk_core/protocol/ibm4704.c b/tmk_core/protocol/ibm4704.c
index fd8fc4dbd5e..a19443976e3 100644
--- a/tmk_core/protocol/ibm4704.c
+++ b/tmk_core/protocol/ibm4704.c
@@ -161,7 +161,9 @@ ISR(IBM4704_INT_VECT) {
case STOP:
// Data:Low
WAIT(data_lo, 100, state);
- rbuf_enqueue(data);
+ if (!rbuf_enqueue(data)) {
+ print("rbuf: full\n");
+ }
ibm4704_error = IBM4704_ERR_NONE;
goto DONE;
break;
diff --git a/tmk_core/protocol/lufa.mk b/tmk_core/protocol/lufa.mk
index d7d1d9ffccf..d87802992e9 100644
--- a/tmk_core/protocol/lufa.mk
+++ b/tmk_core/protocol/lufa.mk
@@ -29,6 +29,7 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
endif
ifeq ($(strip $(BLUETOOTH)), AdafruitBLE)
+ LUFA_SRC += spi_master.c
LUFA_SRC += analog.c
LUFA_SRC += $(LUFA_DIR)/adafruit_ble.cpp
endif
diff --git a/tmk_core/protocol/lufa/adafruit_ble.cpp b/tmk_core/protocol/lufa/adafruit_ble.cpp
index 7b3ffdef7a7..b07407f3877 100644
--- a/tmk_core/protocol/lufa/adafruit_ble.cpp
+++ b/tmk_core/protocol/lufa/adafruit_ble.cpp
@@ -1,15 +1,15 @@
#include "adafruit_ble.h"
+
#include
#include
#include
-#include
-#include
#include "debug.h"
-#include "pincontrol.h"
#include "timer.h"
#include "action_util.h"
#include "ringbuffer.hpp"
#include
+#include "spi_master.h"
+#include "wait.h"
#include "analog.h"
// These are the pin assignments for the 32u4 boards.
@@ -27,6 +27,12 @@
# define AdafruitBleIRQPin E6
#endif
+#ifndef AdafruitBleSpiClockSpeed
+# define AdafruitBleSpiClockSpeed 4000000UL // SCK frequency
+#endif
+
+#define SCK_DIVISOR (F_CPU / AdafruitBleSpiClockSpeed)
+
#define SAMPLE_BATTERY
#define ConnectionUpdateInterval 1000 /* milliseconds */
@@ -130,10 +136,6 @@ enum ble_system_event_bits {
BleSystemMidiRx = 10,
};
-// The SDEP.md file says 2MHz but the web page and the sample driver
-// both use 4MHz
-#define SpiBusSpeed 4000000
-
#define SdepTimeout 150 /* milliseconds */
#define SdepShortTimeout 10 /* milliseconds */
#define SdepBackOff 25 /* microseconds */
@@ -142,116 +144,32 @@ enum ble_system_event_bits {
static bool at_command(const char *cmd, char *resp, uint16_t resplen, bool verbose, uint16_t timeout = SdepTimeout);
static bool at_command_P(const char *cmd, char *resp, uint16_t resplen, bool verbose = false);
-struct SPI_Settings {
- uint8_t spcr, spsr;
-};
-
-static struct SPI_Settings spi;
-
-// Initialize 4Mhz MSBFIRST MODE0
-void SPI_init(struct SPI_Settings *spi) {
- spi->spcr = _BV(SPE) | _BV(MSTR);
-#if F_CPU == 8000000
- // For MCUs running at 8MHz (such as Feather 32U4, or 3.3V Pro Micros) we set the SPI doublespeed bit
- spi->spsr = _BV(SPI2X);
-#endif
-
- ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
- // Ensure that SS is OUTPUT High
- digitalWrite(B0, PinLevelHigh);
- pinMode(B0, PinDirectionOutput);
-
- SPCR |= _BV(MSTR);
- SPCR |= _BV(SPE);
- pinMode(B1 /* SCK */, PinDirectionOutput);
- pinMode(B2 /* MOSI */, PinDirectionOutput);
- }
-}
-
-static inline void SPI_begin(struct SPI_Settings *spi) {
- SPCR = spi->spcr;
- SPSR = spi->spsr;
-}
-
-static inline uint8_t SPI_TransferByte(uint8_t data) {
- SPDR = data;
- asm volatile("nop");
- while (!(SPSR & _BV(SPIF))) {
- ; // wait
- }
- return SPDR;
-}
-
-static inline void spi_send_bytes(const uint8_t *buf, uint8_t len) {
- if (len == 0) return;
- const uint8_t *end = buf + len;
- while (buf < end) {
- SPDR = *buf;
- while (!(SPSR & _BV(SPIF))) {
- ; // wait
- }
- ++buf;
- }
-}
-
-static inline uint16_t spi_read_byte(void) { return SPI_TransferByte(0x00 /* dummy */); }
-
-static inline void spi_recv_bytes(uint8_t *buf, uint8_t len) {
- const uint8_t *end = buf + len;
- if (len == 0) return;
- while (buf < end) {
- SPDR = 0; // write a dummy to initiate read
- while (!(SPSR & _BV(SPIF))) {
- ; // wait
- }
- *buf = SPDR;
- ++buf;
- }
-}
-
-#if 0
-static void dump_pkt(const struct sdep_msg *msg) {
- print("pkt: type=");
- print_hex8(msg->type);
- print(" cmd=");
- print_hex8(msg->cmd_high);
- print_hex8(msg->cmd_low);
- print(" len=");
- print_hex8(msg->len);
- print(" more=");
- print_hex8(msg->more);
- print("\n");
-}
-#endif
-
// Send a single SDEP packet
static bool sdep_send_pkt(const struct sdep_msg *msg, uint16_t timeout) {
- SPI_begin(&spi);
-
- digitalWrite(AdafruitBleCSPin, PinLevelLow);
+ spi_start(AdafruitBleCSPin, false, 0, SCK_DIVISOR);
uint16_t timerStart = timer_read();
bool success = false;
bool ready = false;
do {
- ready = SPI_TransferByte(msg->type) != SdepSlaveNotReady;
+ ready = spi_write(msg->type) != SdepSlaveNotReady;
if (ready) {
break;
}
// Release it and let it initialize
- digitalWrite(AdafruitBleCSPin, PinLevelHigh);
- _delay_us(SdepBackOff);
- digitalWrite(AdafruitBleCSPin, PinLevelLow);
+ spi_stop();
+ wait_us(SdepBackOff);
+ spi_start(AdafruitBleCSPin, false, 0, SCK_DIVISOR);
} while (timer_elapsed(timerStart) < timeout);
if (ready) {
// Slave is ready; send the rest of the packet
- spi_send_bytes(&msg->cmd_low, sizeof(*msg) - (1 + sizeof(msg->payload)) + msg->len);
+ spi_transmit(&msg->cmd_low, sizeof(*msg) - (1 + sizeof(msg->payload)) + msg->len);
success = true;
}
- digitalWrite(AdafruitBleCSPin, PinLevelHigh);
+ spi_stop();
return success;
}
@@ -275,41 +193,39 @@ static bool sdep_recv_pkt(struct sdep_msg *msg, uint16_t timeout) {
bool ready = false;
do {
- ready = digitalRead(AdafruitBleIRQPin);
+ ready = readPin(AdafruitBleIRQPin);
if (ready) {
break;
}
- _delay_us(1);
+ wait_us(1);
} while (timer_elapsed(timerStart) < timeout);
if (ready) {
- SPI_begin(&spi);
-
- digitalWrite(AdafruitBleCSPin, PinLevelLow);
+ spi_start(AdafruitBleCSPin, false, 0, SCK_DIVISOR);
do {
// Read the command type, waiting for the data to be ready
- msg->type = spi_read_byte();
+ msg->type = spi_read();
if (msg->type == SdepSlaveNotReady || msg->type == SdepSlaveOverflow) {
// Release it and let it initialize
- digitalWrite(AdafruitBleCSPin, PinLevelHigh);
- _delay_us(SdepBackOff);
- digitalWrite(AdafruitBleCSPin, PinLevelLow);
+ spi_stop();
+ wait_us(SdepBackOff);
+ spi_start(AdafruitBleCSPin, false, 0, SCK_DIVISOR);
continue;
}
// Read the rest of the header
- spi_recv_bytes(&msg->cmd_low, sizeof(*msg) - (1 + sizeof(msg->payload)));
+ spi_receive(&msg->cmd_low, sizeof(*msg) - (1 + sizeof(msg->payload)));
// and get the payload if there is any
if (msg->len <= SdepMaxPayload) {
- spi_recv_bytes(msg->payload, msg->len);
+ spi_receive(msg->payload, msg->len);
}
success = true;
break;
} while (timer_elapsed(timerStart) < timeout);
- digitalWrite(AdafruitBleCSPin, PinLevelHigh);
+ spi_stop();
}
return success;
}
@@ -320,7 +236,7 @@ static void resp_buf_read_one(bool greedy) {
return;
}
- if (digitalRead(AdafruitBleIRQPin)) {
+ if (readPin(AdafruitBleIRQPin)) {
struct sdep_msg msg;
again:
@@ -331,7 +247,7 @@ static void resp_buf_read_one(bool greedy) {
dprintf("recv latency %dms\n", TIMER_DIFF_16(timer_read(), last_send));
}
- if (greedy && resp_buf.peek(last_send) && digitalRead(AdafruitBleIRQPin)) {
+ if (greedy && resp_buf.peek(last_send) && readPin(AdafruitBleIRQPin)) {
goto again;
}
}
@@ -361,7 +277,7 @@ static void send_buf_send_one(uint16_t timeout = SdepTimeout) {
dprintf("send_buf_send_one: have %d remaining\n", (int)send_buf.size());
} else {
dprint("failed to send, will retry\n");
- _delay_ms(SdepTimeout);
+ wait_ms(SdepTimeout);
resp_buf_read_one(true);
}
}
@@ -382,20 +298,18 @@ static bool ble_init(void) {
state.configured = false;
state.is_connected = false;
- pinMode(AdafruitBleIRQPin, PinDirectionInput);
- pinMode(AdafruitBleCSPin, PinDirectionOutput);
- digitalWrite(AdafruitBleCSPin, PinLevelHigh);
+ setPinInput(AdafruitBleIRQPin);
- SPI_init(&spi);
+ spi_init();
// Perform a hardware reset
- pinMode(AdafruitBleResetPin, PinDirectionOutput);
- digitalWrite(AdafruitBleResetPin, PinLevelHigh);
- digitalWrite(AdafruitBleResetPin, PinLevelLow);
- _delay_ms(10);
- digitalWrite(AdafruitBleResetPin, PinLevelHigh);
+ setPinOutput(AdafruitBleResetPin);
+ writePinHigh(AdafruitBleResetPin);
+ writePinLow(AdafruitBleResetPin);
+ wait_ms(10);
+ writePinHigh(AdafruitBleResetPin);
- _delay_ms(1000); // Give it a second to initialize
+ wait_ms(1000); // Give it a second to initialize
state.initialized = true;
return state.initialized;
@@ -596,7 +510,7 @@ void adafruit_ble_task(void) {
resp_buf_read_one(true);
send_buf_send_one(SdepShortTimeout);
- if (resp_buf.empty() && (state.event_flags & UsingEvents) && digitalRead(AdafruitBleIRQPin)) {
+ if (resp_buf.empty() && (state.event_flags & UsingEvents) && readPin(AdafruitBleIRQPin)) {
// Must be an event update
if (at_command_P(PSTR("AT+EVENTSTATUS"), resbuf, sizeof(resbuf))) {
uint32_t mask = strtoul(resbuf, NULL, 16);
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index d673841fd55..374add20f97 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -801,8 +801,6 @@ ERROR_EXIT:
Endpoint_SelectEndpoint(ep);
return -1;
}
-#else
-int8_t sendchar(uint8_t c) { return 0; }
#endif
/*******************************************************************************
diff --git a/tmk_core/protocol/lufa/lufa.h b/tmk_core/protocol/lufa/lufa.h
index 1b88060f14b..82a5f8e05fc 100644
--- a/tmk_core/protocol/lufa/lufa.h
+++ b/tmk_core/protocol/lufa/lufa.h
@@ -69,14 +69,8 @@ extern host_driver_t lufa_driver;
# define MIDI_SYSEX_BUFFER (API_SYSEX_MAX_SIZE + API_SYSEX_MAX_SIZE / 7 + (API_SYSEX_MAX_SIZE % 7 ? 1 : 0))
#endif
-// #if LUFA_VERSION_INTEGER < 0x120730
-// /* old API 120219 */
-// #define ENDPOINT_CONFIG(epnum, eptype, epdir, epsize, epbank) Endpoint_ConfigureEndpoint(epnum, eptype, epdir, epsize, epbank)
-// #else
-/* new API >= 120730 */
#define ENDPOINT_BANK_SINGLE 1
#define ENDPOINT_BANK_DOUBLE 2
#define ENDPOINT_CONFIG(epnum, eptype, epdir, epsize, epbank) Endpoint_ConfigureEndpoint((epdir) | (epnum), eptype, epsize, epbank)
-// #endif
#endif
diff --git a/tmk_core/protocol/ps2_mouse.c b/tmk_core/protocol/ps2_mouse.c
index aa3a307ebfa..a0e52bc7c3a 100644
--- a/tmk_core/protocol/ps2_mouse.c
+++ b/tmk_core/protocol/ps2_mouse.c
@@ -157,6 +157,21 @@ static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse_report)
// invert coordinate of y to conform to USB HID mouse
mouse_report->y = -mouse_report->y;
#endif
+
+#ifdef PS2_MOUSE_ROTATE
+ int8_t x = mouse_report->x;
+ int8_t y = mouse_report->y;
+# if PS2_MOUSE_ROTATE == 90
+ mouse_report->x = y;
+ mouse_report->y = -x;
+# elif PS2_MOUSE_ROTATE == 180
+ mouse_report->x = -x;
+ mouse_report->y = -y;
+# elif PS2_MOUSE_ROTATE == 270
+ mouse_report->x = -y;
+ mouse_report->y = x;
+# endif
+#endif
}
static inline void ps2_mouse_clear_report(report_mouse_t *mouse_report) {
diff --git a/tmk_core/protocol/vusb.mk b/tmk_core/protocol/vusb.mk
index 897b833e1a7..6df0d0d339d 100644
--- a/tmk_core/protocol/vusb.mk
+++ b/tmk_core/protocol/vusb.mk
@@ -9,13 +9,12 @@ SRC += $(VUSB_DIR)/main.c \
$(VUSB_DIR)/usbdrv/oddebug.c
-ifdef NO_UART
-SRC += $(COMMON_DIR)/sendchar_null.c
-else
+ifneq ($(strip $(CONSOLE_ENABLE)), yes)
+ifndef NO_UART
SRC += $(COMMON_DIR)/sendchar_uart.c \
$(COMMON_DIR)/uart.c
endif
-
+endif
# Search Path
VPATH += $(TMK_PATH)/$(VUSB_DIR)
diff --git a/tmk_core/protocol/vusb/main.c b/tmk_core/protocol/vusb/main.c
index 068c4d8f3d6..7dc16926d2b 100644
--- a/tmk_core/protocol/vusb/main.c
+++ b/tmk_core/protocol/vusb/main.c
@@ -20,9 +20,24 @@
#include "timer.h"
#include "uart.h"
#include "debug.h"
+#include "suspend.h"
+#include "wait.h"
+#include "sendchar.h"
+
+#ifdef SLEEP_LED_ENABLE
+# include "sleep_led.h"
+#endif
#define UART_BAUD_RATE 115200
+#ifdef CONSOLE_ENABLE
+void console_task(void);
+#endif
+
+#ifdef RAW_ENABLE
+void raw_hid_task(void);
+#endif
+
/* This is from main.c of USBaspLoader */
static void initForUsbConnectivity(void) {
uint8_t i = 0;
@@ -35,9 +50,42 @@ static void initForUsbConnectivity(void) {
_delay_ms(1);
}
usbDeviceConnect();
+}
+
+static void usb_remote_wakeup(void) {
+ cli();
+
+ int8_t ddr_orig = USBDDR;
+ USBOUT |= (1 << USBMINUS);
+ USBDDR = ddr_orig | USBMASK;
+ USBOUT ^= USBMASK;
+
+ _delay_ms(25);
+
+ USBOUT ^= USBMASK;
+ USBDDR = ddr_orig;
+ USBOUT &= ~(1 << USBMINUS);
+
sei();
}
+/** \brief Setup USB
+ *
+ * FIXME: Needs doc
+ */
+static void setup_usb(void) {
+ // debug("initForUsbConnectivity()\n");
+ initForUsbConnectivity();
+
+ // for Console_Task
+ print_set_sendchar(sendchar);
+}
+
+/** \brief Main
+ *
+ * FIXME: Needs doc
+ */
+int main(void) __attribute__((weak));
int main(void) {
bool suspended = false;
#if USB_COUNT_SOF
@@ -55,10 +103,15 @@ int main(void) {
keyboard_setup();
host_set_driver(vusb_driver());
- debug("initForUsbConnectivity()\n");
- initForUsbConnectivity();
+ setup_usb();
+ sei();
+
+ wait_ms(50);
keyboard_init();
+#ifdef SLEEP_LED_ENABLE
+ sleep_led_init();
+#endif
debug("main loop\n");
while (1) {
@@ -67,10 +120,16 @@ int main(void) {
suspended = false;
usbSofCount = 0;
last_timer = timer_read();
+# ifdef SLEEP_LED_ENABLE
+ sleep_led_disable();
+# endif
} else {
// Suspend when no SOF in 3ms-10ms(7.1.7.4 Suspending of USB1.1)
if (timer_elapsed(last_timer) > 5) {
suspended = true;
+# ifdef SLEEP_LED_ENABLE
+ sleep_led_enable();
+# endif
/*
uart_putchar('S');
_delay_ms(1);
@@ -90,12 +149,29 @@ int main(void) {
if (!suspended) {
usbPoll();
- // TODO: configuration process is incosistent. it sometime fails.
+ // TODO: configuration process is inconsistent. it sometime fails.
// To prevent failing to configure NOT scan keyboard during configuration
if (usbConfiguration && usbInterruptIsReady()) {
keyboard_task();
}
vusb_transfer_keyboard();
+
+#ifdef RAW_ENABLE
+ usbPoll();
+
+ if (usbConfiguration && usbInterruptIsReady3()) {
+ raw_hid_task();
+ }
+#endif
+#ifdef CONSOLE_ENABLE
+ usbPoll();
+
+ if (usbConfiguration && usbInterruptIsReady3()) {
+ console_task();
+ }
+#endif
+ } else if (suspend_wakeup_condition()) {
+ usb_remote_wakeup();
}
}
}
diff --git a/tmk_core/protocol/vusb/usbconfig.h b/tmk_core/protocol/vusb/usbconfig.h
new file mode 100644
index 00000000000..dcef7584c4e
--- /dev/null
+++ b/tmk_core/protocol/vusb/usbconfig.h
@@ -0,0 +1,346 @@
+/* Name: usbconfig.h
+ * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
+ * Author: Christian Starkjohann
+ * Creation Date: 2005-04-01
+ * Tabsize: 4
+ * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
+ * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
+ * This Revision: $Id: usbconfig-prototype.h 785 2010-05-30 17:57:07Z cs $
+ */
+
+#pragma once
+
+// clang-format off
+
+/*
+General Description:
+This file is an example configuration (with inline documentation) for the USB
+driver. It configures V-USB for USB D+ connected to Port D bit 2 (which is
+also hardware interrupt 0 on many devices) and USB D- to Port D bit 4. You may
+wire the lines to any other port, as long as D+ is also wired to INT0 (or any
+other hardware interrupt, as long as it is the highest level interrupt, see
+section at the end of this file).
+*/
+
+/* ---------------------------- Hardware Config ---------------------------- */
+
+#ifndef USB_CFG_IOPORTNAME
+#define USB_CFG_IOPORTNAME D
+#endif
+/* This is the port where the USB bus is connected. When you configure it to
+ * "B", the registers PORTB, PINB and DDRB will be used.
+ */
+#ifndef USB_CFG_DMINUS_BIT
+#define USB_CFG_DMINUS_BIT 3
+#endif
+/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
+ * This may be any bit in the port.
+ */
+#ifndef USB_CFG_DPLUS_BIT
+#define USB_CFG_DPLUS_BIT 2
+#endif
+/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
+ * This may be any bit in the port. Please note that D+ must also be connected
+ * to interrupt pin INT0! [You can also use other interrupts, see section
+ * "Optional MCU Description" below, or you can connect D- to the interrupt, as
+ * it is required if you use the USB_COUNT_SOF feature. If you use D- for the
+ * interrupt, the USB interrupt will also be triggered at Start-Of-Frame
+ * markers every millisecond.]
+ */
+#define USB_CFG_CHECK_CRC 0
+/* Define this to 1 if you want that the driver checks integrity of incoming
+ * data packets (CRC checks). CRC checks cost quite a bit of code size and are
+ * currently only available for 18 MHz crystal clock. You must choose
+ * USB_CFG_CLOCK_KHZ = 18000 if you enable this option.
+ */
+
+/* ----------------------- Optional Hardware Config ------------------------ */
+
+/* #define USB_CFG_PULLUP_IOPORTNAME D */
+/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
+ * V+, you can connect and disconnect the device from firmware by calling
+ * the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
+ * This constant defines the port on which the pullup resistor is connected.
+ */
+/* #define USB_CFG_PULLUP_BIT 4 */
+/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
+ * above) where the 1.5k pullup resistor is connected. See description
+ * above for details.
+ */
+
+/* --------------------------- Functional Range ---------------------------- */
+
+#define USB_CFG_HAVE_INTRIN_ENDPOINT 1
+/* Define this to 1 if you want to compile a version with two endpoints: The
+ * default control endpoint 0 and an interrupt-in endpoint (any other endpoint
+ * number).
+ */
+#define USB_CFG_HAVE_INTRIN_ENDPOINT3 1
+/* Define this to 1 if you want to compile a version with three endpoints: The
+ * default control endpoint 0, an interrupt-in endpoint 3 (or the number
+ * configured below) and a catch-all default interrupt-in endpoint as above.
+ * You must also define USB_CFG_HAVE_INTRIN_ENDPOINT to 1 for this feature.
+ */
+#define USB_CFG_EP3_NUMBER 3
+/* If the so-called endpoint 3 is used, it can now be configured to any other
+ * endpoint number (except 0) with this macro. Default if undefined is 3.
+ */
+/* #define USB_INITIAL_DATATOKEN USBPID_DATA1 */
+/* The above macro defines the startup condition for data toggling on the
+ * interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA1.
+ * Since the token is toggled BEFORE sending any data, the first packet is
+ * sent with the oposite value of this configuration!
+ */
+#define USB_CFG_IMPLEMENT_HALT 0
+/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
+ * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
+ * it is required by the standard. We have made it a config option because it
+ * bloats the code considerably.
+ */
+#define USB_CFG_SUPPRESS_INTR_CODE 0
+/* Define this to 1 if you want to declare interrupt-in endpoints, but don't
+ * want to send any data over them. If this macro is defined to 1, functions
+ * usbSetInterrupt() and usbSetInterrupt3() are omitted. This is useful if
+ * you need the interrupt-in endpoints in order to comply to an interface
+ * (e.g. HID), but never want to send any data. This option saves a couple
+ * of bytes in flash memory and the transmit buffers in RAM.
+ */
+#define USB_CFG_IS_SELF_POWERED 0
+/* Define this to 1 if the device has its own power supply. Set it to 0 if the
+ * device is powered from the USB bus.
+ */
+#define USB_CFG_IMPLEMENT_FN_WRITE 1
+/* Set this to 1 if you want usbFunctionWrite() to be called for control-out
+ * transfers. Set it to 0 if you don't need it and want to save a couple of
+ * bytes.
+ */
+#define USB_CFG_IMPLEMENT_FN_READ 0
+/* Set this to 1 if you need to send control replies which are generated
+ * "on the fly" when usbFunctionRead() is called. If you only want to send
+ * data from a static buffer, set it to 0 and return the data from
+ * usbFunctionSetup(). This saves a couple of bytes.
+ */
+#define USB_CFG_IMPLEMENT_FN_WRITEOUT 1
+/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoints.
+ * You must implement the function usbFunctionWriteOut() which receives all
+ * interrupt/bulk data sent to any endpoint other than 0. The endpoint number
+ * can be found in 'usbRxToken'.
+ */
+#define USB_CFG_HAVE_FLOWCONTROL 0
+/* Define this to 1 if you want flowcontrol over USB data. See the definition
+ * of the macros usbDisableAllRequests() and usbEnableAllRequests() in
+ * usbdrv.h.
+ */
+#define USB_CFG_DRIVER_FLASH_PAGE 0
+/* If the device has more than 64 kBytes of flash, define this to the 64 k page
+ * where the driver's constants (descriptors) are located. Or in other words:
+ * Define this to 1 for boot loaders on the ATMega128.
+ */
+#define USB_CFG_LONG_TRANSFERS 0
+/* Define this to 1 if you want to send/receive blocks of more than 254 bytes
+ * in a single control-in or control-out transfer. Note that the capability
+ * for long transfers increases the driver size.
+ */
+/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
+/* This macro is a hook if you want to do unconventional things. If it is
+ * defined, it's inserted at the beginning of received message processing.
+ * If you eat the received message and don't want default processing to
+ * proceed, do a return after doing your things. One possible application
+ * (besides debugging) is to flash a status LED on each packet.
+ */
+/* #define USB_RESET_HOOK(resetStarts) if(!resetStarts){hadUsbReset();} */
+/* This macro is a hook if you need to know when an USB RESET occurs. It has
+ * one parameter which distinguishes between the start of RESET state and its
+ * end.
+ */
+/* #define USB_SET_ADDRESS_HOOK() hadAddressAssigned(); */
+/* This macro (if defined) is executed when a USB SET_ADDRESS request was
+ * received.
+ */
+#ifndef USB_COUNT_SOF
+#define USB_COUNT_SOF 1
+#endif
+/* define this macro to 1 if you need the global variable "usbSofCount" which
+ * counts SOF packets. This feature requires that the hardware interrupt is
+ * connected to D- instead of D+.
+ */
+/* #ifdef __ASSEMBLER__
+ * macro myAssemblerMacro
+ * in YL, TCNT0
+ * sts timer0Snapshot, YL
+ * endm
+ * #endif
+ * #define USB_SOF_HOOK myAssemblerMacro
+ * This macro (if defined) is executed in the assembler module when a
+ * Start Of Frame condition is detected. It is recommended to define it to
+ * the name of an assembler macro which is defined here as well so that more
+ * than one assembler instruction can be used. The macro may use the register
+ * YL and modify SREG. If it lasts longer than a couple of cycles, USB messages
+ * immediately after an SOF pulse may be lost and must be retried by the host.
+ * What can you do with this hook? Since the SOF signal occurs exactly every
+ * 1 ms (unless the host is in sleep mode), you can use it to tune OSCCAL in
+ * designs running on the internal RC oscillator.
+ * Please note that Start Of Frame detection works only if D- is wired to the
+ * interrupt, not D+. THIS IS DIFFERENT THAN MOST EXAMPLES!
+ */
+#define USB_CFG_CHECK_DATA_TOGGLING 0
+/* define this macro to 1 if you want to filter out duplicate data packets
+ * sent by the host. Duplicates occur only as a consequence of communication
+ * errors, when the host does not receive an ACK. Please note that you need to
+ * implement the filtering yourself in usbFunctionWriteOut() and
+ * usbFunctionWrite(). Use the global usbCurrentDataToken and a static variable
+ * for each control- and out-endpoint to check for duplicate packets.
+ */
+#define USB_CFG_HAVE_MEASURE_FRAME_LENGTH 0
+/* define this macro to 1 if you want the function usbMeasureFrameLength()
+ * compiled in. This function can be used to calibrate the AVR's RC oscillator.
+ */
+#define USB_USE_FAST_CRC 0
+/* The assembler module has two implementations for the CRC algorithm. One is
+ * faster, the other is smaller. This CRC routine is only used for transmitted
+ * messages where timing is not critical. The faster routine needs 31 cycles
+ * per byte while the smaller one needs 61 to 69 cycles. The faster routine
+ * may be worth the 32 bytes bigger code size if you transmit lots of data and
+ * run the AVR close to its limit.
+ */
+
+/* -------------------------- Device Description --------------------------- */
+
+#define USB_CFG_VENDOR_ID
+/* USB vendor ID for the device, low byte first. If you have registered your
+ * own Vendor ID, define it here. Otherwise you may use one of obdev's free
+ * shared VID/PID pairs. Be sure to read USB-IDs-for-free.txt for rules!
+ * *** IMPORTANT NOTE ***
+ * This template uses obdev's shared VID/PID pair for Vendor Class devices
+ * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
+ * the implications!
+ */
+#define USB_CFG_DEVICE_ID
+/* This is the ID of the product, low byte first. It is interpreted in the
+ * scope of the vendor ID. If you have registered your own VID with usb.org
+ * or if you have licensed a PID from somebody else, define it here. Otherwise
+ * you may use one of obdev's free shared VID/PID pairs. See the file
+ * USB-IDs-for-free.txt for details!
+ * *** IMPORTANT NOTE ***
+ * This template uses obdev's shared VID/PID pair for Vendor Class devices
+ * with libusb: 0x16c0/0x5dc. Use this VID/PID pair ONLY if you understand
+ * the implications!
+ */
+#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0
+/* Define this to the length of the HID report descriptor, if you implement
+ * an HID device. Otherwise don't define it or define it to 0.
+ * If you use this define, you must add a PROGMEM character array named
+ * "usbHidReportDescriptor" to your code which contains the report descriptor.
+ * Don't forget to keep the array and this define in sync!
+ */
+
+/* #define USB_PUBLIC static */
+/* Use the define above if you #include usbdrv.c instead of linking against it.
+ * This technique saves a couple of bytes in flash memory.
+ */
+
+/* ------------------- Fine Control over USB Descriptors ------------------- */
+/* If you don't want to use the driver's default USB descriptors, you can
+ * provide our own. These can be provided as (1) fixed length static data in
+ * flash memory, (2) fixed length static data in RAM or (3) dynamically at
+ * runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
+ * information about this function.
+ * Descriptor handling is configured through the descriptor's properties. If
+ * no properties are defined or if they are 0, the default descriptor is used.
+ * Possible properties are:
+ * + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
+ * at runtime via usbFunctionDescriptor(). If the usbMsgPtr mechanism is
+ * used, the data is in FLASH by default. Add property USB_PROP_IS_RAM if
+ * you want RAM pointers.
+ * + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
+ * in static memory is in RAM, not in flash memory.
+ * + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
+ * the driver must know the descriptor's length. The descriptor itself is
+ * found at the address of a well known identifier (see below).
+ * List of static descriptor names (must be declared PROGMEM if in flash):
+ * char usbDescriptorDevice[];
+ * char usbDescriptorConfiguration[];
+ * char usbDescriptorHidReport[];
+ * char usbDescriptorString0[];
+ * int usbDescriptorStringVendor[];
+ * int usbDescriptorStringDevice[];
+ * int usbDescriptorStringSerialNumber[];
+ * Other descriptors can't be provided statically, they must be provided
+ * dynamically at runtime.
+ *
+ * Descriptor properties are or-ed or added together, e.g.:
+ * #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
+ *
+ * The following descriptors are defined:
+ * USB_CFG_DESCR_PROPS_DEVICE
+ * USB_CFG_DESCR_PROPS_CONFIGURATION
+ * USB_CFG_DESCR_PROPS_STRINGS
+ * USB_CFG_DESCR_PROPS_STRING_0
+ * USB_CFG_DESCR_PROPS_STRING_VENDOR
+ * USB_CFG_DESCR_PROPS_STRING_PRODUCT
+ * USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
+ * USB_CFG_DESCR_PROPS_HID
+ * USB_CFG_DESCR_PROPS_HID_REPORT
+ * USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
+ *
+ * Note about string descriptors: String descriptors are not just strings, they
+ * are Unicode strings prefixed with a 2 byte header. Example:
+ * int serialNumberDescriptor[] = {
+ * USB_STRING_DESCRIPTOR_HEADER(6),
+ * 'S', 'e', 'r', 'i', 'a', 'l'
+ * };
+ */
+
+#define USB_CFG_DESCR_PROPS_DEVICE USB_PROP_IS_DYNAMIC
+#define USB_CFG_DESCR_PROPS_CONFIGURATION USB_PROP_IS_DYNAMIC
+#define USB_CFG_DESCR_PROPS_STRINGS USB_PROP_IS_DYNAMIC
+#define USB_CFG_DESCR_PROPS_STRING_0 USB_PROP_IS_DYNAMIC
+#define USB_CFG_DESCR_PROPS_STRING_VENDOR USB_PROP_IS_DYNAMIC
+#define USB_CFG_DESCR_PROPS_STRING_PRODUCT USB_PROP_IS_DYNAMIC
+#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER USB_PROP_IS_DYNAMIC
+#define USB_CFG_DESCR_PROPS_HID USB_PROP_IS_DYNAMIC
+#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
+#define USB_CFG_DESCR_PROPS_UNKNOWN 0
+
+#define usbMsgPtr_t unsigned short
+/* If usbMsgPtr_t is not defined, it defaults to 'uchar *'. We define it to
+ * a scalar type here because gcc generates slightly shorter code for scalar
+ * arithmetics than for pointer arithmetics. Remove this define for backward
+ * type compatibility or define it to an 8 bit type if you use data in RAM only
+ * and all RAM is below 256 bytes (tiny memory model in IAR CC).
+ */
+
+/* ----------------------- Optional MCU Description ------------------------ */
+
+/* The following configurations have working defaults in usbdrv.h. You
+ * usually don't need to set them explicitly. Only if you want to run
+ * the driver on a device which is not yet supported or with a compiler
+ * which is not fully supported (such as IAR C) or if you use a differnt
+ * interrupt than INT0, you may have to define some of these.
+ */
+/* #define USB_INTR_CFG MCUCR */
+/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
+/* #define USB_INTR_CFG_CLR 0 */
+/* #define USB_INTR_ENABLE GIMSK */
+/* #define USB_INTR_ENABLE_BIT INT0 */
+/* #define USB_INTR_PENDING GIFR */
+/* #define USB_INTR_PENDING_BIT INTF0 */
+/* #define USB_INTR_VECTOR INT0_vect */
+
+/* Set INT1 for D- falling edge to count SOF */
+/* #define USB_INTR_CFG EICRA */
+#ifndef USB_INTR_CFG_SET
+#define USB_INTR_CFG_SET ((1 << ISC11) | (0 << ISC10))
+#endif
+/* #define USB_INTR_CFG_CLR 0 */
+/* #define USB_INTR_ENABLE EIMSK */
+#ifndef USB_INTR_ENABLE_BIT
+#define USB_INTR_ENABLE_BIT INT1
+#endif
+/* #define USB_INTR_PENDING EIFR */
+#ifndef USB_INTR_PENDING_BIT
+#define USB_INTR_PENDING_BIT INTF1
+#endif
+#ifndef USB_INTR_VECTOR
+#define USB_INTR_VECTOR INT1_vect
+#endif
diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c
index abf723952e4..a9f37c61b0e 100644
--- a/tmk_core/protocol/vusb/vusb.c
+++ b/tmk_core/protocol/vusb/vusb.c
@@ -15,18 +15,54 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
-#include
#include
+#include
#include
#include "usbdrv.h"
#include "usbconfig.h"
#include "host.h"
#include "report.h"
-#include "print.h"
-#include "debug.h"
#include "host_driver.h"
#include "vusb.h"
-#include
+#include "print.h"
+#include "debug.h"
+
+#ifdef RAW_ENABLE
+# include "raw_hid.h"
+#endif
+
+#if defined(CONSOLE_ENABLE)
+# define RBUF_SIZE 128
+# include "ring_buffer.h"
+#endif
+
+#define NEXT_INTERFACE __COUNTER__
+
+/*
+ * Interface indexes
+ */
+enum usb_interfaces {
+ KEYBOARD_INTERFACE = NEXT_INTERFACE,
+// It is important that the Raw HID interface is at a constant
+// interface number, to support Linux/OSX platforms and chrome.hid
+// If Raw HID is enabled, let it be always 1.
+#ifdef RAW_ENABLE
+ RAW_INTERFACE = NEXT_INTERFACE,
+#endif
+#if (defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE))
+ MOUSE_EXTRA_INTERFACE = NEXT_INTERFACE,
+#endif
+#ifdef CONSOLE_ENABLE
+ CONSOLE_INTERFACE = NEXT_INTERFACE,
+#endif
+ TOTAL_INTERFACES = NEXT_INTERFACE,
+};
+
+#define MAX_INTERFACES 2
+
+#if (NEXT_INTERFACE - 1) > MAX_INTERFACES
+# error There are not enough available interfaces to support all functions. Please disable one or more of the following: Mouse Keys, Extra Keys, Raw HID, Console
+#endif
static uint8_t vusb_keyboard_leds = 0;
static uint8_t vusb_idle_rate = 0;
@@ -71,6 +107,103 @@ void vusb_transfer_keyboard(void) {
}
}
+/*------------------------------------------------------------------*
+ * RAW HID
+ *------------------------------------------------------------------*/
+#ifdef RAW_ENABLE
+# define RAW_BUFFER_SIZE 32
+# define RAW_EPSIZE 8
+
+static uint8_t raw_output_buffer[RAW_BUFFER_SIZE];
+static uint8_t raw_output_received_bytes = 0;
+
+void raw_hid_send(uint8_t *data, uint8_t length) {
+ if (length != RAW_BUFFER_SIZE) {
+ return;
+ }
+
+ uint8_t *temp = data;
+ for (uint8_t i = 0; i < 4; i++) {
+ while (!usbInterruptIsReady3()) {
+ usbPoll();
+ }
+ usbSetInterrupt3(temp, 8);
+ temp += 8;
+ }
+ while (!usbInterruptIsReady3()) {
+ usbPoll();
+ }
+ usbSetInterrupt3(0, 0);
+}
+
+__attribute__((weak)) void raw_hid_receive(uint8_t *data, uint8_t length) {
+ // Users should #include "raw_hid.h" in their own code
+ // and implement this function there. Leave this as weak linkage
+ // so users can opt to not handle data coming in.
+}
+
+void raw_hid_task(void) {
+ if (raw_output_received_bytes == RAW_BUFFER_SIZE) {
+ raw_hid_receive(raw_output_buffer, RAW_BUFFER_SIZE);
+ raw_output_received_bytes = 0;
+ }
+}
+#endif
+
+/*------------------------------------------------------------------*
+ * Console
+ *------------------------------------------------------------------*/
+#ifdef CONSOLE_ENABLE
+# define CONSOLE_BUFFER_SIZE 32
+# define CONSOLE_EPSIZE 8
+
+int8_t sendchar(uint8_t c) {
+ rbuf_enqueue(c);
+ return 0;
+}
+
+static inline bool usbSendData3(char *data, uint8_t len) {
+ uint8_t retries = 5;
+ while (!usbInterruptIsReady3()) {
+ if (!(retries--)) {
+ return false;
+ }
+ usbPoll();
+ }
+
+ usbSetInterrupt3((unsigned char *)data, len);
+ return true;
+}
+
+void console_task(void) {
+ if (!usbConfiguration) {
+ return;
+ }
+
+ if (!rbuf_has_data()) {
+ return;
+ }
+
+ // Send in chunks of 8 padded to 32
+ char send_buf[CONSOLE_BUFFER_SIZE] = {0};
+ uint8_t send_buf_count = 0;
+ while (rbuf_has_data() && send_buf_count < CONSOLE_EPSIZE) {
+ send_buf[send_buf_count++] = rbuf_dequeue();
+ }
+
+ char *temp = send_buf;
+ for (uint8_t i = 0; i < 4; i++) {
+ if (!usbSendData3(temp, 8)) {
+ break;
+ }
+ temp += 8;
+ }
+
+ usbSendData3(0, 0);
+ usbPoll();
+}
+#endif
+
/*------------------------------------------------------------------*
* Host driver
*------------------------------------------------------------------*/
@@ -106,10 +239,12 @@ typedef struct {
} __attribute__((packed)) vusb_mouse_report_t;
static void send_mouse(report_mouse_t *report) {
+#ifdef MOUSE_ENABLE
vusb_mouse_report_t r = {.report_id = REPORT_ID_MOUSE, .report = *report};
if (usbInterruptIsReady3()) {
usbSetInterrupt3((void *)&r, sizeof(vusb_mouse_report_t));
}
+#endif
}
#ifdef EXTRAKEY_ENABLE
@@ -206,6 +341,27 @@ uchar usbFunctionWrite(uchar *data, uchar len) {
return 1;
}
+void usbFunctionWriteOut(uchar *data, uchar len) {
+#ifdef RAW_ENABLE
+ // Data from host must be divided every 8bytes
+ if (len != 8) {
+ debug("RAW: invalid length");
+ raw_output_received_bytes = 0;
+ return;
+ }
+
+ if (raw_output_received_bytes + len > RAW_BUFFER_SIZE) {
+ debug("RAW: buffer full");
+ raw_output_received_bytes = 0;
+ } else {
+ for (uint8_t i = 0; i < 8; i++) {
+ raw_output_buffer[raw_output_received_bytes + i] = data[i];
+ }
+ raw_output_received_bytes += len;
+ }
+#endif
+}
+
/*------------------------------------------------------------------*
* Descriptors *
*------------------------------------------------------------------*/
@@ -251,6 +407,29 @@ const PROGMEM uchar keyboard_hid_report[] = {
0xC0 // End Collection
};
+#ifdef RAW_ENABLE
+const PROGMEM uchar raw_hid_report[] = {
+ 0x06, 0x60, 0xFF, // Usage Page (Vendor Defined)
+ 0x09, 0x61, // Usage (Vendor Defined)
+ 0xA1, 0x01, // Collection (Application)
+ // Data to host
+ 0x09, 0x62, // Usage (Vendor Defined)
+ 0x15, 0x00, // Logical Minimum (0)
+ 0x26, 0xFF, 0x00, // Logical Maximum (255)
+ 0x95, RAW_BUFFER_SIZE, // Report Count
+ 0x75, 0x08, // Report Size (8)
+ 0x81, 0x02, // Input (Data, Variable, Absolute)
+ // Data from host
+ 0x09, 0x63, // Usage (Vendor Defined)
+ 0x15, 0x00, // Logical Minimum (0)
+ 0x26, 0xFF, 0x00, // Logical Maximum (255)
+ 0x95, RAW_BUFFER_SIZE, // Report Count
+ 0x75, 0x08, // Report Size (8)
+ 0x91, 0x02, // Output (Data, Variable, Absolute)
+ 0xC0 // End Collection
+};
+#endif
+
#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
const PROGMEM uchar mouse_extra_hid_report[] = {
# ifdef MOUSE_ENABLE
@@ -335,6 +514,33 @@ const PROGMEM uchar mouse_extra_hid_report[] = {
};
#endif
+#if defined(CONSOLE_ENABLE)
+const PROGMEM uchar console_hid_report[] = {
+ 0x06, 0x31, 0xFF, // Usage Page (Vendor Defined - PJRC Teensy compatible)
+ 0x09, 0x74, // Usage (Vendor Defined - PJRC Teensy compatible)
+ 0xA1, 0x01, // Collection (Application)
+ // Data to host
+ 0x09, 0x75, // Usage (Vendor Defined)
+ 0x15, 0x00, // Logical Minimum (0x00)
+ 0x26, 0xFF, 0x00, // Logical Maximum (0x00FF)
+ 0x95, CONSOLE_BUFFER_SIZE, // Report Count
+ 0x75, 0x08, // Report Size (8)
+ 0x81, 0x02, // Input (Data, Variable, Absolute)
+ // Data from host
+ 0x09, 0x76, // Usage (Vendor Defined)
+ 0x15, 0x00, // Logical Minimum (0x00)
+ 0x26, 0xFF, 0x00, // Logical Maximum (0x00FF)
+ 0x95, CONSOLE_BUFFER_SIZE, // Report Count
+ 0x75, 0x08, // Report Size (8)
+ 0x91, 0x02, // Output (Data)
+ 0xC0 // End Collection
+};
+#endif
+
+#ifndef SERIAL_NUMBER
+# define SERIAL_NUMBER 0
+#endif
+
#ifndef USB_MAX_POWER_CONSUMPTION
# define USB_MAX_POWER_CONSUMPTION 500
#endif
@@ -344,100 +550,256 @@ const PROGMEM uchar mouse_extra_hid_report[] = {
# define USB_POLLING_INTERVAL_MS 1
#endif
+// clang-format off
+const PROGMEM usbStringDescriptor_t usbStringDescriptorZero = {
+ .header = {
+ .bLength = USB_STRING_LEN(1),
+ .bDescriptorType = USBDESCR_STRING
+ },
+ .bString = {0x0409} // US English
+};
+
+const PROGMEM usbStringDescriptor_t usbStringDescriptorManufacturer = {
+ .header = {
+ .bLength = USB_STRING_LEN(sizeof(STR(MANUFACTURER)) - 1),
+ .bDescriptorType = USBDESCR_STRING
+ },
+ .bString = LSTR(MANUFACTURER)
+};
+
+const PROGMEM usbStringDescriptor_t usbStringDescriptorProduct = {
+ .header = {
+ .bLength = USB_STRING_LEN(sizeof(STR(PRODUCT)) - 1),
+ .bDescriptorType = USBDESCR_STRING
+ },
+ .bString = LSTR(PRODUCT)
+};
+
+const PROGMEM usbStringDescriptor_t usbStringDescriptorSerial = {
+ .header = {
+ .bLength = USB_STRING_LEN(sizeof(STR(SERIAL_NUMBER)) - 1),
+ .bDescriptorType = USBDESCR_STRING
+ },
+ .bString = LSTR(SERIAL_NUMBER)
+};
+
/*
- * Descriptor for compite device: Keyboard + Mouse
- *
- * contains: device, interface, HID and endpoint descriptors
+ * Device descriptor
*/
-#if USB_CFG_DESCR_PROPS_CONFIGURATION
-const PROGMEM char usbDescriptorConfiguration[] = {
- /* USB configuration descriptor */
- 9, /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */
- USBDESCR_CONFIG, /* descriptor type */
-# if defined (MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
- 59, // 9 + (9 + 9 + 7) + (9 + 9 + 7)
-#else
- 34, // 9 + (9 + 9 + 7)
-# endif
- 0,
- // 18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT3 + 9, 0,
- /* total length of data returned (including inlined descriptors) */
-# if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
- 2, /* number of interfaces in this configuration */
-# else
- 1,
-#endif
- 1, /* index of this configuration */
- 0, /* configuration name string index */
-# if USB_CFG_IS_SELF_POWERED
- (1 << 7) | USBATTR_SELFPOWER, /* attributes */
-# else
- (1 << 7), /* attributes */
-# endif
- USB_MAX_POWER_CONSUMPTION / 2, /* max USB current in 2mA units */
+const PROGMEM usbDeviceDescriptor_t usbDeviceDescriptor = {
+ .header = {
+ .bLength = sizeof(usbDeviceDescriptor_t),
+ .bDescriptorType = USBDESCR_DEVICE
+ },
+ .bcdUSB = 0x0110,
+ .bDeviceClass = 0x00,
+ .bDeviceSubClass = 0x00,
+ .bDeviceProtocol = 0x00,
+ .bMaxPacketSize0 = 8,
+ .idVendor = VENDOR_ID,
+ .idProduct = PRODUCT_ID,
+ .bcdDevice = DEVICE_VER,
+ .iManufacturer = 0x01,
+ .iProduct = 0x02,
+ .iSerialNumber = 0x03,
+ .bNumConfigurations = 1
+};
+
+/*
+ * Configuration descriptors
+ */
+const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = {
+ .header = {
+ .header = {
+ .bLength = sizeof(usbConfigurationDescriptorHeader_t),
+ .bDescriptorType = USBDESCR_CONFIG
+ },
+ .wTotalLength = sizeof(usbConfigurationDescriptor_t),
+ .bNumInterfaces = TOTAL_INTERFACES,
+ .bConfigurationValue = 0x01,
+ .iConfiguration = 0x00,
+ .bmAttributes = (1 << 7) | USBATTR_REMOTEWAKE,
+ .bMaxPower = USB_MAX_POWER_CONSUMPTION / 2
+ },
/*
- * Keyboard interface
+ * Keyboard
*/
- /* Interface descriptor */
- 9, /* sizeof(usbDescrInterface): length of descriptor in bytes */
- USBDESCR_INTERFACE, /* descriptor type */
- 0, /* index of this interface */
- 0, /* alternate setting for this interface */
- USB_CFG_HAVE_INTRIN_ENDPOINT, /* endpoints excl 0: number of endpoint descriptors to follow */
- USB_CFG_INTERFACE_CLASS, USB_CFG_INTERFACE_SUBCLASS, USB_CFG_INTERFACE_PROTOCOL, 0, /* string index for interface */
- /* HID descriptor */
- 9, /* sizeof(usbDescrHID): length of descriptor in bytes */
- USBDESCR_HID, /* descriptor type: HID */
- 0x01, 0x01, /* BCD representation of HID version */
- 0x00, /* target country code */
- 0x01, /* number of HID Report (or other HID class) Descriptor infos to follow */
- 0x22, /* descriptor type: report */
- sizeof(keyboard_hid_report), 0, /* total length of report descriptor */
-/* Endpoint descriptor */
-# if USB_CFG_HAVE_INTRIN_ENDPOINT /* endpoint descriptor for endpoint 1 */
- 7, /* sizeof(usbDescrEndpoint) */
- USBDESCR_ENDPOINT, /* descriptor type = endpoint */
- (char)0x81, /* IN endpoint number 1 */
- 0x03, /* attrib: Interrupt endpoint */
- 8, 0, /* maximum packet size */
- USB_POLLING_INTERVAL_MS, /* in ms */
-# endif
+ .keyboardInterface = {
+ .header = {
+ .bLength = sizeof(usbInterfaceDescriptor_t),
+ .bDescriptorType = USBDESCR_INTERFACE
+ },
+ .bInterfaceNumber = KEYBOARD_INTERFACE,
+ .bAlternateSetting = 0x00,
+ .bNumEndpoints = 1,
+ .bInterfaceClass = 0x03,
+ .bInterfaceSubClass = 0x01,
+ .bInterfaceProtocol = 0x01,
+ .iInterface = 0x00
+ },
+ .keyboardHID = {
+ .header = {
+ .bLength = sizeof(usbHIDDescriptor_t),
+ .bDescriptorType = USBDESCR_HID
+ },
+ .bcdHID = 0x0101,
+ .bCountryCode = 0x00,
+ .bNumDescriptors = 1,
+ .bDescriptorType = USBDESCR_HID_REPORT,
+ .wDescriptorLength = sizeof(keyboard_hid_report)
+ },
+ .keyboardINEndpoint = {
+ .header = {
+ .bLength = sizeof(usbEndpointDescriptor_t),
+ .bDescriptorType = USBDESCR_ENDPOINT
+ },
+ .bEndpointAddress = (USBRQ_DIR_DEVICE_TO_HOST | 1),
+ .bmAttributes = 0x03,
+ .wMaxPacketSize = 8,
+ .bInterval = USB_POLLING_INTERVAL_MS
+ },
+# if defined(RAW_ENABLE)
+ /*
+ * RAW HID
+ */
+ .rawInterface = {
+ .header = {
+ .bLength = sizeof(usbInterfaceDescriptor_t),
+ .bDescriptorType = USBDESCR_INTERFACE
+ },
+ .bInterfaceNumber = RAW_INTERFACE,
+ .bAlternateSetting = 0x00,
+ .bNumEndpoints = 2,
+ .bInterfaceClass = 0x03,
+ .bInterfaceSubClass = 0x00,
+ .bInterfaceProtocol = 0x00,
+ .iInterface = 0x00
+ },
+ .rawHID = {
+ .header = {
+ .bLength = sizeof(usbHIDDescriptor_t),
+ .bDescriptorType = USBDESCR_HID
+ },
+ .bcdHID = 0x0101,
+ .bCountryCode = 0x00,
+ .bNumDescriptors = 2,
+ .bDescriptorType = USBDESCR_HID_REPORT,
+ .wDescriptorLength = sizeof(raw_hid_report)
+ },
+ .rawINEndpoint = {
+ .header = {
+ .bLength = sizeof(usbEndpointDescriptor_t),
+ .bDescriptorType = USBDESCR_ENDPOINT
+ },
+ .bEndpointAddress = (USBRQ_DIR_DEVICE_TO_HOST | USB_CFG_EP3_NUMBER),
+ .bmAttributes = 0x03,
+ .wMaxPacketSize = RAW_EPSIZE,
+ .bInterval = USB_POLLING_INTERVAL_MS
+ },
+ .rawOUTEndpoint = {
+ .header = {
+ .bLength = sizeof(usbEndpointDescriptor_t),
+ .bDescriptorType = USBDESCR_ENDPOINT
+ },
+ .bEndpointAddress = (USBRQ_DIR_HOST_TO_DEVICE | USB_CFG_EP3_NUMBER),
+ .bmAttributes = 0x03,
+ .wMaxPacketSize = RAW_EPSIZE,
+ .bInterval = USB_POLLING_INTERVAL_MS
+ },
+# endif
# if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
/*
- * Mouse/extrakeys interface
+ * Mouse/Extrakeys
*/
- /* Interface descriptor */
- 9, /* sizeof(usbDescrInterface): length of descriptor in bytes */
- USBDESCR_INTERFACE, /* descriptor type */
- 1, /* index of this interface */
- 0, /* alternate setting for this interface */
- USB_CFG_HAVE_INTRIN_ENDPOINT3, /* endpoints excl 0: number of endpoint descriptors to follow */
- 0x03, /* CLASS: HID */
- 0, /* SUBCLASS: none */
- 0, /* PROTOCOL: none */
- 0, /* string index for interface */
- /* HID descriptor */
- 9, /* sizeof(usbDescrHID): length of descriptor in bytes */
- USBDESCR_HID, /* descriptor type: HID */
- 0x01, 0x01, /* BCD representation of HID version */
- 0x00, /* target country code */
- 0x01, /* number of HID Report (or other HID class) Descriptor infos to follow */
- 0x22, /* descriptor type: report */
- sizeof(mouse_extra_hid_report), 0, /* total length of report descriptor */
-# if USB_CFG_HAVE_INTRIN_ENDPOINT3 /* endpoint descriptor for endpoint 3 */
- /* Endpoint descriptor */
- 7, /* sizeof(usbDescrEndpoint) */
- USBDESCR_ENDPOINT, /* descriptor type = endpoint */
- (char)(0x80 | USB_CFG_EP3_NUMBER), /* IN endpoint number 3 */
- 0x03, /* attrib: Interrupt endpoint */
- 8, 0, /* maximum packet size */
- USB_POLLING_INTERVAL_MS, /* in ms */
-# endif
+ .mouseExtraInterface = {
+ .header = {
+ .bLength = sizeof(usbInterfaceDescriptor_t),
+ .bDescriptorType = USBDESCR_INTERFACE
+ },
+ .bInterfaceNumber = MOUSE_EXTRA_INTERFACE,
+ .bAlternateSetting = 0x00,
+ .bNumEndpoints = 1,
+ .bInterfaceClass = 0x03,
+ .bInterfaceSubClass = 0x00,
+ .bInterfaceProtocol = 0x00,
+ .iInterface = 0x00
+ },
+ .mouseExtraHID = {
+ .header = {
+ .bLength = sizeof(usbHIDDescriptor_t),
+ .bDescriptorType = USBDESCR_HID
+ },
+ .bcdHID = 0x0101,
+ .bCountryCode = 0x00,
+ .bNumDescriptors = 1,
+ .bDescriptorType = USBDESCR_HID_REPORT,
+ .wDescriptorLength = sizeof(mouse_extra_hid_report)
+ },
+ .mouseExtraINEndpoint = {
+ .header = {
+ .bLength = sizeof(usbEndpointDescriptor_t),
+ .bDescriptorType = USBDESCR_ENDPOINT
+ },
+ .bEndpointAddress = (USBRQ_DIR_DEVICE_TO_HOST | USB_CFG_EP3_NUMBER),
+ .bmAttributes = 0x03,
+ .wMaxPacketSize = 8,
+ .bInterval = USB_POLLING_INTERVAL_MS
+ },
+# endif
+# if defined(CONSOLE_ENABLE)
+ /*
+ * Console
+ */
+ .consoleInterface = {
+ .header = {
+ .bLength = sizeof(usbInterfaceDescriptor_t),
+ .bDescriptorType = USBDESCR_INTERFACE
+ },
+ .bInterfaceNumber = CONSOLE_INTERFACE,
+ .bAlternateSetting = 0x00,
+ .bNumEndpoints = 2,
+ .bInterfaceClass = 0x03,
+ .bInterfaceSubClass = 0x00,
+ .bInterfaceProtocol = 0x00,
+ .iInterface = 0x00
+ },
+ .consoleHID = {
+ .header = {
+ .bLength = sizeof(usbHIDDescriptor_t),
+ .bDescriptorType = USBDESCR_HID
+ },
+ .bcdHID = 0x0111,
+ .bCountryCode = 0x00,
+ .bNumDescriptors = 1,
+ .bDescriptorType = USBDESCR_HID_REPORT,
+ .wDescriptorLength = sizeof(console_hid_report)
+ },
+ .consoleINEndpoint = {
+ .header = {
+ .bLength = sizeof(usbEndpointDescriptor_t),
+ .bDescriptorType = USBDESCR_ENDPOINT
+ },
+ .bEndpointAddress = (USBRQ_DIR_DEVICE_TO_HOST | USB_CFG_EP3_NUMBER),
+ .bmAttributes = 0x03,
+ .wMaxPacketSize = CONSOLE_EPSIZE,
+ .bInterval = 0x01
+ },
+ .consoleOUTEndpoint = {
+ .header = {
+ .bLength = sizeof(usbEndpointDescriptor_t),
+ .bDescriptorType = USBDESCR_ENDPOINT
+ },
+ .bEndpointAddress = (USBRQ_DIR_HOST_TO_DEVICE | USB_CFG_EP3_NUMBER),
+ .bmAttributes = 0x03,
+ .wMaxPacketSize = CONSOLE_EPSIZE,
+ .bInterval = 0x01
+ },
# endif
};
-#endif
+
+// clang-format on
USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) {
usbMsgLen_t len = 0;
@@ -451,22 +813,56 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) {
debug_hex16(rq->wLength.word); debug("\n");
*/
switch (rq->wValue.bytes[1]) {
-#if USB_CFG_DESCR_PROPS_CONFIGURATION
- case USBDESCR_CONFIG:
- usbMsgPtr = (unsigned char *)usbDescriptorConfiguration;
- len = sizeof(usbDescriptorConfiguration);
+ case USBDESCR_DEVICE:
+ usbMsgPtr = (unsigned char *)&usbDeviceDescriptor;
+ len = sizeof(usbDeviceDescriptor_t);
break;
-#endif
- case USBDESCR_HID:
+ case USBDESCR_CONFIG:
+ usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor;
+ len = sizeof(usbConfigurationDescriptor_t);
+ break;
+ case USBDESCR_STRING:
switch (rq->wValue.bytes[0]) {
case 0:
- usbMsgPtr = (unsigned char *)(usbDescriptorConfiguration + 9 + 9);
- len = 9;
+ usbMsgPtr = (unsigned char *)&usbStringDescriptorZero;
+ len = usbStringDescriptorZero.header.bLength;
break;
+ case 1: // iManufacturer
+ usbMsgPtr = (unsigned char *)&usbStringDescriptorManufacturer;
+ len = usbStringDescriptorManufacturer.header.bLength;
+ break;
+ case 2: // iProduct
+ usbMsgPtr = (unsigned char *)&usbStringDescriptorProduct;
+ len = usbStringDescriptorProduct.header.bLength;
+ break;
+ case 3: // iSerialNumber
+ usbMsgPtr = (unsigned char *)&usbStringDescriptorSerial;
+ len = usbStringDescriptorSerial.header.bLength;
+ break;
+ }
+ break;
+ case USBDESCR_HID:
+ switch (rq->wValue.bytes[0]) {
+ case KEYBOARD_INTERFACE:
+ usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.keyboardHID;
+ len = sizeof(usbHIDDescriptor_t);
+ break;
+#if defined(RAW_ENABLE)
+ case RAW_INTERFACE:
+ usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.rawHID;
+ len = sizeof(usbHIDDescriptor_t);
+ break;
+#endif
#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
- case 1:
- usbMsgPtr = (unsigned char *)(usbDescriptorConfiguration + 9 + (9 + 9 + 7) + 9);
- len = 9;
+ case MOUSE_EXTRA_INTERFACE:
+ usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.mouseExtraHID;
+ len = sizeof(usbHIDDescriptor_t);
+ break;
+#endif
+#if defined(CONSOLE_ENABLE)
+ case CONSOLE_INTERFACE:
+ usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.consoleHID;
+ len = sizeof(usbHIDDescriptor_t);
break;
#endif
}
@@ -474,15 +870,27 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) {
case USBDESCR_HID_REPORT:
/* interface index */
switch (rq->wIndex.word) {
- case 0:
+ case KEYBOARD_INTERFACE:
usbMsgPtr = (unsigned char *)keyboard_hid_report;
len = sizeof(keyboard_hid_report);
break;
+#if defined(RAW_ENABLE)
+ case RAW_INTERFACE:
+ usbMsgPtr = (unsigned char *)raw_hid_report;
+ len = sizeof(raw_hid_report);
+ break;
+#endif
#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
- case 1:
+ case MOUSE_EXTRA_INTERFACE:
usbMsgPtr = (unsigned char *)mouse_extra_hid_report;
len = sizeof(mouse_extra_hid_report);
break;
+#endif
+#if defined(CONSOLE_ENABLE)
+ case CONSOLE_INTERFACE:
+ usbMsgPtr = (unsigned char *)console_hid_report;
+ len = sizeof(console_hid_report);
+ break;
#endif
}
break;
diff --git a/tmk_core/protocol/vusb/vusb.h b/tmk_core/protocol/vusb/vusb.h
index 7e3f8c394dc..828960fc351 100644
--- a/tmk_core/protocol/vusb/vusb.h
+++ b/tmk_core/protocol/vusb/vusb.h
@@ -15,12 +15,102 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
-#ifndef VUSB_H
-#define VUSB_H
+#pragma once
#include "host_driver.h"
+typedef struct usbDescriptorHeader {
+ uchar bLength;
+ uchar bDescriptorType;
+} __attribute__((packed)) usbDescriptorHeader_t;
+
+typedef struct usbDeviceDescriptor {
+ usbDescriptorHeader_t header;
+ unsigned bcdUSB;
+ uchar bDeviceClass;
+ uchar bDeviceSubClass;
+ uchar bDeviceProtocol;
+ uchar bMaxPacketSize0;
+ unsigned idVendor;
+ unsigned idProduct;
+ unsigned bcdDevice;
+ uchar iManufacturer;
+ uchar iProduct;
+ uchar iSerialNumber;
+ uchar bNumConfigurations;
+} __attribute__((packed)) usbDeviceDescriptor_t;
+
+typedef struct usbConfigurationDescriptorHeader {
+ usbDescriptorHeader_t header;
+ unsigned wTotalLength;
+ uchar bNumInterfaces;
+ uchar bConfigurationValue;
+ uchar iConfiguration;
+ uchar bmAttributes;
+ uchar bMaxPower;
+} __attribute__((packed)) usbConfigurationDescriptorHeader_t;
+
+typedef struct usbStringDescriptor {
+ usbDescriptorHeader_t header;
+ int bString[];
+} __attribute__((packed)) usbStringDescriptor_t;
+
+typedef struct usbInterfaceDescriptor {
+ usbDescriptorHeader_t header;
+ uchar bInterfaceNumber;
+ uchar bAlternateSetting;
+ uchar bNumEndpoints;
+ uchar bInterfaceClass;
+ uchar bInterfaceSubClass;
+ uchar bInterfaceProtocol;
+ uchar iInterface;
+} __attribute__((packed)) usbInterfaceDescriptor_t;
+
+typedef struct usbEndpointDescriptor {
+ usbDescriptorHeader_t header;
+ uchar bEndpointAddress;
+ uchar bmAttributes;
+ unsigned wMaxPacketSize;
+ uchar bInterval;
+} __attribute__((packed)) usbEndpointDescriptor_t;
+
+typedef struct usbHIDDescriptor {
+ usbDescriptorHeader_t header;
+ unsigned bcdHID;
+ uchar bCountryCode;
+ uchar bNumDescriptors;
+ uchar bDescriptorType;
+ unsigned wDescriptorLength;
+} __attribute__((packed)) usbHIDDescriptor_t;
+
+typedef struct usbConfigurationDescriptor {
+ usbConfigurationDescriptorHeader_t header;
+ usbInterfaceDescriptor_t keyboardInterface;
+ usbHIDDescriptor_t keyboardHID;
+ usbEndpointDescriptor_t keyboardINEndpoint;
+
+#if defined(RAW_ENABLE)
+ usbInterfaceDescriptor_t rawInterface;
+ usbHIDDescriptor_t rawHID;
+ usbEndpointDescriptor_t rawINEndpoint;
+ usbEndpointDescriptor_t rawOUTEndpoint;
+#endif
+
+#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
+ usbInterfaceDescriptor_t mouseExtraInterface;
+ usbHIDDescriptor_t mouseExtraHID;
+ usbEndpointDescriptor_t mouseExtraINEndpoint;
+#endif
+
+#if defined(CONSOLE_ENABLE)
+ usbInterfaceDescriptor_t consoleInterface;
+ usbHIDDescriptor_t consoleHID;
+ usbEndpointDescriptor_t consoleINEndpoint;
+ usbEndpointDescriptor_t consoleOUTEndpoint;
+#endif
+} __attribute__((packed)) usbConfigurationDescriptor_t;
+
+#define USB_STRING_LEN(s) (sizeof(usbDescriptorHeader_t) + ((s) << 1))
+
host_driver_t *vusb_driver(void);
void vusb_transfer_keyboard(void);
-
-#endif
diff --git a/tmk_core/ring_buffer.h b/tmk_core/ring_buffer.h
index 6bea3509b33..25fab638ebd 100644
--- a/tmk_core/ring_buffer.h
+++ b/tmk_core/ring_buffer.h
@@ -3,21 +3,26 @@
/*--------------------------------------------------------------------
* Ring buffer to store scan codes from keyboard
*------------------------------------------------------------------*/
-#define RBUF_SIZE 32
+#ifndef RBUF_SIZE
+# define RBUF_SIZE 32
+#endif
#include
+#include
+#include
static uint8_t rbuf[RBUF_SIZE];
static uint8_t rbuf_head = 0;
static uint8_t rbuf_tail = 0;
-static inline void rbuf_enqueue(uint8_t data) {
+static inline bool rbuf_enqueue(uint8_t data) {
+ bool ret = false;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
uint8_t next = (rbuf_head + 1) % RBUF_SIZE;
if (next != rbuf_tail) {
rbuf[rbuf_head] = data;
rbuf_head = next;
- } else {
- print("rbuf: full\n");
+ ret = true;
}
}
+ return ret;
}
static inline uint8_t rbuf_dequeue(void) {
uint8_t val = 0;
diff --git a/tmk_core/rules.mk b/tmk_core/rules.mk
index c1474a5c24b..f45fd37929b 100644
--- a/tmk_core/rules.mk
+++ b/tmk_core/rules.mk
@@ -223,6 +223,12 @@ $(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 ?=
@@ -306,27 +312,27 @@ 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)
+$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 CMD := $$(CC) -c $$($1_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
+ $$(eval CMD := $$(CC) -c $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
@$$(BUILD_CMD)
# 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) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
+ $$(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) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
+ $$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
@$$(BUILD_CMD)
# Assemble: create object files from assembler source files.
@@ -433,7 +439,7 @@ $(eval $(foreach OUTPUT,$(OUTPUTS),$(shell mkdir -p $(OUTPUT) 2>/dev/null)))
.PHONY : all finish sizebefore sizeafter qmkversion \
gccversion build elf hex eep lss sym coff extcoff \
clean clean_list debug gdb-config show_path \
-program teensy dfu flip dfu-ee flip-ee dfu-start \
+program teensy dfu dfu-ee dfu-start \
flash dfu-split-left dfu-split-right \
avrdude-split-left avrdude-split-right \
avrdude-loop usbasp
diff --git a/users/333fred/333fred_config.h b/users/333fred/333fred_config.h
deleted file mode 100644
index c099072fc7f..00000000000
--- a/users/333fred/333fred_config.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#pragma once
-
-#define PERMISSIVE_HOLD
-#define NO_ACTION_MACRO
diff --git a/users/333fred/config.h b/users/333fred/config.h
new file mode 100644
index 00000000000..5974b789265
--- /dev/null
+++ b/users/333fred/config.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#define PERMISSIVE_HOLD
+#define NO_ACTION_MACRO
+#undef ONESHOT_TAP_TOGGLE
diff --git a/users/333fred/rules.mk b/users/333fred/rules.mk
index 0e2cc2588cc..191422e365f 100644
--- a/users/333fred/rules.mk
+++ b/users/333fred/rules.mk
@@ -3,3 +3,7 @@ SRC += 333fred.c
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
SRC += rgb.c
endif
+
+TAP_DANCE_ENABLE=yes
+NKRO_ENABLE = yes
+PERMISSIVE_HOLD = yes
diff --git a/users/alfrdmalr/alfrdmalr.h b/users/alfrdmalr/alfrdmalr.h
index 1989fb11a02..c779a353d92 100644
--- a/users/alfrdmalr/alfrdmalr.h
+++ b/users/alfrdmalr/alfrdmalr.h
@@ -164,11 +164,11 @@ enum alfrdmalr_keycodes {
* ,-----------------------------------------------------------------------------------.
* | TRNS | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | TRNS |
* |------+------+------+------+------+------+------+------+------+------+------+------|
- * | TRNS | ! | @ | { | } | | | ^ | $ | & | | | DEL |
+ * | TRNS | ! | # | { | } | | | ^ | $ | & | | | DEL |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | TRNS | < | > | ( | ) | | | - | + | = | \ | ` |
* |------+------+------+------+------+------+------+------+------+------+------+------|
- * | TRNS | ~ | # | [ | ] | | | _ | * | % | / | TRNS |
+ * | TRNS | ~ | @ | [ | ] | | | _ | * | % | / | TRNS |
* |------+------+------+------+------+------+------+------+------+------+------+------|
* | TRNS | TRNS | TRNS | TRNS | TRNS | TRNS | TRNS | TRNS | TRNS | TRNS | TRNS |
* `-----------------------------------------------------------------------------------'
@@ -176,9 +176,9 @@ enum alfrdmalr_keycodes {
// LEFT
// - CORE
-#define ____SYMBOL_L1____ KC_EXCLAIM, KC_AT, KC_LCBR, KC_RCBR, KC_NO
+#define ____SYMBOL_L1____ KC_EXCLAIM, KC_HASH, KC_LCBR, KC_RCBR, KC_NO
#define ____SYMBOL_L2____ KC_LABK, KC_RABK, KC_LPRN, KC_RPRN, KC_NO
-#define ____SYMBOL_L3____ KC_TILD, KC_HASH, KC_LBRC, KC_RBRC, KC_NO
+#define ____SYMBOL_L3____ KC_TILD, KC_AT, KC_LBRC, KC_RBRC, KC_NO
// - MODS
#define ____SYMBOL_L4____ ______TRANS______
diff --git a/users/anderson/dmc12.c b/users/anderson/dmc12.c
new file mode 100644
index 00000000000..1dd89dce418
--- /dev/null
+++ b/users/anderson/dmc12.c
@@ -0,0 +1,46 @@
+#include "dmc12.h"
+
+static uint32_t dmc12_color = 0;
+static uint16_t dmc12_timer = 0;
+static int8_t dmc12_current = 0;
+static uint8_t dmc12_direction = 1;
+
+void dmc12_start(uint32_t color, bool reset) {
+ dmc12_color = color;
+ if (reset) {
+ dmc12_timer = 0;
+ dmc12_current = 0;
+ dmc12_direction = 1;
+ }
+}
+
+void dmc12_process(void) {
+ if (!dmc12_timer) {
+ dmc12_timer = timer_read();
+ return;
+ }
+ float dist_from_center = ((float)abs(dmc12_current - RGBLED_NUM / 2)) / ((float)RGBLED_NUM);
+ if (timer_elapsed(dmc12_timer) > dist_from_center * LED_INTERVAL) {
+ dmc12_current += dmc12_direction;
+ if (dmc12_current == 0 || dmc12_current == RGBLED_NUM - 1) {
+ dmc12_direction *= -1;
+ }
+ dmc12_timer = timer_read();
+ for (int i = 0; i < RGBLED_NUM; i++) {
+ if (i > dmc12_current - LED_RADIUS && i < dmc12_current + LED_RADIUS) {
+ float intensity = (LED_RADIUS - abs(i - dmc12_current)) / ((float)LED_RADIUS);
+ if (i != dmc12_current) {
+ intensity /= 4.0;
+ }
+ rgblight_setrgb_at(
+ ((dmc12_color >> 16) & 0xFF) * intensity,
+ ((dmc12_color >> 8) & 0xFF) * intensity,
+ (dmc12_color & 0xFF) * intensity,
+ i
+ );
+ } else {
+ rgblight_setrgb_at(0, 0, 0, i);
+ }
+ }
+ }
+}
diff --git a/users/anderson/dmc12.h b/users/anderson/dmc12.h
new file mode 100644
index 00000000000..6b2bf94a518
--- /dev/null
+++ b/users/anderson/dmc12.h
@@ -0,0 +1,9 @@
+// Sexy LED animation.
+
+#include "quantum.h"
+
+#define LED_INTERVAL 160
+#define LED_RADIUS 6
+
+void dmc12_start(uint32_t color, bool reset);
+void dmc12_process(void);
diff --git a/users/anderson/seq.c b/users/anderson/seq.c
new file mode 100644
index 00000000000..ff506485990
--- /dev/null
+++ b/users/anderson/seq.c
@@ -0,0 +1,38 @@
+#include "seq.h"
+
+static char buffer[32];
+static uint8_t buffer_size = 0;
+
+void seq_start(void) {
+ buffer_size = 0;
+ SEND_STRING(":");
+}
+
+bool seq_feed(uint16_t keycode) {
+ if (keycode == KC_ENTER) {
+ for (int i = 0; i < buffer_size + 1; i++) {
+ tap_code(KC_BSPACE);
+ }
+ for (int i = 0; i < seq_config_size; i++) {
+ seq_t item = seq_config[i];
+ if (strncmp(item.sequence, buffer, buffer_size) == 0) {
+ send_unicode_string(item.result);
+ }
+ }
+ buffer_size = 0;
+ return false;
+ } else if (keycode == KC_BSPACE) {
+ if (buffer_size) {
+ buffer_size--;
+ tap_code(keycode);
+ }
+ return true;
+ } else {
+ if (keycode >= KC_A && keycode <= KC_Z) {
+ buffer[buffer_size++] = keycode - KC_A + 'a';
+ tap_code(keycode);
+ }
+ return true;
+ }
+}
+
diff --git a/users/anderson/seq.h b/users/anderson/seq.h
new file mode 100644
index 00000000000..2da4e761544
--- /dev/null
+++ b/users/anderson/seq.h
@@ -0,0 +1,14 @@
+#include "quantum.h"
+
+#include
+
+typedef struct seq_t {
+ const char *sequence;
+ const char *result;
+} seq_t;
+
+extern seq_t seq_config[];
+extern uint16_t seq_config_size;
+
+void seq_start(void);
+bool seq_feed(uint16_t keycode);
diff --git a/users/anderson/smoothled.c b/users/anderson/smoothled.c
new file mode 100644
index 00000000000..3af729563cc
--- /dev/null
+++ b/users/anderson/smoothled.c
@@ -0,0 +1,34 @@
+#include
+
+static uint32_t sourceColor = 0x000000;
+static uint32_t currentColor = 0x000000;
+static uint32_t targetColor = 0x000000;
+static int32_t smoothledTimer = -1;
+
+void smoothled_set(uint32_t color) {
+ smoothledTimer = timer_read32();
+ sourceColor = currentColor;
+ targetColor = color;
+}
+
+void smoothled_process(void) {
+ if (smoothledTimer < 0) {
+ return;
+ }
+ int32_t kb = timer_elapsed32(smoothledTimer);
+ int32_t ka = SMOOTH_DURATION - kb;
+ if (kb > SMOOTH_DURATION) {
+ kb = SMOOTH_DURATION;
+ ka = 0;
+ smoothledTimer = -1;
+ }
+ currentColor = 0;
+ for (int i = 2; i >= 0; i--) {
+ uint32_t shift = i * 8;
+ currentColor |= (ka * ((uint32_t)(sourceColor >> shift) & 0xFF) + kb * ((uint32_t)(targetColor >> shift) & 0xFF)) / SMOOTH_DURATION;
+ /*currentColor |= ((targetColor >> shift) & 0xFF);*/
+ currentColor <<= 8;
+ }
+ currentColor >>= 8;
+ rgblight_setrgb((currentColor >> 16) & 0xFF, (currentColor >> 8) & 0xFF, currentColor & 0xFF);
+}
diff --git a/users/anderson/smoothled.h b/users/anderson/smoothled.h
new file mode 100644
index 00000000000..bf4f8c17700
--- /dev/null
+++ b/users/anderson/smoothled.h
@@ -0,0 +1,6 @@
+#include "quantum.h"
+
+#define SMOOTH_DURATION 160
+
+void smoothled_set(uint32_t color);
+void smoothled_process(void);
diff --git a/users/bcat/bcat.c b/users/bcat/bcat.c
index bea64dbaa9b..2b250c10f10 100644
--- a/users/bcat/bcat.c
+++ b/users/bcat/bcat.c
@@ -1,6 +1,6 @@
#include "quantum.h"
#if defined(RGBLIGHT_ENABLE)
- /* Adjust RGB static hue ranges for shorter gradients than default. */
- const uint8_t RGBLED_GRADIENT_RANGES[] PROGMEM = {255, 127, 63, 31, 15};
+/* Adjust RGB static hue ranges for shorter gradients than default. */
+const uint8_t RGBLED_GRADIENT_RANGES[] PROGMEM = {255, 127, 63, 31, 15};
#endif
diff --git a/users/bcat/config.h b/users/bcat/config.h
index da74cb0a0b1..b0d556186a2 100644
--- a/users/bcat/config.h
+++ b/users/bcat/config.h
@@ -26,65 +26,45 @@
#define TAPPING_FORCE_HOLD
#if defined(RGB_MATRIX_ENABLE)
- /* Turn off per-key RGB when the host goes to sleep. */
- #define RGB_DISABLE_WHEN_USB_SUSPENDED true
+/* Turn off per-key RGB when the host goes to sleep. */
+# define RGB_DISABLE_WHEN_USB_SUSPENDED true
- /* Keep per-key RGB increments consistent across keyboards. */
- #undef RGB_MATRIX_HUE_STEP
- #undef RGB_MATRIX_SAT_STEP
- #undef RGB_MATRIX_VAL_STEP
- #undef RGB_MATRIX_SPD_STEP
+/* Keep per-key RGB increments consistent across keyboards. */
+# undef RGB_MATRIX_HUE_STEP
+# undef RGB_MATRIX_SAT_STEP
+# undef RGB_MATRIX_VAL_STEP
+# undef RGB_MATRIX_SPD_STEP
- #define RGB_MATRIX_HUE_STEP 8
- #define RGB_MATRIX_SAT_STEP 17
- #define RGB_MATRIX_VAL_STEP 17
- #define RGB_MATRIX_SPD_STEP 17
+# define RGB_MATRIX_HUE_STEP 8
+# define RGB_MATRIX_SAT_STEP 17
+# define RGB_MATRIX_VAL_STEP 17
+# define RGB_MATRIX_SPD_STEP 17
- /* Turn on additional RGB animations. */
- #define RGB_MATRIX_FRAMEBUFFER_EFFECTS
- #define RGB_MATRIX_KEYPRESSES
+/* Turn on additional RGB animations. */
+# define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+# define RGB_MATRIX_KEYPRESSES
#endif
#if defined(RGBLIGHT_ENABLE)
- /* Turn off RGB underglow when the host goes to sleep. */
- #define RGBLIGHT_SLEEP
+/* Turn off RGB underglow when the host goes to sleep. */
+# define RGBLIGHT_SLEEP
- /* Keep RGB underglow level increments consistent across keyboards. */
- #undef RGBLIGHT_HUE_STEP
- #undef RGBLIGHT_SAT_STEP
- #undef RGBLIGHT_VAL_STEP
+/* Keep RGB underglow level increments consistent across keyboards. */
+# undef RGBLIGHT_HUE_STEP
+# undef RGBLIGHT_SAT_STEP
+# undef RGBLIGHT_VAL_STEP
- #define RGBLIGHT_HUE_STEP 8
- #define RGBLIGHT_SAT_STEP 17
- #define RGBLIGHT_VAL_STEP 17
+# define RGBLIGHT_HUE_STEP 8
+# define RGBLIGHT_SAT_STEP 17
+# define RGBLIGHT_VAL_STEP 17
#endif
#if defined(BACKLIGHT_ENABLE)
- /* Enable backlight breathing across the board. */
- #define BACKLIGHT_BREATHING
+/* Enable backlight breathing across the board. */
+# define BACKLIGHT_BREATHING
- /* Keep backlight level increments consistent across keyboards. */
- #undef BACKLIGHT_LEVELS
+/* Keep backlight level increments consistent across keyboards. */
+# undef BACKLIGHT_LEVELS
- #define BACKLIGHT_LEVELS 7
-#endif
-
-#if defined(MOUSEKEY_ENABLE)
- /* Make mouse operation smoother. */
- #undef MOUSEKEY_DELAY
- #undef MOUSEKEY_INTERVAL
-
- #define MOUSEKEY_DELAY 0
- #define MOUSEKEY_INTERVAL 16
-
- /* Lower mouse speed to adjust for reduced MOUSEKEY_INTERVAL. */
- #undef MOUSEKEY_MAX_SPEED
- #undef MOUSEKEY_TIME_TO_MAX
- #undef MOUSEKEY_WHEEL_MAX_SPEED
- #undef MOUSEKEY_WHEEL_TIME_TO_MAX
-
- #define MOUSEKEY_MAX_SPEED 7
- #define MOUSEKEY_TIME_TO_MAX 150
- #define MOUSEKEY_WHEEL_MAX_SPEED 3
- #define MOUSEKEY_WHEEL_TIME_TO_MAX 150
+# define BACKLIGHT_LEVELS 7
#endif
diff --git a/users/bcat/readme.md b/users/bcat/readme.md
new file mode 100644
index 00000000000..49fbea1acfb
--- /dev/null
+++ b/users/bcat/readme.md
@@ -0,0 +1,13 @@
+# bcat's userspace
+
+This is some code and config shared by all of [my](https://github.com/bcat)
+keyboards. I have a few different keymaps spread throughout the repo; however,
+they are all derived from two "canonical" keymaps for my preferred layouts:
+
+* For typing, my canonical layout is my
+[Crkbd](https://github.com/qmk/qmk_firmware/tree/master/keyboards/crkbd/keymaps/bcat)
+(split ergo, columnar-staggered) layout.
+
+* For gaming, my canonical layout is my
+[Tsangan](https://github.com/qmk/qmk_firmware/tree/master/layouts/community/60_tsangan_hhkb/bcat)
+(row-staggered) layout.
diff --git a/users/bcat/rules.mk b/users/bcat/rules.mk
index 6d3444b2ce5..f3c6f9ab277 100644
--- a/users/bcat/rules.mk
+++ b/users/bcat/rules.mk
@@ -3,21 +3,33 @@ SRC += bcat.c
# Enable Bootmagic Lite to consistently reset to bootloader and clear EEPROM.
BOOTMAGIC_ENABLE = lite
-# Enable mouse and media keys on all keyboards.
+# Enable media keys on all keyboards.
EXTRAKEY_ENABLE = yes
-MOUSEKEY_ENABLE = yes
-
-# Disable some unwanted features on all keyboards.
-API_SYSEX_ENABLE = no
-COMMAND_ENABLE = no
-CONSOLE_ENABLE = no
-FAUXCLICKY_ENABLE = no
-MIDI_ENABLE = no
-NKRO_ENABLE = no
-SLEEP_LED_ENABLE = no
-UCIS_ENABLE = no
-UNICODE_ENABLE = no
-UNICODEMAP_ENABLE = no
# Enable link-time optimization to reduce binary size.
LINK_TIME_OPTIMIZATION_ENABLE = yes
+
+# Disable unused build options on all keyboards.
+COMMAND_ENABLE = no
+CONSOLE_ENABLE = no
+MOUSEKEY_ENABLE = no
+NKRO_ENABLE = no
+TERMINAL_ENABLE = no
+
+# Disable unused hardware options on all keyboards.
+FAUXCLICKY_ENABLE = no
+MIDI_ENABLE = no
+SLEEP_LED_ENABLE = no
+
+# Disable unused other options.
+API_SYSEX_ENABLE = no
+AUTO_SHIFT_ENABLE = no
+COMBO_ENABLE = no
+KEYBOARD_LOCK_ENABLE = no
+KEY_LOCK_ENABLE = no
+LEADER_ENABLE = no
+SWAP_HANDS_ENABLE = no
+TAP_DANCE_ENABLE = no
+UCIS_ENABLE = no
+UNICODEMAP_ENABLE = no
+UNICODE_ENABLE = no
diff --git a/users/dennytom/chording_engine/README.md b/users/dennytom/chording_engine/README.md
new file mode 100644
index 00000000000..3610b190bf6
--- /dev/null
+++ b/users/dennytom/chording_engine/README.md
@@ -0,0 +1,376 @@
+# README
+
+## About
+
+This is a custom combo engine. I call it chording engine mostly to differentiate it from QMK's combos. It is useful even if you are not using chording as a main input method to replace combos.
+
+Why does this exist? Typing on tiny keyboards can be challenging and you will end up relying on dances and / or combos. Pure QMK combos can be insufficient as they do not really support overlapping combos. For example, if you define 3 combos `(KC_Q, KC_W)`, `(KC_Z, KC_X)` and `(KC_Q, KC_W, KC_Z, KC_X)` and press Q, W, Z and X at the same time, all three combos will activate. Steno engines (and g Board Industries' custom steno inspired engine) solve this, however, they don't allow for comfortable typing in the traditional way. The steno chord activates only when *all* keys are lifted and makes it difficult to implement some advanced features. This engine treats each chord independently to allow for more comfortable typing experience.
+
+## TOC
+
+- [README](#readme)
+ - [About](#about)
+ - [TOC](#toc)
+ - [Start here](#start-here)
+ - [Steps](#steps)
+ - [Features](#features)
+ - [Chords](#chords)
+ - [Tap-Dance](#tap-dance)
+ - [Pseudolayers](#pseudolayers)
+ - [Control chords](#control-chords)
+ - [Settings up JSON definition](#settings-up-json-definition)
+ - [Keyboard and engine parameters](#keyboard-and-engine-parameters)
+ - [Pseudolayers](#pseudolayers-1)
+ - [Supported keycodes](#supported-keycodes)
+ - [Leader Key](#leader-key)
+ - [Extra code](#extra-code)
+ - [Further details](#further-details)
+ - [Implementation](#implementation)
+ - [Internal keycodes](#internal-keycodes)
+ - [Chords](#chords-1)
+ - [Caveats](#caveats)
+
+## Start here
+
+This engine therefore uses python parser that translates a JSON definition of keyboard specific information and keymap definition and produces `keymap.c`. Every function on this keymap is a chord (combo). The resulting keymap file is long and I do not encourage you to edit it. All you should have to edit is the JSON file. To produce the keymap file, run
+
+```sh
+./parser.py keymap_def.json keymap.c
+```
+
+To prepare the keymap JSON definition, you can use on of my keymaps as a starting point. I have on for butterstick and for georgi. There is also a JSON schema that has some examples and sane defaults. All details are explained in the next section. The parser tries to validate some of the things that the JSON schema can not. Finally there is a JSON in the tests folder that has at least one example of every feature.
+
+Watch out, you can not name your JSON file `keymap.json` if you place in the keymap folder. QMK creates `keymap.json` as a part of compilation process and if you already have one, it gets confused.
+
+## Steps
+
+When setting up a new keyboard, follow the steps:
+
+1. Make a new directory for your keymap as QMK's documentation describes.
+2. Write your JSON. Name it anything but `keymap.json`.
+3. Depending on the keyboard / keymap, create `rules.mk` (follow QMK's documentation and note that if the keyboard's `rules.mk` include custom source files, this is the place you can remove them).
+4. Use my python parser to generate the `keymap.c`. Run it from the `/users/dennytom/chording_engine` directory as it is using relative paths to some extra files.
+5. Follow QMK's documentation to compile and flash your firmware.
+
+## Features
+
+### Chords
+
+Once again, *everything* on this keymap is a chord. Even sending `KC_Q` is done by pressing a single key chord. Chord gets activated after all it's keys get pressed. Only the longest chord gets activated. The order of the pressed keys *does not matter*, only the fact they have been pressed within the same time frame. An active chord gets deactivated if *any* of it's keys gets depressed. To activate the same single chord again, *all* it's keys have to be depressed and pressed again. With a few exceptions chords are independent of each other. No matter if some chords are currently active and some not, others can be activated or deactivated without affecting each other's state. *If you press keys to belonging to multiple different, non-overlapping chords, all get activated in the order they are defined in the keymap.*
+
+### Tap-Dance
+
+To make it even stranger, all chords are technically tap-dance chords. They are relatively simple state machines that execute a specific function every time they change state. For simplicity and optimization purposes, there are a few prewritten functions that implement common features like "send a single key" or "lock". Any number of chords can be "in dance" at any given moment without affecting each other's state. Custom dances can be easily added. Check out the `state_machine.png` to see all the states any chord can be in.
+
+### Pseudolayers
+
+Only one QMK layer is used. Following the butterstick's default keymap's example, the chording engine is using pseudolayers. The main difference to QMK's layers is that only one pseudolayer can be active at each time (meaning you can not use `KC_TRANS`, I actually don't know what will happen if you do). Chords can be activated only if they are on the currently active pseudolayer. Chords that are currently active do not get deactivated if the pseudolayer changes and will deactivate if any of their keys gets depressed even no matter the current pseudolayer. Locked chords (see below) and chords on the `ALWAYS_ON` pseudolayer can be activated anytime.
+
+### Control chords
+
+The engine implements a number of ways of changing how chords behave:
+
+* **Lock**: Similarly to QMK's lock, the next chord activated after the Lock chord will not deactivate on release of any of its keys, it will deactivate when all its keys get pressed again. Any number of chords can be locked at the same time. To make sure a locked chord can be unlocked, it can activate no matter the current pseudolayer. A chord can be locked mid dance.
+* **One shots**: Chords that send keycodes and chords that turn on pseudolayers can be one shots. If tapped, they will lock (stay active) until the next keycode gets sent, *not necessarily when the next chord gets activated*. If held, they will deactivate on release *even if no keycode got sent*.
+* **Tap-Hold**: Also called key-layer dance and key-key dance. Either sends a defined keycode on tap and temporarily switches pseudolayer on hold *or* sends two different keycodes on tap and hold.
+* **Command mode**: After getting activated for the first time, the keyboard switches to command mode. All *keycodes* that would get registered get buffered instead. After activating the Command mode chord for the second time, all buffered keycodes get released at the same time allowing for key combination that would be hard or impossible to press. The Command mode only affects keycodes. It is therefore possible to change pseudolayers or activate / deactivate other chords while in Command mode. While multiple Command mode chords can be defined, they would not be independent. The keyboard either is or is not in command mode and there is only one buffer.
+* **Leader key**: Just like pure QMK's Leader key, this allows you to add functions that get executed if the Leader key and a specific sequence of keycodes gets registered in a predefined order in a short timeframe. For example `:wq` can send `Ctrl+S` and `Ctrl+W` in a quick succession. While multiple Leader keys can be defined, they all would access the same list of sequences.
+* **Dynamic macro**: A sequence of keycodes can be recorded and stored in the RAM of the keyboard and replayed.
+
+## Settings up JSON definition
+
+The JSON definition has 3 main sections. The elements `keys`, `parameters` and `layers` teach the engine about the details of your keyboard and set its parameters. The elements `pseudolayers`, `leader_sequences` and `chord_sets` define your keymap. Finally, the elements `extra_code` and `extra_dependencies` allow you to include more code to extend the capabilities of the engine.
+
+### Keyboard and engine parameters
+
+I do not have experience with stenography, so the the steno keycodes are hard for me to remember. That is why the keymap is using new keycodes TOP1, TOP2, ... .
+
+```c
+ "keys": ["TOP1", "TOP2", "TOP3", ...]
+```
+
+You can name these however you like as long as they do not crash with QMK's keycodes.
+
+*The chording engine in it's current implementation can handle up to 64 keys. If you need to support more, contact me (email or u/DennyTom at Reddit).*
+
+All timings, maximum lengths for macros, command mode and leader function are defined in `keyboard_parameters` field. Almost all should be pretty self-explanatory.
+
+My keyboards are small, so I only use the engine, but you might want to use layers that combine chord-able keys and traditional QMK keys or layers with advanced keycodes, for example for stenography. The array `layers` defines all the parser needs to know:
+
+```json
+"layers": [
+ {
+ "type": "auto"
+ },
+ {
+ "type": "manual",
+ "keycodes": ["KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0",
+ "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P"
+ ]
+ },
+ {
+ "type": "manual",
+ "keycodes": ["KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0",
+ "BOT1", "BOT2", "BOT3", "BOT4", "BOT5", "BOT6", "BOT7", "BOT8", "BOT9", "BOT0"]
+ }
+ ]
+```
+
+This example defines 3 layers, one that is automatically populated with chording engine's internal keycodes, second that is populated with QMK's keycodes and third that uses both internal and QMK's keycodes. The layers do not have names, you have to access them with `TO(1)` and `TO(0)`.
+
+Some keyboards mangle the order of keycodes when registering them in the layers. For that fill up the `layout_function_name` with the name of function / macro. If your keyboard does not do it, leave that string empty.
+
+### Pseudolayers
+
+Array `pseudolayers` defines the keymap per pseudolayer. Each field has to contain the name for the layer and the list of chords.
+
+```JSON
+"pseudolayers": [
+ {
+ "name": "QWERTY",
+ "chords": [
+ {
+ "type": "simple",
+ "keycode": "SPACE",
+ "chord": ["BOT1", "BOT0"]
+ },
+ {
+ "type": "visual",
+ "keycode": "CLEAR_KB",
+ "chord": [
+ "X", "", "", "", "", "", "", "", "", "X",
+ "X", "", "", "", "", "", "", "", "", "X",
+ ]
+ },
+ {
+ "type": "visual_array",
+ "keys": ["TOP1", "TOP2", "TOP3"],
+ "dictionary": [
+ ["X", "X", " ", "ESC"],
+ [" ", "X", "X", "TAB"],
+ ["X", "X", "X", "ENTER"]
+ ]
+ },
+ {
+ "type": "chord_set",
+ "set": "rows",
+ "keycodes": [
+ "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P",
+ "A", "S", "D", "F", "G", "H", "J", "K", "L", ";",
+ "Z", "X", "C", "V", "B", "N", "M", ",", ".", "/"
+ ]
+ }
+ ]
+ }
+]
+```
+
+The array `chord` defines chords. You can either use simple chord and list all the keys that have to pressed at the same time, or use the visual chord and place `"X"` over keys that will be part of the chord. You can also use `visual_array` to define a number of chords in a visual way on a subset of keys defined in the `keys` array. Finally, you can use `chord_set` to define a number of chords following a pattern that was set in the `chord_sets` array in the root object like this:
+
+```json
+"chord_sets": [
+ {
+ "name": "rows",
+ "chords": [
+ ["TOP1"], ["TOP2"], ["TOP3"], ["TOP4"], ["TOP5"], ["TOP6"], ["TOP7"], ["TOP8"], ["TOP9"], ["TOP0"]
+ ["TOP1", "BOT1"], ["TOP2", "BOT2"], ["TOP3", "BOT3"], ["TOP4", "BOT4"], ["TOP5", "BOT5"], ["TOP6", "BOT6"], ["TOP7", "BOT7"], ["TOP8", "BOT8"], ["TOP9", "BOT9"], ["TOP0", "BOT0"],
+ ["BOT1"], ["BOT2"], ["BOT3"], ["BOT4"], ["BOT5"], ["BOT6"], ["BOT7"], ["BOT8"], ["BOT9"], ["BOT0"]
+ ]
+ },
+ {
+ "name": "cols",
+ "chords": [
+ ["TOP1", "TOP2"], ["TOP2", "TOP3"], ["TOP3", "TOP4"], ["TOP4", "TOP5"], ["TOP5", "TOP6"], ["TOP6", "TOP7"], ["TOP7", "TOP8"], ["TOP8", "TOP9"], ["TOP9", "TOP0"],
+ ["TOP1", "TOP2", "BOT1", "BOT2"], ["TOP2", "TOP3", "BOT2", "BOT3"], ["TOP3", "TOP4", "BOT3", "BOT4"], ["TOP4", "TOP5", "BOT4", "BOT5"], ["TOP5", "TOP6", "BOT5", "BOT6"], ["TOP6", "TOP7", "BOT6", "BOT7"], ["TOP7", "TOP8", "BOT7", "BOT8"], ["TOP8", "TOP9", "BOT8", "BOT9"], ["TOP9", "TOP0", "BOT9", "BOT0"],
+ ["BOT1", "BOT2"], ["BOT2", "BOT3"], ["BOT3", "BOT4"], ["BOT4", "BOT5"], ["BOT5", "BOT6"], ["BOT6", "BOT7"], ["BOT7", "BOT8"], ["BOT8", "BOT9"], ["BOT9", "BOT00"],
+ ]
+ }
+]
+```
+
+
+
+You might notice that the code tries to do a few clever things when parsing keycodes:
+
+* If the keycode would be just a character basic keycode, it tries to allow the use of shortcuts. `Q` will get replaced with `KC_Q`, `,` becomes `KC_COMMA`. This *should* work for all KC_ keycodes unless I missed some.
+* `MO()` and `DF()` macros work the same way for pseudolayers as they would for layers in pure QMK.
+* `O()` is a shortcut for `OSK()` or `OSL()`.
+* `STR('...')` sends a string. Careful with quoting.
+* Special chords like Command mode have their own codes like `CMD`.
+* The empty strings get ignored.
+
+### Supported keycodes
+
+* **`X`** or **`KC_X`**: Send code `KC_X` just like a normal keyboard.
+
+* **`STR("X")`**: Send string "x" on each activation of the chord. Once again, watch out for quoting and escaping characters. If you want special characters (especially quotes) in your string, look up Python reference for string literals and experiment. Also, because of how the string gets parsed, it is not possible to use `(` in the string.
+
+* **`MO(X)`**: Temporary switch to pseudolayer `X`. Because only one pseudolayer can be active at any moment, this works by switching back to the pseudolayer the chord lives on on deactivation. If you chain `MO()`s on multiple pseudolayers and deactivate them in a random order, you might end up stranded on a pseudolayer. I recommend adding `CLEAR` somewhere on `ALWAYS_ON` pseudolayer just in case.
+
+* **`MO(X,Y)`**: Temporary switch to pseudolayer `Y`. Switches to pseudolayer `X` on deactivation. Especially useful when you want to put the `MO()` chord on `ALWAYS_ON`.
+
+* **`DF(X)`**: Permanent switch to pseudolayer `X`.
+
+* **`TO(X)`**: Switches the QMK layer to `X`.
+
+* **`O(X)`**: One-shot key `X` (if `X` starts with `"KC_"`) or one-shot layer `X` (otherwise) . Both have retro tapping enabled.
+
+* **Tap-holds**
+
+ * **`KK(X, Y)`**: Pulses code `X` on tap and code `Y` on hold.
+ * **`KL(X, Y)`**: Pulses code `X` on tap and switches to pseudolayer `Y` on hold. If during the hold no key gets registered, the code `X` will get sent instead (similar to QMK's retro tapping).
+ * **`KM(X, Y)`**: Same as `KK()` but meant for modifiers on hold. Instead of a timer to figure out tap-hold, uses retro tapping like behavior just like `KL()`. This has issues with GUI and ALT as they often have a meaning.
+ * The chording engine determines if you are holding a chord based on a *global* timer. If you start holding a tap-hold chord and very quickly start tapping other chords, the hold might not activate until a short moment *after the last* chord when the timer expires. If you are running into this, adjust timeouts or wait a brief moment after pressing the chord to make sure it switches into the hold state before pressing other chords.
+
+* **Autoshift**
+
+ * **`AS(X)`**: Pulses code `X` on tap and Pulses left shift + `X` on hold.
+ * **`AT`** : Toggles autoshift for all autoshift chords. If off, all `AS` chords act like `KC` chords.
+
+* **`LOCK`**: The lock key. Since tap-dances of chords are independent, it is possible to lock a chord *anywhere in it's dance if you time it right!*. If that happens, use the `CLEAR` chord or restart your keeb.
+
+* **`CMD`**: The command mode. The number of keycodes that can be buffered is defined in in `command_max_length`.
+
+* **`LEAD`**: The leader key. The maximum length of the sequences needs to be defined in `keyboard_params`. You can use `leader_sequences` array to add sequences:
+
+ ```json
+ "leader_sequences": [
+ {
+ "name": "fn_L1",
+ "function": "void fn_L1(void) { SEND(KC_LCTL); SEND(KC_LALT); SEND(KC_DEL); }",
+ "sequence": ["KC_Q", "KC_Z"]
+ }
+ ]
+ ```
+
+ When the engine notices the sequence, it will call the function defined in the field `name`. You can either define it in the `function` field, in the field `extra_code` or in an external file that you then have to insert manually or using the `extra_dependencies` array. The parser copy-pastes the contents `extra_code` of all files specified in the `extra_dependencies` array in the `keymap.c`.
+
+* **`M(X, VALUE1, VALUE2)`**: A custom macro. Adds a chord that will use function `X` and with `chord.value1 = VALUE1; chord.value2 = VALUE2;`. The function `X` can be arbitrary C function, go crazy. Just like with the leader sequences, you have to insert the code into the generated `keymap.c` manually or through `extra_code` or `extra_dependencies`. The following example defines a macro that acts exactly like `KC_MEH` (the chording engine *should* support `KC_MEH`, this is just an example):
+
+ ```c
+ void fn_M1(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ key_in(KC_LCTL);
+ key_in(KC_LSFT);
+ key_in(KC_LALT);
+ break;
+ case DEACTIVATED:
+ key_out(KC_LCTL);
+ key_out(KC_LSFT);
+ key_out(KC_LALT);
+ break;
+ case FINISHED:
+ case FINISHED_FROM_ACTIVE:
+ break;
+ case RESTART:
+ key_out(KC_LCTL);
+ key_out(KC_LSFT);
+ key_out(KC_LALT);
+ break;
+ default:
+ break;
+ }
+ }
+ ```
+
+ Since this feels like it would be the most common way to use this feature, I wrote a macro for this:
+
+* **`MK(X1, X2, ...)`**: Acts like `KC()` except it registers / unregisters all `X1`, `X2`, ... codes at the same time.
+
+* **`D(X1, X2, ...)`**: A basic keycode dance. If tapped (or held), registers `X1`. If tapped and then tapped again (or held), registers `X2`, ... It *cannot* be combined with tap-hold, however holding will result in repeat. You can put in as many basic keycodes as you want, but the macro will break if you go beyond 256. It will try to expand shortened keycodes. Advanced keycodes are not supported.
+
+* **`DM_RECORD`, `DM_NEXT`, `DM_END`, `DM_PLAY`**: Start recording a dynamic macro. Once you start recording, basic keycodes will get stored. When replaying the macro, all keys you press before `DM_NEXT` or `DM_END` will get pressed at the same time. For example the sequence `DM_RECORD`, `KC_CTRL`, `KC_A`, `DM_NEXT`, `KC_BSPC`, `DM_END` will record a macro that when played will execute the sequence Ctrl+a, Backspace. `dynamic_macro_max_length` defines the maximum length of the macro to be recorded. You can increase it for the price of RAM. The example above requires 4 units of length to be saved (Ctrl, A, next, Backspace).
+
+* **`CLEAR_KB`**: clears keyboard, sets all chords to the default state and switches the pseudolayer to the default one. Basically the emergency stop button.
+
+* **`RESET`**: Go to the DFU flashing mode.
+
+**Caveat** of the current implementation is that the tap-hold, `MK` and `D` keycodes can not accept any of the keycodes that have some sort a function like dynamic macro specific chords, `CLEAR_KB`, `RESET`, `LOCK`, `AT`, ...
+
+### Leader Key
+
+The sequences are not defined by the *keys* you press but by the *keycodes* that get intercepted. The length of the sequence must be equal or shorter than the maximum (defined in `keyboard.inc`). Currently, the timeout for the leader sequence refreshes after each key pressed. If the sequence is not in the database, nothing will happen.
+
+### Extra code
+
+Extra C code needed to define custom chords can be added by quoting in in the `extra_code` element or by saving it in another header file and including it using the `extra_dependencies` element:
+
+```json
+{
+ "extra_code": "void double_dance(const struct Chord* self) { ... }\n",
+ "extra_dependencies": ["my_header.h"]
+}
+```
+
+
+
+## Further details
+
+### Implementation
+
+The source files are split into several files. `engine.part.1`, `engine.part.2` and `engine.part.3` contain C code that defines the Chord structure, implementations for all provided functions and the engine itself. `parser.py` generates keyboard and keymap dependent code. The file `chord.py` contains most of the logic required to properly translate chords from the JSON to the C code. I rarely write in python, if you have improvements, let me know, *please*.
+
+### Internal keycodes
+
+When `process_record_user()` gets one of the internal keycodes, it returns `true`, completely bypassing keyboard's and QMK's `process_record` functions. *All other* keycodes get passed down to QMK's standard processing.
+
+### Chords
+
+Each chord is defined by a constant structure, a function and two non-constant `int` variables keeping the track of the chord's state:
+
+```c
+struct Chord {
+ uint32_t keycodes_hash;
+ uint8_t pseudolayer;
+ uint8_t* state;
+ uint8_t* counter;
+ uint16_t value1;
+ uint8_t value2;
+ void (*function) (const struct Chord*);
+};
+
+uint8_t state_0 = IDLE;
+uint8_t counter_0 = 0;
+void function_0(struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ register_code(self->value1);
+ break;
+ case DEACTIVATED:
+ unregister_code(self->value1);
+ break;
+ case FINISHED:
+ case PRESS_FROM_ACTIVE:
+ break;
+ case RESTART:
+ unregister_code(self->value1);
+ break;
+ default:
+ break;
+ }
+}
+const struct Chord chord_0 PROGMEM = {H_TOP1, QWERTY, &state_0, &counter_0, KC_Q, 0, function_0};
+```
+
+All chords have to be added to `list_of_chord` array that gets regularly scanned and processed. The function doesn't actually activate on all state changes, there are a few more like `IDLE` (nothing is currently happening to the chord) or `IN_ONE_SHOT` (the chord is one shot and is currently locked). Those are all necessary for internal use only. The ones you have to worry about are
+
+* `ACTIVATED`: Analogous to a key being pressed (this includes repeated presses for tap-dance)
+* `DEACTIVATED`: Analogous to a key being depressed (also can be repeated)
+* `FINISHED`: Happens if the chord got deactivated and then the dance timer expired.
+* `PRESS_FROM_ACTIVE`: Happens if the chord was active when the dance timer expired. Meaning you at least once activated the chord and then kept holding it down. Useful to recognize taps and holds.
+* `FINISHED_FROM_ACTIVE`: Happens *after* `PRESS_FROM_HOLD` if the chord is still active when the dance timer expires for the second time. Can be combined with the `counter` to recognize even longer presses. Useful if you want to recognize long presses, for example for autoshift functionality. In `keyboard.inc` you can set `LONG_PRESS_MULTIPLIER` to set how many times does dance timer have to expire for the autoshift to trigger.
+* `RESTART`: The dance is done. Happens immediately after `FINISHED` or on chord deactivation from `FINISHED_FROM_ACTIVE`. Anything you have to do to get the chord into `IDLE` mode happens here.
+
+The chords change states based on external and internal events. Anytime a chord's function is activated, it may change it's own state. Also, on certain events, the chording engine will trigger the functions of all chords in a specific state and *if the chords' state hasn't changed* it will then change it appropriately. The default behavior when a chord changes state is described by the following diagram:
+
+
+The colors differentiate in which function the change happens, see `state_machine.dot` for a bit more detail. Black arrows happen in more than one function. Arrows without a label happen immediately.
+
+You can see that the diagram is not exhaustive. For example nothing leads into `IN_ONE_SHOT`. That is because the chord's function can change the chord's state. This is useful for some advanced chords that break the default behavir (one-shots) and for optimization (chords that just send `KC_X` do not need to ever go into dance).
+
+## Caveats
+
+Each chord stores as much as possible in `PROGMEM` and unless it needs it, doesn't allocate `counter`. However it still has to store it's `state` and sometimes the `counter` in RAM. If you keep adding more chords, at one point you will run out. If your firmware fits in the memory and your keyboard crashes, try optimizing your RAM usage.
+
+Also, the code is not perfect. I keep testing it, but can not guarantee that it is stable. Some functions take (very short but still) time and if you happen to create keypress event when the keyboard can not see it, a chord can get stuck in a funny state. That is especially fun if the pseudolayer changes and you can not immediately press it again. Just restart the keyboard or push the key a few times.
diff --git a/users/dennytom/chording_engine/chord.py b/users/dennytom/chording_engine/chord.py
new file mode 100644
index 00000000000..707f36b82a8
--- /dev/null
+++ b/users/dennytom/chording_engine/chord.py
@@ -0,0 +1,466 @@
+from functools import reduce
+import re
+
+strings = []
+number_of_strings = -1
+
+def top_level_split(s):
+ """
+ Split `s` by top-level commas only. Commas within parentheses are ignored.
+ """
+
+ # Parse the string tracking whether the current character is within
+ # parentheses.
+ balance = 0
+ parts = []
+ part = ""
+
+ for i in range(len(s)):
+ c = s[i]
+ part += c
+ if c == '(':
+ balance += 1
+ elif c == ')':
+ balance -= 1
+ elif c == ',' and balance == 0 and not s[i+1] == ',':
+ part = part[:-1].strip()
+ parts.append(part)
+ part = ""
+
+ # Capture last part
+ if len(part):
+ parts.append(part.strip())
+
+ return parts
+
+def new_chord(on_pseudolayer, keycodes_hash, has_counter, value1, value2, function, output_buffer, index):
+ counter_link = "NULL"
+ output_buffer += "uint8_t state_" + str(index) + " = IDLE;\n"
+ if has_counter:
+ output_buffer += "uint8_t counter_" + str(index) + " = 0;\n"
+ counter_link = "&counter_" + str(index)
+ output_buffer += "const struct Chord chord_" + str(index) + " PROGMEM = {" + keycodes_hash + ", " + on_pseudolayer + ", &state_" + str(index) + ", " + counter_link + ", " + str(value1) + ", " + str(value2) + ", " + function + "};\n"
+ index += 1
+ return [output_buffer, index]
+
+def KC(on_pseudolayer, keycodes_hash, keycode, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, keycode, 0, "single_dance", output_buffer, index)
+
+def AS(on_pseudolayer, keycodes_hash, keycode, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, True, keycode, 0, "autoshift_dance", output_buffer, index)
+
+def AT(on_pseudolayer, keycodes_hash, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, 0, 0, "autoshift_toggle", output_buffer, index)
+
+def KL(on_pseudolayer, keycodes_hash, keycode, to_pseudolayer, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, True, keycode, to_pseudolayer, "key_layer_dance", output_buffer, index)
+
+def KK(on_pseudolayer, keycodes_hash, keycode1, keycode2, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, True, keycode1, keycode2, "key_key_dance", output_buffer, index)
+
+def KM(on_pseudolayer, keycodes_hash, keycode, to_pseudolayer, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, keycode, to_pseudolayer, "key_mod_dance", output_buffer, index)
+
+def MO(on_pseudolayer, keycodes_hash, to_pseudolayer, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, to_pseudolayer, 0, "temp_pseudolayer", output_buffer, index)
+
+def MO_alt(on_pseudolayer, keycodes_hash, from_pseudolayer, to_pseudolayer, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, to_pseudolayer, from_pseudolayer, "temp_pseudolayer_alt", output_buffer, index)
+
+def LOCK(on_pseudolayer, keycodes_hash, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, 0, 0, "lock", output_buffer, index)
+
+def DF(on_pseudolayer, keycodes_hash, to_pseudolayer, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, to_pseudolayer, 0, "perm_pseudolayer", output_buffer, index)
+
+def TO(on_pseudolayer, keycodes_hash, to_pseudolayer, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, to_pseudolayer, 0, "switch_layer", output_buffer, index)
+
+def OSK(on_pseudolayer, keycodes_hash, keycode, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, keycode, 0, "one_shot_key", output_buffer, index)
+
+def OSL(on_pseudolayer, keycodes_hash, to_pseudolayer, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, to_pseudolayer, 0, "one_shot_layer", output_buffer, index)
+
+def CMD(on_pseudolayer, keycodes_hash, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, 0, 0, "command", output_buffer, index)
+
+def DM_RECORD(on_pseudolayer, keycodes_hash, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, 0, 0, "dynamic_macro_record", output_buffer, index)
+
+def DM_NEXT(on_pseudolayer, keycodes_hash, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, 0, 0, "dynamic_macro_next", output_buffer, index)
+
+def DM_END(on_pseudolayer, keycodes_hash, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, 0, 0, "dynamic_macro_end", output_buffer, index)
+
+def DM_PLAY(on_pseudolayer, keycodes_hash, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, 0, 0, "dynamic_macro_play", output_buffer, index)
+
+def LEAD(on_pseudolayer, keycodes_hash, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, 0, 0, "leader", output_buffer, index)
+
+def CLEAR(on_pseudolayer, keycodes_hash, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, 0, 0, "clear", output_buffer, index)
+
+def RESET(on_pseudolayer, keycodes_hash, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, False, 0, 0, "reset", output_buffer, index)
+
+def STR(on_pseudolayer, keycodes_hash, string_input, output_buffer, index, number_of_strings, strings):
+ [a, b] = new_chord(on_pseudolayer, keycodes_hash, False, number_of_strings, 0, "string_in", output_buffer, index)
+ return [a, b, number_of_strings + 1, strings + [string_input]]
+
+def M(on_pseudolayer, keycodes_hash, value1, value2, fnc, output_buffer, index):
+ return new_chord(on_pseudolayer, keycodes_hash, True, value1, value2, fnc, output_buffer, index)
+
+def expand_keycode_fnc(DEFINITION):
+ if DEFINITION == "`":
+ DEFINITION = "GRAVE"
+ elif DEFINITION == "-":
+ DEFINITION = "MINUS"
+ elif DEFINITION == "=":
+ DEFINITION = "EQUAL"
+ elif DEFINITION == "[":
+ DEFINITION = "LBRACKET"
+ elif DEFINITION == "]":
+ DEFINITION = "RBRACKET"
+ elif DEFINITION == "\\":
+ DEFINITION = "BSLASH"
+ elif DEFINITION == ";":
+ DEFINITION = "SCOLON"
+ elif DEFINITION == "'":
+ DEFINITION = "QUOTE"
+ elif DEFINITION == ",":
+ DEFINITION = "COMMA"
+ elif DEFINITION == ".":
+ DEFINITION = "DOT"
+ elif DEFINITION == "/":
+ DEFINITION = "SLASH"
+ elif DEFINITION == "~":
+ DEFINITION = "TILDE"
+ elif DEFINITION == "*":
+ DEFINITION = "ASTERISK"
+ elif DEFINITION == "+":
+ DEFINITION = "PLUS"
+ elif DEFINITION == "(":
+ DEFINITION = "LEFT_PAREN"
+ elif DEFINITION == ")":
+ DEFINITION = "RIGHT_PAREN"
+ elif DEFINITION == "<":
+ DEFINITION = "LEFT_ANGLE_BRACKET"
+ elif DEFINITION == ">":
+ DEFINITION = "RIGHT_ANGLE_BRACKET"
+ elif DEFINITION == "{":
+ DEFINITION = "LEFT_CURLY_BRACE"
+ elif DEFINITION == "}":
+ DEFINITION = "RIGHT_CURLY_BRACE"
+ elif DEFINITION == "?":
+ DEFINITION = "QUESTION"
+ elif DEFINITION == "~":
+ DEFINITION = "TILDE"
+ elif DEFINITION == ":":
+ DEFINITION = "COLON"
+ elif DEFINITION == "_":
+ DEFINITION = "UNDERSCORE"
+ elif DEFINITION == '"':
+ DEFINITION = "DOUBLE_QUOTE"
+ elif DEFINITION == "@":
+ DEFINITION = "AT"
+ elif DEFINITION == "#":
+ DEFINITION = "HASH"
+ elif DEFINITION == "$":
+ DEFINITION = "DOLLAR"
+ elif DEFINITION == "!":
+ DEFINITION = "EXCLAIM"
+ elif DEFINITION == "%":
+ DEFINITION = "PERCENT"
+ elif DEFINITION == "^":
+ DEFINITION = "CIRCUMFLEX"
+ elif DEFINITION == "&":
+ DEFINITION = "AMPERSAND"
+ elif DEFINITION == "|":
+ DEFINITION = "PIPE"
+
+ if DEFINITION in [
+ "A", "a", "B", "b", "C", "c", "D", "d", "E", "e",
+ "F", "f", "G", "g", "H", "h", "I", "i", "J", "j",
+ "K", "k", "L", "l", "M", "m", "N", "n", "O", "o",
+ "P", "p", "Q", "q", "R", "r", "S", "s", "T", "t",
+ "U", "u", "V", "v", "W", "w", "X", "x", "Y", "y",
+ "Z", "z", "1", "2", "3", "4", "5", "6", "7", "8",
+ "9", "0", "F1", "F2", "F3", "F4", "F5", "F6", "F7",
+ "F8", "F9", "F10", "F11", "F12", "F13", "F14", "F15",
+ "F16", "F17", "F18", "F19", "F20", "F21", "F22",
+ "F23", "F24", "ENTER", "ENT", "ESCAPE", "ESC",
+ "BSPACE", "BSPC", "TAB", "SPACE", "SPC", "NONUS_HASH",
+ "NUHS", "NONUS_BSLASH", "NUBS", "COMMA", "COMM",
+ "DOT", "SLASH", "SLSH", "TILDE", "TILD", "EXCLAIM",
+ "EXLM", "AT", "HASH", "DOLLAR", "DLR", "PERCENT",
+ "PERC", "CIRCUMFLEX", "CIRC", "AMPERSAND", "AMPR",
+ "ASTERISK", "ASTR", "LEFT_PAREN", "LPRN", "RIGHT_PAREN",
+ "RPRN", "UNDERSCORE", "UNDS", "PLUS", "LEFT_CURLY_BRACE",
+ "LCBR", "RIGHT_CURLY_BRACE", "RCBR", "PIPE", "COLON",
+ "COLN", "DOUBLE_QUOTE", "DQUO", "DQT",
+ "LEFT_ANGLE_BRACKET", "LABK", "LT", "RIGHT_ANGLE_BRACKET",
+ "RABK", "GT", "QUESTION", "QUES", "SCOLON", "SCLN",
+ "QUOTE", "QUOT", "LBRACKET", "LBRC", "RBRACKET", "RBRC",
+ "BSLASH", "BSLS", "MINUS", "MINS", "EQUAL", "EQL",
+ "GRAVE", "GRV", "ZKHK", "CAPSLOCK", "CLCK", "CAPS",
+ "SCROLLOCK", "SLCK", "BRMD", "NUMLOCK", "NLCK",
+ "LOCKING_CAPS", "LCAP", "LOCKING_NUM", "LNUM",
+ "LOCKING_SCROLL", "LSCR", "LCTRL", "LCTL", "LSHIFT",
+ "LSFT", "LALT", "LGUI", "LCMD", "LWIN", "RCTRL",
+ "RCTL", "RSHIFT", "RSFT", "RALT", "RGUI", "RCMD",
+ "RWIN", "INT1", "RO", "INT2", "KANA", "INT3", "JYEN",
+ "INT4", "HENK", "INT5", "MHEN", "INT6", "INT7",
+ "INT8", "INT9", "LANG1", "HAEN", "LANG2", "HANJ",
+ "LANG3", "LANG4", "LANG5", "LANG6", "LANG7", "LANG8",
+ "LANG9", "PSCREEN", "PSCR", "PAUSE", "PAUS", "BRK",
+ "BRMU", "INSERT", "INS", "HOME", "PGUP", "DELETE",
+ "DEL", "END", "PGDOWN", "PGDN", "RIGHT", "RGHT",
+ "LEFT", "DOWN", "UP", "APPLICATION", "APP", "POWER",
+ "EXECUTE", "EXEC", "HELP", "MENU", "SELECT", "SLCT",
+ "STOP", "AGAIN", "AGIN", "UNDO", "CUT", "COPY",
+ "PASTE", "PSTE", "FIND", "MUTE", "VOLUP", "VOLDOWN",
+ "ALT_ERASE", "ERAS", "SYSREQ", "CANCEL", "CLEAR",
+ "CLR", "PRIOR", "RETURN", "SEPARATOR", "OUT", "OPER",
+ "CLEAR_AGAIN", "CRSEL", "EXSEL", "SYSTEM_POWER",
+ "PWR", "SYSTEM_SLEEP", "SLEP", "SYSTEM_WAKE", "WAKE",
+ "AUDIO_MUTE", "MUTE", "AUDIO_VOL_UP", "VOLU",
+ "AUDIO_VOL_DOWN", "VOLD", "MEDIA_NEXT_TRACK", "MNXT",
+ "MEDIA_PREV_TRACK", "MPRV", "CPRV", "MEDIA_STOP", "MSTP",
+ "MEDIA_PLAY_PAUSE", "MPLY", "MEDIA_SELECT", "MSEL",
+ "MEDIA_EJECT", "EJCT", "MAIL", "CALCULATOR", "CALC",
+ "MY_COMPUTER", "MYCM", "WWW_SEARCH", "WSCH", "WWW_HOME",
+ "WHOM", "WWW_BACK", "WBAK", "WWW_FORWARD", "WFWD",
+ "WWW_STOP", "WSTP", "WWW_REFRESH", "WREF",
+ "WWW_FAVORITES", "WFAV", "MEDIA_FAST_FORWARD", "MFFD",
+ "MEDIA_REWIND", "MRWD", "BRIGHTNESS_UP", "BRIU",
+ "BRIGHTNESS_DOWN", "BRID", "KP_SLASH", "PSLS",
+ "KP_ASTERISK", "PAST", "KP_MINUS", "PMNS", "KP_PLUS",
+ "PPLS", "KP_ENTER", "PENT", "KP_1", "P1", "KP_2", "P2",
+ "KP_3", "P3", "KP_4", "P4", "KP_5", "P5", "KP_6", "P6",
+ "KP_7", "P7", "KP_8", "P8", "KP_9", "P9", "KP_0", "P0",
+ "KP_DOT", "PDOT", "KP_EQUAL", "PEQL", "KP_COMMA", "PCMM",
+ "MS_BTN1", "BTN1", "MS_BTN2", "BTN2", "MS_BTN3", "BTN3",
+ "MS_BTN4", "BTN4", "MS_BTN5", "BTN5", "MS_BTN6", "BTN6",
+ "MS_LEFT", "MS_L", "MS_DOWN", "MS_D", "MS_UP", "MS_U",
+ "MS_RIGHT", "MS_R", "MS_WH_UP", "WH_U", "MS_WH_DOWN",
+ "WH_D", "MS_WH_LEFT", "MS_WH_L", "MS_WH_RIGHT", "MS_WH_R",
+ "KC_MS_ACCEL0", "ACL0", "KC_MS_ACCEL1", "ACL1",
+ "KC_MS_ACCEL2", "ACL2"
+ ]:
+ return "KC_" + DEFINITION
+ else:
+ return DEFINITION
+
+def MK(on_pseudolayer, keycodes_hash, definition, output_buffer, index):
+ l = len(definition.split(', '))
+ output_buffer += "void function_" + str(index) + "(const struct Chord* self) {\n"
+ output_buffer += " switch (*self->state) {\n"
+ output_buffer += " case ACTIVATED:\n"
+ for i in range(0, l):
+ val = definition.split(',')[i].strip()
+ code = expand_keycode_fnc(val)
+ output_buffer += " key_in(" + code + ");\n"
+ output_buffer += " break;\n"
+ output_buffer += " case DEACTIVATED:\n"
+ for i in range(0, l):
+ val = definition.split(',')[i].strip()
+ code = expand_keycode_fnc(val)
+ output_buffer += " key_out(" + code + ");\n"
+ output_buffer += " *self->state = IDLE;\n"
+ output_buffer += " break;\n"
+ output_buffer += " case RESTART:\n"
+ for i in range(0, l):
+ val = definition.split(',')[i].strip()
+ code = expand_keycode_fnc(val)
+ output_buffer += " key_out(" + code + ");\n"
+ output_buffer += " break;\n"
+ output_buffer += " default:\n"
+ output_buffer += " break;\n"
+ output_buffer += " };\n"
+ output_buffer += "}\n"
+ return new_chord(on_pseudolayer, keycodes_hash, True, 0, 0, "function_" + str(index), output_buffer, index)
+
+def D(on_pseudolayer, keycodes_hash, DEFINITION, output_buffer, index):
+ l = len(DEFINITION.split(','))
+ output_buffer += "void function_" + str(index) + "(const struct Chord* self) {\n"
+ output_buffer += " switch (*self->state) {\n"
+ output_buffer += " case ACTIVATED:\n"
+ output_buffer += " *self->counter = *self->counter + 1;\n"
+ output_buffer += " break;\n"
+ output_buffer += " case PRESS_FROM_ACTIVE:\n"
+ output_buffer += " switch (*self->counter) {\n"
+ for i in range(0, l):
+ val = DEFINITION.split(',')[i].strip()
+ code = expand_keycode_fnc(val)
+ output_buffer += " case " + str(i + 1) + ":\n"
+ output_buffer += " key_in( " + code + ");\n"
+ output_buffer += " break;\n"
+ output_buffer += " default:\n"
+ output_buffer += " break;\n"
+ output_buffer += " }\n"
+ output_buffer += " *self->state = FINISHED_FROM_ACTIVE;\n"
+ output_buffer += " break;\n"
+ output_buffer += " case FINISHED:\n"
+ output_buffer += " switch (*self->counter) {\n"
+ for i in range(0, l):
+ val = DEFINITION.split(',')[i].strip()
+ code = expand_keycode_fnc(val)
+ output_buffer += " case " + str(i + 1) + ":\n"
+ output_buffer += " tap_key( " + code + ");\n"
+ output_buffer += " break;\n"
+ output_buffer += " default:\n"
+ output_buffer += " break;\n"
+ output_buffer += " }\n"
+ output_buffer += " *self->counter = 0;\n"
+ output_buffer += " *self->state = IDLE;\n"
+ output_buffer += " break;\n"
+ output_buffer += " case RESTART:\n"
+ output_buffer += " switch (*self->counter) {\n"
+ for i in range(0, l):
+ val = DEFINITION.split(',')[i].strip()
+ code = expand_keycode_fnc(val)
+ output_buffer += " case " + str(i + 1) + ":\n"
+ output_buffer += " key_out( " + code + ");\n"
+ output_buffer += " break;\n"
+ output_buffer += " default:\n"
+ output_buffer += " break;\n"
+ output_buffer += " }\n"
+ output_buffer += " *self->counter = 0;\n"
+ output_buffer += " break;\n"
+ output_buffer += " default:\n"
+ output_buffer += " break;\n"
+ output_buffer += " }\n"
+ output_buffer += "}\n"
+ return new_chord(on_pseudolayer, keycodes_hash, True, 0, 0, "function_" + str(index), output_buffer, index)
+
+def O(on_pseudolayer, keycodes_hash, DEFINITION, output_buffer, index):
+ if DEFINITION[0:3] == "KC_":
+ return OSK(on_pseudolayer, keycodes_hash, DEFINITION, output_buffer, index)
+ else:
+ return OSL(on_pseudolayer, keycodes_hash, DEFINITION, output_buffer, index)
+
+def add_key(PSEUDOLAYER, KEYCODES_HASH, DEFINITION, output_buffer, index, number_of_strings, strings):
+ # if "= {" + KEYCODES_HASH + ", " + PSEUDOLAYER in output_buffer:
+ # KEYCODES_HASH = re.sub('H_', '', KEYCODES_HASH)
+ # raise Exception("You are trying to register a chord that you already registered (" + KEYCODES_HASH + ", " + PSEUDOLAYER + ")")
+
+ if DEFINITION == "":
+ return [output_buffer, index, number_of_strings, strings]
+ else:
+ split = DEFINITION.split("(")
+ type = split[0].strip()
+ if len(split) == 1:
+ if type == "LOCK":
+ [output_buffer, index] = LOCK(PSEUDOLAYER, KEYCODES_HASH, output_buffer, index)
+ elif type == "AT":
+ [output_buffer, index] = AT(PSEUDOLAYER, KEYCODES_HASH, output_buffer, index)
+ elif type == "CMD":
+ [output_buffer, index] = CMD(PSEUDOLAYER, KEYCODES_HASH, output_buffer, index)
+ elif type == "LEAD":
+ [output_buffer, index] = LEAD(PSEUDOLAYER, KEYCODES_HASH, output_buffer, index)
+ elif type == "DM_RECORD":
+ [output_buffer, index] = DM_RECORD(PSEUDOLAYER, KEYCODES_HASH, output_buffer, index)
+ elif type == "DM_NEXT":
+ [output_buffer, index] = DM_NEXT(PSEUDOLAYER, KEYCODES_HASH, output_buffer, index)
+ elif type == "DM_END":
+ [output_buffer, index] = DM_END(PSEUDOLAYER, KEYCODES_HASH, output_buffer, index)
+ elif type == "DM_PLAY":
+ [output_buffer, index] = DM_PLAY(PSEUDOLAYER, KEYCODES_HASH, output_buffer, index)
+ elif type == "CLEAR_KB":
+ [output_buffer, index] = CLEAR(PSEUDOLAYER, KEYCODES_HASH, output_buffer, index)
+ elif type == "RESET":
+ [output_buffer, index] = RESET(PSEUDOLAYER, KEYCODES_HASH, output_buffer, index)
+ else:
+ code = expand_keycode_fnc(type)
+ [output_buffer, index] = KC(PSEUDOLAYER, KEYCODES_HASH, code, output_buffer, index)
+ else:
+ val = split[1][:-1].strip()
+ if type == "O":
+ code = expand_keycode_fnc(val)
+ [output_buffer, index] = O(PSEUDOLAYER, KEYCODES_HASH, code, output_buffer, index)
+ elif type == "D":
+ [output_buffer, index] = D(PSEUDOLAYER, KEYCODES_HASH, val, output_buffer, index)
+ elif type == "MK":
+ [output_buffer, index] = MK(PSEUDOLAYER, KEYCODES_HASH, val, output_buffer, index)
+ elif type == "M":
+ fnc = val.split(',')[0].strip()
+ val1 = val.split(',')[1].strip()
+ val2 = val.split(',')[2].strip()
+ [output_buffer, index] = M(PSEUDOLAYER, KEYCODES_HASH, val1, val2, fnc, output_buffer, index)
+ elif type == "KK":
+ val1 = val.split(',')[0].strip()
+ code1 = expand_keycode_fnc(val1)
+ val2 = val.split(',')[1].strip()
+ code2 = expand_keycode_fnc(val2)
+ [output_buffer, index] = KK(PSEUDOLAYER, KEYCODES_HASH, code1, code2, output_buffer, index)
+ elif type == "KL":
+ val1 = val.split(',')[0].strip()
+ code1 = expand_keycode_fnc(val1)
+ val2 = val.split(',')[1].strip()
+ [output_buffer, index] = KL(PSEUDOLAYER, KEYCODES_HASH, code1, val2, output_buffer, index)
+ elif type == "KM":
+ val1 = val.split(',')[0].strip()
+ code1 = expand_keycode_fnc(val1)
+ val2 = val.split(',')[1].strip()
+ code2 = expand_keycode_fnc(val2)
+ [output_buffer, index] = KM(PSEUDOLAYER, KEYCODES_HASH, code1, code2, output_buffer, index)
+ elif type == "AS":
+ code = expand_keycode_fnc(val)
+ [output_buffer, index] = AS(PSEUDOLAYER, KEYCODES_HASH, code, output_buffer, index)
+ elif type == "MO":
+ if not ',' in val:
+ [output_buffer, index] = MO(PSEUDOLAYER, KEYCODES_HASH, val, output_buffer, index)
+ else:
+ val1 = val.split(',')[0].strip()
+ val2 = val.split(',')[1].strip()
+ [output_buffer, index] = MO_alt(PSEUDOLAYER, KEYCODES_HASH, val1, val2, output_buffer, index)
+ elif type == "DF":
+ [output_buffer, index] = DF(PSEUDOLAYER, KEYCODES_HASH, val, output_buffer, index)
+ elif type == "TO":
+ [output_buffer, index] = TO(PSEUDOLAYER, KEYCODES_HASH, val, output_buffer, index)
+ elif type == "STR":
+ [output_buffer, index, number_of_strings, strings] = STR(PSEUDOLAYER, KEYCODES_HASH, val, output_buffer, index, number_of_strings, strings)
+ return [output_buffer, index, number_of_strings, strings]
+
+def add_leader_combo(DEFINITION, FUNCTION):
+ return list_of_leader_combos.append([DEFINITION, FUNCTION])
+
+def add_chord_set(PSEUDOLAYER, INPUT_STRING, TYPE, data, output_buffer, index, number_of_strings, strings):
+ chord_set = {}
+ for set in data["chord_sets"]:
+ if set["name"] == TYPE:
+ chord_set = set["chords"]
+ break
+
+ separated_string = top_level_split(INPUT_STRING)
+ for word, chord in zip(separated_string, chord_set):
+ chord_hash = reduce((lambda x, y: str(x) + " + " + str(y)), ["H_" + key for key in chord])
+ [output_buffer, index, number_of_strings, strings] = add_key(PSEUDOLAYER, chord_hash, word, output_buffer, index, number_of_strings, strings)
+
+ return [output_buffer, index, number_of_strings, strings]
+
+def add_dictionary(PSEUDOLAYER, keycodes, array, output_buffer, index, number_of_strings, strings):
+ for chord in array:
+ hash = ""
+ for word, key in zip(chord[:-1], keycodes):
+ if word == "X":
+ hash = hash + " + H_" + key
+ hash = hash[3:]
+ if hash != "":
+ [output_buffer, index, number_of_strings, strings] = add_key(PSEUDOLAYER, hash, chord[-1], output_buffer, index, number_of_strings, strings)
+
+ return [output_buffer, index, number_of_strings, strings]
+
+def secret_chord(PSEUDOLAYER, ACTION, INPUT_STRING, data, output_buffer, index, number_of_strings, strings):
+ separated_string = top_level_split(INPUT_STRING)
+ hash = ""
+ for word, key in zip(separated_string, data["keys"]):
+ if word == "X":
+ hash = hash + " + H_" + key
+
+ hash = hash[3:]
+ if hash != "":
+ return add_key(PSEUDOLAYER, hash, ACTION, output_buffer, index, number_of_strings, strings)
\ No newline at end of file
diff --git a/users/dennytom/chording_engine/engine.part.1 b/users/dennytom/chording_engine/engine.part.1
new file mode 100644
index 00000000000..73df4cdeaad
--- /dev/null
+++ b/users/dennytom/chording_engine/engine.part.1
@@ -0,0 +1,163 @@
+enum chord_states {
+ IDLE,
+ READY,
+ ACTIVATED,
+ DEACTIVATED,
+ PRESS_FROM_ACTIVE,
+ FINISHED_FROM_ACTIVE,
+ IDLE_IN_DANCE,
+ READY_IN_DANCE,
+ FINISHED,
+ LOCKED,
+ READY_LOCKED,
+ RESTART,
+ IN_ONE_SHOT
+};
+
+struct Chord {
+ uint32_t keycodes_hash;
+ uint8_t pseudolayer;
+ uint8_t* state;
+ uint8_t* counter;
+ uint16_t value1;
+ uint8_t value2;
+ void (*function) (const struct Chord*);
+};
+
+uint8_t current_pseudolayer = DEFAULT_PSEUDOLAYER;
+bool lock_next = false;
+uint16_t chord_timer = 0;
+uint16_t dance_timer = 0;
+bool autoshift_mode = true;
+uint8_t keycode_index = 0;
+uint8_t command_mode = 0;
+uint8_t command_ind = 0;
+bool in_leader_mode = false;
+uint8_t leader_ind = 0;
+uint16_t leader_timer = 0;
+uint8_t dynamic_macro_mode = false;
+uint8_t dynamic_macro_ind = 0;
+bool a_key_went_through = false;
+struct Chord* last_chord = NULL;
+
+bool handle_US_ANSI_shifted_keys(int16_t keycode, bool in) {
+ bool is_US_ANSI_shifted = true;
+
+ int16_t regular_keycode = KC_NO;
+ switch (keycode) {
+ case KC_TILDE:
+ regular_keycode = KC_GRAVE;
+ break;
+ case KC_EXCLAIM:
+ regular_keycode = KC_1;
+ break;
+ case KC_AT:
+ regular_keycode = KC_2;
+ break;
+ case KC_HASH:
+ regular_keycode = KC_3;
+ break;
+ case KC_DOLLAR:
+ regular_keycode = KC_4;
+ break;
+ case KC_PERCENT:
+ regular_keycode = KC_5;
+ break;
+ case KC_CIRCUMFLEX:
+ regular_keycode = KC_6;
+ break;
+ case KC_AMPERSAND:
+ regular_keycode = KC_7;
+ break;
+ case KC_ASTERISK:
+ regular_keycode = KC_8;
+ break;
+ case KC_LEFT_PAREN:
+ regular_keycode = KC_9;
+ break;
+ case KC_RIGHT_PAREN:
+ regular_keycode = KC_0;
+ break;
+ case KC_UNDERSCORE:
+ regular_keycode = KC_MINUS;
+ break;
+ case KC_PLUS:
+ regular_keycode = KC_EQUAL;
+ break;
+ case KC_LEFT_CURLY_BRACE:
+ regular_keycode = KC_LBRACKET;
+ break;
+ case KC_RIGHT_CURLY_BRACE:
+ regular_keycode = KC_RBRACKET;
+ break;
+ case KC_PIPE:
+ regular_keycode = KC_BSLASH;
+ break;
+ case KC_COLON:
+ regular_keycode = KC_SCOLON;
+ break;
+ case KC_DOUBLE_QUOTE:
+ regular_keycode = KC_QUOTE;
+ break;
+ case KC_LEFT_ANGLE_BRACKET:
+ regular_keycode = KC_COMMA;
+ break;
+ case KC_RIGHT_ANGLE_BRACKET:
+ regular_keycode = KC_DOT;
+ break;
+ case KC_QUESTION:
+ regular_keycode = KC_SLASH;
+ break;
+ default:
+ is_US_ANSI_shifted = false;
+ }
+ if (is_US_ANSI_shifted) {
+ if (in) {
+ register_code(KC_LSFT);
+ register_code(regular_keycode);
+ } else {
+ unregister_code(regular_keycode);
+ unregister_code(KC_LSFT);
+ }
+ }
+ return is_US_ANSI_shifted;
+}
+
+void key_in(int16_t keycode) {
+ if (command_mode == 1 && command_ind < COMMAND_MAX_LENGTH) {
+ command_buffer[command_ind] = keycode;
+ command_ind++;
+ a_key_went_through = true;
+ } else if (in_leader_mode && leader_ind < LEADER_MAX_LENGTH) {
+ leader_buffer[leader_ind] = keycode;
+ leader_ind++;
+ a_key_went_through = true;
+ } else if (dynamic_macro_mode && dynamic_macro_ind < DYNAMIC_MACRO_MAX_LENGTH) {
+ dynamic_macro_buffer[dynamic_macro_ind] = keycode;
+ dynamic_macro_ind++;
+ a_key_went_through = true;
+ } else {
+ if (!handle_US_ANSI_shifted_keys(keycode, true)) {
+ register_code(keycode);
+ }
+ send_keyboard_report();
+ a_key_went_through = true;
+ }
+}
+
+void key_out(int16_t keycode) {
+ if (command_mode == 0) {
+ if (!handle_US_ANSI_shifted_keys(keycode, false)) {
+ if (command_mode == 0 && in_leader_mode == false && dynamic_macro_mode == false) {
+ unregister_code(keycode);
+ }
+ }
+ send_keyboard_report();
+ }
+}
+
+void tap_key(int16_t keycode) {
+ key_in(keycode);
+ wait_ms(TAP_TIMEOUT);
+ key_out(keycode);
+}
\ No newline at end of file
diff --git a/users/dennytom/chording_engine/engine.part.2 b/users/dennytom/chording_engine/engine.part.2
new file mode 100644
index 00000000000..91dcbb75031
--- /dev/null
+++ b/users/dennytom/chording_engine/engine.part.2
@@ -0,0 +1,323 @@
+void single_dance(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ key_in(self->value1);
+ break;
+ case DEACTIVATED:
+ key_out(self->value1);
+ *self->state = IDLE;
+ break;
+ case RESTART:
+ key_out(self->value1);
+ break;
+ default:
+ break;
+ }
+}
+
+void key_layer_dance(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ current_pseudolayer = self->value2;
+ a_key_went_through = false;
+ break;
+ case DEACTIVATED:
+ case RESTART:
+ if (!a_key_went_through) {
+ tap_key(self->value1);
+ }
+ current_pseudolayer = self->pseudolayer;
+ *self->state = IDLE; // does not have effect if the state was RESTART
+ break;
+ default:
+ break;
+ }
+}
+
+void key_mod_dance(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ key_in(self->value2);
+ a_key_went_through = false;
+ break;
+ case DEACTIVATED:
+ case RESTART:
+ key_out(self->value2);
+ if (!a_key_went_through) {
+ tap_key(self->value1);
+ }
+ *self->state = IDLE; // does not have effect if the state was RESTART
+ break;
+ default:
+ break;
+ }
+}
+
+void key_key_dance(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ break;
+ case DEACTIVATED:
+ tap_key(self->value1);
+ *self->state = IDLE;
+ break;
+ case FINISHED:
+ case PRESS_FROM_ACTIVE:
+ key_in(self->value2);
+ break;
+ case RESTART:
+ key_out(self->value2);
+ break;
+ default:
+ break;
+ }
+}
+
+void autoshift_dance_impl(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ *self->counter = 0;
+ break;
+ case DEACTIVATED:
+ case RESTART:
+ tap_key(self->value1);
+ *self->state = IDLE;
+ break;
+ case FINISHED_FROM_ACTIVE:
+ if (*self->counter == (LONG_PRESS_MULTIPLIER - 2)) {
+ key_in(KC_LSFT);
+ tap_key(self->value1);
+ key_out(KC_LSFT);
+ *self->state = IDLE;
+ // the skip to IDLE is usually just a lag optimization,
+ // in this case it has a logic function, on a short
+ // press (still longer than a tap) the key does not get shifted
+ } else {
+ *self->counter += 1;
+ *self->state = PRESS_FROM_ACTIVE;
+ dance_timer = timer_read();
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+void autoshift_dance(const struct Chord* self) {
+ if (autoshift_mode) {
+ autoshift_dance_impl(self);
+ } else {
+ single_dance(self);
+ }
+}
+
+void autoshift_toggle(const struct Chord* self){
+ if (*self->state == ACTIVATED) {
+ autoshift_mode = !autoshift_mode;
+ *self->state = IDLE;
+ }
+}
+
+void temp_pseudolayer(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ current_pseudolayer = self->value1;
+ break;
+ case DEACTIVATED:
+ current_pseudolayer = self->pseudolayer;
+ *self->state = IDLE;
+ break;
+ case RESTART:
+ current_pseudolayer = self->pseudolayer;
+ break;
+ default:
+ break;
+ }
+}
+
+void temp_pseudolayer_alt(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ current_pseudolayer = self->value1;
+ break;
+ case DEACTIVATED:
+ current_pseudolayer = self->value2;
+ *self->state = IDLE;
+ break;
+ case RESTART:
+ current_pseudolayer = self->value2;
+ break;
+ default:
+ break;
+ }
+}
+
+void perm_pseudolayer(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ current_pseudolayer = self->value1;
+ *self->state = IDLE;
+ }
+}
+
+void switch_layer(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ layer_move(self->value1);
+ *self->state = IDLE;
+ }
+}
+
+void lock(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ lock_next = true;
+ *self->state = IDLE;
+ }
+}
+
+void one_shot_key(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ break;
+ case DEACTIVATED:
+ key_in(self->value1);
+ *self->state = IN_ONE_SHOT;
+ break;
+ case FINISHED:
+ case PRESS_FROM_ACTIVE:
+ key_in(self->value1);
+ a_key_went_through = false;
+ break;
+ case RESTART:
+ if (a_key_went_through) {
+ key_out(self->value1);
+ } else {
+ *self->state = IN_ONE_SHOT;
+ }
+ default:
+ break;
+ }
+}
+
+void one_shot_layer(const struct Chord* self) {
+ switch (*self->state) {
+ case ACTIVATED:
+ break;
+ case DEACTIVATED:
+ current_pseudolayer = self->value1;
+ *self->state = IN_ONE_SHOT;
+ break;
+ case FINISHED:
+ case PRESS_FROM_ACTIVE:
+ current_pseudolayer = self->value1;
+ a_key_went_through = false;
+ break;
+ case RESTART:
+ if (a_key_went_through) {
+ current_pseudolayer = self->pseudolayer;
+ } else {
+ *self->state = IN_ONE_SHOT;
+ }
+ default:
+ break;
+ }
+}
+
+void command(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ command_mode++;
+ *self->state = IDLE;
+ }
+}
+
+bool identical(uint16_t* buffer1, uint16_t* buffer2) {
+ bool same = true;
+ for (int i = 0; i < LEADER_MAX_LENGTH; i++) {
+ same = same && (buffer1[i] == buffer2[i]);
+ }
+ return same;
+}
+
+void leader(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ in_leader_mode = true;
+ *self->state = IDLE;
+ }
+}
+
+void dynamic_macro_record(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ for (int i = 0; i < DYNAMIC_MACRO_MAX_LENGTH; i++) {
+ dynamic_macro_buffer[i] = 0;
+ }
+ dynamic_macro_mode = true;
+ *self->state = IDLE;
+ }
+}
+
+void dynamic_macro_next(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ if (dynamic_macro_mode && dynamic_macro_ind < DYNAMIC_MACRO_MAX_LENGTH) {
+ dynamic_macro_buffer[dynamic_macro_ind] = 0;
+ dynamic_macro_ind++;
+ }
+ *self->state = IDLE;
+ }
+}
+
+void dynamic_macro_end(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ if (dynamic_macro_mode) {
+ dynamic_macro_mode = false;
+ }
+ *self->state = IDLE;
+ }
+}
+
+void dynamic_macro_play(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ int ind_start = 0;
+ while (ind_start < DYNAMIC_MACRO_MAX_LENGTH) {
+ for (int i = ind_start; i < DYNAMIC_MACRO_MAX_LENGTH; i++) {
+ if (dynamic_macro_buffer[i] == 0) {
+ break;
+ }
+ register_code(dynamic_macro_buffer[i]);
+ }
+ send_keyboard_report();
+ wait_ms(TAP_TIMEOUT);
+ for (int i = ind_start; i < DYNAMIC_MACRO_MAX_LENGTH; i++) {
+ if (dynamic_macro_buffer[i] == 0) {
+ ind_start = i + 1;
+ break;
+ }
+ unregister_code(dynamic_macro_buffer[i]);
+ }
+ send_keyboard_report();
+ }
+ *self->state = IDLE;
+ }
+}
+
+void string_in(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ char buffer[STRING_MAX_LENGTH];
+ strcpy_P(buffer, (char*)pgm_read_word(&(strings[self->value1])));
+ send_string(buffer);
+ }
+}
+
+void clear(const struct Chord* self);
+
+void reset_keyboard_kb(void){
+#ifdef WATCHDOG_ENABLE
+ MCUSR = 0;
+ wdt_disable();
+ wdt_reset();
+#endif
+ reset_keyboard();
+}
+
+void reset(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ reset_keyboard_kb();
+ }
+}
diff --git a/users/dennytom/chording_engine/engine.part.3 b/users/dennytom/chording_engine/engine.part.3
new file mode 100644
index 00000000000..cf19008abce
--- /dev/null
+++ b/users/dennytom/chording_engine/engine.part.3
@@ -0,0 +1,404 @@
+bool are_hashed_keycodes_in_sound(HASH_TYPE keycodes_hash, HASH_TYPE sound) {
+ return (keycodes_hash & sound) == keycodes_hash;
+}
+
+uint8_t keycode_to_index(uint16_t keycode) {
+ return keycode - FIRST_INTERNAL_KEYCODE;
+}
+
+void sound_keycode_array(uint16_t keycode) {
+ uint8_t index = keycode_to_index(keycode);
+ keycode_index++;
+ keycodes_buffer_array[index] = keycode_index;
+}
+
+void silence_keycode_hash_array(HASH_TYPE keycode_hash) {
+ for (int i = 0; i < NUMBER_OF_KEYS; i++) {
+ bool index_in_hash = ((HASH_TYPE) 1 << i) & keycode_hash;
+ if (index_in_hash) {
+ uint8_t current_val = keycodes_buffer_array[i];
+ keycodes_buffer_array[i] = 0;
+ for (int j = 0; j < NUMBER_OF_KEYS; j++) {
+ if (keycodes_buffer_array[j] > current_val) {
+ keycodes_buffer_array[j]--;
+ }
+ }
+ keycode_index--;
+ }
+ }
+}
+
+bool are_hashed_keycodes_in_array(HASH_TYPE keycode_hash) {
+ for (int i = 0; i < NUMBER_OF_KEYS; i++) {
+ bool index_in_hash = ((HASH_TYPE) 1 << i) & keycode_hash;
+ bool index_in_array = (bool) keycodes_buffer_array[i];
+ if (index_in_hash && !index_in_array) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void kill_one_shots(void) {
+ struct Chord chord_storage;
+ struct Chord* chord_ptr;
+ struct Chord* chord;
+
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ chord = &chord_storage;
+
+ if (*chord->state == IN_ONE_SHOT) {
+ *chord->state = RESTART;
+ chord->function(chord);
+ if (*chord->state == RESTART) {
+ *chord->state = IDLE;
+ }
+ }
+ }
+}
+
+void process_finished_dances(void) {
+ struct Chord chord_storage;
+ struct Chord* chord_ptr;
+ struct Chord* chord;
+
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ chord = &chord_storage;
+
+ if (*chord->state == ACTIVATED) {
+ *chord->state = PRESS_FROM_ACTIVE;
+ chord->function(chord);
+ if (a_key_went_through) {
+ kill_one_shots();
+ }
+ dance_timer = timer_read();
+ } else if (*chord->state == IDLE_IN_DANCE) {
+ *chord->state = FINISHED;
+ chord->function(chord);
+ if (*chord->state == FINISHED) {
+ *chord->state = RESTART;
+ if (*chord->state == RESTART) {
+ *chord->state = IDLE;
+ }
+ }
+ } else if (*chord->state == PRESS_FROM_ACTIVE) {
+ *chord->state = FINISHED_FROM_ACTIVE;
+ chord->function(chord);
+ if (a_key_went_through) {
+ kill_one_shots();
+ }
+ dance_timer = timer_read();
+ }
+ }
+}
+
+uint8_t keycodes_buffer_array_min(uint8_t* first_keycode_index) {
+ for (int i = 0; i < NUMBER_OF_KEYS; i++) {
+ if (keycodes_buffer_array[i] == 1) {
+ if (first_keycode_index != NULL) {
+ *first_keycode_index = (uint8_t) i;
+ }
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void remove_subchords(void) {
+ struct Chord chord_storage;
+ struct Chord* chord_ptr;
+ struct Chord* chord;
+
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ chord = &chord_storage;
+
+ if (!(*chord->state == READY || *chord->state == READY_IN_DANCE || *chord->state == READY_LOCKED)) {
+ continue;
+ }
+
+ struct Chord chord_storage_2;
+ struct Chord* chord_ptr_2;
+ struct Chord* chord_2;
+ for (int j = 0; j < NUMBER_OF_CHORDS; j++) {
+ if (i == j) {continue;}
+
+ chord_ptr_2 = (struct Chord*) pgm_read_word (&list_of_chords[j]);
+ memcpy_P(&chord_storage_2, chord_ptr_2, sizeof(struct Chord));
+ chord_2 = &chord_storage_2;
+
+ if (are_hashed_keycodes_in_sound(chord_2->keycodes_hash, chord->keycodes_hash)) {
+ if (*chord_2->state == READY) {
+ *chord_2->state = IDLE;
+ }
+ if (*chord_2->state == READY_IN_DANCE) {
+ *chord_2->state = IDLE_IN_DANCE;
+ }
+ if (*chord_2->state == READY_LOCKED) {
+ *chord_2->state = LOCKED;
+ }
+ }
+ }
+ }
+}
+
+void process_ready_chords(void) {
+ uint8_t first_keycode_index = 0;
+ while (keycodes_buffer_array_min(&first_keycode_index)) {
+ // find ready chords
+ struct Chord chord_storage;
+ struct Chord* chord_ptr;
+ struct Chord* chord;
+
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ chord = &chord_storage;
+
+ // if the chord does not contain the first keycode
+ bool contains_first_keycode = ((uint32_t) 1 << first_keycode_index) & chord->keycodes_hash;
+ if (!contains_first_keycode) {
+ continue;
+ }
+
+ if (!are_hashed_keycodes_in_array(chord->keycodes_hash)){
+ continue;
+ }
+
+ if (*chord->state == LOCKED) {
+ *chord->state = READY_LOCKED;
+ continue;
+ }
+
+ if (!(chord->pseudolayer == current_pseudolayer || chord->pseudolayer == ALWAYS_ON)) {
+ continue;
+ }
+
+ if (*chord->state == IDLE) {
+ *chord->state = READY;
+ continue;
+ }
+
+ if (*chord->state == IDLE_IN_DANCE) {
+ *chord->state = READY_IN_DANCE;
+ }
+ }
+
+ // remove subchords
+ remove_subchords();
+
+ // execute logic
+ // this should be only one chord
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ chord = &chord_storage;
+
+ if (*chord->state == READY_LOCKED) {
+ *chord->state = RESTART;
+ chord->function(chord);
+ if (*chord->state == RESTART) {
+ *chord->state = IDLE;
+ }
+ break;
+ }
+
+ if (*chord->state == READY || *chord->state == READY_IN_DANCE) {
+ if (last_chord && last_chord != chord) {
+ process_finished_dances();
+ }
+
+ bool lock_next_prev_state = lock_next;
+
+ *chord->state = ACTIVATED;
+ chord->function(chord);
+ dance_timer = timer_read();
+
+ if (lock_next && lock_next == lock_next_prev_state) {
+ lock_next = false;
+ *chord->state = PRESS_FROM_ACTIVE;
+ chord->function(chord);
+ if (*chord->state == PRESS_FROM_ACTIVE) {
+ *chord->state = LOCKED;
+ }
+ if (a_key_went_through) {
+ kill_one_shots();
+ }
+ }
+ break;
+ }
+ }
+
+ // silence notes
+ silence_keycode_hash_array(chord->keycodes_hash);
+ }
+}
+
+void deactivate_active_chords(uint16_t keycode) {
+ HASH_TYPE hash = (HASH_TYPE)1 << (keycode - SAFE_RANGE);
+ bool broken;
+ struct Chord chord_storage;
+ struct Chord* chord_ptr;
+ struct Chord* chord;
+
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ chord = &chord_storage;
+
+ broken = are_hashed_keycodes_in_sound(hash, chord->keycodes_hash);
+ if (!broken) {
+ continue;
+ }
+
+ switch (*chord->state) {
+ case ACTIVATED:
+ *chord->state = DEACTIVATED;
+ chord->function(chord);
+
+ if (*chord->state == DEACTIVATED) {
+ dance_timer = timer_read();
+ *chord->state = IDLE_IN_DANCE;
+ }
+ if (*chord->state != IN_ONE_SHOT) {
+ kill_one_shots();
+ }
+ break;
+ case PRESS_FROM_ACTIVE:
+ case FINISHED_FROM_ACTIVE:
+ *chord->state = RESTART;
+ chord->function(chord);
+ if (*chord->state == RESTART) {
+ *chord->state = IDLE;
+ }
+ kill_one_shots();
+ break;
+ default:
+ break;
+ }
+ }
+
+}
+
+void process_command(void) {
+ command_mode = 0;
+ for (int i = 0; i < COMMAND_MAX_LENGTH; i++) {
+ if (command_buffer[i]) {
+ register_code(command_buffer[i]);
+ }
+ send_keyboard_report();
+ }
+ wait_ms(TAP_TIMEOUT);
+ for (int i = 0; i < COMMAND_MAX_LENGTH; i++) {
+ if (command_buffer[i]) {
+ unregister_code(command_buffer[i]);
+ }
+ send_keyboard_report();
+ }
+ for (int i = 0; i < COMMAND_MAX_LENGTH; i++) {
+ command_buffer[i] = 0;
+ }
+ command_ind = 0;
+}
+
+void process_leader(void) {
+ in_leader_mode = false;
+ for (int i = 0; i < NUMBER_OF_LEADER_COMBOS; i++) {
+ uint16_t trigger[LEADER_MAX_LENGTH];
+ memcpy_P(trigger, leader_triggers[i], LEADER_MAX_LENGTH * sizeof(uint16_t));
+
+ if (identical(leader_buffer, trigger)) {
+ (*leader_functions[i])();
+ break;
+ }
+ }
+ for (int i = 0; i < LEADER_MAX_LENGTH; i++) {
+ leader_buffer[i] = 0;
+ }
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (keycode < FIRST_INTERNAL_KEYCODE || keycode > LAST_INTERNAL_KEYCODE) {
+ return true;
+ }
+
+ if (record->event.pressed) {
+ sound_keycode_array(keycode);
+ } else {
+ process_ready_chords();
+ deactivate_active_chords(keycode);
+ }
+ chord_timer = timer_read();
+ leader_timer = timer_read();
+
+ return false;
+}
+
+void matrix_scan_user(void) {
+ bool chord_timer_expired = timer_elapsed(chord_timer) > CHORD_TIMEOUT;
+ if (chord_timer_expired && keycodes_buffer_array_min(NULL)) {
+ process_ready_chords();
+ }
+
+ bool dance_timer_expired = timer_elapsed(dance_timer) > DANCE_TIMEOUT;
+ if (dance_timer_expired) { // would love to have && in_dance but not sure how
+ process_finished_dances();
+ }
+
+ bool in_command_mode = command_mode == 2;
+ if (in_command_mode) {
+ process_command();
+ }
+
+ bool leader_timer_expired = timer_elapsed(leader_timer) > LEADER_TIMEOUT;
+ if (leader_timer_expired && in_leader_mode) {
+ process_leader();
+ }
+
+}
+
+void clear(const struct Chord* self) {
+ if (*self->state == ACTIVATED) {
+ // kill all chords
+ struct Chord chord_storage;
+ struct Chord* chord_ptr;
+ struct Chord* chord;
+
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ chord = &chord_storage;
+
+ *chord->state = IDLE;
+
+ if (chord->counter) {
+ *chord->counter = 0;
+ }
+ }
+
+ // clear keyboard
+ clear_keyboard();
+ send_keyboard_report();
+
+ // switch to default pseudolayer
+ current_pseudolayer = DEFAULT_PSEUDOLAYER;
+
+ // clear all keyboard states
+ lock_next = false;
+ autoshift_mode = true;
+ command_mode = 0;
+ in_leader_mode = false;
+ leader_ind = 0;
+ dynamic_macro_mode = false;
+ a_key_went_through = false;
+
+ for (int i = 0; i < DYNAMIC_MACRO_MAX_LENGTH; i++) {
+ dynamic_macro_buffer[i] = 0;
+ }
+ }
+}
\ No newline at end of file
diff --git a/users/dennytom/chording_engine/keymap_def.schema.json b/users/dennytom/chording_engine/keymap_def.schema.json
new file mode 100644
index 00000000000..9f9a8c5cbc7
--- /dev/null
+++ b/users/dennytom/chording_engine/keymap_def.schema.json
@@ -0,0 +1,337 @@
+{
+ "definitions": {},
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "type": "object",
+ "title": "The Keymap definition",
+ "required": [
+ "keys",
+ "parameters",
+ "layers",
+ "chord_sets",
+ "pseudolayers",
+ "leader_sequences",
+ "extra_code",
+ "extra_dependencies"
+ ],
+ "properties": {
+ "keys": {
+ "type": "array",
+ "title": "The Internal Keycodes",
+ "description": "Name Keycodes for the Chording Engine. These can be any string except already valid QMK keycodes.",
+ "items": {
+ "type": "string",
+ "title": "Individual Keycode",
+ "examples": [
+ "L1",
+ "R1",
+ "TOP1",
+ "THUMB_3",
+ "Bottom_6"
+ ]
+ }
+ },
+ "parameters": {
+ "type": "object",
+ "title": "Keyboard Parameters",
+ "description": "Keyboard, user and layout specific parameters like timers, max length for buffers and default pseudolayer.",
+ "required": [
+ "layout_function_name",
+ "chord_timeout",
+ "dance_timeout",
+ "leader_timeout",
+ "tap_timeout",
+ "command_max_length",
+ "leader_max_length",
+ "dynamic_macro_max_length",
+ "string_max_length",
+ "long_press_multiplier",
+ "default_pseudolayer"
+ ],
+ "properties": {
+ "layout_function_name": {
+ "type": "string",
+ "examples": [
+ "LAYOUT_ginny",
+ ""
+ ]
+ },
+ "chord_timeout": {
+ "type": "integer",
+ "title": "The Chord Timeout",
+ "description": "The time in ms you have to press additional keys before the engine assumes you finished pressing keys that are part of a chord.",
+ "default": 100
+ },
+ "dance_timeout": {
+ "type": "integer",
+ "title": "The Dance Timeout",
+ "description": "The time in ms you have to repeatedly activate a chord before the engine assumes you finished a dance.",
+ "default": 200
+ },
+ "leader_timeout": {
+ "type": "integer",
+ "title": "The Leader Timeout",
+ "description": "The time in ms you have to activate additional chords before the engine assumes you finished adding chords to a leader sequence.",
+ "default": 750
+ },
+ "tap_timeout": {
+ "type": "integer",
+ "title": "The Tap Timeout",
+ "description": "The time in ms you have to finish pressing a chord before the engine assumes that you didn't just tap it but are holding it down.",
+ "default": 50
+ },
+ "command_max_length": {
+ "type": "integer",
+ "title": "Command Max Length",
+ "description": "The maximum length for chords buffered in command mode.",
+ "default": 5
+ },
+ "leader_max_length": {
+ "type": "integer",
+ "title": "Leader Max Length",
+ "description": "The maximum length of leader sequences you can define in your keymap",
+ "default": 5
+ },
+ "dynamic_macro_max_length": {
+ "type": "integer",
+ "title": "Dynamic Macro Max Length",
+ "description": "The maximum number of chords (including Dynamic Macro Next) you can record to a Dynamic Macro",
+ "default": 20
+ },
+ "string_max_length": {
+ "type": "integer",
+ "title": "String Max Length",
+ "description": "The maximum length of a string that the STR() chord can accept.",
+ "default": 16
+ },
+ "long_press_multiplier": {
+ "type": "integer",
+ "title": "Long Press Multiplier",
+ "description": "How many times does the chord timer have expire before a chord is registered as not only held but in a long press (for example for Autoshift). Has to be integer.",
+ "default": 3
+ },
+ "default_pseudolayer": {
+ "type": "string",
+ "title": "Default Pseudolayer",
+ "description": "Which pseudolayer should be active when the keyboard starts / restarts.",
+ "examples": [
+ "BASE",
+ "QWERTY"
+ ]
+ }
+ }
+ },
+ "layers": {
+ "type": "array",
+ "title": "QMK Layers",
+ "description": "The layers QMK needs to know about. Can contain chording engine's internal keycodes or QMK's keycodes. Do not define chords here, those belong in pseudolayers.",
+ "minItems": 1,
+ "uniqueItems": false,
+ "items": {
+ "type": "object",
+ "title": "Individual Layers",
+ "required": [
+ "type"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "title": "Type of Individual Layers",
+ "description": "Auto layer fills all keycodes to be chording engine's internal keycodes, manual let's you place internal and QMK's keycodes however you wish.",
+ "examples": [
+ "auto",
+ "manual"
+ ]
+ },
+ "keycodes": {
+ "type": "array",
+ "title": "Individual Chord",
+ "description": "A list of of keys that need to be pressed to activate this chord",
+ "items": {
+ "type": "string",
+ "title": "Individual Keycodes",
+ "description": "A keycode that is a part of the individual chord. Has to be an internal keycode."
+ }
+ }
+ }
+ }
+ },
+ "chord_sets": {
+ "type": "array",
+ "title": "Chord Sets Definitions",
+ "description": "Describes predefined sets of chords to ease defining a number of chords in a pseudolayer.",
+ "items": {
+ "type": "object",
+ "required": [
+ "name",
+ "chords"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "title": "Name of the Set",
+ "examples": [
+ "rows",
+ "asetniop"
+ ]
+ },
+ "chords": {
+ "type": "array",
+ "title": "Chords",
+ "description": "List of all chords in this set",
+ "minItems": 1,
+ "uniqueItems": true,
+ "items": {
+ "type": "array",
+ "title": "Individual Chord",
+ "description": "A list of of keys that need to be pressed to activate this chord",
+ "items": {
+ "type": "string",
+ "title": "Individual Keycodes",
+ "description": "A keycode that is a part of the individual chord. Has to be an internal keycode."
+ }
+ }
+ }
+ }
+ }
+ },
+ "pseudolayers": {
+ "type": "array",
+ "title": "Pseudolayers",
+ "description": "The pseudolayers holding the chords to be processed by the chording engine.",
+ "minItems": 1,
+ "uniqueItems": true,
+ "items": {
+ "type": "object",
+ "required": [
+ "name"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "title": "Name of the Pseudolayer",
+ "default": null,
+ "examples": [
+ "ALWAYS_ON",
+ "QWERTY"
+ ]
+ },
+ "chords": {
+ "type": "array",
+ "title": "Chords",
+ "description": "List of chords belonging on the pseudolayer.",
+ "items": {
+ "type": "object",
+ "required": [
+ "type"
+ ],
+ "properties": {
+ "type": {
+ "type": "string",
+ "title": "Type of the chord array",
+ "description": "Defines how this objects describes one or more chords.",
+ "examples": [
+ "visual_array",
+ "visual",
+ "simple",
+ "chord_set"
+ ]
+ },
+ "keys": {
+ "type": "array",
+ "title": "Subset of keys",
+ "description": "Subset of internal keycodes that will be used when defining the chords. For visual_array type only.",
+ "examples": [
+ "[\"L1\", \"L2\", \"L3\", \"L4\", \"R1\", \"R2\", \"R3\", \"R4\"]"
+ ],
+ "items": {
+ "type": "string"
+ }
+ },
+ "dictionary": {
+ "type": "array",
+ "title": "Dictionary",
+ "description": "A table. Each row defines in a visual way which keys have to be pressed and what is the desired outcome. For visual_array type only.",
+ "items": {
+ "type": "array",
+ "items": {
+ "type": "string",
+ "examples": [
+ "[\"X"\, \" "\, \" "\, \"X"\, \"X"\, \" "\, \" "\, \"X"\, \"MO(BASE, NUM)\"]
+ ]
+ }
+ }
+ },
+ "keycode": {
+ "type": "string",
+ "title": "Keycode",
+ "description": "A keycode to be assigned to the chord when it is registered. For simple and visual types only."
+ },
+ "set": {
+ "type": "string",
+ "title": "Chord set",
+ "description": "Name of the chord set to be used. Has to be one already defined in the chord_sets array. For chord_set type only."
+ },
+ "keycodes": {
+ "type": "array",
+ "title": "Keycodes",
+ "description": "List of keycodes to be assigned to each chord when it is registered. For set type only.",
+ "items": {
+ "type": "string"
+ }
+ },
+ "chord": {
+ "type": "array",
+ "title": "Chord",
+ "description": "Array of \"X\"'s and \" \"'s that shows which keys have to be pressed to activate the chord. For visual type only ",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "leader_sequences": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "examples": ["fn_L1"]
+ },
+ "function": {
+ "type": "string",
+ "description": "C code the sequence should run. Instead of here, can be defined in extra_dependencies or extra_code",
+ "examples": ["void fn_L1(void) { SEND(KC_LCTL); SEND(KC_LALT); SEND(KC_DEL); }"]
+ },
+ "sequence": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "examples": [["KC_Q", "KC_Z"]]
+ }
+ }
+ }
+ },
+ "extra_code": {
+ "type": "string",
+ "label": "Extra Code",
+ "description": "C code to be inserted into the generated keymap",
+ "examples": ["void fn_L1(void) {\n SEND(KC_LCTL);\n SEND(KC_LALT);\n SEND(KC_DEL);\n}\n"],
+ "default": ""
+ },
+ "extra_dependencies": {
+ "type": "array",
+ "label": "Extra Dependencies",
+ "description": "List of files to be #include'd in the generated keymap",
+ "examples": [
+ "[\"user_functions.c\"]"
+ ],
+ "default": ""
+ }
+ }
+}
\ No newline at end of file
diff --git a/users/dennytom/chording_engine/parser.py b/users/dennytom/chording_engine/parser.py
new file mode 100644
index 00000000000..b62cf007e66
--- /dev/null
+++ b/users/dennytom/chording_engine/parser.py
@@ -0,0 +1,231 @@
+#!/usr/bin/env python3
+
+import json
+from functools import reduce
+from chord import *
+import sys
+
+comma_separator = (lambda x, y: str(x) + ", " + str(y))
+string_sum = (lambda x, y: str(x) + " + " + str(y))
+newline_separator = (lambda x, y: str(x) + "\n" + str(y))
+
+def add_includes(data):
+ output_buffer = ""
+ if not ("do_not_include_QMK" in data["parameters"] and data["parameters"]["do_not_include_QMK"] == True):
+ output_buffer += "#include QMK_KEYBOARD_H\n"
+ if len(data["extra_dependencies"]) > 0:
+ for dependecy in data["extra_dependencies"]:
+ output_buffer += '#include "' + dependecy + '"\n'
+
+ return output_buffer + "\n"
+
+def add_parameters(data):
+ output_buffer = ""
+
+ number_of_keys = len(data["keys"])
+ if number_of_keys <= 8:
+ hash_type = "uint8_t"
+ elif number_of_keys <= 16:
+ hash_type = "uint16_t"
+ elif number_of_keys <= 32:
+ hash_type = "uint32_t"
+ elif number_of_keys <= 64:
+ hash_type = "uint64_t"
+ else:
+ raise Exception("The engine currently supports only up to 64 keys.")
+
+ output_buffer += "#define CHORD_TIMEOUT " + str(data["parameters"]["chord_timeout"]) + "\n"
+ output_buffer += "#define DANCE_TIMEOUT " + str(data["parameters"]["dance_timeout"]) + "\n"
+ output_buffer += "#define LEADER_TIMEOUT " + str(data["parameters"]["leader_timeout"]) + "\n"
+ output_buffer += "#define TAP_TIMEOUT " + str(data["parameters"]["tap_timeout"]) + "\n"
+ output_buffer += "#define LONG_PRESS_MULTIPLIER " + str(data["parameters"]["long_press_multiplier"]) + "\n"
+ output_buffer += "#define DYNAMIC_MACRO_MAX_LENGTH " + str(data["parameters"]["dynamic_macro_max_length"]) + "\n"
+ output_buffer += "#define COMMAND_MAX_LENGTH " + str(data["parameters"]["command_max_length"]) + "\n"
+ output_buffer += "#define STRING_MAX_LENGTH " + str(data["parameters"]["string_max_length"]) + "\n"
+ output_buffer += "#define LEADER_MAX_LENGTH " + str(data["parameters"]["leader_max_length"]) + "\n"
+ output_buffer += "#define HASH_TYPE " + hash_type + "\n"
+ output_buffer += "#define NUMBER_OF_KEYS " + str(len(data["keys"])) + "\n"
+ output_buffer += "#define DEFAULT_PSEUDOLAYER " + data["parameters"]["default_pseudolayer"] + "\n"
+
+ return output_buffer + "\n"
+
+def add_keycodes(data):
+ output_buffer = ""
+
+ if not len(data["keys"]) == len(set(data["keys"])):
+ raise Exception("The keys must have unique names")
+
+ for key, counter in zip(data["keys"], range(0, len(data["keys"]))):
+ output_buffer += "#define H_" + key + " ((HASH_TYPE) 1 << " + str(counter) + ")\n"
+ output_buffer += "\n"
+
+ output_buffer += "enum internal_keycodes {\n"
+ output_buffer += " " + data["keys"][0] + " = SAFE_RANGE,\n"
+ output_buffer += " " + reduce(comma_separator, [key for key in data["keys"][1:]]) + ",\n"
+ output_buffer += " FIRST_INTERNAL_KEYCODE = " + data["keys"][0] + ",\n"
+ output_buffer += " LAST_INTERNAL_KEYCODE = " + data["keys"][-1] + "\n"
+ output_buffer += "};\n"
+
+ return output_buffer + "\n"
+
+def add_pseudolayers(data):
+ output_buffer = ""
+
+ if len(data["pseudolayers"]) == 0:
+ raise Exception("You didn't define any pseudolayers")
+
+ if not len([pseudolayer["name"] for pseudolayer in data["pseudolayers"]]) == len(set([pseudolayer["name"] for pseudolayer in data["pseudolayers"]])):
+ raise Exception("The pseudolayers must have unique names")
+
+ pseudolayers = data["pseudolayers"]
+ if not "ALWAYS_ON" in [layer["name"] for layer in pseudolayers]:
+ pseudolayers += [{"name": "ALWAYS_ON", "chords": []}] # the engine expects ALWAYS_ON to exist
+
+ output_buffer += "enum pseudolayers {\n"
+ output_buffer += " " + reduce(comma_separator, [layer["name"] for layer in pseudolayers]) + "\n"
+ output_buffer += "};\n"
+
+ return output_buffer + "\n"
+
+def add_layers(data):
+ output_buffer = ""
+
+ output_buffer += "const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {\n"
+ for layer, counter in zip(data["layers"], range(0,len(data["layers"]))):
+ if layer["type"] == "auto":
+ output_buffer += " [" + str(counter) + "] = " + data["parameters"]["layout_function_name"] + "(" + reduce(comma_separator, [key for key in data["keys"]]) + "),\n"
+ else:
+ output_buffer += " [" + str(counter) + "] = " + data["parameters"]["layout_function_name"] + "(" + reduce(comma_separator, [key for key in layer["keycodes"]]) + "),\n"
+ output_buffer += "};\n"
+ output_buffer += "size_t keymapsCount = " + str(len(data["layers"])) + ";\n"
+
+ return output_buffer + "\n"
+
+def prep_buffers(data):
+ output_buffer = ""
+
+ output_buffer += "uint8_t keycodes_buffer_array[] = {\n"
+ output_buffer += " " + reduce(comma_separator, ["0"] * len(data["keys"])) + "\n"
+ output_buffer += "};\n"
+ output_buffer += "\n"
+
+ output_buffer += "uint8_t command_buffer[] = {\n"
+ output_buffer += " " + reduce(comma_separator, ["0"] * data["parameters"]["command_max_length"]) + "\n"
+ output_buffer += "};\n"
+ output_buffer += "\n"
+
+ output_buffer += "uint16_t leader_buffer[] = {\n"
+ output_buffer += " " + reduce(comma_separator, ["0"] * data["parameters"]["leader_max_length"]) + "\n"
+ output_buffer += "};\n"
+ output_buffer += "\n"
+
+ output_buffer += "uint8_t dynamic_macro_buffer[] = {\n"
+ output_buffer += " " + reduce(comma_separator, ["0"] * data["parameters"]["dynamic_macro_max_length"]) + "\n"
+ output_buffer += "};"
+
+ return output_buffer + "\n"
+
+def parse_keyboard_specifics(data):
+ keyboard_part_0 = add_includes(data)
+ keyboard_part_0 += add_keycodes(data)
+ keyboard_part_0 += add_pseudolayers(data)
+ keyboard_part_0 += add_parameters(data)
+ keyboard_part_0 += add_layers(data)
+ keyboard_part_0 += prep_buffers(data)
+
+ return keyboard_part_0 + '\n'
+
+def parse_chords(data):
+ keyboard_part_2 = ""
+ strings = []
+ number_of_strings = 0
+ number_of_chords = 0
+
+ for pseudolayer in data["pseudolayers"]:
+ name = pseudolayer["name"]
+ for chord in pseudolayer["chords"]:
+ if chord["type"] == "chord_set":
+ keycodes = reduce(comma_separator, [word for word in chord["keycodes"]])
+ [keyboard_part_2, number_of_chords, number_of_strings, strings] = add_chord_set(name, keycodes, chord["set"], data, keyboard_part_2, number_of_chords, number_of_strings, strings)
+ if chord["type"] == "visual_array":
+ [keyboard_part_2, number_of_chords, number_of_strings, strings] = add_dictionary(name, chord["keys"], chord["dictionary"], keyboard_part_2, number_of_chords, number_of_strings, strings)
+ if chord["type"] == "visual":
+ keycodes = reduce(comma_separator, [word for word in chord["chord"]])
+ [keyboard_part_2, number_of_chords, number_of_strings, strings] = secret_chord(name, chord["keycode"], keycodes, data, keyboard_part_2, number_of_chords, number_of_strings, strings)
+ elif chord["type"] == "simple":
+ keycodes = reduce(string_sum, ["H_" + word for word in chord["chord"]])
+ [keyboard_part_2, number_of_chords, number_of_strings, strings] = add_key(name, keycodes, chord["keycode"], keyboard_part_2, number_of_chords, number_of_strings, strings)
+ keyboard_part_2 += "\n"
+
+ keyboard_part_2 += "const struct Chord* const list_of_chords[] PROGMEM = {\n"
+ keyboard_part_2 += " " + reduce(comma_separator, ["&chord_" + str(i) for i in range(0, number_of_chords)]) + "\n"
+ keyboard_part_2 += "};\n"
+ keyboard_part_2 += "\n"
+
+ if len(data["leader_sequences"]) > 0:
+ keyboard_part_2 += reduce(newline_separator, [sequence["function"] for sequence in data["leader_sequences"]]) + "\n\n"
+ keyboard_part_2 += "const uint16_t leader_triggers[][LEADER_MAX_LENGTH] PROGMEM = {\n"
+ for sequence in data["leader_sequences"]:
+ keyboard_part_2 += " {" + reduce(comma_separator, sequence["sequence"] + ["0"] * (data["parameters"]["leader_max_length"] - len(sequence["sequence"]))) + "},\n"
+ keyboard_part_2 += "};\n\n"
+ keyboard_part_2 += "void (*leader_functions[]) (void) = {\n"
+ keyboard_part_2 += " " + reduce(comma_separator, ["&" + sequence["name"] for sequence in data["leader_sequences"]]) + "\n"
+ keyboard_part_2 += "};\n"
+ else:
+ keyboard_part_2 += "const uint16_t** const leader_triggers PROGMEM = NULL;\n"
+ keyboard_part_2 += "void (*leader_functions[]) (void) = {};\n"
+ keyboard_part_2 += "\n"
+
+ keyboard_part_2 += "#define NUMBER_OF_CHORDS " + str(number_of_chords) + "\n"
+ keyboard_part_2 += "#define NUMBER_OF_LEADER_COMBOS " + str(len(data["leader_sequences"]))
+
+ return keyboard_part_2 + "\n\n"
+
+def parse_strings_for_chords(data):
+ keyboard_part_1 = ""
+
+ for string, i in zip(strings, range(0, len(strings))):
+ keyboard_part_1 += "const char string_" + str(i) + " [] PROGMEM = \"" + string + "\";\n"
+
+ keyboard_part_1 += "\n"
+ keyboard_part_1 += "const char * const strings[] PROGMEM = {\n"
+ if len(strings) > 0:
+ keyboard_part_1 += " " + reduce(comma_separator, ["string_" + str(i) for i in range(0, len(strings))])
+ keyboard_part_1 += "\n};\n"
+
+ return keyboard_part_1
+
+def main():
+ if len(sys.argv) != 3:
+ raise Exception("Wrong number of arguments.\n\nUsage: python parser.py keymap.json keymap.c")
+
+ input_filepath = sys.argv[1]
+ output_filepath = sys.argv[2]
+
+ with open(input_filepath, "r") as read_file:
+ data = json.load(read_file)
+
+ keyboard_part_0 = parse_keyboard_specifics(data)
+ keyboard_part_1 = parse_strings_for_chords(data)
+ keyboard_part_2 = parse_chords(data)
+
+ engine_part_1 = open("engine.part.1", "r").read()
+ engine_part_2 = open("engine.part.2", "r").read() + "\n"
+ engine_part_3 = open("engine.part.3", "r").read()
+
+ output_buffer = keyboard_part_0
+ output_buffer += engine_part_1
+
+ if len(data["extra_code"]) > 0:
+ output_buffer += data["extra_code"] + "\n"
+
+ output_buffer += keyboard_part_1
+ output_buffer += engine_part_2
+ output_buffer += keyboard_part_2
+ output_buffer += engine_part_3
+
+ with open(output_filepath, "w") as write_file:
+ write_file.write(output_buffer)
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/users/dennytom/chording_engine/state_machine.dot b/users/dennytom/chording_engine/state_machine.dot
new file mode 100644
index 00000000000..431e6f69b6b
--- /dev/null
+++ b/users/dennytom/chording_engine/state_machine.dot
@@ -0,0 +1,49 @@
+digraph {
+ IDLE
+ READY
+ ACTIVATED
+ DEACTIVATED
+ PRESS_FROM_ACTIVE
+ FINISHED_FROM_ACTIVE
+ IDLE_IN_DANCE
+ READY_IN_DANCE
+ FINISHED
+ LOCKED
+ READY_LOCKED
+ RESTART
+ IN_ONE_SHOT
+
+ // common
+ FINISHED -> RESTART;
+ RESTART -> IDLE;
+ DEACTIVATED -> IDLE_IN_DANCE;
+
+ // kill_one_shots()
+ IN_ONE_SHOT -> RESTART [label="non-one-shot key went through", color="blue"];
+
+ // process_finished_dances()
+ ACTIVATED -> PRESS_FROM_ACTIVE [label="dance timer", color="green"];
+ IDLE_IN_DANCE -> FINISHED [label="dance timer", color="green"];
+ PRESS_FROM_ACTIVE -> FINISHED_FROM_ACTIVE [label="dance timer", color="green"];
+
+ // remove_subchords()
+ READY -> IDLE [label="superchord active", color="red"];
+ READY_IN_DANCE -> IDLE_IN_DANCE [label="superchord active", color="red"];
+ READY_LOCKED -> LOCKED [label="superchord active", color="red"];
+
+ // process_ready_chords()
+ LOCKED -> READY_LOCKED [label="all keys pressed", color="orange"];
+ IDLE -> READY [label="all keys pressed", color="orange"];
+ IDLE_IN_DANCE -> READY_IN_DANCE [label="all keys pressed", color="orange"];
+
+ READY_LOCKED -> RESTART [label="chord timer", color="orange"];
+ READY -> ACTIVATED [label="chord timer", color="orange"];
+ READY_IN_DANCE -> ACTIVATED [label="chord timer", color="orange"];
+ ACTIVATED -> PRESS_FROM_ACTIVE [label="lock next", color="orange"];
+ PRESS_FROM_ACTIVE -> LOCKED [label="lock next", color="orange"];
+
+ // deactivate_active_chords()
+ ACTIVATED -> DEACTIVATED [label="a key lifted", color="purple"];
+ PRESS_FROM_ACTIVE -> RESTART [label="a key lifted", color="orange"];
+ FINISHED_FROM_ACTIVE -> DEACTIVATED [label="a key lifted", color="orange"];
+}
\ No newline at end of file
diff --git a/users/dennytom/chording_engine/state_machine.svg b/users/dennytom/chording_engine/state_machine.svg
new file mode 100644
index 00000000000..7731689883a
--- /dev/null
+++ b/users/dennytom/chording_engine/state_machine.svg
@@ -0,0 +1,235 @@
+
+
+
+
+
+
+%0
+
+
+
+IDLE
+
+IDLE
+
+
+
+READY
+
+READY
+
+
+
+IDLE->READY
+
+
+all keys pressed
+
+
+
+READY->IDLE
+
+
+superchord active
+
+
+
+ACTIVATED
+
+ACTIVATED
+
+
+
+READY->ACTIVATED
+
+
+chord timer
+
+
+
+DEACTIVATED
+
+DEACTIVATED
+
+
+
+ACTIVATED->DEACTIVATED
+
+
+a key lifted
+
+
+
+PRESS_FROM_ACTIVE
+
+PRESS_FROM_ACTIVE
+
+
+
+ACTIVATED->PRESS_FROM_ACTIVE
+
+
+dance timer
+
+
+
+ACTIVATED->PRESS_FROM_ACTIVE
+
+
+lock next
+
+
+
+IDLE_IN_DANCE
+
+IDLE_IN_DANCE
+
+
+
+DEACTIVATED->IDLE_IN_DANCE
+
+
+
+
+
+FINISHED_FROM_ACTIVE
+
+FINISHED_FROM_ACTIVE
+
+
+
+PRESS_FROM_ACTIVE->FINISHED_FROM_ACTIVE
+
+
+dance timer
+
+
+
+LOCKED
+
+LOCKED
+
+
+
+PRESS_FROM_ACTIVE->LOCKED
+
+
+lock next
+
+
+
+RESTART
+
+RESTART
+
+
+
+PRESS_FROM_ACTIVE->RESTART
+
+
+a key lifted
+
+
+
+FINISHED_FROM_ACTIVE->DEACTIVATED
+
+
+a key lifted
+
+
+
+READY_IN_DANCE
+
+READY_IN_DANCE
+
+
+
+IDLE_IN_DANCE->READY_IN_DANCE
+
+
+all keys pressed
+
+
+
+FINISHED
+
+FINISHED
+
+
+
+IDLE_IN_DANCE->FINISHED
+
+
+dance timer
+
+
+
+READY_IN_DANCE->ACTIVATED
+
+
+chord timer
+
+
+
+READY_IN_DANCE->IDLE_IN_DANCE
+
+
+superchord active
+
+
+
+FINISHED->RESTART
+
+
+
+
+
+READY_LOCKED
+
+READY_LOCKED
+
+
+
+LOCKED->READY_LOCKED
+
+
+all keys pressed
+
+
+
+READY_LOCKED->LOCKED
+
+
+superchord active
+
+
+
+READY_LOCKED->RESTART
+
+
+chord timer
+
+
+
+RESTART->IDLE
+
+
+
+
+
+IN_ONE_SHOT
+
+IN_ONE_SHOT
+
+
+
+IN_ONE_SHOT->RESTART
+
+
+non-one-shot key went through
+
+
+
diff --git a/users/dennytom/chording_engine/tests/minunit.h b/users/dennytom/chording_engine/tests/minunit.h
new file mode 100644
index 00000000000..ed71b62533e
--- /dev/null
+++ b/users/dennytom/chording_engine/tests/minunit.h
@@ -0,0 +1,288 @@
+#define mu_assert(message, test) \
+ do { \
+ if (!(test)) { \
+ return message; \
+ } \
+ } while (0)
+
+#define RED "\033[0;31m"
+#define GREEN "\033[0;32m"
+#define NC "\033[0m"
+
+enum ASSERT_TYPES {
+ UINT,
+ INT
+};
+
+#define BUFF_SIZE 1024
+char buffer[BUFF_SIZE];
+
+#define ASSERT_EQ(type, actual, expected) \
+ do { \
+ if (actual != expected) { \
+ switch (type) { \
+ case UINT: \
+ snprintf(buffer, BUFF_SIZE, "\nline %d\nvar %s\nactual = %u\nexpected = %u\n", __LINE__, #actual, actual, expected); \
+ break; \
+ case INT: \
+ snprintf(buffer, BUFF_SIZE, "\nline %d\nvar %s\nactual = %d\nexpected = %d\n", __LINE__, #actual, actual, expected); \
+ break; \
+ default: \
+ snprintf(buffer, BUFF_SIZE, "\nline %d\nunsupported ASSERT_EQ type\n", __LINE__); \
+ break; \
+ } \
+ printf("%s\n", buffer); \
+ passed = false; \
+ all_passed = false; \
+ } \
+ } while (0)
+
+#include
+#include
+#include
+#include
+#include
+
+#define MATRIX_ROWS 2
+#define MATRIX_COLS 10
+#define LAYOUT_test( \
+ k09, k08, k07, k06, k05, k04, k03, k02, k01, k00, \
+ k19, k18, k17, k16, k15, k14, k13, k12, k11, k10 \
+) { \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09}, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19}, \
+}
+
+#define PROGMEM
+#define memcpy_P memcpy
+const struct Chord* pgm_read_word(const struct Chord* const* chord) {return *chord;}
+
+typedef struct {
+ uint8_t col;
+ uint8_t row;
+} keypos_t;
+
+typedef struct {
+ keypos_t key;
+ bool pressed;
+ uint16_t time;
+} keyevent_t;
+
+typedef struct {
+ bool interrupted :1;
+ bool reserved2 :1;
+ bool reserved1 :1;
+ bool reserved0 :1;
+ uint8_t count :4;
+} tap_t;
+
+typedef struct {
+ keyevent_t event;
+ tap_t tap;
+} keyrecord_t;
+
+keyrecord_t pressed = {{{0,0},true,0}, {0,0,0,0,0}};
+keyrecord_t depressed = {{{0,0},false,0}, {0,0,0,0,0}};
+
+enum keycodes {
+ KC_NO,
+ KC_TILDE,
+ KC_GRAVE,
+ KC_EXCLAIM,
+ KC_1,
+ KC_AT,
+ KC_2,
+ KC_HASH,
+ KC_3,
+ KC_DOLLAR,
+ KC_4,
+ KC_PERCENT,
+ KC_5,
+ KC_CIRCUMFLEX,
+ KC_6,
+ KC_AMPERSAND,
+ KC_7,
+ KC_ASTERISK,
+ KC_8,
+ KC_LEFT_PAREN,
+ KC_9,
+ KC_RIGHT_PAREN,
+ KC_0,
+ KC_UNDERSCORE,
+ KC_MINUS,
+ KC_PLUS,
+ KC_EQUAL,
+ KC_LEFT_CURLY_BRACE,
+ KC_LBRACKET,
+ KC_RIGHT_CURLY_BRACE,
+ KC_RBRACKET,
+ KC_PIPE,
+ KC_BSLASH,
+ KC_COLON,
+ KC_SCOLON,
+ KC_DOUBLE_QUOTE,
+ KC_QUOTE,
+ KC_LEFT_ANGLE_BRACKET,
+ KC_COMMA,
+ KC_RIGHT_ANGLE_BRACKET,
+ KC_DOT,
+ KC_QUESTION,
+ KC_SLASH,
+ KC_Q,
+ KC_W,
+ KC_E,
+ KC_R,
+ KC_T,
+ KC_Y,
+ KC_U,
+ KC_I,
+ KC_O,
+ KC_P,
+ KC_A,
+ KC_S,
+ KC_D,
+ KC_F,
+ KC_G,
+ KC_H,
+ KC_J,
+ KC_K,
+ KC_L,
+ KC_Z,
+ KC_X,
+ KC_C,
+ KC_V,
+ KC_B,
+ KC_N,
+ KC_M,
+ KC_ESC,
+ KC_LSFT,
+ KC_LCTL,
+ KC_LGUI,
+ KC_LALT,
+ KC_RALT,
+ KC_RCTL,
+ KC_RGUI,
+ KC_RSFT,
+ KC_TAB,
+ KC_DEL,
+ KC_INS,
+ KC_BSPC,
+ KC_ENTER,
+ KC_SPACE,
+ KC_F1,
+ KC_F2,
+ KC_F3,
+ KC_F4,
+ KC_F5,
+ KC_F6,
+ KC_F7,
+ KC_F8,
+ KC_F9,
+ KC_F10,
+ KC_F11,
+ KC_F12,
+ KC_LEFT,
+ KC_DOWN,
+ KC_UP,
+ KC_RIGHT,
+
+ SAFE_RANGE
+};
+
+#define HISTORY 20
+
+int16_t current_time;
+uint8_t keyboard_history[HISTORY][SAFE_RANGE-1];
+int16_t time_history[HISTORY];
+uint8_t history_index;
+
+void register_code(int16_t keycode) {
+ history_index++;
+ for (int j = 0; j < SAFE_RANGE-1; j++) {
+ keyboard_history[history_index][j] = keyboard_history[history_index-1][j];
+ }
+ keyboard_history[history_index][keycode] = 1;
+ time_history[history_index] = current_time;
+};
+void unregister_code(int16_t keycode) {
+ history_index++;
+ for (int j = 0; j < SAFE_RANGE-1; j++) {
+ keyboard_history[history_index][j] = keyboard_history[history_index-1][j];
+ }
+ keyboard_history[history_index][keycode] = 0;
+ time_history[history_index] = current_time;
+};
+void send_keyboard_report(void) { /*still don't know what this does*/ };
+void matrix_scan_user (void);
+void wait_ms(uint16_t ms) {
+ current_time += ms;
+};
+uint16_t timer_read(void) {
+ uint16_t result = current_time;
+ return result;
+};
+uint16_t timer_elapsed(uint16_t timer) {
+ uint16_t result = current_time - timer;
+ return result;
+};
+void layer_move(int16_t layer) { /*ignoring for now*/ };
+void clear_keyboard(void) {
+ history_index++;
+ for (int j = 0; j < SAFE_RANGE-1; j++) {
+ keyboard_history[history_index][j] = 0;
+ }
+ time_history[history_index] = current_time;
+};
+void reset_keyboard(void) { /*ignoring for now*/ };
+
+void pause_ms(uint16_t ms) {
+ for (int i = 0; i < ms; i++) {
+ current_time++;
+ matrix_scan_user();
+ }
+};
+
+#define TEST(name) \
+ do { \
+ printf("%s\n", name); \
+ passed = true; \
+ do { \
+ uint8_t clear_state = ACTIVATED; \
+ struct Chord clear_chord PROGMEM = {0, QWERTY, &clear_state, NULL, 0, 0, clear}; \
+ clear_chord.function(&clear_chord); \
+ } while (0); \
+ current_time = 0; \
+ history_index = 0; \
+ for (int j = 0; j < SAFE_RANGE-1; j++) { \
+ keyboard_history[0][j] = 0; \
+ } \
+ time_history[0] = 0; \
+ for (int i = 1; i < HISTORY; i++) { \
+ for (int j = 0; j < SAFE_RANGE-1; j++) { \
+ keyboard_history[i][j] = -1; \
+ } \
+ time_history[i] = -1; \
+ }
+
+#define END_TEST \
+ if (passed) { \
+ printf(GREEN"PASSED"NC"\n"); \
+ } else { \
+ printf(RED"FAILED"NC"\n"); \
+ } \
+ } while(0);
+
+#define MAIN \
+int main(int argc, char **argv) { \
+ bool passed = true; \
+ bool all_passed = true;
+
+#define END \
+ printf("\n"); \
+ if (all_passed) { \
+ printf(GREEN"ALL TESTS PASSED"NC"\n"); \
+ } else { \
+ printf(RED"TESTS FAILED"NC"\n"); \
+ } \
+ return 1 - all_passed; \
+}
\ No newline at end of file
diff --git a/users/dennytom/chording_engine/tests/test.c b/users/dennytom/chording_engine/tests/test.c
new file mode 100644
index 00000000000..0cc172f0a83
--- /dev/null
+++ b/users/dennytom/chording_engine/tests/test.c
@@ -0,0 +1,1259 @@
+#include "minunit.h"
+#include "test_keymap.c"
+
+MAIN
+
+// CLEAR_KB
+TEST("clear")
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ struct Chord* chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ struct Chord chord_storage;
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ struct Chord* chord = &chord_storage;
+
+ *chord->state = READY;
+
+ if (chord->counter) {
+ *chord->counter = 1;
+ }
+ }
+
+ history_index++;
+ for (int j = 0; j < SAFE_RANGE-1; j++) {
+ keyboard_history[history_index][j] = 1;
+ }
+
+ current_pseudolayer = 5;
+ lock_next = true;
+ autoshift_mode = false;
+ command_mode = 1;
+ in_leader_mode = true;
+ dynamic_macro_mode = true;
+ a_key_went_through = true;
+
+ for (int i = 0; i < DYNAMIC_MACRO_MAX_LENGTH; i++) {
+ dynamic_macro_buffer[i] = 1;
+ }
+
+ uint8_t clear_state = ACTIVATED;
+ struct Chord clear_chord PROGMEM = {0, QWERTY, &clear_state, NULL, 0, 0, clear};
+ clear_chord.function(&clear_chord);
+
+ for (int i = 0; i < NUMBER_OF_CHORDS; i++) {
+ struct Chord* chord_ptr = (struct Chord*) pgm_read_word (&list_of_chords[i]);
+ struct Chord chord_storage;
+ memcpy_P(&chord_storage, chord_ptr, sizeof(struct Chord));
+ struct Chord* chord = &chord_storage;
+
+ ASSERT_EQ(UINT, *chord->state, IDLE);
+
+ if (chord->counter) {
+ ASSERT_EQ(UINT, *chord->counter, 0);
+ }
+ }
+
+ for (int j = 0; j < SAFE_RANGE-1; j++) {
+ ASSERT_EQ(UINT, keyboard_history[history_index][j], 0);
+ }
+
+ ASSERT_EQ(UINT, current_pseudolayer, 1);
+ ASSERT_EQ(UINT, lock_next, false);
+ ASSERT_EQ(UINT, autoshift_mode, true);
+ ASSERT_EQ(UINT, command_mode, 0);
+ ASSERT_EQ(UINT, in_leader_mode, false);
+ ASSERT_EQ(UINT, leader_ind, 0);
+ ASSERT_EQ(UINT, dynamic_macro_mode, false);
+ ASSERT_EQ(UINT, a_key_went_through, false);
+
+ for (int i = 0; i < DYNAMIC_MACRO_MAX_LENGTH; i++) {
+ ASSERT_EQ(UINT, dynamic_macro_buffer[i], 0);
+ }
+END_TEST
+
+TEST("pause_ms")
+ pause_ms(500);
+ ASSERT_EQ(UINT, current_time, 500);
+END_TEST
+
+// KC
+TEST("single_dance_held_states")
+ ASSERT_EQ(UINT, state_1, IDLE);
+ process_record_user(TOP1, &pressed);
+ pause_ms(CHORD_TIMEOUT);
+ ASSERT_EQ(UINT, state_1, IDLE);
+ pause_ms(1);
+ ASSERT_EQ(UINT, state_1, ACTIVATED);
+ pause_ms(DANCE_TIMEOUT);
+ ASSERT_EQ(UINT, state_1, ACTIVATED);
+ pause_ms(1);
+ ASSERT_EQ(UINT, state_1, PRESS_FROM_ACTIVE);
+ pause_ms(DANCE_TIMEOUT);
+ ASSERT_EQ(UINT, state_1, PRESS_FROM_ACTIVE);
+ pause_ms(1);
+ ASSERT_EQ(UINT, state_1, FINISHED_FROM_ACTIVE);
+ process_record_user(TOP1, &depressed);
+ ASSERT_EQ(UINT, state_1, IDLE);
+END_TEST
+
+TEST("single_dance_held_codes")
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 0);
+ process_record_user(TOP1, &pressed);
+ pause_ms(CHORD_TIMEOUT);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 0);
+ pause_ms(1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 1);
+ pause_ms(DANCE_TIMEOUT);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 1);
+ pause_ms(1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 1);
+ pause_ms(DANCE_TIMEOUT);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 1);
+ pause_ms(1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 1);
+ process_record_user(TOP1, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 0);
+END_TEST
+
+TEST("single_dance_tapped_states")
+ ASSERT_EQ(UINT, state_1, IDLE);
+ process_record_user(TOP1, &pressed);
+ pause_ms(CHORD_TIMEOUT);
+ ASSERT_EQ(UINT, state_1, IDLE);
+ pause_ms(1);
+ ASSERT_EQ(UINT, state_1, ACTIVATED);
+ process_record_user(TOP1, &depressed);
+ ASSERT_EQ(UINT, state_1, IDLE);
+END_TEST
+
+TEST("single_dance_tapped_codes")
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 0);
+ process_record_user(TOP1, &pressed);
+ pause_ms(CHORD_TIMEOUT);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 0);
+ pause_ms(1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 1);
+ process_record_user(TOP1, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 0);
+END_TEST
+
+// I can not actually track the states if the tap is faster than chord timeout
+
+TEST("single_dance_tapped_fast_codes")
+ ASSERT_EQ(UINT, state_0, IDLE);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1);
+ process_record_user(TOP1, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[0][KC_Q], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_Q], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_Q], 0);
+END_TEST
+
+TEST("subchords_are_ignored")
+ ASSERT_EQ(UINT, state_0, IDLE);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1);
+ process_record_user(TOP2, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 0);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_W], 0);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_ESC], 1);
+END_TEST
+
+TEST("multiple_chords_at_once")
+ ASSERT_EQ(UINT, state_0, IDLE);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1);
+ process_record_user(TOP3, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_E], 1);
+END_TEST
+
+// MO
+TEST("momentary_layer")
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+ process_record_user(BOT7, &pressed);
+ pause_ms(1);
+ process_record_user(BOT8, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+ process_record_user(BOT7, &depressed);
+ pause_ms(1);
+ process_record_user(BOT8, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+END_TEST
+
+TEST("momentary_layer_reset")
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+ process_record_user(BOT7, &pressed);
+ pause_ms(1);
+ process_record_user(BOT8, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+ pause_ms(DANCE_TIMEOUT + 1);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+ process_record_user(BOT7, &depressed);
+ pause_ms(1);
+ process_record_user(BOT8, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+END_TEST
+
+TEST("momentary_layer_alt")
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+
+ process_record_user(TOP8, &pressed);
+ pause_ms(1);
+ process_record_user(TOP9, &pressed);
+ pause_ms(1);
+ process_record_user(TOP0, &pressed);
+ pause_ms(1);
+ process_record_user(BOT8, &pressed);
+ pause_ms(1);
+ process_record_user(BOT9, &pressed);
+ pause_ms(1);
+ process_record_user(BOT0, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+
+ process_record_user(TOP8, &depressed);
+ pause_ms(1);
+ process_record_user(TOP9, &depressed);
+ pause_ms(1);
+ process_record_user(TOP0, &depressed);
+ pause_ms(1);
+ process_record_user(BOT8, &depressed);
+ pause_ms(1);
+ process_record_user(BOT9, &depressed);
+ pause_ms(1);
+ process_record_user(BOT0, &depressed);
+
+ ASSERT_EQ(UINT, current_pseudolayer, FNC);
+END_TEST
+
+// DF
+TEST("permanent_layer")
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+ process_record_user(BOT9, &pressed);
+ pause_ms(1);
+ process_record_user(BOT0, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+ process_record_user(BOT9, &depressed);
+ pause_ms(1);
+ process_record_user(BOT0, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+ pause_ms(1000);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+END_TEST
+
+// AT
+TEST("autoshift_toggle")
+ ASSERT_EQ(UINT, autoshift_mode, 1);
+ uint8_t state = ACTIVATED;
+ struct Chord chord PROGMEM = {0, QWERTY, &state, NULL, 0, 0, autoshift_toggle};
+ chord.function(&chord);
+ ASSERT_EQ(UINT, autoshift_mode, 0);
+ state = ACTIVATED;
+ chord.function(&chord);
+ ASSERT_EQ(UINT, autoshift_mode, 1);
+END_TEST
+
+// AS
+TEST("autoshift_tap")
+ process_record_user(BOT1, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ process_record_user(BOT1, &depressed);
+
+ ASSERT_EQ(UINT, keyboard_history[0][KC_Z], 0);
+ ASSERT_EQ(UINT, keyboard_history[0][KC_LSFT], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_Z], 1);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_LSFT], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[2][KC_Z], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_LSFT], 0);
+END_TEST
+
+TEST("autoshift_hold")
+ process_record_user(BOT1, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ pause_ms(LONG_PRESS_MULTIPLIER * (DANCE_TIMEOUT + 1));
+ process_record_user(BOT1, &depressed);
+
+ ASSERT_EQ(UINT, keyboard_history[0][KC_Z], 0);
+ ASSERT_EQ(UINT, keyboard_history[0][KC_LSFT], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_Z], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_LSFT], 1);
+
+ ASSERT_EQ(UINT, keyboard_history[2][KC_Z], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_LSFT], 1);
+
+ ASSERT_EQ(UINT, keyboard_history[3][KC_Z], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_LSFT], 1);
+
+ ASSERT_EQ(UINT, keyboard_history[4][KC_Z], 0);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_LSFT], 0);
+END_TEST
+
+TEST("autoshift_hold_off")
+ autoshift_mode = 0;
+ process_record_user(BOT1, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ pause_ms(LONG_PRESS_MULTIPLIER * (DANCE_TIMEOUT + 1));
+ process_record_user(BOT1, &depressed);
+
+ ASSERT_EQ(UINT, keyboard_history[0][KC_Z], 0);
+ ASSERT_EQ(UINT, keyboard_history[0][KC_LSFT], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_Z], 1);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_LSFT], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[2][KC_Z], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_LSFT], 0);
+END_TEST
+
+// LOCK
+TEST("lock")
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 0);
+ process_record_user(BOT1, &pressed);
+ process_record_user(BOT2, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 1);
+ process_record_user(BOT1, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 0);
+ pause_ms(1);
+ process_record_user(BOT2, &depressed);
+ pause_ms(1);
+ process_record_user(TOP1, &pressed);
+ process_record_user(TOP2, &pressed);
+ process_record_user(BOT1, &pressed);
+ process_record_user(BOT2, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ process_record_user(TOP1, &depressed);
+ pause_ms(1);
+ process_record_user(TOP2, &depressed);
+ process_record_user(BOT1, &depressed);
+ process_record_user(BOT2, &depressed);
+ pause_ms(1);
+ process_record_user(BOT1, &pressed);
+ process_record_user(BOT2, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 1);
+ process_record_user(BOT1, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 1);
+ pause_ms(1);
+ process_record_user(BOT2, &depressed);
+ pause_ms(1000);
+ process_record_user(BOT1, &pressed);
+ process_record_user(BOT2, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 0);
+ process_record_user(BOT1, &depressed);
+ pause_ms(1);
+ process_record_user(BOT2, &depressed);
+ pause_ms(1000);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 0);
+END_TEST
+
+// OSK
+TEST("one_shot_key_tap")
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 0);
+ process_record_user(BOT2, &pressed);
+ process_record_user(BOT3, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 0);
+ process_record_user(BOT2, &depressed);
+ pause_ms(1);
+ process_record_user(BOT3, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 1);
+ pause_ms(1000);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 1);
+
+ process_record_user(TOP1, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ process_record_user(TOP1, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 0);
+END_TEST
+
+TEST("one_shot_key_hold")
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 0);
+ process_record_user(BOT2, &pressed);
+ process_record_user(BOT3, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ pause_ms(DANCE_TIMEOUT + 1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 1);
+
+ process_record_user(TOP1, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ process_record_user(TOP1, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 1);
+
+ process_record_user(BOT2, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 0);
+END_TEST
+
+TEST("one_shot_key_retrotapping")
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 0);
+ process_record_user(BOT2, &pressed);
+ process_record_user(BOT3, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ pause_ms(DANCE_TIMEOUT + 1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 1);
+
+ pause_ms(1000);
+
+ process_record_user(BOT2, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 1);
+END_TEST
+
+// OSL
+TEST("one_shot_layer_tap")
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+ process_record_user(BOT6, &pressed);
+ process_record_user(BOT7, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+ process_record_user(BOT6, &depressed);
+ pause_ms(1);
+ process_record_user(BOT7, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+ pause_ms(1000);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+
+ process_record_user(TOP1, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ process_record_user(TOP1, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+END_TEST
+
+TEST("one_shot_layer_hold")
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+ process_record_user(BOT6, &pressed);
+ process_record_user(BOT7, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ pause_ms(DANCE_TIMEOUT + 1);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+
+ process_record_user(TOP1, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ process_record_user(TOP1, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+
+ process_record_user(BOT6, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+END_TEST
+
+TEST("one_shot_layer_retrotapping")
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+ process_record_user(BOT6, &pressed);
+ process_record_user(BOT7, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ pause_ms(DANCE_TIMEOUT + 1);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+
+ pause_ms(1000);
+
+ process_record_user(BOT6, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+END_TEST
+
+// CMD
+TEST("command_mode")
+ // start recording
+ process_record_user(TOP5, &pressed);
+ process_record_user(TOP6, &pressed);
+ process_record_user(BOT5, &pressed);
+ process_record_user(BOT6, &pressed);
+ pause_ms(1);
+ process_record_user(TOP5, &depressed);
+ process_record_user(TOP6, &depressed);
+ process_record_user(BOT5, &depressed);
+ process_record_user(BOT6, &depressed);
+
+ ASSERT_EQ(UINT, command_mode, 1);
+
+ // record shift+q
+ process_record_user(BOT1, &pressed);
+ process_record_user(BOT2, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 0);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 0);
+ process_record_user(BOT1, &depressed);
+ process_record_user(BOT2, &depressed);
+ pause_ms(1000);
+
+ process_record_user(TOP1, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 0);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 0);
+ process_record_user(TOP1, &depressed);
+ pause_ms(1000);
+
+
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_Q], 0);
+ ASSERT_EQ(UINT, keyboard_history[history_index][KC_LSFT], 0);
+ // execute
+ process_record_user(TOP5, &pressed);
+ process_record_user(TOP6, &pressed);
+ process_record_user(BOT5, &pressed);
+ process_record_user(BOT6, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+
+ ASSERT_EQ(UINT, command_mode, 0);
+
+ // test history
+ ASSERT_EQ(UINT, keyboard_history[0][KC_Q], 0);
+ ASSERT_EQ(UINT, keyboard_history[0][KC_LSFT], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_Q], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_LSFT], 1);
+
+ ASSERT_EQ(UINT, keyboard_history[2][KC_Q], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_LSFT], 1);
+
+ ASSERT_EQ(UINT, keyboard_history[3][KC_Q], 1);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_LSFT], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[4][KC_Q], 0);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_LSFT], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[5][KC_Q], 255);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_LSFT], 255);
+END_TEST
+
+// KK
+TEST("key_key_dance_tap")
+ process_record_user(BOT2, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ process_record_user(BOT2, &depressed);
+
+ ASSERT_EQ(UINT, keyboard_history[0][KC_X], 0);
+ ASSERT_EQ(UINT, keyboard_history[0][KC_LCTL], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_X], 1);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_LCTL], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[2][KC_X], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_LCTL], 0);
+END_TEST
+
+TEST("key_key_dance_hold")
+ process_record_user(BOT2, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ pause_ms(DANCE_TIMEOUT + 1);
+ process_record_user(BOT2, &depressed);
+
+ ASSERT_EQ(UINT, keyboard_history[0][KC_X], 0);
+ ASSERT_EQ(UINT, keyboard_history[0][KC_LCTL], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_X], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_LCTL], 1);
+
+ ASSERT_EQ(UINT, keyboard_history[2][KC_X], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_LCTL], 0);
+END_TEST
+
+// KL
+TEST("key_layer_tap")
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+ process_record_user(BOT3, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+ process_record_user(BOT3, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+ pause_ms(1000);
+
+ ASSERT_EQ(UINT, keyboard_history[0][KC_C], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_C], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_C], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_C], 255);
+END_TEST
+
+TEST("key_layer_retrotapping")
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+ process_record_user(BOT3, &pressed);
+ pause_ms(1000);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+ process_record_user(BOT3, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+ pause_ms(1000);
+
+ ASSERT_EQ(UINT, keyboard_history[0][KC_C], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_C], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_C], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_C], 255);
+END_TEST
+
+TEST("key_layer_hold_quick_typist")
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+ process_record_user(BOT3, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+
+ pause_ms(1);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1);
+ process_record_user(TOP1, &depressed);
+ pause_ms(1);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1);
+ process_record_user(TOP1, &depressed);
+ pause_ms(1);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1);
+ process_record_user(TOP1, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+ pause_ms(1);
+
+ process_record_user(BOT3, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+
+ ASSERT_EQ(UINT, keyboard_history[0][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[6][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[7][KC_1], 255);
+END_TEST
+
+TEST("key_layer_hold_slow_typist")
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+ process_record_user(BOT3, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+
+ pause_ms(1000);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1000);
+ process_record_user(TOP1, &depressed);
+ pause_ms(1000);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1000);
+ process_record_user(TOP1, &depressed);
+ pause_ms(1000);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1000);
+ process_record_user(TOP1, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, NUM);
+ pause_ms(1);
+
+ process_record_user(BOT3, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+
+ ASSERT_EQ(UINT, keyboard_history[0][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[6][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[7][KC_1], 255);
+END_TEST
+
+// KM
+TEST("key_mod_tap")
+ ASSERT_EQ(UINT, keyboard_history[0][KC_LALT], 0);
+ ASSERT_EQ(UINT, keyboard_history[0][KC_V], 0);
+ process_record_user(BOT4, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_V], 0);
+ process_record_user(BOT4, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_LALT], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_V], 0);
+ pause_ms(1000);
+
+ ASSERT_EQ(UINT, keyboard_history[3][KC_LALT], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_V], 1);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_LALT], 0);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_LALT], 255);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_V], 255);
+END_TEST
+
+TEST("key_mod_retrotapping")
+ ASSERT_EQ(UINT, keyboard_history[0][KC_LALT], 0);
+ ASSERT_EQ(UINT, keyboard_history[0][KC_V], 0);
+ process_record_user(BOT4, &pressed);
+ pause_ms(1000);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_V], 0);
+ process_record_user(BOT4, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_LALT], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_V], 0);
+ pause_ms(1000);
+
+ ASSERT_EQ(UINT, keyboard_history[3][KC_LALT], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_V], 1);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_LALT], 0);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_LALT], 255);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_V], 255);
+END_TEST
+
+TEST("key_mod_hold_quick_typist")
+ process_record_user(BOT4, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+
+ pause_ms(1);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1);
+ process_record_user(TOP1, &depressed);
+ pause_ms(1);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1);
+ process_record_user(TOP1, &depressed);
+ pause_ms(1);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1);
+ process_record_user(TOP1, &depressed);
+ pause_ms(1);
+
+ process_record_user(BOT4, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+
+ ASSERT_EQ(UINT, keyboard_history[0][KC_LALT], 0);
+ ASSERT_EQ(UINT, keyboard_history[0][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[6][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[6][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[7][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[7][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[8][KC_LALT], 0);
+ ASSERT_EQ(UINT, keyboard_history[8][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[9][KC_LALT], 255);
+ ASSERT_EQ(UINT, keyboard_history[9][KC_V], 255);
+END_TEST
+
+TEST("key_mod_hold_slow_typist")
+ process_record_user(BOT4, &pressed);
+ pause_ms(CHORD_TIMEOUT + 1);
+
+ pause_ms(1000);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1000);
+ process_record_user(TOP1, &depressed);
+ pause_ms(1000);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1000);
+ process_record_user(TOP1, &depressed);
+ pause_ms(1000);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1000);
+ process_record_user(TOP1, &depressed);
+ pause_ms(1000);
+
+ process_record_user(BOT4, &depressed);
+ ASSERT_EQ(UINT, current_pseudolayer, QWERTY);
+
+ ASSERT_EQ(UINT, keyboard_history[0][KC_LALT], 0);
+ ASSERT_EQ(UINT, keyboard_history[0][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[0][KC_Q], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_Q], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_Q], 1);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_Q], 0);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_Q], 1);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_Q], 0);
+ ASSERT_EQ(UINT, keyboard_history[6][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[6][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[6][KC_Q], 1);
+ ASSERT_EQ(UINT, keyboard_history[7][KC_LALT], 1);
+ ASSERT_EQ(UINT, keyboard_history[7][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[7][KC_Q], 0);
+ ASSERT_EQ(UINT, keyboard_history[8][KC_LALT], 0);
+ ASSERT_EQ(UINT, keyboard_history[8][KC_V], 0);
+ ASSERT_EQ(UINT, keyboard_history[8][KC_Q], 0);
+ ASSERT_EQ(UINT, keyboard_history[9][KC_LALT], 255);
+ ASSERT_EQ(UINT, keyboard_history[9][KC_V], 255);
+ ASSERT_EQ(UINT, keyboard_history[9][KC_Q], 255);
+END_TEST
+
+// LEADER
+TEST("leader_triggers_global")
+ uint8_t state = ACTIVATED;
+ struct Chord chord PROGMEM = {0, QWERTY, &state, NULL, 0, 0, leader};
+ chord.function(&chord);
+
+ ASSERT_EQ(UINT, in_leader_mode, 1);
+END_TEST
+
+TEST("leader_no_follow")
+ uint8_t state = ACTIVATED;
+ struct Chord chord PROGMEM = {0, QWERTY, &state, NULL, 0, 0, leader};
+ chord.function(&chord);
+
+ ASSERT_EQ(UINT, in_leader_mode, 1);
+
+ pause_ms(1000);
+
+ ASSERT_EQ(UINT, in_leader_mode, 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_O], 255);
+END_TEST
+
+TEST("leader_wrong_follow")
+ process_record_user(TOP2, &pressed);
+ process_record_user(TOP3, &pressed);
+ process_record_user(BOT2, &pressed);
+ process_record_user(BOT3, &pressed);
+ pause_ms(1);
+ process_record_user(TOP2, &depressed);
+ process_record_user(TOP3, &depressed);
+ process_record_user(BOT2, &depressed);
+ process_record_user(BOT3, &depressed);
+
+ ASSERT_EQ(UINT, in_leader_mode, 1);
+
+ pause_ms(1);
+ process_record_user(TOP1, &pressed);
+ pause_ms(1);
+ process_record_user(TOP1, &depressed);
+ pause_ms(1);
+ process_record_user(TOP2, &pressed);
+ pause_ms(1);
+ process_record_user(TOP2, &depressed);
+
+ pause_ms(LEADER_TIMEOUT);
+ pause_ms(1);
+
+ ASSERT_EQ(UINT, in_leader_mode, 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_Q], 255);
+END_TEST
+
+TEST("leader_correct_follow")
+ process_record_user(TOP2, &pressed);
+ process_record_user(TOP3, &pressed);
+ process_record_user(BOT2, &pressed);
+ process_record_user(BOT3, &pressed);
+ pause_ms(1);
+ process_record_user(TOP2, &depressed);
+ process_record_user(TOP3, &depressed);
+ process_record_user(BOT2, &depressed);
+ process_record_user(BOT3, &depressed);
+
+ ASSERT_EQ(UINT, in_leader_mode, 1);
+
+ pause_ms(1);
+ process_record_user(TOP0, &pressed);
+ pause_ms(1);
+ process_record_user(TOP0, &depressed);
+ pause_ms(1);
+ process_record_user(TOP9, &pressed);
+ pause_ms(1);
+ process_record_user(TOP9, &depressed);
+
+ pause_ms(LEADER_TIMEOUT);
+ ASSERT_EQ(UINT, in_leader_mode, 1);
+
+ pause_ms(1);
+ ASSERT_EQ(UINT, in_leader_mode, 0);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_O], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_P], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_A], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_S], 1);
+
+ ASSERT_EQ(UINT, keyboard_history[2][KC_O], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_P], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_A], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_S], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[3][KC_O], 255);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_P], 255);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_A], 255);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_S], 255);
+
+ ASSERT_EQ(UINT, keyboard_history[4][KC_O], 255);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_P], 255);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_A], 255);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_S], 255);
+
+ ASSERT_EQ(UINT, keyboard_history[5][KC_Q], 255);
+END_TEST
+
+// DYNAMIC MACRO
+TEST("dynamic_macro_record_mode")
+ current_pseudolayer = NUM;
+
+ // record
+ ASSERT_EQ(UINT, dynamic_macro_mode, 0);
+ process_record_user(BOT7, &pressed);
+ process_record_user(BOT7, &depressed);
+ ASSERT_EQ(UINT, dynamic_macro_mode, 1);
+ pause_ms(1000);
+ ASSERT_EQ(UINT, dynamic_macro_mode, 1);
+END_TEST
+
+TEST("dynamic_macro_record_mode_off")
+ current_pseudolayer = NUM;
+
+ process_record_user(BOT7, &pressed);
+ process_record_user(BOT7, &depressed);
+ ASSERT_EQ(UINT, dynamic_macro_mode, 1);
+
+ process_record_user(BOT9, &pressed);
+ process_record_user(BOT9, &depressed);
+ ASSERT_EQ(UINT, dynamic_macro_mode, 0);
+END_TEST
+
+TEST("dynamic_macro_record_one")
+ current_pseudolayer = NUM;
+
+ process_record_user(BOT7, &pressed);
+ process_record_user(BOT7, &depressed);
+ ASSERT_EQ(UINT, dynamic_macro_mode, 1);
+
+ process_record_user(TOP1, &pressed);
+ process_record_user(TOP1, &depressed);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_1], 255);
+
+ process_record_user(BOT9, &pressed);
+ process_record_user(BOT9, &depressed);
+
+ pause_ms(1000);
+
+ process_record_user(BOT0, &pressed);
+ process_record_user(BOT0, &depressed);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_1], 255);
+
+ pause_ms(1000);
+
+ process_record_user(BOT0, &pressed);
+ process_record_user(BOT0, &depressed);
+
+ ASSERT_EQ(UINT, keyboard_history[3][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_1], 255);
+END_TEST
+
+TEST("dynamic_macro_record_two")
+ current_pseudolayer = NUM;
+
+ process_record_user(BOT7, &pressed);
+ process_record_user(BOT7, &depressed);
+ ASSERT_EQ(UINT, dynamic_macro_mode, 1);
+
+ process_record_user(TOP1, &pressed);
+ process_record_user(TOP1, &depressed);
+
+ process_record_user(TOP2, &pressed);
+ process_record_user(TOP2, &depressed);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_1], 255);
+
+ process_record_user(BOT9, &pressed);
+ process_record_user(BOT9, &depressed);
+
+ pause_ms(1000);
+
+ process_record_user(BOT0, &pressed);
+ process_record_user(BOT0, &depressed);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_2], 1);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_2], 0);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_1], 255);
+END_TEST
+
+TEST("dynamic_macro_record_two_parts")
+ current_pseudolayer = NUM;
+
+ process_record_user(BOT7, &pressed);
+ process_record_user(BOT7, &depressed);
+ ASSERT_EQ(UINT, dynamic_macro_mode, 1);
+
+ process_record_user(TOP1, &pressed);
+ process_record_user(TOP1, &depressed);
+
+ process_record_user(TOP2, &pressed);
+ process_record_user(TOP2, &depressed);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_1], 255);
+
+ process_record_user(BOT8, &pressed);
+ process_record_user(BOT8, &depressed);
+
+ process_record_user(TOP3, &pressed);
+ process_record_user(TOP3, &depressed);
+
+ process_record_user(BOT9, &pressed);
+ process_record_user(BOT9, &depressed);
+
+ pause_ms(1000);
+
+ process_record_user(BOT0, &pressed);
+ process_record_user(BOT0, &depressed);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_2], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_3], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[2][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_2], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_3], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[3][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_2], 1);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_3], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[4][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_2], 0);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_3], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[5][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_2], 0);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_3], 1);
+
+ ASSERT_EQ(UINT, keyboard_history[6][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[6][KC_2], 0);
+ ASSERT_EQ(UINT, keyboard_history[6][KC_3], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[7][KC_1], 255);
+END_TEST
+
+// dance + M()
+
+TEST("dance_tap")
+ process_record_user(BOT0, &pressed);
+ process_record_user(BOT0, &depressed);
+
+ pause_ms(1000);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_9], 1);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_0], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_9], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_0], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_9], 255);
+END_TEST
+
+TEST("dance_hold")
+ process_record_user(BOT0, &pressed);
+ pause_ms(1000);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_9], 1);
+
+ process_record_user(BOT0, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_9], 0);
+END_TEST
+
+TEST("dance_tap_tap")
+ process_record_user(BOT0, &pressed);
+ process_record_user(BOT0, &depressed);
+ process_record_user(BOT0, &pressed);
+ process_record_user(BOT0, &depressed);
+
+ pause_ms(1000);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_9], 0);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_0], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_9], 0);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_0], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_9], 255);
+END_TEST
+
+TEST("dance_tap_hold")
+ process_record_user(BOT0, &pressed);
+ process_record_user(BOT0, &depressed);
+ pause_ms(1);
+ process_record_user(BOT0, &pressed);
+ pause_ms(1000);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_0], 1);
+
+ process_record_user(BOT0, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_0], 0);
+END_TEST
+
+// MK
+TEST("multiple_keys")
+ current_pseudolayer = NUM;
+
+ process_record_user(BOT1, &pressed);
+ process_record_user(BOT1, &depressed);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_LCTL], 1);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_LSFT], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[2][KC_LCTL], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_LSFT], 1);
+
+ ASSERT_EQ(UINT, keyboard_history[3][KC_LCTL], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_LSFT], 1);
+
+ ASSERT_EQ(UINT, keyboard_history[4][KC_LCTL], 0);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_LSFT], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[5][KC_LCTL], 255);
+END_TEST
+
+TEST("multiple_keys_interleaved")
+ current_pseudolayer = NUM;
+
+ process_record_user(BOT1, &pressed);
+ pause_ms(CHORD_TIMEOUT+1);
+
+ process_record_user(TOP1, &pressed);
+ process_record_user(TOP1, &depressed);
+ process_record_user(TOP1, &pressed);
+ process_record_user(TOP1, &depressed);
+ process_record_user(TOP1, &pressed);
+ process_record_user(TOP1, &depressed);
+
+ process_record_user(BOT1, &depressed);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_LCTL], 1);
+ ASSERT_EQ(UINT, keyboard_history[1][KC_LSFT], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[2][KC_LCTL], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_LSFT], 1);
+
+ ASSERT_EQ(UINT, keyboard_history[3][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[6][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[7][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[8][KC_1], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[9][KC_LCTL], 0);
+ ASSERT_EQ(UINT, keyboard_history[9][KC_LSFT], 1);
+
+ ASSERT_EQ(UINT, keyboard_history[10][KC_LCTL], 0);
+ ASSERT_EQ(UINT, keyboard_history[10][KC_LSFT], 0);
+
+ ASSERT_EQ(UINT, keyboard_history[11][KC_LCTL], 255);
+END_TEST
+
+// D
+TEST("dance_one")
+ current_pseudolayer = NUM;
+
+ process_record_user(BOT3, &pressed);
+ process_record_user(BOT3, &depressed);
+
+ pause_ms(CHORD_TIMEOUT+DANCE_TIMEOUT+2);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_1], 255);
+
+ process_record_user(BOT3, &pressed);
+ process_record_user(BOT3, &depressed);
+
+ pause_ms(CHORD_TIMEOUT+DANCE_TIMEOUT+2);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_1], 1);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_1], 0);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_1], 255);
+END_TEST
+
+TEST("dance_two")
+ current_pseudolayer = NUM;
+
+ process_record_user(BOT3, &pressed);
+ process_record_user(BOT3, &depressed);
+ process_record_user(BOT3, &pressed);
+ process_record_user(BOT3, &depressed);
+
+ pause_ms(CHORD_TIMEOUT+DANCE_TIMEOUT+2);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_2], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_2], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_2], 255);
+
+ process_record_user(BOT3, &pressed);
+ process_record_user(BOT3, &depressed);
+ process_record_user(BOT3, &pressed);
+ process_record_user(BOT3, &depressed);
+
+ pause_ms(CHORD_TIMEOUT+DANCE_TIMEOUT+2);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_2], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_2], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_2], 1);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_2], 0);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_2], 255);
+END_TEST
+
+TEST("dance_three")
+ current_pseudolayer = NUM;
+
+ process_record_user(BOT3, &pressed);
+ process_record_user(BOT3, &depressed);
+ process_record_user(BOT3, &pressed);
+ process_record_user(BOT3, &depressed);
+ process_record_user(BOT3, &pressed);
+ process_record_user(BOT3, &depressed);
+
+ pause_ms(CHORD_TIMEOUT+DANCE_TIMEOUT+2);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_3], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_3], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_3], 255);
+
+ process_record_user(BOT3, &pressed);
+ process_record_user(BOT3, &depressed);
+ process_record_user(BOT3, &pressed);
+ process_record_user(BOT3, &depressed);
+ process_record_user(BOT3, &pressed);
+ process_record_user(BOT3, &depressed);
+
+ pause_ms(CHORD_TIMEOUT+DANCE_TIMEOUT+2);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_3], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_3], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_3], 1);
+ ASSERT_EQ(UINT, keyboard_history[4][KC_3], 0);
+ ASSERT_EQ(UINT, keyboard_history[5][KC_3], 255);
+END_TEST
+
+TEST("dance_two_held")
+ current_pseudolayer = NUM;
+
+ process_record_user(BOT3, &pressed);
+ process_record_user(BOT3, &depressed);
+ process_record_user(BOT3, &pressed);
+
+ pause_ms(CHORD_TIMEOUT+DANCE_TIMEOUT+2);
+
+ ASSERT_EQ(UINT, keyboard_history[1][KC_2], 1);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_2], 255);
+
+ process_record_user(BOT3, &depressed);
+ ASSERT_EQ(UINT, keyboard_history[2][KC_2], 0);
+ ASSERT_EQ(UINT, keyboard_history[3][KC_2], 255);
+END_TEST
+
+// These two are leaving the chording engine, they kinda have to be tested manually
+// TO
+// RESET
+
+END
diff --git a/users/dennytom/chording_engine/tests/test_full.sh b/users/dennytom/chording_engine/tests/test_full.sh
new file mode 100644
index 00000000000..ea93aec8f93
--- /dev/null
+++ b/users/dennytom/chording_engine/tests/test_full.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+cd ..
+python3 parser.py tests/test_keymap_def.json tests/test_keymap.c && \
+gcc -g tests/test.c -o tests/test && \
+tests/test && \
+python3 parser.py ../../../keyboards/butterstick/keymaps/tomas/keymap_def.json ../../../keyboards/butterstick/keymaps/tomas/keymap.c && \
+python3 parser.py ../../../keyboards/georgi/keymaps/tomas/keymap_def.json ../../../keyboards/georgi/keymaps/tomas/keymap.c && \
+python3 parser.py ../../../keyboards/georgi/keymaps/buttery/keymap_def.json ../../../keyboards/georgi/keymaps/buttery/keymap.c && \
+cd ../../../ && \
+make butterstick && \
+make georgi
\ No newline at end of file
diff --git a/users/dennytom/chording_engine/tests/test_keymap_def.json b/users/dennytom/chording_engine/tests/test_keymap_def.json
new file mode 100644
index 00000000000..eae2ed37cf2
--- /dev/null
+++ b/users/dennytom/chording_engine/tests/test_keymap_def.json
@@ -0,0 +1,145 @@
+{
+ "keys": [
+ "TOP1", "TOP2", "TOP3", "TOP4", "TOP5", "TOP6", "TOP7", "TOP8", "TOP9", "TOP0",
+ "BOT1", "BOT2", "BOT3", "BOT4", "BOT5", "BOT6", "BOT7", "BOT8", "BOT9", "BOT0"
+ ],
+ "parameters": {
+ "do_not_include_QMK": true,
+ "layout_function_name": "LAYOUT_test",
+ "chord_timeout": 100,
+ "dance_timeout": 200,
+ "leader_timeout": 750,
+ "tap_timeout": 50,
+ "command_max_length": 5,
+ "leader_max_length": 5,
+ "dynamic_macro_max_length": 20,
+ "string_max_length": 16,
+ "long_press_multiplier": 3,
+ "default_pseudolayer": "QWERTY"
+ },
+ "layers": [
+ {
+ "type": "auto"
+ },
+ {
+ "type": "manual",
+ "keycodes": ["KC_1", "KC_2", "KC_3", "KC_4", "KC_5", "KC_6", "KC_7", "KC_8", "KC_9", "KC_0",
+ "KC_Q", "KC_W", "KC_E", "KC_R", "KC_T", "KC_Y", "KC_U", "KC_I", "KC_O", "KC_P"
+ ]
+ }
+ ],
+ "chord_sets": [
+ {
+ "name": "rows",
+ "chords": [
+ ["TOP1"], ["TOP2"], ["TOP3"], ["TOP4"], ["TOP5"], ["TOP6"], ["TOP7"], ["TOP8"], ["TOP9"], ["TOP0"],
+ ["TOP1", "BOT1"], ["TOP2", "BOT2"], ["TOP3", "BOT3"], ["TOP4", "BOT4"], ["TOP5", "BOT5"], ["TOP6", "BOT6"], ["TOP7", "BOT7"], ["TOP8", "BOT8"], ["TOP9", "BOT9"], ["TOP0", "BOT0"],
+ ["BOT1"], ["BOT2"], ["BOT3"], ["BOT4"], ["BOT5"], ["BOT6"], ["BOT7"], ["BOT8"], ["BOT9"], ["BOT0"]
+ ]
+ },
+ {
+ "name": "cols",
+ "chords": [
+ ["TOP1", "TOP2"], ["TOP2", "TOP3"], ["TOP3", "TOP4"], ["TOP4", "TOP5"], ["TOP5", "TOP6"], ["TOP6", "TOP7"], ["TOP7", "TOP8"], ["TOP8", "TOP9"], ["TOP9", "TOP0"],
+ ["TOP1", "TOP2", "BOT1", "BOT2"], ["TOP2", "TOP3", "BOT2", "BOT3"], ["TOP3", "TOP4", "BOT3", "BOT4"], ["TOP4", "TOP5", "BOT4", "BOT5"], ["TOP5", "TOP6", "BOT5", "BOT6"], ["TOP6", "TOP7", "BOT6", "BOT7"], ["TOP7", "TOP8", "BOT7", "BOT8"], ["TOP8", "TOP9", "BOT8", "BOT9"], ["TOP9", "TOP0", "BOT9", "BOT0"],
+ ["BOT1", "BOT2"], ["BOT2", "BOT3"], ["BOT3", "BOT4"], ["BOT4", "BOT5"], ["BOT5", "BOT6"], ["BOT6", "BOT7"], ["BOT7", "BOT8"], ["BOT8", "BOT9"], ["BOT9", "BOT0"]
+ ]
+ },
+ {
+ "name": "asetniop",
+ "chords": [
+ ["TOP1"], ["TOP2"], ["TOP3"], ["TOP4"], ["TOP7"], ["TOP8"], ["TOP9"], ["TOP0"],
+ ["TOP1", "TOP2"], ["TOP2", "TOP3"], ["TOP3", "TOP4"], ["TOP4", "TOP7"], ["TOP7", "TOP8"], ["TOP8", "TOP9"], ["TOP9", "TOP0"],
+ ["TOP1", "TOP3"], ["TOP2", "TOP4"], ["TOP3", "TOP7"], ["TOP4", "TOP8"], ["TOP7", "TOP9"], ["TOP8", "TOP0"],
+ ["TOP1", "TOP4"], ["TOP2", "TOP7"], ["TOP3", "TOP8"], ["TOP4", "TOP9"], ["TOP7", "TOP0"],
+ ["TOP1", "TOP7"], ["TOP2", "TOP8"], ["TOP3", "TOP9"], ["TOP4", "TOP0"],
+ ["TOP1", "TOP8"], ["TOP2", "TOP9"], ["TOP3", "TOP0"],
+ ["TOP1", "TOP9"], ["TOP2", "TOP0"],
+ ["TOP1", "TOP0"]
+ ]
+ }
+ ],
+ "pseudolayers": [
+ {
+ "name": "ALWAYS_ON",
+ "chords": [
+ {
+ "type": "visual",
+ "chord": [
+ " ", " ", " ", " ", " ", " ", " ", "X", "X", "X",
+ " ", " ", " ", " ", " ", " ", " ", "X", "X", "X"
+ ],
+ "keycode": "MO(FNC, NUM)"
+ }
+ ]
+ },
+ {
+ "name": "QWERTY",
+ "chords": [
+ {
+ "type": "chord_set",
+ "set": "rows",
+ "keycodes": [
+ "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P",
+ "A", "S", "D", "F", "G", "H", "J", "K", "L", ";",
+ "AS(Z)", "KK(X, LCTL)", "KL(C, NUM)", "KM(V, LALT)", "B", "N", "M", "COMMA", ".", "M(double_dance, KC_9, KC_0)"
+ ]
+ },
+ {
+ "type": "chord_set",
+ "set": "cols",
+ "keycodes": [
+ "ESC", "", "", "", "", "", "", "", "",
+ "", "LEAD", "", "", "CMD", "", "", "", "",
+ "LSFT", "O(LSFT)", "", "", "", "O(NUM)", "MO(NUM)", "", "DF(NUM)"
+ ]
+ },
+ {
+ "type": "visual",
+ "chord": [
+ "X", "X", " ", " ", " ", " ", " ", " ", " ", " ",
+ "X", "X", " ", " ", " ", " ", " ", " ", " ", " "
+ ],
+ "keycode": "LOCK"
+ }
+ ]
+ },
+ {
+ "name": "NUM",
+ "chords": [
+ {
+ "type": "chord_set",
+ "set": "rows",
+ "keycodes": [
+ "1", "2", "3", "4", "5", "6", "7", "8", "9", "0",
+ "", "", "", "", "", "", "", "", "", "",
+ "", "KC_LEFT", "D(KC_1, KC_2, KC_3)", "", "", "", "DM_RECORD", "DM_NEXT", "DM_END", "DM_PLAY"
+ ]
+ },
+ {
+ "type": "simple",
+ "chord": ["BOT1"],
+ "keycode": "MK(KC_LCTL, KC_LSFT)"
+ }
+ ]
+ },
+ {
+ "name": "FNC",
+ "chords": []
+ }
+ ],
+ "leader_sequences": [
+ {
+ "name": "fnc_L1",
+ "function": "void fnc_L1(void) { key_in(KC_A); clear_keyboard(); }",
+ "sequence": ["KC_O", "KC_P"]
+ },
+ {
+ "name": "fnc_L2",
+ "function": "void fnc_L2(void) { key_in(KC_S); clear_keyboard(); }",
+ "sequence": ["KC_P", "KC_O"]
+ }
+ ],
+ "extra_code": "void double_dance(const struct Chord* self) {\n switch (*self->state) {\n case ACTIVATED:\n *self->counter = (*self->counter + 1) % 2;\n break;\n case PRESS_FROM_ACTIVE:\n if (*self->counter == 1) {\n key_in(self->value1);\n } else {\n key_in(self->value2);\n }\n *self->state = FINISHED_FROM_ACTIVE;\n break;\n case FINISHED:\n if (*self->counter == 1) {\n tap_key(self->value1);\n } else {\n tap_key(self->value2);\n }\n *self->counter = 0;\n *self->state = IDLE;\n break;\n case RESTART:\n if (*self->counter == 1) {\n key_out(self->value1);\n } else {\n key_out(self->value2);\n }\n *self->counter = 0;\n break;\n default:\n break;\n }\n}\n",
+ "extra_dependencies": []
+}
\ No newline at end of file
diff --git a/users/dennytom/chording_engine/tests/test_quick.sh b/users/dennytom/chording_engine/tests/test_quick.sh
new file mode 100644
index 00000000000..3740122e27b
--- /dev/null
+++ b/users/dennytom/chording_engine/tests/test_quick.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+cd ..
+python3 parser.py tests/test_keymap_def.json tests/test_keymap.c && \
+gcc -g tests/test.c -o tests/test && \
+tests/test
\ No newline at end of file
diff --git a/users/drashna/config.h b/users/drashna/config.h
index 6fafff86044..64b4b64ab79 100644
--- a/users/drashna/config.h
+++ b/users/drashna/config.h
@@ -1,7 +1,7 @@
#pragma once
// Use custom magic number so that when switching branches, EEPROM always gets reset
-#define EECONFIG_MAGIC_NUMBER (uint16_t)0x1337
+#define EECONFIG_MAGIC_NUMBER (uint16_t)0x1338
/* Set Polling rate to 1000Hz */
#define USB_POLLING_INTERVAL_MS 1
@@ -21,7 +21,7 @@
# define AUDIO_CLICKY_FREQ_RANDOMNESS 1.5f
-# define UNICODE_SONG_OSX SONG(RICK_ROLL)
+# define UNICODE_SONG_MAC SONG(RICK_ROLL)
# define UNICODE_SONG_LNX SONG(RICK_ROLL)
# define UNICODE_SONG_WIN SONG(RICK_ROLL)
# define UNICODE_SONG_BSD SONG(RICK_ROLL)
@@ -52,6 +52,7 @@
# if defined(__AVR__) && !defined(__AVR_AT90USB1286__)
# define DISABLE_RGB_MATRIX_ALPHAS_MODS
# define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+# define DISABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
# define DISABLE_RGB_MATRIX_BREATHING
# define DISABLE_RGB_MATRIX_BAND_SAT
# define DISABLE_RGB_MATRIX_BAND_VAL
diff --git a/users/drashna/drashna.c b/users/drashna/drashna.c
index 1a4ee9b4146..ba19d4803fd 100644
--- a/users/drashna/drashna.c
+++ b/users/drashna/drashna.c
@@ -18,12 +18,6 @@ along with this program. If not, see .
#include "drashna.h"
userspace_config_t userspace_config;
-#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
-# define DRASHNA_UNICODE_MODE UC_WIN
-#else
-// set to 2 for UC_WIN, set to 4 for UC_WINC
-# define DRASHNA_UNICODE_MODE 2
-#endif
bool mod_key_press_timer(uint16_t code, uint16_t mod_code, bool pressed) {
static uint16_t this_timer;
@@ -93,19 +87,17 @@ void matrix_init_user(void) {
DDRB &= ~(1 << 0);
PORTB &= ~(1 << 0);
#endif
-
-#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
- set_unicode_input_mode(DRASHNA_UNICODE_MODE);
- get_unicode_input_mode();
-#endif // UNICODE_ENABLE
matrix_init_keymap();
}
__attribute__((weak)) void keyboard_post_init_keymap(void) {}
void keyboard_post_init_user(void) {
-#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
- keyboard_post_init_rgb();
+#if defined(RGBLIGHT_ENABLE)
+ keyboard_post_init_rgb_light();
+#endif
+#if defined(RGB_MATRIX_ENABLE)
+ keyboard_post_init_rgb_matrix();
#endif
keyboard_post_init_keymap();
}
@@ -155,9 +147,12 @@ void matrix_scan_user(void) {
run_diablo_macro_check();
#endif // TAP_DANCE_ENABLE
-#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
- matrix_scan_rgb();
+#if defined(RGBLIGHT_ENABLE)
+ matrix_scan_rgb_light();
#endif // RGBLIGHT_ENABLE
+#if defined(RGB_MATRIX_ENABLE)
+ matrix_scan_rgb_matrix();
+#endif
matrix_scan_keymap();
}
@@ -168,8 +163,8 @@ __attribute__((weak)) layer_state_t layer_state_set_keymap(layer_state_t state)
// Then runs keymap's layer change check
layer_state_t layer_state_set_user(layer_state_t state) {
state = update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
-#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
- state = layer_state_set_rgb(state);
+#if defined(RGBLIGHT_ENABLE)
+ state = layer_state_set_rgb_light(state);
#endif // RGBLIGHT_ENABLE
return layer_state_set_keymap(state);
}
@@ -200,12 +195,6 @@ void eeconfig_init_user(void) {
userspace_config.raw = 0;
userspace_config.rgb_layer_change = true;
eeconfig_update_user(userspace_config.raw);
-#if (defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE))
- set_unicode_input_mode(DRASHNA_UNICODE_MODE);
- get_unicode_input_mode();
-#else
- eeprom_update_byte(EECONFIG_UNICODEMODE, DRASHNA_UNICODE_MODE);
-#endif
eeconfig_init_keymap();
keyboard_init();
}
diff --git a/users/drashna/drashna.h b/users/drashna/drashna.h
index 0ba18176040..c10ea5114a0 100644
--- a/users/drashna/drashna.h
+++ b/users/drashna/drashna.h
@@ -25,9 +25,15 @@ along with this program. If not, see .
#ifdef TAP_DANCE_ENABLE
# include "tap_dances.h"
#endif // TAP_DANCE_ENABLE
-#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
+#if defined(RGBLIGHT_ENABLE)
# include "rgb_stuff.h"
#endif
+#if defined(RGB_MATRIX_ENABLE)
+# include "rgb_matrix_stuff.h"
+#endif
+#if defined(OLED_DRIVER_ENABLE)
+# include "oled_stuff.h"
+#endif
/* Define layer names */
enum userspace_layers {
@@ -70,7 +76,6 @@ typedef union {
bool rgb_layer_change :1;
bool is_overwatch :1;
bool nuke_switch :1;
- uint8_t unicode_mod :4;
bool swapped_numbers :1;
bool rgb_matrix_idle_anim :1;
};
diff --git a/users/drashna/oled_stuff.c b/users/drashna/oled_stuff.c
new file mode 100644
index 00000000000..7580de1d33b
--- /dev/null
+++ b/users/drashna/oled_stuff.c
@@ -0,0 +1,278 @@
+#include "drashna.h"
+
+extern uint8_t is_master;
+
+#ifndef KEYLOGGER_LENGTH
+// # ifdef OLED_DISPLAY_128X64
+# define KEYLOGGER_LENGTH ((int)(OLED_DISPLAY_HEIGHT / OLED_FONT_WIDTH))
+// # else
+// # define KEYLOGGER_LENGTH (uint8_t *(OLED_DISPLAY_WIDTH / OLED_FONT_HEIGHT))
+// # endif
+#endif
+
+static uint32_t oled_timer = 0;
+static char keylog_str[KEYLOGGER_LENGTH + 1] = {"\n"};
+static uint16_t log_timer = 0;
+
+// clang-format off
+static const char PROGMEM code_to_name[0xFF] = {
+// 0 1 2 3 4 5 6 7 8 9 A B c D E F
+ ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', // 0x
+ 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', // 1x
+ '3', '4', '5', '6', '7', '8', '9', '0', 20, 19, 27, 26, 22, '-', '=', '[', // 2x
+ ']','\\', '#', ';','\'', '`', ',', '.', '/', 128, ' ', ' ', ' ', ' ', ' ', ' ', // 3x
+ ' ', ' ', ' ', ' ', ' ', ' ', 'P', 'S', ' ', ' ', ' ', ' ', 16, ' ', ' ', ' ', // 4x
+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 5x
+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 6x
+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 7x
+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 8x
+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // 9x
+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Ax
+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Bx
+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Cx
+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Dx
+ 'C', 'S', 'A', 'C', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', // Ex
+ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' // Fx
+};
+// clang-format on
+
+void add_keylog(uint16_t keycode) {
+ if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX) || (keycode >= QK_MODS && keycode <= QK_MODS_MAX)) {
+ keycode = keycode & 0xFF;
+ } else if (keycode > 0xFF) {
+ keycode = 0;
+ }
+
+ for (uint8_t i = (KEYLOGGER_LENGTH - 1); i > 0; --i) {
+ keylog_str[i] = keylog_str[i - 1];
+ }
+
+ if (keycode < (sizeof(code_to_name) / sizeof(char))) {
+ keylog_str[0] = pgm_read_byte(&code_to_name[keycode]);
+ }
+
+ log_timer = timer_read();
+}
+
+bool process_record_user_oled(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+#ifdef OLED_DRIVER_ENABLE
+ oled_timer = timer_read32();
+ add_keylog(keycode);
+#endif
+ }
+ return true;
+}
+
+void update_log(void) {
+ if (timer_elapsed(log_timer) > 750) {
+ // add_keylog(0);
+ }
+}
+
+void render_keylogger_status(void) {
+ oled_write_P(PSTR(OLED_RENDER_KEYLOGGER), false);
+ oled_write(keylog_str, false);
+}
+
+void render_default_layer_state(void) {
+ oled_write_P(PSTR(OLED_RENDER_LAYOUT_NAME), false);
+ switch (get_highest_layer(default_layer_state)) {
+ case _QWERTY:
+ oled_write_P(PSTR(OLED_RENDER_LAYOUT_QWERTY), false);
+ break;
+ case _COLEMAK:
+ oled_write_P(PSTR(OLED_RENDER_LAYOUT_COLEMAK), false);
+ break;
+ case _DVORAK:
+ oled_write_P(PSTR(OLED_RENDER_LAYOUT_DVORAK), false);
+ break;
+ case _WORKMAN:
+ oled_write_P(PSTR(OLED_RENDER_LAYOUT_WORKMAN), false);
+ break;
+ case _NORMAN:
+ oled_write_P(PSTR(OLED_RENDER_LAYOUT_NORMAN), false);
+ break;
+ case _MALTRON:
+ oled_write_P(PSTR(OLED_RENDER_LAYOUT_MALTRON), false);
+ break;
+ case _EUCALYN:
+ oled_write_P(PSTR(OLED_RENDER_LAYOUT_EUCALYN), false);
+ break;
+ case _CARPLAX:
+ oled_write_P(PSTR(OLED_RENDER_LAYOUT_CARPLAX), false);
+ break;
+ }
+#ifdef OLED_DISPLAY_128X64
+ oled_advance_page(true);
+#endif
+}
+
+void render_layer_state(void) {
+ oled_write_P(PSTR(OLED_RENDER_LAYER_NAME), false);
+#ifdef OLED_DISPLAY_128X64
+ oled_write_P(PSTR(" "), false);
+#endif
+ oled_write_P(PSTR(OLED_RENDER_LAYER_LOWER), layer_state_is(_LOWER));
+#ifdef OLED_DISPLAY_128X64
+ oled_write_P(PSTR(" "), false);
+#endif
+ oled_write_P(PSTR(OLED_RENDER_LAYER_RAISE), layer_state_is(_RAISE));
+#if _MODS
+# ifdef OLED_DISPLAY_128X64
+ oled_write_P(PSTR(" "), false);
+# endif
+ oled_write_P(PSTR(OLED_RENDER_LAYER_MODS), layer_state_is(_MODS));
+#endif
+#ifdef OLED_DISPLAY_128X64
+ oled_advance_page(true);
+#endif
+}
+
+void render_keylock_status(uint8_t led_usb_state) {
+ oled_write_P(PSTR(OLED_RENDER_LOCK_NAME), false);
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR(OLED_RENDER_LOCK_NUML), led_usb_state & (1 << USB_LED_NUM_LOCK));
+#ifdef OLED_DISPLAY_128X64
+ oled_write_P(PSTR(" "), false);
+#endif
+ oled_write_P(PSTR(OLED_RENDER_LOCK_CAPS), led_usb_state & (1 << USB_LED_CAPS_LOCK));
+#ifdef OLED_DISPLAY_128X64
+ oled_write_P(PSTR(" "), false);
+#endif
+ oled_write_P(PSTR(OLED_RENDER_LOCK_SCLK), led_usb_state & (1 << USB_LED_SCROLL_LOCK));
+#ifndef OLED_DISPLAY_128X64
+ oled_advance_page(true);
+#endif
+}
+
+void render_mod_status(uint8_t modifiers) {
+ oled_write_P(PSTR(OLED_RENDER_MODS_NAME), false);
+ oled_write_P(PSTR(OLED_RENDER_MODS_SFT), (modifiers & MOD_MASK_SHIFT));
+#ifdef OLED_DISPLAY_128X64
+ oled_write_P(PSTR(" "), false);
+#endif
+ oled_write_P(PSTR(OLED_RENDER_MODS_CTL), (modifiers & MOD_MASK_CTRL));
+#ifdef OLED_DISPLAY_128X64
+ oled_write_P(PSTR(" "), false);
+#endif
+ oled_write_P(PSTR(OLED_RENDER_MODS_ALT), (modifiers & MOD_MASK_ALT));
+#ifdef OLED_DISPLAY_128X64
+ oled_write_P(PSTR(" "), false);
+#endif
+ oled_write_P(PSTR(OLED_RENDER_MODS_GUI), (modifiers & MOD_MASK_GUI));
+}
+
+void render_bootmagic_status(void) {
+ /* Show Ctrl-Gui Swap options */
+ static const char PROGMEM logo[][2][3] = {
+ {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}},
+ {{0x95, 0x96, 0}, {0xb5, 0xb6, 0}},
+ };
+
+ oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_NAME), false);
+#ifdef OLED_DISPLAY_128X64
+ if (keymap_config.swap_lctl_lgui)
+#else
+ oled_write_P(PSTR(" "), false);
+#endif
+ {
+ oled_write_P(logo[1][0], false);
+#ifdef OLED_DISPLAY_128X64
+ } else {
+#endif
+ oled_write_P(logo[0][0], false);
+ }
+ oled_write_P(PSTR(" "), false);
+#ifdef OLED_DISPLAY_128X64
+ oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_NKRO), keymap_config.nkro);
+ oled_write_P(PSTR(" "), false);
+ oled_write_ln_P(PSTR(OLED_RENDER_BOOTMAGIC_NOGUI), !keymap_config.no_gui);
+ oled_write_P(PSTR("Magic "), false);
+ if (keymap_config.swap_lctl_lgui)
+#endif
+ {
+ oled_write_P(logo[1][1], false);
+#ifdef OLED_DISPLAY_128X64
+ } else {
+#endif
+ oled_write_P(logo[0][1], false);
+ }
+ oled_write_P(PSTR(" "), false);
+#ifdef OLED_DISPLAY_128X64
+ oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_GRV), keymap_config.swap_grave_esc);
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_CAPS), keymap_config.swap_control_capslock);
+ oled_advance_page(true);
+#else
+ oled_write_P(PSTR(OLED_RENDER_BOOTMAGIC_NKRO), keymap_config.nkro);
+#endif
+}
+
+void render_user_status(void) {
+ oled_write_P(PSTR(OLED_RENDER_USER_NAME), false);
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR(OLED_RENDER_USER_ANIM), userspace_config.rgb_matrix_idle_anim);
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR(OLED_RENDER_USER_LAYR), userspace_config.rgb_layer_change);
+ oled_write_P(PSTR(" "), false);
+ oled_write_P(PSTR(OLED_RENDER_USER_NUKE), userspace_config.nuke_switch);
+#ifdef OLED_DISPLAY_128X64
+ oled_advance_page(true);
+#endif
+}
+
+__attribute__((weak)) void oled_driver_render_logo(void) {
+ // clang-format off
+ static const char PROGMEM qmk_logo[] = {
+ 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,0x90,0x91,0x92,0x93,0x94,
+ 0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0,0xb1,0xb2,0xb3,0xb4,
+ 0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,0xd0,0xd1,0xd2,0xd3,0xd4,0};
+ // clang-format on
+ oled_write_P(qmk_logo, false);
+}
+
+void render_status_secondary(void) {
+#if !defined(SPLIT_TRANSPORT_MIRROR) || defined(OLED_DRIVER_128x64)
+ oled_driver_render_logo();
+#endif
+#ifdef SPLIT_TRANSPORT_MIRROR
+ /* Show Keyboard Layout */
+ render_default_layer_state();
+ render_layer_state();
+ render_mod_status(get_mods() | get_oneshot_mods());
+ render_keylogger_status();
+
+#endif
+}
+// clang-format on
+
+void render_status_main(void) {
+ /* Show Keyboard Layout */
+ render_default_layer_state();
+ render_keylock_status(host_keyboard_leds());
+ render_bootmagic_status();
+ render_user_status();
+
+ render_keylogger_status();
+}
+
+void oled_task_user(void) {
+ if (timer_elapsed32(oled_timer) > 30000) {
+ oled_off();
+ return;
+ }
+#ifndef SPLIT_KEYBOARD
+ else {
+ oled_on();
+ }
+#endif
+
+ update_log();
+
+ if (is_master) {
+ render_status_main(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
+ } else {
+ render_status_secondary();
+ }
+}
diff --git a/users/drashna/oled_stuff.h b/users/drashna/oled_stuff.h
new file mode 100644
index 00000000000..662e206b760
--- /dev/null
+++ b/users/drashna/oled_stuff.h
@@ -0,0 +1,91 @@
+#pragma once
+
+#include "quantum.h"
+#include "oled_driver.h"
+
+void oled_driver_render_logo(void);
+bool process_record_user_oled(uint16_t keycode, keyrecord_t *record);
+
+#ifdef OLED_DISPLAY_128X64
+# define OLED_RENDER_KEYLOGGER "Keylogger: "
+
+# define OLED_RENDER_LAYOUT_NAME "Layout: "
+# define OLED_RENDER_LAYOUT_QWERTY "Qwerty"
+# define OLED_RENDER_LAYOUT_COLEMAK "Colemak"
+# define OLED_RENDER_LAYOUT_DVORAK "Dvorak"
+# define OLED_RENDER_LAYOUT_WORKMAN "Workman"
+# define OLED_RENDER_LAYOUT_NORMAN "Norman"
+# define OLED_RENDER_LAYOUT_MALTRON "Matron"
+# define OLED_RENDER_LAYOUT_EUCALYN "Eucalyn"
+# define OLED_RENDER_LAYOUT_CARPLAX "Carplax"
+
+# define OLED_RENDER_LAYER_NAME "Layer:\n"
+# define OLED_RENDER_LAYER_LOWER "Lower"
+# define OLED_RENDER_LAYER_RAISE "Raise"
+# define OLED_RENDER_LAYER_ADJUST "Adjust"
+# define OLED_RENDER_LAYER_MODS "Mods"
+
+# define OLED_RENDER_LOCK_NAME "Lock: "
+# define OLED_RENDER_LOCK_NUML "NUML"
+# define OLED_RENDER_LOCK_CAPS "CAPS"
+# define OLED_RENDER_LOCK_SCLK "SCLK"
+
+# define OLED_RENDER_MODS_NAME "Mods: "
+# define OLED_RENDER_MODS_SFT "Sft"
+# define OLED_RENDER_MODS_CTL "Ctl"
+# define OLED_RENDER_MODS_ALT "Alt"
+# define OLED_RENDER_MODS_GUI "GUI"
+
+# define OLED_RENDER_BOOTMAGIC_NAME "Boot "
+# define OLED_RENDER_BOOTMAGIC_NKRO "NKRO"
+# define OLED_RENDER_BOOTMAGIC_NOGUI "nGUI"
+# define OLED_RENDER_BOOTMAGIC_GRV "GRV"
+# define OLED_RENDER_BOOTMAGIC_CAPS "CAPS"
+
+# define OLED_RENDER_USER_NAME "USER:"
+# define OLED_RENDER_USER_ANIM "Anim"
+# define OLED_RENDER_USER_LAYR "Layr"
+# define OLED_RENDER_USER_NUKE "Nuke"
+
+#else
+# define OLED_RENDER_KEYLOGGER "KLogr"
+
+# define OLED_RENDER_LAYOUT_NAME "Lyout"
+# define OLED_RENDER_LAYOUT_QWERTY " QRTY"
+# define OLED_RENDER_LAYOUT_COLEMAK " COLE"
+# define OLED_RENDER_LAYOUT_DVORAK " DVRK"
+# define OLED_RENDER_LAYOUT_WORKMAN " WKMN"
+# define OLED_RENDER_LAYOUT_NORMAN " NORM"
+# define OLED_RENDER_LAYOUT_MALTRON " MLTN"
+# define OLED_RENDER_LAYOUT_EUCALYN " ECLN"
+# define OLED_RENDER_LAYOUT_CARPLAX " CRPX"
+
+# define OLED_RENDER_LAYER_NAME "LAYER"
+# define OLED_RENDER_LAYER_LOWER "Lower"
+# define OLED_RENDER_LAYER_RAISE "Raise"
+# define OLED_RENDER_LAYER_ADJUST "Adjst"
+# define OLED_RENDER_LAYER_MODS " Mods"
+
+# define OLED_RENDER_LOCK_NAME "Lock:"
+# define OLED_RENDER_LOCK_NUML "N"
+# define OLED_RENDER_LOCK_CAPS "C"
+# define OLED_RENDER_LOCK_SCLK "S"
+
+# define OLED_RENDER_MODS_NAME "Mods: "
+# define OLED_RENDER_MODS_SFT "S"
+# define OLED_RENDER_MODS_CTL "C"
+# define OLED_RENDER_MODS_ALT "A"
+# define OLED_RENDER_MODS_GUI "G"
+
+# define OLED_RENDER_BOOTMAGIC_NAME "BTMGK"
+# define OLED_RENDER_BOOTMAGIC_NKRO "NKRO"
+# define OLED_RENDER_BOOTMAGIC_NOGUI "nGUI"
+# define OLED_RENDER_BOOTMAGIC_GRV "GRV"
+# define OLED_RENDER_BOOTMAGIC_CAPS "CAPS"
+
+# define OLED_RENDER_USER_NAME "USER:"
+# define OLED_RENDER_USER_ANIM "Anim"
+# define OLED_RENDER_USER_LAYR "Layr"
+# define OLED_RENDER_USER_NUKE "Nuke"
+
+#endif
diff --git a/users/drashna/process_records.c b/users/drashna/process_records.c
index af3ee9cf054..101b3d95cea 100644
--- a/users/drashna/process_records.c
+++ b/users/drashna/process_records.c
@@ -17,101 +17,308 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
xprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
# endif
#endif // KEYLOGGER_ENABLE
+#ifdef OLED_DRIVER_ENABLE
+ process_record_user_oled(keycode, record);
+#endif // OLED
- switch (keycode) {
- case KC_QWERTY ... KC_WORKMAN:
- if (record->event.pressed) {
- uint8_t mods = mod_config(get_mods() | get_oneshot_mods());
- if (!mods) {
- set_single_persistent_default_layer(keycode - KC_QWERTY);
- } else if (mods & MOD_MASK_SHIFT) {
- set_single_persistent_default_layer(keycode - KC_QWERTY + 4);
- } else if (mods & MOD_MASK_CTRL) {
- set_single_persistent_default_layer(keycode - KC_QWERTY + 8);
- }
- }
- break;
-
- case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
- if (!record->event.pressed) {
- uint8_t temp_mod = mod_config(get_mods());
- uint8_t temp_osm = mod_config(get_oneshot_mods());
- clear_mods();
- clear_oneshot_mods();
- send_string_with_delay_P(PSTR("make " QMK_KEYBOARD ":" QMK_KEYMAP), TAP_CODE_DELAY);
-#ifndef MAKE_BOOTLOADER
- if ((temp_mod | temp_osm) & MOD_MASK_SHIFT)
+ if (process_record_keymap(keycode, record) && process_record_secrets(keycode, record)
+#ifdef RGB_MATRIX_ENABLE
+ && process_record_user_rgb_matrix(keycode, record)
#endif
- {
- send_string_with_delay_P(PSTR(":flash"), TAP_CODE_DELAY);
- }
- if ((temp_mod | temp_osm) & MOD_MASK_CTRL) {
- send_string_with_delay_P(PSTR(" -j8 --output-sync"), TAP_CODE_DELAY);
+#ifdef RGBLIGHT_ENABLE
+ && process_record_user_rgb_light(keycode, record)
+#endif
+ ) {
+ switch (keycode) {
+ case KC_QWERTY ... KC_WORKMAN:
+ if (record->event.pressed) {
+ uint8_t mods = mod_config(get_mods() | get_oneshot_mods());
+ if (!mods) {
+ set_single_persistent_default_layer(keycode - KC_QWERTY);
+ } else if (mods & MOD_MASK_SHIFT) {
+ set_single_persistent_default_layer(keycode - KC_QWERTY + 4);
+ } else if (mods & MOD_MASK_CTRL) {
+ set_single_persistent_default_layer(keycode - KC_QWERTY + 8);
+ }
}
+ break;
+
+ case KC_MAKE: // Compiles the firmware, and adds the flash command based on keyboard bootloader
+ if (!record->event.pressed) {
+#ifndef MAKE_BOOTLOADER
+ uint8_t temp_mod = mod_config(get_mods());
+ uint8_t temp_osm = mod_config(get_oneshot_mods());
+ clear_mods();
+ clear_oneshot_mods();
+#endif
+ send_string_with_delay_P(PSTR("bin/qmk"), TAP_CODE_DELAY);
+#ifndef MAKE_BOOTLOADER
+ if ((temp_mod | temp_osm) & MOD_MASK_SHIFT)
+#endif
+ {
+ send_string_with_delay_P(PSTR(" flash "), TAP_CODE_DELAY);
+#ifndef MAKE_BOOTLOADER
+ } else {
+ send_string_with_delay_P(PSTR(" compile "), TAP_CODE_DELAY);
+#endif
+ }
+ send_string_with_delay_P(PSTR("-kb " QMK_KEYBOARD " -km " QMK_KEYMAP), TAP_CODE_DELAY);
#ifdef RGB_MATRIX_SPLIT_RIGHT
- send_string_with_delay_P(PSTR(" RGB_MATRIX_SPLIT_RIGHT=yes"), TAP_CODE_DELAY);
+ send_string_with_delay_P(PSTR(" RGB_MATRIX_SPLIT_RIGHT=yes"), TAP_CODE_DELAY);
# ifndef OLED_DRIVER_ENABLE
- send_string_with_delay_P(PSTR(" OLED_DRIVER_ENABLE=no"), TAP_CODE_DELAY);
+ send_string_with_delay_P(PSTR(" OLED_DRIVER_ENABLE=no"), TAP_CODE_DELAY);
# endif
#endif
- send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), TAP_CODE_DELAY);
- }
+ send_string_with_delay_P(PSTR(SS_TAP(X_ENTER)), TAP_CODE_DELAY);
+ }
- break;
+ break;
- case VRSN: // Prints firmware version
- if (record->event.pressed) {
- send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), TAP_CODE_DELAY);
- }
- break;
+ case VRSN: // Prints firmware version
+ if (record->event.pressed) {
+ send_string_with_delay_P(PSTR(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION ", Built on: " QMK_BUILDDATE), TAP_CODE_DELAY);
+ }
+ break;
- case KC_DIABLO_CLEAR: // reset all Diablo timers, disabling them
+ case KC_DIABLO_CLEAR: // reset all Diablo timers, disabling them
#ifdef TAP_DANCE_ENABLE
- if (record->event.pressed) {
- for (uint8_t index = 0; index < 4; index++) {
- diablo_timer[index].key_interval = 0;
+ if (record->event.pressed) {
+ for (uint8_t index = 0; index < 4; index++) {
+ diablo_timer[index].key_interval = 0;
+ }
}
- }
#endif // TAP_DANCE_ENABLE
- break;
+ break;
- case KC_CCCV: // One key copy/paste
- if (record->event.pressed) {
- copy_paste_timer = timer_read();
- } else {
- if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy
- tap_code16(LCTL(KC_C));
- } else { // Tap, paste
- tap_code16(LCTL(KC_V));
+ case KC_CCCV: // One key copy/paste
+ if (record->event.pressed) {
+ copy_paste_timer = timer_read();
+ } else {
+ if (timer_elapsed(copy_paste_timer) > TAPPING_TERM) { // Hold, copy
+ tap_code16(LCTL(KC_C));
+ } else { // Tap, paste
+ tap_code16(LCTL(KC_V));
+ }
}
- }
- break;
+ break;
#ifdef UNICODE_ENABLE
- case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻
- if (record->event.pressed) {
- send_unicode_hex_string("0028 30CE 0CA0 75CA 0CA0 0029 30CE 5F61 253B 2501 253B");
- }
- break;
- case UC_TABL: // ┬─┬ノ( º _ ºノ)
- if (record->event.pressed) {
- send_unicode_hex_string("252C 2500 252C 30CE 0028 0020 00BA 0020 005F 0020 00BA 30CE 0029");
- }
- break;
- case UC_SHRG: // ¯\_(ツ)_/¯
- if (record->event.pressed) {
- send_unicode_hex_string("00AF 005C 005F 0028 30C4 0029 005F 002F 00AF");
- }
- break;
- case UC_DISA: // ಠ_ಠ
- if (record->event.pressed) {
- send_unicode_hex_string("0CA0 005F 0CA0");
- }
- break;
+ case UC_FLIP: // (ノಠ痊ಠ)ノ彡┻━┻
+ if (record->event.pressed) {
+ send_unicode_string("(ノಠ痊ಠ)ノ彡┻━┻");
+ }
+ break;
+ case UC_TABL: // ┬─┬ノ( º _ ºノ)
+ if (record->event.pressed) {
+ send_unicode_string("┬─┬ノ( º _ ºノ)");
+ }
+ break;
+ case UC_SHRG: // ¯\_(ツ)_/¯
+ if (record->event.pressed) {
+ send_unicode_string("¯\\_(ツ)_/¯");
+ }
+ break;
+ case UC_DISA: // ಠ_ಠ
+ if (record->event.pressed) {
+ send_unicode_string("ಠ_ಠ");
+ }
+ break;
#endif
- }
- return process_record_keymap(keycode, record) &&
+ case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal
#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
- process_record_user_rgb(keycode, record) &&
+ if (record->event.pressed) {
+ userspace_config.rgb_layer_change ^= 1;
+ dprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
+ eeconfig_update_user(userspace_config.raw);
+ if (userspace_config.rgb_layer_change) {
+# if defined(RGBLIGHT_ENABLE) && defined(RGB_MATRIX_ENABLE)
+ rgblight_enable_noeeprom();
+# endif
+ layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better)
+# if defined(RGBLIGHT_ENABLE) && defined(RGB_MATRIX_ENABLE)
+ } else {
+ rgblight_disable_noeeprom();
+# endif
+ }
+ }
#endif // RGBLIGHT_ENABLE
- process_record_secrets(keycode, record);
+ break;
+
+#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
+ case RGB_TOG:
+ // Split keyboards need to trigger on key-up for edge-case issue
+# ifndef SPLIT_KEYBOARD
+ if (record->event.pressed) {
+# else
+ if (!record->event.pressed) {
+# endif
+# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
+ rgblight_toggle();
+# endif
+# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
+ rgb_matrix_toggle();
+# endif
+ }
+ return false;
+ break;
+ case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions
+ if (record->event.pressed) {
+ bool is_eeprom_updated;
+# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
+ // This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
+ if (userspace_config.rgb_layer_change) {
+ userspace_config.rgb_layer_change = false;
+ dprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
+ is_eeprom_updated = true;
+ }
+# endif
+# if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
+ if (userspace_config.rgb_matrix_idle_anim) {
+ userspace_config.rgb_matrix_idle_anim = false;
+ dprintf("RGB Matrix Idle Animation [EEPROM]: %u\n", userspace_config.rgb_matrix_idle_anim);
+ is_eeprom_updated = true;
+ }
+# endif
+ if (is_eeprom_updated) {
+ eeconfig_update_user(userspace_config.raw);
+ }
+ }
+
+# if defined(RGBLIGHT_DISABLE_KEYCODES) || defined(RGB_MATRIX_DISABLE_KEYCODES)
+ if (keycode == RGB_MODE_FORWARD && record->event.pressed) {
+ uint8_t shifted = get_mods() & (MOD_MASK_SHIFT);
+ if (shifted) {
+# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
+ rgblight_step_reverse();
+# endif
+# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
+ rgb_matrix_step_reverse();
+# endif
+ } else {
+# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
+ rgblight_step();
+# endif
+# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
+ rgb_matrix_step();
+# endif
+ }
+ } else if (keycode == RGB_MODE_REVERSE && record->event.pressed) {
+ uint8_t shifted = get_mods() & (MOD_MASK_SHIFT);
+ if (shifted) {
+# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
+ rgblight_step();
+# endif
+# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
+ rgb_matrix_step();
+# endif
+ } else {
+# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
+ rgblight_step_reverse();
+# endif
+# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
+ rgb_matrix_step_reverse();
+# endif
+ }
+ } else if (keycode == RGB_HUI) {
+# ifndef SPLIT_KEYBOARD
+ if (record->event.pressed) {
+# else
+ if (!record->event.pressed) {
+# endif
+# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
+ rgblight_increase_hue();
+# endif
+# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
+ rgb_matrix_increase_hue();
+# endif
+ }
+ } else if (keycode == RGB_HUD) {
+# ifndef SPLIT_KEYBOARD
+ if (record->event.pressed) {
+# else
+ if (!record->event.pressed) {
+# endif
+# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
+ rgblight_decrease_hue();
+# endif
+# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
+ rgb_matrix_decrease_hue();
+# endif
+ }
+ } else if (keycode == RGB_SAI) {
+# ifndef SPLIT_KEYBOARD
+ if (record->event.pressed) {
+# else
+ if (!record->event.pressed) {
+# endif
+# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
+ rgblight_increase_sat();
+# endif
+# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
+ rgb_matrix_increase_sat();
+# endif
+ }
+ } else if (keycode == RGB_SAD) {
+# ifndef SPLIT_KEYBOARD
+ if (record->event.pressed) {
+# else
+ if (!record->event.pressed) {
+# endif
+# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
+ rgblight_decrease_sat();
+# endif
+# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
+ rgb_matrix_decrease_sat();
+# endif
+ }
+ } else if (keycode == RGB_VAI) {
+# ifndef SPLIT_KEYBOARD
+ if (record->event.pressed) {
+# else
+ if (!record->event.pressed) {
+# endif
+# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
+ rgblight_increase_val();
+# endif
+# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
+ rgb_matrix_increase_val();
+# endif
+ }
+ } else if (keycode == RGB_VAD) {
+# ifndef SPLIT_KEYBOARD
+ if (record->event.pressed) {
+# else
+ if (!record->event.pressed) {
+# endif
+# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
+ rgblight_decrease_val();
+# endif
+# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
+ rgb_matrix_decrease_val();
+# endif
+ }
+ } else if (keycode == RGB_SPI) {
+ if (record->event.pressed) {
+# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
+ rgblight_increase_speed();
+# endif
+# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
+ rgb_matrix_increase_speed();
+# endif
+ }
+ } else if (keycode == RGB_SPD) {
+ if (record->event.pressed) {
+# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
+ rgblight_decrease_speed();
+# endif
+# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
+ rgb_matrix_decrease_speed();
+# endif
+ }
+ }
+ return false;
+# endif
+#endif
+ }
+ }
+ return true;
}
diff --git a/users/drashna/process_records.h b/users/drashna/process_records.h
index cb7ec3ec401..999882d4bc9 100644
--- a/users/drashna/process_records.h
+++ b/users/drashna/process_records.h
@@ -34,13 +34,13 @@ enum userspace_custom_keycodes {
bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
-#define LOWER MO(_LOWER)
-#define RAISE MO(_RAISE)
-#define ADJUST MO(_ADJUST)
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+#define ADJUST MO(_ADJUST)
#define TG_MODS TG(_MODS)
#define TG_GAME TG(_GAMEPAD)
-#define OS_LWR OSL(_LOWER)
-#define OS_RSE OSL(_RAISE)
+#define OS_LWR OSL(_LOWER)
+#define OS_RSE OSL(_RAISE)
#define KC_SEC1 KC_SECRET_1
#define KC_SEC2 KC_SECRET_2
@@ -48,13 +48,13 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
#define KC_SEC4 KC_SECRET_4
#define KC_SEC5 KC_SECRET_5
-#define QWERTY KC_QWERTY
-#define DVORAK KC_DVORAK
+#define QWERTY KC_QWERTY
+#define DVORAK KC_DVORAK
#define COLEMAK KC_COLEMAK
#define WORKMAN KC_WORKMAN
#define KC_RESET RESET
-#define KC_RST KC_RESET
+#define KC_RST KC_RESET
#ifdef SWAP_HANDS_ENABLE
# define KC_C1R3 SH_T(KC_TAB)
@@ -81,7 +81,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
#define OS_RCTL OSM(MOD_RCTL)
#define OS_LALT OSM(MOD_LALT)
#define OS_RALT OSM(MOD_RALT)
-#define OS_MEH OSM(MOD_MEH)
+#define OS_MEH OSM(MOD_MEH)
#define OS_HYPR OSM(MOD_HYPR)
#define ALT_APP ALT_T(KC_APP)
diff --git a/users/drashna/rgb_matrix_stuff.c b/users/drashna/rgb_matrix_stuff.c
new file mode 100644
index 00000000000..0914aab1444
--- /dev/null
+++ b/users/drashna/rgb_matrix_stuff.c
@@ -0,0 +1,86 @@
+#include "drashna.h"
+
+#include "lib/lib8tion/lib8tion.h"
+extern led_config_t g_led_config;
+
+static uint32_t hypno_timer;
+#if defined(SPLIT_KEYBOARD) || defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_crkbd)
+# define RGB_MATRIX_REST_MODE RGB_MATRIX_CYCLE_OUT_IN_DUAL
+#else
+# define RGB_MATRIX_REST_MODE RGB_MATRIX_CYCLE_OUT_IN
+#endif
+
+void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type) {
+ HSV hsv = {hue, sat, val};
+ if (hsv.v > rgb_matrix_config.hsv.v) {
+ hsv.v = rgb_matrix_config.hsv.v;
+ }
+
+ switch (mode) {
+ case 1: // breathing
+ {
+ uint16_t time = scale16by8(g_rgb_counters.tick, speed / 8);
+ hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v);
+ RGB rgb = hsv_to_rgb(hsv);
+ for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
+ if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
+ rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
+ }
+ }
+ break;
+ }
+ default: // Solid Color
+ {
+ RGB rgb = hsv_to_rgb(hsv);
+ for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
+ if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
+ rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
+ }
+ }
+ break;
+ }
+ }
+}
+
+__attribute__((weak)) void rgb_matrix_indicator_keymap(void) {}
+
+void matrix_scan_rgb_matrix(void) {
+#if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
+ if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_TYPING_HEATMAP && timer_elapsed32(hypno_timer) > 15000) {
+ rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE);
+ }
+#endif
+ rgb_matrix_indicator_keymap();
+}
+
+void keyboard_post_init_rgb_matrix(void) {
+#if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
+ if (userspace_config.rgb_matrix_idle_anim) {
+ rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE);
+ }
+#endif
+}
+
+bool process_record_user_rgb_matrix(uint16_t keycode, keyrecord_t *record) {
+#if defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
+ hypno_timer = timer_read32();
+ if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_REST_MODE) {
+ rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP);
+ }
+#endif
+ switch (keycode) {
+ case RGB_IDL: // This allows me to use underglow as layer indication, or as normal
+#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
+ if (record->event.pressed) {
+ userspace_config.rgb_matrix_idle_anim ^= 1;
+ dprintf("RGB Matrix Idle Animation [EEPROM]: %u\n", userspace_config.rgb_matrix_idle_anim);
+ eeconfig_update_user(userspace_config.raw);
+ if (userspace_config.rgb_matrix_idle_anim) {
+ rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP);
+ }
+ }
+#endif
+ break;
+ }
+ return true;
+}
diff --git a/users/drashna/rgb_matrix_stuff.h b/users/drashna/rgb_matrix_stuff.h
new file mode 100644
index 00000000000..35b01047b65
--- /dev/null
+++ b/users/drashna/rgb_matrix_stuff.h
@@ -0,0 +1,9 @@
+#pragma once
+#include "quantum.h"
+
+bool process_record_user_rgb_matrix(uint16_t keycode, keyrecord_t *record);
+void keyboard_post_init_rgb_matrix(void);
+void matrix_scan_rgb_matrix(void);
+
+void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
+void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type);
diff --git a/users/drashna/rgb_stuff.c b/users/drashna/rgb_stuff.c
index e7247f754fa..06b1e3c0c41 100644
--- a/users/drashna/rgb_stuff.c
+++ b/users/drashna/rgb_stuff.c
@@ -2,89 +2,77 @@
#include "rgb_stuff.h"
#include "eeprom.h"
-#if defined(RGBLIGHT_ENABLE)
extern rgblight_config_t rgblight_config;
bool has_initialized;
void rgblight_sethsv_default_helper(uint8_t index) { rgblight_sethsv_at(rgblight_config.hue, rgblight_config.sat, rgblight_config.val, index); }
-#endif // RGBLIGHT_ENABLE
-
-#if defined(RGB_MATRIX_ENABLE)
-static uint32_t hypno_timer;
-# if defined(SPLIT_KEYBOARD) || defined(KEYBOARD_ergodox_ez) || defined(KEYBOARD_crkbd)
-# define RGB_MATRIX_REST_MODE RGB_MATRIX_CYCLE_OUT_IN_DUAL
-# else
-# define RGB_MATRIX_REST_MODE RGB_MATRIX_CYCLE_OUT_IN
-# endif
-#endif
/* Custom indicators for modifiers.
* This allows for certain lights to be lit up, based on what mods are active, giving some visual feedback.
* This is especially useful for One Shot Mods, since it's not always obvious if they're still lit up.
*/
-#ifdef RGBLIGHT_ENABLE
-# ifdef INDICATOR_LIGHTS
+#ifdef INDICATOR_LIGHTS
void set_rgb_indicators(uint8_t this_mod, uint8_t this_led, uint8_t this_osm) {
if (userspace_config.rgb_layer_change && get_highest_layer(layer_state) == 0) {
if ((this_mod | this_osm) & MOD_MASK_SHIFT || this_led & (1 << USB_LED_CAPS_LOCK)) {
-# ifdef SHFT_LED1
+# ifdef SHFT_LED1
rgblight_sethsv_at(120, 255, 255, SHFT_LED1);
-# endif // SHFT_LED1
-# ifdef SHFT_LED2
+# endif // SHFT_LED1
+# ifdef SHFT_LED2
rgblight_sethsv_at(120, 255, 255, SHFT_LED2);
-# endif // SHFT_LED2
+# endif // SHFT_LED2
} else {
-# ifdef SHFT_LED1
+# ifdef SHFT_LED1
rgblight_sethsv_default_helper(SHFT_LED1);
-# endif // SHFT_LED1
-# ifdef SHFT_LED2
+# endif // SHFT_LED1
+# ifdef SHFT_LED2
rgblight_sethsv_default_helper(SHFT_LED2);
-# endif // SHFT_LED2
+# endif // SHFT_LED2
}
if ((this_mod | this_osm) & MOD_MASK_CTRL) {
-# ifdef CTRL_LED1
+# ifdef CTRL_LED1
rgblight_sethsv_at(0, 255, 255, CTRL_LED1);
-# endif // CTRL_LED1
-# ifdef CTRL_LED2
+# endif // CTRL_LED1
+# ifdef CTRL_LED2
rgblight_sethsv_at(0, 255, 255, CTRL_LED2);
-# endif // CTRL_LED2
+# endif // CTRL_LED2
} else {
-# ifdef CTRL_LED1
+# ifdef CTRL_LED1
rgblight_sethsv_default_helper(CTRL_LED1);
-# endif // CTRL_LED1
-# ifdef CTRL_LED2
+# endif // CTRL_LED1
+# ifdef CTRL_LED2
rgblight_sethsv_default_helper(CTRL_LED2);
-# endif // CTRL_LED2
+# endif // CTRL_LED2
}
if ((this_mod | this_osm) & MOD_MASK_GUI) {
-# ifdef GUI_LED1
+# ifdef GUI_LED1
rgblight_sethsv_at(51, 255, 255, GUI_LED1);
-# endif // GUI_LED1
-# ifdef GUI_LED2
+# endif // GUI_LED1
+# ifdef GUI_LED2
rgblight_sethsv_at(51, 255, 255, GUI_LED2);
-# endif // GUI_LED2
+# endif // GUI_LED2
} else {
-# ifdef GUI_LED1
+# ifdef GUI_LED1
rgblight_sethsv_default_helper(GUI_LED1);
-# endif // GUI_LED1
-# ifdef GUI_LED2
+# endif // GUI_LED1
+# ifdef GUI_LED2
rgblight_sethsv_default_helper(GUI_LED2);
-# endif // GUI_LED2
+# endif // GUI_LED2
}
if ((this_mod | this_osm) & MOD_MASK_ALT) {
-# ifdef ALT_LED1
+# ifdef ALT_LED1
rgblight_sethsv_at(240, 255, 255, ALT_LED1);
-# endif // ALT_LED1
-# ifdef GUI_LED2
+# endif // ALT_LED1
+# ifdef GUI_LED2
rgblight_sethsv_at(240, 255, 255, ALT_LED2);
-# endif // GUI_LED2
+# endif // GUI_LED2
} else {
-# ifdef GUI_LED1
+# ifdef GUI_LED1
rgblight_sethsv_default_helper(ALT_LED1);
-# endif // GUI_LED1
-# ifdef GUI_LED2
+# endif // GUI_LED1
+# ifdef GUI_LED2
rgblight_sethsv_default_helper(ALT_LED2);
-# endif // GUI_LED2
+# endif // GUI_LED2
}
}
}
@@ -95,9 +83,9 @@ void matrix_scan_indicator(void) {
set_rgb_indicators(get_mods(), host_keyboard_leds(), get_oneshot_mods());
}
}
-# endif // INDICATOR_LIGHTS
+#endif // INDICATOR_LIGHTS
-# ifdef RGBLIGHT_TWINKLE
+#ifdef RGBLIGHT_TWINKLE
static rgblight_fadeout lights[RGBLED_NUM];
__attribute__((weak)) bool rgblight_twinkle_is_led_used_keymap(uint8_t index) { return false; }
@@ -105,40 +93,40 @@ __attribute__((weak)) bool rgblight_twinkle_is_led_used_keymap(uint8_t index) {
/* This function checks for used LEDs. This way, collisions don't occur and cause weird rendering */
bool rgblight_twinkle_is_led_used(uint8_t index) {
switch (index) {
-# ifdef INDICATOR_LIGHTS
-# ifdef SHFT_LED1
+# ifdef INDICATOR_LIGHTS
+# ifdef SHFT_LED1
case SHFT_LED1:
return true;
-# endif // SHFT_LED1
-# ifdef SHFT_LED2
+# endif // SHFT_LED1
+# ifdef SHFT_LED2
case SHFT_LED2:
return true;
-# endif // SHFT_LED2
-# ifdef CTRL_LED1
+# endif // SHFT_LED2
+# ifdef CTRL_LED1
case CTRL_LED1:
return true;
-# endif // CTRL_LED1
-# ifdef CTRL_LED2
+# endif // CTRL_LED1
+# ifdef CTRL_LED2
case CTRL_LED2:
return true;
-# endif // CTRL_LED2
-# ifdef GUI_LED1
+# endif // CTRL_LED2
+# ifdef GUI_LED1
case GUI_LED1:
return true;
-# endif // GUI_LED1
-# ifdef GUI_LED2
+# endif // GUI_LED1
+# ifdef GUI_LED2
case GUI_LED2:
return true;
-# endif // GUI_LED2
-# ifdef ALT_LED1
+# endif // GUI_LED2
+# ifdef ALT_LED1
case ALT_LED1:
return true;
-# endif // ALT_LED1
-# ifdef ALT_LED2
+# endif // ALT_LED1
+# ifdef ALT_LED2
case ALT_LED2:
return true;
-# endif // ALT_LED2
-# endif // INDICATOR_LIGHTS
+# endif // ALT_LED2
+# endif // INDICATOR_LIGHTS
default:
return rgblight_twinkle_is_led_used_keymap(index);
}
@@ -213,23 +201,15 @@ void start_rgb_light(void) {
rgblight_sethsv_at(light->hue, 255, light->life, light_index);
}
-# endif
-#endif // RGBLIGHT_ENABLE
+#endif
-bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
+bool process_record_user_rgb_light(uint16_t keycode, keyrecord_t *record) {
uint16_t temp_keycode = keycode;
// Filter out the actual keycode from MT and LT keys.
if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
temp_keycode &= 0xFF;
}
-#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
- hypno_timer = timer_read32();
- if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_REST_MODE) {
- rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP);
- }
-#endif
-
switch (temp_keycode) {
#ifdef RGBLIGHT_TWINKLE
case KC_A ... KC_SLASH:
@@ -242,228 +222,19 @@ bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
start_rgb_light();
}
break;
-#endif // RGBLIGHT_TWINKLE
- case KC_RGB_T: // This allows me to use underglow as layer indication, or as normal
-#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
- if (record->event.pressed) {
- userspace_config.rgb_layer_change ^= 1;
- dprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
- eeconfig_update_user(userspace_config.raw);
- if (userspace_config.rgb_layer_change) {
-# if defined(RGBLIGHT_ENABLE) && defined(RGB_MATRIX_ENABLE)
- rgblight_enable_noeeprom();
-# endif
- layer_state_set(layer_state); // This is needed to immediately set the layer color (looks better)
-# if defined(RGBLIGHT_ENABLE) && defined(RGB_MATRIX_ENABLE)
- } else {
- rgblight_disable_noeeprom();
-# endif
- }
- }
-#endif // RGBLIGHT_ENABLE
- break;
- case RGB_IDL: // This allows me to use underglow as layer indication, or as normal
-#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
- if (record->event.pressed) {
- userspace_config.rgb_matrix_idle_anim ^= 1;
- dprintf("RGB Matrix Idle Animation [EEPROM]: %u\n", userspace_config.rgb_matrix_idle_anim);
- eeconfig_update_user(userspace_config.raw);
- if (userspace_config.rgb_matrix_idle_anim) {
- rgb_matrix_mode_noeeprom(RGB_MATRIX_TYPING_HEATMAP);
- }
- }
-#endif
- break;
-#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
- case RGB_TOG:
- // Split keyboards need to trigger on key-up for edge-case issue
-# ifndef SPLIT_KEYBOARD
- if (record->event.pressed) {
-# else
- if (!record->event.pressed) {
-# endif
-# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- rgblight_toggle();
-# endif
-# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
- rgb_matrix_toggle();
-# endif
- }
- return false;
- break;
- case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // quantum_keycodes.h L400 for definitions
- if (record->event.pressed) {
- bool is_eeprom_updated;
-# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- // This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
- if (userspace_config.rgb_layer_change) {
- userspace_config.rgb_layer_change = false;
- dprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
- is_eeprom_updated = true;
- }
-# endif
-# if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
- if (userspace_config.rgb_matrix_idle_anim) {
- userspace_config.rgb_matrix_idle_anim = false;
- dprintf("RGB Matrix Idle Animation [EEPROM]: %u\n", userspace_config.rgb_matrix_idle_anim);
- is_eeprom_updated = true;
- }
-# endif
- if (is_eeprom_updated) {
- eeconfig_update_user(userspace_config.raw);
- }
- }
-
-# if defined(RGBLIGHT_DISABLE_KEYCODES) || defined(RGB_MATRIX_DISABLE_KEYCODES)
- if (keycode == RGB_MODE_FORWARD && record->event.pressed) {
- uint8_t shifted = get_mods() & (MOD_MASK_SHIFT);
- if (shifted) {
-# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- rgblight_step_reverse();
-# endif
-# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
- rgb_matrix_step_reverse();
-# endif
- } else {
-# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- rgblight_step();
-# endif
-# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
- rgb_matrix_step();
-# endif
- }
- } else if (keycode == RGB_MODE_REVERSE && record->event.pressed) {
- uint8_t shifted = get_mods() & (MOD_MASK_SHIFT);
- if (shifted) {
-# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- rgblight_step();
-# endif
-# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
- rgb_matrix_step();
-# endif
- } else {
-# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- rgblight_step_reverse();
-# endif
-# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
- rgb_matrix_step_reverse();
-# endif
- }
- } else if (keycode == RGB_HUI) {
-# ifndef SPLIT_KEYBOARD
- if (record->event.pressed) {
-# else
- if (!record->event.pressed) {
-# endif
-# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- rgblight_increase_hue();
-# endif
-# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
- rgb_matrix_increase_hue();
-# endif
- }
- } else if (keycode == RGB_HUD) {
-# ifndef SPLIT_KEYBOARD
- if (record->event.pressed) {
-# else
- if (!record->event.pressed) {
-# endif
-# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- rgblight_decrease_hue();
-# endif
-# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
- rgb_matrix_decrease_hue();
-# endif
- }
- } else if (keycode == RGB_SAI) {
-# ifndef SPLIT_KEYBOARD
- if (record->event.pressed) {
-# else
- if (!record->event.pressed) {
-# endif
-# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- rgblight_increase_sat();
-# endif
-# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
- rgb_matrix_increase_sat();
-# endif
- }
- } else if (keycode == RGB_SAD) {
-# ifndef SPLIT_KEYBOARD
- if (record->event.pressed) {
-# else
- if (!record->event.pressed) {
-# endif
-# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- rgblight_decrease_sat();
-# endif
-# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
- rgb_matrix_decrease_sat();
-# endif
- }
- } else if (keycode == RGB_VAI) {
-# ifndef SPLIT_KEYBOARD
- if (record->event.pressed) {
-# else
- if (!record->event.pressed) {
-# endif
-# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- rgblight_increase_val();
-# endif
-# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
- rgb_matrix_increase_val();
-# endif
- }
- } else if (keycode == RGB_VAD) {
-# ifndef SPLIT_KEYBOARD
- if (record->event.pressed) {
-# else
- if (!record->event.pressed) {
-# endif
-# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- rgblight_decrease_val();
-# endif
-# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
- rgb_matrix_decrease_val();
-# endif
- }
- } else if (keycode == RGB_SPI) {
- if (record->event.pressed) {
-# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- rgblight_increase_speed();
-# endif
-# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
- rgb_matrix_increase_speed();
-# endif
- }
- } else if (keycode == RGB_SPD) {
- if (record->event.pressed) {
-# if defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)
- rgblight_decrease_speed();
-# endif
-# if defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES)
- rgb_matrix_decrease_speed();
-# endif
- }
- }
- return false;
-# endif
-#endif
-
- break;
+#endif // RGBLIGHT_TWINKLE
}
return true;
}
-void keyboard_post_init_rgb(void) {
-#if defined(RGBLIGHT_ENABLE)
-# if defined(RGBLIGHT_STARTUP_ANIMATION)
+void keyboard_post_init_rgb_light(void) {
+#if defined(RGBLIGHT_STARTUP_ANIMATION)
bool is_enabled = rgblight_config.enable;
if (userspace_config.rgb_layer_change) {
rgblight_enable_noeeprom();
}
if (rgblight_config.enable) {
- layer_state_set_user(layer_state);
+ layer_state_set_rgb_light(layer_state);
uint16_t old_hue = rgblight_config.hue;
rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
for (uint16_t i = 255; i > 0; i--) {
@@ -476,17 +247,11 @@ void keyboard_post_init_rgb(void) {
rgblight_disable_noeeprom();
}
-# endif
- layer_state_set_user(layer_state);
-#endif
-#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
- if (userspace_config.rgb_matrix_idle_anim) {
- rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE);
- }
#endif
+ layer_state_set_rgb_light(layer_state);
}
-void matrix_scan_rgb(void) {
+void matrix_scan_rgb_light(void) {
#ifdef RGBLIGHT_ENABLE
# ifdef RGBLIGHT_TWINKLE
scan_rgblight_fadeout();
@@ -496,23 +261,15 @@ void matrix_scan_rgb(void) {
matrix_scan_indicator();
# endif
#endif
-
-#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_FRAMEBUFFER_EFFECTS)
- if (userspace_config.rgb_matrix_idle_anim && rgb_matrix_get_mode() == RGB_MATRIX_TYPING_HEATMAP && timer_elapsed32(hypno_timer) > 15000) {
- rgb_matrix_mode_noeeprom(RGB_MATRIX_REST_MODE);
- }
-#endif
}
-#ifdef RGBLIGHT_ENABLE
void rgblight_set_hsv_and_mode(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode) {
rgblight_sethsv_noeeprom(hue, sat, val);
wait_us(175); // Add a slight delay between color and mode to ensure it's processed correctly
rgblight_mode_noeeprom(mode);
}
-#endif
-layer_state_t layer_state_set_rgb(layer_state_t state) {
+layer_state_t layer_state_set_rgb_light(layer_state_t state) {
#ifdef RGBLIGHT_ENABLE
if (userspace_config.rgb_layer_change) {
switch (get_highest_layer(state)) {
@@ -574,40 +331,3 @@ layer_state_t layer_state_set_rgb(layer_state_t state) {
return state;
}
-
-#ifdef RGB_MATRIX_ENABLE
-# include "lib/lib8tion/lib8tion.h"
-extern led_config_t g_led_config;
-
-void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type) {
- HSV hsv = {hue, sat, val};
- if (hsv.v > rgb_matrix_config.hsv.v) {
- hsv.v = rgb_matrix_config.hsv.v;
- }
-
- switch (mode) {
- case 1: // breathing
- {
- uint16_t time = scale16by8(g_rgb_counters.tick, speed / 8);
- hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v);
- RGB rgb = hsv_to_rgb(hsv);
- for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
- if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
- rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
- }
- }
- break;
- }
- default: // Solid Color
- {
- RGB rgb = hsv_to_rgb(hsv);
- for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) {
- if (HAS_FLAGS(g_led_config.flags[i], led_type)) {
- rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
- }
- }
- break;
- }
- }
-}
-#endif
diff --git a/users/drashna/rgb_stuff.h b/users/drashna/rgb_stuff.h
index 50b73c1c3cb..98a552db1b8 100644
--- a/users/drashna/rgb_stuff.h
+++ b/users/drashna/rgb_stuff.h
@@ -1,10 +1,7 @@
#pragma once
#include "quantum.h"
-#ifdef RGB_MATRIX_ENABLE
-# include "rgb_matrix.h"
-#endif
-#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_TWINKLE)
+#if defined(RGBLIGHT_TWINKLE)
typedef struct {
bool enabled;
uint8_t hue;
@@ -13,20 +10,13 @@ typedef struct {
} rgblight_fadeout;
#endif
-bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record);
-void keyboard_post_init_rgb(void);
-void matrix_scan_rgb(void);
-layer_state_t layer_state_set_rgb(layer_state_t state);
-layer_state_t default_layer_state_set_rgb(layer_state_t state);
+bool process_record_user_rgb_light(uint16_t keycode, keyrecord_t *record);
+void keyboard_post_init_rgb_light(void);
+void matrix_scan_rgb_light(void);
+layer_state_t layer_state_set_rgb_light(layer_state_t state);
+layer_state_t default_layer_state_set_rgb_light(layer_state_t state);
+void rgblight_sethsv_default_helper(uint8_t index);
-#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_TWINKLE)
+#if defined(RGBLIGHT_TWINKLE)
void scan_rgblight_fadeout(void);
#endif
-#if defined(RGBLIGHT_ENABLE)
-void rgblight_sethsv_default_helper(uint8_t index);
-#endif
-
-#ifdef RGB_MATRIX_ENABLE
-void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue);
-void rgb_matrix_layer_helper(uint8_t hue, uint8_t sat, uint8_t val, uint8_t mode, uint8_t speed, uint8_t led_type);
-#endif
diff --git a/users/drashna/rules.mk b/users/drashna/rules.mk
index 4d55da803f9..051368ff5ea 100644
--- a/users/drashna/rules.mk
+++ b/users/drashna/rules.mk
@@ -2,9 +2,10 @@ SRC += drashna.c \
process_records.c
ifneq ($(PLATFORM),CHIBIOS)
- LTO_ENABLE = yes
+ LTO_ENABLE = yes
endif
SPACE_CADET_ENABLE = no
+GRAVE_ESC_ENABLE = no
ifneq ($(strip $(NO_SECRETS)), yes)
ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
@@ -19,10 +20,6 @@ ifeq ($(strip $(TAP_DANCE_ENABLE)), yes)
SRC += tap_dances.c
endif
-
-
-
-
ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
SRC += rgb_stuff.c
ifeq ($(strip $(INDICATOR_LIGHTS)), yes)
@@ -41,7 +38,7 @@ endif
RGB_MATRIX_ENABLE ?= no
ifneq ($(strip $(RGB_MATRIX_ENABLE)), no)
- SRC += rgb_stuff.c
+ SRC += rgb_matrix_stuff.c
endif
@@ -61,3 +58,7 @@ endif
ifeq ($(strip $(PROTOCOL)), VUSB)
NKRO_ENABLE = no
endif
+
+ifeq ($(strip $(OLED_DRIVER_ENABLE)), yes)
+ SRC += oled_stuff.c
+endif
diff --git a/users/ericgebhart/base_layers.h b/users/ericgebhart/base_layers.h
new file mode 100644
index 00000000000..caf08105747
--- /dev/null
+++ b/users/ericgebhart/base_layers.h
@@ -0,0 +1,283 @@
+#pragma once
+/*
+ Copyright 2018 Eric Gebhart
+
+ 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 .
+*/
+
+#include "core_keysets.h"
+
+/******************************************************************/
+/* These are the keys for the middle and bottom edge of any layout*/
+/* That way we only need to set them once and use them everywhere */
+/* The thumb keys, the bottom rows, etc. */
+/******************************************************************/
+/******************************************************************/
+/* Middle Keysets for the XD75 */
+/******************************************************************/
+
+// For the middle keys of an xd75. It's got one more column in the middle than
+// the ergodox, or the viterbi. And the Ergodox is missing a key in column 7
+// counting from either end. Which is the first and 3rd columns of these sets.
+
+// it's all an experient. I'm not sure what make sense here.
+// stealing what I can from the ergodox layout.
+/* The XD75 has 3 keys inbetween the usual left and right hand */
+#define ___ORTHO_15_MIDDLE_T___ OSL(LAYERS), LCTL(KC_A), MDIA_SYMB_KP_LAYERS
+#define ___ORTHO_15_MIDDLE_1___ LCTL(KC_C), LCTL(KC_X), LCTL(KC_V)
+#define ___ORTHO_15_MIDDLE_2___ TO(SYMB), TO(_RGB), TO(KEYPAD)
+#define ___ORTHO_15_MIDDLE_3___ OSL(SYMB), TO(MDIA), OSL(KEYPAD)
+#define ___ORTHO_15_MIDDLE_4___ CTL_BSPC, ALT_DEL, XMONAD_ESC, ALT_ENT, CTL_SPC
+
+// The same, for BEPO
+#define ___ORTHO_15_MIDDLE_T_BP___ OSL(LAYERS), LCTL(BP_A), MDIA_SYMB_KP_LAYERS
+#define ___ORTHO_15_MIDDLE_1_BP___ LCTL(BP_C), LCTL(BP_X), LCTL(BP_V)
+#define ___ORTHO_15_MIDDLE_2_BP___ TO(SYMB_ON_BEPO), TO(_RGB), TO(KEYPAD_ON_BEPO)
+#define ___ORTHO_15_MIDDLE_3_BP___ OSL(SYMB_ON_BEPO), TO(MDIA), OSL(KEYPAD_ON_BEPO)
+
+// The Viterbi only has 2 keys in the middle.
+#define ___ORTHO_14_MIDDLE_T___ OSL(LAYERS), MDIA_SYMB_KP_LAYERS
+#define ___ORTHO_14_MIDDLE_1___ LCTL(KC_C), LCTL(KC_V)
+#define ___ORTHO_14_MIDDLE_2___ TO(SYMB), TO(KEYPAD)
+#define ___ORTHO_14_MIDDLE_3___ OSL(SYMB), OSL(KEYPAD)
+
+// becomes the upper thumbs, the real 4th row if we throw away
+// the number row at the top
+#define ___ORTHO_14_MIDDLE_4___ LSFT(KC_TAB), HOME_END, KC_PGDN, KC_TAB
+// basically the thumb keys like on the ergodox.
+#define ___MIDDLE_THUMBS___ CTL_BSPC, ALT_DEL, XMONAD_ESC, KC_PGDN, ALT_ENT, CTL_SPC
+
+// The same, for BEPO
+#define ___ORTHO_14_MIDDLE_T_BP___ OSL(LAYERS), MDIA_SYMB_KP_LAYERS
+#define ___ORTHO_14_MIDDLE_1_BP___ LCTL(BP_C), LCTL(BP_V)
+#define ___ORTHO_14_MIDDLE_2_BP___ TO(SYMB_ON_BEPO), TO(KEYPAD_ON_BEPO)
+#define ___ORTHO_14_MIDDLE_3_BP___ OSL(SYMB_ON_BEPO), OSL(KEYPAD_ON_BEPO)
+
+#define ___ORTHO_14_MIDDLE_4_BP___ LSFT(KC_TAB), HOME_END, KC_PGUP, KC_TAB
+
+
+/********************************************************************/
+/** The top rows for numbers, symbols and Fkeys. **/
+/********************************************************************/
+#define ___ORTHO_15_N___ ___NUMBER_L___, ___ORTHO_15_MIDDLE_T___, ___NUMBER_R___
+#define ___ORTHO_15_B_N___ ___NUMBER_BEPO_L___, ___ORTHO_15_MIDDLE_T_BP___, ___NUMBER_BEPO_R___
+// the full bepo symbol row.
+#define ___ORTHO_15_B_SYMB___ BP_DLR, ___SYMBOL_BEPO_L___, ___ORTHO_15_MIDDLE_T_BP___, ___SYMBOL_BEPO_R___, BP_EQL
+
+// transparent in the middle because I only put this on transient layers.
+#define ___ORTHO_15_FUNC_1_12___ ___FUNC_1_6___, ___3___, ___FUNC_7_12___
+
+
+/********************************************************************/
+/** The bottom row and thumbs as needed. **/
+/********************************************************************/
+#define ___BOTTOM_LEFT___ LCTL(KC_C), LCTL(KC_V), KC_INS, KC_LEFT, KC_RIGHT
+#define ___BOTTOM_RIGHT___ KC_UP, KC_DOWN, KC_BSLASH, LCTL(KC_V), LCTL(KC_C)
+
+// the bottom rows for keyboards on bepo.
+// bepo on bepo - not enough space to go around....
+#define ___BOTTOM_LEFT_BP___ LCTL(BP_C), BP_ECRC, LCTL(BP_V), KC_LEFT, KC_RIGHT
+#define ___BOTTOM_RIGHT_BP___ KC_UP, KC_DOWN, DB_BACKSLASH, BP_CCED, BP_PERC
+
+// for dvorak on bepo
+#define ___BOTTOM_LEFT_FR___ LCTL(BP_C), LCTL(BP_C), LCTL(BP_V), KC_LEFT, KC_RIGHT
+#define ___BOTTOM_RIGHT_FR___ KC_UP, KC_DOWN, DB_BACKSLASH, LCTL(KC_V), LCTL(KC_C)
+
+#define ___ORTHO_15_BOTTOM___ ___BOTTOM_LEFT___, ___ORTHO_15_MIDDLE_4___, ___BOTTOM_RIGHT___
+#define ___ORTHO_15_BOTTOM_FR___ ___BOTTOM_LEFT_FR___, ___ORTHO_15_MIDDLE_4___, ___BOTTOM_RIGHT_FR___
+#define ___ORTHO_15_BOTTOM_BP___ ___BOTTOM_LEFT_BP___, ___ORTHO_15_MIDDLE_4___, ___BOTTOM_RIGHT_BP___
+
+#define ___ORTHO_14_BOTTOM___ ___BOTTOM_LEFT___, ___ORTHO_14_MIDDLE_4___, ___BOTTOM_RIGHT___
+#define ___ORTHO_14_BOTTOM_FR___ ___BOTTOM_LEFT_FR___, ___ORTHO_14_MIDDLE_4___, ___BOTTOM_RIGHT_FR___
+#define ___ORTHO_14_BOTTOM_BP___ ___BOTTOM_LEFT_BP___, ___ORTHO_14_MIDDLE_4___, ___BOTTOM_RIGHT_BP___
+#define ___ORTHO_14_THUMBS_BOTTOM___ ___4___, ___MIDDLE_THUMBS___, ___4___
+
+
+#define ___ERGODOX_THUMB_LEFT___ \
+ OSL(SYMB), OSM(KC_LGUI), \
+ HOME_END, \
+ CTL_BSPC, ALT_DEL, XMONAD_ESC
+
+#define ___ERGODOX_THUMB_RIGHT___ \
+ XXX, OSL(KEYPAD), \
+ KC_PGUP, \
+ KC_PGDN, ALT_ENT, CTL_SPC
+
+#define ___ERGODOX_THUMB_RIGHT_BP___ \
+ XXX, OSL(KEYPAD_ON_BEPO), \
+ KC_PGUP, \
+ KC_PGDN, ALT_ENT, CTL_SPC
+
+#define ___ERGODOX_THUMB_LEFT_BP___ \
+ OSL(SYMB_ON_BEPO), OSM(KC_LGUI), \
+ HOME_END, \
+ CTL_BSPC, ALT_DEL, XMONAD_ESC
+
+/********************************************************************************/
+/* the interior rows for ortholinear keyboards. the first number is the length */
+/* So you can put what you want on the outside ends, make new middles as needed */
+/* It would be nice to make this a little more dynamic. There is little */
+/* differenc between them. */
+/********************************************************************************/
+
+//// ortho15 core rows. used with my xd75.
+/***********************************************************/
+/* ORTHO15 interior rows. used with my xd75 */
+/***********************************************************/
+#define ___13_DVORAK_1___ ___DVORAK_L1___, ___ORTHO_15_MIDDLE_1___, ___DVORAK_R1___
+#define ___13_DVORAK_2___ ___DVORAK_L2___, ___ORTHO_15_MIDDLE_2___, ___DVORAK_R2___
+#define ___13_DVORAK_3___ ___DVORAK_L3___, ___ORTHO_15_MIDDLE_3___, ___DVORAK_R3___
+
+#define ___13_QWERTY_1___ ___QWERTY_L1___, ___ORTHO_15_MIDDLE_1___, ___QWERTY_R1___
+#define ___13_QWERTY_2___ ___QWERTY_L2___, ___ORTHO_15_MIDDLE_2___, ___QWERTY_R2___
+#define ___13_QWERTY_3___ ___QWERTY_L3___, ___ORTHO_15_MIDDLE_3___, ___QWERTY_R3___
+
+#define ___13_COLEMAK_1___ ___COLEMAK_L1___, ___ORTHO_15_MIDDLE_1___, ___COLEMAK_R1___
+#define ___13_COLEMAK_2___ ___COLEMAK_L2___, ___ORTHO_15_MIDDLE_2___, ___COLEMAK_R2___
+#define ___13_COLEMAK_3___ ___COLEMAK_L3___, ___ORTHO_15_MIDDLE_3___, ___COLEMAK_R3___
+
+#define ___13_WORKMAN_1___ ___WORKMAN_L1___, ___ORTHO_15_MIDDLE_1___, ___WORKMAN_R1___
+#define ___13_WORKMAN_2___ ___WORKMAN_L2___, ___ORTHO_15_MIDDLE_2___, ___WORKMAN_R2___
+#define ___13_WORKMAN_3___ ___WORKMAN_L3___, ___ORTHO_15_MIDDLE_3___, ___WORKMAN_R3___
+
+#define ___13_NORMAN_1___ ___NORMAN_L1___, ___ORTHO_15_MIDDLE_1___, ___NORMAN_R1___
+#define ___13_NORMAN_2___ ___NORMAN_L2___, ___ORTHO_15_MIDDLE_2___, ___NORMAN_R2___
+#define ___13_NORMAN_3___ ___NORMAN_L3___, ___ORTHO_15_MIDDLE_3___, ___NORMAN_R3___
+
+#define ___13_DVORAK_B_1___ ___DVORAK_FR_L1___, ___ORTHO_15_MIDDLE_1_BP___, ___DVORAK_FR_R1___
+#define ___13_DVORAK_B_2___ ___DVORAK_FR_L2___, ___ORTHO_15_MIDDLE_2_BP___, ___DVORAK_FR_R2___
+#define ___13_DVORAK_B_3___ ___DVORAK_FR_L3___, ___ORTHO_15_MIDDLE_3_BP___, ___DVORAK_FR_R3___
+
+#define ___13_BEPO_1___ ___BEPO_FR_L1___, ___ORTHO_15_MIDDLE_1_BP___, ___BEPO_FR_R1___
+#define ___13_BEPO_2___ ___BEPO_FR_L2___, ___ORTHO_15_MIDDLE_2_BP___, ___BEPO_FR_R2___
+#define ___13_BEPO_3___ ___BEPO_FR_L3___, ___ORTHO_15_MIDDLE_3_BP___, ___BEPO_FR_R3___
+
+// transparent xmonad/dvorak layer
+#define ___15_XMONAD_1___ ___, ___DVORAK_L1___, ___3___, ___DVORAK_R1___, ___
+#define ___15_XMONAD_2___ ___, ___DVORAK_L2___, ___3___, ___DVORAK_R2___, ___
+#define ___15_XMONAD_3___ ___, ___DVORAK_L3___, ___3___, ___DVORAK_R3___, ___
+
+// transparent xmonad/dvorak layer in bepo
+#define ___15_XMONAD_B_1___ ___, ___DVORAK_FR_L1___, ___3___, ___DVORAK_FR_R1___, ___
+#define ___15_XMONAD_B_2___ ___, ___DVORAK_FR_L2___, ___3___, ___DVORAK_FR_R2___, ___
+#define ___15_XMONAD_B_3___ ___, ___DVORAK_FR_L3___, ___3___, ___DVORAK_FR_R3___, ___
+
+#define ___15_SYMB_1___ ___SYMBOLS6_1___, ___3___, ___SYMPAD_1___
+#define ___15_SYMB_2___ ___SYMBOLS6_2___, ___3___, ___SYMPAD_2___
+#define ___15_SYMB_3___ ___SYMBOLS6_3___, ___3___, ___SYMPAD_3___
+#define ___15_SYMB_4___ ___SYMBOLS6_4___, ___3___, ___SYMPAD_4___
+
+#define ___15_KP_1___ ___2___, ___FUNCPAD_T___, ___5___, ___KEYPAD_1___, ___
+#define ___15_KP_2___ ___2___, ___FUNCPAD_1___, ___5___, ___KEYPAD_2___, ___
+#define ___15_KP_3___ ___2___, ___FUNCPAD_2___, ___5___, ___KEYPAD_3___, KC_PENT
+#define ___15_KP_4___ ___2___, ___FUNCPAD_3___, ___5___, ___KEYPAD_4___, ___
+
+#define ___15_KP_B_1___ ___2___, ___FUNCPAD_T___, ___5___, ___KEYPAD_1_BP___, ___
+#define ___15_KP_B_2___ ___2___, ___FUNCPAD_1___, ___5___, ___KEYPAD_2_BP___, ___
+#define ___15_KP_B_3___ ___2___, ___FUNCPAD_2___, ___5___, ___KEYPAD_3_BP___, KC_PENT
+#define ___15_KP_B_4___ ___2___, ___FUNCPAD_3___, ___5___, ___KEYPAD_4_BP___, ___
+
+#define ___15_SYMB_B_1___ ___SYMBOLS6_1_BP___, ___3___, ___SYMPAD_1_BP___
+#define ___15_SYMB_B_2___ ___SYMBOLS6_2_BP___, ___3___, ___SYMPAD_2_BP___
+#define ___15_SYMB_B_3___ ___SYMBOLS6_3_BP___, ___3___, ___SYMPAD_3_BP___
+#define ___15_SYMB_B_4___ ___SYMBOLS6_4_BP___, ___3___, ___SYMPAD_4_BP___
+
+#define ___15_MDIA_1___ ___MOUSE_BTNS_L___, ___4___, KC_VOLU, ___MUTE_PRV_PLAY_NXT_STOP___
+#define ___15_MDIA_2___ ___, ___MOUSE_LDUR___, ___4___, KC_VOLD, ___VI_ARROWS___, ___
+#define ___15_MDIA_3___ ___, ___MWHEEL_LDUR___, ___4___, KC_PGUP, ___MOUSE_BTNS_R___
+#define ___15_MDIA_4___ ___2___, ___MACCL___, ___4___, KC_PGDN, ___5___
+
+#define ___15_LAYERS_1___ ___X3___, ___2_LAYERS_B1___, ___5___, ___3_LAYERS_T_BP___, ___X2___
+#define ___15_LAYERS_2___ ___X3___, ___2_LAYERS_B2___, ___5___, ___3_LAYERS_T___, ___X2___
+#define ___15_LAYERS_3___ ___X2___, ___3_LAYERS_B3___, ___5___, ___3_LAYERS_T_CTL___, ___X2___
+
+#define ___15_RGB_1___ ___, ___RGB_HUE_SAT_INT_UP___, ___5___, ___5___
+#define ___15_RGB_2___ ___, ___RGB_HUE_SAT_INT_DN___, RGB_TOG, ___4___, ___RGB_P_B_R_SW_SN___
+#define ___15_RGB_3___ ___5___, ___5___, ___RGB_KXGT___, ___
+
+
+
+/***********************************************************/
+/* ORTHO14 base layer interior rows. used with my viterbi */
+/***********************************************************/
+#define ___12_DVORAK_1___ ___DVORAK_L1___, ___ORTHO_14_MIDDLE_1___, ___DVORAK_R1___
+#define ___12_DVORAK_2___ ___DVORAK_L2___, ___ORTHO_14_MIDDLE_2___, ___DVORAK_R2___
+#define ___12_DVORAK_3___ ___DVORAK_L3___, ___ORTHO_14_MIDDLE_3___, ___DVORAK_R3___
+
+#define ___12_QWERTY_1___ ___QWERTY_L1___, ___ORTHO_14_MIDDLE_1___, ___QWERTY_R1___
+#define ___12_QWERTY_2___ ___QWERTY_L2___, ___ORTHO_14_MIDDLE_2___, ___QWERTY_R2___
+#define ___12_QWERTY_3___ ___QWERTY_L3___, ___ORTHO_14_MIDDLE_3___, ___QWERTY_R3___
+
+#define ___12_COLEMAK_1___ ___COLEMAK_L1___, ___ORTHO_14_MIDDLE_1___, ___COLEMAK_R1___
+#define ___12_COLEMAK_2___ ___COLEMAK_L2___, ___ORTHO_14_MIDDLE_2___, ___COLEMAK_R2___
+#define ___12_COLEMAK_3___ ___COLEMAK_L3___, ___ORTHO_14_MIDDLE_3___, ___COLEMAK_R3___
+
+#define ___12_WORKMAN_1___ ___WORKMAN_L1___, ___ORTHO_14_MIDDLE_1___, ___WORKMAN_R1___
+#define ___12_WORKMAN_2___ ___WORKMAN_L2___, ___ORTHO_14_MIDDLE_2___, ___WORKMAN_R2___
+#define ___12_WORKMAN_3___ ___WORKMAN_L3___, ___ORTHO_14_MIDDLE_3___, ___WORKMAN_R3___
+
+#define ___12_NORMAN_1___ ___NORMAN_L1___, ___ORTHO_14_MIDDLE_1___, ___NORMAN_R1___
+#define ___12_NORMAN_2___ ___NORMAN_L2___, ___ORTHO_14_MIDDLE_2___, ___NORMAN_R2___
+#define ___12_NORMAN_3___ ___NORMAN_L3___, ___ORTHO_14_MIDDLE_3___, ___NORMAN_R3___
+
+#define ___12_DVORAK_B_1___ ___DVORAK_FR_L1___, ___ORTHO_14_MIDDLE_1_BP___, ___DVORAK_FR_R1___
+#define ___12_DVORAK_B_2___ ___DVORAK_FR_L2___, ___ORTHO_14_MIDDLE_2_BP___, ___DVORAK_FR_R2___
+#define ___12_DVORAK_B_3___ ___DVORAK_FR_L3___, ___ORTHO_14_MIDDLE_3_BP___, ___DVORAK_FR_R3___
+
+#define ___12_BEPO_2___ ___BEPO_FR_L1___, ___ORTHO_14_MIDDLE_1_BP___, ___BEPO_FR_R1___
+#define ___12_BEPO_3___ ___BEPO_FR_L2___, ___ORTHO_14_MIDDLE_2_BP___, ___BEPO_FR_R2___
+#define ___12_BEPO_4___ ___BEPO_FR_L3___, ___ORTHO_14_MIDDLE_3_BP___, ___BEPO_FR_R3___
+
+
+// transparent layers.
+#define ___14_XMONAD_1___ ___, ___DVORAK_L1___, ___2___, ___DVORAK_R1___, ___
+#define ___14_XMONAD_2___ ___, ___DVORAK_L2___, ___2___, ___DVORAK_R2___, ___
+#define ___14_XMONAD_3___ ___, ___DVORAK_L3___, ___2___, ___DVORAK_R3___, ___
+
+#define ___14_XMONAD_B_1___ ___, ___DVORAK_FR_L1___, ___2___, ___DVORAK_FR_R1___, ___
+#define ___14_XMONAD_B_2___ ___, ___DVORAK_FR_L2___, ___2___, ___DVORAK_FR_R2___, ___
+#define ___14_XMONAD_B_3___ ___, ___DVORAK_FR_L3___, ___2___, ___DVORAK_FR_R3___, ___
+
+#define ___14_SYMB_1___ ___SYMBOLS6_1___, ___2___, ___SYMPAD_1___
+#define ___14_SYMB_2___ ___SYMBOLS6_2___, ___2___, ___SYMPAD_2___
+#define ___14_SYMB_3___ ___SYMBOLS6_3___, ___2___, ___SYMPAD_3___
+#define ___14_SYMB_4___ ___SYMBOLS6_4___, ___2___, ___SYMPAD_4___
+
+#define ___14_KP_1___ ___2___, ___FUNCPAD_T___, ___4___, ___KEYPAD_1___, ___
+#define ___14_KP_2___ ___2___, ___FUNCPAD_1___, ___4___, ___KEYPAD_2___, ___
+#define ___14_KP_3___ ___2___, ___FUNCPAD_2___, ___4___, ___KEYPAD_3___, KC_PENT
+#define ___14_KP_4___ ___2___, ___FUNCPAD_3___, ___4___, ___KEYPAD_4___, ___
+
+#define ___14_KP_B_1___ ___2___, ___FUNCPAD_T___, ___4___, ___KEYPAD_1_BP___, ___
+#define ___14_KP_B_2___ ___2___, ___FUNCPAD_1___, ___4___, ___KEYPAD_2_BP___, ___
+#define ___14_KP_B_3___ ___2___, ___FUNCPAD_2___, ___4___, ___KEYPAD_3_BP___, KC_PENT
+#define ___14_KP_B_4___ ___2___, ___FUNCPAD_3___, ___4___, ___KEYPAD_4_BP___, ___
+
+#define ___14_SYMB_B_1___ ___SYMBOLS6_1_BP___, ___2___, ___SYMPAD_1_BP___
+#define ___14_SYMB_B_2___ ___SYMBOLS6_2_BP___, ___2___, ___SYMPAD_2_BP___
+#define ___14_SYMB_B_3___ ___SYMBOLS6_3_BP___, ___2___, ___SYMPAD_3_BP___
+#define ___14_SYMB_B_4___ ___SYMBOLS6_4_BP___, ___2___, ___SYMPAD_4_BP___
+
+#define ___14_MDIA_1___ ___MOUSE_BTNS_L___, ___3___, KC_VOLU, ___MUTE_PRV_PLAY_NXT_STOP___
+#define ___14_MDIA_2___ ___, ___MOUSE_LDUR___, ___3___, KC_VOLD, ___VI_ARROWS___, ___
+#define ___14_MDIA_3___ ___, ___MWHEEL_LDUR___, ___3___, KC_PGUP, ___MOUSE_BTNS_R___
+#define ___14_MDIA_4___ ___2___, ___MACCL___, ___3___, KC_PGDN, ___5___
+
+#define ___14_LAYERS_1___ ___X3___, ___2_LAYERS_B1___, ___4___, ___3_LAYERS_T_BP___, ___X2___
+#define ___14_LAYERS_2___ ___X3___, ___2_LAYERS_B2___, ___4___, ___3_LAYERS_T___, ___X2___
+#define ___14_LAYERS_3___ ___X2___, ___3_LAYERS_B3___, ___4___, ___3_LAYERS_T_CTL___, ___X2___
+
+#define ___14_RGB_1___ ___, ___RGB_HUE_SAT_INT_UP___, ___4___, ___5___
+#define ___14_RGB_2___ ___, ___RGB_HUE_SAT_INT_DN___, RGB_TOG, ___3___, ___RGB_P_B_R_SW_SN___
+#define ___14_RGB_3___ ___5___, ___4___, ___RGB_KXGT___, ___
diff --git a/users/ericgebhart/core_keys.h b/users/ericgebhart/core_keys.h
new file mode 100644
index 00000000000..035f740016e
--- /dev/null
+++ b/users/ericgebhart/core_keys.h
@@ -0,0 +1,293 @@
+#pragma once
+/*
+ Copyright 2018 Eric Gebhart
+
+ 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 .
+*/
+
+#include "quantum.h"
+#include "process_keycode/process_tap_dance.h"
+#include "eeconfig.h"
+
+//#define ONESHOT_TAP_TOGGLE 2 /* Tapping this number of times holds the key until tapped once again. */
+
+void tap(uint16_t keycode);
+bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
+
+
+typedef union {
+ uint8_t raw;
+ struct {
+ bool clicky_enable :1;
+ bool rgb_layer_change :1;
+ bool is_overwatch :1;
+ bool nuke_switch :1;
+ };
+} userspace_config_t;
+
+
+// for the creation of dvorak keys on an Bepo keyboard at the OS layer.
+// so we can create an array of reasonable size
+// for our translation keys. We have to create a
+// good range of numbers
+#define GR(x) (x-SAFE_RANGE)
+
+uint8_t gr(uint8_t);
+void send_keycode(uint8_t);
+
+#define MOD_NONE 0x00
+
+// indexs for the keycode translation table.
+#define UNSHIFTED_KEY(key) key_translations[gr(key)][0][0]
+#define UNSHIFTED_MODS(key) key_translations[gr(key)][0][1]
+#define SHIFTED_KEY(key) key_translations[gr(key)][1][0]
+#define SHIFTED_MODS(key) key_translations[gr(key)][1][1]
+
+
+enum userspace_custom_keycodes {
+ // keep the keycodes using the send_key function close to SAFE_RANGE
+ // so the array of keycodes remains a reasonbale size.
+ DB_1 = SAFE_RANGE, // can always be here
+ DB_2,
+ DB_3,
+ DB_4,
+ DB_5,
+ DB_6,
+ DB_7,
+ DB_8,
+ DB_9,
+ DB_0,
+ DB_GRV,
+ DB_SCOLON,
+ DB_SLASH,
+ DB_BACKSLASH,
+ DB_EQL,
+ DB_DOT,
+ DB_COMM,
+ DB_QUOT,
+ DB_MINUS,
+ DB_RPRN,
+ DB_LPRN,
+ DB_RBRC,
+ DB_LBRC,
+ // for symbols layer
+ DB_HASH,
+ DB_LCBR,
+ DB_RCBR,
+ DB_PIPE,
+ DB_TILD,
+ DB_CIRC,
+ DB_LESS,
+ DB_GRTR,
+ // End of dvorak on bepo translation keys.
+
+ EPRM,
+ VRSN,
+ KC_DVORAK_ON_BEPO,
+ KC_BEPO,
+ KC_NORMAN,
+ KC_QWERTY,
+ KC_COLEMAK,
+ KC_DVORAK,
+ KC_WORKMAN,
+ KC_MAKE,
+ KC_RESET,
+ KC_RGB_T,
+ KC_SECRET_1,
+ KC_SECRET_2,
+ KC_SECRET_3,
+ KC_SECRET_4,
+ KC_SECRET_5,
+ KC_CCCV
+};
+
+#define SFTGUI_T(kc) { MT(MOD_LGUI | MOD_LSFT, kc) }
+#define SFT_GUI_ESC MT(MOD_LSFT | MOD_LGUI, KC_PGDN) // shift LGUI or Escape.
+#define ALT_ENT ALT_T(KC_ENT) // Alt or enter
+#define CTL_SPC CTL_T(KC_SPC) // ctrl or space
+#define CTL_BSPC CTL_T(KC_BSPC) // ctrl or backspace
+#define ALT_DEL ALT_T(KC_DEL) // Alt or delete
+#define GUI_ESC GUI_T(KC_ESC) // Gui or escape
+#define ALGR_SYMB ALGR_T(TG(SYMB)) // Alt gre or toggle symbol layer
+
+
+
+// OSM keycodes, to keep things clean and easy to change
+#define KC_MLSF OSM(MOD_LSFT)
+#define KC_MRSF OSM(MOD_RSFT)
+#define OS_LGUI OSM(MOD_LGUI)
+#define OS_RGUI OSM(MOD_RGUI)
+#define OS_LSFT OSM(MOD_LSFT)
+#define OS_RSFT OSM(MOD_RSFT)
+#define OS_LCTL OSM(MOD_LCTL)
+#define OS_RCTL OSM(MOD_RCTL)
+#define OS_LALT OSM(MOD_LALT)
+#define OS_RALT OSM(MOD_RALT)
+#define ALT_APP ALT_T(KC_APP)
+
+#define MG_NKRO MAGIC_TOGGLE_NKRO
+
+
+//// TAP DANCE
+
+ typedef struct {
+ bool is_press_action;
+ int state;
+ } tdtap;
+
+enum {
+ SINGLE_TAP = 1,
+ SINGLE_HOLD = 2,
+ DOUBLE_TAP = 3,
+ DOUBLE_HOLD = 4,
+ DOUBLE_SINGLE_TAP = 5, //send two single taps
+ TRIPLE_TAP = 6,
+ TRIPLE_HOLD = 7
+};
+
+//Tap Dance Declarations
+enum {
+ TD_ESC_CAPS = 0,
+ TD_TAB_BKTAB = 1,
+ TD_MDIA_SYMB = 2,
+ TD_HOME_END = 3,
+ TD_XMONAD_ESC = 4,
+ TD_DEF_LAYER_SW = 5,
+ TD_DEF_OS_LAYER_SW = 6,
+ TD_MOUSE_BTNS = 7,
+ TD_DVORAK_BEPO = 8
+};
+
+
+// Tap dance
+#define TAB_BKTAB TD(TD_TAB_BKTAB) // Tab or backtab tapdance.
+#define MDIA_SYMB_KP_LAYERS TD(TD_MDIA_SYMB) // MDIA, symb, keypad, layouts layer tapdance toggle.
+#define DEF_LAYER_SW TD(TD_DEF_LAYER_SW) // dvorak, dvorak_on_bepo, bepo default layer
+#define DEF_OS_LAYER_SW TD(TD_DEF_OS_LAYER_SW) // dvorak, dvorak_on_bepo, bepo default layer
+#define HOME_END TD(TD_HOME_END) // home or end tapdance.
+#define XMONAD_ESC TD(TD_XMONAD_ESC) // Escape, dvorak, media or symb. - tap and hold tap dance. 1-4
+#define DVORAK_ET_BEPO TD(TD_DVORAK_BEPO) // Escape, dvorak, media or symb. - tap and hold tap dance. 1-4
+#define TDMOUSE_BTNS TD(TD_MOUSE_BTNS) // hmmm. 1-5
+
+// HOME ROW LAYER TOGGLE (LT) and Shift.
+// both sides of the home row have "shift, ___, media , symb, ___" and "___, symb, media, ___, shift".
+// so pinky fingers are shift when held and the index and second fingers are symbol and
+// media layers when held.
+
+// Dvorak
+// shift and layer switch on hold on the home row.
+#define KC_SFT_T_A SFT_T(KC_A)
+#define KC_SFT_T_S SFT_T(KC_S)
+
+#define KC_LT_SYMB_U LT(SYMB, KC_U)
+#define KC_LT_SYMB_H LT(SYMB, KC_H)
+
+#define KC_LT_MDIA_E LT(MDIA, KC_E)
+#define KC_LT_MDIA_T LT(MDIA, KC_T)
+
+// Need to add this to the others.
+#define KC_LT_KP_N LT(KEYPAD, KC_N)
+#define KC_LT_KP_O LT(KEYPAD, KC_O)
+
+// for dvorak on bepo
+#define BP_SFT_T_A SFT_T(BP_A)
+#define BP_SFT_T_S SFT_T(BP_S)
+
+#define BP_LT_SYMB_U LT(SYMB, BP_U)
+#define BP_LT_SYMB_H LT(MDIA, BP_H)
+
+#define BP_LT_MDIA_E LT(MDIA, BP_E)
+#define BP_LT_MDIA_T LT(MDIA, BP_T)
+
+// Need to add this to the others.
+#define BP_LT_KP_N LT(KEYPAD, BP_N)
+#define BP_LT_KP_O LT(KEYPAD, BP_O)
+
+// for bepo on bepo
+#define BP_SFT_T_T SFT_T(BP_T)
+#define BP_SFT_T_W SFT_T(BP_W)
+
+#define BP_LT_SYMB_I LT(SYMB_ON_BEPO, BP_I)
+#define BP_LT_MDIA_E LT(MDIA, BP_E)
+#define BP_LT_KP_U LT(KEYPAD, BP_U)
+
+#define BP_LT_SYMB_S LT(SYMB_ON_BEPO, BP_S)
+#define BP_LT_MDIA_R LT(MDIA, BP_R)
+#define BP_LT_KP_N LT(KEYPAD, BP_N)
+
+#define BP_SFT_T_A SFT_T(BP_A)
+#define BP_SFT_T_S SFT_T(BP_S)
+#define BP_SFT_T_E SFT_T(BP_E)
+#define BP_SFT_T_M SFT_T(BP_M)
+
+#define BP_SFT_T_ECRC SFT_T(BP_ECRC)
+#define BP_SFT_T_CCED SFT_T(BP_CCED)
+#define BP_LT_SYMB_COMM LT(SYMB,BP_COMM)
+
+//QWERTY
+#define KC_SFT_T_SCLN SFT_T(KC_SCLN)
+
+#define KC_LT_MDIA_D LT(MDIA, KC_D)
+#define KC_LT_MDIA_K LT(MDIA, KC_K)
+#define KC_LT_SYMB_F LT(SYMB, KC_F)
+#define KC_LT_SYMB_J LT(SYMB, KC_J)
+
+//COLEMAK
+#define KC_SFT_T_O SFT_T(KC_O)
+#define KC_LT_MDIA_S LT(MDIA, KC_S)
+#define KC_LT_SYMB_T LT(SYMB, KC_T)
+
+#define KC_LT_MDIA_E LT(MDIA, KC_E)
+#define KC_LT_SYMB_N LT(SYMB, KC_N)
+
+//WORKMAN
+#define KC_SFT_T_I SFT_T(KC_I)
+#define KC_LT_MDIA_H LT(MDIA, KC_H)
+
+//NORMAN
+// For keys on the homerow. Hold for shift, keypad,mouse,and smbol layers
+#define KC_SFT_T_U SFT_T(KC_U)
+#define KC_LT_MDIA_I LT(MDIA, KC_I)
+
+// The most portable copy/paste keys (windows (mostly), linux, and some terminal emulators).
+#define MK_CUT LSFT(KC_DEL) // shift + delete
+#define MK_COPY LCTL(KC_INS) // ctrl + insert
+#define MK_PASTE LSFT(KC_INS) // shift + insert
+
+#define ___ KC_TRNS
+#define XXX KC_NO
+
+// Blocking keys
+#define ___X___ XXX
+#define ___X2___ XXX, XXX
+#define ___X3___ ___X2___, XXX
+#define ___X5___ ___X3___, XXX, XXX
+#define ___X15___ ___X5___, ___X5___, ___X5___
+
+// Transparent keys
+#define ___2___ ___, ___
+#define ___3___ ___2___, ___
+#define ___4___ ___3___, ___
+#define ___5___ ___4___, ___
+#define ___6___ ___5___, ___
+#define ___14___ ___5___, ___4___, ___5___
+#define ___15___ ___5___, ___5___, ___5___
+
+int on_qwerty(void);
+int get_xmonad_layer(void);
+int cur_dance (qk_tap_dance_state_t *state);
+
+//for the x tap dance. Put it here so it can be used in any keymap
+void x_finished (qk_tap_dance_state_t *state, void *user_data);
+void x_reset (qk_tap_dance_state_t *state, void *user_data);
diff --git a/users/ericgebhart/core_keysets.h b/users/ericgebhart/core_keysets.h
new file mode 100644
index 00000000000..ffe02192f6b
--- /dev/null
+++ b/users/ericgebhart/core_keysets.h
@@ -0,0 +1,293 @@
+#pragma once
+/*
+ Copyright 2018 Eric Gebhart
+
+ 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 .
+*/
+
+#include "core_keys.h"
+
+/********************************************************************/
+/** Parts are parts, pieces of keysets so we have some decent **/
+/** building blocks to make keymaps with. **/
+/********************************************************************/
+
+
+// Since our quirky block definitions are basically a list of comma separated
+// arguments, we need a wrapper in order for these definitions to be
+// expanded before being used as arguments to the LAYOUT_xxx macro.
+#if (!defined(LAYOUT) && defined(KEYMAP))
+#define LAYOUT KEYMAP
+#endif
+
+#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)
+#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__)
+#define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__)
+#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
+
+#define LAYOUT_ortho_5x15_wrapper(...) LAYOUT_ortho_5x15(__VA_ARGS__)
+#define LAYOUT_ortho_5x14_wrapper(...) LAYOUT_ortho_5x14(__VA_ARGS__)
+
+
+/********************************************************************/
+/** The Core rows of each given layout. **/
+/********************************************************************/
+//Dvorak on a qwerty software layer in the OS
+#define ___DVORAK_L1___ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y
+#define ___DVORAK_L2___ KC_SFT_T_A, KC_LT_KP_O, KC_LT_MDIA_E, KC_LT_SYMB_U, KC_I
+#define ___DVORAK_L3___ KC_SCLN, KC_Q, KC_J, KC_K, KC_X
+
+#define ___DVORAK_R1___ KC_F, KC_G, KC_C, KC_R, KC_L
+#define ___DVORAK_R2___ KC_D, KC_LT_SYMB_H, KC_LT_MDIA_T, KC_LT_KP_N, KC_SFT_T_S
+#define ___DVORAK_R3___ KC_B, KC_M, KC_W, KC_V, KC_Z
+
+// Qwerty based layers that I don't really use.
+#define ___QWERTY_L1___ KC_Q, KC_W, KC_E, KC_R, KC_T
+#define ___QWERTY_L2___ KC_SFT_T_A, KC_S, KC_LT_MDIA_D, KC_LT_SYMB_F, KC_G
+#define ___QWERTY_L3___ KC_Z, KC_X, KC_C, KC_V, KC_B
+
+#define ___QWERTY_R1___ KC_Y, KC_U, KC_I, KC_O, KC_P
+#define ___QWERTY_R2___ KC_H, KC_LT_SYMB_J, KC_LT_MDIA_K, KC_L, KC_SFT_T_SCLN
+#define ___QWERTY_R3___ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH
+
+// COLEMAK
+#define ___COLEMAK_L1___ KC_Q, KC_W, KC_F, KC_P, KC_G
+#define ___COLEMAK_L2___ KC_SFT_T_A, KC_R, KC_LT_MDIA_S, KC_LT_SYMB_T, KC_D
+#define ___COLEMAK_L3___ KC_Z, KC_X, KC_C, KC_V, KC_B
+
+#define ___COLEMAK_R1___ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
+#define ___COLEMAK_R2___ KC_H, KC_LT_SYMB_N, KC_LT_MDIA_E, KC_I, KC_SFT_T_O
+#define ___COLEMAK_R3___ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH
+
+// COLEMAK-DH
+#define ___COLEMAK_DH_L1___ KC_Q, KC_W, KC_F, KC_P, KC_B
+#define ___COLEMAK_DH_L2___ KC_SFT_T_A, KC_R, KC_LT_MDIA_S, KC_LT_SYMB_T, KC_G
+#define ___COLEMAK_DH_L3___ KC_Z, KC_X, KC_C, KC_D, KC_V
+
+#define ___COLEMAK_DH_R1___ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
+#define ___COLEMAK_DH_R2___ KC_M, KC_LT_SYMB_N, KC_LT_MDIA_E, KC_I, KC_SFT_T_O
+#define ___COLEMAK_DH_R3___ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH
+
+// WORKMAN
+#define ___WORKMAN_L1___ KC_Q, KC_D, KC_R, KC_W, KC_B
+#define ___WORKMAN_L2___ KC_SFT_T_A, KC_S, KC_LT_MDIA_H, KC_LT_SYMB_T, KC_G
+#define ___WORKMAN_L3___ KC_Z, KC_X, KC_M, KC_C, KC_V
+
+#define ___WORKMAN_R1___ KC_J, KC_F, KC_U, KC_P, KC_SCLN
+#define ___WORKMAN_R2___ KC_Y, KC_LT_SYMB_N, KC_LT_MDIA_E, KC_O, KC_SFT_T_I
+#define ___WORKMAN_R3___ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH
+
+// NORMAN
+#define ___NORMAN_L1___ KC_Q, KC_W, KC_D, KC_F, KC_K
+#define ___NORMAN_L2___ KC_SFT_T_A, KC_S, KC_LT_MDIA_E, KC_LT_SYMB_T, KC_G
+#define ___NORMAN_L3___ KC_Z, KC_X, KC_C, KC_V, KC_B
+
+#define ___NORMAN_R1___ KC_J, KC_U, KC_R, KC_L, KC_SCLN
+#define ___NORMAN_R2___ KC_Y, KC_LT_SYMB_N, KC_LT_MDIA_I, KC_O, KC_SFT_T_U
+#define ___NORMAN_R3___ KC_P, KC_M, KC_COMM, KC_DOT, KC_SLASH
+
+// BEPO MAPS
+// Dvorak on fr-bepo software layer in the OS.
+// for dvorak and all the other qwerty like keyboards on bepo
+#define ___DVORAK_FR_L1___ DB_QUOT, DB_COMM, DB_DOT, BP_P, BP_Y
+#define ___DVORAK_FR_L2___ BP_SFT_T_A, BP_LT_KP_O, BP_LT_MDIA_E, BP_LT_SYMB_U, BP_I
+#define ___DVORAK_FR_L3___ DB_SCOLON, BP_Q, BP_J, BP_K, BP_X
+
+#define ___DVORAK_FR_R1___ BP_F, BP_G, BP_C, BP_R, BP_L
+#define ___DVORAK_FR_R2___ BP_D, BP_LT_SYMB_H, BP_LT_MDIA_T, BP_LT_KP_N, BP_SFT_T_S
+#define ___DVORAK_FR_R3___ BP_B, BP_M, BP_W, BP_V, BP_Z
+
+
+// Bepo on fr-bepo software layer
+// for bepo on bepo
+/* BP_DLR, BP_DQOT, BP_LGIL, BP_RGIL, BP_LPRN, BP_RPRN, KC_DEL, */
+#define ___SYMBOL_BEPO_L___ /* BP_DLR */ BP_DQOT, BP_LGIL, BP_RGIL, BP_LPRN, BP_RPRN
+/* KC_DEL, BP_AT, BP_PLUS, BP_MINS, BP_SLSH, BP_ASTR, BP_EQL, */
+#define ___SYMBOL_BEPO_R___ BP_AT, BP_PLUS, BP_MINS, BP_SLASH, BP_ASTR /* BP_EQL, BP_PERC */
+
+#define ___BEPO_FR_L1___ BP_B, BP_ECUT, BP_P, BP_O, BP_EGRV
+#define ___BEPO_FR_L2___ BP_SFT_T_A, BP_LT_KP_U, BP_LT_SYMB_I, BP_LT_MDIA_E, BP_COMM
+#define ___BEPO_FR_L3___ /*BP_ECRC*/ BP_AGRV, BP_Y, BP_X, BP_DOT, BP_K
+
+#define ___BEPO_FR_R1___ /* BP_DCRC,*/ BP_V, BP_D, BP_L, BP_J, BP_Z
+#define ___BEPO_FR_R2___ /* BP_C, */ BP_T, BP_LT_SYMB_S, BP_LT_MDIA_R, BP_LT_KP_N, BP_SFT_T_M //BP_CCED
+#define ___BEPO_FR_R3___ BP_APOS, BP_Q, BP_G, BP_H, BP_F //BP_SFT_T_W
+
+/* BP_DLR, BP_DQOT, BP_LGIL, BP_RGIL, BP_LPRN, BP_RPRN, KC_DEL, */
+/* KC_TAB, BP_B, BP_ECUT, BP_P, BP_O, BP_EGRV, KC_BSPC, */
+/* KC_LSFT, BP_A, BP_U, BP_I, BP_E, BP_COMM, */
+/* KC_LCTRL, BP_AGRV, BP_Y, BP_X, BP_DOT, BP_K, KC_ENT, */
+/* ESC_FN, BP_ECRC, KC_LGUI, KC_LALT, SPC_RALT, */
+/* TT(SWAP), KC_MNXT, */
+/* KC_MPLY, */
+/* TT(FN), TT(NUMS), KC_MPRV, */
+
+/* /\* right hand *\/ */
+/* KC_DEL, BP_AT, BP_PLUS, BP_MINS, BP_SLSH, BP_ASTR, BP_EQL, */
+/* KC_BSPC, BP_DCRC, BP_V, BP_D, BP_L, BP_J, BP_Z, */
+/* BP_C, BP_T, BP_S, BP_R, BP_N, M_RSFT, */
+/* KC_ENT, BP_APOS, BP_Q, BP_G, BP_H, BP_F, W_RCTL, */
+
+
+/*******************************************************************/
+/** For the top rows. Numbers for most things, symbols for Bepo. **/
+/*******************************************************************/
+
+// for everything on qwerty.
+#define ___NUMBER_L___ KC_1, KC_2, KC_3, KC_4, KC_5
+#define ___NUMBER_R___ KC_6, KC_7, KC_8, KC_9, KC_0
+
+// function key rows, works for everyone.
+#define ___FUNC_L___ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
+#define ___FUNC_R___ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
+
+#define ___FUNC_1_6___ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6
+#define ___FUNC_7_12___ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12
+
+// a top symbol row if someone wants it.
+#define ___SYMB_L___ KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC
+#define ___SYMB_R___ KC_CIRC, KC_AMPR, KC_AST, KC_LPRN, KC_RPRN
+
+// For numbers on bepo. Bepo has numbers on shifted keys, the
+// reverse of most keyboard layouts.
+#define ___NUMBER_BEPO_L___ DB_1, DB_2, DB_3, DB_4, DB_5
+#define ___NUMBER_BEPO_R___ DB_6, DB_7, DB_8, DB_9, DB_0
+
+
+/*******************************************************************/
+/* keysets for the auxillary layers. */
+/* the KC_P? codes don't work for me. I don't use those shifted */
+/* values anyway. */
+/*******************************************************************/
+// Keypads
+#define ___KEYPAD_1___ KC_7, KC_8, KC_9, KC_PSLS
+#define ___KEYPAD_2___ KC_4, KC_5, KC_6, KC_PAST
+#define ___KEYPAD_3___ KC_1, KC_2, KC_3, KC_PMNS
+#define ___KEYPAD_4___ KC_0, KC_DOT, KC_PEQL, KC_PPLS
+
+// Keypad from the default keymap.c of the xd75
+#define ___KEYPAD_1_ALT___ KC_P7, KC_P8, KC_P9, KC_MINS
+#define ___KEYPAD_2_ALT___ KC_P4, KC_P5, KC_P6, KC_PLUS
+#define ___KEYPAD_3_ALT___ KC_P1, KC_P2, KC_P3, KC_PENT
+#define ___KEYPAD_4_ALT___ KC_P0, KC_DOT, KC_PENT, KC_PENT
+
+// For Bepo
+#define ___KEYPAD_1_BP___ DB_7, DB_8, DB_9, BP_SLASH
+#define ___KEYPAD_2_BP___ DB_4, DB_5, DB_6, BP_ASTR
+#define ___KEYPAD_3_BP___ DB_1, DB_2, DB_3, DB_MINUS
+#define ___KEYPAD_4_BP___ DB_0, DB_DOT, DB_EQL, BP_PLUS
+
+
+// SYMBOLS
+// An arrangement for the left hand with a focus on the ()[]{}s.
+#define ___SYMBOLS_1___ KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE
+#define ___SYMBOLS_2___ KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV
+#define ___SYMBOLS_3___ KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD
+
+// A larger 6 column arrangement for the left hand, A merge of dvorak and the above.
+#define ___SYMBOLS6_1___ KC_GRV, KC_LT, KC_GT, KC_LCBR, KC_RCBR, KC_HASH
+#define ___SYMBOLS6_2___ KC_AMPR, KC_AT, KC_ASTR, KC_LPRN, KC_RPRN, KC_PERC
+#define ___SYMBOLS6_3___ KC_DLR, KC_DQT, KC_QUOT, KC_LBRC, KC_RBRC, KC_COLON
+#define ___SYMBOLS6_4___ ___2___, KC_TILD, KC_DOT, KC_EXLM, KC_SCLN
+
+#define ___SYMBOLS5_4___ ___, KC_TILD, KC_DOT, KC_EXLM, KC_SCLN
+
+
+// A symbol pad. Basically the same layout as a number pad with the symbols
+// instead of the numbers with some extras around it, in familiar places for the
+// right hand.
+#define ___SYMPAD_1___ KC_GRV, KC_AMPR, KC_ASTR, KC_LCBR, KC_PLUS, KC_PIPE
+#define ___SYMPAD_2___ KC_TILD, KC_DLR, KC_PERC, KC_CIRC, KC_ASTR, KC_GRV
+#define ___SYMPAD_3___ ___, KC_EXLM, KC_AT, KC_HASH, KC_MINUS, KC_SLASH
+#define ___SYMPAD_4___ ___, KC_RCBR, KC_DOT, KC_EQUAL, KC_UNDS, KC_BSLASH
+
+#define ___5_SYMPAD_4___ KC_RCBR, KC_DOT, KC_EQUAL, KC_UNDS, KC_BSLASH
+
+// Function pad. Same idea as above, but for function keys.
+#define ___FUNCPAD_T___ KC_F10, KC_F11, KC_F12
+#define ___FUNCPAD_1___ KC_F7, KC_F8, KC_F9
+#define ___FUNCPAD_2___ KC_F4, KC_F5, KC_F6
+#define ___FUNCPAD_3___ KC_F1, KC_F2, KC_F3
+
+
+//--- all over again for BEPO
+
+// SYMBOLS FOR BEPO
+// The top row. Bepo has symbols not numbers. Numbers are the shifted values.
+#define ___SYMBOL_BEPO_L___ /* BP_DLR */ BP_DQOT, BP_LGIL, BP_RGIL, BP_LPRN, BP_RPRN
+/* KC_DEL, BP_AT, BP_PLUS, BP_MINS, BP_SLSH, BP_ASTR, BP_EQL, */
+#define ___SYMBOL_BEPO_R___ BP_AT, BP_PLUS, BP_MINS, BP_SLASH, BP_ASTR /* BP_EQL, BP_PERC */
+
+// An arrangement for the left hand with a focus on the ()[]{}s.
+#define ___SYMBOLS_1_BP___ KC_EXLM, BP_AT, DB_LCBR, DB_RCBR, DB_PIPE
+#define ___SYMBOLS_2_BP___ DB_HASH, BP_DLR, DB_LPRN, DB_RPRN, DB_GRV
+#define ___SYMBOLS_3_BP___ BP_PERC, DB_CIRC, DB_LBRC, DB_RBRC, DB_TILD
+
+// A larger 6 column arrangement for the left hand, A merge of dvorak and the above.
+#define ___SYMBOLS6_1_BP___ DB_GRV, DB_LESS, DB_GRTR, DB_LCBR, DB_RCBR, DB_HASH
+#define ___SYMBOLS6_2_BP___ KC_AMPR, BP_AT, BP_ASTR, DB_LPRN, DB_RPRN, BP_PERC
+#define ___SYMBOLS6_3_BP___ BP_DLR, BP_DQOT, DB_QUOT, DB_LBRC, DB_RBRC, KC_COLON
+#define ___SYMBOLS6_4_BP___ ___2___, DB_TILD, DB_DOT, KC_EXLM, DB_SCOLON
+
+#define ___SYMBOLS5_4_BP___ ___, DB_TILD, DB_DOT, KC_EXLM, DB_SCOLON
+
+// A symbol pad. Basically the same layout as a number pad with the symbols
+// instead of the numbers with some extras around it, in familiar places for the
+// right hand.
+#define ___SYMPAD_1_BP___ DB_GRV, BP_AMPR, BP_ASTR, DB_LCBR, BP_PLUS, DB_PIPE
+#define ___SYMPAD_2_BP___ DB_TILD, BP_DLR, BP_PERC, DB_CIRC, BP_ASTR, DB_GRV
+#define ___SYMPAD_3_BP___ ___, BP_EXLM, BP_AT, DB_HASH, BP_MINS, BP_SLSH
+#define ___SYMPAD_4_BP___ ___, DB_RCBR, DB_DOT, BP_EQL, BP_MINUS, DB_BACKSLASH
+
+#define ___5_SYMPAD_4_BP___ DB_RCBR, DB_DOT, BP_EQL, BP_MINUS, DB_BACKSLASH
+
+// Parts are parts.
+// MOUSE, ARROW and MEDIA KEY SETS
+#define ___MOUSE_LDUR___ KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R
+#define ___MWHEEL_LDUR___ KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R
+#define ___MOUSE_BTNS_R___ KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4, KC_BTN5
+#define ___MOUSE_BTNS_L___ KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_BTN1
+#define ___MOUSE_ACCL_012___ KC_ACL0, KC_ACL1, KC_ACL2
+#define ___MACCL___ ___MOUSE_ACCL_012___
+
+#define ___PRV_PLAY_NXT_STOP KC_MPRV, KC_MPLY, KC_MNXT, KC_MSTP
+#define ___VDN_MUTE_VUP___ KC_VOLD, KC_MUTE, KC_VOLU
+
+#define ___MUTE_PRV_PLAY_NXT_STOP___ KC_MUTE, KC_MPRV, KC_MPLY, KC_MNXT, KC_MSTP
+#define ___MUTE_PLAY_STOP___ KC_MUTE, KC_MPLY, KC_MSTP
+#define ___VI_ARROWS___ KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
+
+// RGB FUNCTION Keysets
+// RGB row for the _FN layer from the redo of the default keymap.c
+#define ___RGB_HUE_SAT_INT_UP___ RGB_HUI, RGB_SAI, RGB_VAI, RGB_RMOD
+#define ___RGB_HUE_SAT_INT_DN___ RGB_HUD, RGB_SAD, RGB_VAD, RGB_MOD
+#define ___RGB_MODE_PRV_NXT___ RGB_RMOD, RGB_MOD
+#define ___RGB_TOGGLE___ RGB_TOG
+#define ___RGB_P_B_R_SW_SN___ RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN
+#define ___RGB_KXGT___ RGB_M_K, RGB_M_X, RGB_M_G, RGB_M_T
+
+// Print screen, screen lock, pause
+#define ___PSCR_SLCK_PAUS___ KC_PSCR, KC_SLCK, KC_PAUS
+
+// LAYER Keyset rows. Changing the Default base layer or the transient layers.
+// Some are full length. The baselayers leave the ends open. hence a 13.
+// for an ORtho 15.
+#define ___2_LAYERS_B1___ DF(BEPO), DF(DVORAK_ON_BEPO)
+#define ___2_LAYERS_B2___ DF(COLEMAK), DF(DVORAK)
+#define ___3_LAYERS_B3___ DF(QWERTY), DF(NORMAN), DF(WORKMAN)
+#define ___3_LAYERS_B4___ ___X3___
+// transient layers.
+#define ___3_LAYERS_T_BP___ TO(MDIA), TO(SYMB_ON_BEPO), TO(KEYPAD_ON_BEPO)
+#define ___3_LAYERS_T___ TO(MDIA), TO(SYMB), TO(KEYPAD)
+#define ___3_LAYERS_T_CTL___ TO(_RGB), ___X2___
diff --git a/users/ericgebhart/ericgebhart.c b/users/ericgebhart/ericgebhart.c
index 69aa450e0a9..76143c6ed1f 100644
--- a/users/ericgebhart/ericgebhart.c
+++ b/users/ericgebhart/ericgebhart.c
@@ -14,6 +14,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
+
#include "ericgebhart.h"
#include "quantum.h"
@@ -122,8 +123,6 @@ const uint8_t key_translations[][2][2] = {
[GR(DB_CIRC)] = {{BP_AT, MOD_BIT(KC_RALT)}, {BP_AT, MOD_BIT(KC_RALT)}},
[GR(DB_LESS)] = {{BP_LGIL, MOD_BIT(KC_RALT)}, {BP_LGIL, MOD_BIT(KC_RALT)}},
[GR(DB_GRTR)] = {{BP_RGIL, MOD_BIT(KC_RALT)}, {BP_RGIL, MOD_BIT(KC_RALT)}},
-
-
};
@@ -275,7 +274,7 @@ xprintf("KL: row: %u, column: %u, pressed: %u\n", record->event.key.col, record-
// to save on firmware space, since it's limited.
#ifdef MACROS_ENABLED
case KC_OVERWATCH: // Toggle's if we hit "ENTER" or "BACKSPACE" to input macros
- if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeprom_update_byte(EECONFIG_USERSPACE, userspace_config.raw); }
+ if (record->event.pressed) { userspace_config.is_overwatch ^= 1; eeprom_update_byte(EECONFIG_USER, userspace_config.raw); }
return false; break;
#endif // MACROS_ENABLED
@@ -304,7 +303,7 @@ xprintf("KL: row: %u, column: %u, pressed: %u\n", record->event.key.col, record-
case CLICKY_TOGGLE:
#ifdef AUDIO_CLICKY
userspace_config.clicky_enable = clicky_enable;
- eeprom_update_byte(EECONFIG_USERSPACE, userspace_config.raw);
+ eeprom_update_byte(EECONFIG_USER, userspace_config.raw);
#endif
break;
#ifdef UNICODE_ENABLE
@@ -390,13 +389,20 @@ void tap_dance_layer_switch (qk_tap_dance_state_t *state, void *user_data) {
if(on_qwerty())
layer_invert(SYMB);
else
- layer_invert(SYMB_ON_BEPO);
+ layer_invert(SYMB_ON_BEPO);
break;
case 2:
layer_invert(MDIA);
break;
case 3:
layer_invert(LAYERS);
+ break;
+ case 4:
+ if(on_qwerty())
+ layer_invert(KEYPAD);
+ else
+ layer_invert(KEYPAD_ON_BEPO);
+ break;
default:
break;
}
diff --git a/users/ericgebhart/ericgebhart.h b/users/ericgebhart/ericgebhart.h
index 6eb11ddfc07..ad66a636eaf 100644
--- a/users/ericgebhart/ericgebhart.h
+++ b/users/ericgebhart/ericgebhart.h
@@ -1,52 +1,13 @@
-/*
- Copyright 2018 Eric Gebhart
-
- 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 .
-*/
-#include QMK_KEYBOARD_H
+#pragma once
#ifndef ericgebhart
#define ericgebhart
-#include "quantum.h"
-#include "process_keycode/process_tap_dance.h"
+#include QMK_KEYBOARD_H
+#include "base_layers.h"
-void tap(uint16_t keycode);
-bool process_record_secrets(uint16_t keycode, keyrecord_t *record);
-
-
-#define EECONFIG_USERSPACE (uint8_t *)19
-
-typedef union {
- uint8_t raw;
- struct {
- bool clicky_enable :1;
- bool rgb_layer_change :1;
- bool is_overwatch :1;
- bool nuke_switch :1;
- };
-} userspace_config_t;
-
-#define ___ KC_TRNS
-#define XXX KC_NO
-
-// The most portable copy/paste keys (windows (mostly), linux, and some terminal emulators).
-#define MK_CUT LSFT(KC_DEL) // shift + delete
-#define MK_COPY LCTL(KC_INS) // ctrl + insert
-#define MK_PASTE LSFT(KC_INS) // shift + insert
-
+//#define ONESHOT_TAP_TOGGLE 2 /* Tapping this number of times holds the key until tapped once again. */
#define DVORAK 0 // dvorak layout (default)
#define QWERTY 1
@@ -63,367 +24,9 @@ typedef union {
#define LAYERS 11 // layers and right mousekeys.
#define XMONAD 12 // xmonad ie. dvorak.
#define XMONAD_FR 13 // xmonad ie. dvorak.
-
-
-// for the creation of dvorak keys on an Bepo keyboard at the OS layer.
-
-// so we can create an array of reasonable size
-// for our translation keys. We have to create a
-// good range of numbers
-#define GR(x) (x-SAFE_RANGE)
-
-uint8_t gr(uint8_t);
-void send_keycode(uint8_t);
-
-#define MOD_NONE 0x00
-
-// indexs for the keycode translation table.
-#define UNSHIFTED_KEY(key) key_translations[gr(key)][0][0]
-#define UNSHIFTED_MODS(key) key_translations[gr(key)][0][1]
-#define SHIFTED_KEY(key) key_translations[gr(key)][1][0]
-#define SHIFTED_MODS(key) key_translations[gr(key)][1][1]
-
-
-enum userspace_custom_keycodes {
- // keep the keycodes using the send_key function close to SAFE_RANGE
- // so the array of keycodes remains a reasonbale size.
- DB_1 = SAFE_RANGE, // can always be here
- DB_2,
- DB_3,
- DB_4,
- DB_5,
- DB_6,
- DB_7,
- DB_8,
- DB_9,
- DB_0,
- DB_GRV,
- DB_SCOLON,
- DB_SLASH,
- DB_BACKSLASH,
- DB_EQL,
- DB_DOT,
- DB_COMM,
- DB_QUOT,
- DB_MINUS,
- DB_RPRN,
- DB_LPRN,
- DB_RBRC,
- DB_LBRC,
- // for symbols layer
- DB_HASH,
- DB_LCBR,
- DB_RCBR,
- DB_PIPE,
- DB_TILD,
- DB_CIRC,
- DB_LESS,
- DB_GRTR,
- // End of dvorak on bepo translation keys.
-
- EPRM,
- VRSN,
- KC_DVORAK_ON_BEPO,
- KC_BEPO,
- KC_NORMAN,
- KC_QWERTY,
- KC_COLEMAK,
- KC_DVORAK,
- KC_WORKMAN,
- KC_MAKE,
- KC_RESET,
- KC_RGB_T,
- KC_SECRET_1,
- KC_SECRET_2,
- KC_SECRET_3,
- KC_SECRET_4,
- KC_SECRET_5,
- KC_CCCV
-};
-
-#define SFTGUI_T(kc) { MT(MOD_LGUI | MOD_LSFT, kc) }
-#define SFT_GUI_ESC MT(MOD_LSFT | MOD_LGUI, KC_PGDN) // shift LGUI or Escape.
-#define ALT_ENT ALT_T(KC_ENT) // Alt or enter
-#define CTL_SPC CTL_T(KC_SPC) // ctrl or space
-#define CTL_BSPC CTL_T(KC_BSPC) // ctrl or backspace
-#define ALT_DEL ALT_T(KC_DEL) // Alt or delete
-#define GUI_ESC GUI_T(KC_ESC) // Gui or escape
-#define ALGR_SYMB ALGR_T(TG(SYMB)) // Alt gre or toggle symbol layer
-
-#define KC_SFT_T_U SFT_T(KC_U)
-#define KC_SFT_T_H SFT_T(KC_H)
-#define KC_LT_SYMB_I LT(SYMB, KC_I)
-#define KC_LT_SYMB_D LT(SYMB, KC_D)
-
-// for dvorak on bepo
-#define BP_SFT_T_U SFT_T(BP_U)
-#define BP_SFT_T_H SFT_T(BP_H)
-#define BP_LT_SYMB_D LT(SYMB, BP_D)
-
-
-// for bepo on bepo
-#define BP_SFT_T_T SFT_T(BP_T)
-#define BP_LT_SYMB_C LT(SYMB_ON_BEPO, BP_C)
-#define BP_LT_SYMB_I LT(SYMB_ON_BEPO, BP_I)
-#define BP_SFT_T_E SFT_T(BP_E)
-#define BP_SFT_T_ECRC SFT_T(BP_ECRC)
-#define BP_SFT_T_CCED SFT_T(BP_CCED)
-#define BP_LT_SYMB_COMM LT(SYMB,BP_COMM)
-
-// OSM keycodes, to keep things clean and easy to change
-#define KC_MLSF OSM(MOD_LSFT)
-#define KC_MRSF OSM(MOD_RSFT)
-#define OS_LGUI OSM(MOD_LGUI)
-#define OS_RGUI OSM(MOD_RGUI)
-#define OS_LSFT OSM(MOD_LSFT)
-#define OS_RSFT OSM(MOD_RSFT)
-#define OS_LCTL OSM(MOD_LCTL)
-#define OS_RCTL OSM(MOD_RCTL)
-#define OS_LALT OSM(MOD_LALT)
-#define OS_RALT OSM(MOD_RALT)
-#define ALT_APP ALT_T(KC_APP)
-
-#define MG_NKRO MAGIC_TOGGLE_NKRO
-
-
-//// TAP DANCE
-
-typedef struct {
- bool is_press_action;
- int state;
-} tdtap;
-
-enum {
- SINGLE_TAP = 1,
- SINGLE_HOLD = 2,
- DOUBLE_TAP = 3,
- DOUBLE_HOLD = 4,
- DOUBLE_SINGLE_TAP = 5, //send two single taps
- TRIPLE_TAP = 6,
- TRIPLE_HOLD = 7
- };
-
- //Tap Dance Declarations
- enum {
- TD_ESC_CAPS = 0,
- TD_TAB_BKTAB = 1,
- TD_MDIA_SYMB = 2,
- TD_HOME_END = 3,
- TD_XMONAD_ESC = 4,
- TD_DEF_LAYER_SW = 5,
- TD_DEF_OS_LAYER_SW = 6,
- TD_MOUSE_BTNS = 7,
- TD_DVORAK_BEPO = 8
- };
-
-
-// Tap dance
-#define TAB_BKTAB TD(TD_TAB_BKTAB) // Tab or backtab tapdance.
-#define MDIA_SYMB TD(TD_MDIA_SYMB) // MDIA or Symb layer tapdance toggle.
-#define DEF_LAYER_SW TD(TD_DEF_LAYER_SW) // dvorak, dvorak_on_bepo, bepo default layer
-#define DEF_OS_LAYER_SW TD(TD_DEF_OS_LAYER_SW) // dvorak, dvorak_on_bepo, bepo default layer
-#define HOME_END TD(TD_HOME_END) // home or end tapdance.
-#define XMONAD_ESC TD(TD_XMONAD_ESC) // Escape, dvorak, media or symb. - tap and hold tap dance. 1-4
-#define DVORAK_ET_BEPO TD(TD_DVORAK_BEPO) // Escape, dvorak, media or symb. - tap and hold tap dance. 1-4
-#define TDMOUSE_BTNS TD(TD_MOUSE_BTNS) // hmmm. 1-5
-
-
-int on_qwerty(void);
-int get_xmonad_layer(void);
-int cur_dance (qk_tap_dance_state_t *state);
-
-//for the x tap dance. Put it here so it can be used in any keymap
-void x_finished (qk_tap_dance_state_t *state, void *user_data);
-void x_reset (qk_tap_dance_state_t *state, void *user_data);
-
-
-// Blocks for each of the four major keyboard layouts
-// Organized so we can quickly adapt and modify all of them
-// at once, rather than for each keyboard, one at a time.
-// And this allows for much cleaner blocks in the keymaps.
-// For instance Tap/Hold for Control on all of the layouts
-
-// NOTE: These are all the same length. If you do a search/replace
-// then you need to add/remove underscores to keep the
-// lengths consistent.
-
-// Since our quirky block definitions are basically a list of comma separated
-// arguments, we need a wrapper in order for these definitions to be
-// expanded before being used as arguments to the LAYOUT_xxx macro.
-#if (!defined(LAYOUT) && defined(KEYMAP))
-#define LAYOUT KEYMAP
-#endif
-
-#define LAYOUT_ergodox_wrapper(...) LAYOUT_ergodox(__VA_ARGS__)
-#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__)
-#define KEYMAP_wrapper(...) LAYOUT(__VA_ARGS__)
-#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
-
-//Dvorak on a qwerty software layer in the OS
-#define ___DVORAK_L1___ KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y
-#define ___DVORAK_L2___ KC_A, KC_O, KC_E, KC_SFT_T_U, KC_LT_SYMB_I
-#define ___DVORAK_L3___ KC_SCLN, KC_Q, KC_J, KC_K, KC_X
-
-#define ___DVORAK_R1___ KC_F, KC_G, KC_C, KC_R, KC_L
-#define ___DVORAK_R2___ KC_LT_SYMB_D, KC_SFT_T_H, KC_T, KC_N, KC_S
-#define ___DVORAK_R3___ KC_B, KC_M, KC_W, KC_V, KC_Z
-
-
-// Dvorak on fr-bepo software layer in the OS.
-// for dvorak and all the other qwerty like keyboards on bepo
-#define ___NUMBER_BEPO_L___ DB_1, DB_2, DB_3, DB_4, DB_5
-#define ___NUMBER_BEPO_R___ DB_6, DB_7, DB_8, DB_9, DB_0
-
-#define ___DVORAK_FR_L1___ DB_QUOT, DB_COMM, DB_DOT, BP_P, BP_Y
-#define ___DVORAK_FR_L2___ BP_A, BP_O, BP_E, BP_SFT_T_U, BP_LT_SYMB_I
-#define ___DVORAK_FR_L3___ DB_SCOLON, BP_Q, BP_J, BP_K, BP_X
-
-#define ___DVORAK_FR_R1___ BP_F, BP_G, BP_C, BP_R, BP_L
-#define ___DVORAK_FR_R2___ BP_LT_SYMB_D, BP_SFT_T_H, BP_T, BP_N, BP_S
-#define ___DVORAK_FR_R3___ BP_B, BP_M, BP_W, BP_V, BP_Z
-
-
-// Bepo on fr-bepo software layer
-// for bepo on bepo
-#define ___SYMBOL_BEPO_L___ /* BP_DLR */ BP_DQOT, BP_LGIL, BP_RGIL, BP_LPRN, BP_RPRN
-#define ___SYMBOL_BEPO_R___ BP_AT, BP_PLUS, BP_MINS, BP_SLASH, BP_ASTR /* BP_EQL, BP_PERC */
-
-#define ___BEPO_FR_L1___ BP_B, BP_ECUT, BP_P, BP_O, BP_EGRV
-#define ___BEPO_FR_L2___ BP_A, BP_U, BP_I, BP_SFT_T_E, BP_LT_SYMB_COMM
-#define ___BEPO_FR_L3___ /*BP_ECRC*/ BP_AGRV, BP_Y, BP_X, BP_DOT, BP_K
-
-#define ___BEPO_FR_R1___ /* BP_DCRC*/ BP_V, BP_D, BP_L, BP_J, BP_Z //, BP_W
-#define ___BEPO_FR_R2___ /* BP_C */ BP_SFT_T_T, BP_S, BP_R, BP_N, BP_M //BP_CCED
-#define ___BEPO_FR_R3___ BP_APOS, BP_Q, BP_G, BP_H, BP_F
-
-// the bottom rows for keyboards on bepo.
-#define ___ERGODOX_BOTTOM_RIGHT_FR___ KC_UP, KC_DOWN, DB_BACKSLASH, LCTL(BP_V), LCTL(BP_C)
-#define ___ERGODOX_BOTTOM_LEFT_FR___ LCTL(BP_C), LCTL(BP_V), KC_INS, KC_LEFT, KC_RIGHT
-
-// Since we have 7 default layouts (QWERTY, DVORAK, COLEMAK and WORKMAN, NORMAN,
-// 2 of them based on a Bepo software keyboard, --- DVORAK_ON_BEPO and BEPO),
-// this allows us to quickly modify the bottom row for all of the layouts
-// so we don't have to alter it 4 times and hope that we haven't missed
-// anything
-#define ___ERGODOX_BOTTOM_LEFT___ LCTL(KC_C), LCTL(KC_V), KC_INS, KC_LEFT, KC_RIGHT
-#define ___ERGODOX_BOTTOM_RIGHT___ KC_UP, KC_DOWN, KC_BSLASH, LCTL(KC_V), LCTL(KC_C)
-
-#define ___ERGODOX_THUMB_LEFT___ \
- KC_RALT, ALGR_SYMB, \
- HOME_END, \
- CTL_BSPC, ALT_DEL, XMONAD_ESC
-
-#define ___ERGODOX_THUMB_RIGHT___ \
- ALGR_SYMB, TD_MOUSE_BTNS, \
- KC_PGUP, \
- KC_PGDN, ALT_ENT, CTL_SPC
-
-#define ___ERGODOX_TRANS_THUMBS___ \
- ___, ___, \
- ___, \
- ___, ___, ___ \
-
-#define ___ERGODOX_TRANS_BOTTOM___ \
- ___,___,___,___,___
-
-#define ___ERGODOX_TRANS_6_ROW___ \
- ___,___,___,___,___,___
-
-
-
-// Qwerty based layers that I don't really use.
-#define ___QWERTY_L1___ KC_Q, KC_W, KC_E, KC_R, KC_T
-#define ___QWERTY_L2___ KC_A, KC_S, KC_D, KC_F, KC_G
-#define ___QWERTY_L3___ KC_Z, KC_X, KC_C, KC_V, KC_B
-
-#define ___QWERTY_R1___ KC_Y, KC_U, KC_I, KC_O, KC_P
-#define ___QWERTY_R2___ KC_H, KC_J, KC_K, KC_L, KC_SCLN
-#define ___QWERTY_R3___ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH
-
-
-#define ___COLEMAK_L1___ KC_Q, KC_W, KC_F, KC_P, KC_G
-#define ___COLEMAK_L2___ KC_A, KC_R, KC_S, KC_T, KC_D
-#define ___COLEMAK_L3___ KC_Z, KC_X, KC_C, KC_V, KC_B
-
-#define ___COLEMAK_R1___ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
-#define ___COLEMAK_R2___ KC_H, KC_N, KC_E, KC_I, KC_O
-#define ___COLEMAK_R3___ KC_K, KC_M, KC_COMM, KC_DOT, KC_SLASH
-
-
-#define ___COLEMAK_MOD_DH_L1___ KC_Q, KC_W, KC_F, KC_P, KC_B
-#define ___COLEMAK_MOD_DH_L2___ KC_A, KC_R, KC_S, KC_T, KC_G
-#define ___COLEMAK_MOD_DH_L3___ CTL_T(KC_Z), KC_X, KC_C, KC_D, KC_V
-
-#define ___COLEMAK_MOD_DH_R1___ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
-#define ___COLEMAK_MOD_DH_R2___ KC_M, KC_N, KC_E, KC_I, KC_O
-#define ___COLEMAK_MOD_DH_R3___ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH
-
-
-#define ___WORKMAN_L1___ KC_Q, KC_D, KC_R, KC_W, KC_B
-#define ___WORKMAN_L2___ KC_A, KC_S, KC_H, KC_T, KC_G
-#define ___WORKMAN_L3___ KC_Z, KC_X, KC_M, KC_C, KC_V
-
-#define ___WORKMAN_R1___ KC_J, KC_F, KC_U, KC_P, KC_SCLN
-#define ___WORKMAN_R2___ KC_Y, KC_N, KC_E, KC_O, KC_I
-#define ___WORKMAN_R3___ KC_K, KC_L, KC_COMM, KC_DOT, KC_SLASH
-
-
-#define ___NORMAN_L1___ KC_Q, KC_W, KC_D, KC_F, KC_K
-#define ___NORMAN_L2___ KC_A, KC_S, KC_E, KC_T, KC_G
-#define ___NORMAN_L3___ KC_Z, KC_X, KC_C, KC_V, KC_B
-
-#define ___NORMAN_R1___ KC_J, KC_U, KC_R, KC_L, KC_SCLN
-#define ___NORMAN_R2___ KC_Y, KC_N, KC_I, KC_O, KC_U
-#define ___NORMAN_R3___ KC_P, KC_M, KC_COMM, KC_DOT, KC_SLASH
-
-
-// For the top rows. Numbers for most things, symbols for Bepo.
-
-// for everything on qwerty.
-#define ___NUMBER_L___ KC_1, KC_2, KC_3, KC_4, KC_5
-#define ___NUMBER_R___ KC_6, KC_7, KC_8, KC_9, KC_0
-
-// function key rows, works for everyone.
-#define ___FUNC_L___ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
-#define ___FUNC_R___ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
-
-
-// Rows for the auxillary layers.
-
-// The symbol layer is for qwerty. I need another one for Bepo...
-
-// the KC_P? codes don't work for me. I don't use those shifted values anyway.
-#define ___KEYPAD_1___ KC_7, KC_8, KC_9, KC_PSLS
-#define ___KEYPAD_2___ KC_4, KC_5, KC_6, KC_PAST
-#define ___KEYPAD_3___ KC_1, KC_2, KC_3, KC_PMNS
-#define ___KEYPAD_4___ KC_0, KC_DOT, KC_PEQL, KC_PPLS
-
-#define ___KEYPAD_1_BP___ DB_7, DB_8, DB_9, BP_SLASH
-#define ___KEYPAD_2_BP___ DB_4, DB_5, DB_6, BP_ASTR
-#define ___KEYPAD_3_BP___ DB_1, DB_2, DB_3, DB_MINUS
-#define ___KEYPAD_4_BP___ DB_0, DB_DOT, DB_EQL, BP_PLUS
-
-#define ___SYMBOLS_1___ KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE
-#define ___SYMBOLS_2___ KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV
-#define ___SYMBOLS_3___ KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD
-
-#define ___SYMBOLS_1_BP___ KC_EXLM, BP_AT, DB_LCBR, DB_RCBR, DB_PIPE
-#define ___SYMBOLS_2_BP___ DB_HASH, BP_DLR, DB_LPRN, DB_RPRN, DB_GRV
-#define ___SYMBOLS_3_BP___ BP_PERC, DB_CIRC, DB_LBRC, DB_RBRC, DB_TILD
-
-#define ___MOUSE_LDUR___ KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R
-#define ___MWHEEL_LDUR___ KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R
-#define ___MOUSE_BTNS_R___ KC_BTN1, KC_BTN2, KC_BTN3, KC_BTN4, KC_BTN5
-#define ___MOUSE_BTNS_L___ KC_BTN5, KC_BTN4, KC_BTN3, KC_BTN2, KC_BTN1
-#define ___MOUSE_ACCL_012___ KC_ACL0, KC_ACL1, KC_ACL2
-
-#define ___MUTE_PLAY_STOP___ KC_MUTE, KC_MPLY, KC_MSTP
-#define ___VI_ARROWS___ KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
-
-#define ___LAYERS_L1___ DF(BEPO), DF(DVORAK_ON_BEPO)
-#define ___LAYERS_L2___ DF(COLEMAK), DF(DVORAK)
-#define ___LAYERS_L3___ DF(QWERTY), DF(NORMAN), DF(WORKMAN)
-#define ___LAYERS_L4___ TO(MDIA), TO(SYMB_ON_BEPO), TO(SYMB)
+#define KEYPAD 14 // number and Fkey pads
+#define KEYPAD_ON_BEPO 15 // number and Fkey pads.
+#define _RGB 16 // RGB stuff.
#endif
diff --git a/users/ericgebhart/rules.mk b/users/ericgebhart/rules.mk
index 2572d21118f..70017a5950e 100755
--- a/users/ericgebhart/rules.mk
+++ b/users/ericgebhart/rules.mk
@@ -1,18 +1,15 @@
-USER_NAME := ericgebhart
SRC += ericgebhart.c
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
-COMMAND_ENABLE = yes # Commands for debug and configuration
-NKRO_ENABLE = yes # USB Nkey Rollover - for issues, see github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-SWAP_HANDS_ENABLE= yes # Allow swapping hands of keyboard
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # USB Nkey Rollover - for issues, see github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+SWAP_HANDS_ENABLE= no # Allow swapping hands of keyboard
KEY_LOCK_ENABLE = yes # Enable the KC_LOCK key
TAP_DANCE_ENABLE = yes # Enable the tap dance feature.
-CONSOLE_ENABLE = yes # Console for debug
+CONSOLE_ENABLE = no # Console for debug
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
UNICODE_ENABLE = no
SLEEP_LED_ENABLE = no
API_SYSEX_ENABLE = no
-RGBLIGHT_ENABLE = no
-RGBLIGHT_ANIMATION = no
diff --git a/users/konstantin/config.h b/users/konstantin/config.h
index bc1987c357b..dcea9be2794 100644
--- a/users/konstantin/config.h
+++ b/users/konstantin/config.h
@@ -2,11 +2,13 @@
#define FORCE_NKRO
-#define MOUSEKEY_DELAY 50
-#define MOUSEKEY_INTERVAL 15
+#define MOUSEKEY_DELAY 0
+#define MOUSEKEY_INTERVAL 10
#define MOUSEKEY_MAX_SPEED 4
-#define MOUSEKEY_TIME_TO_MAX 50
-#define MOUSEKEY_WHEEL_MAX_SPEED 1
+#define MOUSEKEY_TIME_TO_MAX 100
+#define MOUSEKEY_WHEEL_DELAY 0
+#define MOUSEKEY_WHEEL_INTERVAL 50
+#define MOUSEKEY_WHEEL_MAX_SPEED 4
#define MOUSEKEY_WHEEL_TIME_TO_MAX 50
#define NO_ACTION_FUNCTION
@@ -21,7 +23,7 @@
#define PERMISSIVE_HOLD
#define TAPPING_TERM 200
-#define TAPPING_TOGGLE 2
+#define TAPPING_TOGGLE 3
#define UNICODE_CYCLE_PERSIST false
#define UNICODE_SELECTED_MODES UC_WINC, UC_WIN, UC_LNX
diff --git a/users/konstantin/konstantin.c b/users/konstantin/konstantin.c
index 9cee25ac664..72aca9fb8c2 100644
--- a/users/konstantin/konstantin.c
+++ b/users/konstantin/konstantin.c
@@ -69,7 +69,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case CLEAR:
if (record->event.pressed) {
CLEAN_MODS(
- SEND_STRING(SS_LCTRL("a") SS_TAP(X_DELETE));
+ SEND_STRING(SS_LCTL("a") SS_TAP(X_DELETE));
)
}
break;
@@ -117,3 +117,12 @@ void led_set_keymap(uint8_t usb_led) {}
void led_set_user(uint8_t usb_led) {
led_set_keymap(usb_led);
}
+
+__attribute__((weak))
+bool led_update_keymap(led_t led_state) {
+ return true;
+}
+
+bool led_update_user(led_t led_state) {
+ return led_update_keymap(led_state);
+}
diff --git a/users/konstantin/konstantin.h b/users/konstantin/konstantin.h
index da21058312a..0936e3c3ea3 100644
--- a/users/konstantin/konstantin.h
+++ b/users/konstantin/konstantin.h
@@ -86,3 +86,4 @@ void keyboard_post_init_keymap(void);
bool process_record_keymap(uint16_t keycode, keyrecord_t *record);
uint32_t layer_state_set_keymap(uint32_t state);
void led_set_keymap(uint8_t usb_led);
+bool led_update_keymap(led_t led_state);
diff --git a/users/konstantin/rgb.h b/users/konstantin/rgb.h
index cc7d91808a0..e09c5bd7742 100644
--- a/users/konstantin/rgb.h
+++ b/users/konstantin/rgb.h
@@ -5,7 +5,7 @@
#define GODSPEED_BLUE 198, 68, 255
#define GODSPEED_YELLOW 27, 153, 255
#define MODERN_DOLCH_CYAN 110, 255, 108
-#define MODERN_DOLCH_RED 251, 255, 108
+#define MODERN_DOLCH_RED 253, 255, 108
extern const HSV godspeed_blue;
extern const HSV godspeed_yellow;
diff --git a/users/konstantin/rules.mk b/users/konstantin/rules.mk
index bf0ab979fb3..d989f486c5a 100644
--- a/users/konstantin/rules.mk
+++ b/users/konstantin/rules.mk
@@ -13,4 +13,4 @@ ifneq (,$(filter yes,$(UNICODE_ENABLE) $(UNICODEMAP_ENABLE)))
SRC += unicode.c
endif
-EXTRAFLAGS += -flto
+LTO_ENABLE = yes
diff --git a/users/kuchosauronad0/config.h b/users/kuchosauronad0/config.h
index b06c9e2c562..58542dc1840 100644
--- a/users/kuchosauronad0/config.h
+++ b/users/kuchosauronad0/config.h
@@ -11,7 +11,7 @@
# undef NOTE_REST
# define NOTE_REST 1.00f
# endif // !__arm__
-# define UNICODE_SONG_OSX SONG(RICK_ROLL)
+# define UNICODE_SONG_MAC SONG(RICK_ROLL)
# define UNICODE_SONG_LNX SONG(RICK_ROLL)
# define UNICODE_SONG_WIN SONG(RICK_ROLL)
# define UNICODE_SONG_BSD SONG(RICK_ROLL)
diff --git a/users/miles2go/babblePaste.c b/users/miles2go/babblePaste.c
new file mode 100644
index 00000000000..2a32024cd2e
--- /dev/null
+++ b/users/miles2go/babblePaste.c
@@ -0,0 +1,125 @@
+/* A library to output the right key shortcut in any common app.
+Given a global variable babble_mode to show the environment and a
+key that calls the paste macro, do the right type of paste.
+Setting the context is done by another macro, or TBD interaction with the host.
+
+Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts
+and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c
+*/
+
+#include QMK_KEYBOARD_H
+
+#ifdef USE_BABBLEPASTE
+# include "babblePaste.h"
+
+// small function that we might also want to call from a keymap.
+
+// GLOBAL variable to determine mode. Sets startup default if no eeppom
+uint8_t babble_mode = 0;
+
+// function to tell the user that the mode has changed
+__attribute__((weak)) void babble_led_user(void) {}
+
+void set_babble_mode(uint8_t id) { babble_mode = id; }
+
+void babble_mode_increment() {
+ babble_mode += 1;
+ if (babble_mode >= BABL_MODEMAX) {
+ babble_mode = 0;
+ }
+}
+
+void babble_mode_decrement() {
+ if (babble_mode >= 1) {
+ babble_mode -= 1;
+ } else {
+ babble_mode = BABL_MODEMAX - 1;
+ }
+}
+
+/* this function runs the appropriate babblepaste macro, given
+the global babble_mode and a keycode defined in the babble_keycodes enum.
+
+This could be made faster by splitting into two functions sorted by keycode range
+But that makes for a *lot* of ifdefs.
+*/
+bool babblePaste(uint16_t keycode) {
+ // handle the OS/mode switching first
+
+# ifdef BABL_MAC
+ if (keycode == BABL_DO_MAC) {
+ set_babble_mode(BABL_MAC_MODE);
+ babble_led_user();
+ return true;
+ }
+
+ if (babble_mode == BABL_MAC_MODE) {
+ babblePaste_mac(keycode);
+ }
+# endif
+
+# ifdef BABL_VI
+ if (keycode == BABL_DO_VI) {
+ set_babble_mode(BABL_VI_MODE);
+ babble_led_user();
+ return true;
+ }
+ if (babble_mode == BABL_VI_MODE) {
+ babblePaste_vi(keycode);
+ }
+# endif
+# ifdef BABL_WINDOWS
+ if (keycode == BABL_DO_WINDOWS) {
+ set_babble_mode(BABL_WINDOWS_MODE);
+ babble_led_user();
+ return true;
+ }
+ if (babble_mode == BABL_WINDOWS_MODE) {
+ babblePaste_win(keycode);
+ }
+# endif
+# ifdef BABL_LINUX
+ if (keycode == BABL_DO_LINUX) {
+ set_babble_mode(BABL_LINUX_MODE);
+ babble_led_user();
+ return true;
+ }
+ if (babble_mode == BABL_LINUX_MODE) {
+ babblePaste_linux(keycode);
+ }
+# endif
+# ifdef BABL_EMACS
+ if (keycode == BABL_DO_EMACS) {
+ set_babble_mode(BABL_EMACS_MODE);
+ babble_led_user();
+ return true;
+ }
+ if (babble_mode == BABL_EMACS_MODE) {
+ babblePaste_emacs(keycode);
+ }
+# endif
+# ifdef BABL_CHROME
+ if (keycode == BABL_DO_CHROMEOS) {
+ set_babble_mode(BABL_CHROMEOS_MODE);
+ babble_led_user();
+ return true;
+ }
+ if (babble_mode == BABL_CHROMEOS_MODE) {
+ babblePaste_readmux(keycode);
+ }
+# endif
+# ifdef BABL_READMUX
+ if (keycode == BABL_DO_READMUX) {
+ set_babble_mode(BABL_READMUX_MODE);
+ babble_led_user();
+ return true;
+ }
+ if (babble_mode == BABL_READMUX_MODE) {
+ babblePaste_readmux(keycode);
+ }
+# endif
+
+ return false;
+}
+
+#endif // USE_BABBLEPASTE
diff --git a/users/miles2go/babblePaste.h b/users/miles2go/babblePaste.h
new file mode 100644
index 00000000000..606640227c4
--- /dev/null
+++ b/users/miles2go/babblePaste.h
@@ -0,0 +1,349 @@
+/* A library to output the right key shortcut in any common app.
+Given a global variable babble_mode to show the environment and a
+key that calls the paste macro, do the right type of paste.
+
+Setting the bable_mode is done by another macro, or TBD interaction with the host.
+
+Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts
+and jeebak & algernon's keymap
+*/
+
+#pragma once
+#include "quantum.h"
+
+#ifdef USE_BABBLEPASTE
+
+void set_babble_mode(uint8_t id);
+void babble_mode_increment(void);
+void babble_mode_decrement(void);
+void babble_led_user(void);
+
+// manually re-order these if you want to set the order or default.
+enum babble_modes {
+# ifdef BABL_MAC
+ BABL_MAC_MODE,
+# endif
+# ifdef BABL_READMUX
+ BABL_READMUX_MODE,
+# endif
+# ifdef BABL_WINDOWS
+ BABL_WINDOWS_MODE,
+# endif
+# ifdef BABL_VI
+ BABL_VI_MODE,
+# endif
+# ifdef BABL_LINUX
+ BABL_LINUX_MODE,
+# endif
+# ifdef BABL_EMACS
+ BABL_EMACS_MODE,
+# endif
+# ifdef BABL_CHROMEOS
+ BABL_CHROMEOS_MODE,
+# endif
+ BABL_MODEMAX
+};
+
+// void babble_led_user( uint8_t id)
+
+/// Hacks to make it easier to create sendstring macros
+
+//"outer" versions wrap text
+# define OMCTL(arg) SS_DOWN(X_LCTRL) arg SS_UP(X_LCTRL)
+# define OMGUI(arg) SS_DOWN(X_LGUI) arg SS_UP(X_LGUI)
+# define OMALT(arg) SS_DOWN(X_LALT) arg SS_UP(X_LALT)
+# define OMSFT(...) SS_DOWN(X_LSHIFT) __VA_ARGS__ SS_UP(X_LSHIFT)
+//"inner" versions wrap a key tap
+# define IMCTL(arg) SS_DOWN(X_LCTRL) SS_TAP(arg) SS_UP(X_LCTRL)
+# define IMGUI(arg) SS_DOWN(X_LGUI) SS_TAP(arg) SS_UP(X_LGUI)
+# define IMALT(arg) SS_DOWN(X_LALT) SS_TAP(arg) SS_UP(X_LALT)
+# define IMSFT(arg) SS_DOWN(X_LSHIFT) SS_TAP(arg) SS_UP(X_LSHIFT)
+
+# define BABLM(ent, ...) \
+ if (ent == keycode) { \
+ SEND_STRING(__VA_ARGS__); \
+ return true; \
+ }
+
+// BabblePaste should be loaded first (header in userspace .h file, before all else)
+// if not,we'll do our best.
+# if defined(NEW_SAFE_RANGE)
+# define BABBLE_START NEW_SAFE_RANGE
+# else
+# if defined(KEYMAP_SAFE_RANGE)
+# define BABBLE_START KEYMAP_SAFE_RANGE
+# else
+# define BABBLE_START SAFE_RANGE
+# endif
+# endif
+
+enum babble_keycodes {
+ FIRST = BABBLE_START,
+# ifdef BABL_MOVE
+ // Movement macros
+ // left & right
+ BABL_GO_LEFT_1C,
+ BABL_GO_RIGHT_1C,
+ BABL_GO_LEFT_WORD,
+ BABL_GO_RIGHT_WORD,
+ BABL_GO_START_LINE,
+ BABL_GO_END_LINE,
+ // now up & down
+ BABL_GO_START_DOC,
+ BABL_GO_END_DOC,
+ BABL_GO_NEXT_LINE,
+ BABL_GO_PREV_LINE,
+ BABL_GO_PARA_START,
+ BABL_GO_PARA_END,
+ BABL_PGDN,
+ BABL_PGUP,
+ // And the delete options
+ BABL_DEL_LEFT_1C, // == backspace, so why bother?
+ BABL_DEL_RIGHT_1C, // usually = Del
+ BABL_DEL_LEFT_WORD,
+ BABL_DEL_RIGHT_WORD,
+ BABL_DEL_TO_LINE_END, // delete from cursor to end of line
+ BABL_DEL_TO_LINE_START, // delete from cursor to begining line
+ BABL_MODE, // print out string saying what mode we're in.
+# endif
+# ifdef BABL_OSKEYS
+ BABL_UNDO,
+ BABL_REDO,
+ BABL_CUT,
+ BABL_COPY,
+ BABL_PASTE,
+ BABL_SELECT_ALL,
+ /* not yet implemented
+ BABL_SWAP_LAST2C, // swap last characters before the cursor
+ BABL_SWAP_LAST2W, // Swap the last two words before the cursor
+ */
+ // find & replace
+ BABL_FIND,
+ BABL_FIND_NEXT,
+ BABL_FIND_PREV,
+ BABL_FIND_REPLACE,
+ // GUI or app
+ BABL_RUNAPP,
+ BABL_SWITCH_APP_NEXT,
+ BABL_SWITCH_APP_LAST, // previous
+ BABL_WINDOW_NEXT,
+ BABL_WINDOW_PREV,
+ BABL_WINDOW_NEW,
+ BABL_CLOSE_APP,
+ BABL_HELP,
+ BABL_LOCK,
+ BABL_SCREENCAPTURE,
+ BABL_SWITCH_KEYBOARD_LAYOUT,
+# endif
+# ifdef BABL_BROWSER
+ BABL_BROWSER_NEW_TAB,
+ BABL_BROWSER_CLOSE_TAB,
+ BABL_BROWSER_REOPEN_LAST_TAB,
+ BABL_BROWSER_NEXT_TAB,
+ BABL_BROWSER_PREV_TAB,
+ BABL_BROWSER_URL_BAR,
+ BABL_BROWSER_FORWARD,
+ BABL_BROWSER_BACK,
+ BABL_BROWSER_FIND,
+ BABL_BROWSER_BOOKMARK,
+ BABL_BROWSER_DEV_TOOLS, // hard one to remember
+ BABL_BROWSER_RELOAD,
+ BABL_BROWSER_FULLSCREEN,
+ BABL_BROWSER_ZOOM_IN,
+ BABL_BROWSER_ZOOM_OUT,
+ BABL_BROWSER_VIEWSRC,
+# endif
+# ifdef BABL_APP
+ BABL_APP_SAVE, // save file blurs app & os. Move?
+ BABL_APP_PASTE_VALUES, // paste only values, or with some special formatting. ctrl shift v chrome, // Ctrl+Alt+V, excel
+ // App hotkeys will be flawed, since you may use different spreadsheets across OSes.
+# ifdef BABL_APP_CELLS // spreadsheets and tables
+ BABL_APP_CENTER_ALIGN, // Center align contents of a cell in table or spreadsheet.
+ BABL_APP_CLEAR_FORMATTING, //
+ BABL_APP_SCROLL_ACTIVE_CELL, // scroll to active cell.
+ BABL_NEWLINE_IN_CELL, // newline inside cell of table,
+ BABL_INSERT_COMMENT, // insert comment
+ BABL_INSERT_COL_LEFT, // insert columns to the left
+ BABL_INSERT_ROW, // insert row
+ BABL_DELETE_ROW, // delete row // excel ctrl minus // chrome ctrl alt minus
+ BABL_SELECT_COL, // select column - ctrl space //same in both
+ BABL_SELECT_ROW, // select row shift spaced // same in both.
+# endif // BABL_APP_CELLS
+# ifdef BABL_APP_EDITOR
+ BABL_APP_MULTI_SELECT, /* www.sublimetext.com/docs/2/multiple_selection_with_the_keyboard.html */
+# endif // BABL_APP_EDITOR
+# ifdef BABL_APP_WINDOWSPLITTING
+ // These aren't useful on most oses.
+ BABL_SPLIT_FRAME_VERT,
+ BABL_UNSPLIT_FRAME_VERT,
+ BABL_SPLIT_FRAME_HORIZONTAL,
+ BABL_UNSPLIT_FRAME_HORIZONTAL,
+ BABL_NEXT_FRAME,
+ BABL_PREV_FRAME,
+# endif
+
+# endif
+
+// Macros for mode switching
+# ifdef BABL_WINDOWS
+ BABL_DO_WINDOWS,
+# endif
+# ifdef BABL_MAC
+ BABL_DO_MAC,
+# endif
+# ifdef BABL_LINUX
+ BABL_DO_LINUX,
+# endif
+# ifdef BABL_EMACS
+ BABL_DO_EMACS,
+# endif
+# ifdef BABL_VI
+ BABL_DO_VI,
+# endif
+# ifdef BABL_READMUX
+ BABL_DO_READMUX,
+# endif
+# ifdef BABL_CHROMEOS
+ BABL_DO_CHROMEOS,
+# endif
+ BABBLE_END_RANGE
+};
+
+// primary function.
+bool babblePaste(uint16_t keycode);
+
+/****************************************************/
+/* All per-os includes and short mode switch macros*/
+# ifdef BABL_WINDOWS
+# define B_WIN BABL_DO_WINDOWS
+bool babblePaste_win(uint16_t keycode);
+# endif
+# ifdef BABL_MAC
+# define B_MAC BABL_DO_MAC
+bool babblePaste_mac(uint16_t keycode);
+# endif
+# ifdef BABL_LINUX
+# define B_LINUX BABL_DO_LINUX
+bool babblePaste_linux(uint16_t keycode);
+# endif
+# ifdef BABL_EMACS
+# define B_EMACS BABL_DO_EMACS
+bool babblePaste_emacs(uint16_t keycode);
+# endif
+# ifdef BABL_VI
+# define B_VI BABL_DO_VI
+bool babblePaste_vi(uint16_t keycode);
+# endif
+# ifdef BABL_READMUX
+# define B_READ BABL_DO_READMUX
+bool babblePaste_readmux(uint16_t keycode);
+# endif
+# ifdef BABL_CHROMEOS
+# define B_CROM BABL_DO_CHROMEOS
+bool babblePaste_chromeos(uint16_t keycode);
+# endif
+
+# define BABL_INC babble_mode_increment();
+# define BABL_DEC babble_mode_decrement();
+
+/****************************************************
+** All keyboard macros for Babble Actions
+*****************************************************/
+
+# ifdef BABL_MOVE
+# define B_L1C BABL_GO_LEFT_1C
+# define B_R1C BABL_GO_RIGHT_1C
+# define B_L1W BABL_GO_LEFT_WORD
+# define B_R1W BABL_GO_RIGHT_WORD
+# define B_GSOL BABL_GO_START_LINE
+# define B_GEOL BABL_GO_END_LINE
+# define B_GTOP BABL_GO_START_DOC
+# define B_GEND BABL_GO_END_DOC
+# define B_DOWN BABL_GO_NEXT_LINE
+# define B_UP BABL_GO_PREV_LINE
+# define B_PTOP BABL_GO_PARA_START
+# define B_PEND BABL_GO_PARA_END
+# define B_PGDN BABL_PGDN
+# define B_PGUP BABL_PGUP
+//#define B_BKSP BABL_DEL_LEFT_1C == backspace so why bother.
+# define B_DEL BABL_DEL_RIGHT_1C // usually = Del
+# define B_DLW BABL_DEL_LEFT_WORD
+# define B_DRW BABL_DEL_RIGHT_WORD
+# define B_DEOL BABL_DEL_TO_LINE_END // delete from cursor to end of line
+# define B_DSOL BABL_DEL_TO_LINE_START // delete from cursor to begining line
+# define B_MODE BABL_MODE // type out name of current mode.
+# endif
+
+# ifdef BABL_OSKEYS
+# define B_UNDO BABL_UNDO
+# define B_REDO BABL_REDO
+# define B_CUT BABL_CUT
+# define B_COPY BABL_COPY
+# define B_PASTE BABL_PASTE
+# define B_SELALL BABL_SELECT_ALL
+# define B_SELA BABL_SELECT_ALL
+# define B_FIND BABL_FIND
+# define B_FINDN BABL_FIND_NEXT
+# define B_FINDP BABL_FIND_PREV
+# define B_RPLACE BABL_FIND_REPLACE
+# define B_RUNAPP BABL_RUNAPP
+# define B_NAPP BABL_SWITCH_APP_NEXT
+# define B_PAPP BABL_SWITCH_APP_LAST // previous
+# define B_NWIN BABL_WINDOW_NEXT
+# define B_PWIN BABL_WINDOW_PREV
+# define B_WINN BABL_WINDOW_NEW
+# define B_CAPP BABL_CLOSE_APP
+# define B_HELP BABL_HELP
+# define B_LOCK BABL_LOCK
+# define B_SCAP BABL_SCREENCAPTURE
+# define B_KEYB BABL_SWITCH_KEYBOARD_LAYOUT
+# endif
+
+# ifdef BABL_BROWSER
+# define B_NTAB BABL_BROWSER_NEW_TAB
+# define B_CTAB BABL_BROWSER_CLOSE_TAB
+# define B_ROTB BABL_BROWSER_REOPEN_LAST_TAB
+# define B_NXTB BABL_BROWSER_NEXT_TAB
+# define B_PTAB BABL_BROWSER_PREV_TAB
+# define B_NURL BABL_BROWSER_URL_BAR
+# define B_BFWD BABL_BROWSER_FORWARD
+# define B_BBAK BABL_BROWSER_BACK
+# define B_BFND BABL_BROWSER_FIND
+# define B_BOOK BABL_BROWSER_BOOKMARK
+# define B_BDEV BABL_BROWSER_DEV_TOOLS // hard one to remember
+# define B_BRLD BABL_BROWSER_RELOAD
+# define B_BFULL BABL_BROWSER_FULLSCREEN
+# define B_ZIN BABL_BROWSER_ZOOM_IN
+# define B_ZOUT BABL_BROWSER_ZOOM_OUT
+# endif
+
+# ifdef BABL_APP
+# define B_SAVE BABL_APP_SAVE
+# ifdef BABL_APP_CELLS // spreadsheets and tables
+# define B_PASTV BABL_APP_PASTE_VALUES
+# define B_CALN BABL_APP_CENTER_ALIGN
+# define B_CFMT BABL_APP_CLEAR_FORMATTING
+# define B_SCLA BABL_APP_SCROLL_ACTIVE_CELL
+# define B_NCEL BABL_NEWLINE_IN_CELL
+# define B_IPRW BABL_INSERT_ROW_ABOVE
+# define B_ICOL BABL_INSERT_COL_LEFT
+# define B_IROW BABL_INSERT_ROW
+# define B_DROW BABL_DELETE_ROW
+# define B_SELC BABL_SELECT_COL
+# define B_SELR BABL_SELECT_ROW
+# endif // BABL_APP_CELLS
+# ifdef BABL_APP_EDITOR
+# define B_MSEL BABL_APP_MULTI_SELECT
+/* www.sublimetext.com/docs/2/multiple_selection_with_the_keyboard.html */
+# endif // BABL_APP_EDITOR
+# ifdef BABL_APP_WINDOWSPLITTING
+# define B_VSPLIT BABL_SPLIT_FRAME_VERT
+# define B_VUNSPT BABL_UNSPLIT_FRAME_VERT
+# define B_HSPLIT BABL_SPLIT_FRAME_HORIZONTAL
+# define B_HUNSPT BABL_UNSPLIT_FRAME_HORIZONTAL
+# define B_NXTFM BABL_NEXT_FRAME
+# define B_PRVFM BABL_PREV_FRAME
+# endif // BABL_APP_WINDOWSPLITTING
+# endif // BABL_APP
+
+#endif
diff --git a/users/miles2go/babblePaste.md b/users/miles2go/babblePaste.md
new file mode 100644
index 00000000000..cc1c31bd0d0
--- /dev/null
+++ b/users/miles2go/babblePaste.md
@@ -0,0 +1,207 @@
+## Babblepaste, a universal translator for keyboard shortcuts
+
+The idea is to have one "paste" key do the right thing for any operating system.
+Put the keyboard in Windows mode, and "paste" means Ctrl-v.
+Switch to Emacs and "Paste" means Ctrl-y. Mac is GUI-v and so on.
+
+Currently supported modes are Windows, OS X, Gnome/KDE, Emacs, VI , ChromeOS, and Readline, with 70+ common macro actions.
+
+The babblepaste library looks for the current OS in the babble_mode global variable.
+To switch modes, run the switch_babble_mode() function, or a pre defined BABL_DO_x macro.
+
+**BE CAREFUL**
+ * Not all actions are defined for all OSes. The default is to do nothing.
+ * Not all actions are _TESTED_ on all OSes.
+ * Keys can have very different meanings between windows in the same OS. If you switch apps without switching modes, bad things can happen.
+
+###To use the library
+#### Add #defines to your config.h.
+```
+ #define USE_BABBLEPASTE
+
+ //// Uncomment the modes you want to enable
+ #define BABL_WINDOWS
+ #define BABL_READMUX
+ #define BABL_VI
+ #define BABL_MAC
+ #define BABL_LINUX
+ #define BABL_EMACS
+ #define BABL_CHROMEOS
+
+ //// These enable subsets of babble macros. Disable options to save space
+ #define BABL_MOVE // Uncomment to add basic cursor movement
+ #define BABL_OSKEYS // This adds Cut, paste, window movement and common OS shortcuts
+ #define BABL_BROWSER // Browser shortcuts
+
+ //// What Browser shortcuts?
+ #define BABL_BROWSER_CHROME // Chrome browser, Google apps
+ //#define BABL_BROWSER_MS
+ //#define BABL_BROWSER_SAFARI // Safari, Apple defaults.
+
+ //// applications vary even more between OSes. We'll do our best.
+ #define BABL_APP
+ // To enable specific App options.
+ #define BABL_APP_CELLS // spreadsheets and tables
+ #define BABL_APP_EDITOR // Fancy editor commands
+ #define BABL_APP_WINDOWSPLITTING // splitting frames & windows
+
+ //// What App keybinding is assumed?
+ //#define BABL_APP_GOOGLE // Google office
+ #define BABL_APP_MSOFFICE // MS office
+ //#define BABL_APP_APPLE // Apple office
+ #define BABL_APP_SUBLIME
+```
+
+#### Enable Babblepaste in your Keymap
+
+Add the following to your keymap in process_record_user, before the main switch statement.
+```
+ #ifdef USE_BABBLEPASTE
+ if( keycode > BABBLE_START && keycode < BABBLE_END_RANGE ) {
+ if (record->event.pressed) { // is there a case where this isn't desired?
+ babblePaste ( keycode );
+ } else{
+ return true;
+ }
+ }
+ #endif
+```
+
+#### Add makefile rules
+
+Update your rules.mk to include the modes you want.
+
+ `SRC += babblePaste.c babl_windows.c babl_mac.c babl_vi.c babl_readmux.c babl_chromeos.c babl_emacs.c babl_linux.c`
+
+
+#### Custom Keycodes
+
+If you are using custom keycodes, update the safe range in your user.h
+```
+ #if defined(BABBLE_END_RANGE)
+ #define USER_START BABBLE_END_RANGE
+ #else
+ #if defined(KEYMAP_SAFE_RANGE)
+ #define USER_START KEYMAP_SAFE_RANGE
+ #else
+ #define USER_START SAFE_RANGE
+ #endif
+ #endif
+```
+
+#### Add Babblepaste actions to your keymap.
+See the full list in babblePaste.h, or the list below
+```
+ B_WIN // switch babblepaste to windows mode.
+ B_MAC // Mac Mode
+ B_LNX // switch to linux
+ B_VI // switch to Vi mode
+ B_EMAX // switch mode to emacs
+ B_READ // switch to readline /tmux mode
+ B_CROM // switch to chromeos mode.
+
+ #define B_L1C BABL_GO_LEFT_1C
+ #define B_R1C BABL_GO_RIGHT_1C
+ #define B_L1W BABL_GO_LEFT_WORD
+ #define B_R1W BABL_GO_RIGHT_WORD
+ #define B_GSOL BABL_GO_START_LINE
+ #define B_GEOL BABL_GO_END_LINE
+ #define B_GTOP BABL_GO_START_DOC
+ #define B_GEND BABL_GO_END_DOC
+ #define B_DOWN BABL_GO_NEXT_LINE
+ #define B_UP BABL_GO_PREV_LINE
+ #define B_PTOP BABL_GO_PARA_START
+ #define B_PEND BABL_GO_PARA_END
+ #define B_PGDN BABL_PGDN
+ #define B_PGUP BABL_PGUP
+ #define B_DEL BABL_DEL_RIGHT_1C
+ #define B_DLW BABL_DEL_LEFT_WORD
+ #define B_DRW BABL_DEL_RIGHT_WORD
+ #define B_DEOL BABL_DEL_TO_LINE_END // delete from cursor to end of line
+ #define B_DSOL BABL_DEL_TO_LINE_START // delete from cursor to begining line
+ #define B_MODE BABL_MODE //type out name of current mode.
+
+ #define B_UNDO BABL_UNDO
+ #define B_REDO BABL_REDO
+ #define B_CUT BABL_CUT
+ #define B_COPY BABL_COPY
+ #define B_PASTE BABL_PASTE
+ #define B_SELALL BABL_SELECT_ALL
+ #define B_SELA BABL_SELECT_ALL
+ #define B_FIND BABL_FIND
+ #define B_FINDN BABL_FIND_NEXT
+ #define B_FINDP BABL_FIND_PREV
+ #define B_RPLACE BABL_FIND_REPLACE
+ #define B_RUNAPP BABL_RUNAPP
+ #define B_NAPP BABL_SWITCH_APP_NEXT
+ #define B_PAPP BABL_SWITCH_APP_LAST // previous
+ #define B_CAPP BABL_CLOSE_APP
+ #define B_HELP BABL_HELP
+
+ #define B_NTAB BABL_BROWSER_NEW_TAB
+ #define B_CTAB BABL_BROWSER_CLOSE_TAB
+ #define B_ROTB BABL_BROWSER_REOPEN_LAST_TAB
+ #define B_NXTB BABL_BROWSER_NEXT_TAB
+ #define B_PTAB BABL_BROWSER_PREV_TAB
+ #define B_NURL BABL_BROWSER_URL_BAR
+ #define B_BFWD BABL_BROWSER_FORWARD
+ #define B_BBAK BABL_BROWSER_BACK
+ #define B_BFND BABL_BROWSER_FIND
+ #define B_BOOK BABL_BROWSER_BOOKMARK
+ #define B_BDEV BABL_BROWSER_DEV_TOOLS // hard one to remember
+ #define B_BRLD BABL_BROWSER_RELOAD
+ #define B_BFULL BABL_BROWSER_FULLSCREEN
+ #define B_ZIN BABL_BROWSER_ZOOM_IN
+ #define B_ZOUT BABL_BROWSER_ZOOM_OUT
+
+ #define B_PASTV BABL_APP_PASTE_VALUES
+ #define B_CALN BABL_APP_CENTER_ALIGN
+ #define B_CFMT BABL_APP_CLEAR_FORMATTING
+ #define B_SCLA BABL_APP_SCROLL_ACTIVE_CELL
+ #define B_NCEL BABL_NEWLINE_IN_CELL
+ #define B_IPRW BABL_INSERT_ROW_ABOVE
+ #define B_ICOL BABL_INSERT_COL_LEFT
+ #define B_IROW BABL_INSERT_ROW
+ #define B_DROW BABL_DELETE_ROW
+ #define B_SELC BABL_SELECT_COL
+ #define B_SELR BABL_SELECT_ROW
+
+ #define B_MSEL BABL_APP_MULTI_SELECT
+ #define B_VSPLIT BABL_SPLIT_FRAME_VERT
+ #define B_VUNSPT BABL_UNSPLIT_FRAME_VERT
+ #define B_HSPLIT BABL_SPLIT_FRAME_HORIZONTAL
+ #define B_HUNSPT BABL_UNSPLIT_FRAME_HORIZONTAL
+ #define B_NXTFM BABL_NEXT_FRAME
+ #define B_PRVFM BABL_PREV_FRAME
+```
+
+
+## Development FAQs
+
+**Todos**
+eeprom store state of babble_mode? or update docs so that people can change the order of the enum in
+babblespace.h?
+
+**You have huge ifdef stanzas instead of functions**
+This fails gracefully if you don't have all options defined. Patch if you can think how to use fewer defines.
+
+** Why not an array of arrays as a lookup instead of a function?**
+This would allow you to store the lookup table in PROGMEM.
+True, but that takes more pre-processor skill than I have, and may be less portable to ARM or other flash mappings.
+
+** Have you tested every key on every platform?**
+No. Be careful, submit a patch.
+
+** Why not update Apps at the same global level as the OS? **
+This is only a good thing if it doesn't confuse the user. If you can show state of OS vs App, it's probably a good thing.
+
+** Can the OS tell the keyboard what mode to use? **
+The keyboard side is easy to do with virtser_recv & a function that updates babble_mode. It still needs a PC side app to track where the keyboard focus is.
+One could use a keyboard macro to launch an app & switch modes for that app.
+
+## Thanks
+
+Thanks to [wikipedia shortcuts page](https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts)
+and [Jeebak's keymap](https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c)
+this [howtogeek shortcuts page](https://www.howtogeek.com/115664/42-text-editing-keyboard-shortcuts-that-work-almost-everywhere/)
+And of course QMK...
diff --git a/users/miles2go/babl_chromeos.c b/users/miles2go/babl_chromeos.c
new file mode 100644
index 00000000000..a0c461f24e9
--- /dev/null
+++ b/users/miles2go/babl_chromeos.c
@@ -0,0 +1,103 @@
+/* A library to output the right key shortcut in any common app.
+Given a global variable babble_mode to show the environment and a
+key that calls the paste macro, do the right type of paste.
+Setting the context is done by another macro, or TBD interaction with the host.
+
+https://support.google.com/docs/answer/181110?co=GENIE.Platform%3DDesktop&hl=en
+
+*/
+
+#include QMK_KEYBOARD_H
+
+#ifdef USE_BABBLEPASTE
+# include "babblePaste.h"
+
+# ifdef BABL_CHROMEOS
+
+bool babblepaste_chromeos(uint16_t keycode) {
+# ifdef BABL_MOVE
+ BABLM(BABL_GO_LEFT_1C, SS_TAP(X_LEFT));
+ BABLM(BABL_GO_RIGHT_1C, SS_TAP(X_RIGHT));
+ BABLM(BABL_GO_LEFT_WORD, IMCTL(X_LEFT));
+ BABLM(BABL_GO_RIGHT_WORD, IMCTL(X_RIGHT));
+ BABLM(BABL_GO_START_LINE, SS_TAP(X_HOME));
+ BABLM(BABL_GO_END_LINE, SS_TAP(X_END));
+ BABLM(BABL_GO_START_DOC, IMCTL(X_HOME));
+ BABLM(BABL_GO_END_DOC, IMCTL(X_END));
+ BABLM(BABL_GO_NEXT_LINE, SS_TAP(X_DOWN));
+ BABLM(BABL_GO_PREV_LINE, SS_TAP(X_UP));
+ BABLM(BABL_GO_PARA_START, IMCTL(X_UP)); // untested
+ BABLM(BABL_GO_PARA_END, IMCTL(X_DOWN)); // untested
+ BABLM(BABL_PGDN, IMGUI(X_DOWN));
+ BABLM(BABL_PGUP, IMGUI(X_UP));
+ BABLM(BABL_DEL_RIGHT_1C, IMALT(X_BSPACE));
+ BABLM(BABL_DEL_LEFT_WORD, IMCTL(X_BSPACE));
+ BABLM(BABL_DEL_RIGHT_WORD, OMSFT(IMCTL(X_RIGHT)) SS_TAP(X_BSPACE));
+ BABLM(BABL_DEL_TO_LINE_END, OMSFT(IMGUI(X_LEFT)) SS_TAP(X_BSPACE));
+ BABLM(BABL_DEL_TO_LINE_START, OMSFT(IMGUI(X_RIGHT)) SS_TAP(X_BSPACE));
+ BABLM(BABL_MODE, ("ChromeOS "));
+# endif
+# ifdef BABL_OSKEYS
+ BABLM(BABL_UNDO, SS_LCTRL("z"));
+ BABLM(BABL_REDO, OMSFT(IMCTL(X_Z)));
+ BABLM(BABL_CUT, SS_LCTRL("x"));
+ BABLM(BABL_COPY, SS_LCTRL("c"));
+ BABLM(BABL_PASTE, SS_LCTRL("v"));
+ BABLM(BABL_SELECT_ALL, SS_LCTRL("a"));
+ BABLM(BABL_FIND, SS_LCTRL("f"));
+ BABLM(BABL_FIND_NEXT, SS_LCTRL("g"));
+ BABLM(BABL_FIND_PREV, OMSFT(IMCTL(X_G)));
+ BABLM(BABL_WINDOW_NEW, IMCTL(X_N));
+ // BABLM( BABL_FIND_REPLACE, () ); // not part of Chrome
+ // BABLM( BABL_RUNAPP, SS_TAP(X_LGUI) ); // not sure of this
+ BABLM(BABL_SWITCH_APP_NEXT, IMALT(X_TAB));
+ BABLM(BABL_SWITCH_APP_LAST, OMSFT(IMALT(X_TAB)));
+ BABLM(BABL_CLOSE_APP, OMSFT(IMCTL(X_W)));
+ // BABLM( BABL_HELP, OMCTL(IMALT(X_SLASH)) ); // general help
+ BABLM(BABL_HELP, IMCTL(X_SLASH)); // this is keyboard accelerator lookup
+ BABLM(BABL_LOCK, SS_LGUI("l")); // should be caps?
+ BABLM(BABL_SCREENCAPTURE, OMSFT(IMCTL(X_F5)));
+ BABLM(BABL_SWITCH_KEYBOARD_LAYOUT, IMCTL(X_SPACE));
+# endif
+# ifdef BABL_BROWSER
+ BABLM(BABL_BROWSER_NEW_TAB, SS_LCTRL("t"));
+ BABLM(BABL_BROWSER_CLOSE_TAB, SS_LCTRL("w"));
+ BABLM(BABL_BROWSER_REOPEN_LAST_TAB, OMSFT(IMCTL(X_T)));
+ BABLM(BABL_BROWSER_NEXT_TAB, IMCTL(X_TAB));
+ BABLM(BABL_BROWSER_PREV_TAB, OMSFT(IMCTL(X_TAB)));
+ BABLM(BABL_BROWSER_URL_BAR, SS_LCTRL("l"));
+ BABLM(BABL_BROWSER_FORWARD, IMALT(X_RIGHT));
+ BABLM(BABL_BROWSER_BACK, IMALT(X_LEFT));
+ ;
+ BABLM(BABL_BROWSER_FIND, SS_LCTRL("f"));
+ BABLM(BABL_BROWSER_BOOKMARK, SS_LCTRL("d"));
+ BABLM(BABL_BROWSER_DEV_TOOLS, OMSFT(IMCTL(X_I)));
+ BABLM(BABL_BROWSER_RELOAD, OMSFT(IMCTL(X_R))); // hard reload w/o cache
+ BABLM(BABL_BROWSER_FULLSCREEN, SS_TAP(X_F4)); // untested
+ BABLM(BABL_BROWSER_ZOOM_IN, OMSFT(IMCTL(X_EQUAL))); // ctr+ +
+ BABLM(BABL_BROWSER_ZOOM_OUT, IMCTL(X_MINUS));
+ BABLM(BABL_BROWSER_VIEWSRC, SS_LCTRL("u")); // Chrome or firefox
+# endif
+
+# ifdef BABL_APP
+ BABLM(BABL_APP_SAVE, SS_LCTL("s"));
+ //#ifdef BABL_APP_GOOGLE -- we're going to make an assumption.
+ BABLM(BABL_APP_CENTER_ALIGN, OMSFT(IMCTL(X_E)));
+ BABLM(BABL_APP_SCROLL_ACTIVE_CELL, IMCTL(X_BSPACE));
+ BABLM(BABL_NEWLINE_IN_CELL, IMALT(X_ENTER));
+ BABLM(BABL_INSERT_COMMENT, OMALT(IMCTL(X_M)));
+ BABLM(BABL_APP_CLEAR_FORMATTING, IMCTL(X_BSLASH));
+ BABLM(BABL_DELETE_ROW, IMALT(X_E) "d");
+ BABLM(BABL_INSERT_COL_LEFT, IMALT(X_I) "c"); // o for to the right.
+ BABLM(BABL_INSERT_ROW, IMALT(X_I) "w"); // r for above.
+ BABLM(BABL_SELECT_COL, IMCTL(X_SPACE));
+ BABLM(BABL_SELECT_ROW, IMSFT(X_SPACE));
+ BABLM(BABL_DELETE_ROW, OMALT(IMCTL(X_KP_MINUS))); // once selected
+//#endif // BABL_APP_CELLS
+# endif // BABL_APP
+
+ // Todo, ring bell, flash light, show user this isn't supported
+ return false;
+}
+# endif
+#endif /* chromeos*/
diff --git a/users/miles2go/babl_emacs.c b/users/miles2go/babl_emacs.c
new file mode 100644
index 00000000000..201da0d1a36
--- /dev/null
+++ b/users/miles2go/babl_emacs.c
@@ -0,0 +1,85 @@
+/* A library to output the right key shortcut in any common app.
+Given a global variable babble_mode to show the environment and a
+key that calls the paste macro, do the right type of paste.
+Setting the context is done by another macro, or TBD interaction with the host.
+
+Emacs mode is probably most useful for people who don't usually use emacs
+
+https://www.ast.cam.ac.uk/~vasily/idl/emacs_commands_list.html
+*/
+
+#include QMK_KEYBOARD_H
+
+#ifdef USE_BABBLEPASTE
+# include "babblePaste.h"
+
+# ifdef BABL_EMACS
+
+// probably should allow meta to not be ALT
+# define DMETA IMALT
+
+bool babblePaste_emacs(uint16_t keycode) {
+# ifdef BABL_MOVE
+ BABLM(BABL_GO_LEFT_1C, SS_TAP(X_LEFT));
+ BABLM(BABL_GO_RIGHT_1C, SS_TAP(X_RIGHT));
+ BABLM(BABL_GO_LEFT_WORD, IMALT(X_B));
+ BABLM(BABL_GO_RIGHT_WORD, IMALT(X_F));
+ BABLM(BABL_GO_START_LINE, SS_LCTRL("a"));
+ BABLM(BABL_GO_END_LINE, SS_LCTRL("e"));
+ BABLM(BABL_GO_START_DOC, OMALT(IMSFT(X_COMMA)));
+ BABLM(BABL_GO_END_DOC, OMALT(IMSFT(X_DOT)));
+ BABLM(BABL_GO_NEXT_LINE, SS_LCTRL("n"));
+ BABLM(BABL_GO_PREV_LINE, SS_LCTRL("p"));
+ BABLM(BABL_GO_PARA_START, OMALT(IMSFT(X_LBRACKET)));
+ BABLM(BABL_GO_PARA_END, OMALT(IMSFT(X_RBRACKET)));
+ BABLM(BABL_PGDN, SS_LCTRL("v"));
+ BABLM(BABL_PGUP, IMALT(X_V));
+ BABLM(BABL_DEL_RIGHT_1C, SS_LCTRL("d"));
+ BABLM(BABL_DEL_LEFT_WORD, IMCTL(X_BSPACE));
+ BABLM(BABL_DEL_RIGHT_WORD, IMALT(X_D));
+ BABLM(BABL_DEL_TO_LINE_END, SS_LCTRL("k"));
+ BABLM(BABL_DEL_TO_LINE_START, SS_TAP(X_ESCAPE) "0" SS_LCTRL("k"));
+ BABLM(BABL_MODE, "Emacs ");
+# endif
+# ifdef BABL_OSKEYS
+ BABLM(BABL_UNDO, SS_LCTRL("x") "c");
+ BABLM(BABL_REDO, SS_LCTRL("x") "c"); // arguably
+ BABLM(BABL_CUT, SS_LCTRL("w"));
+ BABLM(BABL_COPY, SS_LALT("w")); // really?
+ BABLM(BABL_PASTE, SS_LCTRL("y"));
+ BABLM(BABL_SELECT_ALL, SS_LCTRL("x") "h");
+ BABLM(BABL_FIND, SS_LCTRL("s"));
+ BABLM(BABL_FIND_NEXT, SS_LCTRL("s"));
+ BABLM(BABL_FIND_PREV, SS_LCTRL("r"));
+ BABLM(BABL_FIND_REPLACE, OMALT(IMSFT(X_5)));
+ // BABLM( BABL_RUNAPP , //(SS_LALT("x") "shell") );// arguably
+ BABLM(BABL_RUNAPP, IMALT(X_X) "split-window" SS_TAP(X_ENTER)); // arguably
+ BABLM(BABL_WINDOW_NEXT, SS_LCTRL("x") "o");
+ BABLM(BABL_WINDOW_PREV, SS_LCTRL("x") "o"); // arguably
+ // BABLM( BABL_WINDOW_NEW, IMCTL(X_X)"n" ); //
+ BABLM(BABL_CLOSE_APP, SS_LCTRL("x") "c");
+ BABLM(BABL_HELP, SS_LCTRL("h") "a"); // start search in help
+ // BABLM( BABL_LOCK, () ); // lock buffer? Too many options.
+ // BABLM( BABL_SCREENCAPTURE, () ); // requires plugin?
+
+# endif
+# ifdef BABL_BROWSER
+/* you get to figure w3 out */
+# endif
+
+# ifdef BABL_APP
+ BABLM(BABL_APP_SAVE, SS_LCTL("x") SS_LCTL("s"));
+ /// BABLM( BABL_APP_MULTI_SELECT, SS_LCTRL("x") "rt" ); // arguably
+ BABLM(BABL_SPLIT_FRAME_VERT, SS_LCTRL("x") "3");
+ BABLM(BABL_UNSPLIT_FRAME_VERT, SS_LCTRL("u") SS_LCTRL("x") "0");
+ BABLM(BABL_SPLIT_FRAME_HORIZONTAL, SS_LCTRL("x") "2");
+ BABLM(BABL_UNSPLIT_FRAME_HORIZONTAL, SS_LCTRL("u") SS_LCTRL("x") "0");
+ BABLM(BABL_NEXT_FRAME, SS_LCTRL("x") "o");
+ BABLM(BABL_PREV_FRAME, SS_LCTRL("u") "-1" SS_LCTRL("x") "o");
+# endif
+
+ // Todo, ring bell, flash light, show user this isn't supported
+ return false;
+}
+# endif /* emacs mode*/
+#endif
diff --git a/users/miles2go/babl_linux.c b/users/miles2go/babl_linux.c
new file mode 100644
index 00000000000..aa822d9ba14
--- /dev/null
+++ b/users/miles2go/babl_linux.c
@@ -0,0 +1,102 @@
+/* A library to output the right key shortcut in any common app.
+Given a global variable babble_mode to show the environment and a
+key that calls the paste macro, do the right type of paste.
+Setting the context is done by another macro, or TBD interaction with the host.
+
+Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts
+and
+https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c
+*/
+
+#include QMK_KEYBOARD_H
+
+#ifdef USE_BABBLEPASTE
+# include "babblePaste.h"
+
+# ifdef BABL_LINUX
+
+bool babblePaste_linux(uint16_t keycode) {
+# ifdef BABL_MOVE
+ BABLM(BABL_GO_LEFT_1C, SS_TAP(X_LEFT));
+ BABLM(BABL_GO_RIGHT_1C, SS_TAP(X_RIGHT));
+ BABLM(BABL_GO_LEFT_WORD, IMCTL(X_LEFT));
+ BABLM(BABL_GO_RIGHT_WORD, IMCTL(X_RIGHT));
+ BABLM(BABL_GO_START_LINE, SS_TAP(X_HOME));
+ BABLM(BABL_GO_END_LINE, SS_TAP(X_END));
+ BABLM(BABL_GO_START_DOC, IMCTL(X_HOME));
+ BABLM(BABL_GO_END_DOC, IMCTL(X_END));
+ BABLM(BABL_GO_NEXT_LINE, SS_TAP(X_DOWN));
+ BABLM(BABL_GO_PREV_LINE, SS_TAP(X_UP));
+ BABLM(BABL_GO_PARA_START, IMCTL(X_UP));
+ BABLM(BABL_GO_PARA_END, IMCTL(X_DOWN));
+ BABLM(BABL_PGDN, SS_TAP(X_PGDOWN));
+ BABLM(BABL_PGUP, SS_TAP(X_PGUP));
+ BABLM(BABL_DEL_RIGHT_1C, SS_TAP(X_DELETE));
+ BABLM(BABL_DEL_LEFT_WORD, IMCTL(X_BSPACE));
+ BABLM(BABL_DEL_RIGHT_WORD, IMCTL(X_DELETE));
+ BABLM(BABL_DEL_TO_LINE_END, IMSFT(X_HOME) SS_TAP(X_DELETE));
+ BABLM(BABL_DEL_TO_LINE_START, IMSFT(X_END) SS_TAP(X_DELETE));
+ BABLM(BABL_MODE, "Linux ");
+# endif
+# ifdef BABL_OSKEYS
+ BABLM(BABL_UNDO, SS_LCTL("z"));
+ BABLM(BABL_REDO, SS_LCTL("y"));
+ BABLM(BABL_CUT, SS_LCTL("x"));
+ BABLM(BABL_COPY, SS_LCTL("c"));
+ BABLM(BABL_PASTE, SS_LCTL("v"));
+ BABLM(BABL_SELECT_ALL, SS_LCTL("a"));
+ BABLM(BABL_FIND, SS_LCTL("f"));
+ BABLM(BABL_CLOSE_APP, IMALT(X_F4));
+ BABLM(BABL_HELP, SS_TAP(X_F1));
+ // BABLM(BABL_FIND_NEXT (SS_LALT(X_F3)) ); //KDE */
+ BABLM(BABL_FIND_NEXT, SS_LCTL("g")); // Gnome*/
+ BABLM(BABL_FIND_PREV, OMSFT(IMCTL(X_G))); // Gnome*/
+ /* BABLM( BABL_FIND_REPLACE , (SS_LCTL("r")) ); // KDE */
+ BABLM(BABL_FIND_REPLACE, SS_LCTL("h")); // Gnome*/
+ BABLM(BABL_RUNAPP, IMALT(X_F2)); // Gnome
+ BABLM(BABL_SWITCH_APP_NEXT, IMALT(X_TAB));
+ BABLM(BABL_SWITCH_APP_LAST, OMSFT(IMALT(X_TAB)));
+ BABLM(BABL_WINDOW_NEXT, OMCTL(IMALT(X_PGUP))); // Gnome, sometimes
+ BABLM(BABL_WINDOW_PREV, OMCTL(IMALT(X_PGDOWN)));
+ BABLM(BABL_WINDOW_NEW, IMCTL(X_N));
+ // BABLM( BABL_HELP, (SS_TAP(X_F1)) ); // NA?
+ BABLM(BABL_LOCK, OMCTL(IMALT(X_L)));
+ BABLM(BABL_SCREENCAPTURE, IMSFT(X_PSCREEN));
+# endif
+# ifdef BABL_BROWSER
+ BABLM(BABL_BROWSER_NEW_TAB, SS_LCTL("t"));
+ BABLM(BABL_BROWSER_CLOSE_TAB, SS_LCTL("w"));
+ BABLM(BABL_BROWSER_REOPEN_LAST_TAB, OMSFT(IMCTL(X_T)));
+ BABLM(BABL_BROWSER_NEXT_TAB, SS_LCTL(SS_TAP(X_TAB)));
+ BABLM(BABL_BROWSER_PREV_TAB, OMSFT(IMCTL(X_TAB)));
+ BABLM(BABL_BROWSER_URL_BAR, SS_LCTL("l"));
+ BABLM(BABL_BROWSER_FORWARD, IMALT(X_RIGHT));
+ BABLM(BABL_BROWSER_BACK, IMALT(X_LEFT));
+ BABLM(BABL_BROWSER_FIND, SS_LCTL("f"));
+ BABLM(BABL_BROWSER_BOOKMARK, SS_LCTL("d"));
+ BABLM(BABL_BROWSER_DEV_TOOLS, SS_LCTL("t")); // Chrome
+ // chrome
+ BABLM(BABL_BROWSER_RELOAD, IMCTL(X_F5)); // hard reload w/o cache
+ BABLM(BABL_BROWSER_FULLSCREEN, SS_TAP(X_F11)); // command shift F
+ BABLM(BABL_BROWSER_ZOOM_IN, OMSFT(IMCTL(X_EQUAL))); // ctr+ +
+ BABLM(BABL_BROWSER_ZOOM_OUT, IMCTL(X_MINUS));
+ BABLM(BABL_BROWSER_VIEWSRC, SS_LCTL("u")); // Chrome or firefox
+# endif
+# ifdef BABL_APP
+ BABLM(BABL_APP_SAVE, SS_LCTL("s"));
+ // on linux we'd probably use tmux or screen. Some terminal software also
+ // allows this.
+ // BABLM( BABL_SPLIT_FRAME_VERT, () );
+ // BABLM( BABL_UNSPLIT_FRAME_VERT, () );
+ // BABLM( BABL_SPLIT_FRAME_HORIZONTAL, () );
+ // BABLM( BABL_UNSPLIT_FRAME_HORIZONTAL, () );
+ // BABLM( BABL_NEXT_FRAME, () );
+ // BABLM( BABL_PREV_FRAME, () );
+# endif
+
+ // Todo, ring bell, flash light, show user this isn't supported
+ return false;
+}
+
+# endif /* linux mode */
+#endif
diff --git a/users/miles2go/babl_mac.c b/users/miles2go/babl_mac.c
new file mode 100644
index 00000000000..9f769c582d0
--- /dev/null
+++ b/users/miles2go/babl_mac.c
@@ -0,0 +1,152 @@
+/* A library to output the right key shortcut in any common app.
+Given a global variable babble_mode to show the environment and a
+key that calls the paste macro, do the right type of paste.
+Setting the context is done by another macro, or TBD interaction with the host.
+
+Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts
+and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c
+*/
+
+#include QMK_KEYBOARD_H
+
+#ifdef USE_BABBLEPASTE
+# include "babblePaste.h"
+
+# ifdef BABL_MAC
+
+bool babblePaste_mac(uint16_t keycode) {
+# ifdef BABL_MOVE
+ BABLM(BABL_GO_LEFT_1C, SS_TAP(X_LEFT));
+ BABLM(BABL_GO_RIGHT_1C, SS_TAP(X_RIGHT));
+ BABLM(BABL_GO_LEFT_WORD, IMALT(X_LEFT));
+ BABLM(BABL_GO_RIGHT_WORD, IMALT(X_RIGHT));
+ BABLM(BABL_GO_START_LINE, IMGUI(X_LEFT));
+ BABLM(BABL_GO_END_LINE, IMGUI(X_RIGHT));
+ BABLM(BABL_GO_START_DOC, IMGUI(X_UP));
+ BABLM(BABL_GO_END_DOC, IMGUI(X_DOWN));
+ BABLM(BABL_GO_NEXT_LINE, SS_TAP(X_DOWN));
+ BABLM(BABL_GO_PREV_LINE, SS_TAP(X_UP));
+ BABLM(BABL_GO_PARA_START, IMALT(X_UP));
+ BABLM(BABL_DEL_RIGHT_1C, SS_TAP(X_DELETE));
+ BABLM(BABL_GO_PARA_END, IMALT(X_DOWN));
+ BABLM(BABL_PGDN, SS_TAP(X_PGDOWN));
+ BABLM(BABL_PGUP, SS_TAP(X_PGUP));
+ BABLM(BABL_DEL_LEFT_WORD, IMALT(X_BSPACE));
+ BABLM(BABL_DEL_RIGHT_WORD, IMALT(X_DELETE));
+ BABLM(BABL_DEL_TO_LINE_END, OMSFT(IMGUI(X_RIGHT)) SS_TAP(X_BSPACE)); // this is more app agnostic than ctrl-k
+ BABLM(BABL_DEL_TO_LINE_START, OMSFT(IMGUI(X_LEFT)) SS_TAP(X_BSPACE));
+ BABLM(BABL_MODE, "Mac ");
+# endif
+# ifdef BABL_OSKEYS
+ BABLM(BABL_UNDO, SS_LGUI("z"));
+ BABLM(BABL_REDO, SS_LGUI("y"));
+ BABLM(BABL_CUT, SS_LGUI("x"));
+ BABLM(BABL_COPY, SS_LGUI("c"));
+ BABLM(BABL_PASTE, SS_LGUI("v"));
+ BABLM(BABL_SELECT_ALL, SS_LGUI("a"));
+ BABLM(BABL_FIND, SS_LGUI("f"));
+ BABLM(BABL_FIND_NEXT, SS_LGUI("g"));
+ // BABLM( BABL_FIND_NEXT, OMSFT(X_F4)) ); // Mac office
+ BABLM(BABL_FIND_PREV, OMSFT(IMGUI(X_G))); // Sublime, browser
+ BABLM(BABL_FIND_PREV, SS_LGUI("g"));
+ BABLM(BABL_FIND_REPLACE, SS_LGUI("f"));
+ BABLM(BABL_RUNAPP, SS_LGUI(" "));
+ BABLM(BABL_SWITCH_APP_NEXT, IMGUI(X_TAB));
+ BABLM(BABL_SWITCH_APP_LAST, OMSFT(IMGUI(X_TAB)));
+ // Apps vary, but this is usually tab movement, same as B_NXTB
+ /*
+ BABLM( BABL_WINDOW_NEXT, OMSFT(IMGUI(X_RBRACKET)) ); // GUI Grav isn't everywhere
+ BABLM( BABL_WINDOW_PREV, OMSFT(IMGUI(X_LBRACKET)) );
+ */
+ BABLM(BABL_WINDOW_NEXT, IMGUI(X_GRAVE));
+ BABLM(BABL_WINDOW_PREV, OMSFT(IMGUI(X_GRAVE)));
+ BABLM(BABL_WINDOW_NEW, IMGUI(X_N));
+ BABLM(BABL_CLOSE_APP, SS_LGUI("q"));
+ BABLM(BABL_HELP, OMSFT(IMGUI(X_SLASH)));
+ // Locking screen from external keyboard requires automator https://apple.stackexchange.com/questions/73995
+ BABLM(BABL_LOCK, OMCTL(IMALT(X_L)));
+ BABLM(BABL_SCREENCAPTURE, OMSFT(OMGUI(IMALT(X_4))) IMGUI(X_SPACE) "preview" SS_LGUI("d"));
+ BABLM(BABL_SWITCH_KEYBOARD_LAYOUT, IMCTL(X_SPACE));
+# endif
+# ifdef BABL_BROWSER
+ BABLM(BABL_BROWSER_NEW_TAB, IMGUI(X_T));
+ BABLM(BABL_BROWSER_CLOSE_TAB, SS_LGUI("w"));
+ BABLM(BABL_BROWSER_REOPEN_LAST_TAB, OMSFT(SS_LGUI("t")));
+ BABLM(BABL_BROWSER_NEXT_TAB, OMGUI(IMALT(X_RIGHT)));
+ BABLM(BABL_BROWSER_PREV_TAB, OMGUI(IMALT(X_LEFT)));
+ BABLM(BABL_BROWSER_URL_BAR, SS_LGUI("l"));
+ BABLM(BABL_BROWSER_FORWARD, IMGUI(X_RIGHT));
+ BABLM(BABL_BROWSER_BACK, IMGUI(X_LEFT));
+ BABLM(BABL_BROWSER_FIND, SS_LGUI("f"));
+ BABLM(BABL_BROWSER_BOOKMARK, SS_LGUI("d"));
+ BABLM(BABL_BROWSER_RELOAD, OMGUI(SS_LSFT("r"))); // hard reload w/o cache
+ BABLM(BABL_BROWSER_FULLSCREEN, OMGUI(SS_LCTRL("p")));
+ BABLM(BABL_BROWSER_ZOOM_IN, IMGUI(X_KP_PLUS)); // ctr+ +
+ BABLM(BABL_BROWSER_ZOOM_OUT, IMGUI(X_KP_MINUS));
+# ifdef BABL_BROWSER_CHROME
+ BABLM(BABL_BROWSER_VIEWSRC, SS_LGUI("u")); // Chrome or firefox
+ BABLM(BABL_BROWSER_DEV_TOOLS, OMGUI(SS_LALT("i"))); // Chrome or Firefox
+# endif
+# ifdef BABL_BROWSER_SAFARI
+ BABLM(BABL_BROWSER_VIEWSRC, OMGUI(IMALT(X_U))); // Safari
+ // BABLM( BABL_BROWSER_DEV_TOOLS, // No real equivalent for Safari
+# endif
+# endif // BABL_BROWSER
+
+# ifdef BABL_APP
+ BABLM(BABL_APP_SAVE, SS_LGUI("s"));
+# ifdef BABL_APP_EDITOR
+# ifdef BABL_APP_SUBLIME
+ BABLM(BABL_APP_MULTI_SELECT, OMCTL(IMGUI(X_G))); // add all occurences of current word to select.
+ BABLM(BABL_APP_PASTE_VALUES, OMSFT(IMGUI(X_V))); // paste with proper indenting.
+# endif // sublime
+# endif // editor
+
+# ifdef BABL_APP_CELLS
+# ifdef BABL_APP_MSOFFICE
+ BABLM(BABL_APP_CENTER_ALIGN, IMGUI(X_E));
+ // BABLM( BABL_APP_CLEAR_FORMATTING, OMCTL(IMGUI(X_G)) ); // this isn't native. https://support.office.com/en-us/article/Clear-all-text-formatting-C094C4DA-7F09-4CEA-9A8D-C166949C9C80#OfficeVersion=macOS
+ BABLM(BABL_APP_SCROLL_ACTIVE_CELL, IMCTL(X_BSPACE));
+ BABLM(BABL_NEWLINE_IN_CELL, IMALT(X_ENTER));
+ BABLM(BABL_INSERT_COMMENT, IMSFT(X_F2));
+ BABLM(BABL_INSERT_COL_LEFT, IMCTL(X_I));
+ BABLM(BABL_INSERT_ROW, OMCTL(IMSFT(X_KP_PLUS)));
+ BABLM(BABL_DELETE_ROW, IMCTL(X_KP_MINUS));
+ BABLM(BABL_SELECT_COL, IMCTL(X_SPACE));
+ BABLM(BABL_SELECT_ROW, IMSFT(X_SPACE));
+# endif // BABL_APP_MSOFFICE
+
+# ifdef BABL_APP_GOOGLE
+ BABLM(BABL_APP_CENTER_ALIGN, OMSFT(IMGUI(X_E)));
+ BABLM(BABL_APP_SCROLL_ACTIVE_CELL, IMCTL(X_BSPACE));
+ BABLM(BABL_NEWLINE_IN_CELL, IMALT(X_ENTER));
+ BABLM(BABL_INSERT_COMMENT, IMSFT(X_F2));
+ BABLM(BABL_APP_CLEAR_FORMATTING, IMGUI(X_BSLASH));
+ BABLM(BABL_DELETE_ROW, OMCTL(IMGUI(X_G)));
+ BABLM(BABL_INSERT_COL_LEFT, OMALT(IMCTL(X_I)) "c"); // o for to the right.
+ BABLM(BABL_INSERT_ROW, OMALT(IMCTL(X_I)) "b"); // r for above.
+ BABLM(BABL_SELECT_COL, IMCTL(X_SPACE));
+ BABLM(BABL_SELECT_ROW, IMSFT(X_SPACE));
+ BABLM(BABL_DELETE_ROW, OMALT(IMCTL(X_KP_MINUS))); // once selected
+# endif // BABL_APP_GOOGLE
+/*
+#ifdef BABL_APP_APPLE
+ // you're on your own.
+#endif
+*/
+# endif // BABL_APP_CELLS
+
+# ifdef BABL_APP_WINDOWSPLITTING
+ // These are for os X terminal, and are pretty useless.
+ BABLM(BABL_SPLIT_FRAME_HORIZONTAL, SS_LGUI("d"));
+ BABLM(BABL_UNSPLIT_FRAME_HORIZONTAL, OMSFT(IMGUI(X_D)));
+# endif // BABL_APP_WINDOWSPLITTING
+
+# endif // BABL_APP
+
+ // Todo, ring bell, flash light, show user this isn't supported
+ return false;
+}
+
+# endif /* mac mode*/
+#endif // Babblepaste
diff --git a/users/miles2go/babl_readmux.c b/users/miles2go/babl_readmux.c
new file mode 100644
index 00000000000..8887d523bb2
--- /dev/null
+++ b/users/miles2go/babl_readmux.c
@@ -0,0 +1,86 @@
+// Readline command line editing + tmux windowing
+// I haven't decided how much to do readline and how much tmux
+// see https://tiswww.case.edu/php/chet/readline/rluserman.html for other possible
+// keybindings.
+
+#include QMK_KEYBOARD_H
+
+#ifdef USE_BABBLEPASTE
+# include "babblePaste.h"
+
+# ifdef BABL_READMUX
+
+// Redefine if you use something other than CTRL-B to activate tmux.
+# define TMUX SS_LCTL("b")
+
+bool babblePaste_readmux(uint16_t keycode) {
+# ifdef BABL_MOVE
+ BABLM(BABL_GO_LEFT_1C, SS_TAP(X_LEFT));
+ BABLM(BABL_GO_RIGHT_1C, SS_TAP(X_RIGHT));
+ BABLM(BABL_GO_LEFT_WORD, SS_LALT("b"));
+ BABLM(BABL_GO_RIGHT_WORD, SS_LALT("f"));
+ BABLM(BABL_GO_START_LINE, SS_LCTL("a"));
+ BABLM(BABL_GO_END_LINE, SS_LCTL("e"));
+ // BABLM( BABL_GO_START_DOC ,END );// tmux?
+ // BABLM( BABL_GO_END_DOC ,END ); // tmux?
+ BABLM(BABL_GO_NEXT_LINE, SS_LCTL("n"));
+ BABLM(BABL_GO_PREV_LINE, SS_LCTL("p"));
+ // BABLM( BABL_GO_PARA_START, // undefined
+ // BABLM( BABL_GO_PARA_END, // undefinedBABLM( BABL_PGDN ,
+
+ BABLM(BABL_PGUP, SS_TAP(X_PGUP));
+ BABLM(BABL_PGDN, SS_TAP(X_PGDOWN));
+ BABLM(BABL_DEL_RIGHT_1C, SS_LCTL("d"));
+ BABLM(BABL_DEL_LEFT_WORD, SS_LCTL("w")); // meta-DEL instead?
+ BABLM(BABL_DEL_RIGHT_WORD, SS_LALT("d"));
+ BABLM(BABL_DEL_TO_LINE_END, SS_LCTL("k"));
+ BABLM(BABL_DEL_TO_LINE_START, SS_LCTL("u"));
+ BABLM(BABL_MODE, "Readline ");
+# endif
+# ifdef BABL_OSKEYS
+ BABLM(BABL_UNDO, SS_LALT("r"));
+ BABLM(BABL_REDO, SS_LCTL("x") "c"); // arguably
+ BABLM(BABL_CUT, SS_LCTL("k")); // wrong half the time
+ // BABLM( BABL_COPY ,END );
+ BABLM(BABL_PASTE, SS_LCTL("y"));
+ BABLM(BABL_SELECT_ALL, SS_LCTL("aky"));
+ BABLM(BABL_FIND, SS_LCTL("r")); // search history
+ BABLM(BABL_FIND_NEXT, SS_LCTL("r"));
+ BABLM(BABL_FIND_PREV, SS_LCTL("s"));
+ // BABLM( BABL_FIND_REPLACE ,END ); // not offered in readline
+ BABLM(BABL_RUNAPP, TMUX "c"); // tmux
+ BABLM(BABL_SWITCH_APP_NEXT, TMUX "n"); // tmux
+ BABLM(BABL_SWITCH_APP_LAST, TMUX "p"); // tmux
+ BABLM(BABL_CLOSE_APP, TMUX "d"); // usually what I want
+ BABLM(BABL_HELP, TMUX IMSFT(X_SLASH));
+ BABLM(BABL_LOCK, TMUX "L"); // assuming you set up VLOCK yourself
+ BABLM(BABL_SCREENCAPTURE, TMUX ":capture-pane");
+# endif
+# ifdef BABL_BROWSER
+/* Add lynx shortcuts, brow.sh?
+ */
+# ifdef BABL_MAC
+ // this is stock OS X Terminal, alter for windows &etc.
+ BABLM(BABL_BROWSER_NEW_TAB, IMGUI(X_T));
+ BABLM(BABL_BROWSER_CLOSE_TAB, SS_LGUI("w"));
+ BABLM(BABL_BROWSER_NEXT_TAB, IMCTL(X_TAB));
+ BABLM(BABL_BROWSER_PREV_TAB, OMSFT(IMCTL(X_TAB)));
+# endif
+# endif
+# ifdef BABL_APP
+ // Save makes no sense here
+ BABLM(BABL_SPLIT_FRAME_VERT, TMUX IMSFT(X_5));
+ // BUG - misleading. This is currently set to convert frame to a window.
+ BABLM(BABL_UNSPLIT_FRAME_VERT, TMUX IMSFT(X_1));
+ BABLM(BABL_SPLIT_FRAME_HORIZONTAL, TMUX IMSFT(X_QUOTE));
+ // This one closes the current pane.
+ BABLM(BABL_UNSPLIT_FRAME_HORIZONTAL, SS_LCTL("b") "x");
+ BABLM(BABL_NEXT_FRAME, SS_LCTL("b") "o");
+ BABLM(BABL_PREV_FRAME, SS_LCTL("w") SS_TAP(X_SCOLON));
+# endif
+
+ // Todo, ring bell, flash light, show user this isn't supported
+ return false;
+}
+# endif /* readmux*/
+#endif
diff --git a/users/miles2go/babl_vi.c b/users/miles2go/babl_vi.c
new file mode 100644
index 00000000000..7eebc0b208d
--- /dev/null
+++ b/users/miles2go/babl_vi.c
@@ -0,0 +1,76 @@
+/*
+Vi is stateful, so you have to track the modes yourself. Otherwise motion is awful (bell, bell, bell)
+
+*/
+
+#include QMK_KEYBOARD_H
+
+#ifdef USE_BABBLEPASTE
+# include "babblePaste.h"
+
+# ifdef BABL_VI
+
+bool babblePaste_vi(uint16_t keycode) {
+# ifdef BABL_MOVE
+ BABLM(BABL_GO_LEFT_1C, "h");
+ BABLM(BABL_GO_RIGHT_1C, "l");
+ BABLM(BABL_GO_LEFT_WORD, "b");
+ BABLM(BABL_GO_RIGHT_WORD, "w");
+ BABLM(BABL_GO_START_LINE, IMSFT(X_6));
+ BABLM(BABL_GO_END_LINE, IMSFT(X_4));
+ BABLM(BABL_GO_START_DOC, "gg");
+ BABLM(BABL_GO_END_DOC, IMSFT(X_G));
+ BABLM(BABL_GO_NEXT_LINE, "j");
+ BABLM(BABL_GO_PREV_LINE, "k");
+ BABLM(BABL_GO_PARA_START, IMSFT(X_LBRACKET));
+ BABLM(BABL_GO_PARA_END, IMSFT(X_RBRACKET));
+ BABLM(BABL_PGDN, SS_LCTRL("f"));
+ BABLM(BABL_PGUP, SS_LCTRL("b"));
+ BABLM(BABL_DEL_RIGHT_1C, "x");
+ BABLM(BABL_DEL_LEFT_WORD, "dge");
+ BABLM(BABL_DEL_RIGHT_WORD, "dw");
+ BABLM(BABL_DEL_TO_LINE_END, "d" IMSFT(X_4));
+ BABLM(BABL_DEL_TO_LINE_START, "d" IMSFT(X_6));
+ BABLM(BABL_MODE, "Vi ");
+# endif
+# ifdef BABL_OSKEYS
+ BABLM(BABL_UNDO, "h");
+ BABLM(BABL_REDO, SS_LCTRL("r"));
+ BABLM(BABL_CUT, "x");
+ BABLM(BABL_COPY, "y");
+ BABLM(BABL_PASTE, "p");
+ BABLM(BABL_SELECT_ALL, IMSFT(X_SCOLON) SS_TAP(X_5) "y"); // wrong but helpful?
+ BABLM(BABL_FIND, SS_TAP(X_SLASH));
+ BABLM(BABL_FIND_NEXT, "n");
+ BABLM(BABL_FIND_PREV, IMSFT(X_N));
+ BABLM(BABL_FIND_REPLACE, OMALT(IMSFT(X_5)));
+ BABLM(BABL_RUNAPP, ":split"); // requires VIM, is vsplit better?
+ BABLM(BABL_SWITCH_APP_NEXT, IMCTL(X_DOWN)); // Or Right?
+ BABLM(BABL_SWITCH_APP_NEXT, IMCTL(X_UP)); // or Left?
+ BABLM(BABL_CLOSE_APP, IMCTL(X_SCOLON) "q");
+ BABLM(BABL_HELP, SS_LSFT(SS_TAP(X_SCOLON)) "h"); // start search in help
+ // BABLM( BABL_LOCK, () ); Perhaps VI is not an OS?
+ // BABLM( BABL_SCREENCAPTURE, () ); // capture a buffer?
+# endif
+
+# ifdef BABL_BROWSER
+/* what _is_ the VI browser now that vimpirator is dead?*/
+# endif
+
+# ifdef BABL_APP
+ BABLM(BABL_APP_SAVE, SS_TAP(X_ESCAPE) ":w");
+# ifdef BABL_APP_WINDOWSPLITTING
+ BABLM(BABL_SPLIT_FRAME_VERT, SS_TAP(X_ESCAPE) ":vsplit");
+ BABLM(BABL_UNSPLIT_FRAME_VERT, SS_TAP(X_ESCAPE) ":hide"); // debatable.
+ BABLM(BABL_SPLIT_FRAME_HORIZONTAL, SS_TAP(X_ESCAPE) ":vsplit");
+ BABLM(BABL_UNSPLIT_FRAME_HORIZONTAL, SS_TAP(X_ESCAPE) ":hide");
+ BABLM(BABL_NEXT_FRAME, SS_LCTRL("w") "w");
+ BABLM(BABL_PREV_FRAME, SS_LCTRL("w") SS_LSFT("w"));
+# endif
+# endif // app
+ // Todo, ring bell, flash light, show user this isn't supported
+ return false;
+}
+
+# endif // VI
+#endif // Babblepaste
diff --git a/users/miles2go/babl_windows.c b/users/miles2go/babl_windows.c
new file mode 100644
index 00000000000..e9d8c23dac1
--- /dev/null
+++ b/users/miles2go/babl_windows.c
@@ -0,0 +1,151 @@
+/* A library to output the right key shortcut in any common app.
+Given a global variable babble_mode to show the environment and a
+key that calls the paste macro, do the right type of paste.
+Setting the context is done by another macro, or TBD interaction with the host.
+
+Huge thanks to https://en.wikipedia.org/wiki/Table_of_keyboard_shortcuts
+https://support.microsoft.com/en-gb/help/12445/windows-keyboard-shortcuts
+
+Remember to check https://github.com/qmk/qmk_firmware/blob/master/quantum/send_string_keycodes.h
+
+*/
+
+#include QMK_KEYBOARD_H
+
+#ifdef USE_BABBLEPASTE
+# include "babblePaste.h"
+
+# ifdef BABL_WINDOWS
+
+bool babblePaste_win(uint16_t keycode) {
+# ifdef BABL_MOVE
+ BABLM(BABL_GO_LEFT_1C, SS_TAP(X_LEFT));
+ BABLM(BABL_GO_RIGHT_1C, SS_TAP(X_RIGHT));
+ BABLM(BABL_GO_LEFT_WORD, IMCTL(X_LEFT));
+ BABLM(BABL_GO_RIGHT_WORD, IMCTL(X_RIGHT));
+ BABLM(BABL_GO_START_LINE, IMGUI(X_LEFT));
+ BABLM(BABL_GO_END_LINE, IMGUI(X_RIGHT));
+ BABLM(BABL_GO_START_DOC, OMGUI(IMCTL(X_LEFT)));
+ BABLM(BABL_GO_END_DOC, OMGUI(IMCTL(X_RIGHT)));
+ BABLM(BABL_GO_NEXT_LINE, SS_TAP(X_DOWN));
+ BABLM(BABL_GO_PREV_LINE, SS_TAP(X_UP));
+ BABLM(BABL_GO_PARA_START, IMCTL(X_UP));
+ BABLM(BABL_GO_PARA_END, IMCTL(X_DOWN));
+ BABLM(BABL_PGDN, SS_TAP(X_PGDOWN));
+ BABLM(BABL_PGUP, SS_TAP(X_PGUP));
+ BABLM(BABL_DEL_RIGHT_1C, SS_TAP(X_DELETE));
+ BABLM(BABL_DEL_LEFT_WORD, IMCTL(X_BSPACE));
+ BABLM(BABL_DEL_RIGHT_WORD, IMCTL(X_DELETE));
+ BABLM(BABL_DEL_TO_LINE_END, IMSFT(X_HOME) SS_TAP(X_DELETE));
+ BABLM(BABL_DEL_TO_LINE_START, IMSFT(X_END) SS_TAP(X_DELETE));
+ BABLM(BABL_MODE, "Windows ");
+# endif
+
+# ifdef BABL_OSKEYS
+ BABLM(BABL_UNDO, SS_LCTRL("z"));
+ BABLM(BABL_REDO, SS_LCTRL("y"));
+ BABLM(BABL_CUT, SS_LCTRL("x"));
+ BABLM(BABL_COPY, SS_LCTRL("c"));
+ BABLM(BABL_PASTE, SS_LCTRL("v"));
+ BABLM(BABL_SELECT_ALL, SS_LCTRL("a"));
+ BABLM(BABL_FIND, SS_LCTRL("f"));
+ BABLM(BABL_FIND_NEXT, SS_TAP(X_F3));
+ // BABLM( BABL_FIND_PREV, SS_TAP(X_F3) ); // doesn't have a standard one?
+ BABLM(BABL_FIND_REPLACE, SS_LCTRL("h"));
+ BABLM(BABL_RUNAPP, SS_LGUI("r"));
+ BABLM(BABL_SWITCH_APP_NEXT, IMALT(X_TAB));
+ BABLM(BABL_SWITCH_APP_LAST, OMSFT(IMALT(X_TAB)));
+ BABLM(BABL_WINDOW_NEXT, IMCTL(X_TAB));
+ BABLM(BABL_WINDOW_PREV, OMSFT(IMCTL(X_TAB)));
+ BABLM(BABL_WINDOW_NEW, IMCTL(X_N));
+ BABLM(BABL_CLOSE_APP, IMALT(X_F4));
+ BABLM(BABL_HELP, SS_TAP(X_F1));
+ BABLM(BABL_LOCK, SS_LGUI("l"));
+ BABLM(BABL_SCREENCAPTURE, OMSFT(SS_LGUI("s")));
+ BABLM(BABL_SWITCH_KEYBOARD_LAYOUT, IMGUI(X_SPACE));
+
+# endif
+
+# ifdef BABL_BROWSER
+ BABLM(BABL_BROWSER_NEW_TAB, SS_LCTRL("t"));
+ BABLM(BABL_BROWSER_CLOSE_TAB, SS_LCTRL("w"));
+ BABLM(BABL_BROWSER_REOPEN_LAST_TAB, OMSFT(IMCTL(X_T)));
+ BABLM(BABL_BROWSER_NEXT_TAB, IMCTL(X_TAB));
+ BABLM(BABL_BROWSER_PREV_TAB, OMSFT(IMCTL(X_TAB)));
+ BABLM(BABL_BROWSER_URL_BAR, SS_LCTRL("l"));
+ BABLM(BABL_BROWSER_FORWARD, IMALT(X_RIGHT));
+ BABLM(BABL_BROWSER_BACK, OMSFT(IMALT(X_LEFT)));
+ ;
+ BABLM(BABL_BROWSER_FIND, SS_LCTRL("f"));
+ BABLM(BABL_BROWSER_BOOKMARK, SS_LCTRL("d"));
+# ifdef BABL_BROWSER_MS
+ BABLM(BABL_BROWSER_DEV_TOOLS, IMCTL(X_F12)); // EDGE
+# else
+ BABLM(BABL_BROWSER_DEV_TOOLS, SS_LCTRL("t")); // Chrome
+ BABLM(BABL_BROWSER_VIEWSRC, SS_LCTRL("u")); // Chrome or firefox
+# endif
+ // chrome
+ BABLM(BABL_BROWSER_RELOAD, IMCTL(X_F5)); // hard reload w/o cache
+ BABLM(BABL_BROWSER_FULLSCREEN, SS_TAP(X_F11)); // command shift F
+ BABLM(BABL_BROWSER_ZOOM_IN, OMSFT(IMCTL(X_EQUAL))); // ctr+ +
+ BABLM(BABL_BROWSER_ZOOM_OUT, IMCTL(X_MINUS));
+
+# endif
+
+# ifdef BABL_APP
+ BABLM(BABL_APP_SAVE, SS_LCTL("s"));
+# ifdef BABL_APP_EDITOR
+# ifdef BABL_APP_SUBLIME
+ // http://sweetme.at/2013/08/08/sublime-text-keyboard-shortcuts/
+ BABLM(BABL_APP_MULTI_SELECT, IMALT(X_F3)); // add all occurences of current word to select.
+ BABLM(BABL_APP_PASTE_VALUES, OMSFT(IMCTL(X_V))); // paste with proper indenting.
+# endif // sublime
+# endif // editor
+
+# ifdef BABL_APP_CELLS
+# ifdef BABL_APP_MSOFFICE
+# ifndef BABL_APP_SUBLIME
+ BABLM(BABL_APP_PASTE_VALUES, OMCTL(IMALT(X_V)) "v");
+# endif
+ BABLM(BABL_APP_CENTER_ALIGN, IMALT(X_H) "ac");
+ // BABLM( BABL_APP_CLEAR_FORMATTING, OMCTL(IMGUI(X_G)) ); // this isn't native. https://support.office.com/en-us/article/Clear-all-text-formatting-C094C4DA-7F09-4CEA-9A8D-C166949C9C80#OfficeVersion=macOS
+ BABLM(BABL_APP_SCROLL_ACTIVE_CELL, IMCTL(X_BSPACE));
+ BABLM(BABL_NEWLINE_IN_CELL, IMALT(X_ENTER));
+ BABLM(BABL_INSERT_COMMENT, IMSFT(X_F2));
+ BABLM(BABL_INSERT_COL_LEFT, OMCTL(IMSFT(X_KP_PLUS)));
+ BABLM(BABL_INSERT_ROW, OMCTL(IMSFT(X_KP_PLUS)));
+ BABLM(BABL_DELETE_ROW, IMCTL(X_KP_MINUS));
+ BABLM(BABL_SELECT_COL, IMCTL(X_SPACE));
+ BABLM(BABL_SELECT_ROW, IMSFT(X_SPACE));
+# endif
+
+# ifdef BABL_APP_GOOGLE
+ BABLM(BABL_APP_CENTER_ALIGN, OMSFT(IMCTL(X_E)));
+ BABLM(BABL_APP_SCROLL_ACTIVE_CELL, IMCTL(X_BSPACE));
+ BABLM(BABL_NEWLINE_IN_CELL, IMALT(X_ENTER));
+ BABLM(BABL_INSERT_COMMENT, IMSFT(X_F2));
+ BABLM(BABL_APP_CLEAR_FORMATTING, IMCTL(X_BSLASH));
+ BABLM(BABL_DELETE_ROW, IMALT(X_E) "d");
+ BABLM(BABL_INSERT_COL_LEFT, OMALT(IMCTL(X_I)) "c"); // o for to the right.
+ BABLM(BABL_INSERT_ROW, IMALT(IMCTL(X_I)) "w"); // r for above.
+ BABLM(BABL_SELECT_COL, IMCTL(X_SPACE));
+ BABLM(BABL_SELECT_ROW, IMSFT(X_SPACE));
+ BABLM(BABL_DELETE_ROW, OMALT(IMCTL(X_KP_MINUS))); // once selected
+# endif
+
+# endif // BABL_APP_CELLS
+
+ // BABLM( BABL_SPLIT_FRAME_VERT, () );// no windows way?
+ // BABLM( BABL_UNSPLIT_FRAME_VERT, () );
+ BABLM(BABL_SPLIT_FRAME_HORIZONTAL, OMALT(IMCTL(X_S))); // word only
+ BABLM(BABL_UNSPLIT_FRAME_HORIZONTAL, OMSFT(IMALT(X_C))); // word
+ // BABLM( BABL_NEXT_FRAME, () );//no windows way?
+ // BABLM( BABL_PREV_FRAME, () );// no windows way?
+# endif
+
+ // Todo, ring bell, flash light, show user this isn't supported
+ return false;
+}
+
+# endif /* BABL_WINDOWS*/
+#endif /* babblepaste */
\ No newline at end of file
diff --git a/users/miles2go/config.h b/users/miles2go/config.h
new file mode 100644
index 00000000000..3fb52b8a598
--- /dev/null
+++ b/users/miles2go/config.h
@@ -0,0 +1,53 @@
+#pragma once
+
+#ifdef RGBLIGHT_ENABLE
+#define RGBLIGHT_SLEEP
+#undef RGBLIGHT_ANIMATIONS
+#define RGBLIGHT_EFFECT_BREATHING
+#endif // RGBLIGHT_ENABLE
+
+#ifndef QMK_KEYS_PER_SCAN
+#define QMK_KEYS_PER_SCAN 4
+#endif // !QMK_KEYS_PER_SCAN
+
+#undef FORCE_NKRO
+
+#ifndef TAPPING_TOGGLE
+#define TAPPING_TOGGLE 3
+#endif
+
+#ifdef TAPPING_TERM
+ #undef TAPPING_TERM
+#endif // TAPPING_TERM
+#define TAPPING_TERM 200
+//if no chord during tapping term, do the keystroke
+#define RETRO_TAPPING
+
+// Disable action_get_macro and fn_actions, since we don't use these
+// and it saves on space in the firmware.
+// LTO_ENABLE automatically enables these
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+#define MACRO_TIMER 5
+
+
+
+#define USE_BABBLEPASTE
+// All options
+#define BABL_MOVE // Uncomment to add basic cursor movement
+#define BABL_OSKEYS // This adds Cut, paste, window movement and common OS shortcuts
+#define BABL_BROWSER // Browser shortcuts, with Chrome/Firefox as the default.
+// edit the appropriate OS config file to enable Safari, Edge, vimpirator &etc.
+#define BABL_APP // Application specific settings this has sub-options.
+#define BABL_APP_CELLS // spreadsheets and tables
+#define BABL_APP_EDITOR // Fancy editor commands
+#define BABL_APP_WINDOWSPLITTING // splitting frames & windows
+
+//All OSes
+#define BABL_WINDOWS
+#define BABL_READMUX
+#define BABL_VI
+#define BABL_MAC
+#define BABL_LINUX
+#define BABL_EMACS
+#define BABL_CHROMEOS
diff --git a/users/miles2go/keymaps/handwired/ms_sculpt_mobile/config.h b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/config.h
new file mode 100644
index 00000000000..bedc08fc022
--- /dev/null
+++ b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/config.h
@@ -0,0 +1,41 @@
+#pragma once
+
+// Expect to get errors if you comment a feature out and leave it in your keymap.
+#define USE_BABLPASTE
+
+#ifdef USE_BABLPASTE
+
+#ifdef RGBLIGHT_ENABLE
+#define BABL_LED_INDEX 0 // set to 0 to set all LEDs , or set to # of LED to be used as BABL updaters
+#define RGBLIGHT_COLOR_MS 0x00,0x27,0x88 // blue screen?
+#define RGBLIGHT_COLOR_MAC 0xF0,0xF0,0xF0 // grey
+#define RGBLIGHT_COLOR_LINUX 0xF4,0xAA,0x90 // ubuntu orange?
+#define RGBLIGHT_COLOR_EMACS 0x00,0x00,0x00
+#define RGBLIGHT_COLOR_VI 0x00,0x90,0x00
+#define RGBLIGHT_COLOR_READMUX 0x33,0xFF,0x33 // green screen
+#define RGBLIGHT_COLOR_CHROMEOS 0xf4,0xc2,0xd // google yellows
+#endif
+
+#endif // bablpaste
+
+
+
+// place overrides here
+#define RGBLED_NUM 2
+#define RGBLIGHT_LIMIT_VAL 200
+#ifdef RGBLIGHT_ENABLE
+#define RGBLIGHT_COLOR_LAYER_0 0x00, 0xFF, 0x00 // qwerty
+#define RGBLIGHT_COLOR_LAYER_1 0x00, 0x99, 0x99 // cdh
+#define RGBLIGHT_COLOR_LAYER_2 0xFF, 0x00, 0x00 // symbol
+#define RGBLIGHT_COLOR_LAYER_3 0x00, 0xFF, 0xFF // move
+#define RGBLIGHT_COLOR_LAYER_4 0xFF, 0x00, 0xFF // delmove
+#define RGBLIGHT_COLOR_LAYER_5 0x00, 0xFF, 0xFF
+#define RGBLIGHT_ANIMATIONS
+#define RGB_LIGHT_EFFECT_BREATHE_MAX 200
+#define RGBLIGHT_RAINBOW_SWIRL_RANGE 127
+#endif // rgblight
+
+#define TAPPING_TERM 200
+#define TAPPING_TERM_PER_KEY
+#define RETRO_TAPPING
+//#define PERMISSIVE_HOLD
diff --git a/users/miles2go/keymaps/handwired/ms_sculpt_mobile/keymap.c b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/keymap.c
new file mode 100644
index 00000000000..d36bf25b2cc
--- /dev/null
+++ b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/keymap.c
@@ -0,0 +1,463 @@
+//placeholder until the new keymaps tree is built
+//#include QMK_KEYBOARD_H
+
+
+#include "virtser.h"
+#include
+#include "milestogo.h"
+
+
+#define LAYOUT_local LAYOUT_mobile_XUW
+#define LAYOUT LAYOUT_mobile_XUW
+
+
+#ifndef USERSPACE_ACTIVE
+enum layer_keycodes {
+ QWR = SAFE_RANGE,
+ CDH,
+ SYM,
+ MOV,
+ NUM,
+ TRAN
+};
+
+enum layer_names {
+_QWR,
+_CDH,
+_SYM,
+_MOV,
+_TRAN
+};
+
+#endif
+
+// Shorter spacing
+#define XXXX KC_NO
+#define ____ KC_TRNS
+
+// Custom macros
+
+/* Fn Keys */
+#define TT_SYM MO(_SYM)
+#define TT_NUM MO(_NUM)
+#define SSFT ACTION_MODS_ONESHOT(MOD_LSFT)
+#define SSYM LT(_SYM, KC_SPC)
+#define MVTAB LT(_MOV,KC_TAB)
+#define BKMV TT(_MOV)
+#define MV2 LT(_MOV, KC_2)
+#define MV3 LT(_MOV, KC_3)
+#define MV4 LT(_MOV, KC_4)
+#define MV8 LT(_MOV, KC_8)
+#define MV9 LT(_MOV, KC_9)
+#define MV0 LT(_MOV, KC_0)
+
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* QWERTY
+*
+* |ESC | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10| F11| F12|Vol-|Vol+|_CDH|
+* -------------------------------------------------------------------------------'
+* | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |Bakspace| Del|
+* ---------------------------------------------------------------------------
+* | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | \ | |
+* -------------------------------------------------------------------------------'
+* |Bak/Mov| a | s | d | f | g | h | j | k | l | ; | ' | enter |PgUp|
+* --------------------------------------------------------------------------------
+* |Lsft | z | x | c | v | b | n | m | , | . | / | Rsft| Up| PgDn|
+* ---------------------------------------------------------------------------------
+* |Lctl |Lgui |Lalt | Space/Sym | GUI | Sym | Rctl |Left|Down|Rght|
+* ---------------------------------------------------------------------------------
+*/
+
+[_QWERTY] = LAYOUT_local( \
+KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_VOLD, KC_VOLU, TG(_CDH),\
+KC_GRAVE, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL,\
+KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,KC_BSLS,\
+BKMV, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGUP,\
+KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT,KC_SLSH,KC_RSFT, KC_UP, KC_PGDN,\
+KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, TT_SYM,KC_CDH, KC_LEFT, KC_DOWN, KC_RIGHT
+),
+
+
+[_CDH] = LAYOUT_local(\
+____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
+KC_GRAVE, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_DEL,\
+KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, ____, ____, ____,\
+KC_LCTL, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, KC_QUOT, KC_ENT, KC_2,\
+KC_LSFT, KC_Z, KC_X, KC_C, DHPASTE,KC_V, KC_K, KC_H, KC_COMM,KC_DOT, KC_SLSH, KC_RSFT, ____, KC_1,\
+TG(_MOV), ____, ____ , ____, ____, ____, KC_QWERTY, ____, ____, ____
+),
+
+/* SYMBOL layer, several to chose from
+*/
+
+[_SYM] = LAYOUT_wrapper(\
+____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
+____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
+____, _________________EXCEL_L1__________________, _________________EXCEL_R1__________________, ____, ____, ____,\
+____, _________________EXCEL_L2__________________, _________________EXCEL_R2__________________, KC_GRV, ____, ____,\
+____, _________________EXCEL_L3__________________, _________________EXCEL_R3__________________, B_SAVE, ____, ____,\
+____, ____, ____, ____, ____, ____, ____, ____, ____, ____
+),
+
+#ifndef USE_BABLPASTE
+
+[_MOV] = LAYOUT_local(\
+____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, ____ , \
+____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, \
+____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, KC_UP, XXXX, XXXX, XXXX, XXXX, XXXX, \
+____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, KC_LEFT, KC_DOWN, KC_RIGHT,XXXX, XXXX, XXXX, XXXX, \
+____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, \
+____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX
+)
+
+#else
+/* MOVE babble version version
+
+* |ESC | MAC|Read|Linx| VI | | | | | | | | | | | |
+* -------------------------------------------------------------------------------'
+* | | | - | = |Bakspace| Del|
+* ---------------------------------------------------------------------------
+* | tab | | [ | ] | \ | |
+* -------------------------------------------------------------------------------'
+* |Bak/Mov| | ' |Launch App |PgUp|
+* ---------------------------------------------------------------------------------
+* |Lsft | | Rsft| Up| PgDn|
+* ---------------------------------------------------------------------------------
+* | |Lgui |Lalt | Exit Move Mode | GUI | Sym | Rctl |Left|Down|Rght|
+* ---------------------------------------------------------------------------------
+*/
+/* ,--------------------------------------------. ,--------------------------------------------.
+ * 01 | ESC |FindPrev| Find |FindNext| \n cell| |ParStart|LineStrt| Up | EOL | ParEnd |
+ * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ * 02 | SelA | Do_DEL | Shift | Undo |Hsplit+ | | WrdLft | Left | Down | Right | WrdRght|
+ * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ * 03 |Vspli+ | Cut | Copy | Paste | Paste | | WinPrv | Tab-- | NewTab | Tab++ | WinNxt |
+ * `--------------------------------------------' `--------------------------------------------'
+ */
+
+[_MOV] = LAYOUT_wrapper(\
+ ____, ____________BABBLE_SWITCH_L________________, ____________BABBLE_SWITCH_R________________, XXXX, XXXX, XXXX, XXXX, ____, \
+ ____, ____________BABBLE_MOV_LNUM________________, ____________BABBLE_MOV_RNUM________________, XXXX, XXXX, XXXX, XXXX,\
+ ____, ____________BABBLE_MOV_L1__________________, ____________BABBLE_MOV_R1__________________, XXXX, XXXX, XXXX, \
+ ____, ____________BABBLE_MOV_L2__________________, ____________BABBLE_MOV_R2__________________, XXXX, B_RUNAPP, XXXX,\
+ ____, ____________BABBLE_MOV_L3__________________, ____________BABBLE_MOV_R2__________________, XXXX, XXXX, XXXX, \
+ ____, ____, ____, TG(_MOV), XXXX, XXXX, XXXX, XXXX, XXXX, XXXX
+),
+// Move in a direction, deleting as we go, or do opposite of Mov layer action */
+/* ,--------------------------------------------. ,--------------------------------------------.
+ * 01 | Esc | |Replace |MultiSel|PasteVal| | . |LineStrt| . | EOL | . |
+ * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ * 02 | | Do_Mov | Shift | Redo |Hsplit- | | WrdLft | Left | . | Right | WrdRght|
+ * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ * 03 |Vsplit- | Cut | Copy | Paste |Paste | | App-- | ZoomOut| NewWin | ZoomIn | App+ |
+ * `--------------------------------------------' `--------------------------------------------'
+ */
+[_DMOV] = LAYOUT_wrapper(\
+ ____, ____________BABBLE_SWITCH_L________________, ____________BABBLE_SWITCH_R________________, XXXX, XXXX, XXXX, ____, \
+ ____, ____________BABBLE_MOV_LNUM________________, ____________BABBLE_MOV_RNUM________________, XXXX, XXXX, XXXX, XXXX, \
+ ____, _________BABBLE_DELMOV_L1__________________ , _________BABBLE_DELMOV_R1__________________ , XXXX, XXXX, XXXX, \
+ ____, _________BABBLE_DELMOV_L2__________________ , _________BABBLE_DELMOV_R2__________________ , XXXX, XXXX, XXXX,\
+ ____, _________BABBLE_DELMOV_L3__________________ , _________BABBLE_DELMOV_R3__________________ , XXXX, XXXX, XXXX, \
+ ____, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX, XXXX
+),
+
+#endif // Bablepaste
+/*
+[_TRAN] = LAYOUT_local(\
+ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
+ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
+ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
+ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
+ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
+ ____, ____, ____, ____, ____, ____, ____, ____, ____, ____
+)
+*/
+};
+
+#ifndef USERSPACE_ACTIVE
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case QWR:
+ if (record->event.pressed) {
+ layer_off(_CDH);
+ }
+ return false;
+ break;
+
+ case CDH:
+ if (record->event.pressed) {
+ layer_on(_CDH);
+ }
+ return false;
+ break;
+
+ case SYM:
+ if (record->event.pressed) {
+ layer_on(_SYM);
+ } else {
+ layer_off(_SYM);
+ }
+ return false;
+ break;
+
+ case SAVE:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTL("s"));
+ }
+ return false;
+ break;
+ /* Colemak mod-dh moves the D key to the qwerty V position
+ This hack makes apple-V_position do what I mean */
+ case DHPASTE:
+ if(get_mods() & MOD_BIT(KC_LGUI) ) {
+ if (record->event.pressed) {
+ clear_keyboard_but_mods();
+ register_code(KC_V);
+ } else {
+ unregister_code(KC_V);
+ }
+ } else {
+ if (record->event.pressed) {
+ register_code(KC_D);
+ } else {
+ unregister_code(KC_D);
+ }
+ }
+ return false;
+ break;
+
+ return false;
+ break;
+ }
+
+ return true;
+}
+#endif
+
+void keyboard_post_init_user(void) {
+ // Customise these values to desired behaviour
+ // debug_enable=true;
+ //debug_matrix=true;
+ //debug_keyboard=true;
+ //debug_mouse=true;
+}
+
+
+void matrix_init_user(void) {
+ #ifdef RGBLIGHT_ENABLE
+ #ifdef RGB_DI_PIN
+ rgblight_setrgb(RGB_GREEN);
+ #endif
+ #endif //RGB_matrix
+}
+
+// Runs whenever there is a layer state change.
+layer_state_t layer_state_set_user(layer_state_t state) {
+ uint8_t layer = get_highest_layer(state);
+ switch (layer) {
+ case 0:
+ #ifdef RGBLIGHT_COLOR_LAYER_0
+ rgblight_setrgb(RGBLIGHT_COLOR_LAYER_0);
+ #else
+ #ifdef RGBLIGHT_ENABLE
+ rgblight_init();
+ #endif
+ #endif
+ break;
+
+ case 1:
+ #ifdef RGBLIGHT_COLOR_LAYER_1
+ rgblight_setrgb(RGBLIGHT_COLOR_LAYER_1);
+ #endif
+ break;
+
+ case 2: // symbol
+ #ifdef RGBLIGHT_COLOR_LAYER_2
+ rgblight_setrgb(RGBLIGHT_COLOR_LAYER_2);
+ #endif
+ break;
+
+ case 3: // move
+ #ifdef RGBLIGHT_COLOR_LAYER_3
+ rgblight_setrgb(RGBLIGHT_COLOR_LAYER_3);
+ #endif
+ #ifdef USE_BABLPASTE
+ babble_led_user(); // poke led to update
+ #endif // bablepaste
+ break;
+
+ case 4: //delmove ideally we'd turn on a red pixel in addition to the layer indicator.
+ #ifdef RGBLIGHT_COLOR_LAYER_4
+ rgblight_setrgb(RGBLIGHT_COLOR_LAYER_4);
+ #endif
+ break;
+
+ case 5:
+ #ifdef RGBLIGHT_COLOR_LAYER_5
+ rgblight_setrgb(RGBLIGHT_COLOR_LAYER_5);
+ #endif
+ break;
+
+ default:
+ break;
+ }
+ #ifdef VIRTSER_ENABLE
+ //virtser_send(layer + 48); // ascii 0 is 48
+ #endif
+ return state;
+};
+
+// custom tapping term lengths.
+uint16_t get_tapping_term(uint16_t keycode) {
+ switch (keycode) {
+ case LT(_MOV, KC_TAB):
+ return TAPPING_TERM ;
+ break;
+ default:
+ return TAPPING_TERM;
+ }
+}
+
+
+
+#ifdef VIRTSER_ENABLE
+/* listen on serial for commands. Either a set of lower case letters mapped to colors,
+/ or upper case letters that change RGB mode.
+/ special command C takes 3 numbers as arguments, terminated with a newline or comma or excess digits.
+Command C takes 3-5octets of RGB settings. Numbers can be terminated with a comma or period.
+3 octets = set all LED, 4th argument specfies specfic LED, 4+5 specify start and stop LEDs.
+*/
+
+uint8_t ser_rgbByte[18] ; //ascii string
+uint8_t ser_cmd_started =0 ; // are we in process
+uint8_t ser_got_RGBbytes =0 ; // how many bytes we've recived.
+uint8_t rgb_r[6]; // R, g, b, P1, p2
+uint8_t bs=0; // how many bytes into our rgbBytestring.
+
+void virtser_recv(uint8_t serIn) {
+#ifdef RGBLIGHT_ENABLE
+ if ((serIn == 10 ) || (serIn == 13) || ser_got_RGBbytes >=5) { //reached newline or max digits
+
+ if (ser_cmd_started) {
+ ser_cmd_started =0 ; // end loop at newline
+ virtser_send('|');
+
+ if (ser_got_RGBbytes==3) {
+ rgblight_setrgb( rgb_r[0], rgb_r[1], rgb_r[2]);
+ }
+
+ if (ser_got_RGBbytes ==4) {
+ if (( rgb_r[3] >=0) && (rgb_r[3] <= RGBLED_NUM) ) { // is pos1 plausible
+ rgblight_setrgb_at ( rgb_r[0], rgb_r[1], rgb_r[2], rgb_r[3]);
+ } else {
+ rgblight_setrgb( rgb_r[0], rgb_r[1], rgb_r[2]);
+ }
+ }
+
+ if (ser_got_RGBbytes == 5) { // are start and end positions plausible?
+ if ( (rgb_r[4] >0) && (rgb_r[4] <= RGBLED_NUM) && (rgb_r[4] > rgb_r[3]) &&
+ (rgb_r[3] >=0) && (rgb_r[3] <= (RGBLED_NUM -1)) ) {
+ rgblight_setrgb_range(rgb_r[0], rgb_r[1], rgb_r[2], rgb_r[3], rgb_r[4]);
+ } else {
+ rgblight_setrgb( rgb_r[0], rgb_r[1], rgb_r[2]);
+ }
+ }
+ } else { // newline outside of command loop, or something that can be ignored.
+ //virtser_send('.');
+ }
+ }
+
+ if (1 == ser_cmd_started) { // collecting bytes.
+ if ( // it is time to compute a byte
+ ( ( (serIn == ',') || (serIn == '.') ) && (bs > 0) ) || // signal done with the byte.
+ (bs ==2 )){ //or we know this is last.
+
+ if ( (serIn <= '9') && (serIn >='0') ) { //3rd asci digit
+ ser_rgbByte[bs] = serIn;
+ bs++;
+ // virtser_send(serIn);
+ }
+
+ if (bs>3) {
+ rgb_r[ser_got_RGBbytes]=255;
+ ser_got_RGBbytes ++;
+ }
+ if (bs==3) {
+ rgb_r[ser_got_RGBbytes] = (ser_rgbByte[0] -'0')*100 + (ser_rgbByte[1] -'0')*10 + (ser_rgbByte[2] -'0' );
+ ser_got_RGBbytes ++;
+ }
+ if (bs ==2 ) {
+ rgb_r[ser_got_RGBbytes] = (ser_rgbByte[0] -'0')*10 + (ser_rgbByte[1] -'0' );
+ ser_got_RGBbytes ++;
+ }
+ if (bs ==1) {
+ rgb_r[ser_got_RGBbytes] = (ser_rgbByte[0] -'0');
+ ser_got_RGBbytes ++;
+ } // {else wipe & start over}
+
+ bs=0;
+ // virtser_send(ser_got_RGBbytes+'0');
+
+ } else { // haven't got enough for our byte / no terminal marker
+ if ( (serIn <= '9') && (serIn >='0') ) { //ascii only
+ ser_rgbByte[bs] = serIn;
+ bs++;
+ // virtser_send(serIn);
+ }
+ }
+ } else { //not in command loop - next is command w/o arguments, or start of one.
+ switch (serIn) {
+ case 'C': // color switch
+ ser_cmd_started=1;
+ ser_got_RGBbytes = bs =0;
+ virtser_send('/');
+ break;
+
+ case 'r': //red
+ rgblight_setrgb(RGB_RED);
+ break;
+
+ case 'g':
+ rgblight_setrgb(RGB_GREEN);
+ break;
+
+ case 'b': // color switch
+ rgblight_setrgb(RGB_BLUE);
+ break;
+
+ case 'w': // color switch
+ rgblight_setrgb(RGB_WHITE);
+ break;
+
+ case 'o': // color black/off
+ rgblight_setrgb(0,0,0);
+ break;
+
+ case 'T': // toggle
+ rgblight_toggle();
+ break;
+
+ case 'P': // pulse led
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING);
+ break;
+ case 'S': // Static
+ rgblight_mode(RGBLIGHT_MODE_STATIC_LIGHT);
+ break;
+
+ case 'U': // Rainbow
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_RAINBOW_MOOD);
+ break;
+
+ default:
+ // virtser_send(serIn);
+ break;
+
+ }
+ }
+#endif // RGBLIGHT_ENABLE
+}
+
+#endif // VirtSerial
diff --git a/users/miles2go/keymaps/handwired/ms_sculpt_mobile/readme.md b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/readme.md
new file mode 100644
index 00000000000..a720d81c183
--- /dev/null
+++ b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/readme.md
@@ -0,0 +1,10 @@
+# keymap taking advantage of the STM32 storage & CPU.
+RGB LED is used to show layers
+default bluepill LED is capslock.
+there's a simple serial protocol for the keyboard to listen for color change commands from the PC.
+Useful for "do stuff && cat "green">/dev/ttyACM0"
+
+lower case letters set pre-programmed colors
+Upper case letters change RGB mode
+Command C takes 3-5 octets of RGB settings. Numbers can be terminated with a comma or period.
+3 octets = set all LED, 4th argument specfies specfic LED, 4+5 specify start and stop LEDs.
diff --git a/users/miles2go/keymaps/handwired/ms_sculpt_mobile/rules.mk b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/rules.mk
new file mode 100644
index 00000000000..7eb39e10823
--- /dev/null
+++ b/users/miles2go/keymaps/handwired/ms_sculpt_mobile/rules.mk
@@ -0,0 +1,24 @@
+# Build Options
+# change to "no" to disable the options, or define them in the Makefile in
+# the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
+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
+NKRO_ENABLE = no # Nkey Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+MIDI_ENABLE = no # MIDI controls
+AUDIO_ENABLE = no # Audio output on port C6
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+ifeq ($(strip $(KEYBOARD)), handwired/ms_sculpt_mobile/8x18_arm)
+ RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
+endif
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+
+#enable RAW in keymap config, since it can hang machines
+RAW_ENABLE = no
+# virtual serial port
+VIRTSER_ENABLE = yes
diff --git a/users/miles2go/milestogo.c b/users/miles2go/milestogo.c
new file mode 100644
index 00000000000..f1da2f4d7ab
--- /dev/null
+++ b/users/miles2go/milestogo.c
@@ -0,0 +1,142 @@
+// based on drashna's but I think at this point it's a new axe
+
+#include QMK_KEYBOARD_H
+#include "milestogo.h"
+#include
+
+__attribute__((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; }
+
+bool move_is_on = false; // track if we are in _MOV layer
+bool sym_is_on = false; // track if we are in _SYM layer
+
+// Defines actions for global custom keycodes
+// Then runs the _keymap's record handier if not processed here
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ // static uint16_t spcmov_timer; // timer for spcmov key
+
+#ifdef USE_BABBLEPASTE
+ if (keycode > BABBLE_START && keycode < BABBLE_END_RANGE) {
+ if (record->event.pressed) { // is there a case where this isn't desired?
+ babblePaste(keycode);
+ } else {
+ return true;
+ }
+ }
+#endif
+
+ switch (keycode) {
+ case _QWERTY:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_QWERTY);
+ }
+ break;
+
+ case _CDH:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_CDH);
+ }
+ break;
+
+ case TMUX: // ctl-B
+ if (record->event.pressed) {
+ tap_code16(C(KC_B));
+ }
+ break;
+
+ /* Colemak mod-dh moves the D key to the qwerty V position
+ This hack makes apple-V_position do what I mean */
+ case DHPASTE:
+ if (get_mods() & MOD_BIT(KC_LGUI)) {
+ if (record->event.pressed) {
+ clear_keyboard_but_mods();
+ register_code(KC_V);
+ } else {
+ unregister_code(KC_V);
+ }
+ } else {
+ if (record->event.pressed) {
+ register_code(KC_D);
+ } else {
+ unregister_code(KC_D);
+ }
+ }
+ return false;
+ break;
+
+ default:
+ return true;
+ }
+
+ // normal keycode
+ return process_record_keymap(keycode, record);
+}
+
+void babble_led_user(void) {
+#ifdef USE_BABLPASTE
+ extern uint8_t babble_mode;
+
+# ifdef BABL_WINDOWS
+ if (babble_mode == BABL_WINDOWS_MODE) {
+ if (BABL_LED_INDEX > 0) {
+ rgblight_setrgb_at(RGBLIGHT_COLOR_MS, BABL_LED_INDEX);
+ } else {
+ rgblight_setrgb(RGBLIGHT_COLOR_MS);
+ }
+ }
+# endif
+# ifdef BABL_READMUX
+ if (babble_mode == BABL_READMUX_MODE) {
+ if (BABL_LED_INDEX > 0) {
+ rgblight_setrgb_at(RGBLIGHT_COLOR_READMUX, BABL_LED_INDEX);
+ } else {
+ rgblight_setrgb(RGBLIGHT_COLOR_READMUX);
+ }
+ }
+# endif
+# ifdef BABL_MAC
+ if (babble_mode == BABL_MAC_MODE) {
+ if (BABL_LED_INDEX > 0) {
+ rgblight_setrgb_at(RGBLIGHT_COLOR_MAC, BABL_LED_INDEX);
+ } else {
+ rgblight_setrgb(RGBLIGHT_COLOR_MAC);
+ }
+ }
+# endif
+# ifdef BABL_VI
+ if (babble_mode == BABL_VI_MODE) {
+ if (BABL_LED_INDEX > 0) {
+ rgblight_setrgb_at(RGBLIGHT_COLOR_VI, BABL_LED_INDEX);
+ } else {
+ rgblight_setrgb(RGBLIGHT_COLOR_VI);
+ }
+ }
+# endif
+# ifdef BABL_EMACS
+ if (babble_mode == BABL_EMACS_MODE) {
+ if (BABL_LED_INDEX > 0) {
+ rgblight_setrgb_at(RGBLIGHT_COLOR_EMACS, BABL_LED_INDEX);
+ } else {
+ rgblight_setrgb(RGBLIGHT_COLOR_EMACS);
+ }
+ }
+# endif
+# ifdef BABL_CHROMEOS
+ if (babble_mode == BABL_CHROMEOS_MODE) {
+ if (BABL_LED_INDEX > 0) {
+ rgblight_setrgb_at(RGBLIGHT_COLOR_CHROMEOS, BABL_LED_INDEX);
+ } else {
+ rgblight_setrgb(RGBLIGHT_COLOR_CHROMEOS);
+ }
+ }
+# endif
+# ifdef BABL_LINUX
+ if (babble_mode == BABL_LINUX_MODE) {
+ if (BABL_LED_INDEX > 0) {
+ rgblight_setrgb_at(RGBLIGHT_COLOR_LINUX, BABL_LED_INDEX);
+ } else {
+ rgblight_setrgb(RGBLIGHT_COLOR_LINUX);
+ }
+ }
+# endif
+#endif // bablepaste
+}
diff --git a/users/miles2go/milestogo.h b/users/miles2go/milestogo.h
new file mode 100644
index 00000000000..dfb344212e9
--- /dev/null
+++ b/users/miles2go/milestogo.h
@@ -0,0 +1,289 @@
+/* Modified from
+Copyright 2017 Christopher Courtney @drashna
+
+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 .
+*/
+
+
+#pragma once
+#include "quantum.h"
+#include "version.h"
+#include "eeprom.h"
+
+
+#ifdef USE_BABBLEPASTE
+#include "babblePaste.h"
+#endif
+
+#ifdef RGB_MATRIX_ENABLE
+#include "rgb_matrix.h"
+#endif
+
+#define USERSPACE_ACTIVE
+
+/* Define layer names */
+enum userspace_layers {
+ _QWERTY=0,
+ _CDH,
+ _SYM,
+ _MOV,
+ _DMOV,
+ _NUM
+};
+
+
+/*
+define modifiers here, since MOD_* doesn't seem to work for these
+ */
+#define MODS_SHIFT_MASK (MOD_BIT(KC_LSHIFT)|MOD_BIT(KC_RSHIFT))
+#define MODS_CTRL_MASK (MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTRL))
+#define MODS_ALT_MASK (MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT))
+#define MODS_GUI_MASK (MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI))
+
+#if defined(BABBLE_END_RANGE)
+ #define USER_START BABBLE_END_RANGE
+#else
+ #if defined(KEYMAP_SAFE_RANGE)
+ #define USER_START KEYMAP_SAFE_RANGE
+ #else
+ #define USER_START SAFE_RANGE
+ #endif
+#endif
+
+enum userspace_custom_keycodes {
+ EPRM = BABBLE_END_RANGE, // Resets EEPROM do defaults (as in eeconfig_init)
+ VRSN, // Prints QMK Firmware and board info
+ KC_QWERTY, // Sets default layer to QWERTY
+ KC_CDH, // Sets default layer to COLEMAK DH
+ KC_MAKE,
+ VIBRK, // escape :
+ DHPASTE, // allow pasting via qwerty V,not colemak V
+ TMUX, // TMUX Ctrl-b
+ ALTSYM, // Alt when held, toggle MOV when tapped
+ GUISYM,
+ SPCMOV,
+ SAVE, // placeholder for CTRL-S while I get babble working again.
+ NEW_SAFE_RANGE //Keymap specific codes come AFTER this
+};
+
+#define QWERTY KC_QWERTY
+#define COLEMAK KC_CDH
+#define KC_RESET RESET
+
+
+
+#if (!defined(LAYOUT) && defined(KEYMAP))
+#define LAYOUT KEYMAP
+#endif
+
+#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
+
+
+#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T
+#define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G
+#define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B
+
+#define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P
+#define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, KC_SCLN
+#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLASH
+
+
+#define ______________COLEMAK_MOD_DH_L1____________ KC_Q, KC_W, KC_F, KC_P, KC_B
+#define ______________COLEMAK_MOD_DH_L2____________ KC_A, KC_R, KC_S, KC_T, KC_G
+#define ______________COLEMAK_MOD_DH_L3____________ KC_Z, KC_X, KC_C, KC_D, KC_V
+
+#define ______________COLEMAK_MOD_DH_R1____________ KC_J, KC_L, KC_U, KC_Y, KC_SCLN
+#define ______________COLEMAK_MOD_DH_R2____________ KC_M, KC_N, KC_E, KC_I, KC_O
+#define ______________COLEMAK_MOD_DH_R3____________ KC_K, KC_H, KC_COMM, KC_DOT, KC_SLASH
+
+
+#define ________________NUMBER_LEFT________________ KC_1, KC_2, KC_3, KC_4, KC_5
+#define ________________NUMBER_RIGHT_______________ KC_6, KC_7, KC_8, KC_9, KC_0
+
+#define ________________FKEYS__LEFT________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
+#define ________________FKEYS__RIGHT_______________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
+#define ________________FKEYS__FAR_RIGHT___________ KC_F11, KC_F12, KC_PSCR, KC_HOME, KC_END
+
+#define ________________NAV_NUMBER_LEFT____________ KC_LSFT, KC_LCTL, KC_LALT, KC_LGUI, XXXXXXX
+
+#define ___________________BLANK___________________ _______, _______, _______, _______, _______
+#define ___________________BLOCK___________________ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+
+
+
+// BabblePaste
+#define ____________BABBLE_SWITCH_L________________ B_MAC , B_READ , B_LINUX, B_VI, _______
+#define ____________BABBLE_SWITCH_R________________ B_CROM, B_LINUX, B_WIN , QWERTY, COLEMAK
+
+
+/////////MOVE - Full size keyboard version
+
+/* ,--------------------------------------------. ,--------------------------------------------.
+ * N |Lock |PrevApp |NextApp |PasteVal| | | | |SwitchKB|Devtools| Lock |
+ * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ * 01 | ESC |FindPrev| Find |FindNext| \n cell| |ParStart|LineStrt| Up | EOL | ParEnd |
+ * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ * 02 | SelA | Do_DEL | Shift | Undo |Hsplit+ | | WrdLft | Left | Down | Right | WrdRght|
+ * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ * 03 |Vspli+ | Cut | Copy | Paste | Paste | | WinPrv | Tab-- | NewTab | Tab++ | WinNxt |
+ * `--------------------------------------------' `--------------------------------------------'
+ */
+/* Movement layer similar to Extend, but fully enriched with babblepaste */
+#define ____________BABBLE_MOV_LNUM________________ B_LOCK, B_PAPP, B_NAPP, B_PASTV, XXXX
+
+#define ____________BABBLE_MOV_L1__________________ KC_ESC, B_FINDP, B_FIND, B_FINDN, B_NCEL
+#define ____________BABBLE_MOV_L2__________________ B_SELA , MO(_DMOV),KC_LSFT,B_UNDO, B_HSPLIT
+#define ____________BABBLE_MOV_L3__________________ B_VSPLIT, B_CUT, B_COPY, B_PASTE, B_PASTE
+
+#define ____________BABBLE_MOV_RNUM________________ XXXX, XXXX, B_KEYB, B_BDEV, B_LOCK
+#define ____________BABBLE_MOV_R1__________________ B_PTOP, B_GSOL, B_UP, B_GEOL, B_PEND
+#define ____________BABBLE_MOV_R2__________________ B_L1W, B_L1C, B_DOWN, B_R1C, B_R1W
+#define ____________BABBLE_MOV_R3__________________ B_PWIN, B_PTAB, B_NTAB, B_NXTB, B_NWIN
+
+
+// Move in a direction, deleting as we go, or do opposite of Mov layer action */
+/* ,--------------------------------------------. ,--------------------------------------------.
+ * 01 | Esc | |Replace |MultiSel|PasteVal| | . |LineStrt| . | EOL | . |
+ * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ * 02 | | Do_Mov | Shift | Redo |Hsplit- | | WrdLft | Left | . | Right | WrdRght|
+ * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ * 03 |Vsplit- | Cut | Copy | Paste |Paste | | App-- | ZoomOut| NewWin | ZoomIn | App+ |
+ * `--------------------------------------------' `--------------------------------------------'
+ */
+#define _________BABBLE_DELMOV_L1__________________ KC_ESC, _______, B_RPLACE, B_MSEL, B_PASTV
+#define _________BABBLE_DELMOV_L2__________________ XXXXXXX, _______, _______, B_REDO, B_HUNSPT
+#define _________BABBLE_DELMOV_L3__________________ B_VUNSPT,B_CUT, B_COPY, B_PASTE, B_PRVFM
+
+#define _________BABBLE_DELMOV_R1__________________ XXXXXXX, B_DSOL, _______, B_DEOL, XXXXXXX
+#define _________BABBLE_DELMOV_R2__________________ B_DLW, KC_BSPC, _______, B_DEL, B_DRW
+#define _________BABBLE_DELMOV_R3__________________ B_NAPP, B_ZOUT, B_WINN, B_ZIN, B_PAPP
+
+/* SYM / excel / programming logic +=1 optimization*/
+/* ,----------------------------------. ,----------------------------------.
+ * 01 | | [ | ] | { | | | | } | ( | ) | |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * 02 | ^ | ! | = | 0 | $ | | # | 1 | - | + | ` |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * 03 | \ | % | @ | | | _ | | * | & | ~ | . | / |
+ * `----------------------------------' `----------------------------------'
+ Memnonics
+ ^begining end$ . &&/|| on strong finger. #at start of line.
+ * (multiply) opposite /
+ Minus is left of plus as normal.
+ ` is a shifted ''
+ ~/ is an outwards roll. / .* is a roll. !=0 is a roll , ++1 --1 roll.
+ _ is hard to get to.
+
+ */
+#define ___________________SYM_L1__________________ XXXXXXX, KC_LBRC, KC_RBRC, KC_LCBR, XXXXXXX
+#define ___________________SYM_L2__________________ KC_CIRC, KC_EXLM, KC_EQL, KC_0, KC_DLR
+#define ___________________SYM_L3__________________ KC_BSLS, KC_PERC, KC_AT, KC_PIPE, KC_UNDS
+
+#define ___________________SYM_R1__________________ XXXXXXX, KC_RCBR, KC_LPRN, KC_RPRN, XXXXXXX
+#define ___________________SYM_R2__________________ KC_HASH, KC_KP_1, KC_MINS, KC_PLUS, KC_GRAVE
+#define ___________________SYM_R3__________________ KC_PERC, KC_TILDE,KC_AMPR, KC_DOT, KC_SLASH
+
+
+
+/* excel centric symbol layer*/
+ /* ,--------------------------------------------. ,--------------------------------------------.
+ * 01 | DelRow|InsCol | SelCol |PasteVal| | | . | 1 | 2 | 3 | |
+ * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ * 02 | - |InsRow | SelRow | Undo | + | | * | 4 | 5 | 6 | - |
+ * |--------+--------+--------+--------+--------| |--------+--------+--------+--------+--------|
+ * 03 | Undo | Cut | Copy | Paste |Paste | | / | 7 | 8 | 9 | Paste |
+ * `--------------------------------------------' `--------------------------------------------'
+
+ */
+#define _________________EXCEL_L1__________________ B_DROW, B_ICOL, B_SELC, B_PASTV, XXXX
+#define _________________EXCEL_L2__________________ KC_MINS, B_ICOL, B_SELC, B_UNDO, KC_PLUS
+#define _________________EXCEL_L3__________________ B_UNDO, B_CUT, B_COPY, B_PASTE, B_PASTE
+
+#define _________________EXCEL_R1__________________ XXXXXXX, KC_1, KC_2, KC_3, XXXXXXX
+#define _________________EXCEL_R2__________________ KC_ASTR, KC_4, KC_5, KC_6, KC_MINS
+#define _________________EXCEL_R3__________________ KC_SLASH, KC_7, KC_8, KC_8, B_PASTE
+
+
+/* Based on BEKL 15 punctuation
+* ,----------------------------------. ,----------------------------------.
+ * 01 | | < | $ | > | | | | [ | _ | ] | |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * 02 | \ | ( | "" | ) | # | | % | { | = | } | "|" |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * 03 | | : | * | + | | | | & | ^ | ~ | |
+ * `----------------------------------' `----------------------------------'
+ Memnonics
+
+ */
+#define ______________BEKL_SYM_L1__________________ XXXXXXX, KC_LBRC, KC_RBRC, KC_LCBR, XXXXXXX
+#define ______________BEKL_SYM_L2__________________ KC_CIRC, KC_EXLM, KC_EQL, KC_0, KC_DLR
+#define ______________BEKL_SYM_L3__________________ KC_BSLS, KC_PERC, KC_AT, KC_PIPE, KC_UNDS
+
+#define ______________BEKL_SYM_R1__________________ XXXXXXX, KC_RCBR, KC_LPRN, KC_RPRN, XXXXXXX
+#define ______________BEKL_SYM_R2__________________ KC_HASH, KC_KP_1, KC_MINS, KC_PLUS, KC_GRAVE
+#define ______________BEKL_SYM_R3__________________ KC_PERC, KC_TILDE,KC_AMPR, KC_DOT, KC_SLASH
+
+// NUM
+/* ,----------------------------------. ,----------------------------------.
+ * 01 | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * 02 | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * 03 | F11 | F12 | | | QWERT| | CDH | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+
+#define ___________________NUM_L1__________________ ________________NUMBER_LEFT________________
+#define ___________________NUM_L2__________________ ________________FKEYS__LEFT________________
+#define ___________________NUM_L3__________________ KC_F11, KC_F11, XXXXXXX, XXXXXXX, QWERTY
+
+#define ___________________NUM_R1__________________ ________________NUMBER_RIGHT_______________
+#define ___________________NUM_R2__________________ ________________FKEYS__RIGHT_______________
+#define ___________________NUM_R3__________________ COLEMAK, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+
+
+
+/* NUM / excel / programming logic +=1 optimization*/
+/* ,----------------------------------. ,----------------------------------.
+ * 01 | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * 02 | ^ | ! | = | 0 | $ | | # | 1 | - | + | ` |
+ * |------+------+------+------+------| |------+------+------+------+------|
+ * 03 | \ | % | @ | | | _ | | * | & | ~ | . | / |
+ * `----------------------------------' `----------------------------------'
+ Memnonics
+ ^begining end$ . &&/|| on strong finger. #at start of line. * missing?
+ Minus is left of plus as normal. ` is a shifted ''
+ ~/ is an outwards roll. / * is a roll.
+ _ is hard to get to.
+
+ */
+#define __________40_______NUM_L1__________________ ________________NUMBER_LEFT________________
+#define __________40_______NUM_L2__________________ KC_CIRC, KC_EXLM, KC_EQL, KC_0, KC_DLR
+#define __________40_______NUM_L3__________________ KC_BSLS, KC_PERC, KC_AT, KC_PIPE, KC_UNDS
+
+#define __________40_______NUM_R1__________________ ________________NUMBER_RIGHT_______________
+#define __________40_______NUM_R2__________________ KC_HASH, KC_KP_1, KC_MINS, KC_PLUS, KC_GRAVE
+#define __________40_______NUM_R3__________________ KC_PERC, KC_TILDE, KC_AMPR,KC_DOT, KC_SLASH
+
+
+#define _________________ADJUST_L1_________________ RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_TOG
+#define _________________ADJUST_L2_________________ MU_TOG , CK_TOGG, AU_ON, AU_OFF, AG_NORM
+#define _________________ADJUST_L3_________________ RGB_RMOD,RGB_HUD,RGB_SAD, RGB_VAD, KC_RGB_T
+
+#define _________________ADJUST_R1_________________ KC_SEC1, KC_SEC2, KC_SEC3, KC_SEC4, KC_SEC5
+#define _________________ADJUST_R2_________________ AG_SWAP, QWERTY, COLEMAK, DVORAK, WORKMAN
+#define _________________ADJUST_R3_________________ MG_NKRO, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT
+
+
diff --git a/users/miles2go/readme.md b/users/miles2go/readme.md
new file mode 100644
index 00000000000..b55f51b15fd
--- /dev/null
+++ b/users/miles2go/readme.md
@@ -0,0 +1,10 @@
+# Overview
+
+This is my personal userspace file. Most of my code exists here, as it's heavily shared.
+
+## Custom Keycodes
+See the babblepaste.txt readme
+
+## Layer Indication
+
+This uses the `layer_state_set_*` command to change the layer color, to indicate which layer it is on. This includes the default keymap, as well.
\ No newline at end of file
diff --git a/users/miles2go/rules.mk b/users/miles2go/rules.mk
new file mode 100644
index 00000000000..7fb77195274
--- /dev/null
+++ b/users/miles2go/rules.mk
@@ -0,0 +1,10 @@
+SRC += milestogo.c babblePaste.c babl_windows.c babl_mac.c babl_vi.c babl_readmux.c babl_chromeos.c babl_emacs.c babl_linux.c
+LTO_ENABLE = yes
+
+ifeq ($(strip $(MACROS_ENABLED)), yes)
+ OPT_DEFS += -DMACROS_ENABLED
+endif
+
+ifeq ($(strip $(USE_BABBLEPASTE)), yes)
+ SRC += babblePaste.c
+endif
diff --git a/users/mtdjr/solenoid.h b/users/mtdjr/solenoid.h
index a911bf794fe..4ef329b4adb 100644
--- a/users/mtdjr/solenoid.h
+++ b/users/mtdjr/solenoid.h
@@ -2,7 +2,6 @@
#define SOLENOID_H
#include
-#include "pincontrol.h"
#define SOLENOID_DEFAULT_DWELL 12
@@ -45,7 +44,7 @@ void solenoid_toggle(void) {
}
void solenoid_stop(void) {
- digitalWrite(SOLENOID_PIN, PinLevelLow);
+ writePinLow(SOLENOID_PIN);
solenoid_on = false;
solenoid_buzzing = false;
}
@@ -59,7 +58,7 @@ void solenoid_fire(void) {
solenoid_on = true;
solenoid_buzzing = true;
solenoid_start = timer_read();
- digitalWrite(SOLENOID_PIN, PinLevelHigh);
+ writePinHigh(SOLENOID_PIN);
}
void solenoid_check(void) {
@@ -80,20 +79,20 @@ void solenoid_check(void) {
if (elapsed / SOLENOID_MIN_DWELL % 2 == 0){
if (!solenoid_buzzing) {
solenoid_buzzing = true;
- digitalWrite(SOLENOID_PIN, PinLevelHigh);
+ writePinHigh(SOLENOID_PIN);
}
}
else {
if (solenoid_buzzing) {
solenoid_buzzing = false;
- digitalWrite(SOLENOID_PIN, PinLevelLow);
+ writePinLow(SOLENOID_PIN);
}
}
}
}
void solenoid_setup(void) {
- pinMode(SOLENOID_PIN, PinDirectionOutput);
+ setPinOutput(SOLENOID_PIN);
}
#endif
diff --git a/users/pvinis/config.h b/users/pvinis/config.h
index 8e2efb40a4b..14ec0dc8f13 100644
--- a/users/pvinis/config.h
+++ b/users/pvinis/config.h
@@ -1,10 +1,9 @@
#pragma once
-#ifdef AUDIO_ENABLE
-// #define STARTUP_SONG SONG(SONIC_RING)
-// #define DAC_SAMPLE_MAX 65535U // maybe this works for volume?
-#endif
-
// allow rolling when keys have hold functionality
#define IGNORE_MOD_TAP_INTERRUPT
// #define TAPPING_TERM 150
+
+#if defined(MOUSE_KEYS)
+# define MOUSEKEY_WHEEL_TIME_TO_MAX 1
+#endif
diff --git a/users/pvinis/pvinis.c b/users/pvinis/pvinis.c
index e97edcb98cc..31c3023e830 100644
--- a/users/pvinis/pvinis.c
+++ b/users/pvinis/pvinis.c
@@ -2,88 +2,97 @@
#include "version.h"
#ifdef AUDIO_ENABLE
-#include "audio.h"
-#endif // AUDIO_ENABLE
-
-
-#ifdef AUDIO_ENABLE
-// float tone_katamari_rolling_star[][2] = SONG(KATAMARI_ROLLING_STAR);
-#endif // AUDIO_ENABLE
+# include "audio.h"
+float song_sonic_ring[][2] = SONG(SONIC_RING);
+float song_coin_sound[][2] = SONG(COIN_SOUND);
+float song_test[][2] = SONG(QWERTY_SOUND);
+#endif
// SYMBOL + SYSCTL = KBCTL
uint32_t layer_state_set_user(uint32_t state) {
- uint32_t intermediate_state = update_tri_layer_state(state, LR_SYMBOL, LR_SYSCTL, LR_KBCTL);
- intermediate_state = layer_state_set_user_local(intermediate_state);
- return intermediate_state;
+ uint32_t intermediate_state = update_tri_layer_state(state, LR_SYMBOL, LR_SYSCTL, LR_KBCTL);
+ intermediate_state = layer_state_set_user_keymap(intermediate_state);
+ return intermediate_state;
}
-
// functions for the individual keymaps to implement if they need something extra
-__attribute__ ((weak))
-bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
- return true;
-}
+__attribute__((weak)) bool process_record_keymap(uint16_t keycode, keyrecord_t *record) { return true; }
-
-// handle my own keycodes
+// Handle my own keycodes.
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- switch (keycode) {
+ switch (keycode) {
+ case PV_VRSN:
+ if (record->event.pressed) {
+ SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
+ }
+ return false;
- case PV_VRSN:
- if (record->event.pressed) {
- SEND_STRING(QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
- }
- return false;
-
- case PV_MAKE:
- if (!record->event.pressed) {
- SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP
+ case PV_MAKE:
+ // make ergodox_ez:pvinis:teensy
+ if (!record->event.pressed) {
+ SEND_STRING("make " QMK_KEYBOARD ":" QMK_KEYMAP
#if (defined(BOOTLOADER_DFU) || defined(BOOTLOADER_LUFA_DFU) || defined(BOOTLOADER_QMK_DFU))
- ":dfu"
+ ":dfu"
#elif defined(BOOTLOADER_HALFKAY)
- ":teensy"
+ ":teensy"
#elif defined(BOOTLOADER_CATERINA)
- ":avrdude"
+ ":avrdude"
#endif
- SS_TAP(X_ENTER)
- );
- }
- return false;
+ SS_TAP(X_ENTER));
+ }
+ return false;
- case PV_FLSH:
- reset_keyboard();
- return false;
+ case PV_FLSH:
+ reset_keyboard();
+ return false;
- case PV_KTMR:
- if (record->event.pressed) {
+ case PV_SSNC:
+ if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- // PLAY_SONG(tone_katamari_rolling_star);
+ PLAY_SONG(song_sonic_ring);
#endif
- }
- return false;
- }
- return process_record_keymap(keycode, record);
-}
+ }
+ return false;
+ case PV_SCIN:
+ if (record->event.pressed) {
+#ifdef AUDIO_ENABLE
+ PLAY_SONG(song_coin_sound);
+#endif
+ }
+ return false;
+
+ case PV_TEST:
+ if (record->event.pressed) {
+#ifdef AUDIO_ENABLE
+ PLAY_SONG(song_test);
+#endif
+ }
+ return false;
+ }
+ return process_record_keymap(keycode, record);
+}
#ifdef TAP_DANCE_ENABLE
-qk_tap_dance_action_t tap_dance_actions[] = {
-};
-#endif // TAP_DANCE_ENABLE
+qk_tap_dance_action_t tap_dance_actions[] = {};
+#endif
+void keyboard_post_init_rgb_light(void) {
+ rgblight_sethsv(HSV_GOLD);
+ rgblight_mode(RGBLIGHT_MODE_BREATHING);
+ // rgblight_mode(RGBLIGHT_MODE_KNIGHT+1);
+}
-// init stuff
+// Init stuff.
void keyboard_post_init_user(void) {
- keyboard_post_init_user_local();
+#if defined(RGBLIGHT_ENABLE)
+ keyboard_post_init_rgb_light();
+#endif
+ keyboard_post_init_user_keymap();
}
+// Default functions.
+__attribute__((weak)) void keyboard_post_init_user_keymap(void) {}
-// default functions
-__attribute__ ((weak))
-void keyboard_post_init_user_local(void) {}
-
-__attribute__ ((weak))
-uint32_t layer_state_set_user_local(uint32_t state) {
- return state;
-}
+__attribute__((weak)) uint32_t layer_state_set_user_keymap(uint32_t state) { return state; }
diff --git a/users/pvinis/pvinis.h b/users/pvinis/pvinis.h
index 0c75c6a6615..c50033a440f 100644
--- a/users/pvinis/pvinis.h
+++ b/users/pvinis/pvinis.h
@@ -2,84 +2,103 @@
#include "quantum.h"
-
-// my own keycodes
+// My own keycodes.
enum userspace_custom_keycodes {
- PV_ = SAFE_RANGE,
+ PV_ = SAFE_RANGE,
- PV_VRSN, // prints firmware version
- PV_MAKE, // prints the make command of the keyboard
- PV_FLSH, // resets keyboard
- PV_KTMR, // play katamari music
+ PV_VRSN, // Print firmware version.
+ PV_MAKE, // Print the make command of the keyboard.
+ PV_FLSH, // Reset keyboard.
- PV_SAFE_RANGE, // used for extra keycodes in the individual keymaps
+ PV_SSNC, // Play Sonic Ring.
+ PV_SCIN, // Play Coin Sound.
+
+ PV_TEST, // For quick testing purposes.
+
+ PV_SAFE_RANGE, // Used for extra keycodes in individual keymaps.
};
enum tap_dance_indexes {
- // tap dance
- TD_FLSH, // flash keyboard (as if the physical flash key was pressed)
+ // tap dance
+ TD_FLSH, // flash keyboard (as if the physical flash key was pressed)
};
-#define ALLM(kc) LCAG(kc) // easier name for left ctrl-alt-gui
-#define PV_ESCC CTL_T(KC_ESC) // esc on tap, ctrl on hold
-#define PV_LOCK LCTL(LSFT(KC_PWR)) // lock computer
-#define TD_3FLS TD(TD_FLSH) // tap dance 3 times for flash
+#define ALLM(kc) LCAG(kc) // Easier name for left ctrl-alt-gui.
+#define PV_ESCC CTL_T(KC_ESC) // esc on tap, ctrl on hold.
+#define PV_LOCK LCTL(LSFT(KC_PWR)) // Lock computer.
+#define TD_3FLS TD(TD_FLSH) // Tap dance 3 times for flash.
-
-// layers
+// Layers.
enum {
- LR_BASE = 0, // used for basic keys like the surrounding ctrl, cmd, etc
+ LR_BASE = 0, // used for basic keys like the surrounding ctrl, cmd, etc
- LR_QWERTY,
- LR_CARPALX,
+ LR_QWERTY,
+ LR_CARPALX,
+ LR_GAME1, // game layout (space on the left thumb, no modifiers, etc)
+ LR_GAME2, // game layout (space on the left thumb, no modifiers, etc, arrows)
+
+ LR_SYMBOL, // symbol input (!, @, #, etc)
+ LR_SYSCTL, // system control (music, volume, keyboard flash, etc)
+ LR_KBCTL, // keyboard control (version, make, flash, etc)
- LR_SYMBOL, // symbol input (!, @, #, etc)
- LR_SYSCTL, // system control (music, volume, keyboard flash, etc)
- LR_KBCTL, // keyboard control (version, make, flash, etc)
};
-
-// layer switchers
-#define BASE TO(LR_BASE)
-#define QWERTY TO(LR_QWERTY)
+// Layer switchers.
+#define BASE TO(LR_BASE)
+#define QWERTY TO(LR_QWERTY)
#define CARPALX TO(LR_CARPALX)
+#define GAME1 TO(LR_GAME1)
+#define GAME2 TO(LR_GAME2)
-#define SYMBOL MO(LR_SYMBOL)
-#define SYSCTL MO(LR_SYSCTL)
-#define KBCTL MO(LR_KBCTL)
+#define SYMBOL MO(LR_SYMBOL)
+#define SYSCTL MO(LR_SYSCTL)
+#define KBCTL MO(LR_KBCTL)
+// Layout parts for easy reuse between keyboard keymaps.
-// layout parts for easy reuse between keyboard keymaps
+// Transparent.
+// ┌─────┬─────┬─────┬─────┬─────┐
+// │ │ │ │ │ │
+// └─────┴─────┴─────┴─────┴─────┘
+#define ___________________________________________ _______, _______, _______, _______, _______
-// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
-// | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 |
-// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
-#define ________________NUMBERS_L__________________ KC_1, KC_2, KC_3, KC_4, KC_5
-#define ________________NUMBERS_R__________________ KC_6, KC_7, KC_8, KC_9, KC_0
+// Numbers.
+// ┌─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┐
+// │ 1 │ 2 │ 3 │ 4 │ 5 │ │ 6 │ 7 │ 8 │ 9 │ 0 │
+// └─────┴─────┴─────┴─────┴─────┘ └─────┴─────┴─────┴─────┴─────┘
+#define ________________NUMBERS_L__________________ KC_1, KC_2, KC_3, KC_4, KC_5
+#define ________________NUMBERS_R__________________ KC_6, KC_7, KC_8, KC_9, KC_0
-// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
-// | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 |
-// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
-#define ______________________F_L__________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
-#define ______________________F_R__________________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
+// F keys.
+// ┌─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┐
+// │ F1 │ F2 │ F3 │ F4 │ F5 │ │ F6 │ F7 │ F8 │ F9 │ F10 │
+// └─────┴─────┴─────┴─────┴─────┘ └─────┴─────┴─────┴─────┴─────┘
+#define ______________________F_L__________________ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5
+#define ______________________F_R__________________ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10
-// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
-// | Q | W | E | R | T | | Y | U | I | O | P |
-// ,-----+-----+-----x-----x-----, ,-----x-----x-----+-----+-----,
-// | A | S | D | F | G | | H | J | K | L | ; |
-// ,-----+-----+-----x-----x-----, ,-----x-----x-----+-----+-----,
-// | Z | X | C | V | B | | N | M | , | . | / |
-// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
-#define _________________QWERTY_L1_________________ KC_Q , KC_W , KC_E , KC_R , KC_T
-#define _________________QWERTY_L2_________________ KC_A , KC_S , KC_D , KC_F , KC_G
-#define _________________QWERTY_L3_________________ KC_Z , KC_X , KC_C , KC_V , KC_B
+// QWERTY.
+// ┌─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┐
+// │ Q │ W │ E │ R │ T │ │ Y │ U │ I │ O │ P │
+// ├─────┼─────┼─────╆━━━━━╅─────┤ ├─────╆━━━━━╅─────┼─────┼─────┤
+// │ A │ S │ D ┃ F ┃ G │ │ H ┃ J ┃ K │ L │ ; │
+// ├─────┼─────┼─────╄━━━━━╃─────┤ ├─────╄━━━━━╃─────┼─────┼─────┤
+// │ Z │ X │ C │ V │ B │ │ N │ M │ , │ . │ / │
+// └─────┴─────┴─────┴─────┴─────┘ └─────┴─────┴─────┴─────┴─────┘
+#define _________________QWERTY_L1_________________ KC_Q, KC_W, KC_E, KC_R, KC_T
+#define _________________QWERTY_L2_________________ KC_A, KC_S, KC_D, KC_F, KC_G
+#define _________________QWERTY_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_B
-#define _________________QWERTY_R1_________________ KC_Y , KC_U , KC_I , KC_O , KC_P
-#define _________________QWERTY_R2_________________ KC_H , KC_J , KC_K , KC_L , KC_SCLN
-#define _________________QWERTY_R3_________________ KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH
+#define _________________QWERTY_R1_________________ KC_Y, KC_U, KC_I, KC_O, KC_P
+#define _________________QWERTY_R2_________________ KC_H, KC_J, KC_K, KC_L, KC_SCLN
+#define _________________QWERTY_R3_________________ KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH
-#define _____________MOD_QWERTY_L2_________________ CTL_T(KC_A), SFT_T(KC_S), GUI_T(KC_D), ALT_T(KC_F), KC_G
-#define _____________MOD_QWERTY_R2_________________ KC_H , ALT_T(KC_J), GUI_T(KC_K), SFT_T(KC_L), CTL_T(KC_SCLN)
+// QWERTY with mods.
+// ┌───────┬───────┬───────┲━━━━━━━┱───────┐ ┌───────┲━━━━━━━┱───────┬───────┬───────┐
+// │ ctl/A │ sft/S │ cmd/D ┃ opt/F ┃ G │ │ H ┃ opt/J ┃ cmd/K │ sft/L │ ctl/; │
+// └───────┴───────┴───────┺━━━━━━━┹───────┘ └───────┺━━━━━━━┹───────┴───────┴───────┘
+// #define _____________MOD_QWERTY_L2_________________ CTL_T(KC_A), SFT_T(KC_S), GUI_T(KC_D), ALT_T(KC_F), KC_G
+#define _____________MOD_QWERTY_L2_________________ KC_A, KC_S, KC_D, ALT_T(KC_F), KC_G
+#define _____________MOD_QWERTY_R2_________________ KC_H, ALT_T(KC_J), GUI_T(KC_K), SFT_T(KC_L), CTL_T(KC_SCLN)
// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
// | Q | G | M | L | W | | Y | F | I | O | P |
@@ -88,13 +107,13 @@ enum {
// ,-----+-----+-----x-----x-----, ,-----x-----x-----+-----+-----,
// | Z | X | C | V | J | | K | P | , | . | / |
// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
-#define ________________CARPALX_L1_________________ KC_Q , KC_G , KC_M , KC_L , KC_W
-#define ________________CARPALX_L2_________________ KC_D , KC_S , KC_T , KC_N , KC_R
-#define ________________CARPALX_L3_________________ KC_Z , KC_X , KC_C , KC_V , KC_J
+#define ________________CARPALX_L1_________________ KC_Q, KC_G, KC_M, KC_L, KC_W
+#define ________________CARPALX_L2_________________ KC_D, KC_S, KC_T, KC_N, KC_R
+#define ________________CARPALX_L3_________________ KC_Z, KC_X, KC_C, KC_V, KC_J
-#define ________________CARPALX_R1_________________ KC_Y , KC_F , KC_U , KC_B , KC_SCLN
-#define ________________CARPALX_R2_________________ KC_I , KC_A , KC_E , KC_O , KC_H
-#define ________________CARPALX_R3_________________ KC_K , KC_P , KC_COMM, KC_DOT , KC_SLSH
+#define ________________CARPALX_R1_________________ KC_Y, KC_F, KC_U, KC_B, KC_SCLN
+#define ________________CARPALX_R2_________________ KC_I, KC_A, KC_E, KC_O, KC_H
+#define ________________CARPALX_R3_________________ KC_K, KC_P, KC_COMM, KC_DOT, KC_SLSH
// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
// | ! | @ | { | } | _ | | \ | | ` | | |
@@ -103,50 +122,51 @@ enum {
// ,-----+-----+-----x-----x-----, ,-----x-----x-----+-----+-----,
// | % | ^ | [ | ] | + | | * | ~ | < | > | / |
// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
-#define _________________SYMBOL_L1_________________ KC_EXLM, KC_AT , KC_LCBR, KC_RCBR, KC_UNDS
-#define _________________SYMBOL_L2_________________ KC_HASH, KC_DLR , KC_LPRN, KC_RPRN, KC_MINS
-#define _________________SYMBOL_L3_________________ KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_PLUS
+#define _________________SYMBOL_L1_________________ KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_UNDS
+#define _________________SYMBOL_L2_________________ KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_MINS
+#define _________________SYMBOL_L3_________________ KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_PLUS
-#define _________________SYMBOL_R1_________________ KC_BSLS, _______, KC_GRV , _______, _______
-#define _________________SYMBOL_R2_________________ KC_EQL , KC_AMPR, KC_QUOT, KC_DQUO, KC_PIPE
-#define _________________SYMBOL_R3_________________ KC_ASTR, KC_TILD, KC_LABK, KC_RABK, KC_SLSH
+#define _________________SYMBOL_R1_________________ KC_BSLS, _______, KC_GRV, _______, _______
+#define _________________SYMBOL_R2_________________ KC_EQL, KC_AMPR, KC_QUOT, KC_DQUO, KC_PIPE
+#define _________________SYMBOL_R3_________________ KC_ASTR, KC_TILD, KC_LABK, KC_RABK, KC_SLSH
-// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
-// | | | | | | |MUTE |HOME | ^ | END | |
-// ,-----+-----+-----x-----x-----, ,-----x-----x-----+-----+-----,
-// | | | | | | |VOLUP| < | v | > | |
-// ,-----+-----+-----x-----x-----, ,-----x-----x-----+-----+-----,
-// | | | | | | |VOLDN|MPREV|MPLAY|MNEXT| |
-// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
-#define _________________SYSCTL_L1_________________
-#define _________________SYSCTL_L2_________________
-#define _________________SYSCTL_L3_________________
+// System Control.
+// vol ↓ ctl ↓
+// ┌─────┬─────┬─────┬─────┬─────┐ ┌─────┬─────┬─────┬─────┬─────┐
+// │ │ │ │ │ │ │MUTE │HOME │ ↑ │ END │LOCK │
+// ├─────┼─────┼─────╆━━━━━╅─────┤ ├─────╆━━━━━╅─────┼─────┼─────┤
+// │ │ │ ┃ ┃ │ │VOLUP┃ ← ┃ ↓ │ → │SLEEP│ ← arrows
+// ├─────┼─────┼─────╄━━━━━╃─────┤ ├─────╄━━━━━╃─────┼─────┼─────┤
+// │ │ │ │ │ │ │VOLDN│MPREV│MPLAY│MNEXT│ PWR │ ← music
+// └─────┴─────┴─────┴─────┴─────┘ └─────┴─────┴─────┴─────┴─────┘
+#define _________________SYSCTL_L1_________________ XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_BTN1, XXXXXXX
+#define _________________SYSCTL_L2_________________ XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_RIGHT, KC_MS_WH_UP
+#define _________________SYSCTL_L3_________________ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MS_WH_DOWN
// vol v ctl v
-#define _________________SYSCTL_R1_________________ KC_MUTE , KC_HOME , KC_UP , KC_END , PV_LOCK
-#define _________________SYSCTL_R2_________________ KC_VOLU , KC_LEFT , KC_DOWN , KC_RGHT /* < arrows */ , KC_SLEP
-#define _________________SYSCTL_R3_________________ KC_VOLD , KC_MPRV , KC_MPLY , KC_MNXT /* < music */ , KC_PWR
+#define _________________SYSCTL_R1_________________ KC_MUTE, KC_HOME, KC_UP, KC_END, PV_LOCK
+#define _________________SYSCTL_R2_________________ KC_VOLU, KC_LEFT, KC_DOWN, KC_RGHT /* < arrows */, KC_SLEP
+#define _________________SYSCTL_R3_________________ KC_VOLD, KC_MPRV, KC_MPLY, KC_MNXT /* < music */, KC_PWR
// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
-// |XXXXX|XXXXX|XXXXX|XXXXX|XXXXX| |XXXXX|XXXXX|XXXXX|XXXXX|XXXXX|
+// |GAME |CRPLX|XXXXX|XXXXX|XXXXX| |XXXXX|XXXXX|XXXXX|XXXXX|XXXXX|
// ,-----+-----+-----x-----x-----, ,-----x-----x-----+-----+-----,
// |XXXXX|XXXXX|XXXXX|XXXXX|XXXXX| |XXXXX|VERSN|MAKE |FLASH|XXXXX|
// ,-----+-----+-----x-----x-----, ,-----x-----x-----+-----+-----,
// |XXXXX|XXXXX|XXXXX|XXXXX|XXXXX| |XXXXX|XXXXX|XXXXX|XXXXX|XXXXX|
// ,-----+-----+-----+-----+-----, ,-----+-----+-----+-----+-----,
-#define __________________KBCTL_L1_________________ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
-#define __________________KBCTL_L2_________________ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
-#define __________________KBCTL_L3_________________ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+#define __________________KBCTL_L1_________________ PV_SSNC, PV_SCIN, PV_TEST, XXXXXXX, XXXXXXX
+#define __________________KBCTL_L2_________________ RGB_TOG, RGB_VAI, XXXXXXX, XXXXXXX, XXXXXXX
+#define __________________KBCTL_L3_________________ RGB_MOD, RGB_VAD, XXXXXXX, XXXXXXX, XXXXXXX
-#define __________________KBCTL_R1_________________ XXXXXXX, XXXXXXX, XXXXXXX, PV_KTMR, XXXXXXX
-#define __________________KBCTL_R2_________________ XXXXXXX, PV_VRSN, PV_MAKE, PV_FLSH, XXXXXXX
-#define __________________KBCTL_R3_________________ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+#define __________________KBCTL_R1_________________ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+#define __________________KBCTL_R2_________________ XXXXXXX, PV_VRSN, PV_MAKE, PV_FLSH, XXXXXXX
+#define __________________KBCTL_R3_________________ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
-// we need wrappers in order for these definitions, because they need to be expanded before being used as arguments to the LAYOUT_xxx macro
-#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__)
-#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
+// We need wrappers in order for these definitions, because they need to be expanded before being used as arguments to the LAYOUT_xxx macro.
+#define LAYOUT_ergodox_pretty_wrapper(...) LAYOUT_ergodox_pretty(__VA_ARGS__)
+#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
-
-// extra stuff that might be needed
-void keyboard_post_init_user_local(void);
-uint32_t layer_state_set_user_local(uint32_t state);
+// Extra stuff that might be needed.
+void keyboard_post_init_user_keymap(void);
+uint32_t layer_state_set_user_keymap(uint32_t state);
diff --git a/users/pvinis/rules.mk b/users/pvinis/rules.mk
index da10cc74371..f6f09e54d9c 100644
--- a/users/pvinis/rules.mk
+++ b/users/pvinis/rules.mk
@@ -1,15 +1,19 @@
-# add userspace file
-SRC += pvinis.c
+SRC += pvinis.c # add userspace file
-AUDIO_ENABLE = no # piezo speaker sounds
-RGBLIGHT_ENABLE = no # rgb leds underlight
-TAP_DANCE_ENABLE = yes
-BACKLIGHT_ENABLE = no # leds under keycaps
-#MOUSEKEY_ENABLE = no
-#SLEEP_LED_ENABLE = no # no led blinking while sleeping
-#NKRO_ENABLE = yes
-# make firmware smaller
-LINK_TIME_OPTIMIZATION_ENABLE = yes
-CONSOLE_ENABLE = no
-COMMAND_ENABLE = no
+## Use the stuff below on the keyboard keymaps, not here.
+## If they are used here, they will replace the keymap's rules, since this file is eval'd later.
+
+# TAP_DANCE_ENABLE = yes
+# AUDIO_ENABLE = yes # piezo speaker sounds
+# RGBLIGHT_ENABLE = yes # rgb leds underlight
+# BACKLIGHT_ENABLE = no # leds under keycaps
+# MOUSEKEY_ENABLE = yes
+# LEEP_LED_ENABLE = no # no led blinking while sleeping
+# KRO_ENABLE = yes
+
+## Some extra stuff to make firmware smaller.
+
+# LINK_TIME_OPTIMIZATION_ENABLE = yes
+# CONSOLE_ENABLE = no
+# COMMAND_ENABLE = no
diff --git a/users/scheiklp/koy_keys_on_quertz_de_latin1.h b/users/scheiklp/koy_keys_on_quertz_de_latin1.h
new file mode 100644
index 00000000000..4f39b7631cd
--- /dev/null
+++ b/users/scheiklp/koy_keys_on_quertz_de_latin1.h
@@ -0,0 +1,63 @@
+#pragma once
+
+/*
+This file defines the desierd KOY keys if you use a software (operating sysetm)
+configured for a QUERTZ layout (de-latin1).
+These chars can be created by using ALTGR on linux and a few of them on windows
+with a German de-latin1 layout (depending on desktop environment and/or
+application).
+ ′¹²³¼½¬{[]}\¸
+ @ł€¶ŧ←↓→øþ¨~
+ æſðđŋħ̣ĸł˝^’
+ |»«¢„“”µ·…–
+Additionally, there are some common chars that we dit not yet define:
+ §
+*/
+
+
+// NQN key definitions in no particular order
+#define N_LT KC_NONUS_BSLASH
+#define N_HS KC_NONUS_HASH
+#define N_DOTS RALT(KC_DOT) // …
+#define N_USC LSFT(KC_SLASH) // _
+#define N_LSQBR RALT(KC_8) // [
+#define N_RSQBR RALT(KC_9) // ]
+#define N_CIRC KC_GRAVE // ^
+#define N_EXKL LSFT(KC_1) // !
+#define N_GT LSFT(KC_NONUS_BSLASH) // >
+#define N_EQ LSFT(KC_0) // =
+#define N_AMP LSFT(KC_6) // &
+#define N_BSLS RALT(KC_MINS) // \ backslash
+#define N_SLSH LSFT(KC_7) // /
+#define N_LCUBR RALT(KC_7) // {
+#define N_RCUBR RALT(KC_0) // }
+#define N_ASTR LSFT(KC_RBRC) // *
+#define N_QUES LSFT(KC_MINS) // ?
+#define N_LPARN LSFT(KC_8) // (
+#define N_RPARN LSFT(KC_9) // )
+#define N_MINS KC_SLASH // -
+#define N_COLN LSFT(KC_DOT) // :
+#define N_HASH KC_BSLASH // #
+#define N_DLR LSFT(KC_4) // $
+#define N_PIPE RALT(KC_NONUS_BSLASH) // |
+#define N_TILD RALT(KC_RBRC) // ~
+#define N_GRAVE LSFT(KC_EQUAL) // `
+#define N_PLUS KC_RBRC // +
+#define N_PERC LSFT(KC_5) // %
+#define N_QUOT LSFT(KC_2) // "
+#define N_SING LSFT(KC_BSLASH) // '
+#define N_SEMI LSFT(KC_COMM) // ;
+#define N_EURO RALT(KC_E) // €
+#define N_AT RALT(KC_Q) // @
+#define N_Z KC_Y
+#define N_Y KC_Z
+#define N_AE KC_QUOTE // ä
+#define N_OE KC_SCOLON // ö
+#define N_UE KC_LBRACKET // ü
+#define N_MU RALT(KC_M) // µ
+#define N_SS KC_MINS // ß
+#define N_DEGRE LSFT(KC_GRAVE) // °
+#define N_PASTE LCTL(KC_V) // CTRL+V
+#define N_COPY LCTL(KC_C) // CTRL+C
+#define N_CUT LCTL(KC_X) // CTRL+X
+#define N_UNDO LCTL(N_Z) // CTRL+Z
diff --git a/users/sigul/.gitignore b/users/sigul/.gitignore
new file mode 100644
index 00000000000..12165fdbd74
--- /dev/null
+++ b/users/sigul/.gitignore
@@ -0,0 +1,2 @@
+secrets.h
+secrets.c
diff --git a/users/sigul/README.md b/users/sigul/README.md
new file mode 100644
index 00000000000..a8f705e1545
--- /dev/null
+++ b/users/sigul/README.md
@@ -0,0 +1,17 @@
+Copyright 2020 Silvio Gulizia desk@silviogulizia.com @sigul
+
+Userspace by Silvio Gulizia
+Contains code for ANSI / Italian layouts.
+
+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 .
diff --git a/users/sigul/config.h b/users/sigul/config.h
new file mode 100644
index 00000000000..dc0cd0f0706
--- /dev/null
+++ b/users/sigul/config.h
@@ -0,0 +1,21 @@
+#pragma once
+
+// My custom configurations
+#define TAPPING_TOGGLE 3 // enable tapping toggle, used to lock level with a custom keycode defined by TT (in my case RAISE, LOWER and MOUSE)
+#define USB_MAX_POWER_CONSUMPTION 100 // required to be able to use the keyboard with iPad
+
+// Settings for using the keybaord as a mouse
+#define MOUSEKEY_DELAY 30
+// Delay between pressing a movement key and cursor movement
+#define MOUSEKEY_INTERVAL 16
+// Time between cursor movements
+#define MOUSEKEY_MAX_SPEED 3
+// Maximum cursor speed at which acceleration stops
+#define MOUSEKEY_TIME_TO_MAX 40
+// Time until maximum cursor speed is reached
+#define MOUSEKEY_WHEEL_MAX_SPEED 0
+// Maximum number of scroll steps per scroll action
+#define MOUSEKEY_WHEEL_TIME_TO_MAX 0
+// Time until maximum scroll speed is reached
+
+#define MACRO_TIMER 5
diff --git a/users/sigul/rules.mk b/users/sigul/rules.mk
new file mode 100644
index 00000000000..e272957d0ac
--- /dev/null
+++ b/users/sigul/rules.mk
@@ -0,0 +1,8 @@
+SRC += sigul.c
+MOUSEKEY_ENABLE = yes
+
+ifneq ($(strip $(NO_SECRETS)), yes)
+ ifneq ("$(wildcard $(USER_PATH)/secrets.c)","")
+ SRC += secrets.c
+ endif
+endif
diff --git a/users/sigul/sigul.c b/users/sigul/sigul.c
new file mode 100644
index 00000000000..0995ca7360d
--- /dev/null
+++ b/users/sigul/sigul.c
@@ -0,0 +1,100 @@
+#include "keymap_italian_osx_ansi.h"
+#include "sigul.h"
+
+__attribute__ ((weak))
+layer_state_t layer_state_set_keymap (layer_state_t state) {
+ return state;
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+}
+
+__attribute__ ((weak))
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
+ return true;
+}
+
+__attribute__ ((weak))
+bool process_record_secrets(uint16_t keycode, keyrecord_t *record) {
+ return true;
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+
+ case IT_SCCL:
+ if (record->event.pressed){
+ if (get_mods() & MOD_BIT(KC_LSHIFT) || get_mods() & MOD_BIT(KC_RSHIFT)){
+ register_code16(IT_COLN);
+ } else {
+ register_code16(IT_SCLN);
+ }
+ } else {
+ unregister_code16(IT_COLN);
+ unregister_code16(IT_SCLN);
+ }
+ return false;
+ break;
+
+ case IT_APDQ:
+ if (record->event.pressed){
+ if (get_mods() & MOD_BIT(KC_LSHIFT) || get_mods() & MOD_BIT(KC_RSHIFT)){
+ register_code16(IT_DQOT);
+ } else {
+ register_code16(IT_APOS);
+ }
+ } else {
+ unregister_code16(IT_DQOT);
+ unregister_code16(IT_APOS);
+ }
+ return false;
+ break;
+
+ case IT_CMLS:
+ if (record->event.pressed){
+ if (get_mods() & MOD_BIT(KC_LSHIFT) || get_mods() & MOD_BIT(KC_RSHIFT)){
+ unregister_code16(KC_LSFT);
+ register_code16(IT_LESS);
+ register_code16(KC_LSFT);
+ } else {
+ register_code16(IT_COMM);
+ }
+ } else {
+ unregister_code16(IT_LESS);
+ unregister_code16(IT_COMM);
+ }
+ return false;
+ break;
+
+ case IT_DTMR:
+ if (record->event.pressed){
+ if (get_mods() & MOD_BIT(KC_LSHIFT) || get_mods() & MOD_BIT(KC_RSHIFT)){
+ register_code16(IT_MORE);
+ } else {
+ register_code16(IT_DOT);
+ }
+ } else {
+ unregister_code16(IT_MORE);
+ unregister_code16(IT_DOT);
+ }
+ return false;
+ break;
+
+ case IT_SLQS:
+ if (record->event.pressed){
+ if (get_mods() & MOD_BIT(KC_LSHIFT) || get_mods() & MOD_BIT(KC_RSHIFT)){
+ register_code16(IT_QST);
+ } else {
+ register_code16(IT_SLSH);
+ }
+ } else {
+ unregister_code16(IT_QST);
+ unregister_code16(IT_SLSH);
+ }
+ return false;
+ break;
+ }
+ return process_record_keymap(keycode, record) && process_record_secrets(keycode, record);
+};
+
diff --git a/users/sigul/sigul.h b/users/sigul/sigul.h
new file mode 100644
index 00000000000..3182ab026a7
--- /dev/null
+++ b/users/sigul/sigul.h
@@ -0,0 +1,41 @@
+#pragma once
+
+#include "quantum.h"
+
+enum userspace_layers {
+ _QWERTY,
+ _LOWER, //symbols
+ _RAISE, //numbers
+ _ADJUST, //system
+ _NUMPAD,
+ _FN,
+ _MOUSE
+};
+
+enum userspace_custom_keycodes {
+ QWERTY = SAFE_RANGE,
+ // custom keycodes for an Italian ANSI layout with accented vowels
+ IT_CMLS, // IT_COMM and IT_LESS when combined with shift
+ IT_DTMR, // IT_DOT and IT_MORE when combined with shift
+ IT_SLQS, // IT_SLSH and IT_QST when combined with shift
+ IT_APDQ, // IT_APO and IT_DQOT when combined with shift
+ IT_SCCL, // IT_SMCL and IT_COLN when combined with shift
+ SECRET0,
+ SECRET1,
+ SECRET2,
+ SECRET3,
+ SECRET4,
+ NEW_SAFE_RANGE // start new keyboard-level declarations with NEW_SAFE_RANGE
+};
+
+// Defining Layer Keycodes
+#define QWERTY DF(_QWERTY)
+// For LOWER and RAISE I use TT instead of MO to be able to lock those layer tapping three times the key (TAPPING_TOGGLE 3 has been added in sigul.h)
+#define LOWER TT(_LOWER)
+#define RAISE TT(_RAISE)
+#define NUMPAD TG(_NUMPAD)
+#define FN MO(_FN)
+#define TABFN LT(_FN, KC_TAB)
+#define ESCFN LT(_FN, KC_ESC)
+#define MS_B LT(_MOUSE, IT_B)
+
diff --git a/users/spidey3/config.h b/users/spidey3/config.h
new file mode 100644
index 00000000000..9da7f553025
--- /dev/null
+++ b/users/spidey3/config.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#define LED_DISABLE_WHEN_USB_SUSPENDED true
+#define RGB_DISABLE_WHEN_USB_SUSPENDED true
+#define RGBLIGHT_LAYERS
diff --git a/users/spidey3/init.c b/users/spidey3/init.c
new file mode 100644
index 00000000000..b9239460934
--- /dev/null
+++ b/users/spidey3/init.c
@@ -0,0 +1,30 @@
+#include "spidey3.h"
+
+void keyboard_post_init_user(void) {
+ print("keyboard_post_init_user\n");
+ uprintf("\tdebug_enable=%u\n", debug_enable);
+#ifdef RGBLIGHT_ENABLE
+ keyboard_post_init_user_rgb();
+#endif
+}
+
+void eeconfig_init_user(void) {
+ print("eeconfig_init_user\n");
+ set_single_persistent_default_layer(_BASE);
+#ifdef UNICODEMAP_ENABLE
+ eeconfig_init_user_unicode();
+#endif
+
+#ifdef RGBLIGHT_ENABLE
+ eeconfig_init_user_rgb();
+#endif
+}
+
+void shutdown_user() {
+#ifdef RGBLIGHT_ENABLE
+ clear_rgb_layers();
+ rgblight_enable();
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
+ rgblight_sethsv_noeeprom(HSV_RED);
+#endif
+}
diff --git a/users/spidey3/layer_rgb.c b/users/spidey3/layer_rgb.c
new file mode 100644
index 00000000000..75e66384e27
--- /dev/null
+++ b/users/spidey3/layer_rgb.c
@@ -0,0 +1,131 @@
+#include QMK_KEYBOARD_H
+
+#include "spidey3.h"
+#include "velocikey.h"
+
+uint32_t rgb_mode;
+uint16_t rgb_hue;
+uint8_t rgb_sat;
+uint8_t rgb_val;
+bool rgb_saved = 0;
+
+void spidey_swirl(void) {
+ dprint("Setting Spidey Swirl!\n");
+ rgblight_enable();
+ rgblight_mode(RGBLIGHT_MODE_RAINBOW_SWIRL);
+ rgblight_sethsv(213, 255, 128);
+#ifdef VELOCIKEY_ENABLE
+ if (!velocikey_enabled())
+ velocikey_toggle();
+#endif
+}
+
+void eeconfig_init_user_rgb(void)
+{
+ spidey_swirl();
+}
+
+const rgblight_segment_t PROGMEM _capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS( {0, 2, HSV_AZURE}, {14, 2, HSV_AZURE} );
+const rgblight_segment_t PROGMEM _layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS( {7, 1, HSV_PURPLE} );
+const rgblight_segment_t PROGMEM _layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS( {10, 3, HSV_MAGENTA} );
+const rgblight_segment_t PROGMEM _layer3_layer[] = RGBLIGHT_LAYER_SEGMENTS( {10, 1, HSV_GREEN} );
+const rgblight_segment_t PROGMEM _yes_layer[] = RGBLIGHT_LAYER_SEGMENTS( {9, 6, HSV_GREEN} );
+const rgblight_segment_t PROGMEM _no_layer[] = RGBLIGHT_LAYER_SEGMENTS( {9, 6, HSV_RED} );
+
+// Now define the array of layers. Later layers take precedence
+const rgblight_segment_t* const PROGMEM _rgb_layers[] =
+ RGBLIGHT_LAYERS_LIST( _capslock_layer, _layer1_layer, _layer2_layer, _layer3_layer, _yes_layer, _no_layer );
+const uint8_t PROGMEM _n_rgb_layers = sizeof(_rgb_layers) / sizeof(_rgb_layers[0]) - 1;
+
+void clear_rgb_layers() {
+ for (uint8_t i=0; i<_n_rgb_layers; i++) {
+ rgblight_set_layer_state(i, false);
+ }
+}
+
+void do_rgb_layers(layer_state_t state, uint8_t start, uint8_t end) {
+ dprint("do_rgb_layers()\n");
+ for (uint8_t i=start; ievent.pressed;
+
+ switch (keycode) {
+ case SPI_GLO:
+ if (pressed) {
+ spidey_swirl();
+ }
+ return false;
+
+ // Acks follow...
+ case DEBUG:
+ rgb_layer_ack(debug_enable, pressed);
+ return false;
+
+ case SPI_LNX:
+ case SPI_OSX:
+ case SPI_WIN:
+ rgb_layer_ack(true, pressed);
+ return false;
+
+ // Tricky!
+ // For these, on press the toggle hasn't happened yet,
+ // so we need a little logic to invert, assuming that
+ // on key press the flag WILL be toggled, and on key
+ // release the flag has already been toggled.
+
+#ifdef VELOCIKEY_ENABLE
+ case VLK_TOG:
+ rgb_layer_ack(pressed != velocikey_enabled(), pressed);
+ return true;
+#endif
+
+#ifdef NKRO_ENABLE
+ case NK_TOGG:
+ case NK_ON:
+ case NK_OFF:
+ rgb_layer_ack(pressed != keymap_config.nkro, pressed);
+ return true;
+#endif
+ }
+
+ return true;
+}
diff --git a/users/spidey3/readme.md b/users/spidey3/readme.md
new file mode 100644
index 00000000000..409d6e5f81f
--- /dev/null
+++ b/users/spidey3/readme.md
@@ -0,0 +1,14 @@
+Copyright 2020 Joshua Diamond josh@windowoffire.com @spidey3
+
+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 .
diff --git a/users/spidey3/rules.mk b/users/spidey3/rules.mk
new file mode 100644
index 00000000000..0a77d2bfc76
--- /dev/null
+++ b/users/spidey3/rules.mk
@@ -0,0 +1,10 @@
+
+SRC += init.c
+SRC += spidey3.c
+
+ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
+ SRC += layer_rgb.c
+endif
+ifeq ($(strip $(UNICODEMAP_ENABLE)), yes)
+ SRC += unicode.c
+endif
diff --git a/users/spidey3/spidey3.c b/users/spidey3/spidey3.c
new file mode 100644
index 00000000000..8be99dea046
--- /dev/null
+++ b/users/spidey3/spidey3.c
@@ -0,0 +1,80 @@
+#include QMK_KEYBOARD_H
+
+#include "spidey3.h"
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+
+// If console is enabled, it will print the matrix position and status of each key pressed
+// dprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
+
+ if (record->event.pressed) {
+ switch (keycode) {
+#ifndef NO_DEBUG
+ // Re-implement this here, but fix the persistence!
+ case DEBUG:
+ debug_enable ^= 1;
+ if (debug_enable) {
+ print("DEBUG: enabled.\n");
+ } else {
+ print("DEBUG: disabled.\n");
+ }
+ eeconfig_update_debug(debug_config.raw);
+#endif
+ break;
+ case SPI_LNX:
+ dprint("SPI_LNX\n");
+ set_single_persistent_default_layer(_BASE);
+ layer_off(_OSX);
+#if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE)
+ set_unicode_input_mode(UC_LNX);
+#endif
+ break;
+ case SPI_OSX:
+ dprint("SPI_OSX\n");
+ set_single_persistent_default_layer(_OSX);
+#if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE)
+ set_unicode_input_mode(UC_OSX);
+#endif
+ break;
+ case SPI_WIN:
+ dprint("SPI_WIN\n");
+ set_single_persistent_default_layer(_BASE);
+ layer_off(_OSX);
+#if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE)
+ set_unicode_input_mode(UC_WINC);
+#endif
+ break;
+ }
+ }
+
+#ifdef RGBLIGHT_ENABLE
+ bool res = process_record_user_rgb(keycode, record);
+ if (res) return true;
+#endif
+
+ return false;
+}
+
+layer_state_t default_layer_state_set_user(layer_state_t state) {
+#ifdef RGBLIGHT_ENABLE
+ return default_layer_state_set_user_rgb(state);
+#else
+ return state;
+#endif
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+#ifdef RGBLIGHT_ENABLE
+ return layer_state_set_user_rgb(state);
+#else
+ return state;
+#endif
+}
+
+bool led_update_user(led_t led_state) {
+#ifdef RGBLIGHT_ENABLE
+ return led_update_user_rgb(led_state);
+#else
+ return true;
+#endif
+}
diff --git a/users/spidey3/spidey3.h b/users/spidey3/spidey3.h
new file mode 100644
index 00000000000..224858391dc
--- /dev/null
+++ b/users/spidey3/spidey3.h
@@ -0,0 +1,43 @@
+#pragma once
+
+#include QMK_KEYBOARD_H
+
+#ifdef UNICODEMAP_ENABLE
+#include "unicode.h"
+#endif
+
+enum userspace_layers {
+ _BASE = 0,
+ _OSX,
+ _NUMPAD,
+ _FN,
+};
+
+enum rgb_base_layer {
+ RGB_LAYER_BASE_DEFAULT = _BASE,
+ RGB_LAYER_BASE_REGULAR = _NUMPAD,
+ RGB_LAYER_BASE_ACKS = _FN+1,
+};
+
+enum custom_keycodes {
+ SPI_GLO = SAFE_RANGE,
+ SPI_LNX,
+ SPI_OSX,
+ SPI_WIN,
+};
+
+#ifdef RGBLIGHT_ENABLE
+void eeconfig_init_user_rgb(void);
+void matrix_init_user_rgb(void);
+void keyboard_post_init_user_rgb(void);
+bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record);
+layer_state_t layer_state_set_user_rgb(layer_state_t state);
+layer_state_t default_layer_state_set_user_rgb(layer_state_t state);
+bool led_update_user_rgb(led_t led_state);
+void clear_rgb_layers(void);
+#endif
+
+#ifdef UNICODEMAP_ENABLE
+void eeconfig_init_user_unicode(void);
+#endif
+
diff --git a/users/spidey3/unicode.c b/users/spidey3/unicode.c
new file mode 100644
index 00000000000..41ceef83756
--- /dev/null
+++ b/users/spidey3/unicode.c
@@ -0,0 +1,19 @@
+
+#include "unicode.h"
+
+const uint32_t PROGMEM unicode_map[] = {
+ [BUL1] = 0x2022, // •
+ [BUL2] = 0x25E6, // ◦
+ [LARR] = 0x2190, // ←
+ [RARR] = 0x2192, // →
+ [ENDASH] = 0x2013, // –
+ [EMDASH] = 0x2014, // —
+};
+
+void eeconfig_init_user_unicode(void)
+{
+ // Default to Linux style
+ set_unicode_input_mode(UC_LNX);
+}
+
+
diff --git a/users/spidey3/unicode.h b/users/spidey3/unicode.h
new file mode 100644
index 00000000000..72a91e8a806
--- /dev/null
+++ b/users/spidey3/unicode.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include QMK_KEYBOARD_H
+
+#ifdef UNICODEMAP_ENABLE
+
+enum unicode_names {
+ BUL1,
+ BUL2,
+ LARR,
+ RARR,
+ ENDASH,
+ EMDASH,
+};
+
+#define X_BUL (XP(BUL1, BUL2))
+#define X_DASH (XP(ENDASH, EMDASH))
+
+#endif
diff --git a/users/stanrc85/config.h b/users/stanrc85/config.h
index 42306727ceb..fba488e1c3f 100644
--- a/users/stanrc85/config.h
+++ b/users/stanrc85/config.h
@@ -4,6 +4,7 @@
#define RETRO_TAPPING
#ifdef RGBLIGHT_ENABLE
+ #define RGBLIGHT_LAYERS
#define RGBLIGHT_LIMIT_VAL 175
#define RGBLIGHT_SLEEP
#endif
diff --git a/users/stanrc85/rgblight_layers.c b/users/stanrc85/rgblight_layers.c
new file mode 100644
index 00000000000..0363e358b09
--- /dev/null
+++ b/users/stanrc85/rgblight_layers.c
@@ -0,0 +1,47 @@
+#include "stanrc85.h"
+
+const rgblight_segment_t PROGMEM my_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {3, 2, HSV_RED},
+ {10, 2, HSV_RED}
+);
+
+const rgblight_segment_t PROGMEM my_layer1_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {3, 1, HSV_GREEN},
+ {11, 1, HSV_GREEN}
+);
+
+const rgblight_segment_t PROGMEM my_layer2_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {3, 1, HSV_BLUE},
+ {11, 1, HSV_BLUE}
+);
+
+const rgblight_segment_t PROGMEM my_layer3_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {3, 1, HSV_WHITE},
+ {11, 1, HSV_WHITE}
+);
+
+// Now define the array of layers. Later layers take precedence
+const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
+ my_capslock_layer,
+ my_layer1_layer,
+ my_layer2_layer,
+ my_layer3_layer
+);
+
+void keyboard_post_init_user(void) {
+ // Enable the LED layers
+ rgblight_layers = my_rgb_layers;
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ // Both layers will light up if both kb layers are active
+ rgblight_set_layer_state(1, layer_state_cmp(state, 1));
+ rgblight_set_layer_state(2, layer_state_cmp(state, 2));
+ rgblight_set_layer_state(3, layer_state_cmp(state, 3));
+ return state;
+}
+
+bool led_update_user(led_t led_state) {
+ rgblight_set_layer_state(0, led_state.caps_lock);
+ return true;
+}
\ No newline at end of file
diff --git a/users/stanrc85/rules.mk b/users/stanrc85/rules.mk
index c454058bd5b..d544b2d95a8 100644
--- a/users/stanrc85/rules.mk
+++ b/users/stanrc85/rules.mk
@@ -10,16 +10,18 @@ NKRO_ENABLE = no
SRC += stanrc85.c
-ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
- # Include my fancy rgb functions source here
- SRC += layer_rgb.c
-endif
-
ifeq ($(strip $(KEYBOARD)), 1upkeyboards/1up60hse)
+ SRC += layer_rgb.c
VIA_ENABLE = yes
LTO_ENABLE = yes
endif
ifeq ($(strip $(KEYBOARD)), dz60)
+ SRC += layer_rgb.c
VIA_ENABLE = yes
LTO_ENABLE = yes
+endif
+ifeq ($(strip $(KEYBOARD)), projectkb/alice/rev1)
+ SRC += rgblight_layers.c
+ VIA_ENABLE = yes
+ LTO_ENABLE = no
endif
\ No newline at end of file
diff --git a/users/stanrc85/stanrc85.c b/users/stanrc85/stanrc85.c
index 6ea0e33bc1a..c1aaad1a1ae 100644
--- a/users/stanrc85/stanrc85.c
+++ b/users/stanrc85/stanrc85.c
@@ -56,12 +56,12 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (!record->event.pressed) {
uint8_t mods = get_mods();
clear_mods();
- send_string_with_delay_P(PSTR("qmk compile -kb " QMK_KEYBOARD " -km " QMK_KEYMAP "\n"), 10); //New way
if (mods & MOD_MASK_SHIFT) {
- send_string(SS_LGUI());
- send_string("qmk toolbox\n");
+ send_string_with_delay_P(PSTR("qmk flash -kb " QMK_KEYBOARD " -km " QMK_KEYMAP "\n"), 10); //New way
reset_keyboard();
}
+ else
+ send_string_with_delay_P(PSTR("qmk compile -kb " QMK_KEYBOARD " -km " QMK_KEYMAP "\n"), 10); //New way
set_mods(mods);
}
break;
diff --git a/users/stanrc85/stanrc85.h b/users/stanrc85/stanrc85.h
index ceb7167e103..0007e0898cc 100644
--- a/users/stanrc85/stanrc85.h
+++ b/users/stanrc85/stanrc85.h
@@ -22,6 +22,7 @@ enum my_layers {
#define CA_SCLN LCA(KC_SCLN)
#define KC_CTLE LCTL_T(KC_ESC)
#define LT_SPCF LT(_FN1_60, KC_SPC)
+#define LT_BPCF LT(_FN1_60, KC_BSPC)
#define TD_TESC TD(TD_ESC)
#define TD_TWIN TD(TD_WIN)
#define TD_TCTL TD(TD_RCTL)
diff --git a/users/vosechu/vosechu.h b/users/vosechu/vosechu.h
index 5cd2217ea19..3e65f8c9556 100644
--- a/users/vosechu/vosechu.h
+++ b/users/vosechu/vosechu.h
@@ -10,8 +10,13 @@ enum userspace_custom_layers {
RSE,
LWR,
LFT,
- MOUSE
+ MOUSE,
+ TT1,
+ TT2,
+ TT3,
+ T23X
};
+#define BASE DV
enum userspace_custom_keycodes {
PAWFIVE = SAFE_RANGE,
@@ -34,9 +39,14 @@ enum userspace_custom_keycodes {
// == Macro keys for commonly used apps
// -- Slack
// Move one conversation up/down
+#define SLACKTB LGUI(LSFT(KC_T))
#define SLACKUP LALT(LSFT(KC_UP))
#define SLACKDN LALT(LSFT(KC_DOWN))
+// -- 1password
+#define PSWD LCTL(KC_BSLS)
+#define PSWD_ALT LCTL(LALT(KC_BSLS))
+
// -- Browser and OS X
// Activate one tab left/right
#define TAB_LFT LGUI(LSFT(KC_LBRC))
@@ -52,6 +62,14 @@ enum userspace_custom_keycodes {
// Make window fill the whole monitor
#define SCR_FUL HYPR(KC_F)
+// -- Windows variants of browser commanads
+// Activate one tab left/right
+#define WTABLFT LCTL(LSFT(KC_TAB))
+#define WTABRGT LCTL(KC_TAB)
+// Go back/forward in history
+#define WBWSRBK LALT(KC_LEFT)
+#define WBWSRFW LALT(KC_RGHT)
+
// == Extended alpha layer toggles
// -- Dvorak
// Pressing U opens up the LWR layer (numpad)
diff --git a/users/xulkal/config.h b/users/xulkal/config.h
index 4b05ea4ec4d..e000b97acdb 100644
--- a/users/xulkal/config.h
+++ b/users/xulkal/config.h
@@ -17,9 +17,10 @@
#undef RGB_MATRIX_KEYRELEASES
#undef RGB_MATRIX_FRAMEBUFFER_EFFECTS
#else
-#define RGB_MATRIX_KEYPRESSES
-#undef RGB_MATRIX_KEYRELEASES
-#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+# define RGB_MATRIX_KEYPRESSES
+# undef RGB_MATRIX_KEYRELEASES
+# define RGB_MATRIX_FRAMEBUFFER_EFFECTS
+# define ENABLE_TYPING_HEATMAP_DISTANCE_CHECK
#endif
// No need for the single versions when multi performance isn't a problem =D
diff --git a/users/xulkal/layouts.h b/users/xulkal/layouts.h
index d4b7084186a..63e73c32e61 100644
--- a/users/xulkal/layouts.h
+++ b/users/xulkal/layouts.h
@@ -68,7 +68,7 @@
/* LOWER Layout
* ,-----------------------------------------. ,-----------------------------------------.
- * | |RGBMD |RGBRMD|RGBTOG| | | | | | | | | |
+ * | |RGBMD |RGBRMD|RGBTOG| | | | | | | SLCK | NLCK | DEL |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | SPDI | SAI | VAI | HUI | RESET| | | | | 7 | 8 | 9 | |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
diff --git a/users/xulkal/process_records.c b/users/xulkal/process_records.c
index ca2376145df..b6a4e5cfa18 100644
--- a/users/xulkal/process_records.c
+++ b/users/xulkal/process_records.c
@@ -37,7 +37,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record)
reset_keyboard();
}
return false;
-#ifdef RGB_MATRIX_TOG_LAYERS
+#if defined(RGB_MATRIX_TOG_LAYERS) && defined(RGB_ENABLE)
case RGB_TOG:
if (record->event.pressed) {
rgb_matrix_increase_flags();
diff --git a/users/yanfali/rules.mk b/users/yanfali/rules.mk
index a4f1092d0c7..456d3bf3203 100644
--- a/users/yanfali/rules.mk
+++ b/users/yanfali/rules.mk
@@ -25,3 +25,7 @@ endif
ifeq ($(strip $(KEYBOARD)), kbdfans/kbd75/rev1)
COMMAND_ENABLE = no
endif
+
+ifeq ($(strip $(KEYBOARD)), ai03/polaris)
+ RGBLIGHT_ENABLE = no
+endif
diff --git a/users/yanfali_wkl b/users/yanfali_wkl
new file mode 120000
index 00000000000..491d08e4338
--- /dev/null
+++ b/users/yanfali_wkl
@@ -0,0 +1 @@
+yanfali
\ No newline at end of file
diff --git a/util/1-setup-path-win.bat b/util/1-setup-path-win.bat
deleted file mode 100644
index 699aee21521..00000000000
--- a/util/1-setup-path-win.bat
+++ /dev/null
@@ -1,66 +0,0 @@
-@SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
-@ECHO OFF
-SET CMDLINERUNSTR=%SystemRoot%\system32\cmd.exe
-
-DEL script1.log > NUL 2>&1
-DEL add-paths.log > NUL 2>&1
-DEL add-paths-detail.log > NUL 2>&1
-DEL UPDATE > NUL 2>&1
-
-ELEVATE -wait add-paths.bat >> script1.log 2>&1
-
-IF ERRORLEVEL 1 (
- ECHO You denied admin access. Rerun the script, and be sure to press the yes button this time.
-) ELSE (
- TYPE add-paths.log 2> NUL
-)
-ECHO.
-
-:: Branch to UpdateEnv if we need to update
-IF EXIST UPDATE (
- DEL UPDATE
- GOTO UpdateEnv
-)
-
-GOTO ExitBatch
-
-:: -----------------------------------------------------------------------------
-
-:UpdateEnv
-ECHO Making updated PATH go live . . .
-REG delete HKCU\Environment /F /V TEMPVAR > NUL 2>&1
-setx TEMPVAR 1 > NUL
-REG delete HKCU\Environment /F /V TEMPVAR > NUL 2>&1
-IF NOT !cmdcmdline! == !CMDLINERUNSTR! (CALL :KillExplorer)
-GOTO ExitBatch
-
-:: -----------------------------------------------------------------------------
-
-:ExitBatch
-ENDLOCAL
-PAUSE
-EXIT /b
-
-:: -----------------------------------------------------------------------------
-
-:KillExplorer
-ECHO.
-ECHO.
-ECHO Your desktop will be restarted.
-ECHO.
-ECHO All file explorer windows except for the one you launched this script from WILL BE CLOSED.
-ECHO.
-ECHO Press enter when ready, or close this window if you would rather do a full restart of your computer at a later time.
-ECHO.
-PAUSE
-ping -n 5 127.0.0.1 > NUL 2>&1
-ECHO Killing process Explorer.exe. . .
-ECHO.
-taskkill /f /im explorer.exe > NUL
-ECHO.
-ECHO Your desktop is now loading. . .
-ECHO.
-ping -n 5 127.0.0.1 > NUL 2>&1
-START explorer.exe
-START explorer.exe %CD%
-EXIT /b
\ No newline at end of file
diff --git a/util/2-setup-environment-win.bat b/util/2-setup-environment-win.bat
deleted file mode 100644
index 22a2e17f70f..00000000000
--- a/util/2-setup-environment-win.bat
+++ /dev/null
@@ -1,72 +0,0 @@
-@SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
-@ECHO OFF
-
-CD %~dp0
-
-SET STARTINGDIR=%CD%
-echo %STARTINGDIR%
-
-:: Check for admin privilages
-SETX /M test test > nul 2>&1
-IF NOT ["%ERRORLEVEL%"]==["0"] (
- ELEVATE -wait 2-setup-environment-win.bat & goto :EOF
-)
-
-DEL %STARTINGDIR%\environment-setup.log
-
-:: Make sure path to MinGW exists - if so, CD to it
-SET MINGWPATH="C:\MinGW\bin"
-IF NOT EXIST !MINGWPATH! (ECHO Path not found: %MINGWPATH%. Did you install MinGW to the default location? && GOTO ExitBatch)
-CD /D %MINGWPATH%
-
-ECHO.
-ECHO ------------------------------------------
-ECHO Installing wget and unzip
-ECHO ------------------------------------------
-ECHO.
-mingw-get install msys-wget-bin msys-unzip-bin
-
-MKDIR temp
-CD temp
-
-ECHO.
-ECHO ------------------------------------------
-ECHO Installing dfu-programmer.
-ECHO ------------------------------------------
-ECHO.
-wget --no-check-certificate 'http://downloads.sourceforge.net/project/dfu-programmer/dfu-programmer/0.7.2/dfu-programmer-win-0.7.2.zip' >> %STARTINGDIR%\environment-setup.log
-unzip -o dfu-programmer-win-0.7.2.zip >> %STARTINGDIR%\environment-setup.log
-COPY dfu-programmer.exe .. >> %STARTINGDIR%\environment-setup.log
-
-ECHO ------------------------------------------
-ECHO Downloading driver
-ECHO ------------------------------------------
-wget --no-check-certificate http://downloads.sourceforge.net/project/libusb-win32/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip >> %STARTINGDIR%\environment-setup.log
-unzip -o libusb-win32-bin-1.2.6.0.zip >> %STARTINGDIR%\environment-setup.log
-COPY libusb-win32-bin-1.2.6.0\bin\x86\libusb0_x86.dll ../libusb0.dll >> %STARTINGDIR%\environment-setup.log
-
-ECHO.
-ECHO ------------------------------------------
-ECHO Installing driver. Accept prompt.
-ECHO ------------------------------------------
-ECHO.
-IF EXIST "%WinDir%\System32\PnPUtil.exe" (%WinDir%\System32\PnPUtil.exe -i -a dfu-prog-usb-1.2.2\atmel_usb_dfu.inf && GOTO PNPUTILFOUND)
-IF EXIST "%WinDir%\Sysnative\PnPUtil.exe" (%WinDir%\Sysnative\PnPUtil.exe -i -a dfu-prog-usb-1.2.2\atmel_usb_dfu.inf && GOTO PNPUTILFOUND)
-
-ECHO FAILED. Could not find PnPUtil.exe in "%WinDir%\System32" or "%WinDir%\Sysnative".
-
-:PNPUTILFOUND
-
-:: Wait then delete directory
-ping -n 5 127.0.0.1 > NUL 2>&1
-CD ..
-RD /s /q temp
-
-ECHO ------------------------------------------
-ECHO Finished!
-
-:ExitBatch
-CD /D %STARTINGDIR%
-ENDLOCAL
-PAUSE
-EXIT /b
\ No newline at end of file
diff --git a/util/ELEVATE_LICENSE.md b/util/ELEVATE_LICENSE.md
deleted file mode 100644
index 1cf4fda9174..00000000000
--- a/util/ELEVATE_LICENSE.md
+++ /dev/null
@@ -1,25 +0,0 @@
-Elevate was downloaded from [here](https://jpassing.com/2007/12/08/launch-elevated-processes-from-the-command-line/).
-
-### LICENSE
-
-The MIT License (MIT)
-
-Copyright (c)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
\ No newline at end of file
diff --git a/util/Win_Check.bat b/util/Win_Check.bat
deleted file mode 100644
index 3fdb656f9c7..00000000000
--- a/util/Win_Check.bat
+++ /dev/null
@@ -1,208 +0,0 @@
-@setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
-@echo OFF
-set BAT_VERSION=v1.0
-set REPORT_NAME=Win_Check_Output.txt
-
-:: -----------------------------------------------------------------------------
-
-cls
-
-echo QMK Windows Check Output %BAT_VERSION%
-echo QMK Windows Check Output %BAT_VERSION%.>%REPORT_NAME%
-
-:: -----------------------------------------------------------------------------
-
-set MINGW_BASE_DIR=C:\MinGW
-
-set KEYMAP=atomic-pvc
-set KEYMAP_CLEAN=atomic-pvc-clean
-
-:: -----------------------------------------------------------------------------
-
-if /I "%1" EQU VERBOSE (goto :Verbose_Make) else (goto :Normal_Make)
-
-:Normal_Make
-set MAKE_CMD_LEVEL_0=make -r -f Makefile COLOR=FALSE
-set MAKE_CMD_LEVEL_1=make -r -f ../Makefile COLOR=FALSE
-set MAKE_CMD_LEVEL_2=make -r -f ../../Makefile COLOR=FALSE
-goto :Start_Report
-
-:Verbose_Make
-echo Verbose Mode
-set MAKE_CMD_LEVEL_0=make -r -d -f Makefile COLOR=FALSE VERBOSE=TRUE
-set MAKE_CMD_LEVEL_1=make -r -d -f ../Makefile COLOR=FALSE VERBOSE=TRUE
-set MAKE_CMD_LEVEL_2=make -r -d -f ../../Makefile COLOR=FALSE VERBOSE=TRUE
-goto :Start_Report
-
-:Start_Report
-
-
-:: -----------------------------------------------------------------------------
-
-set HEADER=CURRENT DIRECTORY & call :ReportHeader
-
-echo %CD%>>%REPORT_NAME% 2>&1
-
-echo.>>%REPORT_NAME% 2>&1
-
-:: -----------------------------------------------------------------------------
-
-set HEADER=CURRENT PATHS & call :ReportHeader
-
-for %%A in ("%path:;=";"%") do (echo %%~A>>%REPORT_NAME% 2>&1)
-
-echo.>>%REPORT_NAME% 2>&1
-
-:: -----------------------------------------------------------------------------
-
-rem set HEADER=CURRENT ENVIRONMENTAL SETTINGS & call :ReportHeader
-
-rem set>>%REPORT_NAME% 2>&1
-rem echo.>>%REPORT_NAME% 2>&1
-
-:: -----------------------------------------------------------------------------
-
-set HEADER=KEY EXECUTABLE LOCATIONS - GENERAL & call :ReportHeader
-
-set FILENAME=make.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU Make" & call :ReportVersion
-set FILENAME=git.exe & set VERSION_CMD=--version & set VERSION_FIND="git" & call :ReportVersion
-set FILENAME=cmp.exe & set VERSION_CMD=--version & set VERSION_FIND="cmp" & call :ReportVersion
-
-:: -----------------------------------------------------------------------------
-
-set HEADER=EXECUTABLE LOCATIONS - AVR MCU COMPILERS & call :ReportHeader
-
-set FILENAME=avr-gcc.exe & set VERSION_CMD=--version & set VERSION_FIND="avr" & call :ReportVersion
-set FILENAME=avr-objcopy.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU objcopy" & call :ReportVersion
-set FILENAME=avr-objdump.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU objdump" & call :ReportVersion
-set FILENAME=avr-size.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU size" & call :ReportVersion
-set FILENAME=avr-ar.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU ar" & call :ReportVersion
-set FILENAME=avr-nm.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU nm" & call :ReportVersion
-
-:: -----------------------------------------------------------------------------
-
-set HEADER=EXECUTABLE LOCATIONS - ARM MCU COMPILERS & call :ReportHeader
-
-set FILENAME=arm-none-eabi-gcc.exe & set VERSION_CMD=--version & set VERSION_FIND="arm-none-eabi-gcc" & call :ReportVersion
-set FILENAME=arm-none-eabi-objcopy.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU objcopy" & call :ReportVersion
-set FILENAME=arm-none-eabi-objdump.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU objdump" & call :ReportVersion
-set FILENAME=arm-none-eabi-size.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU size" & call :ReportVersion
-set FILENAME=arm-none-eabi-ar.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU ar" & call :ReportVersion
-set FILENAME=arm-none-eabi-nm.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU nm" & call :ReportVersion
-
-:: -----------------------------------------------------------------------------
-
-set HEADER=EXECUTABLE LOCATIONS - NATIVE COMPILERS & call :ReportHeader
-
-set FILENAME=gcc.exe & set VERSION_CMD=--version & set VERSION_FIND="gcc" & call :ReportVersion
-set FILENAME=objcopy.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU objcopy" & call :ReportVersion
-set FILENAME=objdump.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU objdump" & call :ReportVersion
-set FILENAME=size.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU size" & call :ReportVersion
-set FILENAME=ar.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU ar" & call :ReportVersion
-set FILENAME=nm.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU nm" & call :ReportVersion
-
-:: -----------------------------------------------------------------------------
-
-set HEADER=EXECUTABLE LOCATIONS - PROGRAMMERS & call :ReportHeader
-
-set FILENAME=dfu-programmer.exe & set VERSION_CMD=--version & set VERSION_FIND="dfu" & call :ReportVersion
-set FILENAME=batchisp.exe & set VERSION_CMD=-version & set VERSION_FIND="batchisp" & call :ReportVersion
-set FILENAME=dfu-util.exe & call :Report
-set FILENAME=teensy_loader_cli.exe & call :Report
-set FILENAME=hid_bootloader_cli.exe & call :Report
-set FILENAME=avrdude.exe & call :Report
-
-:: -----------------------------------------------------------------------------
-
-set HEADER=EXECUTABLE LOCATIONS - OPTIONAL & call :ReportHeader
-set FILENAME=cppcheck.exe & call :Report
-set FILENAME=doxygen.exe & call :Report
-set FILENAME=gdb-config.exe & call :Report
-set FILENAME=wget.exe & call :Report
-set FILENAME=unzip.exe & call :Report
-
-:: -----------------------------------------------------------------------------
-
-set HEADER=MINGW CHECK - OPTIONAL & call :ReportHeader
-if exist %MINGW_BASE_DIR% (echo Expected MinGW Base Dir = %MINGW_BASE_DIR%>>%REPORT_NAME% 2>&1) else (echo Expected MinGW Base Dir = %MINGW_BASE_DIR% - Not Found>>%REPORT_NAME% 2>&1)
-echo.>>%REPORT_NAME% 2>&1
-set FILENAME=mingw32-make.exe & set VERSION_CMD=--version & set VERSION_FIND="GNU Make" & call :ReportVersion
-if exist %MINGW_BASE_DIR%\bin\make.exe (ECHO It is not recommended to have make.exe in mingw/bin.>>%REPORT_NAME% 2>&1 & echo.>>%REPORT_NAME% 2>&1)
-
-:: -----------------------------------------------------------------------------
-
-set HEADER=MAKE CHECK & call :ReportHeader
-if exist Makefile (set MAKE_CMD=%MAKE_CMD_LEVEL_0% & goto MakeFound)
-if exist ..\Makefile (set MAKE_CMD=%MAKE_CMD_LEVEL_1% & goto MakeFound)
-if exist ..\..\Makefile (set MAKE_CMD=%MAKE_CMD_LEVEL_2% & goto MakeFound)
-
-echo No Makfile Found.>>%REPORT_NAME% 2>&1
-echo.>>%REPORT_NAME% 2>&1
-echo ------------------------------------------------------------------------->>%REPORT_NAME% 2>&1
-
-goto :ContinueAfterMake
-
-:MakeFound
-call :RunMake
-
-:ContinueAfterMake
-goto :ExitBatch
-
-:ExitBatch
- echo Done!
- echo.
- rem type %REPORT_NAME%
- echo.
- echo See %REPORT_NAME% for the report.
- endlocal
-exit /b
-
-:: -----------------------------------------------------------------------------
-
-:RunMake
-
- echo Makfile Found.>>%REPORT_NAME% 2>&1
- echo.>>%REPORT_NAME% 2>&1
- set HEADER=MAKE CLEAN & call :ReportHeader
- echo Make Command = %MAKE_CMD% %KEYMAP_CLEAN%>>%REPORT_NAME% 2>&1
- echo.>>%REPORT_NAME% 2>&1
- %MAKE_CMD% %KEYMAP_CLEAN%>>%REPORT_NAME% 2>&1
- set HEADER=MAKE & call :ReportHeader
- echo Make Command = %MAKE_CMD% %KEYMAP%>>%REPORT_NAME% 2>&1
- echo.>>%REPORT_NAME% 2>&1
- %MAKE_CMD% %KEYMAP%>>%REPORT_NAME% 2>&1
- echo ------------------------------------------------------------------------->>%REPORT_NAME% 2>&1
- echo.>>%REPORT_NAME% 2>&1
-exit /b
-
-:ReportHeader
- echo ------------------------------------------------------------------------->>%REPORT_NAME% 2>&1
- echo.>>%REPORT_NAME% 2>&1
- echo %HEADER%>>%REPORT_NAME% 2>&1
- echo.>>%REPORT_NAME% 2>&1
-exit /b
-
-:Report
- echo Filename = %FILENAME% >>%REPORT_NAME% 2>&1
- >%REPORT_NAME% 2>&1
- where %FILENAME% >>%REPORT_NAME% 2> NUL
- if ERRORLEVEL 1 (echo Not Found >>%REPORT_NAME% 2>&1 & goto :EndReport)
-
- :EndReport
- echo.>>%REPORT_NAME% 2>&1
- >%REPORT_NAME% 2>&1
- >%REPORT_NAME% 2>&1
- where %FILENAME% >>%REPORT_NAME% 2> NUL
- if ERRORLEVEL 1 (echo Not Found >>%REPORT_NAME% 2>&1 & goto :EndReportVersion)
- >%REPORT_NAME% 2>&1
-
- (%FILENAME% %VERSION_CMD% | find %VERSION_FIND%) >>%REPORT_NAME% 2>&1
-
- :EndReportVersion
- echo.>>%REPORT_NAME% 2>&1
- add-paths.log
-
-CALL :AddPath %NEWPATH1%
-CALL :AddPath %NEWPATH2%
-
-EXIT /b
-
-:AddPath
-ECHO %PATH% | FINDSTR /C:"%~1" > nul
-IF ERRORLEVEL 1 (
- REG add "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /f /v PATH /t REG_SZ /d "%PATH%;%~1" >> add-paths-detail.log
- IF ERRORLEVEL 0 (
- ECHO Adding %1 . . . Success! >> add-paths.log
- SET "PATH=%PATH%;%~1"
- COPY NUL UPDATE
- ) ELSE (
- ECHO Adding %1 . . . FAILED. Run this script with administrator privileges. >> add-paths.log
- )
-) ELSE (
- ECHO Skipping %1 - Already in PATH >> add-paths.log
- )
-EXIT /b
\ No newline at end of file
diff --git a/util/bootloader_at90usb128x_1_0_1.hex b/util/bootloader_at90usb128_1.0.1.hex
similarity index 100%
rename from util/bootloader_at90usb128x_1_0_1.hex
rename to util/bootloader_at90usb128_1.0.1.hex
diff --git a/util/bootloader_at90usb64_1.0.0.hex b/util/bootloader_at90usb64_1.0.0.hex
new file mode 100644
index 00000000000..69dd45bbd69
--- /dev/null
+++ b/util/bootloader_at90usb64_1.0.0.hex
@@ -0,0 +1,252 @@
+:020000020000FC
+:04F000000C94B97E35
+:04F028000C94C77D00
+:10F08B0012010020FE010020EB03F92F000000000D
+:10F09B000001090212000101008032090400000086
+:04F0AB000000000061
+:10F0B0000000827E0800717E747E767E787E7A7E85
+:10F0C0007C7E7E7E807EA2010001000012BD01BD1B
+:10F0D000F89A00B5089501E00895F999FECF12BDA0
+:10F0E00001BD20BDFA9AF99AF6CFF999FECF0C949A
+:10F0F00066780E944B7F22974801C9012A010BC004
+:10F100001296A39400E8A01608F449C0830120E0F9
+:10F1100030E00E94987F042D052909F448C0082F8B
+:10F1200010E040E051E00E94E97EDC01A41BB50B39
+:10F130003D0100E8A02E03C0042D052919F18D0121
+:10F14000A817B907B0F0F40121914F0129832FEFDF
+:10F15000420E521E242D252939F001914F010883BA
+:10F160000FEF400E501E11C0F80131960491088334
+:10F170000CC0F801249129833196E817F907A1F70B
+:10F18000F401EBCF19D0088319839D0108811981FF
+:10F190000E94C87F1296AA9479F6D301AA240CD0B3
+:10F1A0000F3F1F4F09F4ACCF830116D0AFCF01E062
+:10F1B0002296EBE00C94577F8D0115C09A938A93A9
+:10F1C00080E090E08C0108D093958F3F0FEE900780
+:10F1D000C8F389919991089520E030E00C94A27FC2
+:10F1E000F801049108952297F8012591298304914B
+:10F1F0000883122F22960895A89507EF04BFE0E632
+:10F20000F0E0008108610083F08301810093000138
+:10F2100000E80183F1830E945E7D0E94947DFDCF12
+:10F220000E94527F239749D100E0FD0101870481AC
+:10F230001581012B49F43DD1FD010781002309F41B
+:10F24000C5C000E00783C2C00091E80002FFFCCF08
+:10F250003FD106830DE011E013D2F801208310D2D4
+:10F2600021830ED222830CD223830AD22483FD0170
+:10F2700026812A9549F02250E9F02A9509F441C0E7
+:10F280002A9509F485C0A0C0F8012081213011F42D
+:10F2900021E001C020E0FD012387B2D00481FD01FF
+:10F2A0000283F7D1FD0102850C3F11F423D18DC0FB
+:10F2B00082D18BC0A5D02481FD012283E8EEF0E04D
+:10F2C00020812B7F208320812F772083F801F2D0AB
+:10F2D00029F00A9539F00A9591F077C000E0FD0118
+:10F2E000038773C05FD103C04CD109F46EC050D105
+:10F2F00045D10F3FC9F305E0FD01018766C001E07C
+:10F30000EECFF8012081222329F02250C1F32A9563
+:10F3100041F05BC0BED10E94DE780FEFFD01028795
+:10F3200054C00181002319F00A9589F04EC056D0CF
+:10F330000DEF04BF71D02FD103FFFDCF54D009B51D
+:10F340000D7F09BD47D008E000936000FFCF46D095
+:10F3500063D021D103FFFDCF46D03CD009B50D7F4E
+:10F3600009BD0FEF1FE004C009811A810150104050
+:10F3700009831A8309811A81012BB1F700E80093F0
+:10F38000610000910001009361000C940000FFCF28
+:10F39000F80121818FD019F00A9541F016C0235051
+:10F3A000A0F477D102E0FD0100870FC0205339F0AF
+:10F3B0002A9541F02F52A9F32A9599F306C002E04D
+:10F3C0000883EFCF01E0FCCF64D173D02396E4E053
+:10F3D0000C945E7FE8ED00810F7610C001E005BF60
+:10F3E00000E005BF08950081077F008362D0F89494
+:10F3F000E0EEF0E00081016001C0077F0083089526
+:10F40000F8012181FD012183F80122812C932381C0
+:10F41000FD012383F80108953CD14BC0BA93AA9310
+:10F4200021974BD0EDE0F1E016960C911697035022
+:10F4300019F00250C1F00BC03DD021F00A9569F0DF
+:10F440000A9529F4FD0102850C3F29F453D0219639
+:10F45000A991B99108955FD0FACFFD010181009380
+:10F46000F1000C9109C0118125D019F00A9549F0DD
+:10F47000EECF135018F400E00093F1001AD047D0FB
+:10F48000E6CF105339F01A9539F01F5241F01A9512
+:10F4900041F0F4CF08E5F0CF00E006D0EDCF02E078
+:10F4A000FCCF04E001D0E8CF10E020E030E00C9485
+:10F4B000B87F28C00081002308950DD00CD0A1E0B2
+:10F4C000B1E006D0FD01048303D0058364D095CF5D
+:10F4D0000091F10008950091F10008830091F1007E
+:10F4E00008830895EBEEF0E0008100620083E8EE0F
+:10F4F000008183CFF7DFE1E0F1E002E0008703E085
+:10F50000018708954CD0008100FFFDCF089543D0BE
+:10F5100002FFFDCFC0C00E94517FA1E0B1E042D008
+:10F5200006C02CD00093F1002CD059F438D0082F0D
+:10F53000092BA1F030D002FD11C0008100FFFDCFEA
+:10F540004424042D4394003289F3FD0103850023F4
+:10F550001FD039F311970E947578E4CF1CD000FFBB
+:10F56000FDCF00810E7F0083008100FFFDCF008171
+:10F5700002FFFDCF90D0E5E00C945D7F11970C94D5
+:10F58000F07806D00F5F1F4F1C930E9301970895DC
+:10F590000D911C910895E8EEF0E000810895FBDFE5
+:10F5A0000E7F2CCFFD0182819381F2DF1197801BAA
+:10F5B000910B019608950E944C7FA1E0B1E04D901F
+:10F5C0005C9011976D907C9011970FE16022FD0186
+:10F5D0000481158100521040048315830AC0FD0187
+:10F5E0000385002331F4AC01940101E911E00E948C
+:10F5F000797849D0B0F180E090E0420111C068DF35
+:10F60000FC01EF56FE4F0083019601E0400E00E042
+:10F61000501E0091F200002311F035D0C0F439D013
+:10F6200032D0E8F2FC01B096E230F140C0F6009131
+:10F63000E80002FFFCCF0091F200FD01248135813A
+:10F64000201B304024833583E4CF42DF6A94662058
+:10F65000E1F70385013099F613D082010E946D789D
+:10F66000D4CF04811581012B21F095DF02FFFDCF5E
+:10F6700012D095DF008100FFFDCFEAE00C94587FA7
+:10F680002091F1000895FD010281138104151505F3
+:10F690000895E8EEF0E000810B7F008300810F7792
+:10F6A000ADCEEBEEF0E0208121602083018302816A
+:10F6B0000270012B0283EDEE008102600083EEEE0A
+:10F6C0000081000F00E0001F089500E00895E8EDBC
+:10F6D000F0E000810F7B0083E9ED008101FF0AC0AB
+:10F6E000F08BEBEE008100FD05C0F093E90010E324
+:10F6F00002E0D7CFEACF0F770132C1F5112379F1BC
+:10F700001A9559F01A9561F01A9569F01A9509F150
+:10F710001A95D1F01A95E9F027C00E94107922C0FD
+:10F720000E940E7A1FC024D000910A01018701E0D7
+:10F730000187F187F187009109010187F1870E9414
+:10F74000827A0E94877A0EC013D000910901018746
+:10F7500007C002E00093090100E000930A0108D00D
+:10F760000E94827A01E008950E94727A00E0089572
+:10F77000E8EEF0E00081077F008308950895F6CF5A
+:10F78000E9E9F2E02CD101831091F100012F11235E
+:10F7900059F10A9509F1025019F10250A9F00A95A0
+:10F7A00049F0025069F00A9599F00A9519F10A9505
+:10F7B00029F12CC00181003809F461C00C947B7BD5
+:10F7C00001810038D9F7C8C001810023B9F725C0ED
+:10F7D0000181002399F734C00181033078F737C1E4
+:10F7E0000181033058F7FEC00181003838F3033837
+:10F7F00028F7C8C00181013809F73CC001810130F8
+:10F8000059F41BD0008100FD07C0FCCF01810E948C
+:10F810007B7B002309F42ED008951091E30010782B
+:10F82000DED00F77012B0093E30007D0008100FFAB
+:10F83000FDCFE3EE0081006820C09BD000811CC09A
+:10F84000BA93AA93CCD0023088F4E8EEF0E01081AD
+:10F85000177F1083E9E9F2E00283A8EEB0E00C9193
+:10F860000E7F0C9302810E94BE7B01C003D0A99140
+:10F87000B9910895E3D001C00E7F00830895BA9333
+:10F88000AA932297A5E9B2E000E0FD01028310915E
+:10F89000F100A5D0202F2A9519F02A95D1F01EC08D
+:10F8A00002E103830BE810EF0D931C93119795D0A1
+:10F8B000088395D009835DD0FD01038110E0288184
+:10F8C00039810217130790F40F7171F401E002837C
+:10F8D00024C002E103830DE910EFE6CF0E94BF7B55
+:10F8E000002329F7ABD031C0128317C0238315C082
+:10F8F000008100FFFDCF10E0012F1395003261F071
+:10F90000ED91FC910591FC93EE930093F100FD01C4
+:10F9100003810A95038381F75ED0FD0103810023F3
+:10F9200019F016D002FFE4CF13D00E7F82D002FD73
+:10F9300008C0FD010281013009F44DD009D002FF59
+:10F94000FDCF00810B7F75D00F77008322968FCF7C
+:10F95000E8EEF0E0008108950CD000919B02018751
+:10F9600000810E7F0BD0008102FFFDCF00810B7F55
+:10F9700005C0E8EEF0E00081077F7FCF00830081C3
+:10F980000F777BCF9D0129D056D01181105829F0D7
+:10F990001A9519F01A9589F01CC0EBDFF18700E089
+:10F9A0000093F10018D0008102FFFDCF00810B7F92
+:10F9B00040D00F770083D9010895A8EEB0E01C91E4
+:10F9C000177F1C930F77E00FFB1F00810093F1005E
+:10F9D000E6CF34D0EFCFBCDF4FCF01D000D00091C5
+:10F9E000F10008953B2F4A2F26D001810130D1F03C
+:10F9F0000230D1F45ED0B1F4F2DF0F7799F00093CA
+:10FA0000E900ABEEB0E01C9110FF0CC01C9110623D
+:10FA10001C93B093E90021E0E00FFB1F208307D087
+:10FA20000E7F01C00BD00083A42FB32F089590DF69
+:10FA3000077F00838FCFE9E9F2E00895EBEEF0E075
+:10FA4000008100620083E8EE0081077F08953B2F6C
+:10FA50006A2FF1DF0181002341F1013031F10230E1
+:10FA600031F527D011F52091F1002F772093E9008F
+:10FA7000ABEEB0E00C9100FF18C079F00C91006182
+:10FA80000C9301E010E0422F0E94CB7E0093EA002D
+:10FA9000B093EA000C9108600C93B093E900E20F78
+:10FAA000FB1FB083C4DF0E7F01C0C8DF0083A62F19
+:10FAB000BCCF95DF1091F100002308951B2F2A2F52
+:10FAC000ECE9F2E000E0048301E005BF02E005BFDD
+:10FAD0007894A7EDB0E011D000680C93A8ED0C91DC
+:10FAE00000690C930AD001600C93B083B1830CEFD2
+:10FAF00000930B01A22FB12F08950C910F7B0C9353
+:10FB00000C910895E7ED0CD0E0EEC9D0D1D0E2EE33
+:10FB100007D000810860BED0C0D0F0939E02089547
+:10FB2000F0E000810160BDC0BA93AA93ECE9F2E075
+:10FB3000A9EDB0E00C9100FF10C00281002369F430
+:10FB400001E0028301E60383A2EE0C9108600C93AE
+:10FB5000A0EE0C910E7F0C9303C00481013009F4D8
+:10FB6000B4830581013041F401E00093EA00B093D1
+:10FB7000EA00B0939B02B583B093E9000091E800DE
+:10FB800003FF02C00E94C07BA991B9910895BA9366
+:10FB9000AA938A93FA93EA933A922A921A920A9231
+:10FBA0007A936A935A934A933A932A931A930A93AD
+:10FBB0008FB7ACE9B2E0EAEDD2D000FF17C00EEF8C
+:10FBC0000083E9ED008100FF0CC001E0FD0102832C
+:10FBD00001E66AD0E2EEC3D00860008393DF5DD017
+:10FBE00005C000E0FD01028302E65ED0EAEDB7D079
+:10FBF00001FF0AC00DEF0083E9ED008101FF02C0A3
+:10FC000003E601C004E64FD0A9D002FF02C00BEF0B
+:10FC10000083008100FF0CC00EEF0083E2EE008144
+:10FC2000006100830FEE0093E10094D005E63BD025
+:10FC300095D004FF06C096D00FEE018727D006E6C8
+:10FC400032D08CD005FF07C021D00FED0093E1002A
+:10FC50008AD007E628D082D003FF05C007EF1AD06C
+:10FC600008E621D005838FBF099119912991399117
+:10FC700049915991699179910990199029903990F8
+:10FC8000E991F9918991A991B9911895E2EE0081D4
+:10FC90000F7E07C000830C94677BE0EEF0E00081EC
+:10FCA0000E7F00830895FD01038301E0048308951E
+:10FCB0008A9380E002C001E007BB50D002FD40C043
+:10FCC00049D009B50D7F09BDF093B100F093B000A4
+:10FCD000F093B20001E007BB082FE0EBF0EF0C94CB
+:10FCE000067F06E109BD11C002E1FCCF0EE0FACFAC
+:10FCF0000AE0F8CF06E0F6CF02E0F4CF0AE1F2CF57
+:10FD00000EE1F0CF06E109BD80E08395E1EB27D05D
+:10FD10000560008309B500FD03C007B30130D1F7CA
+:10FD2000F083F18307B3013031F21CD001E007BB4F
+:10FD3000E1EB00810560008307B30130E9F7BDCF37
+:10FD4000F093B000F093B100F093B2000BEF00839A
+:10FD500089910895E8ED00810062A3CFE1EEF0E023
+:10FD600000810895E8ED00810F7D9BCF000088950C
+:10FD7000FECF01EE0DBF02E00EBFC2EED4E00E9446
+:10FD8000697F002311F00E94797F0E94FC780E9415
+:10FD9000B67E0C94B67E4A951AF0000F111FFBCF69
+:10FDA000089500241124EFE0001F111F001C111CF6
+:10FDB0000416150610F0041A150AEA95AAF7001F92
+:10FDC000111FA0010095109508955195419550403F
+:10FDD0000895FF27552312F4F160F7DF112312F481
+:10FDE000F09507D00E94D17EF0FD03D0F1FDEDCF5C
+:10FDF000089511950195104008957591659155915B
+:10FE00004591159011FA259035900895F9DF041B5E
+:10FE100010E003C0F4DF041B150B20E030E005C048
+:10FE2000ECDF041B150B260B370BB8F010FC17C0CA
+:10FE300045910590E00FF11F0417100540E02407DD
+:10FE4000340758F436F404910024F101E01BF00962
+:10FE50000994E00FF11F25903590F101099411F4F8
+:10FE6000D6F7F1CF31960EF0319650E060E070E0B9
+:10FE700045914B3F48F089F34F3F29F04E3F11F039
+:10FE80007591659155914591041B150B260B370B08
+:10FE900039F318F3E7CFAA929A928A927A926A92E9
+:10FEA0005A924A92BA93AA939A938A930895AA84EB
+:10FEB000998488847F806E805D804C80BB81AA811C
+:10FEC00099818881F0E00FB6F894CE0FDF1F0FBE46
+:10FED000089501E0089520E006D0E9F708952591FE
+:10FEE00002D0E9F708952D9301501040202F212BC7
+:10FEF000089586EC90EFFC0105911491FC01329677
+:10FF0000A591B491FC01349625913491422F432B55
+:10FF100019F0F901E4DF01C0DEDF069610EF8C3C3A
+:10FF2000910748F308952F930DD02F9101D0089594
+:10FF30003DD0F12FE02F2BBF45E047BFE89536D0ED
+:10FF400012D0089533D0F12FE02F43E047BFE8955A
+:10FF50002DD008952BD0F12FE02F43E047BFE89537
+:10FF600025D001D0089522D041E147BFE8951EC0B9
+:10FF70001DD0F12FE02F41E247BFC895002D16C0DC
+:10FF800015D0F12FE02F49E047BFC895002D0EC0D6
+:10FF9000F32FE22F012E102E41E047BFE89506C057
+:10FFA00005D0002E29E027BFE89500C0022E27B714
+:10FFB00020FDFCCF202D0895022E27B726FDFCCF73
+:04FFC000202D089553
+:10FFE4000C94937F0C94B87F0C94C07F0C94C87FBE
+:0CFFF4000C94987F0C94AA7F0C94D07F92
+:040000030000F00009
+:00000001FF
diff --git a/util/bootloader_atmega16u4_1.0.1.hex b/util/bootloader_atmega16u4_1.0.1.hex
new file mode 100644
index 00000000000..698fe002c58
--- /dev/null
+++ b/util/bootloader_atmega16u4_1.0.1.hex
@@ -0,0 +1,258 @@
+:020000020000FC
+:043000000C94B91E55
+:043028000C94C31D24
+:10302F0012010002FF010020EB03F32F0000010249
+:10303F0000010902120001010080320904000000A2
+:10304F00000000000C03410054004D0045004C00EF
+:10305F002603410054006D00310036005500340046
+:10306F0020004400460055002000560031002E007D
+:10307F0030002E0032000403090419010C01000076
+:06308F000C000001C03F2F
+:1030960012BD01BDF89A00B5089501E00895F999A9
+:1030A600FECF12BD01BD20BDFA9AF99AF6CFF99965
+:1030B600FECF0C944B18F80104910895F801149171
+:1030C6003196FACF0091610000930C0100E800935D
+:1030D600610001E00093610005BF02E005BF0C94AA
+:1030E6007D180091D70001600093D7000E94721EE0
+:1030F60001E008950E94BA1D0E94C11DFDCF78D03F
+:103106000F777BD078D074D0006177D0789408950B
+:103116006CD076D009B500FFFDCFF89469D00F7D4D
+:103126006CD05DD00091E000077F0093E0000E9424
+:103136008D1B0091E20001600093E2000091E20025
+:1031460008600093E200E2CF0091D90000FF0EC0B4
+:1031560000910D01002351F401E000930D013AD0D6
+:1031660002601183008347D0D3DF39D00091D900A4
+:1031760000FD13C000910D01013079F400E00093C9
+:103186000D010093220226D0046011830083009172
+:10319600E00001600093E00028D0E3E2F2E0008165
+:1031A600018100FF0DC0008111811E7F1183008304
+:1031B60001E00093EA0000E00093EA000093220297
+:1031C60000E00093E9000091E80003FF02C00E94BE
+:1031D600021C0895E3E2F2E0008111810895009156
+:1031E600E0000E7F0093E000089502D0006205C063
+:1031F6000091D8000895FCDF00680093D800089578
+:1032060000E00E949D1E24D000918100036000937F
+:1032160081000091600007FFFCCF00E8009360008A
+:1032260000E0009381000E94721E2091840030917C
+:1032360085000ED02D3D354002B7007F02BF02B794
+:103246000A6402BF10F002E101C002E009BD089560
+:1032560000E00093810000938000009385000093B6
+:10326600840001E006BB08950E94D91E239751D120
+:10327600A0E0B1E04BD10093040148D100930501D1
+:1032860055D100E000930901FD0104811581012B50
+:1032960051F436D100910701002309F4B8C000E0CB
+:1032A60000930701B4C056D102FFFDCF2FD106838C
+:1032B6002DD100930F012AD10093100127D100933D
+:1032C600110124D10093120121D10093130102852B
+:1032D600309113014091120150911101209110017A
+:1032E60016811A9541F01250A9F01A9591F11A9586
+:1032F60009F472C08AC010910F01113011F411E067
+:1033060001C010E0138798D00C3F11F412D17EC093
+:1033160079D17CC091D010910F01112329F01A9513
+:1033260049F01A95A1F072C010E013870C3F09F01E
+:103336006DC0ECCF5CD103C050D109F467C054D145
+:1033460049D10F3FC9F305E0009309015FC011E0C1
+:10335600ECCFD2D029F00250E1F10A9541F056C0E7
+:10336600FCD00E94CD1F0FEF00930A014FC022230D
+:1033760019F02A9579F04AC05AD00DEF04BF6BD0E8
+:10338600E9D003FFFDCF69D04CD045D000E00E94C4
+:10339600831EFFCF4CD05FD0DDD003FFFDCF5DD0C5
+:1033A6003AD03FD00FEF1FE004C009811A810150C7
+:1033B600104009831A8309811A81012BB1F700E8AD
+:1033C6000093610000910C01009361000C940000D1
+:1033D600FFCF01E003871AC08FD019F00A9539F0A4
+:1033E60015C0235098F4B9D002E000870FC02053CF
+:1033F60039F02A9541F02F52B1F32A95A1F306C070
+:1034060002E00883F0CF01E0FCCFA7D079D0239665
+:10341600E4E00C94E61E0091D8000F770093D800E4
+:10342600089509B50D7F09BD00E009BD089501E0C5
+:1034360005BF00E005BF089521835083438332838F
+:103446001091E8001B7F1093E8001091E8001F77A9
+:103456001093E800089581D053C068D051D0F894F5
+:103466000091E00001600093E0000895219751D09B
+:10347600E0E0F1E04BD0048349D0058357D00681C4
+:10348600035019F00250A1F00AC036D021F00A9577
+:1034960051F00A9521F402850C3F19F44AD0219681
+:1034A600089566D0FCCF01810093F10000810CC025
+:1034B600EFE0F1E011810081002319F00A9549F04F
+:1034C600EECF135018F400E00093F10019D03ED06F
+:1034D600E6CF105339F01A9539F01F5241F01A957C
+:1034E60041F0F4CF08E5F0CF00E00BD0EDCF02E0DD
+:1034F600FCCF04E006D0E8CF00910F010023089529
+:1035060020C010E020E030E00C943B1F0091F10059
+:10351600089500D00091F10008830091F10008831E
+:1035260008950091EB0000620093EB001ED0077F28
+:1035360019C0F7DF02E00093080103E000930901D8
+:1035460008955DD007D000FFFDCF089503D002FF98
+:10355600FDCF03C00091E800089507D00B7F02D08D
+:1035660004D00F770093E80008950091E8000895CD
+:103576000E94D81EA0E0B1E0FD0139D006C02AD0D5
+:103586000093F1002AD059F43AD0082F092BA1F064
+:10359600E1DF02FD11C0DEDF00FFFDCF4424042D74
+:1035A6004394003289F300910B0100231DD039F3B7
+:1035B60011970E945A18E4CFCDDF00FFFDCF1FD030
+:1035C600C9DF00FFFDCFC6DF02FFFDCFC6DFE5E0A6
+:1035D6000C94E51E11970C945E1806D00F5F1F4FD2
+:1035E6001C930E93019708950D911C910895828165
+:1035F6009381FADF1197801B910B01960895B5DF31
+:103606000E7FB0CF0E94D31EA0E0B1E04D905C903B
+:1036160011976D907C9011970FE16022FD01048156
+:10362600158100521040048315830AC000910B01D6
+:10363600002331F4AC01940103E911E00E94651FF7
+:1036460047D0B8F180E090E0420111C05FDFFC0195
+:10365600ED56FE4F0083019601E0400E00E0501E3D
+:103666000091F200002311F033D0B8F476DF30D0A9
+:10367600E8F2FC01B096E238F040C0F66BDF02FFDC
+:10368600FDCF0091F200FD0124813581201B3040E1
+:1036960024833583E5CF3ADF6A946620E1F700910B
+:1036A6000B01013099F62091F10082010E94521817
+:1036B600D3CF04811581012B21F04CDF02FFFDCF12
+:1036C6004CDF9DDF47DF00FFFDCFEAE00C94E01EF4
+:1036D600FD01028113810415150508952091EB0063
+:1036E60021602093EB000093EC000091ED00027046
+:1036F600012B0093ED000091ED0002600093ED00B8
+:103706001091EE00012F000F00E0001F08950093B6
+:10371600E900089500E0FBDF0091EB0000FD05C025
+:1037260000E0F5DF10E202E0D9CF00E008950F7760
+:103736000132A9F5112369F11A9559F01A9561F02C
+:103746001A9569F01A95F9F01A95C1F01A95D9F0FB
+:1037560024C00E94371920C00E94391A1DC029D0E2
+:103766000091090123D001E01FD020D0009108016B
+:103776001BD00E94A41A0E94A91A0EC01AD000914A
+:10378600080114D007C002E00093080100E000938E
+:1037960009010FD00E94A41A03C00E94941A02C005
+:1037A60001E0089500E0089501D000E00093F100E3
+:1037B60008950091E800077F0093E800089503301C
+:1037C600E9F4112329F01A9549F01A9589F016C0E3
+:1037D60004E00093190205E810E305C00CE000932D
+:1037E600190203E510E3E7E1F2E000831183D8CF85
+:1037F60006E2009319020FE510E3F5CFD3CF9A93B3
+:103806008A93E8D00B7FFAD08091F1009091F10075
+:10381600092F992349F10A9509F1025011F1025035
+:10382600A9F00A9549F0025069F00A9599F00A95AF
+:10383600F1F00A9501F124C0803811F551D000232A
+:1038460071F51EC08038E1F4C8D029C08823C1F4C0
+:1038560029D025C08823A1F438D0F1CF082F2CD148
+:10386600EECF082FFBD0EBCF082FCBD0E8CF813897
+:1038760039F461D1E4CF813019F467D1002379F4AA
+:103886008C010E949A1B002351F40091EB00006208
+:103896000093EB009FD0077F4BD100931A028991CA
+:1038A60099910895CFD00091E30000781F77012BFE
+:1038B6000093E30012D0A0D0C8D000FFFDCF009146
+:1038C600E30000680093E3000895BCD0123008F0CE
+:1038D6003AC103D01093220229C17CD0077F8EC043
+:1038E6000E94D91E229780E0ADD0E3D0202F2A95E2
+:1038F60019F02A95C9F01CC068D02FE230E3208366
+:103906003183D7D0D6D0D5D00883D3D00983E5DF8D
+:103916002091190230E0488159812417350770F447
+:103926002F7171F481E00CC050D021E430E3E7CF71
+:103936000E94E21B002329F700E040C040931902D1
+:103946002091E8002F7E03C02091E8002E7F20936F
+:10395600E800209119022223F9F034D024FD1CC07E
+:1039660031D020FD03C02ED024FFFACF30E0232F24
+:103976003395203271F0A7E1B2E0ED91FC912591EB
+:10398600FC93EE932093F100FD0122812A95228378
+:1039960071F718D024FFD8CF813039F456D004FD02
+:1039A60004C053D000FFFDCF27D04FD004FFFDCF7A
+:1039B60011D00F7E23D00ED00B7FBAD02296E4E032
+:1039C6000C94E61E2091E8000895E7E1F2E022E17A
+:1039D600228308950091E80008957FDF0091220276
+:1039E60009D0F8DF0F770AD030D002FFFDCF30D0F4
+:1039F60005C000E00093F100EDDF0E7F0093E800C4
+:103A0600089520D01FD02091F100005829F00A9582
+:103A160069F00A9571F012C060DF009121020093EF
+:103A2600F100E7DF12D002FFFDCF09C056DF00E04C
+:103A3600F6CF53DF2F776ED00081F1CF84C008D048
+:103A460077C037D01091F10008950091E8000895ED
+:103A5600C1DF0B7FD3DFBEDF0F770895002319F098
+:103A6600025019F001C025D06EC0EBDF0023E1F74C
+:103A760020D00F7731F417D01091E800177F1093FC
+:103A8600E8000093E9001091EB0010FD02C047D05A
+:103A9600EBCF09D010E01093E90021E0F801E65ED3
+:103AA600FD4F208340C01091EB0010621093EB0095
+:103AB60008950091F1000895002319F0025019F0BD
+:103AC60001C0F7DF40C0BDDF0023E1F72091F10020
+:103AD6002F772093E9000091EB0000FD02C01FD074
+:103AE600F1CFA1F00091EB0000610093EB00422FB3
+:103AF60001E010E00E94CB1E0093EA0000E0009374
+:103B0600EA000091EB0008600093EB0008D002D0B9
+:103B1600008309C0F0E0E22FE65EFD4F089500E065
+:103B26000093E900089556DF077F68DF53DF0E7FB5
+:103B360065DF01E0089513D031F4CFDE5ADF85DF6B
+:103B460002FFFDCF7CCF00E0089509D009F0FBCF3E
+:103B5600C4DEE5DF51DF79DF00FFFDCFEACFA9DF65
+:103B6600A8DF1091F1001091F10000230895009153
+:103B7600D70001600093D7000C9482180C94A71804
+:103B86008A93FA93EA933A922A921A920A927A932B
+:103B96006A935A934A933A932A931A930A938FB73E
+:103BA60088D002FF05C082D002FF02C00BEF7BD097
+:103BB6000091DA0000FF02C00091D8007AD000FF21
+:103BC6001BC074D000FF18C001E000930E016AD03C
+:103BD60081D0006264D00EEF6FD0006177D06ED0D6
+:103BE6000F7D74D00091D80000620093D80009B50B
+:103BF6000D7F09BD00E009BD5CD004FF20C056D092
+:103C060004FF1DC009B500FD05C00E94031909B5D2
+:103C160000FFFDCF0091D8000F7D0093D80042D061
+:103C260000910E01002359F04CD00FEE45D00F7EC7
+:103C360050D0006434D042D0016048D042D039D050
+:103C460005FF0FC033D005FF0CC000E000930E0146
+:103C560035D00F7E3BD00FED2FD00F7D3AD00068C8
+:103C66001ED027D003FF0AC021D003FF07C007EFED
+:103C76001AD00E948D1B2ED0116011D08FBF0991D2
+:103C8600199129913991499159916991799109909F
+:103C9600199029903990E991F99189911895118394
+:103CA600008308950FEE0093E10008950091E2006D
+:103CB60008950091E10008950093E1000091E2006B
+:103CC6000895FCDF006202D0F9DF08600093E2008D
+:103CD6000895FCDFE3E2F2E00081118108950FB759
+:103CE6000078102FF89407EF04BFA89508E1009319
+:103CF600600000E000936000112309F078940895B5
+:103D06001FB71078412FF89403FB1EF420E230E031
+:103D160002C020E030E00770202B022F0860F894E4
+:103D2600A89518E11093600000936000442309F001
+:103D3600789408951FB71078412F03FB1EF420E2F4
+:103D460030E002C020E030E00770202B022F006434
+:103D5600F894A89518E1109360000093600044233E
+:103D660009F07894089500008895FECF04E60DBF0B
+:103D760002E00EBFC5EED2E00E947418002311F0D7
+:103D86000E94FD1E0E9465180E94B61E0C94B61E67
+:103D96004A951AF0000F111FFBCF0895BA92AA9206
+:103DA6009A928A927A926A925A924A92BA93AA936B
+:103DB6009A938A930895BB84AA84998488847F8081
+:103DC6006E805D804C80BB81AA8199818881F0E0FC
+:103DD600EC0FFD1FEF01089520E006D0E9F70895E6
+:103DE600259102D0E9F708952D9301501040202F18
+:103DF600212B089589E890E3FC0105911491FC01BB
+:103E06003296A591B491FC01349625913491422FB6
+:103E1600432B19F0F901E4DF01C0DEDF069610E35B
+:103E26008539910748F308952F930CD02F9101D02F
+:103E360008953CD0F12FE02F45E047BFE89536D0F6
+:103E460012D0089533D0F12FE02F43E047BFE89515
+:103E56002DD008952BD0F12FE02F43E047BFE895F2
+:103E660025D001D0089522D041E147BFE8951EC074
+:103E76001DD0F12FE02F41E247BFC895002D16C097
+:103E860015D0F12FE02F49E047BFC895002D0EC091
+:103E9600F32FE22F012E102E41E047BFE89506C012
+:103EA60005D0002E29E027BFE89500C0022E27B7CF
+:103EB60020FDFCCF202D0895022E27B726FDFCCF2E
+:103EC600202D08950E94D11E22974801C901DA01CA
+:103ED60010C05BD001E0A00E00E0B01E00E4A0160A
+:103EE60000E0B00608F440C0830120E030E00E9404
+:103EF6001C1F0A2F0B2B09F440C0082F0F7710E068
+:103F06002C01401A510A320100E4A02E03C00A2FE8
+:103F16000B2BE1F04816590680F0F40101914F0190
+:103F26000983119729F001914F010883119711C058
+:103F3600F2013196049108830CC0F20104910983C1
+:103F46003196E817F907A1F7F401EDCF1BD00883E6
+:103F560019839201088119810E944B1F16D0AA94D9
+:103F6600B1F62301AA24BB240DD0312F0F3F3F4FBA
+:103F760009F4AFCF83011DD0B7CF01E02296ECE064
+:103F86000C94DE1E82010C94611802E0400E00E0E3
+:103F9600501E08959A938A9380E090E08C0109D090
+:103FA60080589F4F8F3F0FE29007C0F389919991F8
+:103FB600089520E030E00C94251F0000000000006A
+:063FC60000000000FC00F9
+:103FE4000C94171F0C943B1F0C94431F0C944B1FF1
+:0C3FF4000C941C1F0C942D1F0C94531FE8
+:0400000300003000C9
+:00000001FF
diff --git a/util/bootloader_atmega16u4_1_0_1.hex b/util/bootloader_atmega16u4_1_0_1.hex
deleted file mode 100644
index 8b4cd391521..00000000000
--- a/util/bootloader_atmega16u4_1_0_1.hex
+++ /dev/null
@@ -1,258 +0,0 @@
-:020000020000FC
-:043000000C94B91E55
-:043028000C94C31D24
-:10302F0012010002FF010020EB03F32F0000010249
-:10303F0000010902120001010080320904000000A2
-:10304F00000000000C03410054004D0045004C00EF
-:10305F002603410054006D00310036005500340046
-:10306F0020004400460055002000560031002E007D
-:10307F0030002E0032000403090419010C01000076
-:06308F000C000001C03F2F
-:1030960012BD01BDF89A00B5089501E00895F999A9
-:1030A600FECF12BD01BD20BDFA9AF99AF6CFF99965
-:1030B600FECF0C944B18F80104910895F801149171
-:1030C6003196FACF0091610000930C0100E800935D
-:1030D600610001E00093610005BF02E005BF0C94AA
-:1030E6007D180091D70001600093D7000E94721EE0
-:1030F60001E008950E94BA1D0E94C11DFDCF78D03F
-:103106000F777BD078D074D0006177D0789408950B
-:103116006CD076D009B500FFFDCFF89469D00F7D4D
-:103126006CD05DD00091E000077F0093E0000E9424
-:103136008D1B0091E20001600093E2000091E20025
-:1031460008600093E200E2CF0091D90000FF0EC0B4
-:1031560000910D01002351F401E000930D013AD0D6
-:1031660002601183008347D0D3DF39D00091D900A4
-:1031760000FD13C000910D01013079F400E00093C9
-:103186000D010093220226D0046011830083009172
-:10319600E00001600093E00028D0E3E2F2E0008165
-:1031A600018100FF0DC0008111811E7F1183008304
-:1031B60001E00093EA0000E00093EA000093220297
-:1031C60000E00093E9000091E80003FF02C00E94BE
-:1031D600021C0895E3E2F2E0008111810895009156
-:1031E600E0000E7F0093E000089502D0006205C063
-:1031F6000091D8000895FCDF00680093D800089578
-:1032060000E00E949D1E24D000918100036000937F
-:1032160081000091600007FFFCCF00E8009360008A
-:1032260000E0009381000E94721E2091840030917C
-:1032360085000ED02D3D354002B7007F02BF02B794
-:103246000A6402BF10F002E101C002E009BD089560
-:1032560000E00093810000938000009385000093B6
-:10326600840001E006BB08950E94D91E239751D120
-:10327600A0E0B1E04BD10093040148D100930501D1
-:1032860055D100E000930901FD0104811581012B50
-:1032960051F436D100910701002309F4B8C000E0CB
-:1032A60000930701B4C056D102FFFDCF2FD106838C
-:1032B6002DD100930F012AD10093100127D100933D
-:1032C600110124D10093120121D10093130102852B
-:1032D600309113014091120150911101209110017A
-:1032E60016811A9541F01250A9F01A9591F11A9586
-:1032F60009F472C08AC010910F01113011F411E067
-:1033060001C010E0138798D00C3F11F412D17EC093
-:1033160079D17CC091D010910F01112329F01A9513
-:1033260049F01A95A1F072C010E013870C3F09F01E
-:103336006DC0ECCF5CD103C050D109F467C054D145
-:1033460049D10F3FC9F305E0009309015FC011E0C1
-:10335600ECCFD2D029F00250E1F10A9541F056C0E7
-:10336600FCD00E94CD1F0FEF00930A014FC022230D
-:1033760019F02A9579F04AC05AD00DEF04BF6BD0E8
-:10338600E9D003FFFDCF69D04CD045D000E00E94C4
-:10339600831EFFCF4CD05FD0DDD003FFFDCF5DD0C5
-:1033A6003AD03FD00FEF1FE004C009811A810150C7
-:1033B600104009831A8309811A81012BB1F700E8AD
-:1033C6000093610000910C01009361000C940000D1
-:1033D600FFCF01E003871AC08FD019F00A9539F0A4
-:1033E60015C0235098F4B9D002E000870FC02053CF
-:1033F60039F02A9541F02F52B1F32A95A1F306C070
-:1034060002E00883F0CF01E0FCCFA7D079D0239665
-:10341600E4E00C94E61E0091D8000F770093D800E4
-:10342600089509B50D7F09BD00E009BD089501E0C5
-:1034360005BF00E005BF089521835083438332838F
-:103446001091E8001B7F1093E8001091E8001F77A9
-:103456001093E800089581D053C068D051D0F894F5
-:103466000091E00001600093E0000895219751D09B
-:10347600E0E0F1E04BD0048349D0058357D00681C4
-:10348600035019F00250A1F00AC036D021F00A9577
-:1034960051F00A9521F402850C3F19F44AD0219681
-:1034A600089566D0FCCF01810093F10000810CC025
-:1034B600EFE0F1E011810081002319F00A9549F04F
-:1034C600EECF135018F400E00093F10019D03ED06F
-:1034D600E6CF105339F01A9539F01F5241F01A957C
-:1034E60041F0F4CF08E5F0CF00E00BD0EDCF02E0DD
-:1034F600FCCF04E006D0E8CF00910F010023089529
-:1035060020C010E020E030E00C943B1F0091F10059
-:10351600089500D00091F10008830091F10008831E
-:1035260008950091EB0000620093EB001ED0077F28
-:1035360019C0F7DF02E00093080103E000930901D8
-:1035460008955DD007D000FFFDCF089503D002FF98
-:10355600FDCF03C00091E800089507D00B7F02D08D
-:1035660004D00F770093E80008950091E8000895CD
-:103576000E94D81EA0E0B1E0FD0139D006C02AD0D5
-:103586000093F1002AD059F43AD0082F092BA1F064
-:10359600E1DF02FD11C0DEDF00FFFDCF4424042D74
-:1035A6004394003289F300910B0100231DD039F3B7
-:1035B60011970E945A18E4CFCDDF00FFFDCF1FD030
-:1035C600C9DF00FFFDCFC6DF02FFFDCFC6DFE5E0A6
-:1035D6000C94E51E11970C945E1806D00F5F1F4FD2
-:1035E6001C930E93019708950D911C910895828165
-:1035F6009381FADF1197801B910B01960895B5DF31
-:103606000E7FB0CF0E94D31EA0E0B1E04D905C903B
-:1036160011976D907C9011970FE16022FD01048156
-:10362600158100521040048315830AC000910B01D6
-:10363600002331F4AC01940103E911E00E94651FF7
-:1036460047D0B8F180E090E0420111C05FDFFC0195
-:10365600ED56FE4F0083019601E0400E00E0501E3D
-:103666000091F200002311F033D0B8F476DF30D0A9
-:10367600E8F2FC01B096E238F040C0F66BDF02FFDC
-:10368600FDCF0091F200FD0124813581201B3040E1
-:1036960024833583E5CF3ADF6A946620E1F700910B
-:1036A6000B01013099F62091F10082010E94521817
-:1036B600D3CF04811581012B21F04CDF02FFFDCF12
-:1036C6004CDF9DDF47DF00FFFDCFEAE00C94E01EF4
-:1036D600FD01028113810415150508952091EB0063
-:1036E60021602093EB000093EC000091ED00027046
-:1036F600012B0093ED000091ED0002600093ED00B8
-:103706001091EE00012F000F00E0001F08950093B6
-:10371600E900089500E0FBDF0091EB0000FD05C025
-:1037260000E0F5DF10E202E0D9CF00E008950F7760
-:103736000132A9F5112369F11A9559F01A9561F02C
-:103746001A9569F01A95F9F01A95C1F01A95D9F0FB
-:1037560024C00E94371920C00E94391A1DC029D0E2
-:103766000091090123D001E01FD020D0009108016B
-:103776001BD00E94A41A0E94A91A0EC01AD000914A
-:10378600080114D007C002E00093080100E000938E
-:1037960009010FD00E94A41A03C00E94941A02C005
-:1037A60001E0089500E0089501D000E00093F100E3
-:1037B60008950091E800077F0093E800089503301C
-:1037C600E9F4112329F01A9549F01A9589F016C0E3
-:1037D60004E00093190205E810E305C00CE000932D
-:1037E600190203E510E3E7E1F2E000831183D8CF85
-:1037F60006E2009319020FE510E3F5CFD3CF9A93B3
-:103806008A93E8D00B7FFAD08091F1009091F10075
-:10381600092F992349F10A9509F1025011F1025035
-:10382600A9F00A9549F0025069F00A9599F00A95AF
-:10383600F1F00A9501F124C0803811F551D000232A
-:1038460071F51EC08038E1F4C8D029C08823C1F4C0
-:1038560029D025C08823A1F438D0F1CF082F2CD148
-:10386600EECF082FFBD0EBCF082FCBD0E8CF813897
-:1038760039F461D1E4CF813019F467D1002379F4AA
-:103886008C010E949A1B002351F40091EB00006208
-:103896000093EB009FD0077F4BD100931A028991CA
-:1038A60099910895CFD00091E30000781F77012BFE
-:1038B6000093E30012D0A0D0C8D000FFFDCF009146
-:1038C600E30000680093E3000895BCD0123008F0CE
-:1038D6003AC103D01093220229C17CD0077F8EC043
-:1038E6000E94D91E229780E0ADD0E3D0202F2A95E2
-:1038F60019F02A95C9F01CC068D02FE230E3208366
-:103906003183D7D0D6D0D5D00883D3D00983E5DF8D
-:103916002091190230E0488159812417350770F447
-:103926002F7171F481E00CC050D021E430E3E7CF71
-:103936000E94E21B002329F700E040C040931902D1
-:103946002091E8002F7E03C02091E8002E7F20936F
-:10395600E800209119022223F9F034D024FD1CC07E
-:1039660031D020FD03C02ED024FFFACF30E0232F24
-:103976003395203271F0A7E1B2E0ED91FC912591EB
-:10398600FC93EE932093F100FD0122812A95228378
-:1039960071F718D024FFD8CF813039F456D004FD02
-:1039A60004C053D000FFFDCF27D04FD004FFFDCF7A
-:1039B60011D00F7E23D00ED00B7FBAD02296E4E032
-:1039C6000C94E61E2091E8000895E7E1F2E022E17A
-:1039D600228308950091E80008957FDF0091220276
-:1039E60009D0F8DF0F770AD030D002FFFDCF30D0F4
-:1039F60005C000E00093F100EDDF0E7F0093E800C4
-:103A0600089520D01FD02091F100005829F00A9582
-:103A160069F00A9571F012C060DF009121020093EF
-:103A2600F100E7DF12D002FFFDCF09C056DF00E04C
-:103A3600F6CF53DF2F776ED00081F1CF84C008D048
-:103A460077C037D01091F10008950091E8000895ED
-:103A5600C1DF0B7FD3DFBEDF0F770895002319F098
-:103A6600025019F001C025D06EC0EBDF0023E1F74C
-:103A760020D00F7731F417D01091E800177F1093FC
-:103A8600E8000093E9001091EB0010FD02C047D05A
-:103A9600EBCF09D010E01093E90021E0F801E65ED3
-:103AA600FD4F208340C01091EB0010621093EB0095
-:103AB60008950091F1000895002319F0025019F0BD
-:103AC60001C0F7DF40C0BDDF0023E1F72091F10020
-:103AD6002F772093E9000091EB0000FD02C01FD074
-:103AE600F1CFA1F00091EB0000610093EB00422FB3
-:103AF60001E010E00E94CB1E0093EA0000E0009374
-:103B0600EA000091EB0008600093EB0008D002D0B9
-:103B1600008309C0F0E0E22FE65EFD4F089500E065
-:103B26000093E900089556DF077F68DF53DF0E7FB5
-:103B360065DF01E0089513D031F4CFDE5ADF85DF6B
-:103B460002FFFDCF7CCF00E0089509D009F0FBCF3E
-:103B5600C4DEE5DF51DF79DF00FFFDCFEACFA9DF65
-:103B6600A8DF1091F1001091F10000230895009153
-:103B7600D70001600093D7000C9482180C94A71804
-:103B86008A93FA93EA933A922A921A920A927A932B
-:103B96006A935A934A933A932A931A930A938FB73E
-:103BA60088D002FF05C082D002FF02C00BEF7BD097
-:103BB6000091DA0000FF02C00091D8007AD000FF21
-:103BC6001BC074D000FF18C001E000930E016AD03C
-:103BD60081D0006264D00EEF6FD0006177D06ED0D6
-:103BE6000F7D74D00091D80000620093D80009B50B
-:103BF6000D7F09BD00E009BD5CD004FF20C056D092
-:103C060004FF1DC009B500FD05C00E94031909B5D2
-:103C160000FFFDCF0091D8000F7D0093D80042D061
-:103C260000910E01002359F04CD00FEE45D00F7EC7
-:103C360050D0006434D042D0016048D042D039D050
-:103C460005FF0FC033D005FF0CC000E000930E0146
-:103C560035D00F7E3BD00FED2FD00F7D3AD00068C8
-:103C66001ED027D003FF0AC021D003FF07C007EFED
-:103C76001AD00E948D1B2ED0116011D08FBF0991D2
-:103C8600199129913991499159916991799109909F
-:103C9600199029903990E991F99189911895118394
-:103CA600008308950FEE0093E10008950091E2006D
-:103CB60008950091E10008950093E1000091E2006B
-:103CC6000895FCDF006202D0F9DF08600093E2008D
-:103CD6000895FCDFE3E2F2E00081118108950FB759
-:103CE6000078102FF89407EF04BFA89508E1009319
-:103CF600600000E000936000112309F078940895B5
-:103D06001FB71078412FF89403FB1EF420E230E031
-:103D160002C020E030E00770202B022F0860F894E4
-:103D2600A89518E11093600000936000442309F001
-:103D3600789408951FB71078412F03FB1EF420E2F4
-:103D460030E002C020E030E00770202B022F006434
-:103D5600F894A89518E1109360000093600044233E
-:103D660009F07894089500008895FECF04E60DBF0B
-:103D760002E00EBFC5EED2E00E947418002311F0D7
-:103D86000E94FD1E0E9465180E94B61E0C94B61E67
-:103D96004A951AF0000F111FFBCF0895BA92AA9206
-:103DA6009A928A927A926A925A924A92BA93AA936B
-:103DB6009A938A930895BB84AA84998488847F8081
-:103DC6006E805D804C80BB81AA8199818881F0E0FC
-:103DD600EC0FFD1FEF01089520E006D0E9F70895E6
-:103DE600259102D0E9F708952D9301501040202F18
-:103DF600212B089589E890E3FC0105911491FC01BB
-:103E06003296A591B491FC01349625913491422FB6
-:103E1600432B19F0F901E4DF01C0DEDF069610E35B
-:103E26008539910748F308952F930CD02F9101D02F
-:103E360008953CD0F12FE02F45E047BFE89536D0F6
-:103E460012D0089533D0F12FE02F43E047BFE89515
-:103E56002DD008952BD0F12FE02F43E047BFE895F2
-:103E660025D001D0089522D041E147BFE8951EC074
-:103E76001DD0F12FE02F41E247BFC895002D16C097
-:103E860015D0F12FE02F49E047BFC895002D0EC091
-:103E9600F32FE22F012E102E41E047BFE89506C012
-:103EA60005D0002E29E027BFE89500C0022E27B7CF
-:103EB60020FDFCCF202D0895022E27B726FDFCCF2E
-:103EC600202D08950E94D11E22974801C901DA01CA
-:103ED60010C05BD001E0A00E00E0B01E00E4A0160A
-:103EE60000E0B00608F440C0830120E030E00E9404
-:103EF6001C1F0A2F0B2B09F440C0082F0F7710E068
-:103F06002C01401A510A320100E4A02E03C00A2FE8
-:103F16000B2BE1F04816590680F0F40101914F0190
-:103F26000983119729F001914F010883119711C058
-:103F3600F2013196049108830CC0F20104910983C1
-:103F46003196E817F907A1F7F401EDCF1BD00883E6
-:103F560019839201088119810E944B1F16D0AA94D9
-:103F6600B1F62301AA24BB240DD0312F0F3F3F4FBA
-:103F760009F4AFCF83011DD0B7CF01E02296ECE064
-:103F86000C94DE1E82010C94611802E0400E00E0E3
-:103F9600501E08959A938A9380E090E08C0109D090
-:103FA60080589F4F8F3F0FE29007C0F389919991F8
-:103FB600089520E030E00C94251F0000000000006A
-:063FC60000000000FC00F9
-:103FE4000C94171F0C943B1F0C94431F0C944B1FF1
-:0C3FF4000C941C1F0C942D1F0C94531FE8
-:0400000300003000C9
-:00000001FF
diff --git a/util/bootloader_atmega32a_1_0_0.hex b/util/bootloader_atmega32a_1_0_0.hex
deleted file mode 100644
index b35a310d55a..00000000000
--- a/util/bootloader_atmega32a_1_0_0.hex
+++ /dev/null
@@ -1,154 +0,0 @@
-:107000000C9468380C94A0380C9485380C9485380E
-:107010000C9485380C9485380C9485380C948538FC
-:107020000C9485380C9485380C9485380C948538EC
-:107030000C9485380C9485380C9485380C948538DC
-:107040000C9485380C9485380C9485380C948538CC
-:107050000C9485380403090412036F006200640075
-:10706000650076002E00610074001003480049009E
-:10707000440042006F006F00740012011001000014
-:107080000008C016DF05000101020001090222000C
-:107090000101008032090400000103000000092101
-:1070A00001010001222100070581030800C8060034
-:1070B000FF0901A101150026FF007508850195064D
-:1070C0000900B20201850295830900B20201C000E5
-:1070D00011241FBECFE5D8E0DEBFCDBF10E0A0E693
-:1070E000B0E0ECE6F9E702C005900D92AA36B107D0
-:1070F000D9F710E0AAE6B0E001C01D92A43AB107AA
-:10710000E1F70E94173C0C94B43C0C940038A82F73
-:10711000B92F80E090E041E050EA609530E009C08E
-:107120002D9182279795879510F084279527305EBB
-:10713000C8F36F5FA8F30895EADF8D939D930895D8
-:10714000CF93CFB7CF93C395839BE9F7839B09C0B8
-:10715000839B07C0839B05C0839B03C0839B01C0A7
-:10716000A3C0DF93C0918700DD27C257DF4F839B09
-:1071700002C0DF91EBCF2F930F931F9300B32FEF3C
-:1071800003FB20F94F933F9310B34FEF012703FB0D
-:1071900021F93BE031C04E7F012F10B3216028C0A0
-:1071A000102F4D7F2260000000B329C04B7F246068
-:1071B000012F000010B32BC010B3477F28602AC0F6
-:1071C0004F7E00B320612CC04F7D10B320622FC0D2
-:1071D0004F7B00B3206432C0422700B349934FEF86
-:1071E0000000102713FB20F910B31C70C9F1297F90
-:1071F00091F2012703FB21F900B3237F89F231507B
-:1072000058F1102713FB22F910B3277E79F20127DA
-:1072100003FB23F92F7C81F200B3102713FB24F921
-:107220002F7971F200C010B3012703FB25F92F73EA
-:1072300059F200C000B3102713FB26F9223040F2A8
-:1072400000C010B3012703FB27F9243028F64F773D
-:10725000206810B30000F9CF10E41ABF002719C04E
-:107260003B503195C31BD04010E41ABF0881033C4A
-:10727000F9F00B34E9F0209185001981110F1213F8
-:10728000EDCF4A81441F093641F10D3211F0013E24
-:1072900029F700938C003F914F911F910F912F91EF
-:1072A000DF91CAB7C6FD4FCFCF91CFBFCF91189511
-:1072B00020918C00222379F310918A00112321F56B
-:1072C000343022F130938A00209386001091870099
-:1072D0003BE0311B3093870019C000918A000130D8
-:1072E0009CF40AE54F7081F43091600034FD10C0C9
-:1072F00000936000C9E7D0E00FC02795A8F4515073
-:10730000A9F4220F0000F9CF4AE503C042ED01C005
-:10731000432FC4E1D0E032E011B31C60939A11BB5B
-:1073200002B320E41CE05F93012756E002BB2795DF
-:1073300020F4515021F4220FF9CF012756E000002C
-:107340003B5A02BBD0F2279528F4515029F4220F62
-:107350000000F9CF012756E0279502BB20F45150D9
-:1073600021F4220FF9CF012756E02991332302BBE4
-:1073700021F6037F10918B00110FC651D04002BB44
-:1073800011F01093850010E41ABF086011B3137F49
-:10739000402F437F5F9100C000C002BB11BB42BBC6
-:1073A0007ACF80916D00882309F445C088EB9BE07B
-:1073B0000197F1F780916A008F5F80936A00909146
-:1073C00061008917B1F510926A0080916B008230DC
-:1073D000C1F0833028F4882341F0813041F50CC09E
-:1073E0008330B9F0843019F519C082B38C7A82BB2E
-:1073F00081E080936B0017C082B3836582BB82E01B
-:1074000004C082B38C7A82BB83E080936B008FE7E9
-:107410000BC082B3836582BB84E0F7CF82B38C7AE2
-:1074200082BB10926B008FEF8093610002C01092BC
-:107430006B0081E0089529B3237040916E000DC068
-:1074400089B330E090E0837090702817390711F00D
-:1074500040E001C04F5F29B32370463088F320938A
-:10746000720040936E00233018F481E080936D0029
-:1074700080916D00089585B7826085BF8BB7806469
-:107480008BBF0895F89481E180935700E8951BBE67
-:1074900015BE81E08BBF1BBE8B9AE0917700F09107
-:1074A0007800099521E020936C00FC0181818930EE
-:1074B00069F48281823029F420937500209384003E
-:1074C00003C082E0809384008FEF0895813011F033
-:1074D00080E0089582E690E0909389008093880090
-:1074E00087E00895CF93DF93DC01C0917000D091C5
-:1074F0007100413051F410926F001196CC911197A8
-:107500001296DC9112971496645030916F00360FEA
-:1075100030936F00AE014F7751F4F89483E0FE0191
-:1075200080935700E895789407B600FCFDCFF89457
-:10753000AE018D919C91119721E0FE010C012093E9
-:107540005700E895112478942296FE01EF7751F4C4
-:10755000F89485E0FA0180935700E895789407B68F
-:1075600000FCFDCF625011F01296D4CFD093710081
-:10757000C0937000832F8078DF91CF910895CF93CF
-:10758000DF93FC0180918400813071F4809175005B
-:10759000813029F410927500CF0141E002C0CF0183
-:1075A00040E00E94723A2FC0823061F581818130C3
-:1075B00011F40E94423A8F3F21F484E090E06FEF93
-:1075C00019C08E3F91F482B3836582BBC0E0D0E0E6
-:1075D000CE016FEF0E94A73C219684E0C030D8070F
-:1075E000B9F782B38C7A82BB0BC08D3F31F48281B4
-:1075F000938164810E94A73C03C081E08093760060
-:107600001092840081E0DF91CF9108951F93CF9372
-:10761000DF9360918A00635067FDBAC08091870054
-:10762000CCE0D0E0C81BD109C257DF4F8091860063
-:107630008D3209F09AC0683009F0A8C083EC8093BD
-:1076400079008AE5809360001092740088818076CA
-:1076500041F0CE010E94523A282F8F3F09F474C0A6
-:107660007AC09A81109282008981882321F4109235
-:10767000830022E062C0853019F490938B005CC0D7
-:10768000863009F04AC08B81813019F48AE790E78F
-:107690001BC0823041F48CE890E79093890080937E
-:1076A000880022E236C08330F9F48A81882341F4CD
-:1076B00084E590E7909389008093880024E029C0B6
-:1076C000813041F488E590E79093890080938800A9
-:1076D00022E11FC08230E1F48AE690E790938900AE
-:1076E0008093880020E115C0813241F48EE990E753
-:1076F000909389008093880029E00BC0823241F486
-:107700008EEA90E7909389008093880021E201C07F
-:1077100020E080E4809374001EC0883021F421E0D2
-:107720008DE890E00CC0893019F490938D0004C06E
-:107730008A3011F421E001C020E082E890E09093CB
-:1077400089008093880007C0888187FD2E8180E8AA
-:107750008093740006C08F81882319F48E8182176C
-:1077600008F0822F8093690011C08091740087FF18
-:107770000DC0CE010E94BF3A8F3F21F48EE180936D
-:10778000600004C0882311F01092690010928A00F2
-:107790008091600084FF3DC0809169008F3FC9F1F6
-:1077A000182F893008F018E0811B809369008091C0
-:1077B000790098E88927809379001123E1F0E0911E
-:1077C0008800F09189008091740086FF09C0912F94
-:1077D000AAE7B0E084918D9331969150D9F707C014
-:1077E000912FAAE7B0E081918D939150E1F7F0934A
-:1077F0008900E09388008AE790E0612F0E949C381E
-:10780000612F6C5F6C3019F08FEF8093690060938B
-:10781000600094E180B38C7031F49150D9F71092EC
-:107820008B0010928500DF91CF911F91089581B355
-:10783000836581BB82B38C7A82BB8D98959A8AB31B
-:107840008C7F8ABB8BB383608BBBB89AC09881E076
-:1078500090E00E948E3C80937300882349F481E07D
-:1078600080936D0081E090E06FEF0E94A73C08C01C
-:10787000E0E0F0E0E491EF3F19F481E080936D00E7
-:107880000E94D139882309F447C081E08BBF82E090
-:107890008BBF0E943B3A88E991E00E948E3C88238E
-:1078A00049F48B9A20E0A89588EB9BE00197F1F7CB
-:1078B0002150C9F78B9878940FEF10E0C0E0D0E02A
-:1078C00080916C008823B9F483E0C93ED80714F492
-:1078D000219611C0F89481E090E060E00E94963C0F
-:1078E0008B9A28E088E190E00FB6F894A89581BDC6
-:1078F0000FBE21BDFFCFA8950E94063B8091760068
-:10790000882331F0002319F4115011F405C00150FF
-:107910000E94D1398823A1F60E94423AE199FECF14
-:107920009FBB8EBBE09A99278DB30895262FE199CE
-:10793000FECF9FBB8EBBE09A01970DB2021631F0CD
-:107940002DBB0FB6F894E29AE19A0FBE0895262F48
-:10795000E199FECF9FBB8EBB2DBB0FB6F894E29A88
-:0C796000E19A0FBE01960895F894FFCF45
-:0A796C005A7F01800000800000FF38
-:040000030000700089
-:00000001FF
diff --git a/util/bootloader_atmega32u4_1_0_0.hex b/util/bootloader_atmega32u4_1.0.0.hex
similarity index 100%
rename from util/bootloader_atmega32u4_1_0_0.hex
rename to util/bootloader_atmega32u4_1.0.0.hex
diff --git a/util/bootloader_ps2avrgb_bootloadhid_1.0.1.hex b/util/bootloader_ps2avrgb_bootloadhid_1.0.1.hex
new file mode 100644
index 00000000000..0e4c872bbf5
--- /dev/null
+++ b/util/bootloader_ps2avrgb_bootloadhid_1.0.1.hex
@@ -0,0 +1,156 @@
+:107000000C9468380C94A0380C9485380C9485380E
+:107010000C9485380C9485380C9485380C948538FC
+:107020000C9485380C9485380C9485380C948538EC
+:107030000C9485380C9485380C9485380C948538DC
+:107040000C9485380C9485380C9485380C948538CC
+:107050000C9485380403090412036F006200640075
+:10706000650076002E00610074001003480049009E
+:10707000440042006F006F00740012011001000014
+:107080000008C016DF05010101020001090222000B
+:107090000101008032090400000103000000092101
+:1070A00001010001222100070581030800C8060034
+:1070B000FF0901A101150026FF007508850195064D
+:1070C0000900B20201850295830900B20201C000E5
+:1070D00011241FBECFE5D8E0DEBFCDBF10E0A0E693
+:1070E000B0E0E6E8F9E702C005900D92AA36B107D4
+:1070F000D9F710E0AAE6B0E001C01D92A43AB107AA
+:10710000E1F70E94243C0C94C13C0C940038A82F59
+:10711000B92F80E090E041E050EA609530E009C08E
+:107120002D9182279795879510F084279527305EBB
+:10713000C8F36F5FA8F30895EADF8D939D930895D8
+:10714000CF93CFB7CF93C395839BE9F7839B09C0B8
+:10715000839B07C0839B05C0839B03C0839B01C0A7
+:10716000A3C0DF93C0918700DD27C257DF4F839B09
+:1071700002C0DF91EBCF2F930F931F9300B32FEF3C
+:1071800003FB20F94F933F9310B34FEF012703FB0D
+:1071900021F93BE031C04E7F012F10B3216028C0A0
+:1071A000102F4D7F2260000000B329C04B7F246068
+:1071B000012F000010B32BC010B3477F28602AC0F6
+:1071C0004F7E00B320612CC04F7D10B320622FC0D2
+:1071D0004F7B00B3206432C0422700B349934FEF86
+:1071E0000000102713FB20F910B31C70C9F1297F90
+:1071F00091F2012703FB21F900B3237F89F231507B
+:1072000058F1102713FB22F910B3277E79F20127DA
+:1072100003FB23F92F7C81F200B3102713FB24F921
+:107220002F7971F200C010B3012703FB25F92F73EA
+:1072300059F200C000B3102713FB26F9223040F2A8
+:1072400000C010B3012703FB27F9243028F64F773D
+:10725000206810B30000F9CF10E41ABF002719C04E
+:107260003B503195C31BD04010E41ABF0881033C4A
+:10727000F9F00B34E9F0209185001981110F1213F8
+:10728000EDCF4A81441F093641F10D3211F0013E24
+:1072900029F700938C003F914F911F910F912F91EF
+:1072A000DF91CAB7C6FD4FCFCF91CFBFCF91189511
+:1072B00020918C00222379F310918A00112321F56B
+:1072C000343022F130938A00209386001091870099
+:1072D0003BE0311B3093870019C000918A000130D8
+:1072E0009CF40AE54F7081F43091600034FD10C0C9
+:1072F00000936000C9E7D0E00FC02795A8F4515073
+:10730000A9F4220F0000F9CF4AE503C042ED01C005
+:10731000432FC4E1D0E032E011B31C60939A11BB5B
+:1073200002B320E41CE05F93012756E002BB2795DF
+:1073300020F4515021F4220FF9CF012756E000002C
+:107340003B5A02BBD0F2279528F4515029F4220F62
+:107350000000F9CF012756E0279502BB20F45150D9
+:1073600021F4220FF9CF012756E02991332302BBE4
+:1073700021F6037F10918B00110FC651D04002BB44
+:1073800011F01093850010E41ABF086011B3137F49
+:10739000402F437F5F9100C000C002BB11BB42BBC6
+:1073A0007ACF80916D00882309F452C088EB9BE06E
+:1073B0000197F1F780916A008F5F80936A00909146
+:1073C0006100891709F042C010926A0080916B0039
+:1073D000833011F1843028F4813089F08230A0F4B8
+:1073E00007C0853019F18530E0F0863069F523C09B
+:1073F00082B38C7A82BB81E080936B0021C082B320
+:10740000836582BB82E004C082B38C7A82BB83E056
+:1074100080936B008FE715C082B3836582BB84E0E5
+:10742000F7CF82B38C7A82BB85E0F2CF82B38365DB
+:1074300082BB86E0EDCF82B38C7A82BB10926B0068
+:107440008FEF8093610002C010926B0081E008957D
+:1074500029B3237040916E000DC089B330E090E0F5
+:10746000837090702817390711F040E001C04F5F1A
+:1074700029B32370463088F32093720040936E0046
+:10748000233018F481E080936D0080916D000895A1
+:1074900085B7826085BF8BB780648BBF0895F894F1
+:1074A00081E180935700E8951BBE15BE81E08BBF3C
+:1074B0001BBE8B9AE0917700F0917800099521E04E
+:1074C00020936C00FC018181893069F482818230D3
+:1074D00029F4209375002093840003C082E08093F8
+:1074E00084008FEF0895813011F080E0089582E6E6
+:1074F00090E0909389008093880087E00895CF936F
+:10750000DF93DC01C0917000D0917100413051F4E3
+:1075100010926F001196CC9111971296DC911297F0
+:107520001496645030916F00360F30936F00AE01A7
+:107530004F7751F4F89483E0FE0180935700E8956B
+:10754000789407B600FCFDCFF894AE018D919C9124
+:10755000119721E0FE010C0120935700E8951124BA
+:1075600078942296FE01EF7751F4F89485E0FA01C1
+:1075700080935700E895789407B600FCFDCF6250E1
+:1075800011F01296D4CFD0937100C0937000832F66
+:107590008078DF91CF910895CF93DF93FC018091A4
+:1075A0008400813071F480917500813029F410924B
+:1075B0007500CF0141E002C0CF0140E00E947F3A58
+:1075C0002FC0823061F58181813011F40E944F3AE1
+:1075D0008F3F21F484E090E06FEF19C08E3F91F46B
+:1075E00082B3836582BBC0E0D0E0CE016FEF0E9422
+:1075F000B43C219684E0C030D807B9F782B38C7AC6
+:1076000082BB0BC08D3F31F48281938164810E94E3
+:10761000B43C03C081E0809376001092840081E046
+:10762000DF91CF9108951F93CF93DF9360918A00EC
+:10763000635067FDBAC080918700CCE0D0E0C81BE2
+:10764000D109C257DF4F809186008D3209F09AC070
+:10765000683009F0A8C083EC809379008AE58093B4
+:107660006000109274008881807641F0CE010E9403
+:107670005F3A282F8F3F09F474C07AC09A81109224
+:1076800082008981882321F41092830022E062C065
+:10769000853019F490938B005CC0863009F04AC0A5
+:1076A0008B81813019F48AE790E71BC0823041F466
+:1076B0008CE890E7909389008093880022E236C09E
+:1076C0008330F9F48A81882341F484E590E790932C
+:1076D00089008093880024E029C0813041F488E546
+:1076E00090E7909389008093880022E11FC0823048
+:1076F000E1F48AE690E7909389008093880020E186
+:1077000015C0813241F48EE990E79093890080930F
+:10771000880029E00BC0823241F48EEA90E7909312
+:1077200089008093880021E201C020E080E48093FA
+:1077300074001EC0883021F421E08DE890E00CC078
+:10774000893019F490938D0004C08A3011F421E03F
+:1077500001C020E082E890E0909389008093880047
+:1077600007C0888187FD2E8180E88093740006C061
+:107770008F81882319F48E81821708F0822F8093DD
+:10778000690011C08091740087FF0DC0CE010E9476
+:10779000CC3A8F3F21F48EE18093600004C08823AF
+:1077A00011F01092690010928A008091600084FFAD
+:1077B0003DC0809169008F3FC9F1182F893008F0D2
+:1077C00018E0811B809369008091790098E88927EF
+:1077D000809379001123E1F0E0918800F091890015
+:1077E0008091740086FF09C0912FAAE7B0E08491D0
+:1077F0008D9331969150D9F707C0912FAAE7B0E049
+:1078000081918D939150E1F7F0938900E093880086
+:107810008AE790E0612F0E949C38612F6C5F6C308A
+:1078200019F08FEF809369006093600094E180B35A
+:107830008C7031F49150D9F710928B001092850022
+:10784000DF91CF911F91089581B3836581BB82B38E
+:107850008C7A82BB8D98959A8AB38C7F8ABB8BB3C6
+:1078600083608BBBB89AC09881E090E00E949B3CFB
+:1078700080937300882349F481E080936D0081E058
+:1078800090E06FEF0E94B43C08C0E0E0F0E0E491CB
+:10789000EF3F19F481E080936D000E94D139882375
+:1078A00009F447C081E08BBF82E08BBF0E94483A59
+:1078B00088E991E00E949B3C882349F48B9A20E060
+:1078C000A89588EB9BE00197F1F72150C9F78B98B9
+:1078D00078940FEF10E0C0E0D0E080916C00882336
+:1078E000B9F487E2C131D80714F4219611C0F89495
+:1078F00081E090E060E00E94A33C8B9A28E088E160
+:1079000090E00FB6F894A89581BD0FBE21BDFFCFC2
+:10791000A8950E94133B80917600882331F00023C4
+:1079200019F4115011F405C001500E94D139882377
+:10793000A1F60E944F3AE199FECF9FBB8EBBE09A21
+:1079400099278DB30895262FE199FECF9FBB8EBB5B
+:10795000E09A01970DB2021631F02DBB0FB6F894E4
+:10796000E29AE19A0FBE0895262FE199FECF9FBBC0
+:107970008EBB2DBB0FB6F894E29AE19A0FBE01962A
+:067980000895F894FFCF0A
+:0A7986005A7F01800000800000FF1E
+:040000030000700089
+:00000001FF
diff --git a/util/elevate.exe b/util/elevate.exe
deleted file mode 100644
index fc6180ec92d..00000000000
Binary files a/util/elevate.exe and /dev/null differ
diff --git a/util/linux_install.sh b/util/linux_install.sh
index 048b2f3189c..d30f7865582 100755
--- a/util/linux_install.sh
+++ b/util/linux_install.sh
@@ -32,6 +32,7 @@ if grep ID /etc/os-release | grep -qE "fedora"; then
avr-libc \
binutils-avr32-linux-gnu \
clang \
+ avrdude \
dfu-util \
dfu-programmer \
diffutils \
@@ -67,6 +68,7 @@ elif grep ID /etc/os-release | grep -qE 'debian|ubuntu'; then
gcc-avr \
git \
libnewlib-arm-none-eabi \
+ avrdude \
libusb-dev \
python3 \
python3-pip \
@@ -105,17 +107,18 @@ elif grep ID /etc/os-release | grep -q gentoo; then
sudo touch /etc/portage/package.use/qmkfirmware
# tee is used here since sudo doesn't apply to >>
echo "sys-devel/gcc multilib" | sudo tee --append /etc/portage/package.use/qmkfirmware >/dev/null
- sudo emerge -auN \
+ sudo emerge -auN sys-devel/gcc
+ sudo emerge -au --noreplace \
app-arch/unzip \
app-arch/zip \
app-mobilephone/dfu-util \
+ dev-embedded/dfu-programmer \
dev-embedded/avrdude \
- dev-lang/python:3.5 \
net-misc/wget \
sys-devel/clang \
- sys-devel/gcc \
sys-devel/crossdev
- sudo crossdev -s4 --stable --g =4.9.4 --portage --verbose --target avr
+ sudo crossdev -s4 --stable --g \<9 --portage --verbose --target avr
+ sudo crossdev -s4 --stable --g \<9 --portage --verbose --target arm-none-eabi
echo "Done!"
else
echo "Quitting..."
@@ -126,13 +129,15 @@ elif grep ID /etc/os-release | grep -q sabayon; then
app-arch/unzip \
app-arch/zip \
app-mobilephone/dfu-util \
+ dev-embedded/dfu-programmer \
dev-embedded/avrdude \
dev-lang/python \
net-misc/wget \
sys-devel/clang \
sys-devel/gcc \
sys-devel/crossdev
- sudo crossdev -s4 --stable --g =4.9.4 --portage --verbose --target avr
+ sudo crossdev -s4 --stable --g \<9 --portage --verbose --target avr
+ sudo crossdev -s4 --stable --g \<9 --portage --verbose --target arm-none-eabi
echo "Done!"
elif grep ID /etc/os-release | grep -qE "opensuse|tumbleweed"; then
@@ -150,7 +155,8 @@ elif grep ID /etc/os-release | grep -qE "opensuse|tumbleweed"; then
cross-avr-binutils \
cross-arm-none-newlib-devel \
cross-arm-binutils cross-arm-none-newlib-devel \
- dfu-tool \
+ avrdude \
+ dfu-util \
dfu-programmer \
gcc \
libusb-devel \
@@ -215,6 +221,7 @@ elif grep ID /etc/os-release | grep -q void; then
avr-gcc \
avr-libc \
$CROSS_ARM \
+ avrdude \
dfu-programmer \
dfu-util \
gcc \
diff --git a/util/msys2_install.sh b/util/msys2_install.sh
index 001f55dc480..55df9c007b8 100755
--- a/util/msys2_install.sh
+++ b/util/msys2_install.sh
@@ -4,11 +4,10 @@ dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P)
download_dir=~/qmk_utils
avrtools=avr8-gnu-toolchain
armtools=gcc-arm-none-eabi
-installflip=false
util_dir=$(dirname "$0")
echo "Installing dependencies needed for the installation (quazip)"
-pacman --needed --noconfirm --disable-download-timeout -Sy base-devel mingw-w64-x86_64-toolchain mingw-w64-x86_64-clang msys/git msys/p7zip mingw-w64-x86_64-python3-pip msys/unzip
+pacman --needed --noconfirm --disable-download-timeout -Sy base-devel mingw-w64-x86_64-toolchain mingw-w64-x86_64-clang git mingw-w64-x86_64-python3-pip unzip
source "$dir/win_shared_install.sh"
@@ -31,19 +30,8 @@ function install_arm {
rm gcc-arm-none-eabi-8-2019-q3-update-win32.zip
}
-function extract_flip {
- rm -f -r flip
- 7z -oflip x FlipInstaller.exe
-}
-
pushd "$download_dir"
-if [ -f "FlipInstaller.exe" ]; then
- echo
- echo "Extracting flip"
- extract_flip
-fi
-
if [ ! -d "$avrtools" ]; then
echo
echo "The AVR toolchain is not installed."
diff --git a/util/win_shared_install.sh b/util/win_shared_install.sh
index 1265cb027f5..072ca47c817 100755
--- a/util/win_shared_install.sh
+++ b/util/win_shared_install.sh
@@ -22,10 +22,6 @@ function install_utils {
wget 'https://www.obdev.at/downloads/vusb/bootloadHID.2012-12-08.zip'
unzip bootloadHID.2012-12-08.zip
- echo "Installing Atmel Flip"
- wget 'http://ww1.microchip.com/downloads/en/DeviceDoc/Flip%20Installer%20-%203.4.7.112.exe'
- mv Flip\ Installer\ \-\ 3.4.7.112.exe FlipInstaller.exe
-
echo "Downloading the QMK driver installer"
wget -qO- https://api.github.com/repos/qmk/qmk_driver_installer/releases | grep browser_download_url | head -n 1 | cut -d '"' -f 4 | wget -i -
diff --git a/util/wsl_install.sh b/util/wsl_install.sh
index 197d9f089ef..8ed177ca3e9 100755
--- a/util/wsl_install.sh
+++ b/util/wsl_install.sh
@@ -31,21 +31,6 @@ source "$dir/win_shared_install.sh"
pip3 install -r ${util_dir}/../requirements.txt
-pushd "$download_dir"
-while true; do
- echo
- echo "Flip need to be installed if you want to use that for programming."
- echo "Please install it to the default location!"
- read -p "Do you want to install it now? (Y/N) " res
- case $res in
- [Yy]* ) cmd.exe /c FlipInstaller.exe; break;;
- [Nn]* ) break;;
- * ) echo "Invalid answer";;
- esac
-done
-popd
-
-
echo
echo "Creating a softlink to the utils directory as ~/qmk_utils."
echo "This is needed so that the the make system can find all utils it need."