summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitmodules8
-rw-r--r--Makefile13
-rw-r--r--Vagrantfile2
-rw-r--r--common_features.mk7
-rw-r--r--docs/ChangeLog/20200530.md239
-rw-r--r--docs/_summary.md7
-rw-r--r--docs/breaking_changes.md47
-rw-r--r--docs/breaking_changes_instructions.md2
-rw-r--r--docs/cli.md9
-rw-r--r--docs/cli_commands.md37
-rw-r--r--docs/cli_configuration.md2
-rw-r--r--docs/cli_development.md2
-rw-r--r--docs/config_options.md9
-rw-r--r--docs/configurator_step_by_step.md2
-rw-r--r--docs/custom_quantum_functions.md57
-rw-r--r--docs/de/README.md2
-rw-r--r--docs/de/_summary.md2
-rw-r--r--docs/de/newbs_learn_more_resources.md2
-rw-r--r--docs/eeprom_driver.md29
-rw-r--r--docs/es/README.md2
-rw-r--r--docs/es/_summary.md2
-rw-r--r--docs/es/newbs_best_practices.md2
-rw-r--r--docs/es/newbs_building_firmware_configurator.md2
-rw-r--r--docs/es/newbs_learn_more_resources.md2
-rw-r--r--docs/faq_build.md16
-rw-r--r--docs/feature_hd44780.md6
-rw-r--r--docs/feature_pointing_device.md15
-rw-r--r--docs/feature_rawhid.md6
-rw-r--r--docs/feature_rgb_matrix.md19
-rw-r--r--docs/feature_rgblight.md74
-rw-r--r--docs/feature_split_keyboard.md13
-rw-r--r--docs/feature_swap_hands.md1
-rw-r--r--docs/feature_userspace.md6
-rw-r--r--docs/fr-fr/README.md6
-rw-r--r--docs/fr-fr/breaking_changes.md2
-rw-r--r--docs/fr-fr/getting_started_github.md4
-rw-r--r--docs/fr-fr/newbs_best_practices.md2
-rw-r--r--docs/getting_started_docker.md47
-rw-r--r--docs/getting_started_github.md12
-rw-r--r--docs/he-il/README.md2
-rw-r--r--docs/he-il/_summary.md4
-rw-r--r--docs/he-il/getting_started_getting_help.md2
-rw-r--r--docs/he-il/getting_started_github.md10
-rw-r--r--docs/isp_flashing_guide.md18
-rw-r--r--docs/ja/cli_configuration.md2
-rw-r--r--docs/ja/custom_quantum_functions.md8
-rw-r--r--docs/ja/feature_hd44780.md2
-rw-r--r--docs/ja/feature_layouts.md114
-rw-r--r--docs/ja/feature_leader_key.md151
-rw-r--r--docs/ja/feature_led_matrix.md95
-rw-r--r--docs/ja/feature_mouse_keys.md127
-rw-r--r--docs/ja/feature_pointing_device.md49
-rw-r--r--docs/ja/feature_thermal_printer.md15
-rw-r--r--docs/ja/feature_velocikey.md35
-rw-r--r--docs/ja/getting_started_github.md8
-rw-r--r--docs/ja/newbs_building_firmware_configurator.md2
-rw-r--r--docs/ja/newbs_learn_more_resources.md4
-rw-r--r--docs/keycodes.md1
-rw-r--r--docs/keymap.md20
-rw-r--r--docs/newbs_flashing.md82
-rw-r--r--docs/newbs_getting_started.md28
-rw-r--r--docs/other_vscode.md2
-rw-r--r--docs/proton_c_conversion.md2
-rw-r--r--docs/pt-br/README.md2
-rw-r--r--docs/pt-br/_summary.md2
-rw-r--r--docs/reference_keymap_extras.md80
-rw-r--r--docs/ru-ru/_summary.md2
-rw-r--r--docs/ru-ru/getting_started_github.md4
-rw-r--r--docs/serial_driver.md69
-rw-r--r--docs/support.md2
-rw-r--r--docs/tap_hold.md87
-rw-r--r--docs/zh-cn/README.md2
-rw-r--r--docs/zh-cn/_summary.md2
-rw-r--r--docs/zh-cn/custom_quantum_functions.md6
-rw-r--r--docs/zh-cn/getting_started_getting_help.md2
-rw-r--r--docs/zh-cn/getting_started_github.md12
-rw-r--r--docs/zh-cn/newbs_building_firmware.md2
-rw-r--r--doxygen-todo1
-rw-r--r--drivers/avr/apa102.c2
-rw-r--r--drivers/avr/i2c_master.c2
-rw-r--r--drivers/avr/i2c_master.h2
-rw-r--r--drivers/avr/i2c_slave.c2
-rw-r--r--drivers/avr/i2c_slave.h2
-rw-r--r--drivers/chibios/serial.c290
-rw-r--r--drivers/chibios/serial.h62
-rw-r--r--drivers/chibios/serial_usart.c234
-rw-r--r--drivers/eeprom/eeprom_driver.c6
-rw-r--r--drivers/eeprom/eeprom_i2c.c39
-rw-r--r--drivers/eeprom/eeprom_spi.c232
-rw-r--r--drivers/eeprom/eeprom_spi.h80
-rw-r--r--drivers/issi/is31fl3731.c2
-rw-r--r--drivers/oled/oled_driver.c2
-rw-r--r--keyboards/1upkeyboards/super16/keymaps/nblyumberg/config.h13
-rw-r--r--keyboards/1upkeyboards/super16/keymaps/nblyumberg/keymap.c127
-rw-r--r--keyboards/1upkeyboards/super16/keymaps/nblyumberg/readme.md6
-rw-r--r--keyboards/1upkeyboards/super16/keymaps/nblyumberg/rules.mk2
-rw-r--r--keyboards/2_milk/config.h41
-rw-r--r--keyboards/2_milk/info.json14
-rw-r--r--keyboards/2_milk/readme.md19
-rw-r--r--keyboards/40percentclub/gherkin/keymaps/stevexyz/keymap.c100
-rw-r--r--keyboards/40percentclub/gherkin/keymaps/stevexyz/readme.md14
-rw-r--r--keyboards/8pack/readme.md2
-rw-r--r--keyboards/abacus/readme.md2
-rw-r--r--keyboards/acheron/elongate/config.h250
-rw-r--r--keyboards/acheron/elongate/elongate.c26
-rw-r--r--keyboards/acheron/elongate/elongate.h44
-rw-r--r--keyboards/acheron/elongate/info.json70
-rw-r--r--keyboards/acheron/elongate/keymaps/default/keymap.c34
-rw-r--r--keyboards/acheron/elongate/keymaps/default/readme.md1
-rw-r--r--keyboards/acheron/elongate/keymaps/via/config.h3
-rw-r--r--keyboards/acheron/elongate/keymaps/via/keymap.c34
-rw-r--r--keyboards/acheron/elongate/keymaps/via/rules.mk1
-rw-r--r--keyboards/acheron/elongate/readme.md25
-rw-r--r--keyboards/acheron/elongate/rules.mk34
-rw-r--r--keyboards/allison/readme.md2
-rw-r--r--keyboards/allison_numpad/readme.md2
-rw-r--r--keyboards/alps64/config.h8
-rw-r--r--keyboards/alps64/keymaps/via/keymap.c37
-rw-r--r--keyboards/alps64/keymaps/via/rules.mk4
-rw-r--r--keyboards/alps64/readme.md2
-rw-r--r--keyboards/aos/tkl/config.h56
-rw-r--r--keyboards/aos/tkl/info.json98
-rw-r--r--keyboards/aos/tkl/keymaps/aholland909/keymap.c38
-rw-r--r--keyboards/aos/tkl/keymaps/default/keymap.c38
-rw-r--r--keyboards/aos/tkl/keymaps/default/readme.md3
-rw-r--r--keyboards/aos/tkl/keymaps/via/keymap.c55
-rw-r--r--keyboards/aos/tkl/keymaps/via/rules.mk2
-rw-r--r--keyboards/aos/tkl/readme.md13
-rw-r--r--keyboards/aos/tkl/rules.mk32
-rw-r--r--keyboards/aos/tkl/tkl.c18
-rw-r--r--keyboards/aos/tkl/tkl.h46
-rw-r--r--keyboards/arabica37/arabica37.c1
-rw-r--r--keyboards/arabica37/arabica37.h5
-rw-r--r--keyboards/arabica37/config.h21
-rw-r--r--keyboards/arabica37/info.json65
-rw-r--r--keyboards/arabica37/keymaps/default/config.h42
-rw-r--r--keyboards/arabica37/keymaps/default/keymap.c199
-rw-r--r--keyboards/arabica37/keymaps/default/rules.mk1
-rw-r--r--keyboards/arabica37/lib/glcdfont.c232
-rw-r--r--keyboards/arabica37/readme.md15
-rw-r--r--keyboards/arabica37/rev1/config.h82
-rw-r--r--keyboards/arabica37/rev1/rev1.c1
-rw-r--r--keyboards/arabica37/rev1/rev1.h23
-rw-r--r--keyboards/arabica37/rev1/rules.mk33
-rw-r--r--keyboards/ares/rules.mk2
-rw-r--r--keyboards/at101_bh/at101_bh.c1
-rw-r--r--keyboards/at101_bh/at101_bh.h25
-rw-r--r--keyboards/at101_bh/config.h35
-rw-r--r--keyboards/at101_bh/info.json121
-rw-r--r--keyboards/at101_bh/keymaps/default/keymap.c (renamed from keyboards/at101_blackheart/keymaps/default/keymap.c)0
-rw-r--r--keyboards/at101_bh/readme.md15
-rw-r--r--keyboards/at101_bh/rules.mk (renamed from keyboards/at101_blackheart/rules.mk)0
-rw-r--r--keyboards/at101_blackheart/at101_blackheart.c1
-rw-r--r--keyboards/at101_blackheart/at101_blackheart.h28
-rw-r--r--keyboards/at101_blackheart/config.h35
-rw-r--r--keyboards/at101_blackheart/info.json121
-rw-r--r--keyboards/at101_blackheart/readme.md15
-rw-r--r--keyboards/atomic/keymaps/pvc/keymap.c6
-rw-r--r--keyboards/atreus/astar_mirrored/config.h2
-rw-r--r--keyboards/atreus/keymaps/xyverz/config.h4
-rw-r--r--keyboards/atreus/keymaps/xyverz/keymap.c13
-rw-r--r--keyboards/atreus/keymaps/xyverz/readme.md4
-rw-r--r--keyboards/atreus62/keymaps/atreus52/keymap.c17
-rw-r--r--keyboards/atreus62/keymaps/scheiklp/config.h51
-rw-r--r--keyboards/atreus62/keymaps/scheiklp/keymap.c43
-rw-r--r--keyboards/atreus62/keymaps/scheiklp/readme.md13
-rw-r--r--keyboards/atreus62/keymaps/scheiklp/rules.mk4
-rw-r--r--keyboards/aves65/aves65.c1
-rw-r--r--keyboards/aves65/aves65.h19
-rw-r--r--keyboards/aves65/config.h61
-rw-r--r--keyboards/aves65/info.json85
-rw-r--r--keyboards/aves65/keymaps/default/keymap.c18
-rw-r--r--keyboards/aves65/readme.md15
-rw-r--r--keyboards/aves65/rules.mk34
-rw-r--r--keyboards/baguette/readme.md2
-rw-r--r--keyboards/bakeneko80/bakeneko80.c17
-rw-r--r--keyboards/bakeneko80/bakeneko80.h44
-rw-r--r--keyboards/bakeneko80/config.h250
-rw-r--r--keyboards/bakeneko80/info.json13
-rw-r--r--keyboards/bakeneko80/keymaps/default/keymap.c40
-rw-r--r--keyboards/bakeneko80/keymaps/default/readme.md1
-rw-r--r--keyboards/bakeneko80/readme.md13
-rw-r--r--keyboards/bakeneko80/rules.mk34
-rw-r--r--keyboards/basekeys/slice/rev1/config.h2
-rw-r--r--keyboards/basekeys/slice/rev1_rgb/config.h2
-rw-r--r--keyboards/bfake/rules.mk2
-rw-r--r--keyboards/boardsource/3x4/3x4.c1
-rw-r--r--keyboards/boardsource/3x4/3x4.h12
-rw-r--r--keyboards/boardsource/3x4/config.h144
-rw-r--r--keyboards/boardsource/3x4/info.json28
-rw-r--r--keyboards/boardsource/3x4/keymaps/default/keymap.c25
-rw-r--r--keyboards/boardsource/3x4/readme.md14
-rw-r--r--keyboards/boardsource/3x4/rules.mk31
-rw-r--r--keyboards/bpiphany/pegasushoof/keymaps/blowrak/keymap.c8
-rw-r--r--keyboards/candybar/lefty/config.h4
-rw-r--r--keyboards/candybar/lefty/keymaps/via/keymap.c38
-rw-r--r--keyboards/candybar/lefty/keymaps/via/rules.mk1
-rw-r--r--keyboards/candybar/lefty/rules.mk2
-rw-r--r--keyboards/candybar/righty/config.h4
-rw-r--r--keyboards/candybar/righty/keymaps/via/keymap.c38
-rw-r--r--keyboards/candybar/righty/keymaps/via/rules.mk1
-rw-r--r--keyboards/candybar/righty/rules.mk2
-rw-r--r--keyboards/chidori/keymaps/oled_sample/keymap.c217
-rw-r--r--keyboards/chidori/keymaps/oled_sample/readme.md1
-rw-r--r--keyboards/chidori/keymaps/oled_sample/rules.mk2
-rw-r--r--keyboards/chimera_ortho_plus/chimera_ortho_plus.c23
-rw-r--r--keyboards/chimera_ortho_plus/chimera_ortho_plus.h38
-rw-r--r--keyboards/chimera_ortho_plus/config.h76
-rw-r--r--keyboards/chimera_ortho_plus/info.json65
-rw-r--r--keyboards/chimera_ortho_plus/keymaps/default/config.h5
-rw-r--r--keyboards/chimera_ortho_plus/keymaps/default/keymap.c185
-rw-r--r--keyboards/chimera_ortho_plus/matrix.c154
-rw-r--r--keyboards/chimera_ortho_plus/readme.md15
-rw-r--r--keyboards/chimera_ortho_plus/rules.mk37
-rwxr-xr-xkeyboards/ckeys/handwire_101/config.h6
-rwxr-xr-xkeyboards/ckeys/handwire_101/rules.mk2
-rw-r--r--keyboards/clawsome/bookerboard/bookerboard.c16
-rw-r--r--keyboards/clawsome/bookerboard/bookerboard.h30
-rw-r--r--keyboards/clawsome/bookerboard/config.h47
-rw-r--r--keyboards/clawsome/bookerboard/info.json28
-rw-r--r--keyboards/clawsome/bookerboard/keymaps/default/keymap.c37
-rw-r--r--keyboards/clawsome/bookerboard/readme.md13
-rw-r--r--keyboards/clawsome/bookerboard/rules.mk33
-rw-r--r--keyboards/clueboard/2x1800/2018/2018.c57
-rw-r--r--keyboards/clueboard/2x1800/2018/2018.h (renamed from keyboards/clueboard/2x1800/2x1800.h)0
-rw-r--r--keyboards/clueboard/2x1800/2018/config.h195
-rw-r--r--keyboards/clueboard/2x1800/2018/info.json42
-rw-r--r--keyboards/clueboard/2x1800/2018/keymaps/default/config.h (renamed from keyboards/clueboard/2x1800/keymaps/default/config.h)0
-rw-r--r--keyboards/clueboard/2x1800/2018/keymaps/default/keymap.json11
-rw-r--r--keyboards/clueboard/2x1800/2018/keymaps/default/readme.md (renamed from keyboards/clueboard/2x1800/keymaps/default/readme.md)0
-rw-r--r--keyboards/clueboard/2x1800/2018/keymaps/default_4u/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/2018/keymaps/default_4u/readme.md (renamed from keyboards/clueboard/2x1800/keymaps/default_4u/readme.md)0
-rw-r--r--keyboards/clueboard/2x1800/2018/keymaps/default_7u/keymap.c (renamed from keyboards/clueboard/2x1800/keymaps/default_7u/keymap.c)0
-rw-r--r--keyboards/clueboard/2x1800/2018/keymaps/default_7u/readme.md (renamed from keyboards/clueboard/2x1800/keymaps/default_7u/readme.md)0
-rw-r--r--keyboards/clueboard/2x1800/2018/keymaps/macroboard/keymap.c123
-rw-r--r--keyboards/clueboard/2x1800/2018/keymaps/macroboard/readme.md (renamed from keyboards/clueboard/2x1800/keymaps/macroboard/readme.md)0
-rw-r--r--keyboards/clueboard/2x1800/2018/keymaps/mouseboard_left/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/2018/keymaps/mouseboard_left/readme.md (renamed from keyboards/clueboard/2x1800/keymaps/mouseboard_left/readme.md)0
-rw-r--r--keyboards/clueboard/2x1800/2018/keymaps/mouseboard_right/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/2018/keymaps/mouseboard_right/readme.md (renamed from keyboards/clueboard/2x1800/keymaps/mouseboard_right/readme.md)0
-rw-r--r--keyboards/clueboard/2x1800/2018/readme.md13
-rw-r--r--keyboards/clueboard/2x1800/2018/rules.mk (renamed from keyboards/clueboard/2x1800/rules.mk)0
-rw-r--r--keyboards/clueboard/2x1800/2019/2019.c182
-rw-r--r--keyboards/clueboard/2x1800/2019/2019.h257
-rw-r--r--keyboards/clueboard/2x1800/2019/config.h214
-rw-r--r--keyboards/clueboard/2x1800/2019/info.json42
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default/keymap.json11
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default/readme.md1
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_1u_ansi/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_1u_ansi/readme.md1
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_1u_iso/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_1u_iso/readme.md1
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_2u_ansi/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_2u_ansi/readme.md1
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_2u_iso/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_2u_iso/readme.md1
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_4u_ansi/config.h19
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_4u_ansi/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_4u_ansi/readme.md1
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/config.h19
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/readme.md1
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/config.h19
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/readme.md1
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/config.h19
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/readme.md1
-rw-r--r--keyboards/clueboard/2x1800/2019/readme.md13
-rw-r--r--keyboards/clueboard/2x1800/2019/rules.mk25
-rw-r--r--keyboards/clueboard/2x1800/2x1800.c57
-rw-r--r--keyboards/clueboard/2x1800/config.h195
-rw-r--r--keyboards/clueboard/2x1800/info.json39
-rw-r--r--keyboards/clueboard/2x1800/keymaps/default/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/keymaps/default_4u/config.h21
-rw-r--r--keyboards/clueboard/2x1800/keymaps/default_4u/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/keymaps/default_7u/config.h21
-rw-r--r--keyboards/clueboard/2x1800/keymaps/macroboard/config.h21
-rw-r--r--keyboards/clueboard/2x1800/keymaps/macroboard/keymap.c123
-rw-r--r--keyboards/clueboard/2x1800/keymaps/mouseboard_left/config.h21
-rw-r--r--keyboards/clueboard/2x1800/keymaps/mouseboard_left/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/keymaps/mouseboard_right/config.h21
-rw-r--r--keyboards/clueboard/2x1800/keymaps/mouseboard_right/keymap.c28
-rw-r--r--keyboards/clueboard/2x1800/readme.md7
-rw-r--r--keyboards/clueboard/card/keymaps/default/keymap.c3
-rw-r--r--keyboards/clueboard/card/keymaps/default/rules.mk2
-rwxr-xr-xkeyboards/contra/config.h4
-rw-r--r--keyboards/contra/keymaps/via/keymap.c98
-rw-r--r--keyboards/contra/keymaps/via/readme.md2
-rw-r--r--keyboards/contra/keymaps/via/rules.mk1
-rw-r--r--keyboards/converter/siemens_tastatur/readme.md2
-rw-r--r--keyboards/converter/usb_usb/keymaps/chriskopher/keymap.c2
-rw-r--r--keyboards/converter/usb_usb/keymaps/coloneljesus/keymap.c6
-rw-r--r--keyboards/coseyfannitutti/discipad/rules.mk3
-rw-r--r--keyboards/coseyfannitutti/discipline/rules.mk3
-rw-r--r--keyboards/coseyfannitutti/mysterium/rules.mk3
-rw-r--r--keyboards/coseyfannitutti/romeo/romeo.h2
-rw-r--r--keyboards/coseyfannitutti/romeo/rules.mk4
-rw-r--r--keyboards/crkbd/keymaps/drashna/keymap.c2
-rw-r--r--keyboards/crkbd/rev1/split_scomm.c6
-rw-r--r--keyboards/crkbd/ssd1306.c140
-rw-r--r--keyboards/cu75/cu75.c2
-rw-r--r--keyboards/db/db63/rules.mk2
-rw-r--r--keyboards/dm9records/ergoinu/config.h (renamed from keyboards/ergoinu/config.h)0
-rw-r--r--keyboards/dm9records/ergoinu/ergoinu.c (renamed from keyboards/ergoinu/ergoinu.c)0
-rw-r--r--keyboards/dm9records/ergoinu/ergoinu.h (renamed from keyboards/ergoinu/ergoinu.h)0
-rw-r--r--keyboards/dm9records/ergoinu/info.json87
-rw-r--r--keyboards/dm9records/ergoinu/keymaps/default/config.h (renamed from keyboards/ergoinu/keymaps/default/config.h)0
-rw-r--r--keyboards/dm9records/ergoinu/keymaps/default/keymap.c (renamed from keyboards/ergoinu/keymaps/default/keymap.c)0
-rw-r--r--keyboards/dm9records/ergoinu/keymaps/default/rules.mk (renamed from keyboards/ergoinu/keymaps/default/rules.mk)0
-rw-r--r--keyboards/dm9records/ergoinu/keymaps/default_jis/config.h (renamed from keyboards/ergoinu/keymaps/default_jis/config.h)0
-rw-r--r--keyboards/dm9records/ergoinu/keymaps/default_jis/keymap.c (renamed from keyboards/ergoinu/keymaps/default_jis/keymap.c)0
-rw-r--r--keyboards/dm9records/ergoinu/keymaps/default_jis/rules.mk (renamed from keyboards/ergoinu/keymaps/default_jis/rules.mk)0
-rw-r--r--keyboards/dm9records/ergoinu/matrix.c (renamed from keyboards/ergoinu/matrix.c)0
-rw-r--r--keyboards/dm9records/ergoinu/readme.md21
-rw-r--r--keyboards/dm9records/ergoinu/rules.mk49
-rw-r--r--keyboards/dm9records/ergoinu/serial.c (renamed from keyboards/ergoinu/serial.c)0
-rw-r--r--keyboards/dm9records/ergoinu/serial.h (renamed from keyboards/ergoinu/serial.h)0
-rw-r--r--keyboards/dm9records/ergoinu/serial_config.h (renamed from keyboards/ergoinu/serial_config.h)0
-rw-r--r--keyboards/dm9records/ergoinu/split_util.c (renamed from keyboards/ergoinu/split_util.c)0
-rw-r--r--keyboards/dm9records/ergoinu/split_util.h (renamed from keyboards/ergoinu/split_util.h)0
-rw-r--r--keyboards/dm9records/plaid/config.h (renamed from keyboards/plaid/config.h)0
-rw-r--r--keyboards/dm9records/plaid/info.json113
-rw-r--r--keyboards/dm9records/plaid/keymaps/brickbots/config.h (renamed from keyboards/plaid/keymaps/brickbots/config.h)0
-rw-r--r--keyboards/dm9records/plaid/keymaps/brickbots/keymap.c (renamed from keyboards/plaid/keymaps/brickbots/keymap.c)0
-rw-r--r--keyboards/dm9records/plaid/keymaps/brickbots/readme.md (renamed from keyboards/plaid/keymaps/brickbots/readme.md)0
-rw-r--r--keyboards/dm9records/plaid/keymaps/default/config.h (renamed from keyboards/plaid/keymaps/default/config.h)0
-rw-r--r--keyboards/dm9records/plaid/keymaps/default/keymap.c (renamed from keyboards/plaid/keymaps/default/keymap.c)0
-rw-r--r--keyboards/dm9records/plaid/keymaps/default/readme.md (renamed from keyboards/plaid/keymaps/default/readme.md)0
-rw-r--r--keyboards/dm9records/plaid/keymaps/thehalfdeafchef/config.h (renamed from keyboards/plaid/keymaps/thehalfdeafchef/config.h)0
-rw-r--r--keyboards/dm9records/plaid/keymaps/thehalfdeafchef/keymap.c (renamed from keyboards/plaid/keymaps/thehalfdeafchef/keymap.c)0
-rw-r--r--keyboards/dm9records/plaid/keymaps/thehalfdeafchef/readme.md (renamed from keyboards/plaid/keymaps/thehalfdeafchef/readme.md)0
-rw-r--r--keyboards/dm9records/plaid/keymaps/via/config.h (renamed from keyboards/plaid/keymaps/via/config.h)0
-rw-r--r--keyboards/dm9records/plaid/keymaps/via/keymap.c (renamed from keyboards/plaid/keymaps/via/keymap.c)0
-rw-r--r--keyboards/dm9records/plaid/keymaps/via/readme.md (renamed from keyboards/plaid/keymaps/via/readme.md)0
-rw-r--r--keyboards/dm9records/plaid/keymaps/via/rules.mk (renamed from keyboards/plaid/keymaps/via/rules.mk)0
-rw-r--r--keyboards/dm9records/plaid/plaid.c (renamed from keyboards/plaid/plaid.c)0
-rw-r--r--keyboards/dm9records/plaid/plaid.h (renamed from keyboards/plaid/plaid.h)0
-rw-r--r--keyboards/dm9records/plaid/readme.md23
-rw-r--r--keyboards/dm9records/plaid/rules.mk36
-rw-r--r--keyboards/dm9records/tartan/config.h (renamed from keyboards/tartan/config.h)0
-rw-r--r--keyboards/dm9records/tartan/info.json34
-rw-r--r--keyboards/dm9records/tartan/keymaps/default/keymap.c (renamed from keyboards/tartan/keymaps/default/keymap.c)0
-rw-r--r--keyboards/dm9records/tartan/keymaps/default/readme.md (renamed from keyboards/tartan/keymaps/default/readme.md)0
-rw-r--r--keyboards/dm9records/tartan/readme.md25
-rw-r--r--keyboards/dm9records/tartan/rules.mk36
-rw-r--r--keyboards/dm9records/tartan/tartan.c (renamed from keyboards/tartan/tartan.c)0
-rw-r--r--keyboards/dm9records/tartan/tartan.h (renamed from keyboards/tartan/tartan.h)0
-rw-r--r--keyboards/donutcables/budget96/rules.mk2
-rw-r--r--keyboards/doro67/multi/keymaps/konstantin/config.h2
-rw-r--r--keyboards/doro67/multi/keymaps/konstantin/rules.mk15
-rw-r--r--keyboards/dz60/config.h41
-rw-r--r--keyboards/dz60/dz60.c23
-rw-r--r--keyboards/dz60/dz60.h5
-rw-r--r--keyboards/dz60/info.json173
-rw-r--r--keyboards/dz60/keymaps/default/keymap.c34
-rw-r--r--keyboards/dz60/readme.md8
-rw-r--r--keyboards/dz60/rules.mk27
-rw-r--r--keyboards/dztech/dz65rgb/dz65rgb.c2
-rw-r--r--keyboards/dztech/dz65rgb/keymaps/drootz/config.h52
-rw-r--r--keyboards/dztech/dz65rgb/keymaps/drootz/keymap.c757
-rw-r--r--keyboards/dztech/dz65rgb/keymaps/drootz/readme.md210
-rw-r--r--keyboards/dztech/dz65rgb/keymaps/drootz/rules.mk11
-rw-r--r--keyboards/eco/rules.mk2
-rw-r--r--keyboards/eniigmakeyboards/ek87/config.h250
-rw-r--r--keyboards/eniigmakeyboards/ek87/ek87.c17
-rw-r--r--keyboards/eniigmakeyboards/ek87/ek87.h150
-rw-r--r--keyboards/eniigmakeyboards/ek87/info.json72
-rw-r--r--keyboards/eniigmakeyboards/ek87/keymaps/default/keymap.c12
-rw-r--r--keyboards/eniigmakeyboards/ek87/keymaps/via/keymap.c36
-rw-r--r--keyboards/eniigmakeyboards/ek87/keymaps/via/rules.mk1
-rw-r--r--keyboards/eniigmakeyboards/ek87/readme.md17
-rw-r--r--keyboards/eniigmakeyboards/ek87/rules.mk32
-rw-r--r--keyboards/ergodone/keymaps/art/keymap.c446
-rw-r--r--keyboards/ergodox_ez/config.h8
-rw-r--r--keyboards/ergodox_ez/ergodox_ez.h15
-rw-r--r--keyboards/ergodox_ez/info.json3
-rw-r--r--keyboards/ergodox_ez/keymaps/default/keymap.c104
-rw-r--r--keyboards/ergodox_ez/keymaps/nathanvercaemert/config.h29
-rw-r--r--keyboards/ergodox_ez/keymaps/nathanvercaemert/keymap.c351
-rw-r--r--keyboards/ergodox_ez/keymaps/nathanvercaemert/readme.md26
-rw-r--r--keyboards/ergodox_ez/keymaps/nathanvercaemert/rules.mk10
-rw-r--r--keyboards/ergodox_ez/readme.md49
-rw-r--r--keyboards/ergodox_stm32/keymaps/default/keymap.c4
-rw-r--r--keyboards/ergoinu/info.json87
-rw-r--r--keyboards/ergoinu/readme.md21
-rw-r--r--keyboards/ergoinu/rules.mk51
-rw-r--r--keyboards/ergotravel/keymaps/ckofy/keymap.c23
-rw-r--r--keyboards/ericrlau/numdiscipline/info.json21
-rw-r--r--keyboards/ericrlau/numdiscipline/keymaps/default/keymap.c44
-rw-r--r--keyboards/ericrlau/numdiscipline/keymaps/default/readme.md1
-rw-r--r--keyboards/ericrlau/numdiscipline/readme.md23
-rw-r--r--keyboards/ericrlau/numdiscipline/rev1/config.h248
-rw-r--r--keyboards/ericrlau/numdiscipline/rev1/rev1.c17
-rw-r--r--keyboards/ericrlau/numdiscipline/rev1/rev1.h77
-rw-r--r--keyboards/ericrlau/numdiscipline/rev1/rules.mk36
-rw-r--r--keyboards/eve/meteor/rules.mk2
-rw-r--r--keyboards/exclusive/e6v2/le_bmc/info.json4
-rw-r--r--keyboards/exclusive/e6v2/le_bmc/rules.mk2
-rw-r--r--keyboards/exclusive/e6v2/oe_bmc/info.json4
-rw-r--r--keyboards/exclusive/e6v2/oe_bmc/rules.mk2
-rw-r--r--keyboards/exclusive/e7v1/config.h4
-rw-r--r--keyboards/exclusive/e7v1/keymaps/via/keymap.c51
-rw-r--r--keyboards/exclusive/e7v1/keymaps/via/rules.mk2
-rw-r--r--keyboards/exclusive/e7v1/readme.md6
-rw-r--r--keyboards/exent/rules.mk2
-rw-r--r--keyboards/facew/rules.mk2
-rw-r--r--keyboards/flx/lodestone/info.json10
-rw-r--r--keyboards/foxlab/key65/hotswap/config.h172
-rw-r--r--keyboards/foxlab/key65/hotswap/hotswap.c34
-rw-r--r--keyboards/foxlab/key65/hotswap/hotswap.h33
-rw-r--r--keyboards/foxlab/key65/hotswap/info.json80
-rw-r--r--keyboards/foxlab/key65/hotswap/keymaps/default/keymap.c36
-rw-r--r--keyboards/foxlab/key65/hotswap/keymaps/via/keymap.c48
-rw-r--r--keyboards/foxlab/key65/hotswap/keymaps/via/rules.mk1
-rw-r--r--keyboards/foxlab/key65/hotswap/readme.md18
-rw-r--r--keyboards/foxlab/key65/hotswap/rules.mk27
-rw-r--r--keyboards/foxlab/key65/universal/config.h172
-rw-r--r--keyboards/foxlab/key65/universal/info.json306
-rw-r--r--keyboards/foxlab/key65/universal/keymaps/default/keymap.c36
-rw-r--r--keyboards/foxlab/key65/universal/keymaps/via/keymap.c48
-rw-r--r--keyboards/foxlab/key65/universal/keymaps/via/rules.mk1
-rw-r--r--keyboards/foxlab/key65/universal/readme.md22
-rw-r--r--keyboards/foxlab/key65/universal/rules.mk29
-rw-r--r--keyboards/foxlab/key65/universal/universal.c34
-rw-r--r--keyboards/foxlab/key65/universal/universal.h75
-rw-r--r--keyboards/ft/mars80/rules.mk2
-rw-r--r--keyboards/funky40/keymaps/default/keymap.c12
-rw-r--r--keyboards/gboards/combos/_generator/input.json99
-rw-r--r--keyboards/gboards/combos/_generator/main.go60
-rw-r--r--keyboards/gboards/combos/eng-combos.def97
-rw-r--r--keyboards/gboards/combos/germ-mouse-keys.def2
-rw-r--r--keyboards/gboards/combos/germ-vim-helpers.def10
-rw-r--r--keyboards/gboards/combos/readme.md7
-rw-r--r--keyboards/gboards/dicts/aset/_generator/main.go298
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/da-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/de-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/en-colemak-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/en-dvorak-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/en-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/es-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/fn-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/fr-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/hu-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/it-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/nl-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/num-keymap.json2830
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/nw-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/pl-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/pt-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/ro-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/sv-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/_generator/src/tr-keymap.json1
-rw-r--r--keyboards/gboards/dicts/aset/cmd-keymap.def28
-rw-r--r--keyboards/gboards/dicts/aset/da-keymap.def386
-rw-r--r--keyboards/gboards/dicts/aset/de-keymap.def373
-rw-r--r--keyboards/gboards/dicts/aset/en-colemak-keymap.def394
-rw-r--r--keyboards/gboards/dicts/aset/en-dvorak-keymap.def420
-rw-r--r--keyboards/gboards/dicts/aset/en-keymap.def403
-rw-r--r--keyboards/gboards/dicts/aset/es-keymap.def389
-rw-r--r--keyboards/gboards/dicts/aset/fn-keymap.def374
-rw-r--r--keyboards/gboards/dicts/aset/fr-keymap.def391
-rw-r--r--keyboards/gboards/dicts/aset/hu-keymap.def395
-rw-r--r--keyboards/gboards/dicts/aset/it-keymap.def399
-rw-r--r--keyboards/gboards/dicts/aset/layer-keymap.def22
-rw-r--r--keyboards/gboards/dicts/aset/nl-keymap.def396
-rw-r--r--keyboards/gboards/dicts/aset/num-keymap.def36
-rw-r--r--keyboards/gboards/dicts/aset/nw-keymap.def381
-rw-r--r--keyboards/gboards/dicts/aset/pl-keymap.def391
-rw-r--r--keyboards/gboards/dicts/aset/pt-keymap.def398
-rw-r--r--keyboards/gboards/dicts/aset/ro-keymap.def409
-rw-r--r--keyboards/gboards/dicts/aset/sv-keymap.def403
-rw-r--r--keyboards/gboards/dicts/aset/tr-keymap.def387
-rw-r--r--keyboards/gboards/engine/config.h0
-rw-r--r--keyboards/gboards/engine/engine.c458
-rw-r--r--keyboards/gboards/engine/engine.h104
-rw-r--r--keyboards/gboards/engine/keymap_engine.h121
-rw-r--r--keyboards/gboards/engine/rules.mk1
-rw-r--r--keyboards/gboards/g/config_default.h90
-rw-r--r--keyboards/gboards/g/engine.c470
-rw-r--r--keyboards/gboards/g/engine.h117
-rw-r--r--keyboards/gboards/g/keymap_combo.h56
-rw-r--r--keyboards/gboards/g/keymap_engine.h122
-rw-r--r--keyboards/gboards/g/rules.mk1
-rw-r--r--keyboards/gboards/readme.md39
-rw-r--r--keyboards/gergo/keymaps/abstractkb/config.h6
-rw-r--r--keyboards/gergo/keymaps/abstractkb/keymap.c128
-rw-r--r--keyboards/gergo/keymaps/abstractkb/readme.md10
-rw-r--r--keyboards/gergo/keymaps/abstractkb/rules.mk37
-rw-r--r--keyboards/gh60/revc/keymaps/robotmaxtron/keymap.c6
-rw-r--r--keyboards/gh60/satan/keymaps/denolfe/keymap.c3
-rw-r--r--keyboards/gingham/readme.md2
-rw-r--r--keyboards/gingham/rules.mk3
-rw-r--r--keyboards/gray_studio/hb85/rules.mk2
-rw-r--r--keyboards/handwired/d48/README.md87
-rw-r--r--keyboards/handwired/d48/config.h77
-rw-r--r--keyboards/handwired/d48/d48.c1
-rw-r--r--keyboards/handwired/d48/d48.h19
-rw-r--r--keyboards/handwired/d48/ds1307.c21
-rw-r--r--keyboards/handwired/d48/ds1307.h6
-rw-r--r--keyboards/handwired/d48/glcdfont_d48.c231
-rw-r--r--keyboards/handwired/d48/keymaps/anderson/keymap.c340
-rw-r--r--keyboards/handwired/d48/keymaps/anderson/lightmode.c44
-rw-r--r--keyboards/handwired/d48/keymaps/anderson/lightmode.h12
-rw-r--r--keyboards/handwired/d48/keymaps/anderson/rules.mk2
-rw-r--r--keyboards/handwired/d48/keymaps/default/keymap.c285
-rw-r--r--keyboards/handwired/d48/rules.mk22
-rw-r--r--keyboards/handwired/d48/taphold.c29
-rw-r--r--keyboards/handwired/d48/taphold.h25
-rw-r--r--keyboards/handwired/fruity60/readme.md2
-rw-r--r--keyboards/handwired/hnah40/rules.mk3
-rw-r--r--keyboards/handwired/k8split/README.md21
-rw-r--r--keyboards/handwired/k8split/config.h48
-rw-r--r--keyboards/handwired/k8split/k8split.c18
-rw-r--r--keyboards/handwired/k8split/k8split.h37
-rw-r--r--keyboards/handwired/k8split/keymaps/default/keymap.c33
-rw-r--r--keyboards/handwired/k8split/keymaps/left/config.h21
-rw-r--r--keyboards/handwired/k8split/keymaps/left/keymap.c47
-rw-r--r--keyboards/handwired/k8split/keymaps/right/config.h21
-rw-r--r--keyboards/handwired/k8split/keymaps/right/keymap.c45
-rw-r--r--keyboards/handwired/k8split/rules.mk31
-rw-r--r--keyboards/handwired/mechboards_micropad/readme.md2
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/keymap.c1
-rw-r--r--keyboards/handwired/onekey/keymaps/default_json/keymap.json9
-rw-r--r--keyboards/handwired/onekey/keymaps/eep_rst/keymap.c5
-rw-r--r--keyboards/handwired/onekey/pytest/templates/keymap.c1
-rw-r--r--keyboards/handwired/prime_exl/info.json2
-rw-r--r--keyboards/handwired/twadlee/tp69/chconf.h700
-rw-r--r--keyboards/handwired/twadlee/tp69/config.h253
-rw-r--r--keyboards/handwired/twadlee/tp69/halconf.h524
-rw-r--r--keyboards/handwired/twadlee/tp69/info.json12
-rw-r--r--keyboards/handwired/twadlee/tp69/keymaps/default/keymap.c28
-rw-r--r--keyboards/handwired/twadlee/tp69/keymaps/default/readme.md1
-rw-r--r--keyboards/handwired/twadlee/tp69/mcuconf.h45
-rw-r--r--keyboards/handwired/twadlee/tp69/readme.md18
-rw-r--r--keyboards/handwired/twadlee/tp69/rules.mk28
-rw-r--r--keyboards/handwired/twadlee/tp69/tp69.c18
-rw-r--r--keyboards/handwired/twadlee/tp69/tp69.h48
-rw-r--r--keyboards/handwired/twadlee/tp69/twadlee-tp69-kle.json139
-rw-r--r--keyboards/helix/pico/config.h4
-rw-r--r--keyboards/helix/rev1/config.h4
-rw-r--r--keyboards/helix/rev2/config.h4
-rw-r--r--keyboards/helix/rev2/keymaps/xulkal/config.h38
-rw-r--r--keyboards/helix/rev2/keymaps/xulkal/keymap.c8
-rw-r--r--keyboards/helix/rev2/keymaps/yshrsmz/config.h4
-rw-r--r--keyboards/helix/rev2/keymaps/yshrsmz/keymap.c334
-rw-r--r--keyboards/helix/rev2/keymaps/yshrsmz/rules.mk3
-rw-r--r--keyboards/hhkb/ansi/ansi.c1
-rw-r--r--keyboards/hhkb/ansi/ansi.h23
-rw-r--r--keyboards/hhkb/ansi/config.h104
-rw-r--r--keyboards/hhkb/ansi/hhkb_avr.h157
-rw-r--r--keyboards/hhkb/ansi/info.json73
-rw-r--r--keyboards/hhkb/ansi/keymaps/blakedietz/README.md (renamed from keyboards/hhkb/keymaps/blakedietz/README.md)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/blakedietz/config.h (renamed from keyboards/hhkb/keymaps/blakedietz/config.h)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/blakedietz/keymap.c (renamed from keyboards/hhkb/keymaps/blakedietz/keymap.c)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/blakedietz/rules.mk (renamed from keyboards/hhkb/keymaps/blakedietz/rules.mk)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/brett/config.h (renamed from keyboards/hhkb/keymaps/brett/config.h)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/brett/keymap.c (renamed from keyboards/hhkb/keymaps/brett/keymap.c)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/brett/readme.md (renamed from keyboards/hhkb/keymaps/brett/readme.md)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/brett/rules.mk (renamed from keyboards/hhkb/keymaps/brett/rules.mk)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/cinaeco/README.md (renamed from keyboards/hhkb/keymaps/cinaeco/README.md)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/cinaeco/config.h (renamed from keyboards/hhkb/keymaps/cinaeco/config.h)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/cinaeco/keymap.c (renamed from keyboards/hhkb/keymaps/cinaeco/keymap.c)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/cinaeco/rules.mk (renamed from keyboards/hhkb/keymaps/cinaeco/rules.mk)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/dbroqua/keymap.c (renamed from keyboards/hhkb/keymaps/dbroqua/keymap.c)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/dbroqua/readme.md (renamed from keyboards/hhkb/keymaps/dbroqua/readme.md)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/default/keymap.c (renamed from keyboards/hhkb/keymaps/default/keymap.c)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/eric/keymap.c (renamed from keyboards/hhkb/keymaps/eric/keymap.c)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/krusli/config.h (renamed from keyboards/hhkb/keymaps/dhertz/config.h)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/krusli/keymap.c (renamed from keyboards/hhkb/keymaps/krusli/keymap.c)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/lxol/keymap.c200
-rw-r--r--keyboards/hhkb/ansi/keymaps/mjt/config.h (renamed from keyboards/hhkb/keymaps/mjt/config.h)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/mjt/keymap.c112
-rw-r--r--keyboards/hhkb/ansi/keymaps/mjt/readme.md (renamed from keyboards/hhkb/keymaps/mjt/readme.md)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/mjt/rules.mk1
-rw-r--r--keyboards/hhkb/ansi/keymaps/schaeferdev/README.md (renamed from keyboards/hhkb/keymaps/schaeferdev/README.md)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/schaeferdev/config.h (renamed from keyboards/hhkb/keymaps/schaeferdev/config.h)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/schaeferdev/keymap.c (renamed from keyboards/hhkb/keymaps/schaeferdev/keymap.c)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/schaeferdev/rules.mk (renamed from keyboards/hhkb/keymaps/schaeferdev/rules.mk)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/shela/action_pseudo_lut.c (renamed from keyboards/hhkb/keymaps/shela/action_pseudo_lut.c)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/shela/action_pseudo_lut.h (renamed from keyboards/hhkb/keymaps/shela/action_pseudo_lut.h)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/shela/config.h (renamed from keyboards/hhkb/keymaps/shela/config.h)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/shela/keymap.c186
-rw-r--r--keyboards/hhkb/ansi/keymaps/shela/keymap_jis2us.h (renamed from keyboards/hhkb/keymaps/shela/keymap_jis2us.h)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/shela/readme.md (renamed from keyboards/hhkb/keymaps/shela/readme.md)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/shela/rules.mk (renamed from keyboards/hhkb/keymaps/shela/rules.mk)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/smt/keymap.c (renamed from keyboards/hhkb/keymaps/smt/keymap.c)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/tobiasvl_iso/keymap.c (renamed from keyboards/hhkb/keymaps/tobiasvl_iso/keymap.c)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/tobiasvl_iso/readme.md (renamed from keyboards/hhkb/keymaps/tobiasvl_iso/readme.md)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/tominabox1/.gitignore (renamed from keyboards/hhkb/keymaps/tominabox1/.gitignore)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/tominabox1/keymap.c (renamed from keyboards/hhkb/keymaps/tominabox1/keymap.c)0
-rw-r--r--keyboards/hhkb/ansi/keymaps/via/keymap.c68
-rw-r--r--keyboards/hhkb/ansi/keymaps/via/rules.mk1
-rw-r--r--keyboards/hhkb/ansi/keymaps/xyverz/keymap.c (renamed from keyboards/hhkb/keymaps/xyverz/keymap.c)0
-rw-r--r--keyboards/hhkb/ansi/matrix.c211
-rw-r--r--keyboards/hhkb/ansi/readme.md14
-rw-r--r--keyboards/hhkb/ansi/rules.mk71
-rw-r--r--keyboards/hhkb/config.h111
-rw-r--r--keyboards/hhkb/hhkb.c1
-rw-r--r--keyboards/hhkb/hhkb.h52
-rw-r--r--keyboards/hhkb/hhkb_avr.h167
-rw-r--r--keyboards/hhkb/info.json147
-rw-r--r--keyboards/hhkb/jp/config.h104
-rw-r--r--keyboards/hhkb/jp/hhkb_avr.h164
-rw-r--r--keyboards/hhkb/jp/info.json82
-rw-r--r--keyboards/hhkb/jp/jp.c1
-rw-r--r--keyboards/hhkb/jp/jp.h28
-rw-r--r--keyboards/hhkb/jp/keymaps/bakingpy/keymap.c (renamed from keyboards/hhkb/keymaps/bakingpy/keymap.c)0
-rw-r--r--keyboards/hhkb/jp/keymaps/bakingpy/rules.mk (renamed from keyboards/hhkb/keymaps/bakingpy/rules.mk)0
-rw-r--r--keyboards/hhkb/jp/keymaps/default/keymap.c (renamed from keyboards/hhkb/keymaps/jp/keymap.c)0
-rw-r--r--keyboards/hhkb/jp/keymaps/default/rules.mk (renamed from keyboards/hhkb/keymaps/halfqwerty_jp/rules.mk)0
-rw-r--r--keyboards/hhkb/jp/keymaps/default_mac/keymap.c (renamed from keyboards/hhkb/keymaps/jp_mac/keymap.c)0
-rw-r--r--keyboards/hhkb/jp/keymaps/default_mac/rules.mk (renamed from keyboards/hhkb/keymaps/jp/rules.mk)0
-rw-r--r--keyboards/hhkb/jp/keymaps/dhertz/config.h (renamed from keyboards/hhkb/keymaps/krusli/config.h)0
-rw-r--r--keyboards/hhkb/jp/keymaps/dhertz/keymap.c (renamed from keyboards/hhkb/keymaps/dhertz/keymap.c)0
-rw-r--r--keyboards/hhkb/jp/keymaps/dhertz/keymap.h (renamed from keyboards/hhkb/keymaps/dhertz/keymap.h)0
-rw-r--r--keyboards/hhkb/jp/keymaps/dhertz/rules.mk (renamed from keyboards/hhkb/keymaps/dhertz/rules.mk)0
-rw-r--r--keyboards/hhkb/jp/keymaps/enoch_jp/keymap.c (renamed from keyboards/hhkb/keymaps/enoch_jp/keymap.c)0
-rw-r--r--keyboards/hhkb/jp/keymaps/enoch_jp/rules.mk (renamed from keyboards/hhkb/keymaps/enoch_jp/rules.mk)0
-rw-r--r--keyboards/hhkb/jp/keymaps/halfqwerty_jp/README.md (renamed from keyboards/hhkb/keymaps/halfqwerty_jp/README.md)0
-rw-r--r--keyboards/hhkb/jp/keymaps/halfqwerty_jp/keymap.c (renamed from keyboards/hhkb/keymaps/halfqwerty_jp/keymap.c)0
-rw-r--r--keyboards/hhkb/jp/keymaps/halfqwerty_jp/rules.mk (renamed from keyboards/hhkb/keymaps/jp_mac/rules.mk)0
-rw-r--r--keyboards/hhkb/jp/keymaps/rdg_jp/keymap.c (renamed from keyboards/hhkb/keymaps/rdg_jp/keymap.c)0
-rw-r--r--keyboards/hhkb/jp/keymaps/rdg_jp/rules.mk (renamed from keyboards/hhkb/keymaps/rdg_jp/rules.mk)0
-rw-r--r--keyboards/hhkb/jp/keymaps/sh_jp/README.md (renamed from keyboards/hhkb/keymaps/sh_jp/README.md)0
-rw-r--r--keyboards/hhkb/jp/keymaps/sh_jp/keymap.c (renamed from keyboards/hhkb/keymaps/sh_jp/keymap.c)0
-rw-r--r--keyboards/hhkb/jp/keymaps/sh_jp/rules.mk (renamed from keyboards/hhkb/keymaps/sh_jp/rules.mk)0
-rw-r--r--keyboards/hhkb/jp/keymaps/via/config.h2
-rw-r--r--keyboards/hhkb/jp/keymaps/via/keymap.c58
-rw-r--r--keyboards/hhkb/jp/keymaps/via/rules.mk1
-rw-r--r--keyboards/hhkb/jp/matrix.c212
-rw-r--r--keyboards/hhkb/jp/readme.md14
-rw-r--r--keyboards/hhkb/jp/rules.mk69
-rw-r--r--keyboards/hhkb/keymaps/lxol/keymap.c204
-rw-r--r--keyboards/hhkb/keymaps/mjt/keymap.c113
-rw-r--r--keyboards/hhkb/keymaps/shela/keymap.c193
-rw-r--r--keyboards/hhkb/matrix.c215
-rw-r--r--keyboards/hhkb/readme.md14
-rw-r--r--keyboards/hhkb/rules.mk71
-rw-r--r--keyboards/hs60/v1/readme.md2
-rw-r--r--keyboards/hs60/v2/readme.md2
-rw-r--r--keyboards/infinity60/keymaps/jpetermans/keymap.c8
-rw-r--r--keyboards/j80/rules.mk2
-rw-r--r--keyboards/jc65/v32a/rules.mk2
-rw-r--r--keyboards/jd45/keymaps/justin/keymap.c20
-rw-r--r--keyboards/jd45/keymaps/mjt6u/keymap.c4
-rw-r--r--keyboards/jj40/keymaps/stevexyz/config.h12
-rw-r--r--keyboards/jj40/keymaps/stevexyz/keyboard-layout-editor-raw-data.txt4
-rw-r--r--keyboards/jj40/keymaps/stevexyz/keymap.c71
-rw-r--r--keyboards/jj40/keymaps/stevexyz/readme.md5
-rw-r--r--keyboards/jj40/keymaps/stevexyz/rules.mk1
-rw-r--r--keyboards/jj50/keymaps/archetype/rules.mk3
-rw-r--r--keyboards/jj50/rules.mk2
-rw-r--r--keyboards/kbdclack/kaishi65/config.h251
-rw-r--r--keyboards/kbdclack/kaishi65/info.json12
-rw-r--r--keyboards/kbdclack/kaishi65/kaishi65.c17
-rw-r--r--keyboards/kbdclack/kaishi65/kaishi65.h44
-rw-r--r--keyboards/kbdclack/kaishi65/keymaps/default/keymap.c39
-rw-r--r--keyboards/kbdclack/kaishi65/keymaps/default/readme.md1
-rw-r--r--keyboards/kbdclack/kaishi65/readme.md14
-rw-r--r--keyboards/kbdclack/kaishi65/rules.mk33
-rw-r--r--keyboards/kbdfans/kbd67/hotswap/hotswap.h2
-rw-r--r--keyboards/kbdfans/kbd67/hotswap/keymaps/bcat/keymap.c28
-rw-r--r--keyboards/kbdfans/kbd67/hotswap/keymaps/bcat/readme.md16
-rw-r--r--keyboards/kbdfans/kbd67/hotswap/rules.mk2
-rw-r--r--keyboards/kbdfans/kbd67/rev1/config.h4
-rw-r--r--keyboards/kbdfans/kbd67/rev1/keymaps/via/keymap.c75
-rw-r--r--keyboards/kbdfans/kbd67/rev1/keymaps/via/readme.md1
-rw-r--r--keyboards/kbdfans/kbd67/rev1/keymaps/via/rules.mk2
-rw-r--r--keyboards/kbdfans/kbd67/rev1/rules.mk2
-rw-r--r--keyboards/kbdfans/kbd67/rev2/rev2.h2
-rw-r--r--keyboards/kbdfans/kbd67/rev2/rules.mk2
-rw-r--r--keyboards/kbdfans/kbd6x/keymaps/konstantin/config.h2
-rw-r--r--keyboards/kbdfans/kbd6x/keymaps/konstantin/keymap.c2
-rw-r--r--keyboards/kbdfans/kbd6x/keymaps/konstantin/rules.mk17
-rw-r--r--keyboards/kbdfans/kbd75/keymaps/edulpn/keymap.c9
-rw-r--r--keyboards/kbdfans/kbdpad/mk1/info.json108
-rw-r--r--keyboards/kbdfans/kbdpad/mk1/keymaps/default/keymap.c15
-rw-r--r--keyboards/kbdfans/kbdpad/mk1/mk1.h63
-rw-r--r--keyboards/kbdfans/kbdpad/mk1/readme.md6
-rw-r--r--keyboards/kbdfans/kbdpad/mk1/rules.mk2
-rwxr-xr-xkeyboards/kbdfans/maja/config.h46
-rwxr-xr-xkeyboards/kbdfans/maja/keymaps/default/keymap.c17
-rwxr-xr-xkeyboards/kbdfans/maja/keymaps/via/keymap.c29
-rwxr-xr-xkeyboards/kbdfans/maja/keymaps/via/rules.mk2
-rwxr-xr-xkeyboards/kbdfans/maja/maja.c104
-rwxr-xr-xkeyboards/kbdfans/maja/maja.h19
-rwxr-xr-xkeyboards/kbdfans/maja/readme.md14
-rwxr-xr-xkeyboards/kbdfans/maja/rules.mk33
-rw-r--r--keyboards/keebio/bfo9000/keymaps/abstractkb/keymap.c8
-rw-r--r--keyboards/keebio/nyquist/keymaps/danielhklein/keymap.c13
-rw-r--r--keyboards/keebio/viterbi/keymaps/bakingpy/keymap.c6
-rw-r--r--keyboards/keebio/viterbi/keymaps/dwallace/keymap.c2
-rw-r--r--keyboards/keebio/viterbi/keymaps/mike808/keymap.c4
-rw-r--r--keyboards/keebio/viterbi/keymaps/vosechu/config.h41
-rw-r--r--keyboards/keebio/viterbi/keymaps/vosechu/keymap.c91
-rw-r--r--keyboards/keebio/viterbi/keymaps/vosechu/rules.mk1
-rw-r--r--keyboards/keyboardio/model01/config.h (renamed from keyboards/model01/config.h)0
-rw-r--r--keyboards/keyboardio/model01/info.json87
-rw-r--r--keyboards/keyboardio/model01/keymaps/default/config.h (renamed from keyboards/model01/keymaps/default/config.h)0
-rw-r--r--keyboards/keyboardio/model01/keymaps/default/keymap.c (renamed from keyboards/model01/keymaps/default/keymap.c)0
-rw-r--r--keyboards/keyboardio/model01/keymaps/default/readme.md (renamed from keyboards/model01/keymaps/default/readme.md)0
-rw-r--r--keyboards/keyboardio/model01/keymaps/dshields/config.h (renamed from keyboards/model01/keymaps/dshields/config.h)0
-rw-r--r--keyboards/keyboardio/model01/keymaps/dshields/keymap.c (renamed from keyboards/model01/keymaps/dshields/keymap.c)0
-rw-r--r--keyboards/keyboardio/model01/keymaps/dshields/readme.md (renamed from keyboards/model01/keymaps/dshields/readme.md)0
-rw-r--r--keyboards/keyboardio/model01/keymaps/tw1t611/config.h (renamed from keyboards/model01/keymaps/tw1t611/config.h)0
-rw-r--r--keyboards/keyboardio/model01/keymaps/tw1t611/keymap.c (renamed from keyboards/model01/keymaps/tw1t611/keymap.c)0
-rw-r--r--keyboards/keyboardio/model01/keymaps/tw1t611/readme.md (renamed from keyboards/model01/keymaps/tw1t611/readme.md)0
-rw-r--r--keyboards/keyboardio/model01/leds.c (renamed from keyboards/model01/leds.c)0
-rw-r--r--keyboards/keyboardio/model01/leds.h (renamed from keyboards/model01/leds.h)0
-rw-r--r--keyboards/keyboardio/model01/matrix.c (renamed from keyboards/model01/matrix.c)0
-rw-r--r--keyboards/keyboardio/model01/model01.c (renamed from keyboards/model01/model01.c)0
-rw-r--r--keyboards/keyboardio/model01/model01.h (renamed from keyboards/model01/model01.h)0
-rw-r--r--keyboards/keyboardio/model01/readme.md37
-rw-r--r--keyboards/keyboardio/model01/rules.mk (renamed from keyboards/model01/rules.mk)0
-rw-r--r--keyboards/keyboardio/model01/wire-protocol-constants.h (renamed from keyboards/model01/wire-protocol-constants.h)0
-rw-r--r--keyboards/keyboardio/readme.md18
-rw-r--r--keyboards/keycapsss/o4l_5x12/readme.md2
-rw-r--r--keyboards/keycapsss/plaid_pad/readme.md2
-rw-r--r--keyboards/keycapsss/plaid_pad/rules.mk4
-rw-r--r--keyboards/kinesis/keymaps/milestogo/keymap.c26
-rw-r--r--keyboards/kinesis/keymaps/xyverz/keymap.c14
-rw-r--r--keyboards/kinesis/keymaps/xyverz/readme.md12
-rw-r--r--keyboards/kv/revt/readme.md2
-rw-r--r--keyboards/kyria/keymaps/asapjockey/config.h47
-rw-r--r--keyboards/kyria/keymaps/asapjockey/keymap.c312
-rw-r--r--keyboards/kyria/keymaps/asapjockey/rules.mk5
-rw-r--r--keyboards/kyria/keymaps/default/rules.mk2
-rw-r--r--keyboards/kyria/keymaps/plattfot/README.md162
-rw-r--r--keyboards/kyria/keymaps/plattfot/config.h40
-rw-r--r--keyboards/kyria/keymaps/plattfot/keymap.c437
-rw-r--r--keyboards/kyria/keymaps/plattfot/rules.mk5
-rw-r--r--keyboards/kyria/keymaps/thomasbaart/keymap.c47
-rw-r--r--keyboards/lattice60/rules.mk3
-rw-r--r--keyboards/le_chiffre/config.h46
-rw-r--r--keyboards/le_chiffre/info.json15
-rw-r--r--keyboards/le_chiffre/keymaps/default/keymap.c142
-rw-r--r--keyboards/le_chiffre/keymaps/default/readme.md1
-rw-r--r--keyboards/le_chiffre/le_chiffre.c1
-rw-r--r--keyboards/le_chiffre/le_chiffre.h18
-rw-r--r--keyboards/le_chiffre/readme.md15
-rw-r--r--keyboards/le_chiffre/rules.mk22
-rw-r--r--keyboards/lets_split/keymaps/mjt/keymap.c6
-rw-r--r--keyboards/lets_split/keymaps/piemod/keymap.c20
-rw-r--r--keyboards/lily58/config.h12
-rwxr-xr-xkeyboards/lily58/i2c.c162
-rwxr-xr-xkeyboards/lily58/i2c.h46
-rw-r--r--keyboards/lily58/keymaps/chuan/config.h64
-rw-r--r--keyboards/lily58/keymaps/chuan/keymap.c230
-rw-r--r--keyboards/lily58/keymaps/chuan/rules.mk11
-rw-r--r--keyboards/lily58/keymaps/default/config.h4
-rw-r--r--keyboards/lily58/keymaps/default/keymap.c58
-rw-r--r--keyboards/lily58/keymaps/default/rules.mk4
-rw-r--r--keyboards/lily58/keymaps/yuchi/keymap.c47
-rw-r--r--keyboards/lily58/keymaps/yuchi/rules.mk5
-rw-r--r--keyboards/lily58/lib/glcdfont.c232
-rw-r--r--keyboards/lily58/lib/glcdfont_lily.c233
-rw-r--r--keyboards/lily58/lib/host_led_state_reader.c9
-rw-r--r--keyboards/lily58/lib/keylogger.c1
-rw-r--r--keyboards/lily58/lib/layer_state_reader.c8
-rw-r--r--keyboards/lily58/lib/mode_icon_reader.c1
-rw-r--r--keyboards/lily58/lib/timelogger.c1
-rw-r--r--keyboards/lily58/lily58.c7
-rw-r--r--keyboards/lily58/rev1/config.h2
-rw-r--r--keyboards/lily58/rev1/rules.mk3
-rwxr-xr-xkeyboards/lily58/rev1/split_scomm.c91
-rwxr-xr-xkeyboards/lily58/rev1/split_scomm.h24
-rwxr-xr-xkeyboards/lily58/rev1/split_util.h19
-rw-r--r--keyboards/lily58/rules.mk16
-rwxr-xr-xkeyboards/lily58/serial.h84
-rw-r--r--keyboards/lily58/serial_config.h4
-rwxr-xr-xkeyboards/lily58/ssd1306.c344
-rwxr-xr-xkeyboards/lily58/ssd1306.h90
-rw-r--r--keyboards/maartenwut/mx5160/readme.md2
-rw-r--r--keyboards/maartenwut/wasdat/keymaps/konstantin/config.h2
-rw-r--r--keyboards/maartenwut/wasdat/keymaps/konstantin/rules.mk14
-rw-r--r--keyboards/massdrop/ctrl/info.json6
-rw-r--r--keyboards/maxr1998/phoebe/config.h4
-rw-r--r--keyboards/maxr1998/phoebe/keymaps/default/keymap.c115
-rw-r--r--keyboards/maxr1998/phoebe/rules.mk1
-rw-r--r--keyboards/maxr1998/pulse4k/config.h30
-rw-r--r--keyboards/maxr1998/pulse4k/keymaps/default/keymap.c34
-rw-r--r--keyboards/maxr1998/pulse4k/keymaps/maxr1998/keymap.c35
-rw-r--r--keyboards/maxr1998/pulse4k/pulse4k.c48
-rw-r--r--keyboards/maxr1998/pulse4k/pulse4k.h30
-rw-r--r--keyboards/mc_76k/readme.md2
-rw-r--r--keyboards/mechlovin/adelais/adelais.c69
-rw-r--r--keyboards/mechlovin/adelais/adelais.h33
-rw-r--r--keyboards/mechlovin/adelais/config.h46
-rw-r--r--keyboards/mechlovin/adelais/info.json81
-rw-r--r--keyboards/mechlovin/adelais/keymaps/default/keymap.c32
-rw-r--r--keyboards/mechlovin/adelais/keymaps/default/readme.md1
-rw-r--r--keyboards/mechlovin/adelais/keymaps/via/keymap.c44
-rw-r--r--keyboards/mechlovin/adelais/keymaps/via/readme.md1
-rw-r--r--keyboards/mechlovin/adelais/keymaps/via/rules.mk1
-rw-r--r--keyboards/mechlovin/adelais/readme.md18
-rw-r--r--keyboards/mechlovin/adelais/rgb_led/config.h16
-rw-r--r--keyboards/mechlovin/adelais/rgb_led/rules.mk1
-rw-r--r--keyboards/mechlovin/adelais/rules.mk23
-rw-r--r--keyboards/mechlovin/adelais/standard_led/config.h15
-rw-r--r--keyboards/mechlovin/adelais/standard_led/rules.mk3
-rw-r--r--keyboards/mechlovin/hannah60rgb/config.h58
-rw-r--r--keyboards/mechlovin/hannah60rgb/hannah60rgb.c54
-rw-r--r--keyboards/mechlovin/hannah60rgb/hannah60rgb.h63
-rw-r--r--keyboards/mechlovin/hannah60rgb/info.json81
-rw-r--r--keyboards/mechlovin/hannah60rgb/keymaps/default/keymap.c26
-rw-r--r--keyboards/mechlovin/hannah60rgb/keymaps/default/readme.md1
-rw-r--r--keyboards/mechlovin/hannah60rgb/keymaps/via/keymap.c44
-rw-r--r--keyboards/mechlovin/hannah60rgb/keymaps/via/readme.md1
-rw-r--r--keyboards/mechlovin/hannah60rgb/keymaps/via/rules.mk1
-rw-r--r--keyboards/mechlovin/hannah60rgb/readme.md15
-rw-r--r--keyboards/mechlovin/hannah60rgb/rules.mk27
-rw-r--r--keyboards/mechlovin/infinityce/rules.mk2
-rw-r--r--keyboards/mechlovin/pisces/config.h76
-rw-r--r--keyboards/mechlovin/pisces/info.json80
-rw-r--r--keyboards/mechlovin/pisces/keymaps/default/keymap.c34
-rw-r--r--keyboards/mechlovin/pisces/keymaps/default/readme.md1
-rw-r--r--keyboards/mechlovin/pisces/keymaps/via/keymap.c48
-rw-r--r--keyboards/mechlovin/pisces/keymaps/via/readme.md1
-rw-r--r--keyboards/mechlovin/pisces/keymaps/via/rules.mk1
-rw-r--r--keyboards/mechlovin/pisces/pisces.c42
-rw-r--r--keyboards/mechlovin/pisces/pisces.h36
-rw-r--r--keyboards/mechlovin/pisces/readme.md13
-rw-r--r--keyboards/mechlovin/pisces/rules.mk32
-rw-r--r--keyboards/mechmini/v1/rules.mk2
-rw-r--r--keyboards/mehkee96/rules.mk2
-rw-r--r--keyboards/meira/keymaps/default/keymap.c6
-rw-r--r--keyboards/meira/keymaps/grahampheath/keymap.c6
-rw-r--r--keyboards/meira/keymaps/takmiya/keymap.c2
-rw-r--r--keyboards/meishi/keymaps/default/keymap.c4
-rw-r--r--keyboards/melody96/config.h8
-rw-r--r--keyboards/melody96/keymaps/konstantin/rules.mk16
-rw-r--r--keyboards/melody96/keymaps/via/keymap.c36
-rw-r--r--keyboards/melody96/keymaps/via/readme.md5
-rw-r--r--keyboards/melody96/keymaps/via/rules.mk2
-rw-r--r--keyboards/melody96/rules.mk2
-rw-r--r--keyboards/meson/readme.md2
-rw-r--r--keyboards/minidox/keymaps/rsthd_combos/config.h9
-rw-r--r--keyboards/minidox/keymaps/rsthd_combos/keymap.c109
-rw-r--r--keyboards/minidox/keymaps/rsthd_combos/readme.md22
-rw-r--r--keyboards/minidox/keymaps/rsthd_combos/rules.mk1
-rw-r--r--keyboards/model01/info.json87
-rw-r--r--keyboards/model01/readme.md37
-rwxr-xr-xkeyboards/montsinger/rebound/readme.md9
-rw-r--r--keyboards/montsinger/rebound/rebound.h2
-rw-r--r--keyboards/montsinger/rebound/rev2/keymaps/rossman360/keymap.c4
-rw-r--r--keyboards/montsinger/rebound/rev3/config.h65
-rw-r--r--keyboards/montsinger/rebound/rev3/info.json128
-rw-r--r--keyboards/montsinger/rebound/rev3/keymaps/default/keymap.c102
-rw-r--r--keyboards/montsinger/rebound/rev3/keymaps/rossman360/keymap.c112
-rw-r--r--keyboards/montsinger/rebound/rev3/keymaps/rossman360/rules.mk4
-rw-r--r--keyboards/montsinger/rebound/rev3/rev3.h53
-rw-r--r--keyboards/montsinger/rebound/rev3/rules.mk34
-rw-r--r--keyboards/mt40/rules.mk2
-rw-r--r--keyboards/murcielago/info.json73
-rw-r--r--keyboards/murcielago/murcielago.c17
-rw-r--r--keyboards/murcielago/murcielago.h49
-rw-r--r--keyboards/murcielago/readme.md16
-rw-r--r--keyboards/murcielago/rev1/config.h97
-rw-r--r--keyboards/murcielago/rev1/keymaps/default/keymap.c130
-rw-r--r--keyboards/murcielago/rev1/keymaps/via/keymap.c130
-rw-r--r--keyboards/murcielago/rev1/keymaps/via/rules.mk1
-rw-r--r--keyboards/murcielago/rev1/rules.mk34
-rw-r--r--keyboards/murcielago/rules.mk1
-rw-r--r--keyboards/navi10/rev3/rules.mk2
-rw-r--r--keyboards/nightmare/readme.md2
-rw-r--r--keyboards/niu_mini/keymaps/yttyx/README.md80
-rw-r--r--keyboards/niu_mini/keymaps/yttyx/keymap.c192
-rw-r--r--keyboards/niu_mini/keymaps/yttyx/rules.mk4
-rwxr-xr-xkeyboards/nk65/readme.md2
-rw-r--r--keyboards/nomu30/keymaps/center_sprit/keymap.c2
-rw-r--r--keyboards/nomu30/keymaps/like_jis/keymap.c2
-rw-r--r--keyboards/ok60/config.h2
-rw-r--r--keyboards/ok60/keymaps/via/keymap.c36
-rw-r--r--keyboards/ok60/keymaps/via/rules.mk2
-rw-r--r--keyboards/omnikey_bh/config.h (renamed from keyboards/omnikey_blackheart/config.h)0
-rw-r--r--keyboards/omnikey_bh/info.json13
-rw-r--r--keyboards/omnikey_bh/keymaps/default/keymap.c (renamed from keyboards/omnikey_blackheart/keymaps/default/keymap.c)0
-rw-r--r--keyboards/omnikey_bh/omnikey_bh.c1
-rw-r--r--keyboards/omnikey_bh/omnikey_bh.h19
-rw-r--r--keyboards/omnikey_bh/readme.md14
-rw-r--r--keyboards/omnikey_bh/rules.mk (renamed from keyboards/omnikey_blackheart/rules.mk)0
-rw-r--r--keyboards/omnikey_blackheart/info.json13
-rw-r--r--keyboards/omnikey_blackheart/omnikey_blackheart.c1
-rw-r--r--keyboards/omnikey_blackheart/omnikey_blackheart.h22
-rw-r--r--keyboards/omnikey_blackheart/readme.md14
-rw-r--r--keyboards/pabile/p18/config.h27
-rw-r--r--keyboards/pabile/p18/info.json31
-rw-r--r--keyboards/pabile/p18/keymaps/default/keymap.c27
-rw-r--r--keyboards/pabile/p18/p18.c1
-rw-r--r--keyboards/pabile/p18/p18.h16
-rw-r--r--keyboards/pabile/p18/readme.md15
-rw-r--r--keyboards/pabile/p18/rules.mk35
-rw-r--r--keyboards/pabile/p20/config.h26
-rw-r--r--keyboards/pabile/p20/keymaps/default/keymap.c38
-rw-r--r--keyboards/pabile/p20/p20.c1
-rw-r--r--keyboards/pabile/p20/p20.h18
-rw-r--r--keyboards/pabile/p20/readme.md16
-rw-r--r--keyboards/pabile/p20/rules.mk37
-rw-r--r--keyboards/pabile/p40/config.h29
-rw-r--r--keyboards/pabile/p40/info.json52
-rw-r--r--keyboards/pabile/p40/keymaps/default/keymap.c29
-rw-r--r--keyboards/pabile/p40/p40.c1
-rw-r--r--keyboards/pabile/p40/p40.h16
-rw-r--r--keyboards/pabile/p40/readme.md15
-rw-r--r--keyboards/pabile/p40/rules.mk36
-rw-r--r--keyboards/panc60/rules.mk2
-rw-r--r--keyboards/pancake/feather/readme.md1
-rw-r--r--keyboards/pancake/info.json113
-rw-r--r--keyboards/pancake/keymaps/default/readme.md1
-rw-r--r--keyboards/pancake/promicro/readme.md1
-rw-r--r--keyboards/pancake/readme.md12
-rw-r--r--keyboards/pearl/rules.mk2
-rw-r--r--keyboards/percent/canoe/keymaps/dhertz/keymap.c2
-rw-r--r--keyboards/percent/canoe/readme.md2
-rw-r--r--keyboards/percent/canoe/rules.mk2
-rw-r--r--keyboards/percent/skog/rules.mk2
-rw-r--r--keyboards/percent/skog_lite/rules.mk2
-rw-r--r--keyboards/pimentoso/paddino02/readme.md2
-rw-r--r--keyboards/plaid/info.json113
-rw-r--r--keyboards/plaid/readme.md23
-rw-r--r--keyboards/plaid/rules.mk39
-rw-r--r--keyboards/planck/ez/ez.h4
-rw-r--r--keyboards/planck/keymaps/ab/keymap.c22
-rw-r--r--keyboards/planck/keymaps/angerthosenear/keymap.c11
-rw-r--r--keyboards/planck/keymaps/austin/keymap.c13
-rw-r--r--keyboards/planck/keymaps/brandon/keymap.c10
-rw-r--r--keyboards/planck/keymaps/chance/keymap.c6
-rw-r--r--keyboards/planck/keymaps/charlie/keymap.c51
-rw-r--r--keyboards/planck/keymaps/circuit/keymap.c10
-rw-r--r--keyboards/planck/keymaps/david/keymap.c12
-rw-r--r--keyboards/planck/keymaps/dr_notsokind/keymap.c10
-rw-r--r--keyboards/planck/keymaps/dzobert/keymap.c10
-rw-r--r--keyboards/planck/keymaps/emilyh/keymap.c16
-rw-r--r--keyboards/planck/keymaps/espynn/keymap.c20
-rw-r--r--keyboards/planck/keymaps/ishtob/keymap.c20
-rw-r--r--keyboards/planck/keymaps/joe/keymap.c21
-rw-r--r--keyboards/planck/keymaps/kyle/keymap.c12
-rw-r--r--keyboards/planck/keymaps/lucas/keymap.c9
-rw-r--r--keyboards/planck/keymaps/matrixman/keymap.c7
-rw-r--r--keyboards/planck/keymaps/max/keymap.c10
-rw-r--r--keyboards/planck/keymaps/mollat/keymap.c4
-rw-r--r--keyboards/planck/keymaps/piemod/keymap.c46
-rw-r--r--keyboards/planck/keymaps/pvc/keymap.c6
-rw-r--r--keyboards/planck/keymaps/that_canadian/keymap.c8
-rw-r--r--keyboards/planck/keymaps/yttyx/README.md30
-rw-r--r--keyboards/planck/keymaps/yttyx/config.h1
-rw-r--r--keyboards/planck/keymaps/yttyx/keymap.c167
-rw-r--r--keyboards/planck/keymaps/yttyx/readme.md68
-rw-r--r--keyboards/planck/keymaps/yttyx/rules.mk2
-rwxr-xr-xkeyboards/planck/keymaps/zrichard/keymap.c6
-rw-r--r--keyboards/planck/old_keymap_files/common_keymaps/keymap_brett.c42
-rw-r--r--keyboards/planck/old_keymap_files/common_keymaps/keymap_dotcom.c34
-rw-r--r--keyboards/planck/old_keymap_files/common_keymaps/keymap_jack.c50
-rw-r--r--keyboards/planck/old_keymap_files/common_keymaps/keymap_joe.c83
-rw-r--r--keyboards/planck/old_keymap_files/common_keymaps/keymap_matthew.c70
-rw-r--r--keyboards/planck/old_keymap_files/common_keymaps/keymap_nathan.c154
-rw-r--r--keyboards/planck/old_keymap_files/common_keymaps/keymap_paul.c49
-rw-r--r--keyboards/planck/old_keymap_files/common_keymaps/keymap_peasant.c51
-rw-r--r--keyboards/planck/old_keymap_files/common_keymaps/keymap_reed.c74
-rw-r--r--keyboards/planck/old_keymap_files/common_keymaps/keymap_sean.c105
-rw-r--r--keyboards/planck/old_keymap_files/common_keymaps/keymap_shane.c99
-rw-r--r--keyboards/planck/old_keymap_files/common_keymaps/keymap_simon.c44
-rw-r--r--keyboards/planck/old_keymap_files/common_keymaps/keymap_tim.c44
-rw-r--r--keyboards/planck/old_keymap_files/common_keymaps/keymap_wilba.c54
-rw-r--r--keyboards/planck/old_keymap_files/keymap_common.c30
-rw-r--r--keyboards/planck/old_keymap_files/keymap_common.h129
-rw-r--r--keyboards/planck/rev6/config.h1
-rw-r--r--keyboards/planck/rev6/rules.mk2
-rw-r--r--keyboards/preonic/keymaps/AlexDaigre/config.h37
-rw-r--r--keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/adjust.json80
-rw-r--r--keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/lower.json80
-rw-r--r--keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/main.json95
-rw-r--r--keyboards/preonic/keymaps/AlexDaigre/keyboard-layout-editor/raise.json80
-rw-r--r--keyboards/preonic/keymaps/AlexDaigre/keymap.c326
-rw-r--r--keyboards/preonic/keymaps/AlexDaigre/readme.md19
-rw-r--r--keyboards/preonic/keymaps/AlexDaigre/rules.mk1
-rw-r--r--keyboards/preonic/keymaps/pvillano/config.h32
-rw-r--r--keyboards/preonic/keymaps/pvillano/keymap.c113
-rw-r--r--keyboards/preonic/keymaps/pvillano/readme.md25
-rw-r--r--keyboards/preonic/keymaps/pvillano/rules.mk1
-rw-r--r--keyboards/preonic/keymaps/that_canadian/keymap.c8
-rw-r--r--keyboards/preonic/rev1/rules.mk2
-rw-r--r--keyboards/preonic/rev2/rules.mk2
-rw-r--r--keyboards/preonic/rev3/config.h1
-rw-r--r--keyboards/preonic/rev3/rules.mk2
-rw-r--r--keyboards/primekb/prime_e/config.h2
-rw-r--r--keyboards/primekb/prime_e/keymaps/via/keymap.c28
-rw-r--r--keyboards/projectkb/alice/alice.c4
-rw-r--r--keyboards/projectkb/alice/keymaps/stanrc85/keymap.c6
-rw-r--r--keyboards/quad_h/lb75/config.h196
-rw-r--r--keyboards/quad_h/lb75/info.json187
-rw-r--r--keyboards/quad_h/lb75/keymaps/continuous_fnrow/keymap.c35
-rw-r--r--keyboards/quad_h/lb75/keymaps/continuous_fnrow/readme.md3
-rw-r--r--keyboards/quad_h/lb75/keymaps/default/keymap.c35
-rw-r--r--keyboards/quad_h/lb75/keymaps/default/readme.md3
-rw-r--r--keyboards/quad_h/lb75/keymaps/divided_fnrow/keymap.c35
-rw-r--r--keyboards/quad_h/lb75/keymaps/divided_fnrow/readme.md3
-rw-r--r--keyboards/quad_h/lb75/keymaps/via/keymap.c51
-rw-r--r--keyboards/quad_h/lb75/keymaps/via/readme.md3
-rw-r--r--keyboards/quad_h/lb75/keymaps/via/rules.mk1
-rw-r--r--keyboards/quad_h/lb75/lb75.c39
-rw-r--r--keyboards/quad_h/lb75/lb75.h73
-rw-r--r--keyboards/quad_h/lb75/readme.md15
-rw-r--r--keyboards/quad_h/lb75/rules.mk33
-rw-r--r--keyboards/rgbkb/sol/keymaps/xulkal/config.h2
-rw-r--r--keyboards/rgbkb/sol/keymaps/xulkal/rules.mk3
-rw-r--r--keyboards/rgbkb/zen/rev1/keymaps/default/keymap.c4
-rw-r--r--keyboards/rgbkb/zen/rev1/keymaps/jwlawrence/keymap.c4
-rw-r--r--keyboards/scarletbandana/rules.mk2
-rw-r--r--keyboards/sck/neiso/rules.mk2
-rw-r--r--keyboards/sentraq/s60_x/keymaps/ansi_qwertz/keymap.c14
-rw-r--r--keyboards/sentraq/s60_x/keymaps/hasu/keymap.c28
-rw-r--r--keyboards/sentraq/s60_x/keymaps/jpec/keymap.c15
-rw-r--r--keyboards/sentraq/s60_x/keymaps/poker/keymap.c34
-rw-r--r--keyboards/sentraq/s60_x/keymaps/poker_bit/keymap.c13
-rw-r--r--keyboards/sentraq/s60_x/keymaps/poker_set/keymap.c12
-rw-r--r--keyboards/sentraq/s60_x/keymaps/spacefn/keymap.c9
-rw-r--r--keyboards/sentraq/s65_x/keymaps/kelorean/keymap.c12
-rw-r--r--keyboards/sentraq/s65_x/keymaps/nall/keymap.c10
-rw-r--r--keyboards/shambles/config.h43
-rw-r--r--keyboards/shambles/info.json13
-rw-r--r--keyboards/shambles/keymaps/default/keymap.c10
-rw-r--r--keyboards/shambles/readme.md15
-rw-r--r--keyboards/shambles/rules.mk32
-rw-r--r--keyboards/shambles/shambles.c1
-rw-r--r--keyboards/shambles/shambles.h15
-rw-r--r--keyboards/singa/rules.mk2
-rw-r--r--keyboards/sofle/config.h4
-rw-r--r--keyboards/sofle/keymaps/default/config.h6
-rw-r--r--keyboards/sofle/keymaps/default/keymap.c392
-rw-r--r--keyboards/sofle/keymaps/default/readme.md19
-rw-r--r--keyboards/sofle/keymaps/default/rules.mk5
-rw-r--r--keyboards/sofle/readme.md27
-rw-r--r--keyboards/sofle/rev1/config.h40
-rw-r--r--keyboards/sofle/rev1/info.json19
-rw-r--r--keyboards/sofle/rev1/rev1.c1
-rw-r--r--keyboards/sofle/rev1/rev1.h23
-rw-r--r--keyboards/sofle/rev1/rules.mk2
-rw-r--r--keyboards/sofle/rules.mk4
-rw-r--r--keyboards/sofle/sofle.c1
-rw-r--r--keyboards/sofle/sofle.h5
-rw-r--r--keyboards/spaceman/2_milk/2_milk.c (renamed from keyboards/2_milk/2_milk.c)0
-rw-r--r--keyboards/spaceman/2_milk/2_milk.h (renamed from keyboards/2_milk/2_milk.h)0
-rw-r--r--keyboards/spaceman/2_milk/config.h41
-rw-r--r--keyboards/spaceman/2_milk/info.json14
-rw-r--r--keyboards/spaceman/2_milk/keymaps/binary/keymap.c (renamed from keyboards/2_milk/keymaps/binary/keymap.c)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/binary/readme.md (renamed from keyboards/2_milk/keymaps/binary/readme.md)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/copypasta/keymap.c (renamed from keyboards/2_milk/keymaps/copypasta/keymap.c)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/copypasta/readme.md (renamed from keyboards/2_milk/keymaps/copypasta/readme.md)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/default/keymap.c (renamed from keyboards/2_milk/keymaps/default/keymap.c)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/default/readme.md (renamed from keyboards/2_milk/keymaps/default/readme.md)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/emoji/config.h (renamed from keyboards/2_milk/keymaps/emoji/config.h)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/emoji/keymap.c (renamed from keyboards/2_milk/keymaps/emoji/keymap.c)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/emoji/readme.md (renamed from keyboards/2_milk/keymaps/emoji/readme.md)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/emoji/rules.mk (renamed from keyboards/2_milk/keymaps/emoji/rules.mk)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/excessbread/keymap.c (renamed from keyboards/2_milk/keymaps/excessbread/keymap.c)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/excessbread/readme.md (renamed from keyboards/2_milk/keymaps/excessbread/readme.md)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/mikethetiger/keymap.c (renamed from keyboards/2_milk/keymaps/mikethetiger/keymap.c)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/mikethetiger/readme.md (renamed from keyboards/2_milk/keymaps/mikethetiger/readme.md)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/mikethetiger/rules.mk (renamed from keyboards/2_milk/keymaps/mikethetiger/rules.mk)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/mouse/keymap.c (renamed from keyboards/2_milk/keymaps/mouse/keymap.c)0
-rw-r--r--keyboards/spaceman/2_milk/keymaps/mouse/readme.md (renamed from keyboards/2_milk/keymaps/mouse/readme.md)0
-rw-r--r--keyboards/spaceman/2_milk/readme.md19
-rw-r--r--keyboards/spaceman/2_milk/rules.mk (renamed from keyboards/2_milk/rules.mk)0
-rw-r--r--keyboards/spaceman/pancake/config.h (renamed from keyboards/pancake/config.h)0
-rw-r--r--keyboards/spaceman/pancake/feather/config.h (renamed from keyboards/pancake/feather/config.h)0
-rw-r--r--keyboards/spaceman/pancake/feather/rules.mk (renamed from keyboards/pancake/feather/rules.mk)0
-rw-r--r--keyboards/spaceman/pancake/info.json113
-rw-r--r--keyboards/spaceman/pancake/keymaps/default/keymap.c (renamed from keyboards/pancake/keymaps/default/keymap.c)0
-rw-r--r--keyboards/spaceman/pancake/keymaps/default/readme.md3
-rw-r--r--keyboards/spaceman/pancake/pancake.c (renamed from keyboards/pancake/pancake.c)0
-rw-r--r--keyboards/spaceman/pancake/pancake.h (renamed from keyboards/pancake/pancake.h)0
-rw-r--r--keyboards/spaceman/pancake/promicro/config.h (renamed from keyboards/pancake/promicro/config.h)0
-rw-r--r--keyboards/spaceman/pancake/promicro/rules.mk (renamed from keyboards/pancake/promicro/rules.mk)0
-rw-r--r--keyboards/spaceman/pancake/readme.md12
-rw-r--r--keyboards/subatomic/rules.mk2
-rwxr-xr-xkeyboards/tada68/config.h7
-rwxr-xr-xkeyboards/tada68/keymaps/dlg/keymap.c36
-rwxr-xr-xkeyboards/tada68/keymaps/dlg/readme.md40
-rw-r--r--keyboards/tartan/info.json34
-rw-r--r--keyboards/tartan/readme.md25
-rw-r--r--keyboards/tartan/rules.mk41
-rw-r--r--keyboards/tenki/config.h41
-rw-r--r--keyboards/tenki/info.json12
-rw-r--r--keyboards/tenki/keymaps/default/keymap.c19
-rw-r--r--keyboards/tenki/keymaps/via/keymap.c38
-rw-r--r--keyboards/tenki/keymaps/via/rules.mk2
-rw-r--r--keyboards/tenki/readme.md16
-rw-r--r--keyboards/tenki/rules.mk27
-rw-r--r--keyboards/tenki/tenki.c1
-rw-r--r--keyboards/tenki/tenki.h18
-rw-r--r--keyboards/tg4x/readme.md2
-rw-r--r--keyboards/tgr/910/config.h4
-rw-r--r--keyboards/tgr/910/keymaps/via/keymap.c32
-rw-r--r--keyboards/tgr/910/keymaps/via/rules.mk4
-rw-r--r--keyboards/tgr/910/readme.md4
-rw-r--r--keyboards/tgr/910/rules.mk2
-rw-r--r--keyboards/tgr/910ce/rules.mk6
-rw-r--r--keyboards/tgr/alice/rules.mk2
-rw-r--r--keyboards/tgr/jane/rules.mk2
-rw-r--r--keyboards/tgr/tris/config.h50
-rw-r--r--keyboards/tgr/tris/info.json16
-rw-r--r--keyboards/tgr/tris/keymaps/default/keymap.c47
-rw-r--r--keyboards/tgr/tris/keymaps/default/readme.md1
-rw-r--r--keyboards/tgr/tris/keymaps/via/keymap.c57
-rw-r--r--keyboards/tgr/tris/keymaps/via/rules.mk4
-rw-r--r--keyboards/tgr/tris/readme.md19
-rw-r--r--keyboards/tgr/tris/rules.mk26
-rw-r--r--keyboards/tgr/tris/tris.c33
-rw-r--r--keyboards/tgr/tris/tris.h63
-rw-r--r--keyboards/the_royal/liminal/config.h2
-rw-r--r--keyboards/the_royal/liminal/keymaps/default/keymap.c4
-rw-r--r--keyboards/the_royal/liminal/keymaps/default_iso/keymap.c2
-rw-r--r--keyboards/the_royal/liminal/keymaps/via/keymap.c57
-rw-r--r--keyboards/the_royal/liminal/keymaps/via/readme.md3
-rw-r--r--keyboards/the_royal/liminal/keymaps/via/rules.mk1
-rw-r--r--keyboards/thevankeyboards/minivan/keymaps/like_jis/keymap.c2
-rw-r--r--keyboards/thevankeyboards/minivan/keymaps/mjt/keymap.c12
-rw-r--r--keyboards/thevankeyboards/roadkit/keymaps/mjt/keymap.c6
-rw-r--r--keyboards/tkc1800/config.h5
-rw-r--r--keyboards/tkc1800/i2c.c166
-rw-r--r--keyboards/tkc1800/i2c.h49
-rw-r--r--keyboards/tkc1800/keymaps/default/config.h24
-rw-r--r--keyboards/tkc1800/keymaps/default/keymap.c99
-rw-r--r--keyboards/tkc1800/keymaps/smt/config.h24
-rw-r--r--keyboards/tkc1800/keymaps/smt/keymap.c95
-rw-r--r--keyboards/tkc1800/keymaps/via/keymap.c99
-rw-r--r--keyboards/tkc1800/keymaps/wkl/config.h24
-rw-r--r--keyboards/tkc1800/keymaps/wkl/keymap.c100
-rw-r--r--keyboards/tkc1800/keymaps/yanfali/config.h24
-rw-r--r--keyboards/tkc1800/keymaps/yanfali/keymap.c94
-rw-r--r--keyboards/tkc1800/rules.mk9
-rw-r--r--keyboards/tkc1800/tkc1800.c7
-rw-r--r--keyboards/tokyo60/keymaps/default/keymap.c2
-rw-r--r--keyboards/treadstone32/config.h103
-rw-r--r--keyboards/treadstone32/keymaps/default/config.h48
-rw-r--r--keyboards/treadstone32/keymaps/default/keymap.c16
-rw-r--r--keyboards/treadstone32/keymaps/default/rules.mk3
-rw-r--r--keyboards/treadstone32/keymaps/like_jis/config.h48
-rw-r--r--keyboards/treadstone32/keymaps/like_jis/keymap.c14
-rw-r--r--keyboards/treadstone32/keymaps/like_jis/rules.mk7
-rw-r--r--keyboards/treadstone32/lite/config.h96
-rw-r--r--keyboards/treadstone32/lite/lite.c16
-rw-r--r--keyboards/treadstone32/lite/lite.h (renamed from keyboards/treadstone32/treadstone32.h)0
-rw-r--r--keyboards/treadstone32/lite/rules.mk9
-rw-r--r--keyboards/treadstone32/readme.md5
-rw-r--r--keyboards/treadstone32/rev1/config.h97
-rw-r--r--keyboards/treadstone32/rev1/rev1.c16
-rw-r--r--keyboards/treadstone32/rev1/rev1.h45
-rw-r--r--keyboards/treadstone32/rules.mk2
-rw-r--r--keyboards/treadstone32/treadstone32.c43
-rw-r--r--keyboards/treadstone48/readme.md5
-rw-r--r--keyboards/treadstone48/rev1/keymaps/like_jis_rs/config.h (renamed from keyboards/treadstone48/keymaps/like_jis_rs/config.h)0
-rw-r--r--keyboards/treadstone48/rev1/keymaps/like_jis_rs/keymap.c (renamed from keyboards/treadstone48/keymaps/like_jis_rs/keymap.c)0
-rw-r--r--keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme.md (renamed from keyboards/treadstone48/keymaps/like_jis_rs/readme.md)0
-rw-r--r--keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme_jp.md (renamed from keyboards/treadstone48/keymaps/like_jis_rs/readme_jp.md)0
-rw-r--r--keyboards/treadstone48/rev1/keymaps/like_jis_rs/rules.mk (renamed from keyboards/treadstone48/keymaps/like_jis_rs/rules.mk)0
-rw-r--r--keyboards/treadstone48/rev2/config.h250
-rw-r--r--keyboards/treadstone48/rev2/info.json261
-rw-r--r--keyboards/treadstone48/rev2/rev2.c17
-rw-r--r--keyboards/treadstone48/rev2/rev2.h48
-rw-r--r--keyboards/treadstone48/rev2/rules.mk1
-rw-r--r--keyboards/unikorn/rules.mk2
-rw-r--r--keyboards/uranuma/readme.md2
-rw-r--r--keyboards/vinta/readme.md2
-rw-r--r--keyboards/vision_division/keymaps/default/rules.mk1
-rw-r--r--keyboards/vision_division/rules.mk2
-rw-r--r--keyboards/wheatfield/split75/keymaps/art/keymap.c334
-rw-r--r--keyboards/wheatfield/split75/keymaps/art/rules.mk1
-rw-r--r--keyboards/wheatfield/split75/keymaps/default/keymap.c4
-rw-r--r--keyboards/wheatfield/split75/rules.mk2
-rw-r--r--keyboards/whitefox/keymaps/konstantin/rules.mk12
-rw-r--r--keyboards/wilba_tech/wt60_c/config.h119
-rw-r--r--keyboards/wilba_tech/wt60_c/info.json12
-rw-r--r--keyboards/wilba_tech/wt60_c/keymaps/default/keymap.c34
-rw-r--r--keyboards/wilba_tech/wt60_c/keymaps/via/keymap.c34
-rw-r--r--keyboards/wilba_tech/wt60_c/keymaps/via/rules.mk1
-rw-r--r--keyboards/wilba_tech/wt60_c/readme.md13
-rw-r--r--keyboards/wilba_tech/wt60_c/rules.mk46
-rw-r--r--keyboards/wilba_tech/wt60_c/wt60_c.c1
-rw-r--r--keyboards/wilba_tech/wt60_c/wt60_c.h37
-rw-r--r--keyboards/wilba_tech/wt60_xt/config.h183
-rw-r--r--keyboards/wilba_tech/wt60_xt/info.json12
-rw-r--r--keyboards/wilba_tech/wt60_xt/keymaps/default/keymap.c38
-rw-r--r--keyboards/wilba_tech/wt60_xt/keymaps/via/keymap.c38
-rw-r--r--keyboards/wilba_tech/wt60_xt/keymaps/via/rules.mk1
-rw-r--r--keyboards/wilba_tech/wt60_xt/readme.md17
-rw-r--r--keyboards/wilba_tech/wt60_xt/rules.mk31
-rw-r--r--keyboards/wilba_tech/wt60_xt/wt60_xt.c100
-rw-r--r--keyboards/wilba_tech/wt60_xt/wt60_xt.h35
-rw-r--r--keyboards/wilba_tech/wt80_bc/config.h56
-rw-r--r--keyboards/wilba_tech/wt80_bc/info.json12
-rw-r--r--keyboards/wilba_tech/wt80_bc/keymaps/default/keymap.c37
-rw-r--r--keyboards/wilba_tech/wt80_bc/keymaps/via/keymap.c37
-rw-r--r--keyboards/wilba_tech/wt80_bc/keymaps/via/rules.mk1
-rw-r--r--keyboards/wilba_tech/wt80_bc/readme.md13
-rw-r--r--keyboards/wilba_tech/wt80_bc/rules.mk34
-rw-r--r--keyboards/wilba_tech/wt80_bc/wt80_bc.c17
-rw-r--r--keyboards/wilba_tech/wt80_bc/wt80_bc.h38
-rw-r--r--keyboards/wilba_tech/zeal60/readme.md2
-rw-r--r--keyboards/wilba_tech/zeal65/readme.md2
-rw-r--r--keyboards/winkeyless/bface/rules.mk2
-rw-r--r--keyboards/winkeyless/bmini/rules.mk2
-rw-r--r--keyboards/winkeyless/bminiex/rules.mk2
-rw-r--r--keyboards/wolfmarkclub/wm1/bootloader_defs.h11
-rw-r--r--keyboards/wolfmarkclub/wm1/chconf.h714
-rw-r--r--keyboards/wolfmarkclub/wm1/config.h80
-rw-r--r--keyboards/wolfmarkclub/wm1/halconf.h525
-rw-r--r--keyboards/wolfmarkclub/wm1/info.json12
-rw-r--r--keyboards/wolfmarkclub/wm1/keymaps/default/keymap.c17
-rw-r--r--keyboards/wolfmarkclub/wm1/ld/wm1_f103.ld88
-rw-r--r--keyboards/wolfmarkclub/wm1/mcuconf.h209
-rw-r--r--keyboards/wolfmarkclub/wm1/readme.md17
-rw-r--r--keyboards/wolfmarkclub/wm1/rules.mk33
-rw-r--r--keyboards/wolfmarkclub/wm1/wm1.c17
-rw-r--r--keyboards/wolfmarkclub/wm1/wm1.h34
-rw-r--r--keyboards/xd60/keymaps/Jos/keymap.c7
-rw-r--r--keyboards/xd60/keymaps/cheese/keymap.c8
-rw-r--r--keyboards/xd60/keymaps/melka/.gitignore1
-rw-r--r--keyboards/xd60/keymaps/melka/config.h20
-rw-r--r--keyboards/xd60/keymaps/melka/keymap.c165
-rw-r--r--keyboards/xd60/keymaps/melka/passwd_template.h10
-rw-r--r--keyboards/xd60/keymaps/melka/readme.md21
-rw-r--r--keyboards/xd75/keymaps/scheiklp/config.h41
-rw-r--r--keyboards/xd75/keymaps/scheiklp/keymap.c112
-rw-r--r--keyboards/xd75/keymaps/scheiklp/readme.md9
-rw-r--r--keyboards/xd75/keymaps/scheiklp/rules.mk6
-rwxr-xr-xkeyboards/xd87/keymaps/mac_underglow/keymap.c33
-rwxr-xr-xkeyboards/xd87/keymaps/mac_underglow/readme.md13
-rwxr-xr-xkeyboards/xd87/keymaps/mac_underglow/rules.mk3
-rw-r--r--keyboards/ymd96/rules.mk2
-rw-r--r--keyboards/ymdk/bface/README.md3
-rw-r--r--keyboards/ymdk/bface/config.h6
-rw-r--r--keyboards/ymdk/bface/keymaps/minila/keymap.c42
-rw-r--r--keyboards/ymdk/bface/keymaps/minila/readme.md11
-rw-r--r--keyboards/ymdk/bface/rules.mk5
-rw-r--r--keyboards/ymdk/ymd09/config.h4
-rw-r--r--keyboards/ymdk/ymd09/keymaps/via/keymap.c20
-rw-r--r--keyboards/ymdk/ymd09/keymaps/via/rules.mk1
-rw-r--r--keyboards/ymdk/ymd09/rules.mk1
-rw-r--r--keyboards/ymdk_np21/rules.mk2
-rw-r--r--keyboards/z150_bh/config.h (renamed from keyboards/z150_blackheart/config.h)0
-rw-r--r--keyboards/z150_bh/info.json191
-rw-r--r--keyboards/z150_bh/keymaps/default/keymap.c (renamed from keyboards/z150_blackheart/keymaps/default/keymap.c)0
-rw-r--r--keyboards/z150_bh/keymaps/default_tkl/keymap.c (renamed from keyboards/z150_blackheart/keymaps/default_tkl/keymap.c)0
-rw-r--r--keyboards/z150_bh/readme.md14
-rw-r--r--keyboards/z150_bh/rules.mk (renamed from keyboards/z150_blackheart/rules.mk)0
-rw-r--r--keyboards/z150_bh/z150_bh.c32
-rw-r--r--keyboards/z150_bh/z150_bh.h (renamed from keyboards/z150_blackheart/z150_blackheart.h)0
-rw-r--r--keyboards/z150_blackheart/info.json191
-rw-r--r--keyboards/z150_blackheart/readme.md14
-rw-r--r--keyboards/z150_blackheart/z150_blackheart.c32
-rw-r--r--keyboards/zinc/config.h25
-rw-r--r--keyboards/zinc/i2c.c162
-rw-r--r--keyboards/zinc/i2c.h49
-rw-r--r--keyboards/zinc/keymaps/default/config.h2
-rw-r--r--keyboards/zinc/keymaps/default/keymap.c26
-rw-r--r--keyboards/zinc/keymaps/default/readme_en.md131
-rw-r--r--keyboards/zinc/keymaps/default/readme_jp.md48
-rw-r--r--keyboards/zinc/keymaps/default/rules.mk57
-rw-r--r--keyboards/zinc/keymaps/ginjake/config.h2
-rw-r--r--keyboards/zinc/keymaps/ginjake/rules.mk48
-rw-r--r--keyboards/zinc/keymaps/monks/config.h2
-rw-r--r--keyboards/zinc/keymaps/monks/keymap.c3
-rw-r--r--keyboards/zinc/keymaps/monks/readme_jp.md2
-rw-r--r--keyboards/zinc/keymaps/monks/rules.mk50
-rw-r--r--keyboards/zinc/keymaps/toshi0383/config.h2
-rw-r--r--keyboards/zinc/keymaps/toshi0383/rules.mk67
-rw-r--r--keyboards/zinc/readme.md6
-rw-r--r--keyboards/zinc/rev1/config.h61
-rw-r--r--keyboards/zinc/rev1/matrix.c357
-rw-r--r--keyboards/zinc/rev1/rev1.c1
-rw-r--r--keyboards/zinc/rev1/rev1.h15
-rw-r--r--keyboards/zinc/rev1/rules.mk5
-rw-r--r--keyboards/zinc/rev1/serial_config.h18
-rw-r--r--keyboards/zinc/rev1/serial_config_simpleapi.h8
-rw-r--r--keyboards/zinc/rev1/split_scomm.c95
-rw-r--r--keyboards/zinc/rev1/split_scomm.h24
-rw-r--r--keyboards/zinc/rev1/split_util.c70
-rw-r--r--keyboards/zinc/rev1/split_util.h19
-rw-r--r--keyboards/zinc/reva/config.h56
-rw-r--r--keyboards/zinc/reva/matrix.c357
-rw-r--r--keyboards/zinc/reva/reva.c1
-rw-r--r--keyboards/zinc/reva/reva.h15
-rw-r--r--keyboards/zinc/reva/rules.mk5
-rw-r--r--keyboards/zinc/reva/serial_config.h18
-rw-r--r--keyboards/zinc/reva/serial_config_simpleapi.h8
-rw-r--r--keyboards/zinc/reva/split_scomm.c95
-rw-r--r--keyboards/zinc/reva/split_scomm.h24
-rw-r--r--keyboards/zinc/reva/split_util.c70
-rw-r--r--keyboards/zinc/reva/split_util.h19
-rw-r--r--keyboards/zinc/rules.mk4
-rw-r--r--keyboards/zinc/serial.c589
-rw-r--r--keyboards/zinc/serial.h84
-rw-r--r--keyboards/zinc/zinc.h6
-rw-r--r--keyboards/zvecr/split_blackpill/chconf.h714
-rw-r--r--keyboards/zvecr/split_blackpill/config.h180
-rw-r--r--keyboards/zvecr/split_blackpill/halconf.h525
-rw-r--r--keyboards/zvecr/split_blackpill/info.json13
-rw-r--r--keyboards/zvecr/split_blackpill/keymaps/default/keymap.c91
-rw-r--r--keyboards/zvecr/split_blackpill/mcuconf.h209
-rw-r--r--keyboards/zvecr/split_blackpill/readme.md15
-rw-r--r--keyboards/zvecr/split_blackpill/rules.mk37
-rw-r--r--keyboards/zvecr/split_blackpill/split_blackpill.c29
-rw-r--r--keyboards/zvecr/split_blackpill/split_blackpill.h35
-rw-r--r--keyboards/zvecr/zv48/config.h186
-rw-r--r--keyboards/zvecr/zv48/f401/chconf.h714
-rw-r--r--keyboards/zvecr/zv48/f401/halconf.h525
-rw-r--r--keyboards/zvecr/zv48/f401/mcuconf.h253
-rw-r--r--keyboards/zvecr/zv48/f401/rules.mk27
-rw-r--r--keyboards/zvecr/zv48/f411/chconf.h714
-rw-r--r--keyboards/zvecr/zv48/f411/halconf.h525
-rw-r--r--keyboards/zvecr/zv48/f411/mcuconf.h253
-rw-r--r--keyboards/zvecr/zv48/f411/rules.mk27
-rw-r--r--keyboards/zvecr/zv48/info.json13
-rw-r--r--keyboards/zvecr/zv48/keymaps/default/keymap.c91
-rw-r--r--keyboards/zvecr/zv48/readme.md16
-rw-r--r--keyboards/zvecr/zv48/rules.mk29
-rw-r--r--keyboards/zvecr/zv48/zv48.c27
-rw-r--r--keyboards/zvecr/zv48/zv48.h35
-rw-r--r--layouts/community/60_iso/unxmaal/keymap.c2
-rw-r--r--layouts/community/60_tsangan_hhkb/dohmain/keymap.c43
-rw-r--r--layouts/community/60_tsangan_hhkb/dohmain/readme.md37
-rw-r--r--layouts/community/65_ansi/mechmerlin/keymap.c2
-rw-r--r--layouts/community/65_ansi_blocker_split_bs/bcat/keymap.c28
-rw-r--r--layouts/community/65_ansi_blocker_split_bs/bcat/readme.md17
-rw-r--r--layouts/community/ergodox/algernon/keymap.c18
-rw-r--r--layouts/community/ergodox/colemak_osx_pc_no/keymap.c3
-rw-r--r--layouts/community/ergodox/drashna/keymap.c2
-rw-r--r--layouts/community/ergodox/guni/keymap.c19
-rw-r--r--layouts/community/ergodox/j3rn/keymap.c28
-rw-r--r--layouts/community/ergodox/j3rn/readme.md16
-rw-r--r--layouts/community/ergodox/kastyle/keymap.c8
-rw-r--r--layouts/community/ergodox/mpiechotka/keymap.c10
-rw-r--r--layouts/community/ergodox/norwegian_programmer_osx_pc/keymap.c3
-rw-r--r--layouts/community/ergodox/norwegian_programmer_osx_pc_colemak/keymap.c3
-rw-r--r--layouts/community/ergodox/townk_osx/keymap.c13
-rw-r--r--layouts/community/ortho_4x12/jotix/keymap.c32
-rw-r--r--layouts/community/ortho_4x12/junonum/keymap.c11
-rw-r--r--layouts/community/ortho_4x12/junonum/readme.md7
-rw-r--r--layouts/community/ortho_4x12/xyverz/keymap.c4
m---------lib/printf0
-rw-r--r--lib/python/kle2xy.py36
-rw-r--r--lib/python/qmk/c_parse.py161
-rw-r--r--lib/python/qmk/cli/__init__.py1
-rw-r--r--lib/python/qmk/cli/cformat.py10
-rwxr-xr-xlib/python/qmk/cli/compile.py4
-rwxr-xr-xlib/python/qmk/cli/doctor.py62
-rwxr-xr-xlib/python/qmk/cli/info.py158
-rwxr-xr-xlib/python/qmk/cli/json2c.py12
-rw-r--r--lib/python/qmk/cli/list/keymaps.py18
-rw-r--r--lib/python/qmk/commands.py1
-rw-r--r--lib/python/qmk/comment_remover.py20
-rw-r--r--lib/python/qmk/constants.py6
-rw-r--r--lib/python/qmk/decorators.py9
-rw-r--r--lib/python/qmk/info.py249
-rw-r--r--lib/python/qmk/keyboard.py111
-rw-r--r--lib/python/qmk/keymap.py75
-rw-r--r--lib/python/qmk/makefile.py32
-rw-r--r--lib/python/qmk/math.py33
-rw-r--r--lib/python/qmk/path.py33
-rw-r--r--lib/python/qmk/tests/test_cli_commands.py126
-rw-r--r--lib/python/qmk/tests/test_qmk_keymap.py4
m---------lib/vusb0
-rw-r--r--message.mk3
-rw-r--r--quantum/audio/audio.h3
-rw-r--r--quantum/audio/audio_avr.c5
-rw-r--r--quantum/keymap_extras/keymap_belgian.h2
-rw-r--r--quantum/keymap_extras/keymap_canadian_multilingual.h646
-rw-r--r--quantum/keymap_extras/keymap_neo2.h180
-rw-r--r--quantum/keymap_extras/sendstring_canadian_multilingual.h100
-rw-r--r--quantum/matrix.c41
-rw-r--r--quantum/process_keycode/process_rgb.c2
-rw-r--r--quantum/process_keycode/process_unicode_common.c118
-rw-r--r--quantum/process_keycode/process_unicode_common.h2
-rw-r--r--quantum/process_keycode/process_unicodemap.c3
-rw-r--r--quantum/quantum.c3
-rw-r--r--quantum/quantum_keycodes.h1
-rw-r--r--quantum/rgb_matrix.c117
-rw-r--r--quantum/rgb_matrix.h21
-rw-r--r--quantum/rgb_matrix_animations/breathing_anim.h2
-rw-r--r--quantum/rgb_matrix_animations/digital_rain_anim.h24
-rw-r--r--quantum/rgb_matrix_animations/jellybean_raindrops_anim.h2
-rw-r--r--quantum/rgb_matrix_animations/raindrops_anim.h2
-rw-r--r--quantum/rgb_matrix_animations/typing_heatmap_anim.h28
-rw-r--r--quantum/rgb_matrix_runners/effect_runner_dx_dy.h2
-rw-r--r--quantum/rgb_matrix_runners/effect_runner_dx_dy_dist.h2
-rw-r--r--quantum/rgb_matrix_runners/effect_runner_i.h2
-rw-r--r--quantum/rgb_matrix_runners/effect_runner_sin_cos_i.h2
-rw-r--r--quantum/rgb_matrix_types.h7
-rw-r--r--quantum/rgblight.c125
-rw-r--r--quantum/rgblight.h45
-rw-r--r--quantum/rgblight_modes.h8
-rw-r--r--quantum/split_common/matrix.c41
-rw-r--r--quantum/split_common/split_util.c65
-rw-r--r--quantum/stm32/halconf.h4
-rw-r--r--quantum/template/ps2avrgb/rules.mk2
-rw-r--r--tmk_core/avr.mk13
-rw-r--r--tmk_core/chibios.mk29
-rw-r--r--tmk_core/common.mk10
-rw-r--r--tmk_core/common/action.c31
-rw-r--r--tmk_core/common/action_code.h2
-rw-r--r--tmk_core/common/action_layer.c2
-rw-r--r--tmk_core/common/action_layer.h15
-rw-r--r--tmk_core/common/action_tapping.c6
-rw-r--r--tmk_core/common/action_tapping.h2
-rw-r--r--tmk_core/common/action_util.c54
-rw-r--r--tmk_core/common/action_util.h8
-rw-r--r--tmk_core/common/chibios/printf.c233
-rw-r--r--tmk_core/common/chibios/printf.h110
-rw-r--r--tmk_core/common/command.c23
-rw-r--r--tmk_core/common/keyboard.c16
-rw-r--r--tmk_core/common/print.h5
-rw-r--r--tmk_core/common/report.h2
-rw-r--r--tmk_core/common/sendchar_null.c2
-rw-r--r--tmk_core/protocol/arm_atsam/led_matrix.c4
-rw-r--r--tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c5
-rw-r--r--tmk_core/protocol/bluefruit.mk11
-rw-r--r--tmk_core/protocol/bluefruit/bluefruit.c168
-rw-r--r--tmk_core/protocol/bluefruit/bluefruit.h24
-rw-r--r--tmk_core/protocol/bluefruit/main.c87
-rw-r--r--tmk_core/protocol/chibios/main.c3
-rw-r--r--tmk_core/protocol/chibios/usb_main.c5
-rw-r--r--tmk_core/protocol/chibios/usb_main.h2
-rw-r--r--tmk_core/protocol/ibm4704.c4
-rw-r--r--tmk_core/protocol/iwrap.mk18
-rw-r--r--tmk_core/protocol/iwrap/main.c2
-rw-r--r--tmk_core/protocol/lufa/lufa.c2
-rw-r--r--tmk_core/protocol/usb_descriptor.c5
-rw-r--r--tmk_core/protocol/usb_descriptor_common.h31
-rw-r--r--tmk_core/protocol/vusb.mk23
-rw-r--r--tmk_core/protocol/vusb/main.c51
-rw-r--r--tmk_core/protocol/vusb/sendchar_usart.c2
-rw-r--r--tmk_core/protocol/vusb/usbdrv/Changelog.txt308
-rw-r--r--tmk_core/protocol/vusb/usbdrv/CommercialLicense.txt166
-rw-r--r--tmk_core/protocol/vusb/usbdrv/License.txt361
-rw-r--r--tmk_core/protocol/vusb/usbdrv/Readme.txt172
-rw-r--r--tmk_core/protocol/vusb/usbdrv/USB-ID-FAQ.txt149
-rw-r--r--tmk_core/protocol/vusb/usbdrv/USB-IDs-for-free.txt148
-rw-r--r--tmk_core/protocol/vusb/usbdrv/asmcommon.inc188
-rw-r--r--tmk_core/protocol/vusb/usbdrv/oddebug.c46
-rw-r--r--tmk_core/protocol/vusb/usbdrv/oddebug.h121
-rw-r--r--tmk_core/protocol/vusb/usbdrv/usbconfig-prototype.h376
-rw-r--r--tmk_core/protocol/vusb/usbdrv/usbdrv.c622
-rw-r--r--tmk_core/protocol/vusb/usbdrv/usbdrv.h730
-rw-r--r--tmk_core/protocol/vusb/usbdrv/usbdrvasm.S393
-rw-r--r--tmk_core/protocol/vusb/usbdrv/usbdrvasm.asm21
-rw-r--r--tmk_core/protocol/vusb/usbdrv/usbdrvasm12.inc393
-rw-r--r--tmk_core/protocol/vusb/usbdrv/usbdrvasm128.inc750
-rw-r--r--tmk_core/protocol/vusb/usbdrv/usbdrvasm15.inc423
-rw-r--r--tmk_core/protocol/vusb/usbdrv/usbdrvasm16.inc346
-rw-r--r--tmk_core/protocol/vusb/usbdrv/usbdrvasm165.inc453
-rw-r--r--tmk_core/protocol/vusb/usbdrv/usbdrvasm18-crc.inc707
-rw-r--r--tmk_core/protocol/vusb/usbdrv/usbdrvasm20.inc360
-rw-r--r--tmk_core/protocol/vusb/usbdrv/usbportability.h146
-rw-r--r--tmk_core/protocol/vusb/vusb.c306
-rw-r--r--tmk_core/protocol/vusb/vusb.h23
-rw-r--r--tmk_core/ring_buffer.h13
-rw-r--r--tmk_core/rules.mk2
-rw-r--r--users/anderson/dmc12.c46
-rw-r--r--users/anderson/dmc12.h9
-rw-r--r--users/anderson/seq.c38
-rw-r--r--users/anderson/seq.h14
-rw-r--r--users/anderson/smoothled.c34
-rw-r--r--users/anderson/smoothled.h6
-rw-r--r--users/art/art.c464
-rw-r--r--users/art/art.h69
-rw-r--r--users/art/config.h4
-rw-r--r--users/art/rules.mk1
-rw-r--r--users/ericgebhart/ericgebhart.c5
-rw-r--r--users/konstantin/config.h16
-rw-r--r--users/konstantin/konstantin.h2
-rw-r--r--users/konstantin/rules.mk4
-rw-r--r--users/miles2go/babblePaste.c125
-rw-r--r--users/miles2go/babblePaste.h349
-rw-r--r--users/miles2go/babblePaste.md207
-rw-r--r--users/miles2go/babl_chromeos.c103
-rw-r--r--users/miles2go/babl_emacs.c85
-rw-r--r--users/miles2go/babl_linux.c102
-rw-r--r--users/miles2go/babl_mac.c152
-rw-r--r--users/miles2go/babl_readmux.c86
-rw-r--r--users/miles2go/babl_vi.c76
-rw-r--r--users/miles2go/babl_windows.c151
-rw-r--r--users/miles2go/config.h53
-rw-r--r--users/miles2go/keymaps/handwired/ms_sculpt_mobile/config.h41
-rw-r--r--users/miles2go/keymaps/handwired/ms_sculpt_mobile/keymap.c463
-rw-r--r--users/miles2go/keymaps/handwired/ms_sculpt_mobile/readme.md10
-rw-r--r--users/miles2go/keymaps/handwired/ms_sculpt_mobile/rules.mk24
-rw-r--r--users/miles2go/milestogo.c142
-rw-r--r--users/miles2go/milestogo.h289
-rw-r--r--users/miles2go/readme.md10
-rw-r--r--users/miles2go/rules.mk10
-rw-r--r--users/ninjonas/ninjonas.c2
-rw-r--r--users/ridingqwerty/ridingqwerty.c2
-rw-r--r--users/rossman360/rossman360.c5
-rw-r--r--users/rossman360/rossman360.h2
-rw-r--r--users/scheiklp/koy_keys_on_quertz_de_latin1.h63
-rw-r--r--users/stanrc85/stanrc85.c6
-rw-r--r--users/stanrc85/stanrc85.h1
-rw-r--r--users/tominabox1/tominabox1.c2
-rw-r--r--users/vosechu/vosechu.h20
-rw-r--r--users/xulkal/config.h7
-rw-r--r--users/xulkal/layouts.h2
-rw-r--r--users/xulkal/process_records.c2
-rw-r--r--util/bootloader_at90usb128_1.0.1.hex (renamed from util/bootloader_at90usb128x_1_0_1.hex)0
-rw-r--r--util/bootloader_at90usb64_1.0.0.hex252
-rw-r--r--util/bootloader_atmega16u4_1.0.1.hex258
-rw-r--r--util/bootloader_atmega16u4_1_0_1.hex258
-rw-r--r--util/bootloader_atmega32a_1_0_0.hex154
-rw-r--r--util/bootloader_atmega32u4_1.0.0.hex (renamed from util/bootloader_atmega32u4_1_0_0.hex)0
-rw-r--r--util/bootloader_ps2avrgb_bootloadhid_1.0.1.hex156
-rwxr-xr-xutil/freebsd_install.sh26
-rwxr-xr-xutil/linux_install.sh12
-rwxr-xr-xutil/macos_install.sh7
-rwxr-xr-xutil/msys2_install.sh6
1516 files changed, 58024 insertions, 20535 deletions
diff --git a/.gitmodules b/.gitmodules
index 6d8ab8b946..324ef790d3 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -12,7 +12,13 @@
branch = master
[submodule "lib/googletest"]
path = lib/googletest
- url = https://github.com/google/googletest
+ url = https://github.com/qmk/googletest
[submodule "lib/lufa"]
path = lib/lufa
url = https://github.com/qmk/lufa
+[submodule "lib/vusb"]
+ path = lib/vusb
+ url = https://github.com/qmk/v-usb
+[submodule "lib/printf"]
+ path = lib/printf
+ url = https://github.com/qmk/printf
diff --git a/Makefile b/Makefile
index 9478c14f8c..c851e01e73 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
@@ -291,8 +294,8 @@ define PARSE_RULE
$$(info | QMK's make format recently changed to use folder locations and colons:)
$$(info | make project_folder:keymap[:target])
$$(info | Examples:)
- $$(info | make planck/rev4:default:dfu)
- $$(info | make planck:default)
+ $$(info | make dz60:default)
+ $$(info | make planck/rev6:default:flash)
$$(info |)
endif
endef
@@ -559,14 +562,16 @@ endef
%:
# Check if we have the CMP tool installed
cmp $(ROOT_DIR)/Makefile $(ROOT_DIR)/Makefile >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi;
- # Ensure that python3 is installed. This check can be removed after python is used in more places.
- if ! python3 --version 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; fi
+ # Ensure that bin/qmk works. This will be a failing check after the next develop merge on 2020 Aug 29.
+ if ! bin/qmk hello 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; fi
# Check if the submodules are dirty, and display a warning if they are
ifndef SKIP_GIT
if [ ! -e lib/chibios ]; then git submodule sync lib/chibios && git submodule update --depth 50 --init lib/chibios; fi
if [ ! -e lib/chibios-contrib ]; then git submodule sync lib/chibios-contrib && git submodule update --depth 50 --init lib/chibios-contrib; fi
if [ ! -e lib/ugfx ]; then git submodule sync lib/ugfx && git submodule update --depth 50 --init lib/ugfx; fi
if [ ! -e lib/lufa ]; then git submodule sync lib/lufa && git submodule update --depth 50 --init lib/lufa; fi
+ if [ ! -e lib/vusb ]; then git submodule sync lib/vusb && git submodule update --depth 50 --init lib/vusb; fi
+ if [ ! -e lib/printf ]; then git submodule sync lib/printf && git submodule update --depth 50 --init lib/printf; fi
git submodule status --recursive 2>/dev/null | \
while IFS= read -r x; do \
case "$$x" in \
diff --git a/Vagrantfile b/Vagrantfile
index dae4e0d53d..adb93a3cee 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -89,7 +89,7 @@ Vagrant.configure(2) do |config|
Examples:
make planck/rev4:default:dfu
- make planck:default
+ make planck/rev4:default
EOT
end
diff --git a/common_features.mk b/common_features.mk
index 50b1127dc6..bdc6f883eb 100644
--- a/common_features.mk
+++ b/common_features.mk
@@ -70,7 +70,7 @@ ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/pointing_device.c
endif
-VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c
+VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi
EEPROM_DRIVER ?= vendor
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
$(error EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
@@ -85,6 +85,11 @@ else
COMMON_VPATH += $(DRIVER_PATH)/eeprom
QUANTUM_LIB_SRC += i2c_master.c
SRC += eeprom_driver.c eeprom_i2c.c
+ else ifeq ($(strip $(EEPROM_DRIVER)), spi)
+ OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI
+ COMMON_VPATH += $(DRIVER_PATH)/eeprom
+ QUANTUM_LIB_SRC += spi_master.c
+ SRC += eeprom_driver.c eeprom_spi.c
else ifeq ($(strip $(EEPROM_DRIVER)), transient)
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
COMMON_VPATH += $(DRIVER_PATH)/eeprom
diff --git a/docs/ChangeLog/20200530.md b/docs/ChangeLog/20200530.md
new file mode 100644
index 0000000000..9def9ae123
--- /dev/null
+++ b/docs/ChangeLog/20200530.md
@@ -0,0 +1,239 @@
+# QMK Breaking Change - 2020 May 30 Changelog
+
+Four times a year QMK runs a process for merging Breaking Changes. A Breaking Change is any change which modifies how QMK behaves in a way that is incompatible or potentially dangerous. We limit these changes to 4 times per year so that users can have confidence that updating their QMK tree will not break their keymaps.
+
+The list of changes follows.
+
+
+## Core Changes
+
+### Converting V-USB usbdrv to a submodule
+
+[#8321](https://github.com/qmk/qmk_firmware/pull/8321) and [qmk_compiler#62](https://github.com/qmk/qmk_compiler/pull/62).
+
+These PRs move the V-USB driver code out of the qmk_firmware repository and into a submodule pointed at https://github.com/obdev/v-usb. This will make it easier to update the codebase if needed, while applying any potential QMK-specific modifications by forking it to the QMK GitHub organization.
+
+### Unify Tap Hold functions and documentation
+
+[#8348](https://github.com/qmk/qmk_firmware/pull/8348)
+
+Updates all of the per key tap-hold functions to pass the `keyrecord_t` structure, and include documentation changes.
+
+Any remaining versions or code outside of the main repo will need to be converted:
+| Old function | New Function |
+|------------------------------------------------------|---------------------------------------------------------------------------|
+|`uint16_t get_tapping_term(uint16_t keycode)` |`uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record)` |
+|`bool get_ignore_mod_tap_interrupt(uint16_t keycode)` |`bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record)` |
+
+### Python Required In The Build Process
+
+[#9000](https://github.com/qmk/qmk_firmware/pull/9000)
+
+This is the last release of QMK that will work without having Python 3.6 (or later) installed. If your environment is not fully setup you will get a warning instructing you to set it up.
+
+After the next breaking change you will not be able to build if `bin/qmk hello` does not work.
+
+### Upgrade from tinyprintf to mpaland/printf
+
+[#8269](https://github.com/qmk/qmk_firmware/pull/8269)
+
+- Provides debug functionality on ChibiOS/ARM that is more compliant than previous integrations.
+- Less maintenence, fewer QMK customisations, and allows QMK to sidestep previous compile and runtime issues.
+- A `make git-submodule` may be required after pulling the latest QMK Firmware code to update to the new dependency.
+
+### Fixed RGB_DISABLE_AFTER_TIMEOUT to be seconds based & small internals cleanup
+
+[#6480](https://github.com/qmk/qmk_firmware/pull/6480)
+
+- Changes `RGB_DISABLE_AFTER_TIMEOUT` to be based on milliseconds instead of ticks.
+- Includes a code cleanup, resulting in a savings of 100 bytes, depending on features used.
+- Fixed issues with timeouts / suspending at the wrong time not turning off all LEDs in some cases.
+
+The `RGB_DISABLE_AFTER_TIMEOUT` definition is now deprecated, and has been superseded by `RGB_DISABLE_TIMEOUT`. To use the new definition, rename `RGB_DISABLE_AFTER_TIMEOUT` to `RGB_DISABLE_TIMEOUT` in your `config.h` file, and multiply the value set by 1200.
+
+Before: `#define RGB_DISABLE_AFTER_TIMEOUT 100`
+After: `#define RGB_DISABLE_TIMEOUT 120000`
+
+### Switch to qmk forks for everything
+
+[#9019](https://github.com/qmk/qmk_firmware/pull/9019)
+
+Fork all QMK submodules to protect against upstream repositories disappearing.
+
+### code cleanup regarding deprecated macro PLAY_NOTE_ARRAY by replacing it with PLAY_SONG
+
+[#8484](https://github.com/qmk/qmk_firmware/pull/8484)
+
+Removes the deprecated `PLAY_NOTE_ARRAY` macro. References to it are replaced with `PLAY_SONG`, which references the same function.
+
+### fixing wrong configuration of AUDIO feature
+
+[#8903](https://github.com/qmk/qmk_firmware/pull/8903) and [#8974](https://github.com/qmk/qmk_firmware/pull/8974)
+
+`audio_avr.c` does not default to any pin; there has to be a #define XX_AUDIO in config.h at some level for Audio to actually work. Otherwise, the Audio code ends up cluttering the firmware, possibly breaking builds because the maximum allowed firmware size is exceeded.
+
+These changes fix this by disabling Audio on keyboards that have the feature misconfigured, and therefore non-functional.
+
+Also, add a compile-time error to alert the user to a missing pin-configuration (on AVR boards) when `AUDIO_ENABLE = yes` is set.
+
+
+## Keyboard Refactors
+
+### Migrating Lily58 to use split_common
+
+[#6260](https://github.com/qmk/qmk_firmware/pull/6260)
+
+Modifies the default firmware for Lily58 to use the `split_common` library, instead of including and depending on its own set of libraries for the following functionality:
+
+- SSD1306 display
+- i2c for OLED
+- Serial Communication
+
+This allows current lily58 firmware to advance with updates to the `split_common` library, which is shared with many other split keyboards.
+
+#### To migrate existing Lily58 firmware:
+
+[Changes to `config.h`](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-445ac369c8717dcd6fc6fc3630836fc1):
+- Remove `#define SSD1306OLED` from config.h
+
+
+[Changes to `keymap.c`](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7):
+- Find/Replace each instance of `#ifdef SSD1306OLED` with `#ifdef OLED_DRIVER_ENABLE`
+- The following changes are for compatibility with the OLED driver. If you don't use the OLED driver you may safely delete [this section](https://github.com/qmk/qmk_firmware/blob/e6b9980bd45c186f7360df68c24b6e05a80c10dc/keyboards/lily58/keymaps/default/keymap.c#L144-L190)
+- Alternatively, if you did not change the OLED code from that in `default`, you may find it easier to simply copy the [relevant section](https://github.com/qmk/qmk_firmware/blob/4ac310668501ae6786c711ecc8f01f62ddaa1c0b/keyboards/lily58/keymaps/default/keymap.c#L138-L172). Otherwise, the changes you need to make are as follows (sample change [here](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7R138-R173))
+- [Remove](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7L138-L141) the block
+```c
+#ifdef SSD1306OLED
+ iota_gfx_init(!has_usb()); // turns on the display
+#endif
+```
+- Within the block bounded by `#ifdef OLED_DRIVER_ENABLE` and `#endif // OLED_DRIVER_ENABLE`, add the following block to ensure that your two OLEDs are rotated correctly across the left and right sides:
+```c
+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;
+}
+```
+- Remove the functions `matrix_scan_user`, `matrix_update` and `iota_gfx_task_user`
+- Find/Replace `matrix_render_user(struct CharacterMatrix *matrix)` with `iota_gfx_task_user(void)`
+- Find/Replace `is_master` with `is_keyboard_master()`
+- For each instance of `matrix_write_ln(matrix, display_fn())`, rewrite it as `oled_write_ln(read_layer_state(), false);`
+- For each instance of `matrix_write(matrix, read_logo());`, replace with `oled_write(read_logo(), false);`
+
+### Refactor zinc to use split_common
+
+[#7114](https://github.com/qmk/qmk_firmware/pull/7114) and [#9171](https://github.com/qmk/qmk_firmware/pull/9171)
+
+* Refactor to use split_common and remove split codes under the zinc/revx/
+* Add - backlight RGB LED and/or underglow RGB LED option
+* Add - continuous RGB animations feature (between L and R halves)
+* Fix - keymap files to adapt to changes
+ * all authors of keymaps confirmed this PR
+* Update - documents and rules.mk
+
+### Refactor of TKC1800 to use common OLED code
+
+[#8472](https://github.com/qmk/qmk_firmware/pull/8472)
+
+Modifies the default firmware for TKC1800 to use the in-built I2C and OLED drivers, instead of including and depending on its own set of libraries for the following functionality:
+
+- SSD1306 display
+- i2c for OLED
+
+This allows current TKC1800 firmware to advance with updates to those drivers, which are shared with other keyboards.
+
+#### To migrate existing TKC1800 firmware:
+
+[Changes to `config.h`](https://github.com/qmk/qmk_firmware/pull/8472/files#diff-d10b26e676b4a55cbb00d71955116526):
+- Remove `#define SSD1306OLED` from config.h
+
+[Changes to `tkc1800.c`](https://github.com/qmk/qmk_firmware/pull/8472/files#diff-3b35bd30abe89c8110717c6972cd2cc5):
+- Add the following to avoid debug errors on HID_listen if the screen is not present
+```c
+void keyboard_pre_init_kb(void) {
+ setPinInputHigh(D0);
+ setPinInputHigh(D1);
+
+ keyboard_pre_init_user();
+}
+```
+
+[Changes to `keymap.c`](https://github.com/qmk/qmk_firmware/pull/8472/files#diff-05a2a344ce27e4d045fe68520ccd4771):
+- Find/Replace each instance of `#ifdef SSD1306OLED` with `#ifdef OLED_DRIVER_ENABLE`
+- The following changes are for compatibility with the OLED driver. If you don't use the OLED driver you may safely delete [this section](https://github.com/qmk/qmk_firmware/blob/e6b9980bd45c186f7360df68c24b6e05a80c10dc/keyboards/lily58/keymaps/default/keymap.c#L144-L190)
+- [Remove](https://github.com/qmk/qmk_firmware/pull/6260/files#diff-20943ea59856e9bdf3d99ecb2eee40b7L91-L158) the block
+```c
+#ifdef SSD1306OLED
+ iota_gfx_init(!has_usb()); // turns on the display
+#endif
+```
+- Within the block bounded by `#ifdef OLED_DRIVER_ENABLE` and `#endif // OLED_DRIVER_ENABLE`, add the following block to ensure that your two OLEDs are rotated correctly across the left and right sides:
+```c
+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;
+}
+```
+- Remove the function `iota_gfx_task_user`
+
+### Split HHKB to ANSI and JP layouts and Add VIA support for each
+
+[#8582](https://github.com/qmk/qmk_firmware/pull/8582)
+
+- Splits the HHKB codebase into two separate folders `keyboards/hhkb/ansi` and `keyboards/hhkb/jp`.
+- Adds VIA Configurator support for both versions.
+
+#### Migrating existing HHKB keymaps
+
+- Remove any checks for the `HHKB_JP` definition
+ - All checks for this definition have been removed, and each version uses the source that is appropriate to that version.
+- Move the directory for your keymap into the appropriate `keymaps` directory
+ - `keyboards/hhkb/ansi/keymaps/` for ANSI HHKBs
+ - `keyboards/hhkb/jp/keymaps/` for HHKB JPs
+- Compile with the new keyboard names
+ - This PR changes the compilation instructions for the HHKB Alternate Controller. To compile firmware for this controller moving forward, use:
+ - `make hhkb/ansi` for ANSI-layout HHKBs
+ - `make hhkb/jp` for HHKB JP keyboards
+
+
+## Keyboard Moves
+
+- [#8412](https://github.com/qmk/qmk_firmware/pull/8412 "Changing board names to prevent confusion") by blindassassin111
+- [#8499](https://github.com/qmk/qmk_firmware/pull/8499 "Move the Keyboardio Model01 to a keyboardio/ subdir") by algernon
+- [#8830](https://github.com/qmk/qmk_firmware/pull/8830 "Move spaceman keyboards") by Spaceman (formerly known as Rionlion100)
+- [#8537](https://github.com/qmk/qmk_firmware/pull/8537 "Organizing my keyboards (plaid, tartan, ergoinu)") by hsgw
+
+Keyboards by Keyboardio, Spaceman, and hsgw move to vendor folders, while PCBs designed by blindassassin111 are renamed.
+
+Old Name | New Name
+:----------------- | :-----------------
+2_milk | spaceman/2_milk
+at101_blackheart | at101_bh
+ergoinu | dm9records/ergoinu
+model01 | keyboardio/model01
+omnikey_blackheart | omnikey_bh
+pancake | spaceman/pancake
+plaid | dm9records/plaid
+tartan | dm9records/tartan
+z150_blackheart | z150_bh
+
+If you own one of these PCBs, please use the new names to compile your firmware moving forward.
+
+
+## Keycode Migration PRs
+
+[#8954](https://github.com/qmk/qmk_firmware/pull/8954 "Migrate `ACTION_LAYER_TOGGLE` to `TG()`"), [#8957](https://github.com/qmk/qmk_firmware/pull/8957 "Migrate `ACTION_MODS_ONESHOT` to `OSM()`"), [#8958](https://github.com/qmk/qmk_firmware/pull/8958 "Migrate `ACTION_DEFAULT_LAYER_SET` to `DF()`"), [#8959](https://github.com/qmk/qmk_firmware/pull/8959 "Migrate `ACTION_LAYER_MODS` to `LM()`"), [#8968](https://github.com/qmk/qmk_firmware/pull/8968 "Migrate `ACTION_MODS_TAP_KEY` to `MT()`"), [#8977](https://github.com/qmk/qmk_firmware/pull/8977 "Migrate miscellaneous `fn_actions` entries"), and [#8979](https://github.com/qmk/qmk_firmware/pull/8979 "Migrate `ACTION_MODS_KEY` to chained mod keycodes")
+
+Authored by fauxpark, these pull requests remove references to deprecated TMK macros that have been superseded by native QMK keycodes.
+
+Old `fn_actions` action | New QMK keycode
+:---------------------- | :--------------
+`ACTION_DEFAULT_LAYER_SET(layer)` | `DF(layer)`
+`ACTION_LAYER_MODS(layer, mod)` | `LM(layer, mod)`
+`ACTION_LAYER_ONESHOT(mod)` | `OSL(mod)`
+`ACTION_LAYER_TOGGLE(layer)` | `TG(layer)`
+`ACTION_MODS_ONESHOT(mod)` | `OSM(mod)`
+`ACTION_MODS_TAP_KEY(mod, kc)` | `MT(mod, kc)`
+`ACTION_MODS_KEY(mod, kc)`<br>e.g. `ACTION_MODS_KEY(MOD_LCTL, KC_0)` | `MOD(kc)`<br>e.g. `LCTL(KC_0)`
diff --git a/docs/_summary.md b/docs/_summary.md
index 75b9a83e66..1b6ddc67ca 100644
--- a/docs/_summary.md
+++ b/docs/_summary.md
@@ -34,7 +34,9 @@
* [Customizing Functionality](custom_quantum_functions.md)
* [Driver Installation with Zadig](driver_installation_zadig.md)
* [Keymap Overview](keymap.md)
- * [Vagrant Guide](getting_started_vagrant.md)
+ * Development Environments
+ * [Docker Guide](getting_started_docker.md)
+ * [Vagrant Guide](getting_started_vagrant.md)
* Flashing
* [Flashing](flashing.md)
* [Flashing ATmega32A (ps2avrgb)](flashing_bootloadhid.md)
@@ -53,6 +55,7 @@
* Simple Keycodes
* [Full List](keycodes.md)
* [Basic Keycodes](keycodes_basic.md)
+ * [Language-Specific Keycodes](reference_keymap_extras.md)
* [Modifier Keys](feature_advanced_keycodes.md)
* [Quantum Keycodes](quantum_keycodes.md)
@@ -112,6 +115,7 @@
* [Overview](breaking_changes.md)
* [My Pull Request Was Flagged](breaking_changes_instructions.md)
* History
+ * [2020 May 30](ChangeLog/20200530.md)
* [2020 Feb 29](ChangeLog/20200229.md)
* [2019 Aug 30](ChangeLog/20190830.md)
@@ -126,6 +130,7 @@
* [SPI Driver](spi_driver.md)
* [WS2812 Driver](ws2812_driver.md)
* [EEPROM Driver](eeprom_driver.md)
+ * ['serial' Driver](serial_driver.md)
* [GPIO Controls](internals_gpio_control.md)
* [Keyboard Guidelines](hardware_keyboard_guidelines.md)
diff --git a/docs/breaking_changes.md b/docs/breaking_changes.md
index 12bc0db9da..154695ddac 100644
--- a/docs/breaking_changes.md
+++ b/docs/breaking_changes.md
@@ -6,27 +6,28 @@ The breaking change period is when we will merge PR's that change QMK in dangero
## What has been included in past Breaking Changes?
+* [2020 May 30](ChangeLog/20200530.md)
* [2020 Feb 29](ChangeLog/20200229.md)
* [2019 Aug 30](ChangeLog/20190830.md)
## When is the next Breaking Change?
-The next Breaking Change is scheduled for May 30, 2020.
+The next Breaking Change is scheduled for Aug 29, 2020.
### Important Dates
-* [x] 2020 Feb 29 - `future` is created. It will be rebased weekly.
-* [ ] 2020 May 2 - `future` closed to new PR's.
-* [ ] 2020 May 2 - Call for testers.
-* [ ] 2020 May 28 - `master` is locked, no PR's merged.
-* [ ] 2020 May 30 - Merge `future` to `master`.
-* [ ] 2020 May 30 - `master` is unlocked. PR's can be merged again.
+* [x] 2020 May 30 - `develop` is created. It will be rebased weekly.
+* [ ] 2020 Aug 1 - `develop` closed to new PR's.
+* [ ] 2020 Aug 1 - Call for testers.
+* [ ] 2020 Aug 27 - `master` is locked, no PR's merged.
+* [ ] 2020 Aug 29 - Merge `develop` to `master`.
+* [ ] 2020 Aug 29 - `master` is unlocked. PR's can be merged again.
## What changes will be included?
-To see a list of breaking change candidates you can look at the [`breaking_change` label](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+label%3Abreaking_change+is%3Apr). New changes might be added between now and when `future` is closed, and a PR with that label applied is not guaranteed to be merged.
+To see a list of breaking change candidates you can look at the [`breaking_change` label](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+label%3Abreaking_change+is%3Apr). New changes might be added between now and when `develop` is closed, and a PR with that label applied is not guaranteed to be merged.
-If you want your breaking change to be included in this round you need to create a PR with the `breaking_change` label and have it accepted before `future` closes. After `future` closes no new breaking changes will be accepted.
+If you want your breaking change to be included in this round you need to create a PR with the `breaking_change` label and have it accepted before `develop` closes. After `develop` closes no new breaking changes will be accepted.
Criteria for acceptance:
@@ -37,9 +38,9 @@ Criteria for acceptance:
This section documents various processes we use when running the Breaking Changes process.
-## Rebase `future` from `master`
+## Rebase `develop` from `master`
-This is run every Friday while `future` is open.
+This is run every Friday while `develop` is open.
Process:
@@ -47,31 +48,31 @@ Process:
cd qmk_firmware
git checkout master
git pull --ff-only
-git checkout future
+git checkout develop
git rebase master
git push --force
```
-## Creating the `future` branch
+## Creating the `develop` branch
-This happens immediately after the previous `future` branch is merged.
+This happens immediately after the previous `develop` branch is merged.
* `qmk_firmware` git commands
* [ ] `git checkout master`
* [ ] `git pull --ff-only`
- * [ ] `git checkout -b future`
+ * [ ] `git checkout -b develop`
* [ ] Edit `readme.md`
* [ ] Add a big notice at the top that this is a testing branch.
* [ ] Include a link to this document
* [ ] `git commit -m 'Branch point for <DATE> Breaking Change'`
* [ ] `git tag breakpoint_<YYYY>_<MM>_<DD>`
* [ ] `git tag <next_version>` # Prevent the breakpoint tag from confusing version incrementing
- * [ ] `git push origin future`
+ * [ ] `git push origin develop`
* [ ] `git push --tags`
## 4 Weeks Before Merge
-* `future` is now closed to new PR's, only fixes for current PR's may be merged
+* `develop` is now closed to new PR's, only fixes for current PR's may be merged
* Post call for testers
* [ ] Discord
* [ ] GitHub PR
@@ -94,15 +95,15 @@ This happens immediately after the previous `future` branch is merged.
## Day Of Merge
* `qmk_firmware` git commands
- * [ ] `git checkout future`
+ * [ ] `git checkout develop`
* [ ] `git pull --ff-only`
* [ ] `git rebase origin/master`
* [ ] Edit `readme.md`
- * [ ] Remove the notes about `future`
+ * [ ] Remove the notes about `develop`
* [ ] Roll up the ChangeLog into one file.
* [ ] `git commit -m 'Merge point for <DATE> Breaking Change'`
- * [ ] `git push origin future`
-* Github Actions
- * [ ] Create a PR for `future`
+ * [ ] `git push origin develop`
+* GitHub Actions
+ * [ ] Create a PR for `develop`
* [ ] Make sure travis comes back clean
- * [ ] Merge `future` PR
+ * [ ] Merge `develop` PR
diff --git a/docs/breaking_changes_instructions.md b/docs/breaking_changes_instructions.md
index 3f2f93834f..d835671556 100644
--- a/docs/breaking_changes_instructions.md
+++ b/docs/breaking_changes_instructions.md
@@ -27,7 +27,7 @@ If you are contributing core code, and the only reason it needs to go through br
We require submissions that go through the Breaking Change process to include a changelog entry. The entry should be a short summary of the changes your pull request makes &ndash; [each section here started as a changelog](ChangeLog/20190830.md "n.b. This should link to the 2019 Aug 30 Breaking Changes doc - @noroadsleft").
-Your changelog should be located at `docs/ChangeLog/YYYYMMDD/PR####.md`, where `YYYYMMDD` is the date on which QMK's breaking change branch &ndash; usually named `future` &ndash; will be merged into the `master` branch, and `####` is the number of your pull request.
+Your changelog should be located at `docs/ChangeLog/YYYYMMDD/PR####.md`, where `YYYYMMDD` is the date on which QMK's breaking change branch &ndash; usually named `develop` &ndash; will be merged into the `master` branch, and `####` is the number of your pull request.
If your submission requires action on the part of users, your changelog should instruct users what action(s) must be taken, or link to a location that does so.
diff --git a/docs/cli.md b/docs/cli.md
index 01641bd8b8..8684479d0c 100644
--- a/docs/cli.md
+++ b/docs/cli.md
@@ -13,18 +13,17 @@ QMK requires Python 3.6 or greater. We try to keep the number of requirements sm
If you have installed [Homebrew](https://brew.sh) you can tap and install QMK:
```
-brew tap qmk/qmk
-brew install qmk
+brew install qmk/qmk/qmk
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
```
-### Install Using easy_install or pip :id=install-using-easy_install-or-pip
+### Install Using 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.6 (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
+python3 -m pip install qmk
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
```
diff --git a/docs/cli_commands.md b/docs/cli_commands.md
index eff5321bdb..bb0de3c0db 100644
--- a/docs/cli_commands.md
+++ b/docs/cli_commands.md
@@ -6,6 +6,8 @@
This command allows you to compile firmware from any directory. You can compile JSON exports from <https://config.qmk.fm>, compile keymaps in the repo, or compile the keyboard in the current working directory.
+This command is directory aware. It will automatically fill in KEYBOARD and/or KEYMAP if you are in a keyboard or keymap directory.
+
**Usage for Configurator Exports**:
```
@@ -73,8 +75,9 @@ $ qmk compile -kb dz60
## `qmk flash`
-This command is similar to `qmk compile`, but can also target a bootloader. The bootloader is optional, and is set to `:flash` by default.
-To specify a different bootloader, use `-bl <bootloader>`. Visit the [Flashing Firmware](flashing.md) guide for more details of the available bootloaders.
+This command is similar to `qmk compile`, but can also target a bootloader. The bootloader is optional, and is set to `:flash` by default. To specify a different bootloader, use `-bl <bootloader>`. Visit the [Flashing Firmware](flashing.md) guide for more details of the available bootloaders.
+
+This command is directory aware. It will automatically fill in KEYBOARD and/or KEYMAP if you are in a keyboard or keymap directory.
**Usage for Configurator Exports**:
@@ -128,6 +131,32 @@ Check your environment and report problems only:
qmk doctor -n
+## `qmk info`
+
+Displays information about keyboards and keymaps in QMK. You can use this to get information about a keyboard, show the layouts, display the underlying key matrix, or to pretty-print JSON keymaps.
+
+**Usage**:
+
+```
+qmk info [-f FORMAT] [-m] [-l] [-km KEYMAP] [-kb KEYBOARD]
+```
+
+This command is directory aware. It will automatically fill in KEYBOARD and/or KEYMAP if you are in a keyboard or keymap directory.
+
+**Examples**:
+
+Show basic information for a keyboard:
+
+ qmk info -kb planck/rev5
+
+Show the matrix for a keyboard:
+
+ qmk info -kb ergodox_ez -m
+
+Show a JSON keymap for a keyboard:
+
+ qmk info -kb clueboard/california -km default
+
## `qmk json2c`
Creates a keymap.c from a QMK Configurator export.
@@ -152,6 +181,8 @@ qmk list-keyboards
This command lists all the keymaps for a specified keyboard (and revision).
+This command is directory aware. It will automatically fill in KEYBOARD if you are in a keyboard directory.
+
**Usage**:
```
@@ -162,6 +193,8 @@ qmk list-keymaps -kb planck/ez
This command creates a new keymap based on a keyboard's existing default keymap.
+This command is directory aware. It will automatically fill in KEYBOARD and/or KEYMAP if you are in a keyboard or keymap directory.
+
**Usage**:
```
diff --git a/docs/cli_configuration.md b/docs/cli_configuration.md
index 1196ab669d..50f5dc6e28 100644
--- a/docs/cli_configuration.md
+++ b/docs/cli_configuration.md
@@ -108,7 +108,7 @@ compile.keymap: skully -> None
|-----|---------------|-------------|
| user.keyboard | None | The keyboard path (Example: `clueboard/66/rev4`) |
| user.keymap | None | The keymap name (Example: `default`) |
-| user.name | None | The user's github username. |
+| user.name | None | The user's GitHub username. |
# All Configuration Options
diff --git a/docs/cli_development.md b/docs/cli_development.md
index af86686c07..07c8f281ba 100644
--- a/docs/cli_development.md
+++ b/docs/cli_development.md
@@ -210,7 +210,7 @@ Our tests can be found in `lib/python/qmk/tests/`. You will find both unit and i
If your PR does not include a comprehensive set of tests please add comments like this to your code so that other people know where they can help:
- # TODO(unassigned/<yourGithubUsername>): Write <unit|integration> tests
+ # TODO(unassigned/<your_github_username>): Write <unit|integration> tests
We use [nose2](https://nose2.readthedocs.io/en/latest/getting_started.html) to run our tests. You can refer to the nose2 documentation for more details on what you can do in your test functions.
diff --git a/docs/config_options.md b/docs/config_options.md
index 16fea83a33..ab26fd46ce 100644
--- a/docs/config_options.md
+++ b/docs/config_options.md
@@ -191,7 +191,14 @@ 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 RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF`
+ * If defined, then [lighting layers](feature_rgblight?id=overriding-rgb-lighting-onoff-status) will be shown even if RGB Light is off.
* `#define RGBLED_NUM 12`
* number of LEDs
* `#define RGBLIGHT_SPLIT`
diff --git a/docs/configurator_step_by_step.md b/docs/configurator_step_by_step.md
index aee1d4e1f6..965012a907 100644
--- a/docs/configurator_step_by_step.md
+++ b/docs/configurator_step_by_step.md
@@ -12,7 +12,7 @@ I'll say that again because it's important:
!> **MAKE SURE YOU SELECT THE RIGHT VERSION!**
-If your keyboard has been advertised to be powered by QMK but is not in the list, chances are a developer hasn't gotten to it yet or we haven't had a chance to merge it in yet. File an issue at [qmk_firmware](https://github.com/qmk/qmk_firmware/issues) requesting to support that particular keyboard, if there is no active [Pull Request](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+is%3Apr+label%3Akeyboard) for it. There are also QMK powered keyboards that are in their manufacturer's own github accounts. Double check for that as well. <!-- FIXME(skullydazed): This feels too wordy and I'm not sure we want to encourage these kinds of issues. Also, should we prompt them to bug the manufacutrer? -->
+If your keyboard has been advertised to be powered by QMK but is not in the list, chances are a developer hasn't gotten to it yet or we haven't had a chance to merge it in yet. File an issue at [qmk_firmware](https://github.com/qmk/qmk_firmware/issues) requesting to support that particular keyboard, if there is no active [Pull Request](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+is%3Apr+label%3Akeyboard) for it. There are also QMK powered keyboards that are in their manufacturer's own GitHub accounts. Double check for that as well. <!-- FIXME(skullydazed): This feels too wordy and I'm not sure we want to encourage these kinds of issues. Also, should we prompt them to bug the manufacutrer? -->
## Step 2: Select Your Keyboard Layout
diff --git a/docs/custom_quantum_functions.md b/docs/custom_quantum_functions.md
index 84ae589ed6..6eb144af76 100644
--- a/docs/custom_quantum_functions.md
+++ b/docs/custom_quantum_functions.md
@@ -57,7 +57,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case KC_ENTER:
// Play a tone when enter is pressed
if (record->event.pressed) {
- PLAY_NOTE_ARRAY(tone_qwerty);
+ PLAY_SONG(tone_qwerty);
}
return true; // Let QMK send the enter press/release events
default:
@@ -438,7 +438,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case KC_ENTER:
// Play a tone when enter is pressed
if (record->event.pressed) {
- PLAY_NOTE_ARRAY(tone_qwerty);
+ PLAY_SONG(tone_qwerty);
}
return true; // Let QMK send the enter press/release events
case RGB_LYR: // This allows me to use underglow as layer indication, or as normal
@@ -486,56 +486,3 @@ And you're done. The RGB layer indication will only work if you want it to. And
* Keymap: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)` and `void eeconfig_update_user(uint32_t val)`
The `val` is the value of the data that you want to write to EEPROM. And the `eeconfig_read_*` function return a 32 bit (DWORD) value from the EEPROM.
-
-# Custom Tapping Term
-
-By default, the tapping term and related options (such as `IGNORE_MOD_TAP_INTERRUPT`) are defined globally, and are not configurable by key. For most users, this is perfectly fine. But in some cases, dual function keys would be greatly improved by different timeout behaviors than `LT` keys, or because some keys may be easier to hold than others. Instead of using custom key codes for each, this allows for per key configurable timeout behaviors.
-
-There are two configurable options to control per-key timeout behaviors:
-
-- `TAPPING_TERM_PER_KEY`
-- `IGNORE_MOD_TAP_INTERRUPT_PER_KEY`
-
-You need to add `#define` lines to your `config.h` for each feature you want.
-
-```
-#define TAPPING_TERM_PER_KEY
-#define IGNORE_MOD_TAP_INTERRUPT_PER_KEY
-```
-
-
-## Example `get_tapping_term` Implementation
-
-To change the `TAPPING_TERM` based on the keycode, you'd want to add something like the following to your `keymap.c` file:
-
-```c
-uint16_t get_tapping_term(uint16_t keycode) {
- switch (keycode) {
- case SFT_T(KC_SPC):
- return TAPPING_TERM + 1250;
- case LT(1, KC_GRV):
- return 130;
- default:
- return TAPPING_TERM;
- }
-}
-```
-
-## Example `get_ignore_mod_tap_interrupt` Implementation
-
-To change the `IGNORE_MOD_TAP_INTERRUPT` value based on the keycode, you'd want to add something like the following to your `keymap.c` file:
-
-```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` Function Documentation
-
-Unlike many of the other functions here, there isn't a need (or even reason) to have a quantum or keyboard level function. Only user level functions are useful here, so no need to mark them as such.
diff --git a/docs/de/README.md b/docs/de/README.md
index 88239d45d4..bf8fbac57a 100644
--- a/docs/de/README.md
+++ b/docs/de/README.md
@@ -13,7 +13,7 @@ QMK (*Quantum Mechanical Keyboard*) ist eine Open-Source-Community, welche die Q
## Bezugsquelle für QMK
-Wenn Du vorhast, deine Tastatur, Tastaturbelegung oder Features zu QMK beizusteuern, geht das am einfachsten, indem Du das [Repository auf Github](https://github.com/qmk/qmk_firmware#fork-destination-box) forkst, die Änderungen in deinem lokalen Repo vornimmst und anschließend einen [Pull Request](https://github.com/qmk/qmk_firmware/pulls) einreichst.
+Wenn Du vorhast, deine Tastatur, Tastaturbelegung oder Features zu QMK beizusteuern, geht das am einfachsten, indem Du das [Repository auf GitHub](https://github.com/qmk/qmk_firmware#fork-destination-box) forkst, die Änderungen in deinem lokalen Repo vornimmst und anschließend einen [Pull Request](https://github.com/qmk/qmk_firmware/pulls) einreichst.
Ansonsten kannst Du es als [zip](https://github.com/qmk/qmk_firmware/zipball/master) oder [tar](https://github.com/qmk/qmk_firmware/tarball/master) herunterladen, oder es direkt via git klonen (`git clone git@github.com:qmk/qmk_firmware.git` bzw. `git clone https://github.com/qmk/qmk_firmware.git`).
diff --git a/docs/de/_summary.md b/docs/de/_summary.md
index 19c75ecd38..ffbd292bd4 100644
--- a/docs/de/_summary.md
+++ b/docs/de/_summary.md
@@ -11,7 +11,7 @@
* [QMK CLI](de/cli.md)
* [QMK CLI Konfiguration](de/cli_configuration.md)
* [Zu QMK beitragen](de/contributing.md)
- * [Anleitung für Github](de/getting_started_github.md)
+ * [Anleitung für GitHub](de/getting_started_github.md)
* [Nach Hilfe fragen](de/getting_started_getting_help.md)
* [Breaking Changes](de/breaking_changes.md)
diff --git a/docs/de/newbs_learn_more_resources.md b/docs/de/newbs_learn_more_resources.md
index 59b72152dd..ac5adb0c12 100644
--- a/docs/de/newbs_learn_more_resources.md
+++ b/docs/de/newbs_learn_more_resources.md
@@ -6,7 +6,7 @@ Git Ressourcen:
* [Gutes allgemeines Tutorial](https://www.codecademy.com/learn/learn-git) (auf Englisch)
* [Git spielerisch anhand von Beispielen lernen](https://learngitbranching.js.org/) (auf Englisch)
-* [Mehr über den allgemeinen Umgang mit Github](getting_started_github.md)
+* [Mehr über den allgemeinen Umgang mit GitHub](getting_started_github.md)
* [Mehr über Git im Bezug zu QMK](contributing.md)
Mehr über die Arbeit mit der Befehlszeile:
diff --git a/docs/eeprom_driver.md b/docs/eeprom_driver.md
index 5a91a7c2da..188b95caa7 100644
--- a/docs/eeprom_driver.md
+++ b/docs/eeprom_driver.md
@@ -1,4 +1,4 @@
-# EEPROM Driver Configuration
+# EEPROM Driver Configuration :id=eeprom-driver-configuration
The EEPROM driver can be swapped out depending on the needs of the keyboard, or whether extra hardware is present.
@@ -6,15 +6,20 @@ Driver | Description
-----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
`EEPROM_DRIVER = vendor` (default) | Uses the on-chip driver provided by the chip manufacturer. For AVR, this is provided by avr-libc. This is supported on ARM for a subset of chips -- STM32F3xx, STM32F1xx, and STM32F072xB will be emulated by writing to flash. STM32L0xx and STM32L1xx will use the onboard dedicated true EEPROM. Other chips will generally act as "transient" below.
`EEPROM_DRIVER = i2c` | Supports writing to I2C-based 24xx EEPROM chips. See the driver section below.
+`EEPROM_DRIVER = spi` | Supports writing to SPI-based 25xx EEPROM chips. See the driver section below.
`EEPROM_DRIVER = transient` | Fake EEPROM driver -- supports reading/writing to RAM, and will be discarded when power is lost.
-## Vendor Driver Configuration
+## Vendor Driver Configuration :id=vendor-eeprom-driver-configuration
+
+#### STM32 L0/L1 Configuration :id=stm32l0l1-eeprom-driver-configuration
!> Resetting EEPROM using an STM32L0/L1 device takes up to 1 second for every 1kB of internal EEPROM used.
-No configurable options are available.
+`config.h` override | Description | Default Value
+------------------------------------|--------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------
+`#define STM32_ONBOARD_EEPROM_SIZE` | The size of the EEPROM to use, in bytes. Erase times can be high, so it's configurable here, if not using the default value. | Minimum required to cover base _eeconfig_ data, or `1024` if VIA is enabled.
-## I2C Driver Configuration
+## I2C Driver Configuration :id=i2c-eeprom-driver-configuration
Currently QMK supports 24xx-series chips over I2C. As such, requires a working i2c_master driver configuration. You can override the driver configuration via your config.h:
@@ -41,7 +46,21 @@ MB85RC256V FRAM | `#define EEPROM_I2C_MB85RC256V` | <https://www.adafruit.com/p
?> If you find that the EEPROM is not cooperating, ensure you've correctly shifted up your EEPROM address by 1. For example, the datasheet might state the address as `0b01010000` -- the correct value of `EXTERNAL_EEPROM_I2C_BASE_ADDRESS` needs to be `0b10100000`.
-## Transient Driver configuration
+## SPI Driver Configuration :id=spi-eeprom-driver-configuration
+
+Currently QMK supports 25xx-series chips over SPI. As such, requires a working spi_master driver configuration. You can override the driver configuration via your config.h:
+
+`config.h` override | Description | Default Value
+-----------------------------------------------|--------------------------------------------------------------------------------------|--------------
+`#define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN` | SPI Slave select pin in order to inform that the EEPROM is currently being addressed | _none_
+`#define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR` | Clock divisor used to divide the peripheral clock to derive the SPI frequency | `64`
+`#define EXTERNAL_EEPROM_BYTE_COUNT` | Total size of the EEPROM in bytes | 8192
+`#define EXTERNAL_EEPROM_PAGE_SIZE` | Page size of the EEPROM in bytes, as specified in the datasheet | 32
+`#define EXTERNAL_EEPROM_ADDRESS_SIZE` | The number of bytes to transmit for the memory location within the EEPROM | 2
+
+!> There's no way to determine if there is an SPI EEPROM actually responding. Generally, this will result in reads of nothing but zero.
+
+## Transient Driver configuration :id=transient-eeprom-driver-configuration
The only configurable item for the transient EEPROM driver is its size:
diff --git a/docs/es/README.md b/docs/es/README.md
index d39b278008..75fd3cb64e 100644
--- a/docs/es/README.md
+++ b/docs/es/README.md
@@ -13,7 +13,7 @@ QMK (*Quantum Mechanical Keyboard*) es una comunidad open source que mantiene el
## Cómo conseguirlo
-Si estás pensando en contribuir con un keymap, teclado, or característica a QMK, la manera más sencilla es hacer un [fork del repositorio en Github](https://github.com/qmk/qmk_firmware#fork-destination-box), y clonar tu repositorio localmente para hacer los cambios, subirlos, y abir un [Pull Request](https://github.com/qmk/qmk_firmware/pulls) desde tu fork.
+Si estás pensando en contribuir con un keymap, teclado, or característica a QMK, la manera más sencilla es hacer un [fork del repositorio en GitHub](https://github.com/qmk/qmk_firmware#fork-destination-box), y clonar tu repositorio localmente para hacer los cambios, subirlos, y abir un [Pull Request](https://github.com/qmk/qmk_firmware/pulls) desde tu fork.
De cualquier manera, también puedes descargarlo directamente en formatos ([zip](https://github.com/qmk/qmk_firmware/zipball/master), [tar](https://github.com/qmk/qmk_firmware/tarball/master)), o clonarlo via git (`git@github.com:qmk/qmk_firmware.git`), o https (`https://github.com/qmk/qmk_firmware.git`).
diff --git a/docs/es/_summary.md b/docs/es/_summary.md
index b58d825f74..aa2a0ca5d9 100644
--- a/docs/es/_summary.md
+++ b/docs/es/_summary.md
@@ -11,7 +11,7 @@
* [QMK CLI](es/cli.md)
* [Configuración de QMK CLI](es/cli_configuration.md)
* [Contribuyendo a QMK](es/contributing.md)
- * [Cómo usar Github](es/getting_started_github.md)
+ * [Cómo usar GitHub](es/getting_started_github.md)
* [Obtener ayuda](es/getting_started_getting_help.md)
* [Cambios incompatibles](es/breaking_changes.md)
diff --git a/docs/es/newbs_best_practices.md b/docs/es/newbs_best_practices.md
index fc2afb9ed2..2f72eff788 100644
--- a/docs/es/newbs_best_practices.md
+++ b/docs/es/newbs_best_practices.md
@@ -6,7 +6,7 @@ Este documento procura instruir a los novatos en las mejores prácticas para ten
En este documento suponemos un par de cosas:
-1. Tienes una cuenta de Github, y has hecho un [fork del repo qmk_firmware](getting_started_github.md) en tu cuenta.
+1. Tienes una cuenta de GitHub, y has hecho un [fork del repo qmk_firmware](getting_started_github.md) en tu cuenta.
2. Has [configurado tu entorno de desarrollo](newbs_getting_started.md?id=environment-setup).
diff --git a/docs/es/newbs_building_firmware_configurator.md b/docs/es/newbs_building_firmware_configurator.md
index 9333159c2c..60d67f5fa4 100644
--- a/docs/es/newbs_building_firmware_configurator.md
+++ b/docs/es/newbs_building_firmware_configurator.md
@@ -21,7 +21,7 @@ Lo diré otra vez porque es importante
!> **ASEGÚRATE DE QUE SELECCIONAS LA VERSIÓN CORRECTA!**
-Si se ha anunciado que tu teclado funciona con QMK pero no está en la lista, es probable que un desarrollador no se haya encargado de él aún o que todavía no hemos tenido la oportunidad de incluirlo. Abre un issue en [qmk_firmware](https://github.com/qmk/qmk_firmware/issues) solicitando soportar ese teclado un particular, si no hay un [Pull Request](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+is%3Apr+label%3Akeyboard) activo para ello. Hay también teclados que funcionan con QMK que están en las cuentas de github de sus manufacturantes. Acuérdate de comprobar esto también.
+Si se ha anunciado que tu teclado funciona con QMK pero no está en la lista, es probable que un desarrollador no se haya encargado de él aún o que todavía no hemos tenido la oportunidad de incluirlo. Abre un issue en [qmk_firmware](https://github.com/qmk/qmk_firmware/issues) solicitando soportar ese teclado un particular, si no hay un [Pull Request](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+is%3Apr+label%3Akeyboard) activo para ello. Hay también teclados que funcionan con QMK que están en las cuentas de GitHub de sus manufacturantes. Acuérdate de comprobar esto también.
## Eligiendo el layout de tu teclado
diff --git a/docs/es/newbs_learn_more_resources.md b/docs/es/newbs_learn_more_resources.md
index 413b9ffa5e..34fd7556bf 100644
--- a/docs/es/newbs_learn_more_resources.md
+++ b/docs/es/newbs_learn_more_resources.md
@@ -6,7 +6,7 @@ Recursos de Git:
* [Excelente tutorial general](https://www.codecademy.com/learn/learn-git)
* [Juego de Git para aprender usando ejemplos](https://learngitbranching.js.org/)
-* [Recursos de Git para aprender más sobre Github](getting_started_github.md)
+* [Recursos de Git para aprender más sobre GitHub](getting_started_github.md)
* [Recursos de Git dirigidos específicamente a QMK](contributing.md)
diff --git a/docs/faq_build.md b/docs/faq_build.md
index 70a16afea4..2f1a4dd7f4 100644
--- a/docs/faq_build.md
+++ b/docs/faq_build.md
@@ -113,26 +113,16 @@ OPT_DEFS += -DBOOTLOADER_SIZE=2048
```
## `avr-gcc: internal compiler error: Abort trap: 6 (program cc1)` on MacOS
+
This is an issue with updating on brew, causing symlinks that avr-gcc depend on getting mangled.
The solution is to remove and reinstall all affected modules.
```
-brew rm avr-gcc
-brew rm avr-gcc@8
-brew rm dfu-programmer
-brew rm dfu-util
-brew rm gcc-arm-none-eabi
-brew rm arm-gcc-bin@8
-brew rm avrdude
-brew install avr-gcc@8
-brew install dfu-programmer
-brew install dfu-util
-brew install arm-gcc-bin@8
-brew install avrdude
+brew rm avr-gcc avr-gcc@8 dfu-programmer dfu-util gcc-arm-none-eabi arm-gcc-bin@8 avrdude qmk
+brew install qmk/qmk/qmk
brew link --force avr-gcc@8
brew link --force arm-gcc-bin@8
-
```
### `avr-gcc` and LUFA
diff --git a/docs/feature_hd44780.md b/docs/feature_hd44780.md
index 0a174035be..dc476c734f 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_pointing_device.md b/docs/feature_pointing_device.md
index b90c341d5e..f0b3d75bd8 100644
--- a/docs/feature_pointing_device.md
+++ b/docs/feature_pointing_device.md
@@ -27,20 +27,17 @@ In the following example, a custom key is used to click the mouse and scroll 127
```c
case MS_SPECIAL:
- report_mouse_t currentReport = pointing_device_get_report();
- if (record->event.pressed)
- {
+ report_mouse_t currentReport = pointing_device_get_report();
+ if (record->event.pressed) {
currentReport.v = 127;
- currentReport.h = 127;
- currentReport.buttons |= MOUSE_BTN1; //this is defined in report.h
- }
- else
- {
+ currentReport.h = 127;
+ currentReport.buttons |= MOUSE_BTN1; // this is defined in report.h
+ } else {
currentReport.v = -127;
currentReport.h = -127;
currentReport.buttons &= ~MOUSE_BTN1;
}
- pointing_device_set_report(currentReport);
+ pointing_device_set_report(currentReport);
break;
```
diff --git a/docs/feature_rawhid.md b/docs/feature_rawhid.md
index ed848a4c79..01e215be45 100644
--- a/docs/feature_rawhid.md
+++ b/docs/feature_rawhid.md
@@ -44,7 +44,11 @@ To connect your host computer to your keyboard with raw HID you need four pieces
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`**.
+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`.
+
+The final two can be overridden in your keyboard's `config.h` in the keyboard's main directory by redefining the values: `#define RAW_USAGE_PAGE 0xFF60` and `#define RAW_USAGE_ID 0x61`.
+
+By default, **Usage Page** is `0xFF60` and **Usage** is `0x61`.
### Building your host
diff --git a/docs/feature_rgb_matrix.md b/docs/feature_rgb_matrix.md
index 2cec55ee77..a4f434cbd9 100644
--- a/docs/feature_rgb_matrix.md
+++ b/docs/feature_rgb_matrix.md
@@ -374,7 +374,8 @@ These are defined in [`rgblight_list.h`](https://github.com/qmk/qmk_firmware/blo
```c
#define RGB_MATRIX_KEYPRESSES // reacts to keypresses
#define RGB_MATRIX_KEYRELEASES // reacts to keyreleases (instead of keypresses)
-#define RGB_DISABLE_AFTER_TIMEOUT 0 // number of ticks to wait until disabling effects
+#define RGB_DISABLE_TIMEOUT 0 // number of milliseconds to wait until rgb automatically turns off
+#define RGB_DISABLE_AFTER_TIMEOUT 0 // OBSOLETE: number of ticks to wait until disabling effects
#define RGB_DISABLE_WHEN_USB_SUSPENDED false // turn off effects when suspended
#define RGB_MATRIX_LED_PROCESS_LIMIT (DRIVER_LED_TOTAL + 4) / 5 // limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness)
#define RGB_MATRIX_LED_FLUSH_LIMIT 16 // limits in milliseconds how frequently an animation will update the LEDs. 16 (16ms) is equivalent to limiting to 60fps (increases keyboard responsiveness)
@@ -437,12 +438,16 @@ Where `28` is an unused index from `eeconfig.h`.
|`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 |
+|Function |Description |
+|---------------------------------|---------------------------|
+|`rgb_matrix_is_enabled()` |Gets current on/off status |
+|`rgb_matrix_get_mode()` |Gets current mode |
+|`rgb_matrix_get_hue()` |Gets current hue |
+|`rgb_matrix_get_sat()` |Gets current sat |
+|`rgb_matrix_get_val()` |Gets current val |
+|`rgb_matrix_get_hsv()` |Gets hue, sat, and val and returns a [`HSV` structure](https://github.com/qmk/qmk_firmware/blob/7ba6456c0b2e041bb9f97dbed265c5b8b4b12192/quantum/color.h#L56-L61)|
+|`rgb_matrix_get_speed()` |Gets current speed |
+|`rgb_matrix_get_suspend_state()` |Gets current suspend state |
## Callbacks :id=callbacks
diff --git a/docs/feature_rgblight.md b/docs/feature_rgblight.md
index 219cd8317b..5921e9941a 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};
```
@@ -177,6 +184,10 @@ const uint8_t RGBLED_GRADIENT_RANGES[] PROGMEM = {255, 170, 127, 85, 64};
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.
+### 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
@@ -211,8 +222,12 @@ void keyboard_post_init_user(void) {
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.
+
+### Enabling and disabling lighting layers :id=enabling-lighting-layers
-Finally, we enable and disable the lighting layers whenever the state of the keyboard changes:
+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) {
@@ -228,7 +243,44 @@ bool led_update_user(led_t led_state) {
}
```
-Note: For split keyboards with two controllers, both sides need to be flashed when updating the contents of rgblight_layers.
+### 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;
+ }
+}
+```
+
+### Overriding RGB Lighting on/off status
+
+Normally lighting layers are not shown when RGB Lighting is disabled (e.g. with `RGB_TOG` keycode). If you would like lighting layers to work even when the RGB Lighting is otherwise off, add `#define RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF` to your `config.h`.
## Functions
@@ -328,12 +380,14 @@ rgblight_sethsv(HSV_GREEN, 2); // led 2
|`rgblight_set_layer_state(i, is_on)` |Enable or disable lighting layer `i` based on value of `bool is_on` |
#### query
-|Function |Description |
-|-----------------------|-----------------|
-|`rgblight_get_mode()` |Get current mode |
-|`rgblight_get_hue()` |Get current hue |
-|`rgblight_get_sat()` |Get current sat |
-|`rgblight_get_val()` |Get current val |
+|Function |Description |
+|-----------------------|---------------------------|
+|`rgblight_is_enabled()`|Gets current on/off status |
+|`rgblight_get_mode()` |Gets current mode |
+|`rgblight_get_hue()` |Gets current hue |
+|`rgblight_get_sat()` |Gets current sat |
+|`rgblight_get_val()` |Gets current val |
+|`rgblight_get_speed()` |Gets current speed |
## Colors
diff --git a/docs/feature_split_keyboard.md b/docs/feature_split_keyboard.md
index 66194c5f4b..63374a804e 100644
--- a/docs/feature_split_keyboard.md
+++ b/docs/feature_split_keyboard.md
@@ -8,9 +8,20 @@ QMK Firmware has a generic implementation that is usable by any board, as well a
For this, we will mostly be talking about the generic implementation used by the Let's Split and other keyboards.
-!> ARM is not yet supported for Split Keyboards. Progress is being made, but we are not quite there, yet.
+!> ARM is not yet fully supported for Split Keyboards and has many limitations. Progress is being made, but we have not yet reached 100% feature parity.
+## Compatibility Overview
+
+| Transport | AVR | ARM |
+|------------------------------|--------------------|--------------------|
+| ['serial'](serial_driver.md) | :heavy_check_mark: | :white_check_mark: <sup>1</sup> |
+| I2C | :heavy_check_mark: | |
+
+Notes:
+
+1. Both hardware and software limitations are detailed within the [driver documentation](serial_driver.md).
+
## Hardware Configuration
This assumes that you're using two Pro Micro-compatible controllers, and are using TRRS jacks to connect to two halves.
diff --git a/docs/feature_swap_hands.md b/docs/feature_swap_hands.md
index 09e01d50d3..009477d203 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_userspace.md b/docs/feature_userspace.md
index ac0a1360d9..8665481db9 100644
--- a/docs/feature_userspace.md
+++ b/docs/feature_userspace.md
@@ -1,6 +1,6 @@
# Userspace: Sharing Code Between Keymaps
-If you use more than one keyboard with a similar keymap, you might see the benefit in being able to share code between them. Create your own folder in `users/` named the same as your keymap (ideally your github username, `<name>`) with the following structure:
+If you use more than one keyboard with a similar keymap, you might see the benefit in being able to share code between them. Create your own folder in `users/` named the same as your keymap (ideally your GitHub username, `<name>`) with the following structure:
* `/users/<name>/` (added to the path automatically)
* `readme.md` (optional, recommended)
@@ -73,7 +73,7 @@ The reason for this, is that `<name>.h` won't be added in time to add settings (
## Readme (`readme.md`)
-Please include authorship (your name, github username, email), and optionally [a license that's GPL compatible](https://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses).
+Please include authorship (your name, GitHub username, email), and optionally [a license that's GPL compatible](https://www.gnu.org/licenses/license-list.html#GPLCompatibleLicenses).
You can use this as a template:
```
@@ -93,7 +93,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
```
-You'd want to replace the year, name, email and github username with your info.
+You'd want to replace the year, name, email and GitHub username with your info.
Additionally, this is a good place to document your code, if you wish to share it with others.
diff --git a/docs/fr-fr/README.md b/docs/fr-fr/README.md
index 4527ec4b42..3743bedc97 100644
--- a/docs/fr-fr/README.md
+++ b/docs/fr-fr/README.md
@@ -4,8 +4,8 @@
[![Statut du build](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware)
[![Discord](https://img.shields.io/discord/440868230475677696.svg)](https://discord.gg/Uq7gcHh)
[![Statut de la doc](https://img.shields.io/badge/docs-ready-orange.svg)](https://docs.qmk.fm)
-[![Contributeurs Github](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly)
-[![Forks Github](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/)
+[![Contributeurs GitHub](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly)
+[![Forks GitHub](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/)
## Qu'est-ce que QMK Firmware ?
@@ -13,7 +13,7 @@ QMK (*Quantum Mechanical Keyboard*) est une communauté open source qui maintien
## Comment l'obtenir
-Si vous souhaitez contribuer à une disposition de clavier (keymap), ou à des fonctionnalités de QMK alors le plus simple est de [forker le dépôt avec Github](https://github.com/qmk/qmk_firmware#fork-destination-box) puis cloner le dépôt localement pour y faire des changements. Vous pourrez pousser vos changements sur github puis ouvrir un [Pull Request](https://github.com/qmk/qmk_firmware/pulls) depuis votre fork Github.
+Si vous souhaitez contribuer à une disposition de clavier (keymap), ou à des fonctionnalités de QMK alors le plus simple est de [forker le dépôt avec GitHub](https://github.com/qmk/qmk_firmware#fork-destination-box) puis cloner le dépôt localement pour y faire des changements. Vous pourrez pousser vos changements sur GitHub puis ouvrir un [Pull Request](https://github.com/qmk/qmk_firmware/pulls) depuis votre fork GitHub.
Sinon, vous pouvez aussi le télécharger directement en ([zip](https://github.com/qmk/qmk_firmware/zipball/master), [tar](https://github.com/qmk/qmk_firmware/tarball/master)), ou le cloner avec git en ssh (`git@github.com:qmk/qmk_firmware.git`), ou https (`https://github.com/qmk/qmk_firmware.git`).
diff --git a/docs/fr-fr/breaking_changes.md b/docs/fr-fr/breaking_changes.md
index 53bbb2212a..2dbb26e5a5 100644
--- a/docs/fr-fr/breaking_changes.md
+++ b/docs/fr-fr/breaking_changes.md
@@ -101,7 +101,7 @@ Ceci est fait immédiatement après la fusion de la branche `future` précédent
* [ ] Regroupe ChangeLog dans un fichier.
* [ ] `git commit -m 'Merge point for <DATE> Breaking Change'`
* [ ] `git push origin future`
-* Actions sur Github
+* Actions sur GitHub
* [ ] Crée un PR pour `future`
* [ ] S'assurer que Travis ne relève aucun problème
* [ ] Fusion le PR `future`
diff --git a/docs/fr-fr/getting_started_github.md b/docs/fr-fr/getting_started_github.md
index 48755625a7..76d107dfb9 100644
--- a/docs/fr-fr/getting_started_github.md
+++ b/docs/fr-fr/getting_started_github.md
@@ -6,11 +6,11 @@ GitHub peut être un peu compliqué pour ceux qui n'y sont pas familier. Ce guid
Commencez par la [page GitHub de QMK](https://github.com/qmk/qmk_firmware), et vous verrez un bouton dans le coin en haut à droite qui indique "Fork":
-![Fork on Github](http://i.imgur.com/8Toomz4.jpg)
+![Fork on GitHub](http://i.imgur.com/8Toomz4.jpg)
Si vous faites partie d'une organisation, vous aurez besoin de savoir quel compte utiliser pour le fork. Dans la plupart des cas, vous voudrez créer le fork dans votre compte personnel. Une fois le fork complet (cela peut quelques fois prendre un peu de temps), appuyez sur le bouton "Clone or download":
-![Download from Github](http://i.imgur.com/N1NYcSz.jpg)
+![Download from GitHub](http://i.imgur.com/N1NYcSz.jpg)
Faites attention à sélectionner "HTTPS", et sélectionnez le lien et copiez-le:
diff --git a/docs/fr-fr/newbs_best_practices.md b/docs/fr-fr/newbs_best_practices.md
index 1491013147..ec68a5e3e5 100644
--- a/docs/fr-fr/newbs_best_practices.md
+++ b/docs/fr-fr/newbs_best_practices.md
@@ -44,7 +44,7 @@ git pull upstream master
git push origin master
```
-Cela vous change la branche courante en master, synchronise les données de références du dépôt QMK vers votre ordinateur. La commande pull tire les données de références vers votre branche courante puis les y téleverse. La commande push permet de pousser la branche courante (master) vers votre fork github.
+Cela vous change la branche courante en master, synchronise les données de références du dépôt QMK vers votre ordinateur. La commande pull tire les données de références vers votre branche courante puis les y téleverse. La commande push permet de pousser la branche courante (master) vers votre fork GitHub.
### Faire des changements
diff --git a/docs/getting_started_docker.md b/docs/getting_started_docker.md
new file mode 100644
index 0000000000..e5309fdbbf
--- /dev/null
+++ b/docs/getting_started_docker.md
@@ -0,0 +1,47 @@
+# Docker Quick Start
+
+This project includes a Docker workflow that will allow you to build a new firmware for your keyboard very easily without major changes to your primary operating system. This also ensures that when you clone the project and perform a build, you have the exact same environment as anyone else and the QMK build infrastructure. This makes it much easier for people to help you troubleshoot any issues you encounter.
+
+## Requirements
+
+The main prerequisite is a working `docker` install.
+* [Docker CE](https://docs.docker.com/install/#supported-platforms)
+
+## Usage
+
+Acquire a local copy of the QMK's repository (including submodules):
+
+```bash
+git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git
+cd qmk_firmware
+```
+
+Run the following command to build a keymap:
+```bash
+util/docker_build.sh <keyboard>:<keymap>
+# For example: util/docker_build.sh planck/rev6:default
+```
+
+This will compile the desired keyboard/keymap and leave the resulting `.hex` or `.bin` file in the QMK directory for you to flash. If `:keymap` is omitted, all keymaps are used. Note that the parameter format is the same as when building with `make`.
+
+There is also support for building _and_ flashing the keyboard straight from Docker by specifying the `target` as well:
+
+```bash
+util/docker_build.sh keyboard:keymap:target
+# For example: util/docker_build.sh planck/rev6:default:flash
+```
+
+You can also start the script without any parameters, in which case it will ask you to input the build parameters one by one, which you may find easier to use:
+
+```bash
+util/docker_build.sh
+# Reads parameters as input (leave blank for all keyboards/keymaps)
+```
+
+## FAQ
+
+### Why can't I flash on Windows/macOS
+
+On Windows and macOS, it requires [Docker Machine](http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos/) to be running. This is tedious to set up, so it's not recommended; use [QMK Toolbox](https://github.com/qmk/qmk_toolbox) instead.
+
+!> Docker for Windows requires [Hyper-V](https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v) to be enabled. This means that it cannot work on versions of Windows which don't have Hyper-V, such as Windows 7, Windows 8 and **Windows 10 Home**.
diff --git a/docs/getting_started_github.md b/docs/getting_started_github.md
index 07f523f578..ae594f68d8 100644
--- a/docs/getting_started_github.md
+++ b/docs/getting_started_github.md
@@ -1,16 +1,16 @@
-# How to Use Github with QMK
+# How to Use GitHub with QMK
-Github can be a little tricky to those that aren't familiar with it - this guide will walk through each step of forking, cloning, and submitting a pull request with QMK.
+GitHub can be a little tricky to those that aren't familiar with it - this guide will walk through each step of forking, cloning, and submitting a pull request with QMK.
?> This guide assumes you're somewhat comfortable with running things at the command line, and have git installed on your system.
-Start on the [QMK Github page](https://github.com/qmk/qmk_firmware), and you'll see a button in the upper right that says "Fork":
+Start on the [QMK GitHub page](https://github.com/qmk/qmk_firmware), and you'll see a button in the upper right that says "Fork":
-![Fork on Github](http://i.imgur.com/8Toomz4.jpg)
+![Fork on GitHub](http://i.imgur.com/8Toomz4.jpg)
If you're a part of an organization, you'll need to choose which account to fork it to. In most circumstances, you'll want to fork it to your personal account. Once your fork is completed (sometimes this takes a little while), click the "Clone or Download" button:
-![Download from Github](http://i.imgur.com/N1NYcSz.jpg)
+![Download from GitHub](http://i.imgur.com/N1NYcSz.jpg)
And be sure to select "HTTPS", and select the link and copy it:
@@ -54,7 +54,7 @@ To https://github.com/whoeveryouare/qmk_firmware.git
+ 20043e64...7da94ac5 master -> master
```
-Your changes now exist on your fork on Github - if you go back there (`https://github.com/<whoeveryouare>/qmk_firmware`), you can create a "New Pull Request" by clicking this button:
+Your changes now exist on your fork on GitHub - if you go back there (`https://github.com/<whoeveryouare>/qmk_firmware`), you can create a "New Pull Request" by clicking this button:
![New Pull Request](http://i.imgur.com/DxMHpJ8.jpg)
diff --git a/docs/he-il/README.md b/docs/he-il/README.md
index 8e0c470b44..c16801b2bd 100644
--- a/docs/he-il/README.md
+++ b/docs/he-il/README.md
@@ -14,7 +14,7 @@ QMK (*Quantum Mechanical Keyboard*) ×”×™× ×§×”×™×œ×ª קוד פתוח (open sour
## ×יך להשיג ×ותה
-×× ××ª× ×ž×ª×›× × ×™× ×œ×ª×¨×•× ×ž×™×¤×•×™ מקשי×, מקלדת ×ו יכולת ל QMK, הדבר הקל ביותר ×”×•× [לעשות פורק לריפו בGithub](https://github.com/qmk/qmk_firmware#fork-destination-box), ולעשות קלון לריפו בסביבה המקומית ×•×©× ×œ×‘×¦×¢ ×ת ×”×©×™× ×•×™×™× ×©×œ×›×, לדחוף ××•×ª× ×•×œ×¤×ª×•×— [Pull Request](https://github.com/qmk/qmk_firmware/pulls) מהפורק שלך.
+×× ××ª× ×ž×ª×›× × ×™× ×œ×ª×¨×•× ×ž×™×¤×•×™ מקשי×, מקלדת ×ו יכולת ל QMK, הדבר הקל ביותר ×”×•× [לעשות פורק לריפו בGitHub](https://github.com/qmk/qmk_firmware#fork-destination-box), ולעשות קלון לריפו בסביבה המקומית ×•×©× ×œ×‘×¦×¢ ×ת ×”×©×™× ×•×™×™× ×©×œ×›×, לדחוף ××•×ª× ×•×œ×¤×ª×•×— [Pull Request](https://github.com/qmk/qmk_firmware/pulls) מהפורק שלך.
×חרת, ×פשר להוריד ×ת הקושחה ב×ופן ישיר ([zip](https://github.com/qmk/qmk_firmware/zipball/master), [tar](https://github.com/qmk/qmk_firmware/tarball/master)), ×ו לשכפל ×ותה ב×מצעות git (`git@github.com:qmk/qmk_firmware.git`), ×ו https (`https://github.com/qmk/qmk_firmware.git`).
diff --git a/docs/he-il/_summary.md b/docs/he-il/_summary.md
index bdacd0d1fd..148eb6400d 100644
--- a/docs/he-il/_summary.md
+++ b/docs/he-il/_summary.md
@@ -5,7 +5,7 @@
* [מקורות ללמידה](he-il/newbs_learn_more_resources.md)
* [בסיס QMK](he-il/README.md)
* [×ž×‘×•× ×œQMK](he-il/getting_started_introduction.md)
- * [×יך להשתמש בGithub](he-il/getting_started_github.md)
+ * [×יך להשתמש בGitHub](he-il/getting_started_github.md)
* [קבלת עזרה](he-il/getting_started_getting_help.md)
* [ש×לות נפוצות](he-il/faq.md)
* [ש×לות נפוצות כלליות](he-il/faq_general.md)
@@ -27,7 +27,7 @@
* [QMK CLI](he-il/cli.md)
* [QMK CLI Config](he-il/cli_configuration.md)
* [תרומה ל QMK](he-il/contributing.md)
- * [×יך להשתמש בGithub](he-il/getting_started_github.md)
+ * [×יך להשתמש בGitHub](he-il/getting_started_github.md)
* [קבלת עזרה](he-il/getting_started_getting_help.md)
* [×©×™× ×•×™×™× ×ž×©×ž×¢×•×ª×™×™×](he-il/breaking_changes.md)
diff --git a/docs/he-il/getting_started_getting_help.md b/docs/he-il/getting_started_getting_help.md
index 1a2edc3133..e62c9f403d 100644
--- a/docs/he-il/getting_started_getting_help.md
+++ b/docs/he-il/getting_started_getting_help.md
@@ -11,7 +11,7 @@
×”×¤×•×¨×•× ×”×¨×©×ž×™ של QMK × ×ž×¦× ×‘ - [/r/olkb](https://reddit.com/r/olkb) ב×תר [reddit.com](https://reddit.com).
-## סוגיות Github
+## סוגיות GitHub
ניתן לפתוח [סוגייה ב-GitHub](https://github.com/qmk/qmk_firmware/issues). הדבר שימושי במיוחד ×›×שר הסוגיה דורשת דיון עמוק ו×רוך ×ו דיב××’×™× ×’.
</div> \ No newline at end of file
diff --git a/docs/he-il/getting_started_github.md b/docs/he-il/getting_started_github.md
index e5d0f7c782..5cafac5ac5 100644
--- a/docs/he-il/getting_started_github.md
+++ b/docs/he-il/getting_started_github.md
@@ -1,17 +1,17 @@
<div dir="rtl" markdown="1">
-# ×יך להשתמש ב-Github ×¢× QMK
+# ×יך להשתמש ב-GitHub ×¢× QMK
-Github עלול להיות קצת טריקי למי ×©×œ× ×ž×›×™×¨ ×ת העבודה ×יתו - מדריך ×–×” ילווה ××ª×›× ×©×œ×‘ ×חר שלב דרך ביצוע פעולות fork, clone ו-pull request ×¢× QMK.
+GitHub עלול להיות קצת טריקי למי ×©×œ× ×ž×›×™×¨ ×ת העבודה ×יתו - מדריך ×–×” ילווה ××ª×›× ×©×œ×‘ ×חר שלב דרך ביצוע פעולות fork, clone ו-pull request ×¢× QMK.
?> מדריך ×–×” מניח ש××ª× ×ž×¨×’×™×©×™× ×‘× ×•×— ×¢× ×”×¨×¦×” של פקודות בסביבת command line (שורת הפקודה) ו-git מותקן במערכת שלכ×.
-התחילו ב- [עמוד של QMK ב-Github](https://github.com/qmk/qmk_firmware), ותצמ×ו כפתור בחלק העליון מימין ×¢× ×”×ª×™×›×•×‘ "Fork":
+התחילו ב- [עמוד של QMK ב-GitHub](https://github.com/qmk/qmk_firmware), ותצמ×ו כפתור בחלק העליון מימין ×¢× ×”×ª×™×›×•×‘ "Fork":
-![Fork ב-Github](http://i.imgur.com/8Toomz4.jpg)
+![Fork ב-GitHub](http://i.imgur.com/8Toomz4.jpg)
×× ××ª× ×—×œ×§ מ×רגון, תצטרכו לבחור ל××™×–×” חשבון לבצע פעולת fork. ברוב המבקרי×, תרצו לבצע fork לתוך החשבון הפרטי שלכ×. ברגע שה-fork ×”×¡×ª×™×™× (×œ×¤×¢×ž×™× ×–×” יכול לקחת קצת זמן) הקליקו על כפתור ×”-"Clone or Download":
-![הורדה מ-Github](http://i.imgur.com/N1NYcSz.jpg)
+![הורדה מ-GitHub](http://i.imgur.com/N1NYcSz.jpg)
תווד×ו ש××ª× ×‘×•×—×¨×™× ×‘×ופצייה של "HTTPS", בחרו ×ת הקישור והעתיקו ×ותו:
diff --git a/docs/isp_flashing_guide.md b/docs/isp_flashing_guide.md
index 944dd34622..8ee5a40d9e 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
-
-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.
+* **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` 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/cli_configuration.md b/docs/ja/cli_configuration.md
index 7e9c3e57fa..d21a27596d 100644
--- a/docs/ja/cli_configuration.md
+++ b/docs/ja/cli_configuration.md
@@ -113,7 +113,7 @@ compile.keymap: skully -> None
|-----|---------------|-------------|
| user.keyboard | None | キーボードã®ãƒ‘ス (例: `clueboard/66/rev4`) |
| user.keymap | None | キーマップå (例: `default`) |
-| user.name | None | ユーザ㮠github ã®ãƒ¦ãƒ¼ã‚¶å。 |
+| user.name | None | ユーザ㮠GitHub ã®ãƒ¦ãƒ¼ã‚¶å。 |
# å…¨ã¦ã®è¨­å®šã‚ªãƒ—ション
diff --git a/docs/ja/custom_quantum_functions.md b/docs/ja/custom_quantum_functions.md
index 7e4fbd897e..1524717c8e 100644
--- a/docs/ja/custom_quantum_functions.md
+++ b/docs/ja/custom_quantum_functions.md
@@ -62,7 +62,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case KC_ENTER:
// enter ãŒæŠ¼ã•ã‚ŒãŸæ™‚ã«éŸ³ã‚’å†ç”Ÿã—ã¾ã™
if (record->event.pressed) {
- PLAY_NOTE_ARRAY(tone_qwerty);
+ PLAY_SONG(tone_qwerty);
}
return true; // QMK ã« enter ã®ãƒ—レスã¾ãŸã¯ãƒªãƒªãƒ¼ã‚¹ã‚¤ãƒ™ãƒ³ãƒˆã‚’é€ä¿¡ã•ã›ã¾ã™
default:
@@ -440,7 +440,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case KC_ENTER:
// enter ãŒæŠ¼ã•ã‚ŒãŸæ™‚ã«éŸ³ã‚’å†ç”Ÿã—ã¾ã™
if (record->event.pressed) {
- PLAY_NOTE_ARRAY(tone_qwerty);
+ PLAY_SONG(tone_qwerty);
}
return true; // QMK ã« enter ã®ãƒ—レスã¾ãŸã¯ãƒªãƒªãƒ¼ã‚¹ã‚¤ãƒ™ãƒ³ãƒˆã‚’é€ä¿¡ã•ã›ã¾ã™
case RGB_LYR: // ã“ã‚Œã«ã‚ˆã‚Šã€ã‚¢ãƒ³ãƒ€ãƒ¼ã‚°ãƒ­ãƒ¼ã‚’レイヤー表示ã¨ã—ã¦ã€ã‚ã‚‹ã„ã¯é€šå¸¸é€šã‚Šã«ä½¿ã†ã“ã¨ãŒã§ãã¾ã™ã€‚
@@ -511,7 +511,7 @@ void eeconfig_init_user(void) { // EEPROM ãŒãƒªã‚»ãƒƒãƒˆã•ã‚Œã¾ã™ï¼
キーコードã«åŸºã¥ã„㦠`TAPPING_TERM` を変更ã™ã‚‹ã«ã¯ã€æ¬¡ã®ã‚ˆã†ãªã‚‚ã®ã‚’ `keymap.c` ファイルã«è¿½åŠ ã—ã¾ã™:
```c
-uint16_t get_tapping_term(uint16_t keycode) {
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case SFT_T(KC_SPC):
return TAPPING_TERM + 1250;
@@ -528,7 +528,7 @@ uint16_t get_tapping_term(uint16_t keycode) {
キーコードã«åŸºã¥ã„㦠`IGNORE_MOD_TAP_INTERRUPT` ã®å€¤ã‚’変更ã™ã‚‹ã«ã¯ã€æ¬¡ã®ã‚ˆã†ãªã‚‚ã®ã‚’ `keymap.c` ファイルã«è¿½åŠ ã—ã¾ã™:
```c
-bool get_ignore_mod_tap_interrupt(uint16_t keycode) {
+bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case SFT_T(KC_SPC):
return true;
diff --git a/docs/ja/feature_hd44780.md b/docs/ja/feature_hd44780.md
index 5258632536..5ca4aade1e 100644
--- a/docs/ja/feature_hd44780.md
+++ b/docs/ja/feature_hd44780.md
@@ -55,7 +55,7 @@ LCD_DISP_ON_CURSOR_BLINK : ディスプレイオンã€ç‚¹æ»…カーソル
````
ã“ã‚Œã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã® `matrix_init_kb` ã¾ãŸã¯ã‚­ãƒ¼ãƒžãƒƒãƒ—ã® `matrix_init_user` ã§è¡Œã†ã®ãŒæœ€é©ã§ã™ã€‚
使用å‰ã«ãƒ‡ã‚£ã‚¹ãƒ—レイをクリアã™ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚
-ãã®ãŸã‚ã«ã¯ã€`lcd_clrsrc()` を呼ã³ã¾ã™ã€‚
+ãã®ãŸã‚ã«ã¯ã€`lcd_clrscr()` を呼ã³ã¾ã™ã€‚
ディスプレイã«ä½•ã‹ã‚’表示ã™ã‚‹ã«ã¯ã€æœ€åˆã« `lcd_gotoxy(column, line)` を呼ã³ã¾ã™ã€‚最åˆã®è¡Œã®å…ˆé ­ã«ç§»å‹•ã™ã‚‹ã«ã¯ã€`lcd_gotoxy(0, 0)` を呼ã³å‡ºã—ã€ãã®å¾Œ `lcd_puts("example string")` を使ã£ã¦æ–‡å­—列を出力ã—ã¾ã™ã€‚
diff --git a/docs/ja/feature_layouts.md b/docs/ja/feature_layouts.md
new file mode 100644
index 0000000000..9b36a1eda5
--- /dev/null
+++ b/docs/ja/feature_layouts.md
@@ -0,0 +1,114 @@
+# レイアウト: 複数ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã§1ã¤ã®ã‚­ãƒ¼ãƒžãƒƒãƒ—を使用
+
+<!---
+ original document: 0.8.134:docs/feature_layouts.md
+ git diff 0.8.134 HEAD -- docs/feature_layouts.md | cat
+-->
+
+`layouts/` フォルダã¯ã€æ§˜ã€…ãªã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã«é©ç”¨ã§ãる色々ãªç‰©ç†ã‚­ãƒ¼ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’å«ã¿ã¾ã™ã€‚
+
+```
+layouts/
++ default/
+| + 60_ansi/
+| | + readme.md
+| | + layout.json
+| | + a_good_keymap/
+| | | + keymap.c
+| | | + readme.md
+| | | + config.h
+| | | + rules.mk
+| | + <keymap folder>/
+| | + ...
+| + <layout folder>/
++ community/
+| + <layout folder>/
+| + ...
+```
+
+`layouts/default/` 㨠`layouts/community/` ã¯ã€ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã€Œrepositoriesã€ã®2ã¤ã®ä¾‹ã§ã™ã€‚ç¾åœ¨ã®ã¨ã“ã‚ã€`default` ã«ã¯ãƒ¦ãƒ¼ã‚¶ã®å‚考用ã«ã€ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã«é–¢ã™ã‚‹å…¨ã¦ã®æƒ…å ±ãŠã‚ˆã³ã€`default_<layout>` ã¨ã„ã†åå‰ã®1ã¤ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ã‚­ãƒ¼ãƒžãƒƒãƒ—ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚`community` ã«ã¯å…¨ã¦ã®å…±æœ‰ã‚­ãƒ¼ãƒžãƒƒãƒ—ãŒå«ã¾ã‚Œã¦ãŠã‚Šã€ãれらã¯ãƒ¦ãƒ¼ã‚¶ãŒ `layouts/` ã«ã‚¯ãƒ­ãƒ¼ãƒ³ã™ã‚‹ãŸã‚ã®åˆ¥ã®ãƒªãƒã‚¸ãƒˆãƒªã«åˆ†å‰²ã™ã‚‹ã“ã¨ã‚’最終的ãªç›®çš„ã¨ã—ã¦ã„ã¾ã™QMK 㯠`layouts/` 内ã®ã™ã¹ã¦ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’検索ã™ã‚‹ãŸã‚ã€ã“ã“ã«è¤‡æ•°ã®ãƒªãƒã‚¸ãƒˆãƒªã‚’æŒã¤ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+å„レイアウトフォルダã¯ã€ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã®ç‰©ç†çš„ãªå´é¢ã«åŸºã¥ã„ã¦ã€å¯èƒ½ãªé™ã‚Šä¸€èˆ¬çš„ãªå称ã§(`[a-z0-9_]`)ã¨ã„ã†åå‰ãŒä»˜ã‘られã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã§å®šç¾©ã•ã‚Œã‚‹ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã¨ä¸€ç·’ã« `readme.md` ã‚’å«ã¿ã¾ã™ã€‚
+
+```md
+# 60_ansi
+
+ LAYOUT_60_ansi
+```
+
+æ–°ã—ã„åå‰ã¯æ—¢å­˜ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã§è¨­å®šã•ã‚ŒãŸæ¨™æº–ã«æº–æ‹ ã—よã†ã¨åŠªåŠ›ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã€å¿…è¦ã«å¿œã˜ã¦ PR/Issue ã§è­°è«–ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+## レイアウトã®ã‚µãƒãƒ¼ãƒˆ
+
+キーボードãŒãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’サãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«ã€å¤‰æ•°ã¯ `<keyboard>.h` ã§å®šç¾©ã—ã€å¼•æ•°/キー (ã§ãã‚Œã°ç‰©ç†ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆ)ã®æ•°ã«ä¸€è‡´ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+
+ #define LAYOUT_60_ansi KEYMAP_ANSI
+
+レイアウトã®åå‰ã¯æ¬¡ã®æ­£è¦è¡¨ç¾ã«ä¸€è‡´ã—ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“: `[a-z0-9_]+`
+
+フォルダåã¯ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã® `rules.mk` ã«è¿½åŠ ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™:
+
+ LAYOUTS = 60_ansi
+
+`LAYOUTS` ã¯ä»»æ„ã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ãƒ•ã‚©ãƒ«ãƒ€ãƒ¬ã¹ãƒ«ã® `rules.mk` ã«è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:
+
+ LAYOUTS = 60_iso
+
+ãŸã ã—ã€`LAYOUT_<layout>` 変数㯠`<folder>.h` ã§ã‚‚定義ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+
+## キーマップã®ãƒ“ルド
+
+以下ã®å½¢å¼ã§ã‚³ãƒžãƒ³ãƒ‰ã‚’使ã£ã¦ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚­ãƒ¼ãƒžãƒƒãƒ—を作æˆã§ãã‚‹ã¯ãšã§ã™:
+
+ make <keyboard>:<layout>
+
+### レイアウトã®ç«¶åˆ
+キーボードãŒè¤‡æ•°ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚ªãƒ—ションをサãƒãƒ¼ãƒˆã—ã€
+
+ LAYOUTS = ortho_4x4 ortho_4x12
+
+ãªãŠã‹ã¤ä¸¡æ–¹ã®ã‚ªãƒ—ションã«ã¤ã„ã¦ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆãŒå­˜åœ¨ã™ã‚‹å ´åˆã€
+```
+layouts/
++ community/
+| + ortho_4x4/
+| | + <layout>/
+| | | + ...
+| + ortho_4x12/
+| | + <layout>/
+| | | + ...
+| + ...
+```
+
+FORCE_LAYOUT 引数ã¯ã©ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’ビルドã™ã‚‹ã‹ã‚’指定ã™ã‚‹ãŸã‚ã«ä½¿ã†ã“ã¨ãŒã§ãã¾ã™
+
+ make <keyboard>:<layout> FORCE_LAYOUT=ortho_4x4
+ make <keyboard>:<layout> FORCE_LAYOUT=ortho_4x12
+
+## キーボードã«ä¾å­˜ã—ãªã„レイアウトを作æˆã™ã‚‹ãŸã‚ã®ãƒ’ント
+
+### インクルード
+
+`#include "planck.h"` を使ã†ä»£ã‚ã‚Šã«ã€ä»¥ä¸‹ã®è¡Œã‚’使ã£ã¦ã‚³ãƒ³ãƒ‘イルã•ã‚Œã‚‹ `<keyboard>.h` (`<folder>.h` ã¯ã“ã“ã§ã‚¤ãƒ³ã‚¯ãƒ«ãƒ¼ãƒ‰ã™ã¹ãã§ã¯ã‚ã‚Šã¾ã›ã‚“)ファイルをインクルードã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:
+
+ #include QMK_KEYBOARD_H
+
+キーボード固有ã®ã‚³ãƒ¼ãƒ‰ã‚’ä¿æŒã—ãŸã„å ´åˆã¯ã€ã“れらã®å¤‰æ•°ã‚’使ã£ã¦ `#ifdef` æ–‡ã§ã‚¨ã‚¹ã‚±ãƒ¼ãƒ—ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:
+
+* `KEYBOARD_<folder1>_<folder2>`
+
+例ãˆã°:
+
+```c
+#ifdef KEYBOARD_planck
+ #ifdef KEYBOARD_planck_rev4
+ planck_rev4_function();
+ #endif
+#endif
+```
+
+åå‰ã¯å°æ–‡å­—ã§ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰/リビジョンã®ãƒ•ã‚©ãƒ«ãƒ€/ファイルåã¨æ­£ç¢ºã«ä¸€è‡´ã™ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ãã ã•ã„。
+
+### キーマップ
+
+åŒã˜ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã§åˆ†å‰²ãŠã‚ˆã³éžåˆ†å‰²ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«ã¯ã€ã‚­ãƒ¼ãƒžãƒƒãƒ—ã§ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰éžä¾å­˜ã® `LAYOUT_<layout name>` マクロを使ã†å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚例ãˆã°ã€Let's Split ãŠã‚ˆã³ Planck ãŒåŒã˜ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’共有ã™ã‚‹ã«ã¯ã€`LAYOUT_planck_grid` ã‚„ C é…列ã®å ´åˆã®å˜ãªã‚‹ `{}` ã®ä»£ã‚ã‚Šã«ã€`LAYOUT_ortho_4x12` を使ã†å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
diff --git a/docs/ja/feature_leader_key.md b/docs/ja/feature_leader_key.md
new file mode 100644
index 0000000000..538358a6b2
--- /dev/null
+++ b/docs/ja/feature_leader_key.md
@@ -0,0 +1,151 @@
+# リーダーキー: æ–°ã—ã„種類ã®ãƒ¢ãƒ‡ã‚£ãƒ•ã‚¡ã‚¤ã‚¢
+
+<!---
+ original document: 0.8.134:docs/feature_leader_key.md
+ git diff 0.8.134 HEAD -- docs/feature_leader_key.md | cat
+-->
+
+ã‚‚ã—ã‚ãªãŸãŒ Vim を使ã£ãŸã“ã¨ãŒã‚ã‚‹å ´åˆã€ãƒªãƒ¼ãƒ€ãƒ¼ã‚­ãƒ¼ã¯ä½•ã§ã‚ã‚‹ã‹ã‚’知ã£ã¦ã„ã¾ã™ã€‚ãã†ã§ãªã‘ã‚Œã°ã€ç´ æ™´ã‚‰ã—ã„概念を発見ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚:) 例ãˆã°ã€Alt+Shift+W を押ã™(3ã¤ã®ã‚­ãƒ¼ã‚’åŒæ™‚ã«æŠ¼ã™)代ã‚ã‚Šã«ã€ã‚­ãƒ¼ã®_シーケンス_を押ã™ã“ã¨ãŒã§ããŸã‚‰ã©ã†ã§ã—ょã†ï¼Ÿã¤ã¾ã‚Šã€ç‰¹åˆ¥ãªãƒ¢ãƒ‡ã‚£ãƒ•ã‚¡ã‚¤ã‚¢ (リーダーキー)を押ã—ã¦ã€ç¶šã‘㦠W 㨠C を押ã™ã¨ (å˜ç´”ã«ã‚­ãƒ¼ã‚’高速ã«ç¹‹ã’ã¾ã™)ã€ä½•ã‹ãŒèµ·ã“ã‚Šã¾ã™ã€‚
+
+ãれ㌠`KC_LEAD` ã®æ©Ÿèƒ½ã§ã™ã€‚以下ã¯ä¾‹ã§ã™:
+
+1. リーダーキーã¨ã—ã¦ä½¿ã„ãŸã„キーボードã®ã‚­ãƒ¼ã‚’é¸æŠžã—ã¾ã™ã€‚ãã‚Œã«ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ `KC_LEAD` を割り当ã¦ã¾ã™ã€‚ã“ã®ã‚­ãƒ¼ã¯ã“ã®ãŸã‚ã ã‘ã®å°‚用ã§ã™ -- å˜ä¸€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚­ãƒ¼ã§ã€ä»–ã®ç”¨é€”ã«ã¯ä½¿ã†ã“ã¨ãŒã§ãã¾ã›ã‚“。
+2. `config.h` ã« `#define LEADER_TIMEOUT 300` ã¨ã„ã†è¡Œã‚’追加ã—ã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã£ã¦ `KC_LEAD` キーã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚’設定ã—ã¾ã™ã€‚具体的ã«ã¯ã€`KC_LEAD` キーを押ã—ã¦ã‹ã‚‰ãƒªãƒ¼ãƒ€ãƒ¼ã‚­ãƒ¼ã®ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã‚’完了ã™ã‚‹ã¾ã§ä¸€å®šã®æ™‚é–“ã—ã‹ã‚ã‚Šã¾ã›ã‚“。ã“ã“ã§ã® `300` ã¯ãれを300msã«è¨­å®šã—ã¾ã™ã€‚ã“ã®å€¤ã‚’増やã—ã¦ã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã‚’入力ã™ã‚‹æ™‚間を増やã™ã“ã¨ãŒã§ãã¾ã™ã€‚ãŸã ã—ã€ã“ã®æ™‚間中ã«æŠ¼ã•ã‚ŒãŸã‚­ãƒ¼ã¯å…¨ã¦é€”中ã§é®ã‚‰ã‚Œã€é€ä¿¡ã•ã‚Œã¾ã›ã‚“。ãã®ãŸã‚ã“ã®å€¤ã¯å°ã•ãã—ã¦ãŠã„ãŸã»ã†ãŒè‰¯ã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+ * デフォルトã§ã¯ã€ã“ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã¯ã€`KC_LEAD` を押ã—ã¦ã‹ã‚‰ã‚·ãƒ¼ã‚±ãƒ³ã‚¹å…¨ä½“ãŒå®Œäº†ã™ã‚‹ã¾ã§ã«æŽ›ã‹ã‚‹æ™‚é–“ã§ã™ã€‚ã“ã‚Œã¯ä¸€éƒ¨ã®äººã«ã¨ã£ã¦ã¯éžå¸¸ã«çŸ­ã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。ãã®ãŸã‚ã€ã“ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã‚’増やã—ãŸã»ã†ãŒè‰¯ã„å ´åˆã‚‚ã‚ã‚Šã¾ã™ã€‚å¿…è¦ã«å¿œã˜ã¦ã€`LEADER_PER_KEY_TIMING` オプションを有効ã«ã—ãŸã»ã†ãŒè‰¯ã„å ´åˆã‚‚ã‚ã‚Šã¾ã™ã€‚ã“ã‚Œã¯å„キーãŒã‚¿ãƒƒãƒ—ã•ã‚Œã‚‹åº¦ã«ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã¾ã§ã®æ™‚間をリセットã™ã‚‹æ©Ÿèƒ½ã§ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã€ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆæ™‚間を短ãã—ã¤ã¤ã‚‚ã€æ¯”較的長ã„シーケンスを使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®ã‚ªãƒ—ションを有効ã«ã™ã‚‹ã«ã¯ã€`config.h` ã« `#define LEADER_PER_KEY_TIMING` を追加ã—ã¾ã™ã€‚
+3. `matrix_scan_user` 関数ã®ä¸­ã§ã€ä»¥ä¸‹ã®ã‚ˆã†ãªã‚‚ã®ã‚’追加ã—ã¾ã™:
+
+```c
+LEADER_EXTERNS();
+
+void matrix_scan_user(void) {
+ LEADER_DICTIONARY() {
+ leading = false;
+ leader_end();
+
+ SEQ_ONE_KEY(KC_F) {
+ // マクロ内ã§ã§ãã‚‹ã“ã¨
+ SEND_STRING("QMK is awesome.");
+ }
+ SEQ_TWO_KEYS(KC_D, KC_D) {
+ SEND_STRING(SS_LCTL("a") SS_LCTL("c"));
+ }
+ SEQ_THREE_KEYS(KC_D, KC_D, KC_S) {
+ SEND_STRING("https://start.duckduckgo.com\n");
+ }
+ SEQ_TWO_KEYS(KC_A, KC_S) {
+ register_code(KC_LGUI);
+ register_code(KC_S);
+ unregister_code(KC_S);
+ unregister_code(KC_LGUI);
+ }
+ }
+}
+```
+
+ã”覧ã®ã¨ãŠã‚Šã€å¹¾ã¤ã‹ã®é–¢æ•°ãŒã‚ã‚Šã¾ã™ã€‚`SEQ_ONE_KEY` ã‚’å˜ä¸€ã‚­ãƒ¼ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ (リーダーã®å¾Œã«1ã¤ã®ã‚­ãƒ¼ã®ã¿)ã«ä½¿ã„ã€ã‚ˆã‚Šé•·ã„シーケンスã«ã¤ã„ã¦ã¯ `SEQ_TWO_KEYS`ã€`SEQ_THREE_KEYS` ã‹ã‚‰ `SEQ_FIVE_KEYS` を使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+ã“れらã¯ãã‚Œãžã‚Œ1ã¤ä»¥ä¸Šã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’引数ã¨ã—ã¦å—ã‘付ã‘ã¾ã™ã€‚ã“ã‚Œã¯é‡è¦ãªç‚¹ã§ã™: **キーボードã®ä»»æ„ã®ãƒ¬ã‚¤ãƒ¤ãƒ¼**ã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚当ãŸã‚Šå‰ã§ã™ãŒã€ãƒªãƒ¼ãƒ€ãƒ¼ãƒžã‚¯ãƒ­ãŒç™ºå‹•ã™ã‚‹ã«ã¯ãã®ãƒ¬ã‚¤ãƒ¤ãƒ¼ãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™
+
+## `rules.mk` ã«ãƒªãƒ¼ãƒ€ãƒ¼ã‚­ãƒ¼ã‚µãƒãƒ¼ãƒˆã‚’追加
+
+リーダーキーã®ã‚µãƒãƒ¼ãƒˆã‚’追加ã™ã‚‹ã«ã¯ã€å˜ç´”ã«ã‚­ãƒ¼ãƒžãƒƒãƒ—ã® `rules.mk` ã«1行を追加ã—ã¾ã™:
+
+```make
+LEADER_ENABLE = yes
+```
+
+## リーダーキーã®ã‚­ãƒ¼ã”ã¨ã®ã‚¿ã‚¤ãƒŸãƒ³ã‚°
+
+é•·ã„リーダーキー文字列ã®ãŸã‚ã‚„ 200wpm ã®ã‚¿ã‚¤ãƒ”ングスキルãŒç„¡ã„å ´åˆã«ã€éžå¸¸ã«é•·ã„タイムアウト時間ã«é ¼ã‚‹ã®ã§ã¯ãªãã€ã‚­ãƒ¼ã‚’押ã™ã”ã¨ã«å…¥åŠ›ã‚’完了ã™ã‚‹ã¾ã§ã®æ™‚間を増やã™æ©Ÿèƒ½ã‚’使用ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã‚Œã¯ã€ãƒªãƒ¼ãƒ€ãƒ¼ã‚­ãƒ¼ã‚’使ã£ã¦ã‚¿ãƒƒãƒ—ダンスをå†ç¾ã™ã‚‹å ´åˆã«éžå¸¸ã«å½¹ç«‹ã¡ã¾ã™ (C, C, C ã®ã‚ˆã†ãªåŒã˜ã‚­ãƒ¼ã‚’複数回タップã™ã‚‹å ´åˆ)。
+
+ã“れを有効ã«ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã‚’ `config.h` ã«é…ç½®ã—ã¾ã™:
+```c
+#define LEADER_PER_KEY_TIMING
+```
+
+ã“ã®å¾Œã€`LEADER_TIMEOUT` ã‚’ 300ms 未満ã«ä¸‹ã’ã‚‹ã“ã¨ã‚’ãŠå‹§ã‚ã—ã¾ã™ã€‚
+
+```c
+#define LEADER_TIMEOUT 250
+```
+
+ã“ã‚Œã§ã€ãƒªãƒ¼ãƒ€ãƒ¼ã‚­ãƒ¼ã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆæ™‚é–“ã‚’ 1000ms ã«è¨­å®šã™ã‚‹ã“ã¨ãªã以下ã®ã‚ˆã†ãªã“ã¨ãŒå¯èƒ½ã«ãªã‚‹ã¨æ€ã‚ã‚Œã¾ã™ã€‚
+
+```c
+SEQ_THREE_KEYS(KC_C, KC_C, KC_C) {
+ SEND_STRING("Per key timing is great!!!");
+}
+```
+
+## 厳密ãªã‚­ãƒ¼å‡¦ç†
+
+デフォルトã§ã¯ã€ãƒªãƒ¼ãƒ€ãƒ¼ã‚­ãƒ¼æ©Ÿèƒ½ã¯ã€ãƒªãƒ¼ãƒ€ãƒ¼ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã®ç¢ºèªæ™‚ã« [`モッドタップ`](ja/mod_tap.md) ãŠã‚ˆã³ [`レイヤータップ`](ja/feature_layers.md#switching-and-toggling-layers) 機能ã‹ã‚‰ã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’フィルターã—ã¾ã™ã€‚ã¤ã¾ã‚Šã€`LT(3, KC_A)` を使ã£ã¦ã„ã‚‹å ´åˆã€`LT(3, KC_A)` ã§ã¯ãªãシーケンス㮠`KC_A` ã¨ã—ã¦å–り出ã•ã‚Œã€æ–°ã—ã„ユーザã«ã¨ã£ã¦ã‚ˆã‚ŠæœŸå¾…ã•ã‚Œã‚‹å‹•ä½œã‚’æä¾›ã—ã¾ã™ã€‚
+
+ã»ã¨ã‚“ã©ã®å ´åˆã“ã‚Œã§å•é¡Œã‚ã‚Šã¾ã›ã‚“ãŒã€ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã§ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰å…¨ä½“(例ãˆã°ã€ä¸Šã®ä¾‹ã§ã® `LT(3, KC_A)`) を指定ã—ãŸã„å ´åˆã¯ã€`config.h` ファイル㫠`#define LEADER_KEY_STRICT_KEY_PROCESSING` を追加ã™ã‚‹ã“ã¨ã“ã®ã‚ˆã†ãªæ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã‚Œã§ãƒ•ã‚£ãƒ«ã‚¿ãƒªãƒ³ã‚°ãŒç„¡åŠ¹ã«ãªã‚Šã€ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰å…¨ä½“を指定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+
+## カスタマイズ
+
+リーダーキー機能ã«ã¯ã€ãƒªãƒ¼ãƒ€ãƒ¼ã‚­ãƒ¼æ©Ÿèƒ½ã®å‹•ä½œã«ã„ãらã‹ã®ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã‚’追加ã™ã‚‹æ–¹æ³•ãŒã‚ã‚Šã¾ã™ã€‚リーダーキー機能ã®ãƒ—ロセスã®ç‰¹å®šã®éƒ¨åˆ†ã§å‘¼ã³å‡ºã™ã“ã¨ãŒã§ãã‚‹2ã¤ã®é–¢æ•°ã€`leader_start()` 㨠`leader_end()` ã§ã™ã€‚
+
+`KC_LEAD` キーãŒã‚¿ãƒƒãƒ—ã•ã‚ŒãŸæ™‚ã« `leader_start()` 関数ãŒå‘¼ã°ã‚Œã€ãƒªãƒ¼ãƒ€ãƒ¼ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ãŒå®Œäº†ã™ã‚‹ã‹ã€ãƒªãƒ¼ãƒ€ãƒ¼ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã®æ™‚é–“ã«é”ã—ãŸæ™‚ã« `leader_end()` 関数ãŒå‘¼ã°ã‚Œã¾ã™ã€‚
+
+リーダーシーケンスã«ãƒ•ã‚£ãƒ¼ãƒ‰ãƒãƒƒã‚¯(ビープã¾ãŸã¯éŸ³æ¥½ã‚’å†ç”Ÿã™ã‚‹ãªã©)を追加ã™ã‚‹ãŸã‚ã«ã€ã“れらã®é–¢æ•°ã‚’コード (通常 ã¯`keymap.c`)ã«è¿½åŠ ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+```c
+void leader_start(void) {
+ // シーケンスã®é–‹å§‹
+}
+
+void leader_end(void) {
+ // シーケンスã®çµ‚了 (æˆåŠŸã—ãªã„/失敗を検知)
+}
+```
+
+### 例
+
+ã“ã®ä¾‹ã§ã¯ã€ãƒªãƒ¼ãƒ€ãƒ¼ã‚·ãƒ¼ã‚±ãƒ³ã‚¹ã‚’開始ã™ã‚‹ãŸã‚ã« `KC_LEAD` を押ã™ã¨ãƒžãƒªã‚ªã® "One Up" 音ãŒå†ç”Ÿã•ã‚Œã€æ­£å¸¸ã«å®Œäº†ã—ãŸå ´åˆã¯ "All Star" ãŒå†ç”Ÿã•ã‚Œã€å¤±æ•—ã—ãŸå ´åˆã¯ "Rick Roll" ã‚’å†ç”Ÿã•ã‚Œã¾ã™ã€‚
+
+```c
+bool did_leader_succeed;
+#ifdef AUDIO_ENABLE
+float leader_start[][2] = SONG(ONE_UP_SOUND );
+float leader_succeed[][2] = SONG(ALL_STAR);
+float leader_fail[][2] = SONG(RICK_ROLL);
+#endif
+LEADER_EXTERNS();
+
+void matrix_scan_user(void) {
+ LEADER_DICTIONARY() {
+ did_leader_succeed = leading = false;
+
+ SEQ_ONE_KEY(KC_E) {
+ // マクロ内ã§ã§ãã‚‹ã“ã¨
+ SEND_STRING(SS_LCTL(SS_LSFT("t")));
+ did_leader_succeed = true;
+ } else
+ SEQ_TWO_KEYS(KC_E, KC_D) {
+ SEND_STRING(SS_LGUI("r") "cmd\n" SS_LCTL("c"));
+ did_leader_succeed = true;
+ }
+ leader_end();
+ }
+}
+
+void leader_start(void) {
+#ifdef AUDIO_ENABLE
+ PLAY_SONG(leader_start);
+#endif
+}
+
+void leader_end(void) {
+ if (did_leader_succeed) {
+#ifdef AUDIO_ENABLE
+ PLAY_SONG(leader_succeed);
+#endif
+ } else {
+#ifdef AUDIO_ENABLE
+ PLAY_SONG(leader_fail);
+#endif
+ }
+}
+```
diff --git a/docs/ja/feature_led_matrix.md b/docs/ja/feature_led_matrix.md
new file mode 100644
index 0000000000..b2595f9989
--- /dev/null
+++ b/docs/ja/feature_led_matrix.md
@@ -0,0 +1,95 @@
+# LED マトリックスライト
+
+<!---
+ original document: 0.8.141:docs/feature_led_matrix.md
+ git diff 0.8.141 HEAD -- docs/feature_led_matrix.md | cat
+-->
+
+ã“ã®æ©Ÿèƒ½ã«ã‚ˆã‚Šã€å¤–部ドライãƒã«ã‚ˆã£ã¦é§†å‹•ã•ã‚Œã‚‹ LED マトリックスを使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã¯ã€ãƒãƒƒã‚¯ãƒ©ã‚¤ãƒˆåˆ¶å¾¡ã¨åŒã˜ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’使ãˆã‚‹ã‚ˆã†ã«ã™ã‚‹ãŸã‚ã€ãƒãƒƒã‚¯ãƒ©ã‚¤ãƒˆã‚·ã‚¹ãƒ†ãƒ ã«æŽ¥ç¶šã—ã¾ã™ã€‚
+
+RGB LED を使ã„ãŸã„å ´åˆã¯ã€ä»£ã‚ã‚Šã« [RGB マトリックスサブシステム](ja/feature_rgb_matrix.md) を使ã†ã¹ãã§ã™ã€‚
+
+## ドライãƒè¨­å®š
+
+### IS31FL3731
+
+I2C IS31FL3731 RGB コントローラを使ã£ãŸã‚¢ãƒ‰ãƒ¬ã‚¹æŒ‡å®šå¯èƒ½ãª LED マトリックスライトã®ãŸã‚ã®åŸºæœ¬çš„ãªã‚µãƒãƒ¼ãƒˆãŒã‚ã‚Šã¾ã™:有効ã«ã™ã‚‹ã«ã¯ã€`rules.mk` ã«ä»¥ä¸‹ã‚’追加ã—ã¾ã™:
+
+ LED_MATRIX_ENABLE = IS31FL3731
+
+1ã‹ã‚‰4個㮠IS31FL3731 IC を使ã†ã“ã¨ãŒã§ãã¾ã™ã€‚キーボード上ã«å­˜åœ¨ã—ãªã„ IC ã® `LED_DRIVER_ADDR_<N>` 定義を指定ã—ãªã„ã§ãã ã•ã„。`config.h` ã«ä»¥ä¸‹ã®é …目を定義ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:
+
+| 変数 | 説明 | デフォルト |
+|----------|-------------|---------|
+| `ISSI_TIMEOUT` | (オプション) i2c メッセージを待ã¤æ™‚é–“ | 100 |
+| `ISSI_PERSISTENCE` | (オプション) 失敗ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã“ã®å›žæ•°å†è©¦è¡Œã™ã‚‹ | 0 |
+| `LED_DRIVER_COUNT` | (å¿…é ˆ) LED ドライムIC ã®æ•° | |
+| `LED_DRIVER_LED_COUNT` | (å¿…é ˆ) å…¨ã¦ã®ãƒ‰ãƒ©ã‚¤ãƒã® LED ライトã®æ•° | |
+| `LED_DRIVER_ADDR_1` | (å¿…é ˆ) 最åˆã® LED ドライãƒã®ã‚¢ãƒ‰ãƒ¬ã‚¹ | |
+| `LED_DRIVER_ADDR_2` | (オプション) 2番目㮠LED ドライãƒã®ã‚¢ãƒ‰ãƒ¬ã‚¹ | |
+| `LED_DRIVER_ADDR_3` | (オプション) 3番目㮠LED ドライãƒã®ã‚¢ãƒ‰ãƒ¬ã‚¹ | |
+| `LED_DRIVER_ADDR_4` | (オプション) 4番目㮠LED ドライãƒã®ã‚¢ãƒ‰ãƒ¬ã‚¹ | |
+
+2ã¤ã®ãƒ‰ãƒ©ã‚¤ãƒã‚’使ã†ä¾‹ã§ã™ã€‚
+
+ // ã“ã‚Œã¯7ビットã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã€å·¦ã‚·ãƒ•ãƒˆã•ã‚Œã¾ã™
+ // ビット0ã«0を設定ã™ã‚‹ã¨æ›¸ãè¾¼ã¿ã€1を設定ã™ã‚‹ã¨èª­ã¿è¾¼ã¿ã§ã™ (I2C プロトコルã«å¾“ã†)
+ // アドレスã¯é…ç·šã«ã‚ˆã£ã¦å¤‰ã‚ã‚Šã¾ã™:
+ // 0b1110100 AD <-> GND
+ // 0b1110111 AD <-> VCC
+ // 0b1110101 AD <-> SCL
+ // 0b1110110 AD <-> SDA
+ #define LED_DRIVER_ADDR_1 0b1110100
+ #define LED_DRIVER_ADDR_2 0b1110110
+
+ #define LED_DRIVER_COUNT 2
+ #define LED_DRIVER_1_LED_COUNT 25
+ #define LED_DRIVER_2_LED_COUNT 24
+ #define LED_DRIVER_LED_COUNT LED_DRIVER_1_LED_TOTAL + LED_DRIVER_2_LED_TOTAL
+
+ç¾åœ¨ã€2ã¤ã®ãƒ‰ãƒ©ã‚¤ãƒã®ã¿ãŒã‚µãƒãƒ¼ãƒˆã•ã‚Œã¾ã™ãŒã€4ã¤ã®çµ„ã¿åˆã‚ã›å…¨ã¦ã‚’サãƒãƒ¼ãƒˆã™ã‚‹ã“ã¨ã¯ç°¡å˜ã§ã™ã€‚
+
+`<keyboard>.c` ã«å…¨ã¦ã® LED を列挙ã™ã‚‹é…列を定義ã—ã¾ã™:
+
+ const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
+ /* ã“れらã®ä½ç½®ã«ã¤ã„ã¦ã¯ IS31 マニュアルをå‚ç…§ã—ã¦ãã ã•ã„
+ * driver
+ * | LED address
+ * | | */
+ {0, C3_3},
+ ....
+ }
+
+ã“ã“ã§ã€`Cx_y` ã¯[データシート](http://www.issi.com/WW/pdf/31FL3731.pdf)ãŠã‚ˆã³ãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ« `drivers/issi/is31fl3731-simple.h` ã§å®šç¾©ã•ã‚Œã‚‹ãƒžãƒˆãƒªãƒƒã‚¯ã‚¹å†…ã® LED ã®ä½ç½®ã§ã™ã€‚`driver` 㯠`config.h` ã§å®šç¾©ã—ãŸãƒ‰ãƒ©ã‚¤ãƒã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹(`0`ã€`1`ã€`2`ã€`3`ã®ã„ãšã‚Œã‹)ã§ã™ã€‚
+
+## キーコード
+
+ç¾åœ¨ã®ã¨ã“ã‚ã€å…¨ã¦ã® LED マトリックスã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã¯[ãƒãƒƒã‚¯ãƒ©ã‚¤ãƒˆã‚·ã‚¹ãƒ†ãƒ ](ja/feature_backlight.md)ã¨å…±æœ‰ã•ã‚Œã¾ã™ã€‚
+
+## LED マトリックス効果
+
+ç¾åœ¨ã®ã¨ã“ã‚ã€LED マトリックス効果ã¯ä½œæˆã•ã‚Œã¦ã„ã¾ã›ã‚“。
+
+## カスタムレイヤー効果
+
+カスタムレイヤー効果㯠`<keyboard>.c` 内ã§ä»¥ä¸‹ã‚’定義ã™ã‚‹ã“ã¨ã§è¡Œã†ã“ã¨ãŒã§ãã¾ã™:
+
+ void led_matrix_indicators_kb(void) {
+ led_matrix_set_index_value(index, value);
+ }
+
+åŒæ§˜ã®é–¢æ•°ãŒã‚­ãƒ¼ãƒžãƒƒãƒ—内㧠`led_matrix_indicators_user` ã¨ã—ã¦å‹•ä½œã—ã¾ã™ã€‚
+
+## サスペンド状態
+
+サスペンド機能を使ã†ã«ã¯ã€ä»¥ä¸‹ã‚’ `<keyboard>.c` ã«è¿½åŠ ã—ã¾ã™:
+
+ void suspend_power_down_kb(void)
+ {
+ led_matrix_set_suspend_state(true);
+ }
+
+ void suspend_wakeup_init_kb(void)
+ {
+ led_matrix_set_suspend_state(false);
+ }
diff --git a/docs/ja/feature_mouse_keys.md b/docs/ja/feature_mouse_keys.md
new file mode 100644
index 0000000000..43ca8bb08b
--- /dev/null
+++ b/docs/ja/feature_mouse_keys.md
@@ -0,0 +1,127 @@
+# マウスキー
+
+<!---
+ original document: 0.8.141:docs/feature_mouse_keys.md
+ git diff 0.8.141 HEAD -- docs/feature_mouse_keys.md | cat
+-->
+
+マウスキーã¯ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚’使ã£ã¦ãƒžã‚¦ã‚¹ã‚’エミュレートã§ãる機能ã§ã™ã€‚様々ãªé€Ÿåº¦ã§ãƒã‚¤ãƒ³ã‚¿ã‚’移動ã—ã€5ã¤ã®ãƒœã‚¿ãƒ³ã‚’押ã—ã€8æ–¹å‘ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+## キーボードã«ãƒžã‚¦ã‚¹ã‚­ãƒ¼ã‚’追加
+
+マウスキーを使ã†ãŸã‚ã«ã¯ã€å°‘ãªãã¨ã‚‚マウスキーサãƒãƒ¼ãƒˆã‚’有効ã«ã—ã€ãƒžã‚¦ã‚¹ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’キーボードã®ã‚­ãƒ¼ã«ãƒžãƒƒãƒ—ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+
+### マウスキーを有効ã«ã™ã‚‹
+
+マウスキーを有効ã«ã™ã‚‹ã«ã¯ã€ã‚­ãƒ¼ãƒžãƒƒãƒ—ã® `rules.mk` ã«ä»¥ä¸‹ã®è¡Œã‚’追加ã—ã¾ã™:
+
+```c
+MOUSEKEY_ENABLE = yes
+```
+
+### マウスアクションã®ãƒžãƒƒãƒ”ング
+
+キーマップã§ã‚­ãƒ¼æŠ¼ä¸‹ã‚’マウスアクションã«ãƒžãƒƒãƒ—ã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰ã‚’使ã†ã“ã¨ãŒã§ãã¾ã™:
+
+| キー | エイリアス | 説明 |
+|----------------|---------|-----------------|
+| `KC_MS_UP` | `KC_MS_U` | カーソルを上ã«ç§»å‹• |
+| `KC_MS_DOWN` | `KC_MS_D` | カーソルを下ã«ç§»å‹• |
+| `KC_MS_LEFT` | `KC_MS_L` | カーソルを左ã«ç§»å‹• |
+| `KC_MS_RIGHT` | `KC_MS_R` | カーソルをå³ã«ç§»å‹• |
+| `KC_MS_BTN1` | `KC_BTN1` | ボタン1を押㙠|
+| `KC_MS_BTN2` | `KC_BTN2` | ボタン2を押㙠|
+| `KC_MS_BTN3` | `KC_BTN3` | ボタン3を押㙠|
+| `KC_MS_BTN4` | `KC_BTN4` | ボタン4を押㙠|
+| `KC_MS_BTN5` | `KC_BTN5` | ボタン5を押㙠|
+| `KC_MS_WH_UP` | `KC_WH_U` | ホイールをå‘ã“ã†å´ã«å›žè»¢ |
+| `KC_MS_WH_DOWN` | `KC_WH_D` | ホイールを手å‰å´ã«å›žè»¢ |
+| `KC_MS_WH_LEFT` | `KC_WH_L` | ホイールを左ã«å€’ã™ |
+| `KC_MS_WH_RIGHT` | `KC_WH_R` | ホイールをå³ã«å€’ã™ |
+| `KC_MS_ACCEL0` | `KC_ACL0` | 速度を0ã«è¨­å®š |
+| `KC_MS_ACCEL1` | `KC_ACL1` | 速度を1ã«è¨­å®š |
+| `KC_MS_ACCEL2` | `KC_ACL2` | 速度を2ã«è¨­å®š |
+
+## マウスキーã®è¨­å®š
+
+マウスキーã¯ã‚«ãƒ¼ã‚½ãƒ«ã‚’移動ã™ã‚‹ãŸã‚ã®2ã¤ã®ç•°ãªã‚‹ãƒ¢ãƒ¼ãƒ‰ã‚’サãƒãƒ¼ãƒˆã—ã¾ã™:
+
+* **加速 (デフォルト):** 移動キーを押ã—ãŸã¾ã¾ã«ã™ã‚‹ã¨ã€ã‚«ãƒ¼ã‚½ãƒ«ãŒæœ€å¤§é€Ÿåº¦ã«é”ã™ã‚‹ã¾ã§ã‚«ãƒ¼ã‚½ãƒ«ã‚’加速ã—ã¾ã™ã€‚
+* **定速:** 移動キーを押ã—ãŸã¾ã¾ã«ã™ã‚‹ã¨ã€ã‚«ãƒ¼ã‚½ãƒ«ã‚’一定ã®é€Ÿåº¦ã§ç§»å‹•ã—ã¾ã™ã€‚
+
+åŒã˜åŽŸå‰‡ãŒã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã«ã‚‚é©ç”¨ã•ã‚Œã¾ã™ã€‚
+
+時間ã€é–“éš”ã€é…延ã®è¨­å®šã‚ªãƒ—ションã¯ã€ãƒŸãƒªç§’ã§æŒ‡å®šã•ã‚Œã¾ã™ã€‚スクロール速度ã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã‚¹ãƒ†ãƒƒãƒ—ã®å€æ•°ã¨ã—ã¦æ¸¡ã•ã‚Œã¾ã™ã€‚例ãˆã°ã€ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«é€Ÿåº¦8ã¯ã€å„スクロールアクションãŒã‚ªãƒšãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°ã‚·ã‚¹ãƒ†ãƒ ã¾ãŸã¯ã‚¢ãƒ—リケーションã§å®šç¾©ã•ã‚Œã‚‹ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã‚¹ãƒ†ãƒƒãƒ—ã®8å€ã®è·é›¢é€²ã‚€ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚
+
+### 加速モード
+
+ã“ã‚Œã¯ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®ãƒ¢ãƒ¼ãƒ‰ã§ã™ã€‚キーマップ㮠`config.h` ファイルã®ä»¥ä¸‹ã®è¨­å®šã‚’使ã£ã¦ã‚«ãƒ¼ã‚½ãƒ«ã¨ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã®åŠ é€Ÿã‚’調整ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:
+
+| 定義 | デフォルト | 説明 |
+|----------------------------|-------|---------------------------------------------------------|
+| `MOUSEKEY_DELAY` | 300 | 移動キーを押ã—ã¦ã‹ã‚‰ã‚«ãƒ¼ã‚½ãƒ«ãŒç§»å‹•ã™ã‚‹ã¾ã§ã®é…延 |
+| `MOUSEKEY_INTERVAL` | 50 | カーソル移動間ã®æ™‚é–“ |
+| `MOUSEKEY_MAX_SPEED` | 10 | 加速ãŒåœæ­¢ã™ã‚‹æœ€å¤§ã®ã‚«ãƒ¼ã‚½ãƒ«é€Ÿåº¦ |
+| `MOUSEKEY_TIME_TO_MAX` | 20 | 最大カーソル速度ã«é”ã™ã‚‹ã¾ã§ã®æ™‚é–“ |
+| `MOUSEKEY_WHEEL_DELAY` | 300 | ホイールキーを押ã—ã¦ã‹ã‚‰ãƒ›ã‚¤ãƒ¼ãƒ«ãŒå‹•ãã¾ã§ã®é…延 |
+| `MOUSEKEY_WHEEL_INTERVAL` | 100 | ホイールã®å‹•ãã®é–“ã®æ™‚é–“ |
+| `MOUSEKEY_WHEEL_MAX_SPEED` | 8 | スクロールアクションã”ã¨ã®ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã‚¹ãƒ†ãƒƒãƒ—ã®æœ€å¤§æ•° |
+| `MOUSEKEY_WHEEL_TIME_TO_MAX` | 40 | 最大スクロール速度ã«é”ã™ã‚‹ã¾ã§ã®æ™‚é–“ |
+
+ヒント:
+
+* `MOUSEKEY_DELAY` ã®è¨­å®šãŒä½Žã™ãŽã‚‹ã¨ã‚«ãƒ¼ã‚½ãƒ«ãŒå¿œç­”ã—ãªããªã‚Šã¾ã™ã€‚設定ãŒé«˜ã™ãŽã‚‹ã¨å°ã•ãªå‹•ããŒé›£ã—ããªã‚Šã¾ã™ã€‚
+* カーソルã®å‹•ãをスムーズã«ã™ã‚‹ã«ã¯ã€`MOUSEKEY_INTERVAL` ã®å€¤ã‚’低ãã—ã¾ã™ã€‚ディスプレイã®ãƒªãƒ•ãƒ¬ãƒƒã‚·ãƒ¥ãƒ¬ãƒ¼ãƒˆãŒ60Hzã®å ´åˆã€`16` (1/60) ã«è¨­å®šã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã‚Œã«ã‚ˆã‚Šã‚«ãƒ¼ã‚½ãƒ«ã®é€Ÿåº¦ãŒå¤§å¹…ã«å‘上ã™ã‚‹ãŸã‚ã€`MOUSEKEY_MAX_SPEED` を下ã’ãŸæ–¹ãŒè‰¯ã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。
+* `MOUSEKEY_TIME_TO_MAX` ã¾ãŸã¯ `MOUSEKEY_WHEEL_TIME_TO_MAX` ã‚’ `0` ã«è¨­å®šã™ã‚‹ã¨ã€ãã‚Œãžã‚Œã‚«ãƒ¼ã‚½ãƒ«ã®é€Ÿåº¦ã¾ãŸã¯ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã®åŠ é€ŸãŒç„¡åŠ¹ã«ãªã‚Šã¾ã™ã€‚ã“ã®æ–¹æ³•ã§ã¯ã€ä¸€æ–¹ã‚’加速ã—ãªãŒã‚‰ä»–方を一定ã«ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ãŒã€ã“ã‚Œã¯å®šé€Ÿãƒ¢ãƒ¼ãƒ‰ã§ã¯ä¸å¯èƒ½ã§ã™ã€‚
+* `MOUSEKEY_WHEEL_INTERVAL` ã®è¨­å®šãŒä½Žã™ãŽã‚‹ã¨ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ãŒã¨ã¦ã‚‚速ããªã‚Šã¾ã™ã€‚設定ãŒé«˜ã™ãŽã‚‹ã¨ãƒ›ã‚¤ãƒ¼ãƒ«ã‚­ãƒ¼ã‚’押ã—ãŸã¾ã¾ã«ã—ãŸæ™‚ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ãŒã¨ã¦ã‚‚é…ããªã‚Šã¾ã™
+
+カーソルã®åŠ é€Ÿã¯ã€X Window System MouseKeysAccel 機能ã¨åŒã˜ã‚¢ãƒ«ã‚´ãƒªã‚ºãƒ ã‚’使ã„ã¾ã™ã€‚詳細ã«ã¤ã„ã¦ã¯ [Wikipedia](https://en.wikipedia.org/wiki/Mouse_keys) ã‚’ã”覧ãã ã•ã„。
+
+### 定速モード
+
+ã“ã®ãƒ¢ãƒ¼ãƒ‰ã§ã¯ã€ã‚«ãƒ¼ã‚½ãƒ«ãŠã‚ˆã³ãƒžã‚¦ã‚¹ãƒ›ã‚¤ãƒ¼ãƒ«ã®ä¸¡æ–¹ã«ã¤ã„ã¦è¤‡æ•°ã®ç•°ãªã‚‹é€Ÿåº¦ã‚’定義ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚加速ã¯ã‚ã‚Šã¾ã›ã‚“。`KC_ACL0`ã€`KC_ACL1` ãŠã‚ˆã³ `KC_ACL2` ã¯ã€ã‚«ãƒ¼ã‚½ãƒ«ã¨ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã®é€Ÿåº¦ã‚’ãã‚Œãžã‚Œã®è¨­å®šã«å¤‰æ›´ã—ã¾ã™ã€‚
+
+速度ã®é¸æŠžã¯ã€ä¸€æ™‚çš„ã¨ã‚¿ãƒƒãƒ—é¸æŠžã®ã©ã¡ã‚‰ã‹ã‚’é¸ã¹ã¾ã™:
+
+* **一時的:** é¸æŠžã•ã‚ŒãŸé€Ÿåº¦ã¯ã€ãã‚Œãžã‚Œã®ã‚­ãƒ¼ã‚’押ã—ã¦ã„ã‚‹é–“ã®ã¿ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ãªã‚Šã¾ã™ã€‚キーを放ã™ã¨ã€ãƒžã‚¦ã‚¹ã‚­ãƒ¼ã¯å¤‰æ›´ã•ã‚Œã‚‹å‰ã®é€Ÿåº¦ã«æˆ»ã‚Šã¾ã™ã€‚
+* **タップé¸æŠž:** ãã‚Œãžã‚Œã®ã‚­ãƒ¼ã‚’押ã™ã¨é¸æŠžã•ã‚ŒãŸé€Ÿåº¦ãŒã‚¢ã‚¯ãƒ†ã‚£ãƒ–ã«ãªã‚Šã€ã‚­ãƒ¼ã‚’放ã—ãŸå¾Œã‚‚アクティブã®ã¾ã¾ã«ãªã‚Šã¾ã™ã€‚デフォルトã®é€Ÿåº¦ã¯ `KC_ACL1` ã§ã™ã€‚未変更ã®é€Ÿåº¦ã¯ã‚ã‚Šã¾ã›ã‚“。
+
+最もé…ã„速度ã‹ã‚‰æœ€ã‚‚速ã„速度ã¾ã§ã®ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆã®é€Ÿåº¦ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™:
+
+* **一時的:** `KC_ACL0` < `KC_ACL1` < *変更無ã—* < `KC_ACL2`
+* **タップé¸æŠž:** `KC_ACL0` < `KC_ACL1` < `KC_ACL2`
+
+定速モードを使ã†ã«ã¯ã€å°‘ãªãã¨ã‚‚キーマップ㮠keymaps ディレクトリ㮠`config.h` ファイル㫠`MK_3_SPEED` を定義ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
+
+```c
+#define MK_3_SPEED
+```
+
+一時的モードを有効ã«ã™ã‚‹ã«ã¯ã€`MK_MOMENTARY_ACCEL` も定義ã—ã¾ã™:
+
+```c
+#define MK_MOMENTARY_ACCEL
+```
+
+カーソル移動ã‚ã‚‹ã„ã¯ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã‚’調整ã™ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®è¨­å®šã‚’使ã„ã¾ã™:
+
+| 定義 | デフォルト | 説明 |
+|---------------------|-------------|-------------------------------------------|
+| `MK_3_SPEED` | *定義ãªã—* | 定速カーソルを有効ã«ã™ã‚‹ |
+| `MK_MOMENTARY_ACCEL` | *定義ãªã—* | 一時的モードを有効ã«ã™ã‚‹ |
+| `MK_C_OFFSET_UNMOD` | 16 | 移動ã”ã¨ã®ã‚«ãƒ¼ã‚½ãƒ«ã‚ªãƒ•ã‚»ãƒƒãƒˆ (変更無ã—) |
+| `MK_C_INTERVAL_UNMOD` | 16 | カーソルã®ç§»å‹•é–“ã®æ™‚é–“ (変更無ã—) |
+| `MK_C_OFFSET_0` | 1 | 移動ã”ã¨ã®ã‚«ãƒ¼ã‚½ãƒ«ã‚ªãƒ•ã‚»ãƒƒãƒˆ (`KC_ACL0`) |
+| `MK_C_INTERVAL_0` | 32 | カーソル移動間ã®æ™‚é–“ (`KC_ACL0`) |
+| `MK_C_OFFSET_1` | 4 | 移動ã”ã¨ã®ã‚«ãƒ¼ã‚½ãƒ«ã‚ªãƒ•ã‚»ãƒƒãƒˆ (`KC_ACL1`) |
+| `MK_C_INTERVAL_1` | 16 | カーソル移動間ã®æ™‚é–“ (`KC_ACL1`) |
+| `MK_C_OFFSET_2` | 32 | 移動ã”ã¨ã®ã‚«ãƒ¼ã‚½ãƒ«ã‚ªãƒ•ã‚»ãƒƒãƒˆ (`KC_ACL2`) |
+| `MK_C_INTERVAL_2` | 16 | カーソル移動間ã®æ™‚é–“ (`KC_ACL2`) |
+| `MK_W_OFFSET_UNMOD` | 1 | スクロールアクションã”ã¨ã®ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã‚¹ãƒ†ãƒƒãƒ— (変更無ã—) |
+| `MK_W_INTERVAL_UNMOD` | 40 | スクロールステップ間ã®æ™‚é–“ (変更無ã—) |
+| `MK_W_OFFSET_0` | 1 | スクロールアクションã”ã¨ã®ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã‚¹ãƒ†ãƒƒãƒ— (`KC_ACL0`) |
+| `MK_W_INTERVAL_0` | 360 | スクロールステップ間ã®æ™‚é–“ (`KC_ACL0`) |
+| `MK_W_OFFSET_1` | 1 | スクロールアクションã”ã¨ã®ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã‚¹ãƒ†ãƒƒãƒ— (`KC_ACL1`) |
+| `MK_W_INTERVAL_1` | 120 | スクロールステップ間ã®æ™‚é–“ (`KC_ACL1`) |
+| `MK_W_OFFSET_2` | 1 | スクロールアクションã”ã¨ã®ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã‚¹ãƒ†ãƒƒãƒ— (`KC_ACL2`) |
+| `MK_W_INTERVAL_2` | 20 | スクロールステップ間ã®æ™‚é–“ (`KC_ACL2`) |
diff --git a/docs/ja/feature_pointing_device.md b/docs/ja/feature_pointing_device.md
new file mode 100644
index 0000000000..8b26ac102f
--- /dev/null
+++ b/docs/ja/feature_pointing_device.md
@@ -0,0 +1,49 @@
+# ãƒã‚¤ãƒ³ãƒ†ã‚£ãƒ³ã‚°ãƒ‡ãƒã‚¤ã‚¹ :id=pointing-device
+
+<!---
+ original document: 0.8.182:docs/feature_pointing_device.md
+ git diff 0.8.182 HEAD -- docs/feature_pointing_device.md | cat
+-->
+
+ãƒã‚¤ãƒ³ãƒ†ã‚£ãƒ³ã‚°ãƒ‡ãƒã‚¤ã‚¹ã¯æ±Žç”¨çš„ãªæ©Ÿèƒ½ã®ç·ç§°ã§ã™: システムãƒã‚¤ãƒ³ã‚¿ã‚’移動ã—ã¾ã™ã€‚マウスキーã®ã‚ˆã†ãªä»–ã®ã‚ªãƒ—ションも確ã‹ã«ã‚ã‚Šã¾ã™ãŒã€ã“ã‚Œã¯ç°¡å˜ã«å¤‰æ›´å¯èƒ½ã§è»½é‡ã§ã‚ã‚‹ã“ã¨ã‚’目指ã—ã¦ã„ã¾ã™ã€‚機能を制御ã™ã‚‹ãŸã‚ã«ã‚«ã‚¹ã‚¿ãƒ ã‚­ãƒ¼ã‚’実装ã—ãŸã‚Šã€ä»–ã®å‘¨è¾ºæ©Ÿå™¨ã‹ã‚‰æƒ…報をåŽé›†ã—ã¦ã“ã“ã«ç›´æŽ¥æŒ¿å…¥ã—ãŸã‚Šã§ãã¾ã™ - QMK ã«å‡¦ç†ã‚’ä»»ã›ã¦ãã ã•ã„。
+
+ãƒã‚¤ãƒ³ãƒ†ã‚£ãƒ³ã‚°ãƒ‡ãƒã‚¤ã‚¹ã‚’有効ã«ã™ã‚‹ã«ã¯ã€rules.mk ã®ä»¥ä¸‹ã®è¡Œã®ã‚³ãƒ¡ãƒ³ãƒˆã‚’解除ã—ã¾ã™:
+
+```makefile
+POINTING_DEVICE_ENABLE = yes
+```
+
+マウスレãƒãƒ¼ãƒˆã‚’æ“作ã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã®é–¢æ•°ã‚’使ã†ã“ã¨ãŒã§ãã¾ã™:
+
+* `pointing_device_get_report()` - ホストコンピュータã«é€ä¿¡ã•ã‚ŒãŸæƒ…報を表ã™ç¾åœ¨ã® report_mouse_t ã‚’è¿”ã—ã¾ã™ã€‚
+* `pointing_device_set_report(report_mouse_t newMouseReport)` - ホストコンピュータã«é€ä¿¡ã•ã‚Œã‚‹ report_mouse_t を上書ãä¿å­˜ã—ã¾ã™ã€‚
+
+report_mouse_t (ã“ã“ã§ã¯ "mouseReport") ãŒä»¥ä¸‹ã®ãƒ—ロパティをæŒã¤ã“ã¨ã‚’覚ãˆã¦ãŠã„ã¦ãã ã•ã„:
+
+* `mouseReport.x` - ã“ã‚Œã¯ã€x軸ã®å‹•ã(+ å³ã¸ã€- å·¦ã¸)を表㙠-127 ã‹ã‚‰ 127 (128ã§ã¯ãªãã€USB HID 仕様ã§å®šç¾©ã•ã‚Œã¦ã„ã¾ã™)ã®ç¬¦å·ä»˜ãæ•´æ•°ã§ã™ã€‚
+* `mouseReport.y` - ã“ã‚Œã¯ã€y軸ã®å‹•ã(+ 上ã¸ã€- 下ã¸)を表㙠-127 ã‹ã‚‰ 127 (128ã§ã¯ãªãã€USB HID 仕様ã§å®šç¾©ã•ã‚Œã¦ã„ã¾ã™)ã®ç¬¦å·ä»˜ãæ•´æ•°ã§ã™ã€‚
+* `mouseReport.v` - ã“ã‚Œã¯ã€åž‚直スクロール(+ 上ã¸ã€- 下ã¸)を表㙠-127 ã‹ã‚‰ 127 (128ã§ã¯ãªãã€USB HID 仕様ã§å®šç¾©ã•ã‚Œã¦ã„ã¾ã™)ã®ç¬¦å·ä»˜ãæ•´æ•°ã§ã™ã€‚
+* `mouseReport.h` - ã“ã‚Œã¯ã€æ°´å¹³ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«(+ å³ã¸ã€- å·¦ã¸)を表㙠-127 ã‹ã‚‰ 127 (128ã§ã¯ãªãã€USB HID 仕様ã§å®šç¾©ã•ã‚Œã¦ã„ã¾ã™)ã®ç¬¦å·ä»˜ãæ•´æ•°ã§ã™ã€‚
+* `mouseReport.buttons` - ã“れ㯠uint8_t ã§ã€ä¸Šä½ã®5ビットを使ã£ã¦ã„ã¾ã™ã€‚ã“れらã®ãƒ“ットã¯ãƒžã‚¦ã‚¹ãƒœã‚¿ãƒ³ã®çŠ¶æ…‹ã‚’表ã—ã¾ã™ - ビット 3 ã¯ãƒžã‚¦ã‚¹ãƒœã‚¿ãƒ³ 5ã€ãƒ“ット 7 ã¯ãƒžã‚¦ã‚¹ãƒœã‚¿ãƒ³ 1 ã§ã™ã€‚
+
+マウスレãƒãƒ¼ãƒˆãŒé€ä¿¡ã•ã‚Œã‚‹ã¨ã€xã€yã€vã€h ã®ã„ãšã‚Œã®å€¤ã‚‚ 0 ã«è¨­å®šã•ã‚Œã¾ã™ (ã“れ㯠"pointing_device_send()" ã§è¡Œã‚ã‚Œã¾ã™ã€‚ã“ã®æŒ™å‹•ã‚’回é¿ã™ã‚‹ãŸã‚ã«ã‚ªãƒ¼ãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™)。ã“ã®ã‚ˆã†ã«ã€ãƒœã‚¿ãƒ³ã®çŠ¶æ…‹ã¯æŒç¶šã—ã¾ã™ãŒã€å‹•ãã¯1度ã ã‘èµ·ã“ã‚Šã¾ã™ã€‚ã•ã‚‰ã«ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã™ã‚‹ãŸã‚ã«ã€`pointing_device_init` 㨠`pointing_device_task` ã®ã©ã¡ã‚‰ã‚‚オーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+
+以下ã®ä¾‹ã§ã¯ã€ã‚«ã‚¹ã‚¿ãƒ ã‚­ãƒ¼ã‚’使ã£ã¦ãƒžã‚¦ã‚¹ã‚’クリックã—åž‚ç›´ãŠã‚ˆã³æ°´å¹³æ–¹å‘ã«127å˜ä½ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã—ã€ãƒªãƒªãƒ¼ã‚¹ã•ã‚ŒãŸæ™‚ã«ãれを全ã¦å…ƒã«æˆ»ã—ã¾ã™ - ãªãœãªã‚‰ã“ã‚Œã¯å®Œå…¨ã«ä¾¿åˆ©ãªæ©Ÿèƒ½ã ã‹ã‚‰ã§ã™ã€‚ã„ã„ã§ã™ã‹ã€ä»¥ä¸‹ã¯ã²ã¨ã¤ã®ä¾‹ã§ã™:
+
+```c
+case MS_SPECIAL:
+ report_mouse_t currentReport = pointing_device_get_report();
+ if (record->event.pressed) {
+ currentReport.v = 127;
+ currentReport.h = 127;
+ currentReport.buttons |= MOUSE_BTN1; // this is defined in report.h
+ } else {
+ currentReport.v = -127;
+ currentReport.h = -127;
+ currentReport.buttons &= ~MOUSE_BTN1;
+ }
+ pointing_device_set_report(currentReport);
+ break;
+```
+
+マウスレãƒãƒ¼ãƒˆã¯é€ä¿¡ã•ã‚Œã‚‹ãŸã³ã« 0 (ボタンを除ã)ã«è¨­å®šã•ã‚Œã‚‹ã“ã¨ã‚’æ€ã„出ã—ã¦ãã ã•ã„。ãã®ãŸã‚ã€ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã¯ãã‚Œãžã‚Œã®å ´åˆã«1度ã ã‘発生ã—ã¾ã™ã€‚
diff --git a/docs/ja/feature_thermal_printer.md b/docs/ja/feature_thermal_printer.md
new file mode 100644
index 0000000000..508123bd64
--- /dev/null
+++ b/docs/ja/feature_thermal_printer.md
@@ -0,0 +1,15 @@
+# 感熱å¼ãƒ—リンタ
+
+<!---
+ original document: 0.8.147:docs/feature_thermal_printer.md
+ git diff 0.8.147 HEAD -- docs/feature_thermal_printer.md | cat
+-->
+
+<!-- FIXME: Describe thermal printers support here. -->
+
+## 感熱å¼ãƒ—リンタã®ã‚­ãƒ¼ã‚³ãƒ¼ãƒ‰
+
+| キー | 説明 |
+|-----------|----------------------------------------|
+| `PRINT_ON` | ユーザãŒå…¥åŠ›ã—ãŸå…¨ã¦ã®å°åˆ·ã‚’開始 |
+| `PRINT_OFF` | ユーザãŒå…¥åŠ›ã—ãŸå…¨ã¦ã®å°åˆ·ã‚’åœæ­¢ |
diff --git a/docs/ja/feature_velocikey.md b/docs/ja/feature_velocikey.md
new file mode 100644
index 0000000000..f9b6e73bd4
--- /dev/null
+++ b/docs/ja/feature_velocikey.md
@@ -0,0 +1,35 @@
+# Velocikey
+
+<!---
+ original document: 0.8.147:docs/feature_velocikey.md
+ git diff 0.8.147 HEAD -- docs/feature_velocikey.md | cat
+-->
+
+Velocikey ã¯å…¥åŠ›ã®é€Ÿåº¦ã‚’使ã£ã¦(レインボー渦巻効果ã®ã‚ˆã†ãª)ライト効果ã®é€Ÿåº¦ã‚’制御ã§ãる機能ã§ã™ã€‚速ã入力ã™ã‚Œã°ã™ã‚‹ã»ã©ãƒ©ã‚¤ãƒˆãŒé€Ÿããªã‚Šã¾ã™ï¼
+
+## 使用法
+Velocikey を使ã†ãŸã‚ã«ã¯ã€2ã¤ã®ã‚¹ãƒ†ãƒƒãƒ—ãŒã‚ã‚Šã¾ã™ã€‚最åˆã«ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚’コンパイルã™ã‚‹æ™‚ã«ã€`rules.mk` ã« `VELOCIKEY_ENABLE=yes` を設定ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚例ãˆã°:
+
+```
+BOOTMAGIC_ENABLE = no
+MOUSEKEY_ENABLE = no
+STENO_ENABLE = no
+EXTRAKEY_ENABLE = yes
+VELOCIKEY_ENABLE = yes
+```
+
+次ã«ã€ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®ä½¿ç”¨ä¸­ã«ã€VLK_TOG キーコードを使ã£ã¦ Velocikey を有効ã«ã™ã‚‹å¿…è¦ã‚‚ã‚ã‚Šã¾ã™ã€‚ã“ã‚Œã¯æ©Ÿèƒ½ã‚’オンãŠã‚ˆã³ã‚ªãƒ•ã«ã—ã¾ã™ã€‚
+
+以下ã®å…¨ã¦ã®ãƒ©ã‚¤ãƒˆåŠ¹æžœãŒã€Velocikey を有効ã«ã™ã‚‹ã“ã¨ã§åˆ¶å¾¡ã•ã‚Œã¾ã™:
+- RGB 明滅動作
+- RGB レインボームード
+- RGB レインボー渦巻
+- RGB スãƒãƒ¼ã‚¯
+- RGB ナイト
+
+LED 明滅動作ã®åŠ¹æžœã®ã‚µãƒãƒ¼ãƒˆã¯è¨ˆç”»ã•ã‚Œã¦ã„ã¾ã™ãŒã¾ã åˆ©ç”¨ã§ãã¾ã›ã‚“。
+
+Velocikey ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹é™ã‚Šã€ç¾åœ¨ã‚ªãƒ³ã«ãªã£ã¦ã„ã‚‹ RGB ライトã®ä»–ã®å…¨ã¦ã®é€Ÿåº¦è¨­å®šã«é–¢ä¿‚ãªãã€é€Ÿåº¦ãŒåˆ¶å¾¡ã•ã‚Œã¾ã™ã€‚
+
+## 設定
+Velocikey ã¯ç¾åœ¨ã®ã¨ã“ã‚キーボード設定を介ã—ãŸã©ã®ã‚ˆã†ãªè¨­å®šã‚‚サãƒãƒ¼ãƒˆã—ã¾ã›ã‚“。速度ã®å¢—加ã‚ã‚‹ã„ã¯æ¸›å°‘率ãªã©ã‚’調整ã—ãŸã„å ´åˆã¯ã€`velocikey.c` を編集ã—ã€ãã“ã§å€¤ã‚’調整ã—ã¦ã€å¥½ã¿ã®é€Ÿåº¦ã‚’実ç¾ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚
diff --git a/docs/ja/getting_started_github.md b/docs/ja/getting_started_github.md
index 5457c1e06e..24a217c745 100644
--- a/docs/ja/getting_started_github.md
+++ b/docs/ja/getting_started_github.md
@@ -1,15 +1,15 @@
-# QMK 㧠Github を使ã†æ–¹æ³•
+# QMK 㧠GitHub を使ã†æ–¹æ³•
<!---
original document: 0.8.82:docs/getting_started_github.md
git diff 0.8.82 HEAD -- docs/getting_started_github.md | cat
-->
-Github ã¯æ…£ã‚Œã¦ã„ãªã„人ã«ã¯å°‘ã—注æ„ãŒå¿…è¦ã§ã™ - ã“ã®ã‚¬ã‚¤ãƒ‰ã¯ã€QMK ã«ãŠã‘るフォークã€ã‚¯ãƒ­ãƒ¼ãƒ³ã€ãƒ—ルリクエストã®ã‚µãƒ–ミットã®å„ステップã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚
+GitHub ã¯æ…£ã‚Œã¦ã„ãªã„人ã«ã¯å°‘ã—注æ„ãŒå¿…è¦ã§ã™ - ã“ã®ã‚¬ã‚¤ãƒ‰ã¯ã€QMK ã«ãŠã‘るフォークã€ã‚¯ãƒ­ãƒ¼ãƒ³ã€ãƒ—ルリクエストã®ã‚µãƒ–ミットã®å„ステップã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚
?> ã“ã®ã‚¬ã‚¤ãƒ‰ã§ã¯ã€ã‚ãªãŸãŒã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã§ã®å®Ÿè¡Œã«ã‚る程度慣れã¦ãŠã‚Šã€ã‚·ã‚¹ãƒ†ãƒ ã« git ãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’å‰æã«ã—ã¦ã„ã¾ã™ã€‚
-[QMK Github ページ](https://github.com/qmk/qmk_firmware)ã‚’é–‹ãã¨ã€å³ä¸Šã« "Fork" ã¨ã„ã†ãƒœã‚¿ãƒ³ãŒè¦‹ãˆã¾ã™:
+[QMK GitHub ページ](https://github.com/qmk/qmk_firmware)ã‚’é–‹ãã¨ã€å³ä¸Šã« "Fork" ã¨ã„ã†ãƒœã‚¿ãƒ³ãŒè¦‹ãˆã¾ã™:
![Git ã§ã®ãƒ•ã‚©ãƒ¼ã‚¯](http://i.imgur.com/8Toomz4.jpg)
@@ -59,7 +59,7 @@ To https://github.com/whoeveryouare/qmk_firmware.git
+ 20043e64...7da94ac5 master -> master
```
-ã‚ãªãŸã®å¤‰æ›´ã¯ä»Šã§ã¯ Github 上ã®ãƒ•ã‚©ãƒ¼ã‚¯ã«ã‚ã‚Šã¾ã™ - フォーク (`https://github.com/<whoeveryouare>/qmk_firmware`)ã«æˆ»ã‚‹ã¨ã€"New Pull Request" ボタンをクリックã™ã‚‹ã“ã¨ã§æ–°ã—ã„プルリクエストを作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:
+ã‚ãªãŸã®å¤‰æ›´ã¯ä»Šã§ã¯ GitHub 上ã®ãƒ•ã‚©ãƒ¼ã‚¯ã«ã‚ã‚Šã¾ã™ - フォーク (`https://github.com/<whoeveryouare>/qmk_firmware`)ã«æˆ»ã‚‹ã¨ã€"New Pull Request" ボタンをクリックã™ã‚‹ã“ã¨ã§æ–°ã—ã„プルリクエストを作æˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™:
![New Pull Request](http://i.imgur.com/DxMHpJ8.jpg)
diff --git a/docs/ja/newbs_building_firmware_configurator.md b/docs/ja/newbs_building_firmware_configurator.md
index e54921e520..419ba1416b 100644
--- a/docs/ja/newbs_building_firmware_configurator.md
+++ b/docs/ja/newbs_building_firmware_configurator.md
@@ -28,7 +28,7 @@ QMK Configurator 㯠Chrome/Firefox ã§æœ€é©ã«å‹•ä½œã—ã¾ã™ã€‚
キーボード㌠QMK ã‚’æ­è¼‰ã—ã¦ã„ã‚‹ã¨å®£ä¼ã•ã‚Œã¦ã„ã¦ã‚‚リストã«ãªã„å ´åˆã¯ã€é–‹ç™ºè€…ãŒã¾ã ä½œæ¥­ä¸­ã‹ã€ç§ãŸã¡ãŒã¾ã ãƒžãƒ¼ã‚¸ã™ã‚‹ãã£ã‹ã‘ãŒãªã‹ã£ãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚
アクティブ㪠[Pull Request](https://github.com/qmk/qmk_firmware/pulls?q=is%3Aopen+is%3Apr+label%3Akeyboard) ãŒãªã„å ´åˆã€[qmk_firmware](https://github.com/qmk/qmk_firmware/issues)ã§å ±å‘Šã—ã¦ã€ãã®ç‰¹å®šã®ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã®ã‚µãƒãƒ¼ãƒˆã‚’リクエストã—ã¾ã™ã€‚
-製作者自身㮠github アカウントã«ã‚ã‚‹ QMK æ­è¼‰ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚‚ã‚ã‚Šã¾ã™ã€‚
+製作者自身㮠GitHub アカウントã«ã‚ã‚‹ QMK æ­è¼‰ã‚­ãƒ¼ãƒœãƒ¼ãƒ‰ã‚‚ã‚ã‚Šã¾ã™ã€‚
ãれもå†ç¢ºèªã—ã¦ãã ã•ã„。
## キーボードã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’é¸æŠžã™ã‚‹
diff --git a/docs/ja/newbs_learn_more_resources.md b/docs/ja/newbs_learn_more_resources.md
index 523d91a05a..f2f8270e1d 100644
--- a/docs/ja/newbs_learn_more_resources.md
+++ b/docs/ja/newbs_learn_more_resources.md
@@ -14,7 +14,7 @@
* [Great General Tutorial](https://www.codecademy.com/learn/learn-git)
* [Git Game To Learn From Examples](https://learngitbranching.js.org/)
-* [Git Resources to Learn More About Github](getting_started_github.md)
+* [Git Resources to Learn More About GitHub](getting_started_github.md)
* [Git Resources Aimed Specifically toward QMK](contributing.md)
### 日本語
@@ -22,7 +22,7 @@
_日本語ã®ãƒªã‚½ãƒ¼ã‚¹æƒ…報を募集中ã§ã™ã€‚_
* [Git Game To Learn From Examples(日本語対応有り)](https://learngitbranching.js.org/)
-* [QMK 㧠Github を使ã†æ–¹æ³•](ja/getting_started_github.md)
+* [QMK 㧠GitHub を使ã†æ–¹æ³•](ja/getting_started_github.md)
* [貢献方法](ja/contributing.md)
## コマンドラインã«é–¢ã™ã‚‹ãƒªã‚½ãƒ¼ã‚¹:
diff --git a/docs/keycodes.md b/docs/keycodes.md
index 18fd811184..40a46964a8 100644
--- a/docs/keycodes.md
+++ b/docs/keycodes.md
@@ -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
diff --git a/docs/keymap.md b/docs/keymap.md
index ba358edbe0..ef476e87f5 100644
--- a/docs/keymap.md
+++ b/docs/keymap.md
@@ -71,10 +71,22 @@ On the other hand, you can change `layer_state` to overlay the base layer with o
### Layer Precedence and Transparency
-Note that ***higher layer has higher priority on stack of layers***, namely firmware falls down from top layer to bottom to look up keycode. Once it spots keycode other than **`KC_TRNS`**(transparent) on a layer it stops searching and lower layers aren't referred.
-
-You can place `KC_TRANS` on overlay layer changes just part of layout to fall back on lower or base layer.
-Key with `KC_TRANS` (`KC_TRNS` and `_______` are the alias) doesn't has its own keycode and refers to lower valid layers for keycode, instead.
+Note that ***higher layers have higher priority within the stack of layers***. The firmware works its way down from the highest active layers to look up keycodes. Once the firmware locates a keycode other than `KC_TRNS` (transparent) on an active layer, it stops searching, and lower layers aren't referenced.
+
+ ____________
+ / / <--- Higher layer
+ / KC_TRNS //
+ /___________// <--- Lower layer (KC_A)
+ /___________/
+
+ In the above scenario, the non-transparent keys on the higher layer would be usable, but whenever `KC_TRNS` (or equivalent) is defined, the keycode (`KC_A`) on the lower level would be used.
+
+**Note:** Valid ways to denote transparency on a given layer:
+* `KC_TRANSPARENT`
+* `KC_TRNS` (alias)
+* `_______` (alias)
+
+These keycodes allow the processing to fall through to lower layers in search of a non-transparent keycode to process.
## Anatomy of a `keymap.c`
diff --git a/docs/newbs_flashing.md b/docs/newbs_flashing.md
index dc81efd212..04c7c55aed 100644
--- a/docs/newbs_flashing.md
+++ b/docs/newbs_flashing.md
@@ -1,18 +1,41 @@
-# Flashing Your Keyboard
+# Flashing Your Keyboard
-Now that you've built a custom firmware file you'll want to flash your keyboard.
+Now that you've built a custom firmware file you'll want to flash your keyboard.
+
+## Put Your Keyboard into DFU (Bootloader) Mode
+
+In order to flash your custom firmware you must first put your keyboard into a special flashing mode. While it is in this mode you will not be able to type or otherwise use your keyboard. It is very important that you do not unplug the keyboard or otherwise interrupt the flashing process while the firmware is being written.
+
+Different keyboards have different ways to enter this special mode. If your PCB currently runs QMK, TMK, or PS2AVRGB (Bootmapper Client) and you have not been given specific instructions, try the following, in order:
+
+* Hold down both shift keys and press `Pause`
+* Hold down both shift keys and press `B`
+* Unplug your keyboard, hold down the Spacebar and `B` at the same time, plug in your keyboard and wait a second before releasing the keys
+* Unplug your keyboard, hold down the top or bottom left key (usually Escape or Left Control) and plug in your keyboard
+* Press the physical `RESET` button, usually located on the underside of the PCB
+* Locate header pins on the PCB labeled `RESET` and `GND`, and short them together while plugging your PCB in
+
+If you've attempted all of the above to no avail, and the main chip on the board says `STM32` on it, this may be a bit more complicated. Generally your best bet is to ask on [Discord](https://discord.gg/Uq7gcHh) for assistance. It's likely some photos of the board will be asked for -- if you can get them ready beforehand it'll help move things along!
+
+Otherwise, you should see a message in yellow, similar to this in QMK Toolbox:
+
+```
+*** DFU device connected: Atmel Corp. ATmega32U4 (03EB:2FF4:0000)
+```
+
+and this bootloader device will also be present in Device Manager, System Information.app, or `lsusb`.
## Flashing Your Keyboard with QMK Toolbox
-The simplest way to flash your keyboard will be with the [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases).
+The simplest way to flash your keyboard will be with the [QMK Toolbox](https://github.com/qmk/qmk_toolbox/releases).
-However, the QMK Toolbox is only available for Windows and macOS currently. If you're using Linux (or just wish to flash the firmware from the command line), proceed down to [Flash Your Keyboard From The Command Line](#flash-your-keyboard-from-the-command-line).
+However, the Toolbox is currently only available for Windows and macOS. If you're using Linux (or just wish to flash the firmware from the command line), skip to the [Flash your Keyboard from the Command Line](#flash-your-keyboard-from-the-command-line) section.
-### Load The File Into QMK Toolbox
+### Load the File into QMK Toolbox
Begin by opening the QMK Toolbox application. You'll want to locate the firmware file in Finder or Explorer. Your keyboard firmware may be in one of two formats- `.hex` or `.bin`. QMK tries to copy the appropriate one for your keyboard into the root `qmk_firmware` directory.
-If you are on Windows or macOS there are commands you can use to easily open the current firmware folder in Explorer or Finder.
+If you are on Windows or macOS, there are commands you can use to easily open the current folder in Explorer or Finder.
#### Windows
@@ -38,65 +61,44 @@ For example, the `planck/rev5` with a `default` keymap will have this filename:
planck_rev5_default.hex
```
-Once you have located your firmware file drag it into the "Local file" box in QMK Toolbox, or click "Open" and navigate to where your firmware file is stored.
-
-### Put Your Keyboard Into DFU (Bootloader) Mode
-
-In order to flash your custom firmware you have to put your keyboard into a special flashing mode. While it is in this mode you will not be able to type or otherwise use your keyboard. It is very important that you do not unplug your keyboard or otherwise interrupt the flashing process while the firmware is being written.
-
-Different keyboards have different ways to enter this special mode. If your PCB currently runs QMK or TMK and you have not been given specific instructions try the following, in order:
-
-* Hold down both shift keys and press `Pause`
-* Hold down both shift keys and press `B`
-* Unplug your keyboard, hold down the Spacebar and `B` at the same time, plug in your keyboard and wait a second before releasing the keys
-* Press the physical `RESET` button on the bottom of the PCB
-* Locate header pins on the PCB labeled `BOOT0` or `RESET`, short those together while plugging your PCB in
-
-When you are successful you will see a message similar to this in QMK Toolbox:
-
-```
-*** Clueboard - Clueboard 66% HotSwap disconnected -- 0xC1ED:0x2390
-*** DFU device connected
-```
+Once you have located your firmware file drag it into the "Local file" box in QMK Toolbox, or click "Open" and navigate to where your firmware file is stored.
### Flash Your Keyboard
Click the `Flash` button in QMK Toolbox. You will see output similar to the following:
```
-*** Clueboard - Clueboard 66% HotSwap disconnected -- 0xC1ED:0x2390
-*** DFU device connected
+*** DFU device connected: Atmel Corp. ATmega32U4 (03EB:2FF4:0000)
*** Attempting to flash, please don't remove device
->>> dfu-programmer atmega32u4 erase --force
+>>> dfu-programmer.exe atmega32u4 erase --force
Erasing flash... Success
Checking memory from 0x0 to 0x6FFF... Empty.
->>> dfu-programmer atmega32u4 flash /Users/skully/qmk_firmware/clueboard_66_hotswap_gen1_skully.hex
- Checking memory from 0x0 to 0x55FF... Empty.
- 0% 100% Programming 0x5600 bytes...
+>>> dfu-programmer.exe atmega32u4 flash "D:\Git\qmk_firmware\gh60_satan_default.hex"
+ Checking memory from 0x0 to 0x3F7F... Empty.
+ 0% 100% Programming 0x3F80 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
0% 100% Reading 0x7000 bytes...
[>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] Success
Validating... Success
- 0x5600 bytes written into 0x7000 bytes memory (76.79%).
->>> dfu-programmer atmega32u4 reset
+ 0x3F80 bytes written into 0x7000 bytes memory (56.70%).
+>>> dfu-programmer.exe atmega32u4 reset
-*** DFU device disconnected
-*** Clueboard - Clueboard 66% HotSwap connected -- 0xC1ED:0x2390
+*** DFU device disconnected: Atmel Corp: ATmega32U4 (03EB:2FF4:0000)
```
## Flash your Keyboard from the Command Line
-This has been made pretty simple compared to what it used to be. When you are ready to compile and flash your firmware, open up your terminal window and run the flash command:
+This has been made pretty simple compared to what it used to be. When you are ready to compile and flash your firmware, open up your terminal window and run the flash command:
qmk flash
-If you have not configured your keyboard/keymap name, or you have multiple keyboards, you can specify the keyboard and keymap:
+If you have not configured your keyboard/keymap name in the CLI, or you have multiple keyboards, you can specify the keyboard and keymap:
qmk flash -kb <my_keyboard> -km <my_keymap>
-This will check the keyboard's configuration, and then attempt to flash it based on the specified bootloader. This means that you don't need to know which bootloader that your keyboard uses. Just run the command, and let the command do the heavy lifting.
+This will check the keyboard's configuration, and then attempt to flash it based on the specified bootloader. This means that you don't need to know which bootloader that your keyboard uses. Just run the command, and let the command do the heavy lifting.
-However, this does rely on the bootloader being set by the keyboard. If this information is not configured, or you're using a board that doesn't have a supported target to flash it, you will see this error:
+However, this does rely on the bootloader being set by the keyboard. If this information is not configured, or you're using a board that doesn't have a supported target to flash it, you will see this error:
WARNING: This board's bootloader is not specified or is not supported by the ":flash" target at this time.
diff --git a/docs/newbs_getting_started.md b/docs/newbs_getting_started.md
index a3022f15e5..1367d1b409 100644
--- a/docs/newbs_getting_started.md
+++ b/docs/newbs_getting_started.md
@@ -57,10 +57,9 @@ You may be asked to close and reopen the window. Do this and keep running the ab
You will need to install Homebrew. Follow the instructions on the [Homebrew homepage](https://brew.sh).
-After Homebrew is installed run these commands:
+After Homebrew is installed run this command:
- brew tap qmk/qmk
- brew install qmk
+ brew install qmk/qmk/qmk
### Linux
@@ -70,10 +69,21 @@ You will need to install Git and Python. It's very likely that you already have
* 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`)
+`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`)
+
+### FreeBSD
+
+You will need to install Git and Python. It's possible that you already have both, but if not, run the following commands to install them:
+
+ pkg install git python3
+
+Make sure that `$HOME/.local/bin` is added to your `$PATH` so that locally install Python packages are available.
+
+Once installed, you can install QMK CLI:
+
+ python3 -m pip install --user qmk
## 3. Run QMK Setup :id=set-up-qmk
@@ -89,6 +99,12 @@ This is due to a [bug](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=839155)
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`
+?>**Note on FreeBSD**:
+It is suggested to run `qmk setup` as a non-`root` user to start with, but this will likely identify packages that need to be installed to your
+base system using `pkg`. However the installation will probably fail when run as an unprivileged user.
+To manually install the base dependencies, run `./util/qmk_install.sh` either as `root`, or with `sudo`.
+Once that completes, re-run `qmk setup` to complete the setup and checks.
+
?> If you already know [how to use GitHub](getting_started_github.md), we recommend that you create your own fork and use `qmk setup <github_username>/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
@@ -119,7 +135,7 @@ Most people new to QMK only have 1 keyboard. You can set this keyboard as your d
qmk config user.keyboard=clueboard/66/rev4
-You can also set your default keymap name. Most people use their github username here, and we recommend that you do too.
+You can also set your default keymap name. Most people use their GitHub username here, and we recommend that you do too.
qmk config user.keymap=<github_username>
diff --git a/docs/other_vscode.md b/docs/other_vscode.md
index 7427f758e5..d544db6307 100644
--- a/docs/other_vscode.md
+++ b/docs/other_vscode.md
@@ -102,7 +102,7 @@ There are a number of extensions that you may want to install:
This installs a bunch of Git related tools that may make using Git with QMK Firmware easier.
* [EditorConfig for VS Code](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) - _[Optional]_ - Helps to keep the code to the QMK Coding Conventions.
* [Bracket Pair Colorizer 2](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer-2) - _[Optional]_ - This color codes the brackets in your code, to make it easier to reference nested code.
-* [Github Markdown Preview](https://marketplace.visualstudio.com/items?itemName=bierner.github-markdown-preview) - _[Optional]_ - Makes the markdown preview in VS Code more like GitHub's.
+* [GitHub Markdown Preview](https://marketplace.visualstudio.com/items?itemName=bierner.github-markdown-preview) - _[Optional]_ - Makes the markdown preview in VS Code more like GitHub's.
* [VS Live Share Extension Pack](https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare-pack) - _[Optional]_ - This extension allows somebody else to access your workspace (or you to access somebody else's workspace) and help out. This is great if you're having issues and need some help from somebody.
* [VIM Keymap](https://marketplace.visualstudio.com/items?itemName=GiuseppeCesarano.vim-keymap) - _[Optional]_ - For those that prefer VIM style keybindings. There are other options for this, too.
* [Travis CI Status](https://marketplace.visualstudio.com/items?itemName=felixrieseberg.vsc-travis-ci-status) - _[Optional]_ - This shows the current Travis CI status, if you have it set up.
diff --git a/docs/proton_c_conversion.md b/docs/proton_c_conversion.md
index 98f1508a9e..1b5e496e74 100644
--- a/docs/proton_c_conversion.md
+++ b/docs/proton_c_conversion.md
@@ -36,7 +36,7 @@ These are defaults based on what has been implemented for ARM boards.
| [RGB Lighting](feature_rgblight.md) | Disabled |
| [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 |
+| [Split keyboards](feature_split_keyboard.md) | Partial - heavily dependent on enabled features |
## Manual Conversion
diff --git a/docs/pt-br/README.md b/docs/pt-br/README.md
index 7cff6ce621..ea63ce13b5 100644
--- a/docs/pt-br/README.md
+++ b/docs/pt-br/README.md
@@ -12,7 +12,7 @@ QMK (*Quantum Mechanical Keyboard*) é uma comunidade de código aberto que mant
## Como obter e usar o QMK
-Se você planeja contribuir com um _keymap_ ("mapa de teclas"), teclado ou recursos para o QMK, o jeito mais fácil é [percorrer o repositório através do Github](https://github.com/qmk/qmk_firmware#fork-destination-box) e clonar seu repositório localmente para fazer suas alterações, dê um _push_ nelas e abra uma [_Pull request_](https://github.com/qmk/qmk_firmware/pulls) no seu fork.
+Se você planeja contribuir com um _keymap_ ("mapa de teclas"), teclado ou recursos para o QMK, o jeito mais fácil é [percorrer o repositório através do GitHub](https://github.com/qmk/qmk_firmware#fork-destination-box) e clonar seu repositório localmente para fazer suas alterações, dê um _push_ nelas e abra uma [_Pull request_](https://github.com/qmk/qmk_firmware/pulls) no seu fork.
Caso contrário, você pode cloná-lo diretamente com `git clone https://github.com/qmk/qmk_firmware`. Não faça o download dos arquivos zip ou tar; é necessário um repositório git para baixar os submódulos para compilar.
diff --git a/docs/pt-br/_summary.md b/docs/pt-br/_summary.md
index 78b3b20216..e0a1b45b33 100644
--- a/docs/pt-br/_summary.md
+++ b/docs/pt-br/_summary.md
@@ -11,7 +11,7 @@
* [QMK CLI](pt-br/cli.md)
* [QMK CLI Config](pt-br/cli_configuration.md)
* [Contributing to QMK](pt-br/contributing.md)
- * [How to Use Github](pt-br/getting_started_github.md)
+ * [How to Use GitHub](pt-br/getting_started_github.md)
* [Getting Help](pt-br/getting_started_getting_help.md)
* [Breaking Changes](pt-br/breaking_changes.md)
diff --git a/docs/reference_keymap_extras.md b/docs/reference_keymap_extras.md
new file mode 100644
index 0000000000..fd4b8dd853
--- /dev/null
+++ b/docs/reference_keymap_extras.md
@@ -0,0 +1,80 @@
+# Language-specific Keycodes
+
+Keyboards are able to support a wide range of languages. However, they do not send the actual characters produced by pressing their keys - instead, they send numerical codes. In the USB HID spec, these are called "usages", although they are more often referred to as "scancodes" or "keycodes" when in the context of keyboards.
+Less than 256 usages are defined in the HID Keyboard/Keypad usage page, and some of those do nothing on modern operating systems. So, how is this language support achieved?
+
+In a nutshell, the operating system maps the usages it receives to the appropriate character based on the user's configured keyboard layout. For example, when a Swedish person presses the key with the `Ã¥` character printed on it, the keyboard is *actually* sending the keycode for `[`.
+
+Obviously, this could get confusing, so QMK provides language-specific keycode aliases for many keyboard layouts. These won't do much on their own - you still have to set the matching keyboard layout in your OS settings. Think of them more as keycap labels for your keymap.
+
+To use these, simply `#include` the corresponding [header file](https://github.com/qmk/qmk_firmware/tree/master/quantum/keymap_extras) in your `keymap.c`, and add the keycodes defined in them in place of the `KC_` prefixed ones:
+
+|Layout |Header |
+|---------------------------|--------------------------------|
+|Canadian Multilingual (CSA)|`keymap_canadian_multilingual.h`|
+|Croatian |`keymap_croatian.h` |
+|Czech |`keymap_czech.h` |
+|Danish |`keymap_danish.h` |
+|Dutch (Belgium) |`keymap_belgian.h` |
+|English (Ireland) |`keymap_irish.h` |
+|English (UK) |`keymap_uk.h` |
+|English (US International) |`keymap_us_international.h` |
+|Estonian |`keymap_estonian.h` |
+|Finnish |`keymap_finnish.h` |
+|French |`keymap_french.h` |
+|French (BÉPO) |`keymap_bepo.h` |
+|French (Belgium) |`keymap_belgian.h` |
+|French (Switzerland) |`keymap_fr_ch.h` |
+|French (macOS, ISO) |`keymap_french_osx.h` |
+|German |`keymap_german.h` |
+|German (Switzerland) |`keymap_german_ch.h` |
+|German (macOS) |`keymap_german_osx.h` |
+|German (Neo2)* |`keymap_neo2.h` |
+|Greek* |`keymap_greek.h` |
+|Hungarian |`keymap_hungarian.h` |
+|Icelandic |`keymap_icelandic.h` |
+|Italian |`keymap_italian.h` |
+|Italian (macOS, ANSI) |`keymap_italian_osx_ansi.h` |
+|Italian (macOS, ISO) |`keymap_italian_osx_iso.h` |
+|Japanese |`keymap_jp.h` |
+|Korean |`keymap_korean.h` |
+|Latvian |`keymap_latvian.h` |
+|Lithuanian (ĄŽERTY) |`keymap_lithuanian_azerty.h` |
+|Lithuanian (QWERTY) |`keymap_lithuanian_qwerty.h` |
+|Norwegian |`keymap_norwegian.h` |
+|Polish |`keymap_polish.h` |
+|Portuguese |`keymap_portuguese.h` |
+|Portuguese (Brazil) |`keymap_br_abnt2.h` |
+|Romanian |`keymap_romanian.h` |
+|Russian* |`keymap_russian.h` |
+|Serbian* |`keymap_serbian.h` |
+|Serbian (Latin) |`keymap_serbian_latin.h` |
+|Slovak |`keymap_slovak.h` |
+|Slovenian |`keymap_slovenian.h` |
+|Spanish |`keymap_spanish.h` |
+|Spanish (Dvorak) |`keymap_spanish_dvorak.h` |
+|Swedish |`keymap_swedish.h` |
+|Turkish (F) |`keymap_turkish_f.h` |
+|Turkish (Q) |`keymap_turkish_q.h` |
+
+There are also a few which are not quite language-specific, but useful if you are not using a QWERTY layout:
+
+|Layout |Header |
+|-------------------|------------------------|
+|Colemak |`keymap_colemak.h` |
+|Dvorak |`keymap_dvorak.h` |
+|Dvorak (Programmer)|`keymap_dvp.h` |
+|Norman |`keymap_norman.h` |
+|Plover* |`keymap_plover.h` |
+|Plover (Dvorak)* |`keymap_plover_dvorak.h`|
+|Steno* |`keymap_steno.h` |
+|Workman |`keymap_workman.h` |
+|Workman (ZXCVM) |`keymap_workman_zxcvm.h`|
+
+## Sendstring Support
+
+By default, `SEND_STRING()` assumes a US ANSI keyboard layout is set. If you are using a different layout, you can also `#include "sendstring_*.h"` (as above) in your keymap to override the lookup tables used for mapping ASCII characters to keycodes.
+
+An important thing to note here is that `SEND_STRING()` only operates on [ASCII text](https://en.wikipedia.org/wiki/ASCII#Character_set). This means that you cannot pass it a string containing Unicode characters - this unfortunately includes accented characters that may be present in your desired layout.
+Many layouts make certain characters, such as Grave or Tilde, available only as [dead keys](https://en.wikipedia.org/wiki/Dead_key), so you must add a space immediately after it in the string you want to send, to prevent it from potentially combining with the next character.
+Certain other layouts have no Sendstring header as they do not use a Latin-derived alphabet (for example Greek and Russian), and thus there is no way to input most of the ASCII character set. These are marked above with a `*`.
diff --git a/docs/ru-ru/_summary.md b/docs/ru-ru/_summary.md
index f893be3cfd..09273172b6 100644
--- a/docs/ru-ru/_summary.md
+++ b/docs/ru-ru/_summary.md
@@ -11,7 +11,7 @@
* [QMK CLI](ru-ru/cli.md)
* [QMK CLI Config](ru-ru/cli_configuration.md)
* [Contributing to QMK](ru-ru/contributing.md)
- * [How to Use Github](ru-ru/getting_started_github.md)
+ * [How to Use GitHub](ru-ru/getting_started_github.md)
* [Getting Help](ru-ru/getting_started_getting_help.md)
* [Breaking Changes](ru-ru/breaking_changes.md)
diff --git a/docs/ru-ru/getting_started_github.md b/docs/ru-ru/getting_started_github.md
index 3b4940dd15..4fd80791f1 100644
--- a/docs/ru-ru/getting_started_github.md
+++ b/docs/ru-ru/getting_started_github.md
@@ -6,10 +6,10 @@ GitHub может показатьÑÑ Ð½ÐµÑколько Ñложным длÑ
Откройте [Ñтраницу QMK на GitHub] (https://github.com/qmk/qmk_firmware), и в правом верхнем углу вы увидите кнопку Ñ Ð½Ð°Ð´Ð¿Ð¸Ñью "Fork":
-![Fork on Github](http://i.imgur.com/8Toomz4.jpg)
+![Fork on GitHub](http://i.imgur.com/8Toomz4.jpg)
ЕÑли вы ÑоÑтоите в какой-либо организации, вам нужно выбрать учетную запиÑÑŒ, к которой будет привÑзан форк. Ð’ большинÑтве Ñлучаев Ñто будет личной аккаунт. Как только ваш форк будет завершен (иногда Ñто занимает немного времени), нажмите кнопку "Clone or Download":
-![Download from Github](http://i.imgur.com/N1NYcSz.jpg)
+![Download from GitHub](http://i.imgur.com/N1NYcSz.jpg)
И обÑзательно выберите "HTTPS", затем выделите ÑÑылку и Ñкопируйте ее:
diff --git a/docs/serial_driver.md b/docs/serial_driver.md
new file mode 100644
index 0000000000..bc376b6ddd
--- /dev/null
+++ b/docs/serial_driver.md
@@ -0,0 +1,69 @@
+# 'serial' Driver
+This driver powers the [Split Keyboard](feature_split_keyboard.md) feature.
+
+?> Serial in this context should be read as **sending information one bit at a time**, rather than implementing UART/USART/RS485/RS232 standards.
+
+All drivers in this category have the following characteristics:
+* Provides data and signaling over a single conductor
+* Limited to single master, single slave
+
+## Supported Driver Types
+
+| | AVR | ARM |
+|-------------------|--------------------|--------------------|
+| bit bang | :heavy_check_mark: | :heavy_check_mark: |
+| USART Half-duplex | | :heavy_check_mark: |
+
+## Driver configuration
+
+### Bitbang
+Default driver, the absence of configuration assumes this driver. To configure it, add this to your rules.mk:
+
+```make
+SERIAL_DRIVER = bitbang
+```
+
+Configure the driver via your config.h:
+```c
+#define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6
+#define SELECT_SOFT_SERIAL_SPEED 1 // or 0, 2, 3, 4, 5
+ // 0: about 189kbps (Experimental only)
+ // 1: about 137kbps (default)
+ // 2: about 75kbps
+ // 3: about 39kbps
+ // 4: about 26kbps
+ // 5: about 20kbps
+```
+
+#### ARM
+
+!> The bitbang driver causes connection issues with bitbang WS2812 driver
+
+Along with the generic options above, you must also turn on the `PAL_USE_CALLBACKS` feature in your halconf.h.
+
+### USART Half-duplex
+Targeting STM32 boards where communication is offloaded to a USART hardware device. The advantage is that this provides fast and accurate timings. `SOFT_SERIAL_PIN` for this driver is the configured USART TX pin. **The TX pin must have appropriate pull-up resistors**. To configure it, add this to your rules.mk:
+
+```make
+SERIAL_DRIVER = usart
+```
+
+Configure the hardware via your config.h:
+```c
+#define SOFT_SERIAL_PIN B6 // USART TX pin
+#define SELECT_SOFT_SERIAL_SPEED 1 // or 0, 2, 3, 4, 5
+ // 0: about 460800 baud
+ // 1: about 230400 baud (default)
+ // 2: about 115200 baud
+ // 3: about 57600 baud
+ // 4: about 38400 baud
+ // 5: about 19200 baud
+#define SERIAL_USART_DRIVER SD1 // USART driver of TX pin. default: SD1
+#define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
+```
+
+You must also enable the ChibiOS `SERIAL` feature:
+* In your board's halconf.h: `#define HAL_USE_SERIAL TRUE`
+* In your board's mcuconf.h: `#define STM32_SERIAL_USE_USARTn TRUE` (where 'n' matches the peripheral number of your selected USART on the MCU)
+
+Do note that the configuration required is for the `SERIAL` peripheral, not the `UART` peripheral.
diff --git a/docs/support.md b/docs/support.md
index 79c1dbc1b5..938d9daf78 100644
--- a/docs/support.md
+++ b/docs/support.md
@@ -12,6 +12,6 @@ If you need help with something, the best place to get quick support is going to
The official QMK forum is [/r/olkb](https://reddit.com/r/olkb) on [reddit.com](https://reddit.com).
-## Github Issues
+## GitHub Issues
You can open an [issue on GitHub](https://github.com/qmk/qmk_firmware/issues). This is especially handy when your issue will require long-term discussion or debugging.
diff --git a/docs/tap_hold.md b/docs/tap_hold.md
index a0b648694b..2dc57f03c2 100644
--- a/docs/tap_hold.md
+++ b/docs/tap_hold.md
@@ -4,6 +4,38 @@ While Tap-Hold options are fantastic, they are not without their issues. We hav
These options let you modify the behavior of the Tap-Hold keys.
+## Tapping Term
+
+The crux of all of the following features is the tapping term setting. This determines what is a tap and what is a hold. And the exact timing for this to feel natural can vary from keyboard to keyboard, from switch to switch, and from key to key.
+
+You can set the global time for this by adding the following setting to your `config.h`:
+
+```c
+#define TAPPING_TERM 200
+```
+
+This setting is defined in milliseconds, and does default to 200ms. This is a good average for a majority of people.
+
+For more granular control of this feature, you can add the following to your `config.h`:
+```c
+#define TAPPING_TERM_PER_KEY
+```
+
+You can then add the following function to your keymap:
+
+```c
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case SFT_T(KC_SPC):
+ return TAPPING_TERM + 1250;
+ case LT(1, KC_GRV):
+ return 130;
+ default:
+ return TAPPING_TERM;
+}
+```
+
+
## Permissive Hold
As of [PR#1359](https://github.com/qmk/qmk_firmware/pull/1359/), there is a new `config.h` option:
@@ -27,6 +59,25 @@ Normally, if you do all this within the `TAPPING_TERM` (default: 200ms) this wil
?> If you have `Ignore Mod Tap Interrupt` enabled, as well, this will modify how both work. The regular key has the modifier added if the first key is released first or if both keys are held longer than the `TAPPING_TERM`.
+For more granular control of this feature, you can add the following to your `config.h`:
+
+```c
+#define PERMISSIVE_HOLD_PER_KEY
+```
+
+You can then add the following function to your keymap:
+
+```c
+bool get_permissive_hold(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case LT(1, KC_BSPC):
+ return true;
+ default:
+ return false;
+ }
+}
+```
+
## Ignore Mod Tap Interrupt
To enable this setting, add this to your `config.h`:
@@ -62,13 +113,13 @@ For more granular control of this feature, you can add the following to your `co
You can then add the following function to your keymap:
```c
-bool get_ignore_mod_tap_interrupt(uint16_t keycode) {
- switch (keycode) {
- case SFT_T(KC_SPC):
- return true;
- default:
- return false;
- }
+bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case SFT_T(KC_SPC):
+ return true;
+ default:
+ return false;
+ }
}
```
@@ -106,12 +157,12 @@ You can then add the following function to your keymap:
```c
bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record) {
- switch (keycode) {
- case LT(1, KC_BSPC):
- return true;
- default:
- return false;
- }
+ switch (keycode) {
+ case LT(1, KC_BSPC):
+ return true;
+ default:
+ return false;
+ }
}
```
@@ -126,3 +177,13 @@ To enable `retro tapping`, add the following to your `config.h`:
Holding and releasing a dual function key without pressing another key will result in nothing happening. With retro tapping enabled, releasing the key without pressing another will send the original keycode even if it is outside the tapping term.
For instance, holding and releasing `LT(2, KC_SPACE)` without hitting another key will result in nothing happening. With this enabled, it will send `KC_SPACE` instead.
+
+## Why do we include the key record for the per key functions?
+
+One thing that you may notice is that we include the key record for all of the "per key" functions, and may be wondering why we do that.
+
+Well, it's simply really: customization. But specifically, it depends on how your keyboard is wired up. For instance, if each row is actually using a row in the keyboard's matrix, then it may be simpler to use `if (record->event.row == 3)` instead of checking a whole bunch of keycodes. Which is especially good for those people using the Tap Hold type keys on the home row. So you could fine tune those to not interfere with your normal typing.
+
+## Why is there no `*_kb` or `*_user` functions?!
+
+Unlike many of the other functions here, there isn't a need (or even reason) to have a quantum or keyboard level function. Only user level functions are useful here, so no need to mark them as such.
diff --git a/docs/zh-cn/README.md b/docs/zh-cn/README.md
index bb7e0130f0..173af882da 100644
--- a/docs/zh-cn/README.md
+++ b/docs/zh-cn/README.md
@@ -13,7 +13,7 @@ QMK (*Quantum Mechanical Keyboard*) 是一个社区维护的开æºè½¯ä»¶ï¼ŒåŒ…æ‹
## 如何得到它
-如果你打算贡献布局, 键盘, 或者其他QMK特性, 一下是最简å•çš„方法:[从Github获得repo分支](https://github.com/qmk/qmk_firmware#fork-destination-box), 并克隆你的repo到本地进行编辑,推é€ï¼Œç„¶åŽä»Žä½ çš„分支打开 [Pull Request](https://github.com/qmk/qmk_firmware/pulls).
+如果你打算贡献布局, 键盘, 或者其他QMK特性, 一下是最简å•çš„方法:[从GitHub获得repo分支](https://github.com/qmk/qmk_firmware#fork-destination-box), 并克隆你的repo到本地进行编辑,推é€ï¼Œç„¶åŽä»Žä½ çš„分支打开 [Pull Request](https://github.com/qmk/qmk_firmware/pulls).
此外, 你也å¯ä»¥ç›´æŽ¥ä¸‹è½½ ([zip](https://github.com/qmk/qmk_firmware/zipball/master), [tar](https://github.com/qmk/qmk_firmware/tarball/master)), 或者从git克隆 (`git@github.com:qmk/qmk_firmware.git`), 或 https (`https://github.com/qmk/qmk_firmware.git`).
diff --git a/docs/zh-cn/_summary.md b/docs/zh-cn/_summary.md
index 201b83894d..cedcfbd525 100644
--- a/docs/zh-cn/_summary.md
+++ b/docs/zh-cn/_summary.md
@@ -14,7 +14,7 @@
* [QMK命令行工具](zh-cn/cli.md)
* [QMK命令行工具é…ç½®](zh-cn/cli_configuration.md)
* [å‘QMK贡献代ç ](zh-cn/contributing.md)
- * [如何使用Github](zh-cn/getting_started_github.md)
+ * [如何使用GitHub](zh-cn/getting_started_github.md)
* [获得帮助](zh-cn/getting_started_getting_help.md)
* [éžå…¼å®¹æ€§ä¿®æ”¹](zh-cn/breaking_changes.md)
diff --git a/docs/zh-cn/custom_quantum_functions.md b/docs/zh-cn/custom_quantum_functions.md
index f2c6098dcb..95b2084dbf 100644
--- a/docs/zh-cn/custom_quantum_functions.md
+++ b/docs/zh-cn/custom_quantum_functions.md
@@ -57,7 +57,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case KC_ENTER:
// 当按下回车时播放音符
if (record->event.pressed) {
- PLAY_NOTE_ARRAY(tone_qwerty);
+ PLAY_SONG(tone_qwerty);
}
return true; // 让QMK触å‘回车按下/释放事件
default:
@@ -413,7 +413,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case KC_ENTER:
// 在按下回车时播放音符
if (record->event.pressed) {
- PLAY_NOTE_ARRAY(tone_qwerty);
+ PLAY_SONG(tone_qwerty);
}
return true; // 让QMK产生回车按下/释放事件
case RGB_LYR: // 本å¥è®©underglow作为层指示,或正常使用。
@@ -473,7 +473,7 @@ void eeconfig_init_user(void) { // EEPROM正被é‡ç½®
想è¦ä¿®æ”¹åŸºäºŽé”®ç çš„`TAPPING TERM`,ä½ è¦å‘`keymap.c`文件添加如下代ç :
```c
-uint16_t get_tapping_term(uint16_t keycode) {
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case SFT_T(KC_SPC):
return TAPPING_TERM + 1250;
diff --git a/docs/zh-cn/getting_started_getting_help.md b/docs/zh-cn/getting_started_getting_help.md
index cf770a7708..8c0ebaa243 100644
--- a/docs/zh-cn/getting_started_getting_help.md
+++ b/docs/zh-cn/getting_started_getting_help.md
@@ -10,6 +10,6 @@
QMK的官方论å›æ˜¯[/r/olkb](https://reddit.com/r/olkb) 在[reddit.com](https://reddit.com)上.
-## Githubçš„Issue
+## GitHubçš„Issue
ä½ å¯ä»¥åœ¨GitHub上 [æ出issue](https://github.com/qmk/qmk_firmware/issues).当您的问题需è¦é•¿æœŸè®¨è®ºæˆ–调试时,这尤其方便。
diff --git a/docs/zh-cn/getting_started_github.md b/docs/zh-cn/getting_started_github.md
index 2b2f7a75c5..9a01e43b7f 100644
--- a/docs/zh-cn/getting_started_github.md
+++ b/docs/zh-cn/getting_started_github.md
@@ -1,16 +1,16 @@
-# 如何在QMK中使用Github
+# 如何在QMK中使用GitHub
-Github can be a little tricky to those that aren't familiar with it - this guide will walk through each step of forking, cloning, and submitting a pull request with QMK.
+GitHub can be a little tricky to those that aren't familiar with it - this guide will walk through each step of forking, cloning, and submitting a pull request with QMK.
?> 本教程å‡è®¾æ‚¨å·²å®‰è£…GitHub,并且您喜欢使用命令行工作。
-首先 [Github上的QMK页é¢](https://github.com/qmk/qmk_firmware), 您能看到å³ä¸Šæ–¹æœ‰ä¸ªæŒ‰é’®å†™ç€"Fork":
+首先 [GitHub上的QMK页é¢](https://github.com/qmk/qmk_firmware), 您能看到å³ä¸Šæ–¹æœ‰ä¸ªæŒ‰é’®å†™ç€"Fork":
-![从Github上分å‰](http://i.imgur.com/8Toomz4.jpg)
+![从GitHub上分å‰](http://i.imgur.com/8Toomz4.jpg)
如果你是æŸç»„织æˆå‘˜ï¼Œä½ å°†éœ€è¦é€‰æ‹©åˆ†å‰åˆ°å“ªä¸ªè´¦æˆ·ã€‚一般情况下, 你是想è¦åˆ†å‰åˆ°ä½ çš„ç§äººè´¦æˆ·ä¸‹ã€‚当你完æˆåˆ†å‰ (有时需è¦ç­‰ä¸€ä¼š), 点击"Clone or Download" 按钮:
-!从Github下载](http://i.imgur.com/N1NYcSz.jpg)
+!从GitHub下载](http://i.imgur.com/N1NYcSz.jpg)
ä½ è¦é€‰æ‹© "HTTPS", 然åŽé€‰æ‹©é“¾æŽ¥å¤åˆ¶:
@@ -54,7 +54,7 @@ To https://github.com/whoeveryouare/qmk_firmware.git
+ 20043e64...7da94ac5 master -> master
```
-现在你的改动已ç»åœ¨ä½ Github上的分支中了 - 如果你回到这 (`https://github.com/ä½ çš„GitHub账户å/qmk_firmware`) ,ä½ å¯ä»¥ç‚¹å‡»ä¸‹æ–¹æ‰€ç¤ºæŒ‰é’®åˆ›å»º "New Pull Request":
+现在你的改动已ç»åœ¨ä½ GitHub上的分支中了 - 如果你回到这 (`https://github.com/ä½ çš„GitHub账户å/qmk_firmware`) ,ä½ å¯ä»¥ç‚¹å‡»ä¸‹æ–¹æ‰€ç¤ºæŒ‰é’®åˆ›å»º "New Pull Request":
![æ–°çš„ Pull Request](http://i.imgur.com/DxMHpJ8.jpg)
diff --git a/docs/zh-cn/newbs_building_firmware.md b/docs/zh-cn/newbs_building_firmware.md
index 31093f2543..fc43583c2b 100644
--- a/docs/zh-cn/newbs_building_firmware.md
+++ b/docs/zh-cn/newbs_building_firmware.md
@@ -20,7 +20,7 @@
## 创建`default` 布局副本
-打开`keymaps`文件夹åŽï¼Œæ‚¨å°†éœ€è¦åˆ›å»º`default`文件夹的副本。我们强烈建议您将文件夹命å为与Github用户å相åŒçš„å称,但您也å¯ä»¥ä½¿ç”¨ä»»ä½•æ‚¨æƒ³ä½¿ç”¨çš„å称,åªè¦å®ƒåªåŒ…å«å°å†™å­—æ¯ã€æ•°å­—和下划线字符。
+打开`keymaps`文件夹åŽï¼Œæ‚¨å°†éœ€è¦åˆ›å»º`default`文件夹的副本。我们强烈建议您将文件夹命å为与GitHub用户å相åŒçš„å称,但您也å¯ä»¥ä½¿ç”¨ä»»ä½•æ‚¨æƒ³ä½¿ç”¨çš„å称,åªè¦å®ƒåªåŒ…å«å°å†™å­—æ¯ã€æ•°å­—和下划线字符。
è¦è‡ªåŠ¨æ‰§è¡Œæ­¤è¿‡ç¨‹ï¼Œæ‚¨è¿˜å¯ä»¥é€‰æ‹©è¿è¡Œ`new_keymap.sh`脚本。
diff --git a/doxygen-todo b/doxygen-todo
index 6483b47c61..39fb498d97 100644
--- a/doxygen-todo
+++ b/doxygen-todo
@@ -1,5 +1,4 @@
tmk_core/protocol
-tmk_core/protocol/bluefruit
tmk_core/protocol/chibios
tmk_core/protocol/iwrap
tmk_core/protocol/lufa
diff --git a/drivers/avr/apa102.c b/drivers/avr/apa102.c
index b174b39b8f..740acb5739 100644
--- a/drivers/avr/apa102.c
+++ b/drivers/avr/apa102.c
@@ -2,7 +2,7 @@
* APA102 lib V1.0a
*
* Controls APA102 RGB-LEDs
- * Author: Mikkel (Duckle29 on github)
+ * Author: Mikkel (Duckle29 on GitHub)
*
* Dec 22th, 2017 v1.0a Initial Version
*
diff --git a/drivers/avr/i2c_master.c b/drivers/avr/i2c_master.c
index c084d5754f..b1e4885298 100644
--- a/drivers/avr/i2c_master.c
+++ b/drivers/avr/i2c_master.c
@@ -14,7 +14,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/* Library made by: g4lvanix
- * Github repository: https://github.com/g4lvanix/I2C-master-lib
+ * GitHub repository: https://github.com/g4lvanix/I2C-master-lib
*/
#include <avr/io.h>
diff --git a/drivers/avr/i2c_master.h b/drivers/avr/i2c_master.h
index 0a3b6c508c..4a35867cd0 100644
--- a/drivers/avr/i2c_master.h
+++ b/drivers/avr/i2c_master.h
@@ -14,7 +14,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/* Library made by: g4lvanix
- * Github repository: https://github.com/g4lvanix/I2C-master-lib
+ * GitHub repository: https://github.com/g4lvanix/I2C-master-lib
*/
#ifndef I2C_MASTER_H
diff --git a/drivers/avr/i2c_slave.c b/drivers/avr/i2c_slave.c
index 3fb684f70a..62a378165a 100644
--- a/drivers/avr/i2c_slave.c
+++ b/drivers/avr/i2c_slave.c
@@ -14,7 +14,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/* Library made by: g4lvanix
- * Github repository: https://github.com/g4lvanix/I2C-slave-lib
+ * GitHub repository: https://github.com/g4lvanix/I2C-slave-lib
*/
#include <avr/io.h>
diff --git a/drivers/avr/i2c_slave.h b/drivers/avr/i2c_slave.h
index 5ed0b11a8e..5d92150e65 100644
--- a/drivers/avr/i2c_slave.h
+++ b/drivers/avr/i2c_slave.h
@@ -14,7 +14,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/* Library made by: g4lvanix
- * Github repository: https://github.com/g4lvanix/I2C-slave-lib
+ * GitHub repository: https://github.com/g4lvanix/I2C-slave-lib
Info: Inititate the library by giving the required address.
Read or write to the necessary buffer according to the opperation.
diff --git a/drivers/chibios/serial.c b/drivers/chibios/serial.c
new file mode 100644
index 0000000000..26c6806532
--- /dev/null
+++ b/drivers/chibios/serial.c
@@ -0,0 +1,290 @@
+/*
+ * WARNING: be careful changing this code, it is very timing dependent
+ */
+
+#include "quantum.h"
+#include "serial.h"
+#include "wait.h"
+
+#include "hal.h"
+
+// TODO: resolve/remove build warnings
+#if defined(RGBLIGHT_ENABLE) && defined(RGBLED_SPLIT) && defined(PROTOCOL_CHIBIOS) && defined(WS2812_DRIVER_BITBANG)
+# warning "RGBLED_SPLIT not supported with bitbang WS2812 driver"
+#endif
+
+// default wait implementation cannot be called within interrupt
+// this method seems to be more accurate than GPT timers
+#if PORT_SUPPORTS_RT == FALSE
+# error "chSysPolledDelayX method not supported on this platform"
+#else
+# undef wait_us
+# define wait_us(x) chSysPolledDelayX(US2RTC(STM32_SYSCLK, x))
+#endif
+
+#ifndef SELECT_SOFT_SERIAL_SPEED
+# define SELECT_SOFT_SERIAL_SPEED 1
+// TODO: correct speeds...
+// 0: about 189kbps (Experimental only)
+// 1: about 137kbps (default)
+// 2: about 75kbps
+// 3: about 39kbps
+// 4: about 26kbps
+// 5: about 20kbps
+#endif
+
+// Serial pulse period in microseconds. At the moment, going lower than 12 causes communication failure
+#if SELECT_SOFT_SERIAL_SPEED == 0
+# define SERIAL_DELAY 12
+#elif SELECT_SOFT_SERIAL_SPEED == 1
+# define SERIAL_DELAY 16
+#elif SELECT_SOFT_SERIAL_SPEED == 2
+# define SERIAL_DELAY 24
+#elif SELECT_SOFT_SERIAL_SPEED == 3
+# define SERIAL_DELAY 32
+#elif SELECT_SOFT_SERIAL_SPEED == 4
+# define SERIAL_DELAY 48
+#elif SELECT_SOFT_SERIAL_SPEED == 5
+# define SERIAL_DELAY 64
+#else
+# error invalid SELECT_SOFT_SERIAL_SPEED value
+#endif
+
+inline static void serial_delay(void) { wait_us(SERIAL_DELAY); }
+inline static void serial_delay_half(void) { wait_us(SERIAL_DELAY / 2); }
+inline static void serial_delay_blip(void) { wait_us(1); }
+inline static void serial_output(void) { setPinOutput(SOFT_SERIAL_PIN); }
+inline static void serial_input(void) { setPinInputHigh(SOFT_SERIAL_PIN); }
+inline static bool serial_read_pin(void) { return !!readPin(SOFT_SERIAL_PIN); }
+inline static void serial_low(void) { writePinLow(SOFT_SERIAL_PIN); }
+inline static void serial_high(void) { writePinHigh(SOFT_SERIAL_PIN); }
+
+void interrupt_handler(void *arg);
+
+// Use thread + palWaitLineTimeout instead of palSetLineCallback
+// - Methods like setPinOutput and palEnableLineEvent/palDisableLineEvent
+// cause the interrupt to lock up, which would limit to only receiving data...
+static THD_WORKING_AREA(waThread1, 128);
+static THD_FUNCTION(Thread1, arg) {
+ (void)arg;
+ chRegSetThreadName("blinker");
+ while (true) {
+ palWaitLineTimeout(SOFT_SERIAL_PIN, TIME_INFINITE);
+ interrupt_handler(NULL);
+ }
+}
+
+static SSTD_t *Transaction_table = NULL;
+static uint8_t Transaction_table_size = 0;
+
+void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size) {
+ Transaction_table = sstd_table;
+ Transaction_table_size = (uint8_t)sstd_table_size;
+
+ serial_output();
+ serial_high();
+}
+
+void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size) {
+ Transaction_table = sstd_table;
+ Transaction_table_size = (uint8_t)sstd_table_size;
+
+ serial_input();
+
+ palEnablePadEvent(PAL_PORT(SOFT_SERIAL_PIN), PAL_PAD(SOFT_SERIAL_PIN), PAL_EVENT_MODE_FALLING_EDGE);
+ chThdCreateStatic(waThread1, sizeof(waThread1), HIGHPRIO, Thread1, NULL);
+}
+
+// Used by the master to synchronize timing with the slave.
+static void __attribute__((noinline)) sync_recv(void) {
+ serial_input();
+ // This shouldn't hang if the slave disconnects because the
+ // serial line will float to high if the slave does disconnect.
+ while (!serial_read_pin()) {
+ }
+
+ serial_delay();
+}
+
+// Used by the slave to send a synchronization signal to the master.
+static void __attribute__((noinline)) sync_send(void) {
+ serial_output();
+
+ serial_low();
+ serial_delay();
+
+ serial_high();
+}
+
+// Reads a byte from the serial line
+static uint8_t __attribute__((noinline)) serial_read_byte(void) {
+ uint8_t byte = 0;
+ serial_input();
+ for (uint8_t i = 0; i < 8; ++i) {
+ byte = (byte << 1) | serial_read_pin();
+ serial_delay();
+ }
+
+ return byte;
+}
+
+// Sends a byte with MSB ordering
+static void __attribute__((noinline)) serial_write_byte(uint8_t data) {
+ uint8_t b = 8;
+ serial_output();
+ while (b--) {
+ if (data & (1 << b)) {
+ serial_high();
+ } else {
+ serial_low();
+ }
+ serial_delay();
+ }
+}
+
+// interrupt handle to be used by the slave device
+void interrupt_handler(void *arg) {
+ chSysLockFromISR();
+
+ sync_send();
+
+ // read mid pulses
+ serial_delay_blip();
+
+ uint8_t checksum_computed = 0;
+ int sstd_index = 0;
+
+#ifdef SERIAL_USE_MULTI_TRANSACTION
+ sstd_index = serial_read_byte();
+ sync_send();
+#endif
+
+ SSTD_t *trans = &Transaction_table[sstd_index];
+ for (int i = 0; i < trans->initiator2target_buffer_size; ++i) {
+ trans->initiator2target_buffer[i] = serial_read_byte();
+ sync_send();
+ checksum_computed += trans->initiator2target_buffer[i];
+ }
+ checksum_computed ^= 7;
+ uint8_t checksum_received = serial_read_byte();
+ sync_send();
+
+ // wait for the sync to finish sending
+ serial_delay();
+
+ uint8_t checksum = 0;
+ for (int i = 0; i < trans->target2initiator_buffer_size; ++i) {
+ serial_write_byte(trans->target2initiator_buffer[i]);
+ sync_send();
+ serial_delay_half();
+ checksum += trans->target2initiator_buffer[i];
+ }
+ serial_write_byte(checksum ^ 7);
+ sync_send();
+
+ // wait for the sync to finish sending
+ serial_delay();
+
+ *trans->status = (checksum_computed == checksum_received) ? TRANSACTION_ACCEPTED : TRANSACTION_DATA_ERROR;
+
+ // end transaction
+ serial_input();
+
+ // TODO: remove extra delay between transactions
+ serial_delay();
+
+ chSysUnlockFromISR();
+}
+
+/////////
+// start transaction by initiator
+//
+// int soft_serial_transaction(int sstd_index)
+//
+// Returns:
+// TRANSACTION_END
+// TRANSACTION_NO_RESPONSE
+// TRANSACTION_DATA_ERROR
+// this code is very time dependent, so we need to disable interrupts
+#ifndef SERIAL_USE_MULTI_TRANSACTION
+int soft_serial_transaction(void) {
+ int sstd_index = 0;
+#else
+int soft_serial_transaction(int sstd_index) {
+#endif
+
+ if (sstd_index > Transaction_table_size) return TRANSACTION_TYPE_ERROR;
+ SSTD_t *trans = &Transaction_table[sstd_index];
+
+ // TODO: remove extra delay between transactions
+ serial_delay();
+
+ // this code is very time dependent, so we need to disable interrupts
+ chSysLock();
+
+ // signal to the slave that we want to start a transaction
+ serial_output();
+ serial_low();
+ serial_delay_blip();
+
+ // wait for the slaves response
+ serial_input();
+ serial_high();
+ serial_delay();
+
+ // check if the slave is present
+ if (serial_read_pin()) {
+ // slave failed to pull the line low, assume not present
+ dprintf("serial::NO_RESPONSE\n");
+ chSysUnlock();
+ return TRANSACTION_NO_RESPONSE;
+ }
+
+ // if the slave is present syncronize with it
+
+ uint8_t checksum = 0;
+ // send data to the slave
+#ifdef SERIAL_USE_MULTI_TRANSACTION
+ serial_write_byte(sstd_index); // first chunk is transaction id
+ sync_recv();
+#endif
+ for (int i = 0; i < trans->initiator2target_buffer_size; ++i) {
+ serial_write_byte(trans->initiator2target_buffer[i]);
+ sync_recv();
+ checksum += trans->initiator2target_buffer[i];
+ }
+ serial_write_byte(checksum ^ 7);
+ sync_recv();
+
+ serial_delay();
+ serial_delay(); // read mid pulses
+
+ // receive data from the slave
+ uint8_t checksum_computed = 0;
+ for (int i = 0; i < trans->target2initiator_buffer_size; ++i) {
+ trans->target2initiator_buffer[i] = serial_read_byte();
+ sync_recv();
+ checksum_computed += trans->target2initiator_buffer[i];
+ }
+ checksum_computed ^= 7;
+ uint8_t checksum_received = serial_read_byte();
+
+ sync_recv();
+ serial_delay();
+
+ if ((checksum_computed) != (checksum_received)) {
+ dprintf("serial::FAIL[%u,%u,%u]\n", checksum_computed, checksum_received, sstd_index);
+ serial_output();
+ serial_high();
+
+ chSysUnlock();
+ return TRANSACTION_DATA_ERROR;
+ }
+
+ // always, release the line when not in use
+ serial_high();
+ serial_output();
+
+ chSysUnlock();
+ return TRANSACTION_END;
+}
diff --git a/drivers/chibios/serial.h b/drivers/chibios/serial.h
new file mode 100644
index 0000000000..0c1857d52e
--- /dev/null
+++ b/drivers/chibios/serial.h
@@ -0,0 +1,62 @@
+#pragma once
+
+#include <stdbool.h>
+
+// /////////////////////////////////////////////////////////////////
+// Need Soft Serial defines in config.h
+// /////////////////////////////////////////////////////////////////
+// ex.
+// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6
+// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5
+// // 1: about 137kbps (default)
+// // 2: about 75kbps
+// // 3: about 39kbps
+// // 4: about 26kbps
+// // 5: about 20kbps
+//
+// //// USE simple API (using signle-type transaction function)
+// /* nothing */
+// //// USE flexible API (using multi-type transaction function)
+// #define SERIAL_USE_MULTI_TRANSACTION
+//
+// /////////////////////////////////////////////////////////////////
+
+// Soft Serial Transaction Descriptor
+typedef struct _SSTD_t {
+ uint8_t *status;
+ uint8_t initiator2target_buffer_size;
+ uint8_t *initiator2target_buffer;
+ uint8_t target2initiator_buffer_size;
+ uint8_t *target2initiator_buffer;
+} SSTD_t;
+#define TID_LIMIT(table) (sizeof(table) / sizeof(SSTD_t))
+
+// initiator is transaction start side
+void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size);
+// target is interrupt accept side
+void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size);
+
+// initiator result
+#define TRANSACTION_END 0
+#define TRANSACTION_NO_RESPONSE 0x1
+#define TRANSACTION_DATA_ERROR 0x2
+#define TRANSACTION_TYPE_ERROR 0x4
+#ifndef SERIAL_USE_MULTI_TRANSACTION
+int soft_serial_transaction(void);
+#else
+int soft_serial_transaction(int sstd_index);
+#endif
+
+// target status
+// *SSTD_t.status has
+// initiator:
+// TRANSACTION_END
+// or TRANSACTION_NO_RESPONSE
+// or TRANSACTION_DATA_ERROR
+// target:
+// TRANSACTION_DATA_ERROR
+// or TRANSACTION_ACCEPTED
+#define TRANSACTION_ACCEPTED 0x8
+#ifdef SERIAL_USE_MULTI_TRANSACTION
+int soft_serial_get_and_clean_status(int sstd_index);
+#endif
diff --git a/drivers/chibios/serial_usart.c b/drivers/chibios/serial_usart.c
new file mode 100644
index 0000000000..62b4913cbf
--- /dev/null
+++ b/drivers/chibios/serial_usart.c
@@ -0,0 +1,234 @@
+#include "quantum.h"
+#include "serial.h"
+#include "printf.h"
+
+#include "ch.h"
+#include "hal.h"
+
+#ifndef USART_CR1_M0
+# define USART_CR1_M0 USART_CR1_M // some platforms (f1xx) dont have this so
+#endif
+
+#ifndef USE_GPIOV1
+// The default PAL alternate modes are used to signal that the pins are used for USART
+# ifndef SERIAL_USART_TX_PAL_MODE
+# define SERIAL_USART_TX_PAL_MODE 7
+# endif
+#endif
+
+#ifndef SERIAL_USART_DRIVER
+# define SERIAL_USART_DRIVER SD1
+#endif
+
+#ifndef SERIAL_USART_CR1
+# define SERIAL_USART_CR1 (USART_CR1_PCE | USART_CR1_PS | USART_CR1_M0) // parity enable, odd parity, 9 bit length
+#endif
+
+#ifndef SERIAL_USART_CR2
+# define SERIAL_USART_CR2 (USART_CR2_STOP_1) // 2 stop bits
+#endif
+
+#ifndef SERIAL_USART_CR3
+# define SERIAL_USART_CR3 0
+#endif
+
+#ifdef SOFT_SERIAL_PIN
+# define SERIAL_USART_TX_PIN SOFT_SERIAL_PIN
+#endif
+
+#ifndef SELECT_SOFT_SERIAL_SPEED
+# define SELECT_SOFT_SERIAL_SPEED 1
+#endif
+
+#ifdef SERIAL_USART_SPEED
+// Allow advanced users to directly set SERIAL_USART_SPEED
+#elif SELECT_SOFT_SERIAL_SPEED == 0
+# define SERIAL_USART_SPEED 460800
+#elif SELECT_SOFT_SERIAL_SPEED == 1
+# define SERIAL_USART_SPEED 230400
+#elif SELECT_SOFT_SERIAL_SPEED == 2
+# define SERIAL_USART_SPEED 115200
+#elif SELECT_SOFT_SERIAL_SPEED == 3
+# define SERIAL_USART_SPEED 57600
+#elif SELECT_SOFT_SERIAL_SPEED == 4
+# define SERIAL_USART_SPEED 38400
+#elif SELECT_SOFT_SERIAL_SPEED == 5
+# define SERIAL_USART_SPEED 19200
+#else
+# error invalid SELECT_SOFT_SERIAL_SPEED value
+#endif
+
+#define TIMEOUT 100
+#define HANDSHAKE_MAGIC 7
+
+static inline msg_t sdWriteHalfDuplex(SerialDriver* driver, uint8_t* data, uint8_t size) {
+ msg_t ret = sdWrite(driver, data, size);
+
+ // Half duplex requires us to read back the data we just wrote - just throw it away
+ uint8_t dump[size];
+ sdRead(driver, dump, size);
+
+ return ret;
+}
+#undef sdWrite
+#define sdWrite sdWriteHalfDuplex
+
+static inline msg_t sdWriteTimeoutHalfDuplex(SerialDriver* driver, uint8_t* data, uint8_t size, uint32_t timeout) {
+ msg_t ret = sdWriteTimeout(driver, data, size, timeout);
+
+ // Half duplex requires us to read back the data we just wrote - just throw it away
+ uint8_t dump[size];
+ sdReadTimeout(driver, dump, size, timeout);
+
+ return ret;
+}
+#undef sdWriteTimeout
+#define sdWriteTimeout sdWriteTimeoutHalfDuplex
+
+static inline void sdClear(SerialDriver* driver) {
+ while (sdGetTimeout(driver, TIME_IMMEDIATE) != MSG_TIMEOUT) {
+ // Do nothing with the data
+ }
+}
+
+static SerialConfig sdcfg = {
+ (SERIAL_USART_SPEED), // speed - mandatory
+ (SERIAL_USART_CR1), // CR1
+ (SERIAL_USART_CR2), // CR2
+ (SERIAL_USART_CR3) // CR3
+};
+
+void handle_soft_serial_slave(void);
+
+/*
+ * This thread runs on the slave and responds to transactions initiated
+ * by the master
+ */
+static THD_WORKING_AREA(waSlaveThread, 2048);
+static THD_FUNCTION(SlaveThread, arg) {
+ (void)arg;
+ chRegSetThreadName("slave_transport");
+
+ while (true) {
+ handle_soft_serial_slave();
+ }
+}
+
+__attribute__((weak)) void usart_init(void) {
+#if defined(USE_GPIOV1)
+ palSetLineMode(SERIAL_USART_TX_PIN, PAL_MODE_STM32_ALTERNATE_OPENDRAIN);
+#else
+ palSetLineMode(SERIAL_USART_TX_PIN, PAL_MODE_ALTERNATE(SERIAL_USART_TX_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
+#endif
+}
+
+void usart_master_init(void) {
+ usart_init();
+
+ sdcfg.cr3 |= USART_CR3_HDSEL;
+ sdStart(&SERIAL_USART_DRIVER, &sdcfg);
+}
+
+void usart_slave_init(void) {
+ usart_init();
+
+ sdcfg.cr3 |= USART_CR3_HDSEL;
+ sdStart(&SERIAL_USART_DRIVER, &sdcfg);
+
+ // Start transport thread
+ chThdCreateStatic(waSlaveThread, sizeof(waSlaveThread), HIGHPRIO, SlaveThread, NULL);
+}
+
+static SSTD_t* Transaction_table = NULL;
+static uint8_t Transaction_table_size = 0;
+
+void soft_serial_initiator_init(SSTD_t* sstd_table, int sstd_table_size) {
+ Transaction_table = sstd_table;
+ Transaction_table_size = (uint8_t)sstd_table_size;
+
+ usart_master_init();
+}
+
+void soft_serial_target_init(SSTD_t* sstd_table, int sstd_table_size) {
+ Transaction_table = sstd_table;
+ Transaction_table_size = (uint8_t)sstd_table_size;
+
+ usart_slave_init();
+}
+
+void handle_soft_serial_slave(void) {
+ uint8_t sstd_index = sdGet(&SERIAL_USART_DRIVER); // first chunk is always transaction id
+ SSTD_t* trans = &Transaction_table[sstd_index];
+
+ // Always write back the sstd_index as part of a basic handshake
+ sstd_index ^= HANDSHAKE_MAGIC;
+ sdWrite(&SERIAL_USART_DRIVER, &sstd_index, sizeof(sstd_index));
+
+ if (trans->initiator2target_buffer_size) {
+ sdRead(&SERIAL_USART_DRIVER, trans->initiator2target_buffer, trans->initiator2target_buffer_size);
+ }
+
+ if (trans->target2initiator_buffer_size) {
+ sdWrite(&SERIAL_USART_DRIVER, trans->target2initiator_buffer, trans->target2initiator_buffer_size);
+ }
+
+ if (trans->status) {
+ *trans->status = TRANSACTION_ACCEPTED;
+ }
+}
+
+/////////
+// start transaction by initiator
+//
+// int soft_serial_transaction(int sstd_index)
+//
+// Returns:
+// TRANSACTION_END
+// TRANSACTION_NO_RESPONSE
+// TRANSACTION_DATA_ERROR
+#ifndef SERIAL_USE_MULTI_TRANSACTION
+int soft_serial_transaction(void) {
+ uint8_t sstd_index = 0;
+#else
+int soft_serial_transaction(int index) {
+ uint8_t sstd_index = index;
+#endif
+
+ if (sstd_index > Transaction_table_size) return TRANSACTION_TYPE_ERROR;
+ SSTD_t* trans = &Transaction_table[sstd_index];
+ msg_t res = 0;
+
+ sdClear(&SERIAL_USART_DRIVER);
+
+ // First chunk is always transaction id
+ sdWriteTimeout(&SERIAL_USART_DRIVER, &sstd_index, sizeof(sstd_index), TIME_MS2I(TIMEOUT));
+
+ uint8_t sstd_index_shake = 0xFF;
+
+ // Which we always read back first so that we can error out correctly
+ // - due to the half duplex limitations on return codes, we always have to read *something*
+ // - without the read, write only transactions *always* succeed, even during the boot process where the slave is not ready
+ res = sdReadTimeout(&SERIAL_USART_DRIVER, &sstd_index_shake, sizeof(sstd_index_shake), TIME_MS2I(TIMEOUT));
+ if (res < 0 || (sstd_index_shake != (sstd_index ^ HANDSHAKE_MAGIC))) {
+ dprintf("serial::usart_shake NO_RESPONSE\n");
+ return TRANSACTION_NO_RESPONSE;
+ }
+
+ if (trans->initiator2target_buffer_size) {
+ res = sdWriteTimeout(&SERIAL_USART_DRIVER, trans->initiator2target_buffer, trans->initiator2target_buffer_size, TIME_MS2I(TIMEOUT));
+ if (res < 0) {
+ dprintf("serial::usart_transmit NO_RESPONSE\n");
+ return TRANSACTION_NO_RESPONSE;
+ }
+ }
+
+ if (trans->target2initiator_buffer_size) {
+ res = sdReadTimeout(&SERIAL_USART_DRIVER, trans->target2initiator_buffer, trans->target2initiator_buffer_size, TIME_MS2I(TIMEOUT));
+ if (res < 0) {
+ dprintf("serial::usart_receive NO_RESPONSE\n");
+ return TRANSACTION_NO_RESPONSE;
+ }
+ }
+
+ return TRANSACTION_END;
+}
diff --git a/drivers/eeprom/eeprom_driver.c b/drivers/eeprom/eeprom_driver.c
index 3835e5e9d0..6ce47faf7d 100644
--- a/drivers/eeprom/eeprom_driver.c
+++ b/drivers/eeprom/eeprom_driver.c
@@ -20,19 +20,19 @@
#include "eeprom_driver.h"
uint8_t eeprom_read_byte(const uint8_t *addr) {
- uint8_t ret;
+ uint8_t ret = 0;
eeprom_read_block(&ret, addr, 1);
return ret;
}
uint16_t eeprom_read_word(const uint16_t *addr) {
- uint16_t ret;
+ uint16_t ret = 0;
eeprom_read_block(&ret, addr, 2);
return ret;
}
uint32_t eeprom_read_dword(const uint32_t *addr) {
- uint32_t ret;
+ uint32_t ret = 0;
eeprom_read_block(&ret, addr, 4);
return ret;
}
diff --git a/drivers/eeprom/eeprom_i2c.c b/drivers/eeprom/eeprom_i2c.c
index 03dbc5e516..ca8af3da51 100644
--- a/drivers/eeprom/eeprom_i2c.c
+++ b/drivers/eeprom/eeprom_i2c.c
@@ -37,8 +37,9 @@
// #define DEBUG_EEPROM_OUTPUT
-#ifdef DEBUG_EEPROM_OUTPUT
-# include "print.h"
+#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
+# include "timer.h"
+# include "debug.h"
#endif // DEBUG_EEPROM_OUTPUT
static inline void init_i2c_if_required(void) {
@@ -50,7 +51,7 @@ static inline void init_i2c_if_required(void) {
}
static inline void fill_target_address(uint8_t *buffer, const void *addr) {
- intptr_t p = (intptr_t)addr;
+ uintptr_t p = (uintptr_t)addr;
for (int i = 0; i < EXTERNAL_EEPROM_ADDRESS_SIZE; ++i) {
buffer[EXTERNAL_EEPROM_ADDRESS_SIZE - 1 - i] = p & 0xFF;
p >>= 8;
@@ -60,11 +61,19 @@ static inline void fill_target_address(uint8_t *buffer, const void *addr) {
void eeprom_driver_init(void) {}
void eeprom_driver_erase(void) {
+#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
+ uint32_t start = timer_read32();
+#endif
+
uint8_t buf[EXTERNAL_EEPROM_PAGE_SIZE];
memset(buf, 0x00, EXTERNAL_EEPROM_PAGE_SIZE);
- for (intptr_t addr = 0; addr < EXTERNAL_EEPROM_BYTE_COUNT; addr += EXTERNAL_EEPROM_PAGE_SIZE) {
- eeprom_write_block(buf, (void *)addr, EXTERNAL_EEPROM_PAGE_SIZE);
+ for (uint32_t addr = 0; addr < EXTERNAL_EEPROM_BYTE_COUNT; addr += EXTERNAL_EEPROM_PAGE_SIZE) {
+ eeprom_write_block(buf, (void *)(uintptr_t)addr, EXTERNAL_EEPROM_PAGE_SIZE);
}
+
+#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
+ dprintf("EEPROM erase took %ldms to complete\n", ((long)(timer_read32() - start)));
+#endif
}
void eeprom_read_block(void *buf, const void *addr, size_t len) {
@@ -72,10 +81,10 @@ void eeprom_read_block(void *buf, const void *addr, size_t len) {
fill_target_address(complete_packet, addr);
init_i2c_if_required();
- i2c_transmit(EXTERNAL_EEPROM_I2C_ADDRESS((intptr_t)addr), complete_packet, EXTERNAL_EEPROM_ADDRESS_SIZE, 100);
- i2c_receive(EXTERNAL_EEPROM_I2C_ADDRESS((intptr_t)addr), buf, len, 100);
+ i2c_transmit(EXTERNAL_EEPROM_I2C_ADDRESS((uintptr_t)addr), complete_packet, EXTERNAL_EEPROM_ADDRESS_SIZE, 100);
+ i2c_receive(EXTERNAL_EEPROM_I2C_ADDRESS((uintptr_t)addr), buf, len, 100);
-#ifdef DEBUG_EEPROM_OUTPUT
+#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
dprintf("[EEPROM R] 0x%04X: ", ((int)addr));
for (size_t i = 0; i < len; ++i) {
dprintf(" %02X", (int)(((uint8_t *)buf)[i]));
@@ -85,14 +94,14 @@ void eeprom_read_block(void *buf, const void *addr, size_t len) {
}
void eeprom_write_block(const void *buf, void *addr, size_t len) {
- uint8_t complete_packet[EXTERNAL_EEPROM_ADDRESS_SIZE + EXTERNAL_EEPROM_PAGE_SIZE];
- uint8_t *read_buf = (uint8_t *)buf;
- intptr_t target_addr = (intptr_t)addr;
+ uint8_t complete_packet[EXTERNAL_EEPROM_ADDRESS_SIZE + EXTERNAL_EEPROM_PAGE_SIZE];
+ uint8_t * read_buf = (uint8_t *)buf;
+ uintptr_t target_addr = (uintptr_t)addr;
init_i2c_if_required();
while (len > 0) {
- intptr_t page_offset = target_addr % EXTERNAL_EEPROM_PAGE_SIZE;
- int write_length = EXTERNAL_EEPROM_PAGE_SIZE - page_offset;
+ uintptr_t page_offset = target_addr % EXTERNAL_EEPROM_PAGE_SIZE;
+ int write_length = EXTERNAL_EEPROM_PAGE_SIZE - page_offset;
if (write_length > len) {
write_length = len;
}
@@ -102,7 +111,7 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {
complete_packet[EXTERNAL_EEPROM_ADDRESS_SIZE + i] = read_buf[i];
}
-#ifdef DEBUG_EEPROM_OUTPUT
+#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
dprintf("[EEPROM W] 0x%04X: ", ((int)target_addr));
for (uint8_t i = 0; i < write_length; i++) {
dprintf(" %02X", (int)(read_buf[i]));
@@ -110,7 +119,7 @@ void eeprom_write_block(const void *buf, void *addr, size_t len) {
dprintf("\n");
#endif // DEBUG_EEPROM_OUTPUT
- i2c_transmit(EXTERNAL_EEPROM_I2C_ADDRESS((intptr_t)addr), complete_packet, EXTERNAL_EEPROM_ADDRESS_SIZE + write_length, 100);
+ i2c_transmit(EXTERNAL_EEPROM_I2C_ADDRESS((uintptr_t)addr), complete_packet, EXTERNAL_EEPROM_ADDRESS_SIZE + write_length, 100);
wait_ms(EXTERNAL_EEPROM_WRITE_TIME);
read_buf += write_length;
diff --git a/drivers/eeprom/eeprom_spi.c b/drivers/eeprom/eeprom_spi.c
new file mode 100644
index 0000000000..7b6416eafb
--- /dev/null
+++ b/drivers/eeprom/eeprom_spi.c
@@ -0,0 +1,232 @@
+/* Copyright 2020 Nick Brassel (tzarc)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdint.h>
+#include <string.h>
+
+/*
+ Note that the implementations of eeprom_XXXX_YYYY on AVR are normally
+ provided by avr-libc. The same functions are reimplemented below and are
+ rerouted to the external SPI equivalent.
+
+ Seemingly, as this is compiled from within QMK, the object file generated
+ during the build overrides the avr-libc implementation during the linking
+ stage.
+
+ On other platforms such as ARM, there are no provided implementations, so
+ there is nothing to override during linkage.
+*/
+
+#include "wait.h"
+#include "spi_master.h"
+#include "eeprom.h"
+#include "eeprom_spi.h"
+
+#define CMD_WREN 6
+#define CMD_WRDI 4
+#define CMD_RDSR 5
+#define CMD_WRSR 1
+#define CMD_READ 3
+#define CMD_WRITE 2
+
+#define SR_WIP 0x01
+
+// #define DEBUG_EEPROM_OUTPUT
+
+#ifndef EXTERNAL_EEPROM_SPI_TIMEOUT
+# define EXTERNAL_EEPROM_SPI_TIMEOUT 100
+#endif
+
+#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
+# include "timer.h"
+# include "debug.h"
+#endif // CONSOLE_ENABLE
+
+static void init_spi_if_required(void) {
+ static int done = 0;
+ if (!done) {
+ spi_init();
+ done = 1;
+ }
+}
+
+static bool spi_eeprom_start(void) { return spi_start(EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN, EXTERNAL_EEPROM_SPI_LSBFIRST, EXTERNAL_EEPROM_SPI_MODE, EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR); }
+
+static spi_status_t spi_eeprom_wait_while_busy(int timeout) {
+ uint32_t deadline = timer_read32() + timeout;
+ spi_status_t response;
+ do {
+ spi_write(CMD_RDSR);
+ response = spi_read();
+ if (timer_read32() >= deadline) {
+ return SPI_STATUS_TIMEOUT;
+ }
+ } while (response & SR_WIP);
+ return SPI_STATUS_SUCCESS;
+}
+
+static void spi_eeprom_transmit_address(uintptr_t addr) {
+ uint8_t buffer[EXTERNAL_EEPROM_ADDRESS_SIZE];
+
+ for (int i = 0; i < EXTERNAL_EEPROM_ADDRESS_SIZE; ++i) {
+ buffer[EXTERNAL_EEPROM_ADDRESS_SIZE - 1 - i] = addr & 0xFF;
+ addr >>= 8;
+ }
+
+ spi_transmit(buffer, EXTERNAL_EEPROM_ADDRESS_SIZE);
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+
+void eeprom_driver_init(void) {}
+
+void eeprom_driver_erase(void) {
+#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
+ uint32_t start = timer_read32();
+#endif
+
+ uint8_t buf[EXTERNAL_EEPROM_PAGE_SIZE];
+ memset(buf, 0x00, EXTERNAL_EEPROM_PAGE_SIZE);
+ for (uint32_t addr = 0; addr < EXTERNAL_EEPROM_BYTE_COUNT; addr += EXTERNAL_EEPROM_PAGE_SIZE) {
+ eeprom_write_block(buf, (void *)(uintptr_t)addr, EXTERNAL_EEPROM_PAGE_SIZE);
+ }
+
+#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
+ dprintf("EEPROM erase took %ldms to complete\n", ((long)(timer_read32() - start)));
+#endif
+}
+
+void eeprom_read_block(void *buf, const void *addr, size_t len) {
+ init_spi_if_required();
+
+ //-------------------------------------------------
+ // Wait for the write-in-progress bit to be cleared
+ bool res = spi_eeprom_start();
+ if (!res) {
+ dprint("failed to start SPI for WIP check\n");
+ memset(buf, 0, len);
+ return;
+ }
+
+ spi_status_t response = spi_eeprom_wait_while_busy(EXTERNAL_EEPROM_SPI_TIMEOUT);
+ spi_stop();
+ if (response == SPI_STATUS_TIMEOUT) {
+ dprint("SPI timeout for WIP check\n");
+ memset(buf, 0, len);
+ return;
+ }
+
+ //-------------------------------------------------
+ // Perform read
+ res = spi_eeprom_start();
+ if (!res) {
+ dprint("failed to start SPI for read\n");
+ memset(buf, 0, len);
+ return;
+ }
+
+ spi_write(CMD_READ);
+ spi_eeprom_transmit_address((uintptr_t)addr);
+ spi_receive(buf, len);
+
+#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
+ dprintf("[EEPROM R] 0x%08lX: ", ((uint32_t)(uintptr_t)addr));
+ for (size_t i = 0; i < len; ++i) {
+ dprintf(" %02X", (int)(((uint8_t *)buf)[i]));
+ }
+ dprintf("\n");
+#endif // DEBUG_EEPROM_OUTPUT
+
+ spi_stop();
+}
+
+void eeprom_write_block(const void *buf, void *addr, size_t len) {
+ init_spi_if_required();
+
+ bool res;
+ uint8_t * read_buf = (uint8_t *)buf;
+ uintptr_t target_addr = (uintptr_t)addr;
+
+ while (len > 0) {
+ uintptr_t page_offset = target_addr % EXTERNAL_EEPROM_PAGE_SIZE;
+ int write_length = EXTERNAL_EEPROM_PAGE_SIZE - page_offset;
+ if (write_length > len) {
+ write_length = len;
+ }
+
+ //-------------------------------------------------
+ // Wait for the write-in-progress bit to be cleared
+ res = spi_eeprom_start();
+ if (!res) {
+ dprint("failed to start SPI for WIP check\n");
+ return;
+ }
+
+ spi_status_t response = spi_eeprom_wait_while_busy(EXTERNAL_EEPROM_SPI_TIMEOUT);
+ spi_stop();
+ if (response == SPI_STATUS_TIMEOUT) {
+ dprint("SPI timeout for WIP check\n");
+ return;
+ }
+
+ //-------------------------------------------------
+ // Enable writes
+ res = spi_eeprom_start();
+ if (!res) {
+ dprint("failed to start SPI for write-enable\n");
+ return;
+ }
+
+ spi_write(CMD_WREN);
+ spi_stop();
+
+ //-------------------------------------------------
+ // Perform the write
+ res = spi_eeprom_start();
+ if (!res) {
+ dprint("failed to start SPI for write\n");
+ return;
+ }
+
+#if defined(CONSOLE_ENABLE) && defined(DEBUG_EEPROM_OUTPUT)
+ dprintf("[EEPROM W] 0x%08lX: ", ((uint32_t)(uintptr_t)target_addr));
+ for (size_t i = 0; i < write_length; i++) {
+ dprintf(" %02X", (int)(uint8_t)(read_buf[i]));
+ }
+ dprintf("\n");
+#endif // DEBUG_EEPROM_OUTPUT
+
+ spi_write(CMD_WRITE);
+ spi_eeprom_transmit_address(target_addr);
+ spi_transmit(read_buf, write_length);
+ spi_stop();
+
+ read_buf += write_length;
+ target_addr += write_length;
+ len -= write_length;
+ }
+
+ //-------------------------------------------------
+ // Disable writes
+ res = spi_eeprom_start();
+ if (!res) {
+ dprint("failed to start SPI for write-disable\n");
+ return;
+ }
+
+ spi_write(CMD_WRDI);
+ spi_stop();
+}
diff --git a/drivers/eeprom/eeprom_spi.h b/drivers/eeprom/eeprom_spi.h
new file mode 100644
index 0000000000..282c603565
--- /dev/null
+++ b/drivers/eeprom/eeprom_spi.h
@@ -0,0 +1,80 @@
+/* Copyright 2020 Nick Brassel (tzarc)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+/*
+ The slave select pin of the EEPROM.
+ This needs to be a normal GPIO pin_t value, such as A7.
+*/
+#ifndef EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN
+# error "No chip select pin defined -- missing EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN"
+#endif
+
+/*
+ The clock divisor for SPI to ensure that the MCU is within the
+ specifications of the EEPROM chip. Generally this will be PCLK divided by
+ the intended divisor -- check your clock settings and the datasheet of
+ your EEPROM.
+*/
+#ifndef EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR
+# ifdef __AVR__
+# define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR 8
+# else
+# define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR 64
+# endif
+#endif
+
+/*
+ The SPI mode to communicate with the EEPROM.
+*/
+#ifndef EXTERNAL_EEPROM_SPI_MODE
+# define EXTERNAL_EEPROM_SPI_MODE 0
+#endif
+
+/*
+ Whether or not the SPI communication between the MCU and EEPROM should be
+ LSB-first.
+*/
+#ifndef EXTERNAL_EEPROM_SPI_LSBFIRST
+# define EXTERNAL_EEPROM_SPI_LSBFIRST false
+#endif
+
+/*
+ The total size of the EEPROM, in bytes. The EEPROM datasheet will usually
+ specify this value in kbits, and will require conversion to bytes.
+*/
+#ifndef EXTERNAL_EEPROM_BYTE_COUNT
+# define EXTERNAL_EEPROM_BYTE_COUNT 8192
+#endif
+
+/*
+ The page size in bytes of the EEPROM, as specified in the datasheet.
+*/
+#ifndef EXTERNAL_EEPROM_PAGE_SIZE
+# define EXTERNAL_EEPROM_PAGE_SIZE 32
+#endif
+
+/*
+ The address size in bytes of the EEPROM. For EEPROMs with <=256 bytes, this
+ will likely be 1. For EEPROMs >256 and <=65536, this will be 2. For EEPROMs
+ >65536, this will likely need to be 4.
+
+ As expected, consult the datasheet for specifics of your EEPROM.
+*/
+#ifndef EXTERNAL_EEPROM_ADDRESS_SIZE
+# define EXTERNAL_EEPROM_ADDRESS_SIZE 2
+#endif
diff --git a/drivers/issi/is31fl3731.c b/drivers/issi/is31fl3731.c
index 9f006b8174..ef9e9162e2 100644
--- a/drivers/issi/is31fl3731.c
+++ b/drivers/issi/is31fl3731.c
@@ -64,7 +64,7 @@ uint8_t g_twi_transfer_buffer[20];
uint8_t g_pwm_buffer[DRIVER_COUNT][144];
bool g_pwm_buffer_update_required[DRIVER_COUNT] = {false};
-uint8_t g_led_control_registers[DRIVER_COUNT][18] = {{0}, {0}};
+uint8_t g_led_control_registers[DRIVER_COUNT][18] = {{0}};
bool g_led_control_registers_update_required[DRIVER_COUNT] = {false};
// This is the bit pattern in the LED control registers
diff --git a/drivers/oled/oled_driver.c b/drivers/oled/oled_driver.c
index ce5c23cc40..eedaedcd36 100644
--- a/drivers/oled/oled_driver.c
+++ b/drivers/oled/oled_driver.c
@@ -479,7 +479,7 @@ void oled_write_ln_P(const char *data, bool invert) {
void oled_write_raw_P(const char *data, uint16_t size) {
if (size > OLED_MATRIX_SIZE) size = OLED_MATRIX_SIZE;
for (uint16_t i = 0; i < size; i++) {
- uint8_t c = pgm_read_byte(++data);
+ uint8_t c = pgm_read_byte(data++);
if (oled_buffer[i] == c) continue;
oled_buffer[i] = c;
oled_dirty |= (1 << (i / OLED_BLOCK_SIZE));
diff --git a/keyboards/1upkeyboards/super16/keymaps/nblyumberg/config.h b/keyboards/1upkeyboards/super16/keymaps/nblyumberg/config.h
new file mode 100644
index 0000000000..3d03512888
--- /dev/null
+++ b/keyboards/1upkeyboards/super16/keymaps/nblyumberg/config.h
@@ -0,0 +1,13 @@
+#pragma once
+
+// Time out one shot layers after 3 seconds
+#define ONESHOT_TIMEOUT 3000
+
+#define RGBLED_NUM 16
+
+
+// Undef and redefine default brightness to half of 255
+#undef RGBLIGHT_LIMIT_VAL
+#define RGBLIGHT_LIMIT_VAL 128
+
+#define TAPPING_TERM 200
diff --git a/keyboards/1upkeyboards/super16/keymaps/nblyumberg/keymap.c b/keyboards/1upkeyboards/super16/keymaps/nblyumberg/keymap.c
new file mode 100644
index 0000000000..170d1ad8f1
--- /dev/null
+++ b/keyboards/1upkeyboards/super16/keymaps/nblyumberg/keymap.c
@@ -0,0 +1,127 @@
+#include QMK_KEYBOARD_H
+
+uint16_t copy_paste_timer;
+uint16_t enter_timer;
+
+extern rgblight_config_t rgblight_config;
+
+// Define custom keycodes
+enum my_keycodes {
+ KC_CCCV = SAFE_RANGE,
+ KC_2ENTER
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ //Layer 0 - Base Layer (F13 to F24, and One Shot Layer 1,2,3,4)
+ [0] = LAYOUT_ortho_4x4(
+ KC_F13, KC_F14, KC_F15, KC_F16,
+ KC_F17, KC_CCCV, KC_F19, KC_F20,
+ KC_F21, KC_F22, KC_F23, KC_2ENTER,
+ OSL(1), OSL(2), OSL(3), TG(4) //Transparent to let you go between layers
+ ),
+
+ [1] = LAYOUT_ortho_4x4(
+ LALT(KC_F13), LALT(KC_F14), LALT(KC_F15), LALT(KC_F16),
+ LALT(KC_F17), LALT(KC_F18), LALT(KC_F19), LALT(KC_F20),
+ LALT(KC_F21), LALT(KC_F22), LALT(KC_F23), LALT(KC_F24),
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS //Transparent to let you go between layers
+ ),
+
+ //Layer 2 - Shift + Function Key Layer
+ [2] = LAYOUT_ortho_4x4(
+ LSFT(KC_F13), LSFT(KC_F14), LSFT(KC_F15), LSFT(KC_F16),
+ LSFT(KC_F17), LSFT(KC_F18), LSFT(KC_F19), LSFT(KC_F20),
+ LSFT(KC_F21), LSFT(KC_F22), LSFT(KC_F23), LSFT(KC_F24),
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS //Transparent to let you go between layers
+ ),
+
+ //Layer 3 - Control + Function Key
+ [3] = LAYOUT_ortho_4x4(
+ LCTL(KC_F13), LCTL(KC_F14), LCTL(KC_F15), LCTL(KC_F16),
+ LCTL(KC_F17), LCTL(KC_F18), LCTL(KC_F19), LCTL(KC_F20),
+ LCTL(KC_F21), LCTL(KC_F22), LCTL(KC_F23), LCTL(KC_F24),
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS //Transparent to let you go between layers
+ ),
+
+ //Layer 4 - Keyboard Lights. Programming and Special Functions
+ [4] = LAYOUT_ortho_4x4(
+ KC_MPRV, KC_MPLY, KC_MNXT, KC_VOLU,
+ RGB_TOG, RGB_MOD, RGB_RMOD, KC_MUTE,
+ TO(0), RESET, EEP_RST, KC_VOLD,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS //Transparent to let you go between layers
+ ),
+};
+
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ 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));
+ }
+ } return true;
+ case KC_2ENTER:
+ if (record->event.pressed) {
+ enter_timer = timer_read();
+ } else {
+ if (timer_elapsed(enter_timer) > TAPPING_TERM) { // Hold, shift+enter
+ tap_code16(LSFT(KC_ENTER));
+ } else { // Tap, enter
+ tap_code16(KC_F24);
+ }
+ }
+ return true;
+ default:
+ return true;
+ }
+}
+
+
+void keyboard_post_init_user(void) {
+ //Enable the LED layers
+ layer_state_set_user(layer_state);
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ rgblight_sethsv_noeeprom(HSV_WHITE);
+ switch(get_highest_layer(state)) {
+ case 1:
+ // Green
+ rgblight_enable_noeeprom();
+ rgblight_sethsv_noeeprom(HSV_GREEN);
+ break;
+ case 2:
+ // Red
+ rgblight_enable_noeeprom();
+ rgblight_sethsv_noeeprom(HSV_RED);
+ break;
+ case 3:
+ // Blue
+ rgblight_enable_noeeprom();
+ rgblight_sethsv_noeeprom(HSV_BLUE);
+ break;
+ case 4:
+ // Orange
+ rgblight_enable_noeeprom();
+// rgblight_sethsv_noeeprom(HSV_PURPLE);
+ rgblight_sethsv_noeeprom(HSV_ORANGE);
+ break;
+ default:
+ // White
+ //Read RGB Light State
+ rgblight_config.raw = eeconfig_read_rgblight();
+ //If enabled, set white
+ if (rgblight_config.enable) {
+ rgblight_sethsv_noeeprom(HSV_WHITE);
+ } else { //Otherwise go back to disabled
+ rgblight_disable_noeeprom();
+ }
+ break;
+}
+return state;
+} \ No newline at end of file
diff --git a/keyboards/1upkeyboards/super16/keymaps/nblyumberg/readme.md b/keyboards/1upkeyboards/super16/keymaps/nblyumberg/readme.md
new file mode 100644
index 0000000000..5ae101b535
--- /dev/null
+++ b/keyboards/1upkeyboards/super16/keymaps/nblyumberg/readme.md
@@ -0,0 +1,6 @@
+# Nick B's Super16 keymap
+
+A modification of the default keymap to include layer indicators with RGB
+* Added a time out of 3 seconds to 1 shot layers
+* Reduced brightness to half to reduce power draw
+* Added a one key copy/paste keycode
diff --git a/keyboards/1upkeyboards/super16/keymaps/nblyumberg/rules.mk b/keyboards/1upkeyboards/super16/keymaps/nblyumberg/rules.mk
new file mode 100644
index 0000000000..b5bd51b327
--- /dev/null
+++ b/keyboards/1upkeyboards/super16/keymaps/nblyumberg/rules.mk
@@ -0,0 +1,2 @@
+RGB_MATRIX_ENABLE = no
+RGBLIGHT_ENABLE = yes
diff --git a/keyboards/2_milk/config.h b/keyboards/2_milk/config.h
deleted file mode 100644
index e9a104117b..0000000000
--- a/keyboards/2_milk/config.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/* 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 <http://www.gnu.org/licenses/>.
- */
-#pragma once
-#include "config_common.h"
-
-/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0xB195
-#define DEVICE_VER 0x0001
-#define MANUFACTURER rionlion100
-#define PRODUCT 2% Milk
-#define DESCRIPTION A milk themed 2% Keyboard
-
-/* key matrix size */
-#define MATRIX_ROWS 2
-#define MATRIX_COLS 1
-
-/* Milk default pinout */
-#define DIRECT_PINS { \
- {D4}, \
- {C6} \
-}
-#define UNUSED_PINS
-
-#ifdef RGBLIGHT_ENABLE
-#define RGB_DI_PIN B6
-#define RGBLED_NUM 1
-#endif
diff --git a/keyboards/2_milk/info.json b/keyboards/2_milk/info.json
deleted file mode 100644
index 6dc4eeaf8b..0000000000
--- a/keyboards/2_milk/info.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "keyboard_name": "2% Milk",
- "keyboard_folder": "2_milk",
- "url": "",
- "maintainer": "rionlion100 (Spaceman)",
- "width": 1,
- "height": 2,
- "layouts": {
- "LAYOUT": {
- "key_count": 2,
- "layout": [ {"x": 0, "y": 0 }, {"x": 0, "y": 1 }]
- }
- }
-}
diff --git a/keyboards/2_milk/readme.md b/keyboards/2_milk/readme.md
deleted file mode 100644
index f3a85458ce..0000000000
--- a/keyboards/2_milk/readme.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# 2% Milk
-
-![2%Milk](https://i.imgur.com/Ud96uXn.png)
-
-A 2% Meme board themed around a milk carton
-
-Keyboard Maintainer: Spaceman AKA:[Rionlion100](https://github.com/rionlion100)
-Hardware Availability: [Open Source](https://github.com/Rionlion100/Spaceboards/tree/master/Keyboards/2%25%20Milk)
-
-Make example for this keyboard (after setting up your build environment):
-
- make 2_milk: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).
-
-### Credits
-+ Case design by Soft
-+ PCB by PyroL
-+ Name by jetpacktuxedo
diff --git a/keyboards/40percentclub/gherkin/keymaps/stevexyz/keymap.c b/keyboards/40percentclub/gherkin/keymaps/stevexyz/keymap.c
index 188c1cd5d8..72df0675be 100644
--- a/keyboards/40percentclub/gherkin/keymaps/stevexyz/keymap.c
+++ b/keyboards/40percentclub/gherkin/keymaps/stevexyz/keymap.c
@@ -16,7 +16,8 @@
/*
- * see jj40/stevexyz for more information
+ * The 25% SuperMicro keyboard: a pure - full features - "Alpha 26" keymap on Gherkin, compatible also with 28 and 30 keys layouts
+ * See https://github.com/stevexyz/qmk_firmware/blob/master/keyboards/40percentclub/gherkin/keymaps/stevexyz/readme.md for more information
*/
@@ -56,7 +57,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* ,---------------------------------------------------------------------.
* | | | | | | | | | | |
* | Q | W | E | R | T | Y | U | I | O | P |
- * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ |
+ * | ____ | ____ | ____ | ____ | ____ | FnNav|NumSym| Alt | Ctrl | Shift|
* |------+------+------+------+-------------+------+------+------+------|
* | | | | | | | | | | |
* | A | S | D | F | G | H | J | K | L | Enter|
@@ -68,83 +69,73 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* '-------------------------------------------------------'
*/
[LAYER_HOME] = LAYOUT_ortho_3x10(
- LT(LAYER_ARROWPAD, KC_Q), LT(LAYER_NUMPAD, KC_W), LT(LAYER_MEDIAPAD, KC_E), KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
- 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, 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 ),
+ LT(LAYER_ARROWPAD, KC_Q), LT(LAYER_NUMPAD, KC_W), LT(LAYER_MEDIAPAD, KC_E), KC_R, KC_T, LT(LAYER_FUNC, KC_Y), LT(LAYER_NUMSYM, KC_U), MT(MOD_LALT, KC_I), MT(MOD_RCTL, KC_O), MT(MOD_RSFT, KC_P),
+ 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),
+ KC_DOWN, 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), KC_BSPC
+ ),
/* Function and Navigation Layer
* ,---------------------------------------------------------------------.
* | | | | | | | | | | |
* | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 |
- * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ |
+ * | ____ | ____ | ____ | ____ | ____ | ____ |SysLay| Alt | Ctrl | Shift|
* |------+------+------+------+-------------+------+------+------+------|
* | | | | | | | | | | |
- * | ESC | Home | PgDn | PgUp | End | Left | Down | Up | Right| Baksp|
+ * | ESC | Home | PgDn | PgUp | End | Left | Down | Up | Right|Backsp|
* | Shift| ____ |SysLay| AltGr| OSkey| OSkey| AltGr| ____ |SysLay| Shift|
* '------+------+------+------+------+------|------+------+------+------'
* | | | | | | | | |
- * | ____ | ____ | | ____ | ____ | ____ | ____ | ____ |
+ * | F11 | F12 | | Space|PrnScr|ScrLck|Pause |Backsp|
* | Ctrl | Alt | ____ |SysLay| Shift| Alt | Ctrl | Shift|
* '-------------------------------------------------------'
*/
[LAYER_FUNC] = LAYOUT_ortho_3x10(
- KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10,
- 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, KC_LCTL, KC_LALT, KC_NO, MO(LAYER_SYST), KC_LSFT, KC_LALT, KC_RCTL, MT(MOD_RSFT, KC_SPC), XXXXXXX ),
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, LT(LAYER_SYST, KC_F7), MT(MOD_LALT, KC_F8), MT(MOD_RCTL,KC_F9), MT(MOD_RSFT, KC_F10),
+ 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),
+ KC_DOWN, MT(KC_LCTL, KC_F11), MT(KC_LALT, KC_F12), KC_NO, LT(LAYER_SYST, KC_SPACE), MT(KC_LSFT, KC_PSCR), MT(KC_LALT, KC_SLCK), MT(KC_RCTL, KC_PAUS), MT(MOD_RSFT, KC_BSPC), KC_UP
+ ),
/* Number and Symbols Layer
* ,---------------------------------------------------------------------.
* | ! | @ | # | $ | % | ^ | & | * | ( | ) |
* | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
- * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ |
+ * | ____ | ____ | ____ | ____ | ____ |SysLay| ____ | Alt | Ctrl | Shift|
* |------+------+------+------+-------------+------+------+------+------|
* | | ~ | _ | + | { | } | | | : | " | |
* | TAB | ` | - | = | [ | ] | \ | ; | ' | Del |
* | Shift|SysLay| ____ | AltGr| OSkey| OSkey| AltGr|SysLay| ____ | Shift|
* ' -----+------+------+------+------+------|------+------+------+------'
* | | | | | < | > | ? | |
- * | ____ | ____ | ____ | | , | . | / | ____ |
+ * |BackSp| Del | Enter| | , | . | / | Enter|
* | Ctrl | Alt |SysLay| ____ | Shift| Alt | Ctrl | Shift|
* '-------------------------------------------------------'
*/
[LAYER_NUMSYM] = LAYOUT_ortho_3x10(
- KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,
- 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, 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 ),
+ KC_1, KC_2, KC_3, KC_4, KC_5, LT(LAYER_SYST, KC_6), KC_7, MT(MOD_LALT, KC_8), MT(MOD_RCTL,KC_9), MT(MOD_RSFT, KC_0),
+ 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),
+ KC_LEFT, MT(KC_LCTL, KC_BSPC), MT(KC_LALT, KC_DEL), LT(LAYER_SYST, KC_ENT), KC_NO, MT(MOD_LSFT, KC_COMM), MT(MOD_LALT, KC_DOT), MT(MOD_RCTL, KC_SLSH), MT(MOD_RSFT, KC_ENT), KC_RGHT
+ ),
/* System Layer
* ,---------------------------------------------------------------------.
* | | | | | | | | | | |
- * | F11 | F12 | Play | Next |MsWhlU|MsBtn1|OSMenu|SysReq|MsBtn2|Backsp|
- * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ |
+ * | Play | Stop | Prev | Next |MsBtn1|MsLeft|MSDown| MsUp |MsRigh|MsBtn2|
+ * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | Shift|
* |------+------+------+------+-------------+------+------+------+------|
* | | | | | | | | | | |
- * | Caps | Mute | Vol- | Vol+ |MsWhlD|MsLeft|MSDown| MsUp |MsRigh| Ins |
- * | Shift| ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | Shift|
+ * |Backsp| Mute | Vol- | Vol+ |MsWhlD| Left | Down | Up | Right|Backsp|
+ * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ |
* '------+------+------+------+------+------|------+------+------+------'
* | | | | | | | | |
- * | ____ | ____ | | |PrnScr|ScrLck|Pause | ____ |
- * | Ctrl | Alt | ____ | ____ | ____ | ____ | ____ | Shift|
- * '-------------------------------------------------------'
- * simplified view (for media and mouse there are dedicated layers)
- * ,---------------------------------------------------------------------.
- * | | | | | | | | | | |
- * | F11 | F12 | | | | |OSMenu|SysReq| |Backsp|
- * | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ |
- * |------+------+------+------+-------------+------+------+------+------|
- * | | | | | | | | | | |
- * | Caps | | | | | | | | | Ins |
- * | Shift| ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | Shift|
- * '------+------+------+------+------+------|------+------+------+------+
- * | | | | | | | | |
- * | | | | |PrnScr|ScrLck|Pause | |
- * | Ctrl | Alt | ____ | ____ | ____ | ____ | ____ | Shift|
+ * | ____ | ____ | Enter| Space| Mute | Vol- | Vol+ | Space|
+ * | Ctrl | Alt | ____ | ____ | Shift| Alt | Ctrl | ____ |
* '-------------------------------------------------------'
*/
[LAYER_SYST] = LAYOUT_ortho_3x10(
- KC_F11, KC_F12, KC_MPLY, KC_MNXT, KC_MS_WH_UP, KC_MS_BTN1, KC_APP, KC_SYSREQ, KC_MS_BTN2, KC_BSPC,
- MT(MOD_LSFT, KC_CAPS), KC_MUTE, KC_VOLD, KC_VOLU, KC_MS_WH_DOWN, KC_MS_LEFT, KC_MS_DOWN, KC_MS_UP, KC_MS_RIGHT, MT(MOD_RSFT, KC_INS),
- XXXXXXX, KC_LCTL, KC_LALT, KC_NO, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, MT(MOD_RSFT, KC_SPC), XXXXXXX ),
+ KC_MPLY, KC_STOP, KC_MPRV, KC_MNXT, KC_MS_BTN1, KC_MS_LEFT, KC_MS_DOWN, KC_MS_UP, KC_MS_RIGHT, MT(MOD_RSFT, KC_MS_BTN2),
+ KC_BSPC, KC_DEL, KC_PGDN, KC_PGUP, KC_APP, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_BSPC,
+ KC_PGDN, MT(KC_LCTL, KC_CAPS), MT(KC_LALT, KC_INS), KC_ENT, KC_SPC, MT(MOD_RSFT, KC_MUTE), MT(MOD_LALT, KC_VOLD), MT(MOD_RCTL, KC_VOLU), KC_SPC, KC_PGUP
+ ),
/* ArrowPad (mod su Q) /------mouse-------\ /-----cursor-------\
* ,---------------------------------------------------------------------.
@@ -157,23 +148,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | Shift| ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ |
* '------+------+------+------+------+------|------+------+------+------'
* | | | | | | | | |
- * | | |MsWhlU|MsDown|MsWhlD| End | Down | PdDn |
+ * | | |MsWhlU|MsDown|MsWhlD| End | PgDn | PgDn |
* | Ctrl | Alt | ____ | ____ | ____ | ____ | ____ | ____ |
* '-------------------------------------------------------'
*/
[LAYER_ARROWPAD] = LAYOUT_ortho_3x10(
- KC_NO, KC_NO, KC_NO, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_HOME, KC_UP, KC_PGUP, KC_BSPC,
- KC_LSFT, KC_NO, KC_NO, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_ENT,
- XXXXXXX, KC_LCTL, KC_LALT, KC_MS_WH_UP, KC_MS_DOWN, KC_MS_WH_DOWN, KC_END, KC_DOWN, KC_PGDN, XXXXXXX ),
+ KC_NO, KC_NO, KC_NO, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, KC_HOME, KC_UP, KC_PGUP, KC_BSPC,
+ KC_LSFT, KC_NO, KC_NO, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_ENT,
+ XXXXXXX, KC_LCTL, KC_LALT, KC_MS_WH_UP, KC_MS_DOWN, KC_MS_WH_DOWN, KC_END, KC_PGDN, KC_PGDN, XXXXXXX
+ ),
/* NumPad (mod su W)
* ,---------------------------------------------------------------------.
* | | | | | | | | | | |
- * | | | / | * | - |Backsp| 7 | 8 | 9 | 0 |
+ * | | | 3 | * | - |Backsp| 7 | 8 | 9 | 0 |
* | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ |
* |------+------+------+------+-------------+------+------+------+------|
* | | | | | | | | | | |
- * | | | | = | + | . | 4 | 5 | 6 | Enter|
+ * | | | / | = | + | . | 4 | 5 | 6 | Enter|
* | Shift| ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ | ____ |
* '------+------+------+------+------+------|------+------+------+------'
* | | | | | | | | |
@@ -182,9 +174,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* '-------------------------------------------------------'
*/
[LAYER_NUMPAD] = LAYOUT_ortho_3x10(
- KC_NO, KC_NO, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS, KC_BSPC, KC_7, KC_8, KC_9, KC_0,
- KC_LSFT, KC_NO, KC_NO, KC_KP_EQUAL, KC_KP_PLUS, KC_DOT, KC_4, KC_5, KC_6, KC_ENT,
- XXXXXXX, KC_LCTL, KC_LALT, KC_NO, KC_TAB, KC_COMM, KC_1, KC_2, KC_3, XXXXXXX ),
+ KC_NO, KC_NO, KC_3, KC_KP_ASTERISK, KC_KP_MINUS, KC_BSPC, KC_7, KC_8, KC_9, KC_0,
+ KC_LSFT, KC_NO, KC_KP_SLASH, KC_KP_EQUAL, KC_KP_PLUS, KC_DOT, KC_4, KC_5, KC_6, KC_ENT,
+ XXXXXXX, KC_LCTL, KC_LALT, KC_NO, KC_TAB, KC_COMM, KC_1, KC_2, KC_3, XXXXXXX
+ ),
/* MediaPad (mod su E)
* ,---------------------------------------------------------------------.
@@ -202,9 +195,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* '-------------------------------------------------------'
*/
[LAYER_MEDIAPAD] = LAYOUT_ortho_3x10(
- KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_VOLU, KC_NO, KC_NO,
- KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO,
- XXXXXXX, KC_LCTL, KC_LALT, KC_NO, KC_NO, KC_NO, KC_MUTE, KC_VOLD, KC_NO, XXXXXXX ),
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_VOLU, KC_NO, KC_NO,
+ KC_LSFT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MPRV, KC_MPLY, KC_MNXT, KC_NO,
+ XXXXXXX, KC_LCTL, KC_LALT, KC_NO, KC_NO, KC_NO, KC_MUTE, KC_VOLD, KC_NO, XXXXXXX
+ ),
};
@@ -225,15 +219,13 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case CK_TRIPLEZERO:
if (record->event.pressed) {
SEND_STRING("000");
- } // else { when released... }
+ } // else { when released }
break;
}
return true;
};
void keyboard_pre_init_user(void) {
- // Call the keyboard pre init code.
-
// Set our LED pins as output
setPinOutput(D5);
setPinOutput(B0);
diff --git a/keyboards/40percentclub/gherkin/keymaps/stevexyz/readme.md b/keyboards/40percentclub/gherkin/keymaps/stevexyz/readme.md
index 40d2bc22d5..8fe7a60679 100644
--- a/keyboards/40percentclub/gherkin/keymaps/stevexyz/readme.md
+++ b/keyboards/40percentclub/gherkin/keymaps/stevexyz/readme.md
@@ -1,11 +1,15 @@
-# gherkin super micro edition
+# The 25% SuperMicro keyboard
+## A full featured keymap on Gherkin compatible with a pure "Alpha 26" layout
-With this configuration the "28" layout first experimented on the plank-like jj40 is being ported to a more proper board, leaving just two keys not used.
+With this configuration the "SuperMicro" layout first experimented on the plank-like jj40 is being ported to a more proper board, and with the last changes, this layout has been made compatible also to a "26 keys" one. So you can now choose to leave all 30 keys on the keyboard, or remove the two on the bottom line corners to have the "old" and comfortable 28 keys layout, or remove also space and enter to have the simplest "pure alpha" one! And even the intermediate 27 keys one is an interesting compatible option!
-For more information please have a look at https://github.com/stevexyz/qmk_firmware/blob/master/keyboards/jj40/keymaps/stevexyz/readme.md
+This keymap is for a generic usage, trying to avoid as much gimmick as possible (considering the number of keys) and retain muscle memory from people used to the standard Qwerty 104 keys one. Functions and numbers (with related symbols) are on the first row as expected; other examples of design coherency include the symbols on the central row laid out in the same order as you'll find on a standard full keyboard, and the cursor movement aligned to the common unix vi standard ("hjkl", and for symmetry "sdfg" for home/pgdn/pgup/end). I've personally used this layout for months on my home PC in parallel to my portable work PC.
-The image below explain the main layers. In addition to them with q, w and e there are three specific dedicated layers for cursors/mouse, numpad and media.
-![layers](https://raw.githubusercontent.com/stevexyz/qmk_firmware/master/keyboards/40percentclub/gherkin/keymaps/stevexyz/layers.jpeg)
+Relying just on the alphabetic keys this layout can be also very easily ported and tested on any qmk supported keyboard (ok, butterstick excluded).
+
+The image below explains the main layers activated respectively with F, N or both modifiers pressed together. In addition to them there are available 5 layers that can be personalized as needed or completely removed without losing any functionality; three of them are currently setup in the default keymap for cursors/mouse, numpad and media (activated with q, w and e respectively).
+
+![layers](https://github.com/stevexyz/qmk_firmware/blob/master/keyboards/40percentclub/gherkin/keymaps/stevexyz/newlayout26272830.jpg)
![prototype](https://github.com/stevexyz/qmk_firmware/blob/master/keyboards/40percentclub/gherkin/keymaps/stevexyz/gherkin28.jpeg)
diff --git a/keyboards/8pack/readme.md b/keyboards/8pack/readme.md
index ad5df536a1..9c608e2a59 100644
--- a/keyboards/8pack/readme.md
+++ b/keyboards/8pack/readme.md
@@ -4,7 +4,7 @@ An open source 2x4 macropad designed by Charles Garcia.
Keyboard Maintainer: [Charles Garcia](https://github.com/cgarcia2097)
Hardware Supported: 8-Pack Macropad PCB
-Hardware Availability: [8-Pack Github](https://github.com/cgarcia2097/8-Pack)
+Hardware Availability: [8-Pack GitHub](https://github.com/cgarcia2097/8-Pack)
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/abacus/readme.md b/keyboards/abacus/readme.md
index 1f58a25a4a..ecf25b2edf 100644
--- a/keyboards/abacus/readme.md
+++ b/keyboards/abacus/readme.md
@@ -6,7 +6,7 @@ A first attempt at a PCB design for a mechanical keyboard. Includes rotary encod
* Keyboard Maintainer: [nickolaij](https://github.com/nickolaij)
* Hardware Supported: Abacus PCB, [Elite C Microcontroller](https://keeb.io/products/elite-c-usb-c-pro-micro-replacement-arduino-compatible-atmega32u4) or Pro Micro Microcontroller (Elite C has additional pins for encoder)
-* Hardware Availability: [Abacus PCB Github](https://github.com/nickolaij/Abacus_Rev2)
+* Hardware Availability: [Abacus PCB GitHub](https://github.com/nickolaij/Abacus_Rev2)
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/acheron/elongate/config.h b/keyboards/acheron/elongate/config.h
new file mode 100644
index 0000000000..df8c1a8314
--- /dev/null
+++ b/keyboards/acheron/elongate/config.h
@@ -0,0 +1,250 @@
+/*
+Copyright 2020 Gondolindrim
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x4150 //AP for AcheronProject
+#define PRODUCT_ID 0x454C // EL for Elongate
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Acheron Project
+#define PRODUCT Elongate
+#define DESCRIPTION Acheron Project Elongate
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 13
+
+/*
+ * 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, B7, D5, B5, D6 }
+#define MATRIX_COL_PINS { F5, F6, F4, F1, F0, B2, B1, C6, B0, B3, E6, D4, B4}
+//#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 D7
+#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/acheron/elongate/elongate.c b/keyboards/acheron/elongate/elongate.c
new file mode 100644
index 0000000000..31c4720360
--- /dev/null
+++ b/keyboards/acheron/elongate/elongate.c
@@ -0,0 +1,26 @@
+/* Copyright 2020 Gondolindrim
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "elongate.h"
+bool led_update_kb(led_t led_state) {
+ bool res = led_update_user(led_state);
+ if(res) {
+ writePin(D2, led_state.num_lock);
+ writePin(D1, led_state.caps_lock);
+ writePin(D0, led_state.scroll_lock);
+ }
+ return res;
+}
diff --git a/keyboards/acheron/elongate/elongate.h b/keyboards/acheron/elongate/elongate.h
new file mode 100644
index 0000000000..6ff32b4f75
--- /dev/null
+++ b/keyboards/acheron/elongate/elongate.h
@@ -0,0 +1,44 @@
+/* Copyright 2020 Gondolindrim
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#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 KNO KC_NO
+
+#define LAYOUT( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K49, K41, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1B, K1C, K4A, K42, \
+ K20, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K4B, K44, \
+ K30, K31, K32, K34, K37, K3A, K3B, K3C, K3D, K4C, K47 \
+)\
+{\
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, KNO, K1B, K1C }, \
+ { K20, KNO, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C }, \
+ { K30, K31, K32, KNO, K34, KNO, KNO, K37, KNO, K3A, K3B, K3C, K3D }, \
+ { KNO, K41, K42, KNO, K44, KNO, KNO, K47, KNO, K49, K4A, K4B, K4C } \
+}
diff --git a/keyboards/acheron/elongate/info.json b/keyboards/acheron/elongate/info.json
new file mode 100644
index 0000000000..65e312259b
--- /dev/null
+++ b/keyboards/acheron/elongate/info.json
@@ -0,0 +1,70 @@
+{
+ "keyboard_name": "Elongate",
+ "url": "http://gondolindrim.github.io/AcheronDocs/elongate/introduction.html",
+ "maintainer": "Gondolindrim",
+ "width": 15.5,
+ "height": 4.25,
+ "layouts": {
+ "LAYOUT_all": {
+ "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":"Backspace", "x":11, "y":0},
+ {"label":"7", "x":12.5, "y":0},
+ {"label":"8", "x":13.5, "y":0},
+ {"label":"9", "x":14.5, "y":0},
+
+ {"label":"Caps Lock", "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.75},
+ {"label":"4", "x":12.5, "y":1},
+ {"label":"5", "x":13.5, "y":1},
+ {"label":"6", "x":14.5, "y":1},
+
+ {"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":"Fn1", "x":9.75, "y":2},
+ {"label":"Up", "x":11.25, "y":2.25},
+ {"label":"1", "x":12.5, "y":2},
+ {"label":"2", "x":13.5, "y":2},
+ {"label":"3", "x":14.5, "y":2},
+
+ {"label":"Ctrl", "x":0, "y":3, "w":1.25},
+ {"label":"Win", "x":1.25, "y":3},
+ {"label":"Alt", "x":2.25, "y":3, "w":1.25},
+ {"label":"Space/Fn2", "x":3.5, "y":3, "w":2.25},
+ {"label":"Space", "x":6.25, "y":3, "w":2.75},
+ {"label":"Alt", "x":9, "y":3},
+ {"label":"Left", "x":10.25, "y":3.25},
+ {"label":"Down", "x":11.25, "y":3.25},
+ {"label":"Right", "x":12.25, "y":3.25},
+ {"label":"0", "x":13.5, "y":3},
+ {"label":".", "x":14.5, "y":3}
+ ]
+ }
+ }
+}
diff --git a/keyboards/acheron/elongate/keymaps/default/keymap.c b/keyboards/acheron/elongate/keymaps/default/keymap.c
new file mode 100644
index 0000000000..c2b809b744
--- /dev/null
+++ b/keyboards/acheron/elongate/keymaps/default/keymap.c
@@ -0,0 +1,34 @@
+/* Copyright 2020 Gondolindrim
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT( /* Base */
+ 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_P7, KC_P8, KC_P9,
+ KC_SLCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENTER, KC_P4, KC_P5, KC_P6,
+ KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, MO(1) , KC_UP, KC_P1, KC_P2, KC_P3,
+ KC_LCTRL, KC_LWIN, KC_LALT, LT(2, KC_SPACE), KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_DOT),
+[1] = LAYOUT( /* Base */
+ KC_F1, KC_F2, KC_F2, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, KC_NLCK, KC_SLCK, KC_CAPS,
+ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RSHIFT, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SCLN, KC_QUOT, KC_SLSH, KC_TRNS, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_TRNS, KC_HOME, KC_PGDN, KC_END , KC_TRNS, KC_TRNS),
+[2] = LAYOUT( /* Base */
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, 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_RMOD, RGB_M_T, KC_TRNS, KC_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, KC_TRNS),
+};
diff --git a/keyboards/acheron/elongate/keymaps/default/readme.md b/keyboards/acheron/elongate/keymaps/default/readme.md
new file mode 100644
index 0000000000..a154ac5915
--- /dev/null
+++ b/keyboards/acheron/elongate/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for Elongate
diff --git a/keyboards/acheron/elongate/keymaps/via/config.h b/keyboards/acheron/elongate/keymaps/via/config.h
new file mode 100644
index 0000000000..a3b77a5b4d
--- /dev/null
+++ b/keyboards/acheron/elongate/keymaps/via/config.h
@@ -0,0 +1,3 @@
+#pragma once
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
diff --git a/keyboards/acheron/elongate/keymaps/via/keymap.c b/keyboards/acheron/elongate/keymaps/via/keymap.c
new file mode 100644
index 0000000000..c2b809b744
--- /dev/null
+++ b/keyboards/acheron/elongate/keymaps/via/keymap.c
@@ -0,0 +1,34 @@
+/* Copyright 2020 Gondolindrim
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = LAYOUT( /* Base */
+ 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_P7, KC_P8, KC_P9,
+ KC_SLCK, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENTER, KC_P4, KC_P5, KC_P6,
+ KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, MO(1) , KC_UP, KC_P1, KC_P2, KC_P3,
+ KC_LCTRL, KC_LWIN, KC_LALT, LT(2, KC_SPACE), KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_DOT),
+[1] = LAYOUT( /* Base */
+ KC_F1, KC_F2, KC_F2, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_LBRC, KC_RBRC, KC_MINS, KC_EQL, KC_NLCK, KC_SLCK, KC_CAPS,
+ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RSHIFT, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SCLN, KC_QUOT, KC_SLSH, KC_TRNS, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_TRNS, KC_HOME, KC_PGDN, KC_END , KC_TRNS, KC_TRNS),
+[2] = LAYOUT( /* Base */
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS , KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, 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_RMOD, RGB_M_T, KC_TRNS, KC_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, KC_TRNS),
+};
diff --git a/keyboards/acheron/elongate/keymaps/via/rules.mk b/keyboards/acheron/elongate/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/acheron/elongate/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/acheron/elongate/readme.md b/keyboards/acheron/elongate/readme.md
new file mode 100644
index 0000000000..83c0eeada1
--- /dev/null
+++ b/keyboards/acheron/elongate/readme.md
@@ -0,0 +1,25 @@
+# Acheron AχξÏων 45-S-ATMEGA-MX-TH-WI (codename "Elongate") QMK firmware
+
+<p align="center">
+ <img align="middle" src="https://raw.githubusercontent.com/Gondolindrim/acheronLibrary/master/graphics/acheronLong.png" width="400">
+</p>
+
+## Introduction
+
+This is the QMK firmware repository for the ElongatePCN, compatible with revisions Beta and pre-Beta.
+
+The ElongatePCB is an Open-Hardware guidelines compliant PCB which files can be found at [this link](https://github.com/Gondolindrim/AElongate). Its designer and maintainer is [Gondolindrim](https://github.com/Gondolindrim).
+
+## PCB Documentation
+
+See the [AcheronDocs](https://gondolindrim.github.io/AcheronDocs/elongate/introduction.html) page for the ElongatePCB full documentation. You can also check the KiCad PCB files at the [Elongate GitHub repository](https://github.com/Gondolindrim/Elongate).
+
+Before using the files for personal or commercial use, please read the [Acheron Open-Hardware License V1.2](https://gondolindrim.github.io/AcheronDocs/license/license.html) under which the Austin PCB is published.
+
+## How to compile
+
+After setting up your build environment, you can compile the Austin default keymap by using:
+
+ make acheron/elongate: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/acheron/elongate/rules.mk b/keyboards/acheron/elongate/rules.mk
new file mode 100644
index 0000000000..0f0ca33e9c
--- /dev/null
+++ b/keyboards/acheron/elongate/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 = 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
+
+LTO_ENABLE = yes
diff --git a/keyboards/allison/readme.md b/keyboards/allison/readme.md
index 343ff2325d..60670cbad8 100644
--- a/keyboards/allison/readme.md
+++ b/keyboards/allison/readme.md
@@ -4,7 +4,7 @@
A custom luxurious 60 with F-row and Macro
-* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar)
+* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
* Hardware Supported: ATmega32U4
* Hardware Availability: Small production run by mrpetrov#9585 and [protoTypist](https://discord.gg/UvskpBB)
diff --git a/keyboards/allison_numpad/readme.md b/keyboards/allison_numpad/readme.md
index 0226c44f68..82992339e1 100644
--- a/keyboards/allison_numpad/readme.md
+++ b/keyboards/allison_numpad/readme.md
@@ -4,7 +4,7 @@
A custom luxurious numpad to match Allison
-* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar)
+* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
* Hardware Supported: ATmega32U4
* Hardware Availability: Small production run by mrpetrov#9585 and [protoTypist](https://discord.gg/UvskpBB)
diff --git a/keyboards/alps64/config.h b/keyboards/alps64/config.h
index 237dfbbe77..25453e696f 100644
--- a/keyboards/alps64/config.h
+++ b/keyboards/alps64/config.h
@@ -20,8 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x6464
+#define VENDOR_ID 0x6873 //hs "Hasu"
+#define PRODUCT_ID 0x6464 //Alps"64"
#define DEVICE_VER 0x0001
#define MANUFACTURER Hasu
#define PRODUCT Alps64
@@ -48,6 +48,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
+/* Bootmagic Lite Support*/
+#define BOOTMAGIC_LITE_ROW 3
+#define BOOTMAGIC_LITE_COLUMN 6
+
/*
* Feature disable options
* These options are also useful to firmware size reduction.
diff --git a/keyboards/alps64/keymaps/via/keymap.c b/keyboards/alps64/keymaps/via/keymap.c
new file mode 100644
index 0000000000..aef6995a10
--- /dev/null
+++ b/keyboards/alps64/keymaps/via/keymap.c
@@ -0,0 +1,37 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* 0: qwerty */
+ [0] = 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_MINS, KC_EQL, KC_NUHS, 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_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_ESC,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_APP, KC_RALT, KC_RGUI, KC_RCTL
+ ),
+
+ [1] = 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_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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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
+ ),
+
+ [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
+ ),
+
+};
diff --git a/keyboards/alps64/keymaps/via/rules.mk b/keyboards/alps64/keymaps/via/rules.mk
new file mode 100644
index 0000000000..c4a4cd8fd9
--- /dev/null
+++ b/keyboards/alps64/keymaps/via/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+CONSOLE_ENABLE = no
+COMMAND_ENABLE = no
diff --git a/keyboards/alps64/readme.md b/keyboards/alps64/readme.md
index 1188d7819c..4ad7bf3efe 100644
--- a/keyboards/alps64/readme.md
+++ b/keyboards/alps64/readme.md
@@ -6,7 +6,7 @@ Keyboard Maintainer: QMK Community
Hardware Supported: Alps64 PCB
Hardware Availability: https://geekhack.org/index.php?topic=69666.0
-QMK is not the Alps64 official firmware. To use the official tools, refer to [TMK Keymap Editor](http://www.tmk-kbd.com/tmk_keyboard/editor/unimap/?alps64) or [TMK Keyboard Firmware on Github](https://github.com/tmk/tmk_keyboard).
+QMK is not the Alps64 official firmware. To use the official tools, refer to [TMK Keymap Editor](http://www.tmk-kbd.com/tmk_keyboard/editor/unimap/?alps64) or [TMK Keyboard Firmware on GitHub](https://github.com/tmk/tmk_keyboard).
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/aos/tkl/config.h b/keyboards/aos/tkl/config.h
new file mode 100644
index 0000000000..4e6ab3e3dc
--- /dev/null
+++ b/keyboards/aos/tkl/config.h
@@ -0,0 +1,56 @@
+/*
+Copyright 2020 aholland909
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x504B
+#define PRODUCT_ID 0x1000
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Ace of Spades
+#define PRODUCT Ace of Spades TKL
+#define DESCRIPTION Ace of Spades TKL
+
+/* key matrix size */
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 17
+
+#define MATRIX_ROW_PINS { D3, D2, B7, F1, C7, D5 }
+#define MATRIX_COL_PINS { B0, B1, B2, B3, F4, F5, F6, F7, B6, B5, D7, B4, D6, F0, D1, C6, D4 }
+#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 LOCKING_SUPPORT_ENABLE
+/* Locking resynchronize hack */
+#define LOCKING_RESYNC_ENABLE
+
+
+#define RGB_DI_PIN E6
+#ifdef RGB_DI_PIN
+ #define RGBLIGHT_ANIMATIONS
+ #define RGBLED_NUM 88
+ #define RGBLIGHT_HUE_STEP 8
+ #define RGBLIGHT_SAT_STEP 8
+ #define RGBLIGHT_VAL_STEP 8
+#endif
diff --git a/keyboards/aos/tkl/info.json b/keyboards/aos/tkl/info.json
new file mode 100644
index 0000000000..f9665f3597
--- /dev/null
+++ b/keyboards/aos/tkl/info.json
@@ -0,0 +1,98 @@
+{
+ "keyboard_name": "Ace of Spades TKL",
+ "maintainer": "rys",
+ "width": 18.25,
+ "height": 6.5,
+ "layouts": {
+ "LAYOUT_tkl_iso_wkl": {
+ "key_count": 85,
+ "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":"£", "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":"Up", "x":16.25, "y":4.5},
+ {"label":"Ctrl", "x":0, "y":5.5, "w":1.5},
+ {"label":"Alt", "x":2.5, "y":5.5, "w":1.5},
+ {"label":"Space", "x":4, "y":5.5, "w":7},
+ {"label":"AltGr", "x":11, "y":5.5, "w":1.5},
+ {"label":"Ctrl", "x":13.5, "y":5.5, "w":1.5},
+ {"label":"Left", "x":15.25, "y":5.5},
+ {"label":"Down", "x":16.25, "y":5.5},
+ {"label":"Right", "x":17.25, "y":5.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/aos/tkl/keymaps/aholland909/keymap.c b/keyboards/aos/tkl/keymaps/aholland909/keymap.c
new file mode 100644
index 0000000000..5e224811fc
--- /dev/null
+++ b/keyboards/aos/tkl/keymaps/aholland909/keymap.c
@@ -0,0 +1,38 @@
+/*
+Copyright 2020 aholland909
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_tkl_iso_wkl(
+ 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_PAUSE,
+
+ 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_DEL, KC_END, KC_PGDN,
+ LT(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_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_UP,
+ KC_LCTL, KC_LALT, KC_SPC, KC_RGUI, TG(1), KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [1] = LAYOUT_tkl_iso_wkl(
+ RESET, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24, _______, _______, _______,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, KC_VOLU, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_P, RGB_M_B, _______,
+ _______, KC_MPRV, KC_VOLD, KC_MNXT, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______, _______,
+ _______, _______, _______, _______, KC_CALC, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUI,
+ _______, _______, KC_MPLY, _______, _______, RGB_SAD, RGB_HUD, RGB_VAI),
+};
diff --git a/keyboards/aos/tkl/keymaps/default/keymap.c b/keyboards/aos/tkl/keymaps/default/keymap.c
new file mode 100644
index 0000000000..924815fcb3
--- /dev/null
+++ b/keyboards/aos/tkl/keymaps/default/keymap.c
@@ -0,0 +1,38 @@
+/*
+Copyright 2020 aholland909
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_tkl_iso_wkl(
+ KC_ESC, KC_F1, KC_F1, 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_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_UP,
+ KC_LCTL, KC_LALT, KC_SPC, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_tkl_iso_wkl(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_P, RGB_M_B, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUI,
+ _______, _______, _______, _______, _______, RGB_SAD, RGB_HUD, RGB_VAI
+ ),
+};
diff --git a/keyboards/aos/tkl/keymaps/default/readme.md b/keyboards/aos/tkl/keymaps/default/readme.md
new file mode 100644
index 0000000000..0de9187eaa
--- /dev/null
+++ b/keyboards/aos/tkl/keymaps/default/readme.md
@@ -0,0 +1,3 @@
+# The default keymap for Ace of Spades
+
+The Ace of Spades is a fixed ISO TKL with blocked winkeyless bottom row.
diff --git a/keyboards/aos/tkl/keymaps/via/keymap.c b/keyboards/aos/tkl/keymaps/via/keymap.c
new file mode 100644
index 0000000000..53d8481112
--- /dev/null
+++ b/keyboards/aos/tkl/keymaps/via/keymap.c
@@ -0,0 +1,55 @@
+/* Copyright 2020 Rys Sommefeldt
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_tkl_iso_wkl(
+ KC_ESC, KC_F1, KC_F1, 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_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_UP,
+ KC_LCTL, KC_LALT, KC_SPC, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [1] = LAYOUT_tkl_iso_wkl(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, RGB_M_P, RGB_M_B, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUI,
+ _______, _______, _______, _______, _______, RGB_SAD, RGB_HUD, RGB_VAI
+ ),
+ [2] = LAYOUT_tkl_iso_wkl(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+ [3] = LAYOUT_tkl_iso_wkl(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+};
diff --git a/keyboards/aos/tkl/keymaps/via/rules.mk b/keyboards/aos/tkl/keymaps/via/rules.mk
new file mode 100644
index 0000000000..96d2d189b2
--- /dev/null
+++ b/keyboards/aos/tkl/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+MOUSEKEY_ENABLE = no
diff --git a/keyboards/aos/tkl/readme.md b/keyboards/aos/tkl/readme.md
new file mode 100644
index 0000000000..f1e59385aa
--- /dev/null
+++ b/keyboards/aos/tkl/readme.md
@@ -0,0 +1,13 @@
+# Ace of Spades TKL
+
+The TKL is a custom limited run keyboard designed by Ace of Spades and manufactured by Salvun.
+
+* Keyboard Maintainers: [aholland909](https://github.com/aholland909), [rys](https://github.com/rys)
+* Hardware Supported: Ace of Spades custom TKL PCB by [aholland909](https://github.com/aholland909)
+* Hardware Availability: Custom group buy
+
+Make example for this keyboard (after setting up your build environment):
+
+ make aos/tkl: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/aos/tkl/rules.mk b/keyboards/aos/tkl/rules.mk
new file mode 100644
index 0000000000..7a4fa89391
--- /dev/null
+++ b/keyboards/aos/tkl/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 = 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
diff --git a/keyboards/aos/tkl/tkl.c b/keyboards/aos/tkl/tkl.c
new file mode 100644
index 0000000000..b4ff32d8f4
--- /dev/null
+++ b/keyboards/aos/tkl/tkl.c
@@ -0,0 +1,18 @@
+/*
+Copyright 2020 aholland909
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "tkl.h"
diff --git a/keyboards/aos/tkl/tkl.h b/keyboards/aos/tkl/tkl.h
new file mode 100644
index 0000000000..de1b9da27c
--- /dev/null
+++ b/keyboards/aos/tkl/tkl.h
@@ -0,0 +1,46 @@
+/*
+Copyright 2020 aholland909
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#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_tkl_iso_wkl( \
+ K000, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, 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, K214, K215, K216, \
+ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K213, \
+ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K415, \
+ K500, K502, K505, K510, K512, K513, K515, K516 \
+) { \
+ { K000, KC_NO, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, 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, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, KC_NO, KC_NO, K415, KC_NO }, \
+ { K500, KC_NO, K502, KC_NO, KC_NO, KC_NO, KC_NO, K505, KC_NO, KC_NO, K510, KC_NO, K512, K513, KC_NO, K515, K516 }, \
+}
diff --git a/keyboards/arabica37/arabica37.c b/keyboards/arabica37/arabica37.c
new file mode 100644
index 0000000000..22fc63b0e9
--- /dev/null
+++ b/keyboards/arabica37/arabica37.c
@@ -0,0 +1 @@
+#include "arabica37.h"
diff --git a/keyboards/arabica37/arabica37.h b/keyboards/arabica37/arabica37.h
new file mode 100644
index 0000000000..3255e71d10
--- /dev/null
+++ b/keyboards/arabica37/arabica37.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#ifdef KEYBOARD_arabica37_rev1
+ #include "rev1.h"
+#endif
diff --git a/keyboards/arabica37/config.h b/keyboards/arabica37/config.h
new file mode 100644
index 0000000000..cfb6bf4ffc
--- /dev/null
+++ b/keyboards/arabica37/config.h
@@ -0,0 +1,21 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+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 <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
diff --git a/keyboards/arabica37/info.json b/keyboards/arabica37/info.json
new file mode 100644
index 0000000000..656433707c
--- /dev/null
+++ b/keyboards/arabica37/info.json
@@ -0,0 +1,65 @@
+{
+ "keyboard_name": "arabica37 rev. 1",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 15.25,
+ "height": 5.75,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"Esc", "x":0.25, "y":0.75},
+ {"label":"Q", "x":1.25, "y":0.75},
+ {"label":"W", "x":2.25, "y":0.25},
+ {"label":"E", "x":3.25, "y":0},
+ {"label":"R", "x":4.25, "y":0.25},
+ {"label":"T", "x":5.25, "y":0.5},
+
+ {"label":"Y", "x":9, "y":0.5},
+ {"label":"U", "x":10, "y":0.25},
+ {"label":"I", "x":11, "y":0},
+ {"label":"O", "x":12, "y":0.25},
+ {"label":"P", "x":13, "y":0.75},
+ {"label":"Backspace", "x":14, "y":0.75},
+
+ {"label":"Ctrl", "x":0.25, "y":1.75},
+ {"label":"A", "x":1.25, "y":1.75},
+ {"label":"S", "x":2.25, "y":1.25},
+ {"label":"D", "x":3.25, "y":1},
+ {"label":"F", "x":4.25, "y":1.25},
+ {"label":"G", "x":5.25, "y":1.5},
+
+ {"label":"H", "x":9, "y":1.5},
+ {"label":"J", "x":10, "y":1.25},
+ {"label":"K", "x":11, "y":1},
+ {"label":"L", "x":12, "y":1.25},
+ {"label":";", "x":13, "y":1.75},
+ {"label":"'", "x":14, "y":1.75},
+
+ {"label":"Adjust", "x":0.25, "y":2.75},
+ {"label":"Z", "x":1.25, "y":2.75},
+ {"label":"X", "x":2.25, "y":2.25},
+ {"label":"C", "x":3.25, "y":2},
+ {"label":"V", "x":4.25, "y":2.25},
+ {"label":"B", "x":5.25, "y":2.5},
+
+ {"label":"N", "x":9, "y":2.5},
+ {"label":"M", "x":10, "y":2.25},
+ {"label":",", "x":11, "y":2},
+ {"label":".", "x":12, "y":2.25},
+ {"label":"/", "x":13, "y":2.75},
+ {"label":"\\", "x":14, "y":2.75},
+
+ {"label":"Shift", "x":0, "y":3.75, "w":2.25},
+ {"label":"Lower", "x":4.375, "y":3.75, "w":1.5},
+ {"label":"GUI", "x":5.875, "y":3.75, "w":1.25},
+
+ {"label":"Alt", "x":8.125, "y":3.75, "w":1.25},
+ {"label":"Raise", "x":9.375, "y":3.75, "w":1.5},
+ {"label":"Shift", "x":13, "y":3.75, "w":2.25},
+
+ {"label":"Space", "x":5.125, "y":4.75, "w":1.25},
+ {"label":"Enter", "x":8.875, "y":4.75, "w":1.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/arabica37/keymaps/default/config.h b/keyboards/arabica37/keymaps/default/config.h
new file mode 100644
index 0000000000..f12534c902
--- /dev/null
+++ b/keyboards/arabica37/keymaps/default/config.h
@@ -0,0 +1,42 @@
+/*
+This is the c configuration file for the keymap
+
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+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 <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+//#define USE_MATRIX_I2C
+
+/* Select hand configuration */
+
+#define MASTER_LEFT
+// #define MASTER_RIGHT
+// #define EE_HANDS
+
+#define TAPPING_FORCE_HOLD
+#define TAPPING_TERM 170
+
+#undef RGBLED_NUM
+#define RGBLIGHT_ANIMATIONS
+#define RGBLED_NUM 27
+#define RGBLIGHT_LIMIT_VAL 120
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
+
+#define OLED_FONT_H "keyboards/arabica37/lib/glcdfont.c"
diff --git a/keyboards/arabica37/keymaps/default/keymap.c b/keyboards/arabica37/keymaps/default/keymap.c
new file mode 100644
index 0000000000..877fb7347d
--- /dev/null
+++ b/keyboards/arabica37/keymaps/default/keymap.c
@@ -0,0 +1,199 @@
+#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 {
+ _QWERTY,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+enum custom_keycodes {
+ LOWER = SAFE_RANGE,
+ RAISE,
+ ADJUST,
+ RGBRST
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = LAYOUT( \
+ //,-----------------------------------------------. ,-----------------------------------------------.
+ 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_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L,KC_SCLN,KC_QUOT,\
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ ADJUST, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M,KC_COMM, KC_DOT,KC_SLSH,KC_BSLS,\
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_LSFT, LOWER,KC_LGUI, KC_LALT, RAISE, KC_RSFT,\
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_SPC, KC_ENT
+ //`-----------------------------------------------' `-----------------------------------------------'
+ ),
+ [_LOWER] = LAYOUT( \
+ //,-----------------------------------------------. ,-----------------------------------------------.
+ KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0,KC_TRNS,\
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_TRNS,KC_HOME,KC_LEFT, KC_UP,KC_RGHT,KC_PGUP, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6,\
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_TRNS, KC_END,KC_PSCR,KC_DOWN, KC_INS,KC_PGDN, 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
+ //`-----------------------------------------------' `-----------------------------------------------'
+ ),
+ [_RAISE] = LAYOUT( \
+ //,-----------------------------------------------. ,-----------------------------------------------.
+ KC_TRNS,KC_EXLM, KC_AT,KC_HASH, KC_DLR,KC_PERC, KC_CIRC,KC_PSLS,KC_PAST,KC_PMNS,KC_PPLS,KC_TRNS,\
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_TRNS,KC_RBRC,KC_LABK,KC_ASTR,KC_SCLN,KC_LBRC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_EQL,\
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_TRNS,KC_BSLS,KC_RABK,KC_LPRN,KC_JYEN,KC_UNDS, KC_6, KC_7, KC_8, KC_9, KC_0,KC_PENT,\
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+--- ---+-------+-------|
+ KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,\
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+--- ---+-------+-------|
+ KC_TRNS, KC_TRNS
+ //`-----------------------------------------------' `-----------------------------------------------'
+ ),
+ [_ADJUST] = LAYOUT( \
+ //,-----------------------------------------------. ,-----------------------------------------------.
+ KC_TRNS, RGBRST,RGB_TOG, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_TRNS,RGB_HUI,RGB_SAI,RGB_VAI,AG_SWAP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_TRNS,RGB_HUD,RGB_SAD,RGB_VAD,AG_NORM, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,KC_TRNS, KC_TRNS,\
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_TRNS, KC_TRNS
+ //`-----------------------------------------------' `-----------------------------------------------'
+ )
+};
+
+int RGB_current_mode;
+
+void keyboard_post_init_user(void) {
+ #ifdef RGBLIGHT_ENABLE
+ RGB_current_mode = rgblight_get_mode();
+ #endif
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ // set_timelog();
+ }
+
+ switch (keycode) {
+ 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;
+ case RGB_MOD:
+ #ifdef RGBLIGHT_ENABLE
+ if (record->event.pressed) {
+ rgblight_mode(RGB_current_mode);
+ rgblight_step();
+ RGB_current_mode = rgblight_get_mode();
+ }
+ #endif
+ return false;
+ break;
+ case RGBRST:
+ #ifdef RGBLIGHT_ENABLE
+ if (record->event.pressed) {
+ eeconfig_update_rgblight_default();
+ rgblight_enable();
+ RGB_current_mode = rgblight_get_mode();
+ }
+ #endif
+ break;
+ }
+ return true;
+}
+
+#ifdef OLED_DRIVER_ENABLE
+
+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) {
+ void render_status(void) {
+ // Host Keyboard Layer Status
+ oled_write_P(PSTR("Layer: "), false);
+
+ switch (get_highest_layer(layer_state)) {
+ case _QWERTY:
+ oled_write_P(PSTR("Default\n"), false);
+ break;
+ case _LOWER:
+ oled_write_P(PSTR("LOWER\n"), false);
+ break;
+ case _RAISE:
+ oled_write_P(PSTR("RAISE\n"), false);
+ break;
+ case _ADJUST:
+ oled_write_P(PSTR("ADJUST\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);
+ }
+
+ // Host Keyboard LED Status
+ led_t led_state = host_keyboard_led_state();
+ oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
+ oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false);
+ oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false);
+ }
+
+
+ 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, 0x00
+ };
+
+ oled_write_P(qmk_logo, false);
+ }
+
+ if (is_keyboard_master()) {
+ render_status(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
+ } else {
+ render_logo(); // Renders a static logo
+ }
+}
+#endif
diff --git a/keyboards/arabica37/keymaps/default/rules.mk b/keyboards/arabica37/keymaps/default/rules.mk
new file mode 100644
index 0000000000..c582662134
--- /dev/null
+++ b/keyboards/arabica37/keymaps/default/rules.mk
@@ -0,0 +1 @@
+OLED_DRIVER_ENABLE = yes
diff --git a/keyboards/arabica37/lib/glcdfont.c b/keyboards/arabica37/lib/glcdfont.c
new file mode 100644
index 0000000000..a4ed2be826
--- /dev/null
+++ b/keyboards/arabica37/lib/glcdfont.c
@@ -0,0 +1,232 @@
+// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0.
+// See gfxfont.h for newer custom bitmap font info.
+
+#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, 0xE0, 0xF0,
+ 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0xF0,
+ 0xE0, 0x00, 0x00, 0x80, 0x80, 0x80,
+ 0x80, 0x00, 0x00, 0x80, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x80,
+ 0x00, 0x80, 0x80, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
+ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00,
+ 0x9C, 0x9F, 0x9F, 0x9C, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x80, 0x00, 0x80,
+ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x80, 0x80, 0x00, 0x80, 0x80,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80,
+ 0x00, 0x00, 0x80, 0x80, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x60, 0x18,
+ 0x07, 0x00, 0x80, 0x80, 0x80, 0x80,
+ 0x80, 0x80, 0x80, 0x80, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC,
+ 0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00,
+ 0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E,
+ 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00,
+ 0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B,
+ 0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00,
+ 0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE,
+ 0xDE, 0xD7, 0xDC, 0x00, 0xC0, 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, 0x20, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0x00, 0x1F, 0x1F, 0x1F, 0x1F,
+ 0x00, 0x00, 0xC6, 0xE7, 0xF7, 0xF7,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0xFE, 0xFF, 0xFF, 0xFF, 0x00, 0x9F,
+ 0x9F, 0x9F, 0x9E, 0x00, 0x00, 0xE7,
+ 0xF7, 0xF7, 0xF7, 0x00, 0xFF, 0xFF,
+ 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x07, 0x07, 0x07,
+ 0x03, 0x00, 0x7F, 0x7F, 0x3F, 0x1E,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0,
+ 0x30, 0x0C, 0x02, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x07, 0x07, 0x07, 0x07,
+ 0x07, 0xF7, 0xF3, 0xF3, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
+ 0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00,
+ 0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F,
+ 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00,
+ 0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20,
+ 0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00,
+ 0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F,
+ 0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F,
+ 0x1F, 0x1F, 0x00, 0x1F, 0x1F, 0x1F,
+ 0x1F, 0x00, 0x00, 0x1F, 0x1F, 0x1F,
+ 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x07, 0x0F, 0x0F, 0x1F,
+ 0x00, 0x1F, 0x1F, 0x0F, 0x07, 0x00,
+ 0x00, 0x07, 0x0F, 0x0F, 0x1F, 0x00,
+ 0x1F, 0x1F, 0x0F, 0x07, 0x00, 0x00,
+ 0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x00,
+ 0x07, 0x0F, 0x1F, 0x1F, 0x00, 0x1F,
+ 0x0F, 0x0F, 0x07, 0x00, 0x00, 0x07,
+ 0x0F, 0x1F, 0x1F, 0x00, 0x1F, 0x0F,
+ 0x0F, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xE0, 0xF0, 0xF0,
+ 0xE0, 0x00, 0xFF, 0xFE, 0xFE, 0x38,
+ 0x00, 0x60, 0x10, 0x0C, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0x7F, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 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/arabica37/readme.md b/keyboards/arabica37/readme.md
new file mode 100644
index 0000000000..6cbe98c187
--- /dev/null
+++ b/keyboards/arabica37/readme.md
@@ -0,0 +1,15 @@
+# Arabica3/7
+
+![arabica3/7](https://user-images.githubusercontent.com/46911478/76915532-9c333080-68f8-11ea-863a-8a7899d1d9c4.jpg)
+
+A split keyboard with 3x6 column staggered keys, 1 pinkey and 3 thumb keys.
+
+* Keyboard Maintainer: [CalciumNitride](https://github.com/CalciumNitride)
+* Hardware Supported: Arabica3/7 PCB, Pro Micro
+* Hardware Availability: [PCB & Case Data](https://github.com/calciumnitride/arabica37)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make arabica37/rev1: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/arabica37/rev1/config.h b/keyboards/arabica37/rev1/config.h
new file mode 100644
index 0000000000..5db7e32fc6
--- /dev/null
+++ b/keyboards/arabica37/rev1/config.h
@@ -0,0 +1,82 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+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 <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x3060
+#define DEVICE_VER 0x0001
+#define MANUFACTURER CalciumNitride
+#define PRODUCT Arabica3/7
+#define DESCRIPTION A split keyboard with 3x6 column staggered keys, 1 pinkie key and 3 thumb keys
+
+#define USE_SERIAL
+#define SOFT_SERIAL_PIN D2
+
+/* key matrix size */
+// Rows are doubled-up
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 7
+#define MATRIX_ROW_PINS { D4, C6, D7, E6 }
+
+// wiring of each half
+#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2 }
+// #define MATRIX_COL_PINS { B2, B3, B1, F7, F6, F5, F4 } //uncomment this line and comment line above if you need to reverse left-to-right key order
+
+#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
+
+/* 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 */
+
+
+/* ws2812 RGB LED */
+#define RGB_DI_PIN D3
+
+#define RGBLED_NUM 50 // Number of LEDs
+#define RGBLED_SPLIT {25, 25}
+/*
+ * 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/arabica37/rev1/rev1.c b/keyboards/arabica37/rev1/rev1.c
new file mode 100644
index 0000000000..22fc63b0e9
--- /dev/null
+++ b/keyboards/arabica37/rev1/rev1.c
@@ -0,0 +1 @@
+#include "arabica37.h"
diff --git a/keyboards/arabica37/rev1/rev1.h b/keyboards/arabica37/rev1/rev1.h
new file mode 100644
index 0000000000..316de77f1d
--- /dev/null
+++ b/keyboards/arabica37/rev1/rev1.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#include "arabica37.h"
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ 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, \
+ L26, L31, L32, R26, R30, R32, \
+ L30, R31 \
+ ) \
+ { \
+ { L00, L01, L02, L03, L04, L05 }, \
+ { L10, L11, L12, L13, L14, L15 }, \
+ { L20, L21, L22, L23, L24, L25 }, \
+ { L26, KC_NO, KC_NO, L30, L31, L32 }, \
+ { R05, R04, R03, R02, R01, R00 }, \
+ { R15, R14, R13, R12, R11, R10 }, \
+ { R25, R24, R23, R22, R21, R20 }, \
+ { R32, KC_NO, KC_NO, R31, R30, R26 } \
+ }
diff --git a/keyboards/arabica37/rev1/rules.mk b/keyboards/arabica37/rev1/rules.mk
new file mode 100644
index 0000000000..10c5ab28bb
--- /dev/null
+++ b/keyboards/arabica37/rev1/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 = 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 = 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
+
+SPLIT_KEYBOARD = yes
diff --git a/keyboards/ares/rules.mk b/keyboards/ares/rules.mk
index dc2bb40a3d..076cbdc39a 100644
--- a/keyboards/ares/rules.mk
+++ b/keyboards/ares/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = no
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/at101_bh/at101_bh.c b/keyboards/at101_bh/at101_bh.c
new file mode 100644
index 0000000000..3b519373b0
--- /dev/null
+++ b/keyboards/at101_bh/at101_bh.c
@@ -0,0 +1 @@
+#include "at101_bh.h"
diff --git a/keyboards/at101_bh/at101_bh.h b/keyboards/at101_bh/at101_bh.h
new file mode 100644
index 0000000000..54655cf60e
--- /dev/null
+++ b/keyboards/at101_bh/at101_bh.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K0000, K0100, K0001, K0101, K0002, K0102, K0003, K0103, K0004, K0104, K0005, K0105, K0006, K0106, K0007, K0107, \
+ K0200, K0300, K0201, K0301, K0202, K0302, K0203, K0303, K0204, K0304, K0205, K0305, K0206, K0306, K0207, K0307, K0208, K0308, K0209, K0309, K0009, \
+ K0400, K0500, K0401, K0501, K0402, K0502, K0403, K0503, K0404, K0504, K0405, K0505, K0406, K0506, K0407, K0507, K0408, K0508, K0409, K0509, K0109, \
+ K0600, K0700, K0601, K0701, K0602, K0702, K0603, K0703, K0604, K0704, K0605, K0705, K0606, K0608, K0708, K0609, K0709, \
+ K0800, K1101, K0900, K0801, K0901, K0802, K0902, K0803, K0903, K0804, K0904, K0805, K0905, K0806, K0807, K0808, K0908, K0809, K0909, \
+ K1000, K1100, K1001, K1102, K1005, K1105, K1006, K1106, K1007, K1107, K1008, K1108, K1009 \
+) { \
+ { K0000, K0001, K0002, K0003, K0004, K0005, K0006, K0007, KC_NO, K0009 }, \
+ { K0100, K0101, K0102, K0103, K0104, K0105, K0106, K0107, KC_NO, 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, K0503, K0504, K0505, K0506, K0507, K0508, K0509 }, \
+ { K0600, K0601, K0602, K0603, K0604, K0605, K0606, KC_NO, K0608, K0609 }, \
+ { K0700, K0701, K0702, K0703, K0704, K0705, KC_NO, KC_NO, K0708, K0709 }, \
+ { K0800, K0801, K0802, K0803, K0804, K0805, K0806, K0807, K0808, K0809 }, \
+ { K0900, K0901, K0902, K0903, K0904, K0905, KC_NO, KC_NO, K0908, K0909 }, \
+ { K1000, K1001, KC_NO, KC_NO, KC_NO, K1005, K1006, K1007, K1008, K1009 }, \
+ { K1100, K1101, K1102, KC_NO, KC_NO, K1105, K1106, K1107, K1108, KC_NO } \
+}
diff --git a/keyboards/at101_bh/config.h b/keyboards/at101_bh/config.h
new file mode 100644
index 0000000000..6928118b79
--- /dev/null
+++ b/keyboards/at101_bh/config.h
@@ -0,0 +1,35 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x6060
+#define DEVICE_VER 0x0001
+#define MANUFACTURER blindassassin111
+#define PRODUCT AT101_BH PCB
+#define DESCRIPTION Replacement AT101 PCB
+
+/* key matrix size */
+#define MATRIX_ROWS 12
+#define MATRIX_COLS 10
+
+/* key matrix pins */
+#define MATRIX_ROW_PINS { F0, F1, F4, D4, F6, F5, F7, B6, B5, D5, C7, C6 }
+#define MATRIX_COL_PINS { D1, D0, B7, B3, B2, B1, B0, E6, D2, D3 }
+#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
+
+/* force n-key rollover*/
+#define FORCE_NKRO
diff --git a/keyboards/at101_bh/info.json b/keyboards/at101_bh/info.json
new file mode 100644
index 0000000000..1d28dc230b
--- /dev/null
+++ b/keyboards/at101_bh/info.json
@@ -0,0 +1,121 @@
+{
+ "keyboard_name": "AT101 BH PCB",
+ "keyboard_folder": "at101_bh",
+ "url": "https://deskthority.net/group-buys-f50/programmable-vintage-board-pcbs-omnikey-at101-and-z-150-t19325.html",
+ "maintainer": "qmk, blindassassin111",
+ "width": 22.5,
+ "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":"Print Screen", "x":15.25, "y":0},
+ {"label":"Scroll Lock", "x":16.25, "y":0},
+ {"label":"Pause", "x":17.25, "y":0},
+ {"label":"Grave", "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":"Num Lock", "x":18.5, "y":1.5},
+ {"label":"Keypad /", "x":19.5, "y":1.5},
+ {"label":"Keypad *", "x":20.5, "y":1.5},
+ {"label":"Keypad -", "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":"LBracket", "x":11.5, "y":2.5},
+ {"label":"RBracket]", "x":12.5, "y":2.5},
+ {"label":"Backslash", "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":"Page Down", "x":17.25, "y":2.5},
+ {"label":"Keypad 7", "x":18.5, "y":2.5},
+ {"label":"Keypad 8", "x":19.5, "y":2.5},
+ {"label":"Keypad 9", "x":20.5, "y":2.5},
+ {"label":"Keypad +", "x":21.5, "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":"Semicolon", "x":10.75, "y":3.5},
+ {"label":"Quote", "x":11.75, "y":3.5},
+ {"label":"Enter", "x":12.75, "y":3.5, "w":2.25},
+ {"label":"Keypad 4", "x":18.5, "y":3.5},
+ {"label":"Keypad 5", "x":19.5, "y":3.5},
+ {"label":"Keypad 6", "x":20.5, "y":3.5},
+ {"label":"Keypad =", "x":21.5, "y":3.5},
+ {"label":"LShift", "x":0, "y":4.5, "w":1.25},
+ {"label":"ISO Backslash", "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":"Comma", "x":9.25, "y":4.5},
+ {"label":"Period", "x":10.25, "y":4.5},
+ {"label":"Slash", "x":11.25, "y":4.5},
+ {"label":"RShift", "x":12.25, "y":4.5, "w":1.75},
+ {"label":"Fn", "x":14, "y":4.5},
+ {"label":"Up", "x":16.25, "y":4.5},
+ {"label":"Keypad 1", "x":18.5, "y":4.5},
+ {"label":"Keypad 2", "x":19.5, "y":4.5},
+ {"label":"Keypad 3", "x":20.5, "y":4.5},
+ {"label":"Keypad Enter", "x":21.5, "y":4.5, "h":2},
+ {"label":"LCtrl", "x":0, "y":5.5, "w":1.25},
+ {"label":"LGUI", "x":1.25, "y":5.5, "w":1.25},
+ {"label":"LAlt", "x":2.5, "y":5.5, "w":1.25},
+ {"label":"Space", "x":3.75, "y":5.5, "w":6.25},
+ {"label":"RAlt", "x":10, "y":5.5, "w":1.25},
+ {"label":"RGUI", "x":11.25, "y":5.5, "w":1.25},
+ {"label":"Menu", "x":12.5, "y":5.5, "w":1.25},
+ {"label":"RCtrl", "x":13.75, "y":5.5, "w":1.25},
+ {"label":"Left", "x":15.25, "y":5.5},
+ {"label":"Down", "x":16.25, "y":5.5},
+ {"label":"Right", "x":17.25, "y":5.5},
+ {"label":"Keypad 0", "x":18.5, "y":5.5, "w":2},
+ {"label":"Keypad .", "x":20.5, "y":5.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/at101_blackheart/keymaps/default/keymap.c b/keyboards/at101_bh/keymaps/default/keymap.c
index 086c25e1c7..086c25e1c7 100644
--- a/keyboards/at101_blackheart/keymaps/default/keymap.c
+++ b/keyboards/at101_bh/keymaps/default/keymap.c
diff --git a/keyboards/at101_bh/readme.md b/keyboards/at101_bh/readme.md
new file mode 100644
index 0000000000..8a9ce2496f
--- /dev/null
+++ b/keyboards/at101_bh/readme.md
@@ -0,0 +1,15 @@
+# AT101 BH PCB
+
+![AT101 BH PCB](https://deskthority.net/resources/image/48571)
+
+A replacement PCB for AT101 keyboards.
+
+Keyboard Maintainer: QMK Community and blindassassin111
+Hardware Supported: AT101 BH PCB
+Hardware Availability: https://deskthority.net/group-buys-f50/programmable-vintage-board-pcbs-omnikey-at101-and-z-150-t19325.html
+
+Make example for this keyboard (after setting up your build environment):
+
+ make at101_bh: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/at101_blackheart/rules.mk b/keyboards/at101_bh/rules.mk
index 1930d9f27f..1930d9f27f 100644
--- a/keyboards/at101_blackheart/rules.mk
+++ b/keyboards/at101_bh/rules.mk
diff --git a/keyboards/at101_blackheart/at101_blackheart.c b/keyboards/at101_blackheart/at101_blackheart.c
deleted file mode 100644
index aa07a78643..0000000000
--- a/keyboards/at101_blackheart/at101_blackheart.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "at101_blackheart.h"
diff --git a/keyboards/at101_blackheart/at101_blackheart.h b/keyboards/at101_blackheart/at101_blackheart.h
deleted file mode 100644
index 24ac1b7c54..0000000000
--- a/keyboards/at101_blackheart/at101_blackheart.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef at101_blackheart_H
-#define at101_blackheart_H
-
-#include "quantum.h"
-
-#define LAYOUT( \
- K0000, K0100, K0001, K0101, K0002, K0102, K0003, K0103, K0004, K0104, K0005, K0105, K0006, K0106, K0007, K0107, \
- K0200, K0300, K0201, K0301, K0202, K0302, K0203, K0303, K0204, K0304, K0205, K0305, K0206, K0306, K0207, K0307, K0208, K0308, K0209, K0309, K0009, \
- K0400, K0500, K0401, K0501, K0402, K0502, K0403, K0503, K0404, K0504, K0405, K0505, K0406, K0506, K0407, K0507, K0408, K0508, K0409, K0509, K0109, \
- K0600, K0700, K0601, K0701, K0602, K0702, K0603, K0703, K0604, K0704, K0605, K0705, K0606, K0608, K0708, K0609, K0709, \
- K0800, K1101, K0900, K0801, K0901, K0802, K0902, K0803, K0903, K0804, K0904, K0805, K0905, K0806, K0807, K0808, K0908, K0809, K0909, \
- K1000, K1100, K1001, K1102, K1005, K1105, K1006, K1106, K1007, K1107, K1008, K1108, K1009 \
-) { \
- { K0000, K0001, K0002, K0003, K0004, K0005, K0006, K0007, KC_NO, K0009 }, \
- { K0100, K0101, K0102, K0103, K0104, K0105, K0106, K0107, KC_NO, 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, K0503, K0504, K0505, K0506, K0507, K0508, K0509 }, \
- { K0600, K0601, K0602, K0603, K0604, K0605, K0606, KC_NO, K0608, K0609 }, \
- { K0700, K0701, K0702, K0703, K0704, K0705, KC_NO, KC_NO, K0708, K0709 }, \
- { K0800, K0801, K0802, K0803, K0804, K0805, K0806, K0807, K0808, K0809 }, \
- { K0900, K0901, K0902, K0903, K0904, K0905, KC_NO, KC_NO, K0908, K0909 }, \
- { K1000, K1001, KC_NO, KC_NO, KC_NO, K1005, K1006, K1007, K1008, K1009 }, \
- { K1100, K1101, K1102, KC_NO, KC_NO, K1105, K1106, K1107, K1108, KC_NO } \
-}
-
-#endif
diff --git a/keyboards/at101_blackheart/config.h b/keyboards/at101_blackheart/config.h
deleted file mode 100644
index 83814c6486..0000000000
--- a/keyboards/at101_blackheart/config.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#pragma once
-
-#include "config_common.h"
-
-/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x6060
-#define DEVICE_VER 0x0001
-#define MANUFACTURER blindassassin111
-#define PRODUCT AT101_Blackheart PCB
-#define DESCRIPTION Replacement AT101 PCB
-
-/* key matrix size */
-#define MATRIX_ROWS 12
-#define MATRIX_COLS 10
-
-/* key matrix pins */
-#define MATRIX_ROW_PINS { F0, F1, F4, D4, F6, F5, F7, B6, B5, D5, C7, C6 }
-#define MATRIX_COL_PINS { D1, D0, B7, B3, B2, B1, B0, E6, D2, D3 }
-#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
-
-/* force n-key rollover*/
-#define FORCE_NKRO
diff --git a/keyboards/at101_blackheart/info.json b/keyboards/at101_blackheart/info.json
deleted file mode 100644
index 4bef46712d..0000000000
--- a/keyboards/at101_blackheart/info.json
+++ /dev/null
@@ -1,121 +0,0 @@
-{
- "keyboard_name": "AT101 Blackheart PCB",
- "keyboard_folder": "at101_blackheart",
- "url": "https://deskthority.net/group-buys-f50/programmable-vintage-board-pcbs-omnikey-at101-and-z-150-t19325.html",
- "maintainer": "qmk, blindassassin111",
- "width": 22.5,
- "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":"Print Screen", "x":15.25, "y":0},
- {"label":"Scroll Lock", "x":16.25, "y":0},
- {"label":"Pause", "x":17.25, "y":0},
- {"label":"Grave", "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":"Num Lock", "x":18.5, "y":1.5},
- {"label":"Keypad /", "x":19.5, "y":1.5},
- {"label":"Keypad *", "x":20.5, "y":1.5},
- {"label":"Keypad -", "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":"LBracket", "x":11.5, "y":2.5},
- {"label":"RBracket]", "x":12.5, "y":2.5},
- {"label":"Backslash", "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":"Page Down", "x":17.25, "y":2.5},
- {"label":"Keypad 7", "x":18.5, "y":2.5},
- {"label":"Keypad 8", "x":19.5, "y":2.5},
- {"label":"Keypad 9", "x":20.5, "y":2.5},
- {"label":"Keypad +", "x":21.5, "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":"Semicolon", "x":10.75, "y":3.5},
- {"label":"Quote", "x":11.75, "y":3.5},
- {"label":"Enter", "x":12.75, "y":3.5, "w":2.25},
- {"label":"Keypad 4", "x":18.5, "y":3.5},
- {"label":"Keypad 5", "x":19.5, "y":3.5},
- {"label":"Keypad 6", "x":20.5, "y":3.5},
- {"label":"Keypad =", "x":21.5, "y":3.5},
- {"label":"LShift", "x":0, "y":4.5, "w":1.25},
- {"label":"ISO Backslash", "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":"Comma", "x":9.25, "y":4.5},
- {"label":"Period", "x":10.25, "y":4.5},
- {"label":"Slash", "x":11.25, "y":4.5},
- {"label":"RShift", "x":12.25, "y":4.5, "w":1.75},
- {"label":"Fn", "x":14, "y":4.5},
- {"label":"Up", "x":16.25, "y":4.5},
- {"label":"Keypad 1", "x":18.5, "y":4.5},
- {"label":"Keypad 2", "x":19.5, "y":4.5},
- {"label":"Keypad 3", "x":20.5, "y":4.5},
- {"label":"Keypad Enter", "x":21.5, "y":4.5, "h":2},
- {"label":"LCtrl", "x":0, "y":5.5, "w":1.25},
- {"label":"LGUI", "x":1.25, "y":5.5, "w":1.25},
- {"label":"LAlt", "x":2.5, "y":5.5, "w":1.25},
- {"label":"Space", "x":3.75, "y":5.5, "w":6.25},
- {"label":"RAlt", "x":10, "y":5.5, "w":1.25},
- {"label":"RGUI", "x":11.25, "y":5.5, "w":1.25},
- {"label":"Menu", "x":12.5, "y":5.5, "w":1.25},
- {"label":"RCtrl", "x":13.75, "y":5.5, "w":1.25},
- {"label":"Left", "x":15.25, "y":5.5},
- {"label":"Down", "x":16.25, "y":5.5},
- {"label":"Right", "x":17.25, "y":5.5},
- {"label":"Keypad 0", "x":18.5, "y":5.5, "w":2},
- {"label":"Keypad .", "x":20.5, "y":5.5}
- ]
- }
- }
-}
diff --git a/keyboards/at101_blackheart/readme.md b/keyboards/at101_blackheart/readme.md
deleted file mode 100644
index d435d6955a..0000000000
--- a/keyboards/at101_blackheart/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# AT101 Blackheart PCB
-
-![AT101 Blackheart PCB](https://deskthority.net/resources/image/48571)
-
-A replacement PCB for AT101 keyboards.
-
-Keyboard Maintainer: QMK Community and blindassassin111
-Hardware Supported: AT101 blackheart PCB
-Hardware Availability: https://deskthority.net/group-buys-f50/programmable-vintage-board-pcbs-omnikey-at101-and-z-150-t19325.html
-
-Make example for this keyboard (after setting up your build environment):
-
- make at101_blackheart: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/atomic/keymaps/pvc/keymap.c b/keyboards/atomic/keymaps/pvc/keymap.c
index 33b3a9d824..361d702c5b 100644
--- a/keyboards/atomic/keymaps/pvc/keymap.c
+++ b/keyboards/atomic/keymaps/pvc/keymap.c
@@ -102,7 +102,7 @@ enum keyboard_macros {
#define SC_CCLS LCTL(KC_F4)
#define TG_NKRO MAGIC_TOGGLE_NKRO
-#define OS_SHFT KC_FN0
+#define OS_SHFT OSM(MOD_LSFT)
#define ________________ _______, _______
#define XXXXXXXXXXXXXXXX XXXXXXX, XXXXXXX
@@ -258,10 +258,6 @@ void persistent_default_layer_set(uint16_t default_layer) {
default_layer_set(default_layer);
}
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_MODS_ONESHOT(MOD_LSFT),
-};
-
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
// MACRODOWN only works in this function
diff --git a/keyboards/atreus/astar_mirrored/config.h b/keyboards/atreus/astar_mirrored/config.h
index 273f23a847..75155044de 100644
--- a/keyboards/atreus/astar_mirrored/config.h
+++ b/keyboards/atreus/astar_mirrored/config.h
@@ -28,7 +28,7 @@
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
-#define PDBDOWN 1
+#define PCBDOWN 1
#define MATRIX_ROW_PINS { D0, D1, D3, D2 }
#define MATRIX_COL_PINS { B7, D6, F7, F6, B6, D4, E6, B4, B5, C6, D7 }
diff --git a/keyboards/atreus/keymaps/xyverz/config.h b/keyboards/atreus/keymaps/xyverz/config.h
new file mode 100644
index 0000000000..037c9f3180
--- /dev/null
+++ b/keyboards/atreus/keymaps/xyverz/config.h
@@ -0,0 +1,4 @@
+#pragma once
+
+#undef DEBOUNCE
+#define DEBOUNCE 6
diff --git a/keyboards/atreus/keymaps/xyverz/keymap.c b/keyboards/atreus/keymaps/xyverz/keymap.c
index 7653206ae5..3f428058eb 100644
--- a/keyboards/atreus/keymaps/xyverz/keymap.c
+++ b/keyboards/atreus/keymaps/xyverz/keymap.c
@@ -4,8 +4,6 @@
#include QMK_KEYBOARD_H
-extern keymap_config_t keymap_config;
-
// 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
@@ -41,6 +39,7 @@ enum planck_keycodes {
#define ADJUST MO(_ADJUST)
#define LOWER MO(_LOWER)
#define RAISE MO(_RAISE)
+#define MACLOCK LGUI(LCTL(KC_Q))
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Dvorak Layer
@@ -119,13 +118,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|------+------+------+------+------|------.,------|------+------+------+------+------|
| | Left | Down | Right| End | || | PgUp | Mute | Vol- | Vol+ | |
|------+------+------+------+------| || |------+------+------+------+------|
- | ~ | | | | Del |------'`------| Ins | | | | |
+ | ~ | | | | Del |------'`------| Ins | | | |MACLCK|
`----------------------------------' `----------------------------------'*/
[_LOWER] = LAYOUT(
KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN,
KC_CAPS, _______, KC_UP, _______, KC_HOME, KC_PGUP, _______, KC_PLUS, KC_LCBR, KC_RCBR,
_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_PGDN, KC_MUTE, KC_VOLD, KC_VOLU, _______,
- KC_TILD, _______, _______, _______, KC_DEL, _______, _______, KC_INS, _______, _______, _______, _______
+ KC_TILD, _______, _______, _______, KC_DEL, _______, _______, KC_INS, _______, _______, _______, MACLOCK
),
/* RAISE Layer
@@ -136,13 +135,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|------+------+------+------+------|------.,------|------+------+------+------+------|
| | Left | Down | Right| End | || | PgUp | Prev | Play | Next | |
|------+------+------+------+------| || |------+------+------+------+------|
- | ` | | | | Del |------'`------| Ins | | | | |
+ | ` | | | | Del |------'`------| Ins | | | |MACLCK|
`----------------------------------' `----------------------------------'*/
[_RAISE] = LAYOUT(
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0 ,
KC_CAPS, _______, KC_UP, _______, KC_HOME, KC_PGUP, _______, KC_EQL, KC_LBRC, KC_RBRC,
_______, KC_LEFT, KC_DOWN, KC_RGHT, KC_END, KC_PGDN, KC_MPRV, KC_MPLY, KC_MNXT, _______,
- KC_GRV, _______, _______, _______, KC_DEL, _______, _______, KC_INS, _______, _______, _______, _______
+ KC_GRV, _______, _______, _______, KC_DEL, _______, _______, KC_INS, _______, _______, _______, MACLOCK
),
/* ADJUST Layer
@@ -190,4 +189,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return false;
}
return true;
-} \ No newline at end of file
+}
diff --git a/keyboards/atreus/keymaps/xyverz/readme.md b/keyboards/atreus/keymaps/xyverz/readme.md
index aa44f01dae..de9ae3f484 100644
--- a/keyboards/atreus/keymaps/xyverz/readme.md
+++ b/keyboards/atreus/keymaps/xyverz/readme.md
@@ -77,7 +77,7 @@ Control.
|------+------+------+------+------|------.,------|------+------+------+------+------|
| | Left | Down | Right| End | || | PgUp | Mute | Vol- | Vol+ | |
|------+------+------+------+------| || |------+------+------+------+------|
- | ~ | | | | Del |------'`------| Ins | | | | |
+ | ~ | | | | Del |------'`------| Ins | | | |MACLCK|
`----------------------------------' `----------------------------------'
@@ -90,7 +90,7 @@ Control.
|------+------+------+------+------|------.,------|------+------+------+------+------|
| | Left | Down | Right| End | || | PgUp | Prev | Play | Next | |
|------+------+------+------+------| || |------+------+------+------+------|
- | ` | | | | Del |------'`------| Ins | | | | |
+ | ` | | | | Del |------'`------| Ins | | | |MACLCK|
`----------------------------------' `----------------------------------'
### Layer 6: ADJUST layer
diff --git a/keyboards/atreus62/keymaps/atreus52/keymap.c b/keyboards/atreus62/keymaps/atreus52/keymap.c
index c7dcb67653..31a01ccd87 100644
--- a/keyboards/atreus62/keymaps/atreus52/keymap.c
+++ b/keyboards/atreus62/keymaps/atreus52/keymap.c
@@ -10,6 +10,8 @@
#define KC_RAIS MO(RAISE)
#define KC_LOWR MO(LOWER)
+#define KC_TGBD TG(BDO)
+#define KC_TGRS TG(RESETL)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[DVORAK] = LAYOUT_kc(
@@ -17,7 +19,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
NO, QUOT, COMM, DOT, P, Y, F, G, C, R, L, NO, \
NO, A, O, E, U, I, D, H, T, N, S, NO, \
NO, SCLN, Q, J, K, X, B, M, W, V, Z, NO, \
- NO, FN2, LALT, LCTL, LOWR, LSFT, BSPC, ENT, SPC, RAIS, LGUI, LEFT, RGHT, NO
+ NO, TGBD, LALT, LCTL, LOWR, LSFT, BSPC, ENT, SPC, RAIS, LGUI, LEFT, RGHT, NO
),
[QWERTY] = LAYOUT_kc(
@@ -25,7 +27,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
NO, Q, W, E, R, T, Y, U, I, O, P, NO, \
NO, A, S, D, F, G, H, J, K, L, SCLN, NO, \
NO, Z, X, C, V, B, N, M, COMM, DOT, SLSH, NO, \
- NO, FN2, LALT, LCTL, LOWR, LSFT, BSPC, ENT, SPC, RAIS, LGUI, LEFT, RGHT, NO
+ NO, TGBD, LALT, LCTL, LOWR, LSFT, BSPC, ENT, SPC, RAIS, LGUI, LEFT, RGHT, NO
),
[RAISE] = LAYOUT_kc(
@@ -33,7 +35,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
NO, TILD, GRV, LCBR, RCBR, DQUO, QUOT, EQL, PLUS, MINS, QUES, NO, \
NO, ESC, TAB, LPRN, RPRN, BSLS, SLSH, LEFT, DOWN, UP, RGHT, NO, \
NO, TRNS, TRNS, LBRC, RBRC, TRNS, INS, PIPE, UNDS, TRNS, TRNS, NO, \
- NO, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, FN3, NO
+ NO, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TGRS, NO
),
[LOWER] = LAYOUT_kc(
@@ -49,7 +51,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
NO, TAB, Q, W, E, R, 6, Y, I, O, P, NO, \
NO, LSFT, A, S, D, F, 7, G, H, J, K, NO, \
NO, T, Z, X, C, V, 8, B, N, M, L, NO, \
- NO, LCTL, SPC, SPC, SPC, SPC, COMM, ENT, 9, NO, NO, NO, FN2, NO
+ NO, LCTL, SPC, SPC, SPC, SPC, COMM, ENT, 9, NO, NO, NO, TGBD, NO
),
[RESETL] = LAYOUT(
@@ -57,15 +59,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, \
- KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_FN3,KC_NO
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, TG(RESETL),KC_NO
)
};
-const uint16_t PROGMEM fn_actions[] = {
- [2] = ACTION_LAYER_TOGGLE(BDO), // BDO layer
- [3] = ACTION_LAYER_TOGGLE(RESETL) // RESET layer
-};
-
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
// MACRODOWN only works in this function
switch (id) {
diff --git a/keyboards/atreus62/keymaps/scheiklp/config.h b/keyboards/atreus62/keymaps/scheiklp/config.h
new file mode 100644
index 0000000000..dc7629b622
--- /dev/null
+++ b/keyboards/atreus62/keymaps/scheiklp/config.h
@@ -0,0 +1,51 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+// place overrides here
+#define AUTO_SHIFT_TIMEOUT 125
+#define NO_AUTO_SHIFT_SPECIAL
+#define NO_AUTO_SHIFT_NUMERIC
+
+// require two taps for a TT layer switch (default 5)
+#define TAPPING_TOGGLE 2
+
+// 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 10
+/* #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 20
+/* #define MK_C_OFFSET_2 32 */
+// Time between cursor movements (KC_ACL2)
+#define MK_C_INTERVAL_2 16
diff --git a/keyboards/atreus62/keymaps/scheiklp/keymap.c b/keyboards/atreus62/keymaps/scheiklp/keymap.c
new file mode 100644
index 0000000000..0c3208db86
--- /dev/null
+++ b/keyboards/atreus62/keymaps/scheiklp/keymap.c
@@ -0,0 +1,43 @@
+#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] = {
+
+ [_1] = 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_K, KC_DOT, KC_O, KC_COMM, N_Y, KC_V, KC_G, KC_C, KC_L, N_SS, N_Z,
+ MO(_3), KC_H, KC_A, KC_E, KC_I, KC_U, KC_D, KC_T, KC_R, KC_N, KC_S, KC_F,
+ KC_LSFT, KC_X, KC_Q, N_AE, N_UE, N_OE, KC_B, KC_P, KC_W, KC_M, KC_J, KC_RSFT,
+ KC_LCTL, N_COPY, N_PASTE, KC_LGUI, KC_LALT, KC_SPC, KC_ENTER, KC_RCTL, MO(_3), MO(_4), KC_TRNS, KC_TRNS, KC_CAPS, TT(_7)
+ ),
+
+ [_3] = LAYOUT(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_BSPC,
+ KC_TAB, N_DOTS, N_USC, N_LSQBR, N_RSQBR, N_CIRC, N_EXKL, N_LT, N_GT, N_EQ, N_AMP, KC_TRNS,
+ KC_TRNS, N_BSLS, N_SLSH, N_LCUBR, N_RCUBR, N_ASTR, N_QUES, N_LPARN, N_RPARN, N_MINS, N_COLN, N_AT,
+ KC_LSFT, N_HASH, N_DLR, N_PIPE, N_TILD, N_GRAVE, N_PLUS, N_PERC, N_QUOT, N_SING, N_SEMI, KC_RSFT,
+ KC_LCTL, N_COPY, N_PASTE, KC_LGUI, KC_LALT, KC_SPC, KC_ENTER, KC_TRNS, KC_TRNS, KC_RCTL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [_4] = LAYOUT(
+ KC_ESC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC,
+ KC_TAB, KC_PGUP, KC_BSPC, KC_UP, KC_DEL, KC_PGDN, KC_KP_SLASH, KC_7, KC_8, KC_9, KC_KP_MINUS, KC_TRNS,
+ KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_END, KC_KP_ASTERISK, KC_4, KC_5, KC_6, KC_KP_PLUS, KC_TRNS,
+ KC_LSFT, KC_ESC, KC_TAB, KC_INS, KC_ENTER, N_UNDO, KC_KP_ENTER, KC_1, KC_2, KC_3, KC_KP_DOT, KC_RSFT,
+ KC_LCTL, N_COPY, N_PASTE, KC_LGUI, KC_LALT, KC_0, KC_ENTER, KC_0, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [_7] = LAYOUT(
+ KC_ESC, KC_TRNS, KC_TRNS, KC_MS_BTN3, 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_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_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_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
+ )
+};
diff --git a/keyboards/atreus62/keymaps/scheiklp/readme.md b/keyboards/atreus62/keymaps/scheiklp/readme.md
new file mode 100644
index 0000000000..b5590b6f2f
--- /dev/null
+++ b/keyboards/atreus62/keymaps/scheiklp/readme.md
@@ -0,0 +1,13 @@
+# KOY Layout for the atreus62 pcb board
+Compile the layout
+```bash
+qmk compile -kb atreus62 -km scheiklp
+```
+disable this service that interfers with the pro micro
+```
+sudo systemctl stop ModemManager.service
+```
+and flash it to the board
+```bash
+qmk flash -kb atreus62 -km scheiklp
+```
diff --git a/keyboards/atreus62/keymaps/scheiklp/rules.mk b/keyboards/atreus62/keymaps/scheiklp/rules.mk
new file mode 100644
index 0000000000..681e7507b4
--- /dev/null
+++ b/keyboards/atreus62/keymaps/scheiklp/rules.mk
@@ -0,0 +1,4 @@
+AUTO_SHIFT_ENABLE = yes
+CONSOLE_ENABLE = no
+COMMAND_ENABLE = no
+NKRO_ENABLE = yes
diff --git a/keyboards/aves65/aves65.c b/keyboards/aves65/aves65.c
new file mode 100644
index 0000000000..35b93f7aee
--- /dev/null
+++ b/keyboards/aves65/aves65.c
@@ -0,0 +1 @@
+#include "aves65.h"
diff --git a/keyboards/aves65/aves65.h b/keyboards/aves65/aves65.h
new file mode 100644
index 0000000000..ee35909efa
--- /dev/null
+++ b/keyboards/aves65/aves65.h
@@ -0,0 +1,19 @@
+#pragma once
+#include "quantum.h"
+
+// readability
+#define ___ KC_NO
+#define LAYOUT_65_iso_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, 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, 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, ___, 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, ___, ___, ___, k4a, k4b, k4c, k4d, k4e } \
+}
diff --git a/keyboards/aves65/config.h b/keyboards/aves65/config.h
new file mode 100644
index 0000000000..033100b549
--- /dev/null
+++ b/keyboards/aves65/config.h
@@ -0,0 +1,61 @@
+/*
+Copyright 2019 I/O Keyboards <hello@iokeyboards.eu>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x9991
+#define PRODUCT_ID 0x9038
+#define DEVICE_VER 0x0001
+#define MANUFACTURER I/O Keyboards
+#define PRODUCT Aves65
+#define DESCRIPTION A 65% keyboard with underglow.
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 15
+
+// ROWS: Top to bottom, COLS: Left to right
+
+#define MATRIX_ROW_PINS {D4,D6,D7,B4,E6}
+#define MATRIX_COL_PINS {D0,D1,D2,D3,D5,B5,F0,F1,F4,F5,F6,F7,C7,C6,B6}
+#define UNUSED_PINS {B7,B1,B2,B3}
+
+/* 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
+
+/* Backlight configuration
+ */
+#define RGB_DI_PIN B0
+#define RGBLIGHT_ANIMATIONS
+#define RGBLED_NUM 9
+
+#define QMK_ESC_OUTPUT D0 // usually COL
+#define QMK_ESC_INPUT D4 // usually ROW
diff --git a/keyboards/aves65/info.json b/keyboards/aves65/info.json
new file mode 100644
index 0000000000..9454f11835
--- /dev/null
+++ b/keyboards/aves65/info.json
@@ -0,0 +1,85 @@
+{
+ "keyboard_name": "Aves65",
+ "url": "",
+ "maintainer": "Hund",
+ "width": 16,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_65_iso_blocker": {
+ "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, "w":2},
+ {"label":"k0e", "x":15, "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":"k1e", "x":15, "y":1},
+
+ {"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":1, "w":1.25, "h":2},
+ {"label":"k2e", "x":15, "y":2},
+
+ {"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":"k3e", "x":15, "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":"k46", "x":3.75, "y":4, "w":6.25},
+ {"label":"k4a", "x":10, "y":4, "w":1.25},
+ {"label":"k4b", "x":11.25, "y":4, "w":1.25},
+ {"label":"k4c", "x":13, "y":4},
+ {"label":"k4d", "x":14, "y":4},
+ {"label":"k4e", "x":15, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/aves65/keymaps/default/keymap.c b/keyboards/aves65/keymaps/default/keymap.c
new file mode 100644
index 0000000000..3b093cad04
--- /dev/null
+++ b/keyboards/aves65/keymaps/default/keymap.c
@@ -0,0 +1,18 @@
+#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_65_iso_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_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_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_RCTRL, KC_LEFT, KC_DOWN, KC_RGHT)
+
+};
diff --git a/keyboards/aves65/readme.md b/keyboards/aves65/readme.md
new file mode 100644
index 0000000000..a4cd4e6ee3
--- /dev/null
+++ b/keyboards/aves65/readme.md
@@ -0,0 +1,15 @@
+# Aves65
+
+![Aves65](https://i.imgur.com/H7x8an7l.jpg)
+
+A 65% hotswap keyboard with RGB underglow.
+
+* Keyboard Maintainer: [Hund](https://github.com/Hund)
+* Hardware Supported: Aves65
+* Hardware Availability: none (yet)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make aves65: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/aves65/rules.mk b/keyboards/aves65/rules.mk
new file mode 100644
index 0000000000..911c1d95ab
--- /dev/null
+++ b/keyboards/aves65/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 = qmk-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 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_iso_blocker
diff --git a/keyboards/baguette/readme.md b/keyboards/baguette/readme.md
index e6188cc990..501f81b328 100644
--- a/keyboards/baguette/readme.md
+++ b/keyboards/baguette/readme.md
@@ -5,7 +5,7 @@ Baguette
This is a custom keyboard with backlight inspired by France.
-Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar)
+Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
Hardware Supported: ATMEGA 32u4 MCU with backlight support.
Hardware Availability: Closed group-buy please contact the runners (Tesletron and Enjoy)
diff --git a/keyboards/bakeneko80/bakeneko80.c b/keyboards/bakeneko80/bakeneko80.c
new file mode 100644
index 0000000000..264979f550
--- /dev/null
+++ b/keyboards/bakeneko80/bakeneko80.c
@@ -0,0 +1,17 @@
+/* Copyright 2020 Koichi Katano
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "bakeneko80.h" \ No newline at end of file
diff --git a/keyboards/bakeneko80/bakeneko80.h b/keyboards/bakeneko80/bakeneko80.h
new file mode 100644
index 0000000000..9c30a57566
--- /dev/null
+++ b/keyboards/bakeneko80/bakeneko80.h
@@ -0,0 +1,44 @@
+/* Copyright 2020 Koichi Katano
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#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_tkl_ansi( \
+ k000, k002, k003, k004, k005, k006, k007, k008, k009, k010, k011, k012, k013, 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, k313, \
+ k400, k402, k403, k404, k405, k406, k407, k408, k409, k410, k411, k412, k415, \
+ k500, k501, k502, k506, k510, k511, k512, k513, k514, k515, k516 \
+) \
+{ \
+ { k000, KC_NO, k002, k003, k004, k005, k006, k007, k008, k009, k010, k011, k012, k013, 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, KC_NO, k313, KC_NO, KC_NO, KC_NO }, \
+ { k400, KC_NO, k402, k403, k404, k405, k406, k407, k408, k409, k410, k411, k412, KC_NO, KC_NO, k415, KC_NO }, \
+ { k500, k501, k502, KC_NO, KC_NO, KC_NO, k506, KC_NO, KC_NO, KC_NO, k510, k511, k512, k513, k514, k515, k516 } \
+}
diff --git a/keyboards/bakeneko80/config.h b/keyboards/bakeneko80/config.h
new file mode 100644
index 0000000000..04b2569e28
--- /dev/null
+++ b/keyboards/bakeneko80/config.h
@@ -0,0 +1,250 @@
+/*
+Copyright 2020 Koichi Katano
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x8DEF
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Koichi Katano
+#define PRODUCT Bakeneko 80
+#define DESCRIPTION Open source tenkeyless keyboard
+
+/* 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 { E6, B0, B1, B7, D1, D0 }
+#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, C7, C6, B6, B5, B4, D7, D6, D4, D5, D3, D2 }
+#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/bakeneko80/info.json b/keyboards/bakeneko80/info.json
new file mode 100644
index 0000000000..4d6b44f05f
--- /dev/null
+++ b/keyboards/bakeneko80/info.json
@@ -0,0 +1,13 @@
+{
+ "keyboard_name": "Bakeneko 80",
+ "url": "https://github.com/kkatano/bakeneko-80-pcb",
+ "maintainer": "Koichi Katano",
+ "width": 18.25,
+ "height": 6.25,
+ "layouts": {
+ "LAYOUT_tkl_ansi": {
+ "key_count": 87,
+ "layout": [{"label":"1", "x":0, "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.5, "y":0}, {"label":"7", "x":7.5, "y":0}, {"label":"8", "x":8.5, "y":0}, {"label":"9", "x":9.5, "y":0}, {"label":"10", "x":11, "y":0}, {"label":"11", "x":12, "y":0}, {"label":"12", "x":13, "y":0}, {"label":"13", "x":14, "y":0}, {"label":"14", "x":15.25, "y":0}, {"label":"15", "x":16.25, "y":0}, {"label":"16", "x":17.25, "y":0}, {"label":"17", "x":0, "y":1.25}, {"label":"18", "x":1, "y":1.25}, {"label":"19", "x":2, "y":1.25}, {"label":"20", "x":3, "y":1.25}, {"label":"21", "x":4, "y":1.25}, {"label":"22", "x":5, "y":1.25}, {"label":"23", "x":6, "y":1.25}, {"label":"24", "x":7, "y":1.25}, {"label":"25", "x":8, "y":1.25}, {"label":"26", "x":9, "y":1.25}, {"label":"27", "x":10, "y":1.25}, {"label":"28", "x":11, "y":1.25}, {"label":"29", "x":12, "y":1.25}, {"label":"30", "x":13, "y":1.25, "w":2}, {"label":"31", "x":15.25, "y":1.25}, {"label":"32", "x":16.25, "y":1.25}, {"label":"33", "x":17.25, "y":1.25}, {"label":"34", "x":0, "y":2.25, "w":1.5}, {"label":"35", "x":1.5, "y":2.25}, {"label":"36", "x":2.5, "y":2.25}, {"label":"37", "x":3.5, "y":2.25}, {"label":"38", "x":4.5, "y":2.25}, {"label":"39", "x":5.5, "y":2.25}, {"label":"40", "x":6.5, "y":2.25}, {"label":"41", "x":7.5, "y":2.25}, {"label":"42", "x":8.5, "y":2.25}, {"label":"43", "x":9.5, "y":2.25}, {"label":"44", "x":10.5, "y":2.25}, {"label":"45", "x":11.5, "y":2.25}, {"label":"46", "x":12.5, "y":2.25}, {"label":"47", "x":13.5, "y":2.25, "w":1.5}, {"label":"48", "x":15.25, "y":2.25}, {"label":"49", "x":16.25, "y":2.25}, {"label":"50", "x":17.25, "y":2.25}, {"label":"51", "x":0, "y":3.25, "w":1.75}, {"label":"52", "x":1.75, "y":3.25}, {"label":"53", "x":2.75, "y":3.25}, {"label":"54", "x":3.75, "y":3.25}, {"label":"55", "x":4.75, "y":3.25}, {"label":"56", "x":5.75, "y":3.25}, {"label":"57", "x":6.75, "y":3.25}, {"label":"58", "x":7.75, "y":3.25}, {"label":"59", "x":8.75, "y":3.25}, {"label":"60", "x":9.75, "y":3.25}, {"label":"61", "x":10.75, "y":3.25}, {"label":"62", "x":11.75, "y":3.25}, {"label":"63", "x":12.75, "y":3.25, "w":2.25}, {"label":"64", "x":0, "y":4.25, "w":2.25}, {"label":"65", "x":2.25, "y":4.25}, {"label":"66", "x":3.25, "y":4.25}, {"label":"67", "x":4.25, "y":4.25}, {"label":"68", "x":5.25, "y":4.25}, {"label":"69", "x":6.25, "y":4.25}, {"label":"70", "x":7.25, "y":4.25}, {"label":"71", "x":8.25, "y":4.25}, {"label":"72", "x":9.25, "y":4.25}, {"label":"73", "x":10.25, "y":4.25}, {"label":"74", "x":11.25, "y":4.25}, {"label":"75", "x":12.25, "y":4.25, "w":2.75}, {"label":"76", "x":16.25, "y":4.25}, {"label":"77", "x":0, "y":5.25, "w":1.25}, {"label":"78", "x":1.25, "y":5.25, "w":1.25}, {"label":"79", "x":2.5, "y":5.25, "w":1.25}, {"label":"80", "x":3.75, "y":5.25, "w":6.25}, {"label":"81", "x":10, "y":5.25, "w":1.25}, {"label":"82", "x":11.25, "y":5.25, "w":1.25}, {"label":"83", "x":12.5, "y":5.25, "w":1.25}, {"label":"84", "x":13.75, "y":5.25, "w":1.25}, {"label":"85", "x":15.25, "y":5.25}, {"label":"86", "x":16.25, "y":5.25}, {"label":"87", "x":17.25, "y":5.25}]
+ }
+ }
+} \ No newline at end of file
diff --git a/keyboards/bakeneko80/keymaps/default/keymap.c b/keyboards/bakeneko80/keymaps/default/keymap.c
new file mode 100644
index 0000000000..ff02728043
--- /dev/null
+++ b/keyboards/bakeneko80/keymaps/default/keymap.c
@@ -0,0 +1,40 @@
+/* Copyright 2020 Koichi Katano
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+ _BASE,
+ _FN
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = 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, LT(_FN, KC_APP), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [_FN] = LAYOUT_tkl_ansi(
+ RESET, KC_MUTE, KC_VOLD, KC_VOLU, _______, KC_BRID, KC_BRIU, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+}; \ No newline at end of file
diff --git a/keyboards/bakeneko80/keymaps/default/readme.md b/keyboards/bakeneko80/keymaps/default/readme.md
new file mode 100644
index 0000000000..65fe06599d
--- /dev/null
+++ b/keyboards/bakeneko80/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for bakeneko80
diff --git a/keyboards/bakeneko80/readme.md b/keyboards/bakeneko80/readme.md
new file mode 100644
index 0000000000..30f1b3e608
--- /dev/null
+++ b/keyboards/bakeneko80/readme.md
@@ -0,0 +1,13 @@
+# Bakeneko 80
+
+Open source tenkeyless keyboard for DIYers
+
+* Keyboard Maintainer: [Koichi Katano](https://github.com/kkatano)
+* Hardware Supported: Bakeneko 80 PCB
+* Hardware Availability: [PCB](https://github.com/kkatano/bakeneko-80-pcb), [Case and Plate](https://github.com/kkatano/bakeneko-80-case)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make bakeneko80: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/bakeneko80/rules.mk b/keyboards/bakeneko80/rules.mk
new file mode 100644
index 0000000000..1f9b6d4daa
--- /dev/null
+++ b/keyboards/bakeneko80/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 = 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 = tkl_ansi
diff --git a/keyboards/basekeys/slice/rev1/config.h b/keyboards/basekeys/slice/rev1/config.h
index a02154d82b..d151d5873f 100644
--- a/keyboards/basekeys/slice/rev1/config.h
+++ b/keyboards/basekeys/slice/rev1/config.h
@@ -28,7 +28,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* key matrix size */
#define MATRIX_ROWS 10
-#define MATRIX_COLS 18
+#define MATRIX_COLS 9
// wiring of each half
#define MATRIX_ROW_PINS { D4, C6, D7, E6, B4 }
diff --git a/keyboards/basekeys/slice/rev1_rgb/config.h b/keyboards/basekeys/slice/rev1_rgb/config.h
index 6d423d9b5e..1145d08647 100644
--- a/keyboards/basekeys/slice/rev1_rgb/config.h
+++ b/keyboards/basekeys/slice/rev1_rgb/config.h
@@ -28,7 +28,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* key matrix size */
#define MATRIX_ROWS 10
-#define MATRIX_COLS 18
+#define MATRIX_COLS 9
// wiring of each half
#define MATRIX_ROW_PINS { D4, C6, D7, E6, B4 }
diff --git a/keyboards/bfake/rules.mk b/keyboards/bfake/rules.mk
index 17922fabf4..5846b173ba 100644
--- a/keyboards/bfake/rules.mk
+++ b/keyboards/bfake/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = no
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/boardsource/3x4/3x4.c b/keyboards/boardsource/3x4/3x4.c
new file mode 100644
index 0000000000..798d5a65c4
--- /dev/null
+++ b/keyboards/boardsource/3x4/3x4.c
@@ -0,0 +1 @@
+#include "3x4.h"
diff --git a/keyboards/boardsource/3x4/3x4.h b/keyboards/boardsource/3x4/3x4.h
new file mode 100644
index 0000000000..a27d32c74f
--- /dev/null
+++ b/keyboards/boardsource/3x4/3x4.h
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "quantum.h"
+#define LAYOUT( \
+ K00, K01, K02, K03, \
+ K10, K11, K12, K13, \
+ K20, K21, K22, K23 \
+ ) { \
+ {K00, K01, K02, K03}, \
+ {K10, K11, K12, K13}, \
+ {K20, K21, K22, K23} \
+ }
diff --git a/keyboards/boardsource/3x4/config.h b/keyboards/boardsource/3x4/config.h
new file mode 100644
index 0000000000..95c6f9ac27
--- /dev/null
+++ b/keyboards/boardsource/3x4/config.h
@@ -0,0 +1,144 @@
+
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xF7E0
+#define PRODUCT_ID 0x0412
+#define DEVICE_VER 0x0000
+#define MANUFACTURER Boardsource
+#define PRODUCT 3x4
+#define DESCRIPTION Little macro pad
+
+/* key matrix size */
+#define MATRIX_ROWS 3
+#define MATRIX_COLS 4
+
+#define MATRIX_ROW_PINS { F7, F6, F5,}
+#define MATRIX_COL_PINS {B6, B2, B3, B1}
+
+#define DIODE_DIRECTION COL2ROW
+
+#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
+
+/*
+ * 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
diff --git a/keyboards/boardsource/3x4/info.json b/keyboards/boardsource/3x4/info.json
new file mode 100644
index 0000000000..4ef02873e3
--- /dev/null
+++ b/keyboards/boardsource/3x4/info.json
@@ -0,0 +1,28 @@
+{
+ "keyboard_name": "boardsource 4x3",
+ "url": "https://boardsource.xyz",
+ "maintainer": "boardsource",
+ "width": 4,
+ "height": 3,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ { "label": "K01", "x": 0, "y": 0 },
+ { "label": "K02", "x": 1, "y": 0 },
+ { "label": "K03", "x": 2, "y": 0 },
+
+ { "label": "K04", "x": 0, "y": 1 },
+ { "label": "K05", "x": 1, "y": 1 },
+ { "label": "K06", "x": 2, "y": 1 },
+
+ { "label": "K07", "x": 0, "y": 2 },
+ { "label": "K08", "x": 1, "y": 2 },
+ { "label": "K09", "x": 2, "y": 2 },
+
+ { "label": "K10", "x": 0, "y": 3 },
+ { "label": "K11", "x": 1, "y": 3 },
+ { "label": "K12", "x": 2, "y": 3 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/boardsource/3x4/keymaps/default/keymap.c b/keyboards/boardsource/3x4/keymaps/default/keymap.c
new file mode 100644
index 0000000000..3add4f7fbf
--- /dev/null
+++ b/keyboards/boardsource/3x4/keymaps/default/keymap.c
@@ -0,0 +1,25 @@
+
+#include QMK_KEYBOARD_H
+
+#define _MAIN 0
+#define _RAISE 1
+#define _LOWER 2
+
+// Readability keycodes
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_MAIN] = LAYOUT(
+ KC_0, KC_1, KC_4, KC_7,
+ KC_ENT, KC_2, KC_5, KC_8,
+ RAISE, KC_3, KC_6, KC_9
+ ),
+ [_RAISE] = LAYOUT(
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, RESET
+ )
+
+};
diff --git a/keyboards/boardsource/3x4/readme.md b/keyboards/boardsource/3x4/readme.md
new file mode 100644
index 0000000000..67a22ed4c0
--- /dev/null
+++ b/keyboards/boardsource/3x4/readme.md
@@ -0,0 +1,14 @@
+# 3x4
+![Boardsource 3x4 macro](https://i.imgur.com/EiPF1hh.jpg)
+
+this macro pad / small 12 key was inspired by the plaid look
+
+* Keyboard Maintainer: [Boardsource](https://github.com/daysgobye)
+* Hardware Supported: 3x4 v1
+* Hardware Availability: [Boardsource store](https://boardsource.xyz/store/5ecc2008eee64242946c98c1)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make boardsource/3x4: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/boardsource/3x4/rules.mk b/keyboards/boardsource/3x4/rules.mk
new file mode 100644
index 0000000000..263c586048
--- /dev/null
+++ b/keyboards/boardsource/3x4/rules.mk
@@ -0,0 +1,31 @@
+# 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
+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
diff --git a/keyboards/bpiphany/pegasushoof/keymaps/blowrak/keymap.c b/keyboards/bpiphany/pegasushoof/keymaps/blowrak/keymap.c
index aad2d643cd..f9234a7b2f 100644
--- a/keyboards/bpiphany/pegasushoof/keymaps/blowrak/keymap.c
+++ b/keyboards/bpiphany/pegasushoof/keymaps/blowrak/keymap.c
@@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TAB, SE_AO, SE_AE, SE_OE, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_COMM,SE_CIRC,SE_QUOT, KC_DEL, KC_END, KC_PGDN, \
KC_LCTRL,KC_A, KC_O, KC_E, KC_U, KC_I, KC_H, KC_D, KC_T, KC_N, KC_S, SE_MINS, KC_ENT, \
KC_LSFT, SE_LTGT,KC_DOT, KC_Q, KC_J, KC_K, KC_B, KC_X, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_UP, \
- MO(KM_MEDIA),KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_MENU,KC_FN1, KC_LEFT,KC_DOWN,KC_RGHT),
+ MO(KM_MEDIA),KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_MENU,TG(KM_QWERTY), KC_LEFT,KC_DOWN,KC_RGHT),
/* Layer 1: Standard ISO layer */
[KM_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_PSCR,KC_SLCK,KC_PAUS, \
@@ -56,7 +56,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, SE_AO, SE_CIRC,SE_QUOT, KC_DEL, KC_END, KC_PGDN, \
KC_LCTRL,KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, SE_OE, SE_AE, KC_ENT, \
KC_LSFT, SE_LTGT,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, SE_MINS, KC_RSFT, KC_UP, \
- MO(KM_MEDIA),KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_MENU,KC_FN1, KC_LEFT,KC_DOWN,KC_RGHT),
+ MO(KM_MEDIA),KC_LGUI,KC_LALT, KC_SPC, KC_RALT,KC_RGUI,KC_MENU,TG(KM_QWERTY), KC_LEFT,KC_DOWN,KC_RGHT),
/* Layer 2: Media layer */
[KM_MEDIA] = LAYOUT( \
_______, _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, KC_WAKE,KC_PWR, KC_SLEP, \
@@ -75,10 +75,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______,_______,_______, _______, _______,_______,_______,_______, _______,_______,_______),
};
-const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_LAYER_TOGGLE(KM_QWERTY)
-};
-
void matrix_scan_user(void)
{
uint8_t layer = biton32(layer_state);
diff --git a/keyboards/candybar/lefty/config.h b/keyboards/candybar/lefty/config.h
index c153967130..e8a1f00815 100644
--- a/keyboards/candybar/lefty/config.h
+++ b/keyboards/candybar/lefty/config.h
@@ -19,8 +19,8 @@
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x6060
+#define VENDOR_ID 0x544B //TK
+#define PRODUCT_ID 0x0003
#define DEVICE_VER 0x0006
#define MANUFACTURER The Key Company
#define PRODUCT Candybar
diff --git a/keyboards/candybar/lefty/keymaps/via/keymap.c b/keyboards/candybar/lefty/keymaps/via/keymap.c
new file mode 100644
index 0000000000..153fd99c50
--- /dev/null
+++ b/keyboards/candybar/lefty/keymaps/via/keymap.c
@@ -0,0 +1,38 @@
+/* Copyright 2018 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+
+#define _BL 0
+#define _FL 1
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Keymap _BL: Base Layer (Default Layer)
+ */
+[_BL] = LAYOUT(
+ KC_P7 , KC_P8, KC_P9 , KC_PAST, KC_ESC , KC_Q , KC_W , KC_E, KC_R , KC_T , KC_Y, KC_U , KC_I , KC_O , KC_P , KC_DEL , KC_BSPC , \
+ KC_P4 , KC_P5, KC_P6 , KC_PMNS, 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_P1 , KC_P2, KC_P3 , KC_PPLS, KC_LSFT, KC_Z , KC_X, KC_C , KC_V , KC_B, KC_N , KC_M , KC_COMM, KC_DOT , KC_UP ,KC_RSFT , \
+ MO(_FL), KC_P0, KC_PDOT, KC_PENT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC , KC_BSPC, KC_APP , KC_LEFT, KC_DOWN, KC_RGHT),
+
+ /* Keymap _FL: Function Layer
+ */
+ [_FL] = LAYOUT(
+ KC_P7 , KC_P8, KC_P9 , KC_VOLU, RESET , KC_Q , KC_W , KC_E, KC_R , KC_T , KC_Y, KC_U , KC_I , KC_LBRC, KC_RBRC, KC_INS , KC_BSPC , \
+ KC_P4 , KC_P5, KC_P6 , KC_VOLD, KC_TAB , KC_A , KC_SLCK, KC_D, KC_F , KC_G , KC_H, KC_J , KC_K , KC_L , KC_QUOT, KC_BSLS , \
+ KC_P1 , KC_P2, KC_P3 , KC_PEQL, KC_LSFT, KC_Z , KC_X, KC_CAPS, KC_V , KC_B, KC_NLCK, KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_PGUP , \
+ KC_END, KC_P0, KC_PDOT, KC_PENT, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC , KC_BSPC, KC_APP , MO(_FL), KC_HOME, KC_PGDN),
+};
diff --git a/keyboards/candybar/lefty/keymaps/via/rules.mk b/keyboards/candybar/lefty/keymaps/via/rules.mk
new file mode 100644
index 0000000000..036bd6d1c3
--- /dev/null
+++ b/keyboards/candybar/lefty/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes \ No newline at end of file
diff --git a/keyboards/candybar/lefty/rules.mk b/keyboards/candybar/lefty/rules.mk
index cb1b832886..52ef91c47f 100644
--- a/keyboards/candybar/lefty/rules.mk
+++ b/keyboards/candybar/lefty/rules.mk
@@ -7,7 +7,7 @@ MCU = STM32F072
# EXTRAFLAGS+=-flto
LINK_TIME_OPTIMIZATION_ENABLE = yes
BACKLIGHT_ENABLE = no
-BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
## (Note that for BOOTMAGIC on Teensy LC you have to use a custom .ld script.)
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
diff --git a/keyboards/candybar/righty/config.h b/keyboards/candybar/righty/config.h
index c153967130..5004537846 100644
--- a/keyboards/candybar/righty/config.h
+++ b/keyboards/candybar/righty/config.h
@@ -19,8 +19,8 @@
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x6060
+#define VENDOR_ID 0x544B //TK
+#define PRODUCT_ID 0x0002
#define DEVICE_VER 0x0006
#define MANUFACTURER The Key Company
#define PRODUCT Candybar
diff --git a/keyboards/candybar/righty/keymaps/via/keymap.c b/keyboards/candybar/righty/keymaps/via/keymap.c
new file mode 100644
index 0000000000..8f4cc08c74
--- /dev/null
+++ b/keyboards/candybar/righty/keymaps/via/keymap.c
@@ -0,0 +1,38 @@
+/* Copyright 2018 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+
+#define _BL 0
+#define _FL 1
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /* Keymap _BL: Base Layer (Default Layer)
+ */
+[_BL] = LAYOUT(
+ KC_ESC,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_Y,KC_U,KC_I,KC_O,KC_P,KC_DEL,KC_BSPC,KC_P7,KC_P8,KC_P9,KC_PAST, \
+ 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_P4,KC_P5,KC_P6,KC_PMNS, \
+ KC_LSFT,KC_Z,KC_X,KC_C,KC_V,KC_B,KC_N,KC_M,KC_COMM,KC_DOT,KC_RSFT,KC_UP,KC_P1,KC_P2,KC_P3,KC_PPLS, \
+ KC_LCTL,KC_LGUI,KC_LALT,KC_SPC,KC_SPC,KC_BSPC,KC_APP,MO(_FL),KC_LEFT,KC_DOWN,KC_RGHT,KC_P0,KC_PDOT,KC_PENT),
+
+ /* Keymap _FL: Function Layer
+ */
+[_FL] = LAYOUT(
+ RESET,KC_Q,KC_W,KC_E,KC_R,KC_T,KC_Y,KC_U,KC_I,KC_LBRC,KC_RBRC,KC_INS,KC_BSPC,KC_P7,KC_P8,KC_P9,KC_VOLU, \
+ KC_TAB,KC_A,KC_SLCK,KC_D,KC_F,KC_G,KC_H,KC_J,KC_K,KC_L,KC_QUOT,KC_BSLS,KC_P4,KC_P5,KC_P6,KC_VOLD, \
+ KC_LSFT,KC_Z,KC_X,KC_CAPS,KC_V,KC_B,KC_NLCK,KC_M,KC_COMM,KC_DOT,KC_SLSH,KC_PGUP,KC_P1,KC_P2,KC_P3,KC_PEQL, \
+ KC_LCTL,KC_LGUI,KC_LALT,KC_SPC,KC_SPC,KC_BSPC,KC_APP,MO(_FL),KC_HOME,KC_PGDN,KC_END,KC_P0,KC_PDOT,KC_PENT),
+};
diff --git a/keyboards/candybar/righty/keymaps/via/rules.mk b/keyboards/candybar/righty/keymaps/via/rules.mk
new file mode 100644
index 0000000000..036bd6d1c3
--- /dev/null
+++ b/keyboards/candybar/righty/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes \ No newline at end of file
diff --git a/keyboards/candybar/righty/rules.mk b/keyboards/candybar/righty/rules.mk
index cb1b832886..52ef91c47f 100644
--- a/keyboards/candybar/righty/rules.mk
+++ b/keyboards/candybar/righty/rules.mk
@@ -7,7 +7,7 @@ MCU = STM32F072
# EXTRAFLAGS+=-flto
LINK_TIME_OPTIMIZATION_ENABLE = yes
BACKLIGHT_ENABLE = no
-BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
## (Note that for BOOTMAGIC on Teensy LC you have to use a custom .ld script.)
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
diff --git a/keyboards/chidori/keymaps/oled_sample/keymap.c b/keyboards/chidori/keymaps/oled_sample/keymap.c
new file mode 100644
index 0000000000..6c9b7869ba
--- /dev/null
+++ b/keyboards/chidori/keymaps/oled_sample/keymap.c
@@ -0,0 +1,217 @@
+/* Copyright 2019 ENDO Katsuhiro <ka2hiro@kagizaraya.jp>
+ * 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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..38f8a146a5
--- /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 0000000000..cc60236cac
--- /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/chimera_ortho_plus/chimera_ortho_plus.c b/keyboards/chimera_ortho_plus/chimera_ortho_plus.c
new file mode 100644
index 0000000000..1972f2a9c3
--- /dev/null
+++ b/keyboards/chimera_ortho_plus/chimera_ortho_plus.c
@@ -0,0 +1,23 @@
+#include "chimera_ortho_plus.h"
+
+void uart_init(void) {
+ SERIAL_UART_INIT();
+}
+
+void led_init(void) {
+ setPinOutput(D1);
+ setPinOutput(F4);
+ setPinOutput(F5);
+ writePinHigh(D1);
+ writePinHigh(F4);
+ writePinHigh(F5);
+}
+
+
+void matrix_init_kb(void) {
+ // put your keyboard start-up code here
+ // runs once when the firmware starts up
+ matrix_init_user();
+ uart_init();
+ led_init();
+}
diff --git a/keyboards/chimera_ortho_plus/chimera_ortho_plus.h b/keyboards/chimera_ortho_plus/chimera_ortho_plus.h
new file mode 100644
index 0000000000..f75dc61057
--- /dev/null
+++ b/keyboards/chimera_ortho_plus/chimera_ortho_plus.h
@@ -0,0 +1,38 @@
+#pragma once
+
+#include "quantum.h"
+
+#define red_led_off PORTF |= (1<<5)
+#define red_led_on PORTF &= ~(1<<5)
+#define blu_led_off PORTF |= (1<<4)
+#define blu_led_on PORTF &= ~(1<<4)
+#define grn_led_off PORTD |= (1<<1)
+#define grn_led_on PORTD &= ~(1<<1)
+
+#define set_led_off red_led_off; grn_led_off; blu_led_off
+#define set_led_red red_led_on; grn_led_off; blu_led_off
+#define set_led_blue red_led_off; grn_led_off; blu_led_on
+#define set_led_green red_led_off; grn_led_on; blu_led_off
+#define set_led_yellow red_led_on; grn_led_on; blu_led_off
+#define set_led_magenta red_led_on; grn_led_off; blu_led_on
+#define set_led_cyan red_led_off; grn_led_on; blu_led_on
+#define set_led_white red_led_on; grn_led_on; blu_led_on
+
+// 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 two-dimensional array
+
+#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, k35, \
+ k36, k37, k38, k39, k40, k41, k42, k43, k44, k45, k46, k47, \
+ k48, k49, k50, k51 \
+) \
+{ \
+ { k03, k40, k26, k15, k28, k01, k42, k31, k20, k33, k08, k10 }, \
+ { k00, k37, k14, k27, k16, k36, k47, k19, k32, k21, k46, k11 }, \
+ { k12, k25, k02, k39, k17, k49, k50, k18, k44, k09, k34, k23 }, \
+ { k24, k13, k38, k04, k05, k48, k51, k06, k07, k45, k22, k35 }, \
+ { k29, k41, KC_NO, KC_NO, KC_NO, KC_NO, k30, k43, KC_NO, KC_NO, KC_NO, KC_NO } \
+}
diff --git a/keyboards/chimera_ortho_plus/config.h b/keyboards/chimera_ortho_plus/config.h
new file mode 100644
index 0000000000..d47c1a7640
--- /dev/null
+++ b/keyboards/chimera_ortho_plus/config.h
@@ -0,0 +1,76 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0xDE1D
+#define DEVICE_VER 0x0001
+#define MANUFACTURER unknown
+#define PRODUCT Chimera Ortho Plus
+#define DESCRIPTION q.m.k. keyboard firmware for Chimera Ortho Plus
+
+/* key matrix size */
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 12
+
+/* 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)
diff --git a/keyboards/chimera_ortho_plus/info.json b/keyboards/chimera_ortho_plus/info.json
new file mode 100644
index 0000000000..7c892c4419
--- /dev/null
+++ b/keyboards/chimera_ortho_plus/info.json
@@ -0,0 +1,65 @@
+{
+ "keyboard_name": "Chimera Ortho Plus",
+ "keyboard_folder": "chimera_ortho_plus",
+ "maintainer": "qmk",
+ "width": 13.5,
+ "height": 6,
+ "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": 7.5, "y": 0},
+ {"label": "7", "x": 8.5, "y": 0},
+ {"label": "8", "x": 9.5, "y": 0},
+ {"label": "9", "x": 10.5, "y": 0},
+ {"label": "0", "x": 11.5, "y": 0},
+ {"label": "}", "x": 12.5, "y": 0},
+ {"label": "Esc", "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": 7.5, "y": 1},
+ {"label": "U", "x": 8.5, "y": 1},
+ {"label": "I", "x": 9.5, "y": 1},
+ {"label": "O", "x": 10.5, "y": 1},
+ {"label": "P", "x": 11.5, "y": 1},
+ {"label": "\"", "x": 12.5, "y": 1},
+ {"label": "Tab", "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": 7.5, "y": 2},
+ {"label": "J", "x": 8.5, "y": 2},
+ {"label": "K", "x": 9.5, "y": 2},
+ {"label": "L", "x": 10.5, "y": 2},
+ {"label": ";", "x": 11.5, "y": 2},
+ {"label": "Enter", "x": 12.5, "y": 2},
+ {"label": "(", "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": 7.5, "y": 3},
+ {"label": "M", "x": 8.5, "y": 3},
+ {"label": ",", "x": 9.5, "y": 3},
+ {"label": ".", "x": 10.5, "y": 3},
+ {"label": "/", "x": 11.5, "y": 3},
+ {"label": ")", "x": 12.5, "y": 3},
+ {"label": "Num Layer", "x": 4, "y": 4},
+ {"label": "Back Space", "x": 5, "y": 4},
+ {"label": "Space", "x": 7.5, "y": 4},
+ {"label": "Symbol Layer", "x": 8.5, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/chimera_ortho_plus/keymaps/default/config.h b/keyboards/chimera_ortho_plus/keymaps/default/config.h
new file mode 100644
index 0000000000..bdfd4db80f
--- /dev/null
+++ b/keyboards/chimera_ortho_plus/keymaps/default/config.h
@@ -0,0 +1,5 @@
+#pragma once
+
+// place overrides here
+#define LONGPRESS_DELAY 150
+//#define LAYER_TOGGLE_DELAY 300
diff --git a/keyboards/chimera_ortho_plus/keymaps/default/keymap.c b/keyboards/chimera_ortho_plus/keymaps/default/keymap.c
new file mode 100644
index 0000000000..9b45037701
--- /dev/null
+++ b/keyboards/chimera_ortho_plus/keymaps/default/keymap.c
@@ -0,0 +1,185 @@
+#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 chimera_ortho_plus_layers {
+ _QWERTY,
+ _CAPS,
+ _NUMPAD,
+ _SYMBOLS,
+ _MACROS,
+ _NAV
+};
+
+#define KC_NMPD TG(_NUMPAD)
+#define KC_SYMB TG(_SYMBOLS)
+#define KC_SPFN LT(_NAV,KC_4)
+#define KC_SCTL MT(MOD_LCTL, KC_2)
+#define KC_SCTR MT(MOD_LCTL, KC_9)
+#define KC_SPLT MT(MOD_LALT, KC_3)
+#define KC_SPRT MT(MOD_LALT, KC_8)
+#define KC_GBRC MT(MOD_RGUI, KC_7)
+#define KC_GQOT MT(MOD_LGUI, KC_QUOT)
+#define KC_MESC LT(_MACROS, KC_ESC)
+#define KC_CAD LALT(LCTL(KC_DEL))
+
+enum custom_keycodes {
+ KC_INCL = SAFE_RANGE,
+ KC_PULL,
+ KC_PUSH,
+ KC_SCAP,
+ KC_SCOF
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [_QWERTY] = LAYOUT(
+ //,-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------.
+ KC_LBRC, KC_1 ,KC_SCTL,KC_SPLT,KC_SPFN, KC_5 , KC_6 ,KC_GBRC,KC_SPRT,KC_SCTR, KC_0 ,KC_RBRC,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_MESC, KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P ,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_LSPO, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_RSPC,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_NMPD,KC_BSPC, KC_SPC ,KC_SYMB
+ //|-------------------------------+-------+-------| |-------+-------+-------------------------------|
+ ),
+
+ [_CAPS] = LAYOUT(
+ //,-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------.
+ _______,KC_UNDS,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,_______,_______,_______,_______,_______, _______,_______,_______,_______,KC_COLN,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_SCOF,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,KC_SCOF,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,_______, _______,_______
+ //|-------------------------------+-------+-------| |-------+-------+-------------------------------|
+ ),
+
+ [_NUMPAD] = LAYOUT(
+ //,-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------.
+ _______,_______,_______,_______,_______,_______, _______,_______,_______,_______,KC_MINS,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,_______,KC_COLN,_______,_______,_______, _______, KC_7 , KC_8 , KC_9 ,KC_ASTR,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,_______,KC_DOT ,_______,_______,_______, _______, KC_4 , KC_5 , KC_6 ,KC_PLUS,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,_______,_______,_______,_______,_______, _______, KC_1 , KC_2 , KC_3 ,KC_SLSH,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,_______, _______, KC_0
+ //|-------------------------------+-------+-------/ |-------+-------+-------------------------------|
+ ),
+
+ [_SYMBOLS] = LAYOUT(
+ //,-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------.
+ _______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,KC_EXLM, KC_AT ,KC_HASH,KC_DLR ,KC_PERC, KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,KC_BSLS,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_TILD,KC_EQL ,KC_UNDS,KC_LCBR,KC_RCBR,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_F7 , KC_F8 , KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 , KC_GRV ,KC_PLUS,KC_MINS,KC_LBRC,KC_RBRC,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_PIPE,_______, _______,_______
+ //|-------------------------------+-------+-------| |-------+-------+-------------------------------|
+ ),
+
+ [_MACROS] = LAYOUT(
+ //,-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------.
+ _______,_______,_______,_______,_______,_______, _______ ,_______,_______,_______,_______,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,_______,_______,_______,_______,_______, _______ ,_______,KC_INCL,_______,_______,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,_______,_______,KC_CAD ,_______,_______, _______ ,_______,_______,_______,_______,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ KC_SCAP,_______,_______,_______,_______,_______, _______ ,_______,KC_PULL,KC_PUSH,_______,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,_______, _______,_______
+ //|-------------------------------+-------+-------| |-------+-------+-------------------------------|
+ ),
+
+ [_NAV] = LAYOUT(
+ //,-------+-------+-------+-------+-------+-------. ,-------+-------+-------+-------+-------+-------.
+ _______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,_______,_______,_______,_______,_______, _______,KC_PGUP, KC_UP ,KC_PGDN,KC_PSCR,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,_______,_______,_______,_______,_______, _______,KC_LEFT,KC_DOWN,KC_RGHT,_______,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,_______,
+ //|-------+-------+-------+-------+-------+-------| |-------+-------+-------+-------+-------+-------|
+ _______,KC_DEL , _______,_______
+ //|-------------------------------+-------+-------| |-------+-------+-------------------------------|
+ )
+};
+
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch(keycode) {
+ /* include some kind of library or header */
+ case KC_INCL:
+ if (record->event.pressed) {
+ SEND_STRING("#include <>" SS_TAP(X_LEFT));
+ }
+ return false;
+ case KC_PULL:
+ if (record->event.pressed) {
+ SEND_STRING("git pull\n");
+ }
+ return false;
+ case KC_PUSH:
+ if (record->event.pressed){
+ SEND_STRING("git push\n");
+ }
+ return false;
+ case KC_SCAP:
+ if (record->event.pressed){
+ layer_on(_CAPS);
+ tap_code(KC_CAPS);
+ }
+ return false;
+ case KC_SCOF:
+ if (record->event.pressed){
+ layer_off(_CAPS);
+ tap_code(KC_CAPS);
+ }
+ return false;
+ }
+ return true;
+};
+
+
+void matrix_scan_user(void) {
+ uint8_t layer = get_highest_layer(layer_state);
+
+ switch (layer) {
+ case _QWERTY:
+ set_led_green;
+ break;
+ case _CAPS:
+ set_led_white;
+ break;
+ case _NUMPAD:
+ set_led_blue;
+ break;
+ case _SYMBOLS:
+ set_led_red;
+ break;
+ case _MACROS:
+ set_led_cyan;
+ break;
+ case _NAV:
+ set_led_magenta;
+ break;
+ default:
+ set_led_green;
+ break;
+ }
+};
diff --git a/keyboards/chimera_ortho_plus/matrix.c b/keyboards/chimera_ortho_plus/matrix.c
new file mode 100644
index 0000000000..ed6eac2b09
--- /dev/null
+++ b/keyboards/chimera_ortho_plus/matrix.c
@@ -0,0 +1,154 @@
+/*
+Copyright 2012 Jun Wako
+Copyright 2014 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 <http://www.gnu.org/licenses/>.
+*/
+#include <stdint.h>
+#include <stdbool.h>
+#if defined(__AVR__)
+#include <avr/io.h>
+#endif
+#include "wait.h"
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+#include "timer.h"
+
+#if (MATRIX_COLS <= 8)
+# define print_matrix_header() print("\nr/c 01234567\n")
+# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
+# define matrix_bitpop(i) bitpop(matrix[i])
+# define ROW_SHIFTER ((uint8_t)1)
+#elif (MATRIX_COLS <= 16)
+# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
+# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
+# define matrix_bitpop(i) bitpop16(matrix[i])
+# define ROW_SHIFTER ((uint16_t)1)
+#elif (MATRIX_COLS <= 32)
+# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
+# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
+# define matrix_bitpop(i) bitpop32(matrix[i])
+# define ROW_SHIFTER ((uint32_t)1)
+#endif
+
+/* matrix state(1:on, 0:off) */
+static matrix_row_t matrix[MATRIX_ROWS];
+
+__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) {
+}
+
+inline
+uint8_t matrix_rows(void) {
+ return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void) {
+ return MATRIX_COLS;
+}
+
+void matrix_init(void) {
+
+ matrix_init_quantum();
+}
+
+uint8_t matrix_scan(void)
+{
+ SERIAL_UART_INIT();
+
+ uint32_t timeout = 0;
+
+ //the s character requests the RF slave to send the matrix
+ SERIAL_UART_DATA = 's';
+
+ //trust the external keystates entirely, erase the last data
+ uint8_t uart_data[14] = {0};
+
+ //there are 10 bytes corresponding to 10 columns, and an end byte
+ for (uint8_t i = 0; i < 14; i++) {
+ //wait for the serial data, timeout if it's been too long
+ //this only happened in testing with a loose wire, but does no
+ //harm to leave it in here
+ while(!SERIAL_UART_RXD_PRESENT){
+ timeout++;
+ if (timeout > 10000){
+ break;
+ }
+ }
+ uart_data[i] = SERIAL_UART_DATA;
+ }
+
+ //check for the end packet, the key state bytes use the LSBs, so 0xE0
+ //will only show up here if the correct bytes were recieved
+ if (uart_data[10] == 0xE0)
+ {
+ //shifting and transferring the keystates to the QMK matrix variable
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 6;
+ }
+ }
+
+
+ matrix_scan_quantum();
+ return 1;
+}
+
+inline
+bool matrix_is_on(uint8_t row, uint8_t col)
+{
+ return (matrix[row] & ((matrix_row_t)1<<col));
+}
+
+inline
+matrix_row_t matrix_get_row(uint8_t row)
+{
+ return matrix[row];
+}
+
+void matrix_print(void)
+{
+ print_matrix_header();
+
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ phex(row); print(": ");
+ print_matrix_row(row);
+ print("\n");
+ }
+}
+
+uint8_t matrix_key_count(void)
+{
+ uint8_t count = 0;
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ count += matrix_bitpop(i);
+ }
+ return count;
+}
diff --git a/keyboards/chimera_ortho_plus/readme.md b/keyboards/chimera_ortho_plus/readme.md
new file mode 100644
index 0000000000..ad4cb9d392
--- /dev/null
+++ b/keyboards/chimera_ortho_plus/readme.md
@@ -0,0 +1,15 @@
+# Chimera Ortho+
+
+![Chimera Ortho+](https://i.imgur.com/tuDaGdTl.jpg)
+
+A split wireless 50% ortholinear keyboard.
+
+* Keyboard Maintainer: [William Wilson](https://github.com/GlenPickle)
+* Hardware Supported: Chimera Ortho+ PCB, WaveShare core nRF51822
+* Hardware Availability: [Gerbers](https://github.com/GlenPickle/Chimera/tree/master/ortho_plus/gerbers)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make chimera_ortho_plus: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/chimera_ortho_plus/rules.mk b/keyboards/chimera_ortho_plus/rules.mk
new file mode 100644
index 0000000000..9ee7e4f653
--- /dev/null
+++ b/keyboards/chimera_ortho_plus/rules.mk
@@ -0,0 +1,37 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader
+# 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 = 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
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+HD44780_ENABLE = no # Enable support for HD44780 based LCDs
+UNICODE_ENABLE = yes
+CUSTOM_MATRIX = yes
+
+# project specific files
+SRC = matrix.c
diff --git a/keyboards/ckeys/handwire_101/config.h b/keyboards/ckeys/handwire_101/config.h
index 3dc99319ed..849f4f6077 100755
--- a/keyboards/ckeys/handwire_101/config.h
+++ b/keyboards/ckeys/handwire_101/config.h
@@ -158,12 +158,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
//#define MAGIC_KEY_SLEEP_LED Z
// Audio Click
-#define AUDIO_CLICKY
+//#define AUDIO_CLICKY
// Music Mode Polyphony
// NOTE: Must change polyphony_rate to a number higher than 0 in voices.c
-#define AUDIO_VOICES
-#define PITCH_STANDARD_A 880.0f
+//#define AUDIO_VOICES
+//#define PITCH_STANDARD_A 880.0f
// Mouse keys
#define MOUSEKEY_DELAY 0
diff --git a/keyboards/ckeys/handwire_101/rules.mk b/keyboards/ckeys/handwire_101/rules.mk
index 41a29b3537..83d55e0f70 100755
--- a/keyboards/ckeys/handwire_101/rules.mk
+++ b/keyboards/ckeys/handwire_101/rules.mk
@@ -28,5 +28,5 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality on B7 by d
#MIDI_ENABLE = yes # MIDI controls
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = yes # Audio output on port C6
+AUDIO_ENABLE = no # Audio output
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
diff --git a/keyboards/clawsome/bookerboard/bookerboard.c b/keyboards/clawsome/bookerboard/bookerboard.c
new file mode 100644
index 0000000000..2cf132de59
--- /dev/null
+++ b/keyboards/clawsome/bookerboard/bookerboard.c
@@ -0,0 +1,16 @@
+/* Copyright 2020 AAClawson (AlisGraveNil)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "bookerboard.h" \ No newline at end of file
diff --git a/keyboards/clawsome/bookerboard/bookerboard.h b/keyboards/clawsome/bookerboard/bookerboard.h
new file mode 100644
index 0000000000..11ece7594b
--- /dev/null
+++ b/keyboards/clawsome/bookerboard/bookerboard.h
@@ -0,0 +1,30 @@
+/* Copyright 2020 AAClawson (AlisGraveNil)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K00, K01, K02, \
+ K10, K11, K12, \
+ K20, K21, K22, \
+ K30, K31, K32 \
+) { \
+ { K00, K01, K02 }, \
+ { K10, K11, K12 }, \
+ { K20, K21, K22 }, \
+ { K30, K31, K32 }, \
+}
diff --git a/keyboards/clawsome/bookerboard/config.h b/keyboards/clawsome/bookerboard/config.h
new file mode 100644
index 0000000000..19646e7743
--- /dev/null
+++ b/keyboards/clawsome/bookerboard/config.h
@@ -0,0 +1,47 @@
+/*
+Copyright 2020 AAClawson (AlisGraveNil)
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x41CE
+#define DEVICE_VER 0x0001
+#define MANUFACTURER AlisGraveNil
+#define PRODUCT Bookerboard
+#define DESCRIPTION A 12-key QMK-powered macropod
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#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 { B5, B4, E6, D7 }
+#define MATRIX_COL_PINS { B6, B2, B3 }
+
+#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/clawsome/bookerboard/info.json b/keyboards/clawsome/bookerboard/info.json
new file mode 100644
index 0000000000..a0eb1b5980
--- /dev/null
+++ b/keyboards/clawsome/bookerboard/info.json
@@ -0,0 +1,28 @@
+{
+ "keyboard_name": "bookerboard",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 3,
+ "height": 4,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 12,
+ "layout": [
+ {"label":"K00 (B5,B6)", "x":0, "y":0},
+ {"label":"K01 (B5,B2)", "x":1, "y":0},
+ {"label":"K02 (B5,B3)", "x":2, "y":0},
+ {"label":"K10 (B4,B6)", "x":0, "y":1},
+ {"label":"K11 (B4,B2)", "x":1, "y":1},
+ {"label":"K12 (B4,B3)", "x":2, "y":1},
+ {"label":"K20 (E6,B6)", "x":0, "y":2},
+ {"label":"K21 (E6,B2)", "x":1, "y":2},
+ {"label":"K22 (E6,B3)", "x":2, "y":2},
+ {"label":"K30 (D7,B6)", "x":0, "y":3},
+ {"label":"K31 (D7,B2)", "x":1, "y":3},
+ {"label":"K32 (D7,B3)", "x":2, "y":3}
+ ]
+ }
+ }
+ ,"meta": "https://noroadsleft.github.io/kbf_qmk_converter/"
+}
+
diff --git a/keyboards/clawsome/bookerboard/keymaps/default/keymap.c b/keyboards/clawsome/bookerboard/keymaps/default/keymap.c
new file mode 100644
index 0000000000..a56245a30c
--- /dev/null
+++ b/keyboards/clawsome/bookerboard/keymaps/default/keymap.c
@@ -0,0 +1,37 @@
+/* Copyright 2020 AAClawson (AlisGraveNil)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * --------------
+ * | 7 | 8 | 9 |
+ * --------------
+ * | 4 | 5 | 6 |
+ * --------------
+ * | 1 | 2 | 3 |
+ * --------------
+ * | - | 0 | = |
+ * --------------
+ */
+ [0] = LAYOUT(
+ KC_7, KC_8, KC_9,
+ KC_4, KC_5, KC_6,
+ KC_1, KC_2, KC_3,
+ KC_MINS, KC_0, KC_EQL
+ ),
+
+};
diff --git a/keyboards/clawsome/bookerboard/readme.md b/keyboards/clawsome/bookerboard/readme.md
new file mode 100644
index 0000000000..7fa8d5e7a6
--- /dev/null
+++ b/keyboards/clawsome/bookerboard/readme.md
@@ -0,0 +1,13 @@
+# Bookerboard
+
+This is a 4x3 macropad designed to be used with your favorite 12 keys for whatever you need 12 extra keys for.
+
+- Keyboard Maintainer: [AAClawson](https://github.com/AlisGraveNil)
+- Hardware Supported: Bookerboard, Pro Micro, Elite-C
+- Hardware Availability: Not available yet; will be sold at a later date
+
+Make example for this keyboard (after setting up your build environment):
+
+ make clawsome/bookerboard: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/clawsome/bookerboard/rules.mk b/keyboards/clawsome/bookerboard/rules.mk
new file mode 100644
index 0000000000..847da5a3de
--- /dev/null
+++ b/keyboards/clawsome/bookerboard/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 = 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
diff --git a/keyboards/clueboard/2x1800/2018/2018.c b/keyboards/clueboard/2x1800/2018/2018.c
new file mode 100644
index 0000000000..1745309ff2
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2018/2018.c
@@ -0,0 +1,57 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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<<USB_LED_NUM_LOCK)) {
+ PORTB |= (1<<4);
+ } else {
+ PORTB &= ~(1<<4);
+ }
+
+ // Toggle capslock as needed
+ if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
+ PORTB |= (1<<5);
+ } else {
+ PORTB &= ~(1<<5);
+ }
+
+ // Toggle scrolllock as needed
+ if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
+ PORTB |= (1<<6);
+ } else {
+ PORTB &= ~(1<<6);
+ }
+}
diff --git a/keyboards/clueboard/2x1800/2x1800.h b/keyboards/clueboard/2x1800/2018/2018.h
index 818ceed80d..818ceed80d 100644
--- a/keyboards/clueboard/2x1800/2x1800.h
+++ b/keyboards/clueboard/2x1800/2018/2018.h
diff --git a/keyboards/clueboard/2x1800/2018/config.h b/keyboards/clueboard/2x1800/2018/config.h
new file mode 100644
index 0000000000..af67b15b26
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2018/config.h
@@ -0,0 +1,195 @@
+/*
+Copyright 2017 Zach White <skullydazed@clueboard.co>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#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 0000000000..0e3bb36a9d
--- /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
index dd48c69e36..dd48c69e36 100644
--- a/keyboards/clueboard/2x1800/keymaps/default/config.h
+++ b/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 0000000000..f7316001c3
--- /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
index 4e3457efce..4e3457efce 100644
--- a/keyboards/clueboard/2x1800/keymaps/default/readme.md
+++ b/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 0000000000..04fa371b09
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2018/keymaps/default_4u/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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
index a696972e8c..a696972e8c 100644
--- a/keyboards/clueboard/2x1800/keymaps/default_4u/readme.md
+++ b/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
index 866369a775..866369a775 100644
--- a/keyboards/clueboard/2x1800/keymaps/default_7u/keymap.c
+++ b/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
index f5718e842d..f5718e842d 100644
--- a/keyboards/clueboard/2x1800/keymaps/default_7u/readme.md
+++ b/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 0000000000..ca6be8326e
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2018/keymaps/macroboard/keymap.c
@@ -0,0 +1,123 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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
index 61c9468e7d..61c9468e7d 100644
--- a/keyboards/clueboard/2x1800/keymaps/macroboard/readme.md
+++ b/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 0000000000..15c5f6ebb4
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2018/keymaps/mouseboard_left/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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
index 41304eca5e..41304eca5e 100644
--- a/keyboards/clueboard/2x1800/keymaps/mouseboard_left/readme.md
+++ b/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 0000000000..3e66342499
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2018/keymaps/mouseboard_right/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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
index 51939d6347..51939d6347 100644
--- a/keyboards/clueboard/2x1800/keymaps/mouseboard_right/readme.md
+++ b/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 0000000000..df4412de4d
--- /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
index 34d9c2a24e..34d9c2a24e 100644
--- a/keyboards/clueboard/2x1800/rules.mk
+++ b/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 0000000000..29f7a4901c
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/2019.c
@@ -0,0 +1,182 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..b9151071fd
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/2019.h
@@ -0,0 +1,257 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..b9e087f62a
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/config.h
@@ -0,0 +1,214 @@
+/*
+Copyright 2017 Zach White <skullydazed@clueboard.co>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#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 0000000000..0e3bb36a9d
--- /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 0000000000..f5d901ab61
--- /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 0000000000..4e3457efce
--- /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 0000000000..3c504930da
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_1u_ansi/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..4e3457efce
--- /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 0000000000..17cb57abe7
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_1u_iso/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..4e3457efce
--- /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 0000000000..2bd91000b6
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_2u_ansi/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..c933ee3edb
--- /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 0000000000..5e1c96d144
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_2u_iso/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..c933ee3edb
--- /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 0000000000..dd48c69e36
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_ansi/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..9e1c211a84
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_ansi/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..a696972e8c
--- /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 0000000000..dd48c69e36
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..261f578cdf
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_4u_iso/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..a696972e8c
--- /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 0000000000..dd48c69e36
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..f8f9d820df
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_ansi/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..f5718e842d
--- /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 0000000000..dd48c69e36
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..88ea3fb850
--- /dev/null
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default_7u_iso/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..f5718e842d
--- /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 0000000000..538c153249
--- /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 0000000000..dcad3ec90e
--- /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 09c90adbcf..0000000000
--- a/keyboards/clueboard/2x1800/2x1800.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
- */
-#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<<USB_LED_NUM_LOCK)) {
- PORTB |= (1<<4);
- } else {
- PORTB &= ~(1<<4);
- }
-
- // Toggle capslock as needed
- if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
- PORTB |= (1<<5);
- } else {
- PORTB &= ~(1<<5);
- }
-
- // Toggle scrolllock as needed
- if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
- PORTB |= (1<<6);
- } else {
- PORTB &= ~(1<<6);
- }
-}
diff --git a/keyboards/clueboard/2x1800/config.h b/keyboards/clueboard/2x1800/config.h
deleted file mode 100644
index e343011f95..0000000000
--- a/keyboards/clueboard/2x1800/config.h
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
-Copyright 2017 Zach White <skullydazed@clueboard.co>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#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 0e3bb36a9d..785743a307 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 2e4b75924d..0000000000
--- a/keyboards/clueboard/2x1800/keymaps/default/keymap.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
- */
-#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 152e2f1487..0000000000
--- a/keyboards/clueboard/2x1800/keymaps/default_4u/config.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
- */
-
-#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 c33dfd31e6..0000000000
--- a/keyboards/clueboard/2x1800/keymaps/default_4u/keymap.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
- */
-#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 152e2f1487..0000000000
--- a/keyboards/clueboard/2x1800/keymaps/default_7u/config.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
- */
-
-#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 152e2f1487..0000000000
--- a/keyboards/clueboard/2x1800/keymaps/macroboard/config.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
- */
-
-#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 f69ed801e7..0000000000
--- a/keyboards/clueboard/2x1800/keymaps/macroboard/keymap.c
+++ /dev/null
@@ -1,123 +0,0 @@
-/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
- */
-#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 152e2f1487..0000000000
--- a/keyboards/clueboard/2x1800/keymaps/mouseboard_left/config.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
- */
-
-#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 e0c97aadac..0000000000
--- a/keyboards/clueboard/2x1800/keymaps/mouseboard_left/keymap.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
- */
-#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 152e2f1487..0000000000
--- a/keyboards/clueboard/2x1800/keymaps/mouseboard_right/config.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
- */
-
-#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 d140f5d74e..0000000000
--- a/keyboards/clueboard/2x1800/keymaps/mouseboard_right/keymap.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright 2017 Zach White <skullydazed@gmail.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 <http://www.gnu.org/licenses/>.
- */
-#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 7e2c206ede..01b975695d 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/clueboard/card/keymaps/default/keymap.c b/keyboards/clueboard/card/keymaps/default/keymap.c
index 0fa1d9d989..0d94eb46c9 100644
--- a/keyboards/clueboard/card/keymaps/default/keymap.c
+++ b/keyboards/clueboard/card/keymaps/default/keymap.c
@@ -38,6 +38,7 @@ void matrix_scan_user(void) {
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
+#ifdef AUDIO_ENABLE
case SONG_SU:
if (record->event.pressed) {
PLAY_SONG(tone_startup);
@@ -58,7 +59,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
return false;
-
+#endif
default:
return true;
}
diff --git a/keyboards/clueboard/card/keymaps/default/rules.mk b/keyboards/clueboard/card/keymaps/default/rules.mk
index 998bb5e0eb..82ee482bed 100644
--- a/keyboards/clueboard/card/keymaps/default/rules.mk
+++ b/keyboards/clueboard/card/keymaps/default/rules.mk
@@ -10,7 +10,7 @@ COMMAND_ENABLE = yes # 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
MIDI_ENABLE = no # MIDI controls
-AUDIO_ENABLE = yes # Audio output on port C6
+AUDIO_ENABLE = no # Audio output
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
diff --git a/keyboards/contra/config.h b/keyboards/contra/config.h
index b32d868654..f4b84af5ae 100755
--- a/keyboards/contra/config.h
+++ b/keyboards/contra/config.h
@@ -4,8 +4,8 @@
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x6060
+#define VENDOR_ID 0x4354 /* "CT" */
+#define PRODUCT_ID 0x0001
#define DEVICE_VER 0x0001
#define MANUFACTURER Cartel
#define PRODUCT Contra
diff --git a/keyboards/contra/keymaps/via/keymap.c b/keyboards/contra/keymaps/via/keymap.c
new file mode 100644
index 0000000000..4bf7a9c171
--- /dev/null
+++ b/keyboards/contra/keymaps/via/keymap.c
@@ -0,0 +1,98 @@
+/* This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+
+
+enum planck_layers {
+ _BASE,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* Base
+ * ,-----------------------------------------------------------------------------------.
+ * | 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 |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Adjst| Ctrl | Gui | Alt |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_BASE] = LAYOUT_planck_mit(
+ 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,
+ MO(_ADJUST), KC_LCTL, KC_LGUI, KC_LALT, MO(_LOWER), KC_SPC, MO(_RAISE), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ ),
+
+ /* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 | | | Home | End | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_LOWER] = LAYOUT_planck_mit(
+ 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, _______, _______, 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 | | |Pg Up |Pg Dn | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_RAISE] = LAYOUT_planck_mit(
+ 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_PGUP, KC_PGDN, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+ ),
+
+ /* Adjust
+ * ,----------------------------------------------------------- ------------------------.
+ * | | Reset| Debug| | | | | | | | | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [_ADJUST] = LAYOUT_planck_mit(
+ _______, RESET, DEBUG, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL ,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+}; \ No newline at end of file
diff --git a/keyboards/contra/keymaps/via/readme.md b/keyboards/contra/keymaps/via/readme.md
new file mode 100644
index 0000000000..3c863243d4
--- /dev/null
+++ b/keyboards/contra/keymaps/via/readme.md
@@ -0,0 +1,2 @@
+# A basic Contra Layout with VIA enabled
+
diff --git a/keyboards/contra/keymaps/via/rules.mk b/keyboards/contra/keymaps/via/rules.mk
new file mode 100644
index 0000000000..036bd6d1c3
--- /dev/null
+++ b/keyboards/contra/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes \ No newline at end of file
diff --git a/keyboards/converter/siemens_tastatur/readme.md b/keyboards/converter/siemens_tastatur/readme.md
index ca1b6ec0f3..651df9153f 100644
--- a/keyboards/converter/siemens_tastatur/readme.md
+++ b/keyboards/converter/siemens_tastatur/readme.md
@@ -4,7 +4,7 @@
A Blue Pill STM32F103C8T6-based Converter board for a very very old keyboard.
-Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar)
+Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
Hardware Supported: Blue Pill STM32F103C8T6
Hardware Availability: Custom PCB available, contact me
diff --git a/keyboards/converter/usb_usb/keymaps/chriskopher/keymap.c b/keyboards/converter/usb_usb/keymaps/chriskopher/keymap.c
index c472f78b7d..716ff19abd 100644
--- a/keyboards/converter/usb_usb/keymaps/chriskopher/keymap.c
+++ b/keyboards/converter/usb_usb/keymaps/chriskopher/keymap.c
@@ -175,7 +175,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// clang-format on
// Configure ignore mod tap interrupt per key
-bool get_ignore_mod_tap_interrupt(uint16_t keycode) {
+bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
// I don't like how mod tap interrupt feels with these keys specifically when I'm typing
case LCTL_T(KC_ESC):
diff --git a/keyboards/converter/usb_usb/keymaps/coloneljesus/keymap.c b/keyboards/converter/usb_usb/keymaps/coloneljesus/keymap.c
index 7e39908195..ce4876536f 100644
--- a/keyboards/converter/usb_usb/keymaps/coloneljesus/keymap.c
+++ b/keyboards/converter/usb_usb/keymaps/coloneljesus/keymap.c
@@ -283,13 +283,9 @@ const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS,DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,
CAPS,TRNS,TRNS,ESC, TRNS,TRNS,TRNS,HOME,UP, END, PSCR,SLCK,PAUS, INS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PGUP,LEFT,DOWN,RGHT,TRNS,TRNS, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,
- TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, FN1, TRNS,APP, TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,
+ TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,SPC, PGDN,GRV, TILD, TRNS,APP, 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
),
};
-const action_t PROGMEM fn_actions[] = {
- [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde
-};
-
#endif
diff --git a/keyboards/coseyfannitutti/discipad/rules.mk b/keyboards/coseyfannitutti/discipad/rules.mk
index 53e16a4e91..cc81604a41 100644
--- a/keyboards/coseyfannitutti/discipad/rules.mk
+++ b/keyboards/coseyfannitutti/discipad/rules.mk
@@ -11,9 +11,6 @@ MCU = atmega328p
# ATmega328P USBasp
BOOTLOADER = USBasp
-# disable debug code
-OPT_DEFS = -DDEBUG_LEVEL=0
-
# Build Options
# change yes to no to disable
#
diff --git a/keyboards/coseyfannitutti/discipline/rules.mk b/keyboards/coseyfannitutti/discipline/rules.mk
index 33a0b07ddf..5cf0b03965 100644
--- a/keyboards/coseyfannitutti/discipline/rules.mk
+++ b/keyboards/coseyfannitutti/discipline/rules.mk
@@ -14,9 +14,6 @@ F_CPU = 16000000
# ATmega328P USBasp
BOOTLOADER = USBasp
-# disable debug code
-OPT_DEFS = -DDEBUG_LEVEL=0
-
# Build Options
# change yes to no to disable
#
diff --git a/keyboards/coseyfannitutti/mysterium/rules.mk b/keyboards/coseyfannitutti/mysterium/rules.mk
index 453aef8ab6..9628ac7135 100644
--- a/keyboards/coseyfannitutti/mysterium/rules.mk
+++ b/keyboards/coseyfannitutti/mysterium/rules.mk
@@ -14,9 +14,6 @@ F_CPU = 16000000
# ATmega328P USBasp
BOOTLOADER = USBasp
-# disable debug code
-OPT_DEFS = -DDEBUG_LEVEL=0
-
# Build Options
# change yes to no to disable
#
diff --git a/keyboards/coseyfannitutti/romeo/romeo.h b/keyboards/coseyfannitutti/romeo/romeo.h
index d834dbe6fb..971a391b43 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/rules.mk b/keyboards/coseyfannitutti/romeo/rules.mk
index cfd0ff6460..154f663699 100644
--- a/keyboards/coseyfannitutti/romeo/rules.mk
+++ b/keyboards/coseyfannitutti/romeo/rules.mk
@@ -11,10 +11,6 @@ MCU = atmega328p
# ATmega328P USBasp
BOOTLOADER = USBasp
-# disable debug code
-OPT_DEFS = -DDEBUG_LEVEL=0
-
-
# Build Options
# change yes to no to disable
#
diff --git a/keyboards/crkbd/keymaps/drashna/keymap.c b/keyboards/crkbd/keymaps/drashna/keymap.c
index 55d51eb08a..0769edf3b9 100644
--- a/keyboards/crkbd/keymaps/drashna/keymap.c
+++ b/keyboards/crkbd/keymaps/drashna/keymap.c
@@ -124,7 +124,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_270; }
#endif
-uint16_t get_tapping_term(uint16_t keycode) {
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case ALT_T(KC_A):
return TAPPING_TERM + 100;
diff --git a/keyboards/crkbd/rev1/split_scomm.c b/keyboards/crkbd/rev1/split_scomm.c
index a1fe6ba5b8..12b00f6840 100644
--- a/keyboards/crkbd/rev1/split_scomm.c
+++ b/keyboards/crkbd/rev1/split_scomm.c
@@ -8,7 +8,7 @@
#include <split_scomm.h>
#include "serial.h"
#ifdef CONSOLE_ENABLE
- #include <print.h>
+ #include "debug.h"
#endif
uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0};
@@ -63,9 +63,11 @@ int serial_update_buffers(int master_update)
if( smatstatus == TRANSACTION_END ) {
s_change_old = s_change_new;
#ifdef CONSOLE_ENABLE
- uprintf("slave matrix = %b %b %b %b\n",
+ if (debug_matrix) {
+ uprintf("slave matrix = %b %b %b %b\n",
serial_slave_buffer[0], serial_slave_buffer[1],
serial_slave_buffer[2], serial_slave_buffer[3]);
+ }
#endif
}
} else {
diff --git a/keyboards/crkbd/ssd1306.c b/keyboards/crkbd/ssd1306.c
index 20c2738db7..622e44e35f 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;
+#define send_cmd1(c) if (!_send_cmd1(c)) {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 _send_cmd1(opr2);
+ return true;
+done:
+ return false;
}
-#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(...) {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/cu75/cu75.c b/keyboards/cu75/cu75.c
index 6dc2898454..60c92b708a 100644
--- a/keyboards/cu75/cu75.c
+++ b/keyboards/cu75/cu75.c
@@ -26,7 +26,7 @@ void matrix_init_kb(void)
#ifdef AUDIO_ENABLE
audio_init();
- PLAY_NOTE_ARRAY(test_sound, false, STACCATO);
+ PLAY_SONG(test_sound);
// Fix port B5
cbi(DDRB, 5);
sbi(PORTB, 5);
diff --git a/keyboards/db/db63/rules.mk b/keyboards/db/db63/rules.mk
index 84eace5ed6..3d51be1133 100644
--- a/keyboards/db/db63/rules.mk
+++ b/keyboards/db/db63/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/ergoinu/config.h b/keyboards/dm9records/ergoinu/config.h
index dfc8a52930..dfc8a52930 100644
--- a/keyboards/ergoinu/config.h
+++ b/keyboards/dm9records/ergoinu/config.h
diff --git a/keyboards/ergoinu/ergoinu.c b/keyboards/dm9records/ergoinu/ergoinu.c
index b43ab17c8b..b43ab17c8b 100644
--- a/keyboards/ergoinu/ergoinu.c
+++ b/keyboards/dm9records/ergoinu/ergoinu.c
diff --git a/keyboards/ergoinu/ergoinu.h b/keyboards/dm9records/ergoinu/ergoinu.h
index 43249a8440..43249a8440 100644
--- a/keyboards/ergoinu/ergoinu.h
+++ b/keyboards/dm9records/ergoinu/ergoinu.h
diff --git a/keyboards/dm9records/ergoinu/info.json b/keyboards/dm9records/ergoinu/info.json
new file mode 100644
index 0000000000..3627049a5e
--- /dev/null
+++ b/keyboards/dm9records/ergoinu/info.json
@@ -0,0 +1,87 @@
+{
+ "keyboard_name": "Ergoinu",
+ "url": "",
+ "maintainer": "hsgw(Takuya Urakawa)",
+ "width": 18,
+ "height": 5.4,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 64,
+ "layout": [
+ { "x": 0, "y": 0.6, "label": "ESC" },
+ { "x": 1, "y": 0.4, "label": "1" },
+ { "x": 2, "y": 0.4, "label": "2" },
+ { "x": 3, "y": 0.25, "label": "3" },
+ { "x": 4, "y": 0, "label": "4" },
+ { "x": 5, "y": 0.25, "label": "5" },
+ { "x": 6, "y": 0.4, "label": "6" },
+
+ { "x": 11, "y": 0.4, "label": "7" },
+ { "x": 12, "y": 0.25, "label": "8" },
+ { "x": 13, "y": 0, "label": "9" },
+ { "x": 14, "y": 0.25, "label": "0" },
+ { "x": 15, "y": 0.4, "label": "MINUS" },
+ { "x": 16, "y": 0.4, "label": "EQUAL" },
+ { "x": 17, "y": 0.6, "label": "BACKSLASH" },
+
+ { "x": 0, "y": 1.6, "label": "DELETE" },
+ { "x": 1, "y": 1.4, "label": "TAB" },
+ { "x": 2, "y": 1.4, "label": "Q" },
+ { "x": 3, "y": 1.25, "label": "W" },
+ { "x": 4, "y": 1, "label": "E" },
+ { "x": 5, "y": 1.25, "label": "R" },
+ { "x": 6, "y": 1.4, "label": "T" },
+
+ { "x": 11, "y": 1.4, "label": "Y" },
+ { "x": 12, "y": 1.25, "label": "U" },
+ { "x": 13, "y": 1, "label": "I" },
+ { "x": 14, "y": 1.25, "label": "O" },
+ { "x": 15, "y": 1.4, "label": "P" },
+ { "x": 16, "y": 1.4, "label": "LBRACKET" },
+ { "x": 17, "y": 1.6, "label": "RBRACKET" },
+
+ { "x": 0.25, "y": 2.6, "w": 1.75, "label": "LCTRL" },
+ { "x": 2, "y": 2.4, "label": "A" },
+ { "x": 3, "y": 2.25, "label": "S" },
+ { "x": 4, "y": 2, "label": "D" },
+ { "x": 5, "y": 2.25, "label": "F" },
+ { "x": 6, "y": 2.4, "label": "G" },
+
+ { "x": 11, "y": 2.4, "label": "H" },
+ { "x": 12, "y": 2.25, "label": "J" },
+ { "x": 13, "y": 2, "label": "K" },
+ { "x": 14, "y": 2.25, "label": "L" },
+ { "x": 15, "y": 2.4, "label": "SEMICOLON" },
+ { "x": 16, "y": 2.4, "label": "QUOTE" },
+ { "x": 17, "y": 2.6, "label": "GRAVE" },
+
+ { "x": 0.25, "y": 3.6, "w": 1.75, "label": "LSHIFT" },
+ { "x": 2, "y": 3.4, "label": "Z" },
+ { "x": 3, "y": 3.25, "label": "X" },
+ { "x": 4, "y": 3, "label": "C" },
+ { "x": 5, "y": 3.25, "label": "V" },
+ { "x": 6, "y": 3.4, "label": "B" },
+
+ { "x": 11, "y": 3.4, "label": "N" },
+ { "x": 12, "y": 3.25, "label": "M" },
+ { "x": 13, "y": 3, "label": "COMMA" },
+ { "x": 14, "y": 3.25, "label": "DOT" },
+ { "x": 15, "y": 3.4, "label": "SLASH" },
+ { "x": 16, "y": 3.4, "label": "RSHIFT" },
+ { "x": 17, "y": 3.6, "label": "RSHIFT" },
+
+ { "x": 3, "y": 4.25, "label": "MO(META)" },
+ { "x": 4, "y": 4, "label": "LALT" },
+ { "x": 5, "y": 4.25, "label": "LGUI" },
+ { "x": 6, "y": 4.4, "label": "ENT" },
+ { "x": 7, "y": 4.4, "w": 1.5, "label": "SPACE" },
+
+ { "x": 9.5, "y": 4.4, "w": 1.5, "label": "ENTER" },
+ { "x": 11, "y": 4.4, "label": "BACKSPACE" },
+ { "x": 12, "y": 4.25, "label": "RGUI" },
+ { "x": 13, "y": 4, "label": "RALT" },
+ { "x": 14, "y": 4.25, "label": "MO(META)" }
+ ]
+ }
+ }
+}
diff --git a/keyboards/ergoinu/keymaps/default/config.h b/keyboards/dm9records/ergoinu/keymaps/default/config.h
index bb266f25e7..bb266f25e7 100644
--- a/keyboards/ergoinu/keymaps/default/config.h
+++ b/keyboards/dm9records/ergoinu/keymaps/default/config.h
diff --git a/keyboards/ergoinu/keymaps/default/keymap.c b/keyboards/dm9records/ergoinu/keymaps/default/keymap.c
index 7f1be4796c..7f1be4796c 100644
--- a/keyboards/ergoinu/keymaps/default/keymap.c
+++ b/keyboards/dm9records/ergoinu/keymaps/default/keymap.c
diff --git a/keyboards/ergoinu/keymaps/default/rules.mk b/keyboards/dm9records/ergoinu/keymaps/default/rules.mk
index b2eff12b04..b2eff12b04 100644
--- a/keyboards/ergoinu/keymaps/default/rules.mk
+++ b/keyboards/dm9records/ergoinu/keymaps/default/rules.mk
diff --git a/keyboards/ergoinu/keymaps/default_jis/config.h b/keyboards/dm9records/ergoinu/keymaps/default_jis/config.h
index bb266f25e7..bb266f25e7 100644
--- a/keyboards/ergoinu/keymaps/default_jis/config.h
+++ b/keyboards/dm9records/ergoinu/keymaps/default_jis/config.h
diff --git a/keyboards/ergoinu/keymaps/default_jis/keymap.c b/keyboards/dm9records/ergoinu/keymaps/default_jis/keymap.c
index 3a1a88f47c..3a1a88f47c 100644
--- a/keyboards/ergoinu/keymaps/default_jis/keymap.c
+++ b/keyboards/dm9records/ergoinu/keymaps/default_jis/keymap.c
diff --git a/keyboards/ergoinu/keymaps/default_jis/rules.mk b/keyboards/dm9records/ergoinu/keymaps/default_jis/rules.mk
index 92dde90ff1..92dde90ff1 100644
--- a/keyboards/ergoinu/keymaps/default_jis/rules.mk
+++ b/keyboards/dm9records/ergoinu/keymaps/default_jis/rules.mk
diff --git a/keyboards/ergoinu/matrix.c b/keyboards/dm9records/ergoinu/matrix.c
index 4a80cf9f24..4a80cf9f24 100644
--- a/keyboards/ergoinu/matrix.c
+++ b/keyboards/dm9records/ergoinu/matrix.c
diff --git a/keyboards/dm9records/ergoinu/readme.md b/keyboards/dm9records/ergoinu/readme.md
new file mode 100644
index 0000000000..de0a1c6c97
--- /dev/null
+++ b/keyboards/dm9records/ergoinu/readme.md
@@ -0,0 +1,21 @@
+ErgoInu
+===
+
+![ergoinu](https://i.imgur.com/4CCM8Vl.jpg)
+
+An (Not Portable But Small) Ergonomic Split Keyboard.
+
+Keyboard Maintainer: [hsgw](https://github.com/hsgw/) [twitter](https://twitter.com/hsgw)
+Hardware Supported: Pro Micro
+Hardware Availability & Repository: [https://github.com/hsgw/ergoinu](https://github.com/hsgw/ergoinu)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make dm9records/ergoinu:default
+
+ (or)
+
+ make dm9records/ergoinu:default_jis
+
+
+See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
diff --git a/keyboards/dm9records/ergoinu/rules.mk b/keyboards/dm9records/ergoinu/rules.mk
new file mode 100644
index 0000000000..493046ffa4
--- /dev/null
+++ b/keyboards/dm9records/ergoinu/rules.mk
@@ -0,0 +1,49 @@
+# 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 = no # Audio control and System control
+CONSOLE_ENABLE = no # 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 = no # Enable WS2812 RGB underlight.
+SUBPROJECT_rev1 = no
+USE_I2C = no # i2c is not supported
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
+
+CUSTOM_MATRIX = yes
+SRC += matrix.c serial.c split_util.c
+
+# ergoinu configs
+DISABLE_PROMICRO_LEDs = yes
+
+ifneq ($(strip $(ERGOINU)),)
+ ifeq ($(findstring promicroled, $(ERGOINU)), promicroled)
+ DISABLE_PROMICRO_LEDs = no
+ endif
+endif
+
+ifeq ($(strip $(DISABLE_PROMICRO_LEDs)), yes)
+ OPT_DEFS += -DDISABLE_PROMICRO_LEDs
+endif
diff --git a/keyboards/ergoinu/serial.c b/keyboards/dm9records/ergoinu/serial.c
index 5919415877..5919415877 100644
--- a/keyboards/ergoinu/serial.c
+++ b/keyboards/dm9records/ergoinu/serial.c
diff --git a/keyboards/ergoinu/serial.h b/keyboards/dm9records/ergoinu/serial.h
index 67cf06ac6b..67cf06ac6b 100644
--- a/keyboards/ergoinu/serial.h
+++ b/keyboards/dm9records/ergoinu/serial.h
diff --git a/keyboards/ergoinu/serial_config.h b/keyboards/dm9records/ergoinu/serial_config.h
index a16db684ca..a16db684ca 100644
--- a/keyboards/ergoinu/serial_config.h
+++ b/keyboards/dm9records/ergoinu/serial_config.h
diff --git a/keyboards/ergoinu/split_util.c b/keyboards/dm9records/ergoinu/split_util.c
index 0cbc2c69c4..0cbc2c69c4 100644
--- a/keyboards/ergoinu/split_util.c
+++ b/keyboards/dm9records/ergoinu/split_util.c
diff --git a/keyboards/ergoinu/split_util.h b/keyboards/dm9records/ergoinu/split_util.h
index 11cfd5455a..11cfd5455a 100644
--- a/keyboards/ergoinu/split_util.h
+++ b/keyboards/dm9records/ergoinu/split_util.h
diff --git a/keyboards/plaid/config.h b/keyboards/dm9records/plaid/config.h
index 4d7bedee5f..4d7bedee5f 100644
--- a/keyboards/plaid/config.h
+++ b/keyboards/dm9records/plaid/config.h
diff --git a/keyboards/dm9records/plaid/info.json b/keyboards/dm9records/plaid/info.json
new file mode 100644
index 0000000000..318154d7de
--- /dev/null
+++ b/keyboards/dm9records/plaid/info.json
@@ -0,0 +1,113 @@
+{
+ "keyboard_name": "Plaid // Through Hole",
+ "keyboard_folder": "dm9records/plaid",
+ "url": "https://github.com/hsgw/plaid",
+ "maintainer": "hsgw(Takuya Urakawa)",
+ "width": 12,
+ "height": 4,
+ "layouts": {
+ "LAYOUT_plaid_mit": {
+ "key_count": 47,
+ "layout": [
+ { "w": 1, "x": 0, "y": 0 },
+ { "w": 1, "x": 1, "y": 0 },
+ { "w": 1, "x": 2, "y": 0 },
+ { "w": 1, "x": 3, "y": 0 },
+ { "w": 1, "x": 4, "y": 0 },
+ { "w": 1, "x": 5, "y": 0 },
+ { "w": 1, "x": 6, "y": 0 },
+ { "w": 1, "x": 7, "y": 0 },
+ { "w": 1, "x": 8, "y": 0 },
+ { "w": 1, "x": 9, "y": 0 },
+ { "w": 1, "x": 10, "y": 0 },
+ { "w": 1, "x": 11, "y": 0 },
+ { "w": 1, "x": 0, "y": 1 },
+ { "w": 1, "x": 1, "y": 1 },
+ { "w": 1, "x": 2, "y": 1 },
+ { "w": 1, "x": 3, "y": 1 },
+ { "w": 1, "x": 4, "y": 1 },
+ { "w": 1, "x": 5, "y": 1 },
+ { "w": 1, "x": 6, "y": 1 },
+ { "w": 1, "x": 7, "y": 1 },
+ { "w": 1, "x": 8, "y": 1 },
+ { "w": 1, "x": 9, "y": 1 },
+ { "w": 1, "x": 10, "y": 1 },
+ { "w": 1, "x": 11, "y": 1 },
+ { "w": 1, "x": 0, "y": 2 },
+ { "w": 1, "x": 1, "y": 2 },
+ { "w": 1, "x": 2, "y": 2 },
+ { "w": 1, "x": 3, "y": 2 },
+ { "w": 1, "x": 4, "y": 2 },
+ { "w": 1, "x": 5, "y": 2 },
+ { "w": 1, "x": 6, "y": 2 },
+ { "w": 1, "x": 7, "y": 2 },
+ { "w": 1, "x": 8, "y": 2 },
+ { "w": 1, "x": 9, "y": 2 },
+ { "w": 1, "x": 10, "y": 2 },
+ { "w": 1, "x": 11, "y": 2 },
+ { "w": 1, "x": 0, "y": 3 },
+ { "w": 1, "x": 1, "y": 3 },
+ { "w": 1, "x": 2, "y": 3 },
+ { "w": 1, "x": 3, "y": 3 },
+ { "w": 1, "x": 4, "y": 3 },
+ { "w": 2, "x": 5, "y": 3 },
+ { "w": 1, "x": 7, "y": 3 },
+ { "w": 1, "x": 8, "y": 3 },
+ { "w": 1, "x": 9, "y": 3 },
+ { "w": 1, "x": 10, "y": 3 },
+ { "w": 1, "x": 11, "y": 3 } ]
+ },
+ "LAYOUT_plaid_grid": {
+ "key_count": 48,
+ "layout": [
+ { "w": 1, "x": 0, "y": 0 },
+ { "w": 1, "x": 1, "y": 0 },
+ { "w": 1, "x": 2, "y": 0 },
+ { "w": 1, "x": 3, "y": 0 },
+ { "w": 1, "x": 4, "y": 0 },
+ { "w": 1, "x": 5, "y": 0 },
+ { "w": 1, "x": 6, "y": 0 },
+ { "w": 1, "x": 7, "y": 0 },
+ { "w": 1, "x": 8, "y": 0 },
+ { "w": 1, "x": 9, "y": 0 },
+ { "w": 1, "x": 10, "y": 0 },
+ { "w": 1, "x": 11, "y": 0 },
+ { "w": 1, "x": 0, "y": 1 },
+ { "w": 1, "x": 1, "y": 1 },
+ { "w": 1, "x": 2, "y": 1 },
+ { "w": 1, "x": 3, "y": 1 },
+ { "w": 1, "x": 4, "y": 1 },
+ { "w": 1, "x": 5, "y": 1 },
+ { "w": 1, "x": 6, "y": 1 },
+ { "w": 1, "x": 7, "y": 1 },
+ { "w": 1, "x": 8, "y": 1 },
+ { "w": 1, "x": 9, "y": 1 },
+ { "w": 1, "x": 10, "y": 1 },
+ { "w": 1, "x": 11, "y": 1 },
+ { "w": 1, "x": 0, "y": 2 },
+ { "w": 1, "x": 1, "y": 2 },
+ { "w": 1, "x": 2, "y": 2 },
+ { "w": 1, "x": 3, "y": 2 },
+ { "w": 1, "x": 4, "y": 2 },
+ { "w": 1, "x": 5, "y": 2 },
+ { "w": 1, "x": 6, "y": 2 },
+ { "w": 1, "x": 7, "y": 2 },
+ { "w": 1, "x": 8, "y": 2 },
+ { "w": 1, "x": 9, "y": 2 },
+ { "w": 1, "x": 10, "y": 2 },
+ { "w": 1, "x": 11, "y": 2 },
+ { "w": 1, "x": 0, "y": 3 },
+ { "w": 1, "x": 1, "y": 3 },
+ { "w": 1, "x": 2, "y": 3 },
+ { "w": 1, "x": 3, "y": 3 },
+ { "w": 1, "x": 4, "y": 3 },
+ { "w": 1, "x": 5, "y": 3 },
+ { "w": 1, "x": 6, "y": 3 },
+ { "w": 1, "x": 7, "y": 3 },
+ { "w": 1, "x": 8, "y": 3 },
+ { "w": 1, "x": 9, "y": 3 },
+ { "w": 1, "x": 10, "y": 3 },
+ { "w": 1, "x": 11, "y": 3 } ]
+ }
+ }
+}
diff --git a/keyboards/plaid/keymaps/brickbots/config.h b/keyboards/dm9records/plaid/keymaps/brickbots/config.h
index 5733b9e4b0..5733b9e4b0 100644
--- a/keyboards/plaid/keymaps/brickbots/config.h
+++ b/keyboards/dm9records/plaid/keymaps/brickbots/config.h
diff --git a/keyboards/plaid/keymaps/brickbots/keymap.c b/keyboards/dm9records/plaid/keymaps/brickbots/keymap.c
index 20b6eac682..20b6eac682 100644
--- a/keyboards/plaid/keymaps/brickbots/keymap.c
+++ b/keyboards/dm9records/plaid/keymaps/brickbots/keymap.c
diff --git a/keyboards/plaid/keymaps/brickbots/readme.md b/keyboards/dm9records/plaid/keymaps/brickbots/readme.md
index 48a12fa8bb..48a12fa8bb 100644
--- a/keyboards/plaid/keymaps/brickbots/readme.md
+++ b/keyboards/dm9records/plaid/keymaps/brickbots/readme.md
diff --git a/keyboards/plaid/keymaps/default/config.h b/keyboards/dm9records/plaid/keymaps/default/config.h
index 5733b9e4b0..5733b9e4b0 100644
--- a/keyboards/plaid/keymaps/default/config.h
+++ b/keyboards/dm9records/plaid/keymaps/default/config.h
diff --git a/keyboards/plaid/keymaps/default/keymap.c b/keyboards/dm9records/plaid/keymaps/default/keymap.c
index 6a858a4a73..6a858a4a73 100644
--- a/keyboards/plaid/keymaps/default/keymap.c
+++ b/keyboards/dm9records/plaid/keymaps/default/keymap.c
diff --git a/keyboards/plaid/keymaps/default/readme.md b/keyboards/dm9records/plaid/keymaps/default/readme.md
index 5a08a1fff3..5a08a1fff3 100644
--- a/keyboards/plaid/keymaps/default/readme.md
+++ b/keyboards/dm9records/plaid/keymaps/default/readme.md
diff --git a/keyboards/plaid/keymaps/thehalfdeafchef/config.h b/keyboards/dm9records/plaid/keymaps/thehalfdeafchef/config.h
index 4bcbc6f673..4bcbc6f673 100644
--- a/keyboards/plaid/keymaps/thehalfdeafchef/config.h
+++ b/keyboards/dm9records/plaid/keymaps/thehalfdeafchef/config.h
diff --git a/keyboards/plaid/keymaps/thehalfdeafchef/keymap.c b/keyboards/dm9records/plaid/keymaps/thehalfdeafchef/keymap.c
index bdf6c54c31..bdf6c54c31 100644
--- a/keyboards/plaid/keymaps/thehalfdeafchef/keymap.c
+++ b/keyboards/dm9records/plaid/keymaps/thehalfdeafchef/keymap.c
diff --git a/keyboards/plaid/keymaps/thehalfdeafchef/readme.md b/keyboards/dm9records/plaid/keymaps/thehalfdeafchef/readme.md
index bd09965b55..bd09965b55 100644
--- a/keyboards/plaid/keymaps/thehalfdeafchef/readme.md
+++ b/keyboards/dm9records/plaid/keymaps/thehalfdeafchef/readme.md
diff --git a/keyboards/plaid/keymaps/via/config.h b/keyboards/dm9records/plaid/keymaps/via/config.h
index 4c84c55b84..4c84c55b84 100644
--- a/keyboards/plaid/keymaps/via/config.h
+++ b/keyboards/dm9records/plaid/keymaps/via/config.h
diff --git a/keyboards/plaid/keymaps/via/keymap.c b/keyboards/dm9records/plaid/keymaps/via/keymap.c
index 7bb28c07ed..7bb28c07ed 100644
--- a/keyboards/plaid/keymaps/via/keymap.c
+++ b/keyboards/dm9records/plaid/keymaps/via/keymap.c
diff --git a/keyboards/plaid/keymaps/via/readme.md b/keyboards/dm9records/plaid/keymaps/via/readme.md
index 28dd672111..28dd672111 100644
--- a/keyboards/plaid/keymaps/via/readme.md
+++ b/keyboards/dm9records/plaid/keymaps/via/readme.md
diff --git a/keyboards/plaid/keymaps/via/rules.mk b/keyboards/dm9records/plaid/keymaps/via/rules.mk
index 930e3552ad..930e3552ad 100644
--- a/keyboards/plaid/keymaps/via/rules.mk
+++ b/keyboards/dm9records/plaid/keymaps/via/rules.mk
diff --git a/keyboards/plaid/plaid.c b/keyboards/dm9records/plaid/plaid.c
index 28f56d7f93..28f56d7f93 100644
--- a/keyboards/plaid/plaid.c
+++ b/keyboards/dm9records/plaid/plaid.c
diff --git a/keyboards/plaid/plaid.h b/keyboards/dm9records/plaid/plaid.h
index d791cf7c00..d791cf7c00 100644
--- a/keyboards/plaid/plaid.h
+++ b/keyboards/dm9records/plaid/plaid.h
diff --git a/keyboards/dm9records/plaid/readme.md b/keyboards/dm9records/plaid/readme.md
new file mode 100644
index 0000000000..79621deec8
--- /dev/null
+++ b/keyboards/dm9records/plaid/readme.md
@@ -0,0 +1,23 @@
+# plaid // Through Hole
+
+![plaid](https://i.imgur.com/tTi9yR9h.jpg)
+
+12x4 ortholinear keyboard with only through hole components.
+
+Keyboard Maintainer: [hsgw](https://github.com/hsgw)
+Hardware Supported: ATMEGA328p with vusb [PCB](https://github.com/hsgw/plaid)
+Hardware Availability: Group buy in r/mk
+
+Make example for this keyboard (after setting up your build environment):
+ make dm9records/plaid:default
+
+Flashing example for this keyboard:
+
+ make dm9records/plaid:default:flash
+
+## Bootloader
+use usbasploader in my repository.
+https://github.com/hsgw/USBaspLoader/tree/plaid
+
+
+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/dm9records/plaid/rules.mk b/keyboards/dm9records/plaid/rules.mk
new file mode 100644
index 0000000000..7c4112c9aa
--- /dev/null
+++ b/keyboards/dm9records/plaid/rules.mk
@@ -0,0 +1,36 @@
+# 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
+
+# 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 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
+
+LAYOUTS = ortho_4x12 planck_mit
+LAYOUTS_HAS_RGB = no
diff --git a/keyboards/tartan/config.h b/keyboards/dm9records/tartan/config.h
index ee4393e53a..ee4393e53a 100644
--- a/keyboards/tartan/config.h
+++ b/keyboards/dm9records/tartan/config.h
diff --git a/keyboards/dm9records/tartan/info.json b/keyboards/dm9records/tartan/info.json
new file mode 100644
index 0000000000..ff0ddfdf9d
--- /dev/null
+++ b/keyboards/dm9records/tartan/info.json
@@ -0,0 +1,34 @@
+{
+ "keyboard_name": "Tartan # Through Hole",
+ "keyboard_folder": "dm9records/tartan",
+ "url": "https://github.com/hsgw/tartan",
+ "maintainer": "hsgw(Takuya Urakawa)",
+ "width": 13,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_60_ansi": {
+ "key_count": 61,
+ "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_ansi_split_bs": {
+ "key_count": 62,
+ "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":1}, {"label":"", "x":14, "y":0, "w":1}, {"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_ansi_split_bs_rshift": {
+ "key_count": 63,
+ "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":"|", "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":"BS", "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}, {"label":"Fn", "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":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_iso": {
+ "key_count": 62,
+ "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":"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":"~", "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}]
+ },
+ "LAYOUT_60_iso_split_bs": {
+ "key_count": 63,
+ "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}, {"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":"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":"~", "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}]
+ },
+ "LAYOUT_60_iso_split_bs_rshift": {
+ "key_count": 64,
+ "layout": [{"label":"¬", "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}, {"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":"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":"~", "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":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":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/tartan/keymaps/default/keymap.c b/keyboards/dm9records/tartan/keymaps/default/keymap.c
index 6224b4e615..6224b4e615 100644
--- a/keyboards/tartan/keymaps/default/keymap.c
+++ b/keyboards/dm9records/tartan/keymaps/default/keymap.c
diff --git a/keyboards/tartan/keymaps/default/readme.md b/keyboards/dm9records/tartan/keymaps/default/readme.md
index c829d53103..c829d53103 100644
--- a/keyboards/tartan/keymaps/default/readme.md
+++ b/keyboards/dm9records/tartan/keymaps/default/readme.md
diff --git a/keyboards/dm9records/tartan/readme.md b/keyboards/dm9records/tartan/readme.md
new file mode 100644
index 0000000000..b8439ed229
--- /dev/null
+++ b/keyboards/dm9records/tartan/readme.md
@@ -0,0 +1,25 @@
+# Tartan # Through Hole
+
+![tartan](https://i.imgur.com/1qSrVcs.jpg)
+
+A 60% keyboard with only through hole components.
+
+* Keyboard Maintainer: [hsgw](https://github.com/hsgw)
+* Hardware Supported: ATMEGA328p with vusb [PCB](https://github.com/hsgw/tartan)
+* Hardware Availability: https://5z6p.com/products/tartan/
+
+Make example for this keyboard (after setting up your build environment):
+
+ make dm9records/tartan:default
+
+Flash firmware:
+
+ // In bootloader mode
+ make dm9records/tartan:default:flash
+
+## Bootloader
+use usbasploader in my repository.
+https://github.com/hsgw/USBaspLoader/tree/plaid
+
+
+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/dm9records/tartan/rules.mk b/keyboards/dm9records/tartan/rules.mk
new file mode 100644
index 0000000000..8113001918
--- /dev/null
+++ b/keyboards/dm9records/tartan/rules.mk
@@ -0,0 +1,36 @@
+# 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
+
+# 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 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
+
+LAYOUTS = 60_ansi 60_ansi_split_bs_rshift 60_iso 60_iso_split_bs_rshift
+LAYOUTS_HAS_RGB = no
diff --git a/keyboards/tartan/tartan.c b/keyboards/dm9records/tartan/tartan.c
index b702633cc9..b702633cc9 100644
--- a/keyboards/tartan/tartan.c
+++ b/keyboards/dm9records/tartan/tartan.c
diff --git a/keyboards/tartan/tartan.h b/keyboards/dm9records/tartan/tartan.h
index e990088894..e990088894 100644
--- a/keyboards/tartan/tartan.h
+++ b/keyboards/dm9records/tartan/tartan.h
diff --git a/keyboards/donutcables/budget96/rules.mk b/keyboards/donutcables/budget96/rules.mk
index 84eace5ed6..3d51be1133 100644
--- a/keyboards/donutcables/budget96/rules.mk
+++ b/keyboards/donutcables/budget96/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/doro67/multi/keymaps/konstantin/config.h b/keyboards/doro67/multi/keymaps/konstantin/config.h
index 3c2583e2d4..1d12c7db37 100644
--- a/keyboards/doro67/multi/keymaps/konstantin/config.h
+++ b/keyboards/doro67/multi/keymaps/konstantin/config.h
@@ -1,4 +1,6 @@
#pragma once
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
+
#define LAYER_FN
#define LAYER_NUMPAD
diff --git a/keyboards/doro67/multi/keymaps/konstantin/rules.mk b/keyboards/doro67/multi/keymaps/konstantin/rules.mk
index c3a73fd845..50c3f77ddb 100644
--- a/keyboards/doro67/multi/keymaps/konstantin/rules.mk
+++ b/keyboards/doro67/multi/keymaps/konstantin/rules.mk
@@ -1,11 +1,18 @@
-BACKLIGHT_ENABLE = no
-BOOTMAGIC_ENABLE = no
+# Generic features
+BOOTMAGIC_ENABLE = lite
COMMAND_ENABLE = yes
CONSOLE_ENABLE = yes
EXTRAKEY_ENABLE = yes
-GRAVE_ESC_ENABLE = no
MOUSEKEY_ENABLE = yes
NKRO_ENABLE = yes
-SPACE_CADET_ENABLE = no
TAP_DANCE_ENABLE = yes
UNICODEMAP_ENABLE = yes
+
+# Keyboard-specific features
+BACKLIGHT_ENABLE = no
+VIA_ENABLE = yes
+
+# Firmware size reduction
+GRAVE_ESC_ENABLE = no
+MAGIC_ENABLE = no
+SPACE_CADET_ENABLE = no
diff --git a/keyboards/dz60/config.h b/keyboards/dz60/config.h
index d77de120cb..bb7b6ae7da 100644
--- a/keyboards/dz60/config.h
+++ b/keyboards/dz60/config.h
@@ -1,5 +1,4 @@
-#ifndef CONFIG_H
-#define CONFIG_H
+#pragma once
#include "config_common.h"
@@ -15,37 +14,43 @@
#define MATRIX_ROWS 5
#define MATRIX_COLS 15
-/* key matrix pins */
+/*
+ * 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, D1, D2, D3, D5 }
#define MATRIX_COL_PINS { F0, F1, E6, C7, C6, B7, D4, B1, B0, B5, B4, D7, D6, B3, F4 }
#define UNUSED_PINS
-/* COL2ROW or ROW2COL */
+/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION COL2ROW
-/* number of backlight levels */
#define BACKLIGHT_PIN B6
-#ifdef BACKLIGHT_PIN
#define BACKLIGHT_LEVELS 5
+
+#define RGB_DI_PIN E2
+#ifdef RGB_DI_PIN
+# define RGBLIGHT_ANIMATIONS
+# define RGBLED_NUM 16
+# define RGBLIGHT_HUE_STEP 8
+# define RGBLIGHT_SAT_STEP 8
+# define RGBLIGHT_VAL_STEP 8
+# define RGBLIGHT_SLEEP
#endif
-/* Set 0 if debouncing isn't needed */
+
+/* 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 E2
-#ifdef RGB_DI_PIN
-#define RGBLIGHT_ANIMATIONS
-#define RGBLED_NUM 16
-#define RGBLIGHT_HUE_STEP 8
-#define RGBLIGHT_SAT_STEP 8
-#define RGBLIGHT_VAL_STEP 8
-#define RGBLIGHT_SLEEP
-#endif
-#endif
/* VIA related config */
#define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 2
diff --git a/keyboards/dz60/dz60.c b/keyboards/dz60/dz60.c
index 8295fb432c..936d027a31 100644
--- a/keyboards/dz60/dz60.c
+++ b/keyboards/dz60/dz60.c
@@ -1,31 +1,20 @@
#include "dz60.h"
-#include "led.h"
void matrix_init_kb(void) {
- // Keyboard start-up code goes here
- // Runs once when the firmware starts up
- matrix_init_user();
- led_init_ports();
-};
-
-void matrix_scan_kb(void) {
- // Looping keyboard code goes here
- // This runs every cycle (a lot)
- matrix_scan_user();
+ matrix_init_user();
+ led_init_ports();
};
void led_init_ports(void) {
- // Set caps lock LED pin as output
- DDRB |= (1 << 2);
- // Default to off
- PORTB |= (1 << 2);
+ setPinOutput(B2);
+ writePinHigh(B2);
}
void led_set_kb(uint8_t usb_led) {
if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
- PORTB &= ~(1 << 2);
+ writePinLow(B2);
} else {
- PORTB |= (1 << 2);
+ writePinHigh(B2);
}
led_set_user(usb_led);
diff --git a/keyboards/dz60/dz60.h b/keyboards/dz60/dz60.h
index c5c1c84958..a718c454a0 100644
--- a/keyboards/dz60/dz60.h
+++ b/keyboards/dz60/dz60.h
@@ -1,11 +1,9 @@
-#ifndef DZ60_H
-#define DZ60_H
+#pragma once
#include "quantum.h"
// Corresponding changes to the layout names and/or definitions must also be made to info.json
-
// 标准é…列
/* Standard arrangement / LAYOUT
* ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───â”
@@ -655,4 +653,3 @@
{ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3d, k3e }, \
{ k40, k41, KC_NO, k43, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4a, k4b, k4c, k4d, k4e } \
}
-#endif
diff --git a/keyboards/dz60/info.json b/keyboards/dz60/info.json
index 2d02203528..6415954c29 100644
--- a/keyboards/dz60/info.json
+++ b/keyboards/dz60/info.json
@@ -1,101 +1,78 @@
{
- "keyboard_name": "DZ60",
- "url": "",
- "maintainer": "qmk",
- "width": 15,
- "height": 5,
- "layouts": {
- "LAYOUT": {
- "key_count": 67,
- "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":"~", "x":13, "y":0}, {"label":"Del", "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":"Enter", "x":12.75, "y":2, "w":2.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}, {"label":"Fn", "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":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}]
- },
- "LAYOUT_true_hhkb": {
- "key_count": 61,
- "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":"Del", "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":"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":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":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}, {"label":"Fn", "x":14, "y":3}, {"label":"Alt", "x":1.5, "y":4}, {"x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":6}, {"x":10, "y":4, "w":1.5}, {"label":"Alt", "x":11.5, "y":4}]
- },
- "LAYOUT_directional": {
- "key_count": 67,
- "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":"~", "x":13, "y":0}, {"label":"Del", "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":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"Shift", "x":12, "y":3}, {"x":13, "y":3}, {"label":"Fn", "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":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}]
- },
- "LAYOUT_all": {
- "key_count": 68,
- "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":"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}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"Shift", "x":12, "y":3}, {"x":13, "y":3}, {"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":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}]
- },
- "LAYOUT_60_ansi": {
- "key_count": 61,
- "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":"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}, {"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_ansi_split": {
- "key_count": 63,
- "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":"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}, {"x":3.75, "y":4, "w":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"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}]
- },
- "LAYOUT_60_ansi_split_space_rshift": {
- "key_count": 64,
- "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":"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":1.75}, {"label":"FN", "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":2.25}, {"label":"FN", "x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"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}]
- },
- "LAYOUT_60_iso": {
- "key_count": 62,
- "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":"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":"~", "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}]
- },
- "LAYOUT_60_hhkb": {
- "key_count": 60,
- "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":"\\", "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":"Fn", "x":14, "y":3}, {"label":"Os", "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":"Os", "x":12.5, "y":4}]
- },
- "LAYOUT_60_iso_5x1u": {
- "key_count": 63,
- "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":"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":"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":"|", "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":"Fn", "x":10, "y":4}, {"label":"â†", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}]
- },
- "LAYOUT_60_iso_5x1u_split_rshift": {
- "key_count": 64,
- "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":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"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":"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":1.75}, {"label":"fn", "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":6.25}, {"label":"AltGr", "x":10, "y":4}, {"label":"\u2190", "x":11, "y":4}, {"label":"\u2193", "x":12, "y":4}, {"label":"\u2191", "x":13, "y":4}, {"label":"\u2192", "x":14, "y":4}]
- },
- "LAYOUT_60_iso_split": {
- "key_count": 64,
- "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":"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":"~", "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":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"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}]
- },
- "LAYOUT_60_b_ansi": {
- "key_count": 66,
- "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}, {"x":13, "y":0}, {"label":"Back Space", "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":"Shift", "x":11.25, "y":3, "w":1.75}, {"label":"Up", "x":13, "y":3}, {"label":"Del", "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":2.25}, {"label":"Space", "x":6, "y":4, "w":1.25}, {"label":"Space", "x":7.25, "y":4, "w":2.75}, {"label":"Alt", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Left", "x":12, "y":4}, {"label":"Down", "x":13, "y":4}, {"label":"Right", "x":14, "y":4}]
- },
- "LAYOUT_60_b_iso": {
- "key_count": 67,
- "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}, {"x":13, "y":0}, {"label":"Back Space", "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":"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":"Shift", "x":11.25, "y":3, "w":1.75}, {"label":"Up", "x":13, "y":3}, {"label":"Del", "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":2.25}, {"label":"Space", "x":6, "y":4, "w":1.25}, {"label":"Space", "x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Left", "x":12, "y":4}, {"label":"Down", "x":13, "y":4}, {"label":"Right", "x":14, "y":4}]
- },
- "LAYOUT_60_tsangan": {
- "keycount": 61,
- "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":1.75}, {"label":"Fn", "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_tsangan_hhkb": {
- "key_count": 62,
- "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":"|", "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":"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}, {"label":"Fn", "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":"Win", "x":11, "y":4, "w":1.5}, {"label":"Menu", "x":12.5, "y":4}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}]
- },
- "LAYOUT_60_calbatr0ss": {
- "key_count": 65,
- "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":"|", "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":"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":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":"Fn", "x":14, "y":3}, {"label":"Caps Lock", "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":"Shift", "x":3.75, "y":4, "w":2.25}, {"label":"Fn", "x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"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_iso_split_space_bs_rshift": {
- "key_count": 66,
- "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":"Del", "x":13, "y":0, "w":1}, {"label":"Backspace", "x":14, "y":0, "w":1}, {"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":"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":"~", "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":1.75}, {"label":"Print screen", "x":14, "y":3, "w":1}, {"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":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"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}]
- },
- "LAYOUT_60_2_function": {
- "key_count": 63,
- "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":"|", "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":"Fn", "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}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.5}, {"label":"Control", "x":11.5, "y":4, "w":1.5}, {"label":"GUI", "x":13, "y":4}, {"label":"Fn2", "x":14, "y":4}]
- },
- "LAYOUT_60_iso_5x1u_split_bs_rshift_spc": {
- "key_count": 67,
- "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":"Del", "x":13, "y":0, "w":1}, {"label":"Backspace", "x":14, "y":0, "w":1}, {"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":"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":"~", "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":1.75}, {"label":"VolUp", "x":14, "y":3, "w":1}, {"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":2.25}, {"x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"label":"Left", "x":10, "y":4, "w":1}, {"label":"Down", "x":11, "y":4, "w":1}, {"label":"Up", "x":12, "y":4, "w":1}, {"label":"Right", "x":13, "y":4, "w":1}, {"label":"VolDown", "x":14, "y":4, "w":1}]
- },
- "LAYOUT_olivierko": {
- "key_count": 63,
- "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":"|", "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":"Fn", "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}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"↑", "x":12, "y":3}, {"label":"Shift", "x":13, "y":3, "w":2}, {"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":"â†", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"→", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}]
- },
- "LAYOUT_60_abnt2": {
- "key_count": 63,
- "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":"\u00a8", "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":"\u00c7", "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":"?", "x":12.25, "y":3}, {"label":"Shift", "x":13.25, "y":3, "w":1.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}]
- },
- "LAYOUT_60_iso_4th_row_all_1u": {
- "key_count": 65,
- "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":"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":"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":"|", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"Shift", "x":12, "y":3}, {"x":13, "y":3}, {"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":6.25}, {"label":"Fn", "x":10, "y":4}, {"label":"â†", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}]
+ "keyboard_name": "DZ60",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 15,
+ "height": 5,
+ "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":"~", "x":13, "y":0}, {"label":"Del", "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":"Enter", "x":12.75, "y":2, "w":2.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}, {"label":"Fn", "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":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}]
+ },
+ "LAYOUT_true_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":"Del", "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":"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":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":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}, {"label":"Fn", "x":14, "y":3}, {"label":"Alt", "x":1.5, "y":4}, {"x":2.5, "y":4, "w":1.5}, {"x":4, "y":4, "w":6}, {"x":10, "y":4, "w":1.5}, {"label":"Alt", "x":11.5, "y":4}]
+ },
+ "LAYOUT_directional": {
+ "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":"~", "x":13, "y":0}, {"label":"Del", "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":"Enter", "x":12.75, "y":2, "w":2.25}, {"label":"Shift", "x":0, "y":3, "w":2}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"Shift", "x":12, "y":3}, {"x":13, "y":3}, {"label":"Fn", "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":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}]
+ },
+ "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}, {"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":"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}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"Shift", "x":12, "y":3}, {"x":13, "y":3}, {"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":2.25}, {"x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"x":10, "y":4}, {"label":"Alt", "x":11, "y":4}, {"label":"Win", "x":12, "y":4}, {"label":"Menu", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}]
+ },
+ "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":"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}, {"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_ansi_split": {
+ "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":"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}, {"x":3.75, "y":4, "w":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"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}]
+ },
+ "LAYOUT_60_ansi_split_space_rshift": {
+ "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":"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":1.75}, {"label":"FN", "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":2.25}, {"label":"FN", "x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"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}]
+ },
+ "LAYOUT_60_iso": {
+ "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":"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":"~", "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}]
+ },
+ "LAYOUT_60_hhkb": {
+ "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":"\\", "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":"Fn", "x":14, "y":3}, {"label":"Os", "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":"Os", "x":12.5, "y":4}]
+ },
+ "LAYOUT_60_iso_5x1u": {
+ "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":"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":"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":"|", "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":"Fn", "x":10, "y":4}, {"label":"â†", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}]
+ },
+ "LAYOUT_60_iso_5x1u_split_rshift": {
+ "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":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"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":"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":1.75}, {"label":"fn", "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":6.25}, {"label":"AltGr", "x":10, "y":4}, {"label":"\u2190", "x":11, "y":4}, {"label":"\u2193", "x":12, "y":4}, {"label":"\u2191", "x":13, "y":4}, {"label":"\u2192", "x":14, "y":4}]
+ },
+ "LAYOUT_60_iso_split": {
+ "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":"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":"~", "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":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"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}]
+ },
+ "LAYOUT_60_b_ansi": {
+ "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}, {"x":13, "y":0}, {"label":"Back Space", "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":"Shift", "x":11.25, "y":3, "w":1.75}, {"label":"Up", "x":13, "y":3}, {"label":"Del", "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":2.25}, {"label":"Space", "x":6, "y":4, "w":1.25}, {"label":"Space", "x":7.25, "y":4, "w":2.75}, {"label":"Alt", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Left", "x":12, "y":4}, {"label":"Down", "x":13, "y":4}, {"label":"Right", "x":14, "y":4}]
+ },
+ "LAYOUT_60_b_iso": {
+ "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}, {"x":13, "y":0}, {"label":"Back Space", "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":"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":"Shift", "x":11.25, "y":3, "w":1.75}, {"label":"Up", "x":13, "y":3}, {"label":"Del", "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":2.25}, {"label":"Space", "x":6, "y":4, "w":1.25}, {"label":"Space", "x":7.25, "y":4, "w":2.75}, {"label":"AltGr", "x":10, "y":4}, {"label":"Fn", "x":11, "y":4}, {"label":"Left", "x":12, "y":4}, {"label":"Down", "x":13, "y":4}, {"label":"Right", "x":14, "y":4}]
+ },
+ "LAYOUT_60_tsangan": {
+ "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":1.75}, {"label":"Fn", "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_tsangan_hhkb": {
+ "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":"|", "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":"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}, {"label":"Fn", "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":"Win", "x":11, "y":4, "w":1.5}, {"label":"Menu", "x":12.5, "y":4}, {"label":"Ctrl", "x":13.5, "y":4, "w":1.5}]
+ },
+ "LAYOUT_60_calbatr0ss": {
+ "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":"|", "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":"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":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":"Fn", "x":14, "y":3}, {"label":"Caps Lock", "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":"Shift", "x":3.75, "y":4, "w":2.25}, {"label":"Fn", "x":6, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"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_iso_split_space_bs_rshift": {
+ "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":"Del", "x":13, "y":0, "w":1}, {"label":"Backspace", "x":14, "y":0, "w":1}, {"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":"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":"~", "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":1.75}, {"label":"Print screen", "x":14, "y":3, "w":1}, {"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":2.25}, {"label":"FN", "x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"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}]
+ },
+ "LAYOUT_60_2_function": {
+ "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":"|", "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":"Fn", "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}, {"x":3.75, "y":4, "w":6.25}, {"label":"Alt", "x":10, "y":4, "w":1.5}, {"label":"Control", "x":11.5, "y":4, "w":1.5}, {"label":"GUI", "x":13, "y":4}, {"label":"Fn2", "x":14, "y":4}]
+ },
+ "LAYOUT_60_iso_5x1u_split_bs_rshift_spc": {
+ "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":"Del", "x":13, "y":0, "w":1}, {"label":"Backspace", "x":14, "y":0, "w":1}, {"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":"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":"~", "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":1.75}, {"label":"VolUp", "x":14, "y":3, "w":1}, {"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":2.25}, {"x":6.00, "y":4, "w":1.25}, {"x":7.25, "y":4, "w":2.75}, {"label":"Left", "x":10, "y":4, "w":1}, {"label":"Down", "x":11, "y":4, "w":1}, {"label":"Up", "x":12, "y":4, "w":1}, {"label":"Right", "x":13, "y":4, "w":1}, {"label":"VolDown", "x":14, "y":4, "w":1}]
+ },
+ "LAYOUT_olivierko": {
+ "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":"|", "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":"Fn", "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}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"↑", "x":12, "y":3}, {"label":"Shift", "x":13, "y":3, "w":2}, {"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":"â†", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"→", "x":13, "y":4}, {"label":"Ctrl", "x":14, "y":4}]
+ },
+ "LAYOUT_60_abnt2": {
+ "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":"\u00a8", "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":"\u00c7", "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":"?", "x":12.25, "y":3}, {"label":"Shift", "x":13.25, "y":3, "w":1.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}]
+ },
+ "LAYOUT_60_iso_4th_row_all_1u": {
+ "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":"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":"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":"|", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3}, {"x":1, "y":3}, {"label":"Z", "x":2, "y":3}, {"label":"X", "x":3, "y":3}, {"label":"C", "x":4, "y":3}, {"label":"V", "x":5, "y":3}, {"label":"B", "x":6, "y":3}, {"label":"N", "x":7, "y":3}, {"label":"M", "x":8, "y":3}, {"label":"<", "x":9, "y":3}, {"label":">", "x":10, "y":3}, {"label":"?", "x":11, "y":3}, {"label":"Shift", "x":12, "y":3}, {"x":13, "y":3}, {"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":6.25}, {"label":"Fn", "x":10, "y":4}, {"label":"â†", "x":11, "y":4}, {"label":"↓", "x":12, "y":4}, {"label":"↑", "x":13, "y":4}, {"label":"→", "x":14, "y":4}]
+ }
}
- }
}
diff --git a/keyboards/dz60/keymaps/default/keymap.c b/keyboards/dz60/keymaps/default/keymap.c
index 1d375a3c63..5b7a24922d 100644
--- a/keyboards/dz60/keymaps/default/keymap.c
+++ b/keyboards/dz60/keymaps/default/keymap.c
@@ -1,25 +1,19 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ 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, XXXXXXX, 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, XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, XXXXXXX,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, XXXXXXX, XXXXXXX, MO(1), KC_RCTL
+ ),
- 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_NO, 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_NO,
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(2), KC_NO, MO(1), KC_RCTL),
-
- 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_TRNS, KC_DEL,
- 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, 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, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
-
- LAYOUT(
- KC_TRNS, M(1), M(2), M(3), M(4), M(5), M(6), M(7), M(8), M(9), M(10), M(11), M(12), KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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(
+ 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, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, RESET,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, BL_STEP, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
};
diff --git a/keyboards/dz60/readme.md b/keyboards/dz60/readme.md
index a06db93b5f..eb6d28d5d6 100644
--- a/keyboards/dz60/readme.md
+++ b/keyboards/dz60/readme.md
@@ -4,12 +4,12 @@
A customizable 60% keyboard.
-Keyboard Maintainer: QMK Community
-Hardware Supported: DZ60
-Hardware Availability: [kbdfans](https://kbdfans.myshopify.com/collections/pcb/products/dz60-60-pcb?variant=40971616717)
+* Keyboard Maintainer: QMK Community
+* Hardware Supported: DZ60
+* Hardware Availability: [KBDfans](https://kbdfans.myshopify.com/collections/pcb/products/dz60-60-pcb?variant=40971616717)
Make example for this keyboard (after setting up your build environment):
make dz60:default
-See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
+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/dz60/rules.mk b/keyboards/dz60/rules.mk
index 73b1d2ecb9..55e5bada39 100644
--- a/keyboards/dz60/rules.mk
+++ b/keyboards/dz60/rules.mk
@@ -12,17 +12,22 @@ MCU = atmega32u4
BOOTLOADER = atmel-dfu
# Build Options
-# comment out to disable the 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
-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 = yes # Enable per-key backlight LEDs
-AUDIO_ENABLE = no # There is no speaker on this PCB
-RGBLIGHT_ENABLE = yes # Enable the RGB underglow LEDs
+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 = 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
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
LAYOUTS = 60_ansi 60_ansi_split_bs_rshift 60_hhkb 60_iso 60_abnt2 60_tsangan_hhkb
diff --git a/keyboards/dztech/dz65rgb/dz65rgb.c b/keyboards/dztech/dz65rgb/dz65rgb.c
index 5d35bc8982..43d8f3494b 100644
--- a/keyboards/dztech/dz65rgb/dz65rgb.c
+++ b/keyboards/dztech/dz65rgb/dz65rgb.c
@@ -81,7 +81,7 @@ led_config_t g_led_config = {
{ 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, NO_LED, 42, 43 },
- { 44, 45, 46, 47, 48, 49, 59, 51, 52, 53, 54, 55, NO_LED, 56, 57 },
+ { 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, NO_LED, 56, 57 },
{ 58, 59, 60, NO_LED, NO_LED, 61, NO_LED, NO_LED, 62, 63, 64, 65, NO_LED, 66, 67 }
}, {
{ 0, 0 }, { 15, 0 }, { 30, 0 }, { 45, 0 }, { 60, 0 }, { 75, 0 }, { 90, 0 }, { 105, 0 }, { 120, 0 }, { 135, 0 }, { 150, 0 }, { 165, 0 }, { 180, 0 }, { 203, 0 }, { 224, 0 },
diff --git a/keyboards/dztech/dz65rgb/keymaps/drootz/config.h b/keyboards/dztech/dz65rgb/keymaps/drootz/config.h
new file mode 100644
index 0000000000..5810507975
--- /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 0000000000..c313f467e3
--- /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 0000000000..15f15d752b
--- /dev/null
+++ b/keyboards/dztech/dz65rgb/keymaps/drootz/readme.md
@@ -0,0 +1,210 @@
+![DZ65RGBv2 Layout Image - MAIN](https://res.cloudinary.com/drootz/image/upload/c_scale,w_800/v1582000645/drootz_dz65rgb_layer_0_main_n61oxl.jpg)
+
+# 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)
+![DZ65RGBv2 Layout Image - MAIN](https://res.cloudinary.com/drootz/image/upload/c_scale,w_800/v1582000645/drootz_dz65rgb_layer_0_main_n61oxl.jpg)
+
+### [Layer 1: \_MAC](http://www.keyboard-layout-editor.com/#/gists/4a32d80c67c778658febf28524fb5000)
+![DZ65RGBv2 Layout Image - MAC](https://res.cloudinary.com/drootz/image/upload/c_scale,w_800/v1582000653/drootz_dz65rgb_layer_1_mac_z4tsaw.jpg)
+
+### [Layer 2: \_FN](http://www.keyboard-layout-editor.com/#/gists/b583bd7cc5b0a75b4610bbda18fba65e)
+![DZ65RGBv2 Layout Image - FN](https://res.cloudinary.com/drootz/image/upload/c_scale,w_800/v1582000661/drootz_dz65rgb_layer_2_fn_zv8yte.jpg)
+
+## 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
+| :--- | :--- | :--- |
+| `à`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `À`¶ | `LDR A` | Will output upper character if Capslock enabled. |
+| `â`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `Â`¶ | `LDR A A` | Will output upper character if Capslock enabled. |
+| `ç`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `Ç`¶ | `LDR C` | Will output upper character if Capslock enabled. |
+| `è`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `È`¶ | `LDR E` | Will output upper character if Capslock enabled. |
+| `ê`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `Ê`¶ | `LDR E E` | Will output upper character if Capslock enabled. |
+| `é`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `É`¶ | `LDR /` | Will output upper character if Capslock enabled |
+| `î`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `Î`¶ | `LDR I I` | Will output upper character if Capslock enabled. |
+| `ô`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `Ô`¶ | `LDR O O` | Will output upper character if Capslock enabled. |
+| `ù`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `Ù`¶ | `LDR U` | Will output upper character if Capslock enabled. |
+| `û`¶ &nbsp;&nbsp;or&nbsp;&nbsp; `Û`¶ | `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 0000000000..24a765ab9a
--- /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/eco/rules.mk b/keyboards/eco/rules.mk
index 7f7f20ed3b..078131da7c 100644
--- a/keyboards/eco/rules.mk
+++ b/keyboards/eco/rules.mk
@@ -23,7 +23,7 @@ COMMAND_ENABLE = yes # 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 = yes # Enable keyboard backlight functionality
MIDI_ENABLE = yes # MIDI controls
-AUDIO_ENABLE = yes # Audio output on port C6
+AUDIO_ENABLE = no # Audio output
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
diff --git a/keyboards/eniigmakeyboards/ek87/config.h b/keyboards/eniigmakeyboards/ek87/config.h
new file mode 100644
index 0000000000..2f20a15948
--- /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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 0000000000..0101d679d9
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "ek87.h"
diff --git a/keyboards/eniigmakeyboards/ek87/ek87.h b/keyboards/eniigmakeyboards/ek87/ek87.h
new file mode 100644
index 0000000000..121365d596
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..d8e622ca90
--- /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 0000000000..563bb818a8
--- /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 0000000000..1a69d05023
--- /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 0000000000..1e5b99807c
--- /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 0000000000..49966ba3b8
--- /dev/null
+++ b/keyboards/eniigmakeyboards/ek87/readme.md
@@ -0,0 +1,17 @@
+# Eniigma Keyboards ek87
+
+![ek87](https://i.imgur.com/lmZYr1Pl.jpg)
+
+A highly compatible TKL PCB with JST daughterboard support, designed for use with all tenkeyless Eniigma Keyboards products.
+
+![layout](https://i.imgur.com/FNYcAEP.png)
+
+* 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 0000000000..dfe300fae0
--- /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/ergodone/keymaps/art/keymap.c b/keyboards/ergodone/keymaps/art/keymap.c
new file mode 100644
index 0000000000..7fcbd5b615
--- /dev/null
+++ b/keyboards/ergodone/keymaps/art/keymap.c
@@ -0,0 +1,446 @@
+#include "art.h"
+#include "sendstring_workman_zxcvm.h"
+
+bool is_win = true;
+
+enum custom_keycodes {
+ keyboardSpecificKeyCode = NEW_SAFE_RANGE //not used
+};
+
+void led_show_current_os(void) {
+ if (is_win) {
+ ergodox_right_led_1_on();
+ wait_ms(50);
+ ergodox_right_led_1_off();
+ wait_ms(50);
+ ergodox_right_led_1_on();
+ wait_ms(50);
+ ergodox_right_led_1_off();
+ wait_ms(50);
+ ergodox_right_led_1_on();
+ wait_ms(50);
+ ergodox_right_led_1_off();
+ wait_ms(50);
+ } else {
+ ergodox_right_led_3_on();
+ wait_ms(50);
+ ergodox_right_led_3_off();
+ wait_ms(50);
+ ergodox_right_led_3_on();
+ wait_ms(50);
+ ergodox_right_led_3_off();
+ wait_ms(50);
+ ergodox_right_led_3_on();
+ wait_ms(50);
+ ergodox_right_led_3_off();
+ wait_ms(50);
+ }
+}
+
+void matrix_init_user(void) {
+ led_show_current_os();
+}
+
+void led_set_user(uint8_t usb_led) {
+ if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
+ ergodox_right_led_2_on();
+ } else {
+ ergodox_right_led_2_off();
+ }
+}
+
+
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_3_off();
+ switch (get_highest_layer(state)) {
+ case NAV:
+ case CTRL_NAV:
+ case SHIFT_NAV:
+ ergodox_right_led_1_on();
+ break;
+ case FKEYS:
+ ergodox_right_led_3_on();
+ break;
+ }
+ return state;
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Base qwerty layer
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | ` ~ | 1 | 2 | 3 | 4 | 5 | ESC | | - _ | 6 | 7 | 8 | 9 | 0 | ] |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | Tab | Q | W | E | R | T | ??? | | = | Y | U | I | O | P | [ |
+ * |--------+------+------+------+------+------| | | |------+------+------+------+------+--------|
+ * | Caps | A | S | D | F | G |------| |------| H | J | K | L | ; | ' |
+ * |--------+------+------+------+------+------| FKEYS| | FKEYS|------+------+------+------+------+--------|
+ * | LShift | Z | X | C | V | B | | | | N | M | , | . | / git| RShift |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * |LCtrl |Media\| Win |Alt | NAV | | Home | End |Workmn| | RCtrl|
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,---------------.
+ * | Del | Ins | | Left | Right |
+ * ,------|------|------| |------+--------+------.
+ * | | | PgUp | |SFT_NV| | |
+ * | Space|BSpace|------| |------| NAV |Enter |
+ * | | | PgDn | |CTR_NV| | |
+ * `--------------------' `----------------------'
+ */
+[QWERTY] = LAYOUT_ergodox(
+ // -----------------------------------------------------left hand-----------------------------------------------------
+ KC_GRAVE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESCAPE,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, XXXXXXX,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, TT(FKEYS),
+ KC_LCTRL, LT(MEDIA, KC_BSLASH), KC_LWIN, KC_LALT, LT(NAV, KC_RIGHT),
+
+ KC_DEL, KC_INS,
+ KC_PGUP,
+ KC_SPC, LT(COMBOS,KC_BSPC), KC_PGDOWN,
+
+ // -----------------------------------------------------right hand-----------------------------------------------------
+ KC_MINS, KC_6, KC_7, KC_8, KC_9, KC_0, KC_RBRC,
+ KC_EQL, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,
+ KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ TT(FKEYS), KC_N, KC_M, KC_COMM, KC_DOT, LT(GIT,KC_SLSH), KC_RSFT,
+ KC_HOME, KC_END, DF(WORKMAN), KC_RALT, KC_RCTRL,
+
+ KC_LEFT, KC_RIGHT,
+ LT(SHIFT_NAV, KC_UP),
+ LT(CTRL_NAV, KC_DOWN), MO(NAV), KC_ENT
+),
+ /* Workman
+ *
+ * ,--------------------------------------------------. ,--------------------------------------------------.
+ * | | | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+-------------| |------+------+------+------+------+------+--------|
+ * | | 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 | , | . | / | |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * | | | | | | | | |QWERTY| | |
+ * `----------------------------------' `----------------------------------'
+ * ,-------------. ,---------------.
+ * | | | | | |
+ * ,------|------|------| |------+--------+------.
+ * | | | | | | | |
+ * | | |------| |------| | |
+ * | | | | | | | |
+ * `--------------------' `----------------------'
+ */
+[WORKMAN] = LAYOUT_ergodox(
+ // -----------------------------------------------------left hand-----------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_Q, KC_D, KC_R, KC_W, KC_B, _______,
+ _______, KC_A, KC_S, KC_H, KC_T, KC_G,
+ _______, KC_Z, KC_X, KC_C, KC_V, KC_M, _______,
+ _______, _______, _______, _______, _______,
+
+ _______, _______,
+ _______,
+ _______, _______, _______,
+
+ // -----------------------------------------------------right hand-----------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_J, KC_F, KC_U, KC_P, KC_SCLN, _______,
+ KC_Y, KC_N, KC_E, KC_O, KC_I, _______,
+ _______, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______,
+ _______, _______, DF(QWERTY), _______, _______,
+
+ _______, _______,
+ _______,
+ _______, _______, _______
+),
+
+[FKEYS] = LAYOUT_ergodox(
+ // -----------------------------------------------------left hand-----------------------------------------------------
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+
+ _______, _______,
+ _______,
+ _______, _______, _______,
+ // -----------------------------------------------------right hand-----------------------------------------------------
+ _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ _______, _______, _______, _______, _______, _______, KC_F12,
+ _______, _______, _______, _______, _______, KC_PSCREEN,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+
+ _______, _______,
+ _______,
+ _______, _______, _______
+),
+
+[NAV] = LAYOUT_ergodox(
+ // -----------------------------------------------------left hand-----------------------------------------------------
+ _______, LALT(KC_F1), LALT(KC_F2), LALT(KC_F3), LALT(KC_F4), LALT(KC_F5), _______,
+ _______, _______, KC_HOME, KC_UP, KC_END, KC_PGUP, _______,
+ _______, _______, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDOWN,
+ _______, _______, _______, _______, KC_LALT, _______, _______,
+ _______, _______, _______, _______, _______,
+
+ _______, _______,
+ _______,
+ _______, KC_DEL, _______,
+ // -----------------------------------------------------right hand-----------------------------------------------------
+ _______, LALT(KC_F6), LALT(KC_F7), LALT(KC_F8), LALT(KC_F9), LALT(KC_F10), LALT(KC_F11),
+ _______, _______, _______, _______, _______, _______, LALT(KC_F12),
+ _______, CTR_ALT, KC_RSFT, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+
+ _______, _______,
+ _______,
+ _______, _______, _______
+),
+
+[CTRL_NAV] = LAYOUT_ergodox(
+ // -----------------------------------------------------left hand-----------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, CTL_ALT(KC_HOME), CTL_ALT(KC_UP), CTL_ALT(KC_END), CTL_ALT(KC_PGUP), _______,
+ _______, _______, CTL_ALT(KC_LEFT), CTL_ALT(KC_DOWN), CTL_ALT(KC_RIGHT),CTL_ALT(KC_PGDOWN),
+ _______, _______, CTL_ALT(KC_X), CTL_ALT(KC_C), CTL_ALT(KC_V), _______, _______,
+ _______, _______, _______, _______, _______,
+
+ CTL_ALT(KC_DEL), _______,
+ _______,
+ _______, CTL_ALT(KC_BSPC), CTL_ALT(KC_DEL),
+ // -----------------------------------------------------right hand-----------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ CTL_ALT(KC_HOME), CTL_ALT(KC_END), _______, _______, _______,
+
+ CTL_ALT(KC_LEFT), CTL_ALT(KC_RIGHT),
+ KC_RSFT,
+ _______, _______, _______
+),
+
+[SHIFT_NAV] = LAYOUT_ergodox(
+ // -----------------------------------------------------left hand-----------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, LSFT(KC_HOME), LSFT(KC_UP), LSFT(KC_END), LSFT(KC_PGUP), _______,
+ _______, _______, LSFT(KC_LEFT), LSFT(KC_DOWN), LSFT(KC_RIGHT), LSFT(KC_PGDOWN),
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+
+ _______, _______,
+ _______,
+ _______, _______, _______,
+
+
+ // -----------------------------------------------------right hand-----------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ LSFT(KC_HOME), LSFT(KC_END), _______, _______, _______,
+
+ LSFT(KC_LEFT), LSFT(KC_RIGHT),
+ _______,
+ CTR_ALT, _______, _______
+),
+
+[COMBOS] = LAYOUT_ergodox(
+ // -----------------------------------------------------left hand-----------------------------------------------------
+ TILD_BLOCK, PRESCRIPTION, _______, _______, FOURS, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, ADMINS, SARCASM, _______, CTRL_CTV, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+
+ _______, _______,
+ _______,
+ _______, _______, _______,
+
+ // -----------------------------------------------------right hand-----------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______,
+ _______, _______, CTRL_LCTV, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+
+ _______, _______,
+ _______,
+ _______, _______, _______
+),
+
+// [STRINGS] = LAYOUT_ergodox(
+// // -----------------------------------------------------left hand-----------------------------------------------------
+// _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______,
+
+// _______, _______,
+// _______,
+// _______, _______, _______,
+
+// // -----------------------------------------------------right hand-----------------------------------------------------
+// _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______,
+
+// _______, _______,
+// _______,
+// _______, _______, _______
+// ),
+
+[MEDIA] = LAYOUT_ergodox(
+ // -----------------------------------------------------left hand-----------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, KC_MPRV, KC_VOLU, KC_MNXT, _______, _______,
+ _______, _______, _______, KC_VOLD, _______, _______,
+ _______, _______, _______, KC_MUTE, KC_MPLY, _______, _______,
+ _______, _______, _______, _______, _______,
+
+ _______, _______,
+ _______,
+ _______, _______, _______,
+
+ // -----------------------------------------------------right hand-----------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, TOG_OS, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______,
+
+ _______, _______,
+ _______,
+ _______, _______, _______
+),
+
+[GIT] = LAYOUT_ergodox(
+ // -----------------------------------------------------left hand-----------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, G_DIFF, G_RST, _______, G_BRCH, _______,
+ _______, G_ADD, G_S, _______, _______, _______,
+ _______, _______, _______, G_C, _______, G_MERG, _______,
+ _______, _______, _______, _______, _______,
+
+ _______, _______,
+ _______,
+ _______, _______, _______,
+
+ // -----------------------------------------------------right hand-----------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, G_FTCH, _______, G_P, _______, _______,
+ _______, _______, _______, _______, _______, _______,
+ _______, _______, G_LOG, _______, G_DEV, _______, _______,
+ _______, _______, _______, _______, _______,
+
+ _______, _______,
+ _______,
+ _______, _______, _______
+),
+
+[GIT_C] = LAYOUT_ergodox(
+ // -----------------------------------------------------left hand-----------------------------------------------------
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, G_CHEC, XXXXXXX, XXXXXXX,
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ XXXXXXX, XXXXXXX,
+ XXXXXXX,
+ XXXXXXX, KC_BSPC, XXXXXXX,
+
+ // -----------------------------------------------------right hand-----------------------------------------------------
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, G_COMM, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ XXXXXXX, XXXXXXX,
+ XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX
+),
+
+[GIT_S] = LAYOUT_ergodox(
+ // -----------------------------------------------------left hand-----------------------------------------------------
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, G_STSH, G_SHOW, G_STAT, XXXXXXX,
+ _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ XXXXXXX, XXXXXXX,
+ XXXXXXX,
+ XXXXXXX, KC_BSPC, XXXXXXX,
+
+ // -----------------------------------------------------right hand-----------------------------------------------------
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, G_COMM, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+
+ XXXXXXX, XXXXXXX,
+ XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX
+),
+
+
+/* Numpad
+ *
+ * ,--------------------------------------------------.
+ * | | | | | | / | |
+ * |------+------+------+------+------+------+--------|
+ * | | | 7 | 8 | 9 | * | |
+ * | |------+------+------+------+------+--------|
+ * |------| | 4 | 5 | 6 | - | Enter |
+ * | |------+------+------+------+------+--------|
+ * | | | 1 | 2 | 3 | + | Enter |
+ * `-------------+------+------+------+------+--------'
+ * | | 0 | . | Calc | Calc |
+ * `----------------------------------'
+ */
+
+// [] = LAYOUT_ergodox(
+// // -----------------------------------------------------left hand-----------------------------------------------------
+// _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______,
+
+// _______, _______,
+// _______,
+// _______, _______, _______,
+
+// // -----------------------------------------------------right hand-----------------------------------------------------
+// _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______,
+
+// _______, _______,
+// _______,
+// _______, _______, _______
+// ),
+
+};
+
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+
+ }
+ return true;
+}
diff --git a/keyboards/ergodox_ez/config.h b/keyboards/ergodox_ez/config.h
index e60101e5e2..8ef600b089 100644
--- a/keyboards/ergodox_ez/config.h
+++ b/keyboards/ergodox_ez/config.h
@@ -16,8 +16,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef ERGODOX_EZ_CONFIG_H
-#define ERGODOX_EZ_CONFIG_H
+#pragma once
#include "config_common.h"
@@ -25,9 +24,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x1307
#define DEVICE_VER 0x0001
-#define MANUFACTURER ErgoDox EZ
+#define MANUFACTURER ZSA Technology Labs Inc
#define PRODUCT ErgoDox EZ
-#define DESCRIPTION QMK keyboard firmware for Ergodox EZ
/* key matrix size */
#define MATRIX_ROWS 14
@@ -149,5 +147,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
//#define DEBUG_MATRIX_SCAN_RATE
-
-#endif
diff --git a/keyboards/ergodox_ez/ergodox_ez.h b/keyboards/ergodox_ez/ergodox_ez.h
index 7ff62d38a1..88a0a2ee9f 100644
--- a/keyboards/ergodox_ez/ergodox_ez.h
+++ b/keyboards/ergodox_ez/ergodox_ez.h
@@ -1,5 +1,4 @@
-#ifndef ERGODOX_EZ_H
-#define ERGODOX_EZ_H
+#pragma once
#include "quantum.h"
#include <stdint.h>
@@ -65,8 +64,7 @@ inline void ergodox_left_led_2_off(void) { ergodox_left_led_2 = 0; }
inline void ergodox_left_led_3_off(void) { ergodox_left_led_3 = 0; }
#endif // LEFT_LEDS
-inline void ergodox_led_all_on(void)
-{
+inline void ergodox_led_all_on(void) {
ergodox_board_led_on();
ergodox_right_led_1_on();
ergodox_right_led_2_on();
@@ -100,19 +98,20 @@ inline void ergodox_right_led_set(uint8_t led, uint8_t n) {
(OCR1C = n);
}
-inline void ergodox_led_all_set(uint8_t n)
-{
+inline void ergodox_led_all_set(uint8_t n) {
ergodox_right_led_1_set(n);
ergodox_right_led_2_set(n);
ergodox_right_led_3_set(n);
}
-#ifdef ORYX_CONFIGURATOR
enum ergodox_ez_keycodes {
LED_LEVEL = SAFE_RANGE,
TOGGLE_LAYER_COLOR,
EZ_SAFE_RANGE,
};
+
+#ifndef WEBUSB_ENABLE
+# define WEBUSB_PAIR KC_NO
#endif
typedef union {
@@ -271,5 +270,3 @@ extern keyboard_config_t keyboard_config;
{ R05, R15, R25, R35, R45, R55 }, \
{ R06, R16, R26, R36, R46, KC_NO } \
}
-
-#endif
diff --git a/keyboards/ergodox_ez/info.json b/keyboards/ergodox_ez/info.json
index e543206fed..61ba58051d 100644
--- a/keyboards/ergodox_ez/info.json
+++ b/keyboards/ergodox_ez/info.json
@@ -1,7 +1,8 @@
{
"keyboard_name": "ErgoDox EZ",
"url": "ergodox-ez.com",
- "maintainer": "ZSA",
+ "maintainer": "ZSA via Drashna",
+ "manufacturer": "ZSA Technology Labs Inc",
"width": 17,
"height": 8,
diff --git a/keyboards/ergodox_ez/keymaps/default/keymap.c b/keyboards/ergodox_ez/keymaps/default/keymap.c
index 20c78bd57e..9079e48fcb 100644
--- a/keyboards/ergodox_ez/keymaps/default/keymap.c
+++ b/keyboards/ergodox_ez/keymaps/default/keymap.c
@@ -1,17 +1,18 @@
#include QMK_KEYBOARD_H
#include "version.h"
-#define BASE 0 // default layer
-#define SYMB 1 // symbols
-#define MDIA 2 // media keys
+enum layers {
+ BASE, // default layer
+ SYMB, // symbols
+ MDIA, // media keys
+};
enum custom_keycodes {
#ifdef ORYX_CONFIGURATOR
- EPRM = EZ_SAFE_RANGE,
+ VRSN = EZ_SAFE_RANGE,
#else
- EPRM = SAFE_RANGE,
+ VRSN = SAFE_RANGE,
#endif
- VRSN,
RGB_SLD
};
@@ -37,25 +38,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | |ace | End | | PgDn | | |
* `--------------------' `----------------------'
*/
-[BASE] = LAYOUT_ergodox(
+[BASE] = LAYOUT_ergodox_pretty(
// 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, TG(SYMB),
- KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G,
- KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
- LT(SYMB,KC_GRV), KC_QUOT, LALT(KC_LSFT), KC_LEFT, KC_RGHT,
- ALT_T(KC_APP), KC_LGUI,
- KC_HOME,
- KC_SPC, KC_BSPC, KC_END,
- // right hand
- KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
- TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
- KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN), GUI_T(KC_QUOT),
- MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
- KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, TT(SYMB),
- KC_LALT, CTL_T(KC_ESC),
- KC_PGUP,
- KC_PGDN, KC_TAB, KC_ENT
+ KC_EQL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_RGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ KC_DEL, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(SYMB), TG(SYMB), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN), GUI_T(KC_QUOT),
+ KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO), MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
+ LT(SYMB,KC_GRV), KC_QUOT, LALT(KC_LSFT), KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, TT(SYMB),
+ ALT_T(KC_APP), KC_LGUI, KC_LALT, CTL_T(KC_ESC),
+ KC_HOME, KC_PGUP,
+ KC_SPC, KC_BSPC, KC_END, KC_PGDN, KC_TAB, KC_ENT
),
/* Keymap 1: Symbol Layer
*
@@ -78,25 +70,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | |
* `--------------------' `--------------------'
*/
-[SYMB] = LAYOUT_ergodox(
+[SYMB] = LAYOUT_ergodox_pretty(
// left hand
- VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS,
- KC_TRNS, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS,
- KC_TRNS, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV,
- KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_TRNS,
- EPRM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- RGB_MOD, KC_TRNS,
- KC_TRNS,
- RGB_VAD, RGB_VAI, KC_TRNS,
- // right hand
- KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
- KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
- KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
- KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
- KC_TRNS, KC_DOT, KC_0, KC_EQL, KC_TRNS,
- RGB_TOG, RGB_SLD,
- KC_TRNS,
- KC_TRNS, RGB_HUD, RGB_HUI
+ VRSN, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRNS, KC_TRNS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
+ KC_TRNS, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS, KC_TRNS, KC_UP, KC_7, KC_8, KC_9, KC_ASTR, KC_F12,
+ KC_TRNS, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV, KC_DOWN, KC_4, KC_5, KC_6, KC_PLUS, KC_TRNS,
+ KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_TRNS, KC_TRNS, KC_AMPR, KC_1, KC_2, KC_3, KC_BSLS, KC_TRNS,
+ EEP_RST, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_DOT, KC_0, KC_EQL, KC_TRNS,
+ RGB_MOD, KC_TRNS, RGB_TOG, RGB_SLD,
+ KC_TRNS, KC_TRNS,
+ RGB_VAD, RGB_VAI, KC_TRNS, KC_TRNS, RGB_HUD, RGB_HUI
),
/* Keymap 2: Media and mouse keys
*
@@ -119,34 +102,23 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | |
* `--------------------' `--------------------'
*/
-[MDIA] = LAYOUT_ergodox(
+[MDIA] = LAYOUT_ergodox_pretty(
// left hand
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2,
- KC_TRNS, KC_TRNS,
- KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS,
- // right hand
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_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_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
- KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS,
- KC_TRNS,
- KC_TRNS, KC_TRNS, KC_WBAK
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_U, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, 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_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MNXT, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_BTN1, KC_BTN2, KC_VOLU, KC_VOLD, KC_MUTE, KC_TRNS, KC_TRNS,
+
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WBAK
),
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
switch (keycode) {
- case EPRM:
- eeconfig_init();
- return false;
case VRSN:
SEND_STRING (QMK_KEYBOARD "/" QMK_KEYMAP " @ " QMK_VERSION);
return false;
@@ -161,7 +133,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
// Runs just one time when the keyboard initializes.
-void matrix_init_user(void) {
+void keyboard_post_init_user(void) {
#ifdef RGBLIGHT_COLOR_LAYER_0
rgblight_setrgb(RGBLIGHT_COLOR_LAYER_0);
#endif
@@ -179,10 +151,6 @@ layer_state_t layer_state_set_user(layer_state_t state) {
case 0:
#ifdef RGBLIGHT_COLOR_LAYER_0
rgblight_setrgb(RGBLIGHT_COLOR_LAYER_0);
- #else
- #ifdef RGBLIGHT_ENABLE
- rgblight_init();
- #endif
#endif
break;
case 1:
diff --git a/keyboards/ergodox_ez/keymaps/nathanvercaemert/config.h b/keyboards/ergodox_ez/keymaps/nathanvercaemert/config.h
new file mode 100644
index 0000000000..6d69b00112
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/nathanvercaemert/config.h
@@ -0,0 +1,29 @@
+/*
+ Set any config.h overrides for your specific keymap here.
+ See config.h options at https://docs.qmk.fm/#/config_options?id=the-configh-file
+*/
+#define ORYX_CONFIGURATOR
+#undef TAPPING_TERM
+#define TAPPING_TERM 175
+
+#undef MOUSEKEY_DELAY
+#define MOUSEKEY_DELAY 20
+
+#undef MOUSEKEY_MAX_SPEED
+#define MOUSEKEY_MAX_SPEED 14
+
+#undef MOUSEKEY_TIME_TO_MAX
+#define MOUSEKEY_TIME_TO_MAX 30
+
+#undef MOUSEKEY_WHEEL_INTERVAL
+#define MOUSEKEY_WHEEL_INTERVAL 50
+
+// /* Temporarily defining a tapping term that is ridiculous to see if i can tell if lt is working. */
+// #undef TAPPING_TERM
+// #define TAPPING_TERM 499
+
+/* Turning permissive hold and ignore mod tap interrupt off in order to test the tapping term. */
+#undef PERMISSIVE_HOLD
+#define PERMISSIVE_HOLD
+#undef IGNORE_MOD_TAP_INTERRUPT
+#define IGNORE_MOD_TAP_INTERRUPT
diff --git a/keyboards/ergodox_ez/keymaps/nathanvercaemert/keymap.c b/keyboards/ergodox_ez/keymaps/nathanvercaemert/keymap.c
new file mode 100644
index 0000000000..c2960cfa16
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/nathanvercaemert/keymap.c
@@ -0,0 +1,351 @@
+#include QMK_KEYBOARD_H
+#include "version.h"
+#include "keymap_german.h"
+#include "keymap_nordic.h"
+#include "keymap_french.h"
+#include "keymap_spanish.h"
+#include "keymap_hungarian.h"
+#include "keymap_swedish.h"
+#include "keymap_br_abnt2.h"
+#include "keymap_canadian_multilingual.h"
+#include "keymap_german_ch.h"
+#include "keymap_jp.h"
+#include "keymap_bepo.h"
+
+#define KC_MAC_UNDO LGUI(KC_Z)
+#define KC_MAC_CUT LGUI(KC_X)
+#define KC_MAC_COPY LGUI(KC_C)
+#define KC_MAC_PASTE LGUI(KC_V)
+#define KC_PC_UNDO LCTL(KC_Z)
+#define KC_PC_CUT LCTL(KC_X)
+#define KC_PC_COPY LCTL(KC_C)
+#define KC_PC_PASTE LCTL(KC_V)
+#define ES_LESS_MAC KC_GRAVE
+#define ES_GRTR_MAC LSFT(KC_GRAVE)
+#define ES_BSLS_MAC ALGR(KC_6)
+#define NO_PIPE_ALT KC_GRAVE
+#define NO_BSLS_ALT KC_EQUAL
+
+enum custom_keycodes {
+ RGB_SLD = EZ_SAFE_RANGE,
+};
+
+// tapdance keycodes
+enum td_keycodes {
+ CTRL_TO12,
+ SHIFT_TO13,
+ ALT_TO11
+};
+
+// define a type containing as many tapdance states as you need
+typedef enum {
+ SINGLE_TAP,
+ SINGLE_HOLD,
+} td_state_t;
+
+// create a global instance of the tapdance state type
+static td_state_t td_state;
+
+// declare your tapdance functions:
+
+// function to determine the current tapdance state
+int cur_dance (qk_tap_dance_state_t *state);
+
+// `finished` and `reset` functions for each tapdance keycode
+void ctrlto12_finished (qk_tap_dance_state_t *state, void *user_data);
+void ctrlto12_reset (qk_tap_dance_state_t *state, void *user_data);
+void altto11_finished (qk_tap_dance_state_t *state, void *user_data);
+void altto11_reset (qk_tap_dance_state_t *state, void *user_data);
+void shiftto13_finished (qk_tap_dance_state_t *state, void *user_data);
+void shiftto13_reset (qk_tap_dance_state_t *state, void *user_data);
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_ergodox_pretty(
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_INSERT, KC_Q, LGUI_T(KC_W), MT(MOD_HYPR, KC_E),LT(5,KC_R), KC_T, KC_NO, KC_NO, KC_Y, LT(6,KC_U), MT(MOD_HYPR, KC_I),RGUI_T(KC_O), KC_P, KC_PSCREEN,
+ KC_ESCAPE, LSFT_T(KC_A), LCTL_T(KC_S), LALT_T(KC_D), LT(1,KC_F), KC_G, KC_H, LT(2,KC_J), RALT_T(KC_K), RCTL_T(KC_L), RSFT_T(KC_SCOLON),KC_CAPSLOCK,
+ KC_HOME, LT(9,KC_Z), MT(MOD_LGUI | MOD_LCTL,KC_X), LT(7,KC_C), LT(3,KC_V), KC_B, KC_NO, KC_NO, KC_N, LT(4,KC_M), LT(8,KC_COMMA), MT(MOD_RGUI | MOD_RCTL, KC_DOT), KC_QUOTE, KC_END,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_DELETE, KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO,
+ TO(10), KC_BSPACE, KC_NO, KC_NO, KC_ENTER, KC_SPACE
+ ),
+ [1] = LAYOUT_ergodox_pretty(
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_LGUI, KC_HYPR, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_7, KC_8, KC_9, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_LSHIFT, KC_LCTRL, KC_LALT, KC_TRANSPARENT, KC_NO, KC_NO, KC_4, KC_5, KC_6, KC_0, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, MT(MOD_LGUI | MOD_LCTL,KC_NO), KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_1, KC_2, KC_3, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT
+ ),
+ [2] = LAYOUT_ergodox_pretty(
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_HYPR, KC_RGUI, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_LPRN, KC_RPRN, KC_ASTR, KC_SLASH, KC_NO, KC_NO, KC_TRANSPARENT, KC_RALT, KC_RCTRL, KC_RSHIFT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, MT(MOD_RGUI | MOD_RCTL, KC_NO), KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT
+ ),
+ [3] = LAYOUT_ergodox_pretty(
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_LGUI, KC_HYPR, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_LSHIFT, KC_LCTRL, KC_LALT, KC_NO, KC_NO, KC_NO, KC_F5, KC_F6, KC_F7, KC_F8, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, MT(MOD_LGUI | MOD_LCTL,KC_NO), KC_NO, KC_TRANSPARENT, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_F1, KC_F2, KC_F3, KC_F4, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT
+ ),
+ [4] = LAYOUT_ergodox_pretty(
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_HYPR, KC_RGUI, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_LBRACKET, KC_RBRACKET, KC_QUES, KC_EXLM, KC_NO, KC_NO, KC_NO, KC_RALT, KC_RCTRL, KC_RSHIFT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_TRANSPARENT, KC_NO, MT(MOD_RGUI | MOD_RCTL, KC_NO), KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT
+ ),
+ [5] = LAYOUT_ergodox_pretty(
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_LGUI, KC_HYPR, KC_TRANSPARENT, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_LSHIFT, KC_LCTRL, KC_LALT, KC_NO, KC_NO, KC_NO, KC_HASH, KC_BSLASH, KC_GRAVE, KC_TILD, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, MT(MOD_LGUI | MOD_LCTL,KC_NO), KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT
+ ),
+ [6] = LAYOUT_ergodox_pretty(
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_TRANSPARENT, KC_HYPR, KC_RGUI, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_UNDS, KC_EQUAL, KC_MINUS, KC_PLUS, KC_NO, KC_NO, KC_NO, KC_RALT, KC_RCTRL, KC_RSHIFT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, MT(MOD_RGUI | MOD_RCTL, KC_NO), KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT
+ ),
+ [7] = LAYOUT_ergodox_pretty(
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_AT, KC_DLR, KC_PERC, KC_CIRC, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_NO, KC_TRANSPARENT, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT
+ ),
+ [8] = LAYOUT_ergodox_pretty(
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_LCBR, KC_RCBR, KC_AMPR, KC_PIPE, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_TRANSPARENT, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT
+ ),
+ [9] = LAYOUT_ergodox_pretty(
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_AUDIO_VOL_UP,KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MEDIA_PREV_TRACK,KC_AUDIO_VOL_DOWN,KC_MEDIA_NEXT_TRACK,KC_MEDIA_PLAY_PAUSE,KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT
+ ),
+ [10] = LAYOUT_ergodox_pretty(
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_LGUI, KC_MS_BTN2, KC_NO, KC_NO, KC_TRANSPARENT, MT(MOD_RCTL, KC_A), KC_NO, KC_NO, KC_MS_UP, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, TD(SHIFT_TO13), TD(CTRL_TO12), TD(ALT_TO11), KC_MS_BTN1, KC_NO, KC_NO, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, MT(MOD_LGUI | MOD_LCTL,KC_NO), KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, TO(0)
+ ),
+ [11] = LAYOUT_ergodox_pretty(
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_LGUI, KC_HYPR, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_UP, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_LSHIFT, KC_LCTRL, KC_LALT, KC_NO, KC_NO, KC_NO, KC_LEFT, KC_DOWN, KC_RIGHT, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, MT(MOD_LGUI | MOD_LCTL,KC_NO), KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, TO(0)
+ ),
+ [12] = LAYOUT_ergodox_pretty(
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_LGUI, KC_HYPR, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_MS_WH_UP, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_LSHIFT, KC_LCTRL, KC_LALT, KC_NO, KC_NO, KC_NO, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_RIGHT, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, MT(MOD_LGUI | MOD_LCTL,KC_NO), KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, TO(0)
+ ),
+ [13] = LAYOUT_ergodox_pretty(
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, KC_LGUI, KC_HYPR, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_PGUP, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_LSHIFT, KC_LCTRL, KC_LALT, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGDOWN, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_NO, MT(MOD_LGUI | MOD_LCTL,KC_NO), KC_NO, KC_NO, KC_NO, KC_TRANSPARENT, KC_TRANSPARENT, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT,
+ KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, TO(0)
+ ),
+};
+
+
+/* Commenting out for debug purposes */
+// bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+// switch (keycode) {
+// }
+// return true;
+// }
+
+uint32_t layer_state_set_user(uint32_t state) {
+ uint8_t layer = biton32(state);
+ ergodox_board_led_off();
+ ergodox_right_led_1_off();
+ ergodox_right_led_2_off();
+ ergodox_right_led_3_off();
+ switch (layer) {
+ case 1:
+ ergodox_right_led_1_on();
+ break;
+ case 2:
+ ergodox_right_led_2_on();
+ break;
+ case 3:
+ ergodox_right_led_3_on();
+ break;
+ case 4:
+ ergodox_right_led_1_on();
+ ergodox_right_led_2_on();
+ break;
+ case 5:
+ ergodox_right_led_1_on();
+ ergodox_right_led_3_on();
+ break;
+ case 6:
+ ergodox_right_led_2_on();
+ ergodox_right_led_3_on();
+ break;
+ case 7:
+ ergodox_right_led_1_on();
+ ergodox_right_led_2_on();
+ ergodox_right_led_3_on();
+ break;
+ default:
+ break;
+ }
+ return state;
+};
+
+// determine the tapdance state to return
+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 { return 2; } // any number higher than the maximum state value you return above
+}
+
+void ctrlto12_finished (qk_tap_dance_state_t *state, void *user_data) {
+ td_state = cur_dance(state);
+ switch (td_state) {
+ case SINGLE_TAP:
+ layer_on(12);
+ break;
+ case SINGLE_HOLD:
+ register_mods(MOD_BIT(KC_LCTRL)); // for a layer-tap key, use `layer_on(_MY_LAYER)` here
+ break;
+ }
+}
+
+void ctrlto12_reset (qk_tap_dance_state_t *state, void *user_data) {
+ switch (td_state) {
+ case SINGLE_TAP:
+ break;
+ case SINGLE_HOLD:
+ unregister_mods(MOD_BIT(KC_LCTRL)); // for a layer-tap key, use `layer_off(_MY_LAYER)` here
+ break;
+ }
+}
+
+void shiftto13_finished (qk_tap_dance_state_t *state, void *user_data) {
+ td_state = cur_dance(state);
+ switch (td_state) {
+ case SINGLE_TAP:
+ layer_on(13);
+ break;
+ case SINGLE_HOLD:
+ register_mods(MOD_BIT(KC_LSHIFT)); // for a layer-tap key, use `layer_on(_MY_LAYER)` here
+ break;
+ }
+}
+
+void shiftto13_reset (qk_tap_dance_state_t *state, void *user_data) {
+ switch (td_state) {
+ case SINGLE_TAP:
+ break;
+ case SINGLE_HOLD:
+ unregister_mods(MOD_BIT(KC_LSHIFT)); // for a layer-tap key, use `layer_off(_MY_LAYER)` here
+ break;
+ }
+}
+
+void altto11_finished (qk_tap_dance_state_t *state, void *user_data) {
+ td_state = cur_dance(state);
+ switch (td_state) {
+ case SINGLE_TAP:
+ layer_on(11);
+ break;
+ case SINGLE_HOLD:
+ register_mods(MOD_BIT(KC_LALT)); // for a layer-tap key, use `layer_on(_MY_LAYER)` here
+ break;
+ }
+}
+
+void altto11_reset (qk_tap_dance_state_t *state, void *user_data) {
+ switch (td_state) {
+ case SINGLE_TAP:
+ break;
+ case SINGLE_HOLD:
+ unregister_mods(MOD_BIT(KC_LALT)); // for a layer-tap key, use `layer_off(_MY_LAYER)` here
+ break;
+ }
+}
+
+// define `ACTION_TAP_DANCE_FN_ADVANCED()` for each tapdance keycode, passing in `finished` and `reset` functions
+qk_tap_dance_action_t tap_dance_actions[] = {
+ [CTRL_TO12] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ctrlto12_finished, ctrlto12_reset),
+ [SHIFT_TO13] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, shiftto13_finished, shiftto13_reset),
+ [ALT_TO11] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, altto11_finished, altto11_reset)
+};
+
+/* Debugging functions */
+
+void keyboard_post_init_user(void) {
+ // Customise these values to desired behaviour
+// debug_enable=true;
+// debug_matrix=true;
+// debug_keyboard=true;
+// debug_mouse=true;
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ // If console is enabled, it will print the matrix position and status of each key pressed
+// #ifdef CONSOLE_ENABLE
+// uprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
+// #endif
+ return true;
+}
+
diff --git a/keyboards/ergodox_ez/keymaps/nathanvercaemert/readme.md b/keyboards/ergodox_ez/keymaps/nathanvercaemert/readme.md
new file mode 100644
index 0000000000..5570d9881c
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/nathanvercaemert/readme.md
@@ -0,0 +1,26 @@
+# The nathanvercaemert ErgoDox EZ configuration
+
+Centered around the home row and the use of mouse keys, this configuration focuses
+on minimal finger movement. No key is more than one unit away from a finger on the home row.
+
+## Layers
+
+* Base Layer
+ * The two main thumb keys provide a loop to the mouse key layer. Pressing the left followed by the right always guarantees that you are on the base layer.
+ * There are a lot of dual function keys on the base layer.
+ * The layout of the letters is qwerty.
+ * Pinkys, ring fingers, and middle fingers apply dual function modifiers (along with the keys above and below the ring fingers.)
+* Numbers, Symbols, and Function Keys.
+ * From the base layer, many keys are dual function layer switches.
+ * The switch on one hand changes the home row of the other hand to a row of symbols in most cases.
+ * The left index finger, and the key below it, change the right hand to the numbers and function keys
+ respectfully.
+* Mouse Layer
+ * Clicking the main left thumb key navigates to the mouse layer (10.) Some dual function keys (technically tap dance functions) allow the left hand to apply modifiers to mouse clicks while tapping switches to
+ navigation layers.
+* Navigation Layers
+ * From the Mouse Layer, taps to the left home row navigate to scroll keys, arrow keys, and page keys.
+
+Here is the image of my keymap:
+
+![Default](https://i.imgur.com/kXywQIq.png) \ No newline at end of file
diff --git a/keyboards/ergodox_ez/keymaps/nathanvercaemert/rules.mk b/keyboards/ergodox_ez/keymaps/nathanvercaemert/rules.mk
new file mode 100644
index 0000000000..b41c275dd1
--- /dev/null
+++ b/keyboards/ergodox_ez/keymaps/nathanvercaemert/rules.mk
@@ -0,0 +1,10 @@
+# Set any rules.mk overrides for your specific keymap here.
+# See rules at https://docs.qmk.fm/#/config_options?id=the-rulesmk-file
+LINK_TIME_OPTIMIZATION_ENABLE = yes
+COMMAND_ENABLE = no
+RGBLIGHT_ENABLE = no
+TAP_DANCE_ENABLE=yes
+
+
+#Beginning debugging process for LT() and permissive hold
+CONSOLE_ENABLE = yes
diff --git a/keyboards/ergodox_ez/readme.md b/keyboards/ergodox_ez/readme.md
index bce8ff3c6f..796e96ce53 100644
--- a/keyboards/ergodox_ez/readme.md
+++ b/keyboards/ergodox_ez/readme.md
@@ -1,41 +1,44 @@
# ErgoDox EZ
-The Ez uses the [Teensy Loader](https://www.pjrc.com/teensy/loader.html).
+![ErgoDox EZ](http://www.coolthings.com/wp-content/uploads/2017/05/ergodox-ez-2.jpg)
-Linux users need to modify udev rules as described on the [Teensy
-Linux page]. Some distributions provide a binary, maybe called
-`teensy-loader-cli`.
+The ErgoDox EZ is a mass produced version of the original ErgoDox keyboard, with optional support for RGB Light (Shine) or RGB Matrix (Glow).
-[Teensy Linux page]: https://www.pjrc.com/teensy/loader_linux.html
+* Keyboard Maintainer: [ZSA Technology Labs Inc](https://github.com/zsa), Firmware maintained by [drashna](https://github.com/drashna)
+* Hardware Supported: Original ErgoDox, ErgoDox EZ
+* Hardware Availability: [ErgoDox EZ](https://ergodox-ez.com/), [ErgoDox.io](https://ergodox.io)
-To flash the firmware:
+Make example for this keyboard (after setting up your build environment):
- - Build the firmware with `make <keyboardname>:<keymapname>`, for example `make ergodox_ez:default`
+ make ergodox_ez:default:flash
- - This will result in a hex file called `ergodox_ez_keymapname.hex`, e.g.
- `ergodox_ez_default.hex`
+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).
- - Start the teensy loader.
+## Oryx Configuation
- - Load the .hex file into it.
+If you have `ORYX_CONFIGURATOR` defined in your keymap's `config.h`, this enables a number of the built in options from the Oryx Configurator.
- - Press the Reset button by inserting a paperclip gently into the reset hole
- in the top right corner.
+### Indicator LEDs
- - Click the button in the Teensy app to download the firmware.
+You can use the `LED_LEVEL` keycode to cycle through the brightness levels for the LEDs on the top right of the keyboard. These settings are saved in eeprom (persistant memory).
-See also [video demonstration](https://www.youtube.com/watch?v=9PyiGUO9_KQ) using Teensy in auto mode.
+Alternatively, you can set the brightness by calling the following functions:
-To flash with ´teensy-loader-cli´:
+```c
+void ergodox_led_all_set(uint8_t level);
+void ergodox_right_led_1_set(uint8_t level);
+void ergodox_right_led_2_set(uint8_t level);
+void ergodox_right_led_3_set(uint8_t level);
+```
- - Build the firmware with `make keymapname`, for example `make default`
+These settings are not persistent, so you'd need to reset it every time the board starts.
- - Run ´<path/to/>teensy_loader_cli -mmcu=atmega32u4 -w ergodox_ez_<keymap>.hex´
+These are on a 0-255 scale
- - Press the Reset button by inserting a paperclip gently into the reset hole
- in the top right corder.
+### RGB Matrix Features
-## Settings
+If you're using the Smart LED (layer indication) feature from the Oryx Configurator, you want to make sure that you enable these options by adding `#define ORYX_CONFIGURATOR` to your keymap's `config.h`.
-You may want to enable QMK_KEYS_PER_SCAN because the Ergodox has a relatively
-slow scan rate.
+This changes the `RGB_TOG` keycode so that it will toggle the lights on and off, in a way that will allow the Smart LEDs to continue to work, even with the rest of the LEDs turned off.
+
+Additionally, a new keycode has been added to toggle the Smart LEDs. Use `TOGGLE_LAYER_COLOR`, if you aren't already.
diff --git a/keyboards/ergodox_stm32/keymaps/default/keymap.c b/keyboards/ergodox_stm32/keymaps/default/keymap.c
index dcf8d15b7b..04a12962e3 100644
--- a/keyboards/ergodox_stm32/keymaps/default/keymap.c
+++ b/keyboards/ergodox_stm32/keymaps/default/keymap.c
@@ -9,10 +9,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
-const uint16_t PROGMEM fn_actions[] = {
- [1] = TT(1)
-};
-
layer_state_t layer_state_set_user(layer_state_t state) {
uint8_t layer = get_highest_layer(state);
diff --git a/keyboards/ergoinu/info.json b/keyboards/ergoinu/info.json
deleted file mode 100644
index 81f53fd255..0000000000
--- a/keyboards/ergoinu/info.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "keyboard_name": "Ergoinu",
- "url": "",
- "maintainer": "hsgw",
- "width": 18,
- "height": 5.4,
- "layouts": {
- "LAYOUT": {
- "key_count": 64,
- "layout": [
- { "x": 0, "y": 0.6, "label": "ESC" },
- { "x": 1, "y": 0.4, "label": "1" },
- { "x": 2, "y": 0.4, "label": "2" },
- { "x": 3, "y": 0.25, "label": "3" },
- { "x": 4, "y": 0, "label": "4" },
- { "x": 5, "y": 0.25, "label": "5" },
- { "x": 6, "y": 0.4, "label": "6" },
-
- { "x": 11, "y": 0.4, "label": "7" },
- { "x": 12, "y": 0.25, "label": "8" },
- { "x": 13, "y": 0, "label": "9" },
- { "x": 14, "y": 0.25, "label": "0" },
- { "x": 15, "y": 0.4, "label": "MINUS" },
- { "x": 16, "y": 0.4, "label": "EQUAL" },
- { "x": 17, "y": 0.6, "label": "BACKSLASH" },
-
- { "x": 0, "y": 1.6, "label": "DELETE" },
- { "x": 1, "y": 1.4, "label": "TAB" },
- { "x": 2, "y": 1.4, "label": "Q" },
- { "x": 3, "y": 1.25, "label": "W" },
- { "x": 4, "y": 1, "label": "E" },
- { "x": 5, "y": 1.25, "label": "R" },
- { "x": 6, "y": 1.4, "label": "T" },
-
- { "x": 11, "y": 1.4, "label": "Y" },
- { "x": 12, "y": 1.25, "label": "U" },
- { "x": 13, "y": 1, "label": "I" },
- { "x": 14, "y": 1.25, "label": "O" },
- { "x": 15, "y": 1.4, "label": "P" },
- { "x": 16, "y": 1.4, "label": "LBRACKET" },
- { "x": 17, "y": 1.6, "label": "RBRACKET" },
-
- { "x": 0.25, "y": 2.6, "w": 1.75, "label": "LCTRL" },
- { "x": 2, "y": 2.4, "label": "A" },
- { "x": 3, "y": 2.25, "label": "S" },
- { "x": 4, "y": 2, "label": "D" },
- { "x": 5, "y": 2.25, "label": "F" },
- { "x": 6, "y": 2.4, "label": "G" },
-
- { "x": 11, "y": 2.4, "label": "H" },
- { "x": 12, "y": 2.25, "label": "J" },
- { "x": 13, "y": 2, "label": "K" },
- { "x": 14, "y": 2.25, "label": "L" },
- { "x": 15, "y": 2.4, "label": "SEMICOLON" },
- { "x": 16, "y": 2.4, "label": "QUOTE" },
- { "x": 17, "y": 2.6, "label": "GRAVE" },
-
- { "x": 0.25, "y": 3.6, "w": 1.75, "label": "LSHIFT" },
- { "x": 2, "y": 3.4, "label": "Z" },
- { "x": 3, "y": 3.25, "label": "X" },
- { "x": 4, "y": 3, "label": "C" },
- { "x": 5, "y": 3.25, "label": "V" },
- { "x": 6, "y": 3.4, "label": "B" },
-
- { "x": 11, "y": 3.4, "label": "N" },
- { "x": 12, "y": 3.25, "label": "M" },
- { "x": 13, "y": 3, "label": "COMMA" },
- { "x": 14, "y": 3.25, "label": "DOT" },
- { "x": 15, "y": 3.4, "label": "SLASH" },
- { "x": 16, "y": 3.4, "label": "RSHIFT" },
- { "x": 17, "y": 3.6, "label": "RSHIFT" },
-
- { "x": 3, "y": 4.25, "label": "MO(META)" },
- { "x": 4, "y": 4, "label": "LALT" },
- { "x": 5, "y": 4.25, "label": "LGUI" },
- { "x": 6, "y": 4.4, "label": "ENT" },
- { "x": 7, "y": 4.4, "w": 1.5, "label": "SPACE" },
-
- { "x": 9.5, "y": 4.4, "w": 1.5, "label": "ENTER" },
- { "x": 11, "y": 4.4, "label": "BACKSPACE" },
- { "x": 12, "y": 4.25, "label": "RGUI" },
- { "x": 13, "y": 4, "label": "RALT" },
- { "x": 14, "y": 4.25, "label": "MO(META)" }
- ]
- }
- }
-}
diff --git a/keyboards/ergoinu/readme.md b/keyboards/ergoinu/readme.md
deleted file mode 100644
index 06e0cf352e..0000000000
--- a/keyboards/ergoinu/readme.md
+++ /dev/null
@@ -1,21 +0,0 @@
-ErgoInu
-===
-
-![ergoinu](https://i.imgur.com/4CCM8Vl.jpg)
-
-An (Not Portable But Small) Ergonomic Split Keyboard.
-
-Keyboard Maintainer: [hsgw](https://github.com/hsgw/) [twitter](https://twitter.com/hsgw)
-Hardware Supported: Pro Micro
-Hardware Availability & Repository: [https://github.com/hsgw/ergoinu](https://github.com/hsgw/ergoinu)
-
-Make example for this keyboard (after setting up your build environment):
-
- make ergoinu:default
-
- (or)
-
- make ergoinu:default_jis
-
-
-See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
diff --git a/keyboards/ergoinu/rules.mk b/keyboards/ergoinu/rules.mk
deleted file mode 100644
index 6f5debe00c..0000000000
--- a/keyboards/ergoinu/rules.mk
+++ /dev/null
@@ -1,51 +0,0 @@
-# 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 = no # Audio control and System control
-CONSOLE_ENABLE = no # 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 = no # Enable WS2812 RGB underlight.
-SUBPROJECT_rev1 = no
-USE_I2C = no # i2c is not supported
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
-
-CUSTOM_MATRIX = yes
-SRC += matrix.c serial.c split_util.c
-
-DEFAULT_FOLDER = ergoinu
-
-# ergoinu configs
-DISABLE_PROMICRO_LEDs = yes
-
-ifneq ($(strip $(ERGOINU)),)
- ifeq ($(findstring promicroled, $(ERGOINU)), promicroled)
- DISABLE_PROMICRO_LEDs = no
- endif
-endif
-
-ifeq ($(strip $(DISABLE_PROMICRO_LEDs)), yes)
- OPT_DEFS += -DDISABLE_PROMICRO_LEDs
-endif
diff --git a/keyboards/ergotravel/keymaps/ckofy/keymap.c b/keyboards/ergotravel/keymaps/ckofy/keymap.c
index 691d4aa943..b9a2c140d8 100644
--- a/keyboards/ergotravel/keymaps/ckofy/keymap.c
+++ b/keyboards/ergotravel/keymaps/ckofy/keymap.c
@@ -18,17 +18,6 @@ enum custom_keycodes {
ADJUST,
};
-/* Fn keys */
-
-enum {
-
- F_SFT = 0,
- F_ALT,
- F_CTRL,
- F_NUMPAD
-// F_LOWER,
-// F_RAISE,
-};
#define KC_ KC_TRNS
#define KC_XXXX KC_NO
@@ -57,8 +46,8 @@ enum {
#define KC_UDO LCTL(KC_Z)
#define KC_CUT LCTL(KC_X)
#define KC_SVE LCTL(KC_S)
-#define KC_OSH F(F_SFT)
-#define KC_OCTL F(F_CTRL)
+#define KC_OSH OSM(MOD_LSFT)
+#define KC_OCTL OSM(MOD_LCTL)
#define KC_NUMP TT(_NUMPAD)
#define KC_SHESC MT(MOD_LSFT,KC_ESC)
#define KC_SHENT MT(MOD_RSFT,KC_ENT)
@@ -142,14 +131,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
-const uint16_t PROGMEM fn_actions[] = {
- [F_SFT] = ACTION_MODS_ONESHOT (MOD_LSFT)
- ,[F_ALT] = ACTION_MODS_ONESHOT (MOD_LALT)
- ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL)
-};
-
-
-
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case COLEMAK:
diff --git a/keyboards/ericrlau/numdiscipline/info.json b/keyboards/ericrlau/numdiscipline/info.json
new file mode 100644
index 0000000000..fbd40f399d
--- /dev/null
+++ b/keyboards/ericrlau/numdiscipline/info.json
@@ -0,0 +1,21 @@
+{
+ "keyboard_name": "ELau NumDiscipline KB",
+ "url": "https://github.com/ericrlau/NumDiscipline",
+ "maintainer": "ericrlau",
+ "width": 19.5,
+ "height": 5.25,
+ "layouts": {
+ "LAYOUT_all": {
+ "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":"Del", "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, "h":2}, {"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":"4", "x":15.5, "y":2}, {"label":"5", "x":16.5, "y":2}, {"label":"6", "x":17.5, "y":2}, {"label":"Left 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":"Right Shift", "x":12.25, "y":3, "w":1.75}, {"label":"<i class='kb kb-Arrows-Up'></i>", "x":14.25, "y":3.25}, {"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, "h":2}, {"label":"Left Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Left Alt", "x":2.5, "y":4, "w":1.25}, {"label":"Space", "x":3.75, "y":4, "w":6.25}, {"label":"Right Alt", "x":10, "y":4}, {"label":"Right Ctrl", "x":11, "y":4}, {"label":"Func", "x":12, "y":4}, {"label":"<i class='kb kb-Arrows-Left'></i>", "x":13.25, "y":4.25}, {"label":"<i class='kb kb-Arrows-Down'></i>", "x":14.25, "y":4.25}, {"label":"<i class='kb kb-Arrows-Right'></i>", "x":15.25, "y":4.25}, {"label":"0", "x":16.5, "y":4}, {"label":".", "x":17.5, "y":4}]
+ },
+ "LAYOUT_std_2_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":"Del", "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, "h":2}, {"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":"4", "x":15.5, "y":2}, {"label":"5", "x":16.5, "y":2}, {"label":"6", "x":17.5, "y":2}, {"label":"Left 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":"Right Shift", "x":12.25, "y":3, "w":1.75}, {"label":"<i class='kb kb-Arrows-Up'></i>", "x":14.25, "y":3.25}, {"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, "h":2}, {"label":"Left Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Left Alt", "x":2.5, "y":4, "w":1.25}, {"label":"Space", "x":3.75, "y":4, "w":6.25}, {"label":"Right Ctrl", "x":10, "y":4, "w":1.5}, {"label":"Func", "x":11.5, "y":4, "w":1.5}, {"label":"<i class='kb kb-Arrows-Left'></i>", "x":13.25, "y":4.25}, {"label":"<i class='kb kb-Arrows-Down'></i>", "x":14.25, "y":4.25}, {"label":"<i class='kb kb-Arrows-Right'></i>", "x":15.25, "y":4.25}, {"label":"0", "x":16.5, "y":4}, {"label":".", "x":17.5, "y":4}]
+ },
+ "LAYOUT_wkl_2_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":"Del", "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, "h":2}, {"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":"4", "x":15.5, "y":2}, {"label":"5", "x":16.5, "y":2}, {"label":"6", "x":17.5, "y":2}, {"label":"Left 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":"Right Shift", "x":12.25, "y":3, "w":1.75}, {"label":"<i class='kb kb-Arrows-Up'></i>", "x":14.25, "y":3.25}, {"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, "h":2}, {"label":"Left Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Left Alt", "x":2.5, "y":4, "w":1.25}, {"label":"Space", "x":3.75, "y":4, "w":6.25}, {"label":"Right Ctrl", "x":10, "y":4, "w":1.5}, {"label":"Func", "x":11.5, "y":4, "w":1.5}, {"label":"<i class='kb kb-Arrows-Left'></i>", "x":13.25, "y":4.25}, {"label":"<i class='kb kb-Arrows-Down'></i>", "x":14.25, "y":4.25}, {"label":"<i class='kb kb-Arrows-Right'></i>", "x":15.25, "y":4.25}, {"label":"0", "x":16.5, "y":4}, {"label":".", "x":17.5, "y":4}]
+ },
+ "LAYOUT_wkl_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":"Del", "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, "h":2}, {"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":"4", "x":15.5, "y":2}, {"label":"5", "x":16.5, "y":2}, {"label":"6", "x":17.5, "y":2}, {"label":"Left 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":"Right Shift", "x":12.25, "y":3, "w":1.75}, {"label":"<i class='kb kb-Arrows-Up'></i>", "x":14.25, "y":3.25}, {"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, "h":2}, {"label":"Left Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Left Alt", "x":2.5, "y":4, "w":1.25}, {"label":"Space", "x":3.75, "y":4, "w":6.25}, {"label":"Right Alt", "x":10, "y":4}, {"label":"Right Ctrl", "x":11, "y":4}, {"label":"Func", "x":12, "y":4}, {"label":"<i class='kb kb-Arrows-Left'></i>", "x":13.25, "y":4.25}, {"label":"<i class='kb kb-Arrows-Down'></i>", "x":14.25, "y":4.25}, {"label":"<i class='kb kb-Arrows-Right'></i>", "x":15.25, "y":4.25}, {"label":"0", "x":16.5, "y":4}, {"label":".", "x":17.5, "y":4}]
+ }
+ }
+}
diff --git a/keyboards/ericrlau/numdiscipline/keymaps/default/keymap.c b/keyboards/ericrlau/numdiscipline/keymaps/default/keymap.c
new file mode 100644
index 0000000000..c24713eb6e
--- /dev/null
+++ b/keyboards/ericrlau/numdiscipline/keymaps/default/keymap.c
@@ -0,0 +1,44 @@
+/* Copyright 2020 Eric Lau
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#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] = 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_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_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, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT, KC_P0, KC_PDOT),
+
+ [_FN] = LAYOUT_all(
+ /* esc 1 2 3 4 5 6 7 8 9 0 - = bkspc del / * - */
+ 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_PSLS, KC_PAST, KC_PMNS,
+ /* tab Q W E R T Y U I O P [ ] \ 7 8 9 + */
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS,
+ /* caps A S D F G H J K L ; ' enter 4 5 6 */
+ KC_TRNS, KC_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,
+ /* shift Z X C V B N M , . / shift up 1 2 3 enter*/
+ KC_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_PGDN, KC_P2, KC_P3, KC_PENT,
+ /* ctrl win alt space alt fn ctrl left down right 0 . */
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_VOLD, KC_TRNS, KC_TRNS, KC_TRNS )
+
+};
diff --git a/keyboards/ericrlau/numdiscipline/keymaps/default/readme.md b/keyboards/ericrlau/numdiscipline/keymaps/default/readme.md
new file mode 100644
index 0000000000..1e3a04f735
--- /dev/null
+++ b/keyboards/ericrlau/numdiscipline/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for NumDiscipline
diff --git a/keyboards/ericrlau/numdiscipline/readme.md b/keyboards/ericrlau/numdiscipline/readme.md
new file mode 100644
index 0000000000..bd040df2a5
--- /dev/null
+++ b/keyboards/ericrlau/numdiscipline/readme.md
@@ -0,0 +1,23 @@
+# NumDiscipline
+
+![NumDiscipline](https://github.com/ericrlau/NumDiscipline/blob/master/images/NumDiscipline-pcb-front.png?raw=true!)
+
+A modified version of the through hole 65% Discipline keyboard by cftkb.
+
+* Modifications from original Discipline
+* Add numpad on right.
+* Move arrow keys 0.25U down and right, similar to 1800 layout.
+* Adjust component layout on top of board, moving ATMega and buttons to the right, adding in more diodes in center.
+* Removed ~, Delete, Page Up, Page Down keys. These will be on alternate layer.
+
+Other Information:
+
+* Keyboard Maintainer: [ELau](https://github.com/ericrlau)
+* Hardware Supported: The PCBs, controllers supported
+* Hardware Availability: https://github.com/ericrlau/NumDiscipline
+
+Make example for this keyboard (after setting up your build environment):
+
+ make ericrlau/numdiscipline/rev1: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/ericrlau/numdiscipline/rev1/config.h b/keyboards/ericrlau/numdiscipline/rev1/config.h
new file mode 100644
index 0000000000..008d5f0c32
--- /dev/null
+++ b/keyboards/ericrlau/numdiscipline/rev1/config.h
@@ -0,0 +1,248 @@
+/*
+Copyright 2020 Eric Lau
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x454C // EL
+#define PRODUCT_ID 0x0001
+#define DEVICE_VER 0x0001
+#define MANUFACTURER ELau
+#define PRODUCT NumDiscipline
+#define DESCRIPTION A custom keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#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 { B2, A1, B1, A0, B0 }
+#define MATRIX_COL_PINS { A2, B3, A3, B4, A4, D5, D6, C6, C5, C4, C3, C2, C1, C0, D7, A5, A6, A7 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+#define USB_MAX_POWER_CONSUMPTION 100
+
+/*
+ * 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
+// #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/ericrlau/numdiscipline/rev1/rev1.c b/keyboards/ericrlau/numdiscipline/rev1/rev1.c
new file mode 100644
index 0000000000..9f3a0ba4a4
--- /dev/null
+++ b/keyboards/ericrlau/numdiscipline/rev1/rev1.c
@@ -0,0 +1,17 @@
+/* Copyright 2020 Eric Lau
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "rev1.h"
diff --git a/keyboards/ericrlau/numdiscipline/rev1/rev1.h b/keyboards/ericrlau/numdiscipline/rev1/rev1.h
new file mode 100644
index 0000000000..e7bea65578
--- /dev/null
+++ b/keyboards/ericrlau/numdiscipline/rev1/rev1.h
@@ -0,0 +1,77 @@
+/* Copyright 2020 Eric Lau
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#define _x_ KC_NO
+
+#include "quantum.h"
+
+#define LAYOUT_all( \
+ K00, K01, K02, K03, K04, K05, K06, 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, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, K2E, K2F, K2G, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, \
+ K40, K41, K42, K46, K49, K4A, K4B, K4C, K4D, K4E, K4F, K4G \
+){ \
+{ K00, K01, K02, K03, K04, K05, K06, 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, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, _x_, K2D, K2E, K2F, K2G, _x_ }, \
+{ K30, _x_, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H }, \
+{ K40, K41, K42, _x_, _x_, _x_, K46, _x_, _x_, K49, K4A, K4B, K4C, K4D, K4E, K4F, K4G, _x_} \
+}
+
+#define LAYOUT_std_2_right_mods( \
+ K00, K01, K02, K03, K04, K05, K06, 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, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, K2E, K2F, K2G, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, \
+ K40, K41, K42, K46, K49, K4A, K4C, K4D, K4E, K4F, K4G \
+){ \
+{ K00, K01, K02, K03, K04, K05, K06, 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, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, _x_, K2D, K2E, K2F, K2G, _x_ }, \
+{ K30, _x_, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H }, \
+{ K40, K41, K42, _x_, _x_, _x_, K46, _x_, _x_, K49, K4A, _x_, K4C, K4D, K4E, K4F, K4G, _x_} \
+}
+
+#define LAYOUT_wkl_2_right_mods( \
+ K00, K01, K02, K03, K04, K05, K06, 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, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, K2E, K2F, K2G, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, \
+ K40, K42, K46, K49, K4A, K4C, K4D, K4E, K4F, K4G \
+){ \
+{ K00, K01, K02, K03, K04, K05, K06, 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, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, _x_, K2D, K2E, K2F, K2G, _x_ }, \
+{ K30, _x_, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H }, \
+{ K40, _x_, K42, _x_, _x_, _x_, K46, _x_, _x_, K49, K4A, _x_, K4C, K4D, K4E, K4F, K4G, _x_} \
+}
+
+#define LAYOUT_wkl_3_right_mods( \
+ K00, K01, K02, K03, K04, K05, K06, 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, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, K2E, K2F, K2G, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H, \
+ K40, K42, K46, K49, K4A, K4B, K4C, K4D, K4E, K4F, K4G \
+){ \
+{ K00, K01, K02, K03, K04, K05, K06, 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, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, _x_, K2D, K2E, K2F, K2G, _x_ }, \
+{ K30, _x_, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F, K3G, K3H }, \
+{ K40, _x_, K42, _x_, _x_, _x_, K46, _x_, _x_, K49, K4A, K4B, K4C, K4D, K4E, K4F, K4G, _x_} \
+}
diff --git a/keyboards/ericrlau/numdiscipline/rev1/rules.mk b/keyboards/ericrlau/numdiscipline/rev1/rules.mk
new file mode 100644
index 0000000000..5a54d41239
--- /dev/null
+++ b/keyboards/ericrlau/numdiscipline/rev1/rules.mk
@@ -0,0 +1,36 @@
+# MCU name
+MCU = atmega32a
+
+# Processor frequency
+F_CPU = 16000000
+
+# 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
+
+# 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 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
diff --git a/keyboards/eve/meteor/rules.mk b/keyboards/eve/meteor/rules.mk
index a0ffab2901..93bb0a56eb 100644
--- a/keyboards/eve/meteor/rules.mk
+++ b/keyboards/eve/meteor/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = no
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/exclusive/e6v2/le_bmc/info.json b/keyboards/exclusive/e6v2/le_bmc/info.json
index aa6d171ba8..413db8abca 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/rules.mk b/keyboards/exclusive/e6v2/le_bmc/rules.mk
index 9fe162b893..a5e8b449ee 100644
--- a/keyboards/exclusive/e6v2/le_bmc/rules.mk
+++ b/keyboards/exclusive/e6v2/le_bmc/rules.mk
@@ -32,5 +32,3 @@ 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
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/exclusive/e6v2/oe_bmc/info.json b/keyboards/exclusive/e6v2/oe_bmc/info.json
index aa6d171ba8..413db8abca 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/rules.mk b/keyboards/exclusive/e6v2/oe_bmc/rules.mk
index 9fe162b893..a5e8b449ee 100644
--- a/keyboards/exclusive/e6v2/oe_bmc/rules.mk
+++ b/keyboards/exclusive/e6v2/oe_bmc/rules.mk
@@ -32,5 +32,3 @@ 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
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/exclusive/e7v1/config.h b/keyboards/exclusive/e7v1/config.h
index 689d7e8621..c8f1501250 100644
--- a/keyboards/exclusive/e7v1/config.h
+++ b/keyboards/exclusive/e7v1/config.h
@@ -3,8 +3,8 @@
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x7050
+#define VENDOR_ID 0x4558 // EX
+#define PRODUCT_ID 0xE701 // E7-V1
#define DEVICE_VER 0x0001
#define MANUFACTURER Exclusive / E-Team
#define PRODUCT E7-V1
diff --git a/keyboards/exclusive/e7v1/keymaps/via/keymap.c b/keyboards/exclusive/e7v1/keymaps/via/keymap.c
new file mode 100644
index 0000000000..2f2f9dcc4a
--- /dev/null
+++ b/keyboards/exclusive/e7v1/keymaps/via/keymap.c
@@ -0,0 +1,51 @@
+#include QMK_KEYBOARD_H
+
+/*
+ * ,---------------------------------------------------------------------|
+ * |Esc|â–“|F1 |F2 |F3 |F4 |â–“|F5 |F6 |F7 |F8 |â–“|F9 |F10|F11|F12|â–“|Ins|â–“|Del|
+ * |---------------------------------------------------------------------|
+ * |` |1 |2 |3 |4 |5 |6 |7 |8 |9 |0 |- |= |Backspace|â–“PgU |
+ * |---------------------------------------------------------------------|
+ * |Tab |Q |W |E |R |T |Y |U |I |O |P |[ | ] | \ |â–“PgDn|
+ * |---------------------------------------------------------------------|
+ * |Caps |A |S |D |F |G |H |J |K |L |; |' | Enter |â–“â–“â–“â–“â–“â–“â–“|
+ * |---------------------------------------------------------------------|
+ * |Shft |Z |X |C |V |B |N |M |, |. |/ |Shift |â–“| Up |â–“â–“|
+ * |---------------------------------------------------------------------|
+ * |Ctrl|GUI |Alt | Space |Alt |Fn |â–“|Lt |Dn |Rt |
+ * `---------------------------------------------------------------------|'
+ */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = 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_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_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_N, KC_M, KC_COMM, KC_DOT,KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [1] = LAYOUT_75_ansi(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ BL_TOGG, BL_DEC, BL_INC, KC_LGUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_VAI,
+ _______, _______, _______, _______, _______, MO(1), RGB_MOD, RGB_VAD, RGB_HUD),
+
+ [2] = LAYOUT_75_ansi(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______),
+
+ [3] = LAYOUT_75_ansi(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______),
+};
diff --git a/keyboards/exclusive/e7v1/keymaps/via/rules.mk b/keyboards/exclusive/e7v1/keymaps/via/rules.mk
new file mode 100644
index 0000000000..36b7ba9cbc
--- /dev/null
+++ b/keyboards/exclusive/e7v1/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/exclusive/e7v1/readme.md b/keyboards/exclusive/e7v1/readme.md
index 9d1b8538b4..6912f37970 100644
--- a/keyboards/exclusive/e7v1/readme.md
+++ b/keyboards/exclusive/e7v1/readme.md
@@ -4,9 +4,9 @@
A 75% keyboard made by Exclusive and run in a Geekhack group buy.
-Keyboard Maintainer: [masterzen](https://github.com/masterzen)
-Hardware Supported: E7 - V1 QMK PCB LED
-Hardware Availability: [https://geekhack.org/index.php?topic=97182.msg2654226#msg2654226](https://geekhack.org/index.php?topic=97182.msg2654226#msg2654226)
+* Keyboard Maintainer: [masterzen](https://github.com/masterzen)
+* Hardware Supported: E7-V1 QMK PCB
+* Hardware Availability: [GeekHack Group Buy in 2018](https://geekhack.org/index.php?topic=97182.msg2654226#msg2654226)
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/exent/rules.mk b/keyboards/exent/rules.mk
index 4f41257326..0bafc86814 100644
--- a/keyboards/exent/rules.mk
+++ b/keyboards/exent/rules.mk
@@ -21,6 +21,4 @@ BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-OPT_DEFS = -DDEBUG_LEVEL=0
-
LAYOUTS = 65_ansi 65_iso
diff --git a/keyboards/facew/rules.mk b/keyboards/facew/rules.mk
index 81cfb758c0..72ccebf874 100644
--- a/keyboards/facew/rules.mk
+++ b/keyboards/facew/rules.mk
@@ -21,6 +21,4 @@ BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-OPT_DEFS = -DDEBUG_LEVEL=0
-
LAYOUTS = 60_ansi
diff --git a/keyboards/flx/lodestone/info.json b/keyboards/flx/lodestone/info.json
index f52249126d..4d32bf37ca 100644
--- a/keyboards/flx/lodestone/info.json
+++ b/keyboards/flx/lodestone/info.json
@@ -68,7 +68,7 @@
{"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.225},
+ {"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},
@@ -139,7 +139,7 @@
{"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.225},
+ {"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},
@@ -211,7 +211,7 @@
{"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.225},
+ {"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},
@@ -283,7 +283,7 @@
{"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.225},
+ {"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},
@@ -356,7 +356,7 @@
{"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.225},
+ {"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},
diff --git a/keyboards/foxlab/key65/hotswap/config.h b/keyboards/foxlab/key65/hotswap/config.h
new file mode 100644
index 0000000000..b6551f5a86
--- /dev/null
+++ b/keyboards/foxlab/key65/hotswap/config.h
@@ -0,0 +1,172 @@
+/* Copyright 2020 Jumail Mundekkat / MxBlue
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x464C // "FL"
+#define PRODUCT_ID 0x0003
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Fox Lab
+#define PRODUCT Key 65 Hotswap
+#define DESCRIPTION Key 65 Hotswap
+
+/* 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 { D2, D1, D0, D3, B3 }
+#define MATRIX_COL_PINS { F5, F4, F1, F0, B0, F6, F7, C7, C6, B6, B5, B4, D7, D6, D4 }
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+#define BACKLIGHT_PIN B7
+// #define BACKLIGHT_BREATHING
+#define BACKLIGHT_LEVELS 5
+
+#define RGB_DI_PIN E2
+#ifdef RGB_DI_PIN
+ #define RGBLED_NUM 8
+ #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 */
+ #define RGBLIGHT_ANIMATIONS
+#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
diff --git a/keyboards/foxlab/key65/hotswap/hotswap.c b/keyboards/foxlab/key65/hotswap/hotswap.c
new file mode 100644
index 0000000000..6b3950d361
--- /dev/null
+++ b/keyboards/foxlab/key65/hotswap/hotswap.c
@@ -0,0 +1,34 @@
+/* Copyright 2020 Jumail Mundekkat / MxBlue
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "hotswap.h"
+
+void keyboard_pre_init_kb(void) {
+ led_init_ports();
+ keyboard_pre_init_user();
+}
+
+void led_init_ports(void) {
+ setPinOutput(E6);
+ writePinHigh(E6);
+}
+
+bool led_update_kb(led_t led_state) {
+ if (led_update_user(led_state)) {
+ writePin(E6, !led_state.caps_lock);
+ }
+ return true;
+}
diff --git a/keyboards/foxlab/key65/hotswap/hotswap.h b/keyboards/foxlab/key65/hotswap/hotswap.h
new file mode 100644
index 0000000000..878a61bcef
--- /dev/null
+++ b/keyboards/foxlab/key65/hotswap/hotswap.h
@@ -0,0 +1,33 @@
+/* Copyright 2020 Jumail Mundekkat / MxBlue
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ 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, K2E, \
+ K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \
+ K40, K41, K42, K47, 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, K2C, KC_NO, 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, KC_NO, K47, KC_NO, KC_NO, KC_NO, K4B, K4C, K4D, K4E }, \
+}
diff --git a/keyboards/foxlab/key65/hotswap/info.json b/keyboards/foxlab/key65/hotswap/info.json
new file mode 100644
index 0000000000..99e5615dfe
--- /dev/null
+++ b/keyboards/foxlab/key65/hotswap/info.json
@@ -0,0 +1,80 @@
+{
+ "keyboard_name": "Key 65 Hotswap",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 15,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 66,
+ "layout": [
+ {"label":"K00 (D2,F5)", "x":0, "y":0},
+ {"label":"K01 (D2,F4)", "x":1, "y":0},
+ {"label":"K02 (D2,F1)", "x":2, "y":0},
+ {"label":"K03 (D2,F0)", "x":3, "y":0},
+ {"label":"K04 (D2,B0)", "x":4, "y":0},
+ {"label":"K05 (D2,F6)", "x":5, "y":0},
+ {"label":"K06 (D2,F7)", "x":6, "y":0},
+ {"label":"K07 (D2,C7)", "x":7, "y":0},
+ {"label":"K08 (D2,C6)", "x":8, "y":0},
+ {"label":"K09 (D2,B6)", "x":9, "y":0},
+ {"label":"K0A (D2,B5)", "x":10, "y":0},
+ {"label":"K0B (D2,B4)", "x":11, "y":0},
+ {"label":"K0C (D2,D7)", "x":12, "y":0},
+ {"label":"K0D (D2,D6)", "x":13, "y":0, "w":2},
+ {"label":"K0E (D2,D4)", "x":15, "y":0},
+ {"label":"K10 (D1,F5)", "x":0, "y":1, "w":1.5},
+ {"label":"K11 (D1,F4)", "x":1.5, "y":1},
+ {"label":"K12 (D1,F1)", "x":2.5, "y":1},
+ {"label":"K13 (D1,F0)", "x":3.5, "y":1},
+ {"label":"K14 (D1,B0)", "x":4.5, "y":1},
+ {"label":"K15 (D1,F6)", "x":5.5, "y":1},
+ {"label":"K16 (D1,F7)", "x":6.5, "y":1},
+ {"label":"K17 (D1,C7)", "x":7.5, "y":1},
+ {"label":"K18 (D1,C6)", "x":8.5, "y":1},
+ {"label":"K19 (D1,B6)", "x":9.5, "y":1},
+ {"label":"K1A (D1,B5)", "x":10.5, "y":1},
+ {"label":"K1B (D1,B4)", "x":11.5, "y":1},
+ {"label":"K1C (D1,D7)", "x":12.5, "y":1},
+ {"label":"K1D (D1,D6)", "x":13.5, "y":1, "w":1.5},
+ {"label":"K1E (D1,D4)", "x":15, "y":1},
+ {"label":"K20 (D0,F5)", "x":0, "y":2, "w":1.75},
+ {"label":"K21 (D0,F4)", "x":1.75, "y":2},
+ {"label":"K22 (D0,F1)", "x":2.75, "y":2},
+ {"label":"K23 (D0,F0)", "x":3.75, "y":2},
+ {"label":"K24 (D0,B0)", "x":4.75, "y":2},
+ {"label":"K25 (D0,F6)", "x":5.75, "y":2},
+ {"label":"K26 (D0,F7)", "x":6.75, "y":2},
+ {"label":"K27 (D0,C7)", "x":7.75, "y":2},
+ {"label":"K28 (D0,C6)", "x":8.75, "y":2},
+ {"label":"K29 (D0,B6)", "x":9.75, "y":2},
+ {"label":"K2A (D0,B5)", "x":10.75, "y":2},
+ {"label":"K2B (D0,B4)", "x":11.75, "y":2},
+ {"label":"K2C (D0,D7)", "x":12.75, "y":2, "w":2.25},
+ {"label":"K2E (D0,D4)", "x":15, "y":2},
+ {"label":"K30 (D3,F5)", "x":0, "y":3, "w":2.25},
+ {"label":"K32 (D3,F1)", "x":2.25, "y":3},
+ {"label":"K33 (D3,F0)", "x":3.25, "y":3},
+ {"label":"K34 (D3,B0)", "x":4.25, "y":3},
+ {"label":"K35 (D3,F6)", "x":5.25, "y":3},
+ {"label":"K36 (D3,F7)", "x":6.25, "y":3},
+ {"label":"K37 (D3,C7)", "x":7.25, "y":3},
+ {"label":"K38 (D3,C6)", "x":8.25, "y":3},
+ {"label":"K39 (D3,B6)", "x":9.25, "y":3},
+ {"label":"K3A (D3,B5)", "x":10.25, "y":3},
+ {"label":"K3B (D3,B4)", "x":11.25, "y":3},
+ {"label":"K3C (D3,D7)", "x":12.25, "y":3, "w":1.75},
+ {"label":"K3D (D3,D6)", "x":14, "y":3},
+ {"label":"K3E (D3,D4)", "x":15, "y":3},
+ {"label":"K40 (B3,F5)", "x":0, "y":4, "w":1.5},
+ {"label":"K41 (B3,F4)", "x":1.5, "y":4},
+ {"label":"K42 (B3,F1)", "x":2.5, "y":4, "w":1.5},
+ {"label":"K47 (B3,C7)", "x":4, "y":4, "w":7},
+ {"label":"K4B (B3,B4)", "x":11, "y":4, "w":1.5},
+ {"label":"K4C (B3,D7)", "x":13, "y":4},
+ {"label":"K4D (B3,D6)", "x":14, "y":4},
+ {"label":"K4E (B3,D4)", "x":15, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/foxlab/key65/hotswap/keymaps/default/keymap.c b/keyboards/foxlab/key65/hotswap/keymaps/default/keymap.c
new file mode 100644
index 0000000000..956b7ac2ee
--- /dev/null
+++ b/keyboards/foxlab/key65/hotswap/keymaps/default/keymap.c
@@ -0,0 +1,36 @@
+/* Copyright 2020 Jumail Mundekkat / MxBlue
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#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_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_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(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [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, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, BL_TOGG, BL_DEC, BL_INC, BL_STEP, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+};
+
diff --git a/keyboards/foxlab/key65/hotswap/keymaps/via/keymap.c b/keyboards/foxlab/key65/hotswap/keymaps/via/keymap.c
new file mode 100644
index 0000000000..9bc43b766e
--- /dev/null
+++ b/keyboards/foxlab/key65/hotswap/keymaps/via/keymap.c
@@ -0,0 +1,48 @@
+/* Copyright 2020 Jumail Mundekkat / MxBlue
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#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_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_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(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [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, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, BL_TOGG, BL_DEC, BL_INC, BL_STEP, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+ [2] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+ [3] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+};
diff --git a/keyboards/foxlab/key65/hotswap/keymaps/via/rules.mk b/keyboards/foxlab/key65/hotswap/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/foxlab/key65/hotswap/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/foxlab/key65/hotswap/readme.md b/keyboards/foxlab/key65/hotswap/readme.md
new file mode 100644
index 0000000000..61a6b6d924
--- /dev/null
+++ b/keyboards/foxlab/key65/hotswap/readme.md
@@ -0,0 +1,18 @@
+# Foxlab Key 65 Hotswap
+
+![Key 65](https://i.imgur.com/28Qck8ul.jpg)
+
+Key 65 is featured with the three-layer case and dual-gasket structure. The plate mounting system is an improved version of the gasket sandwich on Leaf 60. In addition, we add gaskets between the middle case and the bottom case. There's an optional rubber sheet between the PCB and the plate. The numerous options will offer you the most freedom to make the keyboard look and feel as you wish.
+
+* Keyboard Maintainer: QMK
+* Hardware Supported: Key 65 Hotswap PCB
+* Hardware Availability: [Group Buy](https://geekhack.org/index.php?topic=102609.0)
+
+This version is for the hotswap variant with the fixed layout below:
+![Layout](https://i.imgur.com/NDqjqJml.png)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make foxlab/key65/hotswap: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/foxlab/key65/hotswap/rules.mk b/keyboards/foxlab/key65/hotswap/rules.mk
new file mode 100644
index 0000000000..15ccf06490
--- /dev/null
+++ b/keyboards/foxlab/key65/hotswap/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 = atmel-dfu
+
+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
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+AUDIO_ENABLE = no # Audio output
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
diff --git a/keyboards/foxlab/key65/universal/config.h b/keyboards/foxlab/key65/universal/config.h
new file mode 100644
index 0000000000..10efc25d1a
--- /dev/null
+++ b/keyboards/foxlab/key65/universal/config.h
@@ -0,0 +1,172 @@
+/* Copyright 2020 Jumail Mundekkat / MxBlue
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x464C // "FL"
+#define PRODUCT_ID 0x0004
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Fox Lab
+#define PRODUCT Key 65 Universal
+#define DESCRIPTION Key 65 Universal
+
+/* 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 { D0, D1, F0, F4, F1 }
+#define MATRIX_COL_PINS { B1, F5, F6, F7, C7, C6, B6, B5, B4, D7, D6, D4, D5, D3, D2, B0 }
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+#define BACKLIGHT_PIN B7
+// #define BACKLIGHT_BREATHING
+#define BACKLIGHT_LEVELS 5
+
+#define RGB_DI_PIN E2
+#ifdef RGB_DI_PIN
+ #define RGBLED_NUM 6
+ #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 */
+ #define RGBLIGHT_ANIMATIONS
+#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
diff --git a/keyboards/foxlab/key65/universal/info.json b/keyboards/foxlab/key65/universal/info.json
new file mode 100644
index 0000000000..ce95ecd8cc
--- /dev/null
+++ b/keyboards/foxlab/key65/universal/info.json
@@ -0,0 +1,306 @@
+{
+ "keyboard_name": "Key 65 Universal",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 16,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_65_ansi_blocker_split_bs": {
+ "key_count": 68,
+ "layout": [
+ {"label":"K00 (D0,B1)", "x":0, "y":0},
+ {"label":"K01 (D0,F5)", "x":1, "y":0},
+ {"label":"K02 (D0,F6)", "x":2, "y":0},
+ {"label":"K03 (D0,F7)", "x":3, "y":0},
+ {"label":"K04 (D0,C7)", "x":4, "y":0},
+ {"label":"K05 (D0,C6)", "x":5, "y":0},
+ {"label":"K06 (D0,B6)", "x":6, "y":0},
+ {"label":"K07 (D0,B5)", "x":7, "y":0},
+ {"label":"K08 (D0,B4)", "x":8, "y":0},
+ {"label":"K09 (D0,D7)", "x":9, "y":0},
+ {"label":"K0A (D0,D6)", "x":10, "y":0},
+ {"label":"K0B (D0,D4)", "x":11, "y":0},
+ {"label":"K0C (D0,D5)", "x":12, "y":0},
+ {"label":"K0D (D0,D3)", "x":13, "y":0},
+ {"label":"K0E (D0,D2)", "x":14, "y":0},
+ {"label":"K0F (D0,B0)", "x":15, "y":0},
+ {"label":"K10 (D1,B1)", "x":0, "y":1, "w":1.5},
+ {"label":"K11 (D1,F5)", "x":1.5, "y":1},
+ {"label":"K12 (D1,F6)", "x":2.5, "y":1},
+ {"label":"K13 (D1,F7)", "x":3.5, "y":1},
+ {"label":"K14 (D1,C7)", "x":4.5, "y":1},
+ {"label":"K15 (D1,C6)", "x":5.5, "y":1},
+ {"label":"K16 (D1,B6)", "x":6.5, "y":1},
+ {"label":"K17 (D1,B5)", "x":7.5, "y":1},
+ {"label":"K18 (D1,B4)", "x":8.5, "y":1},
+ {"label":"K19 (D1,D7)", "x":9.5, "y":1},
+ {"label":"K1A (D1,D6)", "x":10.5, "y":1},
+ {"label":"K1B (D1,D4)", "x":11.5, "y":1},
+ {"label":"K1C (D1,D5)", "x":12.5, "y":1},
+ {"label":"K1D (D1,D3)", "x":13.5, "y":1, "w":1.5},
+ {"label":"K1F (D1,B0)", "x":15, "y":1},
+ {"label":"K20 (F0,B1)", "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,F7)", "x":3.75, "y":2},
+ {"label":"K24 (F0,C7)", "x":4.75, "y":2},
+ {"label":"K25 (F0,C6)", "x":5.75, "y":2},
+ {"label":"K26 (F0,B6)", "x":6.75, "y":2},
+ {"label":"K27 (F0,B5)", "x":7.75, "y":2},
+ {"label":"K28 (F0,B4)", "x":8.75, "y":2},
+ {"label":"K29 (F0,D7)", "x":9.75, "y":2},
+ {"label":"K2A (F0,D6)", "x":10.75, "y":2},
+ {"label":"K2B (F0,D4)", "x":11.75, "y":2},
+ {"label":"K2D (F0,D3)", "x":12.75, "y":2, "w":2.25},
+ {"label":"K2F (F0,B0)", "x":15, "y":2},
+ {"label":"K30 (F4,B1)", "x":0, "y":3, "w":2.25},
+ {"label":"K32 (F4,F6)", "x":2.25, "y":3},
+ {"label":"K33 (F4,F7)", "x":3.25, "y":3},
+ {"label":"K34 (F4,C7)", "x":4.25, "y":3},
+ {"label":"K35 (F4,C6)", "x":5.25, "y":3},
+ {"label":"K36 (F4,B6)", "x":6.25, "y":3},
+ {"label":"K37 (F4,B5)", "x":7.25, "y":3},
+ {"label":"K38 (F4,B4)", "x":8.25, "y":3},
+ {"label":"K39 (F4,D7)", "x":9.25, "y":3},
+ {"label":"K3A (F4,D6)", "x":10.25, "y":3},
+ {"label":"K3B (F4,D4)", "x":11.25, "y":3},
+ {"label":"K3C (F4,D5)", "x":12.25, "y":3, "w":1.75},
+ {"label":"K3D (F4,D3)", "x":14, "y":3},
+ {"label":"K3F (F4,B0)", "x":15, "y":3},
+ {"label":"K40 (F1,B1)", "x":0, "y":4, "w":1.25},
+ {"label":"K41 (F1,F5)", "x":1.25, "y":4, "w":1.25},
+ {"label":"K42 (F1,F6)", "x":2.5, "y":4, "w":1.25},
+ {"label":"K46 (F1,B6)", "x":3.75, "y":4, "w":6.25},
+ {"label":"K4A (F1,D6)", "x":10, "y":4, "w":1.25},
+ {"label":"K4B (F1,D4)", "x":11.25, "y":4, "w":1.25},
+ {"label":"K4C (F1,D5)", "x":13, "y":4},
+ {"label":"K4D (F1,D3)", "x":14, "y":4},
+ {"label":"K4F (F1,B0)", "x":15, "y":4}
+ ]
+ },
+ "LAYOUT_65_ansi_blocker_tsangan_split_bs": {
+ "key_count": 67,
+ "layout": [
+ {"label":"K00 (D0,B1)", "x":0, "y":0},
+ {"label":"K01 (D0,F5)", "x":1, "y":0},
+ {"label":"K02 (D0,F6)", "x":2, "y":0},
+ {"label":"K03 (D0,F7)", "x":3, "y":0},
+ {"label":"K04 (D0,C7)", "x":4, "y":0},
+ {"label":"K05 (D0,C6)", "x":5, "y":0},
+ {"label":"K06 (D0,B6)", "x":6, "y":0},
+ {"label":"K07 (D0,B5)", "x":7, "y":0},
+ {"label":"K08 (D0,B4)", "x":8, "y":0},
+ {"label":"K09 (D0,D7)", "x":9, "y":0},
+ {"label":"K0A (D0,D6)", "x":10, "y":0},
+ {"label":"K0B (D0,D4)", "x":11, "y":0},
+ {"label":"K0C (D0,D5)", "x":12, "y":0},
+ {"label":"K0D (D0,D3)", "x":13, "y":0},
+ {"label":"K0E (D0,D2)", "x":14, "y":0},
+ {"label":"K0F (D0,B0)", "x":15, "y":0},
+ {"label":"K10 (D1,B1)", "x":0, "y":1, "w":1.5},
+ {"label":"K11 (D1,F5)", "x":1.5, "y":1},
+ {"label":"K12 (D1,F6)", "x":2.5, "y":1},
+ {"label":"K13 (D1,F7)", "x":3.5, "y":1},
+ {"label":"K14 (D1,C7)", "x":4.5, "y":1},
+ {"label":"K15 (D1,C6)", "x":5.5, "y":1},
+ {"label":"K16 (D1,B6)", "x":6.5, "y":1},
+ {"label":"K17 (D1,B5)", "x":7.5, "y":1},
+ {"label":"K18 (D1,B4)", "x":8.5, "y":1},
+ {"label":"K19 (D1,D7)", "x":9.5, "y":1},
+ {"label":"K1A (D1,D6)", "x":10.5, "y":1},
+ {"label":"K1B (D1,D4)", "x":11.5, "y":1},
+ {"label":"K1C (D1,D5)", "x":12.5, "y":1},
+ {"label":"K1D (D1,D3)", "x":13.5, "y":1, "w":1.5},
+ {"label":"K1F (D1,B0)", "x":15, "y":1},
+ {"label":"K20 (F0,B1)", "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,F7)", "x":3.75, "y":2},
+ {"label":"K24 (F0,C7)", "x":4.75, "y":2},
+ {"label":"K25 (F0,C6)", "x":5.75, "y":2},
+ {"label":"K26 (F0,B6)", "x":6.75, "y":2},
+ {"label":"K27 (F0,B5)", "x":7.75, "y":2},
+ {"label":"K28 (F0,B4)", "x":8.75, "y":2},
+ {"label":"K29 (F0,D7)", "x":9.75, "y":2},
+ {"label":"K2A (F0,D6)", "x":10.75, "y":2},
+ {"label":"K2B (F0,D4)", "x":11.75, "y":2},
+ {"label":"K2D (F0,D3)", "x":12.75, "y":2, "w":2.25},
+ {"label":"K2F (F0,B0)", "x":15, "y":2},
+ {"label":"K30 (F4,B1)", "x":0, "y":3, "w":2.25},
+ {"label":"K32 (F4,F6)", "x":2.25, "y":3},
+ {"label":"K33 (F4,F7)", "x":3.25, "y":3},
+ {"label":"K34 (F4,C7)", "x":4.25, "y":3},
+ {"label":"K35 (F4,C6)", "x":5.25, "y":3},
+ {"label":"K36 (F4,B6)", "x":6.25, "y":3},
+ {"label":"K37 (F4,B5)", "x":7.25, "y":3},
+ {"label":"K38 (F4,B4)", "x":8.25, "y":3},
+ {"label":"K39 (F4,D7)", "x":9.25, "y":3},
+ {"label":"K3A (F4,D6)", "x":10.25, "y":3},
+ {"label":"K3B (F4,D4)", "x":11.25, "y":3},
+ {"label":"K3C (F4,D5)", "x":12.25, "y":3, "w":1.75},
+ {"label":"K3D (F4,D3)", "x":14, "y":3},
+ {"label":"K3F (F4,B0)", "x":15, "y":3},
+ {"label":"K40 (F1,B1)", "x":0, "y":4, "w":1.5},
+ {"label":"K41 (F1,F5)", "x":1.5, "y":4},
+ {"label":"K42 (F1,F6)", "x":2.5, "y":4, "w":1.5},
+ {"label":"K46 (F1,B6)", "x":4, "y":4, "w":7},
+ {"label":"K4A (F1,D6)", "x":11, "y":4, "w":1.5},
+ {"label":"K4C (F1,D5)", "x":13, "y":4},
+ {"label":"K4D (F1,D3)", "x":14, "y":4},
+ {"label":"K4F (F1,B0)", "x":15, "y":4}
+ ]
+ },
+ "LAYOUT_iso_all": {
+ "key_count": 71,
+ "layout": [
+ {"label":"K00 (D0,B1)", "x":0, "y":0},
+ {"label":"K01 (D0,F5)", "x":1, "y":0},
+ {"label":"K02 (D0,F6)", "x":2, "y":0},
+ {"label":"K03 (D0,F7)", "x":3, "y":0},
+ {"label":"K04 (D0,C7)", "x":4, "y":0},
+ {"label":"K05 (D0,C6)", "x":5, "y":0},
+ {"label":"K06 (D0,B6)", "x":6, "y":0},
+ {"label":"K07 (D0,B5)", "x":7, "y":0},
+ {"label":"K08 (D0,B4)", "x":8, "y":0},
+ {"label":"K09 (D0,D7)", "x":9, "y":0},
+ {"label":"K0A (D0,D6)", "x":10, "y":0},
+ {"label":"K0B (D0,D4)", "x":11, "y":0},
+ {"label":"K0C (D0,D5)", "x":12, "y":0},
+ {"label":"K0D (D0,D3)", "x":13, "y":0},
+ {"label":"K0E (D0,D2)", "x":14, "y":0},
+ {"label":"K0F (D0,B0)", "x":15, "y":0},
+ {"label":"K10 (D1,B1)", "x":0, "y":1, "w":1.5},
+ {"label":"K11 (D1,F5)", "x":1.5, "y":1},
+ {"label":"K12 (D1,F6)", "x":2.5, "y":1},
+ {"label":"K13 (D1,F7)", "x":3.5, "y":1},
+ {"label":"K14 (D1,C7)", "x":4.5, "y":1},
+ {"label":"K15 (D1,C6)", "x":5.5, "y":1},
+ {"label":"K16 (D1,B6)", "x":6.5, "y":1},
+ {"label":"K17 (D1,B5)", "x":7.5, "y":1},
+ {"label":"K18 (D1,B4)", "x":8.5, "y":1},
+ {"label":"K19 (D1,D7)", "x":9.5, "y":1},
+ {"label":"K1A (D1,D6)", "x":10.5, "y":1},
+ {"label":"K1B (D1,D4)", "x":11.5, "y":1},
+ {"label":"K1C (D1,D5)", "x":12.5, "y":1},
+ {"label":"K1F (D1,B0)", "x":15, "y":1},
+ {"label":"K20 (F0,B1)", "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,F7)", "x":3.75, "y":2},
+ {"label":"K24 (F0,C7)", "x":4.75, "y":2},
+ {"label":"K25 (F0,C6)", "x":5.75, "y":2},
+ {"label":"K26 (F0,B6)", "x":6.75, "y":2},
+ {"label":"K27 (F0,B5)", "x":7.75, "y":2},
+ {"label":"K28 (F0,B4)", "x":8.75, "y":2},
+ {"label":"K29 (F0,D7)", "x":9.75, "y":2},
+ {"label":"K2A (F0,D6)", "x":10.75, "y":2},
+ {"label":"K2B (F0,D4)", "x":11.75, "y":2},
+ {"label":"K1D (D1,D3)", "x":12.75, "y":2},
+ {"label":"K2D (F0,D3)", "x":13.75, "y":1, "w":1.25, "h":2},
+ {"label":"K2F (F0,B0)", "x":15, "y":2},
+ {"label":"K30 (F4,B1)", "x":0, "y":3, "w":1.25},
+ {"label":"K31 (F4,F5)", "x":1.25, "y":3},
+ {"label":"K32 (F4,F6)", "x":2.25, "y":3},
+ {"label":"K33 (F4,F7)", "x":3.25, "y":3},
+ {"label":"K34 (F4,C7)", "x":4.25, "y":3},
+ {"label":"K35 (F4,C6)", "x":5.25, "y":3},
+ {"label":"K36 (F4,B6)", "x":6.25, "y":3},
+ {"label":"K37 (F4,B5)", "x":7.25, "y":3},
+ {"label":"K38 (F4,B4)", "x":8.25, "y":3},
+ {"label":"K39 (F4,D7)", "x":9.25, "y":3},
+ {"label":"K3A (F4,D6)", "x":10.25, "y":3},
+ {"label":"K3B (F4,D4)", "x":11.25, "y":3},
+ {"label":"K3C (F4,D5)", "x":12.25, "y":3, "w":1.75},
+ {"label":"K3D (F4,D3)", "x":14, "y":3},
+ {"label":"K3F (F4,B0)", "x":15, "y":3},
+ {"label":"K40 (F1,B1)", "x":0, "y":4, "w":1.25},
+ {"label":"K41 (F1,F5)", "x":1.25, "y":4, "w":1.25},
+ {"label":"K42 (F1,F6)", "x":2.5, "y":4, "w":1.25},
+ {"label":"K44 (F1,C7)", "x":3.75, "y":4, "w":2.25},
+ {"label":"K46 (F1,B6)", "x":6, "y":4, "w":1.25},
+ {"label":"K48 (F1,B4)", "x":7.25, "y":4, "w":2.75},
+ {"label":"K4A (F1,D6)", "x":10, "y":4, "w":1.25},
+ {"label":"K4B (F1,D4)", "x":11.25, "y":4, "w":1.25},
+ {"label":"K4C (F1,D5)", "x":13, "y":4},
+ {"label":"K4D (F1,D3)", "x":14, "y":4},
+ {"label":"K4F (F1,B0)", "x":15, "y":4}
+ ]
+ },
+ "LAYOUT_all": {
+ "key_count": 71,
+ "layout": [
+ {"label":"K00 (D0,B1)", "x":0, "y":0},
+ {"label":"K01 (D0,F5)", "x":1, "y":0},
+ {"label":"K02 (D0,F6)", "x":2, "y":0},
+ {"label":"K03 (D0,F7)", "x":3, "y":0},
+ {"label":"K04 (D0,C7)", "x":4, "y":0},
+ {"label":"K05 (D0,C6)", "x":5, "y":0},
+ {"label":"K06 (D0,B6)", "x":6, "y":0},
+ {"label":"K07 (D0,B5)", "x":7, "y":0},
+ {"label":"K08 (D0,B4)", "x":8, "y":0},
+ {"label":"K09 (D0,D7)", "x":9, "y":0},
+ {"label":"K0A (D0,D6)", "x":10, "y":0},
+ {"label":"K0B (D0,D4)", "x":11, "y":0},
+ {"label":"K0C (D0,D5)", "x":12, "y":0},
+ {"label":"K0D (D0,D3)", "x":13, "y":0},
+ {"label":"K0E (D0,D2)", "x":14, "y":0},
+ {"label":"K0F (D0,B0)", "x":15, "y":0},
+ {"label":"K10 (D1,B1)", "x":0, "y":1, "w":1.5},
+ {"label":"K11 (D1,F5)", "x":1.5, "y":1},
+ {"label":"K12 (D1,F6)", "x":2.5, "y":1},
+ {"label":"K13 (D1,F7)", "x":3.5, "y":1},
+ {"label":"K14 (D1,C7)", "x":4.5, "y":1},
+ {"label":"K15 (D1,C6)", "x":5.5, "y":1},
+ {"label":"K16 (D1,B6)", "x":6.5, "y":1},
+ {"label":"K17 (D1,B5)", "x":7.5, "y":1},
+ {"label":"K18 (D1,B4)", "x":8.5, "y":1},
+ {"label":"K19 (D1,D7)", "x":9.5, "y":1},
+ {"label":"K1A (D1,D6)", "x":10.5, "y":1},
+ {"label":"K1B (D1,D4)", "x":11.5, "y":1},
+ {"label":"K1C (D1,D5)", "x":12.5, "y":1},
+ {"label":"K1D (D1,D3)", "x":13.5, "y":1, "w":1.5},
+ {"label":"K1F (D1,B0)", "x":15, "y":1},
+ {"label":"K20 (F0,B1)", "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,F7)", "x":3.75, "y":2},
+ {"label":"K24 (F0,C7)", "x":4.75, "y":2},
+ {"label":"K25 (F0,C6)", "x":5.75, "y":2},
+ {"label":"K26 (F0,B6)", "x":6.75, "y":2},
+ {"label":"K27 (F0,B5)", "x":7.75, "y":2},
+ {"label":"K28 (F0,B4)", "x":8.75, "y":2},
+ {"label":"K29 (F0,D7)", "x":9.75, "y":2},
+ {"label":"K2A (F0,D6)", "x":10.75, "y":2},
+ {"label":"K2B (F0,D4)", "x":11.75, "y":2},
+ {"label":"K2D (F0,D3)", "x":12.75, "y":2, "w":2.25},
+ {"label":"K2F (F0,B0)", "x":15, "y":2},
+ {"label":"K30 (F4,B1)", "x":0, "y":3, "w":1.25},
+ {"label":"K31 (F4,F5)", "x":1.25, "y":3},
+ {"label":"K32 (F4,F6)", "x":2.25, "y":3},
+ {"label":"K33 (F4,F7)", "x":3.25, "y":3},
+ {"label":"K34 (F4,C7)", "x":4.25, "y":3},
+ {"label":"K35 (F4,C6)", "x":5.25, "y":3},
+ {"label":"K36 (F4,B6)", "x":6.25, "y":3},
+ {"label":"K37 (F4,B5)", "x":7.25, "y":3},
+ {"label":"K38 (F4,B4)", "x":8.25, "y":3},
+ {"label":"K39 (F4,D7)", "x":9.25, "y":3},
+ {"label":"K3A (F4,D6)", "x":10.25, "y":3},
+ {"label":"K3B (F4,D4)", "x":11.25, "y":3},
+ {"label":"K3C (F4,D5)", "x":12.25, "y":3, "w":1.75},
+ {"label":"K3D (F4,D3)", "x":14, "y":3},
+ {"label":"K3F (F4,B0)", "x":15, "y":3},
+ {"label":"K40 (F1,B1)", "x":0, "y":4, "w":1.25},
+ {"label":"K41 (F1,F5)", "x":1.25, "y":4, "w":1.25},
+ {"label":"K42 (F1,F6)", "x":2.5, "y":4, "w":1.25},
+ {"label":"K44 (F1,C7)", "x":3.75, "y":4, "w":2.25},
+ {"label":"K46 (F1,B6)", "x":6, "y":4, "w":1.25},
+ {"label":"K48 (F1,B4)", "x":7.25, "y":4, "w":2.75},
+ {"label":"K4A (F1,D6)", "x":10, "y":4, "w":1.25},
+ {"label":"K4B (F1,D4)", "x":11.25, "y":4, "w":1.25},
+ {"label":"K4C (F1,D5)", "x":13, "y":4},
+ {"label":"K4D (F1,D3)", "x":14, "y":4},
+ {"label":"K4F (F1,B0)", "x":15, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/foxlab/key65/universal/keymaps/default/keymap.c b/keyboards/foxlab/key65/universal/keymaps/default/keymap.c
new file mode 100644
index 0000000000..9c2071f01a
--- /dev/null
+++ b/keyboards/foxlab/key65/universal/keymaps/default/keymap.c
@@ -0,0 +1,36 @@
+/* Copyright 2020 Jumail Mundekkat / MxBlue
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#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_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_SPC, 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, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [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, _______, _______, _______,
+ _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, BL_TOGG, BL_DEC, BL_INC, BL_STEP, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+};
+
diff --git a/keyboards/foxlab/key65/universal/keymaps/via/keymap.c b/keyboards/foxlab/key65/universal/keymaps/via/keymap.c
new file mode 100644
index 0000000000..8d44f2c461
--- /dev/null
+++ b/keyboards/foxlab/key65/universal/keymaps/via/keymap.c
@@ -0,0 +1,48 @@
+/* Copyright 2020 Jumail Mundekkat / MxBlue
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#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_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_SPC, 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, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ [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, _______, _______, _______,
+ _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, BL_TOGG, BL_DEC, BL_INC, BL_STEP, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+ [2] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+ [3] = LAYOUT_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+};
diff --git a/keyboards/foxlab/key65/universal/keymaps/via/rules.mk b/keyboards/foxlab/key65/universal/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/foxlab/key65/universal/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/foxlab/key65/universal/readme.md b/keyboards/foxlab/key65/universal/readme.md
new file mode 100644
index 0000000000..967b9565f2
--- /dev/null
+++ b/keyboards/foxlab/key65/universal/readme.md
@@ -0,0 +1,22 @@
+# Foxlab Key 65 Universal
+
+![Key 65](https://i.imgur.com/28Qck8ul.jpg)
+
+Key 65 is featured with the three-layer case and dual-gasket structure. The plate mounting system is an improved version of the gasket sandwich on Leaf 60. In addition, we add gaskets between the middle case and the bottom case. There's an optional rubber sheet between the PCB and the plate. The numerous options will offer you the most freedom to make the keyboard look and feel as you wish.
+
+* Keyboard Maintainer: QMK
+* Hardware Supported: Key 65 Universal PCB
+* Hardware Availability: [Group Buy](https://geekhack.org/index.php?topic=102609.0)
+
+This version is for the universal variant with the layouts below available:
+![Layout](https://i.imgur.com/MQTZV0ol.png)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make foxlab/key65/universal: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).
+
+## RGB LED support
+
+The universal PCB supports RGB LEDs as an LED strip, but is not supplied with one. To use RGB LEDs, you should configure the RGBLED_NUM to match the number of LEDs on your strip.
diff --git a/keyboards/foxlab/key65/universal/rules.mk b/keyboards/foxlab/key65/universal/rules.mk
new file mode 100644
index 0000000000..24a570cf2d
--- /dev/null
+++ b/keyboards/foxlab/key65/universal/rules.mk
@@ -0,0 +1,29 @@
+# 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 = 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
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+MIDI_ENABLE = no # MIDI support
+AUDIO_ENABLE = no # Audio output
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+
+LAYOUTS = 65_ansi_blocker_split_bs # Support community layouts
diff --git a/keyboards/foxlab/key65/universal/universal.c b/keyboards/foxlab/key65/universal/universal.c
new file mode 100644
index 0000000000..361f3ad7f2
--- /dev/null
+++ b/keyboards/foxlab/key65/universal/universal.c
@@ -0,0 +1,34 @@
+/* Copyright 2020 Jumail Mundekkat / MxBlue
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "universal.h"
+
+void keyboard_pre_init_kb(void) {
+ led_init_ports();
+ keyboard_pre_init_user();
+}
+
+void led_init_ports(void) {
+ setPinOutput(E6);
+ writePinHigh(E6);
+}
+
+bool led_update_kb(led_t led_state) {
+ if (led_update_user(led_state)) {
+ writePin(E6, !led_state.caps_lock);
+ }
+ return true;
+}
diff --git a/keyboards/foxlab/key65/universal/universal.h b/keyboards/foxlab/key65/universal/universal.h
new file mode 100644
index 0000000000..9d92030c81
--- /dev/null
+++ b/keyboards/foxlab/key65/universal/universal.h
@@ -0,0 +1,75 @@
+/* Copyright 2020 Jumail Mundekkat / MxBlue
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+#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, K3D, K3F, \
+ K40, K41, K42, K46, K4A, K4B, K4C, K4D, 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, KC_NO, K1F }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO, K2F }, \
+ { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, KC_NO, K3F }, \
+ { K40, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D, KC_NO, K4F }, \
+}
+
+#define LAYOUT_65_ansi_blocker_tsangan_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, K3D, K3F, \
+ K40, K41, K42, K46, K4B, K4C, K4D, 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, KC_NO, K1F }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO, K2F }, \
+ { K30, KC_NO, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, KC_NO, K3F }, \
+ { K40, K41, K42, KC_NO, KC_NO, KC_NO, K46, KC_NO, KC_NO, KC_NO, KC_NO, K4B, K4C, K4D, KC_NO, K4F }, \
+}
+
+#define LAYOUT_iso_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, K1F, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K1D, K2D, K2F, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3F, \
+ K40, K41, K42, K44, K46, K48, K4A, K4B, K4C, K4D, 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, KC_NO, K1F }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO, K2F }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, KC_NO, K3F }, \
+ { K40, K41, K42, KC_NO, K44, KC_NO, K46, KC_NO, K48, KC_NO, K4A, K4B, K4C, K4D, KC_NO, K4F }, \
+}
+
+#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, K2D, K2F, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3F, \
+ K40, K41, K42, K44, K46, K48, K4A, K4B, K4C, K4D, 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, KC_NO, K1F }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D, KC_NO, K2F }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, KC_NO, K3F }, \
+ { K40, K41, K42, KC_NO, K44, KC_NO, K46, KC_NO, K48, KC_NO, K4A, K4B, K4C, K4D, KC_NO, K4F }, \
+}
diff --git a/keyboards/ft/mars80/rules.mk b/keyboards/ft/mars80/rules.mk
index e3f2c93ce3..2cd6281537 100644
--- a/keyboards/ft/mars80/rules.mk
+++ b/keyboards/ft/mars80/rules.mk
@@ -21,6 +21,4 @@ BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-OPT_DEFS = -DDEBUG_LEVEL=0
-
LAYOUTS = tkl_ansi tkl_iso
diff --git a/keyboards/funky40/keymaps/default/keymap.c b/keyboards/funky40/keymaps/default/keymap.c
index fff5a820bf..7fbdb7f00d 100644
--- a/keyboards/funky40/keymaps/default/keymap.c
+++ b/keyboards/funky40/keymaps/default/keymap.c
@@ -19,14 +19,14 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT(
- 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_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_DOT, KC_DOT, KC_SLSH, KC_SFTENT,
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, LT(1, KC_DEL), KC_SPC, KC_LEFT, KC_UP, 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_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_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_UNDS, KC_PLUS,
- KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F11, KC_F12, KC_LBRC, KC_RBRC,
- RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLU, KC_VOLD, KC_MNXT),
+ 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/gboards/combos/_generator/input.json b/keyboards/gboards/combos/_generator/input.json
new file mode 100644
index 0000000000..022c4690e7
--- /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 0000000000..043c8b78c7
--- /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 0000000000..6f4a8a91e6
--- /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 0000000000..c0aff412e5
--- /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 0000000000..3e2b45db16
--- /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 0000000000..ca4b169c1d
--- /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 0000000000..ae7e15c8be
--- /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 0000000000..5bc62f4bca
--- /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 0000000000..c85c9213e3
--- /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 0000000000..2e8c2b1431
--- /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 0000000000..d7301ac637
--- /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 0000000000..054183678a
--- /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 0000000000..81395368b8
--- /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 0000000000..24e357aa16
--- /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 0000000000..9613ba92b6
--- /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 0000000000..ec03cb5989
--- /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 0000000000..56265a3572
--- /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 0000000000..2869e8f77c
--- /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 0000000000..55ab69fca8
--- /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 0000000000..a326e75806
--- /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 0000000000..63735a422d
--- /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 0000000000..afa22643f9
--- /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 0000000000..0bed185ec5
--- /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 0000000000..7f37672f41
--- /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 0000000000..338d9a62a5
--- /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 0000000000..0d7398dd4a
--- /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 0000000000..48fe42aca1
--- /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 0000000000..6a2229f7a9
--- /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 0000000000..0f738df3eb
--- /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 0000000000..343e8b7cec
--- /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 0000000000..d8d721f1b7
--- /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 0000000000..90eb8a9c68
--- /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 0000000000..9c484d30f4
--- /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 0000000000..88c9d5b2cb
--- /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 0000000000..a6b236fde3
--- /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 0000000000..99edc3df62
--- /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 0000000000..0200f98ce6
--- /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 0000000000..c79bdde121
--- /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 0000000000..19eda5636c
--- /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 0000000000..d1ecbaef08
--- /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 0000000000..2105c72e14
--- /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 0000000000..8bc5e31a04
--- /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 0000000000..1b721ff1d5
--- /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 0000000000..c2cd57c9ce
--- /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 0000000000..93e1053b1f
--- /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 0000000000..e69de29bb2
--- /dev/null
+++ b/keyboards/gboards/engine/config.h
diff --git a/keyboards/gboards/engine/engine.c b/keyboards/gboards/engine/engine.c
new file mode 100644
index 0000000000..9094b7905a
--- /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 0000000000..5b9d5b0ecb
--- /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 <string.h>
+#include <stdint.h>
+#include <stdio.h>
+#include "config_engine.h"
+#include <avr/pgmspace.h>
+#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 0000000000..c8a42a052b
--- /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 0000000000..186f59386d
--- /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 0000000000..821c2c4ad5
--- /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 0000000000..015b48d38f
--- /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 0000000000..547ea09fdd
--- /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 <string.h>
+#include <stdint.h>
+#include <stdio.h>
+#include "config_engine.h"
+#include <avr/pgmspace.h>
+#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 0000000000..674d3356cc
--- /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 0000000000..93a4423340
--- /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 0000000000..186f59386d
--- /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 0000000000..743bacbcc1
--- /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/gergo/keymaps/abstractkb/config.h b/keyboards/gergo/keymaps/abstractkb/config.h
new file mode 100644
index 0000000000..bc7b9f7845
--- /dev/null
+++ b/keyboards/gergo/keymaps/abstractkb/config.h
@@ -0,0 +1,6 @@
+#pragma once
+
+#define IGNORE_MOD_TAP_INTERRUPT
+
+#undef DEBOUNCE
+#define DEBOUNCE 10
diff --git a/keyboards/gergo/keymaps/abstractkb/keymap.c b/keyboards/gergo/keymaps/abstractkb/keymap.c
new file mode 100644
index 0000000000..6ee37f8175
--- /dev/null
+++ b/keyboards/gergo/keymaps/abstractkb/keymap.c
@@ -0,0 +1,128 @@
+/* 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
+
+#define BASE 0 // default layer
+#define SYMB 1 // symbols
+#define NUMB 2 // numbers/motion
+
+// Blank template at the bottom
+
+enum customKeycodes {
+ URL = 1
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/* Keymap 0: Basic layer
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | L1/ESC | Q | W | E | R | T | | Y | U | I | O | P | | \ |
+ * |--------+------+------+------+------+------|------. .------|------+------+------+------+------+--------|
+ * |Ctrl/BS | A | S | D | F | G | RMB | | | H | J | K | L | ; : | ' " |
+ * |--------+------+------+------+------+------|------| |------|------+------+------+------+------+--------|
+ * | LShift | Z | X | C | V | B | LMB | | | N | M | , < | . > | / ? |RShft/-_|
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * .----------. .-------. .------. .-----.
+ * | GUI/Del | |Ent/ALT| | Tab | |GUI |
+ * '----------' '-------' `------. '-----'
+ * ,-------. ,-------.
+ * | MMB | | PgDn |
+ * ,------|-------| |-------|------.
+ * | SYMB | NUMB | | SYMB | NUMB |
+ * | Space| Escape| | Mod |Space |
+ * | | | | | |
+ * `--------------' `--------------'
+ */
+[BASE] = LAYOUT_gergo(
+ LT(NUMB, KC_ESC), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PIPE,
+ MT(MOD_LCTL, KC_BSPC), KC_A, KC_S, KC_D, KC_F, KC_G, KC_BTN2, KC_TRNS, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_BTN1, KC_BTN3, KC_PGDN, KC_BSPC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(MOD_RSFT, KC_MINS),
+ MT(MOD_LGUI, KC_DEL), MT(MOD_LALT, KC_ENT), LT(SYMB, KC_SPC), LT(NUMB, KC_ESC), LT(SYMB, KC_ENT), LT(NUMB, KC_SPC), KC_TAB, KC_LGUI
+ ),
+/* Keymap 1: Symbols layer
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | ! | @ | { | } | | | | | | | | | \ | |
+ * |--------+------+------+------+------+------|------. .------|------+------+------+------+------+--------|
+ * | | # | $ | ( | ) | ` | | | | + | - | / | * | % | ' " |
+ * |--------+------+------+------+------+------|------| |------|------+------+------+------+------+--------|
+ * | | % | ^ | [ | ] | ~ | | | | & | = | , | . | / ? | - _ |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * .------. .------. .------. .-----.
+ * | | | | | | | DEL |
+ * '------' '------' `------. '-----'
+ * ,-------. ,-------.
+ * | | | PgUp |
+ * ,------|-------| |-------|------.
+ * | | | | | |
+ * | ; | = | | = | ; |
+ * | | | | | |
+ * `--------------' `--------------'
+ */
+[SYMB] = LAYOUT_gergo(
+ KC_TRNS, KC_EXLM, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSLS,
+ KC_TRNS, KC_HASH, KC_DLR, KC_LPRN, KC_RPRN, KC_GRV, KC_TRNS, KC_TRNS, KC_PLUS, KC_MINS, KC_SLSH, KC_ASTR, KC_PERC, KC_QUOT,
+ KC_TRNS, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_AMPR, KC_EQL, KC_COMM, KC_DOT, KC_SLSH, KC_MINS,
+ KC_TRNS, KC_TRNS, KC_SCLN, KC_EQL, KC_EQL, KC_SCLN, KC_PGUP, KC_DEL
+ ),
+/* Keymap 2: Pad/Function layer
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
+ * |--------+------+------+------+------+------|------. .------|------+------+------+------+------+--------|
+ * | F1 | F2 | F3 | F4 | F5 | F6 | BTN1 | | | LEFT | DOWN | UP | RIGHT|VolDn | VolUp |
+ * |--------+------+------+------+------+------|------| |------|------+------+------+------+------+--------|
+ * | F7 | F8 | F9 | F10 | F11 | F12 | BTN2 | | | MLFT | MDWN | MUP | MRGHT|Ply/Pa| Skip |
+ * `--------+------+------+------+------+-------------' `-------------+------+------+------+------+--------'
+ * .------. .------. .------. .-----.
+ * | | | | | | | |
+ * '------' '------' `------. '-----'
+ * ,-------. ,-------.
+ * | | | PgUp |
+ * ,------|-------| |-------|------.
+ * | | | | | |
+ * | | | | | |
+ * | | | | | |
+ * `--------------' `--------------'
+ */
+[NUMB] = LAYOUT_gergo(
+ KC_TRNS, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
+ KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_VOLD, KC_VOLU,
+ KC_TRNS, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_MPLY, KC_MNXT,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+};
+
+/* 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/abstractkb/readme.md b/keyboards/gergo/keymaps/abstractkb/readme.md
new file mode 100644
index 0000000000..0b07136e89
--- /dev/null
+++ b/keyboards/gergo/keymaps/abstractkb/readme.md
@@ -0,0 +1,10 @@
+# [Gergo! By g Heavy Industries](http://gboards.ca)
+
+![Gergo image](https://4.bp.blogspot.com/-889nMXxgSM0/XCNxwnO5kUI/AAAAAAAA6mI/tZbWgZVCBW0dyZOCGJDkjN06DVax7j8XwCLcBGAs/s1600/48422820_967732713413298_485744639215665152_n.jpg)
+
+This is my personal modification to the stock gergo keymap.
+
+## Settings
+To edit various settings, enable the 1u trackball and whatnot please modify /keyboards/gergo/keymaps/default/rules.mk
+
+Ideally you should copy this directory and make your changes there. If you come up with a good layout submit a PR!
diff --git a/keyboards/gergo/keymaps/abstractkb/rules.mk b/keyboards/gergo/keymaps/abstractkb/rules.mk
new file mode 100644
index 0000000000..b87e599734
--- /dev/null
+++ b/keyboards/gergo/keymaps/abstractkb/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?
+
+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/keymaps/robotmaxtron/keymap.c b/keyboards/gh60/revc/keymaps/robotmaxtron/keymap.c
index d7d8316c66..770fe723b5 100644
--- a/keyboards/gh60/revc/keymaps/robotmaxtron/keymap.c
+++ b/keyboards/gh60/revc/keymaps/robotmaxtron/keymap.c
@@ -65,9 +65,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
[_FL] = LAYOUT(
KC_GRAVE,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_DELETE, \
- KC_TRNS,F(1),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_CALC,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,KC_SLCK,KC_PAUS,KC_TRNS, \
+ KC_TRNS,TG(1),KC_TRNS,KC_TRNS,KC_TRNS,KC_TRNS,KC_CALC,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,KC_SLCK,KC_PAUS,KC_TRNS, \
KC_TRNS,KC_MUTE,KC__VOLDOWN,KC__VOLUP,KC_TRNS,KC_TRNS,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,KC_TRNS,KC_TRNS,KC_TRNS, \
- KC_TRNS,KC_TRNS,F(3),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,TG(3),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_TRNS),
/*
@@ -106,8 +106,6 @@ enum function_id {
};
const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_LAYER_TOGGLE(1), // Toggle Arrow Layer overlay
- [3] = ACTION_LAYER_TOGGLE(3), // Toggle Underglow Layer overlay
[4] = ACTION_FUNCTION(RGBLED_TOGGLE), //Turn on/off underglow
[5] = ACTION_FUNCTION(RGBLED_STEP_MODE), // Change underglow mode
[6] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
diff --git a/keyboards/gh60/satan/keymaps/denolfe/keymap.c b/keyboards/gh60/satan/keymaps/denolfe/keymap.c
index 98fcd9b989..a70c409fe8 100644
--- a/keyboards/gh60/satan/keymaps/denolfe/keymap.c
+++ b/keyboards/gh60/satan/keymaps/denolfe/keymap.c
@@ -62,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGDN, KC_PGUP, KC_TRNS, KC_END, KC_MPRV, KC_MNXT, KC_MPLY, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, BL_DEC, BL_TOGG, BL_INC, KC_HOME, LCTL(KC_LEFT), LCTL(KC_END), LCTL(KC_RIGHT), KC_TRNS, RESET, \
- KC_TRNS, KC_TRNS, F(9), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+ KC_TRNS, KC_TRNS, LM(2, MOD_LSFT), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
#endif
[_SL] = LAYOUT_60_ansi(
@@ -99,7 +99,6 @@ const uint16_t PROGMEM fn_actions[] = {
[7] = ACTION_FUNCTION(RGBLED_INCREASE_VAL),
[8] = ACTION_FUNCTION(RGBLED_DECREASE_VAL),
#endif
- [9] = ACTION_LAYER_MODS(2, MOD_LSFT)
};
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
diff --git a/keyboards/gingham/readme.md b/keyboards/gingham/readme.md
index d0c3e6fad7..089af1cf5e 100644
--- a/keyboards/gingham/readme.md
+++ b/keyboards/gingham/readme.md
@@ -4,7 +4,7 @@
A 60% keyboard with only through hole components.
-Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar)
+Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
Hardware Supported: ATMEGA328p with vusb [PCB](https://github.com/yiancar/gingham_pcb)
Hardware Availability: https://yiancar-designs.com/, https://novelkeys.xyz, https://mechboards.co.uk/
diff --git a/keyboards/gingham/rules.mk b/keyboards/gingham/rules.mk
index 8448cf6468..e1046c017b 100644
--- a/keyboards/gingham/rules.mk
+++ b/keyboards/gingham/rules.mk
@@ -14,9 +14,6 @@ MCU = atmega328p
# ATmega328P USBasp
BOOTLOADER = USBasp
-# disable debug code
-OPT_DEFS = -DDEBUG_LEVEL=0
-
# Build Options
# change yes to no to disable
#
diff --git a/keyboards/gray_studio/hb85/rules.mk b/keyboards/gray_studio/hb85/rules.mk
index a9746c0d3d..981f6b514f 100644
--- a/keyboards/gray_studio/hb85/rules.mk
+++ b/keyboards/gray_studio/hb85/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/handwired/d48/README.md b/keyboards/handwired/d48/README.md
new file mode 100644
index 0000000000..a20b8a4251
--- /dev/null
+++ b/keyboards/handwired/d48/README.md
@@ -0,0 +1,87 @@
+# D48
+
+![Proton C based handwired 40% keyboard](https://i.imgur.com/2wCYuno.jpg)
+
+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 I<sup>2</sup>C OLED
+- Small buzzer mounted inside (still waiting for the AST1109MLTRQ boys)
+- WS2812 strip (14 LEDs)
+- DS1307 I<sup>2</sup>C module real-time clock
+
+Build process: [album](https://imgur.com/gallery/zZZGdDw)
+
+## Pinout
+
+![D48 pinout](https://imgur.com/QoStCvD.jpg)
+
+## 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.
+
+## I<sup>2</sup>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 I<sup>2</sup>C and for some reason
+there are 2 pairs of SDA/SCL for I<sup>2</sup>C<sup>1</sup> 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 I<sup>2</sup> 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 0000000000..9c23442997
--- /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 0000000000..3cc2097bf8
--- /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 0000000000..b698ca187f
--- /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 0000000000..f6b57d50d2
--- /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 0000000000..6f76db2508
--- /dev/null
+++ b/keyboards/handwired/d48/ds1307.h
@@ -0,0 +1,6 @@
+#pragma once
+
+#include <stdint.h>
+
+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 0000000000..19063b00ce
--- /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 0000000000..25837a3591
--- /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 <stdio.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,
+#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 0000000000..bc05956214
--- /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 0000000000..0c81e476bb
--- /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 0000000000..e925b9a89f
--- /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 0000000000..b7914f3bcd
--- /dev/null
+++ b/keyboards/handwired/d48/keymaps/default/keymap.c
@@ -0,0 +1,285 @@
+#include QMK_KEYBOARD_H
+#include <string.h>
+#include <stdio.h>
+#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 0000000000..57c83694e1
--- /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 0000000000..0b56a5a6a1
--- /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 0000000000..3bc5ca0275
--- /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/fruity60/readme.md b/keyboards/handwired/fruity60/readme.md
index ed476d2643..23aafc49ac 100644
--- a/keyboards/handwired/fruity60/readme.md
+++ b/keyboards/handwired/fruity60/readme.md
@@ -5,7 +5,7 @@
A 60% tsangan, split bs/rs keyboard designed to support the bluefruit 32u4 ble controller
Keyboard Maintainer: [Yan-Fa Li](https://github.com/yanfali)<br>
-Hardware Supported: [github](https://github.com/yanfali/fruity60)<br>
+Hardware Supported: [GitHub](https://github.com/yanfali/fruity60)<br>
Hardware Availability: You can make them yourself by downloading kicad and generating gerbers.<br>
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/handwired/hnah40/rules.mk b/keyboards/handwired/hnah40/rules.mk
index a705bff6ab..0df52f7de6 100644
--- a/keyboards/handwired/hnah40/rules.mk
+++ b/keyboards/handwired/hnah40/rules.mk
@@ -11,9 +11,6 @@ MCU = atmega328p
# ATmega328P USBasp
BOOTLOADER = USBasp
-# disable debug code
-OPT_DEFS = -DDEBUG_LEVEL=0
-
# Build Options
# change yes to no to disable
#
diff --git a/keyboards/handwired/k8split/README.md b/keyboards/handwired/k8split/README.md
new file mode 100644
index 0000000000..01c3365abc
--- /dev/null
+++ b/keyboards/handwired/k8split/README.md
@@ -0,0 +1,21 @@
+# k8split
+![left](https://raw.githubusercontent.com/Ckath/k8split/master/k8split_left.png)
+![right](https://raw.githubusercontent.com/Ckath/k8split/master/k8split_right.png)
+
+my personal 8x6(x2) split keyboard, aiming to be a mostly normal keyboard layout with plenty of keys. see the hardware repo for more info.
+
+* Keyboard Maintainer: [Ckath](https://github.com/Ckath)
+* Hardware: https://github.com/Ckath/k8split
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/k8split:default
+
+Flashing (both halves are separate keyboards and the default layout is just for debugging):
+
+ # left
+ make handwired/k8split:left:flash
+ # right
+ make handwired/k8split:right: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/handwired/k8split/config.h b/keyboards/handwired/k8split/config.h
new file mode 100644
index 0000000000..234ab1adb3
--- /dev/null
+++ b/keyboards/handwired/k8split/config.h
@@ -0,0 +1,48 @@
+/*
+Copyright 2020 Ckat <ckat@teknik.io>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xC81D
+#define PRODUCT_ID 0xC868
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Ckat
+#define PRODUCT k8split
+#define DESCRIPTION custom split keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 6
+#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 { D5, D3, D2, D1, D0, B7 }
+#define MATRIX_COL_PINS { C7, C6, B6, B5, B4, D7, D6, D4 }
+
+/* COL2ROW, ROW2COL */
+#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/handwired/k8split/k8split.c b/keyboards/handwired/k8split/k8split.c
new file mode 100644
index 0000000000..300a075ae4
--- /dev/null
+++ b/keyboards/handwired/k8split/k8split.c
@@ -0,0 +1,18 @@
+/*
+Copyright 2020 Ckat <ckat@teknik.io>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "k8split.h"
diff --git a/keyboards/handwired/k8split/k8split.h b/keyboards/handwired/k8split/k8split.h
new file mode 100644
index 0000000000..247c0d775a
--- /dev/null
+++ b/keyboards/handwired/k8split/k8split.h
@@ -0,0 +1,37 @@
+/*
+Copyright 2020 Ckat <ckat@teknik.io>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ k00, k06, k12, k18, k24, k30, k36, k42, \
+ k01, k07, k13, k19, k25, k31, k37, k43, \
+ k02, k08, k14, k20, k26, k32, k38, k44, \
+ k03, k09, k15, k21, k27, k33, k39, k45, \
+ k04, k10, k16, k22, k28, k34, k40, k46, \
+ k05, k11, k17, k23, k29, k35, k41, k47 \
+) \
+{ \
+ { k00, k06, k12, k18, k24, k30, k36, k42 }, \
+ { k01, k07, k13, k19, k25, k31, k37, k43 }, \
+ { k02, k08, k14, k20, k26, k32, k38, k44 }, \
+ { k03, k09, k15, k21, k27, k33, k39, k45 }, \
+ { k04, k10, k16, k22, k28, k34, k40, k46 }, \
+ { k05, k11, k17, k23, k29, k35, k41, k47 } \
+}
diff --git a/keyboards/handwired/k8split/keymaps/default/keymap.c b/keyboards/handwired/k8split/keymaps/default/keymap.c
new file mode 100644
index 0000000000..84dc7498cc
--- /dev/null
+++ b/keyboards/handwired/k8split/keymaps/default/keymap.c
@@ -0,0 +1,33 @@
+/*
+Copyright 2020 Ckat <ckat@teknik.io>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include QMK_KEYBOARD_H
+
+/* DEBUG
+ default map is strictly for debugging shorts
+ flash either the left or right keymap accordingly */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_0, KC_5, KC_0, KC_5, KC_0, KC_5, KC_0, KC_5,
+ KC_1, KC_4, KC_1, KC_4, KC_1, KC_4, KC_1, KC_4,
+ KC_2, KC_3, KC_2, KC_3, KC_2, KC_3, KC_2, KC_3,
+ KC_3, KC_2, KC_3, KC_2, KC_3, KC_2, KC_3, KC_2,
+ KC_4, KC_1, KC_4, KC_1, KC_4, KC_1, KC_4, KC_1,
+ KC_5, KC_0, KC_5, KC_0, KC_5, KC_0, KC_5, KC_0
+ )
+};
diff --git a/keyboards/handwired/k8split/keymaps/left/config.h b/keyboards/handwired/k8split/keymaps/left/config.h
new file mode 100644
index 0000000000..968a6eb413
--- /dev/null
+++ b/keyboards/handwired/k8split/keymaps/left/config.h
@@ -0,0 +1,21 @@
+/*
+Copyright 2020 Ckat <ckat@teknik.io>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+/* ensure NKRO is on */
+#define FORCE_NKRO
diff --git a/keyboards/handwired/k8split/keymaps/left/keymap.c b/keyboards/handwired/k8split/keymaps/left/keymap.c
new file mode 100644
index 0000000000..473a3b9f76
--- /dev/null
+++ b/keyboards/handwired/k8split/keymaps/left/keymap.c
@@ -0,0 +1,47 @@
+/*
+Copyright 2020 Ckat <ckat@teknik.io>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include QMK_KEYBOARD_H
+
+#define KC_AUDIO_MMUTE KC_F20
+#define KC_COMP KC_APP
+
+/* LEFT
+ +---------------------------------------+
+ | ESC| F1 | F2 | F3 | F4 | F5 | F6 |MUTE|
+ +---------------------------------------|
+ | ` | 1 | 2 | 3 | 4 | 5 | 6 |MMIC|
+ +-----------------------------------------+
+ | TAB | q | w | e | r | t | JP | MWU|
+ +------------------------------------------+
+ | CTRL | a | s | d | f | g |COMP| MWD|
+ +---------------------------------------------|
+ | SHIFT | z | x | c | v | b | F13| F14|
+ +-------------------------------------------------+
+ | CTRL |CAPS|SUPR| ALT | SPACE | F15| F16| F17|
+ +-------------------------------------------------+ */
+
+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_AUDIO_MUTE,
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_AUDIO_MMUTE,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_MHEN, KC_MS_WH_UP,
+ KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_COMP, KC_MS_WH_DOWN,
+ KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_F13, KC_F14,
+ KC_LCTRL, KC_CAPS, KC_LWIN, KC_LALT, KC_SPC, KC_F15, KC_F16, KC_F17
+ )
+};
diff --git a/keyboards/handwired/k8split/keymaps/right/config.h b/keyboards/handwired/k8split/keymaps/right/config.h
new file mode 100644
index 0000000000..968a6eb413
--- /dev/null
+++ b/keyboards/handwired/k8split/keymaps/right/config.h
@@ -0,0 +1,21 @@
+/*
+Copyright 2020 Ckat <ckat@teknik.io>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+/* ensure NKRO is on */
+#define FORCE_NKRO
diff --git a/keyboards/handwired/k8split/keymaps/right/keymap.c b/keyboards/handwired/k8split/keymaps/right/keymap.c
new file mode 100644
index 0000000000..3c804f2cae
--- /dev/null
+++ b/keyboards/handwired/k8split/keymaps/right/keymap.c
@@ -0,0 +1,45 @@
+/*
+Copyright 2020 Ckat <ckat@teknik.io>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include QMK_KEYBOARD_H
+
+/* RIGHT
+ +---------------------------------------+
+ | F7 | F8 | F9 | F10| F11| F12| INS|PSCR|
+ +--------------------------------------------|
+ | DEL| 7 | 8 | 9 | 0 | - | = | BCKSPC |
+ +--------------------------------------------|
+ | y | u | i | o | p | [ | ] | \ |
+ +---------------------------------------------|
+ |PGUP| h | j | k | l | ; | ' | ENTER |
+ +-----------------------------------------------|
+ |HOME|PGDN| n | m | , | . | / | SHIFT |
+ +-------------------------------------------------+
+ | END| SPACE | ALT | <- | ↓ | ↑ | -> | CTRL |
+ +-------------------------------------------------+ */
+
+/* /!\: rows are reversed in this half because I did all pcb design drunk */
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_END, KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_RCTRL,
+ KC_HOME, KC_PGDN, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSHIFT,
+ KC_PGUP, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENTER,
+ KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_DEL, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC,
+ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_PSCR
+ )
+};
diff --git a/keyboards/handwired/k8split/rules.mk b/keyboards/handwired/k8split/rules.mk
new file mode 100644
index 0000000000..3c7b0282c5
--- /dev/null
+++ b/keyboards/handwired/k8split/rules.mk
@@ -0,0 +1,31 @@
+# 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 = 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
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
diff --git a/keyboards/handwired/mechboards_micropad/readme.md b/keyboards/handwired/mechboards_micropad/readme.md
index 36230b1281..c669d0f0d9 100644
--- a/keyboards/handwired/mechboards_micropad/readme.md
+++ b/keyboards/handwired/mechboards_micropad/readme.md
@@ -3,7 +3,7 @@ Mechboards Micropad
This was a freebie, use me and find out more about me :)
-Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar)
+Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
Hardware Supported: ATMega32u4
Hardware Availability: Random mechboards.co.uk order and UK meetups!
diff --git a/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/keymap.c b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/keymap.c
index 602bdd157b..94d9289cdc 100644
--- a/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/keymap.c
+++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/keymap.c
@@ -29,7 +29,6 @@ TRAN
#define TT_SYM MO(_SYM)
#define TT_MOV LT(_MOV,KC_BSPC)
#define TT_NUM MO(_NUM)
-#define SSFT ACTION_MODS_ONESHOT(MOD_LSFT)
enum macro_keycodes {
DHPASTE=1,
diff --git a/keyboards/handwired/onekey/keymaps/default_json/keymap.json b/keyboards/handwired/onekey/keymaps/default_json/keymap.json
new file mode 100644
index 0000000000..cf30f37b79
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/default_json/keymap.json
@@ -0,0 +1,9 @@
+{
+ "keyboard":"handwired/onekey/pytest",
+ "keymap":"default_json",
+ "layout":"LAYOUT",
+ "layers":[["KC_A"]],
+ "author":"qmk",
+ "notes":"This file is a keymap.json file for handwired/onekey/pytest",
+ "version":1
+}
diff --git a/keyboards/handwired/onekey/keymaps/eep_rst/keymap.c b/keyboards/handwired/onekey/keymaps/eep_rst/keymap.c
new file mode 100644
index 0000000000..adb8e4cd2f
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/eep_rst/keymap.c
@@ -0,0 +1,5 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ LAYOUT( EEP_RST )
+};
diff --git a/keyboards/handwired/onekey/pytest/templates/keymap.c b/keyboards/handwired/onekey/pytest/templates/keymap.c
index d355210c47..6cb25d5226 100644
--- a/keyboards/handwired/onekey/pytest/templates/keymap.c
+++ b/keyboards/handwired/onekey/pytest/templates/keymap.c
@@ -1 +1,2 @@
+#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {__KEYMAP_GOES_HERE__};
diff --git a/keyboards/handwired/prime_exl/info.json b/keyboards/handwired/prime_exl/info.json
index 65b08d6151..6d0da451a0 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/twadlee/tp69/chconf.h b/keyboards/handwired/twadlee/tp69/chconf.h
new file mode 100644
index 0000000000..f1640bb199
--- /dev/null
+++ b/keyboards/handwired/twadlee/tp69/chconf.h
@@ -0,0 +1,700 @@
+/*
+ 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 1000
+# 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 0
+# 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 20
+# 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 TRUE
+# 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 TRUE
+# 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 TRUE
+# 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 TRUE
+# 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 TRUE
+# 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 TRUE
+# 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 TRUE
+# 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 TRUE
+# 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 TRUE
+# endif
+
+/**
+ * @brief Enables factory for generic buffers.
+ */
+# if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)
+# define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE
+# endif
+
+/**
+ * @brief Enables factory for semaphores.
+ */
+# if !defined(CH_CFG_FACTORY_SEMAPHORES)
+# define CH_CFG_FACTORY_SEMAPHORES TRUE
+# endif
+
+/**
+ * @brief Enables factory for mailboxes.
+ */
+# if !defined(CH_CFG_FACTORY_MAILBOXES)
+# define CH_CFG_FACTORY_MAILBOXES TRUE
+# endif
+
+/**
+ * @brief Enables factory for objects FIFOs.
+ */
+# if !defined(CH_CFG_FACTORY_OBJ_FIFOS)
+# define CH_CFG_FACTORY_OBJ_FIFOS TRUE
+# endif
+
+/**
+ * @brief Enables factory for Pipes.
+ */
+# if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)
+# define CH_CFG_FACTORY_PIPES TRUE
+# 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 TRUE
+# 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 TRUE
+# 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 TRUE
+# 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 TRUE
+# 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 TRUE
+# 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/handwired/twadlee/tp69/config.h b/keyboards/handwired/twadlee/tp69/config.h
new file mode 100644
index 0000000000..4da7d25603
--- /dev/null
+++ b/keyboards/handwired/twadlee/tp69/config.h
@@ -0,0 +1,253 @@
+/*
+Copyright 2020 Tracy Wadleigh
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+//#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xBEEF
+#define PRODUCT_ID 0xCACA
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Tracy Wadleigh
+#define PRODUCT tp69
+#define DESCRIPTION A custom 69-key 65% keyboard with a trackpoint under keycap
+
+/* key matrix size */
+#define MATRIX_ROWS 10
+#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)
+ */
+/* 19 17 16 15 14 2 8 6 7 9 */
+#define MATRIX_ROW_PINS { B2, B1, B0, C0, D1, D0, D3, D4, D2, C3 }
+/* 20 21 18 0 1 3 4 5 */
+#define MATRIX_COL_PINS { D5, D6, A4, B16, B17, A1, A2, D7 }
+#define UNUSED_PINS
+
+/* for trackpoint: C1 (22) C2 (23) */
+
+/* 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/twadlee/tp69/halconf.h b/keyboards/handwired/twadlee/tp69/halconf.h
new file mode 100644
index 0000000000..908c75542c
--- /dev/null
+++ b/keyboards/handwired/twadlee/tp69/halconf.h
@@ -0,0 +1,524 @@
+/*
+ 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 FALSE
+# 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/handwired/twadlee/tp69/info.json b/keyboards/handwired/twadlee/tp69/info.json
new file mode 100644
index 0000000000..89eecb7d16
--- /dev/null
+++ b/keyboards/handwired/twadlee/tp69/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "Twadlee TP69",
+ "url": "https://github.com/twadleigh/qmk_firmware",
+ "maintainer": "qmk",
+ "width": 16,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "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}, {"x":14.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":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":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}, {"x":13.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":2}, {"x":5.75, "y":4}, {"x":6.75, "y":4}, {"x":7.75, "y":4}, {"x":8.75, "y":4, "w":2.25}, {"x":11, "y":4, "w":1.25}, {"x":12.25, "y":4, "w":1.25}, {"x":13.5, "y":4, "w":1.25}, {"x":14.75, "y":4, "w":1.25}]
+ }
+ }
+}
diff --git a/keyboards/handwired/twadlee/tp69/keymaps/default/keymap.c b/keyboards/handwired/twadlee/tp69/keymaps/default/keymap.c
new file mode 100644
index 0000000000..f250c3fc62
--- /dev/null
+++ b/keyboards/handwired/twadlee/tp69/keymaps/default/keymap.c
@@ -0,0 +1,28 @@
+/* Copyright 2020 Tracy Wadleigh
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+
+// Defines names for use in layer keycodes and the keymap
+enum layer_names { _BASE };
+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_LGUI, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_PGUP, KC_PGDN,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_LALT, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, 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, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_BSPC, KC_MS_BTN1, KC_MS_BTN3, KC_MS_BTN2, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL
+ )
+};
diff --git a/keyboards/handwired/twadlee/tp69/keymaps/default/readme.md b/keyboards/handwired/twadlee/tp69/keymaps/default/readme.md
new file mode 100644
index 0000000000..453673a6e9
--- /dev/null
+++ b/keyboards/handwired/twadlee/tp69/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for tp69
diff --git a/keyboards/handwired/twadlee/tp69/mcuconf.h b/keyboards/handwired/twadlee/tp69/mcuconf.h
new file mode 100644
index 0000000000..dc4d00bf18
--- /dev/null
+++ b/keyboards/handwired/twadlee/tp69/mcuconf.h
@@ -0,0 +1,45 @@
+/*
+ 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_
+
+#define KL2x_MCUCONF
+
+/*
+ * HAL driver system settings.
+ */
+/* PEE mode - 48MHz system clock driven by (16 MHz) external crystal. */
+#define KINETIS_MCG_MODE KINETIS_MCG_MODE_PEE
+#define KINETIS_PLLCLK_FREQUENCY 96000000UL
+#define KINETIS_SYSCLK_FREQUENCY 48000000UL
+
+/*
+ * SERIAL driver system settings.
+ */
+#define KINETIS_SERIAL_USE_UART0 TRUE
+
+/*
+ * USB driver settings
+ */
+#define KINETIS_USB_USE_USB0 TRUE
+
+/* Need to redefine this, since the default (configured for K20x) might not apply
+ * 2 for Teensy LC
+ * 5 for Teensy 3.x */
+#define KINETIS_USB_USB0_IRQ_PRIORITY 2
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/handwired/twadlee/tp69/readme.md b/keyboards/handwired/twadlee/tp69/readme.md
new file mode 100644
index 0000000000..201991cfe7
--- /dev/null
+++ b/keyboards/handwired/twadlee/tp69/readme.md
@@ -0,0 +1,18 @@
+# Twadlee TP69
+
+![tp69](https://i.imgur.com/sC1qmJS.png)
+
+A 69-key keyboard having a Trackpoint unit under an additional 70th keycap.
+
+The layout is similar to a conventional 60% keyboard, but with additional 1u keys down a central split. The spacebar is also split, with the intervening space occupied by three mouse buttons and the left half replaced by a relocated `BACKSPACE` key. The right half of the spacebar is 2.25u. The space vacated by the `BACKSPACE` key is split into two additional 1u keys. The additional keycap on the home row does not cover a switch but a Trackpoint pointing device. All told, the 61 keycaps of the conventional 60% layout are augmented by an additional 9 1u keycaps, and a 2.25u keycap to replace the conventional 6.25u spacebar.
+
+Given the unconventional layout, only non-sculpted keycap profiles are practical. I use DSAs.
+
+* Keyboard Maintainer: [Tracy Wadleigh](https://github.com/twadleigh)
+* Hardware Supported: Teensy LC controller
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/twadlee/tp69: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/twadlee/tp69/rules.mk b/keyboards/handwired/twadlee/tp69/rules.mk
new file mode 100644
index 0000000000..967060802b
--- /dev/null
+++ b/keyboards/handwired/twadlee/tp69/rules.mk
@@ -0,0 +1,28 @@
+# MCU name
+MCU = MKL26Z64
+
+# 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
+PS2_MOUSE_ENABLE = no
+
+USE_CHIBIOS_CONTRIB = yes
+
+# Enter lower-power sleep mode when on the ChibiOS idle thread
+OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
diff --git a/keyboards/handwired/twadlee/tp69/tp69.c b/keyboards/handwired/twadlee/tp69/tp69.c
new file mode 100644
index 0000000000..f4454c3bda
--- /dev/null
+++ b/keyboards/handwired/twadlee/tp69/tp69.c
@@ -0,0 +1,18 @@
+/* Copyright 2020 Tracy Wadleigh
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "tp69.h"
diff --git a/keyboards/handwired/twadlee/tp69/tp69.h b/keyboards/handwired/twadlee/tp69/tp69.h
new file mode 100644
index 0000000000..31c03eb70b
--- /dev/null
+++ b/keyboards/handwired/twadlee/tp69/tp69.h
@@ -0,0 +1,48 @@
+/* Copyright 2020 Tracy Wadleigh
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#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, k50, k51, k52, k53, k54, k55, k56, k57, \
+ k10, k11, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k66, k67, \
+ k20, k21, k23, k24, k25, k27, /**/ k70, k71, k72, k73, k74, k75, k77, \
+ k30, k32, k33, k34, k35, k36, k37, k81, k82, k83, k84, k85, k86, \
+ k40, k41, k43, k44, k46, k47, k91, k92, k94, k95, k96, k97 \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07}, \
+ { k10, k11, KC_NO, k13, k14, k15, k16, k17}, \
+ { k20, k21, KC_NO, k23, k24, k25, KC_NO, k27}, \
+ { k30, KC_NO, k32, k33, k34, k35, k36, k37}, \
+ { k40, k41, KC_NO, k43, k44, KC_NO, k46, k47}, \
+ { k50, k51, k52, k53, k54, k55, k56, k57}, \
+ { k60, k61, k62, k63, k64, k65, k66, k67}, \
+ { k70, k71, k72, k73, k74, k75, KC_NO, k77}, \
+ {KC_NO, k81, k82, k83, k84, k85, k86, KC_NO}, \
+ {KC_NO, k91, k92, KC_NO, k94, k95, k96, k97} \
+}
diff --git a/keyboards/handwired/twadlee/tp69/twadlee-tp69-kle.json b/keyboards/handwired/twadlee/tp69/twadlee-tp69-kle.json
new file mode 100644
index 0000000000..b54508bf4f
--- /dev/null
+++ b/keyboards/handwired/twadlee/tp69/twadlee-tp69-kle.json
@@ -0,0 +1,139 @@
+[
+ {
+ "backcolor": "",
+ "name": "65% keyboard with pointing device under keycap",
+ "author": "Tracy Wadleigh",
+ "plate": false
+ },
+ [
+ {
+ "a": 7,
+ "f": 5
+ },
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ],
+ [
+ {
+ "w": 1.5
+ },
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ {
+ "w": 1.5
+ },
+ ""
+ ],
+ [
+ {
+ "w": 1.75
+ },
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ {
+ "x": 1
+ },
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ {
+ "w": 2.25
+ },
+ ""
+ ],
+ [
+ {
+ "w": 2.25
+ },
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ {
+ "w": 2.75
+ },
+ ""
+ ],
+ [
+ {
+ "w": 1.25
+ },
+ "",
+ {
+ "w": 1.25
+ },
+ "",
+ {
+ "w": 1.25
+ },
+ "",
+ {
+ "w": 2
+ },
+ "",
+ "",
+ "",
+ "",
+ {
+ "w": 2.25
+ },
+ "",
+ {
+ "w": 1.25
+ },
+ "",
+ {
+ "w": 1.25
+ },
+ "",
+ {
+ "w": 1.25
+ },
+ "",
+ {
+ "w": 1.25
+ },
+ ""
+ ]
+] \ No newline at end of file
diff --git a/keyboards/helix/pico/config.h b/keyboards/helix/pico/config.h
index 05713d7602..a4cc77143b 100644
--- a/keyboards/helix/pico/config.h
+++ b/keyboards/helix/pico/config.h
@@ -19,8 +19,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#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 1a5a266641..6c6ebea68a 100644
--- a/keyboards/helix/rev1/config.h
+++ b/keyboards/helix/rev1/config.h
@@ -19,8 +19,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#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 467d2d66f6..f85896fbea 100644
--- a/keyboards/helix/rev2/config.h
+++ b/keyboards/helix/rev2/config.h
@@ -19,8 +19,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#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/xulkal/config.h b/keyboards/helix/rev2/keymaps/xulkal/config.h
new file mode 100644
index 0000000000..e2b325450a
--- /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 <wakojun@gmail.com>
+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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 3fad64deac..fecdf4cbd2 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/helix/rev2/keymaps/yshrsmz/config.h b/keyboards/helix/rev2/keymaps/yshrsmz/config.h
index d70f23c3e3..b8c1041cdc 100644
--- a/keyboards/helix/rev2/keymaps/yshrsmz/config.h
+++ b/keyboards/helix/rev2/keymaps/yshrsmz/config.h
@@ -17,10 +17,10 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+
#pragma once
-/* auto shift config */
-#define AUTO_SHIFT_TIMEOUT 150
+// place overrides here
// If you need more program area, try select and reduce rgblight modes to use.
diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c b/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c
index e5b5f57d97..bd8796d064 100644
--- a/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c
+++ b/keyboards/helix/rev2/keymaps/yshrsmz/keymap.c
@@ -11,7 +11,6 @@
#include "ssd1306.h"
#endif
-extern keymap_config_t keymap_config;
#ifdef RGBLIGHT_ENABLE
//Following line allows macro to read current RGB settings
@@ -26,20 +25,24 @@ extern uint8_t is_master;
// entirely and just use numbers.
enum layer_number {
_QWERTY = 0,
+ _COLEMAK,
+ _DVORAK,
_LOWER,
_RAISE,
- _FUNC,
_ADJUST
};
enum custom_keycodes {
QWERTY = SAFE_RANGE,
+ COLEMAK,
+ DVORAK,
LOWER,
RAISE,
- FUNC,
ADJUST,
+ BACKLIT,
EISU,
- KANA
+ KANA,
+ RGBRST
};
enum macro_keycodes {
@@ -54,85 +57,106 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Qwerty
* ,-----------------------------------------. ,-----------------------------------------.
- * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | = |
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | Tab | Q | W | E | R | T | | Y | U | I | O | P | - |
+ * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | ESC | A | S | D | F | G | | H | J | K | L | ; | ' |
+ * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
- * |Shift | Z | X | C | V | B | Fn | Fn | N | M | , | . | / |Shift |
+ * | Shift| Z | X | C | V | B | [ | ] | N | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
- * | EISU | Ctrl | Alt | GUI |Lower |Space | Bksp |Enter |Space |Raise | GUI | Alt | Ctrl | KANA |
+ * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right |
* `-------------------------------------------------------------------------------------------------'
*/
[_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_EQL, \
- 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_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, FUNC, FUNC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \
- EISU, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_BSPC, KC_ENT, KC_SPC, RAISE, KC_RGUI, KC_RALT, KC_RCTL, KANA \
+ 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_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_LBRC, KC_RBRC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \
+ ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
),
- /* Lower
+ /* Colemak
* ,-----------------------------------------. ,-----------------------------------------.
- * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
+ * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | |
+ * | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
- * | | F7 | F8 | F9 | F10 | F11 | | | F12 | | | | | |
+ * | Shift| Z | X | C | V | B | [ | ] | K | M | , | . | / |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | | | | Next | Vol- | Vol+ | Play |
+ * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right |
* `-------------------------------------------------------------------------------------------------'
*/
- [_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_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \
- 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, _______, _______, _______, _______, _______, \
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+ [_COLEMAK] = 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_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_LBRC, KC_RBRC, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT , \
+ ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
),
- /* Raise
+ /* Dvorak
* ,-----------------------------------------. ,-----------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
+ * | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ |
+ * | Ctrl | A | O | E | U | I | | D | H | T | N | S | / |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
- * | | F7 | F8 | F9 | F10 | F11 | | | F12 | | | | | |
+ * | Shift| ; | Q | J | K | X | [ | ] | B | M | W | V | Z |Enter |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | | | | Next | Vol- | Vol+ | Play |
+ * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right |
* `-------------------------------------------------------------------------------------------------'
*/
- [_RAISE] = LAYOUT( \
+ [_DVORAK] = 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_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_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL, \
+ 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_LBRC, KC_RBRC, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_ENT , \
+ ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
+ ),
+
+ /* Lower
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | ( | ) | F12 | | | 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_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, \
+ _______, 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_LPRN, KC_RPRN, KC_F12, _______, _______, KC_HOME, KC_END, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
),
- /* Func
+ /* Raise
* ,-----------------------------------------. ,-----------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | | | | | | | LEFT | DOWN | UP |RIGHT | PGUP | |
- * |------+------+------+------+------+------|------+------|------+------+------+------+------+------|
- * | | | | | | | | | HOME | END |Alt+↠|Alt+→ | PGDN | |
- * |------+------+------+------+------+------+-------------+------+------+------+------+------+------|
+ * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | | | F12 | | |PageDn|PageUp| |
+ * |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | | Next | Vol- | Vol+ | Play |
* `-------------------------------------------------------------------------------------------------'
*/
- [_FUNC] = LAYOUT( \
+ [_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_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_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PGUP, _______, \
- _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_END, LALT(KC_LEFT), LALT(KC_RGHT), KC_PGDN, _______, \
+ _______, 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_PGDN, KC_PGUP, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
),
@@ -140,9 +164,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* ,-----------------------------------------. ,-----------------------------------------.
* | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | Reset| | | | | | | | | | | Del |
+ * | | Reset|RGBRST| | | | | | | | | | Del |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | | |Aud on|Audoff| Mac | | Win |Qwerty| | | | |
+ * | | | |Aud on|Audoff| Mac | | Win |Qwerty|Colemk|Dvorak| | |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
* | | | | | | | | | | |RGB ON| HUE+ | SAT+ | VAL+ |
* |------+------+------+------+------+------+------+------+------+------+------+------+------+------|
@@ -151,8 +175,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
[_ADJUST] = 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, \
- _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \
- _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, \
+ _______, RESET, RGBRST, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \
+ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD \
)
@@ -164,81 +188,99 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Qwerty
* ,-----------------------------------------. ,-----------------------------------------.
- * | = | Q | W | E | R | T | | Y | U | I | O | P | - |
+ * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Bksp |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | Esc | A | S | D | F | G | | H | J | K | L | ; | ' |
+ * | Ctrl | A | S | D | F | G | | H | J | K | L | ; | ' |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter |
* |------+------+------+------+------+------+-------------+------+------+------+------+------+------|
- * | EISU | Ctrl | Alt | GUI |ESC/Lower | Func | Bksp |Enter |Space |Raise | GUI | Alt | Ctrl | KANA |
+ * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right |
* `-------------------------------------------------------------------------------------------------'
*/
[_QWERTY] = LAYOUT( \
- KC_EQL, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \
- 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_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 , \
- EISU, KC_LCTL, KC_LALT, KC_LGUI, LT(_LOWER, KC_ESC), FUNC, KC_BSPC, KC_ENT, KC_SPC, RAISE, KC_RGUI, KC_RALT, KC_RCTL, KANA \
+ ADJUST, KC_ESC, KC_LALT, KC_LGUI, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
),
- /* Lower
+ /* Colemak
* ,-----------------------------------------. ,-----------------------------------------.
- * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
+ * | Tab | Q | W | F | P | G | | J | L | U | Y | ; | Bksp |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | |
+ * | Ctrl | A | R | S | T | D | | H | N | E | I | O | ' |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | F7 | F8 | F9 | F10 | F11 | | F12 | | | | | |
+ * | Shift| Z | X | C | V | B | | K | M | , | . | / |Enter |
* |------+------+------+------+------+------+-------------+------+------+------+------+------+------|
- * | | | | | | | | | | | Next | Vol- | Vol+ | Play |
+ * |Adjust| Esc | Alt | GUI | EISU |Lower |Space |Space |Raise | KANA | Left | Down | Up |Right |
* `-------------------------------------------------------------------------------------------------'
*/
- [_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_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, _______, _______, _______, _______, _______, \
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+ [_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, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
),
- /* Raise
+ /* Dvorak
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | 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 | EISU |Lower |Space |Space |Raise | KANA | 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_DEL, \
+ 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, EISU, LOWER, KC_SPC, KC_SPC, RAISE, KANA, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
+ ),
+
+ /* Lower
* ,-----------------------------------------. ,-----------------------------------------.
- * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
+ * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ |
+ * | | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | F7 | F8 | F9 | F10 | F11 | | F12 | | | | | |
+ * | | F7 | F8 | F9 | F10 | F11 | | F12 | | | Home | End | |
* |------+------+------+------+------+------+-------------+------+------+------+------+------+------|
* | | | | | | | | | | | 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, _______, _______, _______, _______, _______, \
+ [_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_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, _______, _______, KC_HOME, KC_END, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
),
- /* Func
+ /* Raise
* ,-----------------------------------------. ,-----------------------------------------.
* | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | | | | | | | LEFT | DOWN | UP |RIGHT | PGUP | |
+ * | | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | | | | | | | HOME | END |Alt+↠|Alt+→ | PGDN | |
+ * | | F7 | F8 | F9 | F10 | F11 | | F12 | | |PageDn|PageUp| |
* |------+------+------+------+------+------+-------------+------+------+------+------+------+------|
* | | | | | | | | | | | Next | Vol- | Vol+ | Play |
* `-------------------------------------------------------------------------------------------------'
*/
- [_FUNC] = LAYOUT( \
+ [_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_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_PGUP, _______, \
- _______, _______, _______, _______, _______, _______, KC_HOME, KC_END, LALT(KC_LEFT), LALT(KC_RGHT), KC_PGDN, _______, \
+ _______, 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_PGDN, KC_PGUP, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
),
/* Adjust (Lower + Raise)
* ,-----------------------------------------. ,-----------------------------------------.
- * | | Reset| | | | | | | | | | | Del |
+ * | | Reset|RGBRST| | | | | | | | | | Del |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | | |Aud on|Audoff| Mac | | Win |Qwerty| | | | |
+ * | | | |Aud on|Audoff| Mac | | Win |Qwerty|Colemk|Dvorak| | |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | | | | | | |RGB ON| HUE+ | SAT+ | VAL+ |
* |------+------+------+------+------+------+-------------+------+------+------+------+------+------|
@@ -246,8 +288,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `-------------------------------------------------------------------------------------------------'
*/
[_ADJUST] = LAYOUT( \
- _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \
- _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, _______, _______, _______, _______, \
+ _______, RESET, RGBRST, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \
+ _______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD \
)
@@ -272,11 +314,6 @@ float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
bool TOG_STATUS = false;
int RGB_current_mode;
-void persistent_default_layer_set(uint16_t default_layer) {
- eeconfig_update_default_layer(default_layer);
- default_layer_set(default_layer);
-}
-
// Setting ADJUST layer RGB back to default
void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
@@ -296,7 +333,25 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
#ifdef AUDIO_ENABLE
PLAY_SONG(tone_qwerty);
#endif
- persistent_default_layer_set(1UL<<_QWERTY);
+ set_single_persistent_default_layer(_QWERTY);
+ }
+ return false;
+ break;
+ case COLEMAK:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ PLAY_SONG(tone_colemak);
+ #endif
+ set_single_persistent_default_layer(_COLEMAK);
+ }
+ return false;
+ break;
+ case DVORAK:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ PLAY_SONG(tone_dvorak);
+ #endif
+ set_single_persistent_default_layer(_DVORAK);
}
return false;
break;
@@ -346,14 +401,6 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
return false;
break;
- case FUNC:
- if (record->event.pressed) {
- layer_on(_FUNC);
- } else {
- layer_off(_FUNC);
- }
- return false;
- break;
case ADJUST:
if (record->event.pressed) {
layer_on(_ADJUST);
@@ -397,6 +444,15 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
return false;
break;
+ case RGBRST:
+ #ifdef RGBLIGHT_ENABLE
+ if (record->event.pressed) {
+ eeconfig_update_rgblight_default();
+ rgblight_enable();
+ RGB_current_mode = rgblight_config.mode;
+ }
+ #endif
+ break;
}
return true;
}
@@ -444,14 +500,7 @@ void music_scale_user(void)
//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
#ifdef SSD1306OLED
-// hook point for 'led_test' keymap
-// 'default' keymap's led_test_init() is empty function, do nothing
-// 'led_test' keymap's led_test_init() force rgblight_mode_noeeprom(RGBLIGHT_MODE_RGB_TEST);
-__attribute__ ((weak))
-void led_test_init(void) {}
-
void matrix_scan_user(void) {
- led_test_init();
iota_gfx_task(); // this is what updates the display continuously
}
@@ -467,41 +516,42 @@ void matrix_update(struct CharacterMatrix *dest,
#define L_BASE 0
#define L_LOWER (1<<_LOWER)
#define L_RAISE (1<<_RAISE)
-#define L_FUNC (1<<_FUNC)
#define L_ADJUST (1<<_ADJUST)
#define L_ADJUST_TRI (L_ADJUST|L_RAISE|L_LOWER)
static void render_logo(struct CharacterMatrix *matrix) {
- static char logo[]={
+ static const char helix_logo[] PROGMEM ={
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};
- matrix_write(matrix, logo);
+ matrix_write_P(matrix, helix_logo);
//matrix_write_P(&matrix, PSTR(" Split keyboard kit"));
}
-
-
-void render_status(struct CharacterMatrix *matrix) {
-
- // Render to mode icon
- static char logo[][2][3]={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}};
- if(keymap_config.swap_lalt_lgui==false){
- matrix_write(matrix, logo[0][0]);
- matrix_write_P(matrix, PSTR("\n"));
- matrix_write(matrix, logo[0][1]);
- }else{
- matrix_write(matrix, logo[1][0]);
- matrix_write_P(matrix, PSTR("\n"));
- matrix_write(matrix, logo[1][1]);
+static void render_rgbled_status(bool full, struct CharacterMatrix *matrix) {
+#ifdef RGBLIGHT_ENABLE
+ char buf[30];
+ if (RGBLIGHT_MODES > 1 && rgblight_config.enable) {
+ if (full) {
+ snprintf(buf, sizeof(buf), " LED %2d: %d,%d,%d ",
+ rgblight_config.mode,
+ rgblight_config.hue/RGBLIGHT_HUE_STEP,
+ rgblight_config.sat/RGBLIGHT_SAT_STEP,
+ rgblight_config.val/RGBLIGHT_VAL_STEP);
+ } else {
+ snprintf(buf, sizeof(buf), "[%2d] ",rgblight_config.mode);
+ }
+ matrix_write(matrix, buf);
}
+#endif
+}
+static void render_layer_status(struct CharacterMatrix *matrix) {
// Define layers here, Have not worked out how to have text displayed for each layer. Copy down the number you see and add a case for it below
- char buf[40];
- snprintf(buf,sizeof(buf), "Undef-%ld", layer_state);
- matrix_write_P(matrix, PSTR("\nLayer: "));
+ char buf[10];
+ matrix_write_P(matrix, PSTR("Layer: "));
switch (layer_state) {
case L_BASE:
matrix_write_P(matrix, PSTR("Default"));
@@ -512,24 +562,44 @@ void render_status(struct CharacterMatrix *matrix) {
case L_LOWER:
matrix_write_P(matrix, PSTR("Lower"));
break;
- case L_FUNC:
- matrix_write_P(matrix, PSTR("Func"));
- break;
case L_ADJUST:
case L_ADJUST_TRI:
matrix_write_P(matrix, PSTR("Adjust"));
break;
default:
+ matrix_write_P(matrix, PSTR("Undef-"));
+ snprintf(buf,sizeof(buf), "%ld", layer_state);
matrix_write(matrix, buf);
}
+}
+
+void render_status(struct CharacterMatrix *matrix) {
+
+ // Render to mode icon
+ static const char os_logo[][2][3] PROGMEM ={{{0x95,0x96,0},{0xb5,0xb6,0}},{{0x97,0x98,0},{0xb7,0xb8,0}}};
+ if(keymap_config.swap_lalt_lgui==false){
+ matrix_write_P(matrix, os_logo[0][0]);
+ matrix_write_P(matrix, PSTR("\n"));
+ matrix_write_P(matrix, os_logo[0][1]);
+ }else{
+ matrix_write_P(matrix, os_logo[1][0]);
+ matrix_write_P(matrix, PSTR("\n"));
+ matrix_write_P(matrix, os_logo[1][1]);
+ }
+
+ matrix_write_P(matrix, PSTR(" "));
+ render_layer_status(matrix);
+ matrix_write_P(matrix, PSTR("\n"));
// Host Keyboard LED Status
- char led[40];
- snprintf(led, sizeof(led), "\n%s %s %s",
- (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) ? "NUMLOCK" : " ",
- (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ? "CAPS" : " ",
- (host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) ? "SCLK" : " ");
- matrix_write(matrix, led);
+ matrix_write_P(matrix, (host_keyboard_leds() & (1<<USB_LED_NUM_LOCK)) ?
+ PSTR("NUMLOCK") : PSTR(" "));
+ matrix_write_P(matrix, (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ?
+ PSTR("CAPS") : PSTR(" "));
+ matrix_write_P(matrix, (host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) ?
+ PSTR("SCLK") : PSTR(" "));
+ matrix_write_P(matrix, PSTR("\n"));
+ render_rgbled_status(true, matrix);
}
@@ -547,6 +617,8 @@ void iota_gfx_task_user(void) {
render_status(&matrix);
}else{
render_logo(&matrix);
+ render_rgbled_status(false, &matrix);
+ render_layer_status(&matrix);
}
matrix_update(&display, &matrix);
}
diff --git a/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk b/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk
index bc823e5e12..13d8099317 100644
--- a/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk
+++ b/keyboards/helix/rev2/keymaps/yshrsmz/rules.mk
@@ -6,12 +6,11 @@
# See TOP/docs/config_options.md for more information.
#
LINK_TIME_OPTIMIZATION_ENABLE = no # if firmware size over limit, try this option
-AUTO_SHIFT_ENABLE = yes
# Helix Spacific Build Options
# you can uncomment and edit follows 7 Variables
# jp: 以下ã®7ã¤ã®å¤‰æ•°ã‚’å¿…è¦ã«å¿œã˜ã¦ç·¨é›†ã—ã€ã‚³ãƒ¡ãƒ³ãƒˆã‚¢ã‚¦ãƒˆã‚’ã¯ãšã—ã¾ã™ã€‚
-HELIX_ROWS = 4 # Helix Rows is 4 or 5
+# HELIX_ROWS = 5 # Helix Rows is 4 or 5
OLED_ENABLE = yes # OLED_ENABLE
# LOCAL_GLCDFONT = no # use each keymaps "helixfont.h" insted of "common/glcdfont.c"
# LED_BACK_ENABLE = no # LED backlight (Enable WS2812 RGB underlight.)
diff --git a/keyboards/hhkb/ansi/ansi.c b/keyboards/hhkb/ansi/ansi.c
new file mode 100644
index 0000000000..cefc4e0690
--- /dev/null
+++ b/keyboards/hhkb/ansi/ansi.c
@@ -0,0 +1 @@
+#include "ansi.h" \ No newline at end of file
diff --git a/keyboards/hhkb/ansi/ansi.h b/keyboards/hhkb/ansi/ansi.h
new file mode 100644
index 0000000000..28e8d2fef8
--- /dev/null
+++ b/keyboards/hhkb/ansi/ansi.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K31, K30, K00, K10, K11, K20, K21, K40, K41, K60, K61, K70, K71, K50, K51, \
+ K32, K01, K02, K13, K12, K23, K22, K42, K43, K62, K63, K73, K72, K52, \
+ K33, K04, K03, K14, K15, K24, K25, K45, K44, K65, K64, K74, K53, \
+ K34, K05, K06, K07, K16, K17, K26, K46, K66, K76, K75, K55, K54, \
+ K35, K36, K37, K57, K56) \
+ \
+{ \
+ { K00, K01, K02, K03, K04, K05, K06, K07 }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17 }, \
+ { K20, K21, K22, K23, K24, K25, K26, KC_NO }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37 }, \
+ { K40, K41, K42, K43, K44, K45, K46, KC_NO }, \
+ { K50, K51, K52, K53, K54, K55, K56, K57 }, \
+ { K60, K61, K62, K63, K64, K65, K66, KC_NO }, \
+ { K70, K71, K72, K73, K74, K75, K76, KC_NO } \
+}
+
+#define LAYOUT_60_hhkb LAYOUT
diff --git a/keyboards/hhkb/ansi/config.h b/keyboards/hhkb/ansi/config.h
new file mode 100644
index 0000000000..689fd55681
--- /dev/null
+++ b/keyboards/hhkb/ansi/config.h
@@ -0,0 +1,104 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x4848 // HH = happy hacking
+#define PRODUCT_ID 0x0001 // ANSI HHKB
+#define DEVICE_VER 0x0104
+#define MANUFACTURER q.m.k
+#define PRODUCT HHKB mod
+#define DESCRIPTION q.m.k keyboard firmware for HHKB
+
+/* key matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 8
+
+#define TAPPING_TERM 200
+
+/* 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 HHKB_RN42_ENABLE
+// rn42 support -- acquired from the tmk repo. This is almost certainly not
+// integrated with qmk in the correct way.
+
+#define SUART_OUT_PORT PORTD
+#define SUART_OUT_BIT 0
+#define SUART_IN_PIN PIND
+#define SUART_IN_BIT 1
+
+#ifdef __AVR_ATmega32U4__
+ /* iom32u4.h has no definition of UCSR1D. copy from iom32u2.h */
+ #define UCSR1D _SFR_MEM8(0xCB)
+ #define RTSEN 0
+ #define CTSEN 1
+
+ #define SERIAL_UART_BAUD 115200
+ #define SERIAL_UART_DATA UDR1
+ #define SERIAL_UART_UBRR ((F_CPU/(16.0*SERIAL_UART_BAUD)-1+0.5))
+ #define SERIAL_UART_RXD_VECT USART1_RX_vect
+ #define SERIAL_UART_TXD_READY (UCSR1A&(1<<UDRE1))
+ #define SERIAL_UART_INIT() do { \
+ UBRR1L = (uint8_t) SERIAL_UART_UBRR; /* baud rate */ \
+ UBRR1H = ((uint16_t)SERIAL_UART_UBRR>>8); /* baud rate */ \
+ UCSR1B |= (1<<RXCIE1) | (1<<RXEN1); /* RX interrupt, RX: enable */ \
+ UCSR1B |= (0<<TXCIE1) | (1<<TXEN1); /* TX interrupt, TX: enable */ \
+ UCSR1C |= (0<<UPM11) | (0<<UPM10); /* parity: none(00), even(01), odd(11) */ \
+ UCSR1D |= (0<<RTSEN) | (0<<CTSEN); /* RTS, CTS(no flow control by hardware) */ \
+ DDRD |= (1<<5); PORTD &= ~(1<<5); /* RTS for flow control by firmware */ \
+ sei(); \
+ } while(0)
+ #define SERIAL_UART_RTS_LO() do { PORTD &= ~(1<<5); } while (0)
+ #define SERIAL_UART_RTS_HI() do { PORTD |= (1<<5); } while (0)
+#else
+ #error "USART configuration is needed."
+#endif
+
+/* power control of key switch board */
+#define HHKB_POWER_SAVING
+
+#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/hhkb/ansi/hhkb_avr.h b/keyboards/hhkb/ansi/hhkb_avr.h
new file mode 100644
index 0000000000..f9446deef7
--- /dev/null
+++ b/keyboards/hhkb/ansi/hhkb_avr.h
@@ -0,0 +1,157 @@
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+
+
+// Timer resolution check
+#if (1000000/TIMER_RAW_FREQ > 20)
+# error "Timer resolution(>20us) is not enough for HHKB matrix scan tweak on V-USB."
+#endif
+
+
+/*
+ * HHKB Matrix I/O
+ *
+ * row: HC4051[A,B,C] selects scan row0-7
+ * row-ext: [En0,En1] row extention for JP
+ * col: LS145[A,B,C,D] selects scan col0-7 and enable(D)
+ * key: on: 0/off: 1
+ * prev: hysteresis control: assert(1) when previous key state is on
+ */
+
+
+#if defined(__AVR_ATmega32U4__)
+/*
+ * For TMK HHKB alt controller(ATMega32U4)
+ *
+ * row: PB0-2
+ * col: PB3-5,6
+ * key: PD7(pull-uped)
+ * prev: PB7
+ * power: PD4(L:off/H:on)
+ * row-ext: PC6,7 for HHKB JP(active low)
+ */
+static inline void KEY_ENABLE(void) { (PORTB &= ~(1<<6)); }
+static inline void KEY_UNABLE(void) { (PORTB |= (1<<6)); }
+static inline bool KEY_STATE(void) { return (PIND & (1<<7)); }
+static inline void KEY_PREV_ON(void) { (PORTB |= (1<<7)); }
+static inline void KEY_PREV_OFF(void) { (PORTB &= ~(1<<7)); }
+#ifdef HHKB_POWER_SAVING
+static inline void KEY_POWER_ON(void) {
+ DDRB = 0xFF; PORTB = 0x40; // change pins output
+ DDRD |= (1<<4); PORTD |= (1<<4); // MOS FET switch on
+ /* Without this wait you will miss or get false key events. */
+ _delay_ms(5); // wait for powering up
+}
+static inline void KEY_POWER_OFF(void) {
+ /* input with pull-up consumes less than without it when pin is open. */
+ DDRB = 0x00; PORTB = 0xFF; // change pins input with pull-up
+ DDRD |= (1<<4); PORTD &= ~(1<<4); // MOS FET switch off
+}
+static inline bool KEY_POWER_STATE(void) { return PORTD & (1<<4); }
+#else
+static inline void KEY_POWER_ON(void) {}
+static inline void KEY_POWER_OFF(void) {}
+static inline bool KEY_POWER_STATE(void) { return true; }
+#endif
+static inline void KEY_INIT(void)
+{
+ /* row,col,prev: output */
+ DDRB = 0xFF;
+ PORTB = 0x40; // unable
+ /* key: input with pull-up */
+ DDRD &= ~0x80;
+ PORTD |= 0x80;
+
+ KEY_UNABLE();
+ KEY_PREV_OFF();
+
+ KEY_POWER_OFF();
+}
+static inline void KEY_SELECT(uint8_t ROW, uint8_t COL)
+{
+ PORTB = (PORTB & 0xC0) | (((COL) & 0x07)<<3) | ((ROW) & 0x07);
+
+}
+
+
+#elif defined(__AVR_AT90USB1286__)
+/*
+ * For Teensy++(AT90USB1286)
+ *
+ * HHKB pro HHKB pro2
+ * row: PB0-2 (6-8) (5-7)
+ * col: PB3-5,6 (9-12) (8-11)
+ * key: PE6(pull-uped) (4) (3)
+ * prev: PE7 (5) (4)
+ *
+ * TODO: convert into 'staitc inline' function
+ */
+#define KEY_INIT() do { \
+ DDRB |= 0x7F; \
+ DDRE |= (1<<7); \
+ DDRE &= ~(1<<6); \
+ PORTE |= (1<<6); \
+} while (0)
+#define KEY_SELECT(ROW, COL) (PORTB = (PORTB & 0xC0) | \
+ (((COL) & 0x07)<<3) | \
+ ((ROW) & 0x07))
+#define KEY_ENABLE() (PORTB &= ~(1<<6))
+#define KEY_UNABLE() (PORTB |= (1<<6))
+#define KEY_STATE() (PINE & (1<<6))
+#define KEY_PREV_ON() (PORTE |= (1<<7))
+#define KEY_PREV_OFF() (PORTE &= ~(1<<7))
+#define KEY_POWER_ON()
+#define KEY_POWER_OFF()
+#define KEY_POWER_STATE() true
+
+
+#else
+# error "define code for matrix scan"
+#endif
+
+
+#if 0
+// For ATMega328P with V-USB
+//
+// #elif defined(__AVR_ATmega328P__)
+// Ports for V-USB
+// key: PB0(pull-uped)
+// prev: PB1
+// row: PB2-4
+// col: PC0-2,3
+// power: PB5(Low:on/Hi-z:off)
+#define KEY_INIT() do { \
+ DDRB |= 0x3E; \
+ DDRB &= ~(1<<0); \
+ PORTB |= 1<<0; \
+ DDRC |= 0x0F; \
+ KEY_UNABLE(); \
+ KEY_PREV_OFF(); \
+} while (0)
+#define KEY_SELECT(ROW, COL) do { \
+ PORTB = (PORTB & 0xE3) | ((ROW) & 0x07)<<2; \
+ PORTC = (PORTC & 0xF8) | ((COL) & 0x07); \
+} while (0)
+#define KEY_ENABLE() (PORTC &= ~(1<<3))
+#define KEY_UNABLE() (PORTC |= (1<<3))
+#define KEY_STATE() (PINB & (1<<0))
+#define KEY_PREV_ON() (PORTB |= (1<<1))
+#define KEY_PREV_OFF() (PORTB &= ~(1<<1))
+// Power supply switching
+#define KEY_POWER_ON() do { \
+ KEY_INIT(); \
+ PORTB &= ~(1<<5); \
+ _delay_ms(1); \
+} while (0)
+#define KEY_POWER_OFF() do { \
+ DDRB &= ~0x3F; \
+ PORTB &= ~0x3F; \
+ DDRC &= ~0x0F; \
+ PORTC &= ~0x0F; \
+} while (0)
+#endif
diff --git a/keyboards/hhkb/ansi/info.json b/keyboards/hhkb/ansi/info.json
new file mode 100644
index 0000000000..a36f1d44c8
--- /dev/null
+++ b/keyboards/hhkb/ansi/info.json
@@ -0,0 +1,73 @@
+{
+ "keyboard_name": "HHKB",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 15,
+ "height": 5,
+ "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": "|", "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": "Delete", "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": "Return", "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": "Fn", "x": 14, "y": 3 },
+ { "label": "", "x": 1.5, "y": 4 },
+ { "label": "", "x": 2.5, "y": 4, "w": 1.5 },
+ { "x": 4, "y": 4, "w": 6 },
+ { "label": "", "x": 10, "y": 4, "w": 1.5 },
+ { "label": "", "x": 11.5, "y": 4 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/hhkb/keymaps/blakedietz/README.md b/keyboards/hhkb/ansi/keymaps/blakedietz/README.md
index 4dff47a6e8..4dff47a6e8 100644
--- a/keyboards/hhkb/keymaps/blakedietz/README.md
+++ b/keyboards/hhkb/ansi/keymaps/blakedietz/README.md
diff --git a/keyboards/hhkb/keymaps/blakedietz/config.h b/keyboards/hhkb/ansi/keymaps/blakedietz/config.h
index e0d2bce0f1..e0d2bce0f1 100644
--- a/keyboards/hhkb/keymaps/blakedietz/config.h
+++ b/keyboards/hhkb/ansi/keymaps/blakedietz/config.h
diff --git a/keyboards/hhkb/keymaps/blakedietz/keymap.c b/keyboards/hhkb/ansi/keymaps/blakedietz/keymap.c
index a9146a4a08..a9146a4a08 100644
--- a/keyboards/hhkb/keymaps/blakedietz/keymap.c
+++ b/keyboards/hhkb/ansi/keymaps/blakedietz/keymap.c
diff --git a/keyboards/hhkb/keymaps/blakedietz/rules.mk b/keyboards/hhkb/ansi/keymaps/blakedietz/rules.mk
index 7d97e7a524..7d97e7a524 100644
--- a/keyboards/hhkb/keymaps/blakedietz/rules.mk
+++ b/keyboards/hhkb/ansi/keymaps/blakedietz/rules.mk
diff --git a/keyboards/hhkb/keymaps/brett/config.h b/keyboards/hhkb/ansi/keymaps/brett/config.h
index b9a61e10a7..b9a61e10a7 100644
--- a/keyboards/hhkb/keymaps/brett/config.h
+++ b/keyboards/hhkb/ansi/keymaps/brett/config.h
diff --git a/keyboards/hhkb/keymaps/brett/keymap.c b/keyboards/hhkb/ansi/keymaps/brett/keymap.c
index 1201146b00..1201146b00 100644
--- a/keyboards/hhkb/keymaps/brett/keymap.c
+++ b/keyboards/hhkb/ansi/keymaps/brett/keymap.c
diff --git a/keyboards/hhkb/keymaps/brett/readme.md b/keyboards/hhkb/ansi/keymaps/brett/readme.md
index fd07b155fb..fd07b155fb 100644
--- a/keyboards/hhkb/keymaps/brett/readme.md
+++ b/keyboards/hhkb/ansi/keymaps/brett/readme.md
diff --git a/keyboards/hhkb/keymaps/brett/rules.mk b/keyboards/hhkb/ansi/keymaps/brett/rules.mk
index 88f57515f1..88f57515f1 100644
--- a/keyboards/hhkb/keymaps/brett/rules.mk
+++ b/keyboards/hhkb/ansi/keymaps/brett/rules.mk
diff --git a/keyboards/hhkb/keymaps/cinaeco/README.md b/keyboards/hhkb/ansi/keymaps/cinaeco/README.md
index c1c48e6093..c1c48e6093 100644
--- a/keyboards/hhkb/keymaps/cinaeco/README.md
+++ b/keyboards/hhkb/ansi/keymaps/cinaeco/README.md
diff --git a/keyboards/hhkb/keymaps/cinaeco/config.h b/keyboards/hhkb/ansi/keymaps/cinaeco/config.h
index c7b4c784c0..c7b4c784c0 100644
--- a/keyboards/hhkb/keymaps/cinaeco/config.h
+++ b/keyboards/hhkb/ansi/keymaps/cinaeco/config.h
diff --git a/keyboards/hhkb/keymaps/cinaeco/keymap.c b/keyboards/hhkb/ansi/keymaps/cinaeco/keymap.c
index c27e37d8a0..c27e37d8a0 100644
--- a/keyboards/hhkb/keymaps/cinaeco/keymap.c
+++ b/keyboards/hhkb/ansi/keymaps/cinaeco/keymap.c
diff --git a/keyboards/hhkb/keymaps/cinaeco/rules.mk b/keyboards/hhkb/ansi/keymaps/cinaeco/rules.mk
index a85669aa2f..a85669aa2f 100644
--- a/keyboards/hhkb/keymaps/cinaeco/rules.mk
+++ b/keyboards/hhkb/ansi/keymaps/cinaeco/rules.mk
diff --git a/keyboards/hhkb/keymaps/dbroqua/keymap.c b/keyboards/hhkb/ansi/keymaps/dbroqua/keymap.c
index e230a87fb2..e230a87fb2 100644
--- a/keyboards/hhkb/keymaps/dbroqua/keymap.c
+++ b/keyboards/hhkb/ansi/keymaps/dbroqua/keymap.c
diff --git a/keyboards/hhkb/keymaps/dbroqua/readme.md b/keyboards/hhkb/ansi/keymaps/dbroqua/readme.md
index 3b8950fee0..3b8950fee0 100644
--- a/keyboards/hhkb/keymaps/dbroqua/readme.md
+++ b/keyboards/hhkb/ansi/keymaps/dbroqua/readme.md
diff --git a/keyboards/hhkb/keymaps/default/keymap.c b/keyboards/hhkb/ansi/keymaps/default/keymap.c
index c63ef6a579..c63ef6a579 100644
--- a/keyboards/hhkb/keymaps/default/keymap.c
+++ b/keyboards/hhkb/ansi/keymaps/default/keymap.c
diff --git a/keyboards/hhkb/keymaps/eric/keymap.c b/keyboards/hhkb/ansi/keymaps/eric/keymap.c
index bf788b2ffd..bf788b2ffd 100644
--- a/keyboards/hhkb/keymaps/eric/keymap.c
+++ b/keyboards/hhkb/ansi/keymaps/eric/keymap.c
diff --git a/keyboards/hhkb/keymaps/dhertz/config.h b/keyboards/hhkb/ansi/keymaps/krusli/config.h
index af2fb9d8a5..af2fb9d8a5 100644
--- a/keyboards/hhkb/keymaps/dhertz/config.h
+++ b/keyboards/hhkb/ansi/keymaps/krusli/config.h
diff --git a/keyboards/hhkb/keymaps/krusli/keymap.c b/keyboards/hhkb/ansi/keymaps/krusli/keymap.c
index af6102f108..af6102f108 100644
--- a/keyboards/hhkb/keymaps/krusli/keymap.c
+++ b/keyboards/hhkb/ansi/keymaps/krusli/keymap.c
diff --git a/keyboards/hhkb/ansi/keymaps/lxol/keymap.c b/keyboards/hhkb/ansi/keymaps/lxol/keymap.c
new file mode 100644
index 0000000000..462a980471
--- /dev/null
+++ b/keyboards/hhkb/ansi/keymaps/lxol/keymap.c
@@ -0,0 +1,200 @@
+/* -*- eval: (turn-on-orgtbl); -*-
+ * lxol HHKB Layout
+ */
+#include QMK_KEYBOARD_H
+
+#define BASE 0
+#define WIN 1
+#define HHKB 2
+#define RGUILEV 3
+#define LGUILEV 4
+#define RALTLEV 5
+#define LALTLEV 6
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* Layer 0: Default Layer
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Contro | A | S | D | F | G | H | J | K | L | ; | ' | RCtl/Ent | | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+
+ |------+------+-------+------+------|
+ | LAlt | LGUI | Space | RGUI | RAlt |
+ |------+------+-------+------+------|
+ */
+
+ [BASE] = LAYOUT( // layer 0 : default
+
+ 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, LT(LALTLEV, KC_A), LT(LGUILEV, KC_S), KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, LT(RGUILEV, KC_L), LT(RALTLEV, KC_SCLN), KC_QUOT, MT(MOD_RCTL, 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(HHKB),
+ KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT),
+
+ /* Layer 1: HHKB mode (HHKB Fn)
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+ | Pwr | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del |
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+ | Caps | | | | | | | | Psc | Slk | Pus | Up | | Backs | |
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+ | | VoD | VoU | Mut | | | * | / | Hom | PgU | Lef | Rig | Enter | | |
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+ | | | | | | | + | - | End | PgD | Dow | | | | |
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+
+ |---+---+---+---+---|
+ | | | | | |
+ |---+---+---+---+---|
+ */
+
+ [HHKB] = LAYOUT(
+ KC_PWR, 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),
+
+ /* Layer LGUI: All keys with RGUI modifier
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+
+ |------+------+-------+------+------|
+ | LAlt | LGUI | Space | RGUI | RAlt |
+ |------+------+-------+------+------|
+ */
+
+ [RGUILEV] = LAYOUT( // Right GUI layer by KC_L
+
+ RGUI(KC_ESC), RGUI(KC_1), RGUI(KC_2), RGUI(KC_3), RGUI(KC_4), RGUI(KC_5), RGUI(KC_6), RGUI(KC_7), RGUI(KC_8), RGUI(KC_9), RGUI(KC_0), RGUI(KC_MINS), RGUI(KC_EQL), RGUI(KC_BSLS), RGUI(KC_GRV),
+ RGUI(KC_TAB), RGUI(KC_Q), RGUI(KC_W), RGUI(KC_E), RGUI(KC_R), RGUI(KC_T), RGUI(KC_Y), RGUI(KC_U), RGUI(KC_I), RGUI(KC_O), RGUI(KC_P), RGUI(KC_LBRC), RGUI(KC_RBRC), RGUI(KC_BSPC),
+ RGUI(KC_LCTL), RGUI(KC_A), RGUI(KC_S), RGUI(KC_D), RGUI(KC_F), RGUI(KC_G), RGUI(KC_H), RGUI(KC_J), RGUI(KC_K), KC_TRNS, KC_TRNS, RGUI(KC_QUOT), MT(MOD_RCTL, KC_ENT),
+ RGUI(KC_LSFT), RGUI(KC_Z), RGUI(KC_X), RGUI(KC_C), RGUI(KC_V), RGUI(KC_B), RGUI(KC_N), RGUI(KC_M), RGUI(KC_COMM), RGUI(KC_DOT), RGUI(KC_SLSH), RGUI(KC_RSFT), KC_TRNS,
+ KC_LALT, KC_LGUI, RGUI(KC_SPC), KC_RGUI, KC_RALT),
+
+ /* Layer LGUI: All keys with LGUI modifier
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+
+ |------+------+-------+------+------|
+ | LAlt | LGUI | Space | LGUI | RAlt |
+ |------+------+-------+------+------|
+ */
+
+ [LGUILEV] = LAYOUT( // Right GUI layer by KC_L
+
+ LGUI(KC_ESC), LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), LGUI(KC_4), LGUI(KC_5), LGUI(KC_6), LGUI(KC_7), LGUI(KC_8), LGUI(KC_9), LGUI(KC_0), LGUI(KC_MINS), LGUI(KC_EQL), LGUI(KC_BSLS), LGUI(KC_GRV),
+ LGUI(KC_TAB), LGUI(KC_Q), LGUI(KC_W), LGUI(KC_E), LGUI(KC_R), LGUI(KC_T), LGUI(KC_Y), LGUI(KC_U), LGUI(KC_I), LGUI(KC_O), LGUI(KC_P), LGUI(KC_LBRC), LGUI(KC_RBRC), LGUI(KC_BSPC),
+ LGUI(KC_LCTL), KC_TRNS, KC_TRNS, LGUI(KC_D), LGUI(KC_F), LGUI(KC_G), LGUI(KC_H), LGUI(KC_J), LGUI(KC_K), LGUI(KC_L), LGUI(KC_SCLN), LGUI(KC_QUOT), MT(MOD_RCTL, KC_ENT),
+ KC_LSFT, LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V), LGUI(KC_B), LGUI(KC_N), LGUI(KC_M), LGUI(KC_COMM), LGUI(KC_DOT), LGUI(KC_SLSH), KC_RSFT, KC_TRNS,
+ KC_LALT, KC_LGUI, LGUI(KC_SPC), KC_LGUI, KC_RALT),
+
+ /* Layer LALT: All keys with RALT modifier
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+
+ |------+------+-------+------+------|
+ | LAlt | LGUI | Space | RGUI | RAlt |
+ |------+------+-------+------+------|
+ */
+
+ [RALTLEV] = LAYOUT( // Right ALT layer by KC_L
+
+ RALT(KC_ESC), RALT(KC_1), RALT(KC_2), RALT(KC_3), RALT(KC_4), RALT(KC_5), RALT(KC_6), RALT(KC_7), RALT(KC_8), RALT(KC_9), RALT(KC_0), RALT(KC_MINS), RALT(KC_EQL), RALT(KC_BSLS), RALT(KC_GRV),
+ RALT(KC_TAB), RALT(KC_Q), RALT(KC_W), RALT(KC_E), RALT(KC_R), RALT(KC_T), RALT(KC_Y), RALT(KC_U), RALT(KC_I), RALT(KC_O), RALT(KC_P), RALT(KC_LBRC), RALT(KC_RBRC), RALT(KC_BSPC),
+ RALT(KC_LCTL), RALT(KC_A), RALT(KC_S), RALT(KC_D), RALT(KC_F), RALT(KC_G), RALT(KC_H), RALT(KC_J), RALT(KC_K), KC_TRNS, KC_TRNS, RALT(KC_QUOT), MT(MOD_RCTL, KC_ENT),
+ RALT(KC_LSFT), RALT(KC_Z), RALT(KC_X), RALT(KC_C), RALT(KC_V), RALT(KC_B), RALT(KC_N), RALT(KC_M), RALT(KC_COMM), RALT(KC_DOT), RALT(KC_SLSH), RALT(KC_RSFT), KC_TRNS,
+ KC_LALT, KC_LGUI, RALT(KC_SPC), KC_RGUI, KC_RALT),
+
+ /* Layer LALT: All keys with LALT modifier
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+ | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | |
+ |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
+
+ |------+------+-------+------+------|
+ | LAlt | LGUI | Space | LGUI | RAlt |
+ |------+------+-------+------+------|
+ */
+
+ [LALTLEV] = LAYOUT( // Right ALT layer by KC_L
+
+ LALT(KC_ESC), LALT(KC_1), LALT(KC_2), LALT(KC_3), LALT(KC_4), LALT(KC_5), LALT(KC_6), LALT(KC_7), LALT(KC_8), LALT(KC_9), LALT(KC_0), LALT(KC_MINS), LALT(KC_EQL), LALT(KC_BSLS), LALT(KC_GRV),
+ LALT(KC_TAB), LALT(KC_Q), LALT(KC_W), LALT(KC_E), LALT(KC_R), LALT(KC_T), LALT(KC_Y), LALT(KC_U), LALT(KC_I), LALT(KC_O), LALT(KC_P), LALT(KC_LBRC), LALT(KC_RBRC), LALT(KC_BSPC),
+ LALT(KC_LCTL), KC_TRNS, KC_TRNS, LALT(KC_D), LALT(KC_F), LALT(KC_G), LALT(KC_H), LALT(KC_J), LALT(KC_K), LALT(KC_L), LALT(KC_SCLN), LALT(KC_QUOT), MT(MOD_RCTL, KC_ENT),
+ KC_LSFT, LALT(KC_Z), LALT(KC_X), LALT(KC_C), LALT(KC_V), LALT(KC_B), LALT(KC_N), LALT(KC_M), LALT(KC_COMM), LALT(KC_DOT), LALT(KC_SLSH), KC_RSFT, KC_TRNS,
+ KC_LALT, KC_LGUI, LALT(KC_SPC), KC_LGUI, KC_RALT),
+
+ /* Layer WIN: Win layer
+ |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---|
+ | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
+ |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---|
+ | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
+ |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---|
+ | Contro | A | S | D | F | G | H | J | K | L | ; | ' | RCtl/Ent | | |
+ |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---|
+ | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Fn0 | | |
+ |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---|
+
+ |------+------+-------+------+------|
+ | LGui | LAlt | Space | RGui | Ralt |
+ |------+------+-------+------+------|
+ */
+
+ [WIN] = LAYOUT( // BASE level with swapped GUI/ALT
+
+ 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, LT(LGUILEV, KC_A), LT(LALTLEV, KC_S), KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, LT(RALTLEV, KC_L), LT(RGUILEV, KC_SCLN), KC_QUOT, MT(MOD_RCTL, 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(HHKB),
+ KC_RGUI, KC_RALT, KC_SPC, KC_RALT, KC_RGUI)};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch (id)
+ {
+ case 0:
+ if (record->event.pressed)
+ {
+ register_code(KC_RSFT);
+ }
+ else
+ {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
diff --git a/keyboards/hhkb/keymaps/mjt/config.h b/keyboards/hhkb/ansi/keymaps/mjt/config.h
index 3b8f2e676c..3b8f2e676c 100644
--- a/keyboards/hhkb/keymaps/mjt/config.h
+++ b/keyboards/hhkb/ansi/keymaps/mjt/config.h
diff --git a/keyboards/hhkb/ansi/keymaps/mjt/keymap.c b/keyboards/hhkb/ansi/keymaps/mjt/keymap.c
new file mode 100644
index 0000000000..b62676edd9
--- /dev/null
+++ b/keyboards/hhkb/ansi/keymaps/mjt/keymap.c
@@ -0,0 +1,112 @@
+/* -*- eval: (turn-on-orgtbl); -*-
+ * default HHKB Layout
+ */
+#include QMK_KEYBOARD_H
+
+#define BASE 0
+#define HHKB 1
+#define FUNK 2
+#define DYN 3
+#define CTL_ESC CTL_T(KC_ESC)
+#define MACSLEEP LCTL(LSFT(KC_POWER))
+
+enum hhkb_keycodes
+{
+ QWERTY = SAFE_RANGE,
+ DYNKEY,
+ DYNAMIC_MACRO_RANGE,
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* BASE Level: Default Layer
+ |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
+ | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
+ |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
+ | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
+ |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
+ | Cont | A | S | D | F | G | H | J | K | L | ; | ' | Ent | | |
+ |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
+ | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Fn0 | | |
+ |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
+
+ |------+------+-----------------------+------+------|
+ | LAlt | LGUI | ******* Space ******* | RGUI | RAlt |
+ |------+------+-----------------------+------+------|
+ */
+
+ [BASE] = LAYOUT( // default layer
+ 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_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,
+ 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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), TT(FUNK),
+ KC_LALT, KC_LGUI, /* */ KC_SPC, MO(DYN), KC_RALT),
+
+ /* Layer HHKB: HHKB mode (HHKB Fn)
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+ | Pwr | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del |
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+ | Caps | | | | | | | | Psc | Slk | Pus | Up | | Backs | |
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+ | | VoD | VoU | Mut | | | * | / | Hom | PgU | Lef | Rig | Enter | | |
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+ | | | | | | | + | - | End | PgD | Dow | | | | |
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+
+ |------+------+----------------------+------+------+
+ | **** | **** | ******************** | **** | **** |
+ |------+------+----------------------+------+------+
+
+
+
+ [HHKB] = LAYOUT(
+ KC_PWR, 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),
+
+ */
+ [FUNK] = LAYOUT(
+ KC_PWR, 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_UP, 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_LEFT, KC_DOWN, KC_RGHT, 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),
+ [DYN] = LAYOUT(
+ KC_TRNS, DYN_REC_START1, DYN_REC_START2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2,
+ 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_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MACSLEEP, KC_HOME, 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_PGDN, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, DYN_REC_STOP, KC_TRNS, KC_TRNS)};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch (id)
+ {
+ case 0:
+ if (record->event.pressed)
+ {
+ register_code(KC_RSFT);
+ }
+ else
+ {
+ unregister_code(KC_RSFT);
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record)
+{
+ uint16_t macro_kc = (keycode == MO(DYN) ? DYN_REC_STOP : keycode);
+ if (!process_dynamic_macro(macro_kc, record))
+ {
+ return false;
+ }
+
+ return true;
+}
diff --git a/keyboards/hhkb/keymaps/mjt/readme.md b/keyboards/hhkb/ansi/keymaps/mjt/readme.md
index ff575ce247..ff575ce247 100644
--- a/keyboards/hhkb/keymaps/mjt/readme.md
+++ b/keyboards/hhkb/ansi/keymaps/mjt/readme.md
diff --git a/keyboards/hhkb/ansi/keymaps/mjt/rules.mk b/keyboards/hhkb/ansi/keymaps/mjt/rules.mk
new file mode 100644
index 0000000000..9e6797ed30
--- /dev/null
+++ b/keyboards/hhkb/ansi/keymaps/mjt/rules.mk
@@ -0,0 +1 @@
+DYNAMIC_MACRO_ENABLE = yes
diff --git a/keyboards/hhkb/keymaps/schaeferdev/README.md b/keyboards/hhkb/ansi/keymaps/schaeferdev/README.md
index 15b87c498d..15b87c498d 100644
--- a/keyboards/hhkb/keymaps/schaeferdev/README.md
+++ b/keyboards/hhkb/ansi/keymaps/schaeferdev/README.md
diff --git a/keyboards/hhkb/keymaps/schaeferdev/config.h b/keyboards/hhkb/ansi/keymaps/schaeferdev/config.h
index b3c799bb82..b3c799bb82 100644
--- a/keyboards/hhkb/keymaps/schaeferdev/config.h
+++ b/keyboards/hhkb/ansi/keymaps/schaeferdev/config.h
diff --git a/keyboards/hhkb/keymaps/schaeferdev/keymap.c b/keyboards/hhkb/ansi/keymaps/schaeferdev/keymap.c
index ea6da450cf..ea6da450cf 100644
--- a/keyboards/hhkb/keymaps/schaeferdev/keymap.c
+++ b/keyboards/hhkb/ansi/keymaps/schaeferdev/keymap.c
diff --git a/keyboards/hhkb/keymaps/schaeferdev/rules.mk b/keyboards/hhkb/ansi/keymaps/schaeferdev/rules.mk
index 35591533cc..35591533cc 100644
--- a/keyboards/hhkb/keymaps/schaeferdev/rules.mk
+++ b/keyboards/hhkb/ansi/keymaps/schaeferdev/rules.mk
diff --git a/keyboards/hhkb/keymaps/shela/action_pseudo_lut.c b/keyboards/hhkb/ansi/keymaps/shela/action_pseudo_lut.c
index a15f5e5e0b..a15f5e5e0b 100644
--- a/keyboards/hhkb/keymaps/shela/action_pseudo_lut.c
+++ b/keyboards/hhkb/ansi/keymaps/shela/action_pseudo_lut.c
diff --git a/keyboards/hhkb/keymaps/shela/action_pseudo_lut.h b/keyboards/hhkb/ansi/keymaps/shela/action_pseudo_lut.h
index 681252440f..681252440f 100644
--- a/keyboards/hhkb/keymaps/shela/action_pseudo_lut.h
+++ b/keyboards/hhkb/ansi/keymaps/shela/action_pseudo_lut.h
diff --git a/keyboards/hhkb/keymaps/shela/config.h b/keyboards/hhkb/ansi/keymaps/shela/config.h
index 08cc1fb46e..08cc1fb46e 100644
--- a/keyboards/hhkb/keymaps/shela/config.h
+++ b/keyboards/hhkb/ansi/keymaps/shela/config.h
diff --git a/keyboards/hhkb/ansi/keymaps/shela/keymap.c b/keyboards/hhkb/ansi/keymaps/shela/keymap.c
new file mode 100644
index 0000000000..3971e8f945
--- /dev/null
+++ b/keyboards/hhkb/ansi/keymaps/shela/keymap.c
@@ -0,0 +1,186 @@
+/*
+ * HHKB Pro 2 US Layout for shela
+ */
+#include QMK_KEYBOARD_H
+#include "keymap_jis2us.h"
+#include "action_pseudo_lut.h"
+
+enum keymap_layout
+{
+ BASE = 0,
+ PSEUDO_US,
+ DVORAK,
+ MOUSE,
+ TENKEY,
+ HHKB,
+ SPACE_FN,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* Layer 0: Default Layer
+ * ,-----------------------------------------------------------------------------------------.
+ * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | ` | BSp |
+ * |-----------------------------------------------------------------------------------------|
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
+ * |-----------------------------------------------------------------------------------------|
+ * | Control | A | S | D | F | G | H | J | K | L | ; | ' | Enter |
+ * |-----------------------------------------------------------------------------------------|
+ * | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Fn0 |
+ * `-----------------------------------------------------------------------------------------'
+ * |LAlt | LGui | SpaceFN | RGui |RAlt |
+ * `-----------------------------------------------------------------'
+ */
+ [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_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_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,
+ OSM(MOD_LSFT), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(HHKB),
+ KC_LALT, KC_LGUI, LT(SPACE_FN, KC_SPACE), KC_RGUI, KC_RALT),
+
+ /* Layer 1: Pseudo US Layout Layer
+ * ,-----------------------------------------------------------------------------------------.
+ * | Esc | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | BSp |
+ * |-----------------------------------------------------------------------------------------|
+ * | Tab | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 |
+ * |-----------------------------------------------------------------------------------------|
+ * | Control | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Enter |
+ * |-----------------------------------------------------------------------------------------|
+ * | Shift | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Shift | Fn0 |
+ * `-----------------------------------------------------------------------------------------'
+ * |LGui | Fn3 | SpaceFN | Fn4 |RGui |
+ * `-----------------------------------------------------------------'
+ */
+ [PSEUDO_US] =
+ LAYOUT(KC_ESC, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_BSPC,
+ KC_TAB, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1,
+ KC_LCTL, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_ENT,
+ KC_LSFT, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_RSFT, MO(HHKB),
+ KC_LGUI, MT(MOD_LALT, KC_MHEN), LT(SPACE_FN, KC_SPACE), MT(MOD_RALT, KC_KANA), KC_RGUI),
+
+ /* Layer 2: Dvorak Layer
+ * ,-----------------------------------------------------------------------------------------.
+ * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | [ | ] | ` | BSp |
+ * |-----------------------------------------------------------------------------------------|
+ * | Tab | ' | , | . | P | Y | F | G | C | R | L | / | = | \ |
+ * |-----------------------------------------------------------------------------------------|
+ * | Control | A | O | E | U | I | D | H | T | N | S | - | Enter |
+ * |-----------------------------------------------------------------------------------------|
+ * | Shift | ; | Q | J | K | X | B | M | W | V | Z | Shift | Fn0 |
+ * `-----------------------------------------------------------------------------------------'
+ * |LAlt | LGui | SpaceFN | RGui |RAlt |
+ * `-----------------------------------------------------------------'
+ */
+ [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_LBRC, KC_RBRC, KC_GRV, 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_EQL, KC_BSLS,
+ 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_ENT,
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, MO(HHKB),
+ KC_LALT, KC_LGUI, LT(SPACE_FN, KC_SPACE), KC_RGUI, KC_RALT),
+
+ /* Layer 3: Mouse layer
+ * ,-----------------------------------------------------------------------------------------.
+ * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | |
+ * |-----------------------------------------------------------------------------------------|
+ * | | | | | | | MwL | MwD | MwU | MwR | | | | |
+ * |-----------------------------------------------------------------------------------------|
+ * | | | | | | | McL | McD | McU | McR | | | |
+ * |-----------------------------------------------------------------------------------------|
+ * | | | | | | | Mb1 | Mb2 | Mb3 | | | | Fn0 |
+ * `-----------------------------------------------------------------------------------------'
+ * | | | Mb1 | | |
+ * `-----------------------------------------------------------------'
+ */
+ [MOUSE] =
+ 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_NO, KC_TRNS,
+ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_NO, KC_NO, KC_TRNS,
+ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_BTN1, KC_BTN2, KC_BTN3, KC_NO, KC_NO, KC_TRNS, MO(HHKB),
+ KC_TRNS, KC_TRNS, KC_BTN1, KC_TRNS, KC_TRNS),
+
+ /* Layer 4: Tenkey layer
+ * ,-----------------------------------------------------------------------------------------.
+ * | Esc | | | | | | | | | | / | * | - | | BSp |
+ * |-----------------------------------------------------------------------------------------|
+ * | | | | | | | | | | 7 | 8 | 9 | + | |
+ * |-----------------------------------------------------------------------------------------|
+ * | | | | | | | | | | 4 | 5 | 6 | Enter |
+ * |-----------------------------------------------------------------------------------------|
+ * | | | | | | | | | 1 | 2 | 3 | + | Fn0 |
+ * `-----------------------------------------------------------------------------------------'
+ * | | | SpaceFN | 0 | . |
+ * `-----------------------------------------------------------------'
+ */
+ [TENKEY] =
+ LAYOUT(KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PSLS, KC_PAST, KC_PMNS, KC_NO, KC_BSPC,
+ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, KC_NO,
+ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_KP_4, KC_KP_5, KC_KP_6, KC_PENT,
+ KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_KP_1, KC_KP_2, KC_KP_3, KC_PPLS, MO(HHKB),
+ KC_TRNS, KC_TRNS, LT(SPACE_FN, KC_SPACE), KC_KP_0, KC_PDOT),
+
+ /* Layer 5: HHKB mode (HHKB Fn)
+ * ,-----------------------------------------------------------------------------------------.
+ * | Pwr | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del |
+ * |-----------------------------------------------------------------------------------------|
+ * | Caps | Fn5 | Fn6 | Fn7 | Fn8 | Fn9 | | | Psc | Slk | Pus | Up | | BSp |
+ * |-----------------------------------------------------------------------------------------|
+ * | | VoD | VoU | Mut | | | * | / | Hom | PgU | Lef | Rig | Enter |
+ * |-----------------------------------------------------------------------------------------|
+ * | | | | | | | + | - | End | PgD | Dow | | |
+ * `-----------------------------------------------------------------------------------------'
+ * | | | | | |
+ * `-----------------------------------------------------------------'
+ */
+ [HHKB] =
+ LAYOUT(KC_PWR, 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, DF(BASE), DF(PSEUDO_US), DF(MOUSE), DF(TENKEY), DF(DVORAK), 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),
+
+ /* Layer 6: SpaceFN
+ * ,-----------------------------------------------------------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | Del |
+ * |-----------------------------------------------------------------------------------------|
+ * | | Hom | Up | End | | | | Hom | End | | Psc | Slk | Pau | Ins |
+ * |-----------------------------------------------------------------------------------------|
+ * | | Lef | Dow | Rig | PgU | | Lef | Dow | Up | Rig | | | |
+ * |-----------------------------------------------------------------------------------------|
+ * | | | | PgD | | Spc | | PgD | PgU | | | | |
+ * `-----------------------------------------------------------------------------------------'
+ * | | | | | |
+ * `-----------------------------------------------------------------'
+ */
+ [SPACE_FN] =
+ LAYOUT(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_NO, KC_DEL,
+ KC_TRNS, KC_HOME, KC_UP, KC_END, KC_NO, KC_NO, KC_NO, KC_HOME, KC_END, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS,
+ KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGUP, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, KC_NO, KC_TRNS,
+ KC_TRNS, KC_NO, KC_NO, KC_PGDN, KC_NO, KC_SPC, KC_NO, KC_PGDN, KC_PGUP, KC_NO, KC_NO, KC_TRNS, KC_NO,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+};
+
+/*
+ * user defined action function
+ */
+enum function_id
+{
+ PSEUDO_US_FUNCTION,
+};
+
+void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+
+ switch (id)
+ {
+ case PSEUDO_US_FUNCTION:
+ action_pseudo_lut(record, BASE, keymap_jis2us);
+ break;
+ }
+}
+
+/*
+ * Fn action definition
+ */
+const uint16_t PROGMEM fn_actions[] = {
+ [1] = ACTION_FUNCTION(PSEUDO_US_FUNCTION),
+};
diff --git a/keyboards/hhkb/keymaps/shela/keymap_jis2us.h b/keyboards/hhkb/ansi/keymaps/shela/keymap_jis2us.h
index edc1e6d869..edc1e6d869 100644
--- a/keyboards/hhkb/keymaps/shela/keymap_jis2us.h
+++ b/keyboards/hhkb/ansi/keymaps/shela/keymap_jis2us.h
diff --git a/keyboards/hhkb/keymaps/shela/readme.md b/keyboards/hhkb/ansi/keymaps/shela/readme.md
index 5a06a83632..5a06a83632 100644
--- a/keyboards/hhkb/keymaps/shela/readme.md
+++ b/keyboards/hhkb/ansi/keymaps/shela/readme.md
diff --git a/keyboards/hhkb/keymaps/shela/rules.mk b/keyboards/hhkb/ansi/keymaps/shela/rules.mk
index d0586bda68..d0586bda68 100644
--- a/keyboards/hhkb/keymaps/shela/rules.mk
+++ b/keyboards/hhkb/ansi/keymaps/shela/rules.mk
diff --git a/keyboards/hhkb/keymaps/smt/keymap.c b/keyboards/hhkb/ansi/keymaps/smt/keymap.c
index e1d8bae2e4..e1d8bae2e4 100644
--- a/keyboards/hhkb/keymaps/smt/keymap.c
+++ b/keyboards/hhkb/ansi/keymaps/smt/keymap.c
diff --git a/keyboards/hhkb/keymaps/tobiasvl_iso/keymap.c b/keyboards/hhkb/ansi/keymaps/tobiasvl_iso/keymap.c
index 68e23b45df..68e23b45df 100644
--- a/keyboards/hhkb/keymaps/tobiasvl_iso/keymap.c
+++ b/keyboards/hhkb/ansi/keymaps/tobiasvl_iso/keymap.c
diff --git a/keyboards/hhkb/keymaps/tobiasvl_iso/readme.md b/keyboards/hhkb/ansi/keymaps/tobiasvl_iso/readme.md
index 0da9d96ee4..0da9d96ee4 100644
--- a/keyboards/hhkb/keymaps/tobiasvl_iso/readme.md
+++ b/keyboards/hhkb/ansi/keymaps/tobiasvl_iso/readme.md
diff --git a/keyboards/hhkb/keymaps/tominabox1/.gitignore b/keyboards/hhkb/ansi/keymaps/tominabox1/.gitignore
index 4b8c99bfb8..4b8c99bfb8 100644
--- a/keyboards/hhkb/keymaps/tominabox1/.gitignore
+++ b/keyboards/hhkb/ansi/keymaps/tominabox1/.gitignore
diff --git a/keyboards/hhkb/keymaps/tominabox1/keymap.c b/keyboards/hhkb/ansi/keymaps/tominabox1/keymap.c
index d7aea97736..d7aea97736 100644
--- a/keyboards/hhkb/keymaps/tominabox1/keymap.c
+++ b/keyboards/hhkb/ansi/keymaps/tominabox1/keymap.c
diff --git a/keyboards/hhkb/ansi/keymaps/via/keymap.c b/keyboards/hhkb/ansi/keymaps/via/keymap.c
new file mode 100644
index 0000000000..bdbd32898a
--- /dev/null
+++ b/keyboards/hhkb/ansi/keymaps/via/keymap.c
@@ -0,0 +1,68 @@
+#include QMK_KEYBOARD_H
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ /* BASE Level: Default Layer
+ |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
+ | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
+ |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
+ | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
+ |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
+ | Cont | A | S | D | F | G | H | J | K | L | ; | ' | Ent | | |
+ |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
+ | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Fn0 | | |
+ |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
+
+ |------+------+-----------------------+------+------|
+ | LAlt | LGUI | ******* Space ******* | RGUI | RAlt |
+ |------+------+-----------------------+------+------|
+ */
+
+ [0] = LAYOUT( // default layer
+ 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, MO(1),
+ KC_LALT, KC_LGUI, /* */ KC_SPC, KC_RGUI, KC_RALT
+ ),
+
+ /* Layer HHKB: HHKB mode (HHKB Fn)
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+ | Pwr | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del |
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+ | Caps | | | | | | | | Psc | Slk | Pus | Up | | Backs | |
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+ | | VoD | VoU | Mut | | | * | / | Hom | PgU | Lef | Rig | Enter | | |
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+ | | | | | | | + | - | End | PgD | Dow | | | | |
+ |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
+
+ |------+------+----------------------+------+------+
+ | **** | **** | ******************** | **** | **** |
+ |------+------+----------------------+------+------+
+
+ */
+
+ [1] = LAYOUT(
+ KC_PWR, 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
+ ),
+ [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_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
+ )
+};
diff --git a/keyboards/hhkb/ansi/keymaps/via/rules.mk b/keyboards/hhkb/ansi/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/hhkb/ansi/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/hhkb/keymaps/xyverz/keymap.c b/keyboards/hhkb/ansi/keymaps/xyverz/keymap.c
index eebaede979..eebaede979 100644
--- a/keyboards/hhkb/keymaps/xyverz/keymap.c
+++ b/keyboards/hhkb/ansi/keymaps/xyverz/keymap.c
diff --git a/keyboards/hhkb/ansi/matrix.c b/keyboards/hhkb/ansi/matrix.c
new file mode 100644
index 0000000000..f22e69f6b0
--- /dev/null
+++ b/keyboards/hhkb/ansi/matrix.c
@@ -0,0 +1,211 @@
+/*
+Copyright 2011 Jun Wako <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
+*/
+
+/*
+ * scan matrix
+ */
+#include <stdint.h>
+#include <stdbool.h>
+#include <util/delay.h>
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "timer.h"
+#include "matrix.h"
+#include "hhkb_avr.h"
+#include <avr/wdt.h>
+#include "suspend.h"
+#include "lufa.h"
+
+
+// matrix power saving
+#define MATRIX_POWER_SAVE 10000
+static uint32_t matrix_last_modified = 0;
+
+// matrix state buffer(1:on, 0:off)
+static matrix_row_t *matrix;
+static matrix_row_t *matrix_prev;
+static matrix_row_t _matrix0[MATRIX_ROWS];
+static matrix_row_t _matrix1[MATRIX_ROWS];
+
+
+inline
+uint8_t matrix_rows(void)
+{
+ return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void)
+{
+ return MATRIX_COLS;
+}
+
+void matrix_init(void)
+{
+#ifdef DEBUG
+ debug_enable = true;
+ debug_keyboard = true;
+#endif
+
+ KEY_INIT();
+
+ // initialize matrix state: all keys off
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00;
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00;
+ matrix = _matrix0;
+ matrix_prev = _matrix1;
+}
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {
+}
+
+void matrix_scan_kb(void) {
+ matrix_scan_user();
+}
+
+uint8_t matrix_scan(void)
+{
+ uint8_t *tmp;
+
+ tmp = matrix_prev;
+ matrix_prev = matrix;
+ matrix = tmp;
+
+ // power on
+ if (!KEY_POWER_STATE()) KEY_POWER_ON();
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ KEY_SELECT(row, col);
+ _delay_us(5);
+
+ // Not sure this is needed. This just emulates HHKB controller's behaviour.
+ if (matrix_prev[row] & (1<<col)) {
+ KEY_PREV_ON();
+ }
+ _delay_us(10);
+
+ // NOTE: KEY_STATE is valid only in 20us after KEY_ENABLE.
+ // If V-USB interrupts in this section we could lose 40us or so
+ // and would read invalid value from KEY_STATE.
+ uint8_t last = TIMER_RAW;
+
+ KEY_ENABLE();
+
+ // Wait for KEY_STATE outputs its value.
+ // 1us was ok on one HHKB, but not worked on another.
+ // no wait doesn't work on Teensy++ with pro(1us works)
+ // no wait does work on tmk PCB(8MHz) with pro2
+ // 1us wait does work on both of above
+ // 1us wait doesn't work on tmk(16MHz)
+ // 5us wait does work on tmk(16MHz)
+ // 5us wait does work on tmk(16MHz/2)
+ // 5us wait does work on tmk(8MHz)
+ // 10us wait does work on Teensy++ with pro
+ // 10us wait does work on 328p+iwrap with pro
+ // 10us wait doesn't work on tmk PCB(8MHz) with pro2(very lagged scan)
+ _delay_us(5);
+
+ if (KEY_STATE()) {
+ matrix[row] &= ~(1<<col);
+ } else {
+ matrix[row] |= (1<<col);
+ }
+
+ // Ignore if this code region execution time elapses more than 20us.
+ // MEMO: 20[us] * (TIMER_RAW_FREQ / 1000000)[count per us]
+ // MEMO: then change above using this rule: a/(b/c) = a*1/(b/c) = a*(c/b)
+ if (TIMER_DIFF_RAW(TIMER_RAW, last) > 20/(1000000/TIMER_RAW_FREQ)) {
+ matrix[row] = matrix_prev[row];
+ }
+
+ _delay_us(5);
+ KEY_PREV_OFF();
+ KEY_UNABLE();
+
+ // NOTE: KEY_STATE keep its state in 20us after KEY_ENABLE.
+ // This takes 25us or more to make sure KEY_STATE returns to idle state.
+
+ _delay_us(75);
+
+ }
+ if (matrix[row] ^ matrix_prev[row]) matrix_last_modified = timer_read32();
+ }
+ // power off
+ if (KEY_POWER_STATE() &&
+ (USB_DeviceState == DEVICE_STATE_Suspended ||
+ USB_DeviceState == DEVICE_STATE_Unattached ) &&
+ timer_elapsed32(matrix_last_modified) > MATRIX_POWER_SAVE) {
+ KEY_POWER_OFF();
+ suspend_power_down();
+ }
+
+ matrix_scan_quantum();
+
+ return 1;
+}
+
+bool matrix_is_modified(void)
+{
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ if (matrix[i] != matrix_prev[i])
+ return true;
+ }
+ return false;
+}
+
+inline
+bool matrix_has_ghost(void)
+{
+ return false;
+}
+
+inline
+bool matrix_is_on(uint8_t row, uint8_t col)
+{
+ return (matrix[row] & (1<<col));
+}
+
+inline
+matrix_row_t matrix_get_row(uint8_t row)
+{
+ return matrix[row];
+}
+
+void matrix_print(void)
+{
+ print("\nr/c 01234567\n");
+ for (uint8_t row = 0; row < matrix_rows(); row++) {
+ xprintf("%02X: %08b\n", row, bitrev(matrix_get_row(row)));
+ }
+}
+
+uint8_t matrix_key_count(void) {
+ uint8_t count = 0;
+ for (int8_t r = MATRIX_ROWS - 1; r >= 0; --r) {
+ count += bitpop16(matrix_get_row(r));
+ }
+ return count;
+}
+
+void matrix_power_up(void) {
+ KEY_POWER_ON();
+}
+void matrix_power_down(void) {
+ KEY_POWER_OFF();
+}
diff --git a/keyboards/hhkb/ansi/readme.md b/keyboards/hhkb/ansi/readme.md
new file mode 100644
index 0000000000..495aa4c3f7
--- /dev/null
+++ b/keyboards/hhkb/ansi/readme.md
@@ -0,0 +1,14 @@
+HHKB Alternate Controller
+===
+
+An alternative controler for the HHKB designed by hasu.
+
+Keyboard Maintainer: QMK Community
+Hardware Supported: HHKB Alternate Controller
+Hardware Availability: https://geekhack.org/index.php?topic=12047.0
+
+Make example for this keyboard (after setting up your build environment):
+
+ make hhkb/ansi:default
+
+See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
diff --git a/keyboards/hhkb/ansi/rules.mk b/keyboards/hhkb/ansi/rules.mk
new file mode 100644
index 0000000000..a367ef48d1
--- /dev/null
+++ b/keyboards/hhkb/ansi/rules.mk
@@ -0,0 +1,71 @@
+# 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
+# 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 = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+CUSTOM_MATRIX = yes # Custom matrix file for the HHKB
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+# SLEEP_LED_ENABLE = yes # 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 = yes # Enable keyboard backlight functionality
+# MIDI_ENABLE = yes # MIDI controls
+# UNICODE_ENABLE = yes # Unicode
+# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
+
+
+# HHKB_RN42_ENABLE = yes # Enable support for hasu's BT alt controller -- code borrowed from tmk source tree.
+
+# Either uncomment the HHKB_RN42_ENABLE line above, or run make enabling the
+# feature. Be sure to clean any existing build before trying to enable rn42
+# support. For example:
+#
+# make hhkb-keymap-clean
+# make hhkb-keymap-dfu HHKB_RN42_ENABLE=yes
+
+# project specific files
+SRC = matrix.c
+
+ifeq ($(strip $(HHKB_RN42_ENABLE)), yes)
+
+OPT_DEFS += -DHHKB_RN42_ENABLE
+
+# Support for the RN42 Bluetooth module. This is the BT module in Hasu's BT
+# HHKB Alt controller.
+RN42_DIR = ../rn42
+
+SRC += serial_uart.c \
+ ../rn42/suart.S \
+ ../rn42/rn42.c \
+ ../rn42/rn42_task.c \
+ ../rn42/battery.c \
+ ../rn42/main.c
+
+VPATH += $(RN42_DIR)
+
+endif
+
+
+# debug-on: EXTRAFLAGS += -DDEBUG -DDEBUG_ACTION
+# debug-on: all
+
+# 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/hhkb/config.h b/keyboards/hhkb/config.h
deleted file mode 100644
index fc747a6e94..0000000000
--- a/keyboards/hhkb/config.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
-Copyright 2012 Jun Wako <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef CONFIG_H
-#define CONFIG_H
-
-#include "config_common.h"
-
-/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0xCAFE
-#define DEVICE_VER 0x0104
-#define MANUFACTURER q.m.k
-#define PRODUCT HHKB mod
-#define DESCRIPTION q.m.k keyboard firmware for HHKB
-
-/* key matrix size */
-#ifdef HHKB_JP
-# define MATRIX_ROWS 16
-#else
-# define MATRIX_ROWS 8
-#endif
-#define MATRIX_COLS 8
-
-#define TAPPING_TERM 200
-
-/* 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 HHKB_RN42_ENABLE
-// rn42 support -- acquired from the tmk repo. This is almost certainly not
-// integrated with qmk in the correct way.
-
-#define SUART_OUT_PORT PORTD
-#define SUART_OUT_BIT 0
-#define SUART_IN_PIN PIND
-#define SUART_IN_BIT 1
-
-#ifdef __AVR_ATmega32U4__
- /* iom32u4.h has no definition of UCSR1D. copy from iom32u2.h */
- #define UCSR1D _SFR_MEM8(0xCB)
- #define RTSEN 0
- #define CTSEN 1
-
- #define SERIAL_UART_BAUD 115200
- #define SERIAL_UART_DATA UDR1
- #define SERIAL_UART_UBRR ((F_CPU/(16.0*SERIAL_UART_BAUD)-1+0.5))
- #define SERIAL_UART_RXD_VECT USART1_RX_vect
- #define SERIAL_UART_TXD_READY (UCSR1A&(1<<UDRE1))
- #define SERIAL_UART_INIT() do { \
- UBRR1L = (uint8_t) SERIAL_UART_UBRR; /* baud rate */ \
- UBRR1H = ((uint16_t)SERIAL_UART_UBRR>>8); /* baud rate */ \
- UCSR1B |= (1<<RXCIE1) | (1<<RXEN1); /* RX interrupt, RX: enable */ \
- UCSR1B |= (0<<TXCIE1) | (1<<TXEN1); /* TX interrupt, TX: enable */ \
- UCSR1C |= (0<<UPM11) | (0<<UPM10); /* parity: none(00), even(01), odd(11) */ \
- UCSR1D |= (0<<RTSEN) | (0<<CTSEN); /* RTS, CTS(no flow control by hardware) */ \
- DDRD |= (1<<5); PORTD &= ~(1<<5); /* RTS for flow control by firmware */ \
- sei(); \
- } while(0)
- #define SERIAL_UART_RTS_LO() do { PORTD &= ~(1<<5); } while (0)
- #define SERIAL_UART_RTS_HI() do { PORTD |= (1<<5); } while (0)
-#else
- #error "USART configuration is needed."
-#endif
-
-/* power control of key switch board */
-#define HHKB_POWER_SAVING
-
-#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
-
-#endif
diff --git a/keyboards/hhkb/hhkb.c b/keyboards/hhkb/hhkb.c
deleted file mode 100644
index a9d35123ff..0000000000
--- a/keyboards/hhkb/hhkb.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "hhkb.h" \ No newline at end of file
diff --git a/keyboards/hhkb/hhkb.h b/keyboards/hhkb/hhkb.h
deleted file mode 100644
index 668f78eecc..0000000000
--- a/keyboards/hhkb/hhkb.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef HHKB_H
-#define HHKB_H
-
-#include "quantum.h"
-
-#define LAYOUT( \
- K31, K30, K00, K10, K11, K20, K21, K40, K41, K60, K61, K70, K71, K50, K51, \
- K32, K01, K02, K13, K12, K23, K22, K42, K43, K62, K63, K73, K72, K52, \
- K33, K04, K03, K14, K15, K24, K25, K45, K44, K65, K64, K74, K53, \
- K34, K05, K06, K07, K16, K17, K26, K46, K66, K76, K75, K55, K54, \
- K35, K36, K37, K57, K56) \
- \
-{ \
- { K00, K01, K02, K03, K04, K05, K06, K07 }, \
- { K10, K11, K12, K13, K14, K15, K16, K17 }, \
- { K20, K21, K22, K23, K24, K25, K26, KC_NO }, \
- { K30, K31, K32, K33, K34, K35, K36, K37 }, \
- { K40, K41, K42, K43, K44, K45, K46, KC_NO }, \
- { K50, K51, K52, K53, K54, K55, K56, K57 }, \
- { K60, K61, K62, K63, K64, K65, K66, KC_NO }, \
- { 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, \
- K03, K63, K23, K13, K53, K73, KA3, K93, K83, KB3, KE3, KF3, KD3, \
- K06, K66, K26, K16, K56, K76, KA6, K96, K86, KB6, KE6, KF6, KD6, KC6, \
- K05, K65, K25, K15, K55, K75, KA5, K95, K85, KB5, KE5, KF5, KD5, KC5, \
- K04, K34, K64, K24, K14, K74, K94, K84, KB4, KE4, KF4, KD4, KC4) \
-{ \
- { KC_NO, KC_NO, K02, K03, K04, K05, K06, KC_NO }, \
- { KC_NO, KC_NO, K12, K13, K14, K15, K16, KC_NO }, \
- { KC_NO, KC_NO, K22, K23, K24, K25, K26, KC_NO }, \
- { KC_NO, KC_NO, K32, KC_NO, K34, KC_NO, KC_NO, KC_NO }, \
- { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
- { KC_NO, KC_NO, K52, K53, KC_NO, K55, K56, KC_NO }, \
- { KC_NO, KC_NO, K62, K63, K64, K65, K66, KC_NO }, \
- { KC_NO, KC_NO, K72, K73, K74, K75, K76, KC_NO }, \
- { KC_NO, KC_NO, K82, K83, K84, K85, K86, KC_NO }, \
- { KC_NO, KC_NO, K92, K93, K94, K95, K96, KC_NO }, \
- { KC_NO, KC_NO, KA2, KA3, KC_NO, KA5, KA6, KC_NO }, \
- { KC_NO, KC_NO, KB2, KB3, KB4, KB5, KB6, KC_NO }, \
- { KC_NO, KC_NO, KC2, KC_NO, KC4, KC5, KC6, KC_NO }, \
- { KC_NO, KC_NO, KD2, KD3, KD4, KD5, KD6, KC_NO }, \
- { KC_NO, KC_NO, KE2, KE3, KE4, KE5, KE6, KC_NO }, \
- { KC_NO, KC_NO, KF2, KF3, KF4, KF5, KF6, KC_NO } \
-}
-
-
-#endif
diff --git a/keyboards/hhkb/hhkb_avr.h b/keyboards/hhkb/hhkb_avr.h
deleted file mode 100644
index 7ea6322c73..0000000000
--- a/keyboards/hhkb/hhkb_avr.h
+++ /dev/null
@@ -1,167 +0,0 @@
-#ifndef HHKB_AVR_H
-#define HHKB_AVR_H
-
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-
-
-// Timer resolution check
-#if (1000000/TIMER_RAW_FREQ > 20)
-# error "Timer resolution(>20us) is not enough for HHKB matrix scan tweak on V-USB."
-#endif
-
-
-/*
- * HHKB Matrix I/O
- *
- * row: HC4051[A,B,C] selects scan row0-7
- * row-ext: [En0,En1] row extention for JP
- * col: LS145[A,B,C,D] selects scan col0-7 and enable(D)
- * key: on: 0/off: 1
- * prev: hysteresis control: assert(1) when previous key state is on
- */
-
-
-#if defined(__AVR_ATmega32U4__)
-/*
- * For TMK HHKB alt controller(ATMega32U4)
- *
- * row: PB0-2
- * col: PB3-5,6
- * key: PD7(pull-uped)
- * prev: PB7
- * power: PD4(L:off/H:on)
- * row-ext: PC6,7 for HHKB JP(active low)
- */
-static inline void KEY_ENABLE(void) { (PORTB &= ~(1<<6)); }
-static inline void KEY_UNABLE(void) { (PORTB |= (1<<6)); }
-static inline bool KEY_STATE(void) { return (PIND & (1<<7)); }
-static inline void KEY_PREV_ON(void) { (PORTB |= (1<<7)); }
-static inline void KEY_PREV_OFF(void) { (PORTB &= ~(1<<7)); }
-#ifdef HHKB_POWER_SAVING
-static inline void KEY_POWER_ON(void) {
- DDRB = 0xFF; PORTB = 0x40; // change pins output
- DDRD |= (1<<4); PORTD |= (1<<4); // MOS FET switch on
- /* Without this wait you will miss or get false key events. */
- _delay_ms(5); // wait for powering up
-}
-static inline void KEY_POWER_OFF(void) {
- /* input with pull-up consumes less than without it when pin is open. */
- DDRB = 0x00; PORTB = 0xFF; // change pins input with pull-up
- DDRD |= (1<<4); PORTD &= ~(1<<4); // MOS FET switch off
-}
-static inline bool KEY_POWER_STATE(void) { return PORTD & (1<<4); }
-#else
-static inline void KEY_POWER_ON(void) {}
-static inline void KEY_POWER_OFF(void) {}
-static inline bool KEY_POWER_STATE(void) { return true; }
-#endif
-static inline void KEY_INIT(void)
-{
- /* row,col,prev: output */
- DDRB = 0xFF;
- PORTB = 0x40; // unable
- /* key: input with pull-up */
- DDRD &= ~0x80;
- PORTD |= 0x80;
-#ifdef HHKB_JP
- /* row extention for HHKB JP */
- DDRC |= (1<<6|1<<7);
- PORTC |= (1<<6|1<<7);
-#endif
- KEY_UNABLE();
- KEY_PREV_OFF();
-
- KEY_POWER_OFF();
-}
-static inline void KEY_SELECT(uint8_t ROW, uint8_t COL)
-{
- PORTB = (PORTB & 0xC0) | (((COL) & 0x07)<<3) | ((ROW) & 0x07);
-#ifdef HHKB_JP
- if ((ROW) & 0x08) PORTC = (PORTC & ~(1<<6|1<<7)) | (1<<6);
- else PORTC = (PORTC & ~(1<<6|1<<7)) | (1<<7);
-#endif
-}
-
-
-#elif defined(__AVR_AT90USB1286__)
-/*
- * For Teensy++(AT90USB1286)
- *
- * HHKB pro HHKB pro2
- * row: PB0-2 (6-8) (5-7)
- * col: PB3-5,6 (9-12) (8-11)
- * key: PE6(pull-uped) (4) (3)
- * prev: PE7 (5) (4)
- *
- * TODO: convert into 'staitc inline' function
- */
-#define KEY_INIT() do { \
- DDRB |= 0x7F; \
- DDRE |= (1<<7); \
- DDRE &= ~(1<<6); \
- PORTE |= (1<<6); \
-} while (0)
-#define KEY_SELECT(ROW, COL) (PORTB = (PORTB & 0xC0) | \
- (((COL) & 0x07)<<3) | \
- ((ROW) & 0x07))
-#define KEY_ENABLE() (PORTB &= ~(1<<6))
-#define KEY_UNABLE() (PORTB |= (1<<6))
-#define KEY_STATE() (PINE & (1<<6))
-#define KEY_PREV_ON() (PORTE |= (1<<7))
-#define KEY_PREV_OFF() (PORTE &= ~(1<<7))
-#define KEY_POWER_ON()
-#define KEY_POWER_OFF()
-#define KEY_POWER_STATE() true
-
-
-#else
-# error "define code for matrix scan"
-#endif
-
-
-#if 0
-// For ATMega328P with V-USB
-//
-// #elif defined(__AVR_ATmega328P__)
-// Ports for V-USB
-// key: PB0(pull-uped)
-// prev: PB1
-// row: PB2-4
-// col: PC0-2,3
-// power: PB5(Low:on/Hi-z:off)
-#define KEY_INIT() do { \
- DDRB |= 0x3E; \
- DDRB &= ~(1<<0); \
- PORTB |= 1<<0; \
- DDRC |= 0x0F; \
- KEY_UNABLE(); \
- KEY_PREV_OFF(); \
-} while (0)
-#define KEY_SELECT(ROW, COL) do { \
- PORTB = (PORTB & 0xE3) | ((ROW) & 0x07)<<2; \
- PORTC = (PORTC & 0xF8) | ((COL) & 0x07); \
-} while (0)
-#define KEY_ENABLE() (PORTC &= ~(1<<3))
-#define KEY_UNABLE() (PORTC |= (1<<3))
-#define KEY_STATE() (PINB & (1<<0))
-#define KEY_PREV_ON() (PORTB |= (1<<1))
-#define KEY_PREV_OFF() (PORTB &= ~(1<<1))
-// Power supply switching
-#define KEY_POWER_ON() do { \
- KEY_INIT(); \
- PORTB &= ~(1<<5); \
- _delay_ms(1); \
-} while (0)
-#define KEY_POWER_OFF() do { \
- DDRB &= ~0x3F; \
- PORTB &= ~0x3F; \
- DDRC &= ~0x0F; \
- PORTC &= ~0x0F; \
-} while (0)
-#endif
-
-#endif
diff --git a/keyboards/hhkb/info.json b/keyboards/hhkb/info.json
deleted file mode 100644
index 3beaff83da..0000000000
--- a/keyboards/hhkb/info.json
+++ /dev/null
@@ -1,147 +0,0 @@
-{
- "keyboard_name": "hhkb",
- "url": "",
- "maintainer": "qmk",
- "width": 15,
- "height": 5,
- "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": "|", "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": "Delete", "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": "Return", "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": "Fn", "x": 14, "y": 3 },
- { "label": "", "x": 1.5, "y": 4 },
- { "label": "", "x": 2.5, "y": 4, "w": 1.5 },
- { "x": 4, "y": 4, "w": 6 },
- { "label": "", "x": 10, "y": 4, "w": 1.5 },
- { "label": "", "x": 11.5, "y": 4 }
- ]
- },
-
- "LAYOUT_JP": {
- "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": "|", "x": 13, "y": 0 },
- { "label": "BS", "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": "Enter", "x": 13.75, "y": 1, "w": 1.25, "h": 2 },
- { "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": "}", "x": 12.75, "y": 2 },
- { "label": "Shift", "x": 0, "y": 3, "w": 2 },
- { "label": "Z", "x": 2, "y": 3 },
- { "label": "X", "x": 3, "y": 3 },
- { "label": "C", "x": 4, "y": 3 },
- { "label": "V", "x": 5, "y": 3 },
- { "label": "B", "x": 6, "y": 3 },
- { "label": "N", "x": 7, "y": 3 },
- { "label": "M", "x": 8, "y": 3 },
- { "label": "<", "x": 9, "y": 3 },
- { "label": ">", "x": 10, "y": 3 },
- { "label": "?", "x": 11, "y": 3 },
- { "label": "_", "x": 12, "y": 3 },
- { "label": "\u2191", "x": 13, "y": 3 },
- { "label": "Shift", "x": 14, "y": 3 },
- { "label": "Fn", "x": 0, "y": 4 },
- { "label": "HH", "x": 1.25, "y": 4 },
- { "label": "\u2662", "x": 2.25, "y": 4 },
- { "label": "", "x": 3.25, "y": 4 },
- { "label": "NN", "x": 4.25, "y": 4 },
- { "x": 5.25, "y": 4, "w": 2.5 },
- { "label": "\u25cc", "x": 7.75, "y": 4 },
- { "label": "Kana", "x": 8.75, "y": 4 },
- { "label": "", "x": 9.75, "y": 4 },
- { "label": "Fn", "x": 10.75, "y": 4 },
- { "label": "\u2190", "x": 12, "y": 4 },
- { "label": "\u2193", "x": 13, "y": 4 },
- { "label": "\u2192", "x": 14, "y": 4 }
- ]
- }
- }
-}
diff --git a/keyboards/hhkb/jp/config.h b/keyboards/hhkb/jp/config.h
new file mode 100644
index 0000000000..01dab6d440
--- /dev/null
+++ b/keyboards/hhkb/jp/config.h
@@ -0,0 +1,104 @@
+/*
+Copyright 2012 Jun Wako <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x4848 // HH = happy hacking
+#define PRODUCT_ID 0x0002 // HHKB JP
+#define DEVICE_VER 0x0104
+#define MANUFACTURER q.m.k
+#define PRODUCT HHKB mod
+#define DESCRIPTION q.m.k keyboard firmware for HHKB
+
+/* key matrix size */
+#define MATRIX_ROWS 16
+#define MATRIX_COLS 8
+
+#define TAPPING_TERM 200
+
+/* 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 HHKB_RN42_ENABLE
+// rn42 support -- acquired from the tmk repo. This is almost certainly not
+// integrated with qmk in the correct way.
+
+#define SUART_OUT_PORT PORTD
+#define SUART_OUT_BIT 0
+#define SUART_IN_PIN PIND
+#define SUART_IN_BIT 1
+
+#ifdef __AVR_ATmega32U4__
+ /* iom32u4.h has no definition of UCSR1D. copy from iom32u2.h */
+ #define UCSR1D _SFR_MEM8(0xCB)
+ #define RTSEN 0
+ #define CTSEN 1
+
+ #define SERIAL_UART_BAUD 115200
+ #define SERIAL_UART_DATA UDR1
+ #define SERIAL_UART_UBRR ((F_CPU/(16.0*SERIAL_UART_BAUD)-1+0.5))
+ #define SERIAL_UART_RXD_VECT USART1_RX_vect
+ #define SERIAL_UART_TXD_READY (UCSR1A&(1<<UDRE1))
+ #define SERIAL_UART_INIT() do { \
+ UBRR1L = (uint8_t) SERIAL_UART_UBRR; /* baud rate */ \
+ UBRR1H = ((uint16_t)SERIAL_UART_UBRR>>8); /* baud rate */ \
+ UCSR1B |= (1<<RXCIE1) | (1<<RXEN1); /* RX interrupt, RX: enable */ \
+ UCSR1B |= (0<<TXCIE1) | (1<<TXEN1); /* TX interrupt, TX: enable */ \
+ UCSR1C |= (0<<UPM11) | (0<<UPM10); /* parity: none(00), even(01), odd(11) */ \
+ UCSR1D |= (0<<RTSEN) | (0<<CTSEN); /* RTS, CTS(no flow control by hardware) */ \
+ DDRD |= (1<<5); PORTD &= ~(1<<5); /* RTS for flow control by firmware */ \
+ sei(); \
+ } while(0)
+ #define SERIAL_UART_RTS_LO() do { PORTD &= ~(1<<5); } while (0)
+ #define SERIAL_UART_RTS_HI() do { PORTD |= (1<<5); } while (0)
+#else
+ #error "USART configuration is needed."
+#endif
+
+/* power control of key switch board */
+#define HHKB_POWER_SAVING
+
+#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/hhkb/jp/hhkb_avr.h b/keyboards/hhkb/jp/hhkb_avr.h
new file mode 100644
index 0000000000..a1f825cfb0
--- /dev/null
+++ b/keyboards/hhkb/jp/hhkb_avr.h
@@ -0,0 +1,164 @@
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+
+
+// Timer resolution check
+#if (1000000/TIMER_RAW_FREQ > 20)
+# error "Timer resolution(>20us) is not enough for HHKB matrix scan tweak on V-USB."
+#endif
+
+
+/*
+ * HHKB Matrix I/O
+ *
+ * row: HC4051[A,B,C] selects scan row0-7
+ * row-ext: [En0,En1] row extention for JP
+ * col: LS145[A,B,C,D] selects scan col0-7 and enable(D)
+ * key: on: 0/off: 1
+ * prev: hysteresis control: assert(1) when previous key state is on
+ */
+
+
+#if defined(__AVR_ATmega32U4__)
+/*
+ * For TMK HHKB alt controller(ATMega32U4)
+ *
+ * row: PB0-2
+ * col: PB3-5,6
+ * key: PD7(pull-uped)
+ * prev: PB7
+ * power: PD4(L:off/H:on)
+ * row-ext: PC6,7 for HHKB JP(active low)
+ */
+static inline void KEY_ENABLE(void) { (PORTB &= ~(1<<6)); }
+static inline void KEY_UNABLE(void) { (PORTB |= (1<<6)); }
+static inline bool KEY_STATE(void) { return (PIND & (1<<7)); }
+static inline void KEY_PREV_ON(void) { (PORTB |= (1<<7)); }
+static inline void KEY_PREV_OFF(void) { (PORTB &= ~(1<<7)); }
+#ifdef HHKB_POWER_SAVING
+static inline void KEY_POWER_ON(void) {
+ DDRB = 0xFF; PORTB = 0x40; // change pins output
+ DDRD |= (1<<4); PORTD |= (1<<4); // MOS FET switch on
+ /* Without this wait you will miss or get false key events. */
+ _delay_ms(5); // wait for powering up
+}
+static inline void KEY_POWER_OFF(void) {
+ /* input with pull-up consumes less than without it when pin is open. */
+ DDRB = 0x00; PORTB = 0xFF; // change pins input with pull-up
+ DDRD |= (1<<4); PORTD &= ~(1<<4); // MOS FET switch off
+}
+static inline bool KEY_POWER_STATE(void) { return PORTD & (1<<4); }
+#else
+static inline void KEY_POWER_ON(void) {}
+static inline void KEY_POWER_OFF(void) {}
+static inline bool KEY_POWER_STATE(void) { return true; }
+#endif
+static inline void KEY_INIT(void)
+{
+ /* row,col,prev: output */
+ DDRB = 0xFF;
+ PORTB = 0x40; // unable
+ /* key: input with pull-up */
+ DDRD &= ~0x80;
+ PORTD |= 0x80;
+
+ /* row extention for HHKB JP */
+ DDRC |= (1<<6|1<<7);
+ PORTC |= (1<<6|1<<7);
+
+ KEY_UNABLE();
+ KEY_PREV_OFF();
+
+ KEY_POWER_OFF();
+}
+static inline void KEY_SELECT(uint8_t ROW, uint8_t COL)
+{
+ PORTB = (PORTB & 0xC0) | (((COL) & 0x07)<<3) | ((ROW) & 0x07);
+
+ if ((ROW) & 0x08) PORTC = (PORTC & ~(1<<6|1<<7)) | (1<<6);
+ else PORTC = (PORTC & ~(1<<6|1<<7)) | (1<<7);
+
+}
+
+
+#elif defined(__AVR_AT90USB1286__)
+/*
+ * For Teensy++(AT90USB1286)
+ *
+ * HHKB pro HHKB pro2
+ * row: PB0-2 (6-8) (5-7)
+ * col: PB3-5,6 (9-12) (8-11)
+ * key: PE6(pull-uped) (4) (3)
+ * prev: PE7 (5) (4)
+ *
+ * TODO: convert into 'staitc inline' function
+ */
+#define KEY_INIT() do { \
+ DDRB |= 0x7F; \
+ DDRE |= (1<<7); \
+ DDRE &= ~(1<<6); \
+ PORTE |= (1<<6); \
+} while (0)
+#define KEY_SELECT(ROW, COL) (PORTB = (PORTB & 0xC0) | \
+ (((COL) & 0x07)<<3) | \
+ ((ROW) & 0x07))
+#define KEY_ENABLE() (PORTB &= ~(1<<6))
+#define KEY_UNABLE() (PORTB |= (1<<6))
+#define KEY_STATE() (PINE & (1<<6))
+#define KEY_PREV_ON() (PORTE |= (1<<7))
+#define KEY_PREV_OFF() (PORTE &= ~(1<<7))
+#define KEY_POWER_ON()
+#define KEY_POWER_OFF()
+#define KEY_POWER_STATE() true
+
+
+#else
+# error "define code for matrix scan"
+#endif
+
+
+#if 0
+// For ATMega328P with V-USB
+//
+// #elif defined(__AVR_ATmega328P__)
+// Ports for V-USB
+// key: PB0(pull-uped)
+// prev: PB1
+// row: PB2-4
+// col: PC0-2,3
+// power: PB5(Low:on/Hi-z:off)
+#define KEY_INIT() do { \
+ DDRB |= 0x3E; \
+ DDRB &= ~(1<<0); \
+ PORTB |= 1<<0; \
+ DDRC |= 0x0F; \
+ KEY_UNABLE(); \
+ KEY_PREV_OFF(); \
+} while (0)
+#define KEY_SELECT(ROW, COL) do { \
+ PORTB = (PORTB & 0xE3) | ((ROW) & 0x07)<<2; \
+ PORTC = (PORTC & 0xF8) | ((COL) & 0x07); \
+} while (0)
+#define KEY_ENABLE() (PORTC &= ~(1<<3))
+#define KEY_UNABLE() (PORTC |= (1<<3))
+#define KEY_STATE() (PINB & (1<<0))
+#define KEY_PREV_ON() (PORTB |= (1<<1))
+#define KEY_PREV_OFF() (PORTB &= ~(1<<1))
+// Power supply switching
+#define KEY_POWER_ON() do { \
+ KEY_INIT(); \
+ PORTB &= ~(1<<5); \
+ _delay_ms(1); \
+} while (0)
+#define KEY_POWER_OFF() do { \
+ DDRB &= ~0x3F; \
+ PORTB &= ~0x3F; \
+ DDRC &= ~0x0F; \
+ PORTC &= ~0x0F; \
+} while (0)
+#endif
diff --git a/keyboards/hhkb/jp/info.json b/keyboards/hhkb/jp/info.json
new file mode 100644
index 0000000000..7594987d96
--- /dev/null
+++ b/keyboards/hhkb/jp/info.json
@@ -0,0 +1,82 @@
+{
+ "keyboard_name": "HHKB JP",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 15,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_JP": {
+ "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": "|", "x": 13, "y": 0 },
+ { "label": "BS", "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": "Enter", "x": 13.75, "y": 1, "w": 1.25, "h": 2 },
+ { "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": "}", "x": 12.75, "y": 2 },
+ { "label": "Shift", "x": 0, "y": 3, "w": 2 },
+ { "label": "Z", "x": 2, "y": 3 },
+ { "label": "X", "x": 3, "y": 3 },
+ { "label": "C", "x": 4, "y": 3 },
+ { "label": "V", "x": 5, "y": 3 },
+ { "label": "B", "x": 6, "y": 3 },
+ { "label": "N", "x": 7, "y": 3 },
+ { "label": "M", "x": 8, "y": 3 },
+ { "label": "<", "x": 9, "y": 3 },
+ { "label": ">", "x": 10, "y": 3 },
+ { "label": "?", "x": 11, "y": 3 },
+ { "label": "_", "x": 12, "y": 3 },
+ { "label": "\u2191", "x": 13, "y": 3 },
+ { "label": "Shift", "x": 14, "y": 3 },
+ { "label": "Fn", "x": 0, "y": 4 },
+ { "label": "HH", "x": 1.25, "y": 4 },
+ { "label": "\u2662", "x": 2.25, "y": 4 },
+ { "label": "", "x": 3.25, "y": 4 },
+ { "label": "NN", "x": 4.25, "y": 4 },
+ { "x": 5.25, "y": 4, "w": 2.5 },
+ { "label": "\u25cc", "x": 7.75, "y": 4 },
+ { "label": "Kana", "x": 8.75, "y": 4 },
+ { "label": "", "x": 9.75, "y": 4 },
+ { "label": "Fn", "x": 10.75, "y": 4 },
+ { "label": "\u2190", "x": 12, "y": 4 },
+ { "label": "\u2193", "x": 13, "y": 4 },
+ { "label": "\u2192", "x": 14, "y": 4 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/hhkb/jp/jp.c b/keyboards/hhkb/jp/jp.c
new file mode 100644
index 0000000000..f1f1388c77
--- /dev/null
+++ b/keyboards/hhkb/jp/jp.c
@@ -0,0 +1 @@
+#include "jp.h" \ No newline at end of file
diff --git a/keyboards/hhkb/jp/jp.h b/keyboards/hhkb/jp/jp.h
new file mode 100644
index 0000000000..a95796f25f
--- /dev/null
+++ b/keyboards/hhkb/jp/jp.h
@@ -0,0 +1,28 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_JP( \
+ K02, K32, K62, K22, K12, K52, K72, KA2, K92, K82, KB2, KE2, KF2, KD2, KC2, \
+ K03, K63, K23, K13, K53, K73, KA3, K93, K83, KB3, KE3, KF3, KD3, \
+ K06, K66, K26, K16, K56, K76, KA6, K96, K86, KB6, KE6, KF6, KD6, KC6, \
+ K05, K65, K25, K15, K55, K75, KA5, K95, K85, KB5, KE5, KF5, KD5, KC5, \
+ K04, K34, K64, K24, K14, K74, K94, K84, KB4, KE4, KF4, KD4, KC4) \
+{ \
+ { KC_NO, KC_NO, K02, K03, K04, K05, K06, KC_NO }, \
+ { KC_NO, KC_NO, K12, K13, K14, K15, K16, KC_NO }, \
+ { KC_NO, KC_NO, K22, K23, K24, K25, K26, KC_NO }, \
+ { KC_NO, KC_NO, K32, KC_NO, K34, KC_NO, KC_NO, KC_NO }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { KC_NO, KC_NO, K52, K53, KC_NO, K55, K56, KC_NO }, \
+ { KC_NO, KC_NO, K62, K63, K64, K65, K66, KC_NO }, \
+ { KC_NO, KC_NO, K72, K73, K74, K75, K76, KC_NO }, \
+ { KC_NO, KC_NO, K82, K83, K84, K85, K86, KC_NO }, \
+ { KC_NO, KC_NO, K92, K93, K94, K95, K96, KC_NO }, \
+ { KC_NO, KC_NO, KA2, KA3, KC_NO, KA5, KA6, KC_NO }, \
+ { KC_NO, KC_NO, KB2, KB3, KB4, KB5, KB6, KC_NO }, \
+ { KC_NO, KC_NO, KC2, KC_NO, KC4, KC5, KC6, KC_NO }, \
+ { KC_NO, KC_NO, KD2, KD3, KD4, KD5, KD6, KC_NO }, \
+ { KC_NO, KC_NO, KE2, KE3, KE4, KE5, KE6, KC_NO }, \
+ { KC_NO, KC_NO, KF2, KF3, KF4, KF5, KF6, KC_NO } \
+}
diff --git a/keyboards/hhkb/keymaps/bakingpy/keymap.c b/keyboards/hhkb/jp/keymaps/bakingpy/keymap.c
index 04d79f9247..04d79f9247 100644
--- a/keyboards/hhkb/keymaps/bakingpy/keymap.c
+++ b/keyboards/hhkb/jp/keymaps/bakingpy/keymap.c
diff --git a/keyboards/hhkb/keymaps/bakingpy/rules.mk b/keyboards/hhkb/jp/keymaps/bakingpy/rules.mk
index a7f700f019..a7f700f019 100644
--- a/keyboards/hhkb/keymaps/bakingpy/rules.mk
+++ b/keyboards/hhkb/jp/keymaps/bakingpy/rules.mk
diff --git a/keyboards/hhkb/keymaps/jp/keymap.c b/keyboards/hhkb/jp/keymaps/default/keymap.c
index 6fd06638ce..6fd06638ce 100644
--- a/keyboards/hhkb/keymaps/jp/keymap.c
+++ b/keyboards/hhkb/jp/keymaps/default/keymap.c
diff --git a/keyboards/hhkb/keymaps/halfqwerty_jp/rules.mk b/keyboards/hhkb/jp/keymaps/default/rules.mk
index a7f700f019..a7f700f019 100644
--- a/keyboards/hhkb/keymaps/halfqwerty_jp/rules.mk
+++ b/keyboards/hhkb/jp/keymaps/default/rules.mk
diff --git a/keyboards/hhkb/keymaps/jp_mac/keymap.c b/keyboards/hhkb/jp/keymaps/default_mac/keymap.c
index f3ef3d6af6..f3ef3d6af6 100644
--- a/keyboards/hhkb/keymaps/jp_mac/keymap.c
+++ b/keyboards/hhkb/jp/keymaps/default_mac/keymap.c
diff --git a/keyboards/hhkb/keymaps/jp/rules.mk b/keyboards/hhkb/jp/keymaps/default_mac/rules.mk
index a7f700f019..a7f700f019 100644
--- a/keyboards/hhkb/keymaps/jp/rules.mk
+++ b/keyboards/hhkb/jp/keymaps/default_mac/rules.mk
diff --git a/keyboards/hhkb/keymaps/krusli/config.h b/keyboards/hhkb/jp/keymaps/dhertz/config.h
index af2fb9d8a5..af2fb9d8a5 100644
--- a/keyboards/hhkb/keymaps/krusli/config.h
+++ b/keyboards/hhkb/jp/keymaps/dhertz/config.h
diff --git a/keyboards/hhkb/keymaps/dhertz/keymap.c b/keyboards/hhkb/jp/keymaps/dhertz/keymap.c
index 951af069b0..951af069b0 100644
--- a/keyboards/hhkb/keymaps/dhertz/keymap.c
+++ b/keyboards/hhkb/jp/keymaps/dhertz/keymap.c
diff --git a/keyboards/hhkb/keymaps/dhertz/keymap.h b/keyboards/hhkb/jp/keymaps/dhertz/keymap.h
index dbefc63800..dbefc63800 100644
--- a/keyboards/hhkb/keymaps/dhertz/keymap.h
+++ b/keyboards/hhkb/jp/keymaps/dhertz/keymap.h
diff --git a/keyboards/hhkb/keymaps/dhertz/rules.mk b/keyboards/hhkb/jp/keymaps/dhertz/rules.mk
index 5656057b43..5656057b43 100644
--- a/keyboards/hhkb/keymaps/dhertz/rules.mk
+++ b/keyboards/hhkb/jp/keymaps/dhertz/rules.mk
diff --git a/keyboards/hhkb/keymaps/enoch_jp/keymap.c b/keyboards/hhkb/jp/keymaps/enoch_jp/keymap.c
index 15dc29773b..15dc29773b 100644
--- a/keyboards/hhkb/keymaps/enoch_jp/keymap.c
+++ b/keyboards/hhkb/jp/keymaps/enoch_jp/keymap.c
diff --git a/keyboards/hhkb/keymaps/enoch_jp/rules.mk b/keyboards/hhkb/jp/keymaps/enoch_jp/rules.mk
index d35c58b777..d35c58b777 100644
--- a/keyboards/hhkb/keymaps/enoch_jp/rules.mk
+++ b/keyboards/hhkb/jp/keymaps/enoch_jp/rules.mk
diff --git a/keyboards/hhkb/keymaps/halfqwerty_jp/README.md b/keyboards/hhkb/jp/keymaps/halfqwerty_jp/README.md
index 222ad898ef..222ad898ef 100644
--- a/keyboards/hhkb/keymaps/halfqwerty_jp/README.md
+++ b/keyboards/hhkb/jp/keymaps/halfqwerty_jp/README.md
diff --git a/keyboards/hhkb/keymaps/halfqwerty_jp/keymap.c b/keyboards/hhkb/jp/keymaps/halfqwerty_jp/keymap.c
index 0d4a24c60d..0d4a24c60d 100644
--- a/keyboards/hhkb/keymaps/halfqwerty_jp/keymap.c
+++ b/keyboards/hhkb/jp/keymaps/halfqwerty_jp/keymap.c
diff --git a/keyboards/hhkb/keymaps/jp_mac/rules.mk b/keyboards/hhkb/jp/keymaps/halfqwerty_jp/rules.mk
index a7f700f019..a7f700f019 100644
--- a/keyboards/hhkb/keymaps/jp_mac/rules.mk
+++ b/keyboards/hhkb/jp/keymaps/halfqwerty_jp/rules.mk
diff --git a/keyboards/hhkb/keymaps/rdg_jp/keymap.c b/keyboards/hhkb/jp/keymaps/rdg_jp/keymap.c
index f40df74e87..f40df74e87 100644
--- a/keyboards/hhkb/keymaps/rdg_jp/keymap.c
+++ b/keyboards/hhkb/jp/keymaps/rdg_jp/keymap.c
diff --git a/keyboards/hhkb/keymaps/rdg_jp/rules.mk b/keyboards/hhkb/jp/keymaps/rdg_jp/rules.mk
index a7f700f019..a7f700f019 100644
--- a/keyboards/hhkb/keymaps/rdg_jp/rules.mk
+++ b/keyboards/hhkb/jp/keymaps/rdg_jp/rules.mk
diff --git a/keyboards/hhkb/keymaps/sh_jp/README.md b/keyboards/hhkb/jp/keymaps/sh_jp/README.md
index 4f82f2f4e9..4f82f2f4e9 100644
--- a/keyboards/hhkb/keymaps/sh_jp/README.md
+++ b/keyboards/hhkb/jp/keymaps/sh_jp/README.md
diff --git a/keyboards/hhkb/keymaps/sh_jp/keymap.c b/keyboards/hhkb/jp/keymaps/sh_jp/keymap.c
index 79515c5a6e..79515c5a6e 100644
--- a/keyboards/hhkb/keymaps/sh_jp/keymap.c
+++ b/keyboards/hhkb/jp/keymaps/sh_jp/keymap.c
diff --git a/keyboards/hhkb/keymaps/sh_jp/rules.mk b/keyboards/hhkb/jp/keymaps/sh_jp/rules.mk
index a7f700f019..a7f700f019 100644
--- a/keyboards/hhkb/keymaps/sh_jp/rules.mk
+++ b/keyboards/hhkb/jp/keymaps/sh_jp/rules.mk
diff --git a/keyboards/hhkb/jp/keymaps/via/config.h b/keyboards/hhkb/jp/keymaps/via/config.h
new file mode 100644
index 0000000000..96c85573df
--- /dev/null
+++ b/keyboards/hhkb/jp/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/hhkb/jp/keymaps/via/keymap.c b/keyboards/hhkb/jp/keymaps/via/keymap.c
new file mode 100644
index 0000000000..cb1ba76fb0
--- /dev/null
+++ b/keyboards/hhkb/jp/keymaps/via/keymap.c
@@ -0,0 +1,58 @@
+#include QMK_KEYBOARD_H
+
+/* Layer 0: HHKB JP
+ * ,-----------------------------------------------------------.
+ * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 10| -| =|Yen|Bsp|
+ * |-----------------------------------------------------------|
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| |
+ * |------------------------------------------------------` Ent|
+ * |Ctrl | A| S| D| F| G| H| J| K| L| ;| '| `| |
+ * |-----------------------------------------------------------|
+ * |Shft | Z| X| C| V| B| N| M| ,| .| /| \| Up|Sft|
+ * |-----------------------------------------------------------|
+ * | ||Ctl|Alt|Cmd| | Spc |Bsp| | | ||Lft|Dwn|Rgh|
+ * `-----------------------------------------------------------'
+ */
+
+/* Layer 1: HHKB mode (HHKB Fn)
+ * ,-----------------------------------------------------------.
+ * |Pwr| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Ins|Del|
+ * |-----------------------------------------------------------|
+ * |Caps | | | | | | | |Psc|Slk|Pus|Up | | |
+ * |------------------------------------------------------` |
+ * | |VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig| | |
+ * |-----------------------------------------------------------|
+ * | | | | | | | +| -|End|PgD|Dow| | | |
+ * |-----------------------------------------------------------|
+ * | || | | | | | | | | || | | |
+ * `-----------------------------------------------------------'
+ */
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT_JP(
+ 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_JYEN, 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_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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_UP, KC_RSFT,
+ MO(1), KC_ZKHK, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC, KC_HENK, KC_KANA, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT),
+
+ [1] = LAYOUT_JP(
+ KC_PWR, 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_VOLD, KC_VOLU, KC_MUTE, KC_PWR, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, _______, KC_PENT,
+ _______, _______, _______, _______, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+ [2] = LAYOUT_JP(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ )
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t macro_id, uint8_t opt)
+{
+ return MACRO_NONE;
+}
diff --git a/keyboards/hhkb/jp/keymaps/via/rules.mk b/keyboards/hhkb/jp/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/hhkb/jp/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/hhkb/jp/matrix.c b/keyboards/hhkb/jp/matrix.c
new file mode 100644
index 0000000000..437356af6d
--- /dev/null
+++ b/keyboards/hhkb/jp/matrix.c
@@ -0,0 +1,212 @@
+/*
+Copyright 2011 Jun Wako <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
+*/
+
+/*
+ * scan matrix
+ */
+#include <stdint.h>
+#include <stdbool.h>
+#include <util/delay.h>
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "timer.h"
+#include "matrix.h"
+#include "hhkb_avr.h"
+#include <avr/wdt.h>
+#include "suspend.h"
+#include "lufa.h"
+
+
+// matrix power saving
+#define MATRIX_POWER_SAVE 10000
+static uint32_t matrix_last_modified = 0;
+
+// matrix state buffer(1:on, 0:off)
+static matrix_row_t *matrix;
+static matrix_row_t *matrix_prev;
+static matrix_row_t _matrix0[MATRIX_ROWS];
+static matrix_row_t _matrix1[MATRIX_ROWS];
+
+
+inline
+uint8_t matrix_rows(void)
+{
+ return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void)
+{
+ return MATRIX_COLS;
+}
+
+void matrix_init(void)
+{
+#ifdef DEBUG
+ debug_enable = true;
+ debug_keyboard = true;
+#endif
+
+ KEY_INIT();
+
+ // initialize matrix state: all keys off
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00;
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00;
+ matrix = _matrix0;
+ matrix_prev = _matrix1;
+}
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {
+}
+
+void matrix_scan_kb(void) {
+ matrix_scan_user();
+}
+
+uint8_t matrix_scan(void)
+{
+ uint8_t *tmp;
+
+ tmp = matrix_prev;
+ matrix_prev = matrix;
+ matrix = tmp;
+
+ // power on
+ if (!KEY_POWER_STATE()) KEY_POWER_ON();
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ KEY_SELECT(row, col);
+ _delay_us(5);
+
+ // Not sure this is needed. This just emulates HHKB controller's behaviour.
+ if (matrix_prev[row] & (1<<col)) {
+ KEY_PREV_ON();
+ }
+ _delay_us(10);
+
+ // NOTE: KEY_STATE is valid only in 20us after KEY_ENABLE.
+ // If V-USB interrupts in this section we could lose 40us or so
+ // and would read invalid value from KEY_STATE.
+ uint8_t last = TIMER_RAW;
+
+ KEY_ENABLE();
+
+ // Wait for KEY_STATE outputs its value.
+ // 1us was ok on one HHKB, but not worked on another.
+ // no wait doesn't work on Teensy++ with pro(1us works)
+ // no wait does work on tmk PCB(8MHz) with pro2
+ // 1us wait does work on both of above
+ // 1us wait doesn't work on tmk(16MHz)
+ // 5us wait does work on tmk(16MHz)
+ // 5us wait does work on tmk(16MHz/2)
+ // 5us wait does work on tmk(8MHz)
+ // 10us wait does work on Teensy++ with pro
+ // 10us wait does work on 328p+iwrap with pro
+ // 10us wait doesn't work on tmk PCB(8MHz) with pro2(very lagged scan)
+ _delay_us(5);
+
+ if (KEY_STATE()) {
+ matrix[row] &= ~(1<<col);
+ } else {
+ matrix[row] |= (1<<col);
+ }
+
+ // Ignore if this code region execution time elapses more than 20us.
+ // MEMO: 20[us] * (TIMER_RAW_FREQ / 1000000)[count per us]
+ // MEMO: then change above using this rule: a/(b/c) = a*1/(b/c) = a*(c/b)
+ if (TIMER_DIFF_RAW(TIMER_RAW, last) > 20/(1000000/TIMER_RAW_FREQ)) {
+ matrix[row] = matrix_prev[row];
+ }
+
+ _delay_us(5);
+ KEY_PREV_OFF();
+ KEY_UNABLE();
+
+ // NOTE: KEY_STATE keep its state in 20us after KEY_ENABLE.
+ // This takes 25us or more to make sure KEY_STATE returns to idle state.
+
+ // Looks like JP needs faster scan due to its twice larger matrix
+ // or it can drop keys in fast key typing
+ _delay_us(30);
+ }
+ if (matrix[row] ^ matrix_prev[row]) matrix_last_modified = timer_read32();
+ }
+ // power off
+ if (KEY_POWER_STATE() &&
+ (USB_DeviceState == DEVICE_STATE_Suspended ||
+ USB_DeviceState == DEVICE_STATE_Unattached ) &&
+ timer_elapsed32(matrix_last_modified) > MATRIX_POWER_SAVE) {
+ KEY_POWER_OFF();
+ suspend_power_down();
+ }
+
+ matrix_scan_quantum();
+
+ return 1;
+}
+
+bool matrix_is_modified(void)
+{
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ if (matrix[i] != matrix_prev[i])
+ return true;
+ }
+ return false;
+}
+
+inline
+bool matrix_has_ghost(void)
+{
+ return false;
+}
+
+inline
+bool matrix_is_on(uint8_t row, uint8_t col)
+{
+ return (matrix[row] & (1<<col));
+}
+
+inline
+matrix_row_t matrix_get_row(uint8_t row)
+{
+ return matrix[row];
+}
+
+void matrix_print(void)
+{
+ print("\nr/c 01234567\n");
+ for (uint8_t row = 0; row < matrix_rows(); row++) {
+ xprintf("%02X: %08b\n", row, bitrev(matrix_get_row(row)));
+ }
+}
+
+uint8_t matrix_key_count(void) {
+ uint8_t count = 0;
+ for (int8_t r = MATRIX_ROWS - 1; r >= 0; --r) {
+ count += bitpop16(matrix_get_row(r));
+ }
+ return count;
+}
+
+void matrix_power_up(void) {
+ KEY_POWER_ON();
+}
+void matrix_power_down(void) {
+ KEY_POWER_OFF();
+}
diff --git a/keyboards/hhkb/jp/readme.md b/keyboards/hhkb/jp/readme.md
new file mode 100644
index 0000000000..41c1d2214e
--- /dev/null
+++ b/keyboards/hhkb/jp/readme.md
@@ -0,0 +1,14 @@
+HHKB Alternate Controller
+===
+
+An alternative controler for the HHKB designed by hasu.
+
+Keyboard Maintainer: QMK Community
+Hardware Supported: HHKB Alternate Controller
+Hardware Availability: https://geekhack.org/index.php?topic=12047.0
+
+Make example for this keyboard (after setting up your build environment):
+
+ make hhkb/jp:default
+
+See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
diff --git a/keyboards/hhkb/jp/rules.mk b/keyboards/hhkb/jp/rules.mk
new file mode 100644
index 0000000000..774b444c53
--- /dev/null
+++ b/keyboards/hhkb/jp/rules.mk
@@ -0,0 +1,69 @@
+# 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
+# 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 = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+CUSTOM_MATRIX = yes # Custom matrix file for the HHKB
+# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
+# SLEEP_LED_ENABLE = yes # 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 = yes # Enable keyboard backlight functionality
+# MIDI_ENABLE = yes # MIDI controls
+# UNICODE_ENABLE = yes # Unicode
+# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
+
+
+# HHKB_RN42_ENABLE = yes # Enable support for hasu's BT alt controller -- code borrowed from tmk source tree.
+
+# Either uncomment the HHKB_RN42_ENABLE line above, or run make enabling the
+# feature. Be sure to clean any existing build before trying to enable rn42
+# support. For example:
+#
+# make hhkb-keymap-clean
+# make hhkb-keymap-dfu HHKB_RN42_ENABLE=yes
+
+# project specific files
+SRC = matrix.c
+
+ifeq ($(strip $(HHKB_RN42_ENABLE)), yes)
+
+OPT_DEFS += -DHHKB_RN42_ENABLE
+
+# Support for the RN42 Bluetooth module. This is the BT module in Hasu's BT
+# HHKB Alt controller.
+RN42_DIR = ../rn42
+
+SRC += serial_uart.c \
+ ../rn42/suart.S \
+ ../rn42/rn42.c \
+ ../rn42/rn42_task.c \
+ ../rn42/battery.c \
+ ../rn42/main.c
+
+VPATH += $(RN42_DIR)
+
+endif
+
+
+# debug-on: EXTRAFLAGS += -DDEBUG -DDEBUG_ACTION
+# debug-on: all
+
+# debug-off: EXTRAFLAGS += -DNO_DEBUG -DNO_PRINT
+# debug-off: OPT_DEFS := $(filter-out -DCONSOLE_ENABLE,$(OPT_DEFS))
+# debug-off: all
diff --git a/keyboards/hhkb/keymaps/lxol/keymap.c b/keyboards/hhkb/keymaps/lxol/keymap.c
deleted file mode 100644
index 3e3b3d2ed0..0000000000
--- a/keyboards/hhkb/keymaps/lxol/keymap.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/* -*- eval: (turn-on-orgtbl); -*-
- * lxol HHKB Layout
- */
-#include QMK_KEYBOARD_H
-
-#define BASE 0
-#define WIN 1
-#define HHKB 2
-#define RGUILEV 3
-#define LGUILEV 4
-#define RALTLEV 5
-#define LALTLEV 6
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-
- /* Layer 0: Default Layer
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Contro | A | S | D | F | G | H | J | K | L | ; | ' | RCtl/Ent | | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
-
- |------+------+-------+------+------|
- | LAlt | LGUI | Space | RGUI | RAlt |
- |------+------+-------+------+------|
- */
-
- [BASE] = LAYOUT( // layer 0 : default
-
- 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, LT(LALTLEV, KC_A), LT(LGUILEV, KC_S), KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, LT(RGUILEV, KC_L), LT(RALTLEV, KC_SCLN), KC_QUOT, KC_FN0,
- 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(HHKB),
- KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT),
-
- /* Layer 1: HHKB mode (HHKB Fn)
- |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
- | Pwr | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del |
- |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
- | Caps | | | | | | | | Psc | Slk | Pus | Up | | Backs | |
- |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
- | | VoD | VoU | Mut | | | * | / | Hom | PgU | Lef | Rig | Enter | | |
- |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
- | | | | | | | + | - | End | PgD | Dow | | | | |
- |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
-
- |---+---+---+---+---|
- | | | | | |
- |---+---+---+---+---|
- */
-
- [HHKB] = LAYOUT(
- KC_PWR, 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),
-
- /* Layer LGUI: All keys with RGUI modifier
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
-
- |------+------+-------+------+------|
- | LAlt | LGUI | Space | RGUI | RAlt |
- |------+------+-------+------+------|
- */
-
- [RGUILEV] = LAYOUT( // Right GUI layer by KC_L
-
- RGUI(KC_ESC), RGUI(KC_1), RGUI(KC_2), RGUI(KC_3), RGUI(KC_4), RGUI(KC_5), RGUI(KC_6), RGUI(KC_7), RGUI(KC_8), RGUI(KC_9), RGUI(KC_0), RGUI(KC_MINS), RGUI(KC_EQL), RGUI(KC_BSLS), RGUI(KC_GRV),
- RGUI(KC_TAB), RGUI(KC_Q), RGUI(KC_W), RGUI(KC_E), RGUI(KC_R), RGUI(KC_T), RGUI(KC_Y), RGUI(KC_U), RGUI(KC_I), RGUI(KC_O), RGUI(KC_P), RGUI(KC_LBRC), RGUI(KC_RBRC), RGUI(KC_BSPC),
- RGUI(KC_LCTL), RGUI(KC_A), RGUI(KC_S), RGUI(KC_D), RGUI(KC_F), RGUI(KC_G), RGUI(KC_H), RGUI(KC_J), RGUI(KC_K), KC_TRNS, KC_TRNS, RGUI(KC_QUOT), KC_FN0,
- RGUI(KC_LSFT), RGUI(KC_Z), RGUI(KC_X), RGUI(KC_C), RGUI(KC_V), RGUI(KC_B), RGUI(KC_N), RGUI(KC_M), RGUI(KC_COMM), RGUI(KC_DOT), RGUI(KC_SLSH), RGUI(KC_RSFT), KC_TRNS,
- KC_LALT, KC_LGUI, RGUI(KC_SPC), KC_RGUI, KC_RALT),
-
- /* Layer LGUI: All keys with LGUI modifier
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
-
- |------+------+-------+------+------|
- | LAlt | LGUI | Space | LGUI | RAlt |
- |------+------+-------+------+------|
- */
-
- [LGUILEV] = LAYOUT( // Right GUI layer by KC_L
-
- LGUI(KC_ESC), LGUI(KC_1), LGUI(KC_2), LGUI(KC_3), LGUI(KC_4), LGUI(KC_5), LGUI(KC_6), LGUI(KC_7), LGUI(KC_8), LGUI(KC_9), LGUI(KC_0), LGUI(KC_MINS), LGUI(KC_EQL), LGUI(KC_BSLS), LGUI(KC_GRV),
- LGUI(KC_TAB), LGUI(KC_Q), LGUI(KC_W), LGUI(KC_E), LGUI(KC_R), LGUI(KC_T), LGUI(KC_Y), LGUI(KC_U), LGUI(KC_I), LGUI(KC_O), LGUI(KC_P), LGUI(KC_LBRC), LGUI(KC_RBRC), LGUI(KC_BSPC),
- LGUI(KC_LCTL), KC_TRNS, KC_TRNS, LGUI(KC_D), LGUI(KC_F), LGUI(KC_G), LGUI(KC_H), LGUI(KC_J), LGUI(KC_K), LGUI(KC_L), LGUI(KC_SCLN), LGUI(KC_QUOT), KC_FN0,
- KC_LSFT, LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V), LGUI(KC_B), LGUI(KC_N), LGUI(KC_M), LGUI(KC_COMM), LGUI(KC_DOT), LGUI(KC_SLSH), KC_RSFT, KC_TRNS,
- KC_LALT, KC_LGUI, LGUI(KC_SPC), KC_LGUI, KC_RALT),
-
- /* Layer LALT: All keys with RALT modifier
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
-
- |------+------+-------+------+------|
- | LAlt | LGUI | Space | RGUI | RAlt |
- |------+------+-------+------+------|
- */
-
- [RALTLEV] = LAYOUT( // Right ALT layer by KC_L
-
- RALT(KC_ESC), RALT(KC_1), RALT(KC_2), RALT(KC_3), RALT(KC_4), RALT(KC_5), RALT(KC_6), RALT(KC_7), RALT(KC_8), RALT(KC_9), RALT(KC_0), RALT(KC_MINS), RALT(KC_EQL), RALT(KC_BSLS), RALT(KC_GRV),
- RALT(KC_TAB), RALT(KC_Q), RALT(KC_W), RALT(KC_E), RALT(KC_R), RALT(KC_T), RALT(KC_Y), RALT(KC_U), RALT(KC_I), RALT(KC_O), RALT(KC_P), RALT(KC_LBRC), RALT(KC_RBRC), RALT(KC_BSPC),
- RALT(KC_LCTL), RALT(KC_A), RALT(KC_S), RALT(KC_D), RALT(KC_F), RALT(KC_G), RALT(KC_H), RALT(KC_J), RALT(KC_K), KC_TRNS, KC_TRNS, RALT(KC_QUOT), KC_FN0,
- RALT(KC_LSFT), RALT(KC_Z), RALT(KC_X), RALT(KC_C), RALT(KC_V), RALT(KC_B), RALT(KC_N), RALT(KC_M), RALT(KC_COMM), RALT(KC_DOT), RALT(KC_SLSH), RALT(KC_RSFT), KC_TRNS,
- KC_LALT, KC_LGUI, RALT(KC_SPC), KC_RGUI, KC_RALT),
-
- /* Layer LALT: All keys with LALT modifier
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Contro | A | S | D | F | G | H | J | K | | ; | ' | RCtl/Ent | | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
- | Shift | Z | X | C | V | B | N | M | , | . | Fn2 | Shift | Fn0 | | |
- |--------+---+---+---+---+---+---+---+---+---+-----+-------+----------+-------+---|
-
- |------+------+-------+------+------|
- | LAlt | LGUI | Space | LGUI | RAlt |
- |------+------+-------+------+------|
- */
-
- [LALTLEV] = LAYOUT( // Right ALT layer by KC_L
-
- LALT(KC_ESC), LALT(KC_1), LALT(KC_2), LALT(KC_3), LALT(KC_4), LALT(KC_5), LALT(KC_6), LALT(KC_7), LALT(KC_8), LALT(KC_9), LALT(KC_0), LALT(KC_MINS), LALT(KC_EQL), LALT(KC_BSLS), LALT(KC_GRV),
- LALT(KC_TAB), LALT(KC_Q), LALT(KC_W), LALT(KC_E), LALT(KC_R), LALT(KC_T), LALT(KC_Y), LALT(KC_U), LALT(KC_I), LALT(KC_O), LALT(KC_P), LALT(KC_LBRC), LALT(KC_RBRC), LALT(KC_BSPC),
- LALT(KC_LCTL), KC_TRNS, KC_TRNS, LALT(KC_D), LALT(KC_F), LALT(KC_G), LALT(KC_H), LALT(KC_J), LALT(KC_K), LALT(KC_L), LALT(KC_SCLN), LALT(KC_QUOT), KC_FN0,
- KC_LSFT, LALT(KC_Z), LALT(KC_X), LALT(KC_C), LALT(KC_V), LALT(KC_B), LALT(KC_N), LALT(KC_M), LALT(KC_COMM), LALT(KC_DOT), LALT(KC_SLSH), KC_RSFT, KC_TRNS,
- KC_LALT, KC_LGUI, LALT(KC_SPC), KC_LGUI, KC_RALT),
-
- /* Layer WIN: Win layer
- |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---|
- | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
- |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---|
- | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
- |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---|
- | Contro | A | S | D | F | G | H | J | K | L | ; | ' | RCtl/Ent | | |
- |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---|
- | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Fn0 | | |
- |--------+---+---+---+---+---+---+---+---+---+---+-------+----------+-------+---|
-
- |------+------+-------+------+------|
- | LGui | LAlt | Space | RGui | Ralt |
- |------+------+-------+------+------|
- */
-
- [WIN] = LAYOUT( // BASE level with swapped GUI/ALT
-
- 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, LT(LGUILEV, KC_A), LT(LALTLEV, KC_S), KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, LT(RALTLEV, KC_L), LT(RGUILEV, KC_SCLN), KC_QUOT, KC_FN0,
- 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(HHKB),
- KC_RGUI, KC_RALT, KC_SPC, KC_RALT, KC_RGUI)};
-
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT) // RControl with tap Enter*
-};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- // MACRODOWN only works in this function
- switch (id)
- {
- case 0:
- if (record->event.pressed)
- {
- register_code(KC_RSFT);
- }
- else
- {
- unregister_code(KC_RSFT);
- }
- break;
- }
- return MACRO_NONE;
-};
diff --git a/keyboards/hhkb/keymaps/mjt/keymap.c b/keyboards/hhkb/keymaps/mjt/keymap.c
deleted file mode 100644
index e51eb8bf92..0000000000
--- a/keyboards/hhkb/keymaps/mjt/keymap.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/* -*- eval: (turn-on-orgtbl); -*-
- * default HHKB Layout
- */
-#include QMK_KEYBOARD_H
-
-#define BASE 0
-#define HHKB 1
-#define FUNK 2
-#define DYN 3
-#define CTL_ESC CTL_T(KC_ESC)
-#define MACSLEEP LCTL(LSFT(KC_POWER))
-
-enum hhkb_keycodes
-{
- QWERTY = SAFE_RANGE,
- DYNKEY,
- DYNAMIC_MACRO_RANGE,
-};
-
-#include "dynamic_macro.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-
- /* BASE Level: Default Layer
- |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
- | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | \ | ` |
- |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
- | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | Backs | |
- |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
- | Cont | A | S | D | F | G | H | J | K | L | ; | ' | Ent | | |
- |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
- | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Fn0 | | |
- |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
-
- |------+------+-----------------------+------+------|
- | LAlt | LGUI | ******* Space ******* | RGUI | RAlt |
- |------+------+-----------------------+------+------|
- */
-
- [BASE] = LAYOUT( // default layer
- 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_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,
- 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_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, SFT_T(KC_ENT), TT(FUNK),
- KC_LALT, KC_LGUI, /* */ KC_SPC, MO(DYN), KC_RALT),
-
- /* Layer HHKB: HHKB mode (HHKB Fn)
- |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
- | Pwr | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del |
- |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
- | Caps | | | | | | | | Psc | Slk | Pus | Up | | Backs | |
- |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
- | | VoD | VoU | Mut | | | * | / | Hom | PgU | Lef | Rig | Enter | | |
- |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
- | | | | | | | + | - | End | PgD | Dow | | | | |
- |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
-
- |------+------+----------------------+------+------+
- | **** | **** | ******************** | **** | **** |
- |------+------+----------------------+------+------+
-
-
-
- [HHKB] = LAYOUT(
- KC_PWR, 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),
-
- */
- [FUNK] = LAYOUT(
- KC_PWR, 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_UP, 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_LEFT, KC_DOWN, KC_RGHT, 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),
- [DYN] = LAYOUT(
- KC_TRNS, DYN_REC_START1, DYN_REC_START2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2,
- 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_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MACSLEEP, KC_HOME, 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_PGDN, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, DYN_REC_STOP, KC_TRNS, KC_TRNS)};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- // MACRODOWN only works in this function
- switch (id)
- {
- case 0:
- if (record->event.pressed)
- {
- register_code(KC_RSFT);
- }
- else
- {
- unregister_code(KC_RSFT);
- }
- break;
- }
- return MACRO_NONE;
-};
-
-bool process_record_user(uint16_t keycode, keyrecord_t *record)
-{
- uint16_t macro_kc = (keycode == MO(DYN) ? DYN_REC_STOP : keycode);
- if (!process_record_dynamic_macro(macro_kc, record))
- {
- return false;
- }
-
- return true;
-}
diff --git a/keyboards/hhkb/keymaps/shela/keymap.c b/keyboards/hhkb/keymaps/shela/keymap.c
deleted file mode 100644
index 2d5f4c64ac..0000000000
--- a/keyboards/hhkb/keymaps/shela/keymap.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * HHKB Pro 2 US Layout for shela
- */
-#include QMK_KEYBOARD_H
-#include "keymap_jis2us.h"
-#include "action_pseudo_lut.h"
-
-enum keymap_layout
-{
- BASE = 0,
- PSEUDO_US,
- DVORAK,
- MOUSE,
- TENKEY,
- HHKB,
- SPACE_FN,
-};
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-
- /* Layer 0: Default Layer
- * ,-----------------------------------------------------------------------------------------.
- * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | ` | BSp |
- * |-----------------------------------------------------------------------------------------|
- * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
- * |-----------------------------------------------------------------------------------------|
- * | Control | A | S | D | F | G | H | J | K | L | ; | ' | Enter |
- * |-----------------------------------------------------------------------------------------|
- * | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Fn0 |
- * `-----------------------------------------------------------------------------------------'
- * |LAlt | LGui | SpaceFN | RGui |RAlt |
- * `-----------------------------------------------------------------'
- */
- [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_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_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,
- OSM(MOD_LSFT), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(HHKB),
- KC_LALT, KC_LGUI, LT(SPACE_FN, KC_SPACE), KC_RGUI, KC_RALT),
-
- /* Layer 1: Pseudo US Layout Layer
- * ,-----------------------------------------------------------------------------------------.
- * | Esc | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | BSp |
- * |-----------------------------------------------------------------------------------------|
- * | Tab | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 |
- * |-----------------------------------------------------------------------------------------|
- * | Control | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Enter |
- * |-----------------------------------------------------------------------------------------|
- * | Shift | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Fn1 | Shift | Fn0 |
- * `-----------------------------------------------------------------------------------------'
- * |LGui | Fn3 | SpaceFN | Fn4 |RGui |
- * `-----------------------------------------------------------------'
- */
- [PSEUDO_US] =
- LAYOUT(KC_ESC, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_BSPC,
- KC_TAB, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1,
- KC_LCTL, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_ENT,
- KC_LSFT, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_FN1, KC_RSFT, MO(HHKB),
- KC_LGUI, KC_FN3, LT(SPACE_FN, KC_SPACE), KC_FN4, KC_RGUI),
-
- /* Layer 2: Dvorak Layer
- * ,-----------------------------------------------------------------------------------------.
- * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | [ | ] | ` | BSp |
- * |-----------------------------------------------------------------------------------------|
- * | Tab | ' | , | . | P | Y | F | G | C | R | L | / | = | \ |
- * |-----------------------------------------------------------------------------------------|
- * | Control | A | O | E | U | I | D | H | T | N | S | - | Enter |
- * |-----------------------------------------------------------------------------------------|
- * | Shift | ; | Q | J | K | X | B | M | W | V | Z | Shift | Fn0 |
- * `-----------------------------------------------------------------------------------------'
- * |LAlt | LGui | SpaceFN | RGui |RAlt |
- * `-----------------------------------------------------------------'
- */
- [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_LBRC, KC_RBRC, KC_GRV, 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_EQL, KC_BSLS,
- 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_ENT,
- KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, MO(HHKB),
- KC_LALT, KC_LGUI, LT(SPACE_FN, KC_SPACE), KC_RGUI, KC_RALT),
-
- /* Layer 3: Mouse layer
- * ,-----------------------------------------------------------------------------------------.
- * | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | |
- * |-----------------------------------------------------------------------------------------|
- * | | | | | | | MwL | MwD | MwU | MwR | | | | |
- * |-----------------------------------------------------------------------------------------|
- * | | | | | | | McL | McD | McU | McR | | | |
- * |-----------------------------------------------------------------------------------------|
- * | | | | | | | Mb1 | Mb2 | Mb3 | | | | Fn0 |
- * `-----------------------------------------------------------------------------------------'
- * | | | Mb1 | | |
- * `-----------------------------------------------------------------'
- */
- [MOUSE] =
- 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_NO, KC_TRNS,
- KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_WH_L, KC_WH_D, KC_WH_U, KC_WH_R, KC_NO, KC_NO, KC_NO, KC_NO,
- KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, KC_NO, KC_NO, KC_TRNS,
- KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_BTN1, KC_BTN2, KC_BTN3, KC_NO, KC_NO, KC_TRNS, MO(HHKB),
- KC_TRNS, KC_TRNS, KC_BTN1, KC_TRNS, KC_TRNS),
-
- /* Layer 4: Tenkey layer
- * ,-----------------------------------------------------------------------------------------.
- * | Esc | | | | | | | | | | / | * | - | | BSp |
- * |-----------------------------------------------------------------------------------------|
- * | | | | | | | | | | 7 | 8 | 9 | + | |
- * |-----------------------------------------------------------------------------------------|
- * | | | | | | | | | | 4 | 5 | 6 | Enter |
- * |-----------------------------------------------------------------------------------------|
- * | | | | | | | | | 1 | 2 | 3 | + | Fn0 |
- * `-----------------------------------------------------------------------------------------'
- * | | | SpaceFN | 0 | . |
- * `-----------------------------------------------------------------'
- */
- [TENKEY] =
- LAYOUT(KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PSLS, KC_PAST, KC_PMNS, KC_NO, KC_BSPC,
- KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, KC_NO,
- KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_KP_4, KC_KP_5, KC_KP_6, KC_PENT,
- KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_KP_1, KC_KP_2, KC_KP_3, KC_PPLS, MO(HHKB),
- KC_TRNS, KC_TRNS, LT(SPACE_FN, KC_SPACE), KC_KP_0, KC_PDOT),
-
- /* Layer 5: HHKB mode (HHKB Fn)
- * ,-----------------------------------------------------------------------------------------.
- * | Pwr | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | Ins | Del |
- * |-----------------------------------------------------------------------------------------|
- * | Caps | Fn5 | Fn6 | Fn7 | Fn8 | Fn9 | | | Psc | Slk | Pus | Up | | BSp |
- * |-----------------------------------------------------------------------------------------|
- * | | VoD | VoU | Mut | | | * | / | Hom | PgU | Lef | Rig | Enter |
- * |-----------------------------------------------------------------------------------------|
- * | | | | | | | + | - | End | PgD | Dow | | |
- * `-----------------------------------------------------------------------------------------'
- * | | | | | |
- * `-----------------------------------------------------------------'
- */
- [HHKB] =
- LAYOUT(KC_PWR, 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_FN5, KC_FN6, KC_FN7, KC_FN8, KC_FN9, 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),
-
- /* Layer 6: SpaceFN
- * ,-----------------------------------------------------------------------------------------.
- * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | | Del |
- * |-----------------------------------------------------------------------------------------|
- * | | Hom | Up | End | | | | Hom | End | | Psc | Slk | Pau | Ins |
- * |-----------------------------------------------------------------------------------------|
- * | | Lef | Dow | Rig | PgU | | Lef | Dow | Up | Rig | | | |
- * |-----------------------------------------------------------------------------------------|
- * | | | | PgD | | Spc | | PgD | PgU | | | | |
- * `-----------------------------------------------------------------------------------------'
- * | | | | | |
- * `-----------------------------------------------------------------'
- */
- [SPACE_FN] =
- LAYOUT(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_NO, KC_DEL,
- KC_TRNS, KC_HOME, KC_UP, KC_END, KC_NO, KC_NO, KC_NO, KC_HOME, KC_END, KC_NO, KC_PSCR, KC_SLCK, KC_PAUS, KC_INS,
- KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGUP, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_NO, KC_NO, KC_TRNS,
- KC_TRNS, KC_NO, KC_NO, KC_PGDN, KC_NO, KC_SPC, KC_NO, KC_PGDN, KC_PGUP, KC_NO, KC_NO, KC_TRNS, KC_NO,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
-};
-
-/*
- * user defined action function
- */
-enum function_id
-{
- PSEUDO_US_FUNCTION,
-};
-
-void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
-
- switch (id)
- {
- case PSEUDO_US_FUNCTION:
- action_pseudo_lut(record, BASE, keymap_jis2us);
- break;
- }
-}
-
-/*
- * Fn action definition
- */
-const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_FUNCTION(PSEUDO_US_FUNCTION),
- [3] = ACTION_MODS_TAP_KEY(MOD_LALT, KC_MHEN),
- [4] = ACTION_MODS_TAP_KEY(MOD_RALT, KC_KANA),
- [5] = ACTION_DEFAULT_LAYER_SET(BASE),
- [6] = ACTION_DEFAULT_LAYER_SET(PSEUDO_US),
- [7] = ACTION_DEFAULT_LAYER_SET(MOUSE),
- [8] = ACTION_DEFAULT_LAYER_SET(TENKEY),
- [9] = ACTION_DEFAULT_LAYER_SET(DVORAK),
-};
diff --git a/keyboards/hhkb/matrix.c b/keyboards/hhkb/matrix.c
deleted file mode 100644
index 666b6f595f..0000000000
--- a/keyboards/hhkb/matrix.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
-Copyright 2011 Jun Wako <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * scan matrix
- */
-#include <stdint.h>
-#include <stdbool.h>
-#include <util/delay.h>
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "timer.h"
-#include "matrix.h"
-#include "hhkb_avr.h"
-#include <avr/wdt.h>
-#include "suspend.h"
-#include "lufa.h"
-
-
-// matrix power saving
-#define MATRIX_POWER_SAVE 10000
-static uint32_t matrix_last_modified = 0;
-
-// matrix state buffer(1:on, 0:off)
-static matrix_row_t *matrix;
-static matrix_row_t *matrix_prev;
-static matrix_row_t _matrix0[MATRIX_ROWS];
-static matrix_row_t _matrix1[MATRIX_ROWS];
-
-
-inline
-uint8_t matrix_rows(void)
-{
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void)
-{
- return MATRIX_COLS;
-}
-
-void matrix_init(void)
-{
-#ifdef DEBUG
- debug_enable = true;
- debug_keyboard = true;
-#endif
-
- KEY_INIT();
-
- // initialize matrix state: all keys off
- for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00;
- for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00;
- matrix = _matrix0;
- matrix_prev = _matrix1;
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-uint8_t matrix_scan(void)
-{
- uint8_t *tmp;
-
- tmp = matrix_prev;
- matrix_prev = matrix;
- matrix = tmp;
-
- // power on
- if (!KEY_POWER_STATE()) KEY_POWER_ON();
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- for (uint8_t col = 0; col < MATRIX_COLS; col++) {
- KEY_SELECT(row, col);
- _delay_us(5);
-
- // Not sure this is needed. This just emulates HHKB controller's behaviour.
- if (matrix_prev[row] & (1<<col)) {
- KEY_PREV_ON();
- }
- _delay_us(10);
-
- // NOTE: KEY_STATE is valid only in 20us after KEY_ENABLE.
- // If V-USB interrupts in this section we could lose 40us or so
- // and would read invalid value from KEY_STATE.
- uint8_t last = TIMER_RAW;
-
- KEY_ENABLE();
-
- // Wait for KEY_STATE outputs its value.
- // 1us was ok on one HHKB, but not worked on another.
- // no wait doesn't work on Teensy++ with pro(1us works)
- // no wait does work on tmk PCB(8MHz) with pro2
- // 1us wait does work on both of above
- // 1us wait doesn't work on tmk(16MHz)
- // 5us wait does work on tmk(16MHz)
- // 5us wait does work on tmk(16MHz/2)
- // 5us wait does work on tmk(8MHz)
- // 10us wait does work on Teensy++ with pro
- // 10us wait does work on 328p+iwrap with pro
- // 10us wait doesn't work on tmk PCB(8MHz) with pro2(very lagged scan)
- _delay_us(5);
-
- if (KEY_STATE()) {
- matrix[row] &= ~(1<<col);
- } else {
- matrix[row] |= (1<<col);
- }
-
- // Ignore if this code region execution time elapses more than 20us.
- // MEMO: 20[us] * (TIMER_RAW_FREQ / 1000000)[count per us]
- // MEMO: then change above using this rule: a/(b/c) = a*1/(b/c) = a*(c/b)
- if (TIMER_DIFF_RAW(TIMER_RAW, last) > 20/(1000000/TIMER_RAW_FREQ)) {
- matrix[row] = matrix_prev[row];
- }
-
- _delay_us(5);
- KEY_PREV_OFF();
- KEY_UNABLE();
-
- // NOTE: KEY_STATE keep its state in 20us after KEY_ENABLE.
- // This takes 25us or more to make sure KEY_STATE returns to idle state.
-#ifdef HHKB_JP
- // Looks like JP needs faster scan due to its twice larger matrix
- // or it can drop keys in fast key typing
- _delay_us(30);
-#else
- _delay_us(75);
-#endif
- }
- if (matrix[row] ^ matrix_prev[row]) matrix_last_modified = timer_read32();
- }
- // power off
- if (KEY_POWER_STATE() &&
- (USB_DeviceState == DEVICE_STATE_Suspended ||
- USB_DeviceState == DEVICE_STATE_Unattached ) &&
- timer_elapsed32(matrix_last_modified) > MATRIX_POWER_SAVE) {
- KEY_POWER_OFF();
- suspend_power_down();
- }
-
- matrix_scan_quantum();
-
- return 1;
-}
-
-bool matrix_is_modified(void)
-{
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- if (matrix[i] != matrix_prev[i])
- return true;
- }
- return false;
-}
-
-inline
-bool matrix_has_ghost(void)
-{
- return false;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & (1<<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print("\nr/c 01234567\n");
- for (uint8_t row = 0; row < matrix_rows(); row++) {
- xprintf("%02X: %08b\n", row, bitrev(matrix_get_row(row)));
- }
-}
-
-uint8_t matrix_key_count(void) {
- uint8_t count = 0;
- for (int8_t r = MATRIX_ROWS - 1; r >= 0; --r) {
- count += bitpop16(matrix_get_row(r));
- }
- return count;
-}
-
-void matrix_power_up(void) {
- KEY_POWER_ON();
-}
-void matrix_power_down(void) {
- KEY_POWER_OFF();
-}
diff --git a/keyboards/hhkb/readme.md b/keyboards/hhkb/readme.md
deleted file mode 100644
index 57eb814391..0000000000
--- a/keyboards/hhkb/readme.md
+++ /dev/null
@@ -1,14 +0,0 @@
-HHKB Alternate Controller
-===
-
-An alternative controler for the HHKB designed by hasu.
-
-Keyboard Maintainer: QMK Community
-Hardware Supported: HHKB Alternate Controller
-Hardware Availability: https://geekhack.org/index.php?topic=12047.0
-
-Make example for this keyboard (after setting up your build environment):
-
- make hhkb:default
-
-See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
diff --git a/keyboards/hhkb/rules.mk b/keyboards/hhkb/rules.mk
deleted file mode 100644
index 68fb51a30c..0000000000
--- a/keyboards/hhkb/rules.mk
+++ /dev/null
@@ -1,71 +0,0 @@
-# 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
-# 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 = yes # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-CUSTOM_MATRIX = yes # Custom matrix file for the HHKB
-# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-# SLEEP_LED_ENABLE = yes # 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 = yes # Enable keyboard backlight functionality
-# MIDI_ENABLE = yes # MIDI controls
-# UNICODE_ENABLE = yes # Unicode
-# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
-
-
-# HHKB_RN42_ENABLE = yes # Enable support for hasu's BT alt controller -- code borrowed from tmk source tree.
-
-# Either uncomment the HHKB_RN42_ENABLE line above, or run make enabling the
-# feature. Be sure to clean any existing build before trying to enable rn42
-# support. For example:
-#
-# make hhkb-keymap-clean
-# make hhkb-keymap-dfu HHKB_RN42_ENABLE=yes
-
-# project specific files
-SRC = matrix.c
-
-ifeq ($(strip $(HHKB_RN42_ENABLE)), yes)
-
-OPT_DEFS += -DHHKB_RN42_ENABLE
-
-# Support for the RN42 Bluetooth module. This is the BT module in Hasu's BT
-# HHKB Alt controller.
-RN42_DIR = rn42
-
-SRC += serial_uart.c \
- rn42/suart.S \
- rn42/rn42.c \
- rn42/rn42_task.c \
- rn42/battery.c \
- rn42/main.c
-
-VPATH += $(RN42_DIR)
-
-endif
-
-
-# debug-on: EXTRAFLAGS += -DDEBUG -DDEBUG_ACTION
-# debug-on: all
-
-# 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/hs60/v1/readme.md b/keyboards/hs60/v1/readme.md
index cbf5f4faab..4b613e2a52 100644
--- a/keyboards/hs60/v1/readme.md
+++ b/keyboards/hs60/v1/readme.md
@@ -5,7 +5,7 @@ HS60
This is a standard fixed layout 60% PCB. It comes in two varians, ISO and ANSI and support full per-key RGB.
-Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar)
+Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
Hardware Supported: HS60 ISO and ANSI PCBs with Atmega 32u4
Hardware Availability: https://mechboards.co.uk/shop/all/hs60-pcb/
diff --git a/keyboards/hs60/v2/readme.md b/keyboards/hs60/v2/readme.md
index bd747b1f3c..f6f75cc7bf 100644
--- a/keyboards/hs60/v2/readme.md
+++ b/keyboards/hs60/v2/readme.md
@@ -5,7 +5,7 @@ HS60 V2.0
This is a standard fixed layout 60% PCB. It comes in three variants; ISO, ANSI and HHKB and support full per-key RGB.
-Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar)
+Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
Hardware Supported: HS60 ISO, ANSI and HHKB PCBs with STM32F303CC
Hardware Availability: http://groupbuys.mechboards.co.uk/shop/hs60-hotswap-60-pcb/
diff --git a/keyboards/infinity60/keymaps/jpetermans/keymap.c b/keyboards/infinity60/keymaps/jpetermans/keymap.c
index c99b05e4c5..a169d658f7 100644
--- a/keyboards/infinity60/keymaps/jpetermans/keymap.c
+++ b/keyboards/infinity60/keymaps/jpetermans/keymap.c
@@ -15,8 +15,6 @@ enum ic60_keycodes {
NUMPAD,
FNAV,
MEDIA,
- TILDE,
- CTLALTDEL,
BACKLIGHT,
BRIGHT,
DIM,
@@ -55,7 +53,7 @@ const uint16_t 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_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_BSPC, \
TT(_FNAV), 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,F(TILDE),KC_NO, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH,LM(_TILDE, MOD_LSFT),KC_NO, \
KC_LCTL, KC_LGUI,KC_LALT, LT(_FNAV, KC_SPC), KC_RALT,TG(_NUMPAD),MO(_MEDIA), KC_RCTL \
),
@@ -74,7 +72,7 @@ const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_CAPS,_______,_______,_______,_______,_______,_______,KC_PGUP,KC_UP,KC_PGDN,KC_PSCR,_______,_______,KC_DEL, \
_______,_______,KC_BTN2,_______,_______,_______,KC_HOME,KC_LEFT,KC_DOWN,KC_RGHT,KC_INS,_______,_______, \
_______,KC_APP,KC_BTN1,KC_CALC,_______,_______,KC_END,_______,_______,_______,_______,_______,KC_NO, \
- _______,_______,_______, _______, F(CTLALTDEL),KC_NLCK,_______,_______ \
+ _______,_______,_______, _______, C(A(KC_DEL)),KC_NLCK,_______,_______ \
),
/* media */
@@ -162,8 +160,6 @@ uint8_t led_game[5] = {
//======== qmk functions =========
const uint16_t fn_actions[] = {
- [CTLALTDEL] = ACTION_KEY(LALT(LCTL(KC_DEL))),
- [TILDE] = ACTION_LAYER_MODS(_TILDE, MOD_LSFT),
[ALL] = ACTION_FUNCTION(ACTION_LEDS_ALL),
[GAME] = ACTION_FUNCTION(ACTION_LEDS_GAME),
[BACKLIGHT] = ACTION_FUNCTION(ACTION_LEDS_BACKLIGHT),
diff --git a/keyboards/j80/rules.mk b/keyboards/j80/rules.mk
index b2ca3a0c2b..4b21de4e8e 100644
--- a/keyboards/j80/rules.mk
+++ b/keyboards/j80/rules.mk
@@ -21,5 +21,3 @@ 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
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/jc65/v32a/rules.mk b/keyboards/jc65/v32a/rules.mk
index fd340f04eb..20f0222c11 100644
--- a/keyboards/jc65/v32a/rules.mk
+++ b/keyboards/jc65/v32a/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/jd45/keymaps/justin/keymap.c b/keyboards/jd45/keymaps/justin/keymap.c
index 1c0e780724..985ff19b88 100644
--- a/keyboards/jd45/keymaps/justin/keymap.c
+++ b/keyboards/jd45/keymaps/justin/keymap.c
@@ -3,15 +3,22 @@
#define KC_MO1 MO(1)
#define KC_MO2 MO(2)
#define KC_MO3 MO(3)
+#define KC_LM4 LM(4, MOD_LSFT)
+
+#define KC_MTCM MT(MOD_LCTL, KC_MINS)
+#define KC_MTSG MT(MOD_LSFT, KC_GRV)
+#define KC_MTSW MT(MOD_RSFT, KC_RGUI)
+#define KC_MTSC MT(MOD_RSFT, KC_CAPS)
+#define KC_MTCT MT(MOD_LCTL, KC_TAB)
#define KC_BLTG BL_TOGG
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_kc(
ESC, Q, W, F, P, G, J, L, U, Y, SCLN, QUOT, BSPC,
- FN8, A, R, S, T, D, H, N, E, I, O, ENT,
- LSFT, Z, X, C, V, B, K, M, COMM, DOT, SLSH, FN6,
- FN4, LGUI, FN7, MO2, MO1, SPC, FN5, RALT, MO3, FN0),
+ MTCT, A, R, S, T, D, H, N, E, I, O, ENT,
+ LSFT, Z, X, C, V, B, K, M, COMM, DOT, SLSH, MTSC,
+ MTSG, LGUI, LM4, MO2, MO1, SPC, MTSW, RALT, MO3, MTCM),
[1] = LAYOUT_kc(
TRNS, FN10, FN11, FN12, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, UP, DEL,
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, HOME, PGUP, LEFT, RGHT,
@@ -42,13 +49,6 @@ enum macro_id
};
const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_MINS),
- [4] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_GRV),
- [5] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_RGUI),
- [6] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_CAPS),
- [7] = ACTION_LAYER_MODS(4, MOD_LSFT), // FN4
- [8] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_TAB),
-
[10] = ACTION_MACRO(PSWD1),
[11] = ACTION_MACRO(PSWD2),
[12] = ACTION_MACRO(PSWD3)
diff --git a/keyboards/jd45/keymaps/mjt6u/keymap.c b/keyboards/jd45/keymaps/mjt6u/keymap.c
index 6fda6ac95f..dc7c3bb7e3 100644
--- a/keyboards/jd45/keymaps/mjt6u/keymap.c
+++ b/keyboards/jd45/keymaps/mjt6u/keymap.c
@@ -119,7 +119,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record)
{
persistent_default_layer_set(1UL << _QWERTY);
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_fnpc, false, 0);
+ PLAY_SONG(tone_fnpc);
#endif
print("Space-FN");
}
@@ -130,7 +130,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record)
{
persistent_default_layer_set(1UL << _QWERTYNUMMODS);
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_fnmac, false, 0);
+ PLAY_SONG(tone_fnmac);
#endif
print("Space-Numpad");
}
diff --git a/keyboards/jj40/keymaps/stevexyz/config.h b/keyboards/jj40/keymaps/stevexyz/config.h
index 4d4825f9b6..84c02dddd6 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 0117b5e2ee..0000000000
--- 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]},"<i class='fa fa-volume-off'></i>\n<i class='fa fa-angle-double-left'></i>\n~\n`\nS\n\n\n\n\n\nfn","<i class='fa fa-volume-down'></i>\n<i class='fa fa-angle-double-down'></i>\n_\n-\nD\n\n\n\n\n\nnum",{t:"#000000"},"<i class='fa fa-volume-up'></i>\n<i class='fa fa-angle-double-up'></i>\n+\n=\nF",{t:"#000000\n\n\n\n\n\n\n\n\n\n#804020"},"<i class='fa fa-play'></i>\n<i class='fa fa-angle-double-right'></i>\n{\n[\nG\n\n\n\n\n\n<i class='fa fa-apple'></i>","<i class='fa fa-step-forward'></i>\n<i class='fa fa-arrow-left'></i>\n}\n]\nH\n\n\n\n\n\n<i class='fa fa-apple'></i>",{t:"#000000"},"\n<i class='fa fa-arrow-down'></i>\n|\n\\\nJ",{t:"#000000\n\n\n\n\n\n\n\n\n\n#804020"},"\n<i class='fa fa-arrow-up'></i>\n:\n;\nK\n\n\n\n\n\nfn","\n<i class='fa fa-arrow-right'></i>\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 4045d07109..02601a30d9 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<<USB_LED_NUM_LOCK))) {
SEND_STRING(SS_TAP(X_NUMLOCK)); //register_code(KC_NUMLOCK); unregister_code(KC_NUMLOCK);
}
diff --git a/keyboards/jj40/keymaps/stevexyz/readme.md b/keyboards/jj40/keymaps/stevexyz/readme.md
index d404bcc0bd..4b09f0f1bf 100644
--- a/keyboards/jj40/keymaps/stevexyz/readme.md
+++ b/keyboards/jj40/keymaps/stevexyz/readme.md
@@ -1,6 +1,7 @@
# jj28 (aka jj40 super micro edition :))
-With this configuration a 4x12 jj40 (with 48 keys) is transformed into an ortholinear PyroL-vderm 28 keys inspired layout one. This keyboard can be actually called jj28!
+With this configuration a 4x12 jj40 (with 48 keys) is being removed 20 keys and transformed into an ortholinear Alpha28 PyroL-vderm 28 keys inspired layout one.
+This keyboard can be actually called jj28!
![Bare layout](https://i.ibb.co/7GK1LY7/layout-0.jpg)
@@ -15,6 +16,6 @@ Surely you have an additional option, and personally, after using it as a daily
Notes on layout:
After few tests I found out that the space at the end is the best for people that are very used to “standard†keyboards (basically almost everybody), retaining years of muscle memory.
-Moreover, also shift, fn and numsym layer keys are good to be replicated on central line (and also keeping in the order will allow a single finger shift+fn on the left and also shift+num on the right).
+And moreover, also shift, fn and numsym layer keys are good to be replicated on central line.
[Keyboard layout editor](http://www.keyboard-layout-editor.com/#/) raw data in keyboard-layout-editor-raw-data.txt file.
diff --git a/keyboards/jj40/keymaps/stevexyz/rules.mk b/keyboards/jj40/keymaps/stevexyz/rules.mk
index 612e5d7750..1e4d0dedf7 100644
--- a/keyboards/jj40/keymaps/stevexyz/rules.mk
+++ b/keyboards/jj40/keymaps/stevexyz/rules.mk
@@ -8,7 +8,6 @@ COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = no # USB Nkey Rollover (see: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work)
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by default
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
-RGBLIGHT_CUSTOM_DRIVER = yes
MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
diff --git a/keyboards/jj50/keymaps/archetype/rules.mk b/keyboards/jj50/keymaps/archetype/rules.mk
index 1a63376bed..9a3c196029 100644
--- a/keyboards/jj50/keymaps/archetype/rules.mk
+++ b/keyboards/jj50/keymaps/archetype/rules.mk
@@ -48,9 +48,6 @@ 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
-
-#OPT_DEFS = -DDEBUG_LEVEL=0
-
# custom matrix setup
CUSTOM_MATRIX = yes
SRC = matrix.c i2c.c backlight.c
diff --git a/keyboards/jj50/rules.mk b/keyboards/jj50/rules.mk
index 38faf37162..73be71d35e 100644
--- a/keyboards/jj50/rules.mk
+++ b/keyboards/jj50/rules.mk
@@ -27,6 +27,4 @@ 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
-#OPT_DEFS = -DDEBUG_LEVEL=0
-
LAYOUTS = ortho_5x12
diff --git a/keyboards/kbdclack/kaishi65/config.h b/keyboards/kbdclack/kaishi65/config.h
new file mode 100644
index 0000000000..3ea67aae0a
--- /dev/null
+++ b/keyboards/kbdclack/kaishi65/config.h
@@ -0,0 +1,251 @@
+/*
+Copyright 2020 KBDClack
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x1A81
+#define DEVICE_VER 0x0001
+#define MANUFACTURER KBDClack
+#define PRODUCT kaishi65
+#define DESCRIPTION KBDClack made 65% PCB based on the MULLET from coseyfannitutti
+
+/* 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 { D0, D1, B0, F0, F1 }
+#define MATRIX_COL_PINS { B2, F4, F5, F6, F7, C7, C6, B6, B5, B4, D7, D6, D4, D2, D3 }
+#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/kbdclack/kaishi65/info.json b/keyboards/kbdclack/kaishi65/info.json
new file mode 100644
index 0000000000..64ce89dd5a
--- /dev/null
+++ b/keyboards/kbdclack/kaishi65/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "kaishi65",
+ "url": "https://github.com/powerlemming/KBDClack",
+ "maintainer": "KBDClack",
+ "width": 16,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_65_ansi": {
+ "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":"Home", "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":"Pg 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":"Pg dn", "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":"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/kbdclack/kaishi65/kaishi65.c b/keyboards/kbdclack/kaishi65/kaishi65.c
new file mode 100644
index 0000000000..97f608f468
--- /dev/null
+++ b/keyboards/kbdclack/kaishi65/kaishi65.c
@@ -0,0 +1,17 @@
+/* Copyright 2020 KBDClack
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "kaishi65.h"
diff --git a/keyboards/kbdclack/kaishi65/kaishi65.h b/keyboards/kbdclack/kaishi65/kaishi65.h
new file mode 100644
index 0000000000..6343608324
--- /dev/null
+++ b/keyboards/kbdclack/kaishi65/kaishi65.h
@@ -0,0 +1,44 @@
+/* Copyright 2020 KBDClack
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+#define _x_ 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_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, _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_, K49, K4A, K4B, K4C, K4D, K4E} \
+}
diff --git a/keyboards/kbdclack/kaishi65/keymaps/default/keymap.c b/keyboards/kbdclack/kaishi65/keymaps/default/keymap.c
new file mode 100644
index 0000000000..46d68182f4
--- /dev/null
+++ b/keyboards/kbdclack/kaishi65/keymaps/default/keymap.c
@@ -0,0 +1,39 @@
+/* Copyright 2020 KBDClack
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#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_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),
+
+ [_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_BTN1, KC_MS_U, KC_BTN2, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS,
+ _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME,
+ _______, _______, _______, _______, _______, _______, _______, KC_MUTE, _______, _______, _______, _______, KC_VOLU, KC_END,
+ _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT)
+};
diff --git a/keyboards/kbdclack/kaishi65/keymaps/default/readme.md b/keyboards/kbdclack/kaishi65/keymaps/default/readme.md
new file mode 100644
index 0000000000..c3c1392a96
--- /dev/null
+++ b/keyboards/kbdclack/kaishi65/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for kaishi65
diff --git a/keyboards/kbdclack/kaishi65/readme.md b/keyboards/kbdclack/kaishi65/readme.md
new file mode 100644
index 0000000000..11fbd43bab
--- /dev/null
+++ b/keyboards/kbdclack/kaishi65/readme.md
@@ -0,0 +1,14 @@
+# kaishi65
+A sleek 65% keyboard made from CNC machined aluminium
+
+*(PCB based on coseyfannitutti's MULLET design)*
+
+* Keyboard Maintainer: [KBDClack](https://github.com/powerlemming)
+* Hardware Supported: The kaishi65 line of products (case + PCB)
+* Hardware Availability: www.kbdclack.com
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kbdclack/kaishi65: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/kbdclack/kaishi65/rules.mk b/keyboards/kbdclack/kaishi65/rules.mk
new file mode 100644
index 0000000000..9fbf5373a5
--- /dev/null
+++ b/keyboards/kbdclack/kaishi65/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 = 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
+
+LAYOUTS = 65_ansi
diff --git a/keyboards/kbdfans/kbd67/hotswap/hotswap.h b/keyboards/kbdfans/kbd67/hotswap/hotswap.h
index 45cf537cbe..ba6c1686fa 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 22943357b3..0000000000
--- 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_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(
- 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(
- _______, 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/keyboards/kbdfans/kbd67/hotswap/keymaps/bcat/readme.md b/keyboards/kbdfans/kbd67/hotswap/keymaps/bcat/readme.md
deleted file mode 100644
index 16effc3815..0000000000
--- a/keyboards/kbdfans/kbd67/hotswap/keymaps/bcat/readme.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# bcat's KBD67 hotswap layout
-
-This is a standard 65% keyboard layout, with an HHKB-style (split) backspace
-and media controls in the function layer (centered around the ESDF cluster).
-
-## Default layer
-
-![Default layer layout](https://i.imgur.com/Vdnw2mp.png)
-
-([KLE](http://www.keyboard-layout-editor.com/#/gists/dd675b40cc4df2c7bb78847ac29f5988))
-
-## Function layer
-
-![Function layer layout](https://i.imgur.com/Q304GlI.png)
-
-([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 08dd1f6359..7739b69c0e 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/rev1/config.h b/keyboards/kbdfans/kbd67/rev1/config.h
index d20dcb1c57..86ef3b8139 100644
--- a/keyboards/kbdfans/kbd67/rev1/config.h
+++ b/keyboards/kbdfans/kbd67/rev1/config.h
@@ -20,8 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x0000
+#define VENDOR_ID 0x4B42
+#define PRODUCT_ID 0x6066
#define DEVICE_VER 0x0001
#define MANUFACTURER kbdfans
#define PRODUCT kbd67
diff --git a/keyboards/kbdfans/kbd67/rev1/keymaps/via/keymap.c b/keyboards/kbdfans/kbd67/rev1/keymaps/via/keymap.c
new file mode 100644
index 0000000000..48c9cd9804
--- /dev/null
+++ b/keyboards/kbdfans/kbd67/rev1/keymaps/via/keymap.c
@@ -0,0 +1,75 @@
+/* Copyright 2018 '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 <http://www.gnu.org/licenses/>.
+ */
+#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|
+ * |----------------------------------------------------------------|
+ * |Ctrl | 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_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, 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_DEL,KC_INS,
+ KC_CAPS,_______, 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),
+
+
+[2] = LAYOUT_65_ansi(
+ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,
+ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,
+ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,
+ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______,
+ _______, _______, _______, _______, _______,_______,_______,_______,_______,_______),
+
+
+[3] = LAYOUT_65_ansi(
+ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,
+ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,
+ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,
+ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______, _______,_______,_______,
+ _______, _______, _______, _______, _______,_______,_______,_______,_______,_______),
+
+};
diff --git a/keyboards/kbdfans/kbd67/rev1/keymaps/via/readme.md b/keyboards/kbdfans/kbd67/rev1/keymaps/via/readme.md
new file mode 100644
index 0000000000..f32cf23932
--- /dev/null
+++ b/keyboards/kbdfans/kbd67/rev1/keymaps/via/readme.md
@@ -0,0 +1 @@
+# The via keymap for kbd67
diff --git a/keyboards/kbdfans/kbd67/rev1/keymaps/via/rules.mk b/keyboards/kbdfans/kbd67/rev1/keymaps/via/rules.mk
new file mode 100644
index 0000000000..36b7ba9cbc
--- /dev/null
+++ b/keyboards/kbdfans/kbd67/rev1/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/kbdfans/kbd67/rev1/rules.mk b/keyboards/kbdfans/kbd67/rev1/rules.mk
index 7e305070ba..8e96199b3d 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/rev2.h b/keyboards/kbdfans/kbd67/rev2/rev2.h
index d4944109ea..dba4349266 100644
--- a/keyboards/kbdfans/kbd67/rev2/rev2.h
+++ b/keyboards/kbdfans/kbd67/rev2/rev2.h
@@ -85,6 +85,8 @@
{ 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 8ff62ba428..de55438dd8 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 65_ansi_blocker
+LAYOUTS = 65_ansi 65_iso 65_ansi_blocker 65_ansi_blocker_split_bs
diff --git a/keyboards/kbdfans/kbd6x/keymaps/konstantin/config.h b/keyboards/kbdfans/kbd6x/keymaps/konstantin/config.h
index 4b511eb848..37f4e42c71 100644
--- a/keyboards/kbdfans/kbd6x/keymaps/konstantin/config.h
+++ b/keyboards/kbdfans/kbd6x/keymaps/konstantin/config.h
@@ -1,3 +1,5 @@
#pragma once
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
+
#define LAYER_FN
diff --git a/keyboards/kbdfans/kbd6x/keymaps/konstantin/keymap.c b/keyboards/kbdfans/kbd6x/keymaps/konstantin/keymap.c
index 46cc0a1137..304234a3f4 100644
--- a/keyboards/kbdfans/kbd6x/keymaps/konstantin/keymap.c
+++ b/keyboards/kbdfans/kbd6x/keymaps/konstantin/keymap.c
@@ -6,7 +6,7 @@ enum keycodes_keymap {
};
enum layers_keymap {
- L_RCTRL = L_RANGE_KEYMAP,
+ L_RCTRL = LAYERS_KEYMAP,
};
void eeconfig_init_keymap(void) {
diff --git a/keyboards/kbdfans/kbd6x/keymaps/konstantin/rules.mk b/keyboards/kbdfans/kbd6x/keymaps/konstantin/rules.mk
index c75488af62..e2f34468a6 100644
--- a/keyboards/kbdfans/kbd6x/keymaps/konstantin/rules.mk
+++ b/keyboards/kbdfans/kbd6x/keymaps/konstantin/rules.mk
@@ -1,12 +1,19 @@
-BACKLIGHT_ENABLE = no
-BOOTMAGIC_ENABLE = no
+# Generic features
+BOOTMAGIC_ENABLE = lite
COMMAND_ENABLE = yes
CONSOLE_ENABLE = no
EXTRAKEY_ENABLE = yes
-GRAVE_ESC_ENABLE = no
MOUSEKEY_ENABLE = yes
NKRO_ENABLE = yes
-RGBLIGHT_ENABLE = yes
-SPACE_CADET_ENABLE = no
TAP_DANCE_ENABLE = yes
UNICODEMAP_ENABLE = no
+
+# Keyboard-specific features
+BACKLIGHT_ENABLE = no
+RGBLIGHT_ENABLE = yes
+VIA_ENABLE = yes
+
+# Firmware size reduction
+GRAVE_ESC_ENABLE = no
+MAGIC_ENABLE = no
+SPACE_CADET_ENABLE = no
diff --git a/keyboards/kbdfans/kbd75/keymaps/edulpn/keymap.c b/keyboards/kbdfans/kbd75/keymaps/edulpn/keymap.c
index 7e715a767c..533d83fdbb 100644
--- a/keyboards/kbdfans/kbd75/keymaps/edulpn/keymap.c
+++ b/keyboards/kbdfans/kbd75/keymaps/edulpn/keymap.c
@@ -8,7 +8,7 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[WINDOWS_LAYER] = 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, TG(MAC_LAYER), KC_DEL,
+ 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, TO(MAC_LAYER), 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_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_END,
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,
@@ -17,7 +17,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[WINDOWS_FN_LAYER] = LAYOUT(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, 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_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
@@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[MAC_LAYER] = 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, TG(WINDOWS_LAYER), KC_DEL,
+ 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, TO(WINDOWS_LAYER), 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_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_END,
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,
@@ -35,7 +35,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[MAC_FN_LAYER] = LAYOUT(
- RESET, KC_BRID, KC_BRIU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MRWD, KC_MPLY, KC_MFFD, KC__MUTE, KC__VOLDOWN, KC__VOLUP, KC_TRNS, KC_TRNS, KC_TRNS,
+ RESET, KC_BRID, KC_BRIU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MRWD, KC_MPLY, KC_MFFD, KC__MUTE, KC__VOLDOWN, KC__VOLUP, 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
@@ -64,4 +64,3 @@ uint32_t layer_state_set_user(uint32_t state) {
}
return state;
}
-
diff --git a/keyboards/kbdfans/kbdpad/mk1/info.json b/keyboards/kbdfans/kbdpad/mk1/info.json
index 4f0da62e83..68e8f68515 100644
--- a/keyboards/kbdfans/kbdpad/mk1/info.json
+++ b/keyboards/kbdfans/kbdpad/mk1/info.json
@@ -1,12 +1,100 @@
{
- "keyboard_name": "KBDfans KBDPad MKI",
- "url": "https://kbdfans.com/products/kbdfans-pad-custom-mechanical-keyboard-diy-kit",
- "maintainer": "qmk",
- "width": 4,
- "height": 6.25,
- "layouts": {
- "LAYOUT": {
- "layout": [{"x":2, "y":0}, {"x":3, "y":0}, {"x":0, "y":1.25}, {"x":1, "y":1.25}, {"x":2, "y":1.25}, {"x":3, "y":1.25}, {"x":0, "y":2.25}, {"x":1, "y":2.25}, {"x":2, "y":2.25}, {"x":0, "y":3.25}, {"x":1, "y":3.25}, {"x":2, "y":3.25}, {"x":3, "y":2.25, "h":2}, {"x":0, "y":4.25}, {"x":1, "y":4.25}, {"x":2, "y":4.25}, {"x":0, "y":5.25, "w":2}, {"x":2, "y":5.25}, {"x":3, "y":4.25, "h":2}]
- }
- }
+ "keyboard_name": "KBDfans KBDPad MKI",
+ "url": "https://kbdfans.com/products/kbdfans-pad-custom-mechanical-keyboard-diy-kit",
+ "maintainer": "qmk",
+ "width": 4,
+ "height": 6.25,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+
+ {"x":0, "y":1.25},
+ {"x":1, "y":1.25},
+ {"x":2, "y":1.25},
+ {"x":3, "y":1.25},
+
+ {"x":0, "y":2.25},
+ {"x":1, "y":2.25},
+ {"x":2, "y":2.25},
+
+ {"x":0, "y":3.25},
+ {"x":1, "y":3.25},
+ {"x":2, "y":3.25},
+ {"x":3, "y":2.25, "h":2},
+
+ {"x":0, "y":4.25},
+ {"x":1, "y":4.25},
+ {"x":2, "y":4.25},
+
+ {"x":0, "y":5.25, "w":2},
+ {"x":2, "y":5.25},
+ {"x":3, "y":4.25, "h":2}
+ ]
+ },
+ "LAYOUT_numpad_6x4": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+
+ {"x":0, "y":1.25},
+ {"x":1, "y":1.25},
+ {"x":2, "y":1.25},
+ {"x":3, "y":1.25},
+
+ {"x":0, "y":2.25},
+ {"x":1, "y":2.25},
+ {"x":2, "y":2.25},
+
+ {"x":0, "y":3.25},
+ {"x":1, "y":3.25},
+ {"x":2, "y":3.25},
+ {"x":3, "y":2.25, "h":2},
+
+ {"x":0, "y":4.25},
+ {"x":1, "y":4.25},
+ {"x":2, "y":4.25},
+
+ {"x":0, "y":5.25, "w":2},
+ {"x":2, "y":5.25},
+ {"x":3, "y":4.25, "h":2}
+ ]
+ },
+ "LAYOUT_ortho_6x4": {
+ "layout": [
+ {"x":0, "y":0},
+ {"x":1, "y":0},
+ {"x":2, "y":0},
+ {"x":3, "y":0},
+
+ {"x":0, "y":1.25},
+ {"x":1, "y":1.25},
+ {"x":2, "y":1.25},
+ {"x":3, "y":1.25},
+
+ {"x":0, "y":2.25},
+ {"x":1, "y":2.25},
+ {"x":2, "y":2.25},
+ {"x":3, "y":2.25},
+
+ {"x":0, "y":3.25},
+ {"x":1, "y":3.25},
+ {"x":2, "y":3.25},
+ {"x":3, "y":3.25},
+
+ {"x":0, "y":4.25},
+ {"x":1, "y":4.25},
+ {"x":2, "y":4.25},
+ {"x":3, "y":4.25},
+
+ {"x":0, "y":5.25},
+ {"x":1, "y":5.25},
+ {"x":2, "y":5.25},
+ {"x":3, "y":5.25}
+ ]
+ }
+ }
}
diff --git a/keyboards/kbdfans/kbdpad/mk1/keymaps/default/keymap.c b/keyboards/kbdfans/kbdpad/mk1/keymaps/default/keymap.c
index 2d5053e0b6..58f2c597e7 100644
--- a/keyboards/kbdfans/kbdpad/mk1/keymaps/default/keymap.c
+++ b/keyboards/kbdfans/kbdpad/mk1/keymaps/default/keymap.c
@@ -17,11 +17,12 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = LAYOUT(\
- KC_DEL, 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, KC_PDOT, KC_PENT) \
+ [0] = LAYOUT(
+ KC_DEL, 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, KC_PDOT, KC_PENT
+ )
};
diff --git a/keyboards/kbdfans/kbdpad/mk1/mk1.h b/keyboards/kbdfans/kbdpad/mk1/mk1.h
index ace7466f54..36b0287278 100644
--- a/keyboards/kbdfans/kbdpad/mk1/mk1.h
+++ b/keyboards/kbdfans/kbdpad/mk1/mk1.h
@@ -13,26 +13,59 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+
#pragma once
#include "quantum.h"
-// This a shortcut to help you visually see your layout.
+// This is 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( \
- k52, k53, \
- k40, k41, k42, k43, \
- k30, k31, k32, \
- k20, k21, k22, k23, \
- k10, k11, k12, \
- k00, k02, k03 \
-){ \
- { k00, KC_NO, k02, k03 }, \
- { k10, k11, k12, KC_NO }, \
- { k20, k21, k22, k23 }, \
- { k30, k31, k32, KC_NO }, \
- { k40, k41, k42, k43 }, \
- { KC_NO, KC_NO, k52, k53 }, \
+#define LAYOUT( \
+ k52, k53, \
+ k40, k41, k42, k43, \
+ k30, k31, k32, \
+ k20, k21, k22, k23, \
+ k10, k11, k12, \
+ k00, k02, k03 \
+) { \
+ { k00, KC_NO, k02, k03 }, \
+ { k10, k11, k12, KC_NO }, \
+ { k20, k21, k22, k23 }, \
+ { k30, k31, k32, KC_NO }, \
+ { k40, k41, k42, k43 }, \
+ { KC_NO, KC_NO, k52, k53 } \
+}
+
+#define LAYOUT_numpad_6x4( \
+ k50, k51, k52, k53, \
+ k40, k41, k42, k43, \
+ k30, k31, k32, \
+ k20, k21, k22, k23, \
+ k10, k11, k12, \
+ k00, k02, k03 \
+) { \
+ { k00, KC_NO, k02, k03 }, \
+ { k10, k11, k12, KC_NO }, \
+ { k20, k21, k22, k23 }, \
+ { k30, k31, k32, KC_NO }, \
+ { k40, k41, k42, k43 }, \
+ { k50, k51, k52, k53 } \
+}
+
+#define LAYOUT_ortho_6x4( \
+ k50, k51, k52, k53, \
+ k40, k41, k42, k43, \
+ k30, k31, k32, k33, \
+ k20, k21, k22, k23, \
+ k10, k11, k12, k13, \
+ k00, k01, k02, k03 \
+) { \
+ { k00, k01, k02, k03 }, \
+ { k10, k11, k12, k13 }, \
+ { k20, k21, k22, k23 }, \
+ { k30, k31, k32, k33 }, \
+ { k40, k41, k42, k43 }, \
+ { k50, k51, k52, k53 } \
}
diff --git a/keyboards/kbdfans/kbdpad/mk1/readme.md b/keyboards/kbdfans/kbdpad/mk1/readme.md
index 2424d4d4d6..27194e683f 100644
--- a/keyboards/kbdfans/kbdpad/mk1/readme.md
+++ b/keyboards/kbdfans/kbdpad/mk1/readme.md
@@ -1,10 +1,10 @@
# KBDPad MKI
-Custom numpad.
+Custom numpad. The MKI shares the same ATmega32A and matrix layout as the newer V2 PCB (not to be confused with the MKII, which uses an ATmega32U2!).
* Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin)
-* Hardware Supported: KBDPad MKI
-* Hardware Availability: [KBDfans](https://kbdfans.com/products/kbdfans-pad-custom-mechanical-keyboard-diy-kit)
+* Hardware Supported: KBDPad MKI, KBDPad V2
+* Hardware Availability: [KBDfans](https://kbdfans.com/collections/20/products/kbdfans-kbdpad-pcb-v2)
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/kbdfans/kbdpad/mk1/rules.mk b/keyboards/kbdfans/kbdpad/mk1/rules.mk
index dcd7e55405..679ac08fa8 100644
--- a/keyboards/kbdfans/kbdpad/mk1/rules.mk
+++ b/keyboards/kbdfans/kbdpad/mk1/rules.mk
@@ -21,4 +21,4 @@ BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = no # PCB has underglow LEDs, but case doesn't let them show.
WS2812_DRIVER = i2c
-OPT_DEFS = -DDEBUG_LEVEL=0
+LAYOUTS = ortho_6x4 numpad_6x4
diff --git a/keyboards/kbdfans/maja/config.h b/keyboards/kbdfans/maja/config.h
new file mode 100755
index 0000000000..4351ee4bb0
--- /dev/null
+++ b/keyboards/kbdfans/maja/config.h
@@ -0,0 +1,46 @@
+#pragma once
+
+#include "config_common.h"
+
+#define VENDOR_ID 0x4B42
+#define PRODUCT_ID 0x6068
+#define DEVICE_VER 0x0001
+#define MANUFACTURER KBDFANS
+#define PRODUCT MAJA
+#define DESCRIPTION MAJA RGB keyboard
+
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 15
+#define MATRIX_ROW_PINS { F0, B6, B5, B4, D7 }
+#define MATRIX_COL_PINS { C6, C7, F7, F6, F5, F4, F1, B0, B1, B2, B3, B7, D2, D3, D5 }
+#define DIODE_DIRECTION COL2ROW
+
+#define RGB_MATRIX_LED_PROCESS_LIMIT 4
+#define RGB_MATRIX_LED_FLUSH_LIMIT 26
+#define DEBOUNCE 3
+#define RGB_DISABLE_AFTER_TIMEOUT 0
+#define RGB_DISABLE_WHEN_USB_SUSPENDED true
+#define RGB_MATRIX_KEYPRESSES
+#define DISABLE_RGB_MATRIX_GRADIENT_UP_DOWN
+#define DISABLE_RGB_MATRIX_BAND_SAT
+#define DISABLE_RGB_MATRIX_BAND_PINWHEEL_SAT
+#define DISABLE_RGB_MATRIX_BAND_SPIRAL_SAT
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTIWIDE
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTICROSS
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
+#define DISABLE_RGB_MATRIX_SOLID_REACTIVE_MULTINEXUS
+#define DISABLE_RGB_MATRIX_SPLASH
+#define DISABLE_RGB_MATRIX_MULTISPLASH
+#define DISABLE_RGB_MATRIX_SOLID_SPLASH
+#define DISABLE_RGB_MATRIX_SOLID_MULTISPLASH
+#define DISABLE_RGB_MATRIX_DIGITAL_RAIN
+#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_ALL
+#define DRIVER_ADDR_1 0b1110100
+#define DRIVER_ADDR_2 0b1110110
+#define DRIVER_COUNT 2
+#define DRIVER_1_LED_TOTAL 36
+#define DRIVER_2_LED_TOTAL 31
+#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL)
diff --git a/keyboards/kbdfans/maja/keymaps/default/keymap.c b/keyboards/kbdfans/maja/keymaps/default/keymap.c
new file mode 100755
index 0000000000..fa81f07b40
--- /dev/null
+++ b/keyboards/kbdfans/maja/keymaps/default/keymap.c
@@ -0,0 +1,17 @@
+#include QMK_KEYBOARD_H
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT( /* 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_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_BSLASH, KC_PGUP,
+ CTL_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_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_RIGHT),
+ [1] = LAYOUT( /* FN */
+ 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, RESET, KC_HOME,
+ KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI,RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, RESET, KC_PGUP,
+ CTL_T(KC_CAPS),RGB_SPI, RGB_SPD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EEP_RST, KC_PGDN,
+ KC_LSFT, 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_MUTE,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT),
+ };
diff --git a/keyboards/kbdfans/maja/keymaps/via/keymap.c b/keyboards/kbdfans/maja/keymaps/via/keymap.c
new file mode 100755
index 0000000000..1fb8d1bce5
--- /dev/null
+++ b/keyboards/kbdfans/maja/keymaps/via/keymap.c
@@ -0,0 +1,29 @@
+#include QMK_KEYBOARD_H
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT( /* 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_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_BSLASH, KC_PGUP,
+ CTL_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_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_RIGHT),
+ [1] = LAYOUT( /* FN */
+ 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, RESET, KC_HOME,
+ KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI,RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, RESET, KC_PGUP,
+ CTL_T(KC_CAPS),RGB_SPI, RGB_SPD, KC_TRNS,KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, EEP_RST, KC_PGDN,
+ KC_LSFT, 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_MUTE,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_VOLD, KC_MNXT),
+ [2] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______),
+ [3] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______),
+ };
diff --git a/keyboards/kbdfans/maja/keymaps/via/rules.mk b/keyboards/kbdfans/maja/keymaps/via/rules.mk
new file mode 100755
index 0000000000..36b7ba9cbc
--- /dev/null
+++ b/keyboards/kbdfans/maja/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/kbdfans/maja/maja.c b/keyboards/kbdfans/maja/maja.c
new file mode 100755
index 0000000000..545d8c46e2
--- /dev/null
+++ b/keyboards/kbdfans/maja/maja.c
@@ -0,0 +1,104 @@
+#include "maja.h"
+
+const is31_led g_is31_leds[DRIVER_LED_TOTAL] = {
+ {0, C2_1, C3_1, C4_1}, // LA0
+ {0, C1_1, C3_2, C4_2}, // LA1
+ {0, C1_2, C2_2, C4_3}, // LA2
+ {0, C1_3, C2_3, C3_3}, // LA3
+ {0, C1_4, C2_4, C3_4}, // LA4
+ {0, C1_5, C2_5, C3_5}, // LA5
+ {0, C1_6, C2_6, C3_6}, // LA6
+ {0, C1_15, C2_15, C3_15}, // LB7
+ {0, C1_14, C2_14, C3_14}, // LB6
+ {0, C1_13, C2_13, C3_13}, // LB5
+ {0, C1_12, C2_12, C3_12}, // LB4
+ {0, C1_11, C2_11, C3_11}, // LB3
+ {0, C1_10, C2_10, C4_11}, // LB2
+ {0, C1_9, C3_10, C4_10}, // LB1
+ {0, C2_9, C3_9, C4_9}, // LB0
+
+ {0, C9_4, C8_4, C7_4}, // LA12
+ {0, C9_3, C8_3, C7_3}, // LA11
+ {0, C9_2, C8_2, C7_2}, // LA10
+ {0, C9_1, C8_1, C7_1}, // LA9
+ {0, C1_8, C2_8, C3_8}, // LA8
+ {0, C1_7, C2_7, C3_7}, // LA7
+ {0, C1_16, C2_16, C3_16}, // LB8
+ {0, C9_9, C8_9, C7_9}, // LB9
+ {0, C9_10, C8_10, C7_10}, // LB10
+ {0, C9_11, C8_11, C7_11}, // LB11
+ {0, C9_12, C8_12, C7_12}, // LB12
+ {0, C9_13, C8_13, C7_13}, // LB13
+ {0, C9_14, C8_14, C7_14}, // LB14
+ {0, C9_15, C8_15, C6_14}, // LB15
+ {0, C9_16, C7_15, C6_15}, // LB16
+
+ {0, C9_5, C8_5, C7_5}, // LA13
+ {0, C9_6, C8_6, C7_6}, // LA14
+ {0, C9_7, C8_7, C6_6}, // LA15
+ {0, C9_8, C7_7, C6_7}, // LA16
+ {0, C8_8, C7_8, C6_8}, // LA17
+ {1, C2_1, C3_1, C4_1}, // LC0
+ {1, C1_15, C2_15, C3_15}, // LD7
+ {1, C1_14, C2_14, C3_14}, // LD6
+ {1, C1_13, C2_13, C3_13}, // LD5
+ {1, C1_12, C2_12, C3_12}, // LD4
+ {1, C1_11, C2_11, C3_11}, // LD3
+ {1, C1_10, C2_10, C4_11}, // LD2
+ {1, C1_9, C3_10, C4_10}, // LD1
+ {0, C8_16, C7_16, C6_16}, // LB17
+
+ {1, C1_6, C2_6, C3_6}, // LC6
+ {1, C1_5, C2_5, C3_5}, // LC5
+ {1, C1_4, C2_4, C3_4}, // LC4
+ {1, C1_3, C2_3, C3_3}, // LC3
+ {1, C1_2, C2_2, C4_3}, // LC2
+ {1, C1_1, C3_2, C4_2}, // LC1
+ {1, C1_16, C2_16, C3_16}, // LD8
+ {1, C9_9, C8_9, C7_9}, // LD9
+ {1, C9_10, C8_10, C7_10}, // LD10
+ {1, C9_11, C8_11, C7_11}, // LD11
+ {1, C9_12, C8_12, C7_12}, // LD12
+ {1, C9_13, C8_13, C7_13}, // LD13
+ {1, C9_14, C8_14, C7_14}, // LD14
+ {1, C2_9, C3_9, C4_9}, // LD0
+
+ {1, C1_7, C2_7, C3_7}, // LC7
+ {1, C1_8, C2_8, C3_8}, // LC8
+ {1, C9_1, C8_1, C7_1}, // LC9
+ {1, C9_2, C8_2, C7_2}, // LC10
+ {1, C9_3, C8_3, C7_3}, // LC11
+ {1, C9_4, C8_4, C7_4}, // LC12
+ {1, C9_15, C8_15, C6_14}, // LD15
+ {1, C9_16, C7_15, C6_15}, // LD16
+ {1, C8_16, C7_16, C6_16} // LD17
+};
+
+led_config_t g_led_config = { {
+ { 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, NO_LED, 42, 43},
+ { 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, NO_LED},
+ { 58, NO_LED, 59, 60, NO_LED, 61, NO_LED, 62, NO_LED, 63, NO_LED, NO_LED, 64, 65, 66}
+}, {
+ {4,1},{18,1},{31,0},{46,3},{59,5},{73,7},{86,10},{107,9},{121,7},{134,4},{148,2},{162,0},{176,2},{196,2},{224,0},
+ {5,15},{22,15},{37,15},{50,17},{64,20},{77,22},{103,23},{117,21},{130,19},{143,16},{158,15},{171,16},{186,16},{202,16},{224,16},
+ {4,28},{23,28},{38,29},{51,31},{65,34},{78,36},{109,36},{122,34},{136,32},{150,29},{164,29},{177,29},{200,29},{224,29},
+ {5,42},{27,42},{42,43},{55,46},{69,48},{82,51},{104,51},{118,48},{131,46},{145,44},{159,43},{173,43},{192,43},{214,46},
+ {0,55},{40,58},{62,61},{86,64},{119,62},{147,58},{201,60},{214,60},{224,60}
+}, {
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+ 4, 4, 4, 1, 4, 4, 1, 1, 1
+} };
+
+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();
+}
diff --git a/keyboards/kbdfans/maja/maja.h b/keyboards/kbdfans/maja/maja.h
new file mode 100755
index 0000000000..7e6027bac2
--- /dev/null
+++ b/keyboards/kbdfans/maja/maja.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "quantum.h"
+
+#define XXX KC_NO
+
+#define LAYOUT( \
+ 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, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, \
+ K40, K42, K43, K45, K47, K49, 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, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, XXX }, \
+ { K40, XXX, K42, K43, XXX, K45, XXX, K47, XXX, K49, XXX, XXX, K4C, K4D, K4E } \
+}
diff --git a/keyboards/kbdfans/maja/readme.md b/keyboards/kbdfans/maja/readme.md
new file mode 100755
index 0000000000..02804370bf
--- /dev/null
+++ b/keyboards/kbdfans/maja/readme.md
@@ -0,0 +1,14 @@
+# MAJA
+
+![MAJA](https://i.ibb.co/ZxWRgg3/2.png)
+![MAJA](https://i.ibb.co/kgXQkgF/1.png)
+
+* Keyboard Maintainer: [DZTECH](https://github.com/moyi4681)
+* Hardware Supported: MAJA
+* Hardware Availability: [KBDFans](https://kbdfans.cn/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kbdfans/maja: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/kbdfans/maja/rules.mk b/keyboards/kbdfans/maja/rules.mk
new file mode 100755
index 0000000000..2b097c3d47
--- /dev/null
+++ b/keyboards/kbdfans/maja/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
+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
+RGB_MATRIX_ENABLE = yes # Use RGB matrix
+NO_USB_STARTUP_CHECK = no # Disable initialization only when usb is plugged in
diff --git a/keyboards/keebio/bfo9000/keymaps/abstractkb/keymap.c b/keyboards/keebio/bfo9000/keymaps/abstractkb/keymap.c
index a8348ecfb5..f97f0abf1a 100644
--- a/keyboards/keebio/bfo9000/keymaps/abstractkb/keymap.c
+++ b/keyboards/keebio/bfo9000/keymaps/abstractkb/keymap.c
@@ -15,9 +15,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_MPLY, KC_PSLS, KC_PAST, 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, MYRGB_TG, KC_PGUP, \
KC_MUTE, KC_PPLS, KC_PMNS, 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_PGDN, \
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_HOME, \
- KC_P4, KC_P5, KC_P6, KC_BSPACE, 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_PSCR, \
- KC_P1, KC_P2, KC_P3, 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, XXXXXXX, KC_INS, \
- KC_P0, KC_PDOT, KC_PENT, TO(_LIST), KC_LCTL, KC_LGUI, KC_LALT, XXXXXXX, KC_SPC, KC_SPC, XXXXXXX, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, XXXXXXX \
+ KC_P4, KC_P5, KC_P6, KC_BSPACE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, XXXXXXX, KC_PSCR, \
+ KC_P1, KC_P2, KC_P3, 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_CAPS, KC_INS, \
+ KC_P0, KC_PDOT, KC_PENT, KC_LCTL, TO(_LIST), KC_LGUI, KC_LALT, XXXXXXX, KC_SPC, KC_SPC, XXXXXXX, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_NLCK \
),
[_LIST] = LAYOUT( \
@@ -26,7 +26,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, TO(_BASE), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ _______, _______, _______, _______, TO(_BASE), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
)
};
diff --git a/keyboards/keebio/nyquist/keymaps/danielhklein/keymap.c b/keyboards/keebio/nyquist/keymaps/danielhklein/keymap.c
index 14428812f2..00f0bb3ced 100644
--- a/keyboards/keebio/nyquist/keymaps/danielhklein/keymap.c
+++ b/keyboards/keebio/nyquist/keymaps/danielhklein/keymap.c
@@ -30,16 +30,9 @@ enum custom_keycodes {
ARROW
};
- // Enable these functions using FUNC(n) macro.
- const uint16_t PROGMEM fn_actions[] = {
- [0] = LT(_LOWER, KC_SPC), //Hold for momentary Lower layer, Tap for Backspace,
- [1] = LT(_RAISE, KC_BSPC), //Hold for momentary Raise layer, Tap for Space,
- [2] = MO(_ARROW), //Hold for momentary Arrow
- };
-
-#define SPC_LWR FUNC(0)
-#define BSP_RSE FUNC(1)
-#define ARW FUNC(2)
+#define SPC_LWR LT(_LOWER, KC_SPC)
+#define BSP_RSE LT(_RAISE, KC_BSPC)
+#define ARW MO(_ARROW)
// Underglow setup
#define RGBLIGHT_SLEEP
diff --git a/keyboards/keebio/viterbi/keymaps/bakingpy/keymap.c b/keyboards/keebio/viterbi/keymaps/bakingpy/keymap.c
index f0122bef05..ab8cf2a9ae 100644
--- a/keyboards/keebio/viterbi/keymaps/bakingpy/keymap.c
+++ b/keyboards/keebio/viterbi/keymaps/bakingpy/keymap.c
@@ -158,7 +158,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ PLAY_SONG(tone_qwerty);
#endif
persistent_default_layer_set(1UL<<_QWERTY);
}
@@ -167,7 +167,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case COLEMAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+ PLAY_SONG(tone_colemak);
#endif
persistent_default_layer_set(1UL<<_COLEMAK);
}
@@ -176,7 +176,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case DVORAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+ PLAY_SONG(tone_dvorak);
#endif
persistent_default_layer_set(1UL<<_DVORAK);
}
diff --git a/keyboards/keebio/viterbi/keymaps/dwallace/keymap.c b/keyboards/keebio/viterbi/keymaps/dwallace/keymap.c
index 5a797cb0bd..c03cf970fd 100644
--- a/keyboards/keebio/viterbi/keymaps/dwallace/keymap.c
+++ b/keyboards/keebio/viterbi/keymaps/dwallace/keymap.c
@@ -155,7 +155,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ PLAY_SONG(tone_qwerty);
#endif
persistent_default_layer_set(1UL<<_QWERTY);
}
diff --git a/keyboards/keebio/viterbi/keymaps/mike808/keymap.c b/keyboards/keebio/viterbi/keymaps/mike808/keymap.c
index e1dc91d2b2..9922f1a555 100644
--- a/keyboards/keebio/viterbi/keymaps/mike808/keymap.c
+++ b/keyboards/keebio/viterbi/keymaps/mike808/keymap.c
@@ -128,7 +128,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ PLAY_SONG(tone_qwerty);
#endif
persistent_default_layer_set(1UL << _QWERTY);
}
@@ -137,7 +137,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case DVORAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+ PLAY_SONG(tone_dvorak);
#endif
persistent_default_layer_set(1UL << _DVORAK);
}
diff --git a/keyboards/keebio/viterbi/keymaps/vosechu/config.h b/keyboards/keebio/viterbi/keymaps/vosechu/config.h
new file mode 100644
index 0000000000..0faddd17c2
--- /dev/null
+++ b/keyboards/keebio/viterbi/keymaps/vosechu/config.h
@@ -0,0 +1,41 @@
+/*
+Copyright 2017 Chuck Lauer Vose <vosechu@gmail.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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 0000000000..bbaa448574
--- /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 0000000000..1e3cebb145
--- /dev/null
+++ b/keyboards/keebio/viterbi/keymaps/vosechu/rules.mk
@@ -0,0 +1 @@
+RGBLIGHT_ENABLE = yes
diff --git a/keyboards/model01/config.h b/keyboards/keyboardio/model01/config.h
index c2160979cd..c2160979cd 100644
--- a/keyboards/model01/config.h
+++ b/keyboards/keyboardio/model01/config.h
diff --git a/keyboards/keyboardio/model01/info.json b/keyboards/keyboardio/model01/info.json
new file mode 100644
index 0000000000..66bea171d2
--- /dev/null
+++ b/keyboards/keyboardio/model01/info.json
@@ -0,0 +1,87 @@
+{
+ "keyboard_name": "model01",
+ "keyboard_folder": "keyboardio/model01",
+ "url": "https://keyboard.io",
+ "maintainer": "qmk",
+ "width": 18.5,
+ "height": 7.5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"PROG", "x":0, "y":0.4, "h":1.3},
+ {"label":"1", "x":1, "y":0.2, "h":1.5},
+ {"label":"2", "x":2, "y":0.1, "h":1.1},
+ {"label":"3", "x":3, "y":0},
+ {"label":"4", "x":4, "y":0.1},
+ {"label":"5", "x":5, "y":0.3},
+
+ {"label":"6", "x":12.5, "y":0.3},
+ {"label":"7", "x":13.5, "y":0.1},
+ {"label":"8", "x":14.5, "y":0},
+ {"label":"9", "x":15.5, "y":0.1, "h":1.1},
+ {"label":"0", "x":16.5, "y":0.2, "h":1.5},
+ {"label":"NUM", "x":17.5, "y":0.4, "h":1.3},
+
+ {"label":"GRAVE", "x":0, "y":1.7},
+ {"label":"Q", "x":1, "y":1.7},
+ {"label":"W", "x":2, "y":1.2},
+ {"label":"E", "x":3, "y":1},
+ {"label":"R", "x":4, "y":1.1},
+ {"label":"T", "x":5, "y":1.3},
+ {"label":"LED", "x":6, "y":0.6, "h":1.5},
+
+ {"label":"ANY", "x":11.5, "y":0.6, "h":1.5},
+ {"label":"Y", "x":12.5, "y":1.3},
+ {"label":"U", "x":13.5, "y":1.1},
+ {"label":"I", "x":14.5, "y":1},
+ {"label":"O", "x":15.5, "y":1.2},
+ {"label":"P", "x":16.5, "y":1.7},
+ {"label":"EQUAL", "x":17.5, "y":1.7},
+
+ {"label":"PAGEUP", "x":0, "y":2.7},
+ {"label":"A", "x":1, "y":2.7},
+ {"label":"S", "x":2, "y":2.2},
+ {"label":"D", "x":3, "y":2},
+ {"label":"F", "x":4, "y":2.1},
+ {"label":"G", "x":5, "y":2.3},
+ {"label":"TAB", "x":6, "y":2.1, "h":1.3},
+
+ {"label":"ENTER", "x":11.5, "y":2.1, "h":1.3},
+ {"label":"H", "x":12.5, "y":2.3},
+ {"label":"J", "x":13.5, "y":2.1},
+ {"label":"K", "x":14.5, "y":2},
+ {"label":"L", "x":15.5, "y":2.2},
+ {"label":"SEMICOLON", "x":16.5, "y":2.7},
+ {"label":"QUOTE", "x":17.5, "y":2.7},
+
+ {"label":"PAGEDOWN", "x":0, "y":3.7, "h":1.2},
+ {"label":"Z", "x":1, "y":3.7},
+ {"label":"X", "x":2, "y":3.2, "h":1.15},
+ {"label":"C", "x":3, "y":3},
+ {"label":"V", "x":4, "y":3.1},
+ {"label":"B", "x":5, "y":3.3},
+ {"label":"ESC", "x":6, "y":3.4, "h":1.1},
+
+ {"label":"BUTTERFLY", "x":11.5, "y":3.4, "h":1.1},
+ {"label":"N", "x":12.5, "y":3.3},
+ {"label":"M", "x":13.5, "y":3.1},
+ {"label":"COMMA", "x":14.5, "y":3},
+ {"label":"DOT", "x":15.5, "y":3.2, "h":1.15},
+ {"label":"SLASH", "x":16.5, "y":3.7},
+ {"label":"MINS", "x":17.5, "y":3.7, "h":1.2},
+
+ {"label":"LCTL", "x":4.75, "y":4.3},
+ {"label":"RCTL", "x":12.75, "y":4.3},
+ {"label":"BACKSPACE", "x":5.75, "y":4.5},
+ {"label":"SPACE", "x":11.75, "y":4.5},
+ {"label":"LGUI", "x":6.75, "y":4.7},
+ {"label":"RALT", "x":10.75, "y":4.7},
+ {"label":"LSHIFT", "x":7.75, "y":5.1},
+ {"label":"RSHIFT", "x":9.75, "y":5.1},
+
+ {"label":"FN", "x":6.25, "y":6.1, "h":1.4},
+ {"label":"FN", "x":11.25, "y":6.1, "h":1.4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/model01/keymaps/default/config.h b/keyboards/keyboardio/model01/keymaps/default/config.h
index 8ab9d8b025..8ab9d8b025 100644
--- a/keyboards/model01/keymaps/default/config.h
+++ b/keyboards/keyboardio/model01/keymaps/default/config.h
diff --git a/keyboards/model01/keymaps/default/keymap.c b/keyboards/keyboardio/model01/keymaps/default/keymap.c
index 5ee865972e..5ee865972e 100644
--- a/keyboards/model01/keymaps/default/keymap.c
+++ b/keyboards/keyboardio/model01/keymaps/default/keymap.c
diff --git a/keyboards/model01/keymaps/default/readme.md b/keyboards/keyboardio/model01/keymaps/default/readme.md
index 740515a268..740515a268 100644
--- a/keyboards/model01/keymaps/default/readme.md
+++ b/keyboards/keyboardio/model01/keymaps/default/readme.md
diff --git a/keyboards/model01/keymaps/dshields/config.h b/keyboards/keyboardio/model01/keymaps/dshields/config.h
index fdb23d46ba..fdb23d46ba 100644
--- a/keyboards/model01/keymaps/dshields/config.h
+++ b/keyboards/keyboardio/model01/keymaps/dshields/config.h
diff --git a/keyboards/model01/keymaps/dshields/keymap.c b/keyboards/keyboardio/model01/keymaps/dshields/keymap.c
index 04887124f9..04887124f9 100644
--- a/keyboards/model01/keymaps/dshields/keymap.c
+++ b/keyboards/keyboardio/model01/keymaps/dshields/keymap.c
diff --git a/keyboards/model01/keymaps/dshields/readme.md b/keyboards/keyboardio/model01/keymaps/dshields/readme.md
index ead1c1aad2..ead1c1aad2 100644
--- a/keyboards/model01/keymaps/dshields/readme.md
+++ b/keyboards/keyboardio/model01/keymaps/dshields/readme.md
diff --git a/keyboards/model01/keymaps/tw1t611/config.h b/keyboards/keyboardio/model01/keymaps/tw1t611/config.h
index 8ab9d8b025..8ab9d8b025 100644
--- a/keyboards/model01/keymaps/tw1t611/config.h
+++ b/keyboards/keyboardio/model01/keymaps/tw1t611/config.h
diff --git a/keyboards/model01/keymaps/tw1t611/keymap.c b/keyboards/keyboardio/model01/keymaps/tw1t611/keymap.c
index b4bd53e3fe..b4bd53e3fe 100644
--- a/keyboards/model01/keymaps/tw1t611/keymap.c
+++ b/keyboards/keyboardio/model01/keymaps/tw1t611/keymap.c
diff --git a/keyboards/model01/keymaps/tw1t611/readme.md b/keyboards/keyboardio/model01/keymaps/tw1t611/readme.md
index b9d728831c..b9d728831c 100644
--- a/keyboards/model01/keymaps/tw1t611/readme.md
+++ b/keyboards/keyboardio/model01/keymaps/tw1t611/readme.md
diff --git a/keyboards/model01/leds.c b/keyboards/keyboardio/model01/leds.c
index b21c1a5c8a..b21c1a5c8a 100644
--- a/keyboards/model01/leds.c
+++ b/keyboards/keyboardio/model01/leds.c
diff --git a/keyboards/model01/leds.h b/keyboards/keyboardio/model01/leds.h
index 405bdf328a..405bdf328a 100644
--- a/keyboards/model01/leds.h
+++ b/keyboards/keyboardio/model01/leds.h
diff --git a/keyboards/model01/matrix.c b/keyboards/keyboardio/model01/matrix.c
index f1f9024c7c..f1f9024c7c 100644
--- a/keyboards/model01/matrix.c
+++ b/keyboards/keyboardio/model01/matrix.c
diff --git a/keyboards/model01/model01.c b/keyboards/keyboardio/model01/model01.c
index 29615ca866..29615ca866 100644
--- a/keyboards/model01/model01.c
+++ b/keyboards/keyboardio/model01/model01.c
diff --git a/keyboards/model01/model01.h b/keyboards/keyboardio/model01/model01.h
index a83e33cd86..a83e33cd86 100644
--- a/keyboards/model01/model01.h
+++ b/keyboards/keyboardio/model01/model01.h
diff --git a/keyboards/keyboardio/model01/readme.md b/keyboards/keyboardio/model01/readme.md
new file mode 100644
index 0000000000..5f55a88128
--- /dev/null
+++ b/keyboards/keyboardio/model01/readme.md
@@ -0,0 +1,37 @@
+# Keyboardio Model 01
+
+A split keyboard.
+
+* Keyboard Maintainer: QMK Community
+* Hardware Supported: Keyboardio Model 01
+* Hardware Availability: [Keyboardio](https://shop.keyboard.io)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make keyboardio/model01: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).
+
+## Programming the Keyboard
+
+To program the keyboard, if you have avrdude installed:
+
+ make keyboardio/model01:default:flash
+
+When prompted to reset your keyboard, press the prog key at upper left. If the
+keyboard does not reset, you can hold the prog key while plugging it into your
+computer. The prog key will light up red in programming mode.
+
+## Features
+
+This implements the standard keymap, including mousekeys.
+
+It doesn't do cursor warping - QMK does not support absolute mouse positioning.
+
+LED support is limited. Gamma compensation and the high speed batch update
+functions supported by the hardware are not implemented. The high current power
+switch is also not implemented, so if you try and turn all the LEDs on at full
+brightness, something may conk out.
+
+Hotplugging the two halves works but is not extensively tested.
diff --git a/keyboards/model01/rules.mk b/keyboards/keyboardio/model01/rules.mk
index 29c028ac85..29c028ac85 100644
--- a/keyboards/model01/rules.mk
+++ b/keyboards/keyboardio/model01/rules.mk
diff --git a/keyboards/model01/wire-protocol-constants.h b/keyboards/keyboardio/model01/wire-protocol-constants.h
index 90a528582a..90a528582a 100644
--- a/keyboards/model01/wire-protocol-constants.h
+++ b/keyboards/keyboardio/model01/wire-protocol-constants.h
diff --git a/keyboards/keyboardio/readme.md b/keyboards/keyboardio/readme.md
new file mode 100644
index 0000000000..d9ce48c236
--- /dev/null
+++ b/keyboards/keyboardio/readme.md
@@ -0,0 +1,18 @@
+# Keyboardio
+
+Keyboardio are an US-based Keyboard maker, known for their
+[Model01](https://shop.keyboard.io/collections/frontpage/products/model-01-keyboard),
+and more recently, the Keyboardio
+[Atreus](https://www.kickstarter.com/projects/keyboardio/atreus) keyboards.
+
+## Online Stores
+
+**Website:** https://shop.keyboard.io/
+
+## Social Media
+
+**Discord:** https://discord.gg/4az77sf
+**Forums:** https://community.keyboard.io/
+**Twitter:** https://twitter.com/keyboardio
+**Facebook:** https://facebook.com/keyboardio
+**Blog:** https://blog.keyboard.io/
diff --git a/keyboards/keycapsss/o4l_5x12/readme.md b/keyboards/keycapsss/o4l_5x12/readme.md
index 4b1ebb6c7c..16bdcc49f5 100644
--- a/keyboards/keycapsss/o4l_5x12/readme.md
+++ b/keyboards/keycapsss/o4l_5x12/readme.md
@@ -14,7 +14,7 @@ A ortholinear 5x12 keyboard made and sold by Keycapsss. [More info at Keycapsss.
---
-- Keyboard Maintainer: BenRoe [Github](https://github.com/BenRoe) / [Twitter](https://twitter.com/ben_roe)
+- Keyboard Maintainer: BenRoe [GitHub](https://github.com/BenRoe) / [Twitter](https://twitter.com/ben_roe)
- Hardware Supported: Pro Micro
- Hardware Availability: [Keycapsss.com](https://keycapsss.com)
diff --git a/keyboards/keycapsss/plaid_pad/readme.md b/keyboards/keycapsss/plaid_pad/readme.md
index ad38f119ce..76b4fa8e8e 100644
--- a/keyboards/keycapsss/plaid_pad/readme.md
+++ b/keyboards/keycapsss/plaid_pad/readme.md
@@ -5,7 +5,7 @@
A 4x4 numpad with only through hole components.
It's a great companion to the Plaid keyboard by [hsgw](https://github.com/hsgw/) and heavily inspired by it.
-* Keyboard Maintainer: BenRoe [Github](https://github.com/BenRoe) / [Twitter](https://twitter.com/keycapsss)
+* Keyboard Maintainer: BenRoe [GitHub](https://github.com/BenRoe) / [Twitter](https://twitter.com/keycapsss)
* Hardware Supported: ATmega328P with VUSB ([see Bootloader section](#Bootloader))
* Hardware Availability: [Keycapsss.com](https://keycapsss.com)
diff --git a/keyboards/keycapsss/plaid_pad/rules.mk b/keyboards/keycapsss/plaid_pad/rules.mk
index f62833ca6b..08ad3555d6 100644
--- a/keyboards/keycapsss/plaid_pad/rules.mk
+++ b/keyboards/keycapsss/plaid_pad/rules.mk
@@ -11,10 +11,6 @@ MCU = atmega328p
# ATmega328P USBasp
BOOTLOADER = USBasp
-# disable debug code
-OPT_DEFS = -DDEBUG_LEVEL=0
-
-
# Build Options
# change yes to no to disable
#
diff --git a/keyboards/kinesis/keymaps/milestogo/keymap.c b/keyboards/kinesis/keymaps/milestogo/keymap.c
index 024df59127..8c01bcb83d 100644
--- a/keyboards/kinesis/keymaps/milestogo/keymap.c
+++ b/keyboards/kinesis/keymaps/milestogo/keymap.c
@@ -52,16 +52,16 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TAB, KC_Q ,KC_W ,KC_E ,KC_R ,KC_T ,
TT(_MOUSE) ,KC_A ,KC_S ,KC_D ,KC_F ,KC_G ,
KC_LSFT,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,
- KC_GRAVE, KC_ESC, KC_FN4, LT(_SYMB, KC_RIGHT),
+ KC_GRAVE, KC_ESC, MT(MOD_LGUI,KC_LEFT), LT(_SYMB, KC_RIGHT),
KC_LCTL,KC_LALT,
KC_DEL,
KC_BSPC, KC_DEL ,TT(_MOUSE) ,
- KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,TT(_MOUSE) ,KC_FN1 ,TT(_SYMB), KC_NO, RESET,
+ KC_F9 ,KC_F10 ,KC_F11 ,KC_F12 ,TT(_MOUSE) ,TG(_MOUSE) ,TT(_SYMB), KC_NO, RESET,
KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_MINS,
KC_Y ,KC_U ,KC_I ,KC_O ,KC_P ,KC_BSLS,
KC_H ,KC_J ,KC_K ,KC_L ,KC_SCLN,KC_QUOT,
KC_N ,KC_M ,KC_COMM,KC_DOT ,KC_SLSH,KC_RSFT,
- LT(_SYMB, KC_UP), KC_FN7, KC_LBRC ,KC_RBRC,
+ LT(_SYMB, KC_UP), MT(MOD_LGUI,KC_DOWN), KC_LBRC ,KC_RBRC,
KC_RALT,KC_RGUI,
KC_PGUP,
KC_PGDN,KC_ENTER ,KC_SPC
@@ -101,7 +101,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, KC_CIRC, KC_LCBR, KC_RCBR, KC_AT, KC_PERC,
_______, KC_EXLM, KC_HASH, KC_0, KC_EQL, KC_TILD,
_______, KC_6, KC_7, KC_8, KC_9, KC_PIPE,
- _______, KC_COLON, KC_FN4, LT(_SYMB, KC_RIGHT),
+ _______, KC_COLON, MT(MOD_LGUI,KC_LEFT), LT(_SYMB, KC_RIGHT),
_______, _______,
_______,
_______, _______, RESET,
@@ -110,7 +110,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_AMPR, KC_LBRC, KC_LPRN, KC_RPRN, KC_UNDS, _______,
KC_ASTR, KC_PLUS, KC_1, KC_MINS, KC_RBRC, KC_GRV,
KC_DLR, KC_2, KC_3, KC_4, KC_5, XXXXXXX,
- LT(_SYMB, KC_UP), KC_FN7, KC_BSLS, XXXXXXX,
+ LT(_SYMB, KC_UP), MT(MOD_LGUI,KC_DOWN), KC_BSLS, XXXXXXX,
_______, _______,
_______,
_______, _______, _______
@@ -149,7 +149,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, KC_SLSH, RSFT(KC_COMM), RSFT(KC_DOT), _______, _______,
_______, _______, RSFT(KC_LBRC), RSFT(KC_RBRC), _______, _______,
_______, KC_EQL, RSFT(KC_9), RSFT(KC_0), _______, _______,
- _______, _______, KC_FN4, LT(_SYMB, KC_RIGHT),
+ _______, _______, MT(MOD_LGUI,KC_LEFT), LT(_SYMB, KC_RIGHT),
_______, _______,
_______,
_______, _______, RESET,
@@ -158,7 +158,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, KC_PLUS, KC_MINS, _______, _______,
_______, _______, KC_EQL, KC_PIPE, _______, _______,
_______, _______, _______, _______, _______, _______,
- LT(_SYMB, KC_UP), KC_FN7, _______, _______,
+ LT(_SYMB, KC_UP), MT(MOD_LGUI,KC_DOWN), _______, _______,
_______, _______,
_______,
_______, _______, _______
@@ -192,7 +192,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______,
_______, KC_EXLM ,KC_AT, KC_HASH, KC_DLR ,KC_PERC ,
_______, KC_NO, KC_NO, KC_UP, KC_NO, KC_PGUP,
- KC_FN1, LGUI(KC_Z),LGUI(KC_X),LGUI(KC_C),LGUI(KC_V), KC_NO,
+ TG(_MOUSE), LGUI(KC_Z),LGUI(KC_X),LGUI(KC_C),LGUI(KC_V), KC_NO,
_______, KC_NO, KC_NO, KC_UP, KC_NO, KC_PGDN,
_______, _______, KC_NO, KC_NO,
_______, _______,
@@ -261,16 +261,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
-
-
-const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_LAYER_TOGGLE(_MOUSE) ,
- [4]= ACTION_MODS_TAP_KEY(MOD_LGUI,KC_LEFT),
- [7]= ACTION_MODS_TAP_KEY(MOD_LGUI,KC_DOWN),
-
-
-};
-
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
diff --git a/keyboards/kinesis/keymaps/xyverz/keymap.c b/keyboards/kinesis/keymaps/xyverz/keymap.c
index 18fdb2e08f..ffc4459547 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 702af4474a..f0f55a478b 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/kv/revt/readme.md b/keyboards/kv/revt/readme.md
index e2f463b37d..23abc78035 100644
--- a/keyboards/kv/revt/readme.md
+++ b/keyboards/kv/revt/readme.md
@@ -5,7 +5,7 @@
A open source southpaw keyboard. The Default layer is a standard 104 ANSI keyboard just the numpad is on the left.
There is a fn layer (its not in the layout image but in the keymap file) it adds media keys, f13-f24, and mouse keys.
-[More info on KVT github](https://github.com/Hybrid65/KVT)
+[More info on KVT GitHub](https://github.com/Hybrid65/KVT)
* Keyboard Maintainer: [Neil Feagan](https://github.com/Hybrid65)
* Hardware Supported: KVT, Proton C
diff --git a/keyboards/kyria/keymaps/asapjockey/config.h b/keyboards/kyria/keymaps/asapjockey/config.h
new file mode 100644
index 0000000000..e878663bfb
--- /dev/null
+++ b/keyboards/kyria/keymaps/asapjockey/config.h
@@ -0,0 +1,47 @@
+/* Copyright 2019 Thomas Baart <thomas@splitkb.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 <http://www.gnu.org/licenses/>.
+ */
+
+#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
+ #define RGBLIGHT_SLEEP
+#endif
+
+// EC11K encoders have a different resolution than other EC11 encoders.
+// When using the default resolution of 4, if you notice your encoder skipping
+// every other tick, lower the resolution to 2.
+#define ENCODER_RESOLUTION 2
+
+// The Leader key allows to flexibly assign macros to key sequences.
+#define LEADER_PER_KEY_TIMING
+#define LEADER_TIMEOUT 350
+
+#define TAPPING_TERM 200
+
+// 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
+
+// Allows media codes to properly register in macros and rotary encoder code
+#define TAP_CODE_DELAY 10 \ No newline at end of file
diff --git a/keyboards/kyria/keymaps/asapjockey/keymap.c b/keyboards/kyria/keymaps/asapjockey/keymap.c
new file mode 100644
index 0000000000..46e70e9e96
--- /dev/null
+++ b/keyboards/kyria/keymaps/asapjockey/keymap.c
@@ -0,0 +1,312 @@
+/* Copyright 2019 Thomas Baart <thomas@splitkb.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 <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+
+enum layers {
+ QWERTY,
+ LOWER,
+ RAISE,
+ NAV,
+ ADJUST
+};
+
+enum custom_keycodes {
+ KC_LBR = SAFE_RANGE,
+ KC_RBR
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * Base Layer: QWERTY
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | TAB | Q | W | E | R | T | | Y | U | I | O | P | RCTL |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | LCTL | A | S | D | F | G | | H | J | K | L | ; : | ' " |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | LSFT | Z | X | C | V | B | Del | Raise| |Adjust| Esc | N | M | , < | . > | / ? | LSFT |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | LALT | | Bspc | Lower| | Enter| Space| [ { | ] } | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [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_RCTL,
+ 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_DEL, MO(RAISE), MO(ADJUST), KC_ESC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT,
+ XXXXXXX, KC_LALT, XXXXXXX, KC_BSPC, MO(LOWER), KC_ENT, KC_SPC, KC_LBR, KC_RBR, XXXXXXX
+ ),
+/*
+ * Lower Layer: Numbers, functions, symbols
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | 1 ! | 2 @ | 3 # | 4 $ | 5 % | | 6 ^ | 7 & | 8 * | 9 ( | 0 ) | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | F1 | F2 | F3 | F4 | F5 | | | | | | F6 | F7 | F8 | F9 | F10 | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | ( | ) | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [LOWER] = LAYOUT(
+ _______, 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_LPRN, KC_RPRN, _______,
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_LPRN, KC_RPRN, _______
+ ),
+/*
+ * Raise Layer: Functions, Numbers
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | | F7 | F8 | F9 | | | | 7 & | 8 * | 9 ( | - _ | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | | F4 | F5 | F6 | | | | 4 * | 5 % | 6 ^ | = + | RCTL |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | F1 | F2 | F3 | | | | | | | | 1 ! | 2 @ | 3 # | \ | | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | 0 ) | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [RAISE] = LAYOUT(
+ _______, _______, KC_F7, KC_F8, KC_F9, _______, _______, KC_7, KC_8, KC_9, _______, _______,
+ _______, _______, KC_F4, KC_F5, KC_F6, _______, _______, KC_4, KC_5, KC_6, _______, KC_RCTL,
+ _______, _______, KC_F1, KC_F2, KC_F3, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_0, _______, _______
+ ),
+/*
+ * Navigation Layer
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | | | | | | | | | Up | | | RGBTOG |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | | | | | | | | Left | Down | Right| | RGBOFF |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | | | | | | | | | | | | | | | RGBON |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | Reset|Debug | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [ADJUST] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, _______, RGB_TOG,
+ _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, RGB_HUI,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUD,
+ _______, _______, _______, _______, _______, _______, _______, RESET, DEBUG, _______
+ ),
+// /*
+// * Layer template
+// *
+// * ,-------------------------------------------. ,-------------------------------------------.
+// * | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | | | | | |
+// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+// * | | | | | | | | | | | |
+// * | | | | | | | | | | | |
+// * `----------------------------------' `----------------------------------'
+// */
+// [_LAYERINDEX] = LAYOUT(
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+// ),
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case KC_LBR: {
+ if (record->event.pressed) {
+ if ((get_mods() & MOD_MASK_SHIFT) == MOD_MASK_SHIFT) {
+ register_code(KC_9);
+ } else {
+ register_code(KC_LBRC);
+ }
+ } else { // Release the key
+ if ((get_mods() & MOD_MASK_SHIFT) == MOD_MASK_SHIFT) {
+ unregister_code(KC_9);
+ } else {
+ unregister_code(KC_LBRC);
+ }
+ }
+ return false;
+ break;
+ }
+ case KC_RBR: {
+ if (record->event.pressed) {
+ if ((get_mods() & MOD_MASK_SHIFT) == MOD_MASK_SHIFT) {
+ register_code(KC_0);
+ } else {
+ register_code(KC_RBRC);
+ }
+ } else { // Release the key
+ if ((get_mods() & MOD_MASK_SHIFT) == MOD_MASK_SHIFT) {
+ unregister_code(KC_0);
+ } else {
+ unregister_code(KC_RBRC);
+ }
+ }
+ return false;
+ break;
+ }
+ }
+ return true;
+}
+
+LEADER_EXTERNS();
+
+void matrix_scan_user(void) {
+ LEADER_DICTIONARY() {
+ leading = false;
+ leader_end();
+
+ SEQ_ONE_KEY(KC_F) { // Shift + Ctrl + F
+ tap_code16(S(C(KC_F)));
+ }
+ }
+}
+
+#ifdef OLED_DRIVER_ENABLE
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+ return OLED_ROTATION_180;
+}
+
+static void render_kyria_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,
+ 0, 0, 0, 0,240,252,255, 31, 7, 1, 0, 0,192,240,252,254,255,247,243,177,176, 48, 48, 48, 48, 48, 48, 48,120,254,135, 1, 0, 0,255,255, 0, 0, 1,135,254,120, 48, 48, 48, 48, 48, 48, 48,176,177,243,247,255,254,252,240,192, 0, 0, 1, 7, 31,255,252,240, 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,255,255,255, 0, 0, 0, 0, 0,254,255,255, 1, 1, 7, 30,120,225,129,131,131,134,134,140,140,152,152,177,183,254,248,224,255,255,224,248,254,183,177,152,152,140,140,134,134,131,131,129,225,120, 30, 7, 1, 1,255,255,254, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0,255,255, 0, 0,192,192, 48, 48, 0, 0,240,240, 0, 0, 0, 0, 0, 0,240,240, 0, 0,240,240,192,192, 48, 48, 48, 48,192,192, 0, 0, 48, 48,243,243, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48,192,192, 0, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255, 0, 0, 0, 0, 0,127,255,255,128,128,224,120, 30,135,129,193,193, 97, 97, 49, 49, 25, 25,141,237,127, 31, 7,255,255, 7, 31,127,237,141, 25, 25, 49, 49, 97, 97,193,193,129,135, 30,120,224,128,128,255,255,127, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0, 63, 63, 3, 3, 12, 12, 48, 48, 0, 0, 0, 0, 51, 51, 51, 51, 51, 51, 15, 15, 0, 0, 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 63, 63, 48, 48, 0, 0, 12, 12, 51, 51, 51, 51, 51, 51, 63, 63, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 15, 63,255,248,224,128, 0, 0, 3, 15, 63,127,255,239,207,141, 13, 12, 12, 12, 12, 12, 12, 12, 30,127,225,128, 0, 0,255,255, 0, 0,128,225,127, 30, 12, 12, 12, 12, 12, 12, 12, 13,141,207,239,255,127, 63, 15, 3, 0, 0,128,224,248,255, 63, 15, 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, 3, 7, 15, 62,124,248,240,224,192,128, 1, 3, 7, 15, 30, 28, 60, 56,120,112,112,224,224,225,231,254,248,255,255,248,254,231,225,224,224,112,112,120, 56, 60, 28, 30, 15, 7, 3, 1,128,192,224,240,248,124, 62, 15, 7, 3, 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, 1, 1, 3, 7, 15, 14, 30, 28, 60, 56,120,112,112,112,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,112,112,112,120, 56, 60, 28, 30, 14, 15, 7, 3, 1, 1, 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
+ };
+ oled_write_raw_P(kyria_logo, sizeof(kyria_logo));
+}
+
+static void render_qmk_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);
+}
+
+static void render_status(void) {
+ // QMK Logo and version information
+ render_qmk_logo();
+ oled_write_P(PSTR(" Kyria rev1.0\n\n"), false);
+
+ // Host Keyboard Layer Status
+ oled_write_P(PSTR("Layer: "), false);
+ switch (get_highest_layer(layer_state)) {
+ case QWERTY:
+ oled_write_P(PSTR("Default\n"), false);
+ break;
+ case LOWER:
+ oled_write_P(PSTR("Lower\n"), false);
+ break;
+ case RAISE:
+ oled_write_P(PSTR("Raise\n"), false);
+ break;
+ case NAV:
+ oled_write_P(PSTR("Navigation\n"), false);
+ break;
+ case ADJUST:
+ oled_write_P(PSTR("Adjust\n"), false);
+ break;
+ default:
+ oled_write_P(PSTR("Undefined\n"), false);
+ }
+
+ // Host Keyboard LED Status
+ led_t led_state = host_keyboard_led_state();
+ oled_write_P(led_state.num_lock ? PSTR("NUMLCK ") : PSTR(" "), false);
+ oled_write_P(led_state.caps_lock ? PSTR("CAPLCK ") : PSTR(" "), false);
+ oled_write_P(led_state.scroll_lock ? PSTR("SCRLCK ") : PSTR(" "), false);
+}
+
+void oled_task_user(void) {
+ if (is_keyboard_master()) {
+ render_status(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
+ } else {
+ render_kyria_logo();
+ }
+}
+#endif
+
+#ifdef ENCODER_ENABLE
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ switch (get_highest_layer(layer_state)) {
+ case QWERTY:
+ if (clockwise) { // Ctrl + I
+ tap_code16(C(KC_I));
+ } else { // Shift + F3
+ tap_code16(S(KC_F3));
+ }
+ break;
+ case LOWER:
+ // History scrubbing. For Adobe products, hold shift while moving
+ // backward to go forward instead.
+ if (clockwise) {
+ tap_code16(C(KC_Y));
+ } else {
+ tap_code16(C(KC_Z));
+ }
+ break;
+ case RAISE:
+ if (clockwise) { // Subscript: CTRL + =
+ tap_code16(C(KC_EQL));
+ }
+ break;
+ default:
+ // Nothing
+ break;
+ }
+ } else if (index == 1) {
+ switch (get_highest_layer(layer_state)) {
+ case QWERTY:
+ // Scroll by letter horizontally
+ if (clockwise) {
+ tap_code16(KC_RGHT);
+ } else {
+ tap_code16(KC_LEFT);
+ }
+ case LOWER:
+ // Nothing
+ break;
+ case RAISE:
+ // Find previous/Find next
+ if (clockwise) {
+ tap_code(KC_F3);
+ } else {
+ tap_code16(S(KC_F3));
+ }
+ default:
+ // Nothing
+ break;
+ }
+ }
+}
+#endif
diff --git a/keyboards/kyria/keymaps/asapjockey/rules.mk b/keyboards/kyria/keymaps/asapjockey/rules.mk
new file mode 100644
index 0000000000..9b8e294198
--- /dev/null
+++ b/keyboards/kyria/keymaps/asapjockey/rules.mk
@@ -0,0 +1,5 @@
+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 # Enable the Leader Key feature
+MOUSEKEY_ENABLE = no
diff --git a/keyboards/kyria/keymaps/default/rules.mk b/keyboards/kyria/keymaps/default/rules.mk
index 213c50a80f..e3486a8a9f 100644
--- a/keyboards/kyria/keymaps/default/rules.mk
+++ b/keyboards/kyria/keymaps/default/rules.mk
@@ -1,3 +1,3 @@
OLED_DRIVER_ENABLE = yes # Enables the use of OLED displays
-ENCODER_ENABLE = yes # ENables the use of one or more encoders
+ENCODER_ENABLE = yes # Enables the use of one or more encoders
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow \ No newline at end of file
diff --git a/keyboards/kyria/keymaps/plattfot/README.md b/keyboards/kyria/keymaps/plattfot/README.md
new file mode 100644
index 0000000000..b5b6ddaa2d
--- /dev/null
+++ b/keyboards/kyria/keymaps/plattfot/README.md
@@ -0,0 +1,162 @@
+# plattfot's keymap for [Kyria](https://github.com/splitkb/kyria)
+
+![Keyboard](https://i.imgur.com/Pvsm973l.jpg)
+
+Designed to be ease of use when programming, typing in both English
+and Swedish and navigating around in a tiling window manager, in my
+case [sway](https://swaywm.org/). Uses the two rotary encoders (lower
+left/right thumb row) as two palm buttons.
+
+This keymap avoids [Mod-tap](https://docs.qmk.fm/#/mod_tap) as they do
+not work for me. [Kyria](https://github.com/splitkb/kyria) has enough
+thumb keys to make it work without them.
+
+
+# Base Layer: Default
+```
+ // ,-------------------------------------------. ,-------------------------------------------.
+ // | ` | Q | W | E | R | T | | Y | U | I | O | P | Ã… |
+ // |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ // | Tab | A | S | D | F | G | | H | J | K | L | ; : | ' " |
+ // |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ // | LShift | Z | X | C | V | B | Lead | RAISE| | LOWER|DBLTAP| N | M | , < | . > | / ? | RShift |
+ // `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ // | MPlay| GUI | LCtrl| Space| LALT | | Enter|BSpace| NAV | LAlt |Worksp|
+ // | | | | | | | | | | |toggle|
+ // `----------------------------------' `----------------------------------'
+```
+
+Setup for typing in both English and Swedish (hence the Ã… in the top
+right corner, which is just [ on an US layout).
+
+Modifiers are mostly on the left hand, to make it comfortable when
+require keyboard and mouse. For example working in a DCC (Digital
+Content Creation tool) like [Houdini](https://www.sidefx.com/) and
+[Maya](https://www.autodesk.com/products/maya/overview).
+
+## Notable features on this layer
+
+Left rotary encoder
+- Press: play/pause
+- Rotate: Volume control
+
+Right rotary encoder
+- Press: Call keybinding that toggles between two recent workspaces.
+ For [sway](https://swaywm.org/) that is `workspace
+ back_and_forth`
+- Rotate: Page up/Page down. Used mouse scrolling at first. But
+ scrolling only works in the window where the mouse pointer
+ is. Which kind of defeated the purpose of having the scroll
+ on the keyboard, as I still needed to move my hand to the
+ mouse and then I could just use the scroll on the mouse.
+
+[Leader key](https://docs.qmk.fm/#/feature_leader_key) is mainly used
+for jumping between workspaces. Otherwise I would need to use both
+hands everytime I need to switch. With the leader key I can jump
+between 1-5 with just the left hand. The right rotary encoder also
+helps jumping back and forth between two workspaces by just pressing
+down my right palm.
+
+The double tap key, which I based on a code snippet from a
+[reddit post](https://www.reddit.com/r/olkb/comments/citkbx/double_key_press_modifier_qmkwould_work_like/ev9cue8).
+When pressed, it will repeat the next key twice. Reason for this is
+that I found it a bit awkward to hold down the lower key when I need
+to type a symbol twice. Which happens a lot when programming or
+running commands on the command line. Does not save me any key presses
+but more comfortable to type double keys, for example `--` and `&&`.
+
+# Lower Layer: Symbols
+```
+ //
+ // ,-------------------------------------------. ,-------------------------------------------.
+ // | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
+ // |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ // | | | | _ | \ | - | + | | = | { | } | [ | ] | '' |
+ // |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ // | | [] | {} | () | <> | | | | | | | | | < | > | ? | |
+ // `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ // | Mute | | | | | | | | | | |
+ // | | | | | | | | | | | |
+ // `----------------------------------' `----------------------------------'
+```
+
+Contains most of the symbols, only exceptions are those that are
+already on the default US base layer i.e. quotes, punctuation and
+forward slash.
+
+## Notable features on this layer
+
+Left rotary encoder
+- Press: mute
+- Rotate: Skip next/previous song
+
+The left letter bottom row contains macros to quickly type the
+different types of brackets and move the cursor to be inside. For
+example lower+c will type `()â†`, where `â†` is pressing the left arrow.
+Same principle for the `''` macro. Really nice to have when
+programming, and it is editor agnostic.
+
+# Raise Layer: Function keys
+```
+ // ,-------------------------------------------. ,-------------------------------------------.
+ // | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | |
+ // |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ // | | | | | | F11 | | F12 | | | | | |
+ // |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ // | | | | | | |ScLock| | | | Ins | | | | | | |
+ // `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ // | | | | | | | Esc | Del | | RAlt | |
+ // | | | | | | | | | | | |
+ // `----------------------------------' `----------------------------------'
+```
+
+Access to the functional keys, which I mostly use to run `emacs`
+compilation mode.
+
+Scroll Lock is used to toggle between English and Swedish.
+
+## Notable features on this layer
+
+Right rotary encoder
+- Press: Right Alt, rarely use this, but it is needed for the Swedish
+ layout to type some symbols. But I find I mostly switch back
+ to the English layout if I need to type symbols. Might change
+ this in the future.
+- Rotate: Moving between tabs in the browser, as described in this
+ [blog post](https://docs.splitkb.com/hc/en-us/articles/360010513760-How-can-I-use-a-rotary-encoder-).
+
+# Navigation Layer: Number keys, navigation
+```
+ // ,-------------------------------------------. ,-------------------------------------------.
+ // | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
+ // |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ // | | | | | | | | | Left | Up | Down | Right| |
+ // |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ // | | | | | | | | | | | | | | | | | |
+ // `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ // | | | | | | | | | | RCtrl| |
+ // | | | | | | | | | | | |
+ // `----------------------------------' `----------------------------------'
+```
+
+Access to the number as well as the arrow keys. Got use to the number
+row after using [ErgoDox](https://www.ergodox.io/) keyboards for a few
+years. Do not feel I need a numpad layer, which seems to be quite
+common with small keyboards like this.
+
+# Adjust Layer: RGB
+```
+ //
+ // ,-------------------------------------------. ,-------------------------------------------.
+ // | | | | | | | | | | | | | |
+ // |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ // | | TOG | SAI | HUI | VAI | MOD | | | | | | | |
+ // |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ // | | | SAD | HUD | VAD | RMOD | | | | | | | | | | | |
+ // `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ // | | | | | | | | | | | |
+ // | | | | | | | | | | | |
+ // `----------------------------------' `----------------------------------'
+```
+
+Right now it only contains adjustment to the underglow.
diff --git a/keyboards/kyria/keymaps/plattfot/config.h b/keyboards/kyria/keymaps/plattfot/config.h
new file mode 100644
index 0000000000..6e21c3ff5a
--- /dev/null
+++ b/keyboards/kyria/keymaps/plattfot/config.h
@@ -0,0 +1,40 @@
+/* Copyright 2019 Thomas Baart <thomas@splitkb.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 <http://www.gnu.org/licenses/>.
+ */
+
+#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
+
+#define ENCODER_DIRECTION_FLIP
+// Fixing the skipping with the EC11K encoder
+#define ENCODER_RESOLUTION 2
+
+#define EE_HANDS
+
+// The Leader key allows to flexibly assign macros to key sequences.
+#define LEADER_PER_KEY_TIMING
+#define LEADER_TIMEOUT 350
+
+#define TAPPING_TERM 200
diff --git a/keyboards/kyria/keymaps/plattfot/keymap.c b/keyboards/kyria/keymaps/plattfot/keymap.c
new file mode 100644
index 0000000000..d897769898
--- /dev/null
+++ b/keyboards/kyria/keymaps/plattfot/keymap.c
@@ -0,0 +1,437 @@
+/* Copyright 2020 Fredrik Salomonsson <plattfot@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+#include "version.h"
+
+enum custom_keycodes {
+ PLACEHOLDER = SAFE_RANGE, // can always be here
+ // Macros, where | is the cursor
+ M_LRBRC, // [|]
+ M_LRCBR, // {|}
+ M_LRPRN, // (|)
+ M_LRABR, // <|>
+ M_DQUOT, // '|'
+ // New keys
+ DBL_TAP, // Repeat next key
+};
+
+// Double Tap feature based on post from drashna
+// https://www.reddit.com/r/olkb/comments/citkbx/double_key_press_modifier_qmkwould_work_like/ev9cue8/
+static bool double_tap_it = false;
+
+enum layers {
+ _DEFAULT,
+ _LOWER,
+ _RAISE,
+ _NAV,
+ _ADJUST,
+};
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * Base Layer: Default
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | ` | Q | W | E | R | T | | Y | U | I | O | P | Ã… |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | Tab | A | S | D | F | G | | H | J | K | L | ; : | ' " |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | LShift | Z | X | C | V | B | Lead | RAISE| | LOWER|DBLTAP| N | M | , < | . > | / ? | RShift |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | MPlay| GUI | LCtrl| Space| LALT | | Enter|BSpace| NAV | LAlt |Worksp|
+ * | | | | | | | | | | |toggle|
+ * `----------------------------------' `----------------------------------'
+ */
+ [_DEFAULT] = LAYOUT(
+ KC_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC,
+ 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_LEAD, OSL(_RAISE), OSL(_LOWER), DBL_TAP, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_MPLY, KC_LGUI, KC_LCTL, KC_SPACE, KC_LALT, KC_ENT, KC_BSPC, MO(_NAV), LCTL(KC_LALT), LGUI(KC_B)
+ ),
+
+/*
+ * Lower Layer: Symbols
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | | | _ | \ | - | + | | = | { | } | [ | ] | '' |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | [] | {} | () | <> | | | | | | | | | < | > | ? | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | Mute | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_LOWER] = LAYOUT(
+ KC_TILDE,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_BSLS, KC_MINS, KC_PLUS, KC_EQUAL,KC_LCBR, KC_RCBR, KC_LBRC, KC_RBRC, M_DQUOT,
+ _______, M_LRBRC, M_LRCBR, M_LRPRN, M_LRABR, _______, _______, _______, _______, _______, _______, _______, KC_LT, KC_GT, KC_QUES, _______,
+ KC_MUTE, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+/*
+ * Raise Layer: Function keys
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | | | | | F11 | | F12 | | | | | |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | | | | |ScLock| | | | Ins | | | | | | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | Esc | Del | | RAlt | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_RAISE] = 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_SLCK, _______, _______, KC_INS, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, KC_ESC, KC_DEL, _______, KC_RALT, _______
+
+ ),
+/*
+ * Navigation Layer: Number keys, navigation
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | | | | | | | | Left | Up | Down | Right| |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | | | | | | | | | | | | | | | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | RCtrl| |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_NAV] = LAYOUT(
+ _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_UP, KC_DOWN, KC_RGHT, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_RCTL, _______
+ ),
+/*
+ * Adjust Layer: RGB
+ *
+ * ,-------------------------------------------. ,-------------------------------------------.
+ * | | | | | | | | | | | | | |
+ * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+ * | | TOG | SAI | HUI | VAI | MOD | | | | | | | |
+ * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+ * | | | SAD | HUD | VAD | RMOD | | | | | | | | | | | |
+ * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+ * | | | | | | | | | | | |
+ * | | | | | | | | | | | |
+ * `----------------------------------' `----------------------------------'
+ */
+ [_ADJUST] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, RGB_TOG, RGB_SAI, RGB_HUI, RGB_VAI, RGB_MOD, _______, _______, _______, _______, _______, _______,
+ _______, _______, RGB_SAD, RGB_HUD, RGB_VAD, RGB_RMOD,_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+// /*
+// * Layer template
+// *
+// * ,-------------------------------------------. ,-------------------------------------------.
+// * | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------| |------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | |
+// * |--------+------+------+------+------+------+-------------. ,-------------+------+------+------+------+------+--------|
+// * | | | | | | | | | | | | | | | | | |
+// * `----------------------+------+------+------+------+------| |------+------+------+------+------+----------------------'
+// * | | | | | | | | | | | |
+// * | | | | | | | | | | | |
+// * `----------------------------------' `----------------------------------'
+// */
+// [_LAYERINDEX] = LAYOUT(
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+// ),
+};
+// clang-format on
+
+/* void keyboard_post_init_user(void) { */
+/* rgblight_setrgb(51, 135, 204); */
+/* } */
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+ switch (keycode) {
+ case M_LRPRN:
+ // Double tap gets messed up with macros, turning it off
+ double_tap_it = false;
+ SEND_STRING("()" SS_TAP(X_LEFT));
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ return false;
+ case M_LRCBR:
+ double_tap_it = false;
+ SEND_STRING("{}" SS_TAP(X_LEFT));
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ return false;
+ case M_LRBRC:
+ double_tap_it = false;
+ SEND_STRING("[]" SS_TAP(X_LEFT));
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ return false;
+ case M_LRABR:
+ double_tap_it = false;
+ SEND_STRING("<>" SS_TAP(X_LEFT));
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ return false;
+ case M_DQUOT:
+ double_tap_it = false;
+ SEND_STRING("''" SS_TAP(X_LEFT));
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ return false;
+ case DBL_TAP:
+ double_tap_it = !double_tap_it;
+ return false;
+ case KC_LEAD:
+ double_tap_it = false;
+ return true;
+ }
+ } else if (double_tap_it && keycode != DBL_TAP) {
+ double_tap_it = false;
+ tap_code16(keycode);
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ }
+
+ return true;
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) { return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST); }
+
+#ifdef OLED_DRIVER_ENABLE
+oled_rotation_t oled_init_user(oled_rotation_t rotation) { return OLED_ROTATION_180; }
+
+// clang-format off
+static void render_kyria_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,
+ 0, 0, 0, 0,240,252,255, 31, 7, 1, 0, 0,192,240,252,254,255,247,243,177,176, 48, 48, 48, 48, 48, 48, 48,120,254,135, 1, 0, 0,255,255, 0, 0, 1,135,254,120, 48, 48, 48, 48, 48, 48, 48,176,177,243,247,255,254,252,240,192, 0, 0, 1, 7, 31,255,252,240, 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,255,255,255, 0, 0, 0, 0, 0,254,255,255, 1, 1, 7, 30,120,225,129,131,131,134,134,140,140,152,152,177,183,254,248,224,255,255,224,248,254,183,177,152,152,140,140,134,134,131,131,129,225,120, 30, 7, 1, 1,255,255,254, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0,255,255, 0, 0,192,192, 48, 48, 0, 0,240,240, 0, 0, 0, 0, 0, 0,240,240, 0, 0,240,240,192,192, 48, 48, 48, 48,192,192, 0, 0, 48, 48,243,243, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48,192,192, 0, 0, 0, 0, 0,
+ 0, 0, 0,255,255,255, 0, 0, 0, 0, 0,127,255,255,128,128,224,120, 30,135,129,193,193, 97, 97, 49, 49, 25, 25,141,237,127, 31, 7,255,255, 7, 31,127,237,141, 25, 25, 49, 49, 97, 97,193,193,129,135, 30,120,224,128,128,255,255,127, 0, 0, 0, 0, 0,255,255,255, 0, 0, 0, 0, 63, 63, 3, 3, 12, 12, 48, 48, 0, 0, 0, 0, 51, 51, 51, 51, 51, 51, 15, 15, 0, 0, 63, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 63, 63, 48, 48, 0, 0, 12, 12, 51, 51, 51, 51, 51, 51, 63, 63, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 15, 63,255,248,224,128, 0, 0, 3, 15, 63,127,255,239,207,141, 13, 12, 12, 12, 12, 12, 12, 12, 30,127,225,128, 0, 0,255,255, 0, 0,128,225,127, 30, 12, 12, 12, 12, 12, 12, 12, 13,141,207,239,255,127, 63, 15, 3, 0, 0,128,224,248,255, 63, 15, 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, 3, 7, 15, 62,124,248,240,224,192,128, 1, 3, 7, 15, 30, 28, 60, 56,120,112,112,224,224,225,231,254,248,255,255,248,254,231,225,224,224,112,112,120, 56, 60, 28, 30, 15, 7, 3, 1,128,192,224,240,248,124, 62, 15, 7, 3, 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, 1, 1, 3, 7, 15, 14, 30, 28, 60, 56,120,112,112,112,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,112,112,112,120, 56, 60, 28, 30, 14, 15, 7, 3, 1, 1, 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
+ };
+ oled_write_raw_P(kyria_logo, sizeof(kyria_logo));
+}
+
+static void render_qmk_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);
+}
+// clang-format on
+
+static void render_status(void) {
+ // QMK Logo and version information
+ render_qmk_logo();
+ oled_write_P(PSTR("Kyria rev1.0\n"), false);
+ oled_write_P(PSTR("v" QMK_VERSION "\n"), false);
+
+ // Host Keyboard Layer Status
+ oled_write_P(PSTR("Layer: "), false);
+ switch (get_highest_layer(layer_state)) {
+ case _DEFAULT:
+ oled_write_P(PSTR("plattfot\n"), false);
+ break;
+ case _LOWER:
+ oled_write_P(PSTR("symbols\n"), false);
+ break;
+ case _RAISE:
+ oled_write_P(PSTR("function keys\n"), false);
+ break;
+ case _NAV:
+ oled_write_P(PSTR("numbers/navi\n"), false);
+ break;
+ case _ADJUST:
+ oled_write_P(PSTR("adjust\n"), false);
+ break;
+ default:
+ oled_write_P(PSTR("undefined\n"), false);
+ }
+
+ // Host Keyboard LED Status and Double tap
+ led_t led_state = host_keyboard_led_state();
+ if (led_state.num_lock) {
+ oled_write_P(PSTR("NUMLCK "), false);
+ } else if (double_tap_it) {
+ oled_write_P(PSTR("Double "), false);
+ } else {
+ oled_write_P(PSTR(" "), false);
+ }
+
+ if (led_state.caps_lock) {
+ oled_write_P(PSTR("CAPLCK "), false);
+ } else if (double_tap_it) {
+ oled_write_P(PSTR("Tap "), false);
+ } else {
+ oled_write_P(PSTR(" "), false);
+ }
+
+ oled_write_P(led_state.scroll_lock ? PSTR("SCRLCK ") : PSTR(" "), false);
+}
+
+void oled_task_user(void) {
+ if (is_keyboard_master()) {
+ render_status(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
+ } else {
+ render_kyria_logo();
+ }
+}
+#endif
+
+#ifdef ENCODER_ENABLE
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (index == 0) {
+ switch (get_highest_layer(layer_state)) {
+ case _LOWER:
+ // Skip/Prev song
+ if (clockwise) {
+ tap_code(KC_MNXT);
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ } else {
+ tap_code(KC_MPRV);
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ }
+ break;
+ default:
+ // Volume control
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ } else {
+ tap_code(KC_VOLD);
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ }
+ break;
+ }
+ } else if (index == 1) {
+ switch (get_highest_layer(layer_state)) {
+ case _RAISE:
+ // Credit to Thomas Baart for this
+ // See https://docs.splitkb.com/hc/en-us/articles/360010513760-How-can-I-use-a-rotary-encoder-
+ if (clockwise) {
+ tap_code16(C(KC_TAB));
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ } else {
+ tap_code16(S(C(KC_TAB)));
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ }
+ break;
+ default:
+ // Scrolling
+ if (clockwise) {
+ tap_code(KC_PGDN);
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ } else {
+ tap_code(KC_PGUP);
+ clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
+ }
+ break;
+ }
+ }
+}
+#endif
+
+LEADER_EXTERNS();
+
+void matrix_scan_user(void) {
+ LEADER_DICTIONARY() {
+ leading = false;
+ leader_end();
+ // Sway navigation
+ SEQ_ONE_KEY(KC_Q) { // Jump to workspace 1
+ SEND_STRING(SS_LGUI("1"));
+ }
+ SEQ_ONE_KEY(KC_W) { // Jump to workspace 2
+ SEND_STRING(SS_LGUI("2"));
+ }
+ SEQ_ONE_KEY(KC_E) { // Jump to workspace 3
+ SEND_STRING(SS_LGUI("3"));
+ }
+ SEQ_ONE_KEY(KC_R) { // Jump to workspace 4
+ SEND_STRING(SS_LGUI("4"));
+ }
+ SEQ_ONE_KEY(KC_T) { // Jump to workspace 5
+ SEND_STRING(SS_LGUI("5"));
+ }
+
+ SEQ_ONE_KEY(KC_Y) { // Jump to workspace 6
+ SEND_STRING(SS_LGUI("6"));
+ }
+ SEQ_ONE_KEY(KC_U) { // Jump to workspace 7
+ SEND_STRING(SS_LGUI("7"));
+ }
+ SEQ_ONE_KEY(KC_I) { // Jump to workspace 8
+ SEND_STRING(SS_LGUI("8"));
+ }
+ SEQ_ONE_KEY(KC_O) { // Jump to workspace 9
+ SEND_STRING(SS_LGUI("9"));
+ }
+ SEQ_ONE_KEY(KC_P) { // Jump to workspace 0
+ SEND_STRING(SS_LGUI("0"));
+ }
+ SEQ_ONE_KEY(KC_G) { // View scratch pad
+ SEND_STRING(SS_LGUI("-"));
+ }
+
+ // Sway move window
+ SEQ_TWO_KEYS(KC_M, KC_Q) { // Move to workspace 1
+ SEND_STRING(SS_LSFT(SS_LGUI("1")));
+ }
+ SEQ_TWO_KEYS(KC_M, KC_W) { // Move to workspace 2
+ SEND_STRING(SS_LSFT(SS_LGUI("2")));
+ }
+ SEQ_TWO_KEYS(KC_M, KC_E) { // Move to workspace 3
+ SEND_STRING(SS_LSFT(SS_LGUI("3")));
+ }
+ SEQ_TWO_KEYS(KC_M, KC_R) { // Move to workspace 4
+ SEND_STRING(SS_LSFT(SS_LGUI("4")));
+ }
+ SEQ_TWO_KEYS(KC_M, KC_T) { // Move to workspace 5
+ SEND_STRING(SS_LSFT(SS_LGUI("5")));
+ }
+
+ SEQ_TWO_KEYS(KC_M, KC_Y) { // Move to workspace 6
+ SEND_STRING(SS_LSFT(SS_LGUI("6")));
+ }
+ SEQ_TWO_KEYS(KC_M, KC_U) { // Move to workspace 7
+ SEND_STRING(SS_LSFT(SS_LGUI("7")));
+ }
+ SEQ_TWO_KEYS(KC_M, KC_I) { // Move to workspace 8
+ SEND_STRING(SS_LSFT(SS_LGUI("8")));
+ }
+ SEQ_TWO_KEYS(KC_M, KC_O) { // Move to workspace 9
+ SEND_STRING(SS_LSFT(SS_LGUI("9")));
+ }
+ SEQ_TWO_KEYS(KC_M, KC_P) { // Move to workspace 0
+ SEND_STRING(SS_LSFT(SS_LGUI("0")));
+ }
+ SEQ_TWO_KEYS(KC_M, KC_G) { // Move to scratch pad
+ SEND_STRING(SS_LSFT(SS_LGUI("-")));
+ }
+ }
+}
diff --git a/keyboards/kyria/keymaps/plattfot/rules.mk b/keyboards/kyria/keymaps/plattfot/rules.mk
new file mode 100644
index 0000000000..412546d09a
--- /dev/null
+++ b/keyboards/kyria/keymaps/plattfot/rules.mk
@@ -0,0 +1,5 @@
+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 # Enable the Leader Key feature
+MOUSEKEY_ENABLE = no # Disable mouse, need to save space.
diff --git a/keyboards/kyria/keymaps/thomasbaart/keymap.c b/keyboards/kyria/keymaps/thomasbaart/keymap.c
index ea6ce0a749..6709cd8672 100644
--- a/keyboards/kyria/keymaps/thomasbaart/keymap.c
+++ b/keyboards/kyria/keymaps/thomasbaart/keymap.c
@@ -173,9 +173,20 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
return true;
}
+
+bool is_alt_tab_active = false;
+uint16_t alt_tab_timer = 0;
+
LEADER_EXTERNS();
void matrix_scan_user(void) {
+ if (is_alt_tab_active) {
+ if (timer_elapsed(alt_tab_timer) > 1000) {
+ unregister_code(KC_LALT);
+ is_alt_tab_active = false;
+ }
+ }
+
LEADER_DICTIONARY() {
leading = false;
leader_end();
@@ -192,7 +203,13 @@ void matrix_scan_user(void) {
SEQ_TWO_KEYS(KC_F, KC_P) { // Fusion Projection prefix
SEND_STRING("[Projection] ");
}
- SEQ_TWO_KEYS(KC_E, KC_S) { // Email splitkb
+ SEQ_TWO_KEYS(KC_B, KC_B) { // Basecone invoice description
+ SEND_STRING("[Leveranciersnaam] [Factuurnummer]");
+ }
+ SEQ_TWO_KEYS(KC_E, KC_S) { // Support email splitkb
+ SEND_STRING("support@splitkb.com");
+ }
+ SEQ_TWO_KEYS(KC_E, KC_T) { // Email splitkb
SEND_STRING("thomas@splitkb.com");
}
SEQ_TWO_KEYS(KC_E, KC_P) { // Email personal
@@ -204,15 +221,18 @@ void matrix_scan_user(void) {
SEQ_TWO_KEYS(KC_S, KC_V) { // Splitkb VAT number
SEND_STRING("NL210593349B01");
}
- SEQ_THREE_KEYS(KC_S, KC_D, KC_K) { // Splitkb Kyria build log
- SEND_STRING("https://docs.splitkb.com/docs/kyria-build-log/");
- }
SEQ_TWO_KEYS(KC_B, KC_C) { // Discord bongocat
SEND_STRING(":bongocat:\n");
}
SEQ_TWO_KEYS(KC_C, KC_B) { // Discord code block
SEND_STRING("```c" SS_LSFT("\n\n") "``` " SS_TAP(X_UP));
}
+ SEQ_TWO_KEYS(KC_Y, KC_S) { // Greeting
+ SEND_STRING("Yours sincerely,\n\nThomas Baart");
+ }
+ SEQ_THREE_KEYS(KC_M, KC_V, KC_G) { // Greeting
+ SEND_STRING("Met vriendelijke groet,\n\nThomas Baart");
+ }
}
}
@@ -292,20 +312,25 @@ void encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) {
switch (biton32(layer_state)) {
case QWERTY:
- // Move whole words. Hold shift to select while moving.
+ // History scrubbing. For Adobe products, hold shift while moving
+ // backward to go forward instead.
if (clockwise) {
- tap_code16(C(KC_RGHT));
+ tap_code16(C(KC_Z));
} else {
- tap_code16(C(KC_LEFT));
+ tap_code16(C(KC_Y));
}
break;
default:
- // History scrubbing. For Adobe products, hold shift while moving
- // backward to go forward instead.
+ // Switch between windows on Windows with alt tab.
if (clockwise) {
- tap_code16(C(KC_Z));
+ if (!is_alt_tab_active) {
+ is_alt_tab_active = true;
+ register_code(KC_LALT);
+ }
+ alt_tab_timer = timer_read();
+ tap_code16(KC_TAB);
} else {
- tap_code16(C(KC_Y));
+ tap_code16(S(KC_TAB));
}
break;
}
diff --git a/keyboards/lattice60/rules.mk b/keyboards/lattice60/rules.mk
index 2a1a529660..66cede7959 100644
--- a/keyboards/lattice60/rules.mk
+++ b/keyboards/lattice60/rules.mk
@@ -14,9 +14,6 @@ BOOTLOADER = USBasp
# Processor frequency
F_CPU = 12000000
-# disable the debugging code
-OPT_DEFS = -DDEBUG_LEVEL=0
-
# Build Options
# change yes to no to disable
#
diff --git a/keyboards/le_chiffre/config.h b/keyboards/le_chiffre/config.h
new file mode 100644
index 0000000000..1ab07a6450
--- /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 0000000000..eda303ffc1
--- /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 0000000000..d5ca6969d5
--- /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 0000000000..29f2d31f6f
--- /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 0000000000..2f28911b45
--- /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 0000000000..a95c0f262f
--- /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 0000000000..ead6d88b3e
--- /dev/null
+++ b/keyboards/le_chiffre/readme.md
@@ -0,0 +1,15 @@
+# Le Chiffre
+
+![Le Chiffre](https://i.imgur.com/X1WsUmdl.png)
+
+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 0000000000..d9d44e06e6
--- /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/lets_split/keymaps/mjt/keymap.c b/keyboards/lets_split/keymaps/mjt/keymap.c
index b0394659cc..a7fa4f55d3 100644
--- a/keyboards/lets_split/keymaps/mjt/keymap.c
+++ b/keyboards/lets_split/keymaps/mjt/keymap.c
@@ -152,7 +152,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ PLAY_SONG(tone_qwerty);
#endif
persistent_default_layer_set(1UL<<_QWERTY);
}
@@ -161,7 +161,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case COLEMAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+ PLAY_SONG(tone_colemak);
#endif
persistent_default_layer_set(1UL<<_COLEMAK);
}
@@ -170,7 +170,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case DVORAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+ PLAY_SONG(tone_dvorak);
#endif
persistent_default_layer_set(1UL<<_DVORAK);
}
diff --git a/keyboards/lets_split/keymaps/piemod/keymap.c b/keyboards/lets_split/keymaps/piemod/keymap.c
index d789b7a8be..68e7e0ba05 100644
--- a/keyboards/lets_split/keymaps/piemod/keymap.c
+++ b/keyboards/lets_split/keymaps/piemod/keymap.c
@@ -29,7 +29,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_ESC, KC_QUOTE, LT(7, KC_COMMA), KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DELETE, \
KC_TAB, LT(1, KC_A), LT(2, KC_O), LT(3, KC_E), LT(4, KC_U), KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_ENTER, \
KC_LSHIFT, KC_SCOLON, LT(5, KC_Q), KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_MINUS, \
- F(1), LT(6, KC_LCTRL), KC_MENU, KC_LALT, KC_LGUI, KC_BSPACE, KC_SPACE, KC_RCTRL, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT \
+ C(KC_LALT), LT(6, KC_LCTRL), KC_MENU, KC_LALT, KC_LGUI, KC_BSPACE, KC_SPACE, KC_RCTRL, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT \
),
[_ARROW] = LAYOUT( \
@@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_SYMBOL] = LAYOUT( \
KC_TILD, KC_GRAVE, KC_NO, KC_EQUAL, KC_PLUS, KC_NO, KC_LBRACKET, KC_RBRACKET, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, \
- KC_NO, KC_NO, KC_TRNS, KC_SCOLON, KC_COLN, KC_NO, KC_LCBR, KC_RCBR, KC_DLR, KC_PERC, KC_CIRC, F(2), \
+ KC_NO, KC_NO, KC_TRNS, KC_SCOLON, KC_COLN, KC_NO, KC_LCBR, KC_RCBR, KC_DLR, KC_PERC, KC_CIRC, S(KC_SLSH), \
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_BSLASH, KC_SLASH, KC_EXLM, KC_AT, KC_HASH, KC_PIPE, \
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_ASTR, KC_SLASH, KC_MINUS, KC_PLUS, KC_EQUAL \
),
@@ -81,19 +81,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MS_BTN1, KC_MS_BTN2, KC_MS_BTN3, KC_NO, KC_NO, KC_NO \
)
};
-
-enum function_id {
- TEENSY_KEY,
- CUSTOM_KEY,
- L_CTRL_ALT_ENT,
- R_CTRL_ALT_ENT,
-};
-
-int CAPSLOCKED = 0;
-
- const uint16_t PROGMEM fn_actions[] = {
- // Special Keys
- [1] = ACTION_MODS_KEY(KC_LCTRL, KC_LALT), // FN10 = Ctrl + Alt.
- // Symbols
- [2] = ACTION_MODS_KEY(MOD_LSFT, KC_SLASH), // FN21 = Question mark.
- };
diff --git a/keyboards/lily58/config.h b/keyboards/lily58/config.h
index 50bf2beb32..0bdaa1f76e 100644
--- a/keyboards/lily58/config.h
+++ b/keyboards/lily58/config.h
@@ -19,10 +19,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once
#include "config_common.h"
-#include <serial_config.h>
-#define USE_I2C
-#define USE_SERIAL
+#ifndef SOFT_SERIAL_PIN
+#define SOFT_SERIAL_PIN D2
+#define SERIAL_USE_MULTI_TRANSACTION
+#endif
#if !defined(NO_ACTION_MACRO)
#define NO_ACTION_MACRO
@@ -30,3 +31,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#if !defined(NO_ACTION_FUNCTION)
#define NO_ACTION_FUNCTION
#endif
+
+#define DIODE_DIRECTION COL2ROW
+
+// Use the lily version to get the Lily58 logo instead of the qmk logo
+#define OLED_FONT_H "lib/glcdfont_lily.c"
diff --git a/keyboards/lily58/i2c.c b/keyboards/lily58/i2c.c
deleted file mode 100755
index 4bee5c6398..0000000000
--- a/keyboards/lily58/i2c.c
+++ /dev/null
@@ -1,162 +0,0 @@
-#include <util/twi.h>
-#include <avr/io.h>
-#include <stdlib.h>
-#include <avr/interrupt.h>
-#include <util/twi.h>
-#include <stdbool.h>
-#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<<TWINT)) && lim < I2C_LOOP_TIMEOUT)
- lim++;
-
- // easier way, but will wait slightly longer
- // _delay_us(100);
-}
-
-// Setup twi to run at 100kHz or 400kHz (see ./i2c.h SCL_CLOCK)
-void i2c_master_init(void) {
- // no prescaler
- TWSR = 0;
- // Set TWI clock frequency to SCL_CLOCK. Need TWBR>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<<TWINT) | (1<<TWEN) | (1<<TWSTA);
-
- i2c_delay();
-
- // check that we started successfully
- if ( (TW_STATUS != TW_START) && (TW_STATUS != TW_REP_START))
- return 1;
-
- TWDR = address;
- TWCR = (1<<TWINT) | (1<<TWEN);
-
- i2c_delay();
-
- if ( (TW_STATUS != TW_MT_SLA_ACK) && (TW_STATUS != TW_MR_SLA_ACK) )
- return 1; // slave did not acknowledge
- else
- return 0; // success
-}
-
-
-// Finish the i2c transaction.
-void i2c_master_stop(void) {
- TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
-
- uint16_t lim = 0;
- while(!(TWCR & (1<<TWSTO)) && lim < I2C_LOOP_TIMEOUT)
- lim++;
-}
-
-// Write one byte to the i2c slave.
-// returns 0 => slave ACK
-// 1 => slave NACK
-uint8_t i2c_master_write(uint8_t data) {
- TWDR = data;
- TWCR = (1<<TWINT) | (1<<TWEN);
-
- i2c_delay();
-
- // check if the slave acknowledged us
- return (TW_STATUS == TW_MT_DATA_ACK) ? 0 : 1;
-}
-
-// Read one byte from the i2c slave. If ack=1 the slave is acknowledged,
-// if ack=0 the acknowledge bit is not set.
-// returns: byte read from i2c device
-uint8_t i2c_master_read(int ack) {
- TWCR = (1<<TWINT) | (1<<TWEN) | (ack<<TWEA);
-
- i2c_delay();
- return TWDR;
-}
-
-void i2c_reset_state(void) {
- TWCR = 0;
-}
-
-void i2c_slave_init(uint8_t address) {
- TWAR = address << 0; // slave i2c address
- // TWEN - twi enable
- // TWEA - enable address acknowledgement
- // TWINT - twi interrupt flag
- // TWIE - enable the twi interrupt
- TWCR = (1<<TWIE) | (1<<TWEA) | (1<<TWINT) | (1<<TWEN);
-}
-
-ISR(TWI_vect);
-
-ISR(TWI_vect) {
- uint8_t ack = 1;
- switch(TW_STATUS) {
- case TW_SR_SLA_ACK:
- // this device has been addressed as a slave receiver
- slave_has_register_set = false;
- break;
-
- case TW_SR_DATA_ACK:
- // this device has received data as a slave receiver
- // The first byte that we receive in this transaction sets the location
- // of the read/write location of the slaves memory that it exposes over
- // i2c. After that, bytes will be written at slave_buffer_pos, incrementing
- // slave_buffer_pos after each write.
- if(!slave_has_register_set) {
- slave_buffer_pos = TWDR;
- // don't acknowledge the master if this memory loctaion is out of bounds
- if ( slave_buffer_pos >= 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<<TWIE) | (1<<TWINT) | (ack<<TWEA) | (1<<TWEN);
-}
-#endif
diff --git a/keyboards/lily58/i2c.h b/keyboards/lily58/i2c.h
deleted file mode 100755
index 710662c7ab..0000000000
--- a/keyboards/lily58/i2c.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#pragma once
-
-#include <stdint.h>
-
-#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 400kHz
-#define SCL_CLOCK 400000L
-
-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();
diff --git a/keyboards/lily58/keymaps/chuan/config.h b/keyboards/lily58/keymaps/chuan/config.h
new file mode 100644
index 0000000000..fa93060db1
--- /dev/null
+++ b/keyboards/lily58/keymaps/chuan/config.h
@@ -0,0 +1,64 @@
+/*
+This is the c configuration file for the keymap
+
+Copyright 2012 Jun Wako <wakojun@gmail.com>
+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 <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+// #define USE_MATRIX_I2C
+
+// #define USE_I2C
+
+/* Select hand configuration */
+
+#define MASTER_LEFT
+// #define MASTER_RIGHT
+// #define EE_HANDS
+
+// #define SSD1306OLED
+
+#define USE_SERIAL_PD2
+
+#define TAPPING_FORCE_HOLD
+
+/* define tapping term */
+#define TAPPING_TERM 200
+
+
+#undef RGBLED_NUM
+#define RGBLIGHT_ANIMATIONS
+#define RGBLED_NUM 27
+#define RGBLIGHT_LIMIT_VAL 120
+#define RGBLIGHT_HUE_STEP 10
+#define RGBLIGHT_SAT_STEP 17
+#define RGBLIGHT_VAL_STEP 17
+
+#define ENCODERS_PAD_A { F4 }
+#define ENCODERS_PAD_B { F5 }
+
+
+ /* Set 0 if debouncing isn't needed */
+#define DEBOUNCE 5
+
+// Underglow
+/*
+#undef RGBLED_NUM
+#define RGBLED_NUM 14 // Number of LEDs
+#define RGBLIGHT_ANIMATIONS
+#define RGBLIGHT_SLEEP
+*/
diff --git a/keyboards/lily58/keymaps/chuan/keymap.c b/keyboards/lily58/keymaps/chuan/keymap.c
new file mode 100644
index 0000000000..da49e67a0e
--- /dev/null
+++ b/keyboards/lily58/keymaps/chuan/keymap.c
@@ -0,0 +1,230 @@
+#include QMK_KEYBOARD_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;
+
+#define _QWERTY 0
+#define _LOWER 1
+#define _RAISE 2
+#define _ADJUST 3
+
+enum custom_keycodes {
+ QWERTY = SAFE_RANGE,
+ LOWER,
+ RAISE,
+ ADJUST,
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* QWERTY
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | Q | W | E | R | T | | Y | U | I | O | P | - |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * |HYPER | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
+ * |------+------+------+------+------+------| - | | + |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LCtl | LGUI |LALT | /Space / \Space \ |RAISE | [ | ] |
+ * | | | |/ LOWER / \ \ | ' | | |
+ * `----------------------------' '------''--------------------'
+ */
+
+ [_QWERTY] = LAYOUT(
+ KC_GESC, 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, \
+ ALL_T(KC_GRV), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENTER, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MINS, MEH_T(KC_EQL), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
+ KC_LCTRL, KC_LGUI, KC_LALT,LT(_LOWER, KC_SPC), KC_SPC, LT(2,KC_QUOT), KC_LBRC, KC_RBRC \
+),
+/* LOWER
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | | | | | | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | F1 | F2 | F3 | F4 | F5 | F6 | | F7 | F8 | F9 | F10 | F11 | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ` | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | - |
+ * |------+------+------+------+------+------| cmd spc| | |------+------+------+------+------+------|
+ * | | | |ctrl c| | |-------| |-------| | - | _ | [ | ] | | |
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE | { | } |
+ * | | | |/ / \ \ | | | |
+ * `----------------------------' '------''--------------------'
+ */
+[_LOWER] = LAYOUT(
+ KC_GRV, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, 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, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______,_______, _______, _______,\
+ _______, _______, _______, C(KC_C), _______, _______, LGUI(KC_SPC), _______, _______, KC_MINS, KC_UNDS , KC_LBRC, KC_RBRC, KC_PIPE, \
+ _______, _______, _______, _______, _______, RAISE, KC_LCBR, KC_RCBR\
+),
+/* RAISE
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | | | | | | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | F1 | F2 | F3 | F4 | F5 | F6 |-------. ,-------| | Left | Down | Up |Right | |
+ * |------+------+------+------+------+------| [ | | ] |------+------+------+------+------+------|
+ * | F7 | F8 | F9 | F10 | F11 | F12 |-------| |-------| + | - | = | [ | ] | \ |
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI |
+ * | | | |/ / \ \ | | | |
+ * `----------------------------' '------''--------------------'
+ */
+
+[_RAISE] = LAYOUT(
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, KC_MRWD, KC_MPLY, KC_MFFD, KC_DEL, _______, \
+ KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_6, LCTL(LSFT(KC_TAB)),KC_UP,LCTL(KC_TAB), KC_0, _______, \
+ _______, _______, _______, _______, _______, _______, XXXXXXX, KC_LEFT, KC_DOWN, KC_RIGHT, KC_RGHT, XXXXXXX, \
+ _______, _______, _______, _______, _______, _______, _______, TG(_ADJUST),KC_PLUS, KC_MUTE ,KC_VOLD ,KC_VOLU, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______ \
+),
+/* ADJUST
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | | | | | | | | | 7 | 8 | 9 |RGB ON| HUE+ |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | | | | | | 4 | 5 | 6 | MODE | HUE- |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | | | |-------. ,-------| | 1 | 2 | 3 | SAT+ | VAL+ |
+ * |------+------+------+------+------+------| | |DEFAULT|------+------+------+------+------+------|
+ * | | | | | | |-------| |-------| | 0 | 0 | . | SAT- | VAL- |
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LAlt | LGUI |LOWER | /Space / \Enter \ |RAISE |BackSP| RGUI |
+ * | | | |/ / \ \ | | | |
+ * `----------------------------' '------''--------------------'
+ */
+ [_ADJUST] = LAYOUT(
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_7 , KC_8 , KC_9 , RGB_TOG, RGB_HUI, \
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_4 , KC_5 , KC_6 , RGB_MOD, RGB_HUD, \
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_1 , KC_2 , KC_3 , RGB_SAI, RGB_VAI, \
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TG(_ADJUST), XXXXXXX, KC_0 , KC_0 , KC_DOT, RGB_SAD, RGB_VAD,\
+ _______, _______, _______, _______, _______, _______,KC_BSPC, _______ \
+ )
+};
+
+int RGB_current_mode;
+
+int counter = 0;
+int lastIndex = 9;
+
+// Setting ADJUST layer RGB back to default
+void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
+ if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
+ layer_on(layer3);
+ } else {
+ layer_off(layer3);
+ }
+}
+
+void matrix_init_user(void) {
+ #ifdef RGBLIGHT_ENABLE
+ RGB_current_mode = rgblight_config.mode;
+ #endif
+}
+
+#ifdef OLED_DRIVER_ENABLE
+
+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;
+}
+
+// When add source files to SRC in rules.mk, you can use functions.
+const char *read_layer_state(void);
+const char *read_logo(void);
+void set_keylog(uint16_t keycode, keyrecord_t *record);
+const char *read_keylog(void);
+const char *read_keylogs(void);
+
+const char *read_mode_icon(bool swap);
+const char *read_host_led_state(void);
+void set_timelog(void);
+const char *read_timelog(void);
+
+char encoder_debug[24];
+
+void oled_task_user(void) {
+ // Host Keyboard Layer Status
+ snprintf(encoder_debug, sizeof(encoder_debug), "%i %i", counter, lastIndex );
+ if (is_keyboard_master()) {
+ // If you want to change the display of OLED, you need to change here
+ oled_write_ln(read_layer_state(), false);
+ // oled_write_ln(read_keylog(), false);
+ // oled_write_ln(read_keylogs(), false);
+ // oled_write_ln(read_mode_icon(keymap_config.swap_lalt_lgui), false);
+ oled_write_ln(read_host_led_state(), false);
+ oled_write_ln(encoder_debug, false);
+ // oled_write_ln(read_timelog(), false);
+ } else {
+ oled_write(read_logo(), false);
+ // oled_write_ln(encoder_debug, false);
+ }
+}
+#endif //OLED_DRIVER_ENABLE
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (record->event.pressed) {
+#ifdef SSD1306OLED
+ // set_keylog(keycode, record);
+#endif
+ // set_timelog();
+ }
+
+ 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_RGB(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_LOWER);
+ update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
+ }
+ return false;
+ break;
+ case RAISE:
+ if (record->event.pressed) {
+ layer_on(_RAISE);
+ update_tri_layer_RGB(_LOWER, _RAISE, _ADJUST);
+ } else {
+ layer_off(_RAISE);
+ update_tri_layer_RGB(_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) {
+ lastIndex = index;
+ if (clockwise) {
+ counter++;
+ tap_code(KC_PGDN);
+ } else {
+ counter--;
+ tap_code(KC_PGUP);
+ }
+}
diff --git a/keyboards/lily58/keymaps/chuan/rules.mk b/keyboards/lily58/keymaps/chuan/rules.mk
new file mode 100644
index 0000000000..3e05cb7d92
--- /dev/null
+++ b/keyboards/lily58/keymaps/chuan/rules.mk
@@ -0,0 +1,11 @@
+EXTRAKEY_ENABLE = yes
+NKRO_ENABLE = yes
+ENCODER_ENABLE = yes
+# If you want to change the display of OLED, you need to change here
+SRC += ./lib/rgb_state_reader.c \
+ ./lib/layer_state_reader.c \
+ ./lib/logo_reader.c \
+ ./lib/mode_icon_reader.c \
+ ./lib/host_led_state_reader.c \
+ ./lib/timelogger.c \
+ ./lib/keylogger.c \
diff --git a/keyboards/lily58/keymaps/default/config.h b/keyboards/lily58/keymaps/default/config.h
index 58bbdc5e9d..6b9e52c05e 100644
--- a/keyboards/lily58/keymaps/default/config.h
+++ b/keyboards/lily58/keymaps/default/config.h
@@ -28,8 +28,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// #define MASTER_RIGHT
// #define EE_HANDS
-#define SSD1306OLED
-
#define USE_SERIAL_PD2
#define TAPPING_FORCE_HOLD
@@ -49,4 +47,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define RGBLED_NUM 14 // Number of LEDs
#define RGBLIGHT_ANIMATIONS
#define RGBLIGHT_SLEEP
-*/ \ No newline at end of file
+*/
diff --git a/keyboards/lily58/keymaps/default/keymap.c b/keyboards/lily58/keymaps/default/keymap.c
index f36248e12d..f0fbaa8b0d 100644
--- a/keyboards/lily58/keymaps/default/keymap.c
+++ b/keyboards/lily58/keymaps/default/keymap.c
@@ -8,8 +8,6 @@
#include "ssd1306.h"
#endif
-
-
#ifdef RGBLIGHT_ENABLE
//Following line allows macro to read current RGB settings
extern rgblight_config_t rgblight_config;
@@ -135,16 +133,18 @@ void matrix_init_user(void) {
#ifdef RGBLIGHT_ENABLE
RGB_current_mode = rgblight_config.mode;
#endif
- //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
- #ifdef SSD1306OLED
- iota_gfx_init(!has_usb()); // turns on the display
- #endif
}
-//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
-#ifdef SSD1306OLED
+//SSD1306 OLED update loop, make sure to enable OLED_DRIVER_ENABLE=yes in rules.mk
+#ifdef OLED_DRIVER_ENABLE
-// When add source files to SRC in rules.mk, you can use functions.
+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;
+}
+
+// When you add source files to SRC in rules.mk, you can use functions.
const char *read_layer_state(void);
const char *read_logo(void);
void set_keylog(uint16_t keycode, keyrecord_t *record);
@@ -156,42 +156,24 @@ const char *read_keylogs(void);
// void set_timelog(void);
// const char *read_timelog(void);
-void matrix_scan_user(void) {
- iota_gfx_task();
-}
-
-void matrix_render_user(struct CharacterMatrix *matrix) {
- if (is_master) {
+void oled_task_user(void) {
+ if (is_keyboard_master()) {
// If you want to change the display of OLED, you need to change here
- matrix_write_ln(matrix, read_layer_state());
- matrix_write_ln(matrix, read_keylog());
- matrix_write_ln(matrix, read_keylogs());
- //matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
- //matrix_write_ln(matrix, read_host_led_state());
- //matrix_write_ln(matrix, read_timelog());
+ oled_write_ln(read_layer_state(), false);
+ oled_write_ln(read_keylog(), false);
+ oled_write_ln(read_keylogs(), false);
+ //oled_write_ln(read_mode_icon(keymap_config.swap_lalt_lgui), false);
+ //oled_write_ln(read_host_led_state(), false);
+ //oled_write_ln(read_timelog(), false);
} else {
- matrix_write(matrix, read_logo());
- }
-}
-
-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;
+ oled_write(read_logo(), false);
}
}
-
-void iota_gfx_task_user(void) {
- struct CharacterMatrix matrix;
- matrix_clear(&matrix);
- matrix_render_user(&matrix);
- matrix_update(&display, &matrix);
-}
-#endif//SSD1306OLED
+#endif // OLED_DRIVER_ENABLE
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
-#ifdef SSD1306OLED
+#ifdef OLED_DRIVER_ENABLE
set_keylog(keycode, record);
#endif
// set_timelog();
diff --git a/keyboards/lily58/keymaps/default/rules.mk b/keyboards/lily58/keymaps/default/rules.mk
index b39305767b..a5b6303a1e 100644
--- a/keyboards/lily58/keymaps/default/rules.mk
+++ b/keyboards/lily58/keymaps/default/rules.mk
@@ -15,13 +15,13 @@ UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
SWAP_HANDS_ENABLE = no # Enable one-hand typing
+OLED_DRIVER_ENABLE= yes # OLED display
# 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 you want to change the display of OLED, you need to change here
-SRC += ./lib/glcdfont.c \
- ./lib/rgb_state_reader.c \
+SRC += ./lib/rgb_state_reader.c \
./lib/layer_state_reader.c \
./lib/logo_reader.c \
./lib/keylogger.c \
diff --git a/keyboards/lily58/keymaps/yuchi/keymap.c b/keyboards/lily58/keymaps/yuchi/keymap.c
index 13b6cb1687..d258fbcbc0 100644
--- a/keyboards/lily58/keymaps/yuchi/keymap.c
+++ b/keyboards/lily58/keymaps/yuchi/keymap.c
@@ -112,7 +112,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |LOWER | LGUI | Alt | /Space / \Enter \ |BackSP| RGUI |RAISE |
* | | | |/ / \ \ | | | |
* `----------------------------' '------''--------------------'
- */
+ */
[_ADJUST] = LAYOUT( \
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
@@ -137,14 +137,16 @@ void matrix_init_user(void) {
#ifdef RGBLIGHT_ENABLE
RGB_current_mode = rgblight_config.mode;
#endif
- //SSD1306 OLED init, make sure to add #define SSD1306OLED in config.h
- #ifdef SSD1306OLED
- iota_gfx_init(!has_usb()); // turns on the display
- #endif
}
-//SSD1306 OLED update loop, make sure to add #define SSD1306OLED in config.h
-#ifdef SSD1306OLED
+//SSD1306 OLED update loop, make sure to enable OLED_DRIVER_ENABLE=yes in rules.mk
+#ifdef OLED_DRIVER_ENABLE
+
+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;
+}
// When add source files to SRC in rules.mk, you can use functions.
const char *read_layer_state(void);
@@ -165,35 +167,22 @@ void matrix_scan_user(void) {
void matrix_render_user(struct CharacterMatrix *matrix) {
if (is_master) {
// If you want to change the display of OLED, you need to change here
- matrix_write_ln(matrix, read_layer_state());
- matrix_write_ln(matrix, read_keylog());
- matrix_write_ln(matrix, read_keylogs());
- //matrix_write_ln(matrix, read_mode_icon(keymap_config.swap_lalt_lgui));
- //matrix_write_ln(matrix, read_host_led_state());
- //matrix_write_ln(matrix, read_timelog());
+ oled_write_ln(read_layer_state(), false);
+ oled_write_ln(read_keylog(), false);
+ oled_write_ln(read_keylogs(), false);
+ //oled_write_ln(read_mode_icon(keymap_config.swap_lalt_lgui), false);
+ //oled_write_ln(read_host_led_state(), false);
+ //oled_write_ln(read_timelog(), false);
} else {
- matrix_write(matrix, read_logo());
+ oled_write(read_logo(), false);
}
}
-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) {
- struct CharacterMatrix matrix;
- matrix_clear(&matrix);
- matrix_render_user(&matrix);
- matrix_update(&display, &matrix);
-}
#endif//SSD1306OLED
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
-#ifdef SSD1306OLED
+#ifdef OLED_DRIVER_ENABLE
set_keylog(keycode, record);
#endif
// set_timelog();
@@ -236,4 +225,4 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
break;
}
return true;
-} \ No newline at end of file
+}
diff --git a/keyboards/lily58/keymaps/yuchi/rules.mk b/keyboards/lily58/keymaps/yuchi/rules.mk
index 922fac6b69..0db9ac50fa 100644
--- a/keyboards/lily58/keymaps/yuchi/rules.mk
+++ b/keyboards/lily58/keymaps/yuchi/rules.mk
@@ -13,15 +13,14 @@ 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.
SWAP_HANDS_ENABLE = no # Enable one-hand typing
# 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 you want to change the display of OLED, you need to change here
-SRC += ./lib/glcdfont.c \
- ./lib/rgb_state_reader.c \
+SRC += ./lib/rgb_state_reader.c \
./lib/layer_state_reader.c \
./lib/logo_reader.c \
./lib/keylogger.c \
diff --git a/keyboards/lily58/lib/glcdfont.c b/keyboards/lily58/lib/glcdfont.c
deleted file mode 100644
index 94f026ba97..0000000000
--- a/keyboards/lily58/lib/glcdfont.c
+++ /dev/null
@@ -1,232 +0,0 @@
-// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0.
-// See gfxfont.h for newer custom bitmap font info.
-
-#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, 0x80,
- 0x80, 0x80, 0x80, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x80, 0xE0, 0x70, 0x18,
- 0x0C, 0x18, 0x30, 0xE0, 0x80, 0x00,
- 0x00, 0x10, 0xF8, 0x90, 0x10, 0x30,
- 0x78, 0x30, 0x10, 0xB8, 0xFC, 0x38,
- 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xF8, 0xFC, 0xF8, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C,
- 0x9C, 0x1C, 0x00, 0x00, 0x00, 0x00,
- 0xF8, 0xFC, 0xF8, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x1C, 0xFC, 0xF8,
- 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x80, 0xE0, 0xF8, 0x7C, 0x1C,
- 0x00, 0x00, 0x00, 0xF0, 0xFC, 0xFC,
- 0xFC, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
- 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xF8,
- 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
- 0x1C, 0x3C, 0xF8, 0xF0, 0xE0, 0x00,
- 0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC,
- 0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00,
- 0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E,
- 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00,
- 0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B,
- 0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00,
- 0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE,
- 0xDE, 0xD7, 0xDC, 0x00, 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, 0x0F,
- 0xBC, 0xE0, 0x81, 0x81, 0x81, 0x83,
- 0x83, 0x82, 0x87, 0x0C, 0x18, 0x30,
- 0x60, 0xC0, 0x00, 0x00, 0x1F, 0xFE,
- 0x90, 0xB9, 0xFF, 0xBB, 0x91, 0x98,
- 0x3C, 0x18, 0x11, 0x13, 0x3F, 0x11,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
- 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
- 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
- 0x0F, 0x7F, 0xF8, 0xE0, 0x80, 0xF0,
- 0xFC, 0x3F, 0x0F, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F,
- 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x3C,
- 0x78, 0xF8, 0xF0, 0xE0, 0x80, 0x00,
- 0x00, 0x00, 0x00, 0xC3, 0xE7, 0xFF,
- 0x7E, 0x3C, 0x38, 0x78, 0x78, 0x70,
- 0x70, 0xF8, 0xFF, 0xDF, 0x87, 0x00,
- 0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
- 0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00,
- 0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F,
- 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00,
- 0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20,
- 0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00,
- 0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F,
- 0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x18, 0x3C, 0x24, 0x66, 0x63, 0x41,
- 0xC1, 0x81, 0x80, 0x80, 0x80, 0x80,
- 0x80, 0x80, 0x81, 0xC1, 0x41, 0x62,
- 0x38, 0x6C, 0x4C, 0xC6, 0x81, 0x81,
- 0x80, 0x80, 0x80, 0x80, 0x80, 0x81,
- 0xC1, 0x43, 0x62, 0x36, 0x1C, 0x18,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0,
- 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
- 0xC0, 0x80, 0x00, 0x00, 0x00, 0x7F,
- 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00,
- 0x7F, 0xFF, 0xFF, 0xC0, 0x80, 0x00,
- 0x00, 0x00, 0xE0, 0xE0, 0xC0, 0xC0,
- 0xC0, 0xE0, 0xF9, 0x7F, 0x1F, 0x07,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x70, 0xF0, 0xE0,
- 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0,
- 0xF0, 0xF8, 0x7F, 0x3F, 0x0F, 0x00,
- 0x00, 0x00, 0x0F, 0x3F, 0x7F, 0xF9,
- 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0,
- 0xC0, 0xE0, 0xF9, 0x7F, 0x3F, 0x1F,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 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/lily58/lib/glcdfont_lily.c b/keyboards/lily58/lib/glcdfont_lily.c
new file mode 100644
index 0000000000..0aa69ea822
--- /dev/null
+++ b/keyboards/lily58/lib/glcdfont_lily.c
@@ -0,0 +1,233 @@
+// This is the 'classic' fixed-space bitmap font for Adafruit_GFX since 1.0.
+// See gfxfont.h for newer custom bitmap font info.
+
+// Modified to show the Lily58 logo instead of the qmk logo
+#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, 0x80,
+ 0x80, 0x80, 0x80, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0xE0, 0x70, 0x18,
+ 0x0C, 0x18, 0x30, 0xE0, 0x80, 0x00,
+ 0x00, 0x10, 0xF8, 0x90, 0x10, 0x30,
+ 0x78, 0x30, 0x10, 0xB8, 0xFC, 0x38,
+ 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xF8, 0xFC, 0xF8, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C,
+ 0x9C, 0x1C, 0x00, 0x00, 0x00, 0x00,
+ 0xF8, 0xFC, 0xF8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x1C, 0xFC, 0xF8,
+ 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x80, 0xE0, 0xF8, 0x7C, 0x1C,
+ 0x00, 0x00, 0x00, 0xF0, 0xFC, 0xFC,
+ 0xFC, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x1C, 0x1C, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xC0, 0xF0, 0xF8,
+ 0x38, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C,
+ 0x1C, 0x3C, 0xF8, 0xF0, 0xE0, 0x00,
+ 0xE0, 0xF0, 0xF0, 0xF0, 0xE0, 0xEC,
+ 0xEE, 0xF7, 0xF3, 0x70, 0x20, 0x00,
+ 0x7C, 0x7C, 0x7C, 0x7E, 0x00, 0x7E,
+ 0x7E, 0x7E, 0x7F, 0x7F, 0x7F, 0x00,
+ 0x00, 0x80, 0xC0, 0xE0, 0x7E, 0x5B,
+ 0x4F, 0x5B, 0xFE, 0xC0, 0x00, 0x00,
+ 0xC0, 0x00, 0xDC, 0xD7, 0xDE, 0xDE,
+ 0xDE, 0xD7, 0xDC, 0x00, 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, 0x0F,
+ 0xBC, 0xE0, 0x81, 0x81, 0x81, 0x83,
+ 0x83, 0x82, 0x87, 0x0C, 0x18, 0x30,
+ 0x60, 0xC0, 0x00, 0x00, 0x1F, 0xFE,
+ 0x90, 0xB9, 0xFF, 0xBB, 0x91, 0x98,
+ 0x3C, 0x18, 0x11, 0x13, 0x3F, 0x11,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
+ 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ 0x0F, 0x7F, 0xF8, 0xE0, 0x80, 0xF0,
+ 0xFC, 0x3F, 0x0F, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x3F, 0x3F, 0x3F,
+ 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x3C,
+ 0x78, 0xF8, 0xF0, 0xE0, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0xC3, 0xE7, 0xFF,
+ 0x7E, 0x3C, 0x38, 0x78, 0x78, 0x70,
+ 0x70, 0xF8, 0xFF, 0xDF, 0x87, 0x00,
+ 0x0F, 0x1F, 0x3F, 0x7F, 0x7F, 0x7F,
+ 0x7F, 0x7F, 0x3F, 0x1E, 0x0C, 0x00,
+ 0x1F, 0x1F, 0x1F, 0x3F, 0x00, 0x3F,
+ 0x3F, 0x3F, 0x7F, 0x7F, 0x7F, 0x00,
+ 0x30, 0x7B, 0x7F, 0x78, 0x30, 0x20,
+ 0x20, 0x30, 0x78, 0x7F, 0x3B, 0x00,
+ 0x03, 0x00, 0x0F, 0x7F, 0x0F, 0x0F,
+ 0x0F, 0x7F, 0x0F, 0x00, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x18, 0x3C, 0x24, 0x66, 0x63, 0x41,
+ 0xC1, 0x81, 0x80, 0x80, 0x80, 0x80,
+ 0x80, 0x80, 0x81, 0xC1, 0x41, 0x62,
+ 0x38, 0x6C, 0x4C, 0xC6, 0x81, 0x81,
+ 0x80, 0x80, 0x80, 0x80, 0x80, 0x81,
+ 0xC1, 0x43, 0x62, 0x36, 0x1C, 0x18,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0xFF, 0xC0, 0xC0,
+ 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0x80, 0x00, 0x00, 0x00, 0x7F,
+ 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00,
+ 0x7F, 0xFF, 0xFF, 0xC0, 0x80, 0x00,
+ 0x00, 0x00, 0xE0, 0xE0, 0xC0, 0xC0,
+ 0xC0, 0xE0, 0xF9, 0x7F, 0x1F, 0x07,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x70, 0xF0, 0xE0,
+ 0xE0, 0xC0, 0xC0, 0xC0, 0xC0, 0xE0,
+ 0xF0, 0xF8, 0x7F, 0x3F, 0x0F, 0x00,
+ 0x00, 0x00, 0x0F, 0x3F, 0x7F, 0xF9,
+ 0xE0, 0xE0, 0xC0, 0xC0, 0xC0, 0xC0,
+ 0xC0, 0xE0, 0xF9, 0x7F, 0x3F, 0x1F,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 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/lily58/lib/host_led_state_reader.c b/keyboards/lily58/lib/host_led_state_reader.c
index 0e22173b1d..589dd6152e 100644
--- a/keyboards/lily58/lib/host_led_state_reader.c
+++ b/keyboards/lily58/lib/host_led_state_reader.c
@@ -1,15 +1,16 @@
#include <stdio.h>
+#include "led.h"
+#include "host.h"
#include "lily58.h"
char host_led_state_str[24];
const char *read_host_led_state(void)
{
- uint8_t leds = host_keyboard_leds();
snprintf(host_led_state_str, sizeof(host_led_state_str), "NL:%s CL:%s SL:%s",
- (leds & (1 << USB_LED_NUM_LOCK)) ? "on" : "- ",
- (leds & (1 << USB_LED_CAPS_LOCK)) ? "on" : "- ",
- (leds & (1 << USB_LED_SCROLL_LOCK)) ? "on" : "- ");
+ (IS_HOST_LED_ON(USB_LED_NUM_LOCK)) ? "on" : "- ",
+ (IS_HOST_LED_ON(USB_LED_CAPS_LOCK)) ? "on" : "- ",
+ (IS_HOST_LED_ON(USB_LED_SCROLL_LOCK)) ? "on" : "- ");
return host_led_state_str;
}
diff --git a/keyboards/lily58/lib/keylogger.c b/keyboards/lily58/lib/keylogger.c
index a1bd476d20..2fc3e663ec 100644
--- a/keyboards/lily58/lib/keylogger.c
+++ b/keyboards/lily58/lib/keylogger.c
@@ -1,4 +1,5 @@
#include <stdio.h>
+#include "action.h"
#include "lily58.h"
char keylog_str[24] = {};
diff --git a/keyboards/lily58/lib/layer_state_reader.c b/keyboards/lily58/lib/layer_state_reader.c
index 48674b0673..0e9dd7039b 100644
--- a/keyboards/lily58/lib/layer_state_reader.c
+++ b/keyboards/lily58/lib/layer_state_reader.c
@@ -4,10 +4,10 @@
#include "lily58.h"
#define L_BASE 0
-#define L_LOWER 2
-#define L_RAISE 4
-#define L_ADJUST 8
-#define L_ADJUST_TRI 14
+#define L_LOWER (1 << 1)
+#define L_RAISE (1 << 2)
+#define L_ADJUST (1 << 3)
+#define L_ADJUST_TRI (L_ADJUST | L_RAISE | L_LOWER)
char layer_state_str[24];
diff --git a/keyboards/lily58/lib/mode_icon_reader.c b/keyboards/lily58/lib/mode_icon_reader.c
index 2bce4a71b0..27c6d92cd0 100644
--- a/keyboards/lily58/lib/mode_icon_reader.c
+++ b/keyboards/lily58/lib/mode_icon_reader.c
@@ -1,4 +1,5 @@
#include <stdio.h>
+#include <stdbool.h>
#include "lily58.h"
char mode_icon[24];
diff --git a/keyboards/lily58/lib/timelogger.c b/keyboards/lily58/lib/timelogger.c
index bfbfbe8a21..b00c13cb0a 100644
--- a/keyboards/lily58/lib/timelogger.c
+++ b/keyboards/lily58/lib/timelogger.c
@@ -1,4 +1,5 @@
#include <stdio.h>
+#include "timer.h"
#include "lily58.h"
char timelog_str[24] = {};
diff --git a/keyboards/lily58/lily58.c b/keyboards/lily58/lily58.c
index eacd90a82d..03975057f4 100644
--- a/keyboards/lily58/lily58.c
+++ b/keyboards/lily58/lily58.c
@@ -1,10 +1,5 @@
#include "lily58.h"
-#include "ssd1306.h"
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
-#ifdef SSD1306OLED
- return process_record_gfx(keycode,record) && process_record_user(keycode, record);
-#else
return process_record_user(keycode, record);
-#endif
-} \ No newline at end of file
+}
diff --git a/keyboards/lily58/rev1/config.h b/keyboards/lily58/rev1/config.h
index 4e8e3a7c9c..adcf11b52b 100644
--- a/keyboards/lily58/rev1/config.h
+++ b/keyboards/lily58/rev1/config.h
@@ -36,8 +36,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_ROW_PINS { C6, D7, E6, B4, B5 }
#define MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6 }
-/* define tapping term */
-#define TAPPING_TERM 100
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
diff --git a/keyboards/lily58/rev1/rules.mk b/keyboards/lily58/rev1/rules.mk
index 6028b5a5b9..e69de29bb2 100644
--- a/keyboards/lily58/rev1/rules.mk
+++ b/keyboards/lily58/rev1/rules.mk
@@ -1,3 +0,0 @@
-SRC += rev1/matrix.c
-SRC += rev1/split_util.c
-SRC += rev1/split_scomm.c
diff --git a/keyboards/lily58/rev1/split_scomm.c b/keyboards/lily58/rev1/split_scomm.c
deleted file mode 100755
index a1fe6ba5b8..0000000000
--- a/keyboards/lily58/rev1/split_scomm.c
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifdef USE_SERIAL
-#ifdef SERIAL_USE_MULTI_TRANSACTION
-/* --- USE flexible API (using multi-type transaction function) --- */
-
-#include <stdbool.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <split_scomm.h>
-#include "serial.h"
-#ifdef CONSOLE_ENABLE
- #include <print.h>
-#endif
-
-uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0};
-uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
-uint8_t volatile status_com = 0;
-uint8_t volatile status1 = 0;
-uint8_t slave_buffer_change_count = 0;
-uint8_t s_change_old = 0xff;
-uint8_t s_change_new = 0xff;
-
-SSTD_t transactions[] = {
-#define GET_SLAVE_STATUS 0
- /* master buffer not changed, only recive slave_buffer_change_count */
- { (uint8_t *)&status_com,
- 0, NULL,
- sizeof(slave_buffer_change_count), &slave_buffer_change_count,
- },
-#define PUT_MASTER_GET_SLAVE_STATUS 1
- /* master buffer changed need send, and recive slave_buffer_change_count */
- { (uint8_t *)&status_com,
- sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer,
- sizeof(slave_buffer_change_count), &slave_buffer_change_count,
- },
-#define GET_SLAVE_BUFFER 2
- /* recive serial_slave_buffer */
- { (uint8_t *)&status1,
- 0, NULL,
- sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer
- }
-};
-
-void serial_master_init(void)
-{
- soft_serial_initiator_init(transactions, TID_LIMIT(transactions));
-}
-
-void serial_slave_init(void)
-{
- soft_serial_target_init(transactions, TID_LIMIT(transactions));
-}
-
-// 0 => no error
-// 1 => slave did not respond
-// 2 => checksum error
-int serial_update_buffers(int master_update)
-{
- int status, smatstatus;
- static int need_retry = 0;
-
- if( s_change_old != s_change_new ) {
- smatstatus = soft_serial_transaction(GET_SLAVE_BUFFER);
- if( smatstatus == TRANSACTION_END ) {
- s_change_old = s_change_new;
-#ifdef CONSOLE_ENABLE
- uprintf("slave matrix = %b %b %b %b\n",
- serial_slave_buffer[0], serial_slave_buffer[1],
- serial_slave_buffer[2], serial_slave_buffer[3]);
-#endif
- }
- } else {
- // serial_slave_buffer dosen't change
- smatstatus = TRANSACTION_END; // dummy status
- }
-
- if( !master_update && !need_retry) {
- status = soft_serial_transaction(GET_SLAVE_STATUS);
- } else {
- status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS);
- }
- if( status == TRANSACTION_END ) {
- s_change_new = slave_buffer_change_count;
- need_retry = 0;
- } else {
- need_retry = 1;
- }
- return smatstatus;
-}
-
-#endif // SERIAL_USE_MULTI_TRANSACTION
-#endif /* USE_SERIAL */
diff --git a/keyboards/lily58/rev1/split_scomm.h b/keyboards/lily58/rev1/split_scomm.h
deleted file mode 100755
index 873d8939d8..0000000000
--- a/keyboards/lily58/rev1/split_scomm.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef SPLIT_COMM_H
-#define SPLIT_COMM_H
-
-#ifndef SERIAL_USE_MULTI_TRANSACTION
-/* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */
-#include "serial.h"
-
-#else
-/* --- USE flexible API (using multi-type transaction function) --- */
-// Buffers for master - slave communication
-#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
-#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2
-
-extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
-extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH];
-extern uint8_t slave_buffer_change_count;
-
-void serial_master_init(void);
-void serial_slave_init(void);
-int serial_update_buffers(int master_changed);
-
-#endif
-
-#endif /* SPLIT_COMM_H */
diff --git a/keyboards/lily58/rev1/split_util.h b/keyboards/lily58/rev1/split_util.h
deleted file mode 100755
index 687ca19bd3..0000000000
--- a/keyboards/lily58/rev1/split_util.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef SPLIT_KEYBOARD_UTIL_H
-#define SPLIT_KEYBOARD_UTIL_H
-
-#include <stdbool.h>
-#include "eeconfig.h"
-
-#define SLAVE_I2C_ADDRESS 0x32
-
-extern volatile bool isLeftHand;
-
-// slave version of matix scan, defined in matrix.c
-void matrix_slave_scan(void);
-
-void split_keyboard_setup(void);
-bool has_usb(void);
-
-void matrix_master_OLED_init (void);
-
-#endif
diff --git a/keyboards/lily58/rules.mk b/keyboards/lily58/rules.mk
index d413510bac..34b512d59a 100644
--- a/keyboards/lily58/rules.mk
+++ b/keyboards/lily58/rules.mk
@@ -29,19 +29,7 @@ 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
-
-CUSTOM_MATRIX = yes
-
-SRC += i2c.c
-SRC += serial.c
-SRC += ssd1306.c
-
-# A workaround until #7089 is merged.
-# serial.c must not be compiled with the -lto option.
-# The current LIB_SRC has a side effect with the -fno-lto option, so use it.
-LIB_SRC += serial.c
-
-# if firmware size over limit, try this option
-# CFLAGS += -flto
+OLED_DRIVER_ENABLE = yes # OLED display
+SPLIT_KEYBOARD = yes
DEFAULT_FOLDER = lily58/rev1
diff --git a/keyboards/lily58/serial.h b/keyboards/lily58/serial.h
deleted file mode 100755
index 7e0c0847a4..0000000000
--- a/keyboards/lily58/serial.h
+++ /dev/null
@@ -1,84 +0,0 @@
-#ifndef SOFT_SERIAL_H
-#define SOFT_SERIAL_H
-
-#include <stdbool.h>
-
-// /////////////////////////////////////////////////////////////////
-// Need Soft Serial defines in config.h
-// /////////////////////////////////////////////////////////////////
-// ex.
-// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6
-// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5
-// // 1: about 137kbps (default)
-// // 2: about 75kbps
-// // 3: about 39kbps
-// // 4: about 26kbps
-// // 5: about 20kbps
-//
-// //// USE Simple API (OLD API, compatible with let's split serial.c)
-// ex.
-// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
-// #define SERIAL_MASTER_BUFFER_LENGTH 1
-//
-// //// USE flexible API (using multi-type transaction function)
-// #define SERIAL_USE_MULTI_TRANSACTION
-//
-// /////////////////////////////////////////////////////////////////
-
-
-#ifndef SERIAL_USE_MULTI_TRANSACTION
-/* --- USE Simple API (OLD API, compatible with let's split serial.c) */
-#if SERIAL_SLAVE_BUFFER_LENGTH > 0
-extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
-#endif
-#if SERIAL_MASTER_BUFFER_LENGTH > 0
-extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH];
-#endif
-
-void serial_master_init(void);
-void serial_slave_init(void);
-int serial_update_buffers(void);
-
-#endif // USE Simple API
-
-// Soft Serial Transaction Descriptor
-typedef struct _SSTD_t {
- uint8_t *status;
- uint8_t initiator2target_buffer_size;
- uint8_t *initiator2target_buffer;
- uint8_t target2initiator_buffer_size;
- uint8_t *target2initiator_buffer;
-} SSTD_t;
-#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t))
-
-// initiator is transaction start side
-void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size);
-// target is interrupt accept side
-void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size);
-
-// initiator resullt
-#define TRANSACTION_END 0
-#define TRANSACTION_NO_RESPONSE 0x1
-#define TRANSACTION_DATA_ERROR 0x2
-#define TRANSACTION_TYPE_ERROR 0x4
-#ifndef SERIAL_USE_MULTI_TRANSACTION
-int soft_serial_transaction(void);
-#else
-int soft_serial_transaction(int sstd_index);
-#endif
-
-// target status
-// *SSTD_t.status has
-// initiator:
-// TRANSACTION_END
-// or TRANSACTION_NO_RESPONSE
-// or TRANSACTION_DATA_ERROR
-// target:
-// TRANSACTION_DATA_ERROR
-// or TRANSACTION_ACCEPTED
-#define TRANSACTION_ACCEPTED 0x8
-#ifdef SERIAL_USE_MULTI_TRANSACTION
-int soft_serial_get_and_clean_status(int sstd_index);
-#endif
-
-#endif /* SOFT_SERIAL_H */
diff --git a/keyboards/lily58/serial_config.h b/keyboards/lily58/serial_config.h
deleted file mode 100644
index 4fab8e8ddf..0000000000
--- a/keyboards/lily58/serial_config.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifndef SOFT_SERIAL_PIN
-#define SOFT_SERIAL_PIN D2
-#define SERIAL_USE_MULTI_TRANSACTION
-#endif
diff --git a/keyboards/lily58/ssd1306.c b/keyboards/lily58/ssd1306.c
deleted file mode 100755
index 20c2738db7..0000000000
--- a/keyboards/lily58/ssd1306.c
+++ /dev/null
@@ -1,344 +0,0 @@
-#ifdef SSD1306OLED
-
-#include "ssd1306.h"
-#include "i2c.h"
-#include <string.h>
-#include "print.h"
-#ifdef ADAFRUIT_BLE_ENABLE
-#include "adafruit_ble.h"
-#endif
-#ifdef PROTOCOL_LUFA
-#include "lufa.h"
-#endif
-#include "sendchar.h"
-#include "timer.h"
-
-extern const unsigned char font[] PROGMEM;
-
-// 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
-// with the matrix scan, causing keys to drop.
-#define DEBUG_TO_SCREEN 0
-
-//static uint16_t last_battery_update;
-//static uint32_t vbat;
-//#define BatteryUpdateInterval 10000 /* milliseconds */
-
-// 'last_flush' is declared as uint16_t,
-// so this must be less than 65535
-#define ScreenOffInterval 60000 /* milliseconds */
-#if DEBUG_TO_SCREEN
-static uint8_t displaying;
-#endif
-static uint16_t last_flush;
-
-static bool force_dirty = true;
-
-// Write command sequence.
-// Returns true on success.
-static inline bool _send_cmd1(uint8_t cmd) {
- bool res = false;
-
- if (i2c_start_write(SSD1306_ADDRESS)) {
- xprintf("failed to start write to %d\n", SSD1306_ADDRESS);
- goto done;
- }
-
- if (i2c_master_write(0x0 /* command byte follows */)) {
- print("failed to write control byte\n");
-
- goto done;
- }
-
- if (i2c_master_write(cmd)) {
- xprintf("failed to write command %d\n", cmd);
- goto done;
- }
- res = true;
-done:
- i2c_master_stop();
- 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;}
-
-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);
-
- if (i2c_start_write(SSD1306_ADDRESS)) {
- goto done;
- }
- if (i2c_master_write(0x40)) {
- // Data mode
- goto done;
- }
- for (uint8_t row = 0; row < MatrixRows; ++row) {
- for (uint8_t col = 0; col < DisplayWidth; ++col) {
- i2c_master_write(0);
- }
- }
-
- display.dirty = false;
-
-done:
- i2c_master_stop();
-}
-
-#if DEBUG_TO_SCREEN
-#undef sendchar
-static int8_t capture_sendchar(uint8_t c) {
- sendchar(c);
- iota_gfx_write_char(c);
-
- if (!displaying) {
- iota_gfx_flush();
- }
- return 0;
-}
-#endif
-
-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 */);
-
- if(rotate){
- // the following Flip the display orientation 180 degrees
- send_cmd1(SegRemap);
- send_cmd1(ComScanInc);
- }else{
- // Flips the display orientation 0 degrees
- send_cmd1(SegRemap | 0x1);
- send_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
-
- clear_display();
-
- success = true;
-
- iota_gfx_flush();
-
-#if DEBUG_TO_SCREEN
- print_set_sendchar(capture_sendchar);
-#endif
-
-done:
- return success;
-}
-
-bool iota_gfx_off(void) {
- bool success = false;
-
- send_cmd1(DisplayOff);
- success = true;
-
-done:
- return success;
-}
-
-bool iota_gfx_on(void) {
- bool success = false;
-
- send_cmd1(DisplayOn);
- success = true;
-
-done:
- return success;
-}
-
-void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c) {
- *matrix->cursor = c;
- ++matrix->cursor;
-
- if (matrix->cursor - &matrix->display[0][0] == sizeof(matrix->display)) {
- // We went off the end; scroll the display upwards by one line
- memmove(&matrix->display[0], &matrix->display[1],
- MatrixCols * (MatrixRows - 1));
- matrix->cursor = &matrix->display[MatrixRows - 1][0];
- memset(matrix->cursor, ' ', MatrixCols);
- }
-}
-
-void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c) {
- matrix->dirty = true;
-
- if (c == '\n') {
- // Clear to end of line from the cursor and then move to the
- // start of the next line
- uint8_t cursor_col = (matrix->cursor - &matrix->display[0][0]) % MatrixCols;
-
- while (cursor_col++ < MatrixCols) {
- matrix_write_char_inner(matrix, ' ');
- }
- return;
- }
-
- matrix_write_char_inner(matrix, c);
-}
-
-void iota_gfx_write_char(uint8_t c) {
- matrix_write_char(&display, c);
-}
-
-void matrix_write(struct CharacterMatrix *matrix, const char *data) {
- const char *end = data + strlen(data);
- while (data < end) {
- 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);
-}
-
-void iota_gfx_write(const char *data) {
- matrix_write(&display, data);
-}
-
-void matrix_write_P(struct CharacterMatrix *matrix, const char *data) {
- while (true) {
- uint8_t c = pgm_read_byte(data);
- if (c == 0) {
- return;
- }
- matrix_write_char(matrix, c);
- ++data;
- }
-}
-
-void iota_gfx_write_P(const char *data) {
- matrix_write_P(&display, data);
-}
-
-void matrix_clear(struct CharacterMatrix *matrix) {
- memset(matrix->display, ' ', sizeof(matrix->display));
- matrix->cursor = &matrix->display[0][0];
- matrix->dirty = true;
-}
-
-void iota_gfx_clear_screen(void) {
- matrix_clear(&display);
-}
-
-void matrix_render(struct CharacterMatrix *matrix) {
- last_flush = timer_read();
- iota_gfx_on();
-#if DEBUG_TO_SCREEN
- ++displaying;
-#endif
-
- // Move to the home position
- send_cmd3(PageAddr, 0, MatrixRows - 1);
- send_cmd3(ColumnAddr, 0, (MatrixCols * FontWidth) - 1);
-
- if (i2c_start_write(SSD1306_ADDRESS)) {
- goto done;
- }
- if (i2c_master_write(0x40)) {
- // Data mode
- goto done;
- }
-
- for (uint8_t row = 0; row < MatrixRows; ++row) {
- for (uint8_t col = 0; col < MatrixCols; ++col) {
- const uint8_t *glyph = font + (matrix->display[row][col] * FontWidth);
-
- for (uint8_t glyphCol = 0; glyphCol < FontWidth; ++glyphCol) {
- uint8_t colBits = pgm_read_byte(glyph + glyphCol);
- i2c_master_write(colBits);
- }
-
- // 1 column of space between chars (it's not included in the glyph)
- //i2c_master_write(0);
- }
- }
-
- matrix->dirty = false;
-
-done:
- i2c_master_stop();
-#if DEBUG_TO_SCREEN
- --displaying;
-#endif
-}
-
-void iota_gfx_flush(void) {
- matrix_render(&display);
-}
-
-__attribute__ ((weak))
-void iota_gfx_task_user(void) {
-}
-
-void iota_gfx_task(void) {
- iota_gfx_task_user();
-
- if (display.dirty|| force_dirty) {
- iota_gfx_flush();
- force_dirty = false;
- }
-
- if (timer_elapsed(last_flush) > ScreenOffInterval) {
- iota_gfx_off();
- }
-}
-
-bool process_record_gfx(uint16_t keycode, keyrecord_t *record) {
- force_dirty = true;
- return true;
-}
-
-#endif
diff --git a/keyboards/lily58/ssd1306.h b/keyboards/lily58/ssd1306.h
deleted file mode 100755
index 0ca093093a..0000000000
--- a/keyboards/lily58/ssd1306.h
+++ /dev/null
@@ -1,90 +0,0 @@
-#pragma once
-
-#include <stdbool.h>
-#include <stdio.h>
-#include "action.h"
-
-enum ssd1306_cmds {
- DisplayOff = 0xAE,
- DisplayOn = 0xAF,
-
- SetContrast = 0x81,
- DisplayAllOnResume = 0xA4,
-
- DisplayAllOn = 0xA5,
- NormalDisplay = 0xA6,
- InvertDisplay = 0xA7,
- SetDisplayOffset = 0xD3,
- SetComPins = 0xda,
- SetVComDetect = 0xdb,
- SetDisplayClockDiv = 0xD5,
- SetPreCharge = 0xd9,
- SetMultiPlex = 0xa8,
- SetLowColumn = 0x00,
- SetHighColumn = 0x10,
- SetStartLine = 0x40,
-
- SetMemoryMode = 0x20,
- ColumnAddr = 0x21,
- PageAddr = 0x22,
-
- ComScanInc = 0xc0,
- ComScanDec = 0xc8,
- SegRemap = 0xa0,
- SetChargePump = 0x8d,
- ExternalVcc = 0x01,
- SwitchCapVcc = 0x02,
-
- ActivateScroll = 0x2f,
- DeActivateScroll = 0x2e,
- SetVerticalScrollArea = 0xa3,
- RightHorizontalScroll = 0x26,
- LeftHorizontalScroll = 0x27,
- VerticalAndRightHorizontalScroll = 0x29,
- VerticalAndLeftHorizontalScroll = 0x2a,
-};
-
-// Controls the SSD1306 128x32 OLED display via i2c
-
-#ifndef SSD1306_ADDRESS
-#define SSD1306_ADDRESS 0x3C
-#endif
-
-#define DisplayHeight 32
-#define DisplayWidth 128
-
-#define FontHeight 8
-#define FontWidth 6
-
-#define MatrixRows (DisplayHeight / FontHeight)
-#define MatrixCols (DisplayWidth / FontWidth)
-
-struct CharacterMatrix {
- uint8_t display[MatrixRows][MatrixCols];
- uint8_t *cursor;
- bool dirty;
-};
-
-struct CharacterMatrix display;
-
-bool iota_gfx_init(bool rotate);
-void iota_gfx_task(void);
-bool iota_gfx_off(void);
-bool iota_gfx_on(void);
-void iota_gfx_flush(void);
-void iota_gfx_write_char(uint8_t c);
-void iota_gfx_write(const char *data);
-void iota_gfx_write_P(const char *data);
-void iota_gfx_clear_screen(void);
-
-void iota_gfx_task_user(void);
-
-void matrix_clear(struct CharacterMatrix *matrix);
-void matrix_write_char_inner(struct CharacterMatrix *matrix, uint8_t c);
-void matrix_write_char(struct CharacterMatrix *matrix, uint8_t c);
-void matrix_write(struct CharacterMatrix *matrix, const char *data);
-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);
diff --git a/keyboards/maartenwut/mx5160/readme.md b/keyboards/maartenwut/mx5160/readme.md
index 40753a8f55..3b0e15d7e5 100644
--- a/keyboards/maartenwut/mx5160/readme.md
+++ b/keyboards/maartenwut/mx5160/readme.md
@@ -5,7 +5,7 @@
## Support
* Keyboard Maintainer: [Maarten Dekkers](https://github.com/maartenwut)
* Hardware Supported: mx-5160 (Chicony 5160c case)
-* Hardware Availability: [Github](https://github.com/Maartenwut/mx-5160)
+* Hardware Availability: [GitHub](https://github.com/Maartenwut/mx-5160)
## Build
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/maartenwut/wasdat/keymaps/konstantin/config.h b/keyboards/maartenwut/wasdat/keymaps/konstantin/config.h
index 3c2583e2d4..1d12c7db37 100644
--- a/keyboards/maartenwut/wasdat/keymaps/konstantin/config.h
+++ b/keyboards/maartenwut/wasdat/keymaps/konstantin/config.h
@@ -1,4 +1,6 @@
#pragma once
+#define DYNAMIC_KEYMAP_LAYER_COUNT 3
+
#define LAYER_FN
#define LAYER_NUMPAD
diff --git a/keyboards/maartenwut/wasdat/keymaps/konstantin/rules.mk b/keyboards/maartenwut/wasdat/keymaps/konstantin/rules.mk
index c3a73fd845..f70005d3f6 100644
--- a/keyboards/maartenwut/wasdat/keymaps/konstantin/rules.mk
+++ b/keyboards/maartenwut/wasdat/keymaps/konstantin/rules.mk
@@ -1,11 +1,17 @@
-BACKLIGHT_ENABLE = no
-BOOTMAGIC_ENABLE = no
+# Generic features
+BOOTMAGIC_ENABLE = lite
COMMAND_ENABLE = yes
CONSOLE_ENABLE = yes
EXTRAKEY_ENABLE = yes
-GRAVE_ESC_ENABLE = no
MOUSEKEY_ENABLE = yes
NKRO_ENABLE = yes
-SPACE_CADET_ENABLE = no
TAP_DANCE_ENABLE = yes
UNICODEMAP_ENABLE = yes
+
+# Keyboard-specific features
+VIA_ENABLE = yes
+
+# Firmware size reduction
+GRAVE_ESC_ENABLE = no
+MAGIC_ENABLE = no
+SPACE_CADET_ENABLE = no
diff --git a/keyboards/massdrop/ctrl/info.json b/keyboards/massdrop/ctrl/info.json
index 2212540e52..5e7f92f5bb 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/maxr1998/phoebe/config.h b/keyboards/maxr1998/phoebe/config.h
index 2be26c6fdb..e530bc46ef 100644
--- a/keyboards/maxr1998/phoebe/config.h
+++ b/keyboards/maxr1998/phoebe/config.h
@@ -57,6 +57,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define RGBLIGHT_EFFECT_CHRISTMAS
#define RGBLIGHT_EFFECT_CHRISTMAS_STEP 1
+/* Leader key setup */
+#define LEADER_PER_KEY_TIMING
+#define LEADER_TIMEOUT 250
+
/*
* Feature disable options
* These options are also useful to firmware size reduction.
diff --git a/keyboards/maxr1998/phoebe/keymaps/default/keymap.c b/keyboards/maxr1998/phoebe/keymaps/default/keymap.c
index b1a37a2f19..11df63bb17 100644
--- a/keyboards/maxr1998/phoebe/keymaps/default/keymap.c
+++ b/keyboards/maxr1998/phoebe/keymaps/default/keymap.c
@@ -1,6 +1,7 @@
#include QMK_KEYBOARD_H
#include "keymap_german.h"
+#include "sendstring_german.h"
enum layers {
_QWERTZ,
@@ -16,40 +17,40 @@ enum layers {
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-/* Qwertz
- * ,-----------------------------------------------------------------------------------.
- * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ? |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | ^ ° | Q | W | E | R | T | Z | U | I | O | P | Bspc |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Tab | A | S | D | F | G | H | J | K | L | +* ~ | Enter|
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Shift| Y | X | C | V | B | N | M | , | . | Up | Shift|
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Ctrl | Sup | Alt | Alt | SpCh | Space | AltGr| Fun | Left | Down | Right|
- * `-----------------------------------------------------------------------------------'
+/* QWERTZ
+ * ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────â”
+ * │ Esc │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ? │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ * │ ^ ° │ Q │ W │ E │ R │ T │ Z │ U │ I │ O │ P │Bkspc│
+ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ * │ Tab │ A │ S │ D │ F │ G │ H │ J │ K │ L │ +*~ │Enter│
+ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ * │Shift│ Y │ X │ C │ V │ B │ N │ M │ , │ . │ ↑ │Shift│
+ * ├─────┼─────┼─────┼─────┼─────┼─────┴─────┼─────┼─────┼─────┼─────┼─────┤
+ * │ Ctl │ Sup │ Alt │LeadK│SpcCh│ Space │AltGr│ Fun │ ↠│ ↓ │ → │
+ * └─────┴─────┴─────┴─────┴─────┴───────────┴─────┴─────┴─────┴─────┴─────┘
*/
[_QWERTZ] = LAYOUT(
KC_ESC, DE_1, DE_2, DE_3, DE_4, DE_5, DE_6, DE_7, DE_8, DE_9, DE_0, DE_QST,
KC_GRV, 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, DE_PLUS, 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_RSPC,
- KC_LCTL, KC_LGUI, KC_LALT, KC_LALT, KC_SC, KC_SPC, KC_ALGR, KC_FN, KC_LEFT, KC_DOWN, KC_RGHT
+ KC_LCTL, KC_LGUI, KC_LALT, KC_LEAD, KC_SC, KC_SPC, KC_ALGR, KC_FN, KC_LEFT, KC_DOWN, KC_RGHT
),
/* Special characters
- * ,-----------------------------------------------------------------------------------.
- * | | | | | | | | | | | | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | ´ ` | | | | | | | | | | | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | | | | #' | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | <> | | | | | | | | | | -_ | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | ---- | ---- | | | ---- | | | |
- * `-----------------------------------------------------------------------------------'
- */
+ * ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────â”
+ * │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ * │ ´ ` │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ # ' │ │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ * │ │ <>| │ │ │ │ │ │ │ │ │ - _ │ │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┴─────┼─────┼─────┼─────┼─────┼─────┤
+ * │ │ │ │ X │ │ │ │ X │ │ │ │
+ * └─────┴─────┴─────┴─────┴─────┴───────────┴─────┴─────┴─────┴─────┴─────┘
+*/
[_SC] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
DE_ACUT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
@@ -59,17 +60,17 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
/* Function layer
- * ,-----------------------------------------------------------------------------------.
- * | | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F10 | F11 | F12 |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | Ü | F9 | Ö | | Del |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Lock | Ä | ß | | | GAME | | RGBS | RGBB | RGBS | | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | RGBH-| RGBT | RGBH+| PgUp | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | ---- | ---- | | ---- | ---- | Home | PgDn | End |
- * `-----------------------------------------------------------------------------------'
+ * ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────â”
+ * │ │ F1 │ F2 │ F3 │ F4 │ F5 │ F6 │ F7 │ F8 │ F10 │ F11 │ F12 │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ * │ │ │ │ │ │ │ │ Ü │ F9 │ Ö │ │ Del │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ * │ Lck │ Ä │ ß │ │ │ GAME│ │RGB S│RGB B│RGB S│ │ │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ * │ │ │ │ │ │ │ │RGBH-│RGB T│RGBH+│ Pg↑ │ │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┴─────┼─────┼─────┼─────┼─────┼─────┤
+ * │ X │ │ X │ X │ X │ │ X │ X │ Home│ Pg↓ │ End │
+ * └─────┴─────┴─────┴─────┴─────┴───────────┴─────┴─────┴─────┴─────┴─────┘
*/
[_FN] = LAYOUT(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F10, KC_F11, KC_F12,
@@ -80,24 +81,24 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
/* Gaming
- * ,-----------------------------------------------------------------------------------.
- * | | | | | | | | | | | | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | | | | | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | | | | | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | | | | | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Space| | | | | | | Leave| | | |
- * `-----------------------------------------------------------------------------------'
- */
+ * ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────â”
+ * │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
+ * │ │ │ │ │ │ │ │ │ │ │ │ │
+ * ├─────┼─────┼─────┼─────┼─────┼─────┴─────┼─────┼─────┼─────┼─────┼─────┤
+ * │Space│ │ │ │ │ Ctl │ │Leave│ │ │ │
+ * └─────┴─────┴─────┴─────┴─────┴───────────┴─────┴─────┴─────┴─────┴─────┘
+*/
[_GAMING] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- KC_SPC, XXXXXXX, _______, _______, _______, _______, _______, G_0, _______, _______, _______
+ KC_SPC, XXXXXXX, _______, _______, _______, KC_LCTL, _______, G_0, _______, _______, _______
)
};
@@ -128,3 +129,19 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
return true;
};
+
+LEADER_EXTERNS();
+
+void matrix_scan_user(void) {
+ LEADER_DICTIONARY() {
+ leading = false;
+ leader_end();
+
+ SEQ_TWO_KEYS(KC_G, KC_P) {
+ SEND_STRING("git push");
+ }
+ SEQ_THREE_KEYS(KC_G, KC_F, KC_P) {
+ SEND_STRING("git push --force-with-lease");
+ }
+ }
+}
diff --git a/keyboards/maxr1998/phoebe/rules.mk b/keyboards/maxr1998/phoebe/rules.mk
index 335e575364..f60274e515 100644
--- a/keyboards/maxr1998/phoebe/rules.mk
+++ b/keyboards/maxr1998/phoebe/rules.mk
@@ -29,5 +29,6 @@ UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
KEY_LOCK_ENABLE = yes
+LEADER_ENABLE = yes # Enable leader key
API_SYSEX_ENABLE = no
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
diff --git a/keyboards/maxr1998/pulse4k/config.h b/keyboards/maxr1998/pulse4k/config.h
index d1bfaf3006..078b91499f 100644
--- a/keyboards/maxr1998/pulse4k/config.h
+++ b/keyboards/maxr1998/pulse4k/config.h
@@ -1,19 +1,19 @@
/*
-Copyright (C) 2012-2019 Jun Wako <wakojun@gmail.com>, Maxr1998 <max.rumpf1998@gmail.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 <http://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2019-2020 Maxr1998 <max.rumpf1998@gmail.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 <http://www.gnu.org/licenses/>.
+ */
#pragma once
diff --git a/keyboards/maxr1998/pulse4k/keymaps/default/keymap.c b/keyboards/maxr1998/pulse4k/keymaps/default/keymap.c
index 67331235ba..46de247aae 100644
--- a/keyboards/maxr1998/pulse4k/keymaps/default/keymap.c
+++ b/keyboards/maxr1998/pulse4k/keymaps/default/keymap.c
@@ -1,26 +1,28 @@
/*
-Copyright (C) 2019 Maxr1998 <max.rumpf1998@gmail.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 <http://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2019-2020 Maxr1998 <max.rumpf1998@gmail.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 <http://www.gnu.org/licenses/>.
+ */
#include QMK_KEYBOARD_H
enum layers {
- DEFAULT
+ DEFAULT
};
+const uint16_t PROGMEM led_adjust_combo[] = {KC_LEFT, KC_RGHT, COMBO_END};
+
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[DEFAULT] = {
{ KC_END, KC_UP, KC_MUTE },
diff --git a/keyboards/maxr1998/pulse4k/keymaps/maxr1998/keymap.c b/keyboards/maxr1998/pulse4k/keymaps/maxr1998/keymap.c
new file mode 100644
index 0000000000..4ef9779010
--- /dev/null
+++ b/keyboards/maxr1998/pulse4k/keymaps/maxr1998/keymap.c
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2020 Maxr1998 <max.rumpf1998@gmail.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 <http://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+
+enum layers {
+ DEFAULT
+};
+
+const uint16_t PROGMEM led_adjust_combo[] = {KC_F22, KC_F24, COMBO_END};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [DEFAULT] = {
+ { KC_F20, KC_F21, KC_MUTE },
+ { KC_F22, KC_F23, KC_F24 }
+ }
+};
+
+void encoder_one_update(bool clockwise) {
+ tap_code(!clockwise ? KC_F18 : KC_F19);
+}
diff --git a/keyboards/maxr1998/pulse4k/pulse4k.c b/keyboards/maxr1998/pulse4k/pulse4k.c
index 2ec9dca739..61a18af743 100644
--- a/keyboards/maxr1998/pulse4k/pulse4k.c
+++ b/keyboards/maxr1998/pulse4k/pulse4k.c
@@ -1,19 +1,19 @@
/*
-Copyright (C) 2019 Maxr1998 <max.rumpf1998@gmail.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 <http://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2019-2020 Maxr1998 <max.rumpf1998@gmail.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 <http://www.gnu.org/licenses/>.
+ */
#include "pulse4k.h"
#include "rgblight.h"
@@ -22,7 +22,7 @@ enum combo_events {
LED_ADJUST
};
-const uint16_t PROGMEM led_adjust_combo[] = {KC_LEFT, KC_RGHT, COMBO_END};
+extern const uint16_t PROGMEM led_adjust_combo[3];
combo_t key_combos[COMBO_COUNT] = {
[LED_ADJUST] = COMBO_ACTION(led_adjust_combo)
@@ -30,10 +30,6 @@ combo_t key_combos[COMBO_COUNT] = {
bool led_adjust_active = false;
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
void process_combo_event(uint8_t combo_index, bool pressed) {
if (combo_index == LED_ADJUST) {
led_adjust_active = pressed;
@@ -61,17 +57,9 @@ void encoder_update_kb(uint8_t index, bool clockwise) {
}
__attribute__((weak)) void encoder_one_update(bool clockwise) {
- if (clockwise) {
- tap_code(KC_PGDN);
- } else {
- tap_code(KC_PGUP);
- }
+ tap_code(!clockwise ? KC_PGUP : KC_PGDN);
}
__attribute__((weak)) void encoder_two_update(bool clockwise) {
- if (clockwise) {
- tap_code(KC_VOLU);
- } else {
- tap_code(KC_VOLD);
- }
+ tap_code(!clockwise ? KC_VOLD : KC_VOLU);
}
diff --git a/keyboards/maxr1998/pulse4k/pulse4k.h b/keyboards/maxr1998/pulse4k/pulse4k.h
index 7c34870d69..cc0a373b66 100644
--- a/keyboards/maxr1998/pulse4k/pulse4k.h
+++ b/keyboards/maxr1998/pulse4k/pulse4k.h
@@ -1,19 +1,19 @@
/*
-Copyright (C) 2019 Maxr1998 <max.rumpf1998@gmail.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 <http://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2019-2020 Maxr1998 <max.rumpf1998@gmail.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 <http://www.gnu.org/licenses/>.
+ */
#pragma once
diff --git a/keyboards/mc_76k/readme.md b/keyboards/mc_76k/readme.md
index be9b5c5ec6..e9577ebc9b 100644
--- a/keyboards/mc_76k/readme.md
+++ b/keyboards/mc_76k/readme.md
@@ -4,7 +4,7 @@
O-Ring suspended 60% with F-row keyboard
-* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar)
+* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
* Hardware Supported: ATmega32U4
* Hardware Availability: GB run by [mustcode](https://www.reddit.com/user/mustcode). More info on [geekhack](https://geekhack.org/index.php?topic=101040.50)
diff --git a/keyboards/mechlovin/adelais/adelais.c b/keyboards/mechlovin/adelais/adelais.c
new file mode 100644
index 0000000000..87f0caf091
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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(C15, 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 0000000000..d28502da26
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..9ec688aef8
--- /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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 0000000000..4babd9078a
--- /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 0000000000..7848a5709b
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..54d78d873b
--- /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 0000000000..03636d02b3
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..a85ba709d7
--- /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 0000000000..036bd6d1c3
--- /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 0000000000..947d5a31d9
--- /dev/null
+++ b/keyboards/mechlovin/adelais/readme.md
@@ -0,0 +1,18 @@
+# Adelais / Adelais En Ciel
+
+![adelais](https://i.imgur.com/6U1IfZe.png)
+
+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 0000000000..860bcee7c4
--- /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 0000000000..20256e2086
--- /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 0000000000..91f87e5f39
--- /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 = 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
+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 0000000000..0de6cc6b40
--- /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 0000000000..4ddc352404
--- /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 0000000000..5ad16084f1
--- /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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 0000000000..5acea8c665
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..8fd1c67979
--- /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 <http://www.gnu.org/licenses/>.
+*/
+#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 0000000000..97d7b84922
--- /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 0000000000..5edcdd0997
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..9a101f5ace
--- /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 0000000000..0e22b84f06
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..794a57963c
--- /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 0000000000..036bd6d1c3
--- /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 0000000000..777be816a0
--- /dev/null
+++ b/keyboards/mechlovin/hannah60rgb/readme.md
@@ -0,0 +1,15 @@
+# hannah60rgb
+
+![hannah60rgb](https://i.imgur.com/ImXgsyXl.png)
+
+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 0000000000..1a5441fc70
--- /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/infinityce/rules.mk b/keyboards/mechlovin/infinityce/rules.mk
index 8e8807c5e9..199f3316cc 100644
--- a/keyboards/mechlovin/infinityce/rules.mk
+++ b/keyboards/mechlovin/infinityce/rules.mk
@@ -22,7 +22,7 @@ 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
+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
diff --git a/keyboards/mechlovin/pisces/config.h b/keyboards/mechlovin/pisces/config.h
new file mode 100644
index 0000000000..37acff2c11
--- /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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 0000000000..5b32d1186e
--- /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 0000000000..d4890a11ad
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..966b8fd802
--- /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 0000000000..4ea597a9f1
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..33523d5592
--- /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 0000000000..036bd6d1c3
--- /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 0000000000..2a0a97f6d4
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..743b787b7c
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..3229f1a52f
--- /dev/null
+++ b/keyboards/mechlovin/pisces/readme.md
@@ -0,0 +1,13 @@
+# pisces
+
+![pisces](https://i.imgur.com/Oq7TAt8l.jpg)
+
+
+* 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 0000000000..9afc1864f1
--- /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/rules.mk b/keyboards/mechmini/v1/rules.mk
index d0275c946f..93646c8e13 100644
--- a/keyboards/mechmini/v1/rules.mk
+++ b/keyboards/mechmini/v1/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/mehkee96/rules.mk b/keyboards/mehkee96/rules.mk
index b91a69f83b..488c63fce7 100644
--- a/keyboards/mehkee96/rules.mk
+++ b/keyboards/mehkee96/rules.mk
@@ -22,5 +22,3 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/meira/keymaps/default/keymap.c b/keyboards/meira/keymaps/default/keymap.c
index 9bcd771c42..5c80df0f06 100644
--- a/keyboards/meira/keymaps/default/keymap.c
+++ b/keyboards/meira/keymaps/default/keymap.c
@@ -187,7 +187,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ PLAY_SONG(tone_qwerty);
#endif
// persistent_default_layer_set(1UL<<_QWERTY);
}
@@ -196,7 +196,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case COLEMAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+ PLAY_SONG(tone_colemak);
#endif
// persistent_default_layer_set(1UL<<_COLEMAK);
}
@@ -205,7 +205,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case DVORAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+ PLAY_SONG(tone_dvorak);
#endif
// persistent_default_layer_set(1UL<<_DVORAK);
}
diff --git a/keyboards/meira/keymaps/grahampheath/keymap.c b/keyboards/meira/keymaps/grahampheath/keymap.c
index cd02137877..ace172a2a4 100644
--- a/keyboards/meira/keymaps/grahampheath/keymap.c
+++ b/keyboards/meira/keymaps/grahampheath/keymap.c
@@ -243,7 +243,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ PLAY_SONG(tone_qwerty);
#endif
}
return false;
@@ -251,7 +251,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case COLEMAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+ PLAY_SONG(tone_colemak);
#endif
}
return false;
@@ -259,7 +259,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case DVORAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+ PLAY_SONG(tone_dvorak);
#endif
}
return false;
diff --git a/keyboards/meira/keymaps/takmiya/keymap.c b/keyboards/meira/keymaps/takmiya/keymap.c
index 12dad6d690..bf693d8ad2 100644
--- a/keyboards/meira/keymaps/takmiya/keymap.c
+++ b/keyboards/meira/keymaps/takmiya/keymap.c
@@ -153,7 +153,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ PLAY_SONG(tone_qwerty);
#endif
// persistent_default_layer_set(1UL<<_QWERTY);
}
diff --git a/keyboards/meishi/keymaps/default/keymap.c b/keyboards/meishi/keymaps/default/keymap.c
index 528beb168b..ea6e42a961 100644
--- a/keyboards/meishi/keymaps/default/keymap.c
+++ b/keyboards/meishi/keymaps/default/keymap.c
@@ -21,10 +21,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
-const uint16_t PROGMEM fn_actions[] = {
-
-};
-
void matrix_init_user(void) {
}
diff --git a/keyboards/melody96/config.h b/keyboards/melody96/config.h
index 8ab88653f3..2533bfa353 100644
--- a/keyboards/melody96/config.h
+++ b/keyboards/melody96/config.h
@@ -3,8 +3,8 @@
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x6060
+#define VENDOR_ID 0x594d // "YM"
+#define PRODUCT_ID 0x4D96 // "M" + 96
#define DEVICE_VER 0x0001
#define MANUFACTURER YMDK
#define PRODUCT Melody96
@@ -28,6 +28,10 @@
#define BACKLIGHT_LEVELS 5
#endif
+/* Set location for BootMagic key*/
+#define BOOTMAGIC_LITE_ROW 5
+#define BOOTMAGIC_LITE_COLUMN 0
+
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
diff --git a/keyboards/melody96/keymaps/konstantin/rules.mk b/keyboards/melody96/keymaps/konstantin/rules.mk
index 5b36eef2cb..3ef19428aa 100644
--- a/keyboards/melody96/keymaps/konstantin/rules.mk
+++ b/keyboards/melody96/keymaps/konstantin/rules.mk
@@ -1,12 +1,18 @@
-BACKLIGHT_ENABLE = no
+# Generic features
BOOTMAGIC_ENABLE = no
COMMAND_ENABLE = yes
-CONSOLE_ENABLE = no
+CONSOLE_ENABLE = yes
EXTRAKEY_ENABLE = yes
-GRAVE_ESC_ENABLE = no
MOUSEKEY_ENABLE = yes
NKRO_ENABLE = yes
-RGBLIGHT_ENABLE = yes
-SPACE_CADET_ENABLE = no
TAP_DANCE_ENABLE = yes
UNICODEMAP_ENABLE = yes
+
+# Keyboard-specific features
+BACKLIGHT_ENABLE = no
+RGBLIGHT_ENABLE = yes
+
+# Firmware size reduction
+GRAVE_ESC_ENABLE = no
+MAGIC_ENABLE = no
+SPACE_CADET_ENABLE = no
diff --git a/keyboards/melody96/keymaps/via/keymap.c b/keyboards/melody96/keymaps/via/keymap.c
new file mode 100644
index 0000000000..24d7d2d8ad
--- /dev/null
+++ b/keyboards/melody96/keymaps/via/keymap.c
@@ -0,0 +1,36 @@
+#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_PGUP, KC_PGDN, 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_BSLS, 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_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_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_RALT, MO(1), MO(1), KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT),
+
+ [1] = 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_MUTE, 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, RGB_TOG, KC_TRNS, 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,
+ 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, BL_DEC, BL_TOGG, 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_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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, 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/melody96/keymaps/via/readme.md b/keyboards/melody96/keymaps/via/readme.md
new file mode 100644
index 0000000000..9db51187a4
--- /dev/null
+++ b/keyboards/melody96/keymaps/via/readme.md
@@ -0,0 +1,5 @@
+# The via keymap for YMDK Melody 96
+
+This folder contains the [VIA](https://caniusevia.com/) configuration for the YMDK Melody 96
+
+Maintained by: [vlee489](https://github.com/vlee489)
diff --git a/keyboards/melody96/keymaps/via/rules.mk b/keyboards/melody96/keymaps/via/rules.mk
new file mode 100644
index 0000000000..6d6d45bac8
--- /dev/null
+++ b/keyboards/melody96/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes # reduce firmware size
diff --git a/keyboards/melody96/rules.mk b/keyboards/melody96/rules.mk
index c1f1f22ba3..46b60ab9e4 100644
--- a/keyboards/melody96/rules.mk
+++ b/keyboards/melody96/rules.mk
@@ -14,7 +14,7 @@ BOOTLOADER = atmel-dfu
# Build Options
# comment out to disable the options.
#
-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 = no # Console for debug
diff --git a/keyboards/meson/readme.md b/keyboards/meson/readme.md
index 3824690c12..e5fdbad591 100644
--- a/keyboards/meson/readme.md
+++ b/keyboards/meson/readme.md
@@ -4,7 +4,7 @@ A 3x14 split keyboard with two thumb keys on each half. Supports MX, Alps, and C
Keyboard Maintainer: [PyroL](https://github.com/PyrooL)
Hardware Supported: Meson PCBs, Pro Micro
-Hardware Availability: [open source at PyroL's Github](https://github.com/PyrooL/Meson)
+Hardware Availability: [open source at PyroL's GitHub](https://github.com/PyrooL/Meson)
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/minidox/keymaps/rsthd_combos/config.h b/keyboards/minidox/keymaps/rsthd_combos/config.h
new file mode 100644
index 0000000000..1106412b59
--- /dev/null
+++ b/keyboards/minidox/keymaps/rsthd_combos/config.h
@@ -0,0 +1,9 @@
+#pragma once
+
+#define USE_SERIAL
+#define EE_HANDS
+
+
+#define COMBO_COUNT 10
+#define COMBO_TERM 100
+#define IGNORE_MOD_TAP_INTERRUPT
diff --git a/keyboards/minidox/keymaps/rsthd_combos/keymap.c b/keyboards/minidox/keymaps/rsthd_combos/keymap.c
new file mode 100644
index 0000000000..a3ba423c69
--- /dev/null
+++ b/keyboards/minidox/keymaps/rsthd_combos/keymap.c
@@ -0,0 +1,109 @@
+#include QMK_KEYBOARD_H
+
+// Defines names for use in layer keycodes and the keymap
+enum layer_names {
+ _RSTHD,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+enum combo_events {
+ TOP_L,
+ TOP_R,
+ MID_L,
+ MID_R,
+ BOT_L,
+ BOT_R,
+ HN_QUOT,
+ TOP_CTR,
+ MID_CTR,
+ BOT_CTR,
+};
+
+const uint16_t PROGMEM fk_combo[] = {KC_F, KC_K, COMBO_END};
+const uint16_t PROGMEM zl_combo[] = {KC_Z, KC_L, COMBO_END};
+const uint16_t PROGMEM hd_combo[] = {KC_H, KC_D, COMBO_END};
+const uint16_t PROGMEM mn_combo[] = {KC_M, KC_N, COMBO_END};
+const uint16_t PROGMEM pb_combo[] = {KC_P, KC_B, COMBO_END};
+const uint16_t PROGMEM xw_combo[] = {KC_X, KC_W, COMBO_END};
+const uint16_t PROGMEM hn_combo[] = {KC_H, KC_N, COMBO_END};
+const uint16_t PROGMEM kz_combo[] = {KC_K, KC_Z, COMBO_END};
+const uint16_t PROGMEM dm_combo[] = {KC_D, KC_M, COMBO_END};
+const uint16_t PROGMEM bx_combo[] = {KC_B, KC_X, COMBO_END};
+
+combo_t key_combos[COMBO_COUNT] = {
+ [TOP_L] = COMBO(fk_combo, KC_ESC),
+ [TOP_R] = COMBO(zl_combo, KC_AT),
+ [MID_L] = COMBO(hd_combo, KC_TAB),
+ [MID_R] = COMBO_ACTION(mn_combo),
+ [BOT_L] = COMBO(pb_combo, KC_HASH),
+ [BOT_R] = COMBO(xw_combo, KC_AMPR),
+ [HN_QUOT] = COMBO(hn_combo, KC_QUOT),
+ [TOP_CTR] = COMBO_ACTION(kz_combo),
+ [MID_CTR] = COMBO_ACTION(dm_combo),
+ [BOT_CTR] = COMBO_ACTION(bx_combo),
+};
+
+ void process_combo_event(uint8_t combo_index, bool pressed) {
+ switch(combo_index) {
+ case MID_R:
+ if (pressed) {
+ tap_code16(LALT(KC_3));
+ }
+ break;
+ case TOP_CTR:
+ if (pressed) {
+ set_oneshot_mods(MOD_LGUI);
+ }
+ break;
+ case MID_CTR:
+ if (pressed) {
+ set_oneshot_mods(MOD_LALT);
+ }
+ break;
+ case BOT_CTR:
+ if (pressed) {
+ set_oneshot_mods(MOD_LCTL);
+ }
+ break;
+ }
+ }
+
+// Defines for task manager and such
+// For insertion in keymap
+#define KILL LGUI(LALT(KC_ESC)) //Force quit controls
+#define SCRCAP LCTL(LSFT(LGUI(KC_5))) //Screen capture controls
+#define DSK_LFT LGUI(LCTL(KC_LEFT))
+#define DSK_RT LGUI(LCTL(KC_RIGHT))
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+
+[_RSTHD] = LAYOUT(
+ KC_J, KC_C, KC_Y, KC_F, KC_K, KC_Z, KC_L, KC_COMM, KC_U, KC_Q,
+ KC_R, KC_S, KC_T, KC_H, KC_D, KC_M, KC_N, KC_A, KC_I , KC_O,
+ LCTL_T(KC_SLSH), LALT_T(KC_V), LGUI_T(KC_G), KC_P, KC_B, KC_X, KC_W, RGUI_T(KC_DOT), RALT_T(KC_SCLN),RCTL_T(KC_MINS),
+ OSM(MOD_LSFT), LT(_LOWER, KC_BSPC), KC_E, KC_SPC, LT(_RAISE, KC_ENT), OSM(MOD_LSFT)
+),
+[_RAISE] = LAYOUT(
+ KC_PAST, KC_7, KC_8, KC_9, KC_PLUS, KC_NUBS, LALT(KC_2), _______, LALT(KC_4), KC_DLR,
+ KC_CIRC, KC_4, KC_5, KC_6, KC_EQL, LSFT(KC_NUBS), KC_GRV, KC_TILD, KC_PIPE, KC_BSLS,
+ _______, RALT_T(KC_1), KC_2, KC_3,KC_PERC, _______, _______, _______, _______, _______,
+ _______, MO(_ADJUST), KC_0, _______, _______, _______
+),
+[_LOWER] = LAYOUT(
+ _______, KC_LBRC, KC_QUES, KC_RBRC, KC_BRMU, KC_PGUP, KC_HOME, KC_UP, KC_END, KC_VOLU,
+ KC_ESC, KC_LPRN, KC_EXLM, KC_RPRN, KC_BRMD, KC_PGDN, KC_LEFT, KC_DOWN, KC_RIGHT, KC_VOLD,
+ _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MPLY, KC_MNXT, KC__MUTE,
+ _______, _______, _______, KC_DEL, MO(_ADJUST), _______
+),
+[_ADJUST] = LAYOUT(
+ _______, KC_F7, KC_F8, KC_F9, SCRCAP, _______, KC_F10, KC_F11, KC_F12, _______,
+ _______, KC_F1, KC_F2, KC_F3, _______, _______, KC_F4, KC_F5, KC_F6, _______,
+ OSM(MOD_LCTL),_______, _______, _______, RESET, KILL, _______, _______, _______, OSM(MOD_RCTL),
+ _______, _______, _______, _______, _______, _______
+)
+
+};
diff --git a/keyboards/minidox/keymaps/rsthd_combos/readme.md b/keyboards/minidox/keymaps/rsthd_combos/readme.md
new file mode 100644
index 0000000000..877d7059e7
--- /dev/null
+++ b/keyboards/minidox/keymaps/rsthd_combos/readme.md
@@ -0,0 +1,22 @@
+# The RSTHD Layout for minidox - Empowered with Combos
+An attempt at porting Xuming Zeng’s [RSTHD](https://xsznix.wordpress.com/2016/05/16/introducing-the-rsthd-layout/) from the Ergodox to the Minidox.
+[KLE Link](http://www.keyboard-layout-editor.com/#/gists/3161700bf3573325804716b2bdafa50f)
+![RSTHD empowered with chords](https://live.staticflickr.com/65535/49926249372_77ab8eba95_z.jpg)
+
+**Symbols and media/system keys work as shown with keyboard identified by MacOS as "International/ISO" hardware (not ANSI) and "Input Source" within Preferences set to "British" (Apple).**
+
+The key feature on this keymap, aside from the layout, is to telescope seven columns into five using combos. The top row and the bottom row form the basis of the number and nav layers respectively. Combos are shown in the above drawing using paired blue legends.
+## Writing specific
+As a hobby writer I have intended to make a layout that favours prose rather than code, with symbols used in everyday writing such as various (Western) currencies in easy reach. Hardcore coders will no doubt move their favourite symbols to where they feel most comfortable!
+The thumb mounted 'E' made it difficult to adapt other keymaps to this letter layout and eventually drove this fundamental redesign. I have strove to minimise the risk of ‘negligent discharge’ of functions whilst typing - whose interruption which can be fatal to creative flow - and which my previous layouts adapted from various ones in the repository seemed prone. To this end hold-tap keys are not placed on the home row nor thumb operated 'space' and 'E' keys, shift gets its own keys, and I use combos to create a useful number of virtual keys.
+## Combos!
+I employ combos to simulate the missing inner and outer columns that the minidox lacks relative to the Ergodox. All combos operate on keys within the inner pair of columns of each side because during normal typing the index finger has to cover both these columns, making press events of adjacent keys unlikely to overlap. They are assigned names within the keymap that relate to their position on the keyboard (not to my assigned functions) so their functions can be changed at will to suit user preference without confusing the keymap.
+- The six chords spanning the neighbouring two columns of each half correspond to keys in the outer columns of the Ergodox.
+- A further four chords span the central divide, using pairs of letters that infrequently occur consecutively.
+ - The three combos spanning adjacent keys over the central divide simulate the mirrored inboard columns of the RSTHD map for Ergodox, and are set to chamber one shot of their respective modifiers.
+ - The quotation mark is a combo of both resting keys of the index fingers. This is inspired by ‘air quotes’ used in conversation.
+I am confident these combos will rarely be accidentally triggered. If this occurs, try reducing the tapping term.
+## Other features
+- Number pad on left. This confers many benefits for the RSTHD layout, such as leaving key symbols on the primary layer uncovered that are useful for numbers (,.:-). On this layer ‘E’ becomes ‘0’.
+- The nav cluster is now on the right hand and, upon activation ’space’ becomes ‘del’, which allows rapid navigation and editing of text.
+- Pair of one shot shift keys, since mod-tap shift assigned to letters is a bad idea IMO. Some users might choose to move the shift onto the bottom left and right combos which corresponds to where shift lives in the outer columns of the ergodox layout.
diff --git a/keyboards/minidox/keymaps/rsthd_combos/rules.mk b/keyboards/minidox/keymaps/rsthd_combos/rules.mk
new file mode 100644
index 0000000000..ab1e438182
--- /dev/null
+++ b/keyboards/minidox/keymaps/rsthd_combos/rules.mk
@@ -0,0 +1 @@
+COMBO_ENABLE = yes
diff --git a/keyboards/model01/info.json b/keyboards/model01/info.json
deleted file mode 100644
index 60c914d5c0..0000000000
--- a/keyboards/model01/info.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
- "keyboard_name": "model01",
- "keyboard_folder": "model01",
- "url": "https://keyboard.io",
- "maintainer": "qmk",
- "width": 18.5,
- "height": 7.5,
- "layouts": {
- "LAYOUT": {
- "layout": [
- {"label":"PROG", "x":0, "y":0.4, "h":1.3},
- {"label":"1", "x":1, "y":0.2, "h":1.5},
- {"label":"2", "x":2, "y":0.1, "h":1.1},
- {"label":"3", "x":3, "y":0},
- {"label":"4", "x":4, "y":0.1},
- {"label":"5", "x":5, "y":0.3},
-
- {"label":"6", "x":12.5, "y":0.3},
- {"label":"7", "x":13.5, "y":0.1},
- {"label":"8", "x":14.5, "y":0},
- {"label":"9", "x":15.5, "y":0.1, "h":1.1},
- {"label":"0", "x":16.5, "y":0.2, "h":1.5},
- {"label":"NUM", "x":17.5, "y":0.4, "h":1.3},
-
- {"label":"GRAVE", "x":0, "y":1.7},
- {"label":"Q", "x":1, "y":1.7},
- {"label":"W", "x":2, "y":1.2},
- {"label":"E", "x":3, "y":1},
- {"label":"R", "x":4, "y":1.1},
- {"label":"T", "x":5, "y":1.3},
- {"label":"LED", "x":6, "y":0.6, "h":1.5},
-
- {"label":"ANY", "x":11.5, "y":0.6, "h":1.5},
- {"label":"Y", "x":12.5, "y":1.3},
- {"label":"U", "x":13.5, "y":1.1},
- {"label":"I", "x":14.5, "y":1},
- {"label":"O", "x":15.5, "y":1.2},
- {"label":"P", "x":16.5, "y":1.7},
- {"label":"EQUAL", "x":17.5, "y":1.7},
-
- {"label":"PAGEUP", "x":0, "y":2.7},
- {"label":"A", "x":1, "y":2.7},
- {"label":"S", "x":2, "y":2.2},
- {"label":"D", "x":3, "y":2},
- {"label":"F", "x":4, "y":2.1},
- {"label":"G", "x":5, "y":2.3},
- {"label":"TAB", "x":6, "y":2.1, "h":1.3},
-
- {"label":"ENTER", "x":11.5, "y":2.1, "h":1.3},
- {"label":"H", "x":12.5, "y":2.3},
- {"label":"J", "x":13.5, "y":2.1},
- {"label":"K", "x":14.5, "y":2},
- {"label":"L", "x":15.5, "y":2.2},
- {"label":"SEMICOLON", "x":16.5, "y":2.7},
- {"label":"QUOTE", "x":17.5, "y":2.7},
-
- {"label":"PAGEDOWN", "x":0, "y":3.7, "h":1.2},
- {"label":"Z", "x":1, "y":3.7},
- {"label":"X", "x":2, "y":3.2, "h":1.15},
- {"label":"C", "x":3, "y":3},
- {"label":"V", "x":4, "y":3.1},
- {"label":"B", "x":5, "y":3.3},
- {"label":"ESC", "x":6, "y":3.4, "h":1.1},
-
- {"label":"BUTTERFLY", "x":11.5, "y":3.4, "h":1.1},
- {"label":"N", "x":12.5, "y":3.3},
- {"label":"M", "x":13.5, "y":3.1},
- {"label":"COMMA", "x":14.5, "y":3},
- {"label":"DOT", "x":15.5, "y":3.2, "h":1.15},
- {"label":"SLASH", "x":16.5, "y":3.7},
- {"label":"MINS", "x":17.5, "y":3.7, "h":1.2},
-
- {"label":"LCTL", "x":4.75, "y":4.3},
- {"label":"RCTL", "x":12.75, "y":4.3},
- {"label":"BACKSPACE", "x":5.75, "y":4.5},
- {"label":"SPACE", "x":11.75, "y":4.5},
- {"label":"LGUI", "x":6.75, "y":4.7},
- {"label":"RALT", "x":10.75, "y":4.7},
- {"label":"LSHIFT", "x":7.75, "y":5.1},
- {"label":"RSHIFT", "x":9.75, "y":5.1},
-
- {"label":"FN", "x":6.25, "y":6.1, "h":1.4},
- {"label":"FN", "x":11.25, "y":6.1, "h":1.4}
- ]
- }
- }
-}
diff --git a/keyboards/model01/readme.md b/keyboards/model01/readme.md
deleted file mode 100644
index 34bd291e2e..0000000000
--- a/keyboards/model01/readme.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# Keyboardio Model 01
-
-A split keyboard.
-
-Keyboard Maintainer: QMK Community
-Hardware Supported: Keyboardio Model 01
-Hardware Availability: [Keyboardio](https://shop.keyboard.io)
-
-Make example for this keyboard (after setting up your build environment):
-
- make model01: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).
-
-## Programming the Keyboard
-
-To program the keyboard, if you have avrdude installed:
-
- make model01:default:avrdude
-
-When prompted to reset your keyboard, press the prog key at upper left. If the
-keyboard does not reset, you can hold the prog key while plugging it into your
-computer. The prog key will light up red in programming mode.
-
-## Features
-
-This implements the standard keymap, including mousekeys.
-
-It doesn't do cursor warping - QMK does not support absolute mouse positioning.
-
-LED support is limited. Gamma compensation and the high speed batch update
-functions supported by the hardware are not implemented. The high current power
-switch is also not implemented, so if you try and turn all the LEDs on at full
-brightness, something may conk out.
-
-Hotplugging the two halves works but is not extensively tested.
diff --git a/keyboards/montsinger/rebound/readme.md b/keyboards/montsinger/rebound/readme.md
index 024b4a96b7..1beafaf1b1 100755
--- a/keyboards/montsinger/rebound/readme.md
+++ b/keyboards/montsinger/rebound/readme.md
@@ -1,16 +1,17 @@
# Rebound
-![Rebound](https://imgur.com/zMPhNmm.jpg)
+![Rebound](https://i.imgur.com/IoV64hC.jpg)
-A conjoined-split 40% 4x12 ortholinear keyboard made and sold by Montsinger. [More info on Montsinger.net](https://montsinger.net).
+A conjoined-split 40% ortholinear keyboard made and sold by Montsinger. [More info on Montsinger.net](https://montsinger.net).
* Keyboard Maintainer: [Rossman360](https://github.com/rossman360)
-* Hardware Supported: Rebound rev1 or rev2; Pro Micro or Elite-C
+* Hardware Supported: Rebound rev1 rev2 or rev3; 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/rev1:default # for rev1
make montsinger/rebound/rev2:default # for rev2
+ make montsinger/rebound/rev3:default # for rev3
-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
+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/montsinger/rebound/rebound.h b/keyboards/montsinger/rebound/rebound.h
index c9fc262778..848316a366 100644
--- a/keyboards/montsinger/rebound/rebound.h
+++ b/keyboards/montsinger/rebound/rebound.h
@@ -22,4 +22,6 @@
#include "rev1.h"
#elif defined(KEYBOARD_montsinger_rebound_rev2)
#include "rev2.h"
+#elif defined(KEYBOARD_montsinger_rebound_rev3)
+ #include "rev3.h"
#endif
diff --git a/keyboards/montsinger/rebound/rev2/keymaps/rossman360/keymap.c b/keyboards/montsinger/rebound/rev2/keymaps/rossman360/keymap.c
index 23bd7e4ec9..10681eba6b 100644
--- a/keyboards/montsinger/rebound/rev2/keymaps/rossman360/keymap.c
+++ b/keyboards/montsinger/rebound/rev2/keymaps/rossman360/keymap.c
@@ -49,9 +49,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[_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_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_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/rev3/config.h b/keyboards/montsinger/rebound/rev3/config.h
new file mode 100644
index 0000000000..6c85fab88b
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev3/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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 { F4, F5, D1, D0, B0 }
+#define MATRIX_COL_PINS { D4, C6, D7, E6, B4, B5, B6, B2, B3, B1, F7, F6 }
+#define UNUSED_PINS { }
+
+#define ENCODERS_PAD_A { D3 }
+#define ENCODERS_PAD_B { D2 }
+
+/* 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/rev3/info.json b/keyboards/montsinger/rebound/rev3/info.json
new file mode 100644
index 0000000000..bf4a540b71
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev3/info.json
@@ -0,0 +1,128 @@
+{
+ "keyboard":"montsinger/rebound/rev3",
+ "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":6, "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":6, "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}
+ ]
+ }
+ }
+}
diff --git a/keyboards/montsinger/rebound/rev3/keymaps/default/keymap.c b/keyboards/montsinger/rebound/rev3/keymaps/default/keymap.c
new file mode 100644
index 0000000000..be038b1f53
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev3/keymaps/default/keymap.c
@@ -0,0 +1,102 @@
+#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] = 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_PGUP, 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_PGDN, 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] = 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_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+),
+
+[_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_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+),
+
+[_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] = 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] = 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;
+}
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ if (clockwise) {
+ tap_code16(S(KC_VOLD));
+ } else {
+ tap_code16(KC_VOLU);
+ }
+}
diff --git a/keyboards/montsinger/rebound/rev3/keymaps/rossman360/keymap.c b/keyboards/montsinger/rebound/rev3/keymaps/rossman360/keymap.c
new file mode 100644
index 0000000000..ee15a60623
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev3/keymaps/rossman360/keymap.c
@@ -0,0 +1,112 @@
+#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 ,MO(_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 , LM(_FN1, MOD_LALT), KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_MINS,
+ CMDBSP , ALTDEL , KC_NO , CTRLSP , KC_TAB , PGMOD , QUIT , 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, _______, _______, EMDASH ,
+ WREFRESH,_______, _______, _______, LWORD , RWORD , _______, KC_NO , _______, KC_NO , _______, _______, _______
+ ),
+
+[_FN2] = LAYOUT_all(
+ _______, SPEAK1 , SPEAK2 , SPEAK3 , SPEAK4 , _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, PARADOWN, CSPEAK, _______, _______, KC_NO , KC_NO , _______, _______, _______
+ ),
+
+[_DEL] = LAYOUT_all(
+ RESET, _______, _______, _______, _______, _______, _______, UNDO , _______, _______, _______, CTAB ,
+ REMCAPS, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_UP ,KC_RIGHT, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______, _______, _______,
+ _______, _______, _______, KC_DEL , KC_BSPC, BWORD , _______, KC_NO , KC_NO , _______, _______, _______, _______
+ ),
+
+[_NUM] = LAYOUT_all(
+ KC_GRV , 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_NO , KC_NO , KC_0 , _______, _______, _______
+ )
+};
+
+void encoder_update_user(uint8_t index, bool clockwise) {
+ switch(get_highest_layer(layer_state)){
+case _BASE:
+ if (clockwise) {
+ tap_code16(KC_VOLD);
+ } else {
+ tap_code16(KC_VOLU);
+ }
+ break;
+ case _FN1:
+ if (clockwise) {
+ tap_code16(S(KC_TAB));
+ } else {
+ tap_code16(KC_TAB);
+ }
+ break;
+}
+}
+
+#ifdef OLED_DRIVER_ENABLE
+void oled_task_user(void) {
+ // Host Keyboard Layer Status
+ oled_write_P(PSTR(""), false);
+
+ switch (get_highest_layer(layer_state)) {
+ case _BASE:
+ oled_write_P(PSTR("Rebound\n"), false);
+ oled_write_P(PSTR("Rev3.1\n"), false);
+ break;
+ case _FN1:
+ oled_write_P(PSTR("Fn\n"), false);
+ break;
+ case _FN2:
+ oled_write_P(PSTR("Para\n"), false);
+ break;
+ case _NUM:
+ oled_write_P(PSTR("Num\n"), false);
+ break;
+ case _DEL:
+ oled_write_P(PSTR("Del\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);
+}
+
+ // Host Keyboard LED Status
+ led_t led_state = host_keyboard_led_state();
+ 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("SCR ") : PSTR(" "), false);
+
+}
+
+#endif
+
diff --git a/keyboards/montsinger/rebound/rev3/keymaps/rossman360/rules.mk b/keyboards/montsinger/rebound/rev3/keymaps/rossman360/rules.mk
new file mode 100644
index 0000000000..ca475d2e17
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev3/keymaps/rossman360/rules.mk
@@ -0,0 +1,4 @@
+MOUSEKEY_ENABLE = no # Mouse keys
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+OLED_DRIVER_ENABLE = no
diff --git a/keyboards/montsinger/rebound/rev3/rev3.h b/keyboards/montsinger/rebound/rev3/rev3.h
new file mode 100644
index 0000000000..b709a4cea0
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev3/rev3.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 <http://www.gnu.org/licenses/>.
+ */
+
+#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, K42, K16, K17, K18, K19, K1A, K1B, \
+ K20, K21, K22, K23, K24, K25, K43, K26, K27, K28, K29, K2A, K2B,\
+ K30, K31, K32, K33, K34, K35, K44, 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, K42, K43, K44, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \
+}
diff --git a/keyboards/montsinger/rebound/rev3/rules.mk b/keyboards/montsinger/rebound/rev3/rules.mk
new file mode 100644
index 0000000000..61e36fc449
--- /dev/null
+++ b/keyboards/montsinger/rebound/rev3/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
+
+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
+
diff --git a/keyboards/mt40/rules.mk b/keyboards/mt40/rules.mk
index fa22bf61bd..c81f35f656 100644
--- a/keyboards/mt40/rules.mk
+++ b/keyboards/mt40/rules.mk
@@ -27,7 +27,5 @@ RGBLIGHT_ENABLE ?= yes # Enable WS2812 RGB underlight.
WS2812_DRIVER = i2c
TAP_DANCE_ENABLE = no
-OPT_DEFS = -DDEBUG_LEVEL=0
-
LAYOUTS = planck_mit
LAYOUTS_HAS_RGB = no
diff --git a/keyboards/murcielago/info.json b/keyboards/murcielago/info.json
new file mode 100644
index 0000000000..00eb326296
--- /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 0000000000..30215c69cd
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..458df972f7
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..d7e99ee94d
--- /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 0000000000..425c79e6c9
--- /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 <http://www.gnu.org/licenses/>.
+*/
+#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 0000000000..b3abed7631
--- /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 0000000000..b3abed7631
--- /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 0000000000..036bd6d1c3
--- /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 0000000000..f8faea6c3b
--- /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 0000000000..661563697a
--- /dev/null
+++ b/keyboards/murcielago/rules.mk
@@ -0,0 +1 @@
+DEFAULT_FOLDER = murcielago/rev1 \ No newline at end of file
diff --git a/keyboards/navi10/rev3/rules.mk b/keyboards/navi10/rev3/rules.mk
index b98e7eb2d6..d5a072f161 100644
--- a/keyboards/navi10/rev3/rules.mk
+++ b/keyboards/navi10/rev3/rules.mk
@@ -28,6 +28,6 @@ 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 = yes # 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/keyboards/nightmare/readme.md b/keyboards/nightmare/readme.md
index 9e53ac5a92..0f9fcace8b 100644
--- a/keyboards/nightmare/readme.md
+++ b/keyboards/nightmare/readme.md
@@ -6,7 +6,7 @@ A 50% pseudo-TMO50 clone with an adjusted bottom row, designed on the cheap with
Keyboard Maintainer: [cfbender](https://github.com/cfbender)
Hardware Supported: Nightmare case and PCB
-Hardware Availability: [Github](https://github.com/cfbender/keyboards/tree/master/nightmare)
+Hardware Availability: [GitHub](https://github.com/cfbender/keyboards/tree/master/nightmare)
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/niu_mini/keymaps/yttyx/README.md b/keyboards/niu_mini/keymaps/yttyx/README.md
index a48bdcca35..ff3937c232 100644
--- a/keyboards/niu_mini/keymaps/yttyx/README.md
+++ b/keyboards/niu_mini/keymaps/yttyx/README.md
@@ -1,7 +1,7 @@
# Overview
-This layout is based on Balance Twelve (mirror variant) by Sasha Viminitz. Please see [this page](https://mathematicalmulticore.wordpress.com/the-keyboard-layout-project/)
-for more information. It's designed for left-handers who use their right hand for the mouse.
+This layout uses a mirror variant of Balance 12, created by Sasha Viminitz. See [this page](https://mathematicalmulticore.wordpress.com/the-keyboard-layout-project/)
+for more information.
## To build
@@ -19,74 +19,14 @@ sudo dfu-programmer atmega32u4 launch
## Layers
-### Base:
+### Balance 12 base (BA) layer
+![Base layer](https://i.imgur.com/I0TkIHT.png)
- .--------.-------.-------.-------.--------. .-------.-------.-------.-------.------.
- | P | L | C | D | W | | U | O | Y | K | Q |
- |--------+-------+-------+-------+--------| |-------+-------+-------+-------+------|
- | N | R | S | T | M | | A | E | I | H | V |
- |--------+-------+-------+-------+--------| |-------+-------+-------+-------+------|
- | Z Sft | J Ctl | F Alt | G | B | | , | . Alt | ; Ctl | X Sft | Sup |
- '--------'-------'-------+-------+--------+-----. .-----+-------+-------+-------'-------'------'
- | BS P1 | Spc P2 | P3 | | | Sft | |
- '-------'--------'-----' '-----'-------'-------'
+### Numeric/Punctuation (NP) layer
+![Numeric/Punctuation layer](https://i.imgur.com/GgZ0PCq.png)
-### P1: Punctuation (1)
+### Function/Cursor (FC) layer
+![Function/Cursor layer](https://i.imgur.com/zcVID2d.png)
- .--------.-------.-------.-------.-------. .------.-------.-------.-------.------.
- | Esc | | | | | | | | / | ^ | £ | ~ |
- |--------+-------+-------+-------+-------| |------+-------+-------+-------+------|
- | Tab | | | | | | & | \ | ` | $ | Ent |
- |--------+-------+-------+-------+-------| |------+-------+-------+-------+------|
- | Sft | Ctl | Alt | Del | | | % | Alt | Ctl | Sft | Sup |
- '--------'-------'-------+-------+-------+-----. .-----+------+-------+-------'-------'------'
- | P1 | | | | | Sft | |
- '-------'-------'-----' '-----'------'-------'
-
-### P2: Punctuation (2)
-
- .-------.-------.-------.-------.-------. .-------.-------.-------.-------.------.
- | Esc | | NC | FV | | | ( | ) | " | ? | |
- |-------+-------+-------+-------+-------| |-------+-------+-------+-------+------|
- | Tab | Ctl-X | Ctl-C | Ctl-V | Ctl-Z | | { | } | ' | ! | Ent |
- |-------+-------+-------+-------+-------| |-------+-------+-------+-------+------|
- | Sft | Ctl | Alt | Del | Ent | | # | Alt | Ctl | Sft | Sup |
- '-------'-------'-------+-------+-------+-----. .-----+-------+-------+-------'-------'------'
- | BS | P2 | | | | Sft | |
- '-------'-------'-----' '-----'-------'-------'
-
-### P3: Punctuation (3)
-
- .-------.-------.-------.-------.-------. .------.-------.-------.-------.------.
- | Esc | | Break | Pscr | ScLk | | < | > | + | _ | = |
- |-------+-------+-------+-------+-------| |------+-------+-------+-------+------|
- | Tab | | | Caps | | | [ | ] | * | - | Ent |
- |-------+-------+-------+-------+-------| |------+-------+-------+-------+------|
- | Sft | Ctl | Alt | Del | | | @ | Alt | Ctl | Sft | Sup |
- '-------'-------'-------+-------+-------+-----. .-----+------+-------+-------'-------'------'
- | BS | | P3 | | | Sft | |
- '-------'-------'-----' '-----'------'-------'
-
-### Numerals / Cursor control
-
- .-------.-------.-------.------.-------. .------.-------.-------.------.------.
- | 1 | 2 | 3 | 4 | 5 | | Home | Up | End | PgUp | |
- |-------+-------+-------+------+-------| |------+-------+-------+------+------|
- | 6 | 7 | 8 | 9 | 0 | | Left | Down | Right | PgDn | |
- |-------+-------+-------+------+-------| |------+-------+-------+------+------|
- | Sft | Ctl | Alt | Del | . | | Ins | Alt | Ctl | Sft | Sup |
- '-------'-------'-------+------+-------+-----. .-----+------+-------+-------'------'------'
- | BS | BA | | | | Sft | |
- '------'-------'-----' '-----'------'-------'
-
-### FV: Function keys / Cursor control (Vim)
-
- .-------.------.-------.-----.-------. .------.-------.-----.-------.------.
- | F1 | F2 | F3 | F4 | F5 | | 0 | K | $ | Ctl-B | |
- |-------+------+-------+-----+-------| |------+-------+-----+-------+------|
- | F6 | F7 | F8 | F9 | F10 | | H | J | L | Ctl-F | |
- |-------+------+-------+-----+-------| |------+-------+-----+-------+------|
- | Sft | Ctl | Alt | F11 | F12 | | | Alt | Ctl | Sft | Sup |
- '-------'------'-------+-----+-------+-----. .-----+------+-------+-----'-------'------'
- | BS | BA | | | | Sft | |
- '-----'-------'-----' '-----'------'-------'
+### Plover (PL) layer
+![Plover layer](https://i.imgur.com/RikOGXe.png)
diff --git a/keyboards/niu_mini/keymaps/yttyx/keymap.c b/keyboards/niu_mini/keymaps/yttyx/keymap.c
index e299a53b48..79fda2be00 100644
--- a/keyboards/niu_mini/keymaps/yttyx/keymap.c
+++ b/keyboards/niu_mini/keymaps/yttyx/keymap.c
@@ -1,141 +1,95 @@
#include QMK_KEYBOARD_H
+#include "keymap_steno.h"
enum layers {
- BA, // Base (Balance Twelve mirror variant)
- P1, // Punctuation (1)
- P2, // Punctuation (2)
- P3, // Punctuation (2)
- NC, // Numerals / Cursor control
- FV // Function keys / Cursor control (Vim)
+ _BA, // Base (Balance Twelve mirror variant)
+ _NP, // Numeric/Punctuation
+ _FC, // Function
+ _PL // Plover
};
-// Abbreviations - base
-#define KX_P1_BSPC LT(P1, KC_BSPC)
-#define KX_P2_SPC LT(P2, KC_SPC)
-
-#define KX_SFT_Z MT(MOD_LSFT, KC_Z)
-#define KX_CTL_J MT(MOD_LCTL, KC_J)
-#define KX_ALT_F MT(MOD_LALT, KC_F)
-
-#define KX_ALT_DOT MT(MOD_LALT, KC_DOT)
-#define KX_CTL_SCLN MT(MOD_LCTL, KC_SCLN)
-#define KX_SFT_X MT(MOD_LSFT, KC_X)
-
-#define KX_AT LSFT(KC_QUOT)
-#define KX_DQUOT LSFT(KC_2)
-#define KX_PIPE LSFT(KC_NUBS)
-#define KX_TILDA LSFT(KC_NUHS)
-
+// Abbreviations
+#define KX_SFT_Z MT(MOD_LSFT, KC_Z)
+#define KX_SFT_X MT(MOD_LSFT, KC_X)
+#define LT_ESC_FC LT(_FC, KC_ESC)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- /*
- .--------.-------.-------.-------.--------. .-------.-------.-------.-------.------.
- | P | L | C | D | W | | U | O | Y | K | Q |
- |--------+-------+-------+-------+--------| |-------+-------+-------+-------+------|
- | N | R | S | T | M | | A | E | I | H | V |
- |--------+-------+-------+-------+--------| |-------+-------+-------+-------+------|
- | Z Sft | J Ctl | F Alt | G | B | | , | . Alt | ; Ctl | X Sft | Sup |
- '--------'-------'-------+-------+--------+-----. .-----+-------+-------+-------'-------'------'
- | BS P1 | Spc P2 | P3 | | | Sft | |
- '-------'--------'-----' '-----'-------'-------'
- */
- [BA] = LAYOUT(
- KC_P, KC_L, KC_C, KC_D, KC_W, XXXXXXX, XXXXXXX, KC_U, KC_O, KC_Y, KC_K, KC_Q,
- KC_N, KC_R, KC_S, KC_T, KC_M, XXXXXXX, XXXXXXX, KC_A, KC_E, KC_I, KC_H, KC_V,
- KX_SFT_Z, KX_CTL_J, KX_ALT_F, KC_G, KC_B, XXXXXXX, XXXXXXX, KC_COMM, KX_ALT_DOT, KX_CTL_SCLN, KX_SFT_X, KC_LGUI,
- XXXXXXX, XXXXXXX, XXXXXXX, KX_P1_BSPC, KX_P2_SPC, MO(P3), XXXXXXX, KC_RSFT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
- ),
- /* P1: Punctuation (1)
- .--------.-------.-------.-------.-------. .------.-------.-------.-------.------.
- | Esc | | | | | | | | / | ^ | £ | ~ |
- |--------+-------+-------+-------+-------| |------+-------+-------+-------+------|
- | Tab | | | | | | & | \ | ` | $ | Ent |
- |--------+-------+-------+-------+-------| |------+-------+-------+-------+------|
- | Sft | Ctl | Alt | Del | | | % | Alt | Ctl | Sft | Sup |
- '--------'-------'-------+-------+-------+-----. .-----+------+-------+-------'-------'------'
- | P1 | | | | | Sft | |
- '-------'-------'-----' '-----'------'-------'
+ /* Base
+ .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
+ | P | L | C | D | W | | | U | O | Y | K | Q |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | N | R | S | T | M | | BS | A | E | I | H | V |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | Z Sft | J | F | G | B | | Ent | ' @ | , < | . > | X Sft | |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | Ctl | Alt | Sup | NP | Spc | Esc FC | Sft | Sft | Sup | Alt | Ctl | |
+ '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
*/
- [P1] = LAYOUT(
- KC_ESC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KX_PIPE, KC_SLSH, KC_CIRC, KC_HASH, KX_TILDA,
- KC_TAB, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_AMPR, KC_NUBS, KC_GRV, KC_DLR, KC_ENT,
- KC_LSFT, KC_LCTL, KC_LALT, KC_DEL, XXXXXXX, XXXXXXX, XXXXXXX, KC_PERC, KC_LALT, KC_LCTL, KC_LSFT, _______,
- XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+ [_BA] = LAYOUT(
+ KC_P, KC_L, KC_C, KC_D, KC_W, XXXXXXX, XXXXXXX, KC_U, KC_O, KC_Y, KC_K, KC_Q,
+ KC_N, KC_R, KC_S, KC_T, KC_M, XXXXXXX, KC_BSPC, KC_A, KC_E, KC_I, KC_H, KC_V,
+ KX_SFT_Z, KC_J, KC_F, KC_G, KC_B, XXXXXXX, KC_ENT, KC_QUOT, KC_COMM, KC_DOT, KX_SFT_X, XXXXXXX,
+ KC_LCTL, KC_LALT, KC_LGUI, MO(_NP), KC_SPC, LT_ESC_FC, KC_LSFT, KC_LSFT, KC_LGUI, KC_LALT, KC_LCTL, XXXXXXX
),
- /* P2: Punctuation (2)
- .-------.-------.-------.-------.-------. .-------.-------.-------.-------.------.
- | Esc | | NC | FV | | | ( | ) | " | ? | |
- |-------+-------+-------+-------+-------| |-------+-------+-------+-------+------|
- | Tab | Ctl-X | Ctl-C | Ctl-V | Ctl-Z | | { | } | ' | ! | Ent |
- |-------+-------+-------+-------+-------| |-------+-------+-------+-------+------|
- | Sft | Ctl | Alt | Del | Ent | | # | Alt | Ctl | Sft | Sup |
- '-------'-------'-------+-------+-------+-----. .-----+-------+-------+-------'-------'------'
- | BS | P2 | | | | Sft | |
- '-------'-------'-----' '-----'-------'-------'
- */
- [P2] = LAYOUT(
- KC_ESC, XXXXXXX, TO(NC), TO(FV), XXXXXXX, XXXXXXX, XXXXXXX, KC_LPRN, KC_RPRN, KX_DQUOT, KC_QUES, XXXXXXX,
- KC_TAB, LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), LCTL(KC_Z), XXXXXXX, XXXXXXX, KC_LCBR, KC_RCBR, KC_QUOT, KC_EXLM, KC_ENT,
- KC_LSFT, KC_LCTL, KC_LALT, KC_DEL, KC_ENT, XXXXXXX, XXXXXXX, KC_NUHS, KC_LALT, KC_LCTL, KC_LSFT, _______,
- XXXXXXX, XXXXXXX, XXXXXXX, KC_BSPC, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
- ),
-
- /* P3: Punctuation (3)
- .-------.-------.-------.-------.-------. .------.-------.-------.-------.------.
- | Esc | | Break | Pscr | ScLk | | < | > | + | _ | = |
- |-------+-------+-------+-------+-------| |------+-------+-------+-------+------|
- | Tab | | | Caps | | | [ | ] | * | - | Ent |
- |-------+-------+-------+-------+-------| |------+-------+-------+-------+------|
- | Sft | Ctl | Alt | Del | | | @ | Alt | Ctl | Sft | Sup |
- '-------'-------'-------+-------+-------+-----. .-----+------+-------+-------'-------'------'
- | BS | | P3 | | | Sft | |
- '-------'-------'-----' '-----'------'-------'
- */
- [P3] = LAYOUT(
- KC_ESC, XXXXXXX, KC_BRK, KC_PSCR, KC_SLCK, XXXXXXX, XXXXXXX, KC_LABK, KC_RABK, KC_PLUS, KC_UNDS, KC_EQL,
- KC_TAB, XXXXXXX, XXXXXXX, KC_CAPS, XXXXXXX, XXXXXXX, XXXXXXX, KC_LBRC, KC_RBRC, KC_ASTR, KC_MINS, KC_ENT,
- KC_LSFT, KC_LCTL, KC_LALT, KC_DEL, XXXXXXX, XXXXXXX, XXXXXXX, KX_AT, KC_LALT, KC_LCTL, KC_LSFT, _______,
- XXXXXXX, XXXXXXX, XXXXXXX, KC_BSPC, XXXXXXX, _______, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+ /* Numeric/Punctuation (NP)
+ .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
+ | 1 ! | 2 " | 3 £ | 4 $ | 5 % | PL | | 6 ^ | 7 & | 8 * | 9 ( | 0 ) |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | Tab | Ctl-X | Ctl-C | Ctl-V | Ctl-Z | | | [ { | ] } | - _ | ; : | \ | |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | Sft | | | Del | Ins | | | / ? | = + | # ~ | ` | |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | Ctl | Alt | Sup | NP | Spc | | Sft | Sft | Sup | Alt | Ctl | |
+ '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
+ */
+ [_NP] = LAYOUT(
+ KC_1, KC_2, KC_3, KC_4, KC_5, TO(_PL), XXXXXXX, KC_6, KC_7, KC_8, KC_9, KC_0,
+ KC_TAB, C(KC_X), C(KC_C), C(KC_V), C(KC_Z), XXXXXXX, _______, KC_LBRC, KC_RBRC, KC_MINS, KC_SCLN, KC_NUBS,
+ KC_LSFT, XXXXXXX, XXXXXXX, KC_DEL, KC_INS, XXXXXXX, XXXXXXX, KC_SLSH, KC_EQL, KC_NUHS, KC_GRV, XXXXXXX,
+ _______, _______, _______, _______, _______, XXXXXXX, _______, _______, _______, _______, _______, XXXXXXX
),
- /* NC: Numerals / Cursor control
- .-------.-------.-------.------.-------. .------.-------.-------.------.------.
- | 1 | 2 | 3 | 4 | 5 | | Home | Up | End | PgUp | |
- |-------+-------+-------+------+-------| |------+-------+-------+------+------|
- | 6 | 7 | 8 | 9 | 0 | | Left | Down | Right | PgDn | |
- |-------+-------+-------+------+-------| |------+-------+-------+------+------|
- | Sft | Ctl | Alt | Del | . | | Ins | Alt | Ctl | Sft | Sup |
- '-------'-------'-------+------+-------+-----. .-----+------+-------+-------'------'------'
- | BS | BA | | | | Sft | |
- '------'-------'-----' '-----'------'-------'
+ /* Function/Cursor (FC)
+ .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
+ | F1 | F2 | F3 | F4 | F5 | | | Home | Up | End | PgUp | |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | F6 | F7 | F8 | F9 | F10 | | | Left | Down | Right | PgDn | |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | Sft | | | F11 | F12 | | | PScr | Break | ScLk | Caps | |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | Ctl | Alt | Sup | | Spc | | Sft | Sft | Sup | Alt | Ctl | |
+ '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
*/
- [NC] = LAYOUT(
- KC_1, KC_2, KC_3, KC_4, KC_5, XXXXXXX, XXXXXXX, KC_HOME, KC_UP, KC_END, KC_PGUP, XXXXXXX,
- KC_6, KC_7, KC_8, KC_9, KC_0, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, XXXXXXX,
- KC_LSFT, KC_LCTL, KC_LALT, KC_DEL, KC_DOT, XXXXXXX, XXXXXXX, KC_INS, KC_LALT, KC_LCTL, KC_LSFT, _______,
- XXXXXXX, XXXXXXX, XXXXXXX, KC_BSPC, TO(BA), XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+ [_FC] = LAYOUT(
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, XXXXXXX, KC_HOME, KC_UP, KC_END, KC_PGUP, XXXXXXX,
+ KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, XXXXXXX,
+ _______, XXXXXXX, XXXXXXX, KC_F11, KC_F12, XXXXXXX, XXXXXXX, KC_PSCR, KC_BRK, KC_SLCK, KC_CAPS, XXXXXXX,
+ _______, _______, _______, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, XXXXXXX
),
- /* FV: Function keys / Cursor control (Vim)
- .-------.------.-------.-----.-------. .------.-------.-----.-------.------.
- | F1 | F2 | F3 | F4 | F5 | | 0 | K | $ | Ctl-B | |
- |-------+------+-------+-----+-------| |------+-------+-----+-------+------|
- | F6 | F7 | F8 | F9 | F10 | | H | J | L | Ctl-F | |
- |-------+------+-------+-----+-------| |------+-------+-----+-------+------|
- | Sft | Ctl | Alt | F11 | F12 | | | Alt | Ctl | Sft | Sup |
- '-------'------'-------+-----+-------+-----. .-----+------+-------+-----'-------'------'
- | BS | BA | | | | Sft | |
- '-----'-------'-----' '-----'------'-------'
+ /* Plover (PL)
+ .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
+ | # | # | # | # | # | BA | # | # | # | # | # | # |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | S | T | P | H | * | | * | F | P | L | T | D |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | S | K | W | R | * | | * | R | B | G | S | Z |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | | | | A | O | | E | U | | | | |
+ '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
*/
- [FV] = LAYOUT(
- KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, XXXXXXX, KC_0, KC_K, KC_DLR, LCTL(KC_B), XXXXXXX,
- KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, KC_H, KC_J, KC_L, LCTL(KC_F), XXXXXXX,
- KC_LSFT, KC_LCTL, KC_LALT, KC_F11, KC_F12, XXXXXXX, XXXXXXX, XXXXXXX, KC_LALT, KC_LCTL, KC_LSFT, _______,
- XXXXXXX, XXXXXXX, XXXXXXX, KC_BSPC, TO(BA), XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+ [_PL] = LAYOUT(
+ STN_NUM, STN_NUM, STN_NUM, STN_NUM, STN_NUM, TO(_BA), STN_NUM, STN_NUM, STN_NUM, STN_NUM, STN_NUM, STN_NUM,
+ STN_S1, STN_TL, STN_PL, STN_HL, STN_ST1, XXXXXXX, STN_ST1, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR,
+ STN_S2, STN_KL, STN_WL, STN_RL, STN_ST2, XXXXXXX, STN_ST2, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR,
+ XXXXXXX, XXXXXXX, XXXXXXX, STN_A, STN_O, XXXXXXX, STN_E, STN_U, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
)
};
+void matrix_init_user() {
+ steno_set_mode(STENO_MODE_GEMINI);
+}
diff --git a/keyboards/niu_mini/keymaps/yttyx/rules.mk b/keyboards/niu_mini/keymaps/yttyx/rules.mk
index d8b21aa842..a2566a20b0 100644
--- a/keyboards/niu_mini/keymaps/yttyx/rules.mk
+++ b/keyboards/niu_mini/keymaps/yttyx/rules.mk
@@ -6,5 +6,5 @@ MIDI_ENABLE = no
MOUSEKEY_ENABLE = no
NKRO_ENABLE = yes
RGBLIGHT_ENABLE = no
-STENO_ENABLE = no
-VIRTSER_ENABLE = no
+STENO_ENABLE = yes
+VIRTSER_ENABLE = yes
diff --git a/keyboards/nk65/readme.md b/keyboards/nk65/readme.md
index 41f52615a7..5e7453a27d 100755
--- a/keyboards/nk65/readme.md
+++ b/keyboards/nk65/readme.md
@@ -5,7 +5,7 @@ NK65
This is a standard fixed layout 65% PCB. It supports VIA and full per-key RGB.
-Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [github](https://github.com/yiancar)
+Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
Hardware Supported: A 65% keyboard with STM32F303CC
Hardware Availability: https://novelkeys.xyz/
diff --git a/keyboards/nomu30/keymaps/center_sprit/keymap.c b/keyboards/nomu30/keymaps/center_sprit/keymap.c
index 8ef037f42b..cc540b891f 100644
--- a/keyboards/nomu30/keymaps/center_sprit/keymap.c
+++ b/keyboards/nomu30/keymaps/center_sprit/keymap.c
@@ -100,7 +100,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};
-uint16_t get_tapping_term(uint16_t keycode) {
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_BSLO:
return TAPPING_LAYER_TERM;
diff --git a/keyboards/nomu30/keymaps/like_jis/keymap.c b/keyboards/nomu30/keymaps/like_jis/keymap.c
index 203d0a7a41..fc2d26ad7a 100644
--- a/keyboards/nomu30/keymaps/like_jis/keymap.c
+++ b/keyboards/nomu30/keymaps/like_jis/keymap.c
@@ -100,7 +100,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};
-uint16_t get_tapping_term(uint16_t keycode) {
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_BSLO:
return TAPPING_LAYER_TERM;
diff --git a/keyboards/ok60/config.h b/keyboards/ok60/config.h
index cc056a489c..a8b6e47b5f 100644
--- a/keyboards/ok60/config.h
+++ b/keyboards/ok60/config.h
@@ -21,7 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
+#define VENDOR_ID 0x4B36 // K6 - ok60
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
#define MANUFACTURER OK60
diff --git a/keyboards/ok60/keymaps/via/keymap.c b/keyboards/ok60/keymaps/via/keymap.c
new file mode 100644
index 0000000000..d0f5939f4e
--- /dev/null
+++ b/keyboards/ok60/keymaps/via/keymap.c
@@ -0,0 +1,36 @@
+#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_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_LSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_APP, KC_RCTL
+ ),
+
+ [1] = LAYOUT_60_ansi(
+ 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,
+ _______, RGB_TOG, KC_UP, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, BL_DEC, BL_TOGG, BL_INC, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [2] = LAYOUT_60_ansi(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [3] = LAYOUT_60_ansi(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+};
diff --git a/keyboards/ok60/keymaps/via/rules.mk b/keyboards/ok60/keymaps/via/rules.mk
new file mode 100644
index 0000000000..36b7ba9cbc
--- /dev/null
+++ b/keyboards/ok60/keymaps/via/rules.mk
@@ -0,0 +1,2 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/omnikey_blackheart/config.h b/keyboards/omnikey_bh/config.h
index 6c9be77b6b..6c9be77b6b 100644
--- a/keyboards/omnikey_blackheart/config.h
+++ b/keyboards/omnikey_bh/config.h
diff --git a/keyboards/omnikey_bh/info.json b/keyboards/omnikey_bh/info.json
new file mode 100644
index 0000000000..50d64e143c
--- /dev/null
+++ b/keyboards/omnikey_bh/info.json
@@ -0,0 +1,13 @@
+{
+ "keyboard_name": "Omnikey BH PCB",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 25.5,
+ "height": 6.5,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 123,
+ "layout": [{"label":"K000", "x":0, "y":0}, {"label":"K001", "x":1, "y":0}, {"label":"K002", "x":2.5, "y":0}, {"label":"K003", "x":4.5, "y":0}, {"label":"K004", "x":5.5, "y":0}, {"label":"K005", "x":6.5, "y":0}, {"label":"K006", "x":7.5, "y":0}, {"label":"K007", "x":9, "y":0}, {"label":"K008", "x":10, "y":0}, {"label":"K009", "x":11, "y":0}, {"label":"K010", "x":12, "y":0}, {"label":"K011", "x":13.5, "y":0}, {"label":"K012", "x":14.5, "y":0}, {"label":"K013", "x":15.5, "y":0}, {"label":"K014", "x":16.5, "y":0}, {"label":"K015", "x":18, "y":0}, {"label":"K016", "x":19, "y":0}, {"label":"K017", "x":20, "y":0}, {"label":"K100", "x":0, "y":1.5}, {"label":"K101", "x":1, "y":1.5}, {"label":"K102", "x":2.5, "y":1.5}, {"label":"K103", "x":3.5, "y":1.5}, {"label":"K104", "x":4.5, "y":1.5}, {"label":"K105", "x":5.5, "y":1.5}, {"label":"K106", "x":6.5, "y":1.5}, {"label":"K107", "x":7.5, "y":1.5}, {"label":"K108", "x":8.5, "y":1.5}, {"label":"K109", "x":9.5, "y":1.5}, {"label":"K110", "x":10.5, "y":1.5}, {"label":"K111", "x":11.5, "y":1.5}, {"label":"K112", "x":12.5, "y":1.5}, {"label":"K113", "x":13.5, "y":1.5}, {"label":"K114", "x":14.5, "y":1.5}, {"label":"K115", "x":15.5, "y":1.5, "w":2}, {"label":"K116", "x":18, "y":1.5}, {"label":"K117", "x":19, "y":1.5}, {"label":"K118", "x":20, "y":1.5}, {"label":"K119", "x":21.5, "y":1.5}, {"label":"K120", "x":22.5, "y":1.5}, {"label":"K121", "x":23.5, "y":1.5}, {"label":"K122", "x":24.5, "y":1.5}, {"label":"K200", "x":0, "y":2.5}, {"label":"K201", "x":1, "y":2.5}, {"label":"K202", "x":2.5, "y":2.5, "w":1.5}, {"label":"K203", "x":4, "y":2.5}, {"label":"K204", "x":5, "y":2.5}, {"label":"K205", "x":6, "y":2.5}, {"label":"K206", "x":7, "y":2.5}, {"label":"K207", "x":8, "y":2.5}, {"label":"K208", "x":9, "y":2.5}, {"label":"K209", "x":10, "y":2.5}, {"label":"K210", "x":11, "y":2.5}, {"label":"K211", "x":12, "y":2.5}, {"label":"K212", "x":13, "y":2.5}, {"label":"K213", "x":14, "y":2.5}, {"label":"K214", "x":15, "y":2.5}, {"label":"K215", "x":16, "y":2.5, "w":1.5}, {"label":"K216", "x":18, "y":2.5}, {"label":"K217", "x":19, "y":2.5}, {"label":"K218", "x":20, "y":2.5}, {"label":"K219", "x":21.5, "y":2.5}, {"label":"K220", "x":22.5, "y":2.5}, {"label":"K221", "x":23.5, "y":2.5}, {"label":"K222", "x":24.5, "y":2.5}, {"label":"K300", "x":0, "y":3.5}, {"label":"K301", "x":1, "y":3.5}, {"label":"K302", "x":2.5, "y":3.5, "w":1.75}, {"label":"K303", "x":4.25, "y":3.5}, {"label":"K304", "x":5.25, "y":3.5}, {"label":"K305", "x":6.25, "y":3.5}, {"label":"K306", "x":7.25, "y":3.5}, {"label":"K307", "x":8.25, "y":3.5}, {"label":"K308", "x":9.25, "y":3.5}, {"label":"K309", "x":10.25, "y":3.5}, {"label":"K310", "x":11.25, "y":3.5}, {"label":"K311", "x":12.25, "y":3.5}, {"label":"K312", "x":13.25, "y":3.5}, {"label":"K313", "x":14.25, "y":3.5}, {"label":"K314", "x":15.25, "y":3.5, "w":2.25}, {"label":"K315", "x":18, "y":3.5}, {"label":"K316", "x":19, "y":3.5}, {"label":"K317", "x":20, "y":3.5}, {"label":"K318", "x":21.5, "y":3.5}, {"label":"K319", "x":22.5, "y":3.5}, {"label":"K320", "x":23.5, "y":3.5}, {"label":"K321", "x":24.5, "y":3.5}, {"label":"K400", "x":0, "y":4.5}, {"label":"K401", "x":1, "y":4.5}, {"label":"K402", "x":2.5, "y":4.5, "w":2.25}, {"label":"K403", "x":4.75, "y":4.5}, {"label":"K404", "x":5.75, "y":4.5}, {"label":"K405", "x":6.75, "y":4.5}, {"label":"K406", "x":7.75, "y":4.5}, {"label":"K407", "x":8.75, "y":4.5}, {"label":"K408", "x":9.75, "y":4.5}, {"label":"K409", "x":10.75, "y":4.5}, {"label":"K410", "x":11.75, "y":4.5}, {"label":"K411", "x":12.75, "y":4.5}, {"label":"K412", "x":13.75, "y":4.5}, {"label":"K413", "x":14.75, "y":4.5, "w":1.75}, {"label":"K414", "x":16.5, "y":4.5}, {"label":"K415", "x":18, "y":4.5}, {"label":"K416", "x":19, "y":4.5}, {"label":"K417", "x":20, "y":4.5}, {"label":"K418", "x":21.5, "y":4.5}, {"label":"K419", "x":22.5, "y":4.5}, {"label":"K420", "x":23.5, "y":4.5}, {"label":"K421", "x":24.5, "y":4.5, "h":2}, {"label":"K500", "x":0, "y":5.5}, {"label":"K501", "x":1, "y":5.5}, {"label":"K502", "x":2.5, "y":5.5, "w":1.5}, {"label":"K503", "x":4, "y":5.5}, {"label":"K504", "x":5, "y":5.5, "w":1.5}, {"label":"K507", "x":6.5, "y":5.5, "w":7}, {"label":"K512", "x":13.5, "y":5.5}, {"label":"K513", "x":14.5, "y":5.5}, {"label":"K514", "x":15.5, "y":5.5}, {"label":"K515", "x":16.5, "y":5.5}, {"label":"K516", "x":18, "y":5.5}, {"label":"K517", "x":19, "y":5.5}, {"label":"K518", "x":20, "y":5.5}, {"label":"K519", "x":21.5, "y":5.5, "w":2}, {"label":"K520", "x":23.5, "y":5.5}]
+ }
+ }
+}
diff --git a/keyboards/omnikey_blackheart/keymaps/default/keymap.c b/keyboards/omnikey_bh/keymaps/default/keymap.c
index e4865adde3..e4865adde3 100644
--- a/keyboards/omnikey_blackheart/keymaps/default/keymap.c
+++ b/keyboards/omnikey_bh/keymaps/default/keymap.c
diff --git a/keyboards/omnikey_bh/omnikey_bh.c b/keyboards/omnikey_bh/omnikey_bh.c
new file mode 100644
index 0000000000..c2f52f30c3
--- /dev/null
+++ b/keyboards/omnikey_bh/omnikey_bh.c
@@ -0,0 +1 @@
+#include "omnikey_bh.h"
diff --git a/keyboards/omnikey_bh/omnikey_bh.h b/keyboards/omnikey_bh/omnikey_bh.h
new file mode 100644
index 0000000000..f36184f390
--- /dev/null
+++ b/keyboards/omnikey_bh/omnikey_bh.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, K016, K017, \
+ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119, K120, K121, K122, \
+ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219, K220, K221, K222, \
+ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, K318, K319, K320, K321, \
+ K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, K417, K418, K419, K420, K421, \
+ K500, K501, K502, K503, K504, K507, K512, K513, K514, K515, K516, K517, K518, K519, K520 \
+) { \
+ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, K016, K017, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119, K120, K121, K122 }, \
+ { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219, K220, K221, K222 }, \
+ { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, K318, K319, K320, K321, KC_NO }, \
+ { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, K417, K418, K419, K420, K421, KC_NO }, \
+ { K500, K501, K502, K503, K504, KC_NO, KC_NO, K507, KC_NO, KC_NO, KC_NO, KC_NO, K512, K513, K514, K515, K516, K517, K518, K519, K520, KC_NO, KC_NO } \
+}
diff --git a/keyboards/omnikey_bh/readme.md b/keyboards/omnikey_bh/readme.md
new file mode 100644
index 0000000000..7de22f29a4
--- /dev/null
+++ b/keyboards/omnikey_bh/readme.md
@@ -0,0 +1,14 @@
+Omnikey BH PCB
+===
+
+A replacement PCB for Omnikey keyboards. Supports 101, 102, Plus, Ultra T, Ultra, Prime and Stellar, as well as customs.
+
+Keyboard Maintainer: QMK Community and blindassassin111
+Hardware Supported: Omnikey BH PCB
+Hardware Availability: https://deskthority.net/group-buys-f50/omnikey-replacement-pcb-t18276.html
+
+Make example for this keyboard (after setting up your build environment):
+
+ make omnikey_bh:default
+
+See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
diff --git a/keyboards/omnikey_blackheart/rules.mk b/keyboards/omnikey_bh/rules.mk
index 59f163e2f4..59f163e2f4 100644
--- a/keyboards/omnikey_blackheart/rules.mk
+++ b/keyboards/omnikey_bh/rules.mk
diff --git a/keyboards/omnikey_blackheart/info.json b/keyboards/omnikey_blackheart/info.json
deleted file mode 100644
index 138c954b77..0000000000
--- a/keyboards/omnikey_blackheart/info.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "keyboard_name": "Omnikey Blackheart PCB",
- "url": "",
- "maintainer": "qmk",
- "width": 25.5,
- "height": 6.5,
- "layouts": {
- "LAYOUT": {
- "key_count": 123,
- "layout": [{"label":"K000", "x":0, "y":0}, {"label":"K001", "x":1, "y":0}, {"label":"K002", "x":2.5, "y":0}, {"label":"K003", "x":4.5, "y":0}, {"label":"K004", "x":5.5, "y":0}, {"label":"K005", "x":6.5, "y":0}, {"label":"K006", "x":7.5, "y":0}, {"label":"K007", "x":9, "y":0}, {"label":"K008", "x":10, "y":0}, {"label":"K009", "x":11, "y":0}, {"label":"K010", "x":12, "y":0}, {"label":"K011", "x":13.5, "y":0}, {"label":"K012", "x":14.5, "y":0}, {"label":"K013", "x":15.5, "y":0}, {"label":"K014", "x":16.5, "y":0}, {"label":"K015", "x":18, "y":0}, {"label":"K016", "x":19, "y":0}, {"label":"K017", "x":20, "y":0}, {"label":"K100", "x":0, "y":1.5}, {"label":"K101", "x":1, "y":1.5}, {"label":"K102", "x":2.5, "y":1.5}, {"label":"K103", "x":3.5, "y":1.5}, {"label":"K104", "x":4.5, "y":1.5}, {"label":"K105", "x":5.5, "y":1.5}, {"label":"K106", "x":6.5, "y":1.5}, {"label":"K107", "x":7.5, "y":1.5}, {"label":"K108", "x":8.5, "y":1.5}, {"label":"K109", "x":9.5, "y":1.5}, {"label":"K110", "x":10.5, "y":1.5}, {"label":"K111", "x":11.5, "y":1.5}, {"label":"K112", "x":12.5, "y":1.5}, {"label":"K113", "x":13.5, "y":1.5}, {"label":"K114", "x":14.5, "y":1.5}, {"label":"K115", "x":15.5, "y":1.5, "w":2}, {"label":"K116", "x":18, "y":1.5}, {"label":"K117", "x":19, "y":1.5}, {"label":"K118", "x":20, "y":1.5}, {"label":"K119", "x":21.5, "y":1.5}, {"label":"K120", "x":22.5, "y":1.5}, {"label":"K121", "x":23.5, "y":1.5}, {"label":"K122", "x":24.5, "y":1.5}, {"label":"K200", "x":0, "y":2.5}, {"label":"K201", "x":1, "y":2.5}, {"label":"K202", "x":2.5, "y":2.5, "w":1.5}, {"label":"K203", "x":4, "y":2.5}, {"label":"K204", "x":5, "y":2.5}, {"label":"K205", "x":6, "y":2.5}, {"label":"K206", "x":7, "y":2.5}, {"label":"K207", "x":8, "y":2.5}, {"label":"K208", "x":9, "y":2.5}, {"label":"K209", "x":10, "y":2.5}, {"label":"K210", "x":11, "y":2.5}, {"label":"K211", "x":12, "y":2.5}, {"label":"K212", "x":13, "y":2.5}, {"label":"K213", "x":14, "y":2.5}, {"label":"K214", "x":15, "y":2.5}, {"label":"K215", "x":16, "y":2.5, "w":1.5}, {"label":"K216", "x":18, "y":2.5}, {"label":"K217", "x":19, "y":2.5}, {"label":"K218", "x":20, "y":2.5}, {"label":"K219", "x":21.5, "y":2.5}, {"label":"K220", "x":22.5, "y":2.5}, {"label":"K221", "x":23.5, "y":2.5}, {"label":"K222", "x":24.5, "y":2.5}, {"label":"K300", "x":0, "y":3.5}, {"label":"K301", "x":1, "y":3.5}, {"label":"K302", "x":2.5, "y":3.5, "w":1.75}, {"label":"K303", "x":4.25, "y":3.5}, {"label":"K304", "x":5.25, "y":3.5}, {"label":"K305", "x":6.25, "y":3.5}, {"label":"K306", "x":7.25, "y":3.5}, {"label":"K307", "x":8.25, "y":3.5}, {"label":"K308", "x":9.25, "y":3.5}, {"label":"K309", "x":10.25, "y":3.5}, {"label":"K310", "x":11.25, "y":3.5}, {"label":"K311", "x":12.25, "y":3.5}, {"label":"K312", "x":13.25, "y":3.5}, {"label":"K313", "x":14.25, "y":3.5}, {"label":"K314", "x":15.25, "y":3.5, "w":2.25}, {"label":"K315", "x":18, "y":3.5}, {"label":"K316", "x":19, "y":3.5}, {"label":"K317", "x":20, "y":3.5}, {"label":"K318", "x":21.5, "y":3.5}, {"label":"K319", "x":22.5, "y":3.5}, {"label":"K320", "x":23.5, "y":3.5}, {"label":"K321", "x":24.5, "y":3.5}, {"label":"K400", "x":0, "y":4.5}, {"label":"K401", "x":1, "y":4.5}, {"label":"K402", "x":2.5, "y":4.5, "w":2.25}, {"label":"K403", "x":4.75, "y":4.5}, {"label":"K404", "x":5.75, "y":4.5}, {"label":"K405", "x":6.75, "y":4.5}, {"label":"K406", "x":7.75, "y":4.5}, {"label":"K407", "x":8.75, "y":4.5}, {"label":"K408", "x":9.75, "y":4.5}, {"label":"K409", "x":10.75, "y":4.5}, {"label":"K410", "x":11.75, "y":4.5}, {"label":"K411", "x":12.75, "y":4.5}, {"label":"K412", "x":13.75, "y":4.5}, {"label":"K413", "x":14.75, "y":4.5, "w":1.75}, {"label":"K414", "x":16.5, "y":4.5}, {"label":"K415", "x":18, "y":4.5}, {"label":"K416", "x":19, "y":4.5}, {"label":"K417", "x":20, "y":4.5}, {"label":"K418", "x":21.5, "y":4.5}, {"label":"K419", "x":22.5, "y":4.5}, {"label":"K420", "x":23.5, "y":4.5}, {"label":"K421", "x":24.5, "y":4.5, "h":2}, {"label":"K500", "x":0, "y":5.5}, {"label":"K501", "x":1, "y":5.5}, {"label":"K502", "x":2.5, "y":5.5, "w":1.5}, {"label":"K503", "x":4, "y":5.5}, {"label":"K504", "x":5, "y":5.5, "w":1.5}, {"label":"K507", "x":6.5, "y":5.5, "w":7}, {"label":"K512", "x":13.5, "y":5.5}, {"label":"K513", "x":14.5, "y":5.5}, {"label":"K514", "x":15.5, "y":5.5}, {"label":"K515", "x":16.5, "y":5.5}, {"label":"K516", "x":18, "y":5.5}, {"label":"K517", "x":19, "y":5.5}, {"label":"K518", "x":20, "y":5.5}, {"label":"K519", "x":21.5, "y":5.5, "w":2}, {"label":"K520", "x":23.5, "y":5.5}]
- }
- }
-}
diff --git a/keyboards/omnikey_blackheart/omnikey_blackheart.c b/keyboards/omnikey_blackheart/omnikey_blackheart.c
deleted file mode 100644
index e54047fa68..0000000000
--- a/keyboards/omnikey_blackheart/omnikey_blackheart.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "omnikey_blackheart.h"
diff --git a/keyboards/omnikey_blackheart/omnikey_blackheart.h b/keyboards/omnikey_blackheart/omnikey_blackheart.h
deleted file mode 100644
index 5d2d948c49..0000000000
--- a/keyboards/omnikey_blackheart/omnikey_blackheart.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef omnikey_blackheart
-#define omnikey_blackheart
-
-#include "quantum.h"
-
-#define LAYOUT( \
- K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, K016, K017, \
- K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119, K120, K121, K122, \
- K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219, K220, K221, K222, \
- K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, K318, K319, K320, K321, \
- K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, K417, K418, K419, K420, K421, \
- K500, K501, K502, K503, K504, K507, K512, K513, K514, K515, K516, K517, K518, K519, K520 \
-) { \
- { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, K016, K017, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
- { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, K113, K114, K115, K116, K117, K118, K119, K120, K121, K122 }, \
- { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K213, K214, K215, K216, K217, K218, K219, K220, K221, K222 }, \
- { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, K318, K319, K320, K321, KC_NO }, \
- { K400, K401, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K414, K415, K416, K417, K418, K419, K420, K421, KC_NO }, \
- { K500, K501, K502, K503, K504, KC_NO, KC_NO, K507, KC_NO, KC_NO, KC_NO, KC_NO, K512, K513, K514, K515, K516, K517, K518, K519, K520, KC_NO, KC_NO } \
-}
-
-#endif \ No newline at end of file
diff --git a/keyboards/omnikey_blackheart/readme.md b/keyboards/omnikey_blackheart/readme.md
deleted file mode 100644
index 04bb49818c..0000000000
--- a/keyboards/omnikey_blackheart/readme.md
+++ /dev/null
@@ -1,14 +0,0 @@
-Omnikey Blackheart PCB
-===
-
-A replacement PCB for Omnikey keyboards. Supports 101, 102, Plus, Ultra T, Ultra, Prime and Stellar, as well as customs.
-
-Keyboard Maintainer: QMK Community and blindassassin111
-Hardware Supported: Omnikey blackheart PCB
-Hardware Availability: https://deskthority.net/group-buys-f50/omnikey-replacement-pcb-t18276.html
-
-Make example for this keyboard (after setting up your build environment):
-
- make omnikey_blackheart:default
-
-See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
diff --git a/keyboards/pabile/p18/config.h b/keyboards/pabile/p18/config.h
new file mode 100644
index 0000000000..f7c258a565
--- /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 0000000000..3f215a4519
--- /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 0000000000..d47982e562
--- /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 0000000000..94e74a8315
--- /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 0000000000..3be26191ce
--- /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 0000000000..57478c2359
--- /dev/null
+++ b/keyboards/pabile/p18/readme.md
@@ -0,0 +1,15 @@
+# P18
+
+![render](https://i.imgur.com/CPtGiSL.png)
+
+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 0000000000..4a84739de0
--- /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 0000000000..8a52c1bf1c
--- /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 0000000000..6b815e72e8
--- /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 0000000000..c17efac9b1
--- /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 0000000000..b7467dc150
--- /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 0000000000..256a4772ec
--- /dev/null
+++ b/keyboards/pabile/p20/readme.md
@@ -0,0 +1,16 @@
+# P20
+
+![Linear grid](https://github.com/pabile/Pabile20/blob/master/_bak/layout-grid.jpg)
+![Numeric pad](https://github.com/pabile/Pabile20/blob/master/_bak/layout-numpad.jpg)
+
+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 0000000000..d4fa25323a
--- /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 0000000000..f4252f7ab0
--- /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 0000000000..42f9b4823e
--- /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 0000000000..80035fa07d
--- /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 0000000000..b1bfb7de2b
--- /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 0000000000..4e1e08a6fc
--- /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 0000000000..33a657f384
--- /dev/null
+++ b/keyboards/pabile/p40/readme.md
@@ -0,0 +1,15 @@
+# P40
+
+![prototype photo1](https://github.com/pabile/Pabile40/blob/master/_bak/web-DSCN9033.jpg)
+
+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 0000000000..2b5d9470a8
--- /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/panc60/rules.mk b/keyboards/panc60/rules.mk
index 26b9f0ce4d..1c4d832054 100644
--- a/keyboards/panc60/rules.mk
+++ b/keyboards/panc60/rules.mk
@@ -21,6 +21,4 @@ BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-OPT_DEFS = -DDEBUG_LEVEL=0
-
LAYOUTS = 60_ansi 60_hhkb
diff --git a/keyboards/pancake/feather/readme.md b/keyboards/pancake/feather/readme.md
deleted file mode 100644
index 8b13789179..0000000000
--- a/keyboards/pancake/feather/readme.md
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/keyboards/pancake/info.json b/keyboards/pancake/info.json
deleted file mode 100644
index 6d2b2a9bb4..0000000000
--- a/keyboards/pancake/info.json
+++ /dev/null
@@ -1,113 +0,0 @@
-{
- "keyboard_name": "Pancake",
- "keyboard_folder": "Pancake",
- "url": "",
- "maintainer": "rionlion100 (Spaceman)",
- "width": 12,
- "height": 4,
- "layouts": {
- "LAYOUT_planck_mit": {
- "key_count": 47,
- "layout": [
- { "w": 1, "x": 0, "y": 0 },
- { "w": 1, "x": 1, "y": 0 },
- { "w": 1, "x": 2, "y": 0 },
- { "w": 1, "x": 3, "y": 0 },
- { "w": 1, "x": 4, "y": 0 },
- { "w": 1, "x": 5, "y": 0 },
- { "w": 1, "x": 6, "y": 0 },
- { "w": 1, "x": 7, "y": 0 },
- { "w": 1, "x": 8, "y": 0 },
- { "w": 1, "x": 9, "y": 0 },
- { "w": 1, "x": 10, "y": 0 },
- { "w": 1, "x": 11, "y": 0 },
- { "w": 1, "x": 0, "y": 1 },
- { "w": 1, "x": 1, "y": 1 },
- { "w": 1, "x": 2, "y": 1 },
- { "w": 1, "x": 3, "y": 1 },
- { "w": 1, "x": 4, "y": 1 },
- { "w": 1, "x": 5, "y": 1 },
- { "w": 1, "x": 6, "y": 1 },
- { "w": 1, "x": 7, "y": 1 },
- { "w": 1, "x": 8, "y": 1 },
- { "w": 1, "x": 9, "y": 1 },
- { "w": 1, "x": 10, "y": 1 },
- { "w": 1, "x": 11, "y": 1 },
- { "w": 1, "x": 0, "y": 2 },
- { "w": 1, "x": 1, "y": 2 },
- { "w": 1, "x": 2, "y": 2 },
- { "w": 1, "x": 3, "y": 2 },
- { "w": 1, "x": 4, "y": 2 },
- { "w": 1, "x": 5, "y": 2 },
- { "w": 1, "x": 6, "y": 2 },
- { "w": 1, "x": 7, "y": 2 },
- { "w": 1, "x": 8, "y": 2 },
- { "w": 1, "x": 9, "y": 2 },
- { "w": 1, "x": 10, "y": 2 },
- { "w": 1, "x": 11, "y": 2 },
- { "w": 1, "x": 0, "y": 3 },
- { "w": 1, "x": 1, "y": 3 },
- { "w": 1, "x": 2, "y": 3 },
- { "w": 1, "x": 3, "y": 3 },
- { "w": 1, "x": 4, "y": 3 },
- { "w": 2, "x": 5, "y": 3 },
- { "w": 1, "x": 7, "y": 3 },
- { "w": 1, "x": 8, "y": 3 },
- { "w": 1, "x": 9, "y": 3 },
- { "w": 1, "x": 10, "y": 3 },
- { "w": 1, "x": 11, "y": 3 } ]
- },
- "LAYOUT_ortho_4x12": {
- "key_count": 48,
- "layout": [
- { "w": 1, "x": 0, "y": 0 },
- { "w": 1, "x": 1, "y": 0 },
- { "w": 1, "x": 2, "y": 0 },
- { "w": 1, "x": 3, "y": 0 },
- { "w": 1, "x": 4, "y": 0 },
- { "w": 1, "x": 5, "y": 0 },
- { "w": 1, "x": 6, "y": 0 },
- { "w": 1, "x": 7, "y": 0 },
- { "w": 1, "x": 8, "y": 0 },
- { "w": 1, "x": 9, "y": 0 },
- { "w": 1, "x": 10, "y": 0 },
- { "w": 1, "x": 11, "y": 0 },
- { "w": 1, "x": 0, "y": 1 },
- { "w": 1, "x": 1, "y": 1 },
- { "w": 1, "x": 2, "y": 1 },
- { "w": 1, "x": 3, "y": 1 },
- { "w": 1, "x": 4, "y": 1 },
- { "w": 1, "x": 5, "y": 1 },
- { "w": 1, "x": 6, "y": 1 },
- { "w": 1, "x": 7, "y": 1 },
- { "w": 1, "x": 8, "y": 1 },
- { "w": 1, "x": 9, "y": 1 },
- { "w": 1, "x": 10, "y": 1 },
- { "w": 1, "x": 11, "y": 1 },
- { "w": 1, "x": 0, "y": 2 },
- { "w": 1, "x": 1, "y": 2 },
- { "w": 1, "x": 2, "y": 2 },
- { "w": 1, "x": 3, "y": 2 },
- { "w": 1, "x": 4, "y": 2 },
- { "w": 1, "x": 5, "y": 2 },
- { "w": 1, "x": 6, "y": 2 },
- { "w": 1, "x": 7, "y": 2 },
- { "w": 1, "x": 8, "y": 2 },
- { "w": 1, "x": 9, "y": 2 },
- { "w": 1, "x": 10, "y": 2 },
- { "w": 1, "x": 11, "y": 2 },
- { "w": 1, "x": 0, "y": 3 },
- { "w": 1, "x": 1, "y": 3 },
- { "w": 1, "x": 2, "y": 3 },
- { "w": 1, "x": 3, "y": 3 },
- { "w": 1, "x": 4, "y": 3 },
- { "w": 1, "x": 5, "y": 3 },
- { "w": 1, "x": 6, "y": 3 },
- { "w": 1, "x": 7, "y": 3 },
- { "w": 1, "x": 8, "y": 3 },
- { "w": 1, "x": 9, "y": 3 },
- { "w": 1, "x": 10, "y": 3 },
- { "w": 1, "x": 11, "y": 3 } ]
- }
- }
-}
diff --git a/keyboards/pancake/keymaps/default/readme.md b/keyboards/pancake/keymaps/default/readme.md
deleted file mode 100644
index 8b13789179..0000000000
--- a/keyboards/pancake/keymaps/default/readme.md
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/keyboards/pancake/promicro/readme.md b/keyboards/pancake/promicro/readme.md
deleted file mode 100644
index 8b13789179..0000000000
--- a/keyboards/pancake/promicro/readme.md
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/keyboards/pancake/readme.md b/keyboards/pancake/readme.md
deleted file mode 100644
index 3e3125f4d7..0000000000
--- a/keyboards/pancake/readme.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# Pancake
-
-Ortho 40% Ortho Keyboard with an option for the adafruit feather
-
-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):
-
- make pancake: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/pearl/rules.mk b/keyboards/pearl/rules.mk
index a9746c0d3d..981f6b514f 100644
--- a/keyboards/pearl/rules.mk
+++ b/keyboards/pearl/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/percent/canoe/keymaps/dhertz/keymap.c b/keyboards/percent/canoe/keymaps/dhertz/keymap.c
index bc8a4bca20..7e8170aefc 100644
--- a/keyboards/percent/canoe/keymaps/dhertz/keymap.c
+++ b/keyboards/percent/canoe/keymaps/dhertz/keymap.c
@@ -44,7 +44,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
-void matrix_init_keymap(void) {
+void keyboard_post_init_user(void) {
rgblight_enable_noeeprom();
rgblight_sethsv_teal();
}
diff --git a/keyboards/percent/canoe/readme.md b/keyboards/percent/canoe/readme.md
index d8a496f26c..a4a4093939 100644
--- a/keyboards/percent/canoe/readme.md
+++ b/keyboards/percent/canoe/readme.md
@@ -14,4 +14,6 @@ Flashing example for this keyboard ([after setting up the bootloadHID flashing e
make percent/canoe:default:flash
+Reset Key: Hold down the key located at K11, commonly programmed as Q 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/percent/canoe/rules.mk b/keyboards/percent/canoe/rules.mk
index 8b30163be4..628a5b88ee 100644
--- a/keyboards/percent/canoe/rules.mk
+++ b/keyboards/percent/canoe/rules.mk
@@ -21,6 +21,4 @@ BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-OPT_DEFS = -DDEBUG_LEVEL=0
-
LAYOUTS = 65_ansi_blocker 65_iso_blocker
diff --git a/keyboards/percent/skog/rules.mk b/keyboards/percent/skog/rules.mk
index 0274845644..fbfa30d0fb 100644
--- a/keyboards/percent/skog/rules.mk
+++ b/keyboards/percent/skog/rules.mk
@@ -21,7 +21,5 @@ BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-OPT_DEFS = -DDEBUG_LEVEL=0
-
# 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/percent/skog_lite/rules.mk b/keyboards/percent/skog_lite/rules.mk
index dbcb6c1888..119fb72637 100644
--- a/keyboards/percent/skog_lite/rules.mk
+++ b/keyboards/percent/skog_lite/rules.mk
@@ -23,6 +23,4 @@ BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
WS2812_DRIVER = i2c
-OPT_DEFS = -DDEBUG_LEVEL=0
-
LAYOUTS = tkl_ansi
diff --git a/keyboards/pimentoso/paddino02/readme.md b/keyboards/pimentoso/paddino02/readme.md
index 1e9518351a..c49508c7d7 100644
--- a/keyboards/pimentoso/paddino02/readme.md
+++ b/keyboards/pimentoso/paddino02/readme.md
@@ -2,7 +2,7 @@
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:
+Project page on GitHub, with build steps and 3d-printable files:
https://github.com/Pimentoso/Paddino02
diff --git a/keyboards/plaid/info.json b/keyboards/plaid/info.json
deleted file mode 100644
index 13bd05c149..0000000000
--- a/keyboards/plaid/info.json
+++ /dev/null
@@ -1,113 +0,0 @@
-{
- "keyboard_name": "Plaid // Through Hole",
- "keyboard_folder": "planid",
- "url": "https://github.com/hsgw/plaid",
- "maintainer": "hsgw",
- "width": 12,
- "height": 4,
- "layouts": {
- "LAYOUT_plaid_mit": {
- "key_count": 47,
- "layout": [
- { "w": 1, "x": 0, "y": 0 },
- { "w": 1, "x": 1, "y": 0 },
- { "w": 1, "x": 2, "y": 0 },
- { "w": 1, "x": 3, "y": 0 },
- { "w": 1, "x": 4, "y": 0 },
- { "w": 1, "x": 5, "y": 0 },
- { "w": 1, "x": 6, "y": 0 },
- { "w": 1, "x": 7, "y": 0 },
- { "w": 1, "x": 8, "y": 0 },
- { "w": 1, "x": 9, "y": 0 },
- { "w": 1, "x": 10, "y": 0 },
- { "w": 1, "x": 11, "y": 0 },
- { "w": 1, "x": 0, "y": 1 },
- { "w": 1, "x": 1, "y": 1 },
- { "w": 1, "x": 2, "y": 1 },
- { "w": 1, "x": 3, "y": 1 },
- { "w": 1, "x": 4, "y": 1 },
- { "w": 1, "x": 5, "y": 1 },
- { "w": 1, "x": 6, "y": 1 },
- { "w": 1, "x": 7, "y": 1 },
- { "w": 1, "x": 8, "y": 1 },
- { "w": 1, "x": 9, "y": 1 },
- { "w": 1, "x": 10, "y": 1 },
- { "w": 1, "x": 11, "y": 1 },
- { "w": 1, "x": 0, "y": 2 },
- { "w": 1, "x": 1, "y": 2 },
- { "w": 1, "x": 2, "y": 2 },
- { "w": 1, "x": 3, "y": 2 },
- { "w": 1, "x": 4, "y": 2 },
- { "w": 1, "x": 5, "y": 2 },
- { "w": 1, "x": 6, "y": 2 },
- { "w": 1, "x": 7, "y": 2 },
- { "w": 1, "x": 8, "y": 2 },
- { "w": 1, "x": 9, "y": 2 },
- { "w": 1, "x": 10, "y": 2 },
- { "w": 1, "x": 11, "y": 2 },
- { "w": 1, "x": 0, "y": 3 },
- { "w": 1, "x": 1, "y": 3 },
- { "w": 1, "x": 2, "y": 3 },
- { "w": 1, "x": 3, "y": 3 },
- { "w": 1, "x": 4, "y": 3 },
- { "w": 2, "x": 5, "y": 3 },
- { "w": 1, "x": 7, "y": 3 },
- { "w": 1, "x": 8, "y": 3 },
- { "w": 1, "x": 9, "y": 3 },
- { "w": 1, "x": 10, "y": 3 },
- { "w": 1, "x": 11, "y": 3 } ]
- },
- "LAYOUT_plaid_grid": {
- "key_count": 48,
- "layout": [
- { "w": 1, "x": 0, "y": 0 },
- { "w": 1, "x": 1, "y": 0 },
- { "w": 1, "x": 2, "y": 0 },
- { "w": 1, "x": 3, "y": 0 },
- { "w": 1, "x": 4, "y": 0 },
- { "w": 1, "x": 5, "y": 0 },
- { "w": 1, "x": 6, "y": 0 },
- { "w": 1, "x": 7, "y": 0 },
- { "w": 1, "x": 8, "y": 0 },
- { "w": 1, "x": 9, "y": 0 },
- { "w": 1, "x": 10, "y": 0 },
- { "w": 1, "x": 11, "y": 0 },
- { "w": 1, "x": 0, "y": 1 },
- { "w": 1, "x": 1, "y": 1 },
- { "w": 1, "x": 2, "y": 1 },
- { "w": 1, "x": 3, "y": 1 },
- { "w": 1, "x": 4, "y": 1 },
- { "w": 1, "x": 5, "y": 1 },
- { "w": 1, "x": 6, "y": 1 },
- { "w": 1, "x": 7, "y": 1 },
- { "w": 1, "x": 8, "y": 1 },
- { "w": 1, "x": 9, "y": 1 },
- { "w": 1, "x": 10, "y": 1 },
- { "w": 1, "x": 11, "y": 1 },
- { "w": 1, "x": 0, "y": 2 },
- { "w": 1, "x": 1, "y": 2 },
- { "w": 1, "x": 2, "y": 2 },
- { "w": 1, "x": 3, "y": 2 },
- { "w": 1, "x": 4, "y": 2 },
- { "w": 1, "x": 5, "y": 2 },
- { "w": 1, "x": 6, "y": 2 },
- { "w": 1, "x": 7, "y": 2 },
- { "w": 1, "x": 8, "y": 2 },
- { "w": 1, "x": 9, "y": 2 },
- { "w": 1, "x": 10, "y": 2 },
- { "w": 1, "x": 11, "y": 2 },
- { "w": 1, "x": 0, "y": 3 },
- { "w": 1, "x": 1, "y": 3 },
- { "w": 1, "x": 2, "y": 3 },
- { "w": 1, "x": 3, "y": 3 },
- { "w": 1, "x": 4, "y": 3 },
- { "w": 1, "x": 5, "y": 3 },
- { "w": 1, "x": 6, "y": 3 },
- { "w": 1, "x": 7, "y": 3 },
- { "w": 1, "x": 8, "y": 3 },
- { "w": 1, "x": 9, "y": 3 },
- { "w": 1, "x": 10, "y": 3 },
- { "w": 1, "x": 11, "y": 3 } ]
- }
- }
-}
diff --git a/keyboards/plaid/readme.md b/keyboards/plaid/readme.md
deleted file mode 100644
index a491d05d3b..0000000000
--- a/keyboards/plaid/readme.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# plaid // Through Hole
-
-![plaid](https://i.imgur.com/tTi9yR9h.jpg)
-
-12x4 ortholinear keyboard with only through hole components.
-
-Keyboard Maintainer: [hsgw](https://github.com/hsgw)
-Hardware Supported: ATMEGA328p with vusb [PCB](https://github.com/hsgw/plaid)
-Hardware Availability: Group buy in r/mk
-
-Make example for this keyboard (after setting up your build environment):
- make plaid:default
-
-Flashing example for this keyboard:
-
- make plaid:default:flash
-
-## Bootloader
-use usbasploader in my repository.
-https://github.com/hsgw/USBaspLoader/tree/plaid
-
-
-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/plaid/rules.mk b/keyboards/plaid/rules.mk
deleted file mode 100644
index 068ebe4ba9..0000000000
--- a/keyboards/plaid/rules.mk
+++ /dev/null
@@ -1,39 +0,0 @@
-# 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
-
-# disable debug 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 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
-
-LAYOUTS = ortho_4x12 planck_mit
-LAYOUTS_HAS_RGB = no
diff --git a/keyboards/planck/ez/ez.h b/keyboards/planck/ez/ez.h
index 29bcc1b83c..352deb6476 100644
--- a/keyboards/planck/ez/ez.h
+++ b/keyboards/planck/ez/ez.h
@@ -64,6 +64,10 @@ enum planck_ez_keycodes {
EZ_SAFE_RANGE,
};
+#ifndef WEBUSB_ENABLE
+# define WEBUSB_PAIR KC_NO
+#endif
+
typedef union {
uint32_t raw;
struct {
diff --git a/keyboards/planck/keymaps/ab/keymap.c b/keyboards/planck/keymaps/ab/keymap.c
index c028e7949f..8835bfc87d 100644
--- a/keyboards/planck/keymaps/ab/keymap.c
+++ b/keyboards/planck/keymaps/ab/keymap.c
@@ -26,22 +26,12 @@ extern keymap_config_t keymap_config;
// Func macro definitions.
#define LWR_PGDN LT(_LOWER, KC_PGDN) // Tap for PgDn, hold for LOWER
#define RSE_PGUP LT(_RAISE, KC_PGUP) // Tap for PgUp, hold for RAISE
-#define CTL_CAPS FUNC(2) // Tap for Caps, hold for Ctrl (DOESN'T SEEM TO WORK)
-#define SFT_ENT FUNC(3) // Tap for Enter, hold for Shift
-#define ZM_NRM FUNC(4) // Zoom normal
-#define ZM_IN FUNC(5) // Zoom out
-#define ZM_OUT FUNC(6) // Zoom in
-#define EM_UNDO FUNC(7) // Emacs Undo
-
-// Enable these functions using FUNC(n) macro.
-const uint16_t PROGMEM fn_actions[] = {
- [2] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_CAPS),
- [3] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT),
- [4] = ACTION_MODS_KEY(MOD_LCTL, KC_0),
- [5] = ACTION_MODS_KEY(MOD_LCTL, KC_MINS),
- [6] = ACTION_MODS_KEY(MOD_LCTL, KC_PLUS),
- [7] = ACTION_MODS_KEY(MOD_LCTL, KC_UNDS),
- };
+#define CTL_CAPS MT(MOD_LCTL, KC_CAPS) // Tap for Caps, hold for Ctrl (DOESN'T SEEM TO WORK)
+#define SFT_ENT MT(MOD_RSFT, KC_ENT) // Tap for Enter, hold for Shift
+#define ZM_NRM C(KC_0) // Zoom normal
+#define ZM_IN C(KC_MINS) // Zoom out
+#define ZM_OUT C(KC_PLUS) // Zoom in
+#define EM_UNDO C(KC_UNDS) // Emacs Undo
// This config can be found at Keyboard layout editor site: http://goo.gl/zjXL2l
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
diff --git a/keyboards/planck/keymaps/angerthosenear/keymap.c b/keyboards/planck/keymaps/angerthosenear/keymap.c
index 6a497641e6..6e9c69333e 100644
--- a/keyboards/planck/keymaps/angerthosenear/keymap.c
+++ b/keyboards/planck/keymaps/angerthosenear/keymap.c
@@ -16,21 +16,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[2] = LAYOUT_planck_grid( /* RAISE */
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_TRNS,
- KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_TRNS, DF(0), DF(1), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
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_MPRV, MO(2), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
),
[3] = LAYOUT_planck_grid( /* LOWER */
S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_DEL,
- KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS),
+ KC_TRNS, DF(0), DF(1), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS),
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, MO(3), KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDN, KC_PGUP, KC_END
)
};
-
-
-const uint16_t PROGMEM fn_actions[] = {
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
-
-};
diff --git a/keyboards/planck/keymaps/austin/keymap.c b/keyboards/planck/keymaps/austin/keymap.c
index 16bca79510..3461ca9551 100644
--- a/keyboards/planck/keymaps/austin/keymap.c
+++ b/keyboards/planck/keymaps/austin/keymap.c
@@ -12,25 +12,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
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_FN3, KC_LGUI, KC_LALT, KC_LCTL, MO(3), KC_SPC, KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ DF(0), KC_LGUI, KC_LALT, KC_LCTL, MO(3), KC_SPC, KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
[2] = LAYOUT_planck_grid( /* RAISE */
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, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_TRNS, DF(0), DF(1), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
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, MO(2), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
),
[3] = LAYOUT_planck_grid( /* LOWER */
S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC,
- KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS),
+ KC_TRNS, DF(0), DF(1), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS),
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, MO(3), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
)
};
-
-
-const uint16_t PROGMEM fn_actions[] = {
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
-
-};
diff --git a/keyboards/planck/keymaps/brandon/keymap.c b/keyboards/planck/keymaps/brandon/keymap.c
index ade4ea30f0..66533e53a2 100644
--- a/keyboards/planck/keymaps/brandon/keymap.c
+++ b/keyboards/planck/keymaps/brandon/keymap.c
@@ -86,7 +86,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
[BASE_QWERTY_LAYER] = LAYOUT_planck_grid(
TD(TD_ESC_GRV), KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_QUOT,
- F(5), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT_NAVS, F(6),
+ MT(MOD_LCTL, KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, LT_NAVS, MT(MOD_RCTL, KC_ENT),
KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC,
LT_GUIL, ALL_T(KC_RBRC), M(LALT_BRACE), KC_LGUI, LOWER, KC_SPC, KC_BSPC, RAISE, KC_RGUI, M(RALT_BRACE), ALL_T(KC_LBRC), LT_GUIR
),
@@ -140,7 +140,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
[LOWER_LAYER] = LAYOUT_planck_grid(
LGUI(KC_GRV), KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, S(KC_3),
- F(5), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, F(6),
+ MT(MOD_LCTL, KC_TAB), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, MT(MOD_RCTL, KC_ENT),
KC_LSPO, KC_MINS, KC_EQL, KC_GRV, KC_BSLS, ___x___, KC_NDSH, KC_MDSH, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC,
LT_GUIL, ALL_T(KC_LBRC), M(LALT_BRACE), KC_LGUI, LOWER, KC_BSPC, KC_BSPC, RAISE, KC_RGUI, M(RALT_BRACE), ALL_T(KC_RBRC), LT_GUIR
),
@@ -224,12 +224,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};
-const uint16_t PROGMEM fn_actions[] = {
- // Modifiers
- [5] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_TAB),
- [6] = ACTION_MODS_TAP_KEY(MOD_RCTL, KC_ENT),
-};
-
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
diff --git a/keyboards/planck/keymaps/chance/keymap.c b/keyboards/planck/keymaps/chance/keymap.c
index 23af2277bd..46d077ddc3 100644
--- a/keyboards/planck/keymaps/chance/keymap.c
+++ b/keyboards/planck/keymaps/chance/keymap.c
@@ -45,7 +45,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT_planck_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, F(0) ,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(MOD_RSFT, KC_ENT),
KC_LCTRL,KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
@@ -179,10 +179,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT),
-};
-
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
diff --git a/keyboards/planck/keymaps/charlie/keymap.c b/keyboards/planck/keymaps/charlie/keymap.c
index 29d0502238..4a3adba513 100644
--- a/keyboards/planck/keymaps/charlie/keymap.c
+++ b/keyboards/planck/keymaps/charlie/keymap.c
@@ -2,52 +2,21 @@
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_planck_grid( /* Native */
- KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, FUNC(2),
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, DF(1),
KC_BSPC, 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_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
KC_DEL, KC_LCTL, KC_NO, KC_LSFT, KC_LALT, KC_SPC, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
[1] = LAYOUT_planck_grid( /* QWERTY->PHOTOSHOP */
- KC_DELETE, KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, FUNC(1),
- KC_O, KC_G, KC_S, KC_U, KC_T, FUNC(27), KC_F21, KC_F10, KC_F11, KC_F7, KC_F8, KC_F9,
- KC_TAB, FUNC(4), FUNC(5), FUNC(6), KC_F1, FUNC(7), KC_F18, KC_F19, KC_F23, KC_F20, KC_F22, FUNC(9),
- KC_COMM, KC_DOT, KC_R, FUNC(11), MO(2), KC_SPC, FUNC(12), KC_F2, FUNC(8), KC_F3, KC_F14
+ KC_DELETE, KC_0, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, DF(0),
+ KC_O, KC_G, KC_S, KC_U, KC_T, C(KC_R), KC_F21, KC_F10, KC_F11, KC_F7, KC_F8, KC_F9,
+ KC_TAB, C(S(A(KC_F9))), C(S(KC_I)), S(KC_M), KC_F1, A(KC_BSPC), KC_F18, KC_F19, KC_F23, KC_F20, KC_F22, C(S(A(KC_F12))),
+ KC_COMM, KC_DOT, KC_R, C(KC_H), MO(2), KC_SPC, C(KC_S), KC_F2, C(S(A(KC_X))), KC_F3, KC_F14
),
- [2] = LAYOUT_planck_grid( /* 2: FUNC(3 PHOTOSHOP */
- KC_ESC, FUNC(25), FUNC(26), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
- KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, FUNC(19), FUNC(20), FUNC(21),
- KC_C, KC_NO, FUNC(22), FUNC(5), KC_NO, FUNC(23), KC_NO, KC_NO, KC_NO, KC_NO, FUNC(13), KC_NO,
- FUNC(14), FUNC(15), FUNC(16), FUNC(17), MO(2), KC_SPC, FUNC(18), KC_NO, KC_NO, KC_F24, KC_NO
+ [2] = LAYOUT_planck_grid( /* PHOTOSHOP */
+ KC_ESC, C(KC_Z), C(KC_Y), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, C(S(A(KC_F7))), C(S(A(KC_F8))), C(S(KC_X)),
+ KC_C, KC_NO, S(KC_MINS), C(S(KC_I)), KC_NO, C(S(KC_BSPC)), KC_NO, KC_NO, KC_NO, KC_NO, C(S(KC_F5)), KC_NO,
+ C(KC_F2), C(S(KC_F2)), C(KC_0), C(S(KC_H)), MO(2), KC_SPC, C(S(KC_S)), KC_NO, KC_NO, KC_F24, KC_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
-
- [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_LCTL, KC_F2), // stroke
- [15] = ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_F2), // stroke layer
- [16] = ACTION_MODS_KEY(MOD_LCTL, KC_0), // zoom 0
- [17] = ACTION_MODS_KEY(MOD_LSFT | MOD_LCTL, KC_H), // HSV sliders
- [18] = ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_S), // save as
- [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_LCTL, KC_BSPC), // KC_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/keymaps/circuit/keymap.c b/keyboards/planck/keymaps/circuit/keymap.c
index 018cff4e54..805ebd7fd3 100644
--- a/keyboards/planck/keymaps/circuit/keymap.c
+++ b/keyboards/planck/keymaps/circuit/keymap.c
@@ -23,8 +23,8 @@ enum planck_keycodes {
};
// Key code names
-#define SFT_ENT FUNC(0) // Tap for enter, hold for right shift
-#define LOCK FUNC(1)
+#define SFT_ENT MT(MOD_RSFT, KC_ENT) // Tap for enter, hold for right shift
+#define LOCK TG(_LOCKED)
#define KC_PSTE KC_PASTE
#ifdef TAP_DANCE_ENABLE
@@ -41,12 +41,6 @@ qk_tap_dance_action_t tap_dance_actions[] = {
};
#endif
-// Function definitions
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT),
- [1] = ACTION_LAYER_TOGGLE(_LOCKED)
-};
-
// Layout definitions
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
diff --git a/keyboards/planck/keymaps/david/keymap.c b/keyboards/planck/keymaps/david/keymap.c
index 57aafed2a0..d093efe04a 100644
--- a/keyboards/planck/keymaps/david/keymap.c
+++ b/keyboards/planck/keymaps/david/keymap.c
@@ -12,24 +12,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
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_FN3, KC_LCTL, KC_LALT, KC_LGUI, MO(3), KC_SPC, KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ DF(0), KC_LCTL, KC_LALT, KC_LGUI, MO(3), KC_SPC, KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
[2] = LAYOUT_planck_grid( /* RAISE */
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, FUNC(3), FUNC(4), RESET, M(0), M(1), M(2), KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_TRNS, DF(0), DF(1), RESET, M(0), M(1), M(2), KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
KC_TRNS, KC_F11, KC_F12, M(0), M(1), M(2), M(3), M(4), M(5), M(6), M(7), KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(2), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
),
[3] = LAYOUT_planck_grid( /* LOWER */
S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC,
- KC_TRNS, FUNC(3), FUNC(4), RESET, M(0), M(1), M(2), S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS),
+ KC_TRNS, DF(0), DF(1), RESET, M(0), M(1), M(2), S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS),
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, MO(3), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
)
};
-
-const uint16_t PROGMEM fn_actions[] = {
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
-
-};
diff --git a/keyboards/planck/keymaps/dr_notsokind/keymap.c b/keyboards/planck/keymaps/dr_notsokind/keymap.c
index a244da2e42..1055c754f0 100644
--- a/keyboards/planck/keymaps/dr_notsokind/keymap.c
+++ b/keyboards/planck/keymaps/dr_notsokind/keymap.c
@@ -34,8 +34,8 @@ enum planck_keycodes {
#include "dynamic_macro.h"
// Key code names
-#define SFT_ENT FUNC(0) // Tap for enter, hold for right shift
-#define LOCK FUNC(1)
+#define SFT_ENT MT(MOD_RSFT, KC_ENT) // Tap for enter, hold for right shift
+#define LOCK TG(_LOCKED)
#define KC_PSTE KC_PASTE
#define ZOOM_IN LCTL(KC_EQL)
#define ZOOM_OUT LCTL(KC_MINS)
@@ -55,12 +55,6 @@ qk_tap_dance_action_t tap_dance_actions[] = {
};
#endif
-// Function definitions
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT),
- [1] = ACTION_LAYER_TOGGLE(_LOCKED)
-};
-
// Layout definitions
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
diff --git a/keyboards/planck/keymaps/dzobert/keymap.c b/keyboards/planck/keymaps/dzobert/keymap.c
index 17b1bef019..6012c068a9 100644
--- a/keyboards/planck/keymaps/dzobert/keymap.c
+++ b/keyboards/planck/keymaps/dzobert/keymap.c
@@ -5,14 +5,14 @@ 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_TAB,
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_BSPC,
KC_LALT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
- KC_FN4, KC_RSFT, KC_LGUI, KC_LSFT, MO(3), KC_SPC, KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ DF(1), KC_RSFT, KC_LGUI, KC_LSFT, MO(3), KC_SPC, KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
// Space is repeated to accommadate for both spacebar wiring positions
),
[1] = LAYOUT_planck_grid( /* Colemak */
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_TAB,
KC_ESC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_BSPC,
KC_LALT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT,
- KC_FN3, KC_RSFT, KC_LGUI, KC_LSFT, MO(3), KC_SPC, KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ DF(0), KC_RSFT, KC_LGUI, KC_LSFT, MO(3), KC_SPC, KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
[2] = LAYOUT_planck_grid( /* RAISE */
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
@@ -27,9 +27,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(3), KC_TRNS, KC_TRNS, KC_TRNS, KC_0, KC_KP_DOT, KC_KP_ENTER, KC_KP_PLUS
)
};
-
-const uint16_t PROGMEM fn_actions[] = {
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
-
-};
diff --git a/keyboards/planck/keymaps/emilyh/keymap.c b/keyboards/planck/keymaps/emilyh/keymap.c
index 4a8a7d0c51..3beadd8e2d 100644
--- a/keyboards/planck/keymaps/emilyh/keymap.c
+++ b/keyboards/planck/keymaps/emilyh/keymap.c
@@ -187,7 +187,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ PLAY_SONG(tone_qwerty);
#endif
persistant_default_layer_set(1UL<<_QWERTY);
}
@@ -196,7 +196,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case COLEMAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+ PLAY_SONG(tone_colemak);
#endif
persistant_default_layer_set(1UL<<_COLEMAK);
}
@@ -205,7 +205,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case DVORAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+ PLAY_SONG(tone_dvorak);
#endif
persistant_default_layer_set(1UL<<_DVORAK);
}
@@ -246,7 +246,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
stop_all_notes();
- PLAY_NOTE_ARRAY(tone_plover, false, 0);
+ PLAY_SONG(tone_plover);
#endif
layer_off(_RAISE);
layer_off(_LOWER);
@@ -264,7 +264,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case EXT_PLV:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_plover_gb, false, 0);
+ PLAY_SONG(tone_plover_gb);
#endif
layer_off(_PLOVER);
}
@@ -285,12 +285,12 @@ void matrix_init_user(void) {
void startup_user()
{
_delay_ms(20); // gets rid of tick
- PLAY_NOTE_ARRAY(tone_startup, false, 0);
+ PLAY_SONG(tone_startup);
}
void shutdown_user()
{
- PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+ PLAY_SONG(tone_goodbye);
_delay_ms(150);
stop_all_notes();
}
@@ -302,7 +302,7 @@ void music_on_user(void)
void music_scale_user(void)
{
- PLAY_NOTE_ARRAY(music_scale, false, 0);
+ PLAY_SONG(music_scale);
}
#endif
diff --git a/keyboards/planck/keymaps/espynn/keymap.c b/keyboards/planck/keymaps/espynn/keymap.c
index 924a8c35c6..305fb6e759 100644
--- a/keyboards/planck/keymaps/espynn/keymap.c
+++ b/keyboards/planck/keymaps/espynn/keymap.c
@@ -36,21 +36,11 @@ extern keymap_config_t keymap_config;
// Func macro definitions.
#define LWR_PGDN LT(_LOWER, KC_PGDN) // Tap for PgDn, hold for LOWER
#define RSE_PGUP LT(_RAISE, KC_PGUP) // Tap for PgUp, hold for RAISE
-#define CTL_CAPS FUNC(2) // Tap for Caps, hold for Ctrl (DOESN'T SEEM TO WORK)
-#define SFT_ENT FUNC(3) // Tap for Enter, hold for Shift
-#define ZM_NRM FUNC(4) // Zoom normal
-#define ZM_IN FUNC(5) // Zoom out
-#define ZM_OUT FUNC(6) // Zoom in
-
-// Enable these functions using FUNC(n) macro.
-const uint16_t PROGMEM fn_actions[] = {
- [2] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_CAPS),
- [3] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT),
- [4] = ACTION_MODS_KEY(MOD_LCTL, KC_0),
- [5] = ACTION_MODS_KEY(MOD_LCTL, KC_MINS),
- [6] = ACTION_MODS_KEY(MOD_LCTL, KC_PLUS),
- [7] = ACTION_MODS_KEY(MOD_LCTL, KC_UNDS),
- };
+#define CTL_CAPS MT(MOD_LCTL, KC_CAPS) // Tap for Caps, hold for Ctrl (DOESN'T SEEM TO WORK)
+#define SFT_ENT MT(MOD_RSFT, KC_ENT) // Tap for Enter, hold for Shift
+#define ZM_NRM C(KC_0) // Zoom normal
+#define ZM_IN C(KC_MINS) // Zoom out
+#define ZM_OUT C(KC_PLUS) // Zoom in
// This config can be found at Keyboard layout editor site: https://goo.gl/cF7uIO
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
diff --git a/keyboards/planck/keymaps/ishtob/keymap.c b/keyboards/planck/keymaps/ishtob/keymap.c
index e036d8a5a3..aeb36b3687 100644
--- a/keyboards/planck/keymaps/ishtob/keymap.c
+++ b/keyboards/planck/keymaps/ishtob/keymap.c
@@ -198,10 +198,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
-const uint16_t PROGMEM fn_actions[] = {
- ACTION_SWAP_HANDS_TAP_KEY(KC_SPC),
-};
-
#ifdef AUDIO_ENABLE
float tone_startup[][2] = SONG(STARTUP_SOUND);
@@ -230,7 +226,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
case QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ PLAY_SONG(tone_qwerty);
#endif
persistant_default_layer_set(1UL<<_QWERTY);
}
@@ -239,7 +235,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
case COLEMAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+ PLAY_SONG(tone_colemak);
#endif
persistant_default_layer_set(1UL<<_COLEMAK);
}
@@ -248,7 +244,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
case DVORAK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_dvorak, false, 0);
+ PLAY_SONG(tone_dvorak);
#endif
persistant_default_layer_set(1UL<<_DVORAK);
}
@@ -289,7 +285,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
stop_all_notes();
- PLAY_NOTE_ARRAY(tone_plover, false, 0);
+ PLAY_SONG(tone_plover);
#endif
layer_off(_RAISE);
layer_off(_LOWER);
@@ -307,7 +303,7 @@ bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
case EXT_PLV:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_plover_gb, false, 0);
+ PLAY_SONG(tone_plover_gb);
#endif
layer_off(_PLOVER);
}
@@ -331,12 +327,12 @@ void startup_user()
rgblight_mode(RGB_MATRIX_CYCLE_ALL);
#endif //RGB_matrix
wait_ms(20); // gets rid of tick
- PLAY_NOTE_ARRAY(tone_startup, false, 0);
+ PLAY_SONG(tone_startup);
}
void shutdown_user()
{
- PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+ PLAY_SONG(tone_goodbye);
wait_ms(150);
stop_all_notes();
}
@@ -348,7 +344,7 @@ void music_on_user(void)
void music_scale_user(void)
{
- PLAY_NOTE_ARRAY(music_scale, false, 0);
+ PLAY_SONG(music_scale);
}
#endif
diff --git a/keyboards/planck/keymaps/joe/keymap.c b/keyboards/planck/keymaps/joe/keymap.c
index b759a86cea..49b2948e65 100644
--- a/keyboards/planck/keymaps/joe/keymap.c
+++ b/keyboards/planck/keymaps/joe/keymap.c
@@ -7,25 +7,25 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_planck_grid( /* Joe colemak */
FN3_ESC, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_MINS,
KC_BSPC, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_ENT ,
- F(15), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT,
+ MT(MOD_LSFT, KC_TAB), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT,
KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, MO(4),KC_SPC, KC_SPC, MO(5),KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT
),
[1] = LAYOUT_planck_grid( /* Joe soft Colemak */
FN3_ESC, CM_Q, CM_W, CM_F, CM_P, CM_G, CM_J, CM_L, CM_U, CM_Y, CM_SCLN, KC_MINS,
KC_BSPC, CM_A, CM_R, CM_S, CM_T, CM_D, CM_H, CM_N, CM_E, CM_I, CM_O, KC_ENT ,
- F(15), CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT,
+ MT(MOD_LSFT, KC_TAB), CM_Z, CM_X, CM_C, CM_V, CM_B, CM_K, CM_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT,
KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, MO(4),KC_SPC, KC_SPC, MO(5),KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT
),
[2] = LAYOUT_planck_grid( /* Joe NUMPAD */
FN3_ESC, KC_NO, KC_UP, KC_NO, KC_NO, KC_NO, LSFT(KC_9), LSFT(KC_0), KC_PSLS, KC_P7, KC_P8, KC_P9 ,
KC_BSPC, KC_LEFT, KC_DOWN, KC_RGHT, KC_NO, KC_NO, LSFT(KC_5), KC_PEQL, KC_PAST, KC_P4, KC_P5, KC_P6 ,
- F(15), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PCMM, KC_PMNS, KC_P1, KC_P2, KC_P3 ,
+ MT(MOD_LSFT, KC_TAB), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PCMM, KC_PMNS, KC_P1, KC_P2, KC_P3 ,
KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, MO(4), KC_TRNS, KC_TRNS, MO(5), KC_PPLS, KC_P0, KC_PDOT, KC_PENT
),
[3] = LAYOUT_planck_grid( /* Joe 1337 haxOr5*/
FN3_ESC, KC_Q, KC_W, KC_F, KC_P, KC_6, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_MINS,
KC_BSPC, KC_4, KC_R, KC_5, KC_7, KC_D, KC_H, KC_N, KC_3, KC_1, KC_0, KC_ENT ,
- F(15), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT,
+ MT(MOD_LSFT, KC_TAB), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_UP, KC_QUOT,
KC_LCTL, KC_LGUI, KC_LALT, KC_LSFT, MO(4),KC_SPC, KC_SPC, MO(5),KC_SLSH, KC_LEFT, KC_DOWN, KC_RGHT
),
[4] = LAYOUT_planck_grid( /* Joe LOWER fn1 */
@@ -44,21 +44,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS, 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_MPLY, KC_MPRV, KC_MNXT, 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 ,
- F(6), F(7), F(8), F(9), MO(4), KC_TRNS, KC_TRNS, MO(5), KC_POWER, KC_WAKE, KC_SLEP, LCTL(LALT(KC_L))
+ DF(0), DF(1), DF(2), DF(3), MO(4), KC_TRNS, KC_TRNS, MO(5), KC_POWER, KC_WAKE, KC_SLEP, LCTL(LALT(KC_L))
)
};
-const uint16_t PROGMEM fn_actions[] = {
- /* toggle layers */
- [6] = ACTION_DEFAULT_LAYER_SET(0),
- [7] = ACTION_DEFAULT_LAYER_SET(1),
- [8] = ACTION_DEFAULT_LAYER_SET(2),
- [9] = ACTION_DEFAULT_LAYER_SET(3),
-
- /* tab on tap, shift on hold */
- [15] = ACTION_MODS_TAP_KEY(MOD_LSFT, KC_TAB),
-};
-
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch (id) {
diff --git a/keyboards/planck/keymaps/kyle/keymap.c b/keyboards/planck/keymaps/kyle/keymap.c
index a788aa859f..896dfe9397 100644
--- a/keyboards/planck/keymaps/kyle/keymap.c
+++ b/keyboards/planck/keymaps/kyle/keymap.c
@@ -12,24 +12,18 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
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,
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_FN3, KC_LCTL, KC_LALT, KC_LGUI, MO(3), KC_SPC, KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
+ DF(0), KC_LCTL, KC_LALT, KC_LGUI, MO(3), KC_SPC, KC_SPC, MO(2), KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
[2] = LAYOUT_planck_grid( /* RAISE */
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, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
+ KC_TRNS, DF(0), DF(1), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS,
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, MO(2), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
),
[3] = LAYOUT_planck_grid( /* LOWER */
S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC,
- KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), LSFT(RSFT(KC_D)), KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS),
+ KC_TRNS, DF(0), DF(1), LSFT(RSFT(KC_PAUSE)), LSFT(RSFT(KC_D)), KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), S(KC_BSLS),
KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_TRNS,
BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, MO(3), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
)
};
-
-const uint16_t PROGMEM fn_actions[] = {
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
-
-};
diff --git a/keyboards/planck/keymaps/lucas/keymap.c b/keyboards/planck/keymaps/lucas/keymap.c
index 9bd4b7a60b..26ca6a5505 100644
--- a/keyboards/planck/keymaps/lucas/keymap.c
+++ b/keyboards/planck/keymaps/lucas/keymap.c
@@ -57,7 +57,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |LCTL |LGUI | Tab |LALT |Lower| Space | |Mute |Vol- |Vol+ | P/P |
* `-----------------------------------------------------------------------'
*/
- KC_NO, S(DE_AE), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, S(DE_UE), S(DE_OE), KC_NO, F(4),
+ KC_NO, S(DE_AE), KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, S(DE_UE), S(DE_OE), KC_NO, TG(5),
KC_DEL, DE_AE, KC_NO, DE_SS, KC_NO, KC_NO, KC_NO, KC_NO, DE_UE, DE_OE, KC_NO, RALT(KC_F12),
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_MSTP, KC_MPRV, KC_MNXT, RALT(KC_F11),
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_MPLY
@@ -105,7 +105,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | Tab | ALT | | Space |CrJmp| GUI |Left |Down |Right|
* `-----------------------------------------------------------------------'
*/
- MO(6), KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Z, KC_U, KC_I, KC_O, F(4),
+ MO(6), KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Z, KC_U, KC_I, KC_O, TG(5),
KC_ENT, KC_BSPC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, DE_SCLN,
KC_LCTL, KC_LSFT, KC_Y, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, DE_DOT, KC_UP, DE_SLSH,
KC_NO, KC_NO, KC_TAB, KC_LALT, KC_NO, KC_SPC, KC_SPC, LCTL(KC_SPC), KC_LGUI, KC_LEFT, KC_DOWN, KC_RGHT
@@ -129,11 +129,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
-const uint16_t PROGMEM fn_actions[] = {
- [4] = ACTION_LAYER_TOGGLE(5), // toggle Gaming
- [5] = ACTION_MODS_TAP_KEY(KC_LSFT, KC_CAPS), //Shift on press, Caps on tap
-};
-
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
diff --git a/keyboards/planck/keymaps/matrixman/keymap.c b/keyboards/planck/keymaps/matrixman/keymap.c
index 20982a24ea..7525e345bb 100644
--- a/keyboards/planck/keymaps/matrixman/keymap.c
+++ b/keyboards/planck/keymaps/matrixman/keymap.c
@@ -14,7 +14,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LT(_NAV_L,KC_Q), KC_W, KC_E, KC_R, KC_T, KC_DELETE, KC_BSPC, KC_Y, KC_U, KC_I, KC_O, LT(_NAV_R,KC_P)
,KC_A, KC_S, KC_D, KC_F, KC_G, CTL_T(KC_ESC), CTL_T(KC_SCLN), KC_H, KC_J, KC_K, KC_L, KC_QUOT
,SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALT_T(KC_TAB), ALT_T(KC_INS), KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH)
- ,KC_LCTRL, KC_LGUI, KC_FN0, KC_TAB, LT(_SYMB_L, KC_ESC), KC_LSFT, KC_LSFT, LT(_SYMB_R,KC_SPC), KC_BSPC, KC_FN0, KC_RCTRL, KC_ENT
+ ,KC_LCTRL, KC_LGUI, LM(_NAV_ALT, MOD_LALT), KC_TAB, LT(_SYMB_L, KC_ESC), KC_LSFT, KC_LSFT, LT(_SYMB_R,KC_SPC), KC_BSPC, LM(_NAV_ALT, MOD_LALT), KC_RCTRL, KC_ENT
),
// accessed via the left symb-layer key, includes a semicolon where the right symb-layer key was
[_SYMB_L] = LAYOUT_planck_grid(
@@ -53,11 +53,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_LAYER_MODS(_NAV_ALT, MOD_LALT)
-
-};
-
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
// MACRODOWN only works in this function
diff --git a/keyboards/planck/keymaps/max/keymap.c b/keyboards/planck/keymaps/max/keymap.c
index 1e5d6a61c2..b84404e1e5 100644
--- a/keyboards/planck/keymaps/max/keymap.c
+++ b/keyboards/planck/keymaps/max/keymap.c
@@ -16,20 +16,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[2] = LAYOUT_planck_grid( /* RAISE */
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, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_TRNS,
+ KC_TRNS, DF(0), DF(1), RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, 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_BSLS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(2), KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
),
[3] = LAYOUT_planck_grid( /* LOWER */
S(KC_GRV), S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), S(KC_6), S(KC_7), S(KC_8), S(KC_9), S(KC_0), KC_BSPC,
- KC_TRNS, FUNC(3), FUNC(4), RESET, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), KC_TRNS,
+ KC_TRNS, DF(0), DF(1), RESET, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), S(KC_RBRC), KC_TRNS,
KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, S(KC_BSLS),
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(3), KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
)
};
-
-const uint16_t PROGMEM fn_actions[] = {
- [3] = ACTION_DEFAULT_LAYER_SET(0),
- [4] = ACTION_DEFAULT_LAYER_SET(1),
-
-};
diff --git a/keyboards/planck/keymaps/mollat/keymap.c b/keyboards/planck/keymaps/mollat/keymap.c
index 2952a0ca8f..f993d299b6 100644
--- a/keyboards/planck/keymaps/mollat/keymap.c
+++ b/keyboards/planck/keymaps/mollat/keymap.c
@@ -82,10 +82,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};
-const uint16_t PROGMEM fn_actions[] = {
- [_LCTL] = ACTION_MODS_TAP_KEY(KC_LCTL, M(12)), // does not work
-};
-
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
switch(id) {
diff --git a/keyboards/planck/keymaps/piemod/keymap.c b/keyboards/planck/keymaps/piemod/keymap.c
index 57002cc386..d75b8bf53b 100644
--- a/keyboards/planck/keymaps/piemod/keymap.c
+++ b/keyboards/planck/keymaps/piemod/keymap.c
@@ -1,13 +1,13 @@
#include QMK_KEYBOARD_H
#define DVORAK 0
-#define ARROW 1 //F(1)
-#define SYMBOL 2 // F(2)
-#define NUMBER 3 // F(3)
-#define FUNCTION 4 // F(4)
-#define EMACS 5 // F(5)
-#define CUSTOM_MACROS 6 // F(6)
-#define MOUSE 7 // F(7)
+#define ARROW 1
+#define SYMBOL 2
+#define NUMBER 3
+#define FUNCTION 4
+#define EMACS 5
+#define CUSTOM_MACROS 6
+#define MOUSE 7
#define LT_1A LT(1, KC_A)
#define LT_2O LT(2, KC_O)
@@ -22,7 +22,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_ESC, KC_QUOTE, LT_7COM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DELETE,
KC_TAB, LT_1A, LT_2O, LT_3E, LT_4U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_ENTER,
KC_LSHIFT, KC_SCOLON, LT_5Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_MINUS,
- F(10), LT_6CTL, KC_MENU, KC_LALT, KC_LGUI, KC_BSPACE, KC_SPACE, KC_RCTRL, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
+ C(KC_LALT), LT_6CTL, KC_MENU, KC_LALT, KC_LGUI, KC_BSPACE, KC_SPACE, KC_RCTRL, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT
),
[ARROW] = LAYOUT_planck_grid(
@@ -34,7 +34,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[SYMBOL] = LAYOUT_planck_grid(
KC_TILD, KC_GRAVE, KC_NO, KC_EQUAL, KC_PLUS, KC_NO, KC_LBRACKET, KC_RBRACKET, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN,
- KC_NO, KC_NO, KC_TRNS, KC_SCOLON, KC_COLN, KC_NO, KC_LCBR, KC_RCBR, KC_DLR, KC_PERC, KC_CIRC, F(21),
+ KC_NO, KC_NO, KC_TRNS, KC_SCOLON, KC_COLN, KC_NO, KC_LCBR, KC_RCBR, KC_DLR, KC_PERC, KC_CIRC, S(KC_SLSH),
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_BSLASH, KC_SLASH, KC_EXLM, KC_AT, KC_HASH, KC_PIPE,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_ASTR, KC_SLASH, KC_MINUS, KC_PLUS, KC_EQUAL
),
@@ -75,31 +75,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
-
- enum function_id {
- TEENSY_KEY,
- CUSTOM_KEY,
- L_CTRL_ALT_ENT,
- R_CTRL_ALT_ENT,
- };
-
- int CAPSLOCKED = 0;
-
- const uint16_t PROGMEM fn_actions[] = {
-
- // DVORAK 0
- // ARROW 1, F(1)
- // SYMBOL 2, F(2)
- // NUMBER 3, F(3)
- // FUNCTION 4, F(4)
- // EMACS 5, F(5)
- // MACROS 6, F(6)
- // MOUSE 7, F(7)
-
- // Special Keys
- [10] = ACTION_MODS_KEY(KC_LCTRL, KC_LALT), // FN10 = Ctrl + Alt.
-
- // Symbols
- [21] = ACTION_MODS_KEY(MOD_LSFT, KC_SLASH), // FN21 = Question mark.
-
- };
diff --git a/keyboards/planck/keymaps/pvc/keymap.c b/keyboards/planck/keymaps/pvc/keymap.c
index 78123c44ce..8428c2335f 100644
--- a/keyboards/planck/keymaps/pvc/keymap.c
+++ b/keyboards/planck/keymaps/pvc/keymap.c
@@ -99,7 +99,7 @@ enum keyboard_macros {
#define SC_CCLS LCTL(KC_F4)
#define TG_NKRO MAGIC_TOGGLE_NKRO
-#define OS_SHFT KC_FN0
+#define OS_SHFT OSM(MOD_RSFT)
#define ________________ _______, _______
#define XXXXXXXXXXXXXXXX XXXXXXX, XXXXXXX
@@ -234,10 +234,6 @@ void persistent_default_layer_set(uint16_t default_layer)
default_layer_set(default_layer);
}
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_MODS_ONESHOT(MOD_RSFT),
-};
-
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
diff --git a/keyboards/planck/keymaps/that_canadian/keymap.c b/keyboards/planck/keymaps/that_canadian/keymap.c
index 178422cd8b..8974555fb9 100644
--- a/keyboards/planck/keymaps/that_canadian/keymap.c
+++ b/keyboards/planck/keymaps/that_canadian/keymap.c
@@ -144,7 +144,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ PLAY_SONG(tone_qwerty);
#endif
persistant_default_layer_set(1UL<<_QWERTY);
}
@@ -185,12 +185,12 @@ void matrix_init_user(void) {
void startup_user()
{
_delay_ms(20); // gets rid of tick
- PLAY_NOTE_ARRAY(tone_startup, false, 0);
+ PLAY_SONG(tone_startup);
}
void shutdown_user()
{
- PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+ PLAY_SONG(tone_goodbye);
_delay_ms(150);
stop_all_notes();
}
@@ -202,7 +202,7 @@ void music_on_user(void)
void music_scale_user(void)
{
- PLAY_NOTE_ARRAY(music_scale, false, 0);
+ PLAY_SONG(music_scale);
}
#endif
diff --git a/keyboards/planck/keymaps/yttyx/README.md b/keyboards/planck/keymaps/yttyx/README.md
new file mode 100644
index 0000000000..963438e3b0
--- /dev/null
+++ b/keyboards/planck/keymaps/yttyx/README.md
@@ -0,0 +1,30 @@
+# Overview
+
+This layout uses a mirror variant of Balance 12, created by Sasha Viminitz. See [this page](https://mathematicalmulticore.wordpress.com/the-keyboard-layout-project/)
+for more information.
+
+## To build
+
+```
+make planck/rev6:yttyx
+```
+
+## To build and flash
+
+```
+make planck/rev6:yttyx:flash
+```
+
+## Layers
+
+### Balance 12 base (BA) layer
+![Base layer](https://i.imgur.com/I0TkIHT.png)
+
+### Numeric/Punctuation (NP) layer
+![Numeric/Punctuation layer](https://i.imgur.com/GgZ0PCq.png)
+
+### Function/Cursor (FC) layer
+![Function/Cursor layer](https://i.imgur.com/zcVID2d.png)
+
+### Plover (PL) layer
+![Plover layer](https://i.imgur.com/RikOGXe.png)
diff --git a/keyboards/planck/keymaps/yttyx/config.h b/keyboards/planck/keymaps/yttyx/config.h
index 88d0c07e93..b9e113ec0b 100644
--- a/keyboards/planck/keymaps/yttyx/config.h
+++ b/keyboards/planck/keymaps/yttyx/config.h
@@ -2,4 +2,3 @@
#define NO_ACTION_ONESHOT
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
-#define TAPPING_TOGGLE 2
diff --git a/keyboards/planck/keymaps/yttyx/keymap.c b/keyboards/planck/keymaps/yttyx/keymap.c
index 0fcbae8923..fa2a95a89e 100644
--- a/keyboards/planck/keymaps/yttyx/keymap.c
+++ b/keyboards/planck/keymaps/yttyx/keymap.c
@@ -1,39 +1,32 @@
#include QMK_KEYBOARD_H
-#include <keymap_steno.h>
+#include "keymap_steno.h"
-enum planck_layers {
- _BA, // Base (Balance Twelve mirror variant)
- _PL, // Plover (http://opensteno.org)
- _NP, // Numeric/punctuation
- _FC // Function/cursor
+enum layers {
+ _BA, // Base (Balance Twelve mirror variant)
+ _NP, // Numeric/Punctuation
+ _FC, // Function
+ _PL // Plover
};
-enum planck_keycodes {
- BA = SAFE_RANGE,
- PL
-};
-
-
// Abbreviations
#define KX_SFT_Z MT(MOD_LSFT, KC_Z)
-#define KX_SFT_X MT(MOD_RSFT, KC_X)
+#define KX_SFT_X MT(MOD_LSFT, KC_X)
#define LT_ESC_FC LT(_FC, KC_ESC)
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- /* BA
- .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
- | P | L | C | D | W | | | U | O | Y | K | Q |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | N | R | S | T | M | | BS | A | E | I | H | V |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | Z Sft | J | F | G | B | | Ent | ' @ | , < | . > | X Sft | |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | Ctl | Alt | Sup | NP | Spc | Esc/FC | Sft | Sft | Sup | Alt | Ctl | |
- '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
- */
+ /* Base
+ .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
+ | P | L | C | D | W | | | U | O | Y | K | Q |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | N | R | S | T | M | | BS | A | E | I | H | V |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | Z Sft | J | F | G | B | | Ent | ' @ | , < | . > | X Sft | |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | Ctl | Alt | Sup | NP | Spc | Esc FC | Sft | Sft | Sup | Alt | Ctl | |
+ '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
+ */
[_BA] = LAYOUT_planck_grid(
KC_P, KC_L, KC_C, KC_D, KC_W, XXXXXXX, XXXXXXX, KC_U, KC_O, KC_Y, KC_K, KC_Q,
KC_N, KC_R, KC_S, KC_T, KC_M, XXXXXXX, KC_BSPC, KC_A, KC_E, KC_I, KC_H, KC_V,
@@ -41,106 +34,62 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_LCTL, KC_LALT, KC_LGUI, MO(_NP), KC_SPC, LT_ESC_FC, KC_LSFT, KC_LSFT, KC_LGUI, KC_LALT, KC_LCTL, XXXXXXX
),
- /* Plover
- .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
- | # | # | # | # | # | BA | # | # | # | # | # | # |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | S | T | P | H | * | | * | F | P | L | T | D |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | S | K | W | R | * | | * | R | B | G | S | Z |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | | | | A | O | | E | U | | | | |
- '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
- */
- [_PL] = LAYOUT_planck_grid(
- STN_NUM, STN_NUM, STN_NUM, STN_NUM, STN_NUM, BA, STN_NUM, STN_NUM, STN_NUM, STN_NUM, STN_NUM, STN_NUM,
- STN_S1, STN_TL, STN_PL, STN_HL, STN_ST1, XXXXXXX, STN_ST1, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR,
- STN_S2, STN_KL, STN_WL, STN_RL, STN_ST2, XXXXXXX, STN_ST2, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR,
- XXXXXXX, XXXXXXX, XXXXXXX, STN_A, STN_O, XXXXXXX, STN_E, STN_U, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
- ),
-
- /* Numeric/punctuation
- .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
- | 1 ! | 2 " | 3 £ | 4 $ | 5 % | PL | | 6 ^ | 7 & | 8 * | 9 ( | 0 ) |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | Tab | Ctl-X | Ctl-C | Ctl-V | Ctl-Z | | BS | [ { | ] } | - _ | ; : | \ | |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | Sft | | | Del | Ins | | | / ? | = + | # ~ | ` | |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | Ctl | Alt | Sup | NP | Spc | | Sft | Sft | Sup | Alt | Ctl | |
- '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
+ /* Numeric/Punctuation (NP)
+ .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
+ | 1 ! | 2 " | 3 £ | 4 $ | 5 % | PL | | 6 ^ | 7 & | 8 * | 9 ( | 0 ) |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | Tab | Ctl-X | Ctl-C | Ctl-V | Ctl-Z | | | [ { | ] } | - _ | ; : | \ | |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | Sft | | | Del | Ins | | | / ? | = + | # ~ | ` | |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | Ctl | Alt | Sup | NP | Spc | | Sft | Sft | Sup | Alt | Ctl | |
+ '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
*/
[_NP] = LAYOUT_planck_grid(
- KC_1, KC_2, KC_3, KC_4, KC_5, PL, XXXXXXX, KC_6, KC_7, KC_8, KC_9, KC_0,
+ KC_1, KC_2, KC_3, KC_4, KC_5, TO(_PL), XXXXXXX, KC_6, KC_7, KC_8, KC_9, KC_0,
KC_TAB, C(KC_X), C(KC_C), C(KC_V), C(KC_Z), XXXXXXX, _______, KC_LBRC, KC_RBRC, KC_MINS, KC_SCLN, KC_NUBS,
KC_LSFT, XXXXXXX, XXXXXXX, KC_DEL, KC_INS, XXXXXXX, XXXXXXX, KC_SLSH, KC_EQL, KC_NUHS, KC_GRV, XXXXXXX,
_______, _______, _______, _______, _______, XXXXXXX, _______, _______, _______, _______, _______, XXXXXXX
),
- /* Function/cursor
- .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
- | F1 | F2 | F3 | F4 | F5 | | | Home | Up | End | PgUp | |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | F6 | F7 | F8 | F9 | F10 | | | Left | Down | Right | PgDn | |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | Sft | | | F11 | F12 | | | PScr | Break | ScLk | Caps | |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | Ctl | Alt | Sup | | Spc | | Sft | Sft | Sup | Alt | Ctl | |
- '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
- */
+ /* Function/Cursor (FC)
+ .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
+ | F1 | F2 | F3 | F4 | F5 | | | Home | Up | End | PgUp | |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | F6 | F7 | F8 | F9 | F10 | | | Left | Down | Right | PgDn | |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | Sft | | | F11 | F12 | | | PScr | Break | ScLk | Caps | |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | Ctl | Alt | Sup | | Spc | | Sft | Sft | Sup | Alt | Ctl | |
+ '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
+ */
[_FC] = LAYOUT_planck_grid(
KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, XXXXXXX, XXXXXXX, KC_HOME, KC_UP, KC_END, KC_PGUP, XXXXXXX,
KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, XXXXXXX,
_______, XXXXXXX, XXXXXXX, KC_F11, KC_F12, XXXXXXX, XXXXXXX, KC_PSCR, KC_BRK, KC_SLCK, KC_CAPS, XXXXXXX,
_______, _______, _______, XXXXXXX, _______, _______, _______, _______, _______, _______, _______, XXXXXXX
+ ),
+
+ /* Plover (PL)
+ .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
+ | # | # | # | # | # | BA | # | # | # | # | # | # |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | S | T | P | H | * | | * | F | P | L | T | D |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | S | K | W | R | * | | * | R | B | G | S | Z |
+ |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ | | | | A | O | | E | U | | | | |
+ '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
+ */
+ [_PL] = LAYOUT_planck_grid(
+ STN_NUM, STN_NUM, STN_NUM, STN_NUM, STN_NUM, TO(_BA), STN_NUM, STN_NUM, STN_NUM, STN_NUM, STN_NUM, STN_NUM,
+ STN_S1, STN_TL, STN_PL, STN_HL, STN_ST1, XXXXXXX, STN_ST1, STN_FR, STN_PR, STN_LR, STN_TR, STN_DR,
+ STN_S2, STN_KL, STN_WL, STN_RL, STN_ST2, XXXXXXX, STN_ST2, STN_RR, STN_BR, STN_GR, STN_SR, STN_ZR,
+ XXXXXXX, XXXXXXX, XXXXXXX, STN_A, STN_O, XXXXXXX, STN_E, STN_U, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
)
};
-
-#ifdef AUDIO_ENABLE
- float plover_on[][2] = SONG(PLOVER_SOUND);
- float plover_off[][2] = SONG(PLOVER_GOODBYE_SOUND);
-#endif
-
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- switch (keycode) {
- case PL:
- if (record->event.pressed) {
- #ifdef AUDIO_ENABLE
- stop_all_notes();
- PLAY_SONG(plover_on);
- #endif
-
- layer_off(_NP);
- layer_off(_FC);
- layer_on(_PL);
-
- if (!eeconfig_is_enabled()) {
- eeconfig_init();
- }
-
- keymap_config.raw = eeconfig_read_keymap();
- keymap_config.nkro = 1;
- eeconfig_update_keymap(keymap_config.raw);
- }
- return false;
- case BA:
- if (record->event.pressed) {
- #ifdef AUDIO_ENABLE
- PLAY_SONG(plover_off);
- #endif
-
- layer_off(_NP);
- layer_off(_PL);
- layer_off(_FC);
- }
- return false;
- }
- return true;
-}
-
void matrix_init_user() {
steno_set_mode(STENO_MODE_GEMINI);
}
-
diff --git a/keyboards/planck/keymaps/yttyx/readme.md b/keyboards/planck/keymaps/yttyx/readme.md
deleted file mode 100644
index 6661c31704..0000000000
--- a/keyboards/planck/keymaps/yttyx/readme.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# Overview
-
-* Base layer uses the Balance Twelve layout ([reference](https://mathematicalmulticore.wordpress.com/the-keyboard-layout-project/))
-* Plover layer uses the same home position as the base layer ([reference](http://www.openstenoproject.org/))
-
-## To build
-
-```
-make planck/rev6:yttyx
-```
-
-## To build and flash
-
-```
-make planck/rev6:yttyx:dfu-util
-```
-
-## Layers
-
-### Base
-
- .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
- | P | L | C | D | W | | | U | O | Y | K | Q |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | N | R | S | T | M | | BS | A | E | I | H | V |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | Z Sft | J | F | G | B | | Ent | ' @ | , < | . > | X Sft | |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | Ctl | Alt | Sup | NP | Spc | Esc/FC | Sft | Sft | Sup | Alt | Ctl | |
- '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
-
-### Plover
-
- .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
- | # | # | # | # | # | BA | # | # | # | # | # | # |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | S | T | P | H | * | | * | F | P | L | T | D |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | S | K | W | R | * | | * | R | B | G | S | Z |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | | | | A | O | | E | U | | | | |
- '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
-
-### Numeric/Punctuation
-
- .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
- | 1 ! | 2 " | 3 £ | 4 $ | 5 % | PL | | 6 ^ | 7 & | 8 * | 9 ( | 0 ) |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | Tab | Ctl-X | Ctl-C | Ctl-V | Ctl-Z | | BS | [ { | ] } | - _ | ; : | \ | |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | Sft | | | Del | Ins | | | / ? | = + | # ~ | ` | |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | Ctl | Alt | Sup | NP | Spc | | Sft | Sft | Sup | Alt | Ctl | |
- '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
-
-### Function
-
- .--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.--------.
- | F1 | F2 | F3 | F4 | F5 | | | Home | Up | End | PgUp | |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | F6 | F7 | F8 | F9 | F10 | | | Left | Down | Right | PgDn | |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | Sft | | | F11 | F12 | | | PScr | Break | ScLk | Caps | |
- |--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
- | Ctl | Alt | Sup | | Spc | | Sft | Sft | Sup | Alt | Ctl | |
- '--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'--------'
-
-
diff --git a/keyboards/planck/keymaps/yttyx/rules.mk b/keyboards/planck/keymaps/yttyx/rules.mk
index 27dac6d4da..94f6392790 100644
--- a/keyboards/planck/keymaps/yttyx/rules.mk
+++ b/keyboards/planck/keymaps/yttyx/rules.mk
@@ -1,5 +1,5 @@
# Build Options
-AUDIO_ENABLE = yes
+AUDIO_ENABLE = no
CONSOLE_ENABLE = no
EXTRAKEY_ENABLE = no
MIDI_ENABLE = no
diff --git a/keyboards/planck/keymaps/zrichard/keymap.c b/keyboards/planck/keymaps/zrichard/keymap.c
index 550117d000..f3f60b7d1d 100755
--- a/keyboards/planck/keymaps/zrichard/keymap.c
+++ b/keyboards/planck/keymaps/zrichard/keymap.c
@@ -107,7 +107,7 @@ enum {
#define SC_CCLS LCTL(KC_F4)
#define TG_NKRO MAGIC_TOGGLE_NKRO
-#define OS_SHFT KC_FN0
+#define OS_SHFT OSM(MOD_RSFT)
#define ________________ _______, _______
#define XXXXXXXXXXXXXXXX XXXXXXX, XXXXXXX
@@ -243,10 +243,6 @@ void persistant_default_layer_set(uint16_t default_layer)
default_layer_set(default_layer);
}
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_MODS_ONESHOT(MOD_RSFT),
-};
-
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
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 cdebcd1433..0000000000
--- 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 5a85a6086c..0000000000
--- 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 14db7feaa0..0000000000
--- 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 efd188a8ee..0000000000
--- 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 fe0dfa619c..0000000000
--- 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 7cc5e7f0ac..0000000000
--- a/keyboards/planck/old_keymap_files/common_keymaps/keymap_nathan.c
+++ /dev/null
@@ -1,154 +0,0 @@
-// Author: Nathan Ross Powell <nathanrospowell@gmail.com>
-// 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 829c047be6..0000000000
--- 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 f6493e33a9..0000000000
--- 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 9e6e953e31..0000000000
--- 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 10a112986e..0000000000
--- 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 69ce9b8e09..0000000000
--- 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 fa948077ce..0000000000
--- 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 5be56e7256..0000000000
--- 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 054297b636..0000000000
--- 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 db4f18a95b..0000000000
--- a/keyboards/planck/old_keymap_files/keymap_common.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
-Copyright 2012,2013 Jun Wako <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
-*/
-#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 d46df92876..0000000000
--- a/keyboards/planck/old_keymap_files/keymap_common.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
-Copyright 2012,2013 Jun Wako <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
-*/
-#ifndef KEYMAP_COMMON_H
-#define KEYMAP_COMMON_H
-
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/pgmspace.h>
-#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/planck/rev6/config.h b/keyboards/planck/rev6/config.h
index 3cea2e721e..3fbbae0278 100644
--- a/keyboards/planck/rev6/config.h
+++ b/keyboards/planck/rev6/config.h
@@ -53,6 +53,7 @@
#define MUSIC_MAP
#undef AUDIO_VOICES
+// Note: following undef isn't really necessary on STM32, C6_AUDIO is AVR related
#undef C6_AUDIO
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
diff --git a/keyboards/planck/rev6/rules.mk b/keyboards/planck/rev6/rules.mk
index 49f6088c37..d101f36d65 100644
--- a/keyboards/planck/rev6/rules.mk
+++ b/keyboards/planck/rev6/rules.mk
@@ -14,7 +14,7 @@ COMMAND_ENABLE = yes # 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
+AUDIO_ENABLE = yes # Audio output
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
diff --git a/keyboards/preonic/keymaps/AlexDaigre/config.h b/keyboards/preonic/keymaps/AlexDaigre/config.h
new file mode 100644
index 0000000000..40a9524b46
--- /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 0000000000..6dac52cb94
--- /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 0000000000..ccf860653f
--- /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 0000000000..77589c205c
--- /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",
+ "&dArr;",
+ {
+ "w": 2
+ },
+ "",
+ "&uArr;",
+ "&larr;",
+ "&darr;",
+ "&uarr;",
+ "&rarr;"
+ ]
+] \ 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 0000000000..aae97d489f
--- /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 0000000000..67d13005cf
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..0aed8ebe09
--- /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 0000000000..dcf16bef39
--- /dev/null
+++ b/keyboards/preonic/keymaps/AlexDaigre/rules.mk
@@ -0,0 +1 @@
+SRC += muse.c
diff --git a/keyboards/preonic/keymaps/pvillano/config.h b/keyboards/preonic/keymaps/pvillano/config.h
new file mode 100644
index 0000000000..a338a1da44
--- /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 0000000000..093948e093
--- /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 0000000000..a1d11f8acb
--- /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 0000000000..dcf16bef39
--- /dev/null
+++ b/keyboards/preonic/keymaps/pvillano/rules.mk
@@ -0,0 +1 @@
+SRC += muse.c
diff --git a/keyboards/preonic/keymaps/that_canadian/keymap.c b/keyboards/preonic/keymaps/that_canadian/keymap.c
index bf9e89e1f2..d1d274f293 100644
--- a/keyboards/preonic/keymaps/that_canadian/keymap.c
+++ b/keyboards/preonic/keymaps/that_canadian/keymap.c
@@ -161,7 +161,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ PLAY_SONG(tone_qwerty);
#endif
persistant_default_layer_set(1UL<<_QWERTY);
}
@@ -213,12 +213,12 @@ void matrix_init_user(void) {
void startup_user()
{
_delay_ms(20); // gets rid of tick
- PLAY_NOTE_ARRAY(tone_startup, false, 0);
+ PLAY_SONG(tone_startup);
}
void shutdown_user()
{
- PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+ PLAY_SONG(tone_goodbye);
_delay_ms(150);
stop_all_notes();
}
@@ -230,7 +230,7 @@ void music_on_user(void)
void music_scale_user(void)
{
- PLAY_NOTE_ARRAY(music_scale, false, 0);
+ PLAY_SONG(music_scale);
}
#endif
diff --git a/keyboards/preonic/rev1/rules.mk b/keyboards/preonic/rev1/rules.mk
index 9be496ce79..45edfa0b0f 100644
--- a/keyboards/preonic/rev1/rules.mk
+++ b/keyboards/preonic/rev1/rules.mk
@@ -23,7 +23,7 @@ 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 = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
-AUDIO_ENABLE = yes # Audio output on port C6
+AUDIO_ENABLE = yes # Audio output
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
diff --git a/keyboards/preonic/rev2/rules.mk b/keyboards/preonic/rev2/rules.mk
index b98f9b52c8..f24c6a49b7 100644
--- a/keyboards/preonic/rev2/rules.mk
+++ b/keyboards/preonic/rev2/rules.mk
@@ -23,7 +23,7 @@ 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 = yes # Enable keyboard backlight functionality
MIDI_ENABLE = no # MIDI controls
-AUDIO_ENABLE = yes # Audio output on port C6
+AUDIO_ENABLE = yes # Audio output
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
diff --git a/keyboards/preonic/rev3/config.h b/keyboards/preonic/rev3/config.h
index b5b2ced5a7..b7429f757a 100644
--- a/keyboards/preonic/rev3/config.h
+++ b/keyboards/preonic/rev3/config.h
@@ -40,6 +40,7 @@
#define MUSIC_MAP
#undef AUDIO_VOICES
+// Note: following undef isn't really necessary on STM32, C6_AUDIO is AVR related
#undef C6_AUDIO
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
diff --git a/keyboards/preonic/rev3/rules.mk b/keyboards/preonic/rev3/rules.mk
index 4c5d2f2ffe..a5fc16a2e5 100644
--- a/keyboards/preonic/rev3/rules.mk
+++ b/keyboards/preonic/rev3/rules.mk
@@ -14,7 +14,7 @@ COMMAND_ENABLE = yes # 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
+AUDIO_ENABLE = yes # Audio output
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
diff --git a/keyboards/primekb/prime_e/config.h b/keyboards/primekb/prime_e/config.h
index c564752038..4a355efd72 100644
--- a/keyboards/primekb/prime_e/config.h
+++ b/keyboards/primekb/prime_e/config.h
@@ -50,3 +50,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
+
+#define DYNAMIC_KEYMAP_LAYER_COUNT 8
diff --git a/keyboards/primekb/prime_e/keymaps/via/keymap.c b/keyboards/primekb/prime_e/keymaps/via/keymap.c
index 5a09cb9694..46a310f3d6 100644
--- a/keyboards/primekb/prime_e/keymaps/via/keymap.c
+++ b/keyboards/primekb/prime_e/keymaps/via/keymap.c
@@ -42,6 +42,34 @@ 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, 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(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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/alice.c b/keyboards/projectkb/alice/alice.c
index b82e2050e3..22e3877615 100644
--- a/keyboards/projectkb/alice/alice.c
+++ b/keyboards/projectkb/alice/alice.c
@@ -1,9 +1,11 @@
#include "alice.h"
-void matrix_init_board(void){
+void keyboard_pre_init_kb(void) {
setPinOutput(INDICATOR_PIN_0);
setPinOutput(INDICATOR_PIN_1);
setPinOutput(INDICATOR_PIN_2);
+
+ keyboard_pre_init_user();
}
bool led_update_kb(led_t led_state) {
diff --git a/keyboards/projectkb/alice/keymaps/stanrc85/keymap.c b/keyboards/projectkb/alice/keymaps/stanrc85/keymap.c
index a194ee68ce..667ffe4f69 100644
--- a/keyboards/projectkb/alice/keymaps/stanrc85/keymap.c
+++ b/keyboards/projectkb/alice/keymaps/stanrc85/keymap.c
@@ -25,15 +25,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_QWERTY] = LAYOUT_default(
- KC_ESC, TD_TESC, 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_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_SPCF, KC_LGUI, LT_SPCF, TD_TWIN, TD_TCTL
+ KC_LCTL, KC_LALT, LT_BPCF, KC_LGUI, LT_SPCF, TD_TWIN, TD_TCTL
),
[_DEFAULT] = LAYOUT_default(
- KC_ESC, 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_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),
diff --git a/keyboards/quad_h/lb75/config.h b/keyboards/quad_h/lb75/config.h
new file mode 100644
index 0000000000..1c23ed5b36
--- /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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 0000000000..b1eebad380
--- /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":"&uarr;", "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":"&larr;", "x":13, "y":5},
+ {"label":"&darr;", "x":14, "y":5},
+ {"label":"&rarr;", "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":"&uarr;", "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":"&larr;", "x":13, "y":5},
+ {"label":"&darr;", "x":14, "y":5},
+ {"label":"&rarr;", "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 0000000000..817b3cbddb
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..be0223d1a7
--- /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 0000000000..817b3cbddb
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..6d3bb42bcf
--- /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 0000000000..5a3a58482d
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..0a2f0b5de8
--- /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 0000000000..9df605dbb6
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..943c015c18
--- /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 0000000000..036bd6d1c3
--- /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 0000000000..a18f45adb8
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..697a5fbb21
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..7f44499f64
--- /dev/null
+++ b/keyboards/quad_h/lb75/readme.md
@@ -0,0 +1,15 @@
+# LB75
+
+![LB75](https://i.imgur.com/UNhskvMl.jpg)
+
+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 0000000000..37a5d441a5
--- /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/rgbkb/sol/keymaps/xulkal/config.h b/keyboards/rgbkb/sol/keymaps/xulkal/config.h
index a5c35cfae8..ab75c5419c 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 <http://www.gnu.org/licenses/>.
#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 6a14a99af5..da524e3dc9 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/default/keymap.c b/keyboards/rgbkb/zen/rev1/keymaps/default/keymap.c
index 23c4168f2b..4516f62e8d 100644
--- a/keyboards/rgbkb/zen/rev1/keymaps/default/keymap.c
+++ b/keyboards/rgbkb/zen/rev1/keymaps/default/keymap.c
@@ -78,7 +78,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ PLAY_SONG(tone_qwerty);
#endif
persistant_default_layer_set(1UL<<_QWERTY);
}
@@ -87,7 +87,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
//case COLEMAK:
//if (record->event.pressed) {
//#ifdef AUDIO_ENABLE
- //PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+ //PLAY_SONG(tone_colemak);
//#endif
//persistant_default_layer_set(1UL<<_COLEMAK);
//}
diff --git a/keyboards/rgbkb/zen/rev1/keymaps/jwlawrence/keymap.c b/keyboards/rgbkb/zen/rev1/keymaps/jwlawrence/keymap.c
index 13edd0db8d..bca4684dc5 100644
--- a/keyboards/rgbkb/zen/rev1/keymaps/jwlawrence/keymap.c
+++ b/keyboards/rgbkb/zen/rev1/keymaps/jwlawrence/keymap.c
@@ -77,7 +77,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case QWERTY:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ PLAY_SONG(tone_qwerty);
#endif
persistant_default_layer_set(1UL<<_QWERTY);
}
@@ -86,7 +86,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
//case COLEMAK:
//if (record->event.pressed) {
//#ifdef AUDIO_ENABLE
- //PLAY_NOTE_ARRAY(tone_colemak, false, 0);
+ //PLAY_SONG(tone_colemak);
//#endif
//persistant_default_layer_set(1UL<<_COLEMAK);
//}
diff --git a/keyboards/scarletbandana/rules.mk b/keyboards/scarletbandana/rules.mk
index ff2b9a258c..32ff3a078b 100644
--- a/keyboards/scarletbandana/rules.mk
+++ b/keyboards/scarletbandana/rules.mk
@@ -26,7 +26,7 @@ NKRO_ENABLE = no # USB Nkey Rollover
MIDI_ENABLE = no # MIDI support
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
-AUDIO_ENABLE = yes # Audio output on port C6
+AUDIO_ENABLE = yes # Audio output
RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight. Do not enable this with audio at the same time.
FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality, also set ISSI_ENABLE below for Miera
diff --git a/keyboards/sck/neiso/rules.mk b/keyboards/sck/neiso/rules.mk
index 221054879c..990edc9df2 100644
--- a/keyboards/sck/neiso/rules.mk
+++ b/keyboards/sck/neiso/rules.mk
@@ -28,6 +28,6 @@ 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 = yes # 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/keyboards/sentraq/s60_x/keymaps/ansi_qwertz/keymap.c b/keyboards/sentraq/s60_x/keymaps/ansi_qwertz/keymap.c
index cfeda0a245..2bfe82977c 100644
--- a/keyboards/sentraq/s60_x/keymaps/ansi_qwertz/keymap.c
+++ b/keyboards/sentraq/s60_x/keymaps/ansi_qwertz/keymap.c
@@ -29,14 +29,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
//Function
//Mute microphone
#define KC_SPACEFN LT(2, KC_SPACE)
-#define KC_OSLS KC_FN3
-#define KC_GMLK KC_FN1
+#define KC_OSLS OSM(MOD_LSFT)
+#define KC_GMLK TG(1)
#define KC_FUNC MO(2)
#define MICMUTE RCTL(KC_LCTL)
enum function_codes {
- F_OSLS = 3,
- F_GMLK = 1,
};
enum layer_names {
@@ -146,14 +144,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
-/*
-* Fn action definition
-*/
-const uint16_t PROGMEM fn_actions[] = {
- [F_GMLK] = ACTION_LAYER_TOGGLE(1), // Disable SpaceFn and Oneshot Shift
- [F_OSLS] = ACTION_MODS_ONESHOT(MOD_LSFT) // Oneshot Leftshift
-};
-
void matrix_init_user(void) {
}
diff --git a/keyboards/sentraq/s60_x/keymaps/hasu/keymap.c b/keyboards/sentraq/s60_x/keymaps/hasu/keymap.c
index c72c37d9d3..cba307ba49 100644
--- a/keyboards/sentraq/s60_x/keymaps/hasu/keymap.c
+++ b/keyboards/sentraq/s60_x/keymaps/hasu/keymap.c
@@ -7,6 +7,13 @@
#define KC_LT5 LT(5, KC_SLSH)
#define KC_LT6 LT(6, KC_SCLN)
+#define KC_MTRS MT(MOD_RSFT, KC_GRV)
+
+#define KC_DF0 DF(0)
+#define KC_DF1 DF(1)
+#define KC_DF2 DF(2)
+#define KC_DF3 DF(3)
+
/*
* Hasu
*/
@@ -28,7 +35,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS, EQL, NO, BSPC, \
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC, RBRC, BSLS, \
CAPS, A, S, D, F, G, H, J, K, L, LT6, QUOT, NO, ENT, \
- LSFT, NO, Z, X, C, V, B, N, M, COMM, DOT, LT5, NO, FN9, NO, \
+ LSFT, NO, Z, X, C, V, B, N, M, COMM, DOT, LT5, NO, MTRS, NO, \
LCTL, LGUI, LALT, SPC, RALT, MO6, MO6, MO4),
/* Keymap 1: colemak
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────â”
@@ -165,20 +172,9 @@ Lw: set Workman layout
*/
LAYOUT_kc(
- FN5, FN6, FN7, FN8, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
- TRNS, FN5, FN8, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
- TRNS, TRNS, TRNS, FN7, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
- TRNS, TRNS, TRNS, TRNS, FN6, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
+ DF0, DF1, DF2, DF3, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
+ TRNS, DF0, DF3, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
+ TRNS, TRNS, TRNS, DF2, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
+ TRNS, TRNS, TRNS, TRNS, DF1, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS),
};
-
-/*
- * Fn action definition
- */
-const uint16_t PROGMEM fn_actions[] = {
- [5] = ACTION_DEFAULT_LAYER_SET(0), // set qwerty layout
- [6] = ACTION_DEFAULT_LAYER_SET(1), // set colemak layout
- [7] = ACTION_DEFAULT_LAYER_SET(2), // set dvorak layout
- [8] = ACTION_DEFAULT_LAYER_SET(3), // set workman layout
- [9] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_GRV),
-};
diff --git a/keyboards/sentraq/s60_x/keymaps/jpec/keymap.c b/keyboards/sentraq/s60_x/keymaps/jpec/keymap.c
index 0145540198..24182ad20a 100644
--- a/keyboards/sentraq/s60_x/keymaps/jpec/keymap.c
+++ b/keyboards/sentraq/s60_x/keymaps/jpec/keymap.c
@@ -18,6 +18,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define KC_MO1 MO(1)
#define KC_SPFN LT(1, KC_SPC)
+#define KC_SDEL S(KC_DEL)
+#define KC_CINS C(KC_INS)
+#define KC_SINS S(KC_INS)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Layout 0: Default Layer
@@ -57,20 +60,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, DEL, \
TRNS, MPRV, MPLY, MNXT, MSTP, TRNS, TRNS, PGUP, UP, PGDN, TRNS, SLCK, PAUS, INS, \
TRNS, VOLD, MUTE, VOLU, TRNS, TRNS, HOME, LEFT, DOWN, RGHT, END, TRNS, TRNS, PENT, \
- TRNS, TRNS, PSCR, FN2, FN3, FN4, CALC, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, CAPS, TRNS, \
+ TRNS, TRNS, PSCR, SDEL, CINS, SINS, CALC, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, CAPS, TRNS, \
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS),
};
-/*
-* Fn action definition
-*/
-const uint16_t PROGMEM fn_actions[] = {
- [2] = ACTION_MODS_KEY(MOD_LSFT, KC_DEL), /* Cut */
- [3] = ACTION_MODS_KEY(MOD_LCTL, KC_INS), /* Copy */
- [4] = ACTION_MODS_KEY(MOD_LSFT, KC_INS), /* Paste */
-};
-
-
void matrix_init_user(void) {
}
diff --git a/keyboards/sentraq/s60_x/keymaps/poker/keymap.c b/keyboards/sentraq/s60_x/keymaps/poker/keymap.c
index 3b38ed501b..6286f24371 100644
--- a/keyboards/sentraq/s60_x/keymaps/poker/keymap.c
+++ b/keyboards/sentraq/s60_x/keymaps/poker/keymap.c
@@ -3,6 +3,16 @@
#define KC_MO6 MO(6)
#define KC_MO7 MO(7)
+#define KC_DF0 DF(0)
+#define KC_DF1 DF(1)
+#define KC_DF2 DF(2)
+#define KC_DF3 DF(3)
+
+#define KC_TG4 TG(4)
+#define KC_TG5 TG(5)
+
+#define KC_CSES C(S(KC_ESC))
+
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* 0: qwerty
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────â”
@@ -139,10 +149,10 @@ FnS: toggle Arrow overlay
*/
LAYOUT_kc(
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, TRNS, \
- TRNS, FN2, UP, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, CALC, TRNS, HOME, INS, MO7, \
- TRNS, LEFT, DOWN, RGHT, TRNS, TRNS, PSCR, SLCK, PAUS, TRNS, FN3, END, TRNS, TRNS, \
+ TRNS, TG5, UP, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, CALC, TRNS, HOME, INS, MO7, \
+ TRNS, LEFT, DOWN, RGHT, TRNS, TRNS, PSCR, SLCK, PAUS, TRNS, CSES, END, TRNS, TRNS, \
TRNS, TRNS, DEL, TRNS, WHOM, MUTE, VOLU, VOLD, TRNS, PGUP, PGDN, DEL, TRNS, TRNS, TRNS, \
- TRNS, TRNS, TRNS, FN1, TRNS, TRNS, TRNS, TRNS),
+ TRNS, TRNS, TRNS, TG4, TRNS, TRNS, TRNS, TRNS),
/* 7: Layout selector
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────â”
│ Lq │ Lc │ Ld │ Lw │ │ │ │ │ │ │ │ │ │▒▒▒▒▒│ │
@@ -163,19 +173,9 @@ Lw: set Workman layout
*/
LAYOUT_kc(
- FN5, FN6, FN7, FN8, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
- TRNS, FN5, FN8, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
- TRNS, TRNS, TRNS, FN7, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
- TRNS, TRNS, TRNS, TRNS, FN6, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
+ DF0, DF1, DF2, DF3, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
+ TRNS, DF0, DF3, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
+ TRNS, TRNS, TRNS, DF2, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
+ TRNS, TRNS, TRNS, TRNS, DF1, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS),
};
-const uint16_t PROGMEM fn_actions[] = {
- /* Poker Layout */
- [1] = ACTION_LAYER_TOGGLE(4), // toggle arrow overlay
- [2] = ACTION_LAYER_TOGGLE(5), // toggle Esc overlay
- [3] = ACTION_MODS_KEY(MOD_RCTL|MOD_RSFT, KC_ESC), // Task(RControl,RShift+Esc)
- [5] = ACTION_DEFAULT_LAYER_SET(0), // set qwerty layout
- [6] = ACTION_DEFAULT_LAYER_SET(1), // set colemak layout
- [7] = ACTION_DEFAULT_LAYER_SET(2), // set dvorak layout
- [8] = ACTION_DEFAULT_LAYER_SET(3), // set workman layout
-};
diff --git a/keyboards/sentraq/s60_x/keymaps/poker_bit/keymap.c b/keyboards/sentraq/s60_x/keymaps/poker_bit/keymap.c
index d66cc93c3a..a4ab412ee2 100644
--- a/keyboards/sentraq/s60_x/keymaps/poker_bit/keymap.c
+++ b/keyboards/sentraq/s60_x/keymaps/poker_bit/keymap.c
@@ -1,5 +1,9 @@
#include QMK_KEYBOARD_H
+#define KC_TG5 TG(5)
+#define KC_TG6 TG(6)
+#define KC_CSES C(S(KC_ESC))
+
// Poker fix with toggle and bit operation
// Fn + Esc = `
// Fn + {left, down, up, right} = {home, pgdown, pgup, end}
@@ -38,10 +42,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
[4] = LAYOUT_kc(
TRNS, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, TRNS, \
- CAPS, FN2, UP, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, CALC, TRNS, HOME, INS, TRNS, \
- TRNS, LEFT, DOWN, RGHT, TRNS, TRNS, PSCR, SLCK, PAUS, TRNS, FN4, END, TRNS, TRNS, \
+ CAPS, TG6, UP, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, CALC, TRNS, HOME, INS, TRNS, \
+ TRNS, LEFT, DOWN, RGHT, TRNS, TRNS, PSCR, SLCK, PAUS, TRNS, CSES, END, TRNS, TRNS, \
TRNS, TRNS, DEL, TRNS, WHOM, MUTE, VOLU, VOLD, TRNS, PGUP, PGDN, DEL, TRNS, TRNS, TRNS, \
- TRNS, TRNS, TRNS, FN1, TRNS, TRNS, TRNS, TRNS),
+ TRNS, TRNS, TRNS, TG5, TRNS, TRNS, TRNS, TRNS),
/* 5: Poker with Arrow
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────â”
│ │ │ │ │ │ │ │ │ │ │ │ │ │▒▒▒▒▒│ │
@@ -103,8 +107,5 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
const uint16_t PROGMEM fn_actions[] = {
/* Poker Layout */
[0] = ACTION_LAYER_BIT_XOR(1, 0b0101, ON_BOTH), // Poker Fn(with fix for Esc)
- [1] = ACTION_LAYER_TOGGLE(5), // Poker Arrow toggle
- [2] = ACTION_LAYER_TOGGLE(6), // Poker Esc toggle
[3] = ACTION_LAYER_BIT_XOR(1, 0b1101, ON_BOTH), // Poker Fn(with fix for Arrow)
- [4] = ACTION_MODS_KEY(MOD_RCTL|MOD_RSFT, KC_ESC), // FN3 Task(RControl,RShift+Esc)
};
diff --git a/keyboards/sentraq/s60_x/keymaps/poker_set/keymap.c b/keyboards/sentraq/s60_x/keymaps/poker_set/keymap.c
index 3f63924679..64678cd56c 100644
--- a/keyboards/sentraq/s60_x/keymaps/poker_set/keymap.c
+++ b/keyboards/sentraq/s60_x/keymaps/poker_set/keymap.c
@@ -1,5 +1,7 @@
#include QMK_KEYBOARD_H
+#define KC_CSES C(S(KC_ESC))
+
// Poker fix with set(state transition)
// Fn + Esc = `
// Fn + {left, down, up, right} = {home, pgdown, pgup, end}
@@ -96,7 +98,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT_kc(
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, TRNS, \
TRNS, FN6, UP, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, CALC, TRNS, HOME, INS, TRNS, \
- TRNS, LEFT, DOWN, RGHT, TRNS, TRNS, PSCR, SLCK, PAUS, TRNS, FN8, END, TRNS, TRNS, \
+ TRNS, LEFT, DOWN, RGHT, TRNS, TRNS, PSCR, SLCK, PAUS, TRNS, CSES, END, TRNS, TRNS, \
TRNS, TRNS, DEL, TRNS, WHOM, MUTE, VOLU, VOLD, TRNS, PGUP, PGDN, DEL, TRNS, TRNS, TRNS, \
TRNS, TRNS, TRNS, FN5, FN4, TRNS, TRNS, TRNS),
/* 5: Poker Fn'd arrow
@@ -115,7 +117,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT_kc(
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, TRNS, \
TRNS, FN7, UP, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, CALC, TRNS, HOME, INS, TRNS, \
- TRNS, LEFT, DOWN, RGHT, TRNS, TRNS, PSCR, SLCK, PAUS, TRNS, FN8, END, TRNS, TRNS, \
+ TRNS, LEFT, DOWN, RGHT, TRNS, TRNS, PSCR, SLCK, PAUS, TRNS, CSES, END, TRNS, TRNS, \
TRNS, TRNS, DEL, TRNS, WHOM, MUTE, VOLU, VOLD, TRNS, PGUP, PGDN, DEL, TRNS, PGUP, TRNS, \
TRNS, TRNS, TRNS, FN4, FN5, HOME, PGDN, END),
/* 6: Poker Fn'd Esc
@@ -134,7 +136,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT_kc(
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, TRNS, \
TRNS, FN4, UP, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, CALC, TRNS, HOME, INS, TRNS, \
- TRNS, LEFT, DOWN, RGHT, TRNS, TRNS, PSCR, SLCK, PAUS, TRNS, FN8, END, TRNS, TRNS, \
+ TRNS, LEFT, DOWN, RGHT, TRNS, TRNS, PSCR, SLCK, PAUS, TRNS, CSES, END, TRNS, TRNS, \
TRNS, TRNS, DEL, TRNS, WHOM, MUTE, VOLU, VOLD, TRNS, PGUP, PGDN, DEL, TRNS, TRNS, TRNS, \
TRNS, TRNS, TRNS, FN7, FN6, TRNS, TRNS, TRNS),
/* 7: Poker Fn'd Arrow + Esc
@@ -153,7 +155,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT_kc(
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, TRNS, \
TRNS, FN5, UP, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, CALC, TRNS, HOME, INS, TRNS, \
- TRNS, LEFT, DOWN, RGHT, TRNS, TRNS, PSCR, SLCK, PAUS, TRNS, FN8, END, TRNS, TRNS, \
+ TRNS, LEFT, DOWN, RGHT, TRNS, TRNS, PSCR, SLCK, PAUS, TRNS, CSES, END, TRNS, TRNS, \
TRNS, TRNS, DEL, TRNS, WHOM, MUTE, VOLU, VOLD, TRNS, PGUP, PGDN, DEL, TRNS, PGUP, TRNS, \
TRNS, TRNS, TRNS, FN6, FN7, HOME, PGDN, END),
};
@@ -173,6 +175,4 @@ const uint16_t PROGMEM fn_actions[] = {
[5] = ACTION_LAYER_SET(1, ON_RELEASE), // FN5 move to arrow when release
[6] = ACTION_LAYER_SET(2, ON_RELEASE), // FN6 move to Esc when release
[7] = ACTION_LAYER_SET(3, ON_RELEASE), // FN7 move to arrow + Esc when release
-
- [8] = ACTION_MODS_KEY(MOD_RCTL|MOD_RSFT, KC_ESC), // FN8 Task(RControl,RShift+Esc)
};
diff --git a/keyboards/sentraq/s60_x/keymaps/spacefn/keymap.c b/keyboards/sentraq/s60_x/keymaps/spacefn/keymap.c
index ee7ec6cd68..6ef273d1e3 100644
--- a/keyboards/sentraq/s60_x/keymaps/spacefn/keymap.c
+++ b/keyboards/sentraq/s60_x/keymaps/spacefn/keymap.c
@@ -44,13 +44,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, TRNS, DEL, \
TRNS, TRNS, TRNS, ESC, TRNS, TRNS, TRNS, HOME, UP, END, PSCR, SLCK, PAUS, INS, \
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, PGUP, LEFT, DOWN, RGHT, TRNS, TRNS, TRNS, TRNS, \
- TRNS, TRNS, TRNS, TRNS, TRNS, SPC, PGDN, GRV, FN1, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
+ TRNS, TRNS, TRNS, TRNS, TRNS, SPC, PGDN, GRV, TILD, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, \
TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS, TRNS),
};
-
-/*
- * Fn action definition
- */
-const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_MODS_KEY(MOD_LSFT, KC_GRV), // tilde
-};
diff --git a/keyboards/sentraq/s65_x/keymaps/kelorean/keymap.c b/keyboards/sentraq/s65_x/keymaps/kelorean/keymap.c
index d5b4937aa5..8e1496bc9c 100644
--- a/keyboards/sentraq/s65_x/keymaps/kelorean/keymap.c
+++ b/keyboards/sentraq/s65_x/keymaps/kelorean/keymap.c
@@ -112,9 +112,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_FL] = LAYOUT_65_ansi(
KC_GRAVE, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, \
- _______, F(3), KC_UP, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, KC_PSCR, KC_SLCK, KC_PAUS, _______, _______, \
+ _______, TG(_AL), KC_UP, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, KC_PSCR, KC_SLCK, KC_PAUS, _______, _______, \
_______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, _______, _______, _______, _______, \
- _______, F(5), _______, F(1), F(2), _______, _______, _______, KC_HOME, KC_END, _______, _______, KC_VOLU, _______, \
+ _______, TG(_UL), _______, TG(_CM), TG(_DV), _______, _______, _______, KC_HOME, KC_END, _______, _______, KC_VOLU, _______, \
_______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_MPLY),
/* 5: Locking layer for controlling the underglow
@@ -138,11 +138,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
};
-
-const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_LAYER_TOGGLE(_CM), //Toggle Colemak Layer overlay
- [2] = ACTION_LAYER_TOGGLE(_DV), // Toggle Dvorak Layer overlay
- [3] = ACTION_LAYER_TOGGLE(_AL), // Toggle Arrow Layer overlay
- [5] = ACTION_LAYER_TOGGLE(_UL), // Toggle Underglow Layer overlay
-
-};
diff --git a/keyboards/sentraq/s65_x/keymaps/nall/keymap.c b/keyboards/sentraq/s65_x/keymaps/nall/keymap.c
index 093070cb4b..8589a797fe 100644
--- a/keyboards/sentraq/s65_x/keymaps/nall/keymap.c
+++ b/keyboards/sentraq/s65_x/keymaps/nall/keymap.c
@@ -66,9 +66,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_FL] = LAYOUT_65_ansi(
KC_GRAVE, 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, F(1), KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_PGDN, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, \
+ KC_TRNS, TG(_AL), KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_PGDN, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
- KC_TRNS, F(3), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_END, KC_TRNS, KC_TRNS, KC_VOLU, KC_TRNS, \
+ KC_TRNS, TG(_UL), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_END, KC_TRNS, KC_TRNS, KC_VOLU, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_MPLY),
/* 3: Locking layer for controlling the underglow
@@ -92,9 +92,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS, KC_TRNS, 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),
};
-
-const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_LAYER_TOGGLE(_AL), // Toggle Arrow Layer overlay
- [3] = ACTION_LAYER_TOGGLE(_UL), // Toggle Underglow Layer overlay
-};
-
diff --git a/keyboards/shambles/config.h b/keyboards/shambles/config.h
new file mode 100644
index 0000000000..7714e4e6bd
--- /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 0000000000..1f031cf7d2
--- /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 0000000000..6a076f7090
--- /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 0000000000..1b80263c66
--- /dev/null
+++ b/keyboards/shambles/readme.md
@@ -0,0 +1,15 @@
+# Shambles
+
+![Shambles](https://i.imgur.com/aTEHQpzl.jpg)
+
+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 0000000000..d029ee528f
--- /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 0000000000..b0ef6b8f99
--- /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 0000000000..5fb13b6358
--- /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/singa/rules.mk b/keyboards/singa/rules.mk
index 84eace5ed6..3d51be1133 100644
--- a/keyboards/singa/rules.mk
+++ b/keyboards/singa/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/sofle/config.h b/keyboards/sofle/config.h
new file mode 100644
index 0000000000..0ff762c00b
--- /dev/null
+++ b/keyboards/sofle/config.h
@@ -0,0 +1,4 @@
+#pragma once
+
+#include "config_common.h"
+
diff --git a/keyboards/sofle/keymaps/default/config.h b/keyboards/sofle/keymaps/default/config.h
new file mode 100644
index 0000000000..c5494c20aa
--- /dev/null
+++ b/keyboards/sofle/keymaps/default/config.h
@@ -0,0 +1,6 @@
+#pragma once
+
+/* The way how "handedness" is decided (which half is which),
+see https://docs.qmk.fm/#/feature_split_keyboard?id=setting-handedness
+for more options.
+*/
diff --git a/keyboards/sofle/keymaps/default/keymap.c b/keyboards/sofle/keymaps/default/keymap.c
new file mode 100644
index 0000000000..38200bfb7e
--- /dev/null
+++ b/keyboards/sofle/keymaps/default/keymap.c
@@ -0,0 +1,392 @@
+#include QMK_KEYBOARD_H
+
+enum sofle_layers {
+ /* _M_XYZ = Mac Os, _W_XYZ = Win/Linux */
+ _QWERTY,
+ _COLEMAK,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+enum custom_keycodes {
+ KC_QWERTY = SAFE_RANGE,
+ KC_COLEMAK,
+ KC_LOWER,
+ KC_RAISE,
+ KC_ADJUST,
+ KC_PRVWD,
+ KC_NXTWD,
+ KC_LSTRT,
+ KC_LEND,
+ KC_DLINE
+};
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * QWERTY
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | E | R | T | | Y | U | I | O | P | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | A | S | D | F | G |-------. ,-------| H | J | K | L | ; | ' |
+ * |------+------+------+------+------+------| | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| N | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[_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_GRV, \
+ 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_MUTE, XXXXXXX,KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
+ KC_LGUI,KC_LALT,KC_LCTRL, KC_LOWER, KC_ENT, KC_SPC, KC_RAISE, KC_RCTRL, KC_RALT, KC_RGUI \
+),
+/*
+ * COLEMAK
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | ` |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ESC | Q | W | F | P | G | | J | L | U | Y | ; | Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | TAB | A | R | S | T | D |-------. ,-------| H | N | E | I | O | ' |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |LShift| Z | X | C | V | B |-------| |-------| K | M | , | . | / |RShift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+
+[_COLEMAK] = LAYOUT( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_GRV, \
+ 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, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, XXXXXXX,KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
+ KC_LGUI,KC_LALT,KC_LCTRL,KC_LOWER, KC_ENT, KC_SPC, KC_RAISE, KC_RCTRL, KC_RALT, KC_RGUI \
+),
+/* LOWER
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | F12 |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | ! | @ | # | $ | % |-------. ,-------| ^ | & | * | ( | ) | | |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * | Shift| = | - | + | { | } |-------| |-------| [ | ] | ; | : | \ | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[_LOWER] = LAYOUT( \
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,\
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_F12, \
+ _______, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_PIPE, \
+ _______, KC_EQL, KC_MINS, KC_PLUS, KC_LCBR, KC_RCBR, _______, _______, KC_LBRC, KC_RBRC, KC_SCLN, KC_COLN, KC_BSLS, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______\
+),
+/* RAISE
+ * ,----------------------------------------. ,-----------------------------------------.
+ * | | | | | | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Esc | Ins | Pscr | Menu | | | | | PWrd | Up | NWrd | DLine| Bspc |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | LAt | LCtl |LShift| | Caps |-------. ,-------| | Left | Down | Rigth| Del | Bspc |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * |Shift | Undo | Cut | Copy | Paste| |-------| |-------| | LStr | | LEnd | | Shift|
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+[_RAISE] = LAYOUT( \
+ _______, _______ , _______ , _______ , _______ , _______, _______, _______ , _______, _______ , _______ ,_______, \
+ _______, KC_INS, KC_PSCR, KC_APP, XXXXXXX, XXXXXXX, KC_PGUP, KC_PRVWD, KC_UP, KC_NXTWD,KC_DLINE, KC_BSPC, \
+ _______, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_CAPS, KC_PGDN, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_BSPC, \
+ _______,KC_UNDO, KC_CUT, KC_COPY, KC_PASTE, XXXXXXX, _______, _______, XXXXXXX, KC_LSTRT, XXXXXXX, KC_LEND, XXXXXXX, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+),
+/* ADJUST
+ * ,-----------------------------------------. ,-----------------------------------------.
+ * | | | | | | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | RESET| |QWERTY|COLEMAK| | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | |MACWIN| | | |-------. ,-------| | VOLDO| MUTE | VOLUP| | |
+ * |------+------+------+------+------+------| MUTE | | |------+------+------+------+------+------|
+ * | | | | | | |-------| |-------| | PREV | PLAY | NEXT | | |
+ * `-----------------------------------------/ / \ \-----------------------------------------'
+ * | LGUI | LAlt | LCTR |LOWER | /Enter / \Space \ |RAISE | RCTR | RAlt | RGUI |
+ * | | | | |/ / \ \ | | | | |
+ * `----------------------------------' '------''---------------------------'
+ */
+ [_ADJUST] = LAYOUT( \
+ XXXXXXX , XXXXXXX, XXXXXXX , XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
+ RESET , XXXXXXX,KC_QWERTY,KC_COLEMAK,CG_TOGG,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \
+ XXXXXXX , XXXXXXX,CG_TOGG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, XXXXXXX, XXXXXXX, \
+ XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+ )
+};
+
+#ifdef OLED_DRIVER_ENABLE
+
+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);
+}
+
+static void print_status_narrow(void) {
+ // Print current mode
+ oled_write_P(PSTR("\n\n"), false);
+ oled_write_ln_P(PSTR("MODE"), false);
+ oled_write_ln_P(PSTR(""), false);
+ if (keymap_config.swap_lctl_lgui) {
+ oled_write_ln_P(PSTR("MAC"), false);
+ } else {
+ oled_write_ln_P(PSTR("WIN"), false);
+ }
+
+ switch (get_highest_layer(default_layer_state)) {
+ case _QWERTY:
+ oled_write_ln_P(PSTR("Qwrt"), false);
+ break;
+ case _COLEMAK:
+ oled_write_ln_P(PSTR("Clmk"), false);
+ break;
+ default:
+ oled_write_P(PSTR("Undef"), false);
+ }
+ oled_write_P(PSTR("\n\n"), false);
+ // Print current layer
+ oled_write_ln_P(PSTR("LAYER"), false);
+ switch (get_highest_layer(layer_state)) {
+ case _COLEMAK:
+ case _QWERTY:
+ oled_write_P(PSTR("Base\n"), false);
+ break;
+ case _RAISE:
+ oled_write_P(PSTR("Raise"), false);
+ break;
+ case _LOWER:
+ oled_write_P(PSTR("Lower"), false);
+ break;
+ case _ADJUST:
+ oled_write_P(PSTR("Adj\n"), false);
+ break;
+ default:
+ oled_write_ln_P(PSTR("Undef"), false);
+ }
+ oled_write_P(PSTR("\n\n"), false);
+ led_t led_usb_state = host_keyboard_led_state();
+ oled_write_ln_P(PSTR("CPSLK"), led_usb_state.caps_lock);
+}
+
+oled_rotation_t oled_init_user(oled_rotation_t rotation) {
+ if (is_keyboard_master()) {
+ return OLED_ROTATION_270;
+ }
+ return rotation;
+}
+
+void oled_task_user(void) {
+ if (is_keyboard_master()) {
+ print_status_narrow();
+ } else {
+ render_logo();
+ }
+}
+
+#endif
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case KC_QWERTY:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_QWERTY);
+ }
+ return false;
+ case KC_COLEMAK:
+ if (record->event.pressed) {
+ set_single_persistent_default_layer(_COLEMAK);
+ }
+ return false;
+ case KC_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;
+ case KC_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;
+ case KC_ADJUST:
+ if (record->event.pressed) {
+ layer_on(_ADJUST);
+ } else {
+ layer_off(_ADJUST);
+ }
+ return false;
+ case KC_PRVWD:
+ if (record->event.pressed) {
+ if (keymap_config.swap_lctl_lgui) {
+ register_mods(mod_config(MOD_LALT));
+ register_code(KC_LEFT);
+ } else {
+ register_mods(mod_config(MOD_LCTL));
+ register_code(KC_LEFT);
+ }
+ } else {
+ if (keymap_config.swap_lctl_lgui) {
+ unregister_mods(mod_config(MOD_LALT));
+ unregister_code(KC_LEFT);
+ } else {
+ unregister_mods(mod_config(MOD_LCTL));
+ unregister_code(KC_LEFT);
+ }
+ }
+ break;
+ case KC_NXTWD:
+ if (record->event.pressed) {
+ if (keymap_config.swap_lctl_lgui) {
+ register_mods(mod_config(MOD_LALT));
+ register_code(KC_RIGHT);
+ } else {
+ register_mods(mod_config(MOD_LCTL));
+ register_code(KC_RIGHT);
+ }
+ } else {
+ if (keymap_config.swap_lctl_lgui) {
+ unregister_mods(mod_config(MOD_LALT));
+ unregister_code(KC_RIGHT);
+ } else {
+ unregister_mods(mod_config(MOD_LCTL));
+ unregister_code(KC_RIGHT);
+ }
+ }
+ break;
+ case KC_LSTRT:
+ if (record->event.pressed) {
+ if (keymap_config.swap_lctl_lgui) {
+ //CMD-arrow on Mac, but we have CTL and GUI swapped
+ register_mods(mod_config(MOD_LCTL));
+ register_code(KC_LEFT);
+ } else {
+ register_code(KC_HOME);
+ }
+ } else {
+ if (keymap_config.swap_lctl_lgui) {
+ unregister_mods(mod_config(MOD_LCTL));
+ unregister_code(KC_LEFT);
+ } else {
+ unregister_code(KC_HOME);
+ }
+ }
+ break;
+ case KC_LEND:
+ if (record->event.pressed) {
+ if (keymap_config.swap_lctl_lgui) {
+ //CMD-arrow on Mac, but we have CTL and GUI swapped
+ register_mods(mod_config(MOD_LCTL));
+ register_code(KC_RIGHT);
+ } else {
+ register_code(KC_END);
+ }
+ } else {
+ if (keymap_config.swap_lctl_lgui) {
+ unregister_mods(mod_config(MOD_LCTL));
+ unregister_code(KC_RIGHT);
+ } else {
+ unregister_code(KC_END);
+ }
+ }
+ break;
+ case KC_DLINE:
+ if (record->event.pressed) {
+ register_mods(mod_config(MOD_LCTL));
+ register_code(KC_BSPC);
+ } else {
+ unregister_mods(mod_config(MOD_LCTL));
+ unregister_code(KC_BSPC);
+ }
+ break;
+ case KC_COPY:
+ if (record->event.pressed) {
+ register_mods(mod_config(MOD_LCTL));
+ register_code(KC_C);
+ } else {
+ unregister_mods(mod_config(MOD_LCTL));
+ unregister_code(KC_C);
+ }
+ return false;
+ case KC_PASTE:
+ if (record->event.pressed) {
+ register_mods(mod_config(MOD_LCTL));
+ register_code(KC_V);
+ } else {
+ unregister_mods(mod_config(MOD_LCTL));
+ unregister_code(KC_V);
+ }
+ return false;
+ case KC_CUT:
+ if (record->event.pressed) {
+ register_mods(mod_config(MOD_LCTL));
+ register_code(KC_X);
+ } else {
+ unregister_mods(mod_config(MOD_LCTL));
+ unregister_code(KC_X);
+ }
+ return false;
+ break;
+ case KC_UNDO:
+ if (record->event.pressed) {
+ register_mods(mod_config(MOD_LCTL));
+ register_code(KC_Z);
+ } else {
+ unregister_mods(mod_config(MOD_LCTL));
+ unregister_code(KC_Z);
+ }
+ return false;
+ }
+ return true;
+}
+
+#ifdef ENCODER_ENABLE
+
+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_PGDOWN);
+ } else {
+ tap_code(KC_PGUP);
+ }
+ }
+}
+
+#endif
diff --git a/keyboards/sofle/keymaps/default/readme.md b/keyboards/sofle/keymaps/default/readme.md
new file mode 100644
index 0000000000..6d6dea228c
--- /dev/null
+++ b/keyboards/sofle/keymaps/default/readme.md
@@ -0,0 +1,19 @@
+![SofleKeyboard default keymap](https://github.com/josefadamcik/SofleKeyboard/raw/master/Images/soflekeyboard.png)
+![SofleKeyboard adjust layer](https://github.com/josefadamcik/SofleKeyboard/raw/master/Images/soflekeyboard_layout_adjust.png)
+
+
+# Default keymap for Sofle Keyboard
+
+Layout in [Keyboard Layout Editor](http://www.keyboard-layout-editor.com/#/gists/76efb423a46cbbea75465cb468eef7ff) and [adjust layer](http://www.keyboard-layout-editor.com/#/gists/4bcf66f922cfd54da20ba04905d56bd4)
+
+
+Features:
+
+- Symmetric modifiers (CMD/Super, Alt/Opt, Ctrl, Shift)
+- Various modes, can be switched (using Adjust layer and the selected one is stored in EEPROM.
+- Modes for Qwerty and Colemak support
+- Modes for Mac vs Linux/Win support -> different order of modifiers and different action shortcuts on the "UPPER" layer (the red one in the image). Designed to simplify transtions when switching between operating systems often.
+- The OLED on master half shows selected mode and caps lock state and is rotated.
+- Left encoder controls volume up/down/mute. Right encoder PGUP/PGDOWN.
+
+
diff --git a/keyboards/sofle/keymaps/default/rules.mk b/keyboards/sofle/keymaps/default/rules.mk
new file mode 100644
index 0000000000..6da1df16fd
--- /dev/null
+++ b/keyboards/sofle/keymaps/default/rules.mk
@@ -0,0 +1,5 @@
+
+OLED_DRIVER_ENABLE = yes
+ENCODER_ENABLE = yes
+CONSOLE_ENABLE = yes
+EXTRAKEY_ENABLE = yes
diff --git a/keyboards/sofle/readme.md b/keyboards/sofle/readme.md
new file mode 100644
index 0000000000..27071e6f33
--- /dev/null
+++ b/keyboards/sofle/readme.md
@@ -0,0 +1,27 @@
+# Sofle Keyboard
+
+![SofleKeyboard version 1](https://raw.githubusercontent.com/josefadamcik/SofleKeyboard/master/Images/IMG_20200126_114622.jpg)
+
+Sofle is 6×4+5 keys column-staggered split keyboard. Based on Lily58, Corne and Helix keyboards.
+
+More details about the keyboard on my blog: [Let me introduce you SofleKeyboard - a split keyboard based on Lily58 and Crkbd](https://josef-adamcik.cz/electronics/let-me-introduce-you-sofle-keyboard-split-keyboard-based-on-lily58.html)
+
+The current (temporary) build guide and a build log is available here: [SofleKeyboard build log/guide](https://josef-adamcik.cz/electronics/soflekeyboard-build-log-and-build-guide.html)
+
+* Keyboard Maintainer: [Josef Adamcik](https://josef-adamcik.cz) [Twitter:@josefadamcik](https://twitter.com/josefadamcik)
+* Hardware Supported: SofleKeyboard PCB, ProMicro
+* Hardware Availability: [PCB & Case Data](https://github.com/josefadamcik/SofleKeyboard)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make sofle:default
+
+Flash the default keymap:
+
+ make sofle:default:avrdude
+
+Press reset button on he keyboard when asked.
+
+Disconnect the first half, connect the second one and repeat the process.
+
+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/sofle/rev1/config.h b/keyboards/sofle/rev1/config.h
new file mode 100644
index 0000000000..232306e0bc
--- /dev/null
+++ b/keyboards/sofle/rev1/config.h
@@ -0,0 +1,40 @@
+#pragma once
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFC32
+#define PRODUCT_ID 0x0287
+#define DEVICE_VER 0x0001
+#define MANUFACTURER JosefAdamcik
+#define PRODUCT Sofle
+#define DESCRIPTION Sofle is 6×4+5keys+encoder column-staggered split keyboard.
+
+/* key matrix size */
+// Rows are doubled-up
+#define MATRIX_ROWS 10
+#define MATRIX_COLS 6
+
+// wiring of each half
+#define MATRIX_ROW_PINS { C6, D7, E6, B4, B5 }
+#define MATRIX_COL_PINS { F6, F7, B1, B3, B2, B6 }
+#define DIODE_DIRECTION COL2ROW
+
+#define TAPPING_TERM 100
+#define DEBOUNCE 5
+
+/* encoder support */
+#define ENCODERS_PAD_A { F5 }
+#define ENCODERS_PAD_B { F4 }
+#define ENCODERS_PAD_A_RIGHT { F4 }
+#define ENCODERS_PAD_B_RIGHT { F5 }
+#define ENCODER_RESOLUTION 2
+
+#define TAP_CODE_DELAY 10
+
+/* communication between sides */
+#define USE_SERIAL
+#define SERIAL_USE_MULTI_TRANSACTION
+#define SOFT_SERIAL_PIN D2
+
+#define NO_ACTION_MACRO
+#define NO_ACTION_FUNCTION
+
diff --git a/keyboards/sofle/rev1/info.json b/keyboards/sofle/rev1/info.json
new file mode 100644
index 0000000000..0a495dd3bc
--- /dev/null
+++ b/keyboards/sofle/rev1/info.json
@@ -0,0 +1,19 @@
+{
+ "keyboard_name": "Sofle",
+ "url": "https://github.com/josefadamcik/SofleKeyboard",
+ "maintainer": "Josef Adamcik <josef.adamcik@gmail.com>",
+ "width": 16.5,
+ "height": 5.25,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 60,
+ "layout": [
+ {"x":0, "y":0.5}, {"x":1, "y":0.375}, {"x":2, "y":0.125}, {"x":3, "y":0}, {"x":4, "y":0.125}, {"x":5, "y":0.25}, {"x":10.5, "y":0.25}, {"x":11.5, "y":0.125}, {"x":12.5, "y":0}, {"x":13.5, "y":0.125}, {"x":14.5, "y":0.375}, {"x":15.5, "y":0.5},
+ {"x":0, "y":1.5}, {"x":1, "y":1.375}, {"x":2, "y":1.125}, {"x":3, "y":1}, {"x":4, "y":1.125}, {"x":5, "y":1.25}, {"x":10.5, "y":1.25}, {"x":11.5, "y":1.125}, {"x":12.5, "y":1}, {"x":13.5, "y":1.125}, {"x":14.5, "y":1.375}, {"x":15.5, "y":1.5},
+ {"x":0, "y":2.5}, {"x":1, "y":2.375}, {"x":2, "y":2.125}, {"x":3, "y":2}, {"x":4, "y":2.125}, {"x":5, "y":2.25}, {"x":10.5, "y":2.25}, {"x":11.5, "y":2.125}, {"x":12.5, "y":2}, {"x":13.5, "y":2.125}, {"x":14.5, "y":2.375}, {"x":15.5, "y":2.5},
+ {"x":0, "y":3.5}, {"x":1, "y":3.375}, {"x":2, "y":3.125}, {"x":3, "y":3}, {"x":4, "y":3.125}, {"x":5, "y":3.25}, {"x":6, "y":2.75}, {"x":9.5, "y":2.75}, {"x":10.5, "y":3.25}, {"x":11.5, "y":3.125}, {"x":12.5, "y":3}, {"x":13.5, "y":3.125}, {"x":14.5, "y":3.375}, {"x":15.5, "y":3.5},
+ {"x":1.5, "y":4.375}, {"x":2.5, "y":4.125}, {"x":3.5, "y":4.15}, {"x":4.5, "y":4.25}, {"x":6, "y":4.25, "h":1.5}, {"x":9.5, "y":4.25, "h":1.5}, {"x":11, "y":4.25}, {"x":12, "y":4.15}, {"x":13, "y":4.125}, {"x":14, "y":4.375}
+ ]
+ }
+ }
+}
diff --git a/keyboards/sofle/rev1/rev1.c b/keyboards/sofle/rev1/rev1.c
new file mode 100644
index 0000000000..bbb014c4df
--- /dev/null
+++ b/keyboards/sofle/rev1/rev1.c
@@ -0,0 +1 @@
+#include "sofle.h"
diff --git a/keyboards/sofle/rev1/rev1.h b/keyboards/sofle/rev1/rev1.h
new file mode 100644
index 0000000000..6c0c4a89df
--- /dev/null
+++ b/keyboards/sofle/rev1/rev1.h
@@ -0,0 +1,23 @@
+#pragma once
+#include "quantum.h"
+
+#define LAYOUT( \
+ 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, L45, R40, R30, R31, R32, R33, R34, R35, \
+ L40, L41, L42, L43, L44, 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 }, \
+ { L40, L41, 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 }, \
+ { R45, R44, R43, R42, R41, R40 } \
+ }
+
diff --git a/keyboards/sofle/rev1/rules.mk b/keyboards/sofle/rev1/rules.mk
new file mode 100644
index 0000000000..2ba231d86b
--- /dev/null
+++ b/keyboards/sofle/rev1/rules.mk
@@ -0,0 +1,2 @@
+ENCODER_ENABLE = yes
+OLED_DRIVER_ENABLE = yes
diff --git a/keyboards/sofle/rules.mk b/keyboards/sofle/rules.mk
new file mode 100644
index 0000000000..820061832a
--- /dev/null
+++ b/keyboards/sofle/rules.mk
@@ -0,0 +1,4 @@
+MCU = atmega32u4
+BOOTLOADER = caterina
+SPLIT_KEYBOARD = yes
+DEFAULT_FOLDER = sofle/rev1
diff --git a/keyboards/sofle/sofle.c b/keyboards/sofle/sofle.c
new file mode 100644
index 0000000000..bbb014c4df
--- /dev/null
+++ b/keyboards/sofle/sofle.c
@@ -0,0 +1 @@
+#include "sofle.h"
diff --git a/keyboards/sofle/sofle.h b/keyboards/sofle/sofle.h
new file mode 100644
index 0000000000..67bd529a1b
--- /dev/null
+++ b/keyboards/sofle/sofle.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#ifdef KEYBOARD_sofle_rev1
+ #include "rev1.h"
+#endif
diff --git a/keyboards/2_milk/2_milk.c b/keyboards/spaceman/2_milk/2_milk.c
index 96071c2ad5..96071c2ad5 100644
--- a/keyboards/2_milk/2_milk.c
+++ b/keyboards/spaceman/2_milk/2_milk.c
diff --git a/keyboards/2_milk/2_milk.h b/keyboards/spaceman/2_milk/2_milk.h
index 7d90d2064f..7d90d2064f 100644
--- a/keyboards/2_milk/2_milk.h
+++ b/keyboards/spaceman/2_milk/2_milk.h
diff --git a/keyboards/spaceman/2_milk/config.h b/keyboards/spaceman/2_milk/config.h
new file mode 100644
index 0000000000..49211535d0
--- /dev/null
+++ b/keyboards/spaceman/2_milk/config.h
@@ -0,0 +1,41 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+#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 2% Milk
+#define DESCRIPTION A milk themed 2% Keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 2
+#define MATRIX_COLS 1
+
+/* Milk default pinout */
+#define DIRECT_PINS { \
+ {D4}, \
+ {C6} \
+}
+#define UNUSED_PINS
+
+#ifdef RGBLIGHT_ENABLE
+#define RGB_DI_PIN B6
+#define RGBLED_NUM 1
+#endif
diff --git a/keyboards/spaceman/2_milk/info.json b/keyboards/spaceman/2_milk/info.json
new file mode 100644
index 0000000000..6c2bd78b28
--- /dev/null
+++ b/keyboards/spaceman/2_milk/info.json
@@ -0,0 +1,14 @@
+{
+ "keyboard_name": "2% Milk",
+ "keyboard_folder": "2_milk",
+ "url": "",
+ "maintainer": "Spaceman",
+ "width": 1,
+ "height": 2,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 2,
+ "layout": [ {"x": 0, "y": 0 }, {"x": 0, "y": 1 }]
+ }
+ }
+}
diff --git a/keyboards/2_milk/keymaps/binary/keymap.c b/keyboards/spaceman/2_milk/keymaps/binary/keymap.c
index c8df8e9ff0..c8df8e9ff0 100644
--- a/keyboards/2_milk/keymaps/binary/keymap.c
+++ b/keyboards/spaceman/2_milk/keymaps/binary/keymap.c
diff --git a/keyboards/2_milk/keymaps/binary/readme.md b/keyboards/spaceman/2_milk/keymaps/binary/readme.md
index 5ebcbd3e58..5ebcbd3e58 100644
--- a/keyboards/2_milk/keymaps/binary/readme.md
+++ b/keyboards/spaceman/2_milk/keymaps/binary/readme.md
diff --git a/keyboards/2_milk/keymaps/copypasta/keymap.c b/keyboards/spaceman/2_milk/keymaps/copypasta/keymap.c
index c82a6ff216..c82a6ff216 100644
--- a/keyboards/2_milk/keymaps/copypasta/keymap.c
+++ b/keyboards/spaceman/2_milk/keymaps/copypasta/keymap.c
diff --git a/keyboards/2_milk/keymaps/copypasta/readme.md b/keyboards/spaceman/2_milk/keymaps/copypasta/readme.md
index 6c2f4e8fbf..6c2f4e8fbf 100644
--- a/keyboards/2_milk/keymaps/copypasta/readme.md
+++ b/keyboards/spaceman/2_milk/keymaps/copypasta/readme.md
diff --git a/keyboards/2_milk/keymaps/default/keymap.c b/keyboards/spaceman/2_milk/keymaps/default/keymap.c
index 1f327eee9a..1f327eee9a 100644
--- a/keyboards/2_milk/keymaps/default/keymap.c
+++ b/keyboards/spaceman/2_milk/keymaps/default/keymap.c
diff --git a/keyboards/2_milk/keymaps/default/readme.md b/keyboards/spaceman/2_milk/keymaps/default/readme.md
index 4482bce34a..4482bce34a 100644
--- a/keyboards/2_milk/keymaps/default/readme.md
+++ b/keyboards/spaceman/2_milk/keymaps/default/readme.md
diff --git a/keyboards/2_milk/keymaps/emoji/config.h b/keyboards/spaceman/2_milk/keymaps/emoji/config.h
index 90e4d63102..90e4d63102 100644
--- a/keyboards/2_milk/keymaps/emoji/config.h
+++ b/keyboards/spaceman/2_milk/keymaps/emoji/config.h
diff --git a/keyboards/2_milk/keymaps/emoji/keymap.c b/keyboards/spaceman/2_milk/keymaps/emoji/keymap.c
index 024a6a054b..024a6a054b 100644
--- a/keyboards/2_milk/keymaps/emoji/keymap.c
+++ b/keyboards/spaceman/2_milk/keymaps/emoji/keymap.c
diff --git a/keyboards/2_milk/keymaps/emoji/readme.md b/keyboards/spaceman/2_milk/keymaps/emoji/readme.md
index 1d5a08730d..1d5a08730d 100644
--- a/keyboards/2_milk/keymaps/emoji/readme.md
+++ b/keyboards/spaceman/2_milk/keymaps/emoji/readme.md
diff --git a/keyboards/2_milk/keymaps/emoji/rules.mk b/keyboards/spaceman/2_milk/keymaps/emoji/rules.mk
index 7a64eb9023..7a64eb9023 100644
--- a/keyboards/2_milk/keymaps/emoji/rules.mk
+++ b/keyboards/spaceman/2_milk/keymaps/emoji/rules.mk
diff --git a/keyboards/2_milk/keymaps/excessbread/keymap.c b/keyboards/spaceman/2_milk/keymaps/excessbread/keymap.c
index a01b47f271..a01b47f271 100644
--- a/keyboards/2_milk/keymaps/excessbread/keymap.c
+++ b/keyboards/spaceman/2_milk/keymaps/excessbread/keymap.c
diff --git a/keyboards/2_milk/keymaps/excessbread/readme.md b/keyboards/spaceman/2_milk/keymaps/excessbread/readme.md
index a6535e62cf..a6535e62cf 100644
--- a/keyboards/2_milk/keymaps/excessbread/readme.md
+++ b/keyboards/spaceman/2_milk/keymaps/excessbread/readme.md
diff --git a/keyboards/2_milk/keymaps/mikethetiger/keymap.c b/keyboards/spaceman/2_milk/keymaps/mikethetiger/keymap.c
index 20e2292f08..20e2292f08 100644
--- a/keyboards/2_milk/keymaps/mikethetiger/keymap.c
+++ b/keyboards/spaceman/2_milk/keymaps/mikethetiger/keymap.c
diff --git a/keyboards/2_milk/keymaps/mikethetiger/readme.md b/keyboards/spaceman/2_milk/keymaps/mikethetiger/readme.md
index 677732b057..677732b057 100644
--- a/keyboards/2_milk/keymaps/mikethetiger/readme.md
+++ b/keyboards/spaceman/2_milk/keymaps/mikethetiger/readme.md
diff --git a/keyboards/2_milk/keymaps/mikethetiger/rules.mk b/keyboards/spaceman/2_milk/keymaps/mikethetiger/rules.mk
index b5f038ef23..b5f038ef23 100644
--- a/keyboards/2_milk/keymaps/mikethetiger/rules.mk
+++ b/keyboards/spaceman/2_milk/keymaps/mikethetiger/rules.mk
diff --git a/keyboards/2_milk/keymaps/mouse/keymap.c b/keyboards/spaceman/2_milk/keymaps/mouse/keymap.c
index a8ba44fb46..a8ba44fb46 100644
--- a/keyboards/2_milk/keymaps/mouse/keymap.c
+++ b/keyboards/spaceman/2_milk/keymaps/mouse/keymap.c
diff --git a/keyboards/2_milk/keymaps/mouse/readme.md b/keyboards/spaceman/2_milk/keymaps/mouse/readme.md
index 8ecb99eddb..8ecb99eddb 100644
--- a/keyboards/2_milk/keymaps/mouse/readme.md
+++ b/keyboards/spaceman/2_milk/keymaps/mouse/readme.md
diff --git a/keyboards/spaceman/2_milk/readme.md b/keyboards/spaceman/2_milk/readme.md
new file mode 100644
index 0000000000..6745aa65c8
--- /dev/null
+++ b/keyboards/spaceman/2_milk/readme.md
@@ -0,0 +1,19 @@
+# 2% Milk
+
+![2%Milk](https://i.imgur.com/Ud96uXn.png)
+
+A 2% Meme board themed around a milk carton
+
+Keyboard Maintainer: [Spaceman](https://github.com/Spaceman)
+Hardware Availability: [Open Source](https://github.com/Spaceman/Spaceboards/tree/master/Keyboards/2%25%20Milk)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make spaceman/2_milk: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).
+
+### Credits
++ Case design by Soft
++ PCB by PyroL
++ Name by jetpacktuxedo
diff --git a/keyboards/2_milk/rules.mk b/keyboards/spaceman/2_milk/rules.mk
index 4e6c5f7039..4e6c5f7039 100644
--- a/keyboards/2_milk/rules.mk
+++ b/keyboards/spaceman/2_milk/rules.mk
diff --git a/keyboards/pancake/config.h b/keyboards/spaceman/pancake/config.h
index 5a01a572e4..5a01a572e4 100644
--- a/keyboards/pancake/config.h
+++ b/keyboards/spaceman/pancake/config.h
diff --git a/keyboards/pancake/feather/config.h b/keyboards/spaceman/pancake/feather/config.h
index eac91a5ada..eac91a5ada 100644
--- a/keyboards/pancake/feather/config.h
+++ b/keyboards/spaceman/pancake/feather/config.h
diff --git a/keyboards/pancake/feather/rules.mk b/keyboards/spaceman/pancake/feather/rules.mk
index c54fbf06e0..c54fbf06e0 100644
--- a/keyboards/pancake/feather/rules.mk
+++ b/keyboards/spaceman/pancake/feather/rules.mk
diff --git a/keyboards/spaceman/pancake/info.json b/keyboards/spaceman/pancake/info.json
new file mode 100644
index 0000000000..9a21f09e18
--- /dev/null
+++ b/keyboards/spaceman/pancake/info.json
@@ -0,0 +1,113 @@
+{
+ "keyboard_name": "Pancake",
+ "keyboard_folder": "Pancake",
+ "url": "",
+ "maintainer": "Spaceman",
+ "width": 12,
+ "height": 4,
+ "layouts": {
+ "LAYOUT_planck_mit": {
+ "key_count": 47,
+ "layout": [
+ { "w": 1, "x": 0, "y": 0 },
+ { "w": 1, "x": 1, "y": 0 },
+ { "w": 1, "x": 2, "y": 0 },
+ { "w": 1, "x": 3, "y": 0 },
+ { "w": 1, "x": 4, "y": 0 },
+ { "w": 1, "x": 5, "y": 0 },
+ { "w": 1, "x": 6, "y": 0 },
+ { "w": 1, "x": 7, "y": 0 },
+ { "w": 1, "x": 8, "y": 0 },
+ { "w": 1, "x": 9, "y": 0 },
+ { "w": 1, "x": 10, "y": 0 },
+ { "w": 1, "x": 11, "y": 0 },
+ { "w": 1, "x": 0, "y": 1 },
+ { "w": 1, "x": 1, "y": 1 },
+ { "w": 1, "x": 2, "y": 1 },
+ { "w": 1, "x": 3, "y": 1 },
+ { "w": 1, "x": 4, "y": 1 },
+ { "w": 1, "x": 5, "y": 1 },
+ { "w": 1, "x": 6, "y": 1 },
+ { "w": 1, "x": 7, "y": 1 },
+ { "w": 1, "x": 8, "y": 1 },
+ { "w": 1, "x": 9, "y": 1 },
+ { "w": 1, "x": 10, "y": 1 },
+ { "w": 1, "x": 11, "y": 1 },
+ { "w": 1, "x": 0, "y": 2 },
+ { "w": 1, "x": 1, "y": 2 },
+ { "w": 1, "x": 2, "y": 2 },
+ { "w": 1, "x": 3, "y": 2 },
+ { "w": 1, "x": 4, "y": 2 },
+ { "w": 1, "x": 5, "y": 2 },
+ { "w": 1, "x": 6, "y": 2 },
+ { "w": 1, "x": 7, "y": 2 },
+ { "w": 1, "x": 8, "y": 2 },
+ { "w": 1, "x": 9, "y": 2 },
+ { "w": 1, "x": 10, "y": 2 },
+ { "w": 1, "x": 11, "y": 2 },
+ { "w": 1, "x": 0, "y": 3 },
+ { "w": 1, "x": 1, "y": 3 },
+ { "w": 1, "x": 2, "y": 3 },
+ { "w": 1, "x": 3, "y": 3 },
+ { "w": 1, "x": 4, "y": 3 },
+ { "w": 2, "x": 5, "y": 3 },
+ { "w": 1, "x": 7, "y": 3 },
+ { "w": 1, "x": 8, "y": 3 },
+ { "w": 1, "x": 9, "y": 3 },
+ { "w": 1, "x": 10, "y": 3 },
+ { "w": 1, "x": 11, "y": 3 } ]
+ },
+ "LAYOUT_ortho_4x12": {
+ "key_count": 48,
+ "layout": [
+ { "w": 1, "x": 0, "y": 0 },
+ { "w": 1, "x": 1, "y": 0 },
+ { "w": 1, "x": 2, "y": 0 },
+ { "w": 1, "x": 3, "y": 0 },
+ { "w": 1, "x": 4, "y": 0 },
+ { "w": 1, "x": 5, "y": 0 },
+ { "w": 1, "x": 6, "y": 0 },
+ { "w": 1, "x": 7, "y": 0 },
+ { "w": 1, "x": 8, "y": 0 },
+ { "w": 1, "x": 9, "y": 0 },
+ { "w": 1, "x": 10, "y": 0 },
+ { "w": 1, "x": 11, "y": 0 },
+ { "w": 1, "x": 0, "y": 1 },
+ { "w": 1, "x": 1, "y": 1 },
+ { "w": 1, "x": 2, "y": 1 },
+ { "w": 1, "x": 3, "y": 1 },
+ { "w": 1, "x": 4, "y": 1 },
+ { "w": 1, "x": 5, "y": 1 },
+ { "w": 1, "x": 6, "y": 1 },
+ { "w": 1, "x": 7, "y": 1 },
+ { "w": 1, "x": 8, "y": 1 },
+ { "w": 1, "x": 9, "y": 1 },
+ { "w": 1, "x": 10, "y": 1 },
+ { "w": 1, "x": 11, "y": 1 },
+ { "w": 1, "x": 0, "y": 2 },
+ { "w": 1, "x": 1, "y": 2 },
+ { "w": 1, "x": 2, "y": 2 },
+ { "w": 1, "x": 3, "y": 2 },
+ { "w": 1, "x": 4, "y": 2 },
+ { "w": 1, "x": 5, "y": 2 },
+ { "w": 1, "x": 6, "y": 2 },
+ { "w": 1, "x": 7, "y": 2 },
+ { "w": 1, "x": 8, "y": 2 },
+ { "w": 1, "x": 9, "y": 2 },
+ { "w": 1, "x": 10, "y": 2 },
+ { "w": 1, "x": 11, "y": 2 },
+ { "w": 1, "x": 0, "y": 3 },
+ { "w": 1, "x": 1, "y": 3 },
+ { "w": 1, "x": 2, "y": 3 },
+ { "w": 1, "x": 3, "y": 3 },
+ { "w": 1, "x": 4, "y": 3 },
+ { "w": 1, "x": 5, "y": 3 },
+ { "w": 1, "x": 6, "y": 3 },
+ { "w": 1, "x": 7, "y": 3 },
+ { "w": 1, "x": 8, "y": 3 },
+ { "w": 1, "x": 9, "y": 3 },
+ { "w": 1, "x": 10, "y": 3 },
+ { "w": 1, "x": 11, "y": 3 } ]
+ }
+ }
+}
diff --git a/keyboards/pancake/keymaps/default/keymap.c b/keyboards/spaceman/pancake/keymaps/default/keymap.c
index cebc6fccba..cebc6fccba 100644
--- a/keyboards/pancake/keymaps/default/keymap.c
+++ b/keyboards/spaceman/pancake/keymaps/default/keymap.c
diff --git a/keyboards/spaceman/pancake/keymaps/default/readme.md b/keyboards/spaceman/pancake/keymaps/default/readme.md
new file mode 100644
index 0000000000..7eb8cc6d8d
--- /dev/null
+++ b/keyboards/spaceman/pancake/keymaps/default/readme.md
@@ -0,0 +1,3 @@
+# Default keymap for Pancake
+
+designed by: Spaceman
diff --git a/keyboards/pancake/pancake.c b/keyboards/spaceman/pancake/pancake.c
index d77dbfbe01..d77dbfbe01 100644
--- a/keyboards/pancake/pancake.c
+++ b/keyboards/spaceman/pancake/pancake.c
diff --git a/keyboards/pancake/pancake.h b/keyboards/spaceman/pancake/pancake.h
index 312d789b42..312d789b42 100644
--- a/keyboards/pancake/pancake.h
+++ b/keyboards/spaceman/pancake/pancake.h
diff --git a/keyboards/pancake/promicro/config.h b/keyboards/spaceman/pancake/promicro/config.h
index ee02bff2b8..ee02bff2b8 100644
--- a/keyboards/pancake/promicro/config.h
+++ b/keyboards/spaceman/pancake/promicro/config.h
diff --git a/keyboards/pancake/promicro/rules.mk b/keyboards/spaceman/pancake/promicro/rules.mk
index 6ed9e88e99..6ed9e88e99 100644
--- a/keyboards/pancake/promicro/rules.mk
+++ b/keyboards/spaceman/pancake/promicro/rules.mk
diff --git a/keyboards/spaceman/pancake/readme.md b/keyboards/spaceman/pancake/readme.md
new file mode 100644
index 0000000000..34cf6382bc
--- /dev/null
+++ b/keyboards/spaceman/pancake/readme.md
@@ -0,0 +1,12 @@
+# Pancake
+
+Ortho 40% Ortho Keyboard with an option for the adafruit feather
+
+Keyboard Maintainer: [Spaceman](https://github.com/Spaceman)
+Hardware Availability: [GB](https://geekhack.org/index.php?topic=101371.0)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make spaceman/pancake: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/subatomic/rules.mk b/keyboards/subatomic/rules.mk
index abff350ea0..0d77351f32 100644
--- a/keyboards/subatomic/rules.mk
+++ b/keyboards/subatomic/rules.mk
@@ -23,7 +23,7 @@ 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 = yes # Enable keyboard backlight functionality
MIDI_ENABLE = yes # MIDI controls
-AUDIO_ENABLE = yes # Audio output on port C6
+AUDIO_ENABLE = no # Audio output
UNICODE_ENABLE = no # Unicode
BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
diff --git a/keyboards/tada68/config.h b/keyboards/tada68/config.h
index 41eacbd86b..41618e9d26 100755
--- a/keyboards/tada68/config.h
+++ b/keyboards/tada68/config.h
@@ -37,8 +37,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_COL_PINS {F0,F1,E6,C7,C6,B7,D4,B1,B0,B5,B4,D7,D6,B3,F4}
#define UNUSED_PINS
-#define BACKLIGHT_PIN B6
-
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
@@ -53,8 +51,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
-/* Backlight configuration
- */
+/* Backlight configuration */
+#define BACKLIGHT_PIN B6
+#define BACKLIGHT_BREATHING
#define BACKLIGHT_LEVELS 4
/*
diff --git a/keyboards/tada68/keymaps/dlg/keymap.c b/keyboards/tada68/keymaps/dlg/keymap.c
index 9cd6cb2f12..32532e0f3f 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 1f1ae18671..9bb9d2496e 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/info.json b/keyboards/tartan/info.json
deleted file mode 100644
index 72da8bd9d4..0000000000
--- a/keyboards/tartan/info.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "keyboard_name": "Tartan # Through Hole",
- "keyboard_folder": "tartan",
- "url": "https://github.com/hsgw/tartan",
- "maintainer": "hsgw(Takuya Urakawa)",
- "width": 13,
- "height": 5,
- "layouts": {
- "LAYOUT_60_ansi": {
- "key_count": 61,
- "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_ansi_split_bs": {
- "key_count": 62,
- "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":1}, {"label":"", "x":14, "y":0, "w":1}, {"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_ansi_split_bs_rshift": {
- "key_count": 63,
- "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":"|", "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":"BS", "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}, {"label":"Fn", "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":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_iso": {
- "key_count": 62,
- "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":"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":"~", "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}]
- },
- "LAYOUT_60_iso_split_bs": {
- "key_count": 63,
- "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}, {"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":"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":"~", "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}]
- },
- "LAYOUT_60_iso_split_bs_rshift": {
- "key_count": 64,
- "layout": [{"label":"¬", "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}, {"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":"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":"~", "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":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":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/tartan/readme.md b/keyboards/tartan/readme.md
deleted file mode 100644
index 83a3aebaea..0000000000
--- a/keyboards/tartan/readme.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Tartan # Through Hole
-
-![tartan](https://i.imgur.com/1qSrVcs.jpg)
-
-A 60% keyboard with only through hole components.
-
-* Keyboard Maintainer: [hsgw](https://github.com/hsgw)
-* Hardware Supported: ATMEGA328p with vusb [PCB](https://github.com/hsgw/tartan)
-* Hardware Availability: https://5z6p.com/products/tartan/
-
-Make example for this keyboard (after setting up your build environment):
-
- make tartan:default
-
-Flash firmware:
-
- // In bootloader mode
- make tartan:default:flash
-
-## Bootloader
-use usbasploader in my repository.
-https://github.com/hsgw/USBaspLoader/tree/plaid
-
-
-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/tartan/rules.mk b/keyboards/tartan/rules.mk
deleted file mode 100644
index 92658e2d05..0000000000
--- a/keyboards/tartan/rules.mk
+++ /dev/null
@@ -1,41 +0,0 @@
-# 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
-
-
-# disable debug 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 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
-
-LAYOUTS = 60_ansi 60_ansi_split_bs_rshift 60_iso 60_iso_split_bs_rshift
-LAYOUTS_HAS_RGB = no
diff --git a/keyboards/tenki/config.h b/keyboards/tenki/config.h
new file mode 100644
index 0000000000..b3c7201d89
--- /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 0000000000..6c37a45605
--- /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 0000000000..85a8f32302
--- /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 0000000000..9180d8d97f
--- /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 0000000000..36b7ba9cbc
--- /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 0000000000..bb9d424065
--- /dev/null
+++ b/keyboards/tenki/readme.md
@@ -0,0 +1,16 @@
+# TENKI
+![TENKI](https://i.imgur.com/nOaxFwR.png)
+
+TENKI is a customizable hotswap mechanical numpad.
+Supported layout:
+![TENKI LAYOUT](https://i.imgur.com/sD9kxID.png)
+
+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 0000000000..4c47d369bb
--- /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 0000000000..318f8d4757
--- /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 0000000000..29ec6303ab
--- /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/tg4x/readme.md b/keyboards/tg4x/readme.md
index b1ce799512..a030033874 100644
--- a/keyboards/tg4x/readme.md
+++ b/keyboards/tg4x/readme.md
@@ -2,7 +2,7 @@
40% sandwich keyboard driven by a pro micro.
-For more info please refer to [MythosMann's Github](www.github.com/MythosMann/tg4x).
+For more info please refer to [MythosMann's GitHub](www.github.com/MythosMann/tg4x).
* Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin)
* Hardware Supported: TG4x v2.1 PCB
diff --git a/keyboards/tgr/910/config.h b/keyboards/tgr/910/config.h
index ab9d81d834..995a6016a0 100644
--- a/keyboards/tgr/910/config.h
+++ b/keyboards/tgr/910/config.h
@@ -19,8 +19,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "config_common.h"
-#define VENDOR_ID 0x20A0
-#define PRODUCT_ID 0x422D
+#define VENDOR_ID 0x5447 //TG
+#define PRODUCT_ID 0x9100 //910
#define DEVICE_VER 0x0001
#define MANUFACTURER Quadcube
#define PRODUCT TGR-910
diff --git a/keyboards/tgr/910/keymaps/via/keymap.c b/keyboards/tgr/910/keymaps/via/keymap.c
new file mode 100644
index 0000000000..3aff12b530
--- /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 0000000000..9e1952e236
--- /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
index df348f0224..63e86380b8 100644
--- a/keyboards/tgr/910/readme.md
+++ b/keyboards/tgr/910/readme.md
@@ -1,4 +1,4 @@
-# tgr-910
+# TGR-910
65% custom keyboard with a very nice design.
@@ -6,6 +6,8 @@
* 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
diff --git a/keyboards/tgr/910/rules.mk b/keyboards/tgr/910/rules.mk
index a9746c0d3d..981f6b514f 100644
--- a/keyboards/tgr/910/rules.mk
+++ b/keyboards/tgr/910/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/tgr/910ce/rules.mk b/keyboards/tgr/910ce/rules.mk
index 7a21b8a329..743a707331 100644
--- a/keyboards/tgr/910ce/rules.mk
+++ b/keyboards/tgr/910ce/rules.mk
@@ -17,12 +17,10 @@ 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
-COMMAND_ENABLE = yes # Commands for debug and configuration
+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/rules.mk b/keyboards/tgr/alice/rules.mk
index fd340f04eb..20f0222c11 100644
--- a/keyboards/tgr/alice/rules.mk
+++ b/keyboards/tgr/alice/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/tgr/jane/rules.mk b/keyboards/tgr/jane/rules.mk
index 8eeab33951..75ab2bc5bf 100644
--- a/keyboards/tgr/jane/rules.mk
+++ b/keyboards/tgr/jane/rules.mk
@@ -21,6 +21,4 @@ BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = no
WS2812_DRIVER = i2c
-OPT_DEFS = -DDEBUG_LEVEL=0
-
LAYOUTS = tkl_ansi tkl_iso
diff --git a/keyboards/tgr/tris/config.h b/keyboards/tgr/tris/config.h
new file mode 100644
index 0000000000..32149087cf
--- /dev/null
+++ b/keyboards/tgr/tris/config.h
@@ -0,0 +1,50 @@
+/*
+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 <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#include "config_common.h"
+
+#define VENDOR_ID 0x5447 //TG
+#define PRODUCT_ID 0x5452 //TR
+#define DEVICE_VER 0x0001
+#define MANUFACTURER TGR
+#define PRODUCT Tris
+#define DESCRIPTION Numpad by TGR
+
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 4
+
+#define MATRIX_ROW_PINS { B0, B1, B2, B3, B4, B5 }
+#define MATRIX_COL_PINS { A3, A2, A1, A0 }
+
+#define DIODE_DIRECTION COL2ROW
+#define DEBOUNCE 5
+
+#define BACKLIGHT_PIN D4
+#define BACKLIGHT_LEVELS 3
+
+#define RGBLED_NUM 6
+#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/tris/info.json b/keyboards/tgr/tris/info.json
new file mode 100644
index 0000000000..401bd6e308
--- /dev/null
+++ b/keyboards/tgr/tris/info.json
@@ -0,0 +1,16 @@
+{
+ "keyboard_name": "TGR Tris",
+ "url": "",
+ "maintainer": "halfenergized",
+ "width": 4,
+ "height": 6,
+ "layouts": {
+ "LAYOUT_ortho_6x4": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":0, "y":1.25}, {"x":1, "y":1.25}, {"x":2, "y":1.25}, {"x":3, "y":1.25}, {"x":0, "y":2.25}, {"x":1, "y":2.25}, {"x":2, "y":2.25}, {"x":3, "y":2.25}, {"x":0, "y":3.25}, {"x":1, "y":3.25}, {"x":2, "y":3.25}, {"x":3, "y":3.25}, {"x":0, "y":4.25}, {"x":1, "y":4.25}, {"x":2, "y":4.25}, {"x":3, "y":4.25}, {"x":0, "y":5.25}, {"x":1, "y":5.25}, {"x":2, "y":5.25}, {"x":3, "y":5.25}]
+ },
+
+ "LAYOUT_numpad_6x4": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":0, "y":1.25}, {"x":1, "y":1.25}, {"x":2, "y":1.25}, {"x":3, "y":1.25}, {"x":0, "y":2.25}, {"x":1, "y":2.25}, {"x":2, "y":2.25}, {"x":0, "y":3.25}, {"x":1, "y":3.25}, {"x":2, "y":3.25}, {"x":3, "y":2.25, "h":2}, {"x":0, "y":4.25}, {"x":1, "y":4.25}, {"x":2, "y":4.25}, {"x":0, "y":5.25, "w":2}, {"x":2, "y":5.25}, {"x":3, "y":4.25, "h":2}]
+ }
+ }
+}
diff --git a/keyboards/tgr/tris/keymaps/default/keymap.c b/keyboards/tgr/tris/keymaps/default/keymap.c
new file mode 100644
index 0000000000..5a4e47a694
--- /dev/null
+++ b/keyboards/tgr/tris/keymaps/default/keymap.c
@@ -0,0 +1,47 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_numpad_6x4(
+ KC_ESC, KC_TAB, MO(1), 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, KC_PDOT, KC_PENT
+ ),
+
+ [1] = LAYOUT_numpad_6x4(
+ KC_TRNS, KC_TRNS, KC_TRNS, MO(2),
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_HOME, KC_UP, KC_PGUP,
+ KC_LEFT, KC_TRNS, KC_RGHT, KC_TRNS,
+ KC_END, KC_DOWN, KC_PGDN,
+ KC_INS, KC_DEL, KC_TRNS
+ ),
+
+ [2] = LAYOUT_numpad_6x4(
+ 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
+ )
+};
diff --git a/keyboards/tgr/tris/keymaps/default/readme.md b/keyboards/tgr/tris/keymaps/default/readme.md
new file mode 100644
index 0000000000..660966577f
--- /dev/null
+++ b/keyboards/tgr/tris/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for tris
diff --git a/keyboards/tgr/tris/keymaps/via/keymap.c b/keyboards/tgr/tris/keymaps/via/keymap.c
new file mode 100644
index 0000000000..bfa8dbc59b
--- /dev/null
+++ b/keyboards/tgr/tris/keymaps/via/keymap.c
@@ -0,0 +1,57 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+#include QMK_KEYBOARD_H
+
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_numpad_6x4(
+ KC_ESC, KC_TAB, MO(1), 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, KC_PDOT, KC_PENT
+ ),
+
+ [1] = LAYOUT_numpad_6x4(
+ KC_TRNS, KC_TRNS, KC_TRNS, MO(2),
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_HOME, KC_UP, KC_PGUP,
+ KC_LEFT, KC_TRNS, KC_RGHT, KC_TRNS,
+ KC_END, KC_DOWN, KC_PGDN,
+ KC_INS, KC_DEL, KC_TRNS
+ ),
+
+ [2] = LAYOUT_numpad_6x4(
+ 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
+ ),
+
+ [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/tgr/tris/keymaps/via/rules.mk b/keyboards/tgr/tris/keymaps/via/rules.mk
new file mode 100644
index 0000000000..7d47e6b726
--- /dev/null
+++ b/keyboards/tgr/tris/keymaps/via/rules.mk
@@ -0,0 +1,4 @@
+VIA_ENABLE = yes
+LTO_ENABLE = yes
+
+EXTRAKEY_ENABLE = no
diff --git a/keyboards/tgr/tris/readme.md b/keyboards/tgr/tris/readme.md
new file mode 100644
index 0000000000..8c3433700b
--- /dev/null
+++ b/keyboards/tgr/tris/readme.md
@@ -0,0 +1,19 @@
+# TGR Tris/Tris CE
+
+A short description of the keyboard/project
+
+* Keyboard Maintainer: [poisonking](https://github.com/halfenergized)
+* Hardware Supported: Tris PCB
+* Hardware Availability: https://geekhack.org/index.php?topic=86221.0
+
+Make example for this keyboard (after setting up your build environment):
+
+ make tris:default
+
+Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
+
+ make tris:default:flash
+
+**Reset Key**: Hold down the key located at top right position, 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/tris/rules.mk b/keyboards/tgr/tris/rules.mk
new file mode 100644
index 0000000000..358ab6dcc8
--- /dev/null
+++ b/keyboards/tgr/tris/rules.mk
@@ -0,0 +1,26 @@
+# 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
+MOUSEKEY_ENABLE = no
+EXTRAKEY_ENABLE = yes
+CONSOLE_ENABLE = no
+COMMAND_ENABLE = yes
+BACKLIGHT_ENABLE = yes
+RGBLIGHT_ENABLE = yes
+WS2812_DRIVER = i2c
+
+LAYOUTS = numpad_6x4 ortho_6x4
diff --git a/keyboards/tgr/tris/tris.c b/keyboards/tgr/tris/tris.c
new file mode 100644
index 0000000000..f354d7a393
--- /dev/null
+++ b/keyboards/tgr/tris/tris.c
@@ -0,0 +1,33 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "tris.h"
+
+void keyboard_pre_init_kb(void) {
+ led_init_ports();
+ keyboard_pre_init_user();
+}
+
+void led_init_ports(void) {
+ setPinOutput(D0);
+}
+
+bool led_update_kb(led_t led_state) {
+ if (led_update_user(led_state)) {
+ writePin(D0, led_state.num_lock);
+ }
+ return true;
+}
diff --git a/keyboards/tgr/tris/tris.h b/keyboards/tgr/tris/tris.h
new file mode 100644
index 0000000000..5ba1865d3b
--- /dev/null
+++ b/keyboards/tgr/tris/tris.h
@@ -0,0 +1,63 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 ___ KC_NO
+
+#define LAYOUT_ortho_6x4( \
+ k00, k01, k02, k03, \
+ k10, k11, k12, k13, \
+ k20, k21, k22, k23, \
+ k30, k31, k32, k33, \
+ k40, k41, k42, k43, \
+ k50, k51, k52, k53 \
+)\
+{ \
+ { k00, k01, k02, k03 }, \
+ { k10, k11, k12, k13 }, \
+ { k20, k21, k22, k23 }, \
+ { k30, k31, k32, k33 }, \
+ { k40, k41, k42, k43 }, \
+ { k50, k51, k52, k53 } \
+}
+
+#define LAYOUT_numpad_6x4( \
+ k00, k01, k02, k03, \
+ k10, k11, k12, k13, \
+ k20, k21, k22, \
+ k30, k31, k32, k33, \
+ k40, k41, k42, \
+ k50, k52, k43 \
+) \
+{ \
+ { k00, k01, k02, k03 }, \
+ { k10, k11, k12, k13 }, \
+ { k20, k21, k22, ___ }, \
+ { k30, k31, k32, k33 }, \
+ { k40, k41, k42, k43 }, \
+ { k50, ___, k52, ___ } \
+}
diff --git a/keyboards/the_royal/liminal/config.h b/keyboards/the_royal/liminal/config.h
index 09b8d501dc..45cb48c4e9 100644
--- a/keyboards/the_royal/liminal/config.h
+++ b/keyboards/the_royal/liminal/config.h
@@ -4,7 +4,7 @@
/* USB Device descriptor parameter */
#define VENDOR_ID 0x4B4B
-#define PRODUCT_ID 0x0002
+#define PRODUCT_ID 0x0003
#define DEVICE_VER 0x0001
#define MANUFACTURER TheRoyalSweatshirt
#define PRODUCT Liminal
diff --git a/keyboards/the_royal/liminal/keymaps/default/keymap.c b/keyboards/the_royal/liminal/keymaps/default/keymap.c
index d9d9497453..dd98661011 100644
--- a/keyboards/the_royal/liminal/keymaps/default/keymap.c
+++ b/keyboards/the_royal/liminal/keymaps/default/keymap.c
@@ -127,7 +127,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};
-uint16_t get_tapping_term(uint16_t keycode) {
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case LT(_LOWER, KC_SPACE):
return 160;
@@ -136,7 +136,7 @@ uint16_t get_tapping_term(uint16_t keycode) {
default:
#ifndef TAPPING_TERM
return 200;
-#else
+#else
return TAPPING_TERM;
#endif
}
diff --git a/keyboards/the_royal/liminal/keymaps/default_iso/keymap.c b/keyboards/the_royal/liminal/keymaps/default_iso/keymap.c
index 3d8debee3d..62ff2b6a5d 100644
--- a/keyboards/the_royal/liminal/keymaps/default_iso/keymap.c
+++ b/keyboards/the_royal/liminal/keymaps/default_iso/keymap.c
@@ -128,7 +128,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
-uint16_t get_tapping_term(uint16_t keycode) {
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case LT(_LOWER, KC_SPACE):
return 160;
diff --git a/keyboards/the_royal/liminal/keymaps/via/keymap.c b/keyboards/the_royal/liminal/keymaps/via/keymap.c
new file mode 100644
index 0000000000..a3aee9121b
--- /dev/null
+++ b/keyboards/the_royal/liminal/keymaps/via/keymap.c
@@ -0,0 +1,57 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+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, MO(3),
+ KC_END, KC_DEL, KC_LGUI, KC_LALT, MO(1), KC_SPACE, KC_CAPS, MO(2), KC_MENU, KC_RCTL
+ ),
+
+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, KC_LPRN, KC_RPRN, KC_DQT, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+LAYOUT_base_kit_all(
+ KC_BSLS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_EQUAL, _______,
+ KC_PIPE, KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PLUS, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LBRC, KC_RBRC, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+LAYOUT_base_kit_all(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_UP, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_RGHT, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DOWN, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ )
+
+};
+
+
+
+void keyboard_post_init_user(void) {
+ layer_state_set_user(layer_state);
+}
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ switch (get_highest_layer(state)) {
+ case 1:
+ rgblight_setrgb (RGB_CORAL);
+ break;
+ case 2:
+ rgblight_setrgb (RGB_RED);
+ break;
+ case 3:
+ 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/via/readme.md b/keyboards/the_royal/liminal/keymaps/via/readme.md
new file mode 100644
index 0000000000..5a1cda6823
--- /dev/null
+++ b/keyboards/the_royal/liminal/keymaps/via/readme.md
@@ -0,0 +1,3 @@
+# The VIA keymap for the Liminal Keyboard
+
+This keymap is for compatibility with the VIA configurator. \ No newline at end of file
diff --git a/keyboards/the_royal/liminal/keymaps/via/rules.mk b/keyboards/the_royal/liminal/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/the_royal/liminal/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/thevankeyboards/minivan/keymaps/like_jis/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/like_jis/keymap.c
index 3d282e182b..509b497802 100644
--- a/keyboards/thevankeyboards/minivan/keymaps/like_jis/keymap.c
+++ b/keyboards/thevankeyboards/minivan/keymaps/like_jis/keymap.c
@@ -114,7 +114,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
#define TAPPING_LAYER_TERM 150 // Custom LT Tapping term
-uint16_t get_tapping_term(uint16_t keycode) {
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_BSLO:
return TAPPING_LAYER_TERM;
diff --git a/keyboards/thevankeyboards/minivan/keymaps/mjt/keymap.c b/keyboards/thevankeyboards/minivan/keymaps/mjt/keymap.c
index 6e22e9e23a..a9d3a802dc 100644
--- a/keyboards/thevankeyboards/minivan/keymaps/mjt/keymap.c
+++ b/keyboards/thevankeyboards/minivan/keymaps/mjt/keymap.c
@@ -99,7 +99,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
stop_all_notes();
- PLAY_NOTE_ARRAY(tone_plover, false, 0);
+ PLAY_SONG(tone_plover);
#endif
layer_off(_NUMSYM);
layer_off(_FKEYS);
@@ -110,7 +110,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
case 7: // LAYERRESET
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_qwerty, false, 0);
+ PLAY_SONG(tone_qwerty);
#endif
layer_off(_NUMSYM);
layer_off(_FKEYS);
@@ -132,7 +132,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
if(record->event.pressed) {
#ifdef AUDIO_ENABLE
stop_all_notes();
- PLAY_NOTE_ARRAY(tone_adjust, false, 0);
+ PLAY_SONG(tone_adjust);
#endif
layer_off(_NUMSYM);
layer_off(_FKEYS);
@@ -166,12 +166,12 @@ void matrix_init_user(void) {
void startup_user()
{
_delay_ms(20); // gets rid of tick
- PLAY_NOTE_ARRAY(tone_startup, false, 0);
+ PLAY_SONG(tone_startup);
}
void shutdown_user()
{
- PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+ PLAY_SONG(tone_goodbye);
_delay_ms(150);
stop_all_notes();
}
@@ -183,6 +183,6 @@ void music_on_user(void)
void music_scale_user(void)
{
- PLAY_NOTE_ARRAY(music_scale, false, 0);
+ PLAY_SONG(music_scale);
}
#endif
diff --git a/keyboards/thevankeyboards/roadkit/keymaps/mjt/keymap.c b/keyboards/thevankeyboards/roadkit/keymaps/mjt/keymap.c
index 18454d5649..db5f6c37c8 100644
--- a/keyboards/thevankeyboards/roadkit/keymaps/mjt/keymap.c
+++ b/keyboards/thevankeyboards/roadkit/keymaps/mjt/keymap.c
@@ -145,7 +145,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case NUMPAD_LOCK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_numpad, false, 0);
+ PLAY_SONG(tone_numpad);
#endif
persistant_default_layer_set(1UL<<_NUMPAD);
}
@@ -154,7 +154,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case NAVIGATION_LOCK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_navigation, false, 0);
+ PLAY_SONG(tone_navigation);
#endif
persistant_default_layer_set(1UL<<_NAVIGATION);
}
@@ -163,7 +163,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
case EXCEL_LOCK:
if (record->event.pressed) {
#ifdef AUDIO_ENABLE
- PLAY_NOTE_ARRAY(tone_excel, false, 0);
+ PLAY_SONG(tone_excel);
#endif
persistant_default_layer_set(1UL<<_EXCEL);
}
diff --git a/keyboards/tkc1800/config.h b/keyboards/tkc1800/config.h
index 5ba40bb35c..9c35699c92 100644
--- a/keyboards/tkc1800/config.h
+++ b/keyboards/tkc1800/config.h
@@ -67,6 +67,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* 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 TKC1800
+//#define QMK_SPEAKER C6
+
/*
* Force NKRO
*
diff --git a/keyboards/tkc1800/i2c.c b/keyboards/tkc1800/i2c.c
deleted file mode 100644
index cd2b835d50..0000000000
--- a/keyboards/tkc1800/i2c.c
+++ /dev/null
@@ -1,166 +0,0 @@
-#include <util/twi.h>
-#include <avr/io.h>
-#include <stdlib.h>
-#include <avr/interrupt.h>
-#include <util/twi.h>
-#include <stdbool.h>
-#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<<TWINT)) && lim < I2C_LOOP_TIMEOUT)
- lim++;
-
- // easier way, but will wait slightly longer
- // _delay_us(100);
-}
-
-// Setup twi to run at 100kHz
-void i2c_master_init(void) {
- // no prescaler
- TWSR = 0;
- // Set TWI clock frequency to SCL_CLOCK. Need TWBR>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<<TWINT) | (1<<TWSTA) | (1<<TWEN);
-
- i2c_delay();
-
- // check that we started successfully
- if ( (TW_STATUS != TW_START) && (TW_STATUS != TW_REP_START))
- return 1;
-
- // send device address
- TWDR = address;
- TWCR = (1<<TWINT) | (1<<TWEN);
-
- i2c_delay();
-
- if ( (TW_STATUS != TW_MT_SLA_ACK) && (TW_STATUS != TW_MR_SLA_ACK) )
- return 1; // slave did not acknowledge
- else
- return 0; // success
-}
-
-
-// Finish the i2c transaction.
-void i2c_master_stop(void) {
- TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
-
- uint16_t lim = 0;
- while(!(TWCR & (1<<TWSTO)) && lim < I2C_LOOP_TIMEOUT)
- lim++;
-}
-
-// Write one byte to the i2c slave.
-// returns 0 => slave ACK
-// 1 => slave NACK
-uint8_t i2c_master_write(uint8_t data) {
- TWDR = data;
- TWCR = (1<<TWINT) | (1<<TWEN);
-
- i2c_delay();
-
- // check if the slave acknowledged us
- return (TW_STATUS == TW_MT_DATA_ACK) ? 0 : 1;
-}
-
-// Read one byte from the i2c slave. If ack=1 the slave is acknowledged,
-// if ack=0 the acknowledge bit is not set.
-// returns: byte read from i2c device
-uint8_t i2c_master_read(int ack) {
- TWCR = (1<<TWINT) | (1<<TWEN) | (ack<<TWEA);
-
- i2c_delay();
- return TWDR;
-}
-
-void i2c_reset_state(void) {
- TWCR = 0;
-}
-
-void i2c_slave_init(uint8_t address) {
- TWAR = address << 0; // slave i2c address
- // TWEN - twi enable
- // TWEA - enable address acknowledgement
- // TWINT - twi interrupt flag
- // TWIE - enable the twi interrupt
- TWCR = (1<<TWIE) | (1<<TWEA) | (1<<TWINT) | (1<<TWEN);
-}
-
-ISR(TWI_vect);
-
-ISR(TWI_vect) {
- uint8_t ack = 1;
- switch(TW_STATUS) {
- case TW_SR_SLA_ACK:
- // this device has been addressed as a slave receiver
- slave_has_register_set = false;
- break;
-
- case TW_SR_DATA_ACK:
- // this device has received data as a slave receiver
- // The first byte that we receive in this transaction sets the location
- // of the read/write location of the slaves memory that it exposes over
- // i2c. After that, bytes will be written at slave_buffer_pos, incrementing
- // slave_buffer_pos after each write.
- if(!slave_has_register_set) {
- slave_buffer_pos = TWDR;
- // don't acknowledge the master if this memory loctaion is out of bounds
- if ( slave_buffer_pos >= 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<<TWIE) | (1<<TWINT) | (ack<<TWEA) | (1<<TWEN);
-}
-
-
-
-#endif
diff --git a/keyboards/tkc1800/i2c.h b/keyboards/tkc1800/i2c.h
deleted file mode 100644
index 2bd7f40968..0000000000
--- a/keyboards/tkc1800/i2c.h
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef I2C_H
-#define I2C_H
-
-#include <stdint.h>
-
-#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/tkc1800/keymaps/default/config.h b/keyboards/tkc1800/keymaps/default/config.h
deleted file mode 100644
index ee142927f3..0000000000
--- a/keyboards/tkc1800/keymaps/default/config.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Copyright 2017 Mathias Andersson <wraul@dbox.se>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#pragma once
-
-#define USE_I2C
-#define SSD1306OLED
-//#define OLED_ROTATE180
-#define SSD1306_ADDRESS 0x3C
-
-// place overrides here
diff --git a/keyboards/tkc1800/keymaps/default/keymap.c b/keyboards/tkc1800/keymaps/default/keymap.c
index 5455934a30..4f4c7f8e9c 100644
--- a/keyboards/tkc1800/keymaps/default/keymap.c
+++ b/keyboards/tkc1800/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 <http://www.gnu.org/licenses/>.
*/
+
#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
* ,-------------------------------------------------------. ,-------------------.
@@ -88,72 +78,29 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
-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;
+#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);
+
+ 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("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<<USB_LED_NUM_LOCK)) ? "NUMLOCK" : " ",
- (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ? "CAPS" : " ",
- (host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) ? "SCLK" : " ");
- matrix_write(&matrix, led);
- matrix_update(&display, &matrix);
+ // Host Keyboard LED Status
+ led_t led_state = host_keyboard_led_state();
+ oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
+ oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false);
+ oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false);
}
+#endif \ No newline at end of file
diff --git a/keyboards/tkc1800/keymaps/smt/config.h b/keyboards/tkc1800/keymaps/smt/config.h
deleted file mode 100644
index ee142927f3..0000000000
--- a/keyboards/tkc1800/keymaps/smt/config.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Copyright 2017 Mathias Andersson <wraul@dbox.se>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#pragma once
-
-#define USE_I2C
-#define SSD1306OLED
-//#define OLED_ROTATE180
-#define SSD1306_ADDRESS 0x3C
-
-// place overrides here
diff --git a/keyboards/tkc1800/keymaps/smt/keymap.c b/keyboards/tkc1800/keymaps/smt/keymap.c
index 9f506b443b..9b6ad80d3a 100644
--- a/keyboards/tkc1800/keymaps/smt/keymap.c
+++ b/keyboards/tkc1800/keymaps/smt/keymap.c
@@ -13,10 +13,8 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+
#include QMK_KEYBOARD_H
-#include "LUFA/Drivers/Peripheral/TWI.h"
-#include "i2c.h"
-#include "ssd1306.h"
// Custom macros
#define CTL_ESC CTL_T(KC_ESC) // Tap for Esc, hold for Ctrl
@@ -32,11 +30,6 @@ enum {
FUNCTION,
};
-//13 characters max without re-writing the "Layer: " format in iota_gfx_task_user()
-static char layer_lookup[][14] = {"Qwerty","Dvorak","Function"};
-
-
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap QWERTY: (Qwerty Layer) Default Layer
* ,-------------------------------------------------------. ,-------------------.
@@ -151,64 +144,34 @@ 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));
- iota_gfx_init(); // turns on the display
- #endif
- #endif
- #ifdef AUDIO_ENABLE
- startup_user();
- #endif
-}
-
-void matrix_scan_user(void) {
- #ifdef SSD1306OLED
- 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;
+#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);
+
+ switch (get_highest_layer(layer_state)) {
+ case QWERTY:
+ oled_write_P(PSTR("Base\n"), false);
+ break;
+ case COLEMAK:
+ oled_write_P(PSTR("Colemak\n"), false);
+ break;
+ case DVORAK:
+ oled_write_P(PSTR("Dvorak\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("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<<USB_LED_NUM_LOCK)) ? "NUMLOCK" : " ",
- (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ? "CAPS" : " ",
- (host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) ? "SCLK" : " ");
- matrix_write(&matrix, led);
- matrix_update(&display, &matrix);
+ // Host Keyboard LED Status
+ led_t led_state = host_keyboard_led_state();
+ oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
+ oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false);
+ oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false);
}
+#endif \ No newline at end of file
diff --git a/keyboards/tkc1800/keymaps/via/keymap.c b/keyboards/tkc1800/keymaps/via/keymap.c
index 5455934a30..76fdf05406 100644
--- a/keyboards/tkc1800/keymaps/via/keymap.c
+++ b/keyboards/tkc1800/keymaps/via/keymap.c
@@ -14,10 +14,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
-#include "LUFA/Drivers/Peripheral/TWI.h"
-#include "i2c.h"
-#include "ssd1306.h"
-
//Layers
@@ -26,13 +22,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
* ,-------------------------------------------------------. ,-------------------.
@@ -88,72 +77,28 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
-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;
+#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);
+
+ 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("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<<USB_LED_NUM_LOCK)) ? "NUMLOCK" : " ",
- (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ? "CAPS" : " ",
- (host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) ? "SCLK" : " ");
- matrix_write(&matrix, led);
- matrix_update(&display, &matrix);
+ // Host Keyboard LED Status
+ led_t led_state = host_keyboard_led_state();
+ oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
+ oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false);
+ oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false);
}
+#endif \ No newline at end of file
diff --git a/keyboards/tkc1800/keymaps/wkl/config.h b/keyboards/tkc1800/keymaps/wkl/config.h
deleted file mode 100644
index ee142927f3..0000000000
--- a/keyboards/tkc1800/keymaps/wkl/config.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Copyright 2017 Mathias Andersson <wraul@dbox.se>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#pragma once
-
-#define USE_I2C
-#define SSD1306OLED
-//#define OLED_ROTATE180
-#define SSD1306_ADDRESS 0x3C
-
-// place overrides here
diff --git a/keyboards/tkc1800/keymaps/wkl/keymap.c b/keyboards/tkc1800/keymaps/wkl/keymap.c
index 6f331c61cc..3c65b61d11 100644
--- a/keyboards/tkc1800/keymaps/wkl/keymap.c
+++ b/keyboards/tkc1800/keymaps/wkl/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 <http://www.gnu.org/licenses/>.
*/
+
#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
* ,-------------------------------------------------------. ,-------------------.
@@ -71,72 +61,28 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
-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;
+#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);
+
+ 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("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<<USB_LED_NUM_LOCK)) ? "NUMLOCK" : " ",
- (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ? "CAPS" : " ",
- (host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) ? "SCLK" : " ");
- matrix_write(&matrix, led);
- matrix_update(&display, &matrix);
+ // Host Keyboard LED Status
+ led_t led_state = host_keyboard_led_state();
+ oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
+ oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false);
+ oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false);
}
+#endif \ No newline at end of file
diff --git a/keyboards/tkc1800/keymaps/yanfali/config.h b/keyboards/tkc1800/keymaps/yanfali/config.h
deleted file mode 100644
index f1390cb03f..0000000000
--- a/keyboards/tkc1800/keymaps/yanfali/config.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Copyright 2017 Mathias Andersson <wraul@dbox.se>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#pragma once
-
-//#define USE_I2C
-//#define SSD1306OLED
-//#define OLED_ROTATE180
-#define SSD1306_ADDRESS 0x3C
-
-// place overrides here
diff --git a/keyboards/tkc1800/keymaps/yanfali/keymap.c b/keyboards/tkc1800/keymaps/yanfali/keymap.c
index 8dad3446de..bbffc2d20b 100644
--- a/keyboards/tkc1800/keymaps/yanfali/keymap.c
+++ b/keyboards/tkc1800/keymaps/yanfali/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 <http://www.gnu.org/licenses/>.
*/
+
#include QMK_KEYBOARD_H
-#include "LUFA/Drivers/Peripheral/TWI.h"
-#include "i2c.h"
-#include "ssd1306.h"
-
//Layers
@@ -26,11 +23,6 @@ enum {
FUNCTION,
};
-//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
* ,-------------------------------------------------------. ,-------------------.
@@ -69,68 +61,28 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
};
-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));
- iota_gfx_init(); // turns on the display
- #endif
- #endif
- #ifdef AUDIO_ENABLE
- startup_user();
- #endif
-}
-
-void matrix_scan_user(void) {
- #ifdef SSD1306OLED
- 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;
+#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);
+
+ 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("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<<USB_LED_NUM_LOCK)) ? "NUMLOCK" : " ",
- (host_keyboard_leds() & (1<<USB_LED_CAPS_LOCK)) ? "CAPS" : " ",
- (host_keyboard_leds() & (1<<USB_LED_SCROLL_LOCK)) ? "SCLK" : " ");
- matrix_write(&matrix, led);
- matrix_update(&display, &matrix);
+ // Host Keyboard LED Status
+ led_t led_state = host_keyboard_led_state();
+ oled_write_P(led_state.num_lock ? PSTR("NUM ") : PSTR(" "), false);
+ oled_write_P(led_state.caps_lock ? PSTR("CAP ") : PSTR(" "), false);
+ oled_write_P(led_state.scroll_lock ? PSTR("SCR ") : PSTR(" "), false);
}
+#endif \ No newline at end of file
diff --git a/keyboards/tkc1800/rules.mk b/keyboards/tkc1800/rules.mk
index 7cc3bbe20b..fa90e99807 100644
--- a/keyboards/tkc1800/rules.mk
+++ b/keyboards/tkc1800/rules.mk
@@ -9,12 +9,13 @@ MCU = at90usb1286
# QMK DFU qmk-dfu
# ATmega32A bootloadHID
# ATmega328P USBasp
-BOOTLOADER = atmel-dfu
+BOOTLOADER = qmk-dfu
# Build Options
# change yes to no to disable
#
-BOOTMAGIC_ENABLE = lite # 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 = no # Console for debug
@@ -29,6 +30,4 @@ 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
-
-SRC = i2c.c \
- ssd1306.c
+OLED_DRIVER_ENABLE = yes \ No newline at end of file
diff --git a/keyboards/tkc1800/tkc1800.c b/keyboards/tkc1800/tkc1800.c
index bc6676846d..4232c97d54 100644
--- a/keyboards/tkc1800/tkc1800.c
+++ b/keyboards/tkc1800/tkc1800.c
@@ -16,6 +16,13 @@
#include "tkc1800.h"
#include "led.h"
+void keyboard_pre_init_kb(void) {
+ setPinInputHigh(D0);
+ setPinInputHigh(D1);
+
+ keyboard_pre_init_user();
+}
+
void matrix_init_kb(void) {
// put your keyboard start-up code here
// runs once when the firmware starts up
diff --git a/keyboards/tokyo60/keymaps/default/keymap.c b/keyboards/tokyo60/keymaps/default/keymap.c
index a3e27bdd81..9139d15bc4 100644
--- a/keyboards/tokyo60/keymaps/default/keymap.c
+++ b/keyboards/tokyo60/keymaps/default/keymap.c
@@ -16,7 +16,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
│Shift│█████│ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │█████│Shift│ Fn │
├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
-│█████│ Gui │ Alt │█████│█████│Space│█████│█████│█████│█████│█████│ Alt │ Gui │█████│█████│
+│█████│ Alt │ Gui │█████│█████│Space│█████│█████│█████│█████│█████│ Gui │ Alt │█████│█████│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
*/
[BL] = LAYOUT_60_hhkb(
diff --git a/keyboards/treadstone32/config.h b/keyboards/treadstone32/config.h
deleted file mode 100644
index b9cd94d4b6..0000000000
--- a/keyboards/treadstone32/config.h
+++ /dev/null
@@ -1,103 +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 <http://www.gnu.org/licenses/>.
-*/
-
-#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 a6363f9b9a..863588c5aa 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 <wakojun@gmail.com>
-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 <http://www.gnu.org/licenses/>.
-*/
+/* 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 <http://www.gnu.org/licenses/>.
+ */
#pragma once
@@ -30,7 +26,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#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 <http://www.gnu.org/licenses/>.
#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 b49e55f27c..791fed059b 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,
//`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------'
@@ -110,7 +110,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};
-uint16_t get_tapping_term(uint16_t keycode) {
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_BSLO:
return TAPPING_LAYER_TERM;
diff --git a/keyboards/treadstone32/keymaps/default/rules.mk b/keyboards/treadstone32/keymaps/default/rules.mk
index 5ca4c52586..882ddd6977 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 a6363f9b9a..863588c5aa 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 <wakojun@gmail.com>
-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 <http://www.gnu.org/licenses/>.
-*/
+/* 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 <http://www.gnu.org/licenses/>.
+ */
#pragma once
@@ -30,7 +26,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#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 <http://www.gnu.org/licenses/>.
#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 891f484469..92518b11a7 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,
//`---------+---------+---------+---------+---------+---------+---------+---------+---------+---------'
@@ -111,7 +111,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};
-uint16_t get_tapping_term(uint16_t keycode) {
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_BSLO:
return TAPPING_LAYER_TERM;
diff --git a/keyboards/treadstone32/keymaps/like_jis/rules.mk b/keyboards/treadstone32/keymaps/like_jis/rules.mk
index 8c4541fa19..882ddd6977 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 0000000000..f7c9b2e0d4
--- /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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 0000000000..a1997feff0
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#include "lite.h"
diff --git a/keyboards/treadstone32/treadstone32.h b/keyboards/treadstone32/lite/lite.h
index 90181124c0..90181124c0 100644
--- a/keyboards/treadstone32/treadstone32.h
+++ b/keyboards/treadstone32/lite/lite.h
diff --git a/keyboards/treadstone32/lite/rules.mk b/keyboards/treadstone32/lite/rules.mk
new file mode 100644
index 0000000000..4bdc53c110
--- /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 989a29c204..99cbe4e014 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 0000000000..caec9c5825
--- /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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 0000000000..bf41abddbe
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#include "rev1.h"
diff --git a/keyboards/treadstone32/rev1/rev1.h b/keyboards/treadstone32/rev1/rev1.h
new file mode 100644
index 0000000000..90181124c0
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 d779e70020..64ca6a7214 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 9d27f86ffe..0000000000
--- 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 <http://www.gnu.org/licenses/>.
- */
-#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/readme.md b/keyboards/treadstone48/readme.md
index eef39c39b3..432ef33fe9 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/keymaps/like_jis_rs/config.h b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/config.h
index 95b58c23db..95b58c23db 100644
--- a/keyboards/treadstone48/keymaps/like_jis_rs/config.h
+++ b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/config.h
diff --git a/keyboards/treadstone48/keymaps/like_jis_rs/keymap.c b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/keymap.c
index 171e034556..171e034556 100644
--- a/keyboards/treadstone48/keymaps/like_jis_rs/keymap.c
+++ b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/keymap.c
diff --git a/keyboards/treadstone48/keymaps/like_jis_rs/readme.md b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme.md
index 796df6c4cd..796df6c4cd 100644
--- a/keyboards/treadstone48/keymaps/like_jis_rs/readme.md
+++ b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme.md
diff --git a/keyboards/treadstone48/keymaps/like_jis_rs/readme_jp.md b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme_jp.md
index 81c5e017ec..81c5e017ec 100644
--- a/keyboards/treadstone48/keymaps/like_jis_rs/readme_jp.md
+++ b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme_jp.md
diff --git a/keyboards/treadstone48/keymaps/like_jis_rs/rules.mk b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/rules.mk
index 7380582ca1..7380582ca1 100644
--- a/keyboards/treadstone48/keymaps/like_jis_rs/rules.mk
+++ b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/rules.mk
diff --git a/keyboards/treadstone48/rev2/config.h b/keyboards/treadstone48/rev2/config.h
new file mode 100644
index 0000000000..fb5011a0be
--- /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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 0000000000..df9e7591b5
--- /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 0000000000..f7e7bc7702
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "rev2.h"
diff --git a/keyboards/treadstone48/rev2/rev2.h b/keyboards/treadstone48/rev2/rev2.h
new file mode 100644
index 0000000000..651468c4a5
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..d29d9074a0
--- /dev/null
+++ b/keyboards/treadstone48/rev2/rules.mk
@@ -0,0 +1 @@
+SPLIT_KEYBOARD = no
diff --git a/keyboards/unikorn/rules.mk b/keyboards/unikorn/rules.mk
index a0ffab2901..93bb0a56eb 100644
--- a/keyboards/unikorn/rules.mk
+++ b/keyboards/unikorn/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = no
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/uranuma/readme.md b/keyboards/uranuma/readme.md
index 3e78fa6fe6..6927b4ace1 100644
--- a/keyboards/uranuma/readme.md
+++ b/keyboards/uranuma/readme.md
@@ -5,7 +5,7 @@ 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)
+* 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):
diff --git a/keyboards/vinta/readme.md b/keyboards/vinta/readme.md
index 278c5e2c4b..a55395197e 100644
--- a/keyboards/vinta/readme.md
+++ b/keyboards/vinta/readme.md
@@ -6,7 +6,7 @@ Vinta
This is an ARM-powered 65% keyboard PCB with USB Mini B connector and breakout for optional RGB underglow.
-Keyboard Maintainer: [Peioris](http://peioris.space/) and on [github](https://github.com/coarse)
+Keyboard Maintainer: [Peioris](http://peioris.space/) and on [GitHub](https://github.com/coarse)
Hardware Supported: Vinta with STM32F042K6T6
Hardware Availability: Private Groupbuy (will post on Reddit once QMK has RGB underglow working)
diff --git a/keyboards/vision_division/keymaps/default/rules.mk b/keyboards/vision_division/keymaps/default/rules.mk
deleted file mode 100644
index ef72559a0c..0000000000
--- a/keyboards/vision_division/keymaps/default/rules.mk
+++ /dev/null
@@ -1 +0,0 @@
-AUDIO_ENABLE = yes
diff --git a/keyboards/vision_division/rules.mk b/keyboards/vision_division/rules.mk
index 5d9d515f7a..789ff97c79 100644
--- a/keyboards/vision_division/rules.mk
+++ b/keyboards/vision_division/rules.mk
@@ -27,4 +27,4 @@ BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality on B7 by d
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
+AUDIO_ENABLE = no # Audio output
diff --git a/keyboards/wheatfield/split75/keymaps/art/keymap.c b/keyboards/wheatfield/split75/keymaps/art/keymap.c
index e540f1cb62..c10059bb7d 100644
--- a/keyboards/wheatfield/split75/keymaps/art/keymap.c
+++ b/keyboards/wheatfield/split75/keymaps/art/keymap.c
@@ -1,17 +1,72 @@
-#include QMK_KEYBOARD_H
+#include <art.h>
+#include <sendstring_workman_zxcvm.h>
-enum layer_names {
- BASE,
- QWERTY_MOD,
- QWERTY,
- WORKMAN,
- MOD,
- MEDIA
+bool is_win = false;
+
+enum custom_keycodes {
+ keyboardSpecificKeyCode = NEW_SAFE_RANGE //not used atm
};
+bool led_update_user(led_t led_state) {
+ writePin(CAPSLOCK_LED_PIN, led_state.caps_lock);
+ return false;
+}
+
+void led_show_current_os(void) {
+ if (is_win) {
+ writePinHigh(NUMLOCK_LED_PIN);
+ wait_ms(50);
+ writePinLow(NUMLOCK_LED_PIN);
+ wait_ms(50);
+ writePinHigh(NUMLOCK_LED_PIN);
+ wait_ms(50);
+ writePinLow(NUMLOCK_LED_PIN);
+ wait_ms(50);
+ writePinHigh(NUMLOCK_LED_PIN);
+ wait_ms(50);
+ writePinLow(NUMLOCK_LED_PIN);
+ wait_ms(50);
+ } else {
+ writePinHigh(SCROLLLOCK_LED_PIN);
+ wait_ms(50);
+ writePinLow(SCROLLLOCK_LED_PIN);
+ wait_ms(50);
+ writePinHigh(SCROLLLOCK_LED_PIN);
+ wait_ms(50);
+ writePinLow(SCROLLLOCK_LED_PIN);
+ wait_ms(50);
+ writePinHigh(SCROLLLOCK_LED_PIN);
+ wait_ms(50);
+ writePinLow(SCROLLLOCK_LED_PIN);
+ wait_ms(50);
+ }
+}
+
+void keyboard_pre_init_user(void) {
+ led_show_current_os();
+
+ 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 MEDIA:
+ writePinHigh(SCROLLLOCK_LED_PIN);
+ case BASE:
+ writePinHigh(NUMLOCK_LED_PIN);
+ break;
+ case NUMPAD:
+ writePinHigh(SCROLLLOCK_LED_PIN);
+ break;
+ }
+ return state;
+}
+
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- /* Base ,-----------------------------------------. ,-----------------------------------------------------.
+ /* 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 |
@@ -22,44 +77,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* |-----+-----| |-----------------------------------------. `-------------------------------------------------+-----|
* | 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 | | | | | | | | | | | | |
+ * | 0 | 1 | | Ctrl | GUI | Alt |Spac/MEDIA | BSPC| | NAV | Alt | NAV | Ctrl | Left| Down|Right|
* `-----------' `---------------------------------------' `-------------------------------------------------------'
*/
- [QWERTY_MOD] = LAYOUT(
-//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
-_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
-_______, _______, _______, KC_MPRV, KC_VOLU, KC_MNXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
-_______, _______, _______, _______, KC_VOLD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
-_______, _______, _______, _______, KC_MUTE, KC_MPLY, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
-_______, _______, TO(QWERTY),_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ [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, LT(CONFIG, KC_PSCR), KC_INS, KC_HOME,
+KC_VOLD,KC_VOLU, 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_MPRV,KC_MNXT, 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_HOME,KC_END, 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,
+DYN_MACRO_PLAY1,MO(STRINGS),KC_LSFT,KC_Z,KC_X,KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, LT(GIT,KC_SLSH), KC_RSFT, KC_UP, KC_PGDN,
+DYN_REC_STOP,DYN_REC_START1,KC_LCTL, KC_LGUI, KC_LALT, LT(MEDIA,KC_SPC), LT(COMBOS,KC_BSPC), LT(NAV, KC_ENTER), KC_RALT, MO(LAYOUT_CHG),KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT
),
- /* QWERTY ,-----------------------------------------. ,-----------------------------------------------------.
+ /* 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 |
@@ -70,68 +101,140 @@ _______, _______, TO(QWERTY),_______, _______, _______, _______,
* |-----+-----| |-----------------------------------------. `-------------------------------------------------+-----|
* | 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|
+ * | 0 | 1 | | Ctrl | GUI | Alt | Space |Space| | Space | Alt |QW_ON| 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,
+ [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, LT(CONFIG, 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_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
+KC_0, KC_1, OS_CTRL, OS_WIN, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, MO(QWERTY_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), _______, _______, _______, _______
+_______, _______, _______, 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, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, TO(QWERTY), _______, _______, _______, _______
),
- /* MOD ,-----------------------------------------. ,-----------------------------------------------------.
- * | | | | | | | | | | | | | | | | | |
- * ,-----------. |-----+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+-----------+-----|
- * | | | | | | | | | | | | | | | | | | | |
- * |-----+-----| |-----------------------------------------' ,--------------------------------------------------+-----|
- * | | | | | | | | | | | | | | | | | | | |
- * |-----+-----| |---------------------------------------. `--------------------------------------------------+-----|
- * | | | | | | | | | | | | | | | | | | |
- * |-----+-----| |-----------------------------------------. `-------------------------------------------------+-----|
- * | | | | | | | | | | | | | | | | | | |
- * |-----+-----| |-----------------------------------------' ,-------------------------------------------+-----+-----|
- * | | | | BASE | | | | | | | | | | | | |
- * `-----------' `---------------------------------------' `-------------------------------------------------------'
- */
- [MOD] = LAYOUT(
+ [NAV] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+KC_8, KC_9, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+KC_6, KC_7, _______, _______, KC_HOME, KC_UP, KC_END, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+KC_4, KC_5, _______, _______, KC_LEFT, KC_DOWN, KC_RIGHT, KC_PGDOWN, _______, CTR_ALT, KC_RSFT, _______, _______, _______, _______, _______,
+KC_2, KC_3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+KC_0, KC_1, _______, _______, _______, KC_DEL, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [MEDIA] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, KC_MPRV, KC_VOLU, KC_MNXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, KC_VOLD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, KC_MUTE, KC_MPLY, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [COMBOS] = 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, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, SARCASM, _______, CTRL_CTV, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, CTRL_CAV, _______, _______, _______, CTRL_LCTV, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [STRINGS] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, TILD_BLOCK, PRESCRIPTION, _______, _______, FOURS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, ADMINS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
-_______, TO(WORKMAN),TO(BASE), KC_MS_ACCEL0,KC_MS_ACCEL1,KC_MS_ACCEL2, _______, _______, _______, _______, _______, _______, _______, _______
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [QWERTY_MOD] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, KC_MPRV, KC_VOLU, KC_MNXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, KC_VOLD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, KC_MUTE, KC_MPLY, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, TO(QWERTY),_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
- /* MEDIA ,-----------------------------------------. ,-----------------------------------------------------.
+ [LAYOUT_CHG] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, CTL_ALT(KC_HOME), CTL_ALT(KC_UP), CTL_ALT(KC_END), CTL_ALT(KC_PGUP), _______, _______,_______, _______,_______,_______,_______, _______, _______,
+_______, _______, _______, _______, CTL_ALT(KC_LEFT), CTL_ALT(KC_DOWN), CTL_ALT(KC_RIGHT), CTL_ALT(KC_PGDOWN), _______,_______,_______,_______,_______, _______, _______, _______,
+_______, _______, TO(WORKMAN), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+TO(NUMPAD), TO(NUMPAD), TO(BASE), _______, _______, _______, CTL_ALT(KC_BSPC), KC_LSFT, _______, _______, _______, _______, _______, _______
+ ),
+
+ [CONFIG] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+RGB_VAI, RGB_VAD, RGB_MODE_PLAIN, RGB_MODE_BREATHE, RGB_MODE_RAINBOW, RGB_MODE_SWIRL, RGB_MODE_SNAKE, RGB_MODE_KNIGHT, RGB_MODE_XMAS, RGB_MODE_GRADIENT, RGB_MODE_RGBTEST, XXXXXXX, XXXXXXX, _______, _______, _______, _______,
+RGB_SAI, RGB_SAD, _______, _______, _______, _______, _______, _______, _______, _______, _______, TOG_OS, _______, _______, _______, _______, _______,
+RGB_HUI, RGB_HUD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+RGB_MOD, RGB_RMOD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+RGB_TOG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [NUMPAD] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+KC_8, KC_9, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+KC_6, KC_7, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+KC_4, KC_5, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+KC_2, KC_3, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+KC_0, KC_1, _______, _______, _______, _______, _______, _______, _______, TO(QWERTY),_______, _______, _______, _______
+ ),
+
+ [GIT] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, G_DIFF, G_RST, _______, G_BRCH, _______, G_FTCH, _______, G_P, _______, _______, _______, _______, _______,
+_______, _______, _______, G_ADD, G_S, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, G_C, _______, G_MERG, _______, G_LOG, _______, G_DEV, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+ [GIT_C] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ 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, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, G_CHEC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, G_COMM, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX,
+XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BSPC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+ ),
+
+ [GIT_S] = LAYOUT(
+//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ 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, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, G_STSH, G_SHOW, G_STAT, 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, KC_BSPC, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
+ ),
+
+ /* ,-----------------------------------------. ,-----------------------------------------------------.
* | | | | | | | | | | | | | | | | | |
* ,-----------. |-----+-----+-----+-----+-----+-----+-----| |-----+-----+-----+-----+-----+-----+-----------+-----|
* | | | | | | | | | | | | | | | | | | | |
@@ -140,50 +243,25 @@ _______, TO(WORKMAN),TO(BASE), KC_MS_ACCEL0,KC_MS_ACCEL1,KC_MS_ACCEL2, _______,
* |-----+-----| |---------------------------------------. `--------------------------------------------------+-----|
* | | | | | | | | | | | | | | | | | | |
* |-----+-----| |-----------------------------------------. `-------------------------------------------------+-----|
- * | | | | | | | Play| | | | | | | | | | | |
+ * | | | | | | | | | | | | | | | | | | |
* |-----+-----| |-----------------------------------------' ,-------------------------------------------+-----+-----|
- * | | | | BASE | | | | | | | | | | | | |
+ * | | | | | | | | | | | | | | | | |
* `-----------' `---------------------------------------' `-------------------------------------------------------'
*/
- [MEDIA] = LAYOUT(
-//--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
-_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
-_______, _______, _______, KC_MPRV, KC_VOLU, KC_MNXT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
-_______, _______, _______, _______, KC_VOLD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
-_______, _______, _______, _______, KC_MUTE, KC_MPLY, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
-_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
- )
+ // [] = LAYOUT(
+// //--------------------------------Left Hand-----------------------------------------------| |--------------------------------Right Hand------------------------------------------------
+ // _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+// _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ // ),
};
-bool led_update_user(led_t led_state) {
- writePin(CAPSLOCK_LED_PIN, led_state.caps_lock);
- return false;
-}
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
-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;
-}
+ }
+ return true;
+} \ No newline at end of file
diff --git a/keyboards/wheatfield/split75/keymaps/art/rules.mk b/keyboards/wheatfield/split75/keymaps/art/rules.mk
new file mode 100644
index 0000000000..5f8cb68ad0
--- /dev/null
+++ b/keyboards/wheatfield/split75/keymaps/art/rules.mk
@@ -0,0 +1 @@
+DYNAMIC_MACRO_ENABLE = yes \ No newline at end of file
diff --git a/keyboards/wheatfield/split75/keymaps/default/keymap.c b/keyboards/wheatfield/split75/keymaps/default/keymap.c
index 069eb6bd10..30057f881a 100644
--- a/keyboards/wheatfield/split75/keymaps/default/keymap.c
+++ b/keyboards/wheatfield/split75/keymaps/default/keymap.c
@@ -1,6 +1,8 @@
#include QMK_KEYBOARD_H
-#define BASE 0
+enum layer_names {
+ BASE
+};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
diff --git a/keyboards/wheatfield/split75/rules.mk b/keyboards/wheatfield/split75/rules.mk
index e90f5f4394..a13911595a 100644
--- a/keyboards/wheatfield/split75/rules.mk
+++ b/keyboards/wheatfield/split75/rules.mk
@@ -23,8 +23,6 @@ BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
WS2812_DRIVER = i2c
-OPT_DEFS = -DDEBUG_LEVEL=0
-
# custom matrix setup
CUSTOM_MATRIX = lite
SRC = matrix.c
diff --git a/keyboards/whitefox/keymaps/konstantin/rules.mk b/keyboards/whitefox/keymaps/konstantin/rules.mk
index c39175c979..111c0faba6 100644
--- a/keyboards/whitefox/keymaps/konstantin/rules.mk
+++ b/keyboards/whitefox/keymaps/konstantin/rules.mk
@@ -1,12 +1,18 @@
-BACKLIGHT_ENABLE = no
+# Generic features
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
TAP_DANCE_ENABLE = yes
UNICODEMAP_ENABLE = yes
+
+# Keyboard-specific features
+BACKLIGHT_ENABLE = no
VISUALIZER_ENABLE = no
+
+# Firmware size reduction
+GRAVE_ESC_ENABLE = no
+MAGIC_ENABLE = no
+SPACE_CADET_ENABLE = no
diff --git a/keyboards/wilba_tech/wt60_c/config.h b/keyboards/wilba_tech/wt60_c/config.h
new file mode 100644
index 0000000000..44491e128c
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_c/config.h
@@ -0,0 +1,119 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..9567d517e8
--- /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 0000000000..cba25bb8fa
--- /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 0000000000..cba25bb8fa
--- /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 0000000000..1e5b99807c
--- /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 0000000000..ea72c1cd0e
--- /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 0000000000..50faab968c
--- /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 0000000000..9b1cfe46e5
--- /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 0000000000..2b5fe7fe11
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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_xt/config.h b/keyboards/wilba_tech/wt60_xt/config.h
new file mode 100644
index 0000000000..410245cebd
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_xt/config.h
@@ -0,0 +1,183 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x6582 // wilba.tech
+#define PRODUCT_ID 0x001C // PCB #28
+#define DEVICE_VER 0x0001
+#define MANUFACTURER wilba.tech
+#define PRODUCT wilba.tech WT60-XT
+#define DESCRIPTION wilba.tech WT60-XT
+
+#define C6_AUDIO
+#define AUDIO_CLICKY
+
+/* 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 { F0, E6, F4, F6, F7 }
+#define MATRIX_COL_PINS { B7, B0, F5, D5, B1, B2, B3, D3, D2, C7, B6, B5, B4, D7, D6, D4 }
+#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
+
+/*
+ * 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
diff --git a/keyboards/wilba_tech/wt60_xt/info.json b/keyboards/wilba_tech/wt60_xt/info.json
new file mode 100644
index 0000000000..ed4a2ce016
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_xt/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "wilba.tech WT60-XT",
+ "url": "https://wilba.tech",
+ "maintainer": "Wilba",
+ "width": 17.25,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [{"x":0, "y":0}, {"x":1, "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":13.25, "y":0}, {"x":14.25, "y":0}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":2.25, "y":1, "w":1.5}, {"x":3.75, "y":1}, {"x":4.75, "y":1}, {"x":5.75, "y":1}, {"x":6.75, "y":1}, {"x":7.75, "y":1}, {"x":8.75, "y":1}, {"x":9.75, "y":1}, {"x":10.75, "y":1}, {"x":11.75, "y":1}, {"x":12.75, "y":1}, {"x":13.75, "y":1}, {"x":14.75, "y":1}, {"x":15.75, "y":1, "w":1.5}, {"x":0, "y":2}, {"x":1, "y":2}, {"x":2.25, "y":2, "w":1.75}, {"x":4, "y":2}, {"x":5, "y":2}, {"x":6, "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":13, "y":2}, {"x":14, "y":2}, {"x":15, "y":2, "w":2.25}, {"x":0, "y":3}, {"x":1, "y":3}, {"x":2.25, "y":3, "w":1.25}, {"x":3.5, "y":3}, {"x":4.5, "y":3}, {"x":5.5, "y":3}, {"x":6.5, "y":3}, {"x":7.5, "y":3}, {"x":8.5, "y":3}, {"x":9.5, "y":3}, {"x":10.5, "y":3}, {"x":11.5, "y":3}, {"x":12.5, "y":3}, {"x":13.5, "y":3}, {"x":14.5, "y":3, "w":1.75}, {"x":16.25, "y":3}, {"x":0, "y":4}, {"x":1, "y":4}, {"x":2.25, "y":4, "w":1.25}, {"x":3.5, "y":4, "w":1.25}, {"x":4.75, "y":4, "w":1.25}, {"x":6, "y":4, "w":6.25}, {"x":12.25, "y":4, "w":1.25}, {"x":13.5, "y":4, "w":1.25}, {"x":14.75, "y":4, "w":1.25}, {"x":16, "y":4, "w":1.25}]
+ }
+ }
+}
diff --git a/keyboards/wilba_tech/wt60_xt/keymaps/default/keymap.c b/keyboards/wilba_tech/wt60_xt/keymaps/default/keymap.c
new file mode 100644
index 0000000000..7373f42773
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_xt/keymaps/default/keymap.c
@@ -0,0 +1,38 @@
+// Default layout for WT60-XT
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+// Default layer
+[0] = LAYOUT_all(
+ KC_F1, KC_F2, 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_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_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_ENT,
+ KC_F7, KC_F8, 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, MO(1),
+ KC_F9, KC_F10, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL),
+
+// Fn1 Layer
+[1] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, 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_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_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, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+};
diff --git a/keyboards/wilba_tech/wt60_xt/keymaps/via/keymap.c b/keyboards/wilba_tech/wt60_xt/keymaps/via/keymap.c
new file mode 100644
index 0000000000..7373f42773
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_xt/keymaps/via/keymap.c
@@ -0,0 +1,38 @@
+// Default layout for WT60-XT
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+// Default layer
+[0] = LAYOUT_all(
+ KC_F1, KC_F2, 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_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_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_ENT,
+ KC_F7, KC_F8, 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, MO(1),
+ KC_F9, KC_F10, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL),
+
+// Fn1 Layer
+[1] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, 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_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_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, 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, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+};
diff --git a/keyboards/wilba_tech/wt60_xt/keymaps/via/rules.mk b/keyboards/wilba_tech/wt60_xt/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_xt/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/wilba_tech/wt60_xt/readme.md b/keyboards/wilba_tech/wt60_xt/readme.md
new file mode 100644
index 0000000000..1b8d706c33
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_xt/readme.md
@@ -0,0 +1,17 @@
+# wilba.tech WT60-XT
+
+![wilba.tech WT60-XT](https://ionkeyboards.com/data/_uploaded/image/jubi_a.jpg)
+
+WT60-XT is a keyboard PCB supporting 60% layout with left side macro keys. [More info at wilba.tech](https://wilba.tech/)
+
+First produced as WT60-XT JUBI for ION Keyboards JUBI.
+
+* Keyboard Maintainer: [Wilba6582](https://github.com/Wilba6582)
+* Hardware Supported: wilba.tech WT60-XT
+* Hardware Availability: Custom keyboard group buys
+
+Make example for this keyboard (after setting up your build environment):
+
+ make wilba_tech/wt60_xt: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/wilba_tech/wt60_xt/rules.mk b/keyboards/wilba_tech/wt60_xt/rules.mk
new file mode 100644
index 0000000000..a272caf2d1
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_xt/rules.mk
@@ -0,0 +1,31 @@
+# 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
+MIDI_ENABLE = no # MIDI support
+UNICODE_ENABLE = no # Unicode
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = yes # Audio output on port C6
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
diff --git a/keyboards/wilba_tech/wt60_xt/wt60_xt.c b/keyboards/wilba_tech/wt60_xt/wt60_xt.c
new file mode 100644
index 0000000000..1f4cb96987
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_xt/wt60_xt.c
@@ -0,0 +1,100 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include "wt60_xt.h"
+
+#ifdef AUDIO_ENABLE
+#include "audio.h"
+#include "song_list.h"
+
+float tone_caps_on[][2] = SONG(CAPS_LOCK_ON_SOUND);
+float tone_caps_off[][2] = SONG(CAPS_LOCK_OFF_SOUND);
+float tone_numlk_on[][2] = SONG(NUM_LOCK_ON_SOUND);
+float tone_numlk_off[][2] = SONG(NUM_LOCK_OFF_SOUND);
+float tone_scroll_on[][2] = SONG(SCROLL_LOCK_ON_SOUND);
+float tone_scroll_off[][2] = SONG(SCROLL_LOCK_OFF_SOUND);
+
+#endif
+
+// We want to enable audio clicky (i.e. compile it into firmware),
+// but not have it "turned on" by default.
+#ifdef AUDIO_CLICKY
+
+#include "process_clicky.h"
+extern audio_config_t audio_config;
+
+void eeconfig_init_kb(void) {
+ // Reset Keyboard EEPROM value to blank, rather than to a set value
+ eeconfig_update_kb(0);
+
+ // Need to read here because this isn't done before calling eeconfig_init_kb()
+ audio_config.raw = eeconfig_read_audio();
+ // ...and this call needs audio_config initialized.
+ clicky_off();
+
+ eeconfig_init_user();
+}
+#endif // AUDIO_CLICKY
+
+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);
+ }
+
+#ifdef AUDIO_ENABLE
+ static led_t old_led_state = { .raw = 0 };
+
+ wait_ms(10); // gets rid of tick
+
+ if (!is_playing_notes())
+ {
+ if (led_state.caps_lock && !old_led_state.caps_lock)
+ {
+ PLAY_SONG(tone_caps_on);
+ }
+ else if (!led_state.caps_lock && old_led_state.caps_lock)
+ {
+ PLAY_SONG(tone_caps_off);
+ }
+ else if (led_state.num_lock && !old_led_state.num_lock)
+ {
+ PLAY_SONG(tone_numlk_on);
+ }
+ else if (!led_state.num_lock && old_led_state.num_lock)
+ {
+ PLAY_SONG(tone_numlk_off);
+ }
+ else if (led_state.scroll_lock && !old_led_state.scroll_lock)
+ {
+ PLAY_SONG(tone_scroll_on);
+ }
+ else if (!led_state.scroll_lock && old_led_state.scroll_lock)
+ {
+ PLAY_SONG(tone_scroll_off);
+ }
+ }
+
+ old_led_state = led_state;
+#endif // AUDIO_ENABLE
+
+ return true;
+}
diff --git a/keyboards/wilba_tech/wt60_xt/wt60_xt.h b/keyboards/wilba_tech/wt60_xt/wt60_xt.h
new file mode 100644
index 0000000000..7b1f8ba354
--- /dev/null
+++ b/keyboards/wilba_tech/wt60_xt/wt60_xt.h
@@ -0,0 +1,35 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+#define ____ KC_NO
+
+#define LAYOUT_all( \
+ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, K015, K215, \
+ 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, K214, \
+ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, \
+ K400, K401, K402, K403, K404, K408, K412, K413, K414, K415 \
+) { \
+ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, K012, K013, K014, 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, K214, K215 }, \
+ { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315 }, \
+ { K400, K401, K402, K403, K404, ____, ____, ____, K408, ____, ____, ____, K412, K413, K414, K415 } \
+}
diff --git a/keyboards/wilba_tech/wt80_bc/config.h b/keyboards/wilba_tech/wt80_bc/config.h
new file mode 100644
index 0000000000..d0d5762f52
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..34bee2dc14
--- /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 0000000000..3e6b4546db
--- /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 0000000000..3e6b4546db
--- /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 0000000000..1e5b99807c
--- /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 0000000000..aa995a754f
--- /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 0000000000..4aa749422c
--- /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 0000000000..1245a2fd0a
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+// 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 0000000000..0b0d38b486
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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/zeal60/readme.md b/keyboards/wilba_tech/zeal60/readme.md
index 21d55af39b..2ae2787b72 100644
--- a/keyboards/wilba_tech/zeal60/readme.md
+++ b/keyboards/wilba_tech/zeal60/readme.md
@@ -5,7 +5,7 @@ Zeal60
This is a 60% PCB with per-key RGB LEDs and supports ANSI, ISO, winkey/winkeyless bottom row, HHKB-layout (split right shift and backspace).
-Keyboard Maintainer: [Wilba](http://wilba.tech/) and on [github](https://github.com/Wilba6582)
+Keyboard Maintainer: [Wilba](http://wilba.tech/) and on [GitHub](https://github.com/Wilba6582)
Hardware Supported: Zeal60 PCB Rev 0-3
Hardware Availability: https://zealpc.net/collections/group-buy-pre-orders/products/zeal60rgb
diff --git a/keyboards/wilba_tech/zeal65/readme.md b/keyboards/wilba_tech/zeal65/readme.md
index 7441480384..63ff6abc36 100644
--- a/keyboards/wilba_tech/zeal65/readme.md
+++ b/keyboards/wilba_tech/zeal65/readme.md
@@ -5,7 +5,7 @@ Zeal65
This is a 65% PCB with per-key RGB LEDs and supports fixed, 1800-like bottom row and split backspace. It was designed for the Zephyr custom keyboard.
-Keyboard Maintainer: [Wilba](http://wilba.tech/) and on [github](https://github.com/Wilba6582)
+Keyboard Maintainer: [Wilba](http://wilba.tech/) and on [GitHub](https://github.com/Wilba6582)
Hardware Supported: Zeal65 PCB Rev 1
Hardware Availability: https://zealpc.net/collections/group-buy-pre-orders/products/zephyr
diff --git a/keyboards/winkeyless/bface/rules.mk b/keyboards/winkeyless/bface/rules.mk
index 84eace5ed6..3d51be1133 100644
--- a/keyboards/winkeyless/bface/rules.mk
+++ b/keyboards/winkeyless/bface/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/winkeyless/bmini/rules.mk b/keyboards/winkeyless/bmini/rules.mk
index fd340f04eb..20f0222c11 100644
--- a/keyboards/winkeyless/bmini/rules.mk
+++ b/keyboards/winkeyless/bmini/rules.mk
@@ -20,5 +20,3 @@ COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
RGBLIGHT_ENABLE = yes
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/winkeyless/bminiex/rules.mk b/keyboards/winkeyless/bminiex/rules.mk
index df7124400f..f44b7fe858 100644
--- a/keyboards/winkeyless/bminiex/rules.mk
+++ b/keyboards/winkeyless/bminiex/rules.mk
@@ -25,5 +25,3 @@ TAP_DANCE_ENABLE = no
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/wolfmarkclub/wm1/bootloader_defs.h b/keyboards/wolfmarkclub/wm1/bootloader_defs.h
new file mode 100644
index 0000000000..393d70fdc6
--- /dev/null
+++ b/keyboards/wolfmarkclub/wm1/bootloader_defs.h
@@ -0,0 +1,11 @@
+/* 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_dir>/tmk_core/tool/chibios/ch-bootloader-jump.patch
+ */
+
+// STM32F103 does not have a USB bootloader in ROM -- the WM1
+// has a usermode USB mass storage device bootloader at the normal
+// boot address -- `0x08000000`.
+#define STM32_BOOTLOADER_ADDRESS 0x80000000
diff --git a/keyboards/wolfmarkclub/wm1/chconf.h b/keyboards/wolfmarkclub/wm1/chconf.h
new file mode 100644
index 0000000000..f5e471640c
--- /dev/null
+++ b/keyboards/wolfmarkclub/wm1/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 100000
+#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 0
+#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 TRUE
+#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 TRUE
+#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/wolfmarkclub/wm1/config.h b/keyboards/wolfmarkclub/wm1/config.h
new file mode 100644
index 0000000000..d014fdcf8a
--- /dev/null
+++ b/keyboards/wolfmarkclub/wm1/config.h
@@ -0,0 +1,80 @@
+/*
+Copyright 2015 Jun Wako <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x2B29
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Wolfmark Club
+#define PRODUCT WM1
+#define DESCRIPTION Ergo 65%
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 15
+
+// 0 1 2 3 4 5 6 7 8 9 A B C D E
+#define MATRIX_ROW_PINS { C4, A7, A6, A5, A4 }
+#define MATRIX_COL_PINS { B10, B11, B12, B13, B14, B15, C6, C10, C11, C12, D2, B5, B6, B7, B8 }
+
+#define DIODE_DIRECTION COL2ROW
+
+/* number of backlight levels */
+// #define BACKLIGHT_PIN A2
+// #ifdef BACKLIGHT_PIN
+// #define BACKLIGHT_LEVELS 5
+// #endif
+
+#define RGB_DI_PIN A3
+#ifdef RGB_DI_PIN
+#define RGBLED_NUM 18
+#define RGBLIGHT_ANIMATIONS
+#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 */
+#endif
+/* 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
+
+/*
+ * 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/wolfmarkclub/wm1/halconf.h b/keyboards/wolfmarkclub/wm1/halconf.h
new file mode 100644
index 0000000000..ff5ae7e8a5
--- /dev/null
+++ b/keyboards/wolfmarkclub/wm1/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/wolfmarkclub/wm1/info.json b/keyboards/wolfmarkclub/wm1/info.json
new file mode 100644
index 0000000000..651d0d5e97
--- /dev/null
+++ b/keyboards/wolfmarkclub/wm1/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "Wolfmark Club WM1",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 18.25,
+ "height": 5.25,
+ "layouts": {
+ "LAYOUT": {
+ "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":8.75, "y":0}, {"x":9.75, "y":0}, {"x":10.75, "y":0}, {"x":11.75, "y":0}, {"x":12.75, "y":0}, {"x":13.75, "y":0}, {"x":14.75, "y":0}, {"x":15.75, "y":0}, {"x":17, "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":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":13.25, "y":1}, {"x":14.25, "y":1}, {"x":15.25, "y":1, "w":1.5}, {"x":17, "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":8.5, "y":2}, {"x":9.5, "y":2}, {"x":10.5, "y":2}, {"x":11.5, "y":2}, {"x":12.5, "y":2}, {"x":13.5, "y":2}, {"x":14.5, "y":2, "w":2.25}, {"x":17, "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":8, "y":3}, {"x":9, "y":3}, {"x":10, "y":3}, {"x":11, "y":3}, {"x":12, "y":3}, {"x":13, "y":3}, {"x":14, "y":3, "w":1.75}, {"x":16.25, "y":3.25}, {"x":0, "y":4, "w":1.5}, {"x":3, "y":4, "w":1.5}, {"x":4.5, "y":4, "w":2}, {"x":6.5, "y":4}, {"x":8, "y":4, "w":2.75}, {"x":10.75, "y":4, "w":1.5}, {"x":13.25, "y":4, "w":1.5}, {"x":15.25, "y":4.25}, {"x":16.25, "y":4.25}, {"x":17.25, "y":4.25}]
+ }
+ }
+} \ No newline at end of file
diff --git a/keyboards/wolfmarkclub/wm1/keymaps/default/keymap.c b/keyboards/wolfmarkclub/wm1/keymaps/default/keymap.c
new file mode 100644
index 0000000000..83e9ac21a7
--- /dev/null
+++ b/keyboards/wolfmarkclub/wm1/keymaps/default/keymap.c
@@ -0,0 +1,17 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+[0] = 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_GRV, 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_BSPC, KC_END,
+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, MO(1),
+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_UP,
+KC_LCTL, KC_LALT,KC_LGUI,KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+[1] = 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, _______, _______, _______,
+RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+_______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
+}; \ No newline at end of file
diff --git a/keyboards/wolfmarkclub/wm1/ld/wm1_f103.ld b/keyboards/wolfmarkclub/wm1/ld/wm1_f103.ld
new file mode 100644
index 0000000000..41362282bc
--- /dev/null
+++ b/keyboards/wolfmarkclub/wm1/ld/wm1_f103.ld
@@ -0,0 +1,88 @@
+/*
+ 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.
+*/
+
+/*
+ * STM32F103xC memory setup for use with the WM1 mass-storage device bootloader.
+ * You will have to change:
+ * OPT_DEFS = -DCORTEX_VTOR_INIT=0x10000
+ * in your board's rules.mk
+ */
+MEMORY
+{
+ flash0 : org = 0x08010000, len = 256k - 0x10000
+ flash1 : org = 0x00000000, len = 0
+ flash2 : org = 0x00000000, len = 0
+ flash3 : org = 0x00000000, len = 0
+ flash4 : org = 0x00000000, len = 0
+ flash5 : org = 0x00000000, len = 0
+ flash6 : org = 0x00000000, len = 0
+ flash7 : org = 0x00000000, len = 0
+ ram0 : org = 0x20000000, len = 48k
+ ram1 : org = 0x00000000, len = 0
+ ram2 : org = 0x00000000, len = 0
+ ram3 : org = 0x00000000, len = 0
+ ram4 : org = 0x00000000, len = 0
+ ram5 : org = 0x00000000, len = 0
+ ram6 : org = 0x00000000, len = 0
+ ram7 : org = 0x00000000, len = 0
+}
+
+/* For each data/text section two region are defined, a virtual region
+ and a load region (_LMA suffix).*/
+
+/* Flash region to be used for exception vectors.*/
+REGION_ALIAS("VECTORS_FLASH", flash0);
+REGION_ALIAS("VECTORS_FLASH_LMA", flash0);
+
+/* Flash region to be used for constructors and destructors.*/
+REGION_ALIAS("XTORS_FLASH", flash0);
+REGION_ALIAS("XTORS_FLASH_LMA", flash0);
+
+/* Flash region to be used for code text.*/
+REGION_ALIAS("TEXT_FLASH", flash0);
+REGION_ALIAS("TEXT_FLASH_LMA", flash0);
+
+/* Flash region to be used for read only data.*/
+REGION_ALIAS("RODATA_FLASH", flash0);
+REGION_ALIAS("RODATA_FLASH_LMA", flash0);
+
+/* Flash region to be used for various.*/
+REGION_ALIAS("VARIOUS_FLASH", flash0);
+REGION_ALIAS("VARIOUS_FLASH_LMA", flash0);
+
+/* Flash region to be used for RAM(n) initialization data.*/
+REGION_ALIAS("RAM_INIT_FLASH_LMA", flash0);
+
+/* RAM region to be used for Main stack. This stack accommodates the processing
+ of all exceptions and interrupts.*/
+REGION_ALIAS("MAIN_STACK_RAM", ram0);
+
+/* RAM region to be used for the process stack. This is the stack used by
+ the main() function.*/
+REGION_ALIAS("PROCESS_STACK_RAM", ram0);
+
+/* RAM region to be used for data segment.*/
+REGION_ALIAS("DATA_RAM", ram0);
+REGION_ALIAS("DATA_RAM_LMA", flash0);
+
+/* RAM region to be used for BSS segment.*/
+REGION_ALIAS("BSS_RAM", ram0);
+
+/* RAM region to be used for the default heap.*/
+REGION_ALIAS("HEAP_RAM", ram0);
+
+/* Generic rules inclusion.*/
+INCLUDE rules.ld
diff --git a/keyboards/wolfmarkclub/wm1/mcuconf.h b/keyboards/wolfmarkclub/wm1/mcuconf.h
new file mode 100644
index 0000000000..a645d3c5d5
--- /dev/null
+++ b/keyboards/wolfmarkclub/wm1/mcuconf.h
@@ -0,0 +1,209 @@
+/*
+ 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_
+
+#define STM32F103_MCUCONF
+
+/*
+ * STM32F103 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:
+ * 15...0 Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3 Lowest...Highest.
+ */
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT FALSE
+#define STM32_HSI_ENABLED TRUE
+#define STM32_LSI_ENABLED FALSE
+#define STM32_HSE_ENABLED TRUE
+#define STM32_LSE_ENABLED FALSE
+#define STM32_SW STM32_SW_PLL
+#define STM32_PLLSRC STM32_PLLSRC_HSE
+#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1
+#define STM32_PLLMUL_VALUE 9
+#define STM32_HPRE STM32_HPRE_DIV1
+#define STM32_PPRE1 STM32_PPRE1_DIV2
+#define STM32_PPRE2 STM32_PPRE2_DIV2
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_USB_CLOCK_REQUIRED TRUE
+#define STM32_USBPRE STM32_USBPRE_DIV1P5
+#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK
+#define STM32_RTCSEL STM32_RTCSEL_HSEDIV
+#define STM32_PVD_ENABLE FALSE
+#define STM32_PLS STM32_PLS_LEV0
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_USE_ADC1 FALSE
+#define STM32_ADC_ADC1_DMA_PRIORITY 2
+#define STM32_ADC_ADC1_IRQ_PRIORITY 6
+
+/*
+ * CAN driver system settings.
+ */
+#define STM32_CAN_USE_CAN1 FALSE
+#define STM32_CAN_CAN1_IRQ_PRIORITY 11
+
+/*
+ * EXT driver system settings.
+ */
+#define STM32_EXT_EXTI0_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI1_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI2_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI3_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI4_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI16_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI17_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI18_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI19_IRQ_PRIORITY 6
+
+/*
+ * 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_TIM4 FALSE
+#define STM32_GPT_USE_TIM5 FALSE
+#define STM32_GPT_USE_TIM8 FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY 7
+#define STM32_GPT_TIM2_IRQ_PRIORITY 7
+#define STM32_GPT_TIM3_IRQ_PRIORITY 7
+#define STM32_GPT_TIM4_IRQ_PRIORITY 7
+#define STM32_GPT_TIM5_IRQ_PRIORITY 7
+#define STM32_GPT_TIM8_IRQ_PRIORITY 7
+
+/*
+ * 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 5
+#define STM32_I2C_I2C2_IRQ_PRIORITY 5
+#define STM32_I2C_I2C1_DMA_PRIORITY 3
+#define STM32_I2C_I2C2_DMA_PRIORITY 3
+#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_USE_TIM4 FALSE
+#define STM32_ICU_USE_TIM5 FALSE
+#define STM32_ICU_USE_TIM8 FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY 7
+#define STM32_ICU_TIM2_IRQ_PRIORITY 7
+#define STM32_ICU_TIM3_IRQ_PRIORITY 7
+#define STM32_ICU_TIM4_IRQ_PRIORITY 7
+#define STM32_ICU_TIM5_IRQ_PRIORITY 7
+#define STM32_ICU_TIM8_IRQ_PRIORITY 7
+
+/*
+ * PWM driver system settings.
+ */
+#define STM32_PWM_USE_ADVANCED FALSE
+#define STM32_PWM_USE_TIM1 FALSE
+#define STM32_PWM_USE_TIM2 TRUE
+#define STM32_PWM_USE_TIM3 FALSE
+#define STM32_PWM_USE_TIM4 FALSE
+#define STM32_PWM_USE_TIM5 FALSE
+#define STM32_PWM_USE_TIM8 FALSE
+#define STM32_PWM_TIM1_IRQ_PRIORITY 7
+#define STM32_PWM_TIM2_IRQ_PRIORITY 7
+#define STM32_PWM_TIM3_IRQ_PRIORITY 7
+#define STM32_PWM_TIM4_IRQ_PRIORITY 7
+#define STM32_PWM_TIM5_IRQ_PRIORITY 7
+#define STM32_PWM_TIM8_IRQ_PRIORITY 7
+
+/*
+ * RTC driver system settings.
+ */
+#define STM32_RTC_IRQ_PRIORITY 15
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1 FALSE
+#define STM32_SERIAL_USE_USART2 FALSE
+#define STM32_SERIAL_USE_USART3 FALSE
+#define STM32_SERIAL_USE_UART4 FALSE
+#define STM32_SERIAL_USE_UART5 FALSE
+#define STM32_SERIAL_USART1_PRIORITY 12
+#define STM32_SERIAL_USART2_PRIORITY 12
+#define STM32_SERIAL_USART3_PRIORITY 12
+#define STM32_SERIAL_UART4_PRIORITY 12
+#define STM32_SERIAL_UART5_PRIORITY 12
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1 FALSE
+#define STM32_SPI_USE_SPI2 FALSE
+#define STM32_SPI_USE_SPI3 FALSE
+#define STM32_SPI_SPI1_DMA_PRIORITY 1
+#define STM32_SPI_SPI2_DMA_PRIORITY 1
+#define STM32_SPI_SPI3_DMA_PRIORITY 1
+#define STM32_SPI_SPI1_IRQ_PRIORITY 10
+#define STM32_SPI_SPI2_IRQ_PRIORITY 10
+#define STM32_SPI_SPI3_IRQ_PRIORITY 10
+#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY 8
+#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_USE_USART3 FALSE
+#define STM32_UART_USART1_IRQ_PRIORITY 12
+#define STM32_UART_USART2_IRQ_PRIORITY 12
+#define STM32_UART_USART3_IRQ_PRIORITY 12
+#define STM32_UART_USART1_DMA_PRIORITY 0
+#define STM32_UART_USART2_DMA_PRIORITY 0
+#define STM32_UART_USART3_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_HP_IRQ_PRIORITY 13
+#define STM32_USB_USB1_LP_IRQ_PRIORITY 14
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/wolfmarkclub/wm1/readme.md b/keyboards/wolfmarkclub/wm1/readme.md
new file mode 100644
index 0000000000..74e92b2ee1
--- /dev/null
+++ b/keyboards/wolfmarkclub/wm1/readme.md
@@ -0,0 +1,17 @@
+# Wolfmark Club WM1
+
+![WM1](https://i.imgur.com/TDFp97yl.jpg)
+
+Split Ergo 65% keyboard
+
+* Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin)
+* Hardware Supported: WM1
+* Hardware Availability: Available through China run Group Buy.
+
+Make example for this keyboard (after setting up your build environment):
+
+ make wolfmarkclub/wm1:default
+
+**Reset Key**: Hold the `Esc` key while plugging in your cable, and the board will appear as a USB drive on your computer.
+
+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/wolfmarkclub/wm1/rules.mk b/keyboards/wolfmarkclub/wm1/rules.mk
new file mode 100644
index 0000000000..14ddab26d9
--- /dev/null
+++ b/keyboards/wolfmarkclub/wm1/rules.mk
@@ -0,0 +1,33 @@
+# MCU name
+MCU = STM32F103
+
+# GENERIC STM32F103C8T6 board - mass storage bootloader
+OPT_DEFS = -DCORTEX_VTOR_INIT=0x10000
+MCU_LDSCRIPT = wm1_f103
+BOARD = STM32_F103_STM32DUINO
+
+PROGRAM_CMD=echo 'CLI flashing not supported' >&2
+
+# 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 = yes # 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
+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
+LTO_ENABLE = yes
+
+# Enter lower-power sleep mode when on the ChibiOS idle thread
+OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
diff --git a/keyboards/wolfmarkclub/wm1/wm1.c b/keyboards/wolfmarkclub/wm1/wm1.c
new file mode 100644
index 0000000000..d199546f89
--- /dev/null
+++ b/keyboards/wolfmarkclub/wm1/wm1.c
@@ -0,0 +1,17 @@
+#include "wm1.h"
+
+void matrix_init_kb(void) {
+ setPinOutput(B1); // Top Indicator LED
+ setPinOutput(B0); // Middle Indicator LED
+ setPinOutput(C5); // Bottom Indicator LED
+ matrix_init_user();
+}
+
+bool led_update_kb(led_t led_state) {
+ if(led_update_user(led_state)) {
+ writePin(B1, led_state.caps_lock);
+ writePin(B0, led_state.num_lock);
+ writePin(C5, led_state.scroll_lock);
+ }
+ return true;
+}
diff --git a/keyboards/wolfmarkclub/wm1/wm1.h b/keyboards/wolfmarkclub/wm1/wm1.h
new file mode 100644
index 0000000000..1750b6366a
--- /dev/null
+++ b/keyboards/wolfmarkclub/wm1/wm1.h
@@ -0,0 +1,34 @@
+/* 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 <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K2D, \
+ 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, K2E, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3E, \
+ K40, K42, K43, K45, K47, K49, 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, K2C, K2D, K2E}, \
+ {K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, KC_NO, K3E}, \
+ {K40, KC_NO, K42, K43, KC_NO, K45, KC_NO, K47, KC_NO, K49, KC_NO, K4B, K4C, K4D, K4E } \
+}
diff --git a/keyboards/xd60/keymaps/Jos/keymap.c b/keyboards/xd60/keymaps/Jos/keymap.c
index f272d6fd18..250becf74e 100644
--- a/keyboards/xd60/keymaps/Jos/keymap.c
+++ b/keyboards/xd60/keymaps/Jos/keymap.c
@@ -46,7 +46,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
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_PAUS, KC_PSCR, \
KC_TRNS, KC_BTN1, KC_MS_U, KC_BTN2, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
KC_TRNS, KC_MS_L, KC_MS_D, KC_MS_R, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPLY, KC_MPRV, KC_MNXT, KC_MSTP, KC_TRNS, KC_NO, KC_TRNS, \
- KC_TRNS, F(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS, \
+ KC_TRNS, TG(3), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_PGDOWN, KC_END),
// 2: GUI/Function 2 Layer
@@ -74,11 +74,6 @@ 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), */
};
-// Custom Actions
-const uint16_t PROGMEM fn_actions[] = {
- [2] = ACTION_LAYER_TOGGLE(3), // to Fn3/Num toggle layer
-};
-
// Macros
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
diff --git a/keyboards/xd60/keymaps/cheese/keymap.c b/keyboards/xd60/keymaps/cheese/keymap.c
index 3c418c5dc0..2ffd3bb5c3 100644
--- a/keyboards/xd60/keymaps/cheese/keymap.c
+++ b/keyboards/xd60/keymaps/cheese/keymap.c
@@ -31,7 +31,7 @@ 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_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, \
MO(_FL), 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, \
- F(0), KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, F(1), F(1), F(1), \
+ LM(_LS, MOD_LSFT), KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, LM(_RS, MOD_RSFT), LM(_RS, MOD_RSFT), LM(_RS, MOD_RSFT), \
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, MO(_FL), KC_LEFT, KC_UP, KC_DOWN, KC_RIGHT),
// Function Layer
@@ -59,9 +59,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),
};
-
-// Custom Actions
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_LAYER_MODS(_LS, MOD_LSFT),
- [1] = ACTION_LAYER_MODS(_RS, MOD_RSFT),
-};
diff --git a/keyboards/xd60/keymaps/melka/.gitignore b/keyboards/xd60/keymaps/melka/.gitignore
new file mode 100644
index 0000000000..c79982f2ea
--- /dev/null
+++ b/keyboards/xd60/keymaps/melka/.gitignore
@@ -0,0 +1 @@
+passwd.h
diff --git a/keyboards/xd60/keymaps/melka/config.h b/keyboards/xd60/keymaps/melka/config.h
new file mode 100644
index 0000000000..37581d12ea
--- /dev/null
+++ b/keyboards/xd60/keymaps/melka/config.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#if __GNUC__ > 5
+# if __has_include("passwd.h")
+# include "passwd.h"
+# endif // if file exists
+#endif // __GNUC__
+
+#ifndef PASSWORD_A
+ #define PASSWORD_A "1234567890"
+#endif
+
+#ifndef PASSWORD_B
+ #define PASSWORD_B "pass123"
+#endif
+
+#define RGBLIGHT_LAYERS
+
+#define LSPO_KEYS KC_LSFT, KC_TRNS, KC_5
+#define RSPC_KEYS KC_RSFT, KC_TRNS, KC_MINS
diff --git a/keyboards/xd60/keymaps/melka/keymap.c b/keyboards/xd60/keymaps/melka/keymap.c
new file mode 100644
index 0000000000..bb3159981f
--- /dev/null
+++ b/keyboards/xd60/keymaps/melka/keymap.c
@@ -0,0 +1,165 @@
+#include QMK_KEYBOARD_H
+
+/*
+Security Note: While it is possible to use macros to send passwords, credit card numbers,
+and other sensitive information it is a supremely bad idea to do so. Anyone who gets a hold
+of your keyboard will be able to access that information by opening a text editor.
+*/
+enum custom_keycodes
+{
+ PASS_A = SAFE_RANGE,
+ PASS_B
+};
+
+#define ___ KC_NO
+
+#define LAYOUT_melka( \
+ 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, \
+ 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, K3D, K3E, \
+ K40, K41, K42, K43, K44, K45, K46, K47, K48) \
+ { \
+ {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, K1D}, \
+ {K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3E, K3D}, \
+ {K40, K41, K42, ___, ___, K43, ___, K3C, K46, K0E, K44, K45, K47, K48} \
+ }
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ // 0: Base Layer
+ LAYOUT_melka(
+ KC_NUBS, 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_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_BSLS,
+ MT(KC_LSFT, KC_5), KC_GRV, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MT(KC_RSFT, KC_MINS), KC_UP, MO(1),
+ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_LEFT, KC_DOWN, KC_RIGHT),
+
+ // 1: Function Layer
+ LAYOUT_melka(
+ 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_WH_U, KC_UP, KC_WH_D, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RIGHT, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGUP, _______,
+ TO(2), TO(3), _______, KC_APP, BL_STEP, _______, _______, _______, _______, _______, _______, KC_END, KC_PGDN, KC_VOLU, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_MUTE),
+
+ // 2: RGB Layer
+ LAYOUT_melka(
+ RGB_TOG, RGB_M_P, RGB_RMOD, RGB_MOD, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, RGB_M_T, _______, _______, RESET,
+ _______, RGB_HUD, RGB_HUI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, RGB_SAD, RGB_SAI, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ TO(0), _______, RGB_VAD, RGB_VAI, _______, _______, _______, _______, _______, _______, _______, PASS_A, PASS_B, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______),
+
+ // 3: Keypad Layer
+ LAYOUT_melka(
+ KC_ESC, _______, _______, _______, _______, _______, _______, _______, _______, KC_NLCK, KC_PEQL, KC_PSLS, KC_PAST, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P7, KC_P8, KC_P9, KC_PMNS, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ TO(0), _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, KC_PENT, TO(0),
+ _______, _______, _______, _______, KC_P0, KC_P0, KC_PDOT, KC_PENT, _______)
+};
+
+// Light LEDs 6 to 9 and 12 to 15 red when caps lock is active. Hard to ignore!
+const rgblight_segment_t PROGMEM rgb_capslock_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {2, 4, HSV_RED}, // Light 4 LEDs, starting with LED 6
+ {6, 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 rgb_function_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {9, 2, HSV_CYAN}
+);
+// Light LEDs 11 & 12 in purple when keyboard layer 2 is active
+const rgblight_segment_t PROGMEM rgb_backlight_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {10, 2, HSV_PURPLE}
+);
+const rgblight_segment_t PROGMEM rgb_keypad_layer[] = RGBLIGHT_LAYER_SEGMENTS(
+ {4, 4, HSV_RED}
+);
+// Now define the array of layers. Later layers take precedence
+const rgblight_segment_t* const PROGMEM rgb_layers[] = RGBLIGHT_LAYERS_LIST(
+ rgb_capslock_layer,
+ rgb_function_layer,
+ rgb_backlight_layer, // Overrides caps lock layer
+ rgb_keypad_layer // Overrides other 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));
+ return state;
+}
+
+bool led_update_user(led_t led_state) {
+ rgblight_set_layer_state(0, led_state.caps_lock);
+ return true;
+}
+
+void keyboard_post_init_user(void) {
+ // Enable the LED layers
+ rgblight_layers = rgb_layers;
+}
+// Loop
+void matrix_scan_user(void) {
+ // Empty
+};
+
+static bool control_disabled = false;
+static bool delete_pressed = false;
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record)
+{
+ if (keycode == KC_BSPC)
+ {
+ if (record->event.pressed)
+ {
+ if (keyboard_report->mods & MOD_BIT(KC_LCTL))
+ {
+ delete_pressed = true;
+ control_disabled = true;
+ unregister_code(KC_LCTL);
+ register_code(KC_DEL);
+ return false;
+ }
+ }
+ else if (delete_pressed)
+ {
+ delete_pressed = false;
+ unregister_code(KC_DEL);
+
+ if (control_disabled)
+ {
+ control_disabled = false;
+ register_code(KC_LCTL);
+ }
+ return false;
+ }
+ }
+ else if (keycode == KC_LCTL && !record->event.pressed && delete_pressed)
+ {
+ delete_pressed = false;
+ control_disabled = false;
+ unregister_code(KC_DEL);
+ register_code(KC_BSPC);
+ return false;
+ }
+
+ switch (keycode)
+ {
+ case PASS_A:
+ if (record->event.pressed)
+ {
+ SEND_STRING(PASSWORD_A "\n");
+ }
+ break;
+ case PASS_B:
+ if (record->event.pressed)
+ {
+ SEND_STRING(PASSWORD_B "\n");
+ }
+ break;
+ }
+ return true;
+}
diff --git a/keyboards/xd60/keymaps/melka/passwd_template.h b/keyboards/xd60/keymaps/melka/passwd_template.h
new file mode 100644
index 0000000000..a78de6d40d
--- /dev/null
+++ b/keyboards/xd60/keymaps/melka/passwd_template.h
@@ -0,0 +1,10 @@
+/*
+To define your password, rename this file to passwd.h and edit the defines below.
+
+Security Note: While it is possible to use macros to send passwords, credit card numbers,
+and other sensitive information it is a supremely bad idea to do so. Anyone who gets a hold
+of your keyboard will be able to access that information by opening a text editor.
+*/
+
+#define PASSWORD_A "enter your first password here"
+#define PASSWORD_B "second password if you need"
diff --git a/keyboards/xd60/keymaps/melka/readme.md b/keyboards/xd60/keymaps/melka/readme.md
new file mode 100644
index 0000000000..b9d9065da7
--- /dev/null
+++ b/keyboards/xd60/keymaps/melka/readme.md
@@ -0,0 +1,21 @@
+# melka's keymap for XIUDI's 60% XD60 rev3 PCB
+
+## Additional Notes
+Custom Keymap for XD60 rev3. French Mac layout.
+
+## Security Note
+This keymap includes macros for entering passwords.
+
+While it is possible to use macros to send passwords, credit card numbers,
+and other sensitive information it is a supremely bad idea to do so. Anyone who gets a hold
+of your keyboard will be able to access that information by opening a text editor.
+
+Use this functionnality at your own risk.
+
+To define your password, rename passwd_template.h file to passwd.h and edit the defines inside.
+
+## Build
+
+To build this keymap, simply run:
+
+ make xd60/rev3:melka # XD60 rev3
diff --git a/keyboards/xd75/keymaps/scheiklp/config.h b/keyboards/xd75/keymaps/scheiklp/config.h
new file mode 100644
index 0000000000..68f5a3ee11
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+#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 0000000000..a757c2e49c
--- /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 <http://www.gnu.org/licenses/>.
+ */
+#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 0000000000..58c65f0884
--- /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 0000000000..6e07de471a
--- /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/keymaps/mac_underglow/keymap.c b/keyboards/xd87/keymaps/mac_underglow/keymap.c
new file mode 100755
index 0000000000..34b260f35a
--- /dev/null
+++ b/keyboards/xd87/keymaps/mac_underglow/keymap.c
@@ -0,0 +1,33 @@
+/* Copyright 2020 Tomasz Adamczyk <siano@sianecki.pl>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#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_F13, KC_F14, KC_F15,
+ 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_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, MO(1),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ),
+ [1] = LAYOUT_tkl_ansi(
+ RESET, EEP_RST, DEBUG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, 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_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, BL_BRTG, BL_DEC,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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/xd87/keymaps/mac_underglow/readme.md b/keyboards/xd87/keymaps/mac_underglow/readme.md
new file mode 100755
index 0000000000..61fee2218f
--- /dev/null
+++ b/keyboards/xd87/keymaps/mac_underglow/readme.md
@@ -0,0 +1,13 @@
+# The Mac OS layout for xd87
+
+With underglow and backlight support.
+
+## Keymap
+
+### Layer 0
+
+![XD87 - mac_underglow keymap - layer 0](https://i.imgur.com/LXq8phy.png)
+
+### Layer 1
+
+![XD87 - mac_underglow_keymap - layer 1](https://i.imgur.com/swqwVaO.png) \ No newline at end of file
diff --git a/keyboards/xd87/keymaps/mac_underglow/rules.mk b/keyboards/xd87/keymaps/mac_underglow/rules.mk
new file mode 100755
index 0000000000..5cf1edf60b
--- /dev/null
+++ b/keyboards/xd87/keymaps/mac_underglow/rules.mk
@@ -0,0 +1,3 @@
+BOOTMAGIC_ENABLE = lite
+COMMAND_ENABLE = no
+RGBLIGHT_ENABLE = yes
diff --git a/keyboards/ymd96/rules.mk b/keyboards/ymd96/rules.mk
index b7571649bd..2ce37cfc78 100644
--- a/keyboards/ymd96/rules.mk
+++ b/keyboards/ymd96/rules.mk
@@ -27,5 +27,3 @@ 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
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/ymdk/bface/README.md b/keyboards/ymdk/bface/README.md
index 04ba680de1..d99d4f9fb0 100644
--- a/keyboards/ymdk/bface/README.md
+++ b/keyboards/ymdk/bface/README.md
@@ -5,8 +5,9 @@
A 60% keyboard that runs ps2avrgb natively and fits the popular GH60 form factor. Another "bfake" or clone of the original B.face PCB by [Winkeyless](https://winkeyless.kr/product/b-face-x2-pcb/). This PCB has slightly different switch matrix than the origninal B.face, and is also different than the bfake. It commonly comes as the PCB in 60% keyboard kits sold by YMDK on Aliexpress.
* Keyboard Maintainer: QMK Community
-* Hardware Supported: White Bface Mini USB PCB with no RGB.
+* Hardware Supported: White Bface Mini USB PCB with 12 RGB LEDs on the bottom.
* Hardware Availability: [Shenzhen YMD Tech Co. (YMDK) on Aliexpress](https://www.aliexpress.com/item/32799437588.html)
+* Case capability: You can not use generic GH60 plastic cases with this board as RGB LEDs on the bottom is messing with the supportive ribs of the case, just like on DZ60.
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/ymdk/bface/config.h b/keyboards/ymdk/bface/config.h
index dfcfbcaa12..e6006aeb40 100644
--- a/keyboards/ymdk/bface/config.h
+++ b/keyboards/ymdk/bface/config.h
@@ -36,3 +36,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define BACKLIGHT_PIN D4
#define BACKLIGHT_LEVELS 6
+
+#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/ymdk/bface/keymaps/minila/keymap.c b/keyboards/ymdk/bface/keymaps/minila/keymap.c
new file mode 100644
index 0000000000..4038e8f762
--- /dev/null
+++ b/keyboards/ymdk/bface/keymaps/minila/keymap.c
@@ -0,0 +1,42 @@
+/*
+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 <http://www.gnu.org/licenses/>.
+*/
+
+#include QMK_KEYBOARD_H
+
+enum layer_names {
+ _BL,
+ _FL
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ //Base Layer
+ [_BL] = 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,
+ LT(_FL, 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, MT(MOD_RCTL, KC_ENT),
+ KC_LSPO, 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_DEL,
+ KC_LCTL, KC_LGUI, KC_LALT, MO(_FL), KC_SPC, MO(_FL), KC_RALT, KC_APP, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+ //FN Layer
+ [_FL] = LAYOUT_all(
+ 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, _______, RESET,
+ _______, _______, KC_HOME, KC_UP, KC_END, KC_PGUP, _______, NK_TOGG, KC_PSCR, KC_SLCK, KC_PAUS, _______, BL_STEP, BL_TOGG,
+ _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______, KC_INS, KC_HOME, KC_PGUP, KC_BSPC, _______, _______, _______,
+ _______, _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_VAD, RGB_VAI, _______, KC_DEL, KC_END, KC_PGDN, _______, _______, _______, _______,
+ _______, _______, _______, _______, KC_ENT, _______, _______, _______, _______, _______, _______
+ ),
+};
diff --git a/keyboards/ymdk/bface/keymaps/minila/readme.md b/keyboards/ymdk/bface/keymaps/minila/readme.md
new file mode 100644
index 0000000000..7b3760c136
--- /dev/null
+++ b/keyboards/ymdk/bface/keymaps/minila/readme.md
@@ -0,0 +1,11 @@
+Basically layout like on Filco Minila board, found here: https://geekboards.ru/product/filco-minila
+
+There is one single function layer that can be accessed by holding either FN key or Caps Lock. Enter is also a Right Control when held down. Shifts are also '(' and ')' respectively when tapped.
+
+You can control underglow RGBs:
+
+* FN+Z - Toggle
+* FN+X - Effect
+* FN+C - Color
+* FN+V - Brightness lower
+* FN+B - Brightness higher
diff --git a/keyboards/ymdk/bface/rules.mk b/keyboards/ymdk/bface/rules.mk
index 6320071ab8..3d51be1133 100644
--- a/keyboards/ymdk/bface/rules.mk
+++ b/keyboards/ymdk/bface/rules.mk
@@ -18,6 +18,5 @@ EXTRAKEY_ENABLE = yes
CONSOLE_ENABLE = no
COMMAND_ENABLE = yes
BACKLIGHT_ENABLE = yes
-RGBLIGHT_ENABLE = no
-
-OPT_DEFS = -DDEBUG_LEVEL=0
+RGBLIGHT_ENABLE = yes
+WS2812_DRIVER = i2c
diff --git a/keyboards/ymdk/ymd09/config.h b/keyboards/ymdk/ymd09/config.h
index 372046b8bc..8b34a98363 100644
--- a/keyboards/ymdk/ymd09/config.h
+++ b/keyboards/ymdk/ymd09/config.h
@@ -20,8 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "config_common.h"
/* USB Device descriptor parameter */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0x0909
+#define VENDOR_ID 0x594D // "YM"
+#define PRODUCT_ID 0x4409 // "D" + 09
#define DEVICE_VER 0x0001
#define MANUFACTURER YMDK
#define PRODUCT YMD09
diff --git a/keyboards/ymdk/ymd09/keymaps/via/keymap.c b/keyboards/ymdk/ymd09/keymaps/via/keymap.c
new file mode 100644
index 0000000000..e84b587a36
--- /dev/null
+++ b/keyboards/ymdk/ymd09/keymaps/via/keymap.c
@@ -0,0 +1,20 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT(KC_KP_7, KC_KP_8, KC_KP_9,
+ KC_KP_4, LT(1, KC_KP_5), KC_KP_6,
+ KC_KP_1, KC_KP_2, KC_KP_3),
+
+ [1] = LAYOUT(RGB_RMOD, RGB_VAI, RGB_MOD,
+ RGB_HUI, RESET, RGB_SAI,
+ RGB_HUD, RGB_VAD, RGB_SAD),
+
+ [2] = LAYOUT(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),
+};
diff --git a/keyboards/ymdk/ymd09/keymaps/via/rules.mk b/keyboards/ymdk/ymd09/keymaps/via/rules.mk
new file mode 100644
index 0000000000..1e5b99807c
--- /dev/null
+++ b/keyboards/ymdk/ymd09/keymaps/via/rules.mk
@@ -0,0 +1 @@
+VIA_ENABLE = yes
diff --git a/keyboards/ymdk/ymd09/rules.mk b/keyboards/ymdk/ymd09/rules.mk
index 171e9b1fcb..be1811366e 100644
--- a/keyboards/ymdk/ymd09/rules.mk
+++ b/keyboards/ymdk/ymd09/rules.mk
@@ -30,3 +30,4 @@ 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 # reduce firmware size
diff --git a/keyboards/ymdk_np21/rules.mk b/keyboards/ymdk_np21/rules.mk
index 237386bcea..c370c616a5 100644
--- a/keyboards/ymdk_np21/rules.mk
+++ b/keyboards/ymdk_np21/rules.mk
@@ -27,5 +27,3 @@ 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
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/keyboards/z150_blackheart/config.h b/keyboards/z150_bh/config.h
index fc33021ffc..fc33021ffc 100644
--- a/keyboards/z150_blackheart/config.h
+++ b/keyboards/z150_bh/config.h
diff --git a/keyboards/z150_bh/info.json b/keyboards/z150_bh/info.json
new file mode 100644
index 0000000000..6e5c121f6a
--- /dev/null
+++ b/keyboards/z150_bh/info.json
@@ -0,0 +1,191 @@
+{
+ "keyboard_name": "Z-150 BH",
+ "url": "",
+ "maintainer": "qmk, blindassassin111",
+ "width": 21.25,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 84,
+ "layout": [
+ {"label":"F1", "x":0, "y":0},
+ {"label":"F2", "x":1, "y":0},
+ {"label":"Esc", "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":8.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":1.75},
+ {"label":"Num Lock", "x":17.25, "y":0},
+ {"label":"Scroll Lock", "x":18.25, "y":0, "w":1.5},
+ {"label":"Sys Req", "x":19.75, "y":0, "w":1.5},
+ {"label":"F3", "x":0, "y":1},
+ {"label":"F4", "x":1, "y":1},
+ {"label":"Tab", "x":2.5, "y":1, "w":1.5},
+ {"label":"Q", "x":4, "y":1},
+ {"label":"W", "x":5, "y":1},
+ {"label":"E", "x":6, "y":1},
+ {"label":"R", "x":7, "y":1},
+ {"label":"T", "x":8, "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, "w":1.25},
+ {"label":"Enter", "x":15.25, "y":2, "w":2},
+ {"label":"7", "x":17.25, "y":1},
+ {"label":"8", "x":18.25, "y":1},
+ {"label":"9", "x":19.25, "y":1},
+ {"label":"PrtSc", "x":20.25, "y":1},
+ {"label":"F5", "x":0, "y":2},
+ {"label":"F6", "x":1, "y":2},
+ {"label":"Ctrl", "x":2.5, "y":2, "w":1.75},
+ {"label":"A", "x":4.25, "y":2},
+ {"label":"S", "x":5.25, "y":2},
+ {"label":"D", "x":6.25, "y":2},
+ {"label":"F", "x":7.25, "y":2},
+ {"label":"G", "x":8.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":"4", "x":17.25, "y":2},
+ {"label":"5", "x":18.25, "y":2},
+ {"label":"6", "x":19.25, "y":2},
+ {"label":"-", "x":20.25, "y":2},
+ {"label":"F7", "x":0, "y":3},
+ {"label":"F8", "x":1, "y":3},
+ {"label":"Shift", "x":2.5, "y":3, "w":2.25},
+ {"label":"Z", "x":4.75, "y":3},
+ {"label":"X", "x":5.75, "y":3},
+ {"label":"C", "x":6.75, "y":3},
+ {"label":"V", "x":7.75, "y":3},
+ {"label":"B", "x":8.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":1.5},
+ {"label":"|", "x":16.25, "y":3},
+ {"label":"1", "x":17.25, "y":3},
+ {"label":"2", "x":18.25, "y":3},
+ {"label":"3", "x":19.25, "y":3},
+ {"label":"+", "x":20.25, "y":3, "h":2},
+ {"label":"F9", "x":0, "y":4},
+ {"label":"F10", "x":1, "y":4},
+ {"label":"Alt", "x":2.5, "y":4, "w":1.75},
+ {"label":"~", "x":4.25, "y":4},
+ {"label":"Space", "x":5.25, "y":4, "w":9},
+ {"label":"Caps Lock", "x":14.25, "y":4, "w":2},
+ {"label":"0", "x":16.25, "y":4, "w":2},
+ {"label":".", "x":18.25, "y":4, "w":2}
+ ]
+ },
+ "LAYOUT_z150_tkl": {
+ "key_count": 88,
+ "layout": [
+ {"label":"F1", "x":0, "y":0},
+ {"label":"F2", "x":1, "y":0},
+ {"label":"Esc", "x":2.5, "y":0},
+ {"label":"1", "x":3.5, "y":0},
+ {"label":"2", "x":4.5, "y":0},
+ {"label":"3", "x":5.5, "y":0},
+ {"label":"4", "x":6.5, "y":0},
+ {"label":"5", "x":7.5, "y":0},
+ {"label":"6", "x":8.5, "y":0},
+ {"label":"7", "x":9.5, "y":0},
+ {"label":"8", "x":10.5, "y":0},
+ {"label":"9", "x":11.5, "y":0},
+ {"label":"0", "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.25, "y":0},
+ {"label":"Home", "x":19.25, "y":0},
+ {"label":"PgUp", "x":20.25, "y":0},
+ {"label":"F3", "x":0, "y":1},
+ {"label":"F4", "x":1, "y":1},
+ {"label":"Tab", "x":2.5, "y":1, "w":1.5},
+ {"label":"Q", "x":4, "y":1},
+ {"label":"W", "x":5, "y":1},
+ {"label":"E", "x":6, "y":1},
+ {"label":"R", "x":7, "y":1},
+ {"label":"T", "x":8, "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.25, "y":1},
+ {"label":"End", "x":19.25, "y":1},
+ {"label":"PgDn", "x":20.25, "y":1},
+ {"label":"F5", "x":0, "y":2},
+ {"label":"F6", "x":1, "y":2},
+ {"label":"Caps Lock", "x":2.5, "y":2, "w":1.75},
+ {"label":"A", "x":4.25, "y":2},
+ {"label":"S", "x":5.25, "y":2},
+ {"label":"D", "x":6.25, "y":2},
+ {"label":"F", "x":7.25, "y":2},
+ {"label":"G", "x":8.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},
+ {"x":18.25, "y":2},
+ {"x":19.25, "y":2},
+ {"x":20.25, "y":2},
+ {"label":"F7", "x":0, "y":3},
+ {"label":"F8", "x":1, "y":3},
+ {"label":"Shift", "x":2.5, "y":3, "w":1.25},
+ {"label":"ISO \\", "x":3.75, "y":3},
+ {"label":"Z", "x":4.75, "y":3},
+ {"label":"X", "x":5.75, "y":3},
+ {"label":"C", "x":6.75, "y":3},
+ {"label":"V", "x":7.75, "y":3},
+ {"label":"B", "x":8.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":1.75},
+ {"label":"Fn", "x":16.5, "y":3},
+ {"x":18.25, "y":3},
+ {"label":"Up", "x":19.25, "y":3},
+ {"x":20.25, "y":3},
+ {"label":"F9", "x":0, "y":4},
+ {"label":"F10", "x":1, "y":4},
+ {"label":"Ctrl", "x":2.5, "y":4, "w":1.25},
+ {"label":"Win", "x":3.75, "y":4, "w":1.25},
+ {"label":"Alt", "x":5, "y":4, "w":1.25},
+ {"label":"Space", "x":6.25, "y":4, "w":6.25},
+ {"label":"Alt", "x":12.5, "y":4, "w":1.25},
+ {"label":"Win", "x":13.75, "y":4, "w":1.25},
+ {"label":"Menu", "x":15, "y":4, "w":1.25},
+ {"label":"Ctrl", "x":16.25, "y":4, "w":1.25},
+ {"label":"Left", "x":18.25, "y":4},
+ {"label":"Down", "x":19.25, "y":4},
+ {"label":"Right", "x":20.25, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/z150_blackheart/keymaps/default/keymap.c b/keyboards/z150_bh/keymaps/default/keymap.c
index ff4f6f7f9d..ff4f6f7f9d 100644
--- a/keyboards/z150_blackheart/keymaps/default/keymap.c
+++ b/keyboards/z150_bh/keymaps/default/keymap.c
diff --git a/keyboards/z150_blackheart/keymaps/default_tkl/keymap.c b/keyboards/z150_bh/keymaps/default_tkl/keymap.c
index f1a24b8dda..f1a24b8dda 100644
--- a/keyboards/z150_blackheart/keymaps/default_tkl/keymap.c
+++ b/keyboards/z150_bh/keymaps/default_tkl/keymap.c
diff --git a/keyboards/z150_bh/readme.md b/keyboards/z150_bh/readme.md
new file mode 100644
index 0000000000..a1d4845808
--- /dev/null
+++ b/keyboards/z150_bh/readme.md
@@ -0,0 +1,14 @@
+Z-150 BH PCB
+===
+
+A replacement PCB for Zenith Z-150 keyboards.
+
+Keyboard Maintainer: QMK Community and blindassassin111
+Hardware Supported: Z-150 BH PCB
+Hardware Availability: [Deskthority Group Buy](https://deskthority.net/group-buys-f50/programmable-vintage-board-pcbs-omnikey-at101-and-z-150-t19325.html)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make z150_bh: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/z150_blackheart/rules.mk b/keyboards/z150_bh/rules.mk
index 739bea3932..739bea3932 100644
--- a/keyboards/z150_blackheart/rules.mk
+++ b/keyboards/z150_bh/rules.mk
diff --git a/keyboards/z150_bh/z150_bh.c b/keyboards/z150_bh/z150_bh.c
new file mode 100644
index 0000000000..6db784b56e
--- /dev/null
+++ b/keyboards/z150_bh/z150_bh.c
@@ -0,0 +1,32 @@
+#include "z150_bh.h"
+
+void matrix_init_kb(void) {
+ setPinOutput(B0);
+ setPinOutput(E6);
+ setPinOutput(E7);
+
+ matrix_init_user();
+};
+
+void led_set_kb(uint8_t usb_led) {
+ // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
+ if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
+ writePinHigh(E7);
+ } else {
+ writePinLow(E7);
+ }
+
+ if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
+ writePinHigh(B0);
+ } else {
+ writePinLow(B0);
+ }
+
+ if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
+ writePinHigh(E6);
+ } else {
+ writePinLow(E6);
+ }
+
+ led_set_user(usb_led);
+}
diff --git a/keyboards/z150_blackheart/z150_blackheart.h b/keyboards/z150_bh/z150_bh.h
index f97ac1c035..f97ac1c035 100644
--- a/keyboards/z150_blackheart/z150_blackheart.h
+++ b/keyboards/z150_bh/z150_bh.h
diff --git a/keyboards/z150_blackheart/info.json b/keyboards/z150_blackheart/info.json
deleted file mode 100644
index 016641254c..0000000000
--- a/keyboards/z150_blackheart/info.json
+++ /dev/null
@@ -1,191 +0,0 @@
-{
- "keyboard_name": "Z-150 Blackheart",
- "url": "",
- "maintainer": "qmk, blindassassin111",
- "width": 21.25,
- "height": 5,
- "layouts": {
- "LAYOUT": {
- "key_count": 84,
- "layout": [
- {"label":"F1", "x":0, "y":0},
- {"label":"F2", "x":1, "y":0},
- {"label":"Esc", "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":8.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":1.75},
- {"label":"Num Lock", "x":17.25, "y":0},
- {"label":"Scroll Lock", "x":18.25, "y":0, "w":1.5},
- {"label":"Sys Req", "x":19.75, "y":0, "w":1.5},
- {"label":"F3", "x":0, "y":1},
- {"label":"F4", "x":1, "y":1},
- {"label":"Tab", "x":2.5, "y":1, "w":1.5},
- {"label":"Q", "x":4, "y":1},
- {"label":"W", "x":5, "y":1},
- {"label":"E", "x":6, "y":1},
- {"label":"R", "x":7, "y":1},
- {"label":"T", "x":8, "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, "w":1.25},
- {"label":"Enter", "x":15.25, "y":2, "w":2},
- {"label":"7", "x":17.25, "y":1},
- {"label":"8", "x":18.25, "y":1},
- {"label":"9", "x":19.25, "y":1},
- {"label":"PrtSc", "x":20.25, "y":1},
- {"label":"F5", "x":0, "y":2},
- {"label":"F6", "x":1, "y":2},
- {"label":"Ctrl", "x":2.5, "y":2, "w":1.75},
- {"label":"A", "x":4.25, "y":2},
- {"label":"S", "x":5.25, "y":2},
- {"label":"D", "x":6.25, "y":2},
- {"label":"F", "x":7.25, "y":2},
- {"label":"G", "x":8.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":"4", "x":17.25, "y":2},
- {"label":"5", "x":18.25, "y":2},
- {"label":"6", "x":19.25, "y":2},
- {"label":"-", "x":20.25, "y":2},
- {"label":"F7", "x":0, "y":3},
- {"label":"F8", "x":1, "y":3},
- {"label":"Shift", "x":2.5, "y":3, "w":2.25},
- {"label":"Z", "x":4.75, "y":3},
- {"label":"X", "x":5.75, "y":3},
- {"label":"C", "x":6.75, "y":3},
- {"label":"V", "x":7.75, "y":3},
- {"label":"B", "x":8.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":1.5},
- {"label":"|", "x":16.25, "y":3},
- {"label":"1", "x":17.25, "y":3},
- {"label":"2", "x":18.25, "y":3},
- {"label":"3", "x":19.25, "y":3},
- {"label":"+", "x":20.25, "y":3, "h":2},
- {"label":"F9", "x":0, "y":4},
- {"label":"F10", "x":1, "y":4},
- {"label":"Alt", "x":2.5, "y":4, "w":1.75},
- {"label":"~", "x":4.25, "y":4},
- {"label":"Space", "x":5.25, "y":4, "w":9},
- {"label":"Caps Lock", "x":14.25, "y":4, "w":2},
- {"label":"0", "x":16.25, "y":4, "w":2},
- {"label":".", "x":18.25, "y":4, "w":2}
- ]
- },
- "LAYOUT_z150_tkl": {
- "key_count": 88,
- "layout": [
- {"label":"F1", "x":0, "y":0},
- {"label":"F2", "x":1, "y":0},
- {"label":"Esc", "x":2.5, "y":0},
- {"label":"1", "x":3.5, "y":0},
- {"label":"2", "x":4.5, "y":0},
- {"label":"3", "x":5.5, "y":0},
- {"label":"4", "x":6.5, "y":0},
- {"label":"5", "x":7.5, "y":0},
- {"label":"6", "x":8.5, "y":0},
- {"label":"7", "x":9.5, "y":0},
- {"label":"8", "x":10.5, "y":0},
- {"label":"9", "x":11.5, "y":0},
- {"label":"0", "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.25, "y":0},
- {"label":"Home", "x":19.25, "y":0},
- {"label":"PgUp", "x":20.25, "y":0},
- {"label":"F3", "x":0, "y":1},
- {"label":"F4", "x":1, "y":1},
- {"label":"Tab", "x":2.5, "y":1, "w":1.5},
- {"label":"Q", "x":4, "y":1},
- {"label":"W", "x":5, "y":1},
- {"label":"E", "x":6, "y":1},
- {"label":"R", "x":7, "y":1},
- {"label":"T", "x":8, "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.25, "y":1},
- {"label":"End", "x":19.25, "y":1},
- {"label":"PgDn", "x":20.25, "y":1},
- {"label":"F5", "x":0, "y":2},
- {"label":"F6", "x":1, "y":2},
- {"label":"Caps Lock", "x":2.5, "y":2, "w":1.75},
- {"label":"A", "x":4.25, "y":2},
- {"label":"S", "x":5.25, "y":2},
- {"label":"D", "x":6.25, "y":2},
- {"label":"F", "x":7.25, "y":2},
- {"label":"G", "x":8.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},
- {"x":18.25, "y":2},
- {"x":19.25, "y":2},
- {"x":20.25, "y":2},
- {"label":"F7", "x":0, "y":3},
- {"label":"F8", "x":1, "y":3},
- {"label":"Shift", "x":2.5, "y":3, "w":1.25},
- {"label":"ISO \\", "x":3.75, "y":3},
- {"label":"Z", "x":4.75, "y":3},
- {"label":"X", "x":5.75, "y":3},
- {"label":"C", "x":6.75, "y":3},
- {"label":"V", "x":7.75, "y":3},
- {"label":"B", "x":8.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":1.75},
- {"label":"Fn", "x":16.5, "y":3},
- {"x":18.25, "y":3},
- {"label":"Up", "x":19.25, "y":3},
- {"x":20.25, "y":3},
- {"label":"F9", "x":0, "y":4},
- {"label":"F10", "x":1, "y":4},
- {"label":"Ctrl", "x":2.5, "y":4, "w":1.25},
- {"label":"Win", "x":3.75, "y":4, "w":1.25},
- {"label":"Alt", "x":5, "y":4, "w":1.25},
- {"label":"Space", "x":6.25, "y":4, "w":6.25},
- {"label":"Alt", "x":12.5, "y":4, "w":1.25},
- {"label":"Win", "x":13.75, "y":4, "w":1.25},
- {"label":"Menu", "x":15, "y":4, "w":1.25},
- {"label":"Ctrl", "x":16.25, "y":4, "w":1.25},
- {"label":"Left", "x":18.25, "y":4},
- {"label":"Down", "x":19.25, "y":4},
- {"label":"Right", "x":20.25, "y":4}
- ]
- }
- }
-}
diff --git a/keyboards/z150_blackheart/readme.md b/keyboards/z150_blackheart/readme.md
deleted file mode 100644
index 331f85694e..0000000000
--- a/keyboards/z150_blackheart/readme.md
+++ /dev/null
@@ -1,14 +0,0 @@
-Z-150 Blackheart PCB
-===
-
-A replacement PCB for Zenith Z-150 keyboards.
-
-Keyboard Maintainer: QMK Community and blindassassin111
-Hardware Supported: Z-150 blackheart PCB
-Hardware Availability: [Deskthority Group Buy](https://deskthority.net/group-buys-f50/programmable-vintage-board-pcbs-omnikey-at101-and-z-150-t19325.html)
-
-Make example for this keyboard (after setting up your build environment):
-
- make z150_blackheart: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/z150_blackheart/z150_blackheart.c b/keyboards/z150_blackheart/z150_blackheart.c
deleted file mode 100644
index b754c64a12..0000000000
--- a/keyboards/z150_blackheart/z150_blackheart.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#include "z150_blackheart.h"
-
-void matrix_init_kb(void) {
- setPinOutput(B0);
- setPinOutput(E6);
- setPinOutput(E7);
-
- matrix_init_user();
-};
-
-void led_set_kb(uint8_t usb_led) {
- // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
- if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
- writePinHigh(E7);
- } else {
- writePinLow(E7);
- }
-
- if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
- writePinHigh(B0);
- } else {
- writePinLow(B0);
- }
-
- if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
- writePinHigh(E6);
- } else {
- writePinLow(E6);
- }
-
- led_set_user(usb_led);
-}
diff --git a/keyboards/zinc/config.h b/keyboards/zinc/config.h
index 712db0ac6d..cfb6bf4ffc 100644
--- a/keyboards/zinc/config.h
+++ b/keyboards/zinc/config.h
@@ -17,30 +17,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
-//#ifndef CONFIG_H
-//#define CONFIG_H
#include "config_common.h"
-
-// GCC include 'config.h" sequence in qmk_firmware/keyboards/zinc/
-// -include keyboards/zinc/config.h
-// -include keyboards/zinc/rev?/config.h
-// -include keyboards/zinc/rev?/keymaps/MAPNAME/config.h
-// XXXX.c
-
-#include <serial_config.h>
-
-// GCC include search path in qmk_firmare/keyboards/zinc/
-// #include "..." search starts here:
-// #include <...> search starts here:
-// keyboards/zinc/rev?/keymaps/MAPNAME
-// keyboards/zinc
-// keyboards/zinc/rev?
-// .
-// ./tmk_core
-// ......
-
-#define NO_ACTION_MACRO
-#define NO_ACTION_FUNCTION
-
-//#endif /* CONFIG_H */
diff --git a/keyboards/zinc/i2c.c b/keyboards/zinc/i2c.c
deleted file mode 100644
index 4bee5c6398..0000000000
--- a/keyboards/zinc/i2c.c
+++ /dev/null
@@ -1,162 +0,0 @@
-#include <util/twi.h>
-#include <avr/io.h>
-#include <stdlib.h>
-#include <avr/interrupt.h>
-#include <util/twi.h>
-#include <stdbool.h>
-#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<<TWINT)) && lim < I2C_LOOP_TIMEOUT)
- lim++;
-
- // easier way, but will wait slightly longer
- // _delay_us(100);
-}
-
-// Setup twi to run at 100kHz or 400kHz (see ./i2c.h SCL_CLOCK)
-void i2c_master_init(void) {
- // no prescaler
- TWSR = 0;
- // Set TWI clock frequency to SCL_CLOCK. Need TWBR>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<<TWINT) | (1<<TWEN) | (1<<TWSTA);
-
- i2c_delay();
-
- // check that we started successfully
- if ( (TW_STATUS != TW_START) && (TW_STATUS != TW_REP_START))
- return 1;
-
- TWDR = address;
- TWCR = (1<<TWINT) | (1<<TWEN);
-
- i2c_delay();
-
- if ( (TW_STATUS != TW_MT_SLA_ACK) && (TW_STATUS != TW_MR_SLA_ACK) )
- return 1; // slave did not acknowledge
- else
- return 0; // success
-}
-
-
-// Finish the i2c transaction.
-void i2c_master_stop(void) {
- TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
-
- uint16_t lim = 0;
- while(!(TWCR & (1<<TWSTO)) && lim < I2C_LOOP_TIMEOUT)
- lim++;
-}
-
-// Write one byte to the i2c slave.
-// returns 0 => slave ACK
-// 1 => slave NACK
-uint8_t i2c_master_write(uint8_t data) {
- TWDR = data;
- TWCR = (1<<TWINT) | (1<<TWEN);
-
- i2c_delay();
-
- // check if the slave acknowledged us
- return (TW_STATUS == TW_MT_DATA_ACK) ? 0 : 1;
-}
-
-// Read one byte from the i2c slave. If ack=1 the slave is acknowledged,
-// if ack=0 the acknowledge bit is not set.
-// returns: byte read from i2c device
-uint8_t i2c_master_read(int ack) {
- TWCR = (1<<TWINT) | (1<<TWEN) | (ack<<TWEA);
-
- i2c_delay();
- return TWDR;
-}
-
-void i2c_reset_state(void) {
- TWCR = 0;
-}
-
-void i2c_slave_init(uint8_t address) {
- TWAR = address << 0; // slave i2c address
- // TWEN - twi enable
- // TWEA - enable address acknowledgement
- // TWINT - twi interrupt flag
- // TWIE - enable the twi interrupt
- TWCR = (1<<TWIE) | (1<<TWEA) | (1<<TWINT) | (1<<TWEN);
-}
-
-ISR(TWI_vect);
-
-ISR(TWI_vect) {
- uint8_t ack = 1;
- switch(TW_STATUS) {
- case TW_SR_SLA_ACK:
- // this device has been addressed as a slave receiver
- slave_has_register_set = false;
- break;
-
- case TW_SR_DATA_ACK:
- // this device has received data as a slave receiver
- // The first byte that we receive in this transaction sets the location
- // of the read/write location of the slaves memory that it exposes over
- // i2c. After that, bytes will be written at slave_buffer_pos, incrementing
- // slave_buffer_pos after each write.
- if(!slave_has_register_set) {
- slave_buffer_pos = TWDR;
- // don't acknowledge the master if this memory loctaion is out of bounds
- if ( slave_buffer_pos >= 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<<TWIE) | (1<<TWINT) | (ack<<TWEA) | (1<<TWEN);
-}
-#endif
diff --git a/keyboards/zinc/i2c.h b/keyboards/zinc/i2c.h
deleted file mode 100644
index 47cf6bd1b2..0000000000
--- a/keyboards/zinc/i2c.h
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef I2C_H
-#define I2C_H
-
-#include <stdint.h>
-
-#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 400kHz
-#define SCL_CLOCK 400000L
-
-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/zinc/keymaps/default/config.h b/keyboards/zinc/keymaps/default/config.h
index 4dcb0724ff..2185dc9ebe 100644
--- a/keyboards/zinc/keymaps/default/config.h
+++ b/keyboards/zinc/keymaps/default/config.h
@@ -20,8 +20,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
-// if you need more program area, try uncomment follow line
-#include "serial_config_simpleapi.h"
// place overrides here
// Selection of RGBLIGHT MODE to use.
diff --git a/keyboards/zinc/keymaps/default/keymap.c b/keyboards/zinc/keymaps/default/keymap.c
index 0f08d21ee7..cd1bf0328b 100644
--- a/keyboards/zinc/keymaps/default/keymap.c
+++ b/keyboards/zinc/keymaps/default/keymap.c
@@ -139,7 +139,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { \
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | |RGB ON| HUE+ | SAT+ | VAL+ | Mac | | Win | - | = |Print |ScLock|Pause |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
- * | | MODE | HUE- | SAT- | VAL- | | | | | | | | |
+ * |MODE R| MODE | HUE- | SAT- | VAL- | | | | | | |PageUp| |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | | | | EISU | EISU | EISU | | KANA | KANA | Home |PageDn|PageUp| End |
* `-----------------------------------------' `-----------------------------------------'
@@ -147,13 +147,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { \
[_ADJUST] = LAYOUT_ortho_4x12( \
_______, RESET, RGBRST, _______, _______, _______, _______, QWERTY, COLEMAK, DVORAK, _______, KC_INS, \
_______, RGB_TOG, RGB_HUI, RGB_SAI, RGB_VAI, AG_NORM, AG_SWAP, KC_MINS, KC_EQL, KC_PSCR, KC_SLCK, KC_PAUS,\
- _______, RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, _______, _______,\
- _______, _______, _______, EISU, EISU, EISU, KANA, KANA, KC_HOME, KC_PGDN, KC_PGUP, KC_END\
+ RGB_RMOD,RGB_MOD, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______, _______, _______, KC_PGUP, _______,\
+ _______, _______, _______, EISU, EISU, EISU, KANA, KANA, KANA, KC_HOME, KC_PGDN, KC_END\
)
};
// define variables for reactive RGB
-bool TOG_STATUS = false;
+bool TOG_STATUS = false;
// Setting ADJUST layer RGB back to default
void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
@@ -211,7 +211,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
return false;
break;
-
+
case RAISE:
if (record->event.pressed) {
//not sure how to have keyboard check mode and set it to a variable, so my work around
@@ -244,16 +244,28 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
return false;
break;
+
//led operations - RGB mode change now updates the RGB_current_mode to allow the right RGB mode to be set after reactive keys are released
+ case RGB_RMOD:
+ #if defined(RGBLIGHT_ENABLE)
+ if (record->event.pressed) {
+ rgblight_mode_noeeprom(RGB_current_config.mode);
+ rgblight_step_reverse();
+ RGB_current_config.mode = rgblight_config.mode;
+ }
+ return false;
+ #endif
+ break;
+
case RGB_MOD:
- #ifdef RGBLIGHT_ENABLE
+ #if defined(RGBLIGHT_ENABLE)
if (record->event.pressed) {
rgblight_mode_noeeprom(RGB_current_config.mode);
rgblight_step();
RGB_current_config.mode = rgblight_config.mode;
}
- #endif
return false;
+ #endif
break;
case EISU:
diff --git a/keyboards/zinc/keymaps/default/readme_en.md b/keyboards/zinc/keymaps/default/readme_en.md
new file mode 100644
index 0000000000..6447e96ed4
--- /dev/null
+++ b/keyboards/zinc/keymaps/default/readme_en.md
@@ -0,0 +1,131 @@
+# The Default Zinc Layout
+## layout
+
+### 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 |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | Esc | Fn | Alt | Win |Lower |Space | | Space| Raise| Left | Down | Up | Right|
+ `------------------------------------------ ------------------------------------------'
+```
+
+### 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 |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right|
+ `------------------------------------------ ------------------------------------------'
+```
+
+### Dvorak
+
+```
+ ,-----------------------------------------. ,-----------------------------------------.
+ | Tab | ' | , | . | P | Y | | F | G | C | R | L | Del |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | Ctrl | A | O | E | U | I | | D | H | T | N | S | / |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | Shift| ; | Q | J | K | X | | B | M | W | V | Z |Enter |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | Esc |ADJUST| Alt | Win |LOWER |Space | | Space| RAISE| Left | Down | Up | Right|
+ `-----------------------------------------' `-----------------------------------------'
+```
+
+### Lower
+```
+ ,-----------------------------------------. ,-----------------------------------------.
+ | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | | | | | | | | - | _ | + | { | } | | |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | | | | | | | | | | | Home | End | |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | | | | | | | | | | Next | Vol- | Vol+ | Play |
+ `-----------------------------------------' `-----------------------------------------'
+```
+
+### 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 |
+ `-----------------------------------------' `-----------------------------------------'
+```
+
+### Adjust (Lower + Raise)
+```
+ ,-----------------------------------------. ,-----------------------------------------.
+ | | Reset|RGBRST|Aud on|Audoff| | | |Qwerty|Colemk|Dvorak| | Ins |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | |RGB ON| HUE+ | SAT+ | VAL+ | Mac | | Win | - | = |Print |ScLock|Pause |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ |MODE R|RGBMOD| HUE- | SAT- | VAL- | | | | | | |PageUp| |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | | | | EISU | EISU | EISU | | KANA | KANA | KANA | Home |PageDn| End |
+ `-----------------------------------------' `-----------------------------------------'
+```
+
+## Compile
+
+go to qmk top directory.
+
+```
+$ cd qmk_firmware
+```
+make with `zinc:<keymap_name>`
+
+```
+$ make zinc:default
+```
+
+To make and flash with `:flash`
+
+```
+$ make zinc:default:flash
+```
+
+
+## Customize
+
+You can customize from the command line.
+
+```
+# Zinc keyboard 'default' keymap: convenient command line option
+make ZINC=<options> zinc:defualt
+# option= back | under | both | cont | na | ios
+# ex.
+# make ZINC=under zinc:defualt
+# make ZINC=under,ios zinc:defualt
+# make ZINC=back zinc:default
+# make ZINC=back,na zinc:default
+# make ZINC=back,ios zinc:default
+```
+
+Or edit `qmk_firmware/keyboards/zinc/rev1/keymaps/~/rules.mk` directly.
+
+```
+# Zinc keyboard customize
+LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight)
+LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight)
+LED_BOTH_ENABLE = no # LED backlight and underglow
+LED_RGB_CONT = no # LED continuous backlight or/and underglow between left Zinc and right Zinc
+LED_ANIMATIONS = yes # LED animations
+IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone)
+```
diff --git a/keyboards/zinc/keymaps/default/readme_jp.md b/keyboards/zinc/keymaps/default/readme_jp.md
index dfedb37c15..8132f5036e 100644
--- a/keyboards/zinc/keymaps/default/readme_jp.md
+++ b/keyboards/zinc/keymaps/default/readme_jp.md
@@ -43,6 +43,44 @@
`-----------------------------------------' `-----------------------------------------'
```
+ ### Lower
+```
+ ,-----------------------------------------. ,-----------------------------------------.
+ | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | | | | | | | | - | _ | + | { | } | | |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | | | | | | | | | | | Home | End | |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | | | | | | | | | | Next | Vol- | Vol+ | Play |
+ `-----------------------------------------' `-----------------------------------------'
+```
+
+### 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 |
+ `-----------------------------------------' `-----------------------------------------'
+```
+
+### Adjust (Lower + Raise)
+```
+ ,-----------------------------------------. ,-----------------------------------------.
+ | | Reset|RGBRST|Aud on|Audoff| | | |Qwerty|Colemk|Dvorak| | Ins |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | |RGB ON| HUE+ | SAT+ | VAL+ | Mac | | Win | - | = |Print |ScLock|Pause |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ |MODE R|RGBMOD| HUE- | SAT- | VAL- | | | | | | |PageUp| |
+ |------+------+------+------+------+------| |------+------+------+------+------+------|
+ | | | | EISU | EISU | EISU | | KANA | KANA | KANA | Home |PageDn| End |
+ `-----------------------------------------' `-----------------------------------------'
+```
## コンパイルã®ä»•æ–¹
@@ -76,7 +114,7 @@ $ make zinc:default:clean
```
# Zinc keyboard 'default' keymap: convenient command line option
make ZINC=<options> zinc:defualt
-# option= back | under | na | ios
+# option= back | under | both | cont | na | ios
# ex.
# make ZINC=under zinc:defualt
# make ZINC=under,ios zinc:defualt
@@ -85,16 +123,16 @@ make ZINC=<options> zinc:defualt
# make ZINC=back,ios zinc:default
```
-ã‚ã‚‹ã„ã¯`qmk_firmware/keyboards/zinc/rev1/keymaps/default/rules.mk` ã®ä»¥ä¸‹ã®éƒ¨åˆ†ã‚’直接編集ã—ã¦æ©Ÿèƒ½ã‚’有効化ã—ã¦ãã ã•ã„。
+ã‚ã‚‹ã„ã¯`qmk_firmware/keyboards/zinc/rev1/keymaps/~/rules.mk` ã®ä»¥ä¸‹ã®éƒ¨åˆ†ã‚’直接編集ã—ã¦æ©Ÿèƒ½ã‚’有効化ã—ã¦ãã ã•ã„。
```
# Zinc keyboard customize
LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight)
LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight)
+LED_BOTH_ENABLE = no # LED backlight and underglow
+LED_RGB_CONT = no # LED continuous backlight or/and underglow between left Zinc and right Zinc
LED_ANIMATIONS = yes # LED animations
IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone)
-
-
```
## RGB backlight を有効ã«ã™ã‚‹
@@ -120,4 +158,4 @@ RBG Underglow ã‚„ RGBãƒãƒƒã‚¯ãƒ©ã‚¤ãƒˆã®è¼åº¦ã‚’抑ãˆã¦ã€iPad, iPhone ã«ã
```
IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone)
-``` \ No newline at end of file
+```
diff --git a/keyboards/zinc/keymaps/default/rules.mk b/keyboards/zinc/keymaps/default/rules.mk
index c980f7d00b..32e0f21610 100644
--- a/keyboards/zinc/keymaps/default/rules.mk
+++ b/keyboards/zinc/keymaps/default/rules.mk
@@ -20,6 +20,9 @@ define ZINC_CUSTOMISE_MSG
$(info Zinc customize)
$(info - LED_BACK_ENABLE=$(LED_BACK_ENABLE))
$(info - LED_UNDERGLOW_ENABLE=$(LED_UNDERGLOW_ENABLE))
+ $(info - LED_BOTH_ENABLE=$(LED_BOTH_ENABLE))
+ $(info - LED_RGB_CONT=$(LED_RGB_CONT))
+ $(info - RGB_MATRIX=$(RGB_MATRIX))
$(info - LED_ANIMATION=$(LED_ANIMATIONS))
$(info - IOS_DEVICE_ENABLE=$(IOS_DEVICE_ENABLE))
endef
@@ -27,6 +30,10 @@ endef
# Zinc keyboard customize
LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight)
LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight)
+LED_BOTH_ENABLE = no # LED backlight and underglow
+LED_RGB_CONT = no # LED continuous backlight or/and underglow between left Zinc and right Zinc
+RGB_MATRIX = no # RGB LED Matrix
+RGB_MATRIX_SPLIT_RIGHT = no # RGB Matrix for RIGHT Hand
LED_ANIMATIONS = yes # LED animations
IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone)
Link_Time_Optimization = no # if firmware size over limit, try this option
@@ -36,7 +43,7 @@ Link_Time_Optimization = no # if firmware size over limit, try this option
### Zinc keyboard 'default' keymap: convenient command line option
## make ZINC=<options> zinc:defualt
-## option= back | under | na | ios
+## option= back | under | both | cont | matrix | na | ios
## ex.
## make ZINC=under zinc:defualt
## make ZINC=under,ios zinc:defualt
@@ -47,9 +54,22 @@ Link_Time_Optimization = no # if firmware size over limit, try this option
ifneq ($(strip $(ZINC)),)
ifeq ($(findstring back,$(ZINC)), back)
LED_BACK_ENABLE = yes
- else ifeq ($(findstring under,$(ZINC)), under)
+ endif
+ ifeq ($(findstring under,$(ZINC)), under)
LED_UNDERGLOW_ENABLE = yes
endif
+ ifeq ($(findstring both,$(ZINC)), both)
+ LED_BOTH_ENABLE = yes
+ endif
+ ifeq ($(findstring cont,$(ZINC)), cont)
+ LED_RGB_CONT = yes
+ endif
+ ifeq ($(findstring matrix,$(ZINC)), matrix)
+ RGB_MATRIX = yes
+ endif
+ ifeq ($(findstring right,$(ZINC)), right)
+ RGB_MATRIX_SPLIT_RIGHT = yes
+ endif
ifeq ($(findstring na,$(ZINC)), na)
LED_ANIMATIONS = no
endif
@@ -62,10 +82,11 @@ endif
ifeq ($(strip $(LED_BACK_ENABLE)), yes)
RGBLIGHT_ENABLE = yes
- OPT_DEFS += -DRGBLED_BACK
ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes)
- $(eval $(call ZINC_CUSTOMISE_MSG))
- $(error LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE both 'yes')
+ OPT_DEFS += -DRGBLED_BOTH
+ $(info LED_BOTH_ENABLE option is enabled instead of LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE)
+ else
+ OPT_DEFS += -DRGBLED_BACK
endif
else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes)
RGBLIGHT_ENABLE = yes
@@ -73,18 +94,36 @@ else
RGBLIGHT_ENABLE = no
endif
+ifeq ($(strip $(LED_BOTH_ENABLE)), yes)
+ RGBLIGHT_ENABLE = yes
+ OPT_DEFS += -DRGBLED_BOTH
+endif
+
+ifeq ($(strip $(LED_RGB_CONT)), yes)
+ OPT_DEFS += -DRGBLED_CONT
+endif
+
+ifeq ($(strip $(RGB_MATRIX)), yes)
+ RGBLIGHT_ENABLE = no
+ RGB_MATRIX_ENABLE = WS2812
+endif
+
ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes)
- OPT_DEFS += -DIOS_DEVICE_ENABLE
+ OPT_DEFS += -DIOS_DEVICE_ENABLE
endif
ifeq ($(strip $(LED_ANIMATIONS)), yes)
-# OPT_DEFS += -DRGBLIGHT_ANIMATIONS
- OPT_DEFS += -DLED_ANIMATIONS
+# OPT_DEFS += -DRGBLIGHT_ANIMATIONS
+ OPT_DEFS += -DLED_ANIMATIONS
+
+endif
+ifeq ($(strip $(RGB_MATRIX_SPLIT_RIGHT)), yes)
+ OPT_DEFS += -DRGB_MATRIX_SPLIT_RIGHT
endif
ifeq ($(strip $(Link_Time_Optimization)),yes)
- EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization
+ EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization
endif
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
diff --git a/keyboards/zinc/keymaps/ginjake/config.h b/keyboards/zinc/keymaps/ginjake/config.h
index 4dcb0724ff..2185dc9ebe 100644
--- a/keyboards/zinc/keymaps/ginjake/config.h
+++ b/keyboards/zinc/keymaps/ginjake/config.h
@@ -20,8 +20,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
-// if you need more program area, try uncomment follow line
-#include "serial_config_simpleapi.h"
// place overrides here
// Selection of RGBLIGHT MODE to use.
diff --git a/keyboards/zinc/keymaps/ginjake/rules.mk b/keyboards/zinc/keymaps/ginjake/rules.mk
index 2dcefc0016..2cb59fe8b8 100644
--- a/keyboards/zinc/keymaps/ginjake/rules.mk
+++ b/keyboards/zinc/keymaps/ginjake/rules.mk
@@ -1,12 +1,11 @@
-
# 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(+1000)
-MOUSEKEY_ENABLE = no # Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
-CONSOLE_ENABLE = no # Console for debug(+400)
+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
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
@@ -21,6 +20,8 @@ define ZINC_CUSTOMISE_MSG
$(info Zinc customize)
$(info - LED_BACK_ENABLE=$(LED_BACK_ENABLE))
$(info - LED_UNDERGLOW_ENABLE=$(LED_UNDERGLOW_ENABLE))
+ $(info - LED_BOTH_ENABLE=$(LED_BOTH_ENABLE))
+ $(info - LED_RGB_CONT=$(LED_RGB_CONT))
$(info - LED_ANIMATION=$(LED_ANIMATIONS))
$(info - IOS_DEVICE_ENABLE=$(IOS_DEVICE_ENABLE))
endef
@@ -28,6 +29,8 @@ endef
# Zinc keyboard customize
LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight)
LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight)
+LED_BOTH_ENABLE = no # LED backlight and underglow
+LED_RGB_CONT = no # LED continuous backlight or/and underglow between left Zinc and right Zinc
LED_ANIMATIONS = yes # LED animations
IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone)
Link_Time_Optimization = no # if firmware size over limit, try this option
@@ -37,7 +40,7 @@ Link_Time_Optimization = no # if firmware size over limit, try this option
### Zinc keyboard 'default' keymap: convenient command line option
## make ZINC=<options> zinc:defualt
-## option= back | under | na | ios
+## option= back | under | both | cont | na | ios
## ex.
## make ZINC=under zinc:defualt
## make ZINC=under,ios zinc:defualt
@@ -48,9 +51,16 @@ Link_Time_Optimization = no # if firmware size over limit, try this option
ifneq ($(strip $(ZINC)),)
ifeq ($(findstring back,$(ZINC)), back)
LED_BACK_ENABLE = yes
- else ifeq ($(findstring under,$(ZINC)), under)
+ endif
+ ifeq ($(findstring under,$(ZINC)), under)
LED_UNDERGLOW_ENABLE = yes
endif
+ ifeq ($(findstring both,$(ZINC)), both)
+ LED_BOTH_ENABLE = yes
+ endif
+ ifeq ($(findstring cont,$(ZINC)), cont)
+ LED_RGB_CONT = yes
+ endif
ifeq ($(findstring na,$(ZINC)), na)
LED_ANIMATIONS = no
endif
@@ -63,10 +73,11 @@ endif
ifeq ($(strip $(LED_BACK_ENABLE)), yes)
RGBLIGHT_ENABLE = yes
- OPT_DEFS += -DRGBLED_BACK
ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes)
- $(eval $(call ZINC_CUSTOMISE_MSG))
- $(error LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE both 'yes')
+ OPT_DEFS += -DRGBLED_BOTH
+ $(info LED_BOTH_ENABLE option is enabled instead of LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE)
+ else
+ OPT_DEFS += -DRGBLED_BACK
endif
else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes)
RGBLIGHT_ENABLE = yes
@@ -74,18 +85,27 @@ else
RGBLIGHT_ENABLE = no
endif
+ifeq ($(strip $(LED_BOTH_ENABLE)), yes)
+ RGBLIGHT_ENABLE = yes
+ OPT_DEFS += -DRGBLED_BOTH
+endif
+
+ifeq ($(strip $(LED_RGB_CONT)), yes)
+ OPT_DEFS += -DRGBLED_CONT
+endif
+
ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes)
- OPT_DEFS += -DIOS_DEVICE_ENABLE
+ OPT_DEFS += -DIOS_DEVICE_ENABLE
endif
ifeq ($(strip $(LED_ANIMATIONS)), yes)
-# OPT_DEFS += -DRGBLIGHT_ANIMATIONS
- OPT_DEFS += -DLED_ANIMATIONS
+# OPT_DEFS += -DRGBLIGHT_ANIMATIONS
+ OPT_DEFS += -DLED_ANIMATIONS
endif
ifeq ($(strip $(Link_Time_Optimization)),yes)
- EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization
+ EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization
endif
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
diff --git a/keyboards/zinc/keymaps/monks/config.h b/keyboards/zinc/keymaps/monks/config.h
index 4dcb0724ff..2185dc9ebe 100644
--- a/keyboards/zinc/keymaps/monks/config.h
+++ b/keyboards/zinc/keymaps/monks/config.h
@@ -20,8 +20,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
-// if you need more program area, try uncomment follow line
-#include "serial_config_simpleapi.h"
// place overrides here
// Selection of RGBLIGHT MODE to use.
diff --git a/keyboards/zinc/keymaps/monks/keymap.c b/keyboards/zinc/keymaps/monks/keymap.c
index 5fd7c6aa85..a30e8ac5fc 100644
--- a/keyboards/zinc/keymaps/monks/keymap.c
+++ b/keyboards/zinc/keymaps/monks/keymap.c
@@ -119,6 +119,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { \
// define variables for reactive RGB
bool TOG_STATUS = false;
+
// Setting ADJUST layer RGB back to default
void update_tri_layer_RGB(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
@@ -163,7 +164,7 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
}
return false;
break;
-
+
case RAISE:
if (record->event.pressed) {
//not sure how to have keyboard check mode and set it to a variable, so my work around
diff --git a/keyboards/zinc/keymaps/monks/readme_jp.md b/keyboards/zinc/keymaps/monks/readme_jp.md
index f1495af4c8..e518eb7696 100644
--- a/keyboards/zinc/keymaps/monks/readme_jp.md
+++ b/keyboards/zinc/keymaps/monks/readme_jp.md
@@ -100,4 +100,4 @@ RBG Underglow ã‚„ RGBãƒãƒƒã‚¯ãƒ©ã‚¤ãƒˆã®è¼åº¦ã‚’抑ãˆã¦ã€iPad, iPhone ã«ã
```
IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone)
-``` \ No newline at end of file
+```
diff --git a/keyboards/zinc/keymaps/monks/rules.mk b/keyboards/zinc/keymaps/monks/rules.mk
index eeabc004c3..c1b98deada 100644
--- a/keyboards/zinc/keymaps/monks/rules.mk
+++ b/keyboards/zinc/keymaps/monks/rules.mk
@@ -1,12 +1,11 @@
-
# 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(+1000)
-MOUSEKEY_ENABLE = no # Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
-CONSOLE_ENABLE = no # Console for debug(+400)
+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
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
@@ -21,6 +20,8 @@ define ZINC_CUSTOMISE_MSG
$(info Zinc customize)
$(info - LED_BACK_ENABLE=$(LED_BACK_ENABLE))
$(info - LED_UNDERGLOW_ENABLE=$(LED_UNDERGLOW_ENABLE))
+ $(info - LED_BOTH_ENABLE=$(LED_BOTH_ENABLE))
+ $(info - LED_RGB_CONT=$(LED_RGB_CONT))
$(info - LED_ANIMATION=$(LED_ANIMATIONS))
$(info - IOS_DEVICE_ENABLE=$(IOS_DEVICE_ENABLE))
endef
@@ -28,6 +29,8 @@ endef
# Zinc keyboard customize
LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight)
LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight)
+LED_BOTH_ENABLE = no # LED backlight and underglow
+LED_RGB_CONT = no # LED continuous backlight or/and underglow between left Zinc and right Zinc
LED_ANIMATIONS = yes # LED animations
IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone)
Link_Time_Optimization = no # if firmware size over limit, try this option
@@ -37,7 +40,7 @@ Link_Time_Optimization = no # if firmware size over limit, try this option
### Zinc keyboard 'default' keymap: convenient command line option
## make ZINC=<options> zinc:defualt
-## option= back | under | na | ios
+## option= back | under | both | cont | na | ios
## ex.
## make ZINC=under zinc:defualt
## make ZINC=under,ios zinc:defualt
@@ -48,9 +51,16 @@ Link_Time_Optimization = no # if firmware size over limit, try this option
ifneq ($(strip $(ZINC)),)
ifeq ($(findstring back,$(ZINC)), back)
LED_BACK_ENABLE = yes
- else ifeq ($(findstring under,$(ZINC)), under)
+ endif
+ ifeq ($(findstring under,$(ZINC)), under)
LED_UNDERGLOW_ENABLE = yes
endif
+ ifeq ($(findstring both,$(ZINC)), both)
+ LED_BOTH_ENABLE = yes
+ endif
+ ifeq ($(findstring cont,$(ZINC)), cont)
+ LED_RGB_CONT = yes
+ endif
ifeq ($(findstring na,$(ZINC)), na)
LED_ANIMATIONS = no
endif
@@ -63,10 +73,11 @@ endif
ifeq ($(strip $(LED_BACK_ENABLE)), yes)
RGBLIGHT_ENABLE = yes
- OPT_DEFS += -DRGBLED_BACK
ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes)
- $(eval $(call ZINC_CUSTOMISE_MSG))
- $(error LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE both 'yes')
+ OPT_DEFS += -DRGBLED_BOTH
+ $(info LED_BOTH_ENABLE option is enabled instead of LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE)
+ else
+ OPT_DEFS += -DRGBLED_BACK
endif
else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes)
RGBLIGHT_ENABLE = yes
@@ -74,17 +85,27 @@ else
RGBLIGHT_ENABLE = no
endif
+ifeq ($(strip $(LED_BOTH_ENABLE)), yes)
+ RGBLIGHT_ENABLE = yes
+ OPT_DEFS += -DRGBLED_BOTH
+endif
+
+ifeq ($(strip $(LED_RGB_CONT)), yes)
+ OPT_DEFS += -DRGBLED_CONT
+endif
+
ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes)
- OPT_DEFS += -DIOS_DEVICE_ENABLE
+ OPT_DEFS += -DIOS_DEVICE_ENABLE
endif
ifeq ($(strip $(LED_ANIMATIONS)), yes)
-# OPT_DEFS += -DRGBLIGHT_ANIMATIONS
- OPT_DEFS += -DLED_ANIMATIONS
+# OPT_DEFS += -DRGBLIGHT_ANIMATIONS
+ OPT_DEFS += -DLED_ANIMATIONS
+
endif
ifeq ($(strip $(Link_Time_Optimization)),yes)
- EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization
+ EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization
endif
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
@@ -94,4 +115,3 @@ SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
# $(info -- RGBLIGHT_ENABLE=$(RGBLIGHT_ENABLE))
# $(info -- OPT_DEFS=$(OPT_DEFS))
# $(info )
-
diff --git a/keyboards/zinc/keymaps/toshi0383/config.h b/keyboards/zinc/keymaps/toshi0383/config.h
index 33108a29e6..0d53d44247 100644
--- a/keyboards/zinc/keymaps/toshi0383/config.h
+++ b/keyboards/zinc/keymaps/toshi0383/config.h
@@ -21,8 +21,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
-// if you need more program area, try uncomment follow line
-#include "serial_config_simpleapi.h"
// place overrides here
// Selection of RGBLIGHT MODE to use.
diff --git a/keyboards/zinc/keymaps/toshi0383/rules.mk b/keyboards/zinc/keymaps/toshi0383/rules.mk
index dca9aa7ff8..26ac02f3a0 100644
--- a/keyboards/zinc/keymaps/toshi0383/rules.mk
+++ b/keyboards/zinc/keymaps/toshi0383/rules.mk
@@ -1,11 +1,12 @@
# Build Options
-# change yes to no to disable
+# 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
+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
+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
@@ -19,6 +20,9 @@ define ZINC_CUSTOMISE_MSG
$(info Zinc customize)
$(info - LED_BACK_ENABLE=$(LED_BACK_ENABLE))
$(info - LED_UNDERGLOW_ENABLE=$(LED_UNDERGLOW_ENABLE))
+ $(info - LED_BOTH_ENABLE=$(LED_BOTH_ENABLE))
+ $(info - LED_RGB_CONT=$(LED_RGB_CONT))
+ $(info - RGB_MATRIX=$(RGB_MATRIX))
$(info - LED_ANIMATION=$(LED_ANIMATIONS))
$(info - IOS_DEVICE_ENABLE=$(IOS_DEVICE_ENABLE))
endef
@@ -26,6 +30,10 @@ endef
# Zinc keyboard customize
LED_BACK_ENABLE = no # LED backlight (Enable SK6812mini backlight)
LED_UNDERGLOW_ENABLE = no # LED underglow (Enable WS2812 RGB underlight)
+LED_BOTH_ENABLE = no # LED backlight and underglow
+LED_RGB_CONT = no # LED continuous backlight or/and underglow between left Zinc and right Zinc
+RGB_MATRIX = no # RGB LED Matrix
+RGB_MATRIX_SPLIT_RIGHT = no # RGB Matrix for RIGHT Hand
LED_ANIMATIONS = yes # LED animations
IOS_DEVICE_ENABLE = no # connect to IOS device (iPad,iPhone)
Link_Time_Optimization = no # if firmware size over limit, try this option
@@ -35,7 +43,7 @@ Link_Time_Optimization = no # if firmware size over limit, try this option
### Zinc keyboard 'default' keymap: convenient command line option
## make ZINC=<options> zinc:defualt
-## option= back | under | na | ios
+## option= back | under | both | cont | matrix | na | ios
## ex.
## make ZINC=under zinc:defualt
## make ZINC=under,ios zinc:defualt
@@ -46,9 +54,22 @@ Link_Time_Optimization = no # if firmware size over limit, try this option
ifneq ($(strip $(ZINC)),)
ifeq ($(findstring back,$(ZINC)), back)
LED_BACK_ENABLE = yes
- else ifeq ($(findstring under,$(ZINC)), under)
+ endif
+ ifeq ($(findstring under,$(ZINC)), under)
LED_UNDERGLOW_ENABLE = yes
endif
+ ifeq ($(findstring both,$(ZINC)), both)
+ LED_BOTH_ENABLE = yes
+ endif
+ ifeq ($(findstring cont,$(ZINC)), cont)
+ LED_RGB_CONT = yes
+ endif
+ ifeq ($(findstring matrix,$(ZINC)), matrix)
+ RGB_MATRIX = yes
+ endif
+ ifeq ($(findstring right,$(ZINC)), right)
+ RGB_MATRIX_SPLIT_RIGHT = yes
+ endif
ifeq ($(findstring na,$(ZINC)), na)
LED_ANIMATIONS = no
endif
@@ -61,10 +82,11 @@ endif
ifeq ($(strip $(LED_BACK_ENABLE)), yes)
RGBLIGHT_ENABLE = yes
- OPT_DEFS += -DRGBLED_BACK
ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes)
- $(eval $(call ZINC_CUSTOMISE_MSG))
- $(error LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE both 'yes')
+ OPT_DEFS += -DRGBLED_BOTH
+ $(info LED_BOTH_ENABLE option is enabled instead of LED_BACK_ENABLE and LED_UNDERGLOW_ENABLE)
+ else
+ OPT_DEFS += -DRGBLED_BACK
endif
else ifeq ($(strip $(LED_UNDERGLOW_ENABLE)), yes)
RGBLIGHT_ENABLE = yes
@@ -72,24 +94,43 @@ else
RGBLIGHT_ENABLE = no
endif
+ifeq ($(strip $(LED_BOTH_ENABLE)), yes)
+ RGBLIGHT_ENABLE = yes
+ OPT_DEFS += -DRGBLED_BOTH
+endif
+
+ifeq ($(strip $(LED_RGB_CONT)), yes)
+ OPT_DEFS += -DRGBLED_CONT
+endif
+
+ifeq ($(strip $(RGB_MATRIX)), yes)
+ RGBLIGHT_ENABLE = no
+ RGB_MATRIX_ENABLE = WS2812
+endif
+
ifeq ($(strip $(IOS_DEVICE_ENABLE)), yes)
- OPT_DEFS += -DIOS_DEVICE_ENABLE
+ OPT_DEFS += -DIOS_DEVICE_ENABLE
endif
ifeq ($(strip $(LED_ANIMATIONS)), yes)
-# OPT_DEFS += -DRGBLIGHT_ANIMATIONS
- OPT_DEFS += -DLED_ANIMATIONS
+# OPT_DEFS += -DRGBLIGHT_ANIMATIONS
+ OPT_DEFS += -DLED_ANIMATIONS
+
+endif
+
+ifeq ($(strip $(RGB_MATRIX_SPLIT_RIGHT)), yes)
+ OPT_DEFS += -DRGB_MATRIX_SPLIT_RIGHT
endif
ifeq ($(strip $(Link_Time_Optimization)),yes)
- EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization
+ EXTRAFLAGS += -flto -DUSE_Link_Time_Optimization
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
+
# Uncomment these for debugging
# $(info -- RGBLIGHT_ENABLE=$(RGBLIGHT_ENABLE))
# $(info -- OPT_DEFS=$(OPT_DEFS))
# $(info )
-
diff --git a/keyboards/zinc/readme.md b/keyboards/zinc/readme.md
index 3b4ce105c8..0e8d6cd65d 100644
--- a/keyboards/zinc/readme.md
+++ b/keyboards/zinc/readme.md
@@ -5,9 +5,9 @@ Zinc
40% row-staggered split keyboard.
-Keyboard Maintainer: [monksoffunk](https://github.com/monksoffunk/) [@monksoffunkJP](https://twitter.com/monksoffunkJP)
-Hardware Supported: Zinc PCB
-Hardware Availability: (https://twitter.com/monksoffunkJP)
+* Keyboard Maintainer: [monksoffunk](https://github.com/monksoffunk/) [@monksoffunkJP](https://twitter.com/monksoffunkJP)
+* Hardware Supported: Zinc PCB
+* Hardware Availability: (https://twitter.com/monksoffunkJP)
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/zinc/rev1/config.h b/keyboards/zinc/rev1/config.h
index 6713b3098a..1eb63df5bc 100644
--- a/keyboards/zinc/rev1/config.h
+++ b/keyboards/zinc/rev1/config.h
@@ -18,9 +18,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once
-//#ifndef REV1_CONFIG_H
-//#define REV1_CONFIG_H
-
/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x9991
@@ -33,9 +30,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define TAPPING_TERM 100
/* Use I2C or Serial */
-//#define USE_I2C
#define USE_SERIAL
-//#define USE_MATRIX_I2C
+#define SOFT_SERIAL_PIN D2
/* Select hand configuration */
#define MASTER_LEFT
@@ -44,18 +40,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* key matrix size */
// Rows are doubled-up
- #define MATRIX_ROWS 8
- #define MATRIX_ROW_PINS { F6, F7, B1, B3 }
+#define MATRIX_ROWS 8
+#define MATRIX_ROW_PINS { F6, F7, B1, B3 }
// wiring of each half
#define MATRIX_COLS 6
#define MATRIX_COL_PINS { F4, D4, C6, D7, E6, B4 }
-/* define if matrix has ghost */
-//#define MATRIX_HAS_GHOST
-
-/* number of backlight levels */
-// #define BACKLIGHT_LEVELS 3
+#define DIODE_DIRECTION COL2ROW
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
@@ -67,25 +59,44 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* ws2812 RGB LED */
#define RGB_DI_PIN D3
-#define RGBLIGHT_TIMER
-//#define RGBLED_NUM 12 // Number of LEDs. see ./keymaps/default/config.h
-#define ws2812_PORTREG PORTD
-#define ws2812_DDRREG DDRD
// RGB LED support
//#define RGBLIGHT_ANIMATIONS : see ./rules.mk: LED_ANIMATIONS = yes or no
// see ./rules.mk: LED_BACK_ENABLE or LED_UNDERGLOW_ENABLE set yes
-#ifdef RGBLED_BACK
- #define RGBLED_NUM 24
-#else
- #define RGBLED_NUM 6
+#ifdef RGBLIGHT_ENABLE
+ #define RGBLIGHT_SPLIT
+ #ifdef RGBLED_BACK
+ #ifdef RGBLED_CONT
+ #define RGBLED_NUM 48
+ #define RGBLED_SPLIT { 24, 24 }
+ #else
+ #define RGBLED_NUM 24
+ #endif
+ #else
+ #ifdef RGBLED_BOTH
+ #ifdef RGBLED_CONT
+ #define RGBLED_NUM 60
+ #define RGBLED_SPLIT { 30, 30 }
+// #define RGBLIGHT_LED_MAP {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,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}
+ #else
+ #define RGBLED_NUM 30
+ #endif
+ #else
+ #ifdef RGBLED_CONT
+ #define RGBLED_NUM 12
+ #define RGBLED_SPLIT { 6, 6 }
+ #else
+ #define RGBLED_NUM 6
+ #endif
+ #endif
+ #endif
#endif
#ifndef IOS_DEVICE_ENABLE
- #if RGBLED_NUM <= 6
+ #if (RGBLED_NUM <= 6) || (defined(RGBLED_CONT) && (RGBLED_NUM <= 12))
#define RGBLIGHT_LIMIT_VAL 255
#else
- #if RGBLED_NUM <= 16
+ #if (RGBLED_NUM <= 16) || (defined(RGBLED_CONT) && (RGBLED_NUM <= 32))
#define RGBLIGHT_LIMIT_VAL 130
#else
#define RGBLIGHT_LIMIT_VAL 120
@@ -93,10 +104,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#endif
#define RGBLIGHT_VAL_STEP 17
#else
- #if RGBLED_NUM <= 6
+ #if (RGBLED_NUM <= 6) || (defined(RGBLED_CONT) && (RGBLED_NUM <= 12))
#define RGBLIGHT_LIMIT_VAL 90
#else
- #if RGBLED_NUM <= 16
+ #if (RGBLED_NUM <= 16) || (defined(RGBLED_CONT) && (RGBLED_NUM <= 32))
#define RGBLIGHT_LIMIT_VAL 45
#else
#define RGBLIGHT_LIMIT_VAL 35
@@ -136,5 +147,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
-
-//#endif
diff --git a/keyboards/zinc/rev1/matrix.c b/keyboards/zinc/rev1/matrix.c
deleted file mode 100644
index df674ce143..0000000000
--- a/keyboards/zinc/rev1/matrix.c
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
-Copyright 2012 Jun Wako <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * scan matrix
- */
-#include <stdint.h>
-#include <stdbool.h>
-#include <string.h>
-#include <avr/io.h>
-#include <avr/wdt.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "split_util.h"
-#include "quantum.h"
-
-#ifdef USE_MATRIX_I2C
-# include "i2c.h"
-#else // USE_SERIAL
-# include "split_scomm.h"
-#endif
-
-#ifndef DEBOUNCE
-# define DEBOUNCE 5
-#endif
-
-#define ERROR_DISCONNECT_COUNT 5
-
-static uint8_t debouncing = DEBOUNCE;
-static const int ROWS_PER_HAND = MATRIX_ROWS/2;
-static uint8_t error_count = 0;
-uint8_t is_master = 0 ;
-
-static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
-static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-static matrix_row_t matrix_debouncing[MATRIX_ROWS];
-
-static matrix_row_t read_cols(void);
-static void init_cols(void);
-static void unselect_rows(void);
-static void select_row(uint8_t row);
-static uint8_t matrix_master_scan(void);
-
-
-__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) {
-}
-
-inline
-uint8_t matrix_rows(void)
-{
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void)
-{
- return MATRIX_COLS;
-}
-
-void matrix_init(void)
-{
- debug_enable = true;
- debug_matrix = true;
- debug_mouse = true;
- // initialize row and col
- unselect_rows();
- init_cols();
-
- setPinOutput(B0);
- setPinOutput(D5);
- writePinHigh(D5);
- writePinHigh(B0);
-
- // initialize matrix state: all keys off
- for (uint8_t i=0; i < MATRIX_ROWS; i++) {
- matrix[i] = 0;
- matrix_debouncing[i] = 0;
- }
-
- is_master = has_usb();
-
- matrix_init_quantum();
-}
-
-uint8_t _matrix_scan(void)
-{
- // Right hand is stored after the left in the matirx so, we need to offset it
- int offset = isLeftHand ? 0 : (ROWS_PER_HAND);
-
- for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
- select_row(i);
- _delay_us(30); // without this wait read unstable value.
- matrix_row_t cols = read_cols();
- if (matrix_debouncing[i+offset] != cols) {
- matrix_debouncing[i+offset] = cols;
- debouncing = DEBOUNCE;
- }
- unselect_rows();
- }
-
- if (debouncing) {
- if (--debouncing) {
- _delay_ms(1);
- } else {
- for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
- matrix[i+offset] = matrix_debouncing[i+offset];
- }
- }
- }
-
- return 1;
-}
-
-#ifdef USE_MATRIX_I2C
-
-// Get rows from other half over i2c
-int i2c_transaction(void) {
- int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
-
- int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE);
- if (err) goto i2c_error;
-
- // start of matrix stored at 0x00
- err = i2c_master_write(0x00);
- if (err) goto i2c_error;
-
- // Start read
- err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ);
- if (err) goto i2c_error;
-
- if (!err) {
- int i;
- for (i = 0; i < ROWS_PER_HAND-1; ++i) {
- matrix[slaveOffset+i] = i2c_master_read(I2C_ACK);
- }
- matrix[slaveOffset+i] = i2c_master_read(I2C_NACK);
- i2c_master_stop();
- } else {
-i2c_error: // the cable is disconnceted, or something else went wrong
- i2c_reset_state();
- return err;
- }
-
- return 0;
-}
-
-#else // USE_SERIAL
-
-int serial_transaction(int master_changed) {
- int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
-#ifdef SERIAL_USE_MULTI_TRANSACTION
- int ret=serial_update_buffers(master_changed);
-#else
- int ret=serial_update_buffers();
-#endif
- if (ret ) {
- if(ret==2) writePinLow(B0);
- return 1;
- }
- writePinHigh(B0);
- memcpy(&matrix[slaveOffset],
- (void *)serial_slave_buffer, sizeof(serial_slave_buffer));
- return 0;
-}
-#endif
-
-uint8_t matrix_scan(void)
-{
- if (is_master) {
- matrix_master_scan();
- }else{
- matrix_slave_scan();
- int offset = (isLeftHand) ? ROWS_PER_HAND : 0;
- memcpy(&matrix[offset],
- (void *)serial_master_buffer, sizeof(serial_master_buffer));
- matrix_scan_quantum();
- }
- return 1;
-}
-
-
-uint8_t matrix_master_scan(void) {
-
- int ret = _matrix_scan();
- int mchanged = 1;
- int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
-
-#ifdef USE_MATRIX_I2C
-// for (int i = 0; i < ROWS_PER_HAND; ++i) {
- /* i2c_slave_buffer[i] = matrix[offset+i]; */
-// i2c_slave_buffer[i] = matrix[offset+i];
-// }
-#else // USE_SERIAL
- #ifdef SERIAL_USE_MULTI_TRANSACTION
- mchanged = memcmp((void *)serial_master_buffer,
- &matrix[offset], sizeof(serial_master_buffer));
- #endif
- memcpy((void *)serial_master_buffer,
- &matrix[offset], sizeof(serial_master_buffer));
-#endif
-
-#ifdef USE_MATRIX_I2C
- if( i2c_transaction() ) {
-#else // USE_SERIAL
- if( serial_transaction(mchanged) ) {
-#endif
- // turn on the indicator led when halves are disconnected
- writePinLow(D5);
-
- error_count++;
-
- if (error_count > ERROR_DISCONNECT_COUNT) {
- // reset other half if disconnected
- int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- matrix[slaveOffset+i] = 0;
- }
- }
- } else {
- // turn off the indicator led on no error
- writePinHigh(D5);
- error_count = 0;
- }
- matrix_scan_quantum();
- return ret;
-}
-
-void matrix_slave_scan(void) {
- _matrix_scan();
-
- int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
-
-#ifdef USE_MATRIX_I2C
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- /* i2c_slave_buffer[i] = matrix[offset+i]; */
- i2c_slave_buffer[i] = matrix[offset+i];
- }
-#else // USE_SERIAL
- #ifdef SERIAL_USE_MULTI_TRANSACTION
- int change = 0;
- #endif
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- #ifdef SERIAL_USE_MULTI_TRANSACTION
- if( serial_slave_buffer[i] != matrix[offset+i] )
- change = 1;
- #endif
- serial_slave_buffer[i] = matrix[offset+i];
- }
- #ifdef SERIAL_USE_MULTI_TRANSACTION
- slave_buffer_change_count += change;
- #endif
-#endif
-}
-
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- return true;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & ((matrix_row_t)1<<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print("\nr/c 0123456789ABCDEF\n");
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- phex(row); print(": ");
- pbin_reverse16(matrix_get_row(row));
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += bitpop16(matrix[i]);
- }
- return count;
-}
-
-static void init_cols(void)
-{
- for(int x = 0; x < MATRIX_COLS; x++) {
- _SFR_IO8((col_pins[x] >> 4) + 1) &= ~_BV(col_pins[x] & 0xF);
- _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF);
- }
-}
-
-static matrix_row_t read_cols(void)
-{
- matrix_row_t result = 0;
- for(int x = 0; x < MATRIX_COLS; x++) {
- result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x);
- }
- return result;
-}
-
-static void unselect_rows(void)
-{
- for(int x = 0; x < ROWS_PER_HAND; x++) {
- _SFR_IO8((row_pins[x] >> 4) + 1) &= ~_BV(row_pins[x] & 0xF);
- _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF);
- }
-}
-
-static void select_row(uint8_t row)
-{
- _SFR_IO8((row_pins[row] >> 4) + 1) |= _BV(row_pins[row] & 0xF);
- _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF);
-}
diff --git a/keyboards/zinc/rev1/rev1.c b/keyboards/zinc/rev1/rev1.c
index 2ce08a07c4..a9c2cfdbac 100644
--- a/keyboards/zinc/rev1/rev1.c
+++ b/keyboards/zinc/rev1/rev1.c
@@ -3,4 +3,3 @@
void matrix_init_kb(void) {
matrix_init_user();
};
-
diff --git a/keyboards/zinc/rev1/rev1.h b/keyboards/zinc/rev1/rev1.h
index aa1c408b0b..1bf2c565ae 100644
--- a/keyboards/zinc/rev1/rev1.h
+++ b/keyboards/zinc/rev1/rev1.h
@@ -1,22 +1,7 @@
#pragma once
-#include "../zinc.h"
-
#include "quantum.h"
-#ifdef RGBLIGHT_ENABLE
-//rgb led driver
-#include "ws2812.h"
-#endif
-
-#ifdef USE_I2C
-#include <stddef.h>
-#ifdef __AVR__
- #include <avr/io.h>
- #include <avr/interrupt.h>
-#endif
-#endif
-
// Standard Keymap
// (TRRS jack on both halves are to the left side)
#define LAYOUT( \
diff --git a/keyboards/zinc/rev1/rules.mk b/keyboards/zinc/rev1/rules.mk
index e78b9258d7..d38a618090 100644
--- a/keyboards/zinc/rev1/rules.mk
+++ b/keyboards/zinc/rev1/rules.mk
@@ -1,4 +1 @@
-SRC += rev1/matrix.c
-SRC += rev1/split_util.c
-SRC += rev1/split_scomm.c
-SRC += ws2812.c
+SPLIT_KEYBOARD = yes
diff --git a/keyboards/zinc/rev1/serial_config.h b/keyboards/zinc/rev1/serial_config.h
deleted file mode 100644
index 9fb5dfc671..0000000000
--- a/keyboards/zinc/rev1/serial_config.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef SOFT_SERIAL_CONFIG_H
-#define SOFT_SERIAL_CONFIG_H
-
-#ifndef SOFT_SERIAL_PIN
-/* Soft Serial defines */
-#define SOFT_SERIAL_PIN D2
-// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5
-// // 1: about 137kbps (default)
-// // 2: about 75kbps
-// // 3: about 39kbps
-// // 4: about 26kbps
-// // 5: about 20kbps
-#endif
-
-//// USE flexible API (using multi-type transaction function)
-#define SERIAL_USE_MULTI_TRANSACTION
-
-#endif /* SOFT_SERIAL_CONFIG_H */
diff --git a/keyboards/zinc/rev1/serial_config_simpleapi.h b/keyboards/zinc/rev1/serial_config_simpleapi.h
deleted file mode 100644
index e2d22a41e7..0000000000
--- a/keyboards/zinc/rev1/serial_config_simpleapi.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef SERIAL_CONFIG_SIMPLEAPI_H
-#define SERIAL_CONFIG_SIMPLEAPI_H
-
-#undef SERIAL_USE_MULTI_TRANSACTION
-#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
-#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2
-
-#endif // SERIAL_CONFIG_SIMPLEAPI_H
diff --git a/keyboards/zinc/rev1/split_scomm.c b/keyboards/zinc/rev1/split_scomm.c
deleted file mode 100644
index 50d233ce9a..0000000000
--- a/keyboards/zinc/rev1/split_scomm.c
+++ /dev/null
@@ -1,95 +0,0 @@
-#ifdef USE_SERIAL
-#ifdef SERIAL_USE_MULTI_TRANSACTION
-/* --- USE flexible API (using multi-type transaction function) --- */
-
-#include <stdbool.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <split_scomm.h>
-#include "serial.h"
-#ifdef SERIAL_DEBUG_MODE
-#include <avr/io.h>
-#endif
-#ifdef CONSOLE_ENABLE
- #include <print.h>
-#endif
-
-uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0};
-uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
-uint8_t volatile status_com = 0;
-uint8_t volatile status1 = 0;
-uint8_t slave_buffer_change_count = 0;
-uint8_t s_change_old = 0xff;
-uint8_t s_change_new = 0xff;
-
-SSTD_t transactions[] = {
-#define GET_SLAVE_STATUS 0
- /* master buffer not changed, only recive slave_buffer_change_count */
- { (uint8_t *)&status_com,
- 0, NULL,
- sizeof(slave_buffer_change_count), &slave_buffer_change_count,
- },
-#define PUT_MASTER_GET_SLAVE_STATUS 1
- /* master buffer changed need send, and recive slave_buffer_change_count */
- { (uint8_t *)&status_com,
- sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer,
- sizeof(slave_buffer_change_count), &slave_buffer_change_count,
- },
-#define GET_SLAVE_BUFFER 2
- /* recive serial_slave_buffer */
- { (uint8_t *)&status1,
- 0, NULL,
- sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer
- }
-};
-
-void serial_master_init(void)
-{
- soft_serial_initiator_init(transactions, TID_LIMIT(transactions));
-}
-
-void serial_slave_init(void)
-{
- soft_serial_target_init(transactions, TID_LIMIT(transactions));
-}
-
-// 0 => no error
-// 1 => slave did not respond
-// 2 => checksum error
-int serial_update_buffers(int master_update)
-{
- int status, smatstatus;
- static int need_retry = 0;
-
- if( s_change_old != s_change_new ) {
- smatstatus = soft_serial_transaction(GET_SLAVE_BUFFER);
- if( smatstatus == TRANSACTION_END ) {
- s_change_old = s_change_new;
-#ifdef CONSOLE_ENABLE
- uprintf("slave matrix = %b %b %b %b %b\n",
- serial_slave_buffer[0], serial_slave_buffer[1],
- serial_slave_buffer[2], serial_slave_buffer[3],
- serial_slave_buffer[4] );
-#endif
- }
- } else {
- // serial_slave_buffer dosen't change
- smatstatus = TRANSACTION_END; // dummy status
- }
-
- if( !master_update && !need_retry) {
- status = soft_serial_transaction(GET_SLAVE_STATUS);
- } else {
- status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS);
- }
- if( status == TRANSACTION_END ) {
- s_change_new = slave_buffer_change_count;
- need_retry = 0;
- } else {
- need_retry = 1;
- }
- return smatstatus;
-}
-
-#endif // SERIAL_USE_MULTI_TRANSACTION
-#endif /* USE_SERIAL */
diff --git a/keyboards/zinc/rev1/split_scomm.h b/keyboards/zinc/rev1/split_scomm.h
deleted file mode 100644
index 873d8939d8..0000000000
--- a/keyboards/zinc/rev1/split_scomm.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef SPLIT_COMM_H
-#define SPLIT_COMM_H
-
-#ifndef SERIAL_USE_MULTI_TRANSACTION
-/* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */
-#include "serial.h"
-
-#else
-/* --- USE flexible API (using multi-type transaction function) --- */
-// Buffers for master - slave communication
-#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
-#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2
-
-extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
-extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH];
-extern uint8_t slave_buffer_change_count;
-
-void serial_master_init(void);
-void serial_slave_init(void);
-int serial_update_buffers(int master_changed);
-
-#endif
-
-#endif /* SPLIT_COMM_H */
diff --git a/keyboards/zinc/rev1/split_util.c b/keyboards/zinc/rev1/split_util.c
deleted file mode 100644
index e1ff8b4379..0000000000
--- a/keyboards/zinc/rev1/split_util.c
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <avr/io.h>
-#include <avr/wdt.h>
-#include <avr/power.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-#include <avr/eeprom.h>
-#include "split_util.h"
-#include "matrix.h"
-#include "keyboard.h"
-
-#ifdef USE_MATRIX_I2C
-# include "i2c.h"
-#else
-# include "split_scomm.h"
-#endif
-
-volatile bool isLeftHand = true;
-
-static void setup_handedness(void) {
- #ifdef EE_HANDS
- isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS);
- #else
- // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c
- #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT)
- isLeftHand = !has_usb();
- #else
- isLeftHand = has_usb();
- #endif
- #endif
-}
-
-static void keyboard_master_setup(void) {
-
-#ifdef USE_MATRIX_I2C
- i2c_master_init();
-#else
- serial_master_init();
-#endif
-}
-
-static void keyboard_slave_setup(void) {
-
-#ifdef USE_MATRIX_I2C
- i2c_slave_init(SLAVE_I2C_ADDRESS);
-#else
- serial_slave_init();
-#endif
-}
-
-bool has_usb(void) {
- USBCON |= (1 << OTGPADE); //enables VBUS pad
- _delay_us(5);
- return (USBSTA & (1<<VBUS)); //checks state of VBUS
-}
-
-void split_keyboard_setup(void) {
- setup_handedness();
-
- if (has_usb()) {
- keyboard_master_setup();
- } else {
- keyboard_slave_setup();
- }
- sei();
-}
-
-// this code runs before the usb and keyboard is initialized
-void matrix_setup(void) {
- split_keyboard_setup();
-}
diff --git a/keyboards/zinc/rev1/split_util.h b/keyboards/zinc/rev1/split_util.h
deleted file mode 100644
index 687ca19bd3..0000000000
--- a/keyboards/zinc/rev1/split_util.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef SPLIT_KEYBOARD_UTIL_H
-#define SPLIT_KEYBOARD_UTIL_H
-
-#include <stdbool.h>
-#include "eeconfig.h"
-
-#define SLAVE_I2C_ADDRESS 0x32
-
-extern volatile bool isLeftHand;
-
-// slave version of matix scan, defined in matrix.c
-void matrix_slave_scan(void);
-
-void split_keyboard_setup(void);
-bool has_usb(void);
-
-void matrix_master_OLED_init (void);
-
-#endif
diff --git a/keyboards/zinc/reva/config.h b/keyboards/zinc/reva/config.h
index 8eeb154acc..e94ffb7c65 100644
--- a/keyboards/zinc/reva/config.h
+++ b/keyboards/zinc/reva/config.h
@@ -30,9 +30,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define TAPPING_TERM 100
/* Use I2C or Serial */
-//#define USE_I2C
#define USE_SERIAL
-//#define USE_MATRIX_I2C
+#define SOFT_SERIAL_PIN D2
/* Select hand configuration */
#define MASTER_LEFT
@@ -41,18 +40,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* key matrix size */
// Rows are doubled-up
- #define MATRIX_ROWS 8
- #define MATRIX_ROW_PINS { D4, C6, D7, E6 }
+#define MATRIX_ROWS 8
+#define MATRIX_ROW_PINS { D4, C6, D7, E6 }
// wiring of each half
#define MATRIX_COLS 6
#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3}
-/* define if matrix has ghost */
-//#define MATRIX_HAS_GHOST
-
-/* number of backlight levels */
-// #define BACKLIGHT_LEVELS 3
+#define DIODE_DIRECTION COL2ROW
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
@@ -64,25 +59,44 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* ws2812 RGB LED */
#define RGB_DI_PIN D3
-#define RGBLIGHT_TIMER
-//#define RGBLED_NUM 24 // Number of LEDs. see ./keymaps/default/config.h
-#define ws2812_PORTREG PORTD
-#define ws2812_DDRREG DDRD
// RGB LED support
//#define RGBLIGHT_ANIMATIONS : see ./rules.mk: LED_ANIMATIONS = yes or no
// see ./rules.mk: LED_BACK_ENABLE or LED_UNDERGLOW_ENABLE set yes
-#ifdef RGBLED_BACK
- #define RGBLED_NUM 24
-#else
- #define RGBLED_NUM 6
+#ifdef RGBLIGHT_ENABLE
+ #define RGBLIGHT_SPLIT
+ #ifdef RGBLED_BACK
+ #ifdef RGBLED_CONT
+ #define RGBLED_NUM 48
+ #define RGBLED_SPLIT { 24, 24 }
+ #else
+ #define RGBLED_NUM 24
+ #endif
+ #else
+ #ifdef RGBLED_BOTH
+ #ifdef RGBLED_CONT
+ #define RGBLED_NUM 60
+ #define RGBLED_SPLIT { 30, 30 }
+// #define RGBLIGHT_LED_MAP {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,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}
+ #else
+ #define RGBLED_NUM 30
+ #endif
+ #else
+ #ifdef RGBLED_CONT
+ #define RGBLED_NUM 12
+ #define RGBLED_SPLIT { 6, 6 }
+ #else
+ #define RGBLED_NUM 6
+ #endif
+ #endif
+ #endif
#endif
#ifndef IOS_DEVICE_ENABLE
- #if RGBLED_NUM <= 6
+ #if (RGBLED_NUM <= 6) || (defined(RGBLED_CONT) && (RGBLED_NUM <= 12))
#define RGBLIGHT_LIMIT_VAL 255
#else
- #if RGBLED_NUM <= 16
+ #if (RGBLED_NUM <= 16) || (defined(RGBLED_CONT) && (RGBLED_NUM <= 32))
#define RGBLIGHT_LIMIT_VAL 130
#else
#define RGBLIGHT_LIMIT_VAL 120
@@ -90,10 +104,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#endif
#define RGBLIGHT_VAL_STEP 17
#else
- #if RGBLED_NUM <= 6
+ #if (RGBLED_NUM <= 6) || (defined(RGBLED_CONT) && (RGBLED_NUM <= 12))
#define RGBLIGHT_LIMIT_VAL 90
#else
- #if RGBLED_NUM <= 16
+ #if (RGBLED_NUM <= 16) || (defined(RGBLED_CONT) && (RGBLED_NUM <= 32))
#define RGBLIGHT_LIMIT_VAL 45
#else
#define RGBLIGHT_LIMIT_VAL 35
diff --git a/keyboards/zinc/reva/matrix.c b/keyboards/zinc/reva/matrix.c
deleted file mode 100644
index 5b58500db8..0000000000
--- a/keyboards/zinc/reva/matrix.c
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
-Copyright 2012 Jun Wako <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * scan matrix
- */
-#include <stdint.h>
-#include <stdbool.h>
-#include <string.h>
-#include <avr/io.h>
-#include <avr/wdt.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "split_util.h"
-#include "quantum.h"
-
-#ifdef USE_MATRIX_I2C
-# include "i2c.h"
-#else // USE_SERIAL
-# include "split_scomm.h"
-#endif
-
-#ifndef DEBOUNCE
-# define DEBOUNCE 5
-#endif
-
-#define ERROR_DISCONNECT_COUNT 5
-
-static uint8_t debouncing = DEBOUNCE;
-static const int ROWS_PER_HAND = MATRIX_ROWS/2;
-static uint8_t error_count = 0;
-uint8_t is_master = 0 ;
-
-static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
-static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-static matrix_row_t matrix_debouncing[MATRIX_ROWS];
-
-static matrix_row_t read_cols(void);
-static void init_cols(void);
-static void unselect_rows(void);
-static void select_row(uint8_t row);
-static uint8_t matrix_master_scan(void);
-
-
-__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) {
-}
-
-inline
-uint8_t matrix_rows(void)
-{
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void)
-{
- return MATRIX_COLS;
-}
-
-void matrix_init(void)
-{
- debug_enable = true;
- debug_matrix = true;
- debug_mouse = true;
- // initialize row and col
- unselect_rows();
- init_cols();
-
- setPinOutput(B0);
- setPinOutput(D5);
- writePinHigh(B0);
- writePinHigh(D5);
-
- // initialize matrix state: all keys off
- for (uint8_t i=0; i < MATRIX_ROWS; i++) {
- matrix[i] = 0;
- matrix_debouncing[i] = 0;
- }
-
- is_master = has_usb();
-
- matrix_init_quantum();
-}
-
-uint8_t _matrix_scan(void)
-{
- // Right hand is stored after the left in the matirx so, we need to offset it
- int offset = isLeftHand ? 0 : (ROWS_PER_HAND);
-
- for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
- select_row(i);
- _delay_us(30); // without this wait read unstable value.
- matrix_row_t cols = read_cols();
- if (matrix_debouncing[i+offset] != cols) {
- matrix_debouncing[i+offset] = cols;
- debouncing = DEBOUNCE;
- }
- unselect_rows();
- }
-
- if (debouncing) {
- if (--debouncing) {
- _delay_ms(1);
- } else {
- for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
- matrix[i+offset] = matrix_debouncing[i+offset];
- }
- }
- }
-
- return 1;
-}
-
-#ifdef USE_MATRIX_I2C
-
-// Get rows from other half over i2c
-int i2c_transaction(void) {
- int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
-
- int err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE);
- if (err) goto i2c_error;
-
- // start of matrix stored at 0x00
- err = i2c_master_write(0x00);
- if (err) goto i2c_error;
-
- // Start read
- err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_READ);
- if (err) goto i2c_error;
-
- if (!err) {
- int i;
- for (i = 0; i < ROWS_PER_HAND-1; ++i) {
- matrix[slaveOffset+i] = i2c_master_read(I2C_ACK);
- }
- matrix[slaveOffset+i] = i2c_master_read(I2C_NACK);
- i2c_master_stop();
- } else {
-i2c_error: // the cable is disconnceted, or something else went wrong
- i2c_reset_state();
- return err;
- }
-
- return 0;
-}
-
-#else // USE_SERIAL
-
-int serial_transaction(int master_changed) {
- int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
-#ifdef SERIAL_USE_MULTI_TRANSACTION
- int ret=serial_update_buffers(master_changed);
-#else
- int ret=serial_update_buffers();
-#endif
- if (ret ) {
- if(ret==2) writePinLow(B0);
- return 1;
- }
- writePinHigh(B0);
- memcpy(&matrix[slaveOffset],
- (void *)serial_slave_buffer, sizeof(serial_slave_buffer));
- return 0;
-}
-#endif
-
-uint8_t matrix_scan(void)
-{
- if (is_master) {
- matrix_master_scan();
- }else{
- matrix_slave_scan();
- int offset = (isLeftHand) ? ROWS_PER_HAND : 0;
- memcpy(&matrix[offset],
- (void *)serial_master_buffer, sizeof(serial_master_buffer));
- matrix_scan_quantum();
- }
- return 1;
-}
-
-
-uint8_t matrix_master_scan(void) {
-
- int ret = _matrix_scan();
- int mchanged = 1;
- int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
-
-#ifdef USE_MATRIX_I2C
-// for (int i = 0; i < ROWS_PER_HAND; ++i) {
- /* i2c_slave_buffer[i] = matrix[offset+i]; */
-// i2c_slave_buffer[i] = matrix[offset+i];
-// }
-#else // USE_SERIAL
- #ifdef SERIAL_USE_MULTI_TRANSACTION
- mchanged = memcmp((void *)serial_master_buffer,
- &matrix[offset], sizeof(serial_master_buffer));
- #endif
- memcpy((void *)serial_master_buffer,
- &matrix[offset], sizeof(serial_master_buffer));
-#endif
-
-#ifdef USE_MATRIX_I2C
- if( i2c_transaction() ) {
-#else // USE_SERIAL
- if( serial_transaction(mchanged) ) {
-#endif
- // turn on the indicator led when halves are disconnected
- writePinLow(D5);
-
- error_count++;
-
- if (error_count > ERROR_DISCONNECT_COUNT) {
- // reset other half if disconnected
- int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- matrix[slaveOffset+i] = 0;
- }
- }
- } else {
- // turn off the indicator led on no error
- writePinHigh(D5);
- error_count = 0;
- }
- matrix_scan_quantum();
- return ret;
-}
-
-void matrix_slave_scan(void) {
- _matrix_scan();
-
- int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
-
-#ifdef USE_MATRIX_I2C
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- /* i2c_slave_buffer[i] = matrix[offset+i]; */
- i2c_slave_buffer[i] = matrix[offset+i];
- }
-#else // USE_SERIAL
- #ifdef SERIAL_USE_MULTI_TRANSACTION
- int change = 0;
- #endif
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- #ifdef SERIAL_USE_MULTI_TRANSACTION
- if( serial_slave_buffer[i] != matrix[offset+i] )
- change = 1;
- #endif
- serial_slave_buffer[i] = matrix[offset+i];
- }
- #ifdef SERIAL_USE_MULTI_TRANSACTION
- slave_buffer_change_count += change;
- #endif
-#endif
-}
-
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- return true;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & ((matrix_row_t)1<<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print("\nr/c 0123456789ABCDEF\n");
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- phex(row); print(": ");
- pbin_reverse16(matrix_get_row(row));
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += bitpop16(matrix[i]);
- }
- return count;
-}
-
-static void init_cols(void)
-{
- for(int x = 0; x < MATRIX_COLS; x++) {
- _SFR_IO8((col_pins[x] >> 4) + 1) &= ~_BV(col_pins[x] & 0xF);
- _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF);
- }
-}
-
-static matrix_row_t read_cols(void)
-{
- matrix_row_t result = 0;
- for(int x = 0; x < MATRIX_COLS; x++) {
- result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x);
- }
- return result;
-}
-
-static void unselect_rows(void)
-{
- for(int x = 0; x < ROWS_PER_HAND; x++) {
- _SFR_IO8((row_pins[x] >> 4) + 1) &= ~_BV(row_pins[x] & 0xF);
- _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF);
- }
-}
-
-static void select_row(uint8_t row)
-{
- _SFR_IO8((row_pins[row] >> 4) + 1) |= _BV(row_pins[row] & 0xF);
- _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF);
-}
diff --git a/keyboards/zinc/reva/reva.c b/keyboards/zinc/reva/reva.c
index 2ce08a07c4..a9c2cfdbac 100644
--- a/keyboards/zinc/reva/reva.c
+++ b/keyboards/zinc/reva/reva.c
@@ -3,4 +3,3 @@
void matrix_init_kb(void) {
matrix_init_user();
};
-
diff --git a/keyboards/zinc/reva/reva.h b/keyboards/zinc/reva/reva.h
index aa1c408b0b..1bf2c565ae 100644
--- a/keyboards/zinc/reva/reva.h
+++ b/keyboards/zinc/reva/reva.h
@@ -1,22 +1,7 @@
#pragma once
-#include "../zinc.h"
-
#include "quantum.h"
-#ifdef RGBLIGHT_ENABLE
-//rgb led driver
-#include "ws2812.h"
-#endif
-
-#ifdef USE_I2C
-#include <stddef.h>
-#ifdef __AVR__
- #include <avr/io.h>
- #include <avr/interrupt.h>
-#endif
-#endif
-
// Standard Keymap
// (TRRS jack on both halves are to the left side)
#define LAYOUT( \
diff --git a/keyboards/zinc/reva/rules.mk b/keyboards/zinc/reva/rules.mk
index 3ea61267a2..83895bdcb8 100644
--- a/keyboards/zinc/reva/rules.mk
+++ b/keyboards/zinc/reva/rules.mk
@@ -1,4 +1 @@
-SRC += reva/matrix.c
-SRC += reva/split_util.c
-SRC += reva/split_scomm.c
-SRC += ws2812.c
+SPLIT_KEYBOARD = yes \ No newline at end of file
diff --git a/keyboards/zinc/reva/serial_config.h b/keyboards/zinc/reva/serial_config.h
deleted file mode 100644
index 9fb5dfc671..0000000000
--- a/keyboards/zinc/reva/serial_config.h
+++ /dev/null
@@ -1,18 +0,0 @@
-#ifndef SOFT_SERIAL_CONFIG_H
-#define SOFT_SERIAL_CONFIG_H
-
-#ifndef SOFT_SERIAL_PIN
-/* Soft Serial defines */
-#define SOFT_SERIAL_PIN D2
-// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5
-// // 1: about 137kbps (default)
-// // 2: about 75kbps
-// // 3: about 39kbps
-// // 4: about 26kbps
-// // 5: about 20kbps
-#endif
-
-//// USE flexible API (using multi-type transaction function)
-#define SERIAL_USE_MULTI_TRANSACTION
-
-#endif /* SOFT_SERIAL_CONFIG_H */
diff --git a/keyboards/zinc/reva/serial_config_simpleapi.h b/keyboards/zinc/reva/serial_config_simpleapi.h
deleted file mode 100644
index e2d22a41e7..0000000000
--- a/keyboards/zinc/reva/serial_config_simpleapi.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef SERIAL_CONFIG_SIMPLEAPI_H
-#define SERIAL_CONFIG_SIMPLEAPI_H
-
-#undef SERIAL_USE_MULTI_TRANSACTION
-#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
-#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2
-
-#endif // SERIAL_CONFIG_SIMPLEAPI_H
diff --git a/keyboards/zinc/reva/split_scomm.c b/keyboards/zinc/reva/split_scomm.c
deleted file mode 100644
index 50d233ce9a..0000000000
--- a/keyboards/zinc/reva/split_scomm.c
+++ /dev/null
@@ -1,95 +0,0 @@
-#ifdef USE_SERIAL
-#ifdef SERIAL_USE_MULTI_TRANSACTION
-/* --- USE flexible API (using multi-type transaction function) --- */
-
-#include <stdbool.h>
-#include <stdint.h>
-#include <stddef.h>
-#include <split_scomm.h>
-#include "serial.h"
-#ifdef SERIAL_DEBUG_MODE
-#include <avr/io.h>
-#endif
-#ifdef CONSOLE_ENABLE
- #include <print.h>
-#endif
-
-uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0};
-uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
-uint8_t volatile status_com = 0;
-uint8_t volatile status1 = 0;
-uint8_t slave_buffer_change_count = 0;
-uint8_t s_change_old = 0xff;
-uint8_t s_change_new = 0xff;
-
-SSTD_t transactions[] = {
-#define GET_SLAVE_STATUS 0
- /* master buffer not changed, only recive slave_buffer_change_count */
- { (uint8_t *)&status_com,
- 0, NULL,
- sizeof(slave_buffer_change_count), &slave_buffer_change_count,
- },
-#define PUT_MASTER_GET_SLAVE_STATUS 1
- /* master buffer changed need send, and recive slave_buffer_change_count */
- { (uint8_t *)&status_com,
- sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer,
- sizeof(slave_buffer_change_count), &slave_buffer_change_count,
- },
-#define GET_SLAVE_BUFFER 2
- /* recive serial_slave_buffer */
- { (uint8_t *)&status1,
- 0, NULL,
- sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer
- }
-};
-
-void serial_master_init(void)
-{
- soft_serial_initiator_init(transactions, TID_LIMIT(transactions));
-}
-
-void serial_slave_init(void)
-{
- soft_serial_target_init(transactions, TID_LIMIT(transactions));
-}
-
-// 0 => no error
-// 1 => slave did not respond
-// 2 => checksum error
-int serial_update_buffers(int master_update)
-{
- int status, smatstatus;
- static int need_retry = 0;
-
- if( s_change_old != s_change_new ) {
- smatstatus = soft_serial_transaction(GET_SLAVE_BUFFER);
- if( smatstatus == TRANSACTION_END ) {
- s_change_old = s_change_new;
-#ifdef CONSOLE_ENABLE
- uprintf("slave matrix = %b %b %b %b %b\n",
- serial_slave_buffer[0], serial_slave_buffer[1],
- serial_slave_buffer[2], serial_slave_buffer[3],
- serial_slave_buffer[4] );
-#endif
- }
- } else {
- // serial_slave_buffer dosen't change
- smatstatus = TRANSACTION_END; // dummy status
- }
-
- if( !master_update && !need_retry) {
- status = soft_serial_transaction(GET_SLAVE_STATUS);
- } else {
- status = soft_serial_transaction(PUT_MASTER_GET_SLAVE_STATUS);
- }
- if( status == TRANSACTION_END ) {
- s_change_new = slave_buffer_change_count;
- need_retry = 0;
- } else {
- need_retry = 1;
- }
- return smatstatus;
-}
-
-#endif // SERIAL_USE_MULTI_TRANSACTION
-#endif /* USE_SERIAL */
diff --git a/keyboards/zinc/reva/split_scomm.h b/keyboards/zinc/reva/split_scomm.h
deleted file mode 100644
index 873d8939d8..0000000000
--- a/keyboards/zinc/reva/split_scomm.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef SPLIT_COMM_H
-#define SPLIT_COMM_H
-
-#ifndef SERIAL_USE_MULTI_TRANSACTION
-/* --- USE Simple API (OLD API, compatible with let's split serial.c) --- */
-#include "serial.h"
-
-#else
-/* --- USE flexible API (using multi-type transaction function) --- */
-// Buffers for master - slave communication
-#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
-#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2
-
-extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
-extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH];
-extern uint8_t slave_buffer_change_count;
-
-void serial_master_init(void);
-void serial_slave_init(void);
-int serial_update_buffers(int master_changed);
-
-#endif
-
-#endif /* SPLIT_COMM_H */
diff --git a/keyboards/zinc/reva/split_util.c b/keyboards/zinc/reva/split_util.c
deleted file mode 100644
index e1ff8b4379..0000000000
--- a/keyboards/zinc/reva/split_util.c
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <avr/io.h>
-#include <avr/wdt.h>
-#include <avr/power.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-#include <avr/eeprom.h>
-#include "split_util.h"
-#include "matrix.h"
-#include "keyboard.h"
-
-#ifdef USE_MATRIX_I2C
-# include "i2c.h"
-#else
-# include "split_scomm.h"
-#endif
-
-volatile bool isLeftHand = true;
-
-static void setup_handedness(void) {
- #ifdef EE_HANDS
- isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS);
- #else
- // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c
- #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT)
- isLeftHand = !has_usb();
- #else
- isLeftHand = has_usb();
- #endif
- #endif
-}
-
-static void keyboard_master_setup(void) {
-
-#ifdef USE_MATRIX_I2C
- i2c_master_init();
-#else
- serial_master_init();
-#endif
-}
-
-static void keyboard_slave_setup(void) {
-
-#ifdef USE_MATRIX_I2C
- i2c_slave_init(SLAVE_I2C_ADDRESS);
-#else
- serial_slave_init();
-#endif
-}
-
-bool has_usb(void) {
- USBCON |= (1 << OTGPADE); //enables VBUS pad
- _delay_us(5);
- return (USBSTA & (1<<VBUS)); //checks state of VBUS
-}
-
-void split_keyboard_setup(void) {
- setup_handedness();
-
- if (has_usb()) {
- keyboard_master_setup();
- } else {
- keyboard_slave_setup();
- }
- sei();
-}
-
-// this code runs before the usb and keyboard is initialized
-void matrix_setup(void) {
- split_keyboard_setup();
-}
diff --git a/keyboards/zinc/reva/split_util.h b/keyboards/zinc/reva/split_util.h
deleted file mode 100644
index 687ca19bd3..0000000000
--- a/keyboards/zinc/reva/split_util.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef SPLIT_KEYBOARD_UTIL_H
-#define SPLIT_KEYBOARD_UTIL_H
-
-#include <stdbool.h>
-#include "eeconfig.h"
-
-#define SLAVE_I2C_ADDRESS 0x32
-
-extern volatile bool isLeftHand;
-
-// slave version of matix scan, defined in matrix.c
-void matrix_slave_scan(void);
-
-void split_keyboard_setup(void);
-bool has_usb(void);
-
-void matrix_master_OLED_init (void);
-
-#endif
diff --git a/keyboards/zinc/rules.mk b/keyboards/zinc/rules.mk
index 63a8cc8fc3..36e717d60a 100644
--- a/keyboards/zinc/rules.mk
+++ b/keyboards/zinc/rules.mk
@@ -27,12 +27,8 @@ 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 this with audio at the same time.
-SUBPROJECT_rev1 = no
-USE_I2C = 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
-CUSTOM_MATRIX = yes
DEFAULT_FOLDER = zinc/rev1
diff --git a/keyboards/zinc/serial.c b/keyboards/zinc/serial.c
deleted file mode 100644
index f6293c3dc2..0000000000
--- a/keyboards/zinc/serial.c
+++ /dev/null
@@ -1,589 +0,0 @@
-/*
- * WARNING: be careful changing this code, it is very timing dependent
- *
- * 2018-10-28 checked
- * avr-gcc 4.9.2
- * avr-gcc 5.4.0
- * avr-gcc 7.3.0
- */
-
-#ifndef F_CPU
-#define F_CPU 16000000
-#endif
-
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include "serial.h"
-
-#ifdef SOFT_SERIAL_PIN
-
-#ifdef __AVR_ATmega32U4__
- // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial.
- #ifdef USE_I2C
- #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1
- #error Using ATmega32U4 I2C, so can not use PD0, PD1
- #endif
- #endif
-
- #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3
- #define SERIAL_PIN_DDR DDRD
- #define SERIAL_PIN_PORT PORTD
- #define SERIAL_PIN_INPUT PIND
- #if SOFT_SERIAL_PIN == D0
- #define SERIAL_PIN_MASK _BV(PD0)
- #define EIMSK_BIT _BV(INT0)
- #define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01)))
- #define SERIAL_PIN_INTERRUPT INT0_vect
- #elif SOFT_SERIAL_PIN == D1
- #define SERIAL_PIN_MASK _BV(PD1)
- #define EIMSK_BIT _BV(INT1)
- #define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11)))
- #define SERIAL_PIN_INTERRUPT INT1_vect
- #elif SOFT_SERIAL_PIN == D2
- #define SERIAL_PIN_MASK _BV(PD2)
- #define EIMSK_BIT _BV(INT2)
- #define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21)))
- #define SERIAL_PIN_INTERRUPT INT2_vect
- #elif SOFT_SERIAL_PIN == D3
- #define SERIAL_PIN_MASK _BV(PD3)
- #define EIMSK_BIT _BV(INT3)
- #define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31)))
- #define SERIAL_PIN_INTERRUPT INT3_vect
- #endif
- #elif SOFT_SERIAL_PIN == E6
- #define SERIAL_PIN_DDR DDRE
- #define SERIAL_PIN_PORT PORTE
- #define SERIAL_PIN_INPUT PINE
- #define SERIAL_PIN_MASK _BV(PE6)
- #define EIMSK_BIT _BV(INT6)
- #define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61)))
- #define SERIAL_PIN_INTERRUPT INT6_vect
- #else
- #error invalid SOFT_SERIAL_PIN value
- #endif
-
-#else
- #error serial.c now support ATmega32U4 only
-#endif
-
-//////////////// for backward compatibility ////////////////////////////////
-#ifndef SERIAL_USE_MULTI_TRANSACTION
-/* --- USE Simple API (OLD API, compatible with let's split serial.c) */
- #if SERIAL_SLAVE_BUFFER_LENGTH > 0
- uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0};
- #endif
- #if SERIAL_MASTER_BUFFER_LENGTH > 0
- uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
- #endif
- uint8_t volatile status0 = 0;
-
-SSTD_t transactions[] = {
- { (uint8_t *)&status0,
- #if SERIAL_MASTER_BUFFER_LENGTH > 0
- sizeof(serial_master_buffer), (uint8_t *)serial_master_buffer,
- #else
- 0, (uint8_t *)NULL,
- #endif
- #if SERIAL_SLAVE_BUFFER_LENGTH > 0
- sizeof(serial_slave_buffer), (uint8_t *)serial_slave_buffer
- #else
- 0, (uint8_t *)NULL,
- #endif
- }
-};
-
-void serial_master_init(void)
-{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); }
-
-void serial_slave_init(void)
-{ soft_serial_target_init(transactions, TID_LIMIT(transactions)); }
-
-// 0 => no error
-// 1 => slave did not respond
-// 2 => checksum error
-int serial_update_buffers()
-{
- int result;
- result = soft_serial_transaction();
- return result;
-}
-
-#endif // end of Simple API (OLD API, compatible with let's split serial.c)
-////////////////////////////////////////////////////////////////////////////
-
-#define ALWAYS_INLINE __attribute__((always_inline))
-#define NO_INLINE __attribute__((noinline))
-#define _delay_sub_us(x) __builtin_avr_delay_cycles(x)
-
-// parity check
-#define ODD_PARITY 1
-#define EVEN_PARITY 0
-#define PARITY EVEN_PARITY
-
-#ifdef SERIAL_DELAY
- // custom setup in config.h
- // #define TID_SEND_ADJUST 2
- // #define SERIAL_DELAY 6 // micro sec
- // #define READ_WRITE_START_ADJUST 30 // cycles
- // #define READ_WRITE_WIDTH_ADJUST 8 // cycles
-#else
-// ============ Standard setups ============
-
-#ifndef SELECT_SOFT_SERIAL_SPEED
-#define SELECT_SOFT_SERIAL_SPEED 1
-// 0: about 189kbps
-// 1: about 137kbps (default)
-// 2: about 75kbps
-// 3: about 39kbps
-// 4: about 26kbps
-// 5: about 20kbps
-#endif
-
-#if __GNUC__ < 6
- #define TID_SEND_ADJUST 14
-#else
- #define TID_SEND_ADJUST 2
-#endif
-
-#if SELECT_SOFT_SERIAL_SPEED == 0
- // Very High speed
- #define SERIAL_DELAY 4 // micro sec
- #if __GNUC__ < 6
- #define READ_WRITE_START_ADJUST 33 // cycles
- #define READ_WRITE_WIDTH_ADJUST 3 // cycles
- #else
- #define READ_WRITE_START_ADJUST 34 // cycles
- #define READ_WRITE_WIDTH_ADJUST 7 // cycles
- #endif
-#elif SELECT_SOFT_SERIAL_SPEED == 1
- // High speed
- #define SERIAL_DELAY 6 // micro sec
- #if __GNUC__ < 6
- #define READ_WRITE_START_ADJUST 30 // cycles
- #define READ_WRITE_WIDTH_ADJUST 3 // cycles
- #else
- #define READ_WRITE_START_ADJUST 33 // cycles
- #define READ_WRITE_WIDTH_ADJUST 7 // cycles
- #endif
-#elif SELECT_SOFT_SERIAL_SPEED == 2
- // Middle speed
- #define SERIAL_DELAY 12 // micro sec
- #define READ_WRITE_START_ADJUST 30 // cycles
- #if __GNUC__ < 6
- #define READ_WRITE_WIDTH_ADJUST 3 // cycles
- #else
- #define READ_WRITE_WIDTH_ADJUST 7 // cycles
- #endif
-#elif SELECT_SOFT_SERIAL_SPEED == 3
- // Low speed
- #define SERIAL_DELAY 24 // micro sec
- #define READ_WRITE_START_ADJUST 30 // cycles
- #if __GNUC__ < 6
- #define READ_WRITE_WIDTH_ADJUST 3 // cycles
- #else
- #define READ_WRITE_WIDTH_ADJUST 7 // cycles
- #endif
-#elif SELECT_SOFT_SERIAL_SPEED == 4
- // Very Low speed
- #define SERIAL_DELAY 36 // micro sec
- #define READ_WRITE_START_ADJUST 30 // cycles
- #if __GNUC__ < 6
- #define READ_WRITE_WIDTH_ADJUST 3 // cycles
- #else
- #define READ_WRITE_WIDTH_ADJUST 7 // cycles
- #endif
-#elif SELECT_SOFT_SERIAL_SPEED == 5
- // Ultra Low speed
- #define SERIAL_DELAY 48 // micro sec
- #define READ_WRITE_START_ADJUST 30 // cycles
- #if __GNUC__ < 6
- #define READ_WRITE_WIDTH_ADJUST 3 // cycles
- #else
- #define READ_WRITE_WIDTH_ADJUST 7 // cycles
- #endif
-#else
-#error invalid SELECT_SOFT_SERIAL_SPEED value
-#endif /* SELECT_SOFT_SERIAL_SPEED */
-#endif /* SERIAL_DELAY */
-
-#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2)
-#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2)
-
-#define SLAVE_INT_WIDTH_US 1
-#ifndef SERIAL_USE_MULTI_TRANSACTION
- #define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY
-#else
- #define SLAVE_INT_ACK_WIDTH_UNIT 2
- #define SLAVE_INT_ACK_WIDTH 4
-#endif
-
-static SSTD_t *Transaction_table = NULL;
-static uint8_t Transaction_table_size = 0;
-
-inline static void serial_delay(void) ALWAYS_INLINE;
-inline static
-void serial_delay(void) {
- _delay_us(SERIAL_DELAY);
-}
-
-inline static void serial_delay_half1(void) ALWAYS_INLINE;
-inline static
-void serial_delay_half1(void) {
- _delay_us(SERIAL_DELAY_HALF1);
-}
-
-inline static void serial_delay_half2(void) ALWAYS_INLINE;
-inline static
-void serial_delay_half2(void) {
- _delay_us(SERIAL_DELAY_HALF2);
-}
-
-inline static void serial_output(void) ALWAYS_INLINE;
-inline static
-void serial_output(void) {
- SERIAL_PIN_DDR |= SERIAL_PIN_MASK;
-}
-
-// make the serial pin an input with pull-up resistor
-inline static void serial_input_with_pullup(void) ALWAYS_INLINE;
-inline static
-void serial_input_with_pullup(void) {
- SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK;
- SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
-}
-
-inline static uint8_t serial_read_pin(void) ALWAYS_INLINE;
-inline static
-uint8_t serial_read_pin(void) {
- return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK);
-}
-
-inline static void serial_low(void) ALWAYS_INLINE;
-inline static
-void serial_low(void) {
- SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK;
-}
-
-inline static void serial_high(void) ALWAYS_INLINE;
-inline static
-void serial_high(void) {
- SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
-}
-
-void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size)
-{
- Transaction_table = sstd_table;
- Transaction_table_size = (uint8_t)sstd_table_size;
- serial_output();
- serial_high();
-}
-
-void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size)
-{
- Transaction_table = sstd_table;
- Transaction_table_size = (uint8_t)sstd_table_size;
- serial_input_with_pullup();
-
- // Enable INT0-INT3,INT6
- EIMSK |= EIMSK_BIT;
-#if SERIAL_PIN_MASK == _BV(PE6)
- // Trigger on falling edge of INT6
- EICRB &= EICRx_BIT;
-#else
- // Trigger on falling edge of INT0-INT3
- EICRA &= EICRx_BIT;
-#endif
-}
-
-// Used by the sender to synchronize timing with the reciver.
-static void sync_recv(void) NO_INLINE;
-static
-void sync_recv(void) {
- for (uint8_t i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) {
- }
- // This shouldn't hang if the target disconnects because the
- // serial line will float to high if the target does disconnect.
- while (!serial_read_pin());
-}
-
-// Used by the reciver to send a synchronization signal to the sender.
-static void sync_send(void) NO_INLINE;
-static
-void sync_send(void) {
- serial_low();
- serial_delay();
- serial_high();
-}
-
-// Reads a byte from the serial line
-static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) NO_INLINE;
-static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) {
- uint8_t byte, i, p, pb;
-
- _delay_sub_us(READ_WRITE_START_ADJUST);
- for( i = 0, byte = 0, p = PARITY; i < bit; i++ ) {
- serial_delay_half1(); // read the middle of pulses
- if( serial_read_pin() ) {
- byte = (byte << 1) | 1; p ^= 1;
- } else {
- byte = (byte << 1) | 0; p ^= 0;
- }
- _delay_sub_us(READ_WRITE_WIDTH_ADJUST);
- serial_delay_half2();
- }
- /* recive parity bit */
- serial_delay_half1(); // read the middle of pulses
- pb = serial_read_pin();
- _delay_sub_us(READ_WRITE_WIDTH_ADJUST);
- serial_delay_half2();
-
- *pterrcount += (p != pb)? 1 : 0;
-
- return byte;
-}
-
-// Sends a byte with MSB ordering
-void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE;
-void serial_write_chunk(uint8_t data, uint8_t bit) {
- uint8_t b, p;
- for( p = PARITY, b = 1<<(bit-1); b ; b >>= 1) {
- if(data & b) {
- serial_high(); p ^= 1;
- } else {
- serial_low(); p ^= 0;
- }
- serial_delay();
- }
- /* send parity bit */
- if(p & 1) { serial_high(); }
- else { serial_low(); }
- serial_delay();
-
- serial_low(); // sync_send() / senc_recv() need raise edge
-}
-
-static void serial_send_packet(uint8_t *buffer, uint8_t size) NO_INLINE;
-static
-void serial_send_packet(uint8_t *buffer, uint8_t size) {
- for (uint8_t i = 0; i < size; ++i) {
- uint8_t data;
- data = buffer[i];
- sync_send();
- serial_write_chunk(data,8);
- }
-}
-
-static uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) NO_INLINE;
-static
-uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) {
- uint8_t pecount = 0;
- for (uint8_t i = 0; i < size; ++i) {
- uint8_t data;
- sync_recv();
- data = serial_read_chunk(&pecount, 8);
- buffer[i] = data;
- }
- return pecount == 0;
-}
-
-inline static
-void change_sender2reciver(void) {
- sync_send(); //0
- serial_delay_half1(); //1
- serial_low(); //2
- serial_input_with_pullup(); //2
- serial_delay_half1(); //3
-}
-
-inline static
-void change_reciver2sender(void) {
- sync_recv(); //0
- serial_delay(); //1
- serial_low(); //3
- serial_output(); //3
- serial_delay_half1(); //4
-}
-
-static inline uint8_t nibble_bits_count(uint8_t bits)
-{
- bits = (bits & 0x5) + (bits >> 1 & 0x5);
- bits = (bits & 0x3) + (bits >> 2 & 0x3);
- return bits;
-}
-
-// interrupt handle to be used by the target device
-ISR(SERIAL_PIN_INTERRUPT) {
-
-#ifndef SERIAL_USE_MULTI_TRANSACTION
- serial_low();
- serial_output();
- SSTD_t *trans = Transaction_table;
-#else
- // recive transaction table index
- uint8_t tid, bits;
- uint8_t pecount = 0;
- sync_recv();
- bits = serial_read_chunk(&pecount,7);
- tid = bits>>3;
- bits = (bits&7) != nibble_bits_count(tid);
- if( bits || pecount> 0 || tid > Transaction_table_size ) {
- return;
- }
- serial_delay_half1();
-
- serial_high(); // response step1 low->high
- serial_output();
- _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT*SLAVE_INT_ACK_WIDTH);
- SSTD_t *trans = &Transaction_table[tid];
- serial_low(); // response step2 ack high->low
-#endif
-
- // target send phase
- if( trans->target2initiator_buffer_size > 0 )
- serial_send_packet((uint8_t *)trans->target2initiator_buffer,
- trans->target2initiator_buffer_size);
- // target switch to input
- change_sender2reciver();
-
- // target recive phase
- if( trans->initiator2target_buffer_size > 0 ) {
- if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer,
- trans->initiator2target_buffer_size) ) {
- *trans->status = TRANSACTION_ACCEPTED;
- } else {
- *trans->status = TRANSACTION_DATA_ERROR;
- }
- } else {
- *trans->status = TRANSACTION_ACCEPTED;
- }
-
- sync_recv(); //weit initiator output to high
-}
-
-/////////
-// start transaction by initiator
-//
-// int soft_serial_transaction(int sstd_index)
-//
-// Returns:
-// TRANSACTION_END
-// TRANSACTION_NO_RESPONSE
-// TRANSACTION_DATA_ERROR
-// this code is very time dependent, so we need to disable interrupts
-#ifndef SERIAL_USE_MULTI_TRANSACTION
-int soft_serial_transaction(void) {
- SSTD_t *trans = Transaction_table;
-#else
-int soft_serial_transaction(int sstd_index) {
- if( sstd_index > Transaction_table_size )
- return TRANSACTION_TYPE_ERROR;
- SSTD_t *trans = &Transaction_table[sstd_index];
-#endif
- cli();
-
- // signal to the target that we want to start a transaction
- serial_output();
- serial_low();
- _delay_us(SLAVE_INT_WIDTH_US);
-
-#ifndef SERIAL_USE_MULTI_TRANSACTION
- // wait for the target response
- serial_input_with_pullup();
- _delay_us(SLAVE_INT_RESPONSE_TIME);
-
- // check if the target is present
- if (serial_read_pin()) {
- // target failed to pull the line low, assume not present
- serial_output();
- serial_high();
- *trans->status = TRANSACTION_NO_RESPONSE;
- sei();
- return TRANSACTION_NO_RESPONSE;
- }
-
-#else
- // send transaction table index
- int tid = (sstd_index<<3) | (7 & nibble_bits_count(sstd_index));
- sync_send();
- _delay_sub_us(TID_SEND_ADJUST);
- serial_write_chunk(tid, 7);
- serial_delay_half1();
-
- // wait for the target response (step1 low->high)
- serial_input_with_pullup();
- while( !serial_read_pin() ) {
- _delay_sub_us(2);
- }
-
- // check if the target is present (step2 high->low)
- for( int i = 0; serial_read_pin(); i++ ) {
- if (i > SLAVE_INT_ACK_WIDTH + 1) {
- // slave failed to pull the line low, assume not present
- serial_output();
- serial_high();
- *trans->status = TRANSACTION_NO_RESPONSE;
- sei();
- return TRANSACTION_NO_RESPONSE;
- }
- _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT);
- }
-#endif
-
- // initiator recive phase
- // if the target is present syncronize with it
- if( trans->target2initiator_buffer_size > 0 ) {
- if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer,
- trans->target2initiator_buffer_size) ) {
- serial_output();
- serial_high();
- *trans->status = TRANSACTION_DATA_ERROR;
- sei();
- return TRANSACTION_DATA_ERROR;
- }
- }
-
- // initiator switch to output
- change_reciver2sender();
-
- // initiator send phase
- if( trans->initiator2target_buffer_size > 0 ) {
- serial_send_packet((uint8_t *)trans->initiator2target_buffer,
- trans->initiator2target_buffer_size);
- }
-
- // always, release the line when not in use
- sync_send();
-
- *trans->status = TRANSACTION_END;
- sei();
- return TRANSACTION_END;
-}
-
-#ifdef SERIAL_USE_MULTI_TRANSACTION
-int soft_serial_get_and_clean_status(int sstd_index) {
- SSTD_t *trans = &Transaction_table[sstd_index];
- cli();
- int retval = *trans->status;
- *trans->status = 0;;
- sei();
- return retval;
-}
-#endif
-
-#endif
-
-// Helix serial.c history
-// 2018-1-29 fork from let's split and add PD2, modify sync_recv() (#2308, bceffdefc)
-// 2018-6-28 bug fix master to slave comm and speed up (#3255, 1038bbef4)
-// (adjusted with avr-gcc 4.9.2)
-// 2018-7-13 remove USE_SERIAL_PD2 macro (#3374, f30d6dd78)
-// (adjusted with avr-gcc 4.9.2)
-// 2018-8-11 add support multi-type transaction (#3608, feb5e4aae)
-// (adjusted with avr-gcc 4.9.2)
-// 2018-10-21 fix serial and RGB animation conflict (#4191, 4665e4fff)
-// (adjusted with avr-gcc 7.3.0)
-// 2018-10-28 re-adjust compiler depend value of delay (#4269, 8517f8a66)
-// (adjusted with avr-gcc 5.4.0, 7.3.0)
diff --git a/keyboards/zinc/serial.h b/keyboards/zinc/serial.h
deleted file mode 100644
index 7e0c0847a4..0000000000
--- a/keyboards/zinc/serial.h
+++ /dev/null
@@ -1,84 +0,0 @@
-#ifndef SOFT_SERIAL_H
-#define SOFT_SERIAL_H
-
-#include <stdbool.h>
-
-// /////////////////////////////////////////////////////////////////
-// Need Soft Serial defines in config.h
-// /////////////////////////////////////////////////////////////////
-// ex.
-// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6
-// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5
-// // 1: about 137kbps (default)
-// // 2: about 75kbps
-// // 3: about 39kbps
-// // 4: about 26kbps
-// // 5: about 20kbps
-//
-// //// USE Simple API (OLD API, compatible with let's split serial.c)
-// ex.
-// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
-// #define SERIAL_MASTER_BUFFER_LENGTH 1
-//
-// //// USE flexible API (using multi-type transaction function)
-// #define SERIAL_USE_MULTI_TRANSACTION
-//
-// /////////////////////////////////////////////////////////////////
-
-
-#ifndef SERIAL_USE_MULTI_TRANSACTION
-/* --- USE Simple API (OLD API, compatible with let's split serial.c) */
-#if SERIAL_SLAVE_BUFFER_LENGTH > 0
-extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
-#endif
-#if SERIAL_MASTER_BUFFER_LENGTH > 0
-extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH];
-#endif
-
-void serial_master_init(void);
-void serial_slave_init(void);
-int serial_update_buffers(void);
-
-#endif // USE Simple API
-
-// Soft Serial Transaction Descriptor
-typedef struct _SSTD_t {
- uint8_t *status;
- uint8_t initiator2target_buffer_size;
- uint8_t *initiator2target_buffer;
- uint8_t target2initiator_buffer_size;
- uint8_t *target2initiator_buffer;
-} SSTD_t;
-#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t))
-
-// initiator is transaction start side
-void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size);
-// target is interrupt accept side
-void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size);
-
-// initiator resullt
-#define TRANSACTION_END 0
-#define TRANSACTION_NO_RESPONSE 0x1
-#define TRANSACTION_DATA_ERROR 0x2
-#define TRANSACTION_TYPE_ERROR 0x4
-#ifndef SERIAL_USE_MULTI_TRANSACTION
-int soft_serial_transaction(void);
-#else
-int soft_serial_transaction(int sstd_index);
-#endif
-
-// target status
-// *SSTD_t.status has
-// initiator:
-// TRANSACTION_END
-// or TRANSACTION_NO_RESPONSE
-// or TRANSACTION_DATA_ERROR
-// target:
-// TRANSACTION_DATA_ERROR
-// or TRANSACTION_ACCEPTED
-#define TRANSACTION_ACCEPTED 0x8
-#ifdef SERIAL_USE_MULTI_TRANSACTION
-int soft_serial_get_and_clean_status(int sstd_index);
-#endif
-
-#endif /* SOFT_SERIAL_H */
diff --git a/keyboards/zinc/zinc.h b/keyboards/zinc/zinc.h
index 87d889da03..dedc9253b0 100644
--- a/keyboards/zinc/zinc.h
+++ b/keyboards/zinc/zinc.h
@@ -1,5 +1,4 @@
-#ifndef ZINC_H
-#define ZINC_H
+#pragma once
#ifdef KEYBOARD_zinc_reva
#include "reva.h"
@@ -8,7 +7,4 @@
#include "rev1.h"
#endif
-
#include "quantum.h"
-
-#endif
diff --git a/keyboards/zvecr/split_blackpill/chconf.h b/keyboards/zvecr/split_blackpill/chconf.h
new file mode 100644
index 0000000000..f5e471640c
--- /dev/null
+++ b/keyboards/zvecr/split_blackpill/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 100000
+#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 0
+#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 TRUE
+#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 TRUE
+#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/zvecr/split_blackpill/config.h b/keyboards/zvecr/split_blackpill/config.h
new file mode 100644
index 0000000000..8165711c9b
--- /dev/null
+++ b/keyboards/zvecr/split_blackpill/config.h
@@ -0,0 +1,180 @@
+/* Copyright 2020 zvecr <git@zvecr.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 <http://www.gnu.org/licenses/>.
+ */
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x5A56
+#define PRODUCT_ID 0x0001
+#define DEVICE_VER 0x0001
+#define MANUFACTURER zvecr
+#define PRODUCT split_blackpill
+#define DESCRIPTION ARM Split ortho_4x12
+
+/* key matrix size */
+#define MATRIX_ROWS 8 // Rows are doubled-up
+#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_COL_PINS { B11, B10, B1, B0, A7, A6 }
+#define MATRIX_ROW_PINS { B15, B14, B13, B12 }
+#define MATRIX_COL_PINS_RIGHT { B12, B13, B14, B15, A8, A9 }
+#define MATRIX_ROW_PINS_RIGHT { B0, B1, B10, B11 }
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+#define MATRIX_IO_DELAY 5
+
+/*
+ * Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
+ */
+#define SPLIT_HAND_PIN B3
+#define SOFT_SERIAL_PIN B6
+#define SELECT_SOFT_SERIAL_SPEED 0
+
+#define RGB_DI_PIN B4
+#define RGBLED_NUM 24
+#define RGBLED_SPLIT { 12, 12 }
+#define RGBLIGHT_ANIMATIONS
+
+#define WS2812_PWM_DRIVER PWMD3
+#define WS2812_PWM_CHANNEL 1
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_DMA_CHANNEL 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
+
+/* 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
+
+/* Bootmagic Lite key configuration */
+#define BOOTMAGIC_LITE_ROW 0
+#define BOOTMAGIC_LITE_COLUMN 0
+#define BOOTMAGIC_LITE_ROW_RIGHT 4
+#define BOOTMAGIC_LITE_COLUMN_RIGHT 0
diff --git a/keyboards/zvecr/split_blackpill/halconf.h b/keyboards/zvecr/split_blackpill/halconf.h
new file mode 100644
index 0000000000..cc67750202
--- /dev/null
+++ b/keyboards/zvecr/split_blackpill/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 TRUE
+#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/zvecr/split_blackpill/info.json b/keyboards/zvecr/split_blackpill/info.json
new file mode 100644
index 0000000000..d43dc6f403
--- /dev/null
+++ b/keyboards/zvecr/split_blackpill/info.json
@@ -0,0 +1,13 @@
+{
+ "keyboard_name": "split_blackpill",
+ "url": "",
+ "maintainer": "zvecr",
+ "width": 12,
+ "height": 4,
+ "layouts": {
+ "LAYOUT_ortho_4x12": {
+ "key_count": 48,
+ "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":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "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":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "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}]
+ }
+ }
+}
diff --git a/keyboards/zvecr/split_blackpill/keymaps/default/keymap.c b/keyboards/zvecr/split_blackpill/keymaps/default/keymap.c
new file mode 100644
index 0000000000..f9428c3292
--- /dev/null
+++ b/keyboards/zvecr/split_blackpill/keymaps/default/keymap.c
@@ -0,0 +1,91 @@
+#include QMK_KEYBOARD_H
+
+// Defines names for use in layer keycodes and the keymap
+enum layer_names {
+ _QWERTY,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+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 | App |Lower | 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_LCTL, KC_LGUI, KC_LALT, KC_APP, LOWER, KC_SPC, 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_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,
+ _______, 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_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, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+),
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * | | Reset| | | | |R Tog |R Mode|R Rev |R Grad| Reset| |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | |R HUI|R SAI|R VAI| | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | |R HUD|R SAD|R VAD| | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = LAYOUT_ortho_4x12(
+ _______, RESET, _______, _______, _______, _______, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_M_G, RESET, _______,
+ _______, _______, _______, _______, _______, _______, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+)
+
+};
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+}
diff --git a/keyboards/zvecr/split_blackpill/mcuconf.h b/keyboards/zvecr/split_blackpill/mcuconf.h
new file mode 100644
index 0000000000..4dea6bcf71
--- /dev/null
+++ b/keyboards/zvecr/split_blackpill/mcuconf.h
@@ -0,0 +1,209 @@
+/*
+ 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_
+
+#define STM32F103_MCUCONF
+
+/*
+ * STM32F103 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:
+ * 15...0 Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3 Lowest...Highest.
+ */
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT FALSE
+#define STM32_HSI_ENABLED TRUE
+#define STM32_LSI_ENABLED FALSE
+#define STM32_HSE_ENABLED TRUE
+#define STM32_LSE_ENABLED FALSE
+#define STM32_SW STM32_SW_PLL
+#define STM32_PLLSRC STM32_PLLSRC_HSE
+#define STM32_PLLXTPRE STM32_PLLXTPRE_DIV1
+#define STM32_PLLMUL_VALUE 9
+#define STM32_HPRE STM32_HPRE_DIV1
+#define STM32_PPRE1 STM32_PPRE1_DIV2
+#define STM32_PPRE2 STM32_PPRE2_DIV2
+#define STM32_ADCPRE STM32_ADCPRE_DIV4
+#define STM32_USB_CLOCK_REQUIRED TRUE
+#define STM32_USBPRE STM32_USBPRE_DIV1P5
+#define STM32_MCOSEL STM32_MCOSEL_NOCLOCK
+#define STM32_RTCSEL STM32_RTCSEL_HSEDIV
+#define STM32_PVD_ENABLE FALSE
+#define STM32_PLS STM32_PLS_LEV0
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_USE_ADC1 FALSE
+#define STM32_ADC_ADC1_DMA_PRIORITY 2
+#define STM32_ADC_ADC1_IRQ_PRIORITY 6
+
+/*
+ * CAN driver system settings.
+ */
+#define STM32_CAN_USE_CAN1 FALSE
+#define STM32_CAN_CAN1_IRQ_PRIORITY 11
+
+/*
+ * EXT driver system settings.
+ */
+#define STM32_EXT_EXTI0_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI1_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI2_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI3_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI4_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI5_9_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI10_15_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI16_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI17_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI18_IRQ_PRIORITY 6
+#define STM32_EXT_EXTI19_IRQ_PRIORITY 6
+
+/*
+ * 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_TIM4 FALSE
+#define STM32_GPT_USE_TIM5 FALSE
+#define STM32_GPT_USE_TIM8 FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY 7
+#define STM32_GPT_TIM2_IRQ_PRIORITY 7
+#define STM32_GPT_TIM3_IRQ_PRIORITY 7
+#define STM32_GPT_TIM4_IRQ_PRIORITY 7
+#define STM32_GPT_TIM5_IRQ_PRIORITY 7
+#define STM32_GPT_TIM8_IRQ_PRIORITY 7
+
+/*
+ * 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 5
+#define STM32_I2C_I2C2_IRQ_PRIORITY 5
+#define STM32_I2C_I2C1_DMA_PRIORITY 3
+#define STM32_I2C_I2C2_DMA_PRIORITY 3
+#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_USE_TIM4 FALSE
+#define STM32_ICU_USE_TIM5 FALSE
+#define STM32_ICU_USE_TIM8 FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY 7
+#define STM32_ICU_TIM2_IRQ_PRIORITY 7
+#define STM32_ICU_TIM3_IRQ_PRIORITY 7
+#define STM32_ICU_TIM4_IRQ_PRIORITY 7
+#define STM32_ICU_TIM5_IRQ_PRIORITY 7
+#define STM32_ICU_TIM8_IRQ_PRIORITY 7
+
+/*
+ * 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_USE_TIM4 FALSE
+#define STM32_PWM_USE_TIM5 FALSE
+#define STM32_PWM_USE_TIM8 FALSE
+#define STM32_PWM_TIM1_IRQ_PRIORITY 7
+#define STM32_PWM_TIM2_IRQ_PRIORITY 7
+#define STM32_PWM_TIM3_IRQ_PRIORITY 7
+#define STM32_PWM_TIM4_IRQ_PRIORITY 7
+#define STM32_PWM_TIM5_IRQ_PRIORITY 7
+#define STM32_PWM_TIM8_IRQ_PRIORITY 7
+
+/*
+ * RTC driver system settings.
+ */
+#define STM32_RTC_IRQ_PRIORITY 15
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1 TRUE
+#define STM32_SERIAL_USE_USART2 FALSE
+#define STM32_SERIAL_USE_USART3 FALSE
+#define STM32_SERIAL_USE_UART4 FALSE
+#define STM32_SERIAL_USE_UART5 FALSE
+#define STM32_SERIAL_USART1_PRIORITY 12
+#define STM32_SERIAL_USART2_PRIORITY 12
+#define STM32_SERIAL_USART3_PRIORITY 12
+#define STM32_SERIAL_UART4_PRIORITY 12
+#define STM32_SERIAL_UART5_PRIORITY 12
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1 FALSE
+#define STM32_SPI_USE_SPI2 FALSE
+#define STM32_SPI_USE_SPI3 FALSE
+#define STM32_SPI_SPI1_DMA_PRIORITY 1
+#define STM32_SPI_SPI2_DMA_PRIORITY 1
+#define STM32_SPI_SPI3_DMA_PRIORITY 1
+#define STM32_SPI_SPI1_IRQ_PRIORITY 10
+#define STM32_SPI_SPI2_IRQ_PRIORITY 10
+#define STM32_SPI_SPI3_IRQ_PRIORITY 10
+#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY 8
+#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_USE_USART3 FALSE
+#define STM32_UART_USART1_IRQ_PRIORITY 12
+#define STM32_UART_USART2_IRQ_PRIORITY 12
+#define STM32_UART_USART3_IRQ_PRIORITY 12
+#define STM32_UART_USART1_DMA_PRIORITY 0
+#define STM32_UART_USART2_DMA_PRIORITY 0
+#define STM32_UART_USART3_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_HP_IRQ_PRIORITY 13
+#define STM32_USB_USB1_LP_IRQ_PRIORITY 14
+
+#endif /* _MCUCONF_H_ */
diff --git a/keyboards/zvecr/split_blackpill/readme.md b/keyboards/zvecr/split_blackpill/readme.md
new file mode 100644
index 0000000000..811e308f77
--- /dev/null
+++ b/keyboards/zvecr/split_blackpill/readme.md
@@ -0,0 +1,15 @@
+# split_blackpill
+
+![split_blackpill](https://i.imgur.com/cQTWvDFl.jpg)
+
+ARM Split ortho_4x12 mechanical keyboard.
+
+* Keyboard Maintainer: [zvecr](https://github.com/zvecr)
+* Hardware Supported: f103 blackpill
+* Hardware Availability: [repo](https://github.com/zvecr/split_blackpill)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make zvecr/split_blackpill: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/zvecr/split_blackpill/rules.mk b/keyboards/zvecr/split_blackpill/rules.mk
new file mode 100644
index 0000000000..95d901ee06
--- /dev/null
+++ b/keyboards/zvecr/split_blackpill/rules.mk
@@ -0,0 +1,37 @@
+# MCU name
+MCU = STM32F103
+
+# GENERIC STM32F103C8T6 board - stm32duino bootloader
+OPT_DEFS = -DCORTEX_VTOR_INIT=0x2000
+MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
+BOARD = STM32_F103_STM32DUINO
+STM32_BOOTLOADER_ADDRESS = 0x80000000
+
+DFU_ARGS = -d 1eaf:0003 -a2 -R
+DFU_SUFFIX_ARGS = -v 1eaf -p 0003
+
+# 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
+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
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+
+SPLIT_KEYBOARD = yes
+SERIAL_DRIVER = usart
+WS2812_DRIVER = pwm
+OPT_DEFS += -DSTM32_DMA_REQUIRED=TRUE
+
+LAYOUTS = ortho_4x12
diff --git a/keyboards/zvecr/split_blackpill/split_blackpill.c b/keyboards/zvecr/split_blackpill/split_blackpill.c
new file mode 100644
index 0000000000..141f76e7b3
--- /dev/null
+++ b/keyboards/zvecr/split_blackpill/split_blackpill.c
@@ -0,0 +1,29 @@
+/* Copyright 2020 zvecr <git@zvecr.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 <http://www.gnu.org/licenses/>.
+ */
+#include "split_blackpill.h"
+
+void keyboard_pre_init_kb(void){
+ // Workaround for reversible pcb/mcu
+ palSetLineMode(C13, PAL_MODE_OUTPUT_OPENDRAIN);
+ palSetLineMode(B9, PAL_MODE_OUTPUT_OPENDRAIN);
+ palSetLineMode(B8, PAL_MODE_OUTPUT_OPENDRAIN);
+
+ keyboard_pre_init_user();
+}
+
+void board_init(void) {
+ AFIO->MAPR |= AFIO_MAPR_USART1_REMAP | AFIO_MAPR_TIM3_REMAP_PARTIALREMAP;
+}
diff --git a/keyboards/zvecr/split_blackpill/split_blackpill.h b/keyboards/zvecr/split_blackpill/split_blackpill.h
new file mode 100644
index 0000000000..27504492ef
--- /dev/null
+++ b/keyboards/zvecr/split_blackpill/split_blackpill.h
@@ -0,0 +1,35 @@
+/* Copyright 2020 zvecr <git@zvecr.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 <http://www.gnu.org/licenses/>.
+ */
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_ortho_4x12( \
+ 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, R30, R31, R32, R33, R34, R35 \
+ ) \
+ { \
+ { L00, L01, L02, L03, L04, L05 }, \
+ { L10, L11, L12, L13, L14, L15 }, \
+ { L20, L21, L22, L23, L24, L25 }, \
+ { L30, L31, L32, L33, L34, L35 }, \
+ { R05, R04, R03, R02, R01, R00 }, \
+ { R15, R14, R13, R12, R11, R10 }, \
+ { R25, R24, R23, R22, R21, R20 }, \
+ { R35, R34, R33, R32, R31, R30 } \
+ }
diff --git a/keyboards/zvecr/zv48/config.h b/keyboards/zvecr/zv48/config.h
new file mode 100644
index 0000000000..226efe6755
--- /dev/null
+++ b/keyboards/zvecr/zv48/config.h
@@ -0,0 +1,186 @@
+/* Copyright 2020 zvecr <git@zvecr.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 <http://www.gnu.org/licenses/>.
+ */
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x5A56
+#define PRODUCT_ID 0x0048
+#define DEVICE_VER 0x0001
+#define MANUFACTURER zvecr
+#define PRODUCT zv48
+#define DESCRIPTION ARM Split ortho_4x12
+
+/* key matrix size */
+#define MATRIX_ROWS 8 // Rows are doubled-up
+#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_COL_PINS { B15, B10, B0, A5, A4, A3 }
+#define MATRIX_ROW_PINS { A10, A15, B3, B4 }
+#define MATRIX_COL_PINS_RIGHT { B10, B15, A10, A15, B3, B4 }
+#define MATRIX_ROW_PINS_RIGHT { B0, A5, A4, A3 }
+
+/* COL2ROW, ROW2COL*/
+#define DIODE_DIRECTION COL2ROW
+
+#define MATRIX_IO_DELAY 5
+
+/*
+ * Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
+ */
+#define SPLIT_HAND_PIN B9
+#define SOFT_SERIAL_PIN B6
+//#define SELECT_SOFT_SERIAL_SPEED 0
+#define SERIAL_USART_SPEED 921600
+
+#define ENCODERS_PAD_A { B5 }
+#define ENCODERS_PAD_B { A2 }
+
+#define RGB_DI_PIN B1
+#define RGBLED_NUM 48
+#define RGBLED_SPLIT {24, 24}
+#define RGBLIGHT_LIMIT_VAL 120
+#define RGBLIGHT_ANIMATIONS
+
+#define WS2812_PWM_DRIVER PWMD3
+#define WS2812_PWM_CHANNEL 4
+#define WS2812_PWM_PAL_MODE 2
+#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_DMA_CHANNEL 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
+
+/* 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
+
+/* Bootmagic Lite key configuration */
+#define BOOTMAGIC_LITE_ROW 0
+#define BOOTMAGIC_LITE_COLUMN 0
+#define BOOTMAGIC_LITE_ROW_RIGHT 4
+#define BOOTMAGIC_LITE_COLUMN_RIGHT 0
diff --git a/keyboards/zvecr/zv48/f401/chconf.h b/keyboards/zvecr/zv48/f401/chconf.h
new file mode 100644
index 0000000000..0b8b69b0e0
--- /dev/null
+++ b/keyboards/zvecr/zv48/f401/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 100000
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#endif
+
+/**
+ * @brief Enables factory for generic buffers.
+ */
+#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)
+#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE
+#endif
+
+/**
+ * @brief Enables factory for semaphores.
+ */
+#if !defined(CH_CFG_FACTORY_SEMAPHORES)
+#define CH_CFG_FACTORY_SEMAPHORES TRUE
+#endif
+
+/**
+ * @brief Enables factory for mailboxes.
+ */
+#if !defined(CH_CFG_FACTORY_MAILBOXES)
+#define CH_CFG_FACTORY_MAILBOXES TRUE
+#endif
+
+/**
+ * @brief Enables factory for objects FIFOs.
+ */
+#if !defined(CH_CFG_FACTORY_OBJ_FIFOS)
+#define CH_CFG_FACTORY_OBJ_FIFOS TRUE
+#endif
+
+/**
+ * @brief Enables factory for Pipes.
+ */
+#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)
+#define CH_CFG_FACTORY_PIPES TRUE
+#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/zvecr/zv48/f401/halconf.h b/keyboards/zvecr/zv48/f401/halconf.h
new file mode 100644
index 0000000000..1f8df5dbbd
--- /dev/null
+++ b/keyboards/zvecr/zv48/f401/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 TRUE
+#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 256
+#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/zvecr/zv48/f401/mcuconf.h b/keyboards/zvecr/zv48/f401/mcuconf.h
new file mode 100644
index 0000000000..c0c96bc13e
--- /dev/null
+++ b/keyboards/zvecr/zv48/f401/mcuconf.h
@@ -0,0 +1,253 @@
+/*
+ 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.
+*/
+
+#ifndef MCUCONF_H
+#define MCUCONF_H
+
+/*
+ * STM32F4xx 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:
+ * 15...0 Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3 Lowest...Highest.
+ */
+
+#define STM32F4xx_MCUCONF
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT FALSE
+#define STM32_HSI_ENABLED TRUE
+#define STM32_LSI_ENABLED TRUE
+#define STM32_HSE_ENABLED TRUE
+#define STM32_LSE_ENABLED FALSE
+#define STM32_CLOCK48_REQUIRED TRUE
+#define STM32_SW STM32_SW_PLL
+#define STM32_PLLSRC STM32_PLLSRC_HSE
+#define STM32_PLLM_VALUE 25
+#define STM32_PLLN_VALUE 336
+#define STM32_PLLP_VALUE 4
+#define STM32_PLLQ_VALUE 7
+#define STM32_HPRE STM32_HPRE_DIV1
+#define STM32_PPRE1 STM32_PPRE1_DIV4
+#define STM32_PPRE2 STM32_PPRE2_DIV2
+#define STM32_RTCSEL STM32_RTCSEL_LSI
+#define STM32_RTCPRE_VALUE 8
+#define STM32_MCO1SEL STM32_MCO1SEL_HSI
+#define STM32_MCO1PRE STM32_MCO1PRE_DIV1
+#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK
+#define STM32_MCO2PRE STM32_MCO2PRE_DIV5
+#define STM32_I2SSRC STM32_I2SSRC_CKIN
+#define STM32_PLLI2SN_VALUE 192
+#define STM32_PLLI2SR_VALUE 5
+#define STM32_PVD_ENABLE FALSE
+#define STM32_PLS STM32_PLS_LEV0
+#define STM32_BKPRAM_ENABLE FALSE
+
+/*
+ * IRQ system settings.
+ */
+#define STM32_IRQ_EXTI0_PRIORITY 6
+#define STM32_IRQ_EXTI1_PRIORITY 6
+#define STM32_IRQ_EXTI2_PRIORITY 6
+#define STM32_IRQ_EXTI3_PRIORITY 6
+#define STM32_IRQ_EXTI4_PRIORITY 6
+#define STM32_IRQ_EXTI5_9_PRIORITY 6
+#define STM32_IRQ_EXTI10_15_PRIORITY 6
+#define STM32_IRQ_EXTI16_PRIORITY 6
+#define STM32_IRQ_EXTI17_PRIORITY 15
+#define STM32_IRQ_EXTI18_PRIORITY 6
+#define STM32_IRQ_EXTI19_PRIORITY 6
+#define STM32_IRQ_EXTI20_PRIORITY 6
+#define STM32_IRQ_EXTI21_PRIORITY 15
+#define STM32_IRQ_EXTI22_PRIORITY 15
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4
+#define STM32_ADC_USE_ADC1 FALSE
+#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4)
+#define STM32_ADC_ADC1_DMA_PRIORITY 2
+#define STM32_ADC_IRQ_PRIORITY 6
+#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6
+
+/*
+ * 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_TIM4 FALSE
+#define STM32_GPT_USE_TIM5 FALSE
+#define STM32_GPT_USE_TIM9 FALSE
+#define STM32_GPT_USE_TIM11 FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY 7
+#define STM32_GPT_TIM2_IRQ_PRIORITY 7
+#define STM32_GPT_TIM3_IRQ_PRIORITY 7
+#define STM32_GPT_TIM4_IRQ_PRIORITY 7
+#define STM32_GPT_TIM5_IRQ_PRIORITY 7
+#define STM32_GPT_TIM9_IRQ_PRIORITY 7
+#define STM32_GPT_TIM11_IRQ_PRIORITY 7
+
+/*
+ * I2C driver system settings.
+ */
+#define STM32_I2C_USE_I2C1 FALSE
+#define STM32_I2C_USE_I2C2 FALSE
+#define STM32_I2C_USE_I2C3 FALSE
+#define STM32_I2C_BUSY_TIMEOUT 50
+#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0)
+#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6)
+#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2)
+#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
+#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2)
+#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_I2C_I2C1_IRQ_PRIORITY 5
+#define STM32_I2C_I2C2_IRQ_PRIORITY 5
+#define STM32_I2C_I2C3_IRQ_PRIORITY 5
+#define STM32_I2C_I2C1_DMA_PRIORITY 3
+#define STM32_I2C_I2C2_DMA_PRIORITY 3
+#define STM32_I2C_I2C3_DMA_PRIORITY 3
+#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure")
+
+/*
+ * I2S driver system settings.
+ */
+#define STM32_I2S_USE_SPI2 FALSE
+#define STM32_I2S_USE_SPI3 FALSE
+#define STM32_I2S_SPI2_IRQ_PRIORITY 10
+#define STM32_I2S_SPI3_IRQ_PRIORITY 10
+#define STM32_I2S_SPI2_DMA_PRIORITY 1
+#define STM32_I2S_SPI3_DMA_PRIORITY 1
+#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3)
+#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0)
+#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
+#define STM32_I2S_DMA_ERROR_HOOK(i2sp) 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_USE_TIM4 FALSE
+#define STM32_ICU_USE_TIM5 FALSE
+#define STM32_ICU_USE_TIM9 FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY 7
+#define STM32_ICU_TIM2_IRQ_PRIORITY 7
+#define STM32_ICU_TIM3_IRQ_PRIORITY 7
+#define STM32_ICU_TIM4_IRQ_PRIORITY 7
+#define STM32_ICU_TIM5_IRQ_PRIORITY 7
+#define STM32_ICU_TIM9_IRQ_PRIORITY 7
+
+/*
+ * 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_USE_TIM4 FALSE
+#define STM32_PWM_USE_TIM5 FALSE
+#define STM32_PWM_USE_TIM9 FALSE
+#define STM32_PWM_TIM1_IRQ_PRIORITY 7
+#define STM32_PWM_TIM2_IRQ_PRIORITY 7
+#define STM32_PWM_TIM3_IRQ_PRIORITY 7
+#define STM32_PWM_TIM4_IRQ_PRIORITY 7
+#define STM32_PWM_TIM5_IRQ_PRIORITY 7
+#define STM32_PWM_TIM9_IRQ_PRIORITY 7
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1 TRUE
+#define STM32_SERIAL_USE_USART2 FALSE
+#define STM32_SERIAL_USE_USART6 FALSE
+#define STM32_SERIAL_USART1_PRIORITY 12
+#define STM32_SERIAL_USART2_PRIORITY 12
+#define STM32_SERIAL_USART6_PRIORITY 12
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1 FALSE
+#define STM32_SPI_USE_SPI2 FALSE
+#define STM32_SPI_USE_SPI3 FALSE
+#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0)
+#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3)
+#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3)
+#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0)
+#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
+#define STM32_SPI_SPI1_DMA_PRIORITY 1
+#define STM32_SPI_SPI2_DMA_PRIORITY 1
+#define STM32_SPI_SPI3_DMA_PRIORITY 1
+#define STM32_SPI_SPI1_IRQ_PRIORITY 10
+#define STM32_SPI_SPI2_IRQ_PRIORITY 10
+#define STM32_SPI_SPI3_IRQ_PRIORITY 10
+#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY 8
+#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_USE_USART6 FALSE
+#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5)
+#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7)
+#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5)
+#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6)
+#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2)
+#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7)
+#define STM32_UART_USART1_IRQ_PRIORITY 12
+#define STM32_UART_USART2_IRQ_PRIORITY 12
+#define STM32_UART_USART6_IRQ_PRIORITY 12
+#define STM32_UART_USART1_DMA_PRIORITY 0
+#define STM32_UART_USART2_DMA_PRIORITY 0
+#define STM32_UART_USART6_DMA_PRIORITY 0
+#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure")
+
+/*
+ * USB driver system settings.
+ */
+#define STM32_USB_USE_OTG1 TRUE
+#define STM32_USB_OTG1_IRQ_PRIORITY 14
+#define STM32_USB_OTG1_RX_FIFO_SIZE 512
+#define STM32_USB_OTG_THREAD_PRIO NORMALPRIO+1
+#define STM32_USB_OTG_THREAD_STACK_SIZE 128
+#define STM32_USB_OTGFIFO_FILL_BASEPRI 0
+
+/*
+ * WDG driver system settings.
+ */
+#define STM32_WDG_USE_IWDG FALSE
+
+#endif /* MCUCONF_H */
diff --git a/keyboards/zvecr/zv48/f401/rules.mk b/keyboards/zvecr/zv48/f401/rules.mk
new file mode 100644
index 0000000000..e41d5ef7a2
--- /dev/null
+++ b/keyboards/zvecr/zv48/f401/rules.mk
@@ -0,0 +1,27 @@
+## chip/board settings
+# the next two should match the directories in
+# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+MCU_FAMILY = STM32
+MCU_SERIES = STM32F4xx
+# linker script to use
+# it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
+# or <this_dir>/ld/
+MCU_LDSCRIPT = STM32F401xC
+# startup code to use
+# is should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
+MCU_STARTUP = stm32f4xx
+# it should exist either in <chibios>/os/hal/boards/
+# or <this_dir>/boards
+BOARD = BLACKPILL_STM32_F401
+# Cortex version
+# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
+MCU = cortex-m4
+# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+ARMV = 7
+USE_FPU = yes
+# Address of the booloader in system memory
+STM32_BOOTLOADER_ADDRESS = 0x1FFF0000
+
+# Options to pass to dfu-util when flashing
+DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
+DFU_SUFFIX_ARGS = -v 0483 -p df11
diff --git a/keyboards/zvecr/zv48/f411/chconf.h b/keyboards/zvecr/zv48/f411/chconf.h
new file mode 100644
index 0000000000..0b8b69b0e0
--- /dev/null
+++ b/keyboards/zvecr/zv48/f411/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 100000
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#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 TRUE
+#endif
+
+/**
+ * @brief Enables factory for generic buffers.
+ */
+#if !defined(CH_CFG_FACTORY_GENERIC_BUFFERS)
+#define CH_CFG_FACTORY_GENERIC_BUFFERS TRUE
+#endif
+
+/**
+ * @brief Enables factory for semaphores.
+ */
+#if !defined(CH_CFG_FACTORY_SEMAPHORES)
+#define CH_CFG_FACTORY_SEMAPHORES TRUE
+#endif
+
+/**
+ * @brief Enables factory for mailboxes.
+ */
+#if !defined(CH_CFG_FACTORY_MAILBOXES)
+#define CH_CFG_FACTORY_MAILBOXES TRUE
+#endif
+
+/**
+ * @brief Enables factory for objects FIFOs.
+ */
+#if !defined(CH_CFG_FACTORY_OBJ_FIFOS)
+#define CH_CFG_FACTORY_OBJ_FIFOS TRUE
+#endif
+
+/**
+ * @brief Enables factory for Pipes.
+ */
+#if !defined(CH_CFG_FACTORY_PIPES) || defined(__DOXYGEN__)
+#define CH_CFG_FACTORY_PIPES TRUE
+#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/zvecr/zv48/f411/halconf.h b/keyboards/zvecr/zv48/f411/halconf.h
new file mode 100644
index 0000000000..1f8df5dbbd
--- /dev/null
+++ b/keyboards/zvecr/zv48/f411/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 TRUE
+#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 256
+#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/zvecr/zv48/f411/mcuconf.h b/keyboards/zvecr/zv48/f411/mcuconf.h
new file mode 100644
index 0000000000..f3a017731c
--- /dev/null
+++ b/keyboards/zvecr/zv48/f411/mcuconf.h
@@ -0,0 +1,253 @@
+/*
+ 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.
+*/
+
+#ifndef MCUCONF_H
+#define MCUCONF_H
+
+/*
+ * STM32F4xx 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:
+ * 15...0 Lowest...Highest.
+ *
+ * DMA priorities:
+ * 0...3 Lowest...Highest.
+ */
+
+#define STM32F4xx_MCUCONF
+
+/*
+ * HAL driver system settings.
+ */
+#define STM32_NO_INIT FALSE
+#define STM32_HSI_ENABLED TRUE
+#define STM32_LSI_ENABLED TRUE
+#define STM32_HSE_ENABLED TRUE
+#define STM32_LSE_ENABLED FALSE
+#define STM32_CLOCK48_REQUIRED TRUE
+#define STM32_SW STM32_SW_PLL
+#define STM32_PLLSRC STM32_PLLSRC_HSE
+#define STM32_PLLM_VALUE 25
+#define STM32_PLLN_VALUE 384
+#define STM32_PLLP_VALUE 4
+#define STM32_PLLQ_VALUE 8
+#define STM32_HPRE STM32_HPRE_DIV1
+#define STM32_PPRE1 STM32_PPRE1_DIV4
+#define STM32_PPRE2 STM32_PPRE2_DIV2
+#define STM32_RTCSEL STM32_RTCSEL_LSI
+#define STM32_RTCPRE_VALUE 8
+#define STM32_MCO1SEL STM32_MCO1SEL_HSI
+#define STM32_MCO1PRE STM32_MCO1PRE_DIV1
+#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK
+#define STM32_MCO2PRE STM32_MCO2PRE_DIV5
+#define STM32_I2SSRC STM32_I2SSRC_CKIN
+#define STM32_PLLI2SN_VALUE 192
+#define STM32_PLLI2SR_VALUE 5
+#define STM32_PVD_ENABLE FALSE
+#define STM32_PLS STM32_PLS_LEV0
+#define STM32_BKPRAM_ENABLE FALSE
+
+/*
+ * IRQ system settings.
+ */
+#define STM32_IRQ_EXTI0_PRIORITY 6
+#define STM32_IRQ_EXTI1_PRIORITY 6
+#define STM32_IRQ_EXTI2_PRIORITY 6
+#define STM32_IRQ_EXTI3_PRIORITY 6
+#define STM32_IRQ_EXTI4_PRIORITY 6
+#define STM32_IRQ_EXTI5_9_PRIORITY 6
+#define STM32_IRQ_EXTI10_15_PRIORITY 6
+#define STM32_IRQ_EXTI16_PRIORITY 6
+#define STM32_IRQ_EXTI17_PRIORITY 15
+#define STM32_IRQ_EXTI18_PRIORITY 6
+#define STM32_IRQ_EXTI19_PRIORITY 6
+#define STM32_IRQ_EXTI20_PRIORITY 6
+#define STM32_IRQ_EXTI21_PRIORITY 15
+#define STM32_IRQ_EXTI22_PRIORITY 15
+
+/*
+ * ADC driver system settings.
+ */
+#define STM32_ADC_ADCPRE ADC_CCR_ADCPRE_DIV4
+#define STM32_ADC_USE_ADC1 FALSE
+#define STM32_ADC_ADC1_DMA_STREAM STM32_DMA_STREAM_ID(2, 4)
+#define STM32_ADC_ADC1_DMA_PRIORITY 2
+#define STM32_ADC_IRQ_PRIORITY 6
+#define STM32_ADC_ADC1_DMA_IRQ_PRIORITY 6
+
+/*
+ * 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_TIM4 FALSE
+#define STM32_GPT_USE_TIM5 FALSE
+#define STM32_GPT_USE_TIM9 FALSE
+#define STM32_GPT_USE_TIM11 FALSE
+#define STM32_GPT_TIM1_IRQ_PRIORITY 7
+#define STM32_GPT_TIM2_IRQ_PRIORITY 7
+#define STM32_GPT_TIM3_IRQ_PRIORITY 7
+#define STM32_GPT_TIM4_IRQ_PRIORITY 7
+#define STM32_GPT_TIM5_IRQ_PRIORITY 7
+#define STM32_GPT_TIM9_IRQ_PRIORITY 7
+#define STM32_GPT_TIM11_IRQ_PRIORITY 7
+
+/*
+ * I2C driver system settings.
+ */
+#define STM32_I2C_USE_I2C1 FALSE
+#define STM32_I2C_USE_I2C2 FALSE
+#define STM32_I2C_USE_I2C3 FALSE
+#define STM32_I2C_BUSY_TIMEOUT 50
+#define STM32_I2C_I2C1_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0)
+#define STM32_I2C_I2C1_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6)
+#define STM32_I2C_I2C2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2)
+#define STM32_I2C_I2C2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
+#define STM32_I2C_I2C3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 2)
+#define STM32_I2C_I2C3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_I2C_I2C1_IRQ_PRIORITY 5
+#define STM32_I2C_I2C2_IRQ_PRIORITY 5
+#define STM32_I2C_I2C3_IRQ_PRIORITY 5
+#define STM32_I2C_I2C1_DMA_PRIORITY 3
+#define STM32_I2C_I2C2_DMA_PRIORITY 3
+#define STM32_I2C_I2C3_DMA_PRIORITY 3
+#define STM32_I2C_DMA_ERROR_HOOK(i2cp) osalSysHalt("DMA failure")
+
+/*
+ * I2S driver system settings.
+ */
+#define STM32_I2S_USE_SPI2 FALSE
+#define STM32_I2S_USE_SPI3 FALSE
+#define STM32_I2S_SPI2_IRQ_PRIORITY 10
+#define STM32_I2S_SPI3_IRQ_PRIORITY 10
+#define STM32_I2S_SPI2_DMA_PRIORITY 1
+#define STM32_I2S_SPI3_DMA_PRIORITY 1
+#define STM32_I2S_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3)
+#define STM32_I2S_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_I2S_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0)
+#define STM32_I2S_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
+#define STM32_I2S_DMA_ERROR_HOOK(i2sp) 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_USE_TIM4 FALSE
+#define STM32_ICU_USE_TIM5 FALSE
+#define STM32_ICU_USE_TIM9 FALSE
+#define STM32_ICU_TIM1_IRQ_PRIORITY 7
+#define STM32_ICU_TIM2_IRQ_PRIORITY 7
+#define STM32_ICU_TIM3_IRQ_PRIORITY 7
+#define STM32_ICU_TIM4_IRQ_PRIORITY 7
+#define STM32_ICU_TIM5_IRQ_PRIORITY 7
+#define STM32_ICU_TIM9_IRQ_PRIORITY 7
+
+/*
+ * 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_USE_TIM4 FALSE
+#define STM32_PWM_USE_TIM5 FALSE
+#define STM32_PWM_USE_TIM9 FALSE
+#define STM32_PWM_TIM1_IRQ_PRIORITY 7
+#define STM32_PWM_TIM2_IRQ_PRIORITY 7
+#define STM32_PWM_TIM3_IRQ_PRIORITY 7
+#define STM32_PWM_TIM4_IRQ_PRIORITY 7
+#define STM32_PWM_TIM5_IRQ_PRIORITY 7
+#define STM32_PWM_TIM9_IRQ_PRIORITY 7
+
+/*
+ * SERIAL driver system settings.
+ */
+#define STM32_SERIAL_USE_USART1 TRUE
+#define STM32_SERIAL_USE_USART2 FALSE
+#define STM32_SERIAL_USE_USART6 FALSE
+#define STM32_SERIAL_USART1_PRIORITY 12
+#define STM32_SERIAL_USART2_PRIORITY 12
+#define STM32_SERIAL_USART6_PRIORITY 12
+
+/*
+ * SPI driver system settings.
+ */
+#define STM32_SPI_USE_SPI1 FALSE
+#define STM32_SPI_USE_SPI2 FALSE
+#define STM32_SPI_USE_SPI3 FALSE
+#define STM32_SPI_SPI1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 0)
+#define STM32_SPI_SPI1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 3)
+#define STM32_SPI_SPI2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 3)
+#define STM32_SPI_SPI2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 4)
+#define STM32_SPI_SPI3_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 0)
+#define STM32_SPI_SPI3_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 7)
+#define STM32_SPI_SPI1_DMA_PRIORITY 1
+#define STM32_SPI_SPI2_DMA_PRIORITY 1
+#define STM32_SPI_SPI3_DMA_PRIORITY 1
+#define STM32_SPI_SPI1_IRQ_PRIORITY 10
+#define STM32_SPI_SPI2_IRQ_PRIORITY 10
+#define STM32_SPI_SPI3_IRQ_PRIORITY 10
+#define STM32_SPI_DMA_ERROR_HOOK(spip) osalSysHalt("DMA failure")
+
+/*
+ * ST driver system settings.
+ */
+#define STM32_ST_IRQ_PRIORITY 8
+#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_USE_USART6 FALSE
+#define STM32_UART_USART1_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 5)
+#define STM32_UART_USART1_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7)
+#define STM32_UART_USART2_RX_DMA_STREAM STM32_DMA_STREAM_ID(1, 5)
+#define STM32_UART_USART2_TX_DMA_STREAM STM32_DMA_STREAM_ID(1, 6)
+#define STM32_UART_USART6_RX_DMA_STREAM STM32_DMA_STREAM_ID(2, 2)
+#define STM32_UART_USART6_TX_DMA_STREAM STM32_DMA_STREAM_ID(2, 7)
+#define STM32_UART_USART1_IRQ_PRIORITY 12
+#define STM32_UART_USART2_IRQ_PRIORITY 12
+#define STM32_UART_USART6_IRQ_PRIORITY 12
+#define STM32_UART_USART1_DMA_PRIORITY 0
+#define STM32_UART_USART2_DMA_PRIORITY 0
+#define STM32_UART_USART6_DMA_PRIORITY 0
+#define STM32_UART_DMA_ERROR_HOOK(uartp) osalSysHalt("DMA failure")
+
+/*
+ * USB driver system settings.
+ */
+#define STM32_USB_USE_OTG1 TRUE
+#define STM32_USB_OTG1_IRQ_PRIORITY 14
+#define STM32_USB_OTG1_RX_FIFO_SIZE 512
+#define STM32_USB_OTG_THREAD_PRIO NORMALPRIO+1
+#define STM32_USB_OTG_THREAD_STACK_SIZE 128
+#define STM32_USB_OTGFIFO_FILL_BASEPRI 0
+
+/*
+ * WDG driver system settings.
+ */
+#define STM32_WDG_USE_IWDG FALSE
+
+#endif /* MCUCONF_H */
diff --git a/keyboards/zvecr/zv48/f411/rules.mk b/keyboards/zvecr/zv48/f411/rules.mk
new file mode 100644
index 0000000000..61add3aed5
--- /dev/null
+++ b/keyboards/zvecr/zv48/f411/rules.mk
@@ -0,0 +1,27 @@
+## chip/board settings
+# the next two should match the directories in
+# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+MCU_FAMILY = STM32
+MCU_SERIES = STM32F4xx
+# linker script to use
+# it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
+# or <this_dir>/ld/
+MCU_LDSCRIPT = STM32F411xE
+# startup code to use
+# is should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
+MCU_STARTUP = stm32f4xx
+# it should exist either in <chibios>/os/hal/boards/
+# or <this_dir>/boards
+BOARD = BLACKPILL_STM32_F411
+# Cortex version
+# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
+MCU = cortex-m4
+# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+ARMV = 7
+USE_FPU = yes
+# Address of the booloader in system memory
+STM32_BOOTLOADER_ADDRESS = 0x1FFF0000
+
+# Options to pass to dfu-util when flashing
+DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
+DFU_SUFFIX_ARGS = -v 0483 -p df11
diff --git a/keyboards/zvecr/zv48/info.json b/keyboards/zvecr/zv48/info.json
new file mode 100644
index 0000000000..b6a9c7693c
--- /dev/null
+++ b/keyboards/zvecr/zv48/info.json
@@ -0,0 +1,13 @@
+{
+ "keyboard_name": "zv48",
+ "url": "",
+ "maintainer": "zvecr",
+ "width": 12,
+ "height": 4,
+ "layouts": {
+ "LAYOUT_ortho_4x12": {
+ "key_count": 48,
+ "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":0, "y":1}, {"x":1, "y":1}, {"x":2, "y":1}, {"x":3, "y":1}, {"x":4, "y":1}, {"x":5, "y":1}, {"x":6, "y":1}, {"x":7, "y":1}, {"x":8, "y":1}, {"x":9, "y":1}, {"x":10, "y":1}, {"x":11, "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":6, "y":2}, {"x":7, "y":2}, {"x":8, "y":2}, {"x":9, "y":2}, {"x":10, "y":2}, {"x":11, "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}]
+ }
+ }
+}
diff --git a/keyboards/zvecr/zv48/keymaps/default/keymap.c b/keyboards/zvecr/zv48/keymaps/default/keymap.c
new file mode 100644
index 0000000000..f9428c3292
--- /dev/null
+++ b/keyboards/zvecr/zv48/keymaps/default/keymap.c
@@ -0,0 +1,91 @@
+#include QMK_KEYBOARD_H
+
+// Defines names for use in layer keycodes and the keymap
+enum layer_names {
+ _QWERTY,
+ _LOWER,
+ _RAISE,
+ _ADJUST,
+};
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+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 | App |Lower | 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_LCTL, KC_LGUI, KC_LALT, KC_APP, LOWER, KC_SPC, 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_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,
+ _______, 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_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, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
+),
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * | | Reset| | | | |R Tog |R Mode|R Rev |R Grad| Reset| |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | | | | |R HUI|R SAI|R VAI| | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | |R HUD|R SAD|R VAD| | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = LAYOUT_ortho_4x12(
+ _______, RESET, _______, _______, _______, _______, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_M_G, RESET, _______,
+ _______, _______, _______, _______, _______, _______, RGB_HUI, RGB_SAI, RGB_VAI, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_VAD, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+)
+
+};
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+}
diff --git a/keyboards/zvecr/zv48/readme.md b/keyboards/zvecr/zv48/readme.md
new file mode 100644
index 0000000000..88db2533a6
--- /dev/null
+++ b/keyboards/zvecr/zv48/readme.md
@@ -0,0 +1,16 @@
+# zv48
+
+![zv48](https://i.imgur.com/ZJ9GfF6l.jpg)
+
+ARM Split ortho_4x12 mechanical keyboard.
+
+* Keyboard Maintainer: [zvecr](https://github.com/zvecr)
+* Hardware Supported: f401/f411 blackpill
+* Hardware Availability: [repo](https://github.com/zvecr/zv48)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make zvecr/zv48/f401:default
+ make zvecr/zv48/f411: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/zvecr/zv48/rules.mk b/keyboards/zvecr/zv48/rules.mk
new file mode 100644
index 0000000000..41ec506e6c
--- /dev/null
+++ b/keyboards/zvecr/zv48/rules.mk
@@ -0,0 +1,29 @@
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = lite # Virtual DIP switch configuration
+KEYBOARD_SHARED_EP = yes # Free up some extra endpoints - needed if console+mouse+extra
+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
+ENCODER_ENABLE = yes # Enable rotary encoder support
+MIDI_ENABLE = no # MIDI support
+BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
+AUDIO_ENABLE = no # Audio output
+FAUXCLICKY_ENABLE = no # Use buzzer to emulate clicky switches
+
+SPLIT_KEYBOARD = yes
+SERIAL_DRIVER = usart
+WS2812_DRIVER = pwm
+OPT_DEFS += -DSTM32_DMA_REQUIRED=TRUE
+
+DEFAULT_FOLDER = zvecr/zv48/f401
+
+LAYOUTS = ortho_4x12
diff --git a/keyboards/zvecr/zv48/zv48.c b/keyboards/zvecr/zv48/zv48.c
new file mode 100644
index 0000000000..3c3d1ab777
--- /dev/null
+++ b/keyboards/zvecr/zv48/zv48.c
@@ -0,0 +1,27 @@
+/* Copyright 2020 zvecr <git@zvecr.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 <http://www.gnu.org/licenses/>.
+ */
+#include "zv48.h"
+
+void keyboard_pre_init_kb(void){
+ // Workaround for reversible pcb/mcu
+ palSetLineMode(C13, PAL_MODE_INPUT_PULLUP);
+ palSetLineMode(C15, PAL_MODE_INPUT_PULLUP);
+ palSetLineMode(B7, PAL_MODE_OUTPUT_OPENDRAIN);
+ palSetLineMode(A0, PAL_MODE_OUTPUT_OPENDRAIN);
+ palSetLineMode(A1, PAL_MODE_OUTPUT_OPENDRAIN);
+
+ keyboard_pre_init_user();
+}
diff --git a/keyboards/zvecr/zv48/zv48.h b/keyboards/zvecr/zv48/zv48.h
new file mode 100644
index 0000000000..27504492ef
--- /dev/null
+++ b/keyboards/zvecr/zv48/zv48.h
@@ -0,0 +1,35 @@
+/* Copyright 2020 zvecr <git@zvecr.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 <http://www.gnu.org/licenses/>.
+ */
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_ortho_4x12( \
+ 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, R30, R31, R32, R33, R34, R35 \
+ ) \
+ { \
+ { L00, L01, L02, L03, L04, L05 }, \
+ { L10, L11, L12, L13, L14, L15 }, \
+ { L20, L21, L22, L23, L24, L25 }, \
+ { L30, L31, L32, L33, L34, L35 }, \
+ { R05, R04, R03, R02, R01, R00 }, \
+ { R15, R14, R13, R12, R11, R10 }, \
+ { R25, R24, R23, R22, R21, R20 }, \
+ { R35, R34, R33, R32, R31, R30 } \
+ }
diff --git a/layouts/community/60_iso/unxmaal/keymap.c b/layouts/community/60_iso/unxmaal/keymap.c
index 455d969f47..9441997b4b 100644
--- a/layouts/community/60_iso/unxmaal/keymap.c
+++ b/layouts/community/60_iso/unxmaal/keymap.c
@@ -108,8 +108,6 @@ enum function_id {
};
const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_LAYER_TOGGLE(1), // Toggle Arrow Layer overlay
- [3] = ACTION_LAYER_TOGGLE(3), // Toggle Underglow Layer overlay
[4] = ACTION_FUNCTION(RGBLED_TOGGLE), //Turn on/off underglow
[5] = ACTION_FUNCTION(RGBLED_STEP_MODE), // Change underglow mode
[6] = ACTION_FUNCTION(RGBLED_INCREASE_HUE),
diff --git a/layouts/community/60_tsangan_hhkb/dohmain/keymap.c b/layouts/community/60_tsangan_hhkb/dohmain/keymap.c
new file mode 100644
index 0000000000..2d92fd9c4d
--- /dev/null
+++ b/layouts/community/60_tsangan_hhkb/dohmain/keymap.c
@@ -0,0 +1,43 @@
+#include QMK_KEYBOARD_H
+
+enum layer {
+ QWERTY,
+ COLEMAK,
+ FUNCTION,
+ ADJUST,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [QWERTY] = 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_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,
+ 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, LT(2,KC_ENT),
+ KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, MO(3),
+ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL
+ ),
+
+ [COLEMAK] = 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_BSLS, KC_GRV,
+ 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_BSPC,
+ LT(2, KC_CAPS), KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, KC_QUOT, LT(2,KC_ENT),
+ KC_LSPO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSPC, MO(3),
+ KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_RALT, KC_RCTL
+ ),
+
+ [FUNCTION] = LAYOUT_60_tsangan_hhkb(
+ 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, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, KC_MPLY, KC_MPRV, KC_MNXT, XXXXXXX, XXXXXXX, KC_HOME, KC_UP, KC_END, KC_PSCR, KC_SLCK, KC_PAUS, XXXXXXX,
+ _______, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_INS, _______,
+ _______, KC_UNDO, KC_CUT, KC_COPY, KC_PSTE, KC_AGIN, XXXXXXX, XXXXXXX, KC_WBAK, KC_WFWD, KC_WREF, _______, KC_WHOM,
+ _______, _______, _______, _______, _______, KC_APP, _______
+ ),
+
+ [ADJUST] = LAYOUT_60_tsangan_hhkb(
+ C(A(KC_DEL)), XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_BRID, KC_BRIU, XXXXXXX, XXXXXXX,
+ C(S(KC_ESC)), TO(0), XXXXXXX, XXXXXXX, RESET, 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, TO(1), XXXXXXX, XXXXXXX, NK_TOGG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______,
+ XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX
+ ),
+
+};
diff --git a/layouts/community/60_tsangan_hhkb/dohmain/readme.md b/layouts/community/60_tsangan_hhkb/dohmain/readme.md
new file mode 100644
index 0000000000..90b615a028
--- /dev/null
+++ b/layouts/community/60_tsangan_hhkb/dohmain/readme.md
@@ -0,0 +1,37 @@
+# dohmain's 60% Tsangan HHKB layout
+## Layout
+![Layout Image](https://i.imgur.com/LfTyOF4.png)
+## Features
+### CapsFn
+* Function layer is accessed by holding down `CapsLock` or `Enter`.
+* `CapsLock` and `Enter` still function as normal when tapped.
+### Space Cadet Shift
+* Left and right `Shift` keys now output opening parenthesis `(` and closing parenthesis `)`, respectively, when tapped.
+* When held down they function as normal.
+### Navigation Cluster
+The Navigation Cluster is laid out to be easily accessed with the right hand without moving your hand away from your typing position. The Navigation Cluster layout is focused around the placement of the arrow keys and is easy to remember the placement when broken down into groups.
+* #### Arrows
+ * The arrow keys are placed on `I` `J` `K` `L` and maintains their natural positions.
+* #### Home/End
+ * `Home` on `U`
+ * `End` on `O`.
+* #### Page Up/Page Down
+ * `Page Up` on `H`
+ * `Page Down` on `N`
+* #### Delete/Insert
+ * `Delete` on `;`
+ * `Insert` on `'`
+### Media Controls
+ * `Play/Pause` on `W`
+ * `Previous Track` on `E`
+ * `Next Track` on `R`
+ * `Mute` on `S`
+ * `Volume Down` on `D`
+ * `Volume Up` on `F`
+### Shortcuts
+ * `Undo` on `Z`
+ * `Cut` on `X`
+ * `Copy` on `C`
+ * `Paste` on `V`
+ * `Redo` on `B`
+ * `Print Screen` on `P`
diff --git a/layouts/community/65_ansi/mechmerlin/keymap.c b/layouts/community/65_ansi/mechmerlin/keymap.c
index 57a1f01167..df75b11f3f 100644
--- a/layouts/community/65_ansi/mechmerlin/keymap.c
+++ b/layouts/community/65_ansi/mechmerlin/keymap.c
@@ -51,7 +51,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, EEP_RST, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
};
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 0000000000..221fcfba59
--- /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 0000000000..c7ea966d8d
--- /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
+
+![Default layer layout](https://i.imgur.com/Vdnw2mp.png)
+
+([KLE](http://www.keyboard-layout-editor.com/#/gists/dd675b40cc4df2c7bb78847ac29f5988))
+
+## Function layer
+
+![Function layer layout](https://i.imgur.com/Q304GlI.png)
+
+([KLE](http://www.keyboard-layout-editor.com/#/gists/f29128427f674c43777f045e363d1b44))
diff --git a/layouts/community/ergodox/algernon/keymap.c b/layouts/community/ergodox/algernon/keymap.c
index fb6de1b721..e6e9bdaf7f 100644
--- a/layouts/community/ergodox/algernon/keymap.c
+++ b/layouts/community/ergodox/algernon/keymap.c
@@ -79,9 +79,6 @@ enum {
F_BSE = 0,
F_HUN,
F_GUI,
- F_SFT,
- F_ALT,
- F_CTRL
};
/* Custom keycodes */
@@ -146,9 +143,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
,KC_MPLY ,KC_SLSH ,KC_Q ,KC_J ,KC_K ,KC_X ,TD(CT_TMUX)
,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
- ,F(F_ALT),F(F_GUI)
- ,F(F_CTRL)
- ,KC_BSPC,F(F_SFT),KC_ESC
+ ,OSM(MOD_LALT),F(F_GUI)
+ ,OSM(MOD_LCTL)
+ ,KC_BSPC,OSM(MOD_LSFT),KC_ESC
// right hand
,M(Fx) ,M(A_0) ,M(A_2) ,M(A_4) ,M(A_6) ,M(A_8) ,M(A_PLVR)
@@ -191,9 +188,9 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
,KC_NO ,KC_Z ,KC_Q ,KC_QUOT ,KC_COMM ,KC_DOT ,TD(CT_TMUX)
,KC_NO ,KC_NO ,KC_NO ,KC_NO ,TD(CT_CLN)
- ,F(F_ALT),F(F_GUI)
- ,F(F_CTRL)
- ,KC_BSPC,F(F_SFT),KC_ESC
+ ,OSM(MOD_LALT),F(F_GUI)
+ ,OSM(MOD_LCTL)
+ ,KC_BSPC,OSM(F_LSFT),KC_ESC
// right hand
,M(Fx) ,M(A_0) ,M(A_2) ,M(A_4) ,M(A_6) ,M(A_8) ,M(A_PLVR)
@@ -440,9 +437,6 @@ const uint16_t PROGMEM fn_actions[] = {
[F_BSE] = ACTION_LAYER_CLEAR(ON_PRESS)
,[F_HUN] = ACTION_LAYER_INVERT(HUN, ON_PRESS)
,[F_GUI] = ACTION_MACRO_TAP(A_GUI)
- ,[F_SFT] = ACTION_MODS_ONESHOT (MOD_LSFT)
- ,[F_ALT] = ACTION_MODS_ONESHOT (MOD_LALT)
- ,[F_CTRL] = ACTION_MODS_ONESHOT (MOD_LCTL)
};
static void toggle_steno(int pressed)
diff --git a/layouts/community/ergodox/colemak_osx_pc_no/keymap.c b/layouts/community/ergodox/colemak_osx_pc_no/keymap.c
index 189ff5c43d..a4a4533494 100644
--- a/layouts/community/ergodox/colemak_osx_pc_no/keymap.c
+++ b/layouts/community/ergodox/colemak_osx_pc_no/keymap.c
@@ -41,7 +41,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
MO(4), KC_BTN1, KC_BTN2, KC_TAB,GUI_T(KC_COMMA),
NO_AMPR, NO_PIPE,
NO_PLUS,
- KC_FN1,CTL_T(KC_DOT),ALT_T(NO_MINS),
+ OSM(MOD_LSFT),CTL_T(KC_DOT),ALT_T(NO_MINS),
// right hand
KC_FN5, NO_DLR, NO_LPRN, NO_RPRN ,KC_FN3, KC_FN4,NO_AT,
NO_APOS, KC_J, KC_L, KC_U, KC_Y, NO_AA, NO_AE ,
@@ -222,7 +222,6 @@ enum macro_id {
};
const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_MODS_ONESHOT(MOD_LSFT), // Sticky shift light. Tap for the next keypress to be shifted. Hold for regular shift.
[2] = ACTION_MACRO(TILDE_NO), // Completed ~ character(pc and mac), no space needed.
[3] = ACTION_MACRO(LESS_NO), // < completed on keypress down, to avoid shifting the next character if it is not released first.
[4] = ACTION_MACRO(GRTR_NO), // > completed on keypress down, to avoid shifting the next character if it is not released first.
diff --git a/layouts/community/ergodox/drashna/keymap.c b/layouts/community/ergodox/drashna/keymap.c
index 69066a47cc..cb256e5e57 100644
--- a/layouts/community/ergodox/drashna/keymap.c
+++ b/layouts/community/ergodox/drashna/keymap.c
@@ -457,7 +457,7 @@ void rgb_matrix_indicators_user(void) {
#endif // RGB_MATRIX_INIT
-uint16_t get_tapping_term(uint16_t keycode) {
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
if (keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) {
if (mod_config(keycode & 0xf) & MOD_MASK_ALT) {
return (2 * TAPPING_TERM);
diff --git a/layouts/community/ergodox/guni/keymap.c b/layouts/community/ergodox/guni/keymap.c
index 14d6f8d3ad..ff1dd72eb0 100644
--- a/layouts/community/ergodox/guni/keymap.c
+++ b/layouts/community/ergodox/guni/keymap.c
@@ -7,7 +7,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
LAYOUT_ergodox( // layer 0 : default
// left hand
KC_EQL , KC_1, KC_2, KC_3, KC_4, KC_5, KC_LBRC,
- KC_FN25 , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME,
+ MT(MOD_LCTL, KC_TAB) , KC_Q, KC_W, KC_E, KC_R, KC_T, KC_HOME,
LT(1, 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_PGUP,
KC_LGUI , KC_GRV,KC_LEFT,KC_RGHT,KC_LALT,
@@ -16,13 +16,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_BSPC,KC_DEL ,KC_FN23,
// right hand
KC_RBRC , KC_6, KC_7 , KC_8, KC_9, KC_0, KC_MINS,
- KC_END , KC_Y, KC_U , KC_I, KC_O, KC_P, KC_FN28,
+ KC_END , KC_Y, KC_U , KC_I, KC_O, KC_P, MT(MOD_RCTL, KC_BSLS),
KC_H , KC_J, KC_K , KC_L, KC_SCLN,LT(1, KC_QUOT),
- KC_PGDN , KC_N, KC_M , KC_COMM,KC_DOT, KC_SLSH,KC_FN29,
+ KC_PGDN , KC_N, KC_M , KC_COMM,KC_DOT, KC_SLSH,MT(MOD_RSFT, KC_ESC),
KC_RALT , KC_DOWN,KC_UP, KC_NO ,KC_RGUI,
KC_NO , KC_NO,
KC_NO ,
- KC_FN29,KC_ENT ,KC_SPC
+ MT(MOD_RSFT, KC_ESC),KC_ENT ,KC_SPC
),
LAYOUT_ergodox( // layer 1 : function and symbol keys
@@ -122,20 +122,9 @@ enum function_id {
const uint16_t PROGMEM fn_actions[] = {
[0] = ACTION_FUNCTION(TEENSY_KEY), // FN0 - Teensy key
[1] = ACTION_LAYER_SET(0, ON_PRESS),
- //[11] = ACTION_MODS_KEY(MOD_LSFT, KC_COMM),
- //[12] = ACTION_MODS_KEY(MOD_LSFT, KC_DOT),
-
- //[14] = ACTION_MODS_KEY(MOD_LSFT, KC_SLSH),
- //[17] = ACTION_MODS_KEY(MOD_LSFT, KC_SCLN),
- //[20] = ACTION_MODS_KEY(MOD_LSFT, KC_5),
- //[21] = ACTION_MODS_KEY(MOD_LSFT, KC_QUOT),
[23] = ACTION_LAYER_SET(3, ON_PRESS),
[24] = ACTION_LAYER_SET(2, ON_PRESS),
- [25] = ACTION_MODS_TAP_KEY(MOD_LCTL, KC_TAB),
[26] = ACTION_LAYER_SET(1, ON_PRESS),
- [28] = ACTION_MODS_TAP_KEY(MOD_RCTL,KC_BSLS),
- //[29] = ACTION_LAYER_TOGGLE(4),
- [29] = ACTION_MODS_TAP_KEY(MOD_RSFT,KC_ESC),
};
diff --git a/layouts/community/ergodox/j3rn/keymap.c b/layouts/community/ergodox/j3rn/keymap.c
index 8209c9c63e..ae084b6e92 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 92883b4516..23071482a3 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-<key>` 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/kastyle/keymap.c b/layouts/community/ergodox/kastyle/keymap.c
index 923715477b..32eec96f50 100644
--- a/layouts/community/ergodox/kastyle/keymap.c
+++ b/layouts/community/ergodox/kastyle/keymap.c
@@ -39,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(1),
KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G,
KC_LSFT, CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, ALL_T(KC_NO),
- KC_FN1, KC_BSLS, LALT(KC_LSFT), KC_LEFT, KC_RGHT,
+ SH_T(KC_GRV), KC_BSLS, LALT(KC_LSFT), KC_LEFT, KC_RGHT,
KC_LGUI, ALT_T(KC_ESC),
KC_HOME,
KC_BSPC, KC_DEL, KC_END,
@@ -48,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
TG(1), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
KC_H, KC_J, KC_K, KC_L, LT(MDIA, KC_SCLN), KC_QUOT,
MEH_T(KC_NO), KC_N, KC_M, KC_COMM, KC_DOT, CTL_T(KC_SLSH), KC_RSFT,
- KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, KC_FN1,
+ KC_UP, KC_DOWN, KC_LBRC, KC_RBRC, SH_T(KC_GRV),
ALT_T(KC_ESC), KC_RGUI,
KC_PGUP,
KC_PGDN, KC_ENT, KC_SPC
@@ -155,10 +155,6 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
return MACRO_NONE;
};
-const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_SWAP_HANDS_TAP_KEY(KC_GRV) // FN1 - Tap = Grave/Tilde - Hold Momentary swap hands
-};
-
// Runs just one time when the keyboard initializes.
void matrix_init_user(void) {
diff --git a/layouts/community/ergodox/mpiechotka/keymap.c b/layouts/community/ergodox/mpiechotka/keymap.c
index a673d0bd8a..6a89e38a32 100644
--- a/layouts/community/ergodox/mpiechotka/keymap.c
+++ b/layouts/community/ergodox/mpiechotka/keymap.c
@@ -15,9 +15,7 @@ enum {
PC1,
PC2,
PC3,
- PC4,
- DL_BASE,
- DL_BASE_CM,
+ PC4
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
@@ -175,7 +173,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// MACROS
[MACR] = LAYOUT_ergodox(
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
- KC_NO, F(DL_BASE),F(DL_BASE_CM),KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, DF(BASE), DF(BASE_CM), KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, F(PC1), F(PC2), F(PC3), F(PC4), KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,
@@ -199,9 +197,7 @@ const uint16_t PROGMEM fn_actions[] = {
[PC1] = ACTION_MACRO(PC1),
[PC2] = ACTION_MACRO(PC2),
[PC3] = ACTION_MACRO(PC3),
- [PC4] = ACTION_MACRO(PC4),
- [DL_BASE] = ACTION_DEFAULT_LAYER_SET(BASE),
- [DL_BASE_CM] = ACTION_DEFAULT_LAYER_SET(BASE_CM)
+ [PC4] = ACTION_MACRO(PC4)
};
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
diff --git a/layouts/community/ergodox/norwegian_programmer_osx_pc/keymap.c b/layouts/community/ergodox/norwegian_programmer_osx_pc/keymap.c
index 63fea6e1c1..ee9a9d1802 100644
--- a/layouts/community/ergodox/norwegian_programmer_osx_pc/keymap.c
+++ b/layouts/community/ergodox/norwegian_programmer_osx_pc/keymap.c
@@ -39,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
ALT_T(KC_ESC), KC_EXLM , NO_QUES, NO_COLN, KC_TAB,
KC_HASH, KC_FN7,
KC_FN6,
- KC_FN1,CTL_T(KC_DOT),GUI_T(KC_COMMA),
+ OSM(MOD_LSFT),CTL_T(KC_DOT),GUI_T(KC_COMMA),
// right hand
KC_FN5, NO_DLR, NO_LPRN, NO_RPRN ,KC_FN3, KC_FN4,NO_AT,
NO_APOS, KC_Y, KC_U, KC_I, KC_O, KC_P, NO_AA ,
@@ -138,7 +138,6 @@ enum macro_id {
};
const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_MODS_ONESHOT(MOD_LSFT), // Sticky shift light. Tap for the next keypress to be shifted. Hold for regular shift.
[2] = ACTION_MACRO(TILDE_NO), // Completed ~ character(pc and mac), no space needed.
[3] = ACTION_MACRO(LESS_NO), // < completed on keypress down, to avoid shifting the next character if it is not released first.
[4] = ACTION_MACRO(GRTR_NO), // > completed on keypress down, to avoid shifting the next character if it is not released first.
diff --git a/layouts/community/ergodox/norwegian_programmer_osx_pc_colemak/keymap.c b/layouts/community/ergodox/norwegian_programmer_osx_pc_colemak/keymap.c
index cb61ce59cb..af1d268bd9 100644
--- a/layouts/community/ergodox/norwegian_programmer_osx_pc_colemak/keymap.c
+++ b/layouts/community/ergodox/norwegian_programmer_osx_pc_colemak/keymap.c
@@ -39,7 +39,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
ALT_T(KC_ESC), KC_EXLM , NO_QUES, NO_COLN, KC_TAB,
KC_HASH, KC_FN7,
KC_FN6,
- KC_FN1,CTL_T(KC_DOT),GUI_T(KC_COMMA),
+ OSM(MOD_LSFT),CTL_T(KC_DOT),GUI_T(KC_COMMA),
// right hand
KC_FN5, NO_DLR, NO_LPRN, NO_RPRN ,KC_FN3, KC_FN4,NO_AT,
NO_APOS, KC_J, KC_L, KC_U, KC_Y, NO_AA, NO_AE ,
@@ -138,7 +138,6 @@ enum macro_id {
};
const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_MODS_ONESHOT(MOD_LSFT), // Sticky shift light. Tap for the next keypress to be shifted. Hold for regular shift.
[2] = ACTION_MACRO(TILDE_NO), // Completed ~ character(pc and mac), no space needed.
[3] = ACTION_MACRO(LESS_NO), // < completed on keypress down, to avoid shifting the next character if it is not released first.
[4] = ACTION_MACRO(GRTR_NO), // > completed on keypress down, to avoid shifting the next character if it is not released first.
diff --git a/layouts/community/ergodox/townk_osx/keymap.c b/layouts/community/ergodox/townk_osx/keymap.c
index 55394fab21..6799ad7460 100644
--- a/layouts/community/ergodox/townk_osx/keymap.c
+++ b/layouts/community/ergodox/townk_osx/keymap.c
@@ -97,8 +97,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_ESC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, MEH_T(KC_F16),
CTL_T(KC_BSLS), KC_A, KC_S, KC_D, KC_F, KC_G,
- KC_FN2, KC_Z, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_F18),
- KC_FN1, TG(KEYPAD), KC_LCTRL, KC_LALT, KC_LGUI,
+ OSM(MOD_LSFT), KC_Z, KC_X, KC_C, KC_V, KC_B, ALL_T(KC_F18),
+ OSL(FN), TG(KEYPAD), KC_LCTRL, KC_LALT, KC_LGUI,
M_TESC, M_TPASTE,
KC_HOME,
KC_BSPC, KC_DEL, KC_END,
@@ -106,8 +106,8 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_POWER, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
MEH_T(KC_F17), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_EQL,
KC_H, KC_J, KC_K, KC_L, KC_SCLN, CTL_T(KC_QUOT),
- ALL_T(KC_F19), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_FN2,
- KC_RGUI, KC_RALT, CTL_T(KC_LBRC), LT(KEYPAD, KC_RBRC), KC_FN1,
+ ALL_T(KC_F19), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, OSM(MOD_LSFT),
+ KC_RGUI, KC_RALT, CTL_T(KC_LBRC), LT(KEYPAD, KC_RBRC), OSL(FN),
M_OSXCPY, M_OSXPST,
KC_PGUP,
KC_PGDN, KC_ENT, KC_SPC),
@@ -194,11 +194,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_NO,
KC_NO, KC_NO, KC_NO)};
-const uint16_t PROGMEM fn_actions[] = {
- [1] = ACTION_LAYER_ONESHOT(FN),
- [2] = ACTION_MODS_ONESHOT(MOD_LSFT), // Sticky shift light. Tap for the next keypress to be shifted. Hold for regular shift.
-};
-
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
// MACRODOWN only works in this function
switch(id) {
diff --git a/layouts/community/ortho_4x12/jotix/keymap.c b/layouts/community/ortho_4x12/jotix/keymap.c
index 600772288e..09543090d2 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 SHRAISE LM(_RAISE, MOD_LSFT)
+#define TGLOWER TG(_LOWER)
static bool is_ctl_pressed;
static bool is_esc_pressed;
@@ -18,45 +18,45 @@ 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_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_ENT,
+ 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_UP, KC_SLSH,
+ 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,KC_RALT,LOWER, KC_SPC, KC_SPC, RAISE, SHRAISE,KC_LEFT,KC_DOWN,KC_RGHT
+ KC_LCTL,KC_LGUI,KC_LALT,KC_RALT,LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT,KC_DOWN,KC_UP, KC_RGHT
// └───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘
),
[_LOWER] = 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_F11, KC_F12, KC_INS, KC_HOME,KC_PGUP,_______,_______,_______,_______,_______,_______,
+ _______,KC_MINS,KC_EQL, KC_LBRC,KC_RBRC,KC_BSLS,KC_VOLU,KC_PSCR,KC_SLCK,KC_PAUS,_______,_______,
// ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
- _______,_______,_______,KC_DEL, KC_END, KC_PGDN,_______,_______,_______,KC_BTN1,KC_MS_U,KC_BTN2,
+ _______,KC_UNDS,KC_PLUS,KC_LCBR,KC_RCBR,KC_PIPE,KC_VOLD,KC_MUTE,_______,_______,_______,_______,
// ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
- _______,_______,_______,_______,_______,_______,_______,_______,_______,KC_MS_L,KC_MS_D,KC_MS_R
+ _______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______,_______
// └───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘
),
[_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_TILD,KC_EXLM,KC_AT, KC_HASH,KC_DLR, KC_PERC,KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,KC_DEL,
// ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
- KC_CAPS,_______,_______,_______,_______,_______,KC_LBRC,KC_RBRC,KC_BSLS,KC_QUOT,_______,_______,
+ KC_CAPS,KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS,KC_EQL, KC_LBRC,KC_RBRC,KC_BSLS,
// ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
- _______,_______,_______,_______,_______,_______,KC_MINS,KC_EQL, _______,_______,KC_VOLU,_______,
+ _______,KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_UNDS,KC_PLUS,KC_LCBR,KC_RCBR,KC_PIPE,
// ├───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┼───────┤
- _______,_______,_______,_______,_______,_______,_______,_______,_______,KC_BSPC,KC_VOLD,KC_MUTE
+ _______,_______,_______,_______,TGLOWER,_______,_______,_______,KC_HOME,KC_PGDN,KC_PGUP,KC_END
// └───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┴───────┘
),
};
-uint32_t layer_state_set_user(uint32_t state) {
+layer_state_t layer_state_set_user(layer_state_t state) {
#ifdef JOTANCK_LEDS
- writePin(JOTANCK_LED2, (get_highest_layer(state) == _RAISE));
+ writePin(JOTANCK_LED1, (get_highest_layer(state) == _LOWER));
#endif
return state;
}
@@ -70,7 +70,7 @@ bool led_update_user(led_t led_state) {
#ifdef JOTANCK_LEDS
// CapsLock led
- writePin(JOTANCK_LED1, led_state.caps_lock);
+ writePin(JOTANCK_LED2, 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 365b8ad4ef..619de0d782 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 f6c148596d..747646d9ee 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 de270b4697..727ea00806 100644
--- a/layouts/community/ortho_4x12/xyverz/keymap.c
+++ b/layouts/community/ortho_4x12/xyverz/keymap.c
@@ -2,13 +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] = {
diff --git a/lib/printf b/lib/printf
new file mode 160000
+Subproject d3b984684bb8a8bdc48cc7a1abecb93ce59bbe3
diff --git a/lib/python/kle2xy.py b/lib/python/kle2xy.py
index 003476f92e..608d1b9809 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,10 +90,8 @@ 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
@@ -113,16 +100,11 @@ class KLE2xy(list):
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/qmk/c_parse.py b/lib/python/qmk/c_parse.py
new file mode 100644
index 0000000000..e41e271a43
--- /dev/null
+++ b/lib/python/qmk/c_parse.py
@@ -0,0 +1,161 @@
+"""Functions for working with config.h files.
+"""
+from pathlib import Path
+
+from milc import cli
+
+from qmk.comment_remover import comment_remover
+
+default_key_entry = {'x': -1, 'y': 0, 'w': 1}
+
+
+def c_source_files(dir_names):
+ """Returns a list of all *.c, *.h, and *.cpp files for a given list of directories
+
+ Args:
+
+ dir_names
+ List of directories relative to `qmk_firmware`.
+ """
+ files = []
+ for dir in dir_names:
+ files.extend(file for file in Path(dir).glob('**/*') if file.suffix in ['.c', '.h', '.cpp'])
+ return files
+
+
+def find_layouts(file):
+ """Returns list of parsed LAYOUT preprocessor macros found in the supplied include file.
+ """
+ file = Path(file)
+ aliases = {} # Populated with all `#define`s that aren't functions
+ parsed_layouts = {}
+
+ # Search the file for LAYOUT macros and aliases
+ file_contents = file.read_text()
+ file_contents = comment_remover(file_contents)
+ file_contents = file_contents.replace('\\\n', '')
+
+ for line in file_contents.split('\n'):
+ if line.startswith('#define') and '(' in line and 'LAYOUT' in line:
+ # We've found a LAYOUT macro
+ macro_name, layout, matrix = _parse_layout_macro(line.strip())
+
+ # Reject bad macro names
+ if macro_name.startswith('LAYOUT_kc') or not macro_name.startswith('LAYOUT'):
+ continue
+
+ # Parse the matrix data
+ matrix_locations = _parse_matrix_locations(matrix, file, macro_name)
+
+ # Parse the layout entries into a basic structure
+ default_key_entry['x'] = -1 # Set to -1 so _default_key(key) will increment it to 0
+ layout = layout.strip()
+ parsed_layout = [_default_key(key) for key in layout.split(',')]
+
+ for key in parsed_layout:
+ key['matrix'] = matrix_locations.get(key['label'])
+
+ parsed_layouts[macro_name] = {
+ 'key_count': len(parsed_layout),
+ 'layout': parsed_layout,
+ 'filename': str(file),
+ }
+
+ elif '#define' in line:
+ # Attempt to extract a new layout alias
+ try:
+ _, pp_macro_name, pp_macro_text = line.strip().split(' ', 2)
+ aliases[pp_macro_name] = pp_macro_text
+ except ValueError:
+ continue
+
+ # Populate our aliases
+ for alias, text in aliases.items():
+ if text in parsed_layouts and 'KEYMAP' not in alias:
+ parsed_layouts[alias] = parsed_layouts[text]
+
+ return parsed_layouts
+
+
+def parse_config_h_file(config_h_file, config_h=None):
+ """Extract defines from a config.h file.
+ """
+ if not config_h:
+ config_h = {}
+
+ config_h_file = Path(config_h_file)
+
+ if config_h_file.exists():
+ config_h_text = config_h_file.read_text()
+ config_h_text = config_h_text.replace('\\\n', '')
+
+ for linenum, line in enumerate(config_h_text.split('\n')):
+ line = line.strip()
+
+ if '//' in line:
+ line = line[:line.index('//')].strip()
+
+ if not line:
+ continue
+
+ line = line.split()
+
+ if line[0] == '#define':
+ if len(line) == 1:
+ cli.log.error('%s: Incomplete #define! On or around line %s' % (config_h_file, linenum))
+ elif len(line) == 2:
+ config_h[line[1]] = True
+ else:
+ config_h[line[1]] = ' '.join(line[2:])
+
+ elif line[0] == '#undef':
+ if len(line) == 2:
+ if line[1] in config_h:
+ if config_h[line[1]] is True:
+ del config_h[line[1]]
+ else:
+ config_h[line[1]] = False
+ else:
+ cli.log.error('%s: Incomplete #undef! On or around line %s' % (config_h_file, linenum))
+
+ return config_h
+
+
+def _default_key(label=None):
+ """Increment x and return a copy of the default_key_entry.
+ """
+ default_key_entry['x'] += 1
+ new_key = default_key_entry.copy()
+
+ if label:
+ new_key['label'] = label
+
+ return new_key
+
+
+def _parse_layout_macro(layout_macro):
+ """Split the LAYOUT macro into its constituent parts
+ """
+ layout_macro = layout_macro.replace('\\', '').replace(' ', '').replace('\t', '').replace('#define', '')
+ macro_name, layout = layout_macro.split('(', 1)
+ layout, matrix = layout.split(')', 1)
+
+ return macro_name, layout, matrix
+
+
+def _parse_matrix_locations(matrix, file, macro_name):
+ """Parse raw matrix data into a dictionary keyed by the LAYOUT identifier.
+ """
+ matrix_locations = {}
+
+ for row_num, row in enumerate(matrix.split('},{')):
+ if row.startswith('LAYOUT'):
+ cli.log.error('%s: %s: Nested layout macro detected. Matrix data not available!', file, macro_name)
+ break
+
+ row = row.replace('{', '').replace('}', '')
+ for col_num, identifier in enumerate(row.split(',')):
+ if identifier != 'KC_NO':
+ matrix_locations[identifier] = (row_num, col_num)
+
+ return matrix_locations
diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py
index 394a1353bc..47f60c601b 100644
--- a/lib/python/qmk/cli/__init__.py
+++ b/lib/python/qmk/cli/__init__.py
@@ -13,6 +13,7 @@ from . import docs
from . import doctor
from . import flash
from . import hello
+from . import info
from . import json
from . import json2c
from . import list
diff --git a/lib/python/qmk/cli/cformat.py b/lib/python/qmk/cli/cformat.py
index 0cd8b6192a..600161c5c5 100644
--- a/lib/python/qmk/cli/cformat.py
+++ b/lib/python/qmk/cli/cformat.py
@@ -4,7 +4,9 @@ import subprocess
from shutil import which
from milc import cli
-import qmk.path
+
+from qmk.path import normpath
+from qmk.c_parse import c_source_files
def cformat_run(files, all_files):
@@ -45,10 +47,10 @@ def cformat(cli):
ignores = ['tmk_core/protocol/usb_hid', 'quantum/template']
# Find the list of files to format
if cli.args.files:
- files.extend(qmk.path.normpath(file) for file in cli.args.files)
+ files.extend(normpath(file) for file in cli.args.files)
# If -a is specified
elif cli.args.all_files:
- all_files = qmk.path.c_source_files(core_dirs)
+ all_files = c_source_files(core_dirs)
# The following statement checks each file to see if the file path is in the ignored directories.
files.extend(file for file in all_files if not any(i in str(file) for i in ignores))
# No files specified & no -a flag
@@ -56,7 +58,7 @@ def cformat(cli):
base_args = ['git', 'diff', '--name-only', cli.args.base_branch]
out = subprocess.run(base_args + core_dirs, check=True, stdout=subprocess.PIPE)
changed_files = filter(None, out.stdout.decode('UTF-8').split('\n'))
- filtered_files = [qmk.path.normpath(file) for file in changed_files if not any(i in file for i in ignores)]
+ filtered_files = [normpath(file) for file in changed_files if not any(i in file for i in ignores)]
files.extend(file for file in filtered_files if file.exists() and file.suffix in ['.c', '.h', '.cpp'])
# Run clang-format on the files we've found
diff --git a/lib/python/qmk/cli/compile.py b/lib/python/qmk/cli/compile.py
index 6480d624b0..341f365f8c 100755
--- a/lib/python/qmk/cli/compile.py
+++ b/lib/python/qmk/cli/compile.py
@@ -7,7 +7,6 @@ from argparse import FileType
from milc import cli
-import qmk.path
from qmk.decorators import automagic_keyboard, automagic_keymap
from qmk.commands import compile_configurator_json, create_make_command, parse_configurator_json
@@ -32,11 +31,8 @@ def compile(cli):
# If a configurator JSON was provided generate a keymap and compile it
# FIXME(skullydazed): add code to check and warn if the keymap already exists when compiling a json keymap.
user_keymap = parse_configurator_json(cli.args.filename)
- keymap_path = qmk.path.keymap(user_keymap['keyboard'])
command = compile_configurator_json(user_keymap)
- cli.log.info('Wrote keymap to {fg_cyan}%s/%s/keymap.c', keymap_path, user_keymap['keymap'])
-
else:
if cli.config.compile.keyboard and cli.config.compile.keymap:
# Generate the make command for a specific keyboard/keymap.
diff --git a/lib/python/qmk/cli/doctor.py b/lib/python/qmk/cli/doctor.py
index 3c46248372..011c3dd3c2 100755
--- a/lib/python/qmk/cli/doctor.py
+++ b/lib/python/qmk/cli/doctor.py
@@ -24,12 +24,26 @@ ESSENTIAL_BINARIES = {
},
'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:
@@ -109,14 +123,11 @@ def check_submodules():
for submodule in submodules.status().values():
if submodule['status'] is None:
- if submodule['name'] in ESSENTIAL_SUBMODULES:
- cli.log.error('Submodule %s has not yet been cloned!', submodule['name'])
- ok = False
- else:
- cli.log.warn('Submodule %s is not available.', submodule['name'])
+ cli.log.error('Submodule %s has not yet been cloned!', submodule['name'])
+ ok = False
elif not submodule['status']:
- if submodule['name'] in ESSENTIAL_SUBMODULES:
- cli.log.warn('Submodule %s is not up to date!')
+ cli.log.error('Submodule %s is not up to date!', submodule['name'])
+ ok = False
return ok
@@ -128,10 +139,24 @@ 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():
@@ -147,12 +172,15 @@ def check_udev_rules():
# 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)
diff --git a/lib/python/qmk/cli/info.py b/lib/python/qmk/cli/info.py
new file mode 100755
index 0000000000..5e4b391411
--- /dev/null
+++ b/lib/python/qmk/cli/info.py
@@ -0,0 +1,158 @@
+"""Keyboard information script.
+
+Compile an info.json for a particular keyboard and pretty-print it.
+"""
+import json
+
+from milc import cli
+
+from qmk.decorators import automagic_keyboard, automagic_keymap
+from qmk.keyboard import render_layouts, render_layout
+from qmk.keymap import locate_keymap
+from qmk.info import info_json
+from qmk.path import is_keyboard
+
+ROW_LETTERS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop'
+COL_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijilmnopqrstuvwxyz'
+
+
+def show_keymap(info_json, title_caps=True):
+ """Render the keymap in ascii art.
+ """
+ keymap_path = locate_keymap(cli.config.info.keyboard, cli.config.info.keymap)
+
+ if keymap_path and keymap_path.suffix == '.json':
+ if title_caps:
+ cli.echo('{fg_blue}Keymap "%s"{fg_reset}:', cli.config.info.keymap)
+ else:
+ cli.echo('{fg_blue}keymap_%s{fg_reset}:', cli.config.info.keymap)
+
+ keymap_data = json.load(keymap_path.open())
+ layout_name = keymap_data['layout']
+
+ for layer_num, layer in enumerate(keymap_data['layers']):
+ if title_caps:
+ cli.echo('{fg_cyan}Layer %s{fg_reset}:', layer_num)
+ else:
+ cli.echo('{fg_cyan}layer_%s{fg_reset}:', layer_num)
+
+ print(render_layout(info_json['layouts'][layout_name]['layout'], layer))
+
+
+def show_layouts(kb_info_json, title_caps=True):
+ """Render the layouts with info.json labels.
+ """
+ for layout_name, layout_art in render_layouts(kb_info_json).items():
+ title = layout_name.title() if title_caps else layout_name
+ cli.echo('{fg_cyan}%s{fg_reset}:', title)
+ print(layout_art) # Avoid passing dirty data to cli.echo()
+
+
+def show_matrix(info_json, title_caps=True):
+ """Render the layout with matrix labels in ascii art.
+ """
+ for layout_name, layout in info_json['layouts'].items():
+ # Build our label list
+ labels = []
+ for key in layout['layout']:
+ if key['matrix']:
+ row = ROW_LETTERS[key['matrix'][0]]
+ col = COL_LETTERS[key['matrix'][1]]
+
+ labels.append(row + col)
+ else:
+ labels.append('')
+
+ # Print the header
+ if title_caps:
+ cli.echo('{fg_blue}Matrix for "%s"{fg_reset}:', layout_name)
+ else:
+ cli.echo('{fg_blue}matrix_%s{fg_reset}:', layout_name)
+
+ print(render_layout(info_json['layouts'][layout_name]['layout'], labels))
+
+
+def print_friendly_output(info_json):
+ """Print the info.json in a friendly text format.
+ """
+ cli.echo('{fg_blue}Keyboard Name{fg_reset}: %s', info_json.get('keyboard_name', 'Unknown'))
+ cli.echo('{fg_blue}Manufacturer{fg_reset}: %s', info_json.get('manufacturer', 'Unknown'))
+ if 'url' in info_json:
+ cli.echo('{fg_blue}Website{fg_reset}: %s', info_json.get('url', ''))
+ if info_json.get('maintainer', 'qmk') == 'qmk':
+ cli.echo('{fg_blue}Maintainer{fg_reset}: QMK Community')
+ else:
+ cli.echo('{fg_blue}Maintainer{fg_reset}: %s', info_json['maintainer'])
+ cli.echo('{fg_blue}Keyboard Folder{fg_reset}: %s', info_json.get('keyboard_folder', 'Unknown'))
+ cli.echo('{fg_blue}Layouts{fg_reset}: %s', ', '.join(sorted(info_json['layouts'].keys())))
+ if 'width' in info_json and 'height' in info_json:
+ cli.echo('{fg_blue}Size{fg_reset}: %s x %s' % (info_json['width'], info_json['height']))
+ cli.echo('{fg_blue}Processor{fg_reset}: %s', info_json.get('processor', 'Unknown'))
+ cli.echo('{fg_blue}Bootloader{fg_reset}: %s', info_json.get('bootloader', 'Unknown'))
+
+ if cli.config.info.layouts:
+ show_layouts(info_json, True)
+
+ if cli.config.info.matrix:
+ show_matrix(info_json, True)
+
+ if cli.config_source.info.keymap and cli.config_source.info.keymap != 'config_file':
+ show_keymap(info_json, True)
+
+
+def print_text_output(info_json):
+ """Print the info.json in a plain text format.
+ """
+ for key in sorted(info_json):
+ if key == 'layouts':
+ cli.echo('{fg_blue}layouts{fg_reset}: %s', ', '.join(sorted(info_json['layouts'].keys())))
+ else:
+ cli.echo('{fg_blue}%s{fg_reset}: %s', key, info_json[key])
+
+ if cli.config.info.layouts:
+ show_layouts(info_json, False)
+
+ if cli.config.info.matrix:
+ show_matrix(info_json, False)
+
+ if cli.config_source.info.keymap and cli.config_source.info.keymap != 'config_file':
+ show_keymap(info_json, False)
+
+
+@cli.argument('-kb', '--keyboard', help='Keyboard to show info for.')
+@cli.argument('-km', '--keymap', help='Show the layers for a JSON keymap too.')
+@cli.argument('-l', '--layouts', action='store_true', help='Render the layouts.')
+@cli.argument('-m', '--matrix', action='store_true', help='Render the layouts with matrix information.')
+@cli.argument('-f', '--format', default='friendly', arg_only=True, help='Format to display the data in (friendly, text, json) (Default: friendly).')
+@cli.subcommand('Keyboard information.')
+@automagic_keyboard
+@automagic_keymap
+def info(cli):
+ """Compile an info.json for a particular keyboard and pretty-print it.
+ """
+ # Determine our keyboard(s)
+ if not cli.config.info.keyboard:
+ cli.log.error('Missing paramater: --keyboard')
+ cli.subcommands['info'].print_help()
+ exit(1)
+
+ if not is_keyboard(cli.config.info.keyboard):
+ cli.log.error('Invalid keyboard: "%s"', cli.config.info.keyboard)
+ exit(1)
+
+ # Build the info.json file
+ kb_info_json = info_json(cli.config.info.keyboard)
+
+ # Output in the requested format
+ if cli.args.format == 'json':
+ print(json.dumps(kb_info_json))
+ exit()
+
+ if cli.args.format == 'text':
+ print_text_output(kb_info_json)
+
+ elif cli.args.format == 'friendly':
+ print_friendly_output(kb_info_json)
+
+ else:
+ cli.log.error('Unknown format: %s', cli.args.format)
diff --git a/lib/python/qmk/cli/json2c.py b/lib/python/qmk/cli/json2c.py
index 5218405070..af0d80a9ac 100755
--- a/lib/python/qmk/cli/json2c.py
+++ b/lib/python/qmk/cli/json2c.py
@@ -18,19 +18,19 @@ def json2c(cli):
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.
"""
# Error checking
- if not cli.args.filename.exists():
- cli.log.error('JSON file does not exist!')
+ if cli.args.filename and 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)
- if cli.args.filename.name == '-':
- # TODO(skullydazed/anyone): Read file contents from STDIN
- cli.log.error('Reading from STDIN is not (yet) supported.')
+ if not cli.args.filename.exists():
+ cli.log.error('JSON file does not exist!')
cli.print_usage()
exit(1)
# Environment processing
- if cli.args.output.name == ('-'):
+ if cli.args.output and cli.args.output.name == '-':
cli.args.output = None
# Parse the configurator json
diff --git a/lib/python/qmk/cli/list/keymaps.py b/lib/python/qmk/cli/list/keymaps.py
index cec9ca0224..b18289eb35 100644
--- a/lib/python/qmk/cli/list/keymaps.py
+++ b/lib/python/qmk/cli/list/keymaps.py
@@ -4,7 +4,7 @@ from milc import cli
import qmk.keymap
from qmk.decorators import automagic_keyboard
-from qmk.errors import NoSuchKeyboardError
+from qmk.path import is_keyboard
@cli.argument("-kb", "--keyboard", help="Specify keyboard name. Example: 1upkeyboards/1up60hse")
@@ -13,13 +13,9 @@ from qmk.errors import NoSuchKeyboardError
def list_keymaps(cli):
"""List the keymaps for a specific keyboard
"""
- try:
- for name in qmk.keymap.list_keymaps(cli.config.list_keymaps.keyboard):
- # We echo instead of cli.log.info to allow easier piping of this output
- cli.echo('%s', name)
- except NoSuchKeyboardError as e:
- cli.echo("{fg_red}%s: %s", cli.config.list_keymaps.keyboard, e.message)
- except (FileNotFoundError, PermissionError) as e:
- cli.echo("{fg_red}%s: %s", cli.config.list_keymaps.keyboard, e)
- except TypeError:
- cli.echo("{fg_red}Something went wrong. Did you specify a keyboard?")
+ if not is_keyboard(cli.config.list_keymaps.keyboard):
+ cli.log.error('Keyboard %s does not exist!', cli.config.list_keymaps.keyboard)
+ exit(1)
+
+ for name in qmk.keymap.list_keymaps(cli.config.list_keymaps.keyboard):
+ print(name)
diff --git a/lib/python/qmk/commands.py b/lib/python/qmk/commands.py
index 5d2a03c9a8..5a6e60988a 100644
--- a/lib/python/qmk/commands.py
+++ b/lib/python/qmk/commands.py
@@ -64,6 +64,7 @@ def compile_configurator_json(user_keymap, bootloader=None):
def parse_configurator_json(configurator_file):
"""Open and parse a configurator json export
"""
+ # FIXME(skullydazed/anyone): Add validation here
user_keymap = json.load(configurator_file)
return user_keymap
diff --git a/lib/python/qmk/comment_remover.py b/lib/python/qmk/comment_remover.py
new file mode 100644
index 0000000000..45a25257f8
--- /dev/null
+++ b/lib/python/qmk/comment_remover.py
@@ -0,0 +1,20 @@
+"""Removes C/C++ style comments from text.
+
+Gratefully adapted from https://stackoverflow.com/a/241506
+"""
+import re
+
+comment_pattern = re.compile(r'//.*?$|/\*.*?\*/|\'(?:\\.|[^\\\'])*\'|"(?:\\.|[^\\"])*"', re.DOTALL | re.MULTILINE)
+
+
+def _comment_stripper(match):
+ """Removes C/C++ style comments from a regex match.
+ """
+ s = match.group(0)
+ return ' ' if s.startswith('/') else s
+
+
+def comment_remover(text):
+ """Remove C/C++ style comments from text.
+ """
+ return re.sub(comment_pattern, _comment_stripper, text)
diff --git a/lib/python/qmk/constants.py b/lib/python/qmk/constants.py
index 3e4709969d..f0d56c4430 100644
--- a/lib/python/qmk/constants.py
+++ b/lib/python/qmk/constants.py
@@ -7,3 +7,9 @@ QMK_FIRMWARE = Path.cwd()
# This is the number of directories under `qmk_firmware/keyboards` that will be traversed. This is currently a limitation of our make system.
MAX_KEYBOARD_SUBFOLDERS = 5
+
+# Supported processor types
+ARM_PROCESSORS = 'cortex-m0', 'cortex-m0plus', 'cortex-m3', 'cortex-m4', 'MKL26Z64', 'MK20DX128', 'MK20DX256', 'STM32F042', 'STM32F072', 'STM32F103', 'STM32F303'
+AVR_PROCESSORS = 'at90usb1286', 'at90usb646', 'atmega16u2', 'atmega328p', 'atmega32a', 'atmega32u2', 'atmega32u4', None
+ALL_PROCESSORS = ARM_PROCESSORS + AVR_PROCESSORS
+VUSB_PROCESSORS = 'atmega328p', 'atmega32a'
diff --git a/lib/python/qmk/decorators.py b/lib/python/qmk/decorators.py
index 94e14bf375..f8f2facb1c 100644
--- a/lib/python/qmk/decorators.py
+++ b/lib/python/qmk/decorators.py
@@ -5,7 +5,8 @@ from pathlib import Path
from milc import cli
-from qmk.path import is_keyboard, is_keymap_dir, under_qmk_firmware
+from qmk.keymap import is_keymap_dir
+from qmk.path import is_keyboard, under_qmk_firmware
def automagic_keyboard(func):
@@ -67,18 +68,18 @@ def automagic_keymap(func):
while current_path.parent.name != 'keymaps':
current_path = current_path.parent
cli.config[cli._entrypoint.__name__]['keymap'] = current_path.name
- cli.config_source[cli._entrypoint.__name__]['keyboard'] = 'keymap_directory'
+ cli.config_source[cli._entrypoint.__name__]['keymap'] = 'keymap_directory'
# If we're in `qmk_firmware/layouts` guess the name from the community keymap they're in
elif relative_cwd.parts[0] == 'layouts' and is_keymap_dir(relative_cwd):
cli.config[cli._entrypoint.__name__]['keymap'] = relative_cwd.name
- cli.config_source[cli._entrypoint.__name__]['keyboard'] = 'layouts_directory'
+ cli.config_source[cli._entrypoint.__name__]['keymap'] = 'layouts_directory'
# If we're in `qmk_firmware/users` guess the name from the userspace they're in
elif relative_cwd.parts[0] == 'users':
# Guess the keymap name based on which userspace they're in
cli.config[cli._entrypoint.__name__]['keymap'] = relative_cwd.parts[1]
- cli.config_source[cli._entrypoint.__name__]['keyboard'] = 'users_directory'
+ cli.config_source[cli._entrypoint.__name__]['keymap'] = 'users_directory'
return func(*args, **kwargs)
diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py
new file mode 100644
index 0000000000..e1ace5d51b
--- /dev/null
+++ b/lib/python/qmk/info.py
@@ -0,0 +1,249 @@
+"""Functions that help us generate and use info.json files.
+"""
+import json
+from glob import glob
+from pathlib import Path
+
+from milc import cli
+
+from qmk.constants import ARM_PROCESSORS, AVR_PROCESSORS, VUSB_PROCESSORS
+from qmk.c_parse import find_layouts
+from qmk.keyboard import config_h, rules_mk
+from qmk.math import compute
+
+
+def info_json(keyboard):
+ """Generate the info.json data for a specific keyboard.
+ """
+ info_data = {
+ 'keyboard_name': str(keyboard),
+ 'keyboard_folder': str(keyboard),
+ 'layouts': {},
+ 'maintainer': 'qmk',
+ }
+
+ for layout_name, layout_json in _find_all_layouts(keyboard).items():
+ if not layout_name.startswith('LAYOUT_kc'):
+ info_data['layouts'][layout_name] = layout_json
+
+ info_data = merge_info_jsons(keyboard, info_data)
+ info_data = _extract_config_h(info_data)
+ info_data = _extract_rules_mk(info_data)
+
+ return info_data
+
+
+def _extract_config_h(info_data):
+ """Pull some keyboard information from existing rules.mk files
+ """
+ config_c = config_h(info_data['keyboard_folder'])
+ row_pins = config_c.get('MATRIX_ROW_PINS', '').replace('{', '').replace('}', '').strip()
+ col_pins = config_c.get('MATRIX_COL_PINS', '').replace('{', '').replace('}', '').strip()
+ direct_pins = config_c.get('DIRECT_PINS', '').replace(' ', '')[1:-1]
+
+ info_data['diode_direction'] = config_c.get('DIODE_DIRECTION')
+ info_data['matrix_size'] = {
+ 'rows': compute(config_c.get('MATRIX_ROWS', '0')),
+ 'cols': compute(config_c.get('MATRIX_COLS', '0')),
+ }
+ info_data['matrix_pins'] = {}
+
+ if row_pins:
+ info_data['matrix_pins']['rows'] = row_pins.split(',')
+ if col_pins:
+ info_data['matrix_pins']['cols'] = col_pins.split(',')
+
+ if direct_pins:
+ direct_pin_array = []
+ for row in direct_pins.split('},{'):
+ if row.startswith('{'):
+ row = row[1:]
+ if row.endswith('}'):
+ row = row[:-1]
+
+ direct_pin_array.append([])
+
+ for pin in row.split(','):
+ if pin == 'NO_PIN':
+ pin = None
+
+ direct_pin_array[-1].append(pin)
+
+ info_data['matrix_pins']['direct'] = direct_pin_array
+
+ info_data['usb'] = {
+ 'vid': config_c.get('VENDOR_ID'),
+ 'pid': config_c.get('PRODUCT_ID'),
+ 'device_ver': config_c.get('DEVICE_VER'),
+ 'manufacturer': config_c.get('MANUFACTURER'),
+ 'product': config_c.get('PRODUCT'),
+ 'description': config_c.get('DESCRIPTION'),
+ }
+
+ return info_data
+
+
+def _extract_rules_mk(info_data):
+ """Pull some keyboard information from existing rules.mk files
+ """
+ rules = rules_mk(info_data['keyboard_folder'])
+ mcu = rules.get('MCU')
+
+ if mcu in ARM_PROCESSORS:
+ arm_processor_rules(info_data, rules)
+ elif mcu in AVR_PROCESSORS:
+ avr_processor_rules(info_data, rules)
+ else:
+ cli.log.warning("%s: Unknown MCU: %s" % (info_data['keyboard_folder'], mcu))
+ unknown_processor_rules(info_data, rules)
+
+ return info_data
+
+
+def _find_all_layouts(keyboard):
+ """Looks for layout macros associated with this keyboard.
+ """
+ layouts = {}
+ rules = rules_mk(keyboard)
+ keyboard_path = Path(rules.get('DEFAULT_FOLDER', keyboard))
+
+ # Pull in all layouts defined in the standard files
+ current_path = Path('keyboards/')
+ for directory in keyboard_path.parts:
+ current_path = current_path / directory
+ keyboard_h = '%s.h' % (directory,)
+ keyboard_h_path = current_path / keyboard_h
+ if keyboard_h_path.exists():
+ layouts.update(find_layouts(keyboard_h_path))
+
+ if not layouts:
+ # If we didn't find any layouts above we widen our search. This is error
+ # prone which is why we want to encourage people to follow the standard above.
+ cli.log.warning('%s: Falling back to searching for KEYMAP/LAYOUT macros.' % (keyboard))
+ for file in glob('keyboards/%s/*.h' % keyboard):
+ if file.endswith('.h'):
+ these_layouts = find_layouts(file)
+ if these_layouts:
+ layouts.update(these_layouts)
+
+ if 'LAYOUTS' in rules:
+ # Match these up against the supplied layouts
+ supported_layouts = rules['LAYOUTS'].strip().split()
+ for layout_name in sorted(layouts):
+ if not layout_name.startswith('LAYOUT_'):
+ continue
+ layout_name = layout_name[7:]
+ if layout_name in supported_layouts:
+ supported_layouts.remove(layout_name)
+
+ if supported_layouts:
+ cli.log.error('%s: Missing LAYOUT() macro for %s' % (keyboard, ', '.join(supported_layouts)))
+
+ return layouts
+
+
+def arm_processor_rules(info_data, rules):
+ """Setup the default info for an ARM board.
+ """
+ info_data['processor_type'] = 'arm'
+ info_data['bootloader'] = rules['BOOTLOADER'] if 'BOOTLOADER' in rules else 'unknown'
+ info_data['processor'] = rules['MCU'] if 'MCU' in rules else 'unknown'
+ info_data['protocol'] = 'ChibiOS'
+
+ if info_data['bootloader'] == 'unknown':
+ if 'STM32' in info_data['processor']:
+ info_data['bootloader'] = 'stm32-dfu'
+ elif info_data.get('manufacturer') == 'Input Club':
+ info_data['bootloader'] = 'kiibohd-dfu'
+
+ if 'STM32' in info_data['processor']:
+ info_data['platform'] = 'STM32'
+ elif 'MCU_SERIES' in rules:
+ info_data['platform'] = rules['MCU_SERIES']
+ elif 'ARM_ATSAM' in rules:
+ info_data['platform'] = 'ARM_ATSAM'
+
+ return info_data
+
+
+def avr_processor_rules(info_data, rules):
+ """Setup the default info for an AVR board.
+ """
+ info_data['processor_type'] = 'avr'
+ info_data['bootloader'] = rules['BOOTLOADER'] if 'BOOTLOADER' in rules else 'atmel-dfu'
+ info_data['platform'] = rules['ARCH'] if 'ARCH' in rules else 'unknown'
+ info_data['processor'] = rules['MCU'] if 'MCU' in rules else 'unknown'
+ info_data['protocol'] = 'V-USB' if rules.get('MCU') in VUSB_PROCESSORS else 'LUFA'
+
+ # FIXME(fauxpark/anyone): Eventually we should detect the protocol by looking at PROTOCOL inherited from mcu_selection.mk:
+ # info_data['protocol'] = 'V-USB' if rules.get('PROTOCOL') == 'VUSB' else 'LUFA'
+
+ return info_data
+
+
+def unknown_processor_rules(info_data, rules):
+ """Setup the default keyboard info for unknown boards.
+ """
+ info_data['bootloader'] = 'unknown'
+ info_data['platform'] = 'unknown'
+ info_data['processor'] = 'unknown'
+ info_data['processor_type'] = 'unknown'
+ info_data['protocol'] = 'unknown'
+
+ return info_data
+
+
+def merge_info_jsons(keyboard, info_data):
+ """Return a merged copy of all the info.json files for a keyboard.
+ """
+ for info_file in find_info_json(keyboard):
+ # Load and validate the JSON data
+ with info_file.open('r') as info_fd:
+ new_info_data = json.load(info_fd)
+
+ if not isinstance(new_info_data, dict):
+ cli.log.error("Invalid file %s, root object should be a dictionary.", str(info_file))
+ continue
+
+ # Copy whitelisted keys into `info_data`
+ for key in ('keyboard_name', 'manufacturer', 'identifier', 'url', 'maintainer', 'processor', 'bootloader', 'width', 'height'):
+ if key in new_info_data:
+ info_data[key] = new_info_data[key]
+
+ # Merge the layouts in
+ if 'layouts' in new_info_data:
+ for layout_name, json_layout in new_info_data['layouts'].items():
+ # Only pull in layouts we have a macro for
+ if layout_name in info_data['layouts']:
+ if info_data['layouts'][layout_name]['key_count'] != len(json_layout['layout']):
+ cli.log.error('%s: %s: Number of elements in info.json does not match! info.json:%s != %s:%s', info_data['keyboard_folder'], layout_name, len(json_layout['layout']), layout_name, len(info_data['layouts'][layout_name]['layout']))
+ else:
+ for i, key in enumerate(info_data['layouts'][layout_name]['layout']):
+ key.update(json_layout['layout'][i])
+
+ return info_data
+
+
+def find_info_json(keyboard):
+ """Finds all the info.json files associated with a keyboard.
+ """
+ # Find the most specific first
+ base_path = Path('keyboards')
+ keyboard_path = base_path / keyboard
+ keyboard_parent = keyboard_path.parent
+ info_jsons = [keyboard_path / 'info.json']
+
+ # Add DEFAULT_FOLDER before parents, if present
+ rules = rules_mk(keyboard)
+ if 'DEFAULT_FOLDER' in rules:
+ info_jsons.append(Path(rules['DEFAULT_FOLDER']) / 'info.json')
+
+ # Add in parent folders for least specific
+ for _ in range(5):
+ info_jsons.append(keyboard_parent / 'info.json')
+ if keyboard_parent.parent == base_path:
+ break
+ keyboard_parent = keyboard_parent.parent
+
+ # Return a list of the info.json files that actually exist
+ return [info_json for info_json in info_jsons if info_json.exists()]
diff --git a/lib/python/qmk/keyboard.py b/lib/python/qmk/keyboard.py
new file mode 100644
index 0000000000..d1f2a301df
--- /dev/null
+++ b/lib/python/qmk/keyboard.py
@@ -0,0 +1,111 @@
+"""Functions that help us work with keyboards.
+"""
+from array import array
+from math import ceil
+from pathlib import Path
+
+from qmk.c_parse import parse_config_h_file
+from qmk.makefile import parse_rules_mk_file
+
+
+def config_h(keyboard):
+ """Parses all the config.h files for a keyboard.
+
+ Args:
+ keyboard: name of the keyboard
+
+ Returns:
+ a dictionary representing the content of the entire config.h tree for a keyboard
+ """
+ config = {}
+ cur_dir = Path('keyboards')
+ rules = rules_mk(keyboard)
+ keyboard = Path(rules['DEFAULT_FOLDER'] if 'DEFAULT_FOLDER' in rules else keyboard)
+
+ for dir in keyboard.parts:
+ cur_dir = cur_dir / dir
+ config = {**config, **parse_config_h_file(cur_dir / 'config.h')}
+
+ return config
+
+
+def rules_mk(keyboard):
+ """Get a rules.mk for a keyboard
+
+ Args:
+ keyboard: name of the keyboard
+
+ Returns:
+ a dictionary representing the content of the entire rules.mk tree for a keyboard
+ """
+ keyboard = Path(keyboard)
+ cur_dir = Path('keyboards')
+ rules = parse_rules_mk_file(cur_dir / keyboard / 'rules.mk')
+
+ if 'DEFAULT_FOLDER' in rules:
+ keyboard = Path(rules['DEFAULT_FOLDER'])
+
+ for i, dir in enumerate(keyboard.parts):
+ cur_dir = cur_dir / dir
+ rules = parse_rules_mk_file(cur_dir / 'rules.mk', rules)
+
+ return rules
+
+
+def render_layout(layout_data, key_labels=None):
+ """Renders a single layout.
+ """
+ textpad = [array('u', ' ' * 200) for x in range(50)]
+
+ for key in layout_data:
+ x = ceil(key.get('x', 0) * 4)
+ y = ceil(key.get('y', 0) * 3)
+ w = ceil(key.get('w', 1) * 4)
+ h = ceil(key.get('h', 1) * 3)
+
+ if key_labels:
+ label = key_labels.pop(0)
+ if label.startswith('KC_'):
+ label = label[3:]
+ else:
+ label = key.get('label', '')
+
+ label_len = w - 2
+ label_leftover = label_len - len(label)
+
+ if len(label) > label_len:
+ label = label[:label_len]
+
+ label_blank = ' ' * label_len
+ label_border = '─' * label_len
+ label_middle = label + ' '*label_leftover # noqa: yapf insists there be no whitespace around *
+
+ top_line = array('u', '┌' + label_border + 'â”')
+ lab_line = array('u', '│' + label_middle + '│')
+ mid_line = array('u', '│' + label_blank + '│')
+ bot_line = array('u', '└' + label_border + "┘")
+
+ textpad[y][x:x + w] = top_line
+ textpad[y + 1][x:x + w] = lab_line
+ for i in range(h - 3):
+ textpad[y + i + 2][x:x + w] = mid_line
+ textpad[y + h - 1][x:x + w] = bot_line
+
+ lines = []
+ for line in textpad:
+ if line.tounicode().strip():
+ lines.append(line.tounicode().rstrip())
+
+ return '\n'.join(lines)
+
+
+def render_layouts(info_json):
+ """Renders all the layouts from an `info_json` structure.
+ """
+ layouts = {}
+
+ for layout in info_json['layouts']:
+ layout_data = info_json['layouts'][layout]['layout']
+ layouts[layout] = render_layout(layout_data)
+
+ return layouts
diff --git a/lib/python/qmk/keymap.py b/lib/python/qmk/keymap.py
index 69cdc8d5b5..78510a8a78 100644
--- a/lib/python/qmk/keymap.py
+++ b/lib/python/qmk/keymap.py
@@ -2,8 +2,10 @@
"""
from pathlib import Path
+from milc import cli
+
+from qmk.keyboard import rules_mk
import qmk.path
-import qmk.makefile
# The `keymap.c` template to use when a keyboard doesn't have its own
DEFAULT_KEYMAP_C = """#include QMK_KEYBOARD_H
@@ -47,6 +49,14 @@ def _strip_any(keycode):
return keycode
+def is_keymap_dir(keymap):
+ """Return True if Path object `keymap` has a keymap file inside.
+ """
+ for file in ('keymap.c', 'keymap.json'):
+ if (keymap / file).is_file():
+ return True
+
+
def generate(keyboard, layout, layers):
"""Returns a keymap.c for the specified keyboard, layout, and layers.
@@ -100,40 +110,81 @@ def write(keyboard, keymap, layout, layers):
keymap_file.parent.mkdir(parents=True, exist_ok=True)
keymap_file.write_text(keymap_c)
+ cli.log.info('Wrote keymap to {fg_cyan}%s', keymap_file)
+
return keymap_file
-def list_keymaps(keyboard_name):
+def locate_keymap(keyboard, keymap):
+ """Returns the path to a keymap for a specific keyboard.
+ """
+ if not qmk.path.is_keyboard(keyboard):
+ raise KeyError('Invalid keyboard: ' + repr(keyboard))
+
+ # Check the keyboard folder first, last match wins
+ checked_dirs = ''
+ keymap_path = ''
+
+ for dir in keyboard.split('/'):
+ if checked_dirs:
+ checked_dirs = '/'.join((checked_dirs, dir))
+ else:
+ checked_dirs = dir
+
+ keymap_dir = Path('keyboards') / checked_dirs / 'keymaps'
+
+ if (keymap_dir / keymap / 'keymap.c').exists():
+ keymap_path = keymap_dir / keymap / 'keymap.c'
+ if (keymap_dir / keymap / 'keymap.json').exists():
+ keymap_path = keymap_dir / keymap / 'keymap.json'
+
+ if keymap_path:
+ return keymap_path
+
+ # Check community layouts as a fallback
+ rules = rules_mk(keyboard)
+
+ if "LAYOUTS" in rules:
+ for layout in rules["LAYOUTS"].split():
+ community_layout = Path('layouts/community') / layout / keymap
+ if community_layout.exists():
+ if (community_layout / 'keymap.json').exists():
+ return community_layout / 'keymap.json'
+ if (community_layout / 'keymap.c').exists():
+ return community_layout / 'keymap.c'
+
+
+def list_keymaps(keyboard):
""" List the available keymaps for a keyboard.
Args:
- keyboard_name: the keyboards full name with vendor and revision if necessary, example: clueboard/66/rev3
+ keyboard: the keyboards full name with vendor and revision if necessary, example: clueboard/66/rev3
Returns:
a set with the names of the available keymaps
"""
# parse all the rules.mk files for the keyboard
- rules_mk = qmk.makefile.get_rules_mk(keyboard_name)
+ rules = rules_mk(keyboard)
names = set()
- if rules_mk:
+ if rules:
# qmk_firmware/keyboards
- keyboards_dir = Path.cwd() / "keyboards"
+ keyboards_dir = Path('keyboards')
# path to the keyboard's directory
- kb_path = keyboards_dir / keyboard_name
+ kb_path = keyboards_dir / keyboard
# walk up the directory tree until keyboards_dir
# and collect all directories' name with keymap.c file in it
while kb_path != keyboards_dir:
keymaps_dir = kb_path / "keymaps"
if keymaps_dir.exists():
- names = names.union([keymap for keymap in keymaps_dir.iterdir() if (keymaps_dir / keymap / "keymap.c").is_file()])
+ names = names.union([keymap.name for keymap in keymaps_dir.iterdir() if is_keymap_dir(keymap)])
kb_path = kb_path.parent
# if community layouts are supported, get them
- if "LAYOUTS" in rules_mk:
- for layout in rules_mk["LAYOUTS"].split():
- cl_path = Path.cwd() / "layouts" / "community" / layout
+ if "LAYOUTS" in rules:
+ for layout in rules["LAYOUTS"].split():
+ cl_path = Path('layouts/community') / layout
if cl_path.exists():
- names = names.union([keymap for keymap in cl_path.iterdir() if (cl_path / keymap / "keymap.c").is_file()])
+ names = names.union([keymap.name for keymap in cl_path.iterdir() if is_keymap_dir(keymap)])
return sorted(names)
diff --git a/lib/python/qmk/makefile.py b/lib/python/qmk/makefile.py
index 8645056d2d..02c2e70050 100644
--- a/lib/python/qmk/makefile.py
+++ b/lib/python/qmk/makefile.py
@@ -2,8 +2,6 @@
"""
from pathlib import Path
-from qmk.errors import NoSuchKeyboardError
-
def parse_rules_mk_file(file, rules_mk=None):
"""Turn a rules.mk file into a dictionary.
@@ -51,33 +49,3 @@ def parse_rules_mk_file(file, rules_mk=None):
rules_mk[key.strip()] = value.strip()
return rules_mk
-
-
-def get_rules_mk(keyboard):
- """ Get a rules.mk for a keyboard
-
- Args:
- keyboard: name of the keyboard
-
- Raises:
- NoSuchKeyboardError: when the keyboard does not exists
-
- Returns:
- a dictionary with the content of the rules.mk file
- """
- # Start with qmk_firmware/keyboards
- kb_path = Path.cwd() / "keyboards"
- # walk down the directory tree
- # and collect all rules.mk files
- kb_dir = kb_path / keyboard
- if kb_dir.exists():
- rules_mk = dict()
- for directory in Path(keyboard).parts:
- kb_path = kb_path / directory
- rules_mk_path = kb_path / "rules.mk"
- if rules_mk_path.exists():
- rules_mk = parse_rules_mk_file(rules_mk_path, rules_mk)
- else:
- raise NoSuchKeyboardError("The requested keyboard and/or revision does not exist.")
-
- return rules_mk
diff --git a/lib/python/qmk/math.py b/lib/python/qmk/math.py
new file mode 100644
index 0000000000..88dc4a300c
--- /dev/null
+++ b/lib/python/qmk/math.py
@@ -0,0 +1,33 @@
+"""Parse arbitrary math equations in a safe way.
+
+Gratefully copied from https://stackoverflow.com/a/9558001
+"""
+import ast
+import operator as op
+
+# supported operators
+operators = {ast.Add: op.add, ast.Sub: op.sub, ast.Mult: op.mul, ast.Div: op.truediv, ast.Pow: op.pow, ast.BitXor: op.xor, ast.USub: op.neg}
+
+
+def compute(expr):
+ """Parse a mathematical expression and return the answer.
+
+ >>> compute('2^6')
+ 4
+ >>> compute('2**6')
+ 64
+ >>> compute('1 + 2*3**(4^5) / (6 + -7)')
+ -5.0
+ """
+ return _eval(ast.parse(expr, mode='eval').body)
+
+
+def _eval(node):
+ if isinstance(node, ast.Num): # <number>
+ return node.n
+ elif isinstance(node, ast.BinOp): # <left> <operator> <right>
+ return operators[type(node.op)](_eval(node.left), _eval(node.right))
+ elif isinstance(node, ast.UnaryOp): # <operator> <operand> e.g., -1
+ return operators[type(node.op)](_eval(node.operand))
+ else:
+ raise TypeError(node)
diff --git a/lib/python/qmk/path.py b/lib/python/qmk/path.py
index 7306c433b8..591fad034b 100644
--- a/lib/python/qmk/path.py
+++ b/lib/python/qmk/path.py
@@ -4,26 +4,17 @@ import logging
import os
from pathlib import Path
-from qmk.constants import QMK_FIRMWARE, MAX_KEYBOARD_SUBFOLDERS
+from qmk.constants import MAX_KEYBOARD_SUBFOLDERS, QMK_FIRMWARE
from qmk.errors import NoSuchKeyboardError
-def is_keymap_dir(keymap_path):
- """Returns True if `keymap_path` is a valid keymap directory.
- """
- keymap_path = Path(keymap_path)
- keymap_c = keymap_path / 'keymap.c'
- keymap_json = keymap_path / 'keymap.json'
-
- return any((keymap_c.exists(), keymap_json.exists()))
-
-
def is_keyboard(keyboard_name):
"""Returns True if `keyboard_name` is a keyboard we can compile.
"""
- keyboard_path = QMK_FIRMWARE / 'keyboards' / keyboard_name
- rules_mk = keyboard_path / 'rules.mk'
- return rules_mk.exists()
+ if keyboard_name:
+ keyboard_path = QMK_FIRMWARE / 'keyboards' / keyboard_name
+ rules_mk = keyboard_path / 'rules.mk'
+ return rules_mk.exists()
def under_qmk_firmware():
@@ -68,17 +59,3 @@ def normpath(path):
return path
return Path(os.environ['ORIG_CWD']) / path
-
-
-def c_source_files(dir_names):
- """Returns a list of all *.c, *.h, and *.cpp files for a given list of directories
-
- Args:
-
- dir_names
- List of directories, relative pathing starts at qmk's cwd
- """
- files = []
- for dir in dir_names:
- files.extend(file for file in Path(dir).glob('**/*') if file.suffix in ['.c', '.h', '.cpp'])
- return files
diff --git a/lib/python/qmk/tests/test_cli_commands.py b/lib/python/qmk/tests/test_cli_commands.py
index 3b4e66a211..dce270de83 100644
--- a/lib/python/qmk/tests/test_cli_commands.py
+++ b/lib/python/qmk/tests/test_cli_commands.py
@@ -4,67 +4,151 @@ from qmk.commands import run
def check_subcommand(command, *args):
cmd = ['bin/qmk', command] + list(args)
- return run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
+ result = run(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
+ return result
+
+
+def check_returncode(result, expected=0):
+ """Print stdout if `result.returncode` does not match `expected`.
+ """
+ if result.returncode != expected:
+ print('`%s` stdout:' % ' '.join(result.args))
+ print(result.stdout)
+ print('returncode:', result.returncode)
+ assert result.returncode == expected
def test_cformat():
result = check_subcommand('cformat', 'quantum/matrix.c')
- assert result.returncode == 0
+ check_returncode(result)
def test_compile():
- assert check_subcommand('compile', '-kb', 'handwired/onekey/pytest', '-km', 'default').returncode == 0
+ result = check_subcommand('compile', '-kb', 'handwired/onekey/pytest', '-km', 'default', '-n')
+ check_returncode(result)
def test_flash():
- assert check_subcommand('flash', '-b').returncode == 1
- assert check_subcommand('flash').returncode == 1
+ result = check_subcommand('flash', '-kb', 'handwired/onekey/pytest', '-km', 'default', '-n')
+ check_returncode(result)
+
+
+def test_flash_bootloaders():
+ result = check_subcommand('flash', '-b')
+ check_returncode(result, 1)
def test_config():
result = check_subcommand('config')
- assert result.returncode == 0
+ check_returncode(result)
assert 'general.color' in result.stdout
def test_kle2json():
- assert check_subcommand('kle2json', 'kle.txt', '-f').returncode == 0
+ result = check_subcommand('kle2json', 'kle.txt', '-f')
+ check_returncode(result)
def test_doctor():
result = check_subcommand('doctor', '-n')
- assert result.returncode == 0
- assert 'QMK Doctor is checking your environment.' in result.stderr
- assert 'QMK is ready to go' in result.stderr
+ check_returncode(result)
+ assert 'QMK Doctor is checking your environment.' in result.stdout
+ assert 'QMK is ready to go' in result.stdout
def test_hello():
result = check_subcommand('hello')
- assert result.returncode == 0
- assert 'Hello,' in result.stderr
+ check_returncode(result)
+ assert 'Hello,' in result.stdout
def test_pyformat():
result = check_subcommand('pyformat')
- assert result.returncode == 0
- assert 'Successfully formatted the python code' in result.stderr
+ check_returncode(result)
+ assert 'Successfully formatted the python code' in result.stdout
def test_list_keyboards():
result = check_subcommand('list-keyboards')
- assert result.returncode == 0
+ check_returncode(result)
# check to see if a known keyboard is returned
# this will fail if handwired/onekey/pytest is removed
assert 'handwired/onekey/pytest' in result.stdout
def test_list_keymaps():
- result = check_subcommand("list-keymaps", "-kb", "handwired/onekey/pytest")
- assert result.returncode == 0
- assert "default" and "test" in result.stdout
+ result = check_subcommand('list-keymaps', '-kb', 'handwired/onekey/pytest')
+ check_returncode(result, 0)
+ assert 'default' and 'test' in result.stdout
+
+
+def test_list_keymaps_long():
+ result = check_subcommand('list-keymaps', '--keyboard', 'handwired/onekey/pytest')
+ check_returncode(result, 0)
+ assert 'default' and 'test' in result.stdout
+
+
+def test_list_keymaps_kb_only():
+ result = check_subcommand('list-keymaps', '-kb', 'niu_mini')
+ check_returncode(result, 0)
+ assert 'default' and 'via' in result.stdout
+
+
+def test_list_keymaps_vendor_kb():
+ result = check_subcommand('list-keymaps', '-kb', 'ai03/lunar')
+ check_returncode(result, 0)
+ assert 'default' and 'via' in result.stdout
+
+
+def test_list_keymaps_vendor_kb_rev():
+ result = check_subcommand('list-keymaps', '-kb', 'kbdfans/kbd67/mkiirgb/v2')
+ check_returncode(result, 0)
+ assert 'default' and 'via' in result.stdout
def test_list_keymaps_no_keyboard_found():
- result = check_subcommand("list-keymaps", "-kb", "asdfghjkl")
- assert result.returncode == 0
- assert "does not exist" in result.stdout
+ result = check_subcommand('list-keymaps', '-kb', 'asdfghjkl')
+ check_returncode(result, 1)
+ assert 'does not exist' in result.stdout
+
+
+def test_json2c():
+ result = check_subcommand('json2c', 'keyboards/handwired/onekey/keymaps/default_json/keymap.json')
+ check_returncode(result, 0)
+ assert result.stdout == '#include QMK_KEYBOARD_H\nconst uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {\t[0] = LAYOUT(KC_A)};\n\n'
+
+
+def test_info():
+ result = check_subcommand('info', '-kb', 'handwired/onekey/pytest')
+ check_returncode(result)
+ assert 'Keyboard Name: handwired/onekey/pytest' in result.stdout
+ assert 'Processor: STM32F303' in result.stdout
+ assert 'Layout:' not in result.stdout
+ assert 'k0' not in result.stdout
+
+
+def test_info_keyboard_render():
+ result = check_subcommand('info', '-kb', 'handwired/onekey/pytest', '-l')
+ check_returncode(result)
+ assert 'Keyboard Name: handwired/onekey/pytest' in result.stdout
+ assert 'Processor: STM32F303' in result.stdout
+ assert 'Layout:' in result.stdout
+ assert 'k0' in result.stdout
+
+
+def test_info_keymap_render():
+ result = check_subcommand('info', '-kb', 'handwired/onekey/pytest', '-km', 'default_json')
+ check_returncode(result)
+ assert 'Keyboard Name: handwired/onekey/pytest' in result.stdout
+ assert 'Processor: STM32F303' in result.stdout
+ assert '│A │' in result.stdout
+
+
+def test_info_matrix_render():
+ result = check_subcommand('info', '-kb', 'handwired/onekey/pytest', '-m')
+ check_returncode(result)
+ assert 'Keyboard Name: handwired/onekey/pytest' in result.stdout
+ assert 'Processor: STM32F303' in result.stdout
+ assert 'LAYOUT' in result.stdout
+ assert '│0A│' in result.stdout
+ assert 'Matrix for "LAYOUT"' in result.stdout
diff --git a/lib/python/qmk/tests/test_qmk_keymap.py b/lib/python/qmk/tests/test_qmk_keymap.py
index 2db625600e..d8669e5498 100644
--- a/lib/python/qmk/tests/test_qmk_keymap.py
+++ b/lib/python/qmk/tests/test_qmk_keymap.py
@@ -8,12 +8,12 @@ def test_template_onekey_proton_c():
def test_template_onekey_pytest():
templ = qmk.keymap.template('handwired/onekey/pytest')
- assert templ == 'const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {__KEYMAP_GOES_HERE__};\n'
+ assert templ == '#include QMK_KEYBOARD_H\nconst uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {__KEYMAP_GOES_HERE__};\n'
def test_generate_onekey_pytest():
templ = qmk.keymap.generate('handwired/onekey/pytest', 'LAYOUT', [['KC_A']])
- assert templ == 'const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT(KC_A)};\n'
+ assert templ == '#include QMK_KEYBOARD_H\nconst uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {\t[0] = LAYOUT(KC_A)};\n'
# FIXME(skullydazed): Add a test for qmk.keymap.write that mocks up an FD.
diff --git a/lib/vusb b/lib/vusb
new file mode 160000
+Subproject 9a42d205eb60faca494ff4eabce8d59f0ec0fc7
diff --git a/message.mk b/message.mk
index c8da7df0bb..be04fa9b81 100644
--- a/message.mk
+++ b/message.mk
@@ -84,8 +84,7 @@ MSG_FILE_TOO_SMALL = The firmware is too small! $(CURRENT_SIZE)/$(MAX_SIZE)\n
MSG_FILE_JUST_RIGHT = The firmware size is fine - $(CURRENT_SIZE)/$(MAX_SIZE) ($(PERCENT_SIZE)%%, $(FREE_SIZE) bytes free)\n
MSG_FILE_NEAR_LIMIT = The firmware size is approaching the maximum - $(CURRENT_SIZE)/$(MAX_SIZE) ($(PERCENT_SIZE)%%, $(FREE_SIZE) bytes free)\n
MSG_PYTHON_MISSING = $(WARN_COLOR)WARNING:$(NO_COLOR)\n \
- Python 3 is not installed. It will be required by a future version\n\
- of qmk_firmware.\n\n\
+ Can not run bin/qmk! This tool will be required when the develop branch is merged on 2020 Aug 29.\n\n\
Please run $(BOLD)util/qmk_install.sh$(NO_COLOR) to install all the dependencies QMK requires.\n\n
MSG_FLASH_BOOTLOADER = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's bootloader is not specified or is not supported by the \":flash\" target at this time.\n\n
MSG_FLASH_ARCH = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's architecture is not supported by the \":flash\" target at this time.\n\n
diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h
index 2bcc27b4a1..805cb4f7ab 100644
--- a/quantum/audio/audio.h
+++ b/quantum/audio/audio.h
@@ -99,9 +99,6 @@ void play_notes(float (*np)[][2], uint16_t n_count, bool n_repeat);
// length. This works around the limitation of C's sizeof operation on pointers.
// The global float array for the song must be used here.
#define NOTE_ARRAY_SIZE(x) ((int16_t)(sizeof(x) / (sizeof(x[0]))))
-#define PLAY_NOTE_ARRAY(note_array, note_repeat, deprecated_arg) \
- play_notes(&note_array, NOTE_ARRAY_SIZE((note_array)), (note_repeat)); \
- _Pragma("message \"'PLAY_NOTE_ARRAY' macro is deprecated\"")
#define PLAY_SONG(note_array) play_notes(&note_array, NOTE_ARRAY_SIZE((note_array)), false)
#define PLAY_LOOP(note_array) play_notes(&note_array, NOTE_ARRAY_SIZE((note_array)), true)
diff --git a/quantum/audio/audio_avr.c b/quantum/audio/audio_avr.c
index 781378788c..5a96bf6439 100644
--- a/quantum/audio/audio_avr.c
+++ b/quantum/audio/audio_avr.c
@@ -110,6 +110,11 @@
# define TIMER_1_DUTY_CYCLE OCR1C
# define TIMER1_AUDIO_vect TIMER1_COMPC_vect
#endif
+
+#if !defined(BPIN_AUDIO) && !defined(CPIN_AUDIO)
+# error "Audio feature enabled, but no suitable pin selected - see docs/feature_audio.md under the AVR settings for available options."
+#endif
+
// -----------------------------------------------------------------------------
int voices = 0;
diff --git a/quantum/keymap_extras/keymap_belgian.h b/quantum/keymap_extras/keymap_belgian.h
index c6363a4377..b65db0532b 100644
--- a/quantum/keymap_extras/keymap_belgian.h
+++ b/quantum/keymap_extras/keymap_belgian.h
@@ -67,7 +67,7 @@
#define BE_F KC_F // F
#define BE_G KC_G // G
#define BE_H KC_H // H
-#define BE_J KC_K // J
+#define BE_J KC_J // J
#define BE_K KC_K // K
#define BE_L KC_L // L
#define BE_M KC_SCLN // M
diff --git a/quantum/keymap_extras/keymap_canadian_multilingual.h b/quantum/keymap_extras/keymap_canadian_multilingual.h
index 4fc174e735..d980dc2e41 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 <http://www.gnu.org/licenses/>.
*/
-#ifndef KEYMAP_CANADIAN_MULTILINGUAL_H
-#define KEYMAP_CANADIAN_MULTILINGUAL_H
-#include "keymap.h"
-
-#ifndef GR2A
-# define GR2A(kc) RCTL(kc)
-#endif
-
-// Normal characters
-// First row
-#define CSA_SLASH KC_GRV // /
-#define CSA_SLSH CSA_SLASH
-
-// 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
-
-// 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
-
-// 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
-
-// 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
-
-// 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
+#pragma once
-// 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
+#include "keymap.h"
-// 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 È & À
+// clang-format off
-// 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
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────â”
+ * │ / │ 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 // É
-// 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
+/* 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) // "
-// 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
+/* 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) // >
-// 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
+/* 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)
-// 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))
+/* 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)) // ÷
-#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_neo2.h b/quantum/keymap_extras/keymap_neo2.h
index 818a739c76..8e6e2b77a2 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 <http://www.gnu.org/licenses/>.
*/
-#ifndef KEYMAP_NEO2
-#define KEYMAP_NEO2
-#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
-
-#define NEO_DOT DE_DOT
-#define NEO_COMM DE_COMM
+#pragma once
-#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
+#include "keymap.h"
-#define NEO_L1_L KC_CAPS
-#define NEO_L1_R DE_HASH
+// clang-format off
-#define NEO_L2_L DE_LESS
-#define NEO_L2_R KC_ALGR
+/*
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────â”
+ * │ ^ │ 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)
-#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/sendstring_canadian_multilingual.h b/quantum/keymap_extras/sendstring_canadian_multilingual.h
new file mode 100644
index 0000000000..c3fcc62c37
--- /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 <http://www.gnu.org/licenses/>.
+ */
+
+// 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/matrix.c b/quantum/matrix.c
index 67d8af6ee8..c68c56cac2 100644
--- a/quantum/matrix.c
+++ b/quantum/matrix.c
@@ -48,17 +48,22 @@ static void init_pins(void) {
}
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;
+ // Start with a clear matrix row
+ matrix_row_t current_row_value = 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);
+ current_row_value |= readPin(pin) ? 0 : (MATRIX_ROW_SHIFTER << col_index);
}
}
- return (last_row_value != current_matrix[current_row]);
+ // If the row has changed, store the row and return the changed flag.
+ if (current_matrix[current_row] != current_row_value) {
+ current_matrix[current_row] = current_row_value;
+ return true;
+ }
+ return false;
}
#elif defined(DIODE_DIRECTION)
@@ -85,11 +90,8 @@ static void init_pins(void) {
}
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;
+ // Start with a clear matrix row
+ matrix_row_t current_row_value = 0;
// Select row and wait for row selecton to stabilize
select_row(current_row);
@@ -101,13 +103,18 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
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);
+ current_row_value |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index);
}
// Unselect row
unselect_row(current_row);
- return (last_row_value != current_matrix[current_row]);
+ // If the row has changed, store the row and return the changed flag.
+ if (current_matrix[current_row] != current_row_value) {
+ current_matrix[current_row] = current_row_value;
+ return true;
+ }
+ return false;
}
# elif (DIODE_DIRECTION == ROW2COL)
@@ -142,20 +149,22 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
// 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];
+ matrix_row_t last_row_value = current_matrix[row_index];
+ matrix_row_t current_row_value = last_row_value;
// 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);
+ current_row_value |= (MATRIX_ROW_SHIFTER << current_col);
} else {
// Pin HI, clear col bit
- current_matrix[row_index] &= ~(MATRIX_ROW_SHIFTER << current_col);
+ current_row_value &= ~(MATRIX_ROW_SHIFTER << current_col);
}
// Determine if the matrix changed state
- if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) {
- matrix_changed = true;
+ if ((last_row_value != current_row_value)) {
+ matrix_changed |= true;
+ current_matrix[row_index] = current_row_value;
}
}
diff --git a/quantum/process_keycode/process_rgb.c b/quantum/process_keycode/process_rgb.c
index 627e5986fb..21164b8f9f 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 48ce3961ad..fb50215012 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();
@@ -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_MAC:
- set_unicode_input_mode(UC_MAC);
-#if defined(AUDIO_ENABLE) && defined(UNICODE_SONG_MAC)
- static float song_mac[][2] = UNICODE_SONG_MAC;
- PLAY_SONG(song_mac);
-#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 5421c28c7f..4579fde8d5 100644
--- a/quantum/process_keycode/process_unicode_common.h
+++ b/quantum/process_keycode/process_unicode_common.h
@@ -80,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 5445cde129..2f402a2fd2 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;
}
diff --git a/quantum/quantum.c b/quantum/quantum.c
index a780ed43d0..75df357d33 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -623,9 +623,6 @@ void matrix_init_quantum() {
#ifdef OUTPUT_AUTO_ENABLE
set_output(OUTPUT_AUTO);
#endif
-#ifdef DIP_SWITCH_ENABLE
- dip_switch_init();
-#endif
matrix_init_kb();
}
diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h
index 0958c4f4eb..d8f1fa4bbb 100644
--- a/quantum/quantum_keycodes.h
+++ b/quantum/quantum_keycodes.h
@@ -794,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 3fae9d7378..f3da0ab0f7 100644
--- a/quantum/rgb_matrix.c
+++ b/quantum/rgb_matrix.c
@@ -57,8 +57,12 @@ const point_t k_rgb_matrix_center = RGB_MATRIX_CENTER;
// -----End rgb effect includes macros-------
// ------------------------------------------
-#ifndef RGB_DISABLE_AFTER_TIMEOUT
-# define RGB_DISABLE_AFTER_TIMEOUT 0
+#if defined(RGB_DISABLE_AFTER_TIMEOUT) && !defined(RGB_DISABLE_TIMEOUT)
+# define RGB_DISABLE_TIMEOUT (RGB_DISABLE_AFTER_TIMEOUT * 1200)
+#endif
+
+#ifndef RGB_DISABLE_TIMEOUT
+# define RGB_DISABLE_TIMEOUT 0
#endif
#ifndef RGB_DISABLE_WHEN_USB_SUSPENDED
@@ -111,19 +115,29 @@ 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;
-
-rgb_counters_t g_rgb_counters;
-static uint32_t rgb_counters_buffer;
-
+// globals
+bool g_suspend_state = false;
+rgb_config_t rgb_matrix_config; // TODO: would like to prefix this with g_ for global consistancy, do this in another pr
+uint32_t g_rgb_timer;
#ifdef RGB_MATRIX_FRAMEBUFFER_EFFECTS
-uint8_t rgb_frame_buffer[MATRIX_ROWS][MATRIX_COLS] = {{0}};
-#endif
+uint8_t g_rgb_frame_buffer[MATRIX_ROWS][MATRIX_COLS] = {{0}};
+#endif // RGB_MATRIX_FRAMEBUFFER_EFFECTS
+#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
+last_hit_t g_last_hit_tracker;
+#endif // RGB_MATRIX_KEYREACTIVE_ENABLED
+// internals
+static uint8_t rgb_last_enable = UINT8_MAX;
+static uint8_t rgb_last_effect = UINT8_MAX;
+static effect_params_t rgb_effect_params = {0, 0xFF};
+static rgb_task_states rgb_task_state = SYNCING;
+#if RGB_DISABLE_TIMEOUT > 0
+static uint32_t rgb_anykey_timer;
+#endif // RGB_DISABLE_TIMEOUT > 0
+
+// double buffers
+static uint32_t rgb_timer_buffer;
#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
-last_hit_t g_last_hit_tracker;
static last_hit_t last_hit_buffer;
#endif // RGB_MATRIX_KEYREACTIVE_ENABLED
@@ -169,21 +183,24 @@ void rgb_matrix_set_color(int index, uint8_t red, uint8_t green, uint8_t blue) {
void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue) { rgb_matrix_driver.set_color_all(red, green, blue); }
bool process_rgb_matrix(uint16_t keycode, keyrecord_t *record) {
+#if RGB_DISABLE_TIMEOUT > 0
+ if (record->event.pressed) {
+ rgb_anykey_timer = 0;
+ }
+#endif // RGB_DISABLE_TIMEOUT > 0
+
#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
uint8_t led[LED_HITS_TO_REMEMBER];
uint8_t led_count = 0;
# if defined(RGB_MATRIX_KEYRELEASES)
- if (!record->event.pressed) {
- led_count = rgb_matrix_map_row_column_to_led(record->event.key.row, record->event.key.col, led);
- g_rgb_counters.any_key_hit = 0;
- }
+ if (!record->event.pressed)
# elif defined(RGB_MATRIX_KEYPRESSES)
- if (record->event.pressed) {
- led_count = rgb_matrix_map_row_column_to_led(record->event.key.row, record->event.key.col, led);
- g_rgb_counters.any_key_hit = 0;
- }
+ if (record->event.pressed)
# endif // defined(RGB_MATRIX_KEYRELEASES)
+ {
+ led_count = rgb_matrix_map_row_column_to_led(record->event.key.row, record->event.key.col, led);
+ }
if (last_hit_buffer.count + led_count > LED_HITS_TO_REMEMBER) {
memcpy(&last_hit_buffer.x[0], &last_hit_buffer.x[led_count], LED_HITS_TO_REMEMBER - led_count);
@@ -216,7 +233,7 @@ void rgb_matrix_test(void) {
// Mask out bits 4 and 5
// Increase the factor to make the test animation slower (and reduce to make it faster)
uint8_t factor = 10;
- switch ((g_rgb_counters.tick & (0b11 << factor)) >> factor) {
+ switch ((g_rgb_timer & (0b11 << factor)) >> factor) {
case 0: {
rgb_matrix_set_color_all(20, 0, 0);
break;
@@ -241,29 +258,26 @@ static bool rgb_matrix_none(effect_params_t *params) {
return false;
}
- RGB_MATRIX_USE_LIMITS(led_min, led_max);
- for (uint8_t i = led_min; i < led_max; i++) {
- rgb_matrix_set_color(i, 0, 0, 0);
- }
- return led_max < DRIVER_LED_TOTAL;
+ rgb_matrix_set_color_all(0, 0, 0);
+ return false;
}
-static uint8_t rgb_last_enable = UINT8_MAX;
-static uint8_t rgb_last_effect = UINT8_MAX;
-static effect_params_t rgb_effect_params = {0, 0xFF};
-static rgb_task_states rgb_task_state = SYNCING;
-
static void rgb_task_timers(void) {
+#if defined(RGB_MATRIX_KEYREACTIVE_ENABLED) || RGB_DISABLE_TIMEOUT > 0
+ uint32_t deltaTime = timer_elapsed32(rgb_timer_buffer);
+#endif // defined(RGB_MATRIX_KEYREACTIVE_ENABLED) || RGB_DISABLE_TIMEOUT > 0
+ rgb_timer_buffer = timer_read32();
+
// Update double buffer timers
- uint16_t deltaTime = timer_elapsed32(rgb_counters_buffer);
- rgb_counters_buffer = timer_read32();
- if (g_rgb_counters.any_key_hit < UINT32_MAX) {
- if (UINT32_MAX - deltaTime < g_rgb_counters.any_key_hit) {
- g_rgb_counters.any_key_hit = UINT32_MAX;
+#if RGB_DISABLE_TIMEOUT > 0
+ if (rgb_anykey_timer < UINT32_MAX) {
+ if (UINT32_MAX - deltaTime < rgb_anykey_timer) {
+ rgb_anykey_timer = UINT32_MAX;
} else {
- g_rgb_counters.any_key_hit += deltaTime;
+ rgb_anykey_timer += deltaTime;
}
}
+#endif // RGB_DISABLE_TIMEOUT > 0
// Update double buffer last hit timers
#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
@@ -280,7 +294,7 @@ static void rgb_task_timers(void) {
static void rgb_task_sync(void) {
// next task
- if (timer_elapsed32(g_rgb_counters.tick) >= RGB_MATRIX_LED_FLUSH_LIMIT) rgb_task_state = STARTING;
+ if (timer_elapsed32(g_rgb_timer) >= RGB_MATRIX_LED_FLUSH_LIMIT) rgb_task_state = STARTING;
}
static void rgb_task_start(void) {
@@ -288,7 +302,7 @@ static void rgb_task_start(void) {
rgb_effect_params.iter = 0;
// update double buffers
- g_rgb_counters.tick = rgb_counters_buffer;
+ g_rgb_timer = rgb_timer_buffer;
#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
g_last_hit_tracker = last_hit_buffer;
#endif // RGB_MATRIX_KEYREACTIVE_ENABLED
@@ -370,8 +384,16 @@ void rgb_matrix_task(void) {
// Ideally we would also stop sending zeros to the LED driver PWM buffers
// while suspended and just do a software shutdown. This is a cheap hack for now.
- bool suspend_backlight = ((g_suspend_state && RGB_DISABLE_WHEN_USB_SUSPENDED) || (RGB_DISABLE_AFTER_TIMEOUT > 0 && g_rgb_counters.any_key_hit > RGB_DISABLE_AFTER_TIMEOUT * 60 * 20));
- uint8_t effect = suspend_backlight || !rgb_matrix_config.enable ? 0 : rgb_matrix_config.mode;
+ bool suspend_backlight =
+#if RGB_DISABLE_WHEN_USB_SUSPENDED == true
+ g_suspend_state ||
+#endif // RGB_DISABLE_WHEN_USB_SUSPENDED == true
+#if RGB_DISABLE_TIMEOUT > 0
+ (rgb_anykey_timer > (uint32_t)RGB_DISABLE_TIMEOUT) ||
+#endif // RGB_DISABLE_TIMEOUT > 0
+ false;
+
+ uint8_t effect = suspend_backlight || !rgb_matrix_config.enable ? 0 : rgb_matrix_config.mode;
switch (rgb_task_state) {
case STARTING:
@@ -405,8 +427,6 @@ __attribute__((weak)) void rgb_matrix_indicators_user(void) {}
void rgb_matrix_init(void) {
rgb_matrix_driver.init();
- // TODO: put the 1 second startup delay here?
-
#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
g_last_hit_tracker.count = 0;
for (uint8_t i = 0; i < LED_HITS_TO_REMEMBER; ++i) {
@@ -440,6 +460,8 @@ void rgb_matrix_set_suspend_state(bool state) {
g_suspend_state = state;
}
+bool rgb_matrix_get_suspend_state(void) { return g_suspend_state; }
+
void rgb_matrix_toggle(void) {
rgb_matrix_config.enable ^= 1;
rgb_task_state = STARTING;
@@ -466,6 +488,8 @@ void rgb_matrix_disable_noeeprom(void) {
rgb_matrix_config.enable = 0;
}
+uint8_t rgb_matrix_is_enabled(void) { return rgb_matrix_config.enable; }
+
void rgb_matrix_step(void) {
rgb_matrix_config.mode++;
if (rgb_matrix_config.mode >= RGB_MATRIX_EFFECT_MAX) rgb_matrix_config.mode = 1;
@@ -521,6 +545,8 @@ void rgb_matrix_decrease_speed(void) {
eeconfig_update_rgb_matrix();
}
+uint8_t rgb_matrix_get_speed(void) { return rgb_matrix_config.speed; }
+
led_flags_t rgb_matrix_get_flags(void) { return rgb_effect_params.flags; }
void rgb_matrix_set_flags(led_flags_t flags) { rgb_effect_params.flags = flags; }
@@ -546,3 +572,8 @@ void rgb_matrix_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val) {
rgb_matrix_config.hsv.v = val;
if (rgb_matrix_config.hsv.v > RGB_MATRIX_MAXIMUM_BRIGHTNESS) rgb_matrix_config.hsv.v = RGB_MATRIX_MAXIMUM_BRIGHTNESS;
}
+
+HSV rgb_matrix_get_hsv(void) { return rgb_matrix_config.hsv; }
+uint8_t rgb_matrix_get_hue(void) { return rgb_matrix_config.hsv.h; }
+uint8_t rgb_matrix_get_sat(void) { return rgb_matrix_config.hsv.s; }
+uint8_t rgb_matrix_get_val(void) { return rgb_matrix_config.hsv.v; }
diff --git a/quantum/rgb_matrix.h b/quantum/rgb_matrix.h
index 96494836ee..d9ce391068 100644
--- a/quantum/rgb_matrix.h
+++ b/quantum/rgb_matrix.h
@@ -104,11 +104,13 @@ void rgb_matrix_indicators_user(void);
void rgb_matrix_init(void);
void rgb_matrix_set_suspend_state(bool state);
+bool rgb_matrix_get_suspend_state(void);
void rgb_matrix_toggle(void);
void rgb_matrix_enable(void);
void rgb_matrix_enable_noeeprom(void);
void rgb_matrix_disable(void);
void rgb_matrix_disable_noeeprom(void);
+uint8_t rgb_matrix_is_enabled(void);
void rgb_matrix_step(void);
void rgb_matrix_step_reverse(void);
void rgb_matrix_increase_hue(void);
@@ -119,6 +121,7 @@ void rgb_matrix_increase_val(void);
void rgb_matrix_decrease_val(void);
void rgb_matrix_increase_speed(void);
void rgb_matrix_decrease_speed(void);
+uint8_t rgb_matrix_get_speed(void);
led_flags_t rgb_matrix_get_flags(void);
void rgb_matrix_set_flags(led_flags_t flags);
void rgb_matrix_mode(uint8_t mode);
@@ -126,6 +129,10 @@ void rgb_matrix_mode_noeeprom(uint8_t mode);
uint8_t rgb_matrix_get_mode(void);
void rgb_matrix_sethsv(uint16_t hue, uint8_t sat, uint8_t val);
void rgb_matrix_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val);
+HSV rgb_matrix_get_hsv(void);
+uint8_t rgb_matrix_get_hue(void);
+uint8_t rgb_matrix_get_sat(void);
+uint8_t rgb_matrix_get_val(void);
#ifndef RGBLIGHT_ENABLE
# define rgblight_toggle rgb_matrix_toggle
@@ -133,6 +140,7 @@ void rgb_matrix_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val);
# define rgblight_enable_noeeprom rgb_matrix_enable_noeeprom
# define rgblight_disable rgb_matrix_disable
# define rgblight_disable_noeeprom rgb_matrix_disable_noeeprom
+# define rgblight_is_enabled rgb_matrix_is_enabled
# define rgblight_step rgb_matrix_step
# define rgblight_sethsv rgb_matrix_sethsv
# define rgblight_sethsv_noeeprom rgb_matrix_sethsv_noeeprom
@@ -145,9 +153,14 @@ void rgb_matrix_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val);
# define rgblight_decrease_val rgb_matrix_decrease_val
# define rgblight_increase_speed rgb_matrix_increase_speed
# define rgblight_decrease_speed rgb_matrix_decrease_speed
+# define rgblight_get_speed rgb_matrix_get_speed
# define rgblight_mode rgb_matrix_mode
# define rgblight_mode_noeeprom rgb_matrix_mode_noeeprom
# define rgblight_get_mode rgb_matrix_get_mode
+# define rgblight_get_hue rgb_matrix_get_hue
+# define rgblight_get_sat rgb_matrix_get_sat
+# define rgblight_get_val rgb_matrix_get_val
+# define rgblight_get_hsv rgb_matrix_get_hsv
#endif
typedef struct {
@@ -165,14 +178,14 @@ extern const rgb_matrix_driver_t rgb_matrix_driver;
extern rgb_config_t rgb_matrix_config;
-extern bool g_suspend_state;
-extern rgb_counters_t g_rgb_counters;
-extern led_config_t g_led_config;
+extern bool g_suspend_state;
+extern uint32_t g_rgb_timer;
+extern led_config_t g_led_config;
#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
extern last_hit_t g_last_hit_tracker;
#endif
#ifdef RGB_MATRIX_FRAMEBUFFER_EFFECTS
-extern uint8_t rgb_frame_buffer[MATRIX_ROWS][MATRIX_COLS];
+extern uint8_t g_rgb_frame_buffer[MATRIX_ROWS][MATRIX_COLS];
#endif
#endif
diff --git a/quantum/rgb_matrix_animations/breathing_anim.h b/quantum/rgb_matrix_animations/breathing_anim.h
index 92431555e7..887425f9da 100644
--- a/quantum/rgb_matrix_animations/breathing_anim.h
+++ b/quantum/rgb_matrix_animations/breathing_anim.h
@@ -6,7 +6,7 @@ bool BREATHING(effect_params_t* params) {
RGB_MATRIX_USE_LIMITS(led_min, led_max);
HSV hsv = rgb_matrix_config.hsv;
- uint16_t time = scale16by8(g_rgb_counters.tick, rgb_matrix_config.speed / 8);
+ uint16_t time = scale16by8(g_rgb_timer, rgb_matrix_config.speed / 8);
hsv.v = scale8(abs8(sin8(time) - 128) * 2, hsv.v);
RGB rgb = hsv_to_rgb(hsv);
for (uint8_t i = led_min; i < led_max; i++) {
diff --git a/quantum/rgb_matrix_animations/digital_rain_anim.h b/quantum/rgb_matrix_animations/digital_rain_anim.h
index 7a4a52db1b..1de45f8e8d 100644
--- a/quantum/rgb_matrix_animations/digital_rain_anim.h
+++ b/quantum/rgb_matrix_animations/digital_rain_anim.h
@@ -18,7 +18,7 @@ bool DIGITAL_RAIN(effect_params_t* params) {
if (params->init) {
rgb_matrix_set_color_all(0, 0, 0);
- memset(rgb_frame_buffer, 0, sizeof(rgb_frame_buffer));
+ memset(g_rgb_frame_buffer, 0, sizeof(g_rgb_frame_buffer));
drop = 0;
}
@@ -27,10 +27,10 @@ bool DIGITAL_RAIN(effect_params_t* params) {
if (row == 0 && drop == 0 && rand() < RAND_MAX / RGB_DIGITAL_RAIN_DROPS) {
// top row, pixels have just fallen and we're
// making a new rain drop in this column
- rgb_frame_buffer[row][col] = max_intensity;
- } else if (rgb_frame_buffer[row][col] > 0 && rgb_frame_buffer[row][col] < max_intensity) {
+ g_rgb_frame_buffer[row][col] = max_intensity;
+ } else if (g_rgb_frame_buffer[row][col] > 0 && g_rgb_frame_buffer[row][col] < max_intensity) {
// neither fully bright nor dark, decay it
- rgb_frame_buffer[row][col]--;
+ g_rgb_frame_buffer[row][col]--;
}
// set the pixel colour
uint8_t led[LED_HITS_TO_REMEMBER];
@@ -38,11 +38,11 @@ bool DIGITAL_RAIN(effect_params_t* params) {
// TODO: multiple leds are supported mapped to the same row/column
if (led_count > 0) {
- if (rgb_frame_buffer[row][col] > pure_green_intensity) {
- const uint8_t boost = (uint8_t)((uint16_t)max_brightness_boost * (rgb_frame_buffer[row][col] - pure_green_intensity) / (max_intensity - pure_green_intensity));
+ if (g_rgb_frame_buffer[row][col] > pure_green_intensity) {
+ const uint8_t boost = (uint8_t)((uint16_t)max_brightness_boost * (g_rgb_frame_buffer[row][col] - pure_green_intensity) / (max_intensity - pure_green_intensity));
rgb_matrix_set_color(led[0], boost, max_intensity, boost);
} else {
- const uint8_t green = (uint8_t)((uint16_t)max_intensity * rgb_frame_buffer[row][col] / pure_green_intensity);
+ const uint8_t green = (uint8_t)((uint16_t)max_intensity * g_rgb_frame_buffer[row][col] / pure_green_intensity);
rgb_matrix_set_color(led[0], 0, green, 0);
}
}
@@ -55,15 +55,15 @@ bool DIGITAL_RAIN(effect_params_t* params) {
for (uint8_t row = MATRIX_ROWS - 1; row > 0; row--) {
for (uint8_t col = 0; col < MATRIX_COLS; col++) {
// if ths is on the bottom row and bright allow decay
- if (row == MATRIX_ROWS - 1 && rgb_frame_buffer[row][col] == max_intensity) {
- rgb_frame_buffer[row][col]--;
+ if (row == MATRIX_ROWS - 1 && g_rgb_frame_buffer[row][col] == max_intensity) {
+ g_rgb_frame_buffer[row][col]--;
}
// check if the pixel above is bright
- if (rgb_frame_buffer[row - 1][col] == max_intensity) {
+ if (g_rgb_frame_buffer[row - 1][col] == max_intensity) {
// allow old bright pixel to decay
- rgb_frame_buffer[row - 1][col]--;
+ g_rgb_frame_buffer[row - 1][col]--;
// make this pixel bright
- rgb_frame_buffer[row][col] = max_intensity;
+ g_rgb_frame_buffer[row][col] = max_intensity;
}
}
}
diff --git a/quantum/rgb_matrix_animations/jellybean_raindrops_anim.h b/quantum/rgb_matrix_animations/jellybean_raindrops_anim.h
index 5596146a38..ef2d1500b0 100644
--- a/quantum/rgb_matrix_animations/jellybean_raindrops_anim.h
+++ b/quantum/rgb_matrix_animations/jellybean_raindrops_anim.h
@@ -12,7 +12,7 @@ static void jellybean_raindrops_set_color(int i, effect_params_t* params) {
bool JELLYBEAN_RAINDROPS(effect_params_t* params) {
if (!params->init) {
// Change one LED every tick, make sure speed is not 0
- if (scale16by8(g_rgb_counters.tick, qadd8(rgb_matrix_config.speed, 16)) % 5 == 0) {
+ if (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 16)) % 5 == 0) {
jellybean_raindrops_set_color(rand() % DRIVER_LED_TOTAL, params);
}
return false;
diff --git a/quantum/rgb_matrix_animations/raindrops_anim.h b/quantum/rgb_matrix_animations/raindrops_anim.h
index 9f839a1bce..6e1b5acb0d 100644
--- a/quantum/rgb_matrix_animations/raindrops_anim.h
+++ b/quantum/rgb_matrix_animations/raindrops_anim.h
@@ -22,7 +22,7 @@ static void raindrops_set_color(int i, effect_params_t* params) {
bool RAINDROPS(effect_params_t* params) {
if (!params->init) {
// Change one LED every tick, make sure speed is not 0
- if (scale16by8(g_rgb_counters.tick, qadd8(rgb_matrix_config.speed, 16)) % 10 == 0) {
+ if (scale16by8(g_rgb_timer, qadd8(rgb_matrix_config.speed, 16)) % 10 == 0) {
raindrops_set_color(rand() % DRIVER_LED_TOTAL, params);
}
return false;
diff --git a/quantum/rgb_matrix_animations/typing_heatmap_anim.h b/quantum/rgb_matrix_animations/typing_heatmap_anim.h
index dd313f16a5..e82c1b49ee 100644
--- a/quantum/rgb_matrix_animations/typing_heatmap_anim.h
+++ b/quantum/rgb_matrix_animations/typing_heatmap_anim.h
@@ -10,20 +10,20 @@ void process_rgb_matrix_typing_heatmap(keyrecord_t* record) {
uint8_t m_col = col - 1;
uint8_t p_col = col + 1;
- if (m_col < col) rgb_frame_buffer[row][m_col] = qadd8(rgb_frame_buffer[row][m_col], 16);
- rgb_frame_buffer[row][col] = qadd8(rgb_frame_buffer[row][col], 32);
- if (p_col < MATRIX_COLS) rgb_frame_buffer[row][p_col] = qadd8(rgb_frame_buffer[row][p_col], 16);
+ if (m_col < col) g_rgb_frame_buffer[row][m_col] = qadd8(g_rgb_frame_buffer[row][m_col], 16);
+ g_rgb_frame_buffer[row][col] = qadd8(g_rgb_frame_buffer[row][col], 32);
+ if (p_col < MATRIX_COLS) g_rgb_frame_buffer[row][p_col] = qadd8(g_rgb_frame_buffer[row][p_col], 16);
if (p_row < MATRIX_ROWS) {
- if (m_col < col) rgb_frame_buffer[p_row][m_col] = qadd8(rgb_frame_buffer[p_row][m_col], 13);
- rgb_frame_buffer[p_row][col] = qadd8(rgb_frame_buffer[p_row][col], 16);
- if (p_col < MATRIX_COLS) rgb_frame_buffer[p_row][p_col] = qadd8(rgb_frame_buffer[p_row][p_col], 13);
+ if (m_col < col) g_rgb_frame_buffer[p_row][m_col] = qadd8(g_rgb_frame_buffer[p_row][m_col], 13);
+ g_rgb_frame_buffer[p_row][col] = qadd8(g_rgb_frame_buffer[p_row][col], 16);
+ if (p_col < MATRIX_COLS) g_rgb_frame_buffer[p_row][p_col] = qadd8(g_rgb_frame_buffer[p_row][p_col], 13);
}
if (m_row < row) {
- if (m_col < col) rgb_frame_buffer[m_row][m_col] = qadd8(rgb_frame_buffer[m_row][m_col], 13);
- rgb_frame_buffer[m_row][col] = qadd8(rgb_frame_buffer[m_row][col], 16);
- if (p_col < MATRIX_COLS) rgb_frame_buffer[m_row][p_col] = qadd8(rgb_frame_buffer[m_row][p_col], 13);
+ if (m_col < col) g_rgb_frame_buffer[m_row][m_col] = qadd8(g_rgb_frame_buffer[m_row][m_col], 13);
+ g_rgb_frame_buffer[m_row][col] = qadd8(g_rgb_frame_buffer[m_row][col], 16);
+ if (p_col < MATRIX_COLS) g_rgb_frame_buffer[m_row][p_col] = qadd8(g_rgb_frame_buffer[m_row][p_col], 13);
}
}
@@ -31,18 +31,18 @@ bool TYPING_HEATMAP(effect_params_t* params) {
// Modified version of RGB_MATRIX_USE_LIMITS to work off of matrix row / col size
uint8_t led_min = RGB_MATRIX_LED_PROCESS_LIMIT * params->iter;
uint8_t led_max = led_min + RGB_MATRIX_LED_PROCESS_LIMIT;
- if (led_max > sizeof(rgb_frame_buffer)) led_max = sizeof(rgb_frame_buffer);
+ if (led_max > sizeof(g_rgb_frame_buffer)) led_max = sizeof(g_rgb_frame_buffer);
if (params->init) {
rgb_matrix_set_color_all(0, 0, 0);
- memset(rgb_frame_buffer, 0, sizeof rgb_frame_buffer);
+ memset(g_rgb_frame_buffer, 0, sizeof g_rgb_frame_buffer);
}
// Render heatmap & decrease
for (int i = led_min; i < led_max; i++) {
uint8_t row = i % MATRIX_ROWS;
uint8_t col = i / MATRIX_ROWS;
- uint8_t val = rgb_frame_buffer[row][col];
+ uint8_t val = g_rgb_frame_buffer[row][col];
// set the pixel colour
uint8_t led[LED_HITS_TO_REMEMBER];
@@ -55,10 +55,10 @@ bool TYPING_HEATMAP(effect_params_t* params) {
rgb_matrix_set_color(led[j], rgb.r, rgb.g, rgb.b);
}
- rgb_frame_buffer[row][col] = qsub8(val, 1);
+ g_rgb_frame_buffer[row][col] = qsub8(val, 1);
}
- return led_max < sizeof(rgb_frame_buffer);
+ return led_max < sizeof(g_rgb_frame_buffer);
}
# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
diff --git a/quantum/rgb_matrix_runners/effect_runner_dx_dy.h b/quantum/rgb_matrix_runners/effect_runner_dx_dy.h
index 3d312190a5..9d0c9fab19 100644
--- a/quantum/rgb_matrix_runners/effect_runner_dx_dy.h
+++ b/quantum/rgb_matrix_runners/effect_runner_dx_dy.h
@@ -5,7 +5,7 @@ typedef HSV (*dx_dy_f)(HSV hsv, int16_t dx, int16_t dy, uint8_t time);
bool effect_runner_dx_dy(effect_params_t* params, dx_dy_f effect_func) {
RGB_MATRIX_USE_LIMITS(led_min, led_max);
- uint8_t time = scale16by8(g_rgb_counters.tick, rgb_matrix_config.speed / 2);
+ uint8_t time = scale16by8(g_rgb_timer, rgb_matrix_config.speed / 2);
for (uint8_t i = led_min; i < led_max; i++) {
RGB_MATRIX_TEST_LED_FLAGS();
int16_t dx = g_led_config.point[i].x - k_rgb_matrix_center.x;
diff --git a/quantum/rgb_matrix_runners/effect_runner_dx_dy_dist.h b/quantum/rgb_matrix_runners/effect_runner_dx_dy_dist.h
index 1f4767e321..2824c82527 100644
--- a/quantum/rgb_matrix_runners/effect_runner_dx_dy_dist.h
+++ b/quantum/rgb_matrix_runners/effect_runner_dx_dy_dist.h
@@ -5,7 +5,7 @@ typedef HSV (*dx_dy_dist_f)(HSV hsv, int16_t dx, int16_t dy, uint8_t dist, uint8
bool effect_runner_dx_dy_dist(effect_params_t* params, dx_dy_dist_f effect_func) {
RGB_MATRIX_USE_LIMITS(led_min, led_max);
- uint8_t time = scale16by8(g_rgb_counters.tick, rgb_matrix_config.speed / 2);
+ uint8_t time = scale16by8(g_rgb_timer, rgb_matrix_config.speed / 2);
for (uint8_t i = led_min; i < led_max; i++) {
RGB_MATRIX_TEST_LED_FLAGS();
int16_t dx = g_led_config.point[i].x - k_rgb_matrix_center.x;
diff --git a/quantum/rgb_matrix_runners/effect_runner_i.h b/quantum/rgb_matrix_runners/effect_runner_i.h
index eebfb78c02..5e6bf5daaf 100644
--- a/quantum/rgb_matrix_runners/effect_runner_i.h
+++ b/quantum/rgb_matrix_runners/effect_runner_i.h
@@ -5,7 +5,7 @@ typedef HSV (*i_f)(HSV hsv, uint8_t i, uint8_t time);
bool effect_runner_i(effect_params_t* params, i_f effect_func) {
RGB_MATRIX_USE_LIMITS(led_min, led_max);
- uint8_t time = scale16by8(g_rgb_counters.tick, rgb_matrix_config.speed / 4);
+ uint8_t time = scale16by8(g_rgb_timer, rgb_matrix_config.speed / 4);
for (uint8_t i = led_min; i < led_max; i++) {
RGB_MATRIX_TEST_LED_FLAGS();
RGB rgb = hsv_to_rgb(effect_func(rgb_matrix_config.hsv, i, time));
diff --git a/quantum/rgb_matrix_runners/effect_runner_sin_cos_i.h b/quantum/rgb_matrix_runners/effect_runner_sin_cos_i.h
index c02352b86d..3fb7d48051 100644
--- a/quantum/rgb_matrix_runners/effect_runner_sin_cos_i.h
+++ b/quantum/rgb_matrix_runners/effect_runner_sin_cos_i.h
@@ -5,7 +5,7 @@ typedef HSV (*sin_cos_i_f)(HSV hsv, int8_t sin, int8_t cos, uint8_t i, uint8_t t
bool effect_runner_sin_cos_i(effect_params_t* params, sin_cos_i_f effect_func) {
RGB_MATRIX_USE_LIMITS(led_min, led_max);
- uint16_t time = scale16by8(g_rgb_counters.tick, rgb_matrix_config.speed / 4);
+ uint16_t time = scale16by8(g_rgb_timer, rgb_matrix_config.speed / 4);
int8_t cos_value = cos8(time) - 128;
int8_t sin_value = sin8(time) - 128;
for (uint8_t i = led_min; i < led_max; i++) {
diff --git a/quantum/rgb_matrix_types.h b/quantum/rgb_matrix_types.h
index fc23f55d0e..f447ac9c56 100644
--- a/quantum/rgb_matrix_types.h
+++ b/quantum/rgb_matrix_types.h
@@ -44,13 +44,6 @@ typedef struct PACKED {
} effect_params_t;
typedef struct PACKED {
- // Global tick at 20 Hz
- uint32_t tick;
- // Ticks since this key was last hit.
- uint32_t any_key_hit;
-} rgb_counters_t;
-
-typedef struct PACKED {
uint8_t x;
uint8_t y;
} point_t;
diff --git a/quantum/rgblight.c b/quantum/rgblight.c
index 26cb41a96f..d33484ccfd 100644
--- a/quantum/rgblight.c
+++ b/quantum/rgblight.c
@@ -15,6 +15,7 @@
*/
#include <math.h>
#include <string.h>
+#include <stdlib.h>
#ifdef __AVR__
# include <avr/eeprom.h>
# include <avr/interrupt.h>
@@ -367,6 +368,8 @@ void rgblight_disable_noeeprom(void) {
rgblight_set();
}
+bool rgblight_is_enabled(void) { return rgblight_config.enable; }
+
void rgblight_increase_hue_helper(bool write_to_eeprom) {
uint8_t hue = rgblight_config.hue + RGBLIGHT_HUE_STEP;
rgblight_sethsv_eeprom_helper(hue, rgblight_config.sat, rgblight_config.val, write_to_eeprom);
@@ -521,6 +524,8 @@ uint8_t rgblight_get_sat(void) { return rgblight_config.sat; }
uint8_t rgblight_get_val(void) { return rgblight_config.val; }
+HSV rgblight_get_hsv(void) { return (HSV){rgblight_config.hue, rgblight_config.sat, rgblight_config.val}; }
+
void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b) {
if (!rgblight_config.enable) {
return;
@@ -561,7 +566,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
@@ -612,7 +617,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 {
@@ -623,10 +628,17 @@ void rgblight_set_layer_state(uint8_t layer, bool enabled) {
if (rgblight_status.timer_enabled == false) {
rgblight_mode_noeeprom(rgblight_config.mode);
}
+
+# ifdef RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF
+ // If not enabled, then nothing else will actually set the LEDs...
+ if (!rgblight_config.enable) {
+ rgblight_set();
+ }
+# endif
}
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;
}
@@ -658,21 +670,41 @@ static void rgblight_layers_write(void) {
}
}
}
+
+# ifdef RGBLIGHT_LAYER_BLINK
+rgblight_layer_mask_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;
uint8_t num_leds = rgblight_ranges.clipping_num_leds;
-# ifdef RGBLIGHT_LAYERS
- if (rgblight_layers != NULL) {
- rgblight_layers_write();
- }
-# endif
-
if (!rgblight_config.enable) {
for (uint8_t i = rgblight_ranges.effect_start_pos; i < rgblight_ranges.effect_end_pos; i++) {
led[i].r = 0;
@@ -684,6 +716,16 @@ void rgblight_set(void) {
}
}
+# ifdef RGBLIGHT_LAYERS
+ if (rgblight_layers != NULL
+# ifndef RGBLIGHT_LAYERS_OVERRIDE_RGB_OFF
+ && rgblight_config.enable
+# endif
+ ) {
+ rgblight_layers_write();
+ }
+# endif
+
# ifdef RGBLIGHT_LED_MAP
LED_TYPE led0[RGBLED_NUM];
for (uint8_t i = 0; i < RGBLED_NUM; i++) {
@@ -880,6 +922,12 @@ void rgblight_task(void) {
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;
animation_status.last_timer = timer_read() - interval_time - 1;
@@ -909,6 +957,10 @@ void rgblight_task(void) {
# endif
}
}
+
+# ifdef RGBLIGHT_LAYER_BLINK
+ rgblight_unblink_layers();
+# endif
}
#endif /* RGBLIGHT_USE_TIMER */
@@ -1160,3 +1212,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 b1585b158b..c36b328a35 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
@@ -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
@@ -180,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(...) \
@@ -192,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];
@@ -202,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)
@@ -224,7 +260,7 @@ 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;
@@ -314,6 +350,8 @@ uint8_t rgblight_get_mode(void);
uint8_t rgblight_get_hue(void);
uint8_t rgblight_get_sat(void);
uint8_t rgblight_get_val(void);
+bool rgblight_is_enabled(void);
+HSV rgblight_get_hsv(void);
/* === qmk_firmware (core)internal Functions === */
void rgblight_init(void);
@@ -392,6 +430,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 40c9ce4980..7abdb87bc6 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_<name>
// _RGBM_<SINGLE|MULTI>_<STATIC|DYNAMIC>( <name> )
diff --git a/quantum/split_common/matrix.c b/quantum/split_common/matrix.c
index 95ee2433ad..5bad9db08f 100644
--- a/quantum/split_common/matrix.c
+++ b/quantum/split_common/matrix.c
@@ -61,17 +61,22 @@ static void init_pins(void) {
}
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;
+ // Start with a clear matrix row
+ matrix_row_t current_row_value = 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);
+ current_row_value |= readPin(pin) ? 0 : (MATRIX_ROW_SHIFTER << col_index);
}
}
- return (last_row_value != current_matrix[current_row]);
+ // If the row has changed, store the row and return the changed flag.
+ if (current_matrix[current_row] != current_row_value) {
+ current_matrix[current_row] = current_row_value;
+ return true;
+ }
+ return false;
}
#elif defined(DIODE_DIRECTION)
@@ -98,11 +103,8 @@ static void init_pins(void) {
}
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;
+ // Start with a clear matrix row
+ matrix_row_t current_row_value = 0;
// Select row and wait for row selecton to stabilize
select_row(current_row);
@@ -114,13 +116,18 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
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);
+ current_row_value |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index);
}
// Unselect row
unselect_row(current_row);
- return (last_row_value != current_matrix[current_row]);
+ // If the row has changed, store the row and return the changed flag.
+ if (current_matrix[current_row] != current_row_value) {
+ current_matrix[current_row] = current_row_value;
+ return true;
+ }
+ return false;
}
# elif (DIODE_DIRECTION == ROW2COL)
@@ -155,20 +162,22 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
// For each row...
for (uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) {
// Store last value of row prior to reading
- matrix_row_t last_row_value = current_matrix[row_index];
+ matrix_row_t last_row_value = current_matrix[row_index];
+ matrix_row_t current_row_value = last_row_value;
// 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);
+ current_row_value |= (MATRIX_ROW_SHIFTER << current_col);
} else {
// Pin HI, clear col bit
- current_matrix[row_index] &= ~(MATRIX_ROW_SHIFTER << current_col);
+ current_row_value &= ~(MATRIX_ROW_SHIFTER << current_col);
}
// Determine if the matrix changed state
- if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) {
- matrix_changed = true;
+ if ((last_row_value != current_row_value)) {
+ matrix_changed |= true;
+ current_matrix[row_index] = current_row_value;
}
}
diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c
index fb6a3b85af..dfd06f5f94 100644
--- a/quantum/split_common/split_util.c
+++ b/quantum/split_common/split_util.c
@@ -6,6 +6,14 @@
#include "transport.h"
#include "quantum.h"
+#ifdef PROTOCOL_LUFA
+# include <LUFA/Drivers/USB/USB.h>
+#endif
+
+#ifdef PROTOCOL_VUSB
+# include "usbdrv.h"
+#endif
+
#ifdef EE_HANDS
# include "eeconfig.h"
#endif
@@ -22,30 +30,54 @@
# define SPLIT_USB_TIMEOUT_POLL 10
#endif
+#ifdef PROTOCOL_CHIBIOS
+# define SPLIT_USB_DETECT // Force this on for now
+#endif
+
volatile bool isLeftHand = true;
-bool waitForUsb(void) {
+#if defined(SPLIT_USB_DETECT)
+# if defined(PROTOCOL_LUFA)
+static inline bool usbHasActiveConnection(void) { return USB_Device_IsAddressSet(); }
+static inline void usbDisable(void) { USB_Disable(); }
+# elif defined(PROTOCOL_CHIBIOS)
+static inline bool usbHasActiveConnection(void) { return usbGetDriverStateI(&USBD1) == USB_ACTIVE; }
+static inline void usbDisable(void) { usbStop(&USBD1); }
+# elif defined(PROTOCOL_VUSB)
+static inline bool usbHasActiveConnection(void) {
+ usbPoll();
+ return usbConfiguration;
+}
+static inline void usbDisable(void) { usbDeviceDisconnect(); }
+# else
+static inline bool usbHasActiveConnection(void) { return true; }
+static inline void usbDisable(void) {}
+# endif
+
+bool usbIsActive(void) {
for (uint8_t i = 0; i < (SPLIT_USB_TIMEOUT / SPLIT_USB_TIMEOUT_POLL); i++) {
// This will return true if a USB connection has been established
-#if defined(__AVR__)
- if (UDADDR & _BV(ADDEN)) {
-#else
- if (usbGetDriverStateI(&USBD1) == USB_ACTIVE) {
-#endif
+ if (usbHasActiveConnection()) {
return true;
}
wait_ms(SPLIT_USB_TIMEOUT_POLL);
}
// Avoid NO_USB_STARTUP_CHECK - Disable USB as the previous checks seem to enable it somehow
-#if defined(__AVR__)
- (USBCON &= ~(_BV(USBE) | _BV(OTGPADE)));
-#else
- usbStop(&USBD1);
-#endif
+ usbDisable();
return false;
}
+#elif defined(PROTOCOL_LUFA)
+static inline bool usbIsActive(void) {
+ USB_OTGPAD_On(); // enables VBUS pad
+ wait_us(5);
+
+ return USB_VBUS_GetStatus(); // checks state of VBUS
+}
+#else
+static inline bool usbIsActive(void) { return true; }
+#endif
__attribute__((weak)) bool is_keyboard_left(void) {
#if defined(SPLIT_HAND_PIN)
@@ -66,16 +98,7 @@ __attribute__((weak)) bool is_keyboard_master(void) {
// only check once, as this is called often
if (usbstate == UNKNOWN) {
-#if defined(SPLIT_USB_DETECT) || defined(PROTOCOL_CHIBIOS)
- usbstate = waitForUsb() ? MASTER : SLAVE;
-#elif defined(__AVR__)
- USBCON |= (1 << OTGPADE); // enables VBUS pad
- wait_us(5);
-
- usbstate = (USBSTA & (1 << VBUS)) ? MASTER : SLAVE; // checks state of VBUS
-#else
- usbstate = MASTER;
-#endif
+ usbstate = usbIsActive() ? MASTER : SLAVE;
}
return (usbstate == MASTER);
diff --git a/quantum/stm32/halconf.h b/quantum/stm32/halconf.h
index 533803a25f..b6c7b392ca 100644
--- a/quantum/stm32/halconf.h
+++ b/quantum/stm32/halconf.h
@@ -203,7 +203,7 @@
* @note Disabling this option saves both code and data space.
*/
# if !defined(PAL_USE_CALLBACKS) || defined(__DOXYGEN__)
-# define PAL_USE_CALLBACKS FALSE
+# define PAL_USE_CALLBACKS TRUE
# endif
/**
@@ -211,7 +211,7 @@
* @note Disabling this option saves both code and data space.
*/
# if !defined(PAL_USE_WAIT) || defined(__DOXYGEN__)
-# define PAL_USE_WAIT FALSE
+# define PAL_USE_WAIT TRUE
# endif
/*===========================================================================*/
diff --git a/quantum/template/ps2avrgb/rules.mk b/quantum/template/ps2avrgb/rules.mk
index b9b81a6750..9e18b33827 100644
--- a/quantum/template/ps2avrgb/rules.mk
+++ b/quantum/template/ps2avrgb/rules.mk
@@ -22,5 +22,3 @@ COMMAND_ENABLE = yes # Commands for debug and configuration
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
WS2812_DRIVER = i2c
-
-OPT_DEFS = -DDEBUG_LEVEL=0
diff --git a/tmk_core/avr.mk b/tmk_core/avr.mk
index f5c1257712..04ae162246 100644
--- a/tmk_core/avr.mk
+++ b/tmk_core/avr.mk
@@ -156,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 \
diff --git a/tmk_core/chibios.mk b/tmk_core/chibios.mk
index 6bacabbbf3..09aaddeef0 100644
--- a/tmk_core/chibios.mk
+++ b/tmk_core/chibios.mk
@@ -220,6 +220,18 @@ COMPILEFLAGS += -fno-common
COMPILEFLAGS += -fshort-wchar
COMPILEFLAGS += $(THUMBFLAGS)
+# FPU options default (Cortex-M4 and Cortex-M7 single precision).
+USE_FPU_OPT ?= -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fsingle-precision-constant
+
+# FPU-related options
+USE_FPU ?= no
+ifneq ($(USE_FPU),no)
+ COMPILEFLAGS += $(USE_FPU_OPT)
+ OPT_DEFS += -DCORTEX_USE_FPU=TRUE
+else
+ OPT_DEFS += -DCORTEX_USE_FPU=FALSE
+endif
+
CFLAGS += $(COMPILEFLAGS)
ASFLAGS += $(THUMBFLAGS)
@@ -233,7 +245,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
@@ -242,22 +253,6 @@ OPT_DEFS += -DPORT_IGNORE_GCC_VERSION_CHECK=1
MCUFLAGS = -mcpu=$(MCU)
-# FPU options default (Cortex-M4 and Cortex-M7 single precision).
-ifeq ($(USE_FPU_OPT),)
- USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -fsingle-precision-constant
-endif
-
-# FPU-related options
-ifeq ($(USE_FPU),)
- USE_FPU = no
-endif
-ifneq ($(USE_FPU),no)
- OPT += $(USE_FPU_OPT)
- OPT_DEFS += -DCORTEX_USE_FPU=TRUE
-else
- OPT_DEFS += -DCORTEX_USE_FPU=FALSE
-endif
-
DEBUG = gdb
DFU_ARGS ?=
diff --git a/tmk_core/common.mk b/tmk_core/common.mk
index 3d0b83a01c..63de7c7ede 100644
--- a/tmk_core/common.mk
+++ b/tmk_core/common.mk
@@ -1,3 +1,5 @@
+PRINTF_PATH = $(LIB_PATH)/printf
+
COMMON_DIR = common
PLATFORM_COMMON_DIR = $(COMMON_DIR)/$(PLATFORM_KEY)
@@ -10,6 +12,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 \
@@ -20,7 +23,12 @@ TMK_COMMON_SRC += $(COMMON_DIR)/host.c \
ifeq ($(PLATFORM),AVR)
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/xprintf.S
else ifeq ($(PLATFORM),CHIBIOS)
- TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c
+ TMK_COMMON_SRC += $(PRINTF_PATH)/printf.c
+ TMK_COMMON_DEFS += -DPRINTF_DISABLE_SUPPORT_FLOAT
+ TMK_COMMON_DEFS += -DPRINTF_DISABLE_SUPPORT_EXPONENTIAL
+ TMK_COMMON_DEFS += -DPRINTF_DISABLE_SUPPORT_LONG_LONG
+ TMK_COMMON_DEFS += -DPRINTF_DISABLE_SUPPORT_PTRDIFF_T
+ VPATH += $(PRINTF_PATH)
else ifeq ($(PLATFORM),ARM_ATSAM)
TMK_COMMON_SRC += $(PLATFORM_COMMON_DIR)/printf.c
endif
diff --git a/tmk_core/common/action.c b/tmk_core/common/action.c
index e5e9e27052..909b9c39c9 100644
--- a/tmk_core/common/action.c
+++ b/tmk_core/common/action.c
@@ -48,7 +48,7 @@ int retro_tapping_counter = 0;
#endif
#ifdef IGNORE_MOD_TAP_INTERRUPT_PER_KEY
-__attribute__((weak)) bool get_ignore_mod_tap_interrupt(uint16_t keycode) { return false; }
+__attribute__((weak)) bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) { return false; }
#endif
#ifndef TAP_CODE_DELAY
@@ -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
@@ -165,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;
@@ -224,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();
}
@@ -324,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, false)) &&
+ !get_ignore_mod_tap_interrupt(get_event_keycode(record->event, false), record) &&
# endif
record->tap.interrupted) {
dprint("mods_tap: tap: cancel: add_mods\n");
@@ -593,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 */
@@ -681,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.
diff --git a/tmk_core/common/action_code.h b/tmk_core/common/action_code.h
index f80b7a782e..eea554ff21 100644
--- a/tmk_core/common/action_code.h
+++ b/tmk_core/common/action_code.h
@@ -294,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 81f86f0f34..af2d7d964b 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 c283d26232..16922c1ff9 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 <http://www.gnu.org/licenses/>.
#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
@@ -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 34f08d8904..fe545c79a0 100644
--- a/tmk_core/common/action_tapping.c
+++ b/tmk_core/common/action_tapping.c
@@ -19,10 +19,10 @@
# define IS_TAPPING_RELEASED() (IS_TAPPING() && !tapping_key.event.pressed)
# define IS_TAPPING_KEY(k) (IS_TAPPING() && KEYEQ(tapping_key.event.key, (k)))
-__attribute__((weak)) uint16_t get_tapping_term(uint16_t keycode) { return TAPPING_TERM; }
+__attribute__((weak)) uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) { 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, false)))
+# define WITHIN_TAPPING_TERM(e) (TIMER_DIFF_16(e.time, tapping_key.event.time) < get_tapping_term(get_event_keycode(tapping_key.event, false), &tapping_key))
# else
# define WITHIN_TAPPING_TERM(e) (TIMER_DIFF_16(e.time, tapping_key.event.time) < TAPPING_TERM)
# endif
@@ -122,7 +122,7 @@ 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, false)) >= 500) &&
+ (get_tapping_term(get_event_keycode(tapping_key.event, false), keyp) >= 500) &&
# endif
# ifdef PERMISSIVE_HOLD_PER_KEY
!get_permissive_hold(get_event_keycode(tapping_key.event, false), keyp) &&
diff --git a/tmk_core/common/action_tapping.h b/tmk_core/common/action_tapping.h
index 5eaef1c5f0..7015ce7612 100644
--- a/tmk_core/common/action_tapping.h
+++ b/tmk_core/common/action_tapping.h
@@ -33,7 +33,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef NO_ACTION_TAPPING
uint16_t get_event_keycode(keyevent_t event, bool update_layer_cache);
-uint16_t get_tapping_term(uint16_t keycode);
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record);
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 335aa36e62..371acfa610 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 1ce03ed0e4..5dd8393da4 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/chibios/printf.c b/tmk_core/common/chibios/printf.c
deleted file mode 100644
index a99752bb3d..0000000000
--- a/tmk_core/common/chibios/printf.c
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- * found at: http://www.sparetimelabs.com/tinyprintf/tinyprintf.php
- * and: http://www.sparetimelabs.com/printfrevisited/printfrevisited.php
- */
-
-/*
-File: printf.c
-
-Copyright (C) 2004 Kustaa Nyholm
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-*/
-
-#include "printf.h"
-
-typedef void (*putcf)(void*, char);
-static putcf stdout_putf;
-static void* stdout_putp;
-
-// this adds cca 400 bytes
-#define PRINTF_LONG_SUPPORT
-
-#ifdef PRINTF_LONG_SUPPORT
-
-static void uli2a(unsigned long int num, unsigned int base, int uc, char* bf) {
- int n = 0;
- unsigned int d = 1;
- while (num / d >= base) d *= base;
- while (d != 0) {
- int dgt = num / d;
- num %= d;
- d /= base;
- if (n || dgt > 0 || d == 0) {
- *bf++ = dgt + (dgt < 10 ? '0' : (uc ? 'A' : 'a') - 10);
- ++n;
- }
- }
- *bf = 0;
-}
-
-static void li2a(long num, char* bf) {
- if (num < 0) {
- num = -num;
- *bf++ = '-';
- }
- uli2a(num, 10, 0, bf);
-}
-
-#endif
-
-static void ui2a(unsigned int num, unsigned int base, int uc, char* bf) {
- int n = 0;
- unsigned int d = 1;
- while (num / d >= base) d *= base;
- while (d != 0) {
- int dgt = num / d;
- num %= d;
- d /= base;
- if (n || dgt > 0 || d == 0) {
- *bf++ = dgt + (dgt < 10 ? '0' : (uc ? 'A' : 'a') - 10);
- ++n;
- }
- }
- *bf = 0;
-}
-
-static void i2a(int num, char* bf) {
- if (num < 0) {
- num = -num;
- *bf++ = '-';
- }
- ui2a(num, 10, 0, bf);
-}
-
-static int a2d(char ch) {
- if (ch >= '0' && ch <= '9')
- return ch - '0';
- else if (ch >= 'a' && ch <= 'f')
- return ch - 'a' + 10;
- else if (ch >= 'A' && ch <= 'F')
- return ch - 'A' + 10;
- else
- return -1;
-}
-
-static char a2i(char ch, const char** src, int base, int* nump) {
- const char* p = *src;
- int num = 0;
- int digit;
- while ((digit = a2d(ch)) >= 0) {
- if (digit > base) break;
- num = num * base + digit;
- ch = *p++;
- }
- *src = p;
- *nump = num;
- return ch;
-}
-
-static void putchw(void* putp, putcf putf, int n, char z, char* bf) {
- char fc = z ? '0' : ' ';
- char ch;
- char* p = bf;
- while (*p++ && n > 0) n--;
- while (n-- > 0) putf(putp, fc);
- while ((ch = *bf++)) putf(putp, ch);
-}
-
-void tfp_format(void* putp, putcf putf, const char* fmt, va_list va) {
- // This used to handle max of 12, but binary support jumps this to at least 32
- char bf[36];
-
- char ch;
-
- while ((ch = *(fmt++))) {
- if (ch != '%')
- putf(putp, ch);
- else {
- char lz = 0;
-#ifdef PRINTF_LONG_SUPPORT
- char lng = 0;
-#endif
- int w = 0;
- ch = *(fmt++);
- if (ch == '0') {
- ch = *(fmt++);
- lz = 1;
- }
- if (ch >= '0' && ch <= '9') {
- ch = a2i(ch, &fmt, 10, &w);
- }
-#ifdef PRINTF_LONG_SUPPORT
- if (ch == 'l') {
- ch = *(fmt++);
- lng = 1;
- }
-#endif
- switch (ch) {
- case 0:
- goto abort;
- case 'u': {
-#ifdef PRINTF_LONG_SUPPORT
- if (lng)
- uli2a(va_arg(va, unsigned long int), 10, 0, bf);
- else
-#endif
- ui2a(va_arg(va, unsigned int), 10, 0, bf);
- putchw(putp, putf, w, lz, bf);
- break;
- }
- case 'd': {
-#ifdef PRINTF_LONG_SUPPORT
- if (lng)
- li2a(va_arg(va, unsigned long int), bf);
- else
-#endif
- i2a(va_arg(va, int), bf);
- putchw(putp, putf, w, lz, bf);
- break;
- }
- case 'x':
- case 'X':
-#ifdef PRINTF_LONG_SUPPORT
- if (lng)
- uli2a(va_arg(va, unsigned long int), 16, (ch == 'X'), bf);
- else
-#endif
- ui2a(va_arg(va, unsigned int), 16, (ch == 'X'), bf);
- putchw(putp, putf, w, lz, bf);
- break;
- case 'c':
- putf(putp, (char)(va_arg(va, int)));
- break;
- case 's':
- putchw(putp, putf, w, 0, va_arg(va, char*));
- break;
- case 'b':
-#ifdef PRINTF_LONG_SUPPORT
- if (lng)
- uli2a(va_arg(va, unsigned long int), 2, 0, bf);
- else
-#endif
- ui2a(va_arg(va, unsigned int), 2, 0, bf);
- putchw(putp, putf, w, lz, bf);
- break;
- case '%':
- putf(putp, ch);
- default:
- break;
- }
- }
- }
-abort:;
-}
-
-void init_printf(void* putp, void (*putf)(void*, char)) {
- stdout_putf = putf;
- stdout_putp = putp;
-}
-
-int tfp_printf(const char* fmt, ...) {
- va_list va;
- va_start(va, fmt);
- tfp_format(stdout_putp, stdout_putf, fmt, va);
- va_end(va);
-
- return 1;
-}
-
-static void putcp(void* p, char c) { *(*((char**)p))++ = c; }
-
-int tfp_sprintf(char* s, const char* fmt, ...) {
- va_list va;
- va_start(va, fmt);
- tfp_format(&s, putcp, fmt, va);
- putcp(&s, 0);
- va_end(va);
-
- return 1;
-}
diff --git a/tmk_core/common/chibios/printf.h b/tmk_core/common/chibios/printf.h
deleted file mode 100644
index 775459e1e8..0000000000
--- a/tmk_core/common/chibios/printf.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * found at: http://www.sparetimelabs.com/tinyprintf/tinyprintf.php
- * and: http://www.sparetimelabs.com/printfrevisited/printfrevisited.php
- */
-
-/*
-File: printf.h
-
-Copyright (C) 2004 Kustaa Nyholm
-
-This library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
-License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-See the GNU Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-This library is realy just two files: 'printf.h' and 'printf.c'.
-
-They provide a simple and small (+200 loc) printf functionality to
-be used in embedded systems.
-
-I've found them so usefull in debugging that I do not bother with a
-debugger at all.
-
-They are distributed in source form, so to use them, just compile them
-into your project.
-
-Two printf variants are provided: printf and sprintf.
-
-The formats supported by this implementation are: 'd' 'u' 'c' 's' 'x' 'X'.
-
-Zero padding and field width are also supported.
-
-If the library is compiled with 'PRINTF_SUPPORT_LONG' defined then the
-long specifier is also
-supported. Note that this will pull in some long math routines (pun intended!)
-and thus make your executable noticably longer.
-
-The memory foot print of course depends on the target cpu, compiler and
-compiler options, but a rough guestimate (based on a H8S target) is about
-1.4 kB for code and some twenty 'int's and 'char's, say 60 bytes of stack space.
-Not too bad. Your milage may vary. By hacking the source code you can
-get rid of some hunred bytes, I'm sure, but personally I feel the balance of
-functionality and flexibility versus code size is close to optimal for
-many embedded systems.
-
-To use the printf you need to supply your own character output function,
-something like :
-
- void putc ( void* p, char c)
- {
- while (!SERIAL_PORT_EMPTY) ;
- SERIAL_PORT_TX_REGISTER = c;
- }
-
-Before you can call printf you need to initialize it to use your
-character output function with something like:
-
- init_printf(NULL,putc);
-
-Notice the 'NULL' in 'init_printf' and the parameter 'void* p' in 'putc',
-the NULL (or any pointer) you pass into the 'init_printf' will eventually be
-passed to your 'putc' routine. This allows you to pass some storage space (or
-anything realy) to the character output function, if necessary.
-This is not often needed but it was implemented like that because it made
-implementing the sprintf function so neat (look at the source code).
-
-The code is re-entrant, except for the 'init_printf' function, so it
-is safe to call it from interupts too, although this may result in mixed output.
-If you rely on re-entrancy, take care that your 'putc' function is re-entrant!
-
-The printf and sprintf functions are actually macros that translate to
-'tfp_printf' and 'tfp_sprintf'. This makes it possible
-to use them along with 'stdio.h' printf's in a single source file.
-You just need to undef the names before you include the 'stdio.h'.
-Note that these are not function like macros, so if you have variables
-or struct members with these names, things will explode in your face.
-Without variadic macros this is the best we can do to wrap these
-fucnction. If it is a problem just give up the macros and use the
-functions directly or rename them.
-
-For further details see source code.
-
-regs Kusti, 23.10.2004
-*/
-
-#ifndef __TFP_PRINTF__
-#define __TFP_PRINTF__
-
-#include <stdarg.h>
-
-void init_printf(void* putp, void (*putf)(void*, char));
-
-int tfp_printf(const char* fmt, ...);
-int tfp_sprintf(char* s, const char* fmt, ...);
-
-void tfp_format(void* putp, void (*putf)(void*, char), const char* fmt, va_list va);
-
-#define printf tfp_printf
-#define sprintf tfp_sprintf
-
-#endif
diff --git a/tmk_core/common/command.c b/tmk_core/common/command.c
index 77a205eac4..3cfcba3058 100644
--- a/tmk_core/common/command.c
+++ b/tmk_core/common/command.c
@@ -39,14 +39,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# include "backlight.h"
#endif
-#ifdef MOUSEKEY_ENABLE
+#if defined(MOUSEKEY_ENABLE) && !defined(MK_3_SPEED)
# include "mousekey.h"
#endif
-#ifdef PROTOCOL_VUSB
-# include "usbdrv.h"
-#endif
-
#ifdef AUDIO_ENABLE
# include "audio.h"
#endif /* AUDIO_ENABLE */
@@ -57,7 +53,7 @@ static void print_version(void);
static void print_status(void);
static bool command_console(uint8_t code);
static void command_console_help(void);
-#ifdef MOUSEKEY_ENABLE
+#if defined(MOUSEKEY_ENABLE) && !defined(MK_3_SPEED)
static bool mousekey_console(uint8_t code);
static void mousekey_console_help(void);
#endif
@@ -78,7 +74,7 @@ bool command_proc(uint8_t code) {
else
return (command_console_extra(code) || command_console(code));
break;
-#ifdef MOUSEKEY_ENABLE
+#if defined(MOUSEKEY_ENABLE) && !defined(MK_3_SPEED)
case MOUSEKEY:
mousekey_console(code);
break;
@@ -359,15 +355,8 @@ static bool command_common(uint8_t code) {
// jump to bootloader
case MAGIC_KC(MAGIC_KEY_BOOTLOADER):
case MAGIC_KC(MAGIC_KEY_BOOTLOADER_ALT):
- clear_keyboard(); // clear to prevent stuck keys
print("\n\nJumping to bootloader... ");
-#ifdef AUDIO_ENABLE
- stop_all_notes();
- shutdown_user();
-#else
- wait_ms(1000);
-#endif
- bootloader_jump(); // not return
+ reset_keyboard();
break;
// debug toggle
@@ -538,7 +527,7 @@ static bool command_console(uint8_t code) {
case KC_ESC:
command_state = ONESHOT;
return false;
-#ifdef MOUSEKEY_ENABLE
+#if defined(MOUSEKEY_ENABLE) && !defined(MK_3_SPEED)
case KC_M:
mousekey_console_help();
print("M> ");
@@ -553,7 +542,7 @@ static bool command_console(uint8_t code) {
return true;
}
-#ifdef MOUSEKEY_ENABLE
+#if defined(MOUSEKEY_ENABLE) && !defined(MK_3_SPEED)
/***********************************************************
* Mousekey console
***********************************************************/
diff --git a/tmk_core/common/keyboard.c b/tmk_core/common/keyboard.c
index 200b1e8722..714c3d048f 100644
--- a/tmk_core/common/keyboard.c
+++ b/tmk_core/common/keyboard.c
@@ -89,6 +89,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifdef VIA_ENABLE
# include "via.h"
#endif
+#ifdef DIP_SWITCH_ENABLE
+# include "dip_switch.h"
+#endif
// Only enable this if console is enabled to print to
#if defined(DEBUG_MATRIX_SCAN_RATE) && defined(CONSOLE_ENABLE)
@@ -216,6 +219,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
@@ -268,6 +278,10 @@ void keyboard_init(void) {
keymap_config.nkro = 1;
eeconfig_update_keymap(keymap_config.raw);
#endif
+#ifdef DIP_SWITCH_ENABLE
+ dip_switch_init();
+#endif
+
keyboard_post_init_kb(); /* Always keep this last */
}
@@ -298,7 +312,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/print.h b/tmk_core/common/print.h
index 04ca558109..1c77236212 100644
--- a/tmk_core/common/print.h
+++ b/tmk_core/common/print.h
@@ -72,9 +72,7 @@ extern "C"
# elif defined(PROTOCOL_CHIBIOS) /* PROTOCOL_CHIBIOS */
-# ifndef TERMINAL_ENABLE
-# include "chibios/printf.h"
-# endif
+# include "printf.h" // lib/printf/printf.h
# ifdef USER_PRINT /* USER_PRINT */
@@ -89,7 +87,6 @@ extern "C"
# define uprintf printf
# else /* NORMAL PRINT */
-
// Create user & normal print defines
# define print(s) printf(s)
# define println(s) printf(s "\r\n")
diff --git a/tmk_core/common/report.h b/tmk_core/common/report.h
index 61ef6ea66c..c2b1b7c710 100644
--- a/tmk_core/common/report.h
+++ b/tmk_core/common/report.h
@@ -69,6 +69,8 @@ enum consumer_usages {
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,
diff --git a/tmk_core/common/sendchar_null.c b/tmk_core/common/sendchar_null.c
index f6cab1b9d1..fb67f70866 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 <http://www.gnu.org/licenses/>.
*/
#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/protocol/arm_atsam/led_matrix.c b/tmk_core/protocol/arm_atsam/led_matrix.c
index c078980d68..4b8cc7c5e1 100644
--- a/tmk_core/protocol/arm_atsam/led_matrix.c
+++ b/tmk_core/protocol/arm_atsam/led_matrix.c
@@ -270,7 +270,7 @@ void flush(void) {
}
// This should only be performed once per frame
- pomod = (float)((g_rgb_counters.tick / 10) % (uint32_t)(1000.0f / led_animation_speed)) / 10.0f * led_animation_speed;
+ pomod = (float)((g_rgb_timer / 10) % (uint32_t)(1000.0f / led_animation_speed)) / 10.0f * led_animation_speed;
pomod *= 100.0f;
pomod = (uint32_t)pomod % 10000;
pomod /= 100.0f;
@@ -326,7 +326,7 @@ const rgb_matrix_driver_t rgb_matrix_driver = {.init = init, .flush = flush, .se
==============================================================================*/
#ifdef USE_MASSDROP_CONFIGURATOR
-// Ported from Massdrop QMK Github Repo
+// Ported from Massdrop QMK GitHub Repo
// TODO?: wire these up to keymap.c
uint8_t led_animation_orientation = 0;
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 3e9fbfdbed..9ea4addcfc 100644
--- a/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c
+++ b/tmk_core/protocol/arm_atsam/usb/udi_hid_kbd.c
@@ -55,6 +55,7 @@
#include "udi_hid_kbd.h"
#include <string.h>
#include "report.h"
+#include "usb_descriptor_common.h"
//***************************************************************************
// KBD
@@ -641,8 +642,8 @@ 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)
- 0x09, 0x61, // Usage (Vendor Defined)
+ 0x06, RAW_USAGE_PAGE_LO, RAW_USAGE_PAGE_HI, // Usage Page (Vendor Defined)
+ 0x09, RAW_USAGE_ID, // Usage (Vendor Defined)
0xA1, 0x01, // Collection (Application)
0x75, 0x08, // Report Size (8)
0x15, 0x00, // Logical Minimum (0)
diff --git a/tmk_core/protocol/bluefruit.mk b/tmk_core/protocol/bluefruit.mk
deleted file mode 100644
index 13a0693c57..0000000000
--- 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 fb001855ea..0000000000
--- 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 <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
-*/
-
-#include <stdint.h>
-#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 7b636abb95..0000000000
--- 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 <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
-*/
-
-#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 aca46206d5..0000000000
--- 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 <wakojun@gmail.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 <http://www.gnu.org/licenses/>.
-*/
-
-#include <stdint.h>
-#include <avr/interrupt.h>
-#include <avr/wdt.h>
-#include <avr/sleep.h>
-#include <util/delay.h>
-#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/main.c b/tmk_core/protocol/chibios/main.c
index 61665eb6f4..7d32c16ed8 100644
--- a/tmk_core/protocol/chibios/main.c
+++ b/tmk_core/protocol/chibios/main.c
@@ -158,9 +158,6 @@ int main(void) {
/* Init USB */
init_usb_driver(&USB_DRIVER);
- /* init printf */
- init_printf(NULL, sendchar_pf);
-
#ifdef MIDI_ENABLE
setup_midi();
#endif
diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c
index ecc83d9ecc..65bd291bec 100644
--- a/tmk_core/protocol/chibios/usb_main.c
+++ b/tmk_core/protocol/chibios/usb_main.c
@@ -796,9 +796,8 @@ int8_t sendchar(uint8_t c) {
}
#endif /* CONSOLE_ENABLE */
-void sendchar_pf(void *p, char c) {
- (void)p;
- sendchar((uint8_t)c);
+void _putchar(char character) {
+ sendchar(character);
}
#ifdef RAW_ENABLE
diff --git a/tmk_core/protocol/chibios/usb_main.h b/tmk_core/protocol/chibios/usb_main.h
index 17041b4f2f..94baf9b35e 100644
--- a/tmk_core/protocol/chibios/usb_main.h
+++ b/tmk_core/protocol/chibios/usb_main.h
@@ -87,6 +87,4 @@ void console_flush_output(void);
#endif /* CONSOLE_ENABLE */
-void sendchar_pf(void *p, char c);
-
#endif /* _USB_MAIN_H_ */
diff --git a/tmk_core/protocol/ibm4704.c b/tmk_core/protocol/ibm4704.c
index fd8fc4dbd5..a19443976e 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/iwrap.mk b/tmk_core/protocol/iwrap.mk
index eeedd83af2..934235bd81 100644
--- a/tmk_core/protocol/iwrap.mk
+++ b/tmk_core/protocol/iwrap.mk
@@ -16,11 +16,17 @@ VPATH += $(TMK_DIR)/protocol/iwrap
# V-USB
#
VUSB_DIR = protocol/vusb
-OPT_DEFS += -DPROTOCOL_VUSB
-SRC += $(VUSB_DIR)/vusb.c \
- $(VUSB_DIR)/usbdrv/usbdrv.c \
- $(VUSB_DIR)/usbdrv/usbdrvasm.S \
- $(VUSB_DIR)/usbdrv/oddebug.c
-VPATH += $(TMK_DIR)/protocol/vusb:$(TMK_DIR)/protocol/vusb/usbdrv
+# Path to the V-USB library
+VUSB_PATH = $(LIB_PATH)/vusb
+
+SRC += $(VUSB_DIR)/vusb.c \
+ $(VUSB_PATH)/usbdrv/usbdrv.c \
+ $(VUSB_PATH)/usbdrv/usbdrvasm.S \
+ $(VUSB_PATH)/usbdrv/oddebug.c
+# Search Path
+VPATH += $(TMK_PATH)/$(VUSB_DIR)
+VPATH += $(VUSB_PATH)
+
+OPT_DEFS += -DPROTOCOL_VUSB
diff --git a/tmk_core/protocol/iwrap/main.c b/tmk_core/protocol/iwrap/main.c
index 6e9b5455b1..4048a9791d 100644
--- a/tmk_core/protocol/iwrap/main.c
+++ b/tmk_core/protocol/iwrap/main.c
@@ -29,7 +29,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "iwrap.h"
#ifdef PROTOCOL_VUSB
# include "vusb.h"
-# include "usbdrv.h"
+# include <usbdrv/usbdrv.h>
#endif
#include "uart.h"
#include "suart.h"
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index d673841fd5..374add20f9 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/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c
index f2b91b099e..8c71dd1dda 100644
--- a/tmk_core/protocol/usb_descriptor.c
+++ b/tmk_core/protocol/usb_descriptor.c
@@ -39,6 +39,7 @@
#include "util.h"
#include "report.h"
#include "usb_descriptor.h"
+#include "usb_descriptor_common.h"
// clang-format off
@@ -232,8 +233,8 @@ const USB_Descriptor_HIDReport_Datatype_t PROGMEM SharedReport[] = {
#ifdef RAW_ENABLE
const USB_Descriptor_HIDReport_Datatype_t PROGMEM RawReport[] = {
- HID_RI_USAGE_PAGE(16, 0xFF60), // Vendor Defined
- HID_RI_USAGE(8, 0x61), // Vendor Defined
+ HID_RI_USAGE_PAGE(16, RAW_USAGE_PAGE), // Vendor Defined
+ HID_RI_USAGE(8, RAW_USAGE_ID), // Vendor Defined
HID_RI_COLLECTION(8, 0x01), // Application
// Data to host
HID_RI_USAGE(8, 0x62), // Vendor Defined
diff --git a/tmk_core/protocol/usb_descriptor_common.h b/tmk_core/protocol/usb_descriptor_common.h
new file mode 100644
index 0000000000..b1f602c82e
--- /dev/null
+++ b/tmk_core/protocol/usb_descriptor_common.h
@@ -0,0 +1,31 @@
+/* Copyright 2020 Nick Brassel (tzarc)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+/////////////////////
+// RAW Usage page and ID configuration
+
+#ifndef RAW_USAGE_PAGE
+# define RAW_USAGE_PAGE 0xFF60
+#endif
+
+#ifndef RAW_USAGE_ID
+# define RAW_USAGE_ID 0x61
+#endif
+
+#define RAW_USAGE_PAGE_HI ((uint8_t)(RAW_USAGE_PAGE >> 8))
+#define RAW_USAGE_PAGE_LO ((uint8_t)(RAW_USAGE_PAGE & 0xFF))
diff --git a/tmk_core/protocol/vusb.mk b/tmk_core/protocol/vusb.mk
index 897b833e1a..5e564f7480 100644
--- a/tmk_core/protocol/vusb.mk
+++ b/tmk_core/protocol/vusb.mk
@@ -1,22 +1,23 @@
VUSB_DIR = protocol/vusb
-OPT_DEFS += -DPROTOCOL_VUSB
+# Path to the V-USB library
+VUSB_PATH = $(LIB_PATH)/vusb
-SRC += $(VUSB_DIR)/main.c \
+SRC += $(VUSB_DIR)/main.c \
$(VUSB_DIR)/vusb.c \
- $(VUSB_DIR)/usbdrv/usbdrv.c \
- $(VUSB_DIR)/usbdrv/usbdrvasm.S \
- $(VUSB_DIR)/usbdrv/oddebug.c
-
+ $(VUSB_PATH)/usbdrv/usbdrv.c \
+ $(VUSB_PATH)/usbdrv/usbdrvasm.S \
+ $(VUSB_PATH)/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)
-VPATH += $(TMK_PATH)/$(VUSB_DIR)/usbdrv
+VPATH += $(VUSB_PATH)
+
+OPT_DEFS += -DPROTOCOL_VUSB
diff --git a/tmk_core/protocol/vusb/main.c b/tmk_core/protocol/vusb/main.c
index 610638e7d4..b4063273da 100644
--- a/tmk_core/protocol/vusb/main.c
+++ b/tmk_core/protocol/vusb/main.c
@@ -12,8 +12,8 @@
#include <avr/wdt.h>
#include <avr/sleep.h>
#include <util/delay.h>
-#include "usbdrv.h"
-#include "oddebug.h"
+#include <usbdrv/usbdrv.h>
+#include <usbdrv/oddebug.h>
#include "vusb.h"
#include "keyboard.h"
#include "host.h"
@@ -21,12 +21,23 @@
#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;
@@ -39,10 +50,9 @@ static void initForUsbConnectivity(void) {
_delay_ms(1);
}
usbDeviceConnect();
- sei();
}
-void usb_remote_wakeup(void) {
+static void usb_remote_wakeup(void) {
cli();
int8_t ddr_orig = USBDDR;
@@ -59,6 +69,23 @@ void usb_remote_wakeup(void) {
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
@@ -76,8 +103,10 @@ 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
@@ -120,12 +149,13 @@ 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();
@@ -133,6 +163,13 @@ int main(void) {
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/sendchar_usart.c b/tmk_core/protocol/vusb/sendchar_usart.c
index 42bd9ee363..a920a9a536 100644
--- a/tmk_core/protocol/vusb/sendchar_usart.c
+++ b/tmk_core/protocol/vusb/sendchar_usart.c
@@ -3,7 +3,7 @@
* License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
*/
#include <stdint.h>
-#include "oddebug.h"
+#include <usbdrv/oddebug.h>
#include "sendchar.h"
#if DEBUG_LEVEL > 0
diff --git a/tmk_core/protocol/vusb/usbdrv/Changelog.txt b/tmk_core/protocol/vusb/usbdrv/Changelog.txt
deleted file mode 100644
index 1e74180a9e..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/Changelog.txt
+++ /dev/null
@@ -1,308 +0,0 @@
-This file documents changes in the firmware-only USB driver for atmel's AVR
-microcontrollers. New entries are always appended to the end of the file.
-Scroll down to the bottom to see the most recent changes.
-
-2005-04-01:
- - Implemented endpoint 1 as interrupt-in endpoint.
- - Moved all configuration options to usbconfig.h which is not part of the
- driver.
- - Changed interface for usbVendorSetup().
- - Fixed compatibility with ATMega8 device.
- - Various minor optimizations.
-
-2005-04-11:
- - Changed interface to application: Use usbFunctionSetup(), usbFunctionRead()
- and usbFunctionWrite() now. Added configuration options to choose which
- of these functions to compile in.
- - Assembler module delivers receive data non-inverted now.
- - Made register and bit names compatible with more AVR devices.
-
-2005-05-03:
- - Allow address of usbRxBuf on any memory page as long as the buffer does
- not cross 256 byte page boundaries.
- - Better device compatibility: works with Mega88 now.
- - Code optimization in debugging module.
- - Documentation updates.
-
-2006-01-02:
- - Added (free) default Vendor- and Product-IDs bought from voti.nl.
- - Added USBID-License.txt file which defines the rules for using the free
- shared VID/PID pair.
- - Added readme.txt to the usbdrv directory which clarifies administrative
- issues.
-
-2006-01-25:
- - Added "configured state" to become more standards compliant.
- - Added "HALT" state for interrupt endpoint.
- - Driver passes the "USB Command Verifier" test from usb.org now.
- - Made "serial number" a configuration option.
- - Minor optimizations, we now recommend compiler option "-Os" for best
- results.
- - Added a version number to usbdrv.h
-
-2006-02-03:
- - New configuration variable USB_BUFFER_SECTION for the memory section where
- the USB rx buffer will go. This defaults to ".bss" if not defined. Since
- this buffer MUST NOT cross 256 byte pages (not even touch a page at the
- end), the user may want to pass a linker option similar to
- "-Wl,--section-start=.mybuffer=0x800060".
- - Provide structure for usbRequest_t.
- - New defines for USB constants.
- - Prepared for HID implementations.
- - Increased data size limit for interrupt transfers to 8 bytes.
- - New macro usbInterruptIsReady() to query interrupt buffer state.
-
-2006-02-18:
- - Ensure that the data token which is sent as an ack to an OUT transfer is
- always zero sized. This fixes a bug where the host reports an error after
- sending an out transfer to the device, although all data arrived at the
- device.
- - Updated docs in usbdrv.h to reflect changed API in usbFunctionWrite().
-
-* Release 2006-02-20
-
- - Give a compiler warning when compiling with debugging turned on.
- - Added Oleg Semyonov's changes for IAR-cc compatibility.
- - Added new (optional) functions usbDeviceConnect() and usbDeviceDisconnect()
- (also thanks to Oleg!).
- - Rearranged tests in usbPoll() to save a couple of instructions in the most
- likely case that no actions are pending.
- - We need a delay between the SET ADDRESS request until the new address
- becomes active. This delay was handled in usbPoll() until now. Since the
- spec says that the delay must not exceed 2ms, previous versions required
- aggressive polling during the enumeration phase. We have now moved the
- handling of the delay into the interrupt routine.
- - We must not reply with NAK to a SETUP transaction. We can only achieve this
- by making sure that the rx buffer is empty when SETUP tokens are expected.
- We therefore don't pass zero sized data packets from the status phase of
- a transfer to usbPoll(). This change MAY cause troubles if you rely on
- receiving a less than 8 bytes long packet in usbFunctionWrite() to
- identify the end of a transfer. usbFunctionWrite() will NEVER be called
- with a zero length.
-
-* Release 2006-03-14
-
- - Improved IAR C support: tiny memory model, more devices
- - Added template usbconfig.h file under the name usbconfig-prototype.h
-
-* Release 2006-03-26
-
- - Added provision for one more interrupt-in endpoint (endpoint 3).
- - Added provision for one interrupt-out endpoint (endpoint 1).
- - Added flowcontrol macros for USB.
- - Added provision for custom configuration descriptor.
- - Allow ANY two port bits for D+ and D-.
- - Merged (optional) receive endpoint number into global usbRxToken variable.
- - Use USB_CFG_IOPORTNAME instead of USB_CFG_IOPORT. We now construct the
- variable name from the single port letter instead of computing the address
- of related ports from the output-port address.
-
-* Release 2006-06-26
-
- - Updated documentation in usbdrv.h and usbconfig-prototype.h to reflect the
- new features.
- - Removed "#warning" directives because IAR does not understand them. Use
- unused static variables instead to generate a warning.
- - Do not include <avr/io.h> when compiling with IAR.
- - Introduced USB_CFG_DESCR_PROPS_* in usbconfig.h to configure how each
- USB descriptor should be handled. It is now possible to provide descriptor
- data in Flash, RAM or dynamically at runtime.
- - STALL is now a status in usbTxLen* instead of a message. We can now conform
- to the spec and leave the stall status pending until it is cleared.
- - Made usbTxPacketCnt1 and usbTxPacketCnt3 public. This allows the
- application code to reset data toggling on interrupt pipes.
-
-* Release 2006-07-18
-
- - Added an #if !defined __ASSEMBLER__ to the warning in usbdrv.h. This fixes
- an assembler error.
- - usbDeviceDisconnect() takes pull-up resistor to high impedance now.
-
-* Release 2007-02-01
-
- - Merged in some code size improvements from usbtiny (thanks to Dick
- Streefland for these optimizations!)
- - Special alignment requirement for usbRxBuf not required any more. Thanks
- again to Dick Streefland for this hint!
- - Reverted to "#warning" instead of unused static variables -- new versions
- of IAR CC should handle this directive.
- - Changed Open Source license to GNU GPL v2 in order to make linking against
- other free libraries easier. We no longer require publication of the
- circuit diagrams, but we STRONGLY encourage it. If you improve the driver
- itself, PLEASE grant us a royalty free license to your changes for our
- commercial license.
-
-* Release 2007-03-29
-
- - New configuration option "USB_PUBLIC" in usbconfig.h.
- - Set USB version number to 1.10 instead of 1.01.
- - Code used USB_CFG_DESCR_PROPS_STRING_DEVICE and
- USB_CFG_DESCR_PROPS_STRING_PRODUCT inconsistently. Changed all occurrences
- to USB_CFG_DESCR_PROPS_STRING_PRODUCT.
- - New assembler module for 16.5 MHz RC oscillator clock with PLL in receiver
- code.
- - New assembler module for 16 MHz crystal.
- - usbdrvasm.S contains common code only, clock-specific parts have been moved
- to usbdrvasm12.S, usbdrvasm16.S and usbdrvasm165.S respectively.
-
-* Release 2007-06-25
-
- - 16 MHz module: Do SE0 check in stuffed bits as well.
-
-* Release 2007-07-07
-
- - Define hi8(x) for IAR compiler to limit result to 8 bits. This is necessary
- for negative values.
- - Added 15 MHz module contributed by V. Bosch.
- - Interrupt vector name can now be configured. This is useful if somebody
- wants to use a different hardware interrupt than INT0.
-
-* Release 2007-08-07
-
- - Moved handleIn3 routine in usbdrvasm16.S so that relative jump range is
- not exceeded.
- - More config options: USB_RX_USER_HOOK(), USB_INITIAL_DATATOKEN,
- USB_COUNT_SOF
- - USB_INTR_PENDING can now be a memory address, not just I/O
-
-* Release 2007-09-19
-
- - Split out common parts of assembler modules into separate include file
- - Made endpoint numbers configurable so that given interface definitions
- can be matched. See USB_CFG_EP3_NUMBER in usbconfig-prototype.h.
- - Store endpoint number for interrupt/bulk-out so that usbFunctionWriteOut()
- can handle any number of endpoints.
- - Define usbDeviceConnect() and usbDeviceDisconnect() even if no
- USB_CFG_PULLUP_IOPORTNAME is defined. Directly set D+ and D- to 0 in this
- case.
-
-* Release 2007-12-01
-
- - Optimize usbDeviceConnect() and usbDeviceDisconnect() for less code size
- when USB_CFG_PULLUP_IOPORTNAME is not defined.
-
-* Release 2007-12-13
-
- - Renamed all include-only assembler modules from *.S to *.inc so that
- people don't add them to their project sources.
- - Distribute leap bits in tx loop more evenly for 16 MHz module.
- - Use "macro" and "endm" instead of ".macro" and ".endm" for IAR
- - Avoid compiler warnings for constant expr range by casting some values in
- USB descriptors.
-
-* Release 2008-01-21
-
- - Fixed bug in 15 and 16 MHz module where the new address set with
- SET_ADDRESS was already accepted at the next NAK or ACK we send, not at
- the next data packet we send. This caused problems when the host polled
- too fast. Thanks to Alexander Neumann for his help and patience debugging
- this issue!
-
-* Release 2008-02-05
-
- - Fixed bug in 16.5 MHz module where a register was used in the interrupt
- handler before it was pushed. This bug was introduced with version
- 2007-09-19 when common parts were moved to a separate file.
- - Optimized CRC routine (thanks to Reimar Doeffinger).
-
-* Release 2008-02-16
-
- - Removed outdated IAR compatibility stuff (code sections).
- - Added hook macros for USB_RESET_HOOK() and USB_SET_ADDRESS_HOOK().
- - Added optional routine usbMeasureFrameLength() for calibration of the
- internal RC oscillator.
-
-* Release 2008-02-28
-
- - USB_INITIAL_DATATOKEN defaults to USBPID_DATA1 now, which means that we
- start with sending USBPID_DATA0.
- - Changed defaults in usbconfig-prototype.h
- - Added free USB VID/PID pair for MIDI class devices
- - Restructured AVR-USB as separate package, not part of PowerSwitch any more.
-
-* Release 2008-04-18
-
- - Restructured usbdrv.c so that it is easier to read and understand.
- - Better code optimization with gcc 4.
- - If a second interrupt in endpoint is enabled, also add it to config
- descriptor.
- - Added config option for long transfers (above 254 bytes), see
- USB_CFG_LONG_TRANSFERS in usbconfig.h.
- - Added 20 MHz module contributed by Jeroen Benschop.
-
-* Release 2008-05-13
-
- - Fixed bug in libs-host/hiddata.c function usbhidGetReport(): length
- was not incremented, pointer to length was incremented instead.
- - Added code to command line tool(s) which claims an interface. This code
- is disabled by default, but may be necessary on newer Linux kernels.
- - Added usbconfig.h option "USB_CFG_CHECK_DATA_TOGGLING".
- - New header "usbportability.h" prepares ports to other development
- environments.
- - Long transfers (above 254 bytes) did not work when usbFunctionRead() was
- used to supply the data. Fixed this bug. [Thanks to Alexander Neumann!]
- - In hiddata.c (example code for sending/receiving data over HID), use
- USB_RECIP_DEVICE instead of USB_RECIP_INTERFACE for control transfers so
- that we need not claim the interface.
- - in usbPoll() loop 20 times polling for RESET state instead of 10 times.
- This accounts for the higher clock rates we now support.
- - Added a module for 12.8 MHz RC oscillator with PLL in receiver loop.
- - Added hook to SOF code so that oscillator can be tuned to USB frame clock.
- - Added timeout to waitForJ loop. Helps preventing unexpected hangs.
- - Added example code for oscillator tuning to libs-device (thanks to
- Henrik Haftmann for the idea to this routine).
- - Implemented option USB_CFG_SUPPRESS_INTR_CODE.
-
-* Release 2008-10-22
-
- - Fixed libs-device/osctune.h: OSCCAL is memory address on ATMega88 and
- similar, not offset of 0x20 needs to be added.
- - Allow distribution under GPLv3 for those who have to link against other
- code distributed under GPLv3.
-
-* Release 2008-11-26
-
- - Removed libusb-win32 dependency for hid-data example in Makefile.windows.
- It was never required and confused many people.
- - Added extern uchar usbRxToken to usbdrv.h.
- - Integrated a module with CRC checks at 18 MHz by Lukas Schrittwieser.
-
-* Release 2009-03-23
-
- - Hid-mouse example used settings from hid-data example, fixed that.
- - Renamed project to V-USB due to a trademark issue with Atmel(r).
- - Changed CommercialLicense.txt and USBID-License.txt to make the
- background of USB ID registration clearer.
-
-* Release 2009-04-15
-
- - Changed CommercialLicense.txt to reflect the new range of PIDs from
- Jason Kotzin.
- - Removed USBID-License.txt in favor of USB-IDs-for-free.txt and
- USB-ID-FAQ.txt
- - Fixed a bug in the 12.8 MHz module: End Of Packet decection was made in
- the center between bit 0 and 1 of each byte. This is where the data lines
- are expected to change and the sampled data may therefore be nonsense.
- We therefore check EOP ONLY if bits 0 AND 1 have both been read as 0 on D-.
- - Fixed a bitstuffing problem in the 16 MHz module: If bit 6 was stuffed,
- the unstuffing code in the receiver routine was 1 cycle too long. If
- multiple bytes had the unstuffing in bit 6, the error summed up until the
- receiver was out of sync.
- - Included option for faster CRC routine.
- Thanks to Slawomir Fras (BoskiDialer) for this code!
- - Updated bits in Configuration Descriptor's bmAttributes according to
- USB 1.1 (in particular bit 7, it is a must-be-set bit now).
-
-* Release 2009-08-22
-
- - Moved first DBG1() after odDebugInit() in all examples.
- - Use vector INT0_vect instead of SIG_INTERRUPT0 if defined. This makes
- V-USB compatible with the new "p" suffix devices (e.g. ATMega328p).
- - USB_CFG_CLOCK_KHZ setting is now required in usbconfig.h (no default any
- more).
- - New option USB_CFG_DRIVER_FLASH_PAGE allows boot loaders on devices with
- more than 64 kB flash.
- - Built-in configuration descriptor allows custom definition for second
- endpoint now.
-
-* Release 2010-07-15
diff --git a/tmk_core/protocol/vusb/usbdrv/CommercialLicense.txt b/tmk_core/protocol/vusb/usbdrv/CommercialLicense.txt
deleted file mode 100644
index 11d07d9df0..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/CommercialLicense.txt
+++ /dev/null
@@ -1,166 +0,0 @@
-V-USB Driver Software License Agreement
-Version 2009-08-03
-
-THIS LICENSE AGREEMENT GRANTS YOU CERTAIN RIGHTS IN A SOFTWARE. YOU CAN
-ENTER INTO THIS AGREEMENT AND ACQUIRE THE RIGHTS OUTLINED BELOW BY PAYING
-THE AMOUNT ACCORDING TO SECTION 4 ("PAYMENT") TO OBJECTIVE DEVELOPMENT.
-
-
-1 DEFINITIONS
-
-1.1 "OBJECTIVE DEVELOPMENT" shall mean OBJECTIVE DEVELOPMENT Software GmbH,
-Grosse Schiffgasse 1A/7, 1020 Wien, AUSTRIA.
-
-1.2 "You" shall mean the Licensee.
-
-1.3 "V-USB" shall mean all files included in the package distributed under
-the name "vusb" by OBJECTIVE DEVELOPMENT (http://www.obdev.at/vusb/)
-unless otherwise noted. This includes the firmware-only USB device
-implementation for Atmel AVR microcontrollers, some simple device examples
-and host side software examples and libraries.
-
-
-2 LICENSE GRANTS
-
-2.1 Source Code. OBJECTIVE DEVELOPMENT shall furnish you with the source
-code of V-USB.
-
-2.2 Distribution and Use. OBJECTIVE DEVELOPMENT grants you the
-non-exclusive right to use, copy and distribute V-USB with your hardware
-product(s), restricted by the limitations in section 3 below.
-
-2.3 Modifications. OBJECTIVE DEVELOPMENT grants you the right to modify
-the source code and your copy of V-USB according to your needs.
-
-2.4 USB IDs. OBJECTIVE DEVELOPMENT furnishes you with one or two USB
-Product ID(s), sent to you in e-mail. These Product IDs are reserved
-exclusively for you. OBJECTIVE DEVELOPMENT has obtained USB Product ID
-ranges under the Vendor ID 5824 from Wouter van Ooijen (Van Ooijen
-Technische Informatica, www.voti.nl) and under the Vendor ID 8352 from
-Jason Kotzin (Clay Logic, www.claylogic.com). Both owners of the Vendor IDs
-have obtained these IDs from the USB Implementers Forum, Inc.
-(www.usb.org). OBJECTIVE DEVELOPMENT disclaims all liability which might
-arise from the assignment of USB IDs.
-
-2.5 USB Certification. Although not part of this agreement, we want to make
-it clear that you cannot become USB certified when you use V-USB or a USB
-Product ID assigned by OBJECTIVE DEVELOPMENT. AVR microcontrollers don't
-meet the electrical specifications required by the USB specification and
-the USB Implementers Forum certifies only members who bought a Vendor ID of
-their own.
-
-
-3 LICENSE RESTRICTIONS
-
-3.1 Number of Units. Only one of the following three definitions is
-applicable. Which one is determined by the amount you pay to OBJECTIVE
-DEVELOPMENT, see section 4 ("Payment") below.
-
-Hobby License: You may use V-USB according to section 2 above in no more
-than 5 hardware units. These units must not be sold for profit.
-
-Entry Level License: You may use V-USB according to section 2 above in no
-more than 150 hardware units.
-
-Professional License: You may use V-USB according to section 2 above in
-any number of hardware units, except for large scale production ("unlimited
-fair use"). Quantities below 10,000 units are not considered large scale
-production. If your reach quantities which are obviously large scale
-production, you must pay a license fee of 0.10 EUR per unit for all units
-above 10,000.
-
-3.2 Rental. You may not rent, lease, or lend V-USB or otherwise encumber
-any copy of V-USB, or any of the rights granted herein.
-
-3.3 Transfer. You may not transfer your rights under this Agreement to
-another party without OBJECTIVE DEVELOPMENT's prior written consent. If
-such consent is obtained, you may permanently transfer this License to
-another party. The recipient of such transfer must agree to all terms and
-conditions of this Agreement.
-
-3.4 Reservation of Rights. OBJECTIVE DEVELOPMENT retains all rights not
-expressly granted.
-
-3.5 Non-Exclusive Rights. Your license rights under this Agreement are
-non-exclusive.
-
-3.6 Third Party Rights. This Agreement cannot grant you rights controlled
-by third parties. In particular, you are not allowed to use the USB logo or
-other trademarks owned by the USB Implementers Forum, Inc. without their
-consent. Since such consent depends on USB certification, it should be
-noted that V-USB will not pass certification because it does not
-implement checksum verification and the microcontroller ports do not meet
-the electrical specifications.
-
-
-4 PAYMENT
-
-The payment amount depends on the variation of this agreement (according to
-section 3.1) into which you want to enter. Concrete prices are listed on
-OBJECTIVE DEVELOPMENT's web site, usually at
-http://www.obdev.at/vusb/license.html. You agree to pay the amount listed
-there to OBJECTIVE DEVELOPMENT or OBJECTIVE DEVELOPMENT's payment processor
-or reseller.
-
-
-5 COPYRIGHT AND OWNERSHIP
-
-V-USB is protected by copyright laws and international copyright
-treaties, as well as other intellectual property laws and treaties. V-USB
-is licensed, not sold.
-
-
-6 TERM AND TERMINATION
-
-6.1 Term. This Agreement shall continue indefinitely. However, OBJECTIVE
-DEVELOPMENT may terminate this Agreement and revoke the granted license and
-USB-IDs if you fail to comply with any of its terms and conditions.
-
-6.2 Survival of Terms. All provisions regarding secrecy, confidentiality
-and limitation of liability shall survive termination of this agreement.
-
-
-7 DISCLAIMER OF WARRANTY AND LIABILITY
-
-LIMITED WARRANTY. V-USB IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-KIND. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, OBJECTIVE
-DEVELOPMENT AND ITS SUPPLIERS HEREBY DISCLAIM ALL WARRANTIES, EITHER
-EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE, AND
-NON-INFRINGEMENT, WITH REGARD TO V-USB, AND THE PROVISION OF OR FAILURE
-TO PROVIDE SUPPORT SERVICES. THIS LIMITED WARRANTY GIVES YOU SPECIFIC LEGAL
-RIGHTS. YOU MAY HAVE OTHERS, WHICH VARY FROM STATE/JURISDICTION TO
-STATE/JURISDICTION.
-
-LIMITATION OF LIABILITY. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW,
-IN NO EVENT SHALL OBJECTIVE DEVELOPMENT OR ITS SUPPLIERS BE LIABLE FOR ANY
-SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER
-(INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS,
-BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY
-LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE V-USB OR THE
-PROVISION OF OR FAILURE TO PROVIDE SUPPORT SERVICES, EVEN IF OBJECTIVE
-DEVELOPMENT HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN ANY
-CASE, OBJECTIVE DEVELOPMENT'S ENTIRE LIABILITY UNDER ANY PROVISION OF THIS
-AGREEMENT SHALL BE LIMITED TO THE AMOUNT ACTUALLY PAID BY YOU FOR V-USB.
-
-
-8 MISCELLANEOUS TERMS
-
-8.1 Marketing. OBJECTIVE DEVELOPMENT has the right to mention for marketing
-purposes that you entered into this agreement.
-
-8.2 Entire Agreement. This document represents the entire agreement between
-OBJECTIVE DEVELOPMENT and you. It may only be modified in writing signed by
-an authorized representative of both, OBJECTIVE DEVELOPMENT and you.
-
-8.3 Severability. In case a provision of these terms and conditions should
-be or become partly or entirely invalid, ineffective, or not executable,
-the validity of all other provisions shall not be affected.
-
-8.4 Applicable Law. This agreement is governed by the laws of the Republic
-of Austria.
-
-8.5 Responsible Courts. The responsible courts in Vienna/Austria will have
-exclusive jurisdiction regarding all disputes in connection with this
-agreement.
-
diff --git a/tmk_core/protocol/vusb/usbdrv/License.txt b/tmk_core/protocol/vusb/usbdrv/License.txt
deleted file mode 100644
index ce4c3aed45..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/License.txt
+++ /dev/null
@@ -1,361 +0,0 @@
-OBJECTIVE DEVELOPMENT GmbH's V-USB driver software is distributed under the
-terms and conditions of the GNU GPL version 2 or the GNU GPL version 3. It is
-your choice whether you apply the terms of version 2 or version 3. The full
-text of GPLv2 is included below. In addition to the requirements in the GPL,
-we STRONGLY ENCOURAGE you to do the following:
-
-(1) Publish your entire project on a web site and drop us a note with the URL.
-Use the form at http://www.obdev.at/vusb/feedback.html for your submission.
-
-(2) Adhere to minimum publication standards. Please include AT LEAST:
- - a circuit diagram in PDF, PNG or GIF format
- - full source code for the host software
- - a readme.txt file in ASCII format which describes the purpose of the
- project and what can be found in which directories and which files
- - a reference to http://www.obdev.at/vusb/
-
-(3) If you improve the driver firmware itself, please give us a free license
-to your modifications for our commercial license offerings.
-
-
-
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/tmk_core/protocol/vusb/usbdrv/Readme.txt b/tmk_core/protocol/vusb/usbdrv/Readme.txt
deleted file mode 100644
index 3cff49f6fa..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/Readme.txt
+++ /dev/null
@@ -1,172 +0,0 @@
-This is the readme file to Objective Development's firmware-only USB driver
-for Atmel AVR microcontrollers. For more information please visit
-http://www.obdev.at/vusb/
-
-This directory contains the USB firmware only. Copy it as-is to your own
-project and add all .c and .S files to your project (these files are marked
-with an asterisk in the list below). Then copy usbconfig-prototype.h as
-usbconfig.h to your project and edit it according to your configuration.
-
-
-TECHNICAL DOCUMENTATION
-=======================
-The technical documentation (API) for the firmware driver is contained in the
-file "usbdrv.h". Please read all of it carefully! Configuration options are
-documented in "usbconfig-prototype.h".
-
-The driver consists of the following files:
- readme.txt ............. The file you are currently reading.
- Changelog.txt .......... Release notes for all versions of the driver.
- usbdrv.h ............... Driver interface definitions and technical docs.
-* usbdrv.c ............... High level language part of the driver. Link this
- module to your code!
-* usbdrvasm.S ............ Assembler part of the driver. This module is mostly
- a stub and includes one of the usbdrvasm*.S files
- depending on processor clock. Link this module to
- your code!
- usbdrvasm*.inc ......... Assembler routines for particular clock frequencies.
- Included by usbdrvasm.S, don't link it directly!
- asmcommon.inc .......... Common assembler routines. Included by
- usbdrvasm*.inc, don't link it directly!
- usbconfig-prototype.h .. Prototype for your own usbdrv.h file.
-* oddebug.c .............. Debug functions. Only used when DEBUG_LEVEL is
- defined to a value greater than 0. Link this module
- to your code!
- oddebug.h .............. Interface definitions of the debug module.
- usbportability.h ....... Header with compiler-dependent stuff.
- usbdrvasm.asm .......... Compatibility stub for IAR-C-compiler. Use this
- module instead of usbdrvasm.S when you assembler
- with IAR's tools.
- License.txt ............ Open Source license for this driver.
- CommercialLicense.txt .. Optional commercial license for this driver.
- USB-ID-FAQ.txt ......... General infos about USB Product- and Vendor-IDs.
- USB-IDs-for-free.txt ... List and terms of use for free shared PIDs.
-
-(*) ... These files should be linked to your project.
-
-
-CPU CORE CLOCK FREQUENCY
-========================
-We supply assembler modules for clock frequencies of 12 MHz, 12.8 MHz, 15 MHz,
-16 MHz, 16.5 MHz 18 MHz and 20 MHz. Other clock rates are not supported. The
-actual clock rate must be configured in usbconfig.h.
-
-12 MHz Clock
-This is the traditional clock rate of V-USB because it's the lowest clock
-rate where the timing constraints of the USB spec can be met.
-
-15 MHz Clock
-Similar to 12 MHz, but some NOPs inserted. On the other hand, the higher clock
-rate allows for some loops which make the resulting code size somewhat smaller
-than the 12 MHz version.
-
-16 MHz Clock
-This clock rate has been added for users of the Arduino board and other
-ready-made boards which come with a fixed 16 MHz crystal. It's also an option
-if you need the slightly higher clock rate for performance reasons. Since
-16 MHz is not divisible by the USB low speed bit clock of 1.5 MHz, the code
-is somewhat tricky and has to insert a leap cycle every third byte.
-
-12.8 MHz and 16.5 MHz Clock
-The assembler modules for these clock rates differ from the other modules
-because they have been built for an RC oscillator with only 1% precision. The
-receiver code inserts leap cycles to compensate for clock deviations. 1% is
-also the precision which can be achieved by calibrating the internal RC
-oscillator of the AVR. Please note that only AVRs with internal 64 MHz PLL
-oscillator can reach 16.5 MHz with the RC oscillator. This includes the very
-popular ATTiny25, ATTiny45, ATTiny85 series as well as the ATTiny26. Almost
-all AVRs can reach 12.8 MHz, although this is outside the specified range.
-
-See the EasyLogger example at http://www.obdev.at/vusb/easylogger.html for
-code which calibrates the RC oscillator based on the USB frame clock.
-
-18 MHz Clock
-This module is closer to the USB specification because it performs an on the
-fly CRC check for incoming packets. Packets with invalid checksum are
-discarded as required by the spec. If you also implement checks for data
-PID toggling on application level (see option USB_CFG_CHECK_DATA_TOGGLING
-in usbconfig.h for more info), this ensures data integrity. Due to the CRC
-tables and alignment requirements, this code is bigger than modules for other
-clock rates. To activate this module, you must define USB_CFG_CHECK_CRC to 1
-and USB_CFG_CLOCK_KHZ to 18000 in usbconfig.h.
-
-20 MHz Clock
-This module is for people who won't do it with less than the maximum. Since
-20 MHz is not divisible by the USB low speed bit clock of 1.5 MHz, the code
-uses similar tricks as the 16 MHz module to insert leap cycles.
-
-
-USB IDENTIFIERS
-===============
-Every USB device needs a vendor- and a product-identifier (VID and PID). VIDs
-are obtained from usb.org for a price of 1,500 USD. Once you have a VID, you
-can assign PIDs at will.
-
-Since an entry level cost of 1,500 USD is too high for most small companies
-and hobbyists, we provide some VID/PID pairs for free. See the file
-USB-IDs-for-free.txt for details.
-
-Objective Development also has some license offerings which include product
-IDs. See http://www.obdev.at/vusb/ for details.
-
-
-DEVELOPMENT SYSTEM
-==================
-This driver has been developed and optimized for the GNU compiler version 3
-and 4. We recommend that you use the GNU compiler suite because it is freely
-available. V-USB has also been ported to the IAR compiler and assembler. It
-has been tested with IAR 4.10B/W32 and 4.12A/W32 on an ATmega8 with the
-"small" and "tiny" memory model. Not every release is tested with IAR CC and
-the driver may therefore fail to compile with IAR. Please note that gcc is
-more efficient for usbdrv.c because this module has been deliberately
-optimized for gcc.
-
-Gcc version 3 produces smaller code than version 4 due to new optimizing
-capabilities which don't always improve things on 8 bit CPUs. The code size
-generated by gcc 4 can be reduced with the compiler options
--fno-move-loop-invariants, -fno-tree-scev-cprop and
--fno-inline-small-functions in addition to -Os. On devices with more than
-8k of flash memory, we also recommend the linker option --relax (written as
--Wl,--relax for gcc) to convert absolute calls into relative where possible.
-
-For more information about optimizing options see:
-
- http://www.tty1.net/blog/2008-04-29-avr-gcc-optimisations_en.html
-
-These optimizations are good for gcc 4.x. Version 3.x of gcc does not support
-most of these options and produces good code anyway.
-
-
-USING V-USB FOR FREE
-====================
-The AVR firmware driver is published under the GNU General Public License
-Version 2 (GPL2) and the GNU General Public License Version 3 (GPL3). It is
-your choice whether you apply the terms of version 2 or version 3.
-
-If you decide for the free GPL2 or GPL3, we STRONGLY ENCOURAGE you to do the
-following things IN ADDITION to the obligations from the GPL:
-
-(1) Publish your entire project on a web site and drop us a note with the URL.
-Use the form at http://www.obdev.at/vusb/feedback.html for your submission.
-If you don't have a web site, you can publish the project in obdev's
-documentation wiki at
-http://www.obdev.at/goto.php?t=vusb-wiki&p=hosted-projects.
-
-(2) Adhere to minimum publication standards. Please include AT LEAST:
- - a circuit diagram in PDF, PNG or GIF format
- - full source code for the host software
- - a readme.txt file in ASCII format which describes the purpose of the
- project and what can be found in which directories and which files
- - a reference to http://www.obdev.at/vusb/
-
-(3) If you improve the driver firmware itself, please give us a free license
-to your modifications for our commercial license offerings.
-
-
-COMMERCIAL LICENSES FOR V-USB
-=============================
-If you don't want to publish your source code under the terms of the GPL,
-you can simply pay money for V-USB. As an additional benefit you get
-USB PIDs for free, reserved exclusively to you. See the file
-"CommercialLicense.txt" for details.
-
diff --git a/tmk_core/protocol/vusb/usbdrv/USB-ID-FAQ.txt b/tmk_core/protocol/vusb/usbdrv/USB-ID-FAQ.txt
deleted file mode 100644
index d1de8fb618..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/USB-ID-FAQ.txt
+++ /dev/null
@@ -1,149 +0,0 @@
-Version 2009-08-22
-
-==========================
-WHY DO WE NEED THESE IDs?
-==========================
-
-USB is more than a low level protocol for data transport. It also defines a
-common set of requests which must be understood by all devices. And as part
-of these common requests, the specification defines data structures, the
-USB Descriptors, which are used to describe the properties of the device.
-
-From the perspective of an operating system, it is therefore possible to find
-out basic properties of a device (such as e.g. the manufacturer and the name
-of the device) without a device-specific driver. This is essential because
-the operating system can choose a driver to load based on this information
-(Plug-And-Play).
-
-Among the most important properties in the Device Descriptor are the USB
-Vendor- and Product-ID. Both are 16 bit integers. The most simple form of
-driver matching is based on these IDs. The driver announces the Vendor- and
-Product-IDs of the devices it can handle and the operating system loads the
-appropriate driver when the device is connected.
-
-It is obvious that this technique only works if the pair Vendor- plus
-Product-ID is unique: Only devices which require the same driver can have the
-same pair of IDs.
-
-
-=====================================================
-HOW DOES THE USB STANDARD ENSURE THAT IDs ARE UNIQUE?
-=====================================================
-
-Since it is so important that USB IDs are unique, the USB Implementers Forum,
-Inc. (usb.org) needs a way to enforce this legally. It is not forbidden by
-law to build a device and assign it any random numbers as IDs. Usb.org
-therefore needs an agreement to regulate the use of USB IDs. The agreement
-binds only parties who agreed to it, of course. Everybody else is free to use
-any numbers for their IDs.
-
-So how can usb.org ensure that every manufacturer of USB devices enters into
-an agreement with them? They do it via trademark licensing. Usb.org has
-registered the trademark "USB", all associated logos and related terms. If
-you want to put an USB logo on your product or claim that it is USB
-compliant, you must license these trademarks from usb.org. And this is where
-you enter into an agreement. See the "USB-IF Trademark License Agreement and
-Usage Guidelines for the USB-IF Logo" at
-http://www.usb.org/developers/logo_license/.
-
-Licensing the USB trademarks requires that you buy a USB Vendor-ID from
-usb.org (one-time fee of ca. 2,000 USD), that you become a member of usb.org
-(yearly fee of ca. 4,000 USD) and that you meet all the technical
-specifications from the USB spec.
-
-This means that most hobbyists and small companies will never be able to
-become USB compliant, just because membership is so expensive. And you can't
-be compliant with a driver based on V-USB anyway, because the AVR's port pins
-don't meet the electrical specifications for USB. So, in principle, all
-hobbyists and small companies are free to choose any random numbers for their
-IDs. They have nothing to lose...
-
-There is one exception worth noting, though: If you use a sub-component which
-implements USB, the vendor of the sub-components may guarantee USB
-compliance. This might apply to some or all of FTDI's solutions.
-
-
-=======================================================================
-WHY SHOULD YOU OBTAIN USB IDs EVEN IF YOU DON'T LICENSE USB TRADEMARKS?
-=======================================================================
-
-You have learned in the previous section that you are free to choose any
-numbers for your IDs anyway. So why not do exactly this? There is still the
-technical issue. If you choose IDs which are already in use by somebody else,
-operating systems will load the wrong drivers and your device won't work.
-Even if you choose IDs which are not currently in use, they may be in use in
-the next version of the operating system or even after an automatic update.
-
-So what you need is a pair of Vendor- and Product-IDs for which you have the
-guarantee that no USB compliant product uses them. This implies that no
-operating system will ever ship with drivers responsible for these IDs.
-
-
-==============================================
-HOW DOES OBJECTIVE DEVELOPMENT HANDLE USB IDs?
-==============================================
-
-Objective Development gives away pairs of USB-IDs with their V-USB licenses.
-In order to ensure that these IDs are unique, Objective Development has an
-agreement with the company/person who has bought the USB Vendor-ID from
-usb.org. This agreement ensures that a range of USB Product-IDs is reserved
-for assignment by Objective Development and that the owner of the Vendor-ID
-won't give it to anybody else.
-
-This means that you have to trust three parties to ensure uniqueness of
-your IDs:
-
- - Objective Development, that they don't give the same PID to more than
- one person.
- - The owner of the Vendor-ID that they don't assign PIDs from the range
- assigned to Objective Development to anybody else.
- - Usb.org that they don't assign the same Vendor-ID a second time.
-
-
-==================================
-WHO IS THE OWNER OF THE VENDOR-ID?
-==================================
-
-Objective Development has obtained ranges of USB Product-IDs under two
-Vendor-IDs: Under Vendor-ID 5824 from Wouter van Ooijen (Van Ooijen
-Technische Informatica, www.voti.nl) and under Vendor-ID 8352 from Jason
-Kotzin (Clay Logic, www.claylogic.com). Both VID owners have received their
-Vendor-ID directly from usb.org.
-
-
-=========================================================================
-CAN I USE USB-IDs FROM OBJECTIVE DEVELOPMENT WITH OTHER DRIVERS/HARDWARE?
-=========================================================================
-
-The short answer is: Yes. All you get is a guarantee that the IDs are never
-assigned to anybody else. What more do you need?
-
-
-============================
-WHAT ABOUT SHARED ID PAIRS?
-============================
-
-Objective Development has reserved some PID/VID pairs for shared use. You
-have no guarantee of uniqueness for them, except that no USB compliant device
-uses them. In order to avoid technical problems, we must ensure that all
-devices with the same pair of IDs use the same driver on kernel level. For
-details, see the file USB-IDs-for-free.txt.
-
-
-======================================================
-I HAVE HEARD THAT SUB-LICENSING OF USB-IDs IS ILLEGAL?
-======================================================
-
-A 16 bit integer number cannot be protected by copyright laws. It is not
-sufficiently complex. And since none of the parties involved entered into the
-USB-IF Trademark License Agreement, we are not bound by this agreement. So
-there is no reason why it should be illegal to sub-license USB-IDs.
-
-
-=============================================
-WHO IS LIABLE IF THERE ARE INCOMPATIBILITIES?
-=============================================
-
-Objective Development disclaims all liabilities which might arise from the
-assignment of IDs. If you guarantee product features to your customers
-without proper disclaimer, YOU are liable for that.
diff --git a/tmk_core/protocol/vusb/usbdrv/USB-IDs-for-free.txt b/tmk_core/protocol/vusb/usbdrv/USB-IDs-for-free.txt
deleted file mode 100644
index 2f4d59ad18..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/USB-IDs-for-free.txt
+++ /dev/null
@@ -1,148 +0,0 @@
-Version 2009-08-22
-
-===========================
-FREE USB-IDs FOR SHARED USE
-===========================
-
-Objective Development has reserved a set of USB Product-IDs for use according
-to the guidelines outlined below. For more information about the concept of
-USB IDs please see the file USB-ID-FAQ.txt. Objective Development guarantees
-that the IDs listed below are not used by any USB compliant devices.
-
-
-====================
-MECHANISM OF SHARING
-====================
-
-From a technical point of view, two different devices can share the same USB
-Vendor- and Product-ID if they require the same driver on operating system
-level. We make use of this fact by assigning separate IDs for various device
-classes. On application layer, devices must be distinguished by their textual
-name or serial number. We offer separate sets of IDs for discrimination by
-textual name and for serial number.
-
-Examples for shared use of USB IDs are included with V-USB in the "examples"
-subdirectory.
-
-
-======================================
-IDs FOR DISCRIMINATION BY TEXTUAL NAME
-======================================
-
-If you use one of the IDs listed below, your device and host-side software
-must conform to these rules:
-
-(1) The USB device MUST provide a textual representation of the manufacturer
-and product identification. The manufacturer identification MUST be available
-at least in USB language 0x0409 (English/US).
-
-(2) The textual manufacturer identification MUST contain either an Internet
-domain name (e.g. "mycompany.com") registered and owned by you, or an e-mail
-address under your control (e.g. "myname@gmx.net"). You can embed the domain
-name or e-mail address in any string you like, e.g. "Objective Development
-http://www.obdev.at/vusb/".
-
-(3) You are responsible for retaining ownership of the domain or e-mail
-address for as long as any of your products are in use.
-
-(4) You may choose any string for the textual product identification, as long
-as this string is unique within the scope of your textual manufacturer
-identification.
-
-(5) Application side device look-up MUST be based on the textual manufacturer
-and product identification in addition to VID/PID matching. The driver
-matching MUST be a comparison of the entire strings, NOT a sub-string match.
-
-(6) For devices which implement a particular USB device class (e.g. HID), the
-operating system's default class driver MUST be used. If an operating system
-driver for Vendor Class devices is needed, this driver must be libusb or
-libusb-win32 (see http://libusb.org/ and
-http://libusb-win32.sourceforge.net/).
-
-Table if IDs for discrimination by textual name:
-
-PID dec (hex) | VID dec (hex) | Description of use
-==============+===============+============================================
-1500 (0x05dc) | 5824 (0x16c0) | For Vendor Class devices with libusb
---------------+---------------+--------------------------------------------
-1503 (0x05df) | 5824 (0x16c0) | For generic HID class devices (which are
- | | NOT mice, keyboards or joysticks)
---------------+---------------+--------------------------------------------
-1505 (0x05e1) | 5824 (0x16c0) | For CDC-ACM class devices (modems)
---------------+---------------+--------------------------------------------
-1508 (0x05e4) | 5824 (0x16c0) | For MIDI class devices
---------------+---------------+--------------------------------------------
-
-Note that Windows caches the textual product- and vendor-description for
-mice, keyboards and joysticks. Name-bsed discrimination is therefore not
-recommended for these device classes.
-
-
-=======================================
-IDs FOR DISCRIMINATION BY SERIAL NUMBER
-=======================================
-
-If you use one of the IDs listed below, your device and host-side software
-must conform to these rules:
-
-(1) The USB device MUST provide a textual representation of the serial
-number. The serial number string MUST be available at least in USB language
-0x0409 (English/US).
-
-(2) The serial number MUST start with either an Internet domain name (e.g.
-"mycompany.com") registered and owned by you, or an e-mail address under your
-control (e.g. "myname@gmx.net"), both terminated with a colon (":") character.
-You MAY append any string you like for further discrimination of your devices.
-
-(3) You are responsible for retaining ownership of the domain or e-mail
-address for as long as any of your products are in use.
-
-(5) Application side device look-up MUST be based on the serial number string
-in addition to VID/PID matching. The matching must start at the first
-character of the serial number string and include the colon character
-terminating your domain or e-mail address. It MAY stop anywhere after that.
-
-(6) For devices which implement a particular USB device class (e.g. HID), the
-operating system's default class driver MUST be used. If an operating system
-driver for Vendor Class devices is needed, this driver must be libusb or
-libusb-win32 (see http://libusb.org/ and
-http://libusb-win32.sourceforge.net/).
-
-Table if IDs for discrimination by serial number string:
-
-PID dec (hex) | VID dec (hex) | Description of use
-===============+===============+===========================================
-10200 (0x27d8) | 5824 (0x16c0) | For Vendor Class devices with libusb
----------------+---------------+-------------------------------------------
-10201 (0x27d9) | 5824 (0x16c0) | For generic HID class devices (which are
- | | NOT mice, keyboards or joysticks)
----------------+---------------+-------------------------------------------
-10202 (0x27da) | 5824 (0x16c0) | For USB Mice
----------------+---------------+-------------------------------------------
-10203 (0x27db) | 5824 (0x16c0) | For USB Keyboards
----------------+---------------+-------------------------------------------
-10204 (0x27db) | 5824 (0x16c0) | For USB Joysticks
----------------+---------------+-------------------------------------------
-10205 (0x27dc) | 5824 (0x16c0) | For CDC-ACM class devices (modems)
----------------+---------------+-------------------------------------------
-10206 (0x27dd) | 5824 (0x16c0) | For MIDI class devices
----------------+---------------+-------------------------------------------
-
-
-=================
-ORIGIN OF USB-IDs
-=================
-
-OBJECTIVE DEVELOPMENT Software GmbH has obtained all VID/PID pairs listed
-here from Wouter van Ooijen (see www.voti.nl) for exclusive disposition.
-Wouter van Ooijen has obtained the VID from the USB Implementers Forum, Inc.
-(see www.usb.org). The VID is registered for the company name "Van Ooijen
-Technische Informatica".
-
-
-==========
-DISCLAIMER
-==========
-
-OBJECTIVE DEVELOPMENT Software GmbH disclaims all liability for any
-problems which are caused by the shared use of these VID/PID pairs.
diff --git a/tmk_core/protocol/vusb/usbdrv/asmcommon.inc b/tmk_core/protocol/vusb/usbdrv/asmcommon.inc
deleted file mode 100644
index 07d692be3b..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/asmcommon.inc
+++ /dev/null
@@ -1,188 +0,0 @@
-/* Name: asmcommon.inc
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2007-11-05
- * Tabsize: 4
- * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * Revision: $Id$
- */
-
-/* Do not link this file! Link usbdrvasm.S instead, which includes the
- * appropriate implementation!
- */
-
-/*
-General Description:
-This file contains assembler code which is shared among the USB driver
-implementations for different CPU cocks. Since the code must be inserted
-in the middle of the module, it's split out into this file and #included.
-
-Jump destinations called from outside:
- sofError: Called when no start sequence was found.
- se0: Called when a package has been successfully received.
- overflow: Called when receive buffer overflows.
- doReturn: Called after sending data.
-
-Outside jump destinations used by this module:
- waitForJ: Called to receive an already arriving packet.
- sendAckAndReti:
- sendNakAndReti:
- sendCntAndReti:
- usbSendAndReti:
-
-The following macros must be defined before this file is included:
- .macro POP_STANDARD
- .endm
- .macro POP_RETI
- .endm
-*/
-
-#define token x1
-
-overflow:
- ldi x2, 1<<USB_INTR_PENDING_BIT
- USB_STORE_PENDING(x2) ; clear any pending interrupts
-ignorePacket:
- clr token
- rjmp storeTokenAndReturn
-
-;----------------------------------------------------------------------------
-; Processing of received packet (numbers in brackets are cycles after center of SE0)
-;----------------------------------------------------------------------------
-;This is the only non-error exit point for the software receiver loop
-;we don't check any CRCs here because there is no time left.
-se0:
- subi cnt, USB_BUFSIZE ;[5]
- neg cnt ;[6]
- sub YL, cnt ;[7]
- sbci YH, 0 ;[8]
- ldi x2, 1<<USB_INTR_PENDING_BIT ;[9]
- USB_STORE_PENDING(x2) ;[10] clear pending intr and check flag later. SE0 should be over.
- ld token, y ;[11]
- cpi token, USBPID_DATA0 ;[13]
- breq handleData ;[14]
- cpi token, USBPID_DATA1 ;[15]
- breq handleData ;[16]
- lds shift, usbDeviceAddr;[17]
- ldd x2, y+1 ;[19] ADDR and 1 bit endpoint number
- lsl x2 ;[21] shift out 1 bit endpoint number
- cpse x2, shift ;[22]
- rjmp ignorePacket ;[23]
-/* only compute endpoint number in x3 if required later */
-#if USB_CFG_HAVE_INTRIN_ENDPOINT || USB_CFG_IMPLEMENT_FN_WRITEOUT
- ldd x3, y+2 ;[24] endpoint number + crc
- rol x3 ;[26] shift in LSB of endpoint
-#endif
- cpi token, USBPID_IN ;[27]
- breq handleIn ;[28]
- cpi token, USBPID_SETUP ;[29]
- breq handleSetupOrOut ;[30]
- cpi token, USBPID_OUT ;[31]
- brne ignorePacket ;[32] must be ack, nak or whatever
-; rjmp handleSetupOrOut ; fallthrough
-
-;Setup and Out are followed by a data packet two bit times (16 cycles) after
-;the end of SE0. The sync code allows up to 40 cycles delay from the start of
-;the sync pattern until the first bit is sampled. That's a total of 56 cycles.
-handleSetupOrOut: ;[32]
-#if USB_CFG_IMPLEMENT_FN_WRITEOUT /* if we have data for endpoint != 0, set usbCurrentTok to address */
- andi x3, 0xf ;[32]
- breq storeTokenAndReturn ;[33]
- mov token, x3 ;[34] indicate that this is endpoint x OUT
-#endif
-storeTokenAndReturn:
- sts usbCurrentTok, token;[35]
-doReturn:
- POP_STANDARD ;[37] 12...16 cycles
- USB_LOAD_PENDING(YL) ;[49]
- sbrc YL, USB_INTR_PENDING_BIT;[50] check whether data is already arriving
- rjmp waitForJ ;[51] save the pops and pushes -- a new interrupt is already pending
-sofError:
- POP_RETI ;macro call
- reti
-
-handleData:
-#if USB_CFG_CHECK_CRC
- CRC_CLEANUP_AND_CHECK ; jumps to ignorePacket if CRC error
-#endif
- lds shift, usbCurrentTok;[18]
- tst shift ;[20]
- breq doReturn ;[21]
- lds x2, usbRxLen ;[22]
- tst x2 ;[24]
- brne sendNakAndReti ;[25]
-; 2006-03-11: The following two lines fix a problem where the device was not
-; recognized if usbPoll() was called less frequently than once every 4 ms.
- cpi cnt, 4 ;[26] zero sized data packets are status phase only -- ignore and ack
- brmi sendAckAndReti ;[27] keep rx buffer clean -- we must not NAK next SETUP
-#if USB_CFG_CHECK_DATA_TOGGLING
- sts usbCurrentDataToken, token ; store for checking by C code
-#endif
- sts usbRxLen, cnt ;[28] store received data, swap buffers
- sts usbRxToken, shift ;[30]
- lds x2, usbInputBufOffset;[32] swap buffers
- ldi cnt, USB_BUFSIZE ;[34]
- sub cnt, x2 ;[35]
- sts usbInputBufOffset, cnt;[36] buffers now swapped
- rjmp sendAckAndReti ;[38] 40 + 17 = 57 until SOP
-
-handleIn:
-;We don't send any data as long as the C code has not processed the current
-;input data and potentially updated the output data. That's more efficient
-;in terms of code size than clearing the tx buffers when a packet is received.
- lds x1, usbRxLen ;[30]
- cpi x1, 1 ;[32] negative values are flow control, 0 means "buffer free"
- brge sendNakAndReti ;[33] unprocessed input packet?
- ldi x1, USBPID_NAK ;[34] prepare value for usbTxLen
-#if USB_CFG_HAVE_INTRIN_ENDPOINT
- andi x3, 0xf ;[35] x3 contains endpoint
-#if USB_CFG_SUPPRESS_INTR_CODE
- brne sendNakAndReti ;[36]
-#else
- brne handleIn1 ;[36]
-#endif
-#endif
- lds cnt, usbTxLen ;[37]
- sbrc cnt, 4 ;[39] all handshake tokens have bit 4 set
- rjmp sendCntAndReti ;[40] 42 + 16 = 58 until SOP
- sts usbTxLen, x1 ;[41] x1 == USBPID_NAK from above
- ldi YL, lo8(usbTxBuf) ;[43]
- ldi YH, hi8(usbTxBuf) ;[44]
- rjmp usbSendAndReti ;[45] 57 + 12 = 59 until SOP
-
-; Comment about when to set usbTxLen to USBPID_NAK:
-; We should set it back when we receive the ACK from the host. This would
-; be simple to implement: One static variable which stores whether the last
-; tx was for endpoint 0 or 1 and a compare in the receiver to distinguish the
-; ACK. However, we set it back immediately when we send the package,
-; assuming that no error occurs and the host sends an ACK. We save one byte
-; RAM this way and avoid potential problems with endless retries. The rest of
-; the driver assumes error-free transfers anyway.
-
-#if !USB_CFG_SUPPRESS_INTR_CODE && USB_CFG_HAVE_INTRIN_ENDPOINT /* placed here due to relative jump range */
-handleIn1: ;[38]
-#if USB_CFG_HAVE_INTRIN_ENDPOINT3
-; 2006-06-10 as suggested by O.Tamura: support second INTR IN / BULK IN endpoint
- cpi x3, USB_CFG_EP3_NUMBER;[38]
- breq handleIn3 ;[39]
-#endif
- lds cnt, usbTxLen1 ;[40]
- sbrc cnt, 4 ;[42] all handshake tokens have bit 4 set
- rjmp sendCntAndReti ;[43] 47 + 16 = 63 until SOP
- sts usbTxLen1, x1 ;[44] x1 == USBPID_NAK from above
- ldi YL, lo8(usbTxBuf1) ;[46]
- ldi YH, hi8(usbTxBuf1) ;[47]
- rjmp usbSendAndReti ;[48] 50 + 12 = 62 until SOP
-
-#if USB_CFG_HAVE_INTRIN_ENDPOINT3
-handleIn3:
- lds cnt, usbTxLen3 ;[41]
- sbrc cnt, 4 ;[43]
- rjmp sendCntAndReti ;[44] 49 + 16 = 65 until SOP
- sts usbTxLen3, x1 ;[45] x1 == USBPID_NAK from above
- ldi YL, lo8(usbTxBuf3) ;[47]
- ldi YH, hi8(usbTxBuf3) ;[48]
- rjmp usbSendAndReti ;[49] 51 + 12 = 63 until SOP
-#endif
-#endif
diff --git a/tmk_core/protocol/vusb/usbdrv/oddebug.c b/tmk_core/protocol/vusb/usbdrv/oddebug.c
deleted file mode 100644
index bcd28ff014..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/oddebug.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/* Name: oddebug.c
- * Project: AVR library
- * Author: Christian Starkjohann
- * Creation Date: 2005-01-16
- * 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: oddebug.c 692 2008-11-07 15:07:40Z cs $
- */
-
-#include "oddebug.h"
-
-#if DEBUG_LEVEL > 0
-
-# warning "Never compile production devices with debugging enabled"
-
-static void uartPutc(char c) {
- while (!(ODDBG_USR & (1 << ODDBG_UDRE)))
- ; /* wait for data register empty */
- ODDBG_UDR = c;
-}
-
-static uchar hexAscii(uchar h) {
- h &= 0xf;
- if (h >= 10) h += 'a' - (uchar)10 - '0';
- h += '0';
- return h;
-}
-
-static void printHex(uchar c) {
- uartPutc(hexAscii(c >> 4));
- uartPutc(hexAscii(c));
-}
-
-void odDebug(uchar prefix, uchar *data, uchar len) {
- printHex(prefix);
- uartPutc(':');
- while (len--) {
- uartPutc(' ');
- printHex(*data++);
- }
- uartPutc('\r');
- uartPutc('\n');
-}
-
-#endif
diff --git a/tmk_core/protocol/vusb/usbdrv/oddebug.h b/tmk_core/protocol/vusb/usbdrv/oddebug.h
deleted file mode 100644
index f93f338794..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/oddebug.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/* Name: oddebug.h
- * Project: AVR library
- * Author: Christian Starkjohann
- * Creation Date: 2005-01-16
- * 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: oddebug.h 692 2008-11-07 15:07:40Z cs $
- */
-
-#ifndef __oddebug_h_included__
-#define __oddebug_h_included__
-
-/*
-General Description:
-This module implements a function for debug logs on the serial line of the
-AVR microcontroller. Debugging can be configured with the define
-'DEBUG_LEVEL'. If this macro is not defined or defined to 0, all debugging
-calls are no-ops. If it is 1, DBG1 logs will appear, but not DBG2. If it is
-2, DBG1 and DBG2 logs will be printed.
-
-A debug log consists of a label ('prefix') to indicate which debug log created
-the output and a memory block to dump in hex ('data' and 'len').
-*/
-
-#ifndef F_CPU
-# define F_CPU 12000000 /* 12 MHz */
-#endif
-
-/* make sure we have the UART defines: */
-#include "usbportability.h"
-
-#ifndef uchar
-# define uchar unsigned char
-#endif
-
-#if DEBUG_LEVEL > 0 && !(defined TXEN || defined TXEN0) /* no UART in device */
-# warning "Debugging disabled because device has no UART"
-# undef DEBUG_LEVEL
-#endif
-
-#ifndef DEBUG_LEVEL
-# define DEBUG_LEVEL 0
-#endif
-
-/* ------------------------------------------------------------------------- */
-
-#if DEBUG_LEVEL > 0
-# define DBG1(prefix, data, len) odDebug(prefix, data, len)
-#else
-# define DBG1(prefix, data, len)
-#endif
-
-#if DEBUG_LEVEL > 1
-# define DBG2(prefix, data, len) odDebug(prefix, data, len)
-#else
-# define DBG2(prefix, data, len)
-#endif
-
-/* ------------------------------------------------------------------------- */
-
-#if DEBUG_LEVEL > 0
-extern void odDebug(uchar prefix, uchar *data, uchar len);
-
-/* Try to find our control registers; ATMEL likes to rename these */
-
-# if defined UBRR
-# define ODDBG_UBRR UBRR
-# elif defined UBRRL
-# define ODDBG_UBRR UBRRL
-# elif defined UBRR0
-# define ODDBG_UBRR UBRR0
-# elif defined UBRR0L
-# define ODDBG_UBRR UBRR0L
-# endif
-
-# if defined UCR
-# define ODDBG_UCR UCR
-# elif defined UCSRB
-# define ODDBG_UCR UCSRB
-# elif defined UCSR0B
-# define ODDBG_UCR UCSR0B
-# endif
-
-# if defined TXEN
-# define ODDBG_TXEN TXEN
-# else
-# define ODDBG_TXEN TXEN0
-# endif
-
-# if defined USR
-# define ODDBG_USR USR
-# elif defined UCSRA
-# define ODDBG_USR UCSRA
-# elif defined UCSR0A
-# define ODDBG_USR UCSR0A
-# endif
-
-# if defined UDRE
-# define ODDBG_UDRE UDRE
-# else
-# define ODDBG_UDRE UDRE0
-# endif
-
-# if defined UDR
-# define ODDBG_UDR UDR
-# elif defined UDR0
-# define ODDBG_UDR UDR0
-# endif
-
-static inline void odDebugInit(void) {
- ODDBG_UCR |= (1 << ODDBG_TXEN);
- ODDBG_UBRR = F_CPU / (19200 * 16L) - 1;
-}
-#else
-# define odDebugInit()
-#endif
-
-/* ------------------------------------------------------------------------- */
-
-#endif /* __oddebug_h_included__ */
diff --git a/tmk_core/protocol/vusb/usbdrv/usbconfig-prototype.h b/tmk_core/protocol/vusb/usbdrv/usbconfig-prototype.h
deleted file mode 100644
index 020ea51474..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/usbconfig-prototype.h
+++ /dev/null
@@ -1,376 +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).
-+ To create your own usbconfig.h file, copy this file to your project's
-+ firmware source directory) and rename it to "usbconfig.h".
-+ Then edit it accordingly.
-*/
-
-/* ---------------------------- 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 4
-/* 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 0
-/* 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 0
-/* 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_INTR_POLL_INTERVAL 10
-/* If you compile a version with endpoint 1 (interrupt-in), this is the poll
- * interval. The value is in milliseconds and must not be less than 10 ms for
- * low speed devices.
- */
-#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_MAX_BUS_POWER 100
-/* Set this variable to the maximum USB bus power consumption of your device.
- * The value is in milliamperes. [It will be divided by two since USB
- * communicates power requirements in units of 2 mA.]
- */
-#define USB_CFG_IMPLEMENT_FN_WRITE 0
-/* 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 0xc0, 0x16 /* = 0x16c0 = 5824 = voti.nl */
-/* 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 0xdc, 0x05 /* = 0x05dc = 1500 */
-/* 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 0x00, 0x01
-/* Version number of the device: Minor number first, then major number.
- */
-#define USB_CFG_VENDOR_NAME 'o', 'b', 'd', 'e', 'v', '.', 'a', 't'
-#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 'T', 'e', 'm', 'p', 'l', 'a', 't', 'e'
-#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 0xff /* set to 0 if deferred to interface */
-#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 0 /* define class here if not at device level */
-#define USB_CFG_INTERFACE_SUBCLASS 0
-#define USB_CFG_INTERFACE_PROTOCOL 0
-/* 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 42 */
-/* 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 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 0
-#define USB_CFG_DESCR_PROPS_HID_REPORT 0
-#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/tmk_core/protocol/vusb/usbdrv/usbdrv.c b/tmk_core/protocol/vusb/usbdrv/usbdrv.c
deleted file mode 100644
index f69198b1b9..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/usbdrv.c
+++ /dev/null
@@ -1,622 +0,0 @@
-/* Name: usbdrv.c
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2004-12-29
- * 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: usbdrv.c 791 2010-07-15 15:56:13Z cs $
- */
-
-#include "usbportability.h"
-#include "usbdrv.h"
-#include "oddebug.h"
-
-/*
-General Description:
-This module implements the C-part of the USB driver. See usbdrv.h for a
-documentation of the entire driver.
-*/
-
-/* ------------------------------------------------------------------------- */
-
-/* raw USB registers / interface to assembler code: */
-uchar usbRxBuf[2 * USB_BUFSIZE]; /* raw RX buffer: PID, 8 bytes data, 2 bytes CRC */
-uchar usbInputBufOffset; /* offset in usbRxBuf used for low level receiving */
-uchar usbDeviceAddr; /* assigned during enumeration, defaults to 0 */
-uchar usbNewDeviceAddr; /* device ID which should be set after status phase */
-uchar usbConfiguration; /* currently selected configuration. Administered by driver, but not used */
-volatile schar usbRxLen; /* = 0; number of bytes in usbRxBuf; 0 means free, -1 for flow control */
-uchar usbCurrentTok; /* last token received or endpoint number for last OUT token if != 0 */
-uchar usbRxToken; /* token for data we received; or endpont number for last OUT */
-volatile uchar usbTxLen = USBPID_NAK; /* number of bytes to transmit with next IN token or handshake token */
-uchar usbTxBuf[USB_BUFSIZE]; /* data to transmit with next IN, free if usbTxLen contains handshake token */
-#if USB_COUNT_SOF
-volatile uchar usbSofCount; /* incremented by assembler module every SOF */
-#endif
-#if USB_CFG_HAVE_INTRIN_ENDPOINT && !USB_CFG_SUPPRESS_INTR_CODE
-usbTxStatus_t usbTxStatus1;
-# if USB_CFG_HAVE_INTRIN_ENDPOINT3
-usbTxStatus_t usbTxStatus3;
-# endif
-#endif
-#if USB_CFG_CHECK_DATA_TOGGLING
-uchar usbCurrentDataToken; /* when we check data toggling to ignore duplicate packets */
-#endif
-
-/* USB status registers / not shared with asm code */
-uchar * usbMsgPtr; /* data to transmit next -- ROM or RAM address */
-static usbMsgLen_t usbMsgLen = USB_NO_MSG; /* remaining number of bytes */
-static uchar usbMsgFlags; /* flag values see below */
-
-#define USB_FLG_MSGPTR_IS_ROM (1 << 6)
-#define USB_FLG_USE_USER_RW (1 << 7)
-
-/*
-optimizing hints:
-- do not post/pre inc/dec integer values in operations
-- assign value of USB_READ_FLASH() to register variables and don't use side effects in arg
-- use narrow scope for variables which should be in X/Y/Z register
-- assign char sized expressions to variables to force 8 bit arithmetics
-*/
-
-/* -------------------------- String Descriptors --------------------------- */
-
-#if USB_CFG_DESCR_PROPS_STRINGS == 0
-
-# if USB_CFG_DESCR_PROPS_STRING_0 == 0
-# undef USB_CFG_DESCR_PROPS_STRING_0
-# define USB_CFG_DESCR_PROPS_STRING_0 sizeof(usbDescriptorString0)
-const PROGMEM char usbDescriptorString0[] = {
- /* language descriptor */
- 4, /* sizeof(usbDescriptorString0): length of descriptor in bytes */
- 3, /* descriptor type */
- 0x09, 0x04, /* language index (0x0409 = US-English) */
-};
-# endif
-
-# if USB_CFG_DESCR_PROPS_STRING_VENDOR == 0 && USB_CFG_VENDOR_NAME_LEN
-# undef USB_CFG_DESCR_PROPS_STRING_VENDOR
-# define USB_CFG_DESCR_PROPS_STRING_VENDOR sizeof(usbDescriptorStringVendor)
-const PROGMEM int usbDescriptorStringVendor[] = {USB_STRING_DESCRIPTOR_HEADER(USB_CFG_VENDOR_NAME_LEN), USB_CFG_VENDOR_NAME};
-# endif
-
-# if USB_CFG_DESCR_PROPS_STRING_PRODUCT == 0 && USB_CFG_DEVICE_NAME_LEN
-# undef USB_CFG_DESCR_PROPS_STRING_PRODUCT
-# define USB_CFG_DESCR_PROPS_STRING_PRODUCT sizeof(usbDescriptorStringDevice)
-const PROGMEM int usbDescriptorStringDevice[] = {USB_STRING_DESCRIPTOR_HEADER(USB_CFG_DEVICE_NAME_LEN), USB_CFG_DEVICE_NAME};
-# endif
-
-# if USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER == 0 && USB_CFG_SERIAL_NUMBER_LEN
-# undef USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
-# define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER sizeof(usbDescriptorStringSerialNumber)
-const PROGMEM int usbDescriptorStringSerialNumber[] = {USB_STRING_DESCRIPTOR_HEADER(USB_CFG_SERIAL_NUMBER_LEN), USB_CFG_SERIAL_NUMBER};
-# endif
-
-#endif /* USB_CFG_DESCR_PROPS_STRINGS == 0 */
-
-/* --------------------------- Device Descriptor --------------------------- */
-
-#if USB_CFG_DESCR_PROPS_DEVICE == 0
-# undef USB_CFG_DESCR_PROPS_DEVICE
-# define USB_CFG_DESCR_PROPS_DEVICE sizeof(usbDescriptorDevice)
-const PROGMEM char usbDescriptorDevice[] = {
- /* USB device descriptor */
- 18, /* sizeof(usbDescriptorDevice): length of descriptor in bytes */
- USBDESCR_DEVICE, /* descriptor type */
- 0x10, 0x01, /* USB version supported */
- USB_CFG_DEVICE_CLASS, USB_CFG_DEVICE_SUBCLASS, 0, /* protocol */
- 8, /* max packet size */
- /* the following two casts affect the first byte of the constant only, but
- * that's sufficient to avoid a warning with the default values.
- */
- (char)USB_CFG_VENDOR_ID, /* 2 bytes */
- (char)USB_CFG_DEVICE_ID, /* 2 bytes */
- USB_CFG_DEVICE_VERSION, /* 2 bytes */
- USB_CFG_DESCR_PROPS_STRING_VENDOR != 0 ? 1 : 0, /* manufacturer string index */
- USB_CFG_DESCR_PROPS_STRING_PRODUCT != 0 ? 2 : 0, /* product string index */
- USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER != 0 ? 3 : 0, /* serial number string index */
- 1, /* number of configurations */
-};
-#endif
-
-/* ----------------------- Configuration Descriptor ------------------------ */
-
-#if USB_CFG_DESCR_PROPS_HID_REPORT != 0 && USB_CFG_DESCR_PROPS_HID == 0
-# undef USB_CFG_DESCR_PROPS_HID
-# define USB_CFG_DESCR_PROPS_HID 9 /* length of HID descriptor in config descriptor below */
-#endif
-
-#if USB_CFG_DESCR_PROPS_CONFIGURATION == 0
-# undef USB_CFG_DESCR_PROPS_CONFIGURATION
-# define USB_CFG_DESCR_PROPS_CONFIGURATION sizeof(usbDescriptorConfiguration)
-PROGMEM char usbDescriptorConfiguration[] = {
- /* USB configuration descriptor */
- 9, /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */
- USBDESCR_CONFIG, /* descriptor type */
- 18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT3 + (USB_CFG_DESCR_PROPS_HID & 0xff), 0,
- /* total length of data returned (including inlined descriptors) */
- 1, /* number of interfaces in this configuration */
- 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_CFG_MAX_BUS_POWER / 2, /* max USB current in 2mA units */
- /* interface descriptor follows inline: */
- 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 + USB_CFG_HAVE_INTRIN_ENDPOINT3, /* 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 */
-# if (USB_CFG_DESCR_PROPS_HID & 0xff) /* 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 */
- USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH, 0, /* total length of report descriptor */
-# endif
-# 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_CFG_INTR_POLL_INTERVAL, /* in ms */
-# endif
-# if USB_CFG_HAVE_INTRIN_ENDPOINT3 /* endpoint descriptor for endpoint 3 */
- 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_CFG_INTR_POLL_INTERVAL, /* in ms */
-# endif
-};
-#endif
-
-/* ------------------------------------------------------------------------- */
-
-static inline void usbResetDataToggling(void) {
-#if USB_CFG_HAVE_INTRIN_ENDPOINT && !USB_CFG_SUPPRESS_INTR_CODE
- USB_SET_DATATOKEN1(USB_INITIAL_DATATOKEN); /* reset data toggling for interrupt endpoint */
-# if USB_CFG_HAVE_INTRIN_ENDPOINT3
- USB_SET_DATATOKEN3(USB_INITIAL_DATATOKEN); /* reset data toggling for interrupt endpoint */
-# endif
-#endif
-}
-
-static inline void usbResetStall(void) {
-#if USB_CFG_IMPLEMENT_HALT && USB_CFG_HAVE_INTRIN_ENDPOINT
- usbTxLen1 = USBPID_NAK;
-# if USB_CFG_HAVE_INTRIN_ENDPOINT3
- usbTxLen3 = USBPID_NAK;
-# endif
-#endif
-}
-
-/* ------------------------------------------------------------------------- */
-
-#if !USB_CFG_SUPPRESS_INTR_CODE
-# if USB_CFG_HAVE_INTRIN_ENDPOINT
-static void usbGenericSetInterrupt(uchar *data, uchar len, usbTxStatus_t *txStatus) {
- uchar *p;
- char i;
-
-# if USB_CFG_IMPLEMENT_HALT
- if (usbTxLen1 == USBPID_STALL) return;
-# endif
- if (txStatus->len & 0x10) { /* packet buffer was empty */
- txStatus->buffer[0] ^= USBPID_DATA0 ^ USBPID_DATA1; /* toggle token */
- } else {
- txStatus->len = USBPID_NAK; /* avoid sending outdated (overwritten) interrupt data */
- }
- p = txStatus->buffer + 1;
- i = len;
- do { /* if len == 0, we still copy 1 byte, but that's no problem */
- *p++ = *data++;
- } while (--i > 0); /* loop control at the end is 2 bytes shorter than at beginning */
- usbCrc16Append(&txStatus->buffer[1], len);
- txStatus->len = len + 4; /* len must be given including sync byte */
- DBG2(0x21 + (((int)txStatus >> 3) & 3), txStatus->buffer, len + 3);
-}
-
-USB_PUBLIC void usbSetInterrupt(uchar *data, uchar len) { usbGenericSetInterrupt(data, len, &usbTxStatus1); }
-# endif
-
-# if USB_CFG_HAVE_INTRIN_ENDPOINT3
-USB_PUBLIC void usbSetInterrupt3(uchar *data, uchar len) { usbGenericSetInterrupt(data, len, &usbTxStatus3); }
-# endif
-#endif /* USB_CFG_SUPPRESS_INTR_CODE */
-
-/* ------------------ utilities for code following below ------------------- */
-
-/* Use defines for the switch statement so that we can choose between an
- * if()else if() and a switch/case based implementation. switch() is more
- * efficient for a LARGE set of sequential choices, if() is better in all other
- * cases.
- */
-#if USB_CFG_USE_SWITCH_STATEMENT
-# define SWITCH_START(cmd) \
- switch (cmd) { \
- {
-# define SWITCH_CASE(value) \
- } \
- break; \
- case (value): {
-# define SWITCH_CASE2(v1, v2) \
- } \
- break; \
- case (v1): \
- case (v2): {
-# define SWITCH_CASE3(v1, v2, v3) \
- } \
- break; \
- case (v1): \
- case (v2): \
- case (v3): {
-# define SWITCH_DEFAULT \
- } \
- break; \
- default: {
-# define SWITCH_END \
- } \
- }
-#else
-# define SWITCH_START(cmd) \
- { \
- uchar _cmd = cmd; \
- if (0) {
-# define SWITCH_CASE(value) \
- } \
- else if (_cmd == (value)) {
-# define SWITCH_CASE2(v1, v2) \
- } \
- else if (_cmd == (v1) || _cmd == (v2)) {
-# define SWITCH_CASE3(v1, v2, v3) \
- } \
- else if (_cmd == (v1) || _cmd == (v2) || (_cmd == v3)) {
-# define SWITCH_DEFAULT \
- } \
- else {
-# define SWITCH_END \
- } \
- }
-#endif
-
-#ifndef USB_RX_USER_HOOK
-# define USB_RX_USER_HOOK(data, len)
-#endif
-#ifndef USB_SET_ADDRESS_HOOK
-# define USB_SET_ADDRESS_HOOK()
-#endif
-
-/* ------------------------------------------------------------------------- */
-
-/* We use if() instead of #if in the macro below because #if can't be used
- * in macros and the compiler optimizes constant conditions anyway.
- * This may cause problems with undefined symbols if compiled without
- * optimizing!
- */
-#define GET_DESCRIPTOR(cfgProp, staticName) \
- if (cfgProp) { \
- if ((cfgProp)&USB_PROP_IS_RAM) flags = 0; \
- if ((cfgProp)&USB_PROP_IS_DYNAMIC) { \
- len = usbFunctionDescriptor(rq); \
- } else { \
- len = USB_PROP_LENGTH(cfgProp); \
- usbMsgPtr = (uchar *)(staticName); \
- } \
- }
-
-/* usbDriverDescriptor() is similar to usbFunctionDescriptor(), but used
- * internally for all types of descriptors.
- */
-static inline usbMsgLen_t usbDriverDescriptor(usbRequest_t *rq) {
- usbMsgLen_t len = 0;
- uchar flags = USB_FLG_MSGPTR_IS_ROM;
-
- SWITCH_START(rq->wValue.bytes[1])
- SWITCH_CASE(USBDESCR_DEVICE) /* 1 */
- GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_DEVICE, usbDescriptorDevice)
- SWITCH_CASE(USBDESCR_CONFIG) /* 2 */
- GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_CONFIGURATION, usbDescriptorConfiguration)
- SWITCH_CASE(USBDESCR_STRING) /* 3 */
-#if USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC
- if (USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_RAM) flags = 0;
- len = usbFunctionDescriptor(rq);
-#else /* USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC */
- SWITCH_START(rq->wValue.bytes[0])
- SWITCH_CASE(0)
- GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_0, usbDescriptorString0)
- SWITCH_CASE(1)
- GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_VENDOR, usbDescriptorStringVendor)
- SWITCH_CASE(2)
- GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_PRODUCT, usbDescriptorStringDevice)
- SWITCH_CASE(3)
- GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER, usbDescriptorStringSerialNumber)
- SWITCH_DEFAULT
- if (USB_CFG_DESCR_PROPS_UNKNOWN & USB_PROP_IS_DYNAMIC) {
- len = usbFunctionDescriptor(rq);
- }
- SWITCH_END
-#endif /* USB_CFG_DESCR_PROPS_STRINGS & USB_PROP_IS_DYNAMIC */
-#if USB_CFG_DESCR_PROPS_HID_REPORT /* only support HID descriptors if enabled */
- SWITCH_CASE(USBDESCR_HID) /* 0x21 */
- GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_HID, usbDescriptorConfiguration + 18)
- SWITCH_CASE(USBDESCR_HID_REPORT) /* 0x22 */
- GET_DESCRIPTOR(USB_CFG_DESCR_PROPS_HID_REPORT, usbDescriptorHidReport)
-#endif
- SWITCH_DEFAULT
- if (USB_CFG_DESCR_PROPS_UNKNOWN & USB_PROP_IS_DYNAMIC) {
- len = usbFunctionDescriptor(rq);
- }
- SWITCH_END
- usbMsgFlags = flags;
- return len;
-}
-
-/* ------------------------------------------------------------------------- */
-
-/* usbDriverSetup() is similar to usbFunctionSetup(), but it's used for
- * standard requests instead of class and custom requests.
- */
-static inline usbMsgLen_t usbDriverSetup(usbRequest_t *rq) {
- uchar len = 0, *dataPtr = usbTxBuf + 9; /* there are 2 bytes free space at the end of the buffer */
- uchar value = rq->wValue.bytes[0];
-#if USB_CFG_IMPLEMENT_HALT
- uchar index = rq->wIndex.bytes[0];
-#endif
-
- dataPtr[0] = 0; /* default reply common to USBRQ_GET_STATUS and USBRQ_GET_INTERFACE */
- SWITCH_START(rq->bRequest)
- SWITCH_CASE(USBRQ_GET_STATUS) /* 0 */
- uchar recipient = rq->bmRequestType & USBRQ_RCPT_MASK; /* assign arith ops to variables to enforce byte size */
- if (USB_CFG_IS_SELF_POWERED && recipient == USBRQ_RCPT_DEVICE) dataPtr[0] = USB_CFG_IS_SELF_POWERED;
-#if USB_CFG_IMPLEMENT_HALT
- if (recipient == USBRQ_RCPT_ENDPOINT && index == 0x81) /* request status for endpoint 1 */
- dataPtr[0] = usbTxLen1 == USBPID_STALL;
-#endif
- dataPtr[1] = 0;
- len = 2;
-#if USB_CFG_IMPLEMENT_HALT
- SWITCH_CASE2(USBRQ_CLEAR_FEATURE, USBRQ_SET_FEATURE) /* 1, 3 */
- if (value == 0 && index == 0x81) { /* feature 0 == HALT for endpoint == 1 */
- usbTxLen1 = rq->bRequest == USBRQ_CLEAR_FEATURE ? USBPID_NAK : USBPID_STALL;
- usbResetDataToggling();
- }
-#endif
- SWITCH_CASE(USBRQ_SET_ADDRESS) /* 5 */
- usbNewDeviceAddr = value;
- USB_SET_ADDRESS_HOOK();
- SWITCH_CASE(USBRQ_GET_DESCRIPTOR) /* 6 */
- len = usbDriverDescriptor(rq);
- goto skipMsgPtrAssignment;
- SWITCH_CASE(USBRQ_GET_CONFIGURATION) /* 8 */
- dataPtr = &usbConfiguration; /* send current configuration value */
- len = 1;
- SWITCH_CASE(USBRQ_SET_CONFIGURATION) /* 9 */
- usbConfiguration = value;
- usbResetStall();
- SWITCH_CASE(USBRQ_GET_INTERFACE) /* 10 */
- len = 1;
-#if USB_CFG_HAVE_INTRIN_ENDPOINT && !USB_CFG_SUPPRESS_INTR_CODE
- SWITCH_CASE(USBRQ_SET_INTERFACE) /* 11 */
- usbResetDataToggling();
- usbResetStall();
-#endif
- SWITCH_DEFAULT /* 7=SET_DESCRIPTOR, 12=SYNC_FRAME */
- /* Should we add an optional hook here? */
- SWITCH_END usbMsgPtr = dataPtr;
-skipMsgPtrAssignment:
- return len;
-}
-
-/* ------------------------------------------------------------------------- */
-
-/* usbProcessRx() is called for every message received by the interrupt
- * routine. It distinguishes between SETUP and DATA packets and processes
- * them accordingly.
- */
-static inline void usbProcessRx(uchar *data, uchar len) {
- usbRequest_t *rq = (void *)data;
-
- /* usbRxToken can be:
- * 0x2d 00101101 (USBPID_SETUP for setup data)
- * 0xe1 11100001 (USBPID_OUT: data phase of setup transfer)
- * 0...0x0f for OUT on endpoint X
- */
- DBG2(0x10 + (usbRxToken & 0xf), data, len + 2); /* SETUP=1d, SETUP-DATA=11, OUTx=1x */
- USB_RX_USER_HOOK(data, len)
-#if USB_CFG_IMPLEMENT_FN_WRITEOUT
- if (usbRxToken < 0x10) { /* OUT to endpoint != 0: endpoint number in usbRxToken */
- usbFunctionWriteOut(data, len);
- return;
- }
-#endif
- if (usbRxToken == (uchar)USBPID_SETUP) {
- if (len != 8) /* Setup size must be always 8 bytes. Ignore otherwise. */
- return;
- usbMsgLen_t replyLen;
- usbTxBuf[0] = USBPID_DATA0; /* initialize data toggling */
- usbTxLen = USBPID_NAK; /* abort pending transmit */
- usbMsgFlags = 0;
- uchar type = rq->bmRequestType & USBRQ_TYPE_MASK;
- if (type != USBRQ_TYPE_STANDARD) { /* standard requests are handled by driver */
- replyLen = usbFunctionSetup(data);
- } else {
- replyLen = usbDriverSetup(rq);
- }
-#if USB_CFG_IMPLEMENT_FN_READ || USB_CFG_IMPLEMENT_FN_WRITE
- if (replyLen == USB_NO_MSG) { /* use user-supplied read/write function */
- /* do some conditioning on replyLen, but on IN transfers only */
- if ((rq->bmRequestType & USBRQ_DIR_MASK) != USBRQ_DIR_HOST_TO_DEVICE) {
- if (sizeof(replyLen) < sizeof(rq->wLength.word)) { /* help compiler with optimizing */
- replyLen = rq->wLength.bytes[0];
- } else {
- replyLen = rq->wLength.word;
- }
- }
- usbMsgFlags = USB_FLG_USE_USER_RW;
- } else /* The 'else' prevents that we limit a replyLen of USB_NO_MSG to the maximum transfer len. */
-#endif
- if (sizeof(replyLen) < sizeof(rq->wLength.word)) { /* help compiler with optimizing */
- if (!rq->wLength.bytes[1] && replyLen > rq->wLength.bytes[0]) /* limit length to max */
- replyLen = rq->wLength.bytes[0];
- } else {
- if (replyLen > rq->wLength.word) /* limit length to max */
- replyLen = rq->wLength.word;
- }
- usbMsgLen = replyLen;
- } else { /* usbRxToken must be USBPID_OUT, which means data phase of setup (control-out) */
-#if USB_CFG_IMPLEMENT_FN_WRITE
- if (usbMsgFlags & USB_FLG_USE_USER_RW) {
- uchar rval = usbFunctionWrite(data, len);
- if (rval == 0xff) { /* an error occurred */
- usbTxLen = USBPID_STALL;
- } else if (rval != 0) { /* This was the final package */
- usbMsgLen = 0; /* answer with a zero-sized data packet */
- }
- }
-#endif
- }
-}
-
-/* ------------------------------------------------------------------------- */
-
-/* This function is similar to usbFunctionRead(), but it's also called for
- * data handled automatically by the driver (e.g. descriptor reads).
- */
-static uchar usbDeviceRead(uchar *data, uchar len) {
- if (len > 0) { /* don't bother app with 0 sized reads */
-#if USB_CFG_IMPLEMENT_FN_READ
- if (usbMsgFlags & USB_FLG_USE_USER_RW) {
- len = usbFunctionRead(data, len);
- } else
-#endif
- {
- uchar i = len, *r = usbMsgPtr;
- if (usbMsgFlags & USB_FLG_MSGPTR_IS_ROM) { /* ROM data */
- do {
- uchar c = USB_READ_FLASH(r); /* assign to char size variable to enforce byte ops */
- *data++ = c;
- r++;
- } while (--i);
- } else { /* RAM data */
- do {
- *data++ = *r++;
- } while (--i);
- }
- usbMsgPtr = r;
- }
- }
- return len;
-}
-
-/* ------------------------------------------------------------------------- */
-
-/* usbBuildTxBlock() is called when we have data to transmit and the
- * interrupt routine's transmit buffer is empty.
- */
-static inline void usbBuildTxBlock(void) {
- usbMsgLen_t wantLen;
- uchar len;
-
- wantLen = usbMsgLen;
- if (wantLen > 8) wantLen = 8;
- usbMsgLen -= wantLen;
- usbTxBuf[0] ^= USBPID_DATA0 ^ USBPID_DATA1; /* DATA toggling */
- len = usbDeviceRead(usbTxBuf + 1, wantLen);
- if (len <= 8) { /* valid data packet */
- usbCrc16Append(&usbTxBuf[1], len);
- len += 4; /* length including sync byte */
- if (len < 12) /* a partial package identifies end of message */
- usbMsgLen = USB_NO_MSG;
- } else {
- len = USBPID_STALL; /* stall the endpoint */
- usbMsgLen = USB_NO_MSG;
- }
- usbTxLen = len;
- DBG2(0x20, usbTxBuf, len - 1);
-}
-
-/* ------------------------------------------------------------------------- */
-
-static inline void usbHandleResetHook(uchar notResetState) {
-#ifdef USB_RESET_HOOK
- static uchar wasReset;
- uchar isReset = !notResetState;
-
- if (wasReset != isReset) {
- USB_RESET_HOOK(isReset);
- wasReset = isReset;
- }
-#endif
-}
-
-/* ------------------------------------------------------------------------- */
-
-USB_PUBLIC void usbPoll(void) {
- schar len;
- uchar i;
-
- len = usbRxLen - 3;
- if (len >= 0) {
- /* We could check CRC16 here -- but ACK has already been sent anyway. If you
- * need data integrity checks with this driver, check the CRC in your app
- * code and report errors back to the host. Since the ACK was already sent,
- * retries must be handled on application level.
- * unsigned crc = usbCrc16(buffer + 1, usbRxLen - 3);
- */
- usbProcessRx(usbRxBuf + USB_BUFSIZE + 1 - usbInputBufOffset, len);
-#if USB_CFG_HAVE_FLOWCONTROL
- if (usbRxLen > 0) /* only mark as available if not inactivated */
- usbRxLen = 0;
-#else
- usbRxLen = 0; /* mark rx buffer as available */
-#endif
- }
- if (usbTxLen & 0x10) { /* transmit system idle */
- if (usbMsgLen != USB_NO_MSG) { /* transmit data pending? */
- usbBuildTxBlock();
- }
- }
- for (i = 20; i > 0; i--) {
- uchar usbLineStatus = USBIN & USBMASK;
- if (usbLineStatus != 0) /* SE0 has ended */
- goto isNotReset;
- }
- /* RESET condition, called multiple times during reset */
- usbNewDeviceAddr = 0;
- usbDeviceAddr = 0;
- usbResetStall();
- DBG1(0xff, 0, 0);
-isNotReset:
- usbHandleResetHook(i);
-}
-
-/* ------------------------------------------------------------------------- */
-
-USB_PUBLIC void usbInit(void) {
-#if USB_INTR_CFG_SET != 0
- USB_INTR_CFG |= USB_INTR_CFG_SET;
-#endif
-#if USB_INTR_CFG_CLR != 0
- USB_INTR_CFG &= ~(USB_INTR_CFG_CLR);
-#endif
- USB_INTR_ENABLE |= (1 << USB_INTR_ENABLE_BIT);
- usbResetDataToggling();
-#if USB_CFG_HAVE_INTRIN_ENDPOINT && !USB_CFG_SUPPRESS_INTR_CODE
- usbTxLen1 = USBPID_NAK;
-# if USB_CFG_HAVE_INTRIN_ENDPOINT3
- usbTxLen3 = USBPID_NAK;
-# endif
-#endif
-}
-
-/* ------------------------------------------------------------------------- */
diff --git a/tmk_core/protocol/vusb/usbdrv/usbdrv.h b/tmk_core/protocol/vusb/usbdrv/usbdrv.h
deleted file mode 100644
index 88a1bce76e..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/usbdrv.h
+++ /dev/null
@@ -1,730 +0,0 @@
-/* Name: usbdrv.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2004-12-29
- * 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: usbdrv.h 793 2010-07-15 15:58:11Z cs $
- */
-
-#ifndef __usbdrv_h_included__
-#define __usbdrv_h_included__
-#include "usbconfig.h"
-#include "usbportability.h"
-
-/*
-Hardware Prerequisites:
-=======================
-USB lines D+ and D- MUST be wired to the same I/O port. We recommend that D+
-triggers the interrupt (best achieved by using INT0 for D+), but it is also
-possible to trigger the interrupt from D-. If D- is used, interrupts are also
-triggered by SOF packets. D- requires a pull-up of 1.5k to +3.5V (and the
-device must be powered at 3.5V) to identify as low-speed USB device. A
-pull-down or pull-up of 1M SHOULD be connected from D+ to +3.5V to prevent
-interference when no USB master is connected. If you use Zener diodes to limit
-the voltage on D+ and D-, you MUST use a pull-down resistor, not a pull-up.
-We use D+ as interrupt source and not D- because it does not trigger on
-keep-alive and RESET states. If you want to count keep-alive events with
-USB_COUNT_SOF, you MUST use D- as an interrupt source.
-
-As a compile time option, the 1.5k pull-up resistor on D- can be made
-switchable to allow the device to disconnect at will. See the definition of
-usbDeviceConnect() and usbDeviceDisconnect() further down in this file.
-
-Please adapt the values in usbconfig.h according to your hardware!
-
-The device MUST be clocked at exactly 12 MHz, 15 MHz, 16 MHz or 20 MHz
-or at 12.8 MHz resp. 16.5 MHz +/- 1%. See usbconfig-prototype.h for details.
-
-
-Limitations:
-============
-Robustness with respect to communication errors:
-The driver assumes error-free communication. It DOES check for errors in
-the PID, but does NOT check bit stuffing errors, SE0 in middle of a byte,
-token CRC (5 bit) and data CRC (16 bit). CRC checks can not be performed due
-to timing constraints: We must start sending a reply within 7 bit times.
-Bit stuffing and misplaced SE0 would have to be checked in real-time, but CPU
-performance does not permit that. The driver does not check Data0/Data1
-toggling, but application software can implement the check.
-
-Input characteristics:
-Since no differential receiver circuit is used, electrical interference
-robustness may suffer. The driver samples only one of the data lines with
-an ordinary I/O pin's input characteristics. However, since this is only a
-low speed USB implementation and the specification allows for 8 times the
-bit rate over the same hardware, we should be on the safe side. Even the spec
-requires detection of asymmetric states at high bit rate for SE0 detection.
-
-Number of endpoints:
-The driver supports the following endpoints:
-
-- Endpoint 0, the default control endpoint.
-- Any number of interrupt- or bulk-out endpoints. The data is sent to
- usbFunctionWriteOut() and USB_CFG_IMPLEMENT_FN_WRITEOUT must be defined
- to 1 to activate this feature. The endpoint number can be found in the
- global variable 'usbRxToken'.
-- One default interrupt- or bulk-in endpoint. This endpoint is used for
- interrupt- or bulk-in transfers which are not handled by any other endpoint.
- You must define USB_CFG_HAVE_INTRIN_ENDPOINT in order to activate this
- feature and call usbSetInterrupt() to send interrupt/bulk data.
-- One additional interrupt- or bulk-in endpoint. This was endpoint 3 in
- previous versions of this driver but can now be configured to any endpoint
- number. You must define USB_CFG_HAVE_INTRIN_ENDPOINT3 in order to activate
- this feature and call usbSetInterrupt3() to send interrupt/bulk data. The
- endpoint number can be set with USB_CFG_EP3_NUMBER.
-
-Please note that the USB standard forbids bulk endpoints for low speed devices!
-Most operating systems allow them anyway, but the AVR will spend 90% of the CPU
-time in the USB interrupt polling for bulk data.
-
-Maximum data payload:
-Data payload of control in and out transfers may be up to 254 bytes. In order
-to accept payload data of out transfers, you need to implement
-'usbFunctionWrite()'.
-
-USB Suspend Mode supply current:
-The USB standard limits power consumption to 500uA when the bus is in suspend
-mode. This is not a problem for self-powered devices since they don't need
-bus power anyway. Bus-powered devices can achieve this only by putting the
-CPU in sleep mode. The driver does not implement suspend handling by itself.
-However, the application may implement activity monitoring and wakeup from
-sleep. The host sends regular SE0 states on the bus to keep it active. These
-SE0 states can be detected by using D- as the interrupt source. Define
-USB_COUNT_SOF to 1 and use the global variable usbSofCount to check for bus
-activity.
-
-Operation without an USB master:
-The driver behaves neutral without connection to an USB master if D- reads
-as 1. To avoid spurious interrupts, we recommend a high impedance (e.g. 1M)
-pull-down or pull-up resistor on D+ (interrupt). If Zener diodes are used,
-use a pull-down. If D- becomes statically 0, the driver may block in the
-interrupt routine.
-
-Interrupt latency:
-The application must ensure that the USB interrupt is not disabled for more
-than 25 cycles (this is for 12 MHz, faster clocks allow longer latency).
-This implies that all interrupt routines must either have the "ISR_NOBLOCK"
-attribute set (see "avr/interrupt.h") or be written in assembler with "sei"
-as the first instruction.
-
-Maximum interrupt duration / CPU cycle consumption:
-The driver handles all USB communication during the interrupt service
-routine. The routine will not return before an entire USB message is received
-and the reply is sent. This may be up to ca. 1200 cycles @ 12 MHz (= 100us) if
-the host conforms to the standard. The driver will consume CPU cycles for all
-USB messages, even if they address another (low-speed) device on the same bus.
-
-*/
-
-/* ------------------------------------------------------------------------- */
-/* --------------------------- Module Interface ---------------------------- */
-/* ------------------------------------------------------------------------- */
-
-#define USBDRV_VERSION 20100715
-/* This define uniquely identifies a driver version. It is a decimal number
- * constructed from the driver's release date in the form YYYYMMDD. If the
- * driver's behavior or interface changes, you can use this constant to
- * distinguish versions. If it is not defined, the driver's release date is
- * older than 2006-01-25.
- */
-
-#ifndef USB_PUBLIC
-# define USB_PUBLIC
-#endif
-/* USB_PUBLIC is used as declaration attribute for all functions exported by
- * the USB driver. The default is no attribute (see above). You may define it
- * to static either in usbconfig.h or from the command line if you include
- * usbdrv.c instead of linking against it. Including the C module of the driver
- * directly in your code saves a couple of bytes in flash memory.
- */
-
-#ifndef __ASSEMBLER__
-# ifndef uchar
-# define uchar unsigned char
-# endif
-# ifndef schar
-# define schar signed char
-# endif
-/* shortcuts for well defined 8 bit integer types */
-
-# if USB_CFG_LONG_TRANSFERS /* if more than 254 bytes transfer size required */
-# define usbMsgLen_t unsigned
-# else
-# define usbMsgLen_t uchar
-# endif
-/* usbMsgLen_t is the data type used for transfer lengths. By default, it is
- * defined to uchar, allowing a maximum of 254 bytes (255 is reserved for
- * USB_NO_MSG below). If the usbconfig.h defines USB_CFG_LONG_TRANSFERS to 1,
- * a 16 bit data type is used, allowing up to 16384 bytes (the rest is used
- * for flags in the descriptor configuration).
- */
-# define USB_NO_MSG ((usbMsgLen_t)-1) /* constant meaning "no message" */
-
-struct usbRequest; /* forward declaration */
-
-USB_PUBLIC void usbInit(void);
-/* This function must be called before interrupts are enabled and the main
- * loop is entered. We exepct that the PORT and DDR bits for D+ and D- have
- * not been changed from their default status (which is 0). If you have changed
- * them, set both back to 0 (configure them as input with no internal pull-up).
- */
-USB_PUBLIC void usbPoll(void);
-/* This function must be called at regular intervals from the main loop.
- * Maximum delay between calls is somewhat less than 50ms (USB timeout for
- * accepting a Setup message). Otherwise the device will not be recognized.
- * Please note that debug outputs through the UART take ~ 0.5ms per byte
- * at 19200 bps.
- */
-extern uchar *usbMsgPtr;
-/* This variable may be used to pass transmit data to the driver from the
- * implementation of usbFunctionWrite(). It is also used internally by the
- * driver for standard control requests.
- */
-USB_PUBLIC usbMsgLen_t usbFunctionSetup(uchar data[8]);
-/* This function is called when the driver receives a SETUP transaction from
- * the host which is not answered by the driver itself (in practice: class and
- * vendor requests). All control transfers start with a SETUP transaction where
- * the host communicates the parameters of the following (optional) data
- * transfer. The SETUP data is available in the 'data' parameter which can
- * (and should) be casted to 'usbRequest_t *' for a more user-friendly access
- * to parameters.
- *
- * If the SETUP indicates a control-in transfer, you should provide the
- * requested data to the driver. There are two ways to transfer this data:
- * (1) Set the global pointer 'usbMsgPtr' to the base of the static RAM data
- * block and return the length of the data in 'usbFunctionSetup()'. The driver
- * will handle the rest. Or (2) return USB_NO_MSG in 'usbFunctionSetup()'. The
- * driver will then call 'usbFunctionRead()' when data is needed. See the
- * documentation for usbFunctionRead() for details.
- *
- * If the SETUP indicates a control-out transfer, the only way to receive the
- * data from the host is through the 'usbFunctionWrite()' call. If you
- * implement this function, you must return USB_NO_MSG in 'usbFunctionSetup()'
- * to indicate that 'usbFunctionWrite()' should be used. See the documentation
- * of this function for more information. If you just want to ignore the data
- * sent by the host, return 0 in 'usbFunctionSetup()'.
- *
- * Note that calls to the functions usbFunctionRead() and usbFunctionWrite()
- * are only done if enabled by the configuration in usbconfig.h.
- */
-USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq);
-/* You need to implement this function ONLY if you provide USB descriptors at
- * runtime (which is an expert feature). It is very similar to
- * usbFunctionSetup() above, but it is called only to request USB descriptor
- * data. See the documentation of usbFunctionSetup() above for more info.
- */
-# if USB_CFG_HAVE_INTRIN_ENDPOINT
-USB_PUBLIC void usbSetInterrupt(uchar *data, uchar len);
-/* This function sets the message which will be sent during the next interrupt
- * IN transfer. The message is copied to an internal buffer and must not exceed
- * a length of 8 bytes. The message may be 0 bytes long just to indicate the
- * interrupt status to the host.
- * If you need to transfer more bytes, use a control read after the interrupt.
- */
-# define usbInterruptIsReady() (usbTxLen1 & 0x10)
-/* This macro indicates whether the last interrupt message has already been
- * sent. If you set a new interrupt message before the old was sent, the
- * message already buffered will be lost.
- */
-# if USB_CFG_HAVE_INTRIN_ENDPOINT3
-USB_PUBLIC void usbSetInterrupt3(uchar *data, uchar len);
-# define usbInterruptIsReady3() (usbTxLen3 & 0x10)
-/* Same as above for endpoint 3 */
-# endif
-# endif /* USB_CFG_HAVE_INTRIN_ENDPOINT */
-# if USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH /* simplified interface for backward compatibility */
-# define usbHidReportDescriptor usbDescriptorHidReport
-/* should be declared as: PROGMEM char usbHidReportDescriptor[]; */
-/* If you implement an HID device, you need to provide a report descriptor.
- * The HID report descriptor syntax is a bit complex. If you understand how
- * report descriptors are constructed, we recommend that you use the HID
- * Descriptor Tool from usb.org, see http://www.usb.org/developers/hidpage/.
- * Otherwise you should probably start with a working example.
- */
-# endif /* USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH */
-# if USB_CFG_IMPLEMENT_FN_WRITE
-USB_PUBLIC uchar usbFunctionWrite(uchar *data, uchar len);
-/* This function is called by the driver to provide a control transfer's
- * payload data (control-out). It is called in chunks of up to 8 bytes. The
- * total count provided in the current control transfer can be obtained from
- * the 'length' property in the setup data. If an error occurred during
- * processing, return 0xff (== -1). The driver will answer the entire transfer
- * with a STALL token in this case. If you have received the entire payload
- * successfully, return 1. If you expect more data, return 0. If you don't
- * know whether the host will send more data (you should know, the total is
- * provided in the usbFunctionSetup() call!), return 1.
- * NOTE: If you return 0xff for STALL, 'usbFunctionWrite()' may still be called
- * for the remaining data. You must continue to return 0xff for STALL in these
- * calls.
- * In order to get usbFunctionWrite() called, define USB_CFG_IMPLEMENT_FN_WRITE
- * to 1 in usbconfig.h and return 0xff in usbFunctionSetup()..
- */
-# endif /* USB_CFG_IMPLEMENT_FN_WRITE */
-# if USB_CFG_IMPLEMENT_FN_READ
-USB_PUBLIC uchar usbFunctionRead(uchar *data, uchar len);
-/* This function is called by the driver to ask the application for a control
- * transfer's payload data (control-in). It is called in chunks of up to 8
- * bytes each. You should copy the data to the location given by 'data' and
- * return the actual number of bytes copied. If you return less than requested,
- * the control-in transfer is terminated. If you return 0xff, the driver aborts
- * the transfer with a STALL token.
- * In order to get usbFunctionRead() called, define USB_CFG_IMPLEMENT_FN_READ
- * to 1 in usbconfig.h and return 0xff in usbFunctionSetup()..
- */
-# endif /* USB_CFG_IMPLEMENT_FN_READ */
-
-extern uchar usbRxToken; /* may be used in usbFunctionWriteOut() below */
-# if USB_CFG_IMPLEMENT_FN_WRITEOUT
-USB_PUBLIC void usbFunctionWriteOut(uchar *data, uchar len);
-/* This function is called by the driver when data is received on an interrupt-
- * or bulk-out endpoint. The endpoint number can be found in the global
- * variable usbRxToken. You must define USB_CFG_IMPLEMENT_FN_WRITEOUT to 1 in
- * usbconfig.h to get this function called.
- */
-# endif /* USB_CFG_IMPLEMENT_FN_WRITEOUT */
-# ifdef USB_CFG_PULLUP_IOPORTNAME
-# define usbDeviceConnect() ((USB_PULLUP_DDR |= (1 << USB_CFG_PULLUP_BIT)), (USB_PULLUP_OUT |= (1 << USB_CFG_PULLUP_BIT)))
-# define usbDeviceDisconnect() ((USB_PULLUP_DDR &= ~(1 << USB_CFG_PULLUP_BIT)), (USB_PULLUP_OUT &= ~(1 << USB_CFG_PULLUP_BIT)))
-# else /* USB_CFG_PULLUP_IOPORTNAME */
-# define usbDeviceConnect() (USBDDR &= ~(1 << USBMINUS))
-# define usbDeviceDisconnect() (USBDDR |= (1 << USBMINUS))
-# endif /* USB_CFG_PULLUP_IOPORTNAME */
-/* The macros usbDeviceConnect() and usbDeviceDisconnect() (intended to look
- * like a function) connect resp. disconnect the device from the host's USB.
- * If the constants USB_CFG_PULLUP_IOPORT and USB_CFG_PULLUP_BIT are defined
- * in usbconfig.h, a disconnect consists of removing the pull-up resisitor
- * from D-, otherwise the disconnect is done by brute-force pulling D- to GND.
- * This does not conform to the spec, but it works.
- * Please note that the USB interrupt must be disabled while the device is
- * in disconnected state, or the interrupt handler will hang! You can either
- * turn off the USB interrupt selectively with
- * USB_INTR_ENABLE &= ~(1 << USB_INTR_ENABLE_BIT)
- * or use cli() to disable interrupts globally.
- */
-extern unsigned usbCrc16(unsigned data, uchar len);
-# define usbCrc16(data, len) usbCrc16((unsigned)(data), len)
-/* This function calculates the binary complement of the data CRC used in
- * USB data packets. The value is used to build raw transmit packets.
- * You may want to use this function for data checksums or to verify received
- * data. We enforce 16 bit calling conventions for compatibility with IAR's
- * tiny memory model.
- */
-extern unsigned usbCrc16Append(unsigned data, uchar len);
-# define usbCrc16Append(data, len) usbCrc16Append((unsigned)(data), len)
-/* This function is equivalent to usbCrc16() above, except that it appends
- * the 2 bytes CRC (lowbyte first) in the 'data' buffer after reading 'len'
- * bytes.
- */
-# if USB_CFG_HAVE_MEASURE_FRAME_LENGTH
-extern unsigned usbMeasureFrameLength(void);
-/* This function MUST be called IMMEDIATELY AFTER USB reset and measures 1/7 of
- * the number of CPU cycles during one USB frame minus one low speed bit
- * length. In other words: return value = 1499 * (F_CPU / 10.5 MHz)
- * Since this is a busy wait, you MUST disable all interrupts with cli() before
- * calling this function.
- * This can be used to calibrate the AVR's RC oscillator.
- */
-# endif
-extern uchar usbConfiguration;
-/* This value contains the current configuration set by the host. The driver
- * allows setting and querying of this variable with the USB SET_CONFIGURATION
- * and GET_CONFIGURATION requests, but does not use it otherwise.
- * You may want to reflect the "configured" status with a LED on the device or
- * switch on high power parts of the circuit only if the device is configured.
- */
-# if USB_COUNT_SOF
-extern volatile uchar usbSofCount;
-/* This variable is incremented on every SOF packet. It is only available if
- * the macro USB_COUNT_SOF is defined to a value != 0.
- */
-# endif
-# if USB_CFG_CHECK_DATA_TOGGLING
-extern uchar usbCurrentDataToken;
-/* This variable can be checked in usbFunctionWrite() and usbFunctionWriteOut()
- * to ignore duplicate packets.
- */
-# endif
-
-# define USB_STRING_DESCRIPTOR_HEADER(stringLength) ((2 * (stringLength) + 2) | (3 << 8))
-/* This macro builds a descriptor header for a string descriptor given the
- * string's length. See usbdrv.c for an example how to use it.
- */
-# if USB_CFG_HAVE_FLOWCONTROL
-extern volatile schar usbRxLen;
-# define usbDisableAllRequests() usbRxLen = -1
-/* Must be called from usbFunctionWrite(). This macro disables all data input
- * from the USB interface. Requests from the host are answered with a NAK
- * while they are disabled.
- */
-# define usbEnableAllRequests() usbRxLen = 0
-/* May only be called if requests are disabled. This macro enables input from
- * the USB interface after it has been disabled with usbDisableAllRequests().
- */
-# define usbAllRequestsAreDisabled() (usbRxLen < 0)
-/* Use this macro to find out whether requests are disabled. It may be needed
- * to ensure that usbEnableAllRequests() is never called when requests are
- * enabled.
- */
-# endif
-
-# define USB_SET_DATATOKEN1(token) usbTxBuf1[0] = token
-# define USB_SET_DATATOKEN3(token) usbTxBuf3[0] = token
-/* These two macros can be used by application software to reset data toggling
- * for interrupt-in endpoints 1 and 3. Since the token is toggled BEFORE
- * sending data, you must set the opposite value of the token which should come
- * first.
- */
-
-#endif /* __ASSEMBLER__ */
-
-/* ------------------------------------------------------------------------- */
-/* ----------------- Definitions for Descriptor Properties ----------------- */
-/* ------------------------------------------------------------------------- */
-/* This is advanced stuff. See usbconfig-prototype.h for more information
- * about the various methods to define USB descriptors. If you do nothing,
- * the default descriptors will be used.
- */
-#define USB_PROP_IS_DYNAMIC (1 << 14)
-/* If this property is set for a descriptor, usbFunctionDescriptor() will be
- * used to obtain the particular descriptor. Data directly returned via
- * usbMsgPtr are FLASH data by default, combine (OR) with USB_PROP_IS_RAM to
- * return RAM data.
- */
-#define USB_PROP_IS_RAM (1 << 15)
-/* If this property is set for a descriptor, the data is read from RAM
- * memory instead of Flash. The property is used for all methods to provide
- * external descriptors.
- */
-#define USB_PROP_LENGTH(len) ((len)&0x3fff)
-/* If a static external descriptor is used, this is the total length of the
- * descriptor in bytes.
- */
-
-/* all descriptors which may have properties: */
-#ifndef USB_CFG_DESCR_PROPS_DEVICE
-# define USB_CFG_DESCR_PROPS_DEVICE 0
-#endif
-#ifndef USB_CFG_DESCR_PROPS_CONFIGURATION
-# define USB_CFG_DESCR_PROPS_CONFIGURATION 0
-#endif
-#ifndef USB_CFG_DESCR_PROPS_STRINGS
-# define USB_CFG_DESCR_PROPS_STRINGS 0
-#endif
-#ifndef USB_CFG_DESCR_PROPS_STRING_0
-# define USB_CFG_DESCR_PROPS_STRING_0 0
-#endif
-#ifndef USB_CFG_DESCR_PROPS_STRING_VENDOR
-# define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
-#endif
-#ifndef USB_CFG_DESCR_PROPS_STRING_PRODUCT
-# define USB_CFG_DESCR_PROPS_STRING_PRODUCT 0
-#endif
-#ifndef USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
-# define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER 0
-#endif
-#ifndef USB_CFG_DESCR_PROPS_HID
-# define USB_CFG_DESCR_PROPS_HID 0
-#endif
-#if !(USB_CFG_DESCR_PROPS_HID_REPORT)
-# undef USB_CFG_DESCR_PROPS_HID_REPORT
-# if USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH /* do some backward compatibility tricks */
-# define USB_CFG_DESCR_PROPS_HID_REPORT USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH
-# else
-# define USB_CFG_DESCR_PROPS_HID_REPORT 0
-# endif
-#endif
-#ifndef USB_CFG_DESCR_PROPS_UNKNOWN
-# define USB_CFG_DESCR_PROPS_UNKNOWN 0
-#endif
-
-/* ------------------ forward declaration of descriptors ------------------- */
-/* If you use external static descriptors, they must be stored in global
- * arrays as declared below:
- */
-#ifndef __ASSEMBLER__
-extern
-# if !(USB_CFG_DESCR_PROPS_DEVICE & USB_PROP_IS_RAM)
- PROGMEM
-# endif
- const char usbDescriptorDevice[];
-
-extern
-# if !(USB_CFG_DESCR_PROPS_CONFIGURATION & USB_PROP_IS_RAM)
- PROGMEM
-# endif
- const char usbDescriptorConfiguration[];
-
-extern
-# if !(USB_CFG_DESCR_PROPS_HID_REPORT & USB_PROP_IS_RAM)
- PROGMEM
-# endif
- const char usbDescriptorHidReport[];
-
-extern
-# if !(USB_CFG_DESCR_PROPS_STRING_0 & USB_PROP_IS_RAM)
- PROGMEM
-# endif
- const char usbDescriptorString0[];
-
-extern
-# if !(USB_CFG_DESCR_PROPS_STRING_VENDOR & USB_PROP_IS_RAM)
- PROGMEM
-# endif
- const int usbDescriptorStringVendor[];
-
-extern
-# if !(USB_CFG_DESCR_PROPS_STRING_PRODUCT & USB_PROP_IS_RAM)
- PROGMEM
-# endif
- const int usbDescriptorStringDevice[];
-
-extern
-# if !(USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER & USB_PROP_IS_RAM)
- PROGMEM
-# endif
- const int usbDescriptorStringSerialNumber[];
-
-#endif /* __ASSEMBLER__ */
-
-/* ------------------------------------------------------------------------- */
-/* ------------------------ General Purpose Macros ------------------------- */
-/* ------------------------------------------------------------------------- */
-
-#define USB_CONCAT(a, b) a##b
-#define USB_CONCAT_EXPANDED(a, b) USB_CONCAT(a, b)
-
-#define USB_OUTPORT(name) USB_CONCAT(PORT, name)
-#define USB_INPORT(name) USB_CONCAT(PIN, name)
-#define USB_DDRPORT(name) USB_CONCAT(DDR, name)
-/* The double-define trick above lets us concatenate strings which are
- * defined by macros.
- */
-
-/* ------------------------------------------------------------------------- */
-/* ------------------------- Constant definitions -------------------------- */
-/* ------------------------------------------------------------------------- */
-
-#if !defined __ASSEMBLER__ && (!defined USB_CFG_VENDOR_ID || !defined USB_CFG_DEVICE_ID)
-# warning "You should define USB_CFG_VENDOR_ID and USB_CFG_DEVICE_ID in usbconfig.h"
-/* If the user has not defined IDs, we default to obdev's free IDs.
- * See USB-IDs-for-free.txt for details.
- */
-#endif
-
-/* make sure we have a VID and PID defined, byte order is lowbyte, highbyte */
-#ifndef USB_CFG_VENDOR_ID
-# define USB_CFG_VENDOR_ID 0xc0, 0x16 /* = 0x16c0 = 5824 = voti.nl */
-#endif
-
-#ifndef USB_CFG_DEVICE_ID
-# if USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH
-# define USB_CFG_DEVICE_ID 0xdf, 0x05 /* = 0x5df = 1503, shared PID for HIDs */
-# elif USB_CFG_INTERFACE_CLASS == 2
-# define USB_CFG_DEVICE_ID 0xe1, 0x05 /* = 0x5e1 = 1505, shared PID for CDC Modems */
-# else
-# define USB_CFG_DEVICE_ID 0xdc, 0x05 /* = 0x5dc = 1500, obdev's free PID */
-# endif
-#endif
-
-/* Derive Output, Input and DataDirection ports from port names */
-#ifndef USB_CFG_IOPORTNAME
-# error "You must define USB_CFG_IOPORTNAME in usbconfig.h, see usbconfig-prototype.h"
-#endif
-
-#define USBOUT USB_OUTPORT(USB_CFG_IOPORTNAME)
-#define USB_PULLUP_OUT USB_OUTPORT(USB_CFG_PULLUP_IOPORTNAME)
-#define USBIN USB_INPORT(USB_CFG_IOPORTNAME)
-#define USBDDR USB_DDRPORT(USB_CFG_IOPORTNAME)
-#define USB_PULLUP_DDR USB_DDRPORT(USB_CFG_PULLUP_IOPORTNAME)
-
-#define USBMINUS USB_CFG_DMINUS_BIT
-#define USBPLUS USB_CFG_DPLUS_BIT
-#define USBIDLE (1 << USB_CFG_DMINUS_BIT) /* value representing J state */
-#define USBMASK ((1 << USB_CFG_DPLUS_BIT) | (1 << USB_CFG_DMINUS_BIT)) /* mask for USB I/O bits */
-
-/* defines for backward compatibility with older driver versions: */
-#define USB_CFG_IOPORT USB_OUTPORT(USB_CFG_IOPORTNAME)
-#ifdef USB_CFG_PULLUP_IOPORTNAME
-# define USB_CFG_PULLUP_IOPORT USB_OUTPORT(USB_CFG_PULLUP_IOPORTNAME)
-#endif
-
-#ifndef USB_CFG_EP3_NUMBER /* if not defined in usbconfig.h */
-# define USB_CFG_EP3_NUMBER 3
-#endif
-
-#ifndef USB_CFG_HAVE_INTRIN_ENDPOINT3
-# define USB_CFG_HAVE_INTRIN_ENDPOINT3 0
-#endif
-
-#define USB_BUFSIZE 11 /* PID, 8 bytes data, 2 bytes CRC */
-
-/* ----- Try to find registers and bits responsible for ext interrupt 0 ----- */
-
-#ifndef USB_INTR_CFG /* allow user to override our default */
-# if defined EICRA
-# define USB_INTR_CFG EICRA
-# else
-# define USB_INTR_CFG MCUCR
-# endif
-#endif
-#ifndef USB_INTR_CFG_SET /* allow user to override our default */
-# if defined(USB_COUNT_SOF) || defined(USB_SOF_HOOK)
-# define USB_INTR_CFG_SET (1 << ISC01) /* cfg for falling edge */
- /* If any SOF logic is used, the interrupt must be wired to D- where
- * we better trigger on falling edge
- */
-# else
-# define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) /* cfg for rising edge */
-# endif
-#endif
-#ifndef USB_INTR_CFG_CLR /* allow user to override our default */
-# define USB_INTR_CFG_CLR 0 /* no bits to clear */
-#endif
-
-#ifndef USB_INTR_ENABLE /* allow user to override our default */
-# if defined GIMSK
-# define USB_INTR_ENABLE GIMSK
-# elif defined EIMSK
-# define USB_INTR_ENABLE EIMSK
-# else
-# define USB_INTR_ENABLE GICR
-# endif
-#endif
-#ifndef USB_INTR_ENABLE_BIT /* allow user to override our default */
-# define USB_INTR_ENABLE_BIT INT0
-#endif
-
-#ifndef USB_INTR_PENDING /* allow user to override our default */
-# if defined EIFR
-# define USB_INTR_PENDING EIFR
-# else
-# define USB_INTR_PENDING GIFR
-# endif
-#endif
-#ifndef USB_INTR_PENDING_BIT /* allow user to override our default */
-# define USB_INTR_PENDING_BIT INTF0
-#endif
-
-/*
-The defines above don't work for the following chips
-at90c8534: no ISC0?, no PORTB, can't find a data sheet
-at86rf401: no PORTB, no MCUCR etc, low clock rate
-atmega103: no ISC0? (maybe omission in header, can't find data sheet)
-atmega603: not defined in avr-libc
-at43usb320, at43usb355, at76c711: have USB anyway
-at94k: is different...
-
-at90s1200, attiny11, attiny12, attiny15, attiny28: these have no RAM
-*/
-
-/* ------------------------------------------------------------------------- */
-/* ----------------- USB Specification Constants and Types ----------------- */
-/* ------------------------------------------------------------------------- */
-
-/* USB Token values */
-#define USBPID_SETUP 0x2d
-#define USBPID_OUT 0xe1
-#define USBPID_IN 0x69
-#define USBPID_DATA0 0xc3
-#define USBPID_DATA1 0x4b
-
-#define USBPID_ACK 0xd2
-#define USBPID_NAK 0x5a
-#define USBPID_STALL 0x1e
-
-#ifndef USB_INITIAL_DATATOKEN
-# define USB_INITIAL_DATATOKEN USBPID_DATA1
-#endif
-
-#ifndef __ASSEMBLER__
-
-typedef struct usbTxStatus {
- volatile uchar len;
- uchar buffer[USB_BUFSIZE];
-} usbTxStatus_t;
-
-extern usbTxStatus_t usbTxStatus1, usbTxStatus3;
-# define usbTxLen1 usbTxStatus1.len
-# define usbTxBuf1 usbTxStatus1.buffer
-# define usbTxLen3 usbTxStatus3.len
-# define usbTxBuf3 usbTxStatus3.buffer
-
-typedef union usbWord {
- unsigned word;
- uchar bytes[2];
-} usbWord_t;
-
-typedef struct usbRequest {
- uchar bmRequestType;
- uchar bRequest;
- usbWord_t wValue;
- usbWord_t wIndex;
- usbWord_t wLength;
-} usbRequest_t;
-/* This structure matches the 8 byte setup request */
-#endif
-
-/* bmRequestType field in USB setup:
- * d t t r r r r r, where
- * d ..... direction: 0=host->device, 1=device->host
- * t ..... type: 0=standard, 1=class, 2=vendor, 3=reserved
- * r ..... recipient: 0=device, 1=interface, 2=endpoint, 3=other
- */
-
-/* USB setup recipient values */
-#define USBRQ_RCPT_MASK 0x1f
-#define USBRQ_RCPT_DEVICE 0
-#define USBRQ_RCPT_INTERFACE 1
-#define USBRQ_RCPT_ENDPOINT 2
-
-/* USB request type values */
-#define USBRQ_TYPE_MASK 0x60
-#define USBRQ_TYPE_STANDARD (0 << 5)
-#define USBRQ_TYPE_CLASS (1 << 5)
-#define USBRQ_TYPE_VENDOR (2 << 5)
-
-/* USB direction values: */
-#define USBRQ_DIR_MASK 0x80
-#define USBRQ_DIR_HOST_TO_DEVICE (0 << 7)
-#define USBRQ_DIR_DEVICE_TO_HOST (1 << 7)
-
-/* USB Standard Requests */
-#define USBRQ_GET_STATUS 0
-#define USBRQ_CLEAR_FEATURE 1
-#define USBRQ_SET_FEATURE 3
-#define USBRQ_SET_ADDRESS 5
-#define USBRQ_GET_DESCRIPTOR 6
-#define USBRQ_SET_DESCRIPTOR 7
-#define USBRQ_GET_CONFIGURATION 8
-#define USBRQ_SET_CONFIGURATION 9
-#define USBRQ_GET_INTERFACE 10
-#define USBRQ_SET_INTERFACE 11
-#define USBRQ_SYNCH_FRAME 12
-
-/* USB descriptor constants */
-#define USBDESCR_DEVICE 1
-#define USBDESCR_CONFIG 2
-#define USBDESCR_STRING 3
-#define USBDESCR_INTERFACE 4
-#define USBDESCR_ENDPOINT 5
-#define USBDESCR_HID 0x21
-#define USBDESCR_HID_REPORT 0x22
-#define USBDESCR_HID_PHYS 0x23
-
-//#define USBATTR_BUSPOWER 0x80 // USB 1.1 does not define this value any more
-#define USBATTR_SELFPOWER 0x40
-#define USBATTR_REMOTEWAKE 0x20
-
-/* USB HID Requests */
-#define USBRQ_HID_GET_REPORT 0x01
-#define USBRQ_HID_GET_IDLE 0x02
-#define USBRQ_HID_GET_PROTOCOL 0x03
-#define USBRQ_HID_SET_REPORT 0x09
-#define USBRQ_HID_SET_IDLE 0x0a
-#define USBRQ_HID_SET_PROTOCOL 0x0b
-
-/* ------------------------------------------------------------------------- */
-
-#endif /* __usbdrv_h_included__ */
diff --git a/tmk_core/protocol/vusb/usbdrv/usbdrvasm.S b/tmk_core/protocol/vusb/usbdrv/usbdrvasm.S
deleted file mode 100644
index 2e8097da9c..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/usbdrvasm.S
+++ /dev/null
@@ -1,393 +0,0 @@
-/* Name: usbdrvasm.S
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2007-06-13
- * Tabsize: 4
- * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * Revision: $Id: usbdrvasm.S 785 2010-05-30 17:57:07Z cs $
- */
-
-/*
-General Description:
-This module is the assembler part of the USB driver. This file contains
-general code (preprocessor acrobatics and CRC computation) and then includes
-the file appropriate for the given clock rate.
-*/
-
-#define __SFR_OFFSET 0 /* used by avr-libc's register definitions */
-#include "usbportability.h"
-#include "usbdrv.h" /* for common defs */
-
-/* register names */
-#define x1 r16
-#define x2 r17
-#define shift r18
-#define cnt r19
-#define x3 r20
-#define x4 r21
-#define x5 r22
-#define bitcnt x5
-#define phase x4
-#define leap x4
-
-/* Some assembler dependent definitions and declarations: */
-
-#ifdef __IAR_SYSTEMS_ASM__
- extern usbRxBuf, usbDeviceAddr, usbNewDeviceAddr, usbInputBufOffset
- extern usbCurrentTok, usbRxLen, usbRxToken, usbTxLen
- extern usbTxBuf, usbTxStatus1, usbTxStatus3
-# if USB_COUNT_SOF
- extern usbSofCount
-# endif
- public usbCrc16
- public usbCrc16Append
-
- COMMON INTVEC
-# ifndef USB_INTR_VECTOR
- ORG INT0_vect
-# else /* USB_INTR_VECTOR */
- ORG USB_INTR_VECTOR
-# undef USB_INTR_VECTOR
-# endif /* USB_INTR_VECTOR */
-# define USB_INTR_VECTOR usbInterruptHandler
- rjmp USB_INTR_VECTOR
- RSEG CODE
-
-#else /* __IAR_SYSTEMS_ASM__ */
-
-# ifndef USB_INTR_VECTOR /* default to hardware interrupt INT0 */
-# ifdef INT0_vect
-# define USB_INTR_VECTOR INT0_vect // this is the "new" define for the vector
-# else
-# define USB_INTR_VECTOR SIG_INTERRUPT0 // this is the "old" vector
-# endif
-# endif
- .text
- .global USB_INTR_VECTOR
- .type USB_INTR_VECTOR, @function
- .global usbCrc16
- .global usbCrc16Append
-#endif /* __IAR_SYSTEMS_ASM__ */
-
-
-#if USB_INTR_PENDING < 0x40 /* This is an I/O address, use in and out */
-# define USB_LOAD_PENDING(reg) in reg, USB_INTR_PENDING
-# define USB_STORE_PENDING(reg) out USB_INTR_PENDING, reg
-#else /* It's a memory address, use lds and sts */
-# define USB_LOAD_PENDING(reg) lds reg, USB_INTR_PENDING
-# define USB_STORE_PENDING(reg) sts USB_INTR_PENDING, reg
-#endif
-
-#define usbTxLen1 usbTxStatus1
-#define usbTxBuf1 (usbTxStatus1 + 1)
-#define usbTxLen3 usbTxStatus3
-#define usbTxBuf3 (usbTxStatus3 + 1)
-
-
-;----------------------------------------------------------------------------
-; Utility functions
-;----------------------------------------------------------------------------
-
-#ifdef __IAR_SYSTEMS_ASM__
-/* Register assignments for usbCrc16 on IAR cc */
-/* Calling conventions on IAR:
- * First parameter passed in r16/r17, second in r18/r19 and so on.
- * Callee must preserve r4-r15, r24-r29 (r28/r29 is frame pointer)
- * Result is passed in r16/r17
- * In case of the "tiny" memory model, pointers are only 8 bit with no
- * padding. We therefore pass argument 1 as "16 bit unsigned".
- */
-RTMODEL "__rt_version", "3"
-/* The line above will generate an error if cc calling conventions change.
- * The value "3" above is valid for IAR 4.10B/W32
- */
-# define argLen r18 /* argument 2 */
-# define argPtrL r16 /* argument 1 */
-# define argPtrH r17 /* argument 1 */
-
-# define resCrcL r16 /* result */
-# define resCrcH r17 /* result */
-
-# define ptrL ZL
-# define ptrH ZH
-# define ptr Z
-# define byte r22
-# define bitCnt r19
-# define polyL r20
-# define polyH r21
-# define scratch r23
-
-#else /* __IAR_SYSTEMS_ASM__ */
-/* Register assignments for usbCrc16 on gcc */
-/* Calling conventions on gcc:
- * First parameter passed in r24/r25, second in r22/23 and so on.
- * Callee must preserve r1-r17, r28/r29
- * Result is passed in r24/r25
- */
-# define argLen r22 /* argument 2 */
-# define argPtrL r24 /* argument 1 */
-# define argPtrH r25 /* argument 1 */
-
-# define resCrcL r24 /* result */
-# define resCrcH r25 /* result */
-
-# define ptrL XL
-# define ptrH XH
-# define ptr x
-# define byte r18
-# define bitCnt r19
-# define polyL r20
-# define polyH r21
-# define scratch r23
-
-#endif
-
-#if USB_USE_FAST_CRC
-
-; This implementation is faster, but has bigger code size
-; Thanks to Slawomir Fras (BoskiDialer) for this code!
-; It implements the following C pseudo-code:
-; unsigned table(unsigned char x)
-; {
-; unsigned value;
-;
-; value = (unsigned)x << 6;
-; value ^= (unsigned)x << 7;
-; if(parity(x))
-; value ^= 0xc001;
-; return value;
-; }
-; unsigned usbCrc16(unsigned char *argPtr, unsigned char argLen)
-; {
-; unsigned crc = 0xffff;
-;
-; while(argLen--)
-; crc = table(lo8(crc) ^ *argPtr++) ^ hi8(crc);
-; return ~crc;
-; }
-
-; extern unsigned usbCrc16(unsigned char *argPtr, unsigned char argLen);
-; argPtr r24+25 / r16+r17
-; argLen r22 / r18
-; temp variables:
-; byte r18 / r22
-; scratch r23
-; resCrc r24+r25 / r16+r17
-; ptr X / Z
-usbCrc16:
- mov ptrL, argPtrL
- mov ptrH, argPtrH
- ldi resCrcL, 0xFF
- ldi resCrcH, 0xFF
- rjmp usbCrc16LoopTest
-usbCrc16ByteLoop:
- ld byte, ptr+
- eor resCrcL, byte ; resCrcL is now 'x' in table()
- mov byte, resCrcL ; compute parity of 'x'
- swap byte
- eor byte, resCrcL
- mov scratch, byte
- lsr byte
- lsr byte
- eor byte, scratch
- inc byte
- lsr byte
- andi byte, 1 ; byte is now parity(x)
- mov scratch, resCrcL
- mov resCrcL, resCrcH
- eor resCrcL, byte ; low byte of if(parity(x)) value ^= 0xc001;
- neg byte
- andi byte, 0xc0
- mov resCrcH, byte ; high byte of if(parity(x)) value ^= 0xc001;
- clr byte
- lsr scratch
- ror byte
- eor resCrcH, scratch
- eor resCrcL, byte
- lsr scratch
- ror byte
- eor resCrcH, scratch
- eor resCrcL, byte
-usbCrc16LoopTest:
- subi argLen, 1
- brsh usbCrc16ByteLoop
- com resCrcL
- com resCrcH
- ret
-
-#else /* USB_USE_FAST_CRC */
-
-; This implementation is slower, but has less code size
-;
-; extern unsigned usbCrc16(unsigned char *argPtr, unsigned char argLen);
-; argPtr r24+25 / r16+r17
-; argLen r22 / r18
-; temp variables:
-; byte r18 / r22
-; bitCnt r19
-; poly r20+r21
-; scratch r23
-; resCrc r24+r25 / r16+r17
-; ptr X / Z
-usbCrc16:
- mov ptrL, argPtrL
- mov ptrH, argPtrH
- ldi resCrcL, 0
- ldi resCrcH, 0
- ldi polyL, lo8(0xa001)
- ldi polyH, hi8(0xa001)
- com argLen ; argLen = -argLen - 1: modified loop to ensure that carry is set
- ldi bitCnt, 0 ; loop counter with starnd condition = end condition
- rjmp usbCrcLoopEntry
-usbCrcByteLoop:
- ld byte, ptr+
- eor resCrcL, byte
-usbCrcBitLoop:
- ror resCrcH ; carry is always set here (see brcs jumps to here)
- ror resCrcL
- brcs usbCrcNoXor
- eor resCrcL, polyL
- eor resCrcH, polyH
-usbCrcNoXor:
- subi bitCnt, 224 ; (8 * 224) % 256 = 0; this loop iterates 8 times
- brcs usbCrcBitLoop
-usbCrcLoopEntry:
- subi argLen, -1
- brcs usbCrcByteLoop
-usbCrcReady:
- ret
-; Thanks to Reimar Doeffinger for optimizing this CRC routine!
-
-#endif /* USB_USE_FAST_CRC */
-
-; extern unsigned usbCrc16Append(unsigned char *data, unsigned char len);
-usbCrc16Append:
- rcall usbCrc16
- st ptr+, resCrcL
- st ptr+, resCrcH
- ret
-
-#undef argLen
-#undef argPtrL
-#undef argPtrH
-#undef resCrcL
-#undef resCrcH
-#undef ptrL
-#undef ptrH
-#undef ptr
-#undef byte
-#undef bitCnt
-#undef polyL
-#undef polyH
-#undef scratch
-
-
-#if USB_CFG_HAVE_MEASURE_FRAME_LENGTH
-#ifdef __IAR_SYSTEMS_ASM__
-/* Register assignments for usbMeasureFrameLength on IAR cc */
-/* Calling conventions on IAR:
- * First parameter passed in r16/r17, second in r18/r19 and so on.
- * Callee must preserve r4-r15, r24-r29 (r28/r29 is frame pointer)
- * Result is passed in r16/r17
- * In case of the "tiny" memory model, pointers are only 8 bit with no
- * padding. We therefore pass argument 1 as "16 bit unsigned".
- */
-# define resL r16
-# define resH r17
-# define cnt16L r30
-# define cnt16H r31
-# define cntH r18
-
-#else /* __IAR_SYSTEMS_ASM__ */
-/* Register assignments for usbMeasureFrameLength on gcc */
-/* Calling conventions on gcc:
- * First parameter passed in r24/r25, second in r22/23 and so on.
- * Callee must preserve r1-r17, r28/r29
- * Result is passed in r24/r25
- */
-# define resL r24
-# define resH r25
-# define cnt16L r24
-# define cnt16H r25
-# define cntH r26
-#endif
-# define cnt16 cnt16L
-
-; extern unsigned usbMeasurePacketLength(void);
-; returns time between two idle strobes in multiples of 7 CPU clocks
-.global usbMeasureFrameLength
-usbMeasureFrameLength:
- ldi cntH, 6 ; wait ~ 10 ms for D- == 0
- clr cnt16L
- clr cnt16H
-usbMFTime16:
- dec cntH
- breq usbMFTimeout
-usbMFWaitStrobe: ; first wait for D- == 0 (idle strobe)
- sbiw cnt16, 1 ;[0] [6]
- breq usbMFTime16 ;[2]
- sbic USBIN, USBMINUS ;[3]
- rjmp usbMFWaitStrobe ;[4]
-usbMFWaitIdle: ; then wait until idle again
- sbis USBIN, USBMINUS ;1 wait for D- == 1
- rjmp usbMFWaitIdle ;2
- ldi cnt16L, 1 ;1 represents cycles so far
- clr cnt16H ;1
-usbMFWaitLoop:
- in cntH, USBIN ;[0] [7]
- adiw cnt16, 1 ;[1]
- breq usbMFTimeout ;[3]
- andi cntH, USBMASK ;[4]
- brne usbMFWaitLoop ;[5]
-usbMFTimeout:
-#if resL != cnt16L
- mov resL, cnt16L
- mov resH, cnt16H
-#endif
- ret
-
-#undef resL
-#undef resH
-#undef cnt16
-#undef cnt16L
-#undef cnt16H
-#undef cntH
-
-#endif /* USB_CFG_HAVE_MEASURE_FRAME_LENGTH */
-
-;----------------------------------------------------------------------------
-; Now include the clock rate specific code
-;----------------------------------------------------------------------------
-
-#ifndef USB_CFG_CLOCK_KHZ
-# ifdef F_CPU
-# define USB_CFG_CLOCK_KHZ (F_CPU/1000)
-# else
-# error "USB_CFG_CLOCK_KHZ not defined in usbconfig.h and no F_CPU set!"
-# endif
-#endif
-
-#if USB_CFG_CHECK_CRC /* separate dispatcher for CRC type modules */
-# if USB_CFG_CLOCK_KHZ == 18000
-# include "usbdrvasm18-crc.inc"
-# else
-# error "USB_CFG_CLOCK_KHZ is not one of the supported crc-rates!"
-# endif
-#else /* USB_CFG_CHECK_CRC */
-# if USB_CFG_CLOCK_KHZ == 12000
-# include "usbdrvasm12.inc"
-# elif USB_CFG_CLOCK_KHZ == 12800
-# include "usbdrvasm128.inc"
-# elif USB_CFG_CLOCK_KHZ == 15000
-# include "usbdrvasm15.inc"
-# elif USB_CFG_CLOCK_KHZ == 16000
-# include "usbdrvasm16.inc"
-# elif USB_CFG_CLOCK_KHZ == 16500
-# include "usbdrvasm165.inc"
-# elif USB_CFG_CLOCK_KHZ == 20000
-# include "usbdrvasm20.inc"
-# else
-# error "USB_CFG_CLOCK_KHZ is not one of the supported non-crc-rates!"
-# endif
-#endif /* USB_CFG_CHECK_CRC */
diff --git a/tmk_core/protocol/vusb/usbdrv/usbdrvasm.asm b/tmk_core/protocol/vusb/usbdrv/usbdrvasm.asm
deleted file mode 100644
index 9cc4e4d739..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/usbdrvasm.asm
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Name: usbdrvasm.asm
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2006-03-01
- * Tabsize: 4
- * Copyright: (c) 2006 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id$
- */
-
-/*
-General Description:
-The IAR compiler/assembler system prefers assembler files with file extension
-".asm". We simply provide this file as an alias for usbdrvasm.S.
-
-Thanks to Oleg Semyonov for his help with the IAR tools port!
-*/
-
-#include "usbdrvasm.S"
-
-end
diff --git a/tmk_core/protocol/vusb/usbdrv/usbdrvasm12.inc b/tmk_core/protocol/vusb/usbdrv/usbdrvasm12.inc
deleted file mode 100644
index c1167584cb..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/usbdrvasm12.inc
+++ /dev/null
@@ -1,393 +0,0 @@
-/* Name: usbdrvasm12.inc
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2004-12-29
- * Tabsize: 4
- * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbdrvasm12.inc 740 2009-04-13 18:23:31Z cs $
- */
-
-/* Do not link this file! Link usbdrvasm.S instead, which includes the
- * appropriate implementation!
- */
-
-/*
-General Description:
-This file is the 12 MHz version of the asssembler part of the USB driver. It
-requires a 12 MHz crystal (not a ceramic resonator and not a calibrated RC
-oscillator).
-
-See usbdrv.h for a description of the entire driver.
-
-Since almost all of this code is timing critical, don't change unless you
-really know what you are doing! Many parts require not only a maximum number
-of CPU cycles, but even an exact number of cycles!
-
-
-Timing constraints according to spec (in bit times):
-timing subject min max CPUcycles
----------------------------------------------------------------------------
-EOP of OUT/SETUP to sync pattern of DATA0 (both rx) 2 16 16-128
-EOP of IN to sync pattern of DATA0 (rx, then tx) 2 7.5 16-60
-DATAx (rx) to ACK/NAK/STALL (tx) 2 7.5 16-60
-*/
-
-;Software-receiver engine. Strict timing! Don't change unless you can preserve timing!
-;interrupt response time: 4 cycles + insn running = 7 max if interrupts always enabled
-;max allowable interrupt latency: 34 cycles -> max 25 cycles interrupt disable
-;max stack usage: [ret(2), YL, SREG, YH, shift, x1, x2, x3, cnt, x4] = 11 bytes
-;Numbers in brackets are maximum cycles since SOF.
-USB_INTR_VECTOR:
-;order of registers pushed: YL, SREG [sofError], YH, shift, x1, x2, x3, cnt
- push YL ;2 [35] push only what is necessary to sync with edge ASAP
- in YL, SREG ;1 [37]
- push YL ;2 [39]
-;----------------------------------------------------------------------------
-; Synchronize with sync pattern:
-;----------------------------------------------------------------------------
-;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K]
-;sync up with J to K edge during sync pattern -- use fastest possible loops
-;The first part waits at most 1 bit long since we must be in sync pattern.
-;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to
-;waitForJ, ensure that this prerequisite is met.
-waitForJ:
- inc YL
- sbis USBIN, USBMINUS
- brne waitForJ ; just make sure we have ANY timeout
-waitForK:
-;The following code results in a sampling window of 1/4 bit which meets the spec.
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
-#if USB_COUNT_SOF
- lds YL, usbSofCount
- inc YL
- sts usbSofCount, YL
-#endif /* USB_COUNT_SOF */
-#ifdef USB_SOF_HOOK
- USB_SOF_HOOK
-#endif
- rjmp sofError
-foundK:
-;{3, 5} after falling D- edge, average delay: 4 cycles [we want 4 for center sampling]
-;we have 1 bit time for setup purposes, then sample again. Numbers in brackets
-;are cycles from center of first sync (double K) bit after the instruction
- push YH ;2 [2]
- lds YL, usbInputBufOffset;2 [4]
- clr YH ;1 [5]
- subi YL, lo8(-(usbRxBuf));1 [6]
- sbci YH, hi8(-(usbRxBuf));1 [7]
-
- sbis USBIN, USBMINUS ;1 [8] we want two bits K [sample 1 cycle too early]
- rjmp haveTwoBitsK ;2 [10]
- pop YH ;2 [11] undo the push from before
- rjmp waitForK ;2 [13] this was not the end of sync, retry
-haveTwoBitsK:
-;----------------------------------------------------------------------------
-; push more registers and initialize values while we sample the first bits:
-;----------------------------------------------------------------------------
- push shift ;2 [16]
- push x1 ;2 [12]
- push x2 ;2 [14]
-
- in x1, USBIN ;1 [17] <-- sample bit 0
- ldi shift, 0xff ;1 [18]
- bst x1, USBMINUS ;1 [19]
- bld shift, 0 ;1 [20]
- push x3 ;2 [22]
- push cnt ;2 [24]
-
- in x2, USBIN ;1 [25] <-- sample bit 1
- ser x3 ;1 [26] [inserted init instruction]
- eor x1, x2 ;1 [27]
- bst x1, USBMINUS ;1 [28]
- bld shift, 1 ;1 [29]
- ldi cnt, USB_BUFSIZE;1 [30] [inserted init instruction]
- rjmp rxbit2 ;2 [32]
-
-;----------------------------------------------------------------------------
-; Receiver loop (numbers in brackets are cycles within byte after instr)
-;----------------------------------------------------------------------------
-
-unstuff0: ;1 (branch taken)
- andi x3, ~0x01 ;1 [15]
- mov x1, x2 ;1 [16] x2 contains last sampled (stuffed) bit
- in x2, USBIN ;1 [17] <-- sample bit 1 again
- ori shift, 0x01 ;1 [18]
- rjmp didUnstuff0 ;2 [20]
-
-unstuff1: ;1 (branch taken)
- mov x2, x1 ;1 [21] x1 contains last sampled (stuffed) bit
- andi x3, ~0x02 ;1 [22]
- ori shift, 0x02 ;1 [23]
- nop ;1 [24]
- in x1, USBIN ;1 [25] <-- sample bit 2 again
- rjmp didUnstuff1 ;2 [27]
-
-unstuff2: ;1 (branch taken)
- andi x3, ~0x04 ;1 [29]
- ori shift, 0x04 ;1 [30]
- mov x1, x2 ;1 [31] x2 contains last sampled (stuffed) bit
- nop ;1 [32]
- in x2, USBIN ;1 [33] <-- sample bit 3
- rjmp didUnstuff2 ;2 [35]
-
-unstuff3: ;1 (branch taken)
- in x2, USBIN ;1 [34] <-- sample stuffed bit 3 [one cycle too late]
- andi x3, ~0x08 ;1 [35]
- ori shift, 0x08 ;1 [36]
- rjmp didUnstuff3 ;2 [38]
-
-unstuff4: ;1 (branch taken)
- andi x3, ~0x10 ;1 [40]
- in x1, USBIN ;1 [41] <-- sample stuffed bit 4
- ori shift, 0x10 ;1 [42]
- rjmp didUnstuff4 ;2 [44]
-
-unstuff5: ;1 (branch taken)
- andi x3, ~0x20 ;1 [48]
- in x2, USBIN ;1 [49] <-- sample stuffed bit 5
- ori shift, 0x20 ;1 [50]
- rjmp didUnstuff5 ;2 [52]
-
-unstuff6: ;1 (branch taken)
- andi x3, ~0x40 ;1 [56]
- in x1, USBIN ;1 [57] <-- sample stuffed bit 6
- ori shift, 0x40 ;1 [58]
- rjmp didUnstuff6 ;2 [60]
-
-; extra jobs done during bit interval:
-; bit 0: store, clear [SE0 is unreliable here due to bit dribbling in hubs]
-; bit 1: se0 check
-; bit 2: overflow check
-; bit 3: recovery from delay [bit 0 tasks took too long]
-; bit 4: none
-; bit 5: none
-; bit 6: none
-; bit 7: jump, eor
-rxLoop:
- eor x3, shift ;1 [0] reconstruct: x3 is 0 at bit locations we changed, 1 at others
- in x1, USBIN ;1 [1] <-- sample bit 0
- st y+, x3 ;2 [3] store data
- ser x3 ;1 [4]
- nop ;1 [5]
- eor x2, x1 ;1 [6]
- bst x2, USBMINUS;1 [7]
- bld shift, 0 ;1 [8]
- in x2, USBIN ;1 [9] <-- sample bit 1 (or possibly bit 0 stuffed)
- andi x2, USBMASK ;1 [10]
- breq se0 ;1 [11] SE0 check for bit 1
- andi shift, 0xf9 ;1 [12]
-didUnstuff0:
- breq unstuff0 ;1 [13]
- eor x1, x2 ;1 [14]
- bst x1, USBMINUS;1 [15]
- bld shift, 1 ;1 [16]
-rxbit2:
- in x1, USBIN ;1 [17] <-- sample bit 2 (or possibly bit 1 stuffed)
- andi shift, 0xf3 ;1 [18]
- breq unstuff1 ;1 [19] do remaining work for bit 1
-didUnstuff1:
- subi cnt, 1 ;1 [20]
- brcs overflow ;1 [21] loop control
- eor x2, x1 ;1 [22]
- bst x2, USBMINUS;1 [23]
- bld shift, 2 ;1 [24]
- in x2, USBIN ;1 [25] <-- sample bit 3 (or possibly bit 2 stuffed)
- andi shift, 0xe7 ;1 [26]
- breq unstuff2 ;1 [27]
-didUnstuff2:
- eor x1, x2 ;1 [28]
- bst x1, USBMINUS;1 [29]
- bld shift, 3 ;1 [30]
-didUnstuff3:
- andi shift, 0xcf ;1 [31]
- breq unstuff3 ;1 [32]
- in x1, USBIN ;1 [33] <-- sample bit 4
- eor x2, x1 ;1 [34]
- bst x2, USBMINUS;1 [35]
- bld shift, 4 ;1 [36]
-didUnstuff4:
- andi shift, 0x9f ;1 [37]
- breq unstuff4 ;1 [38]
- nop2 ;2 [40]
- in x2, USBIN ;1 [41] <-- sample bit 5
- eor x1, x2 ;1 [42]
- bst x1, USBMINUS;1 [43]
- bld shift, 5 ;1 [44]
-didUnstuff5:
- andi shift, 0x3f ;1 [45]
- breq unstuff5 ;1 [46]
- nop2 ;2 [48]
- in x1, USBIN ;1 [49] <-- sample bit 6
- eor x2, x1 ;1 [50]
- bst x2, USBMINUS;1 [51]
- bld shift, 6 ;1 [52]
-didUnstuff6:
- cpi shift, 0x02 ;1 [53]
- brlo unstuff6 ;1 [54]
- nop2 ;2 [56]
- in x2, USBIN ;1 [57] <-- sample bit 7
- eor x1, x2 ;1 [58]
- bst x1, USBMINUS;1 [59]
- bld shift, 7 ;1 [60]
-didUnstuff7:
- cpi shift, 0x04 ;1 [61]
- brsh rxLoop ;2 [63] loop control
-unstuff7:
- andi x3, ~0x80 ;1 [63]
- ori shift, 0x80 ;1 [64]
- in x2, USBIN ;1 [65] <-- sample stuffed bit 7
- nop ;1 [66]
- rjmp didUnstuff7 ;2 [68]
-
-macro POP_STANDARD ; 12 cycles
- pop cnt
- pop x3
- pop x2
- pop x1
- pop shift
- pop YH
- endm
-macro POP_RETI ; 5 cycles
- pop YL
- out SREG, YL
- pop YL
- endm
-
-#include "asmcommon.inc"
-
-;----------------------------------------------------------------------------
-; Transmitting data
-;----------------------------------------------------------------------------
-
-txByteLoop:
-txBitloop:
-stuffN1Delay: ; [03]
- ror shift ;[-5] [11] [59]
- brcc doExorN1 ;[-4] [60]
- subi x4, 1 ;[-3]
- brne commonN1 ;[-2]
- lsl shift ;[-1] compensate ror after rjmp stuffDelay
- nop ;[00] stuffing consists of just waiting 8 cycles
- rjmp stuffN1Delay ;[01] after ror, C bit is reliably clear
-
-sendNakAndReti: ;0 [-19] 19 cycles until SOP
- ldi x3, USBPID_NAK ;1 [-18]
- rjmp usbSendX3 ;2 [-16]
-sendAckAndReti: ;0 [-19] 19 cycles until SOP
- ldi x3, USBPID_ACK ;1 [-18]
- rjmp usbSendX3 ;2 [-16]
-sendCntAndReti: ;0 [-17] 17 cycles until SOP
- mov x3, cnt ;1 [-16]
-usbSendX3: ;0 [-16]
- ldi YL, 20 ;1 [-15] 'x3' is R20
- ldi YH, 0 ;1 [-14]
- ldi cnt, 2 ;1 [-13]
-; rjmp usbSendAndReti fallthrough
-
-; USB spec says:
-; idle = J
-; J = (D+ = 0), (D- = 1) or USBOUT = 0x01
-; K = (D+ = 1), (D- = 0) or USBOUT = 0x02
-; Spec allows 7.5 bit times from EOP to SOP for replies (= 60 cycles)
-
-;usbSend:
-;pointer to data in 'Y'
-;number of bytes in 'cnt' -- including sync byte
-;uses: x1...x2, x4, shift, cnt, Y [x1 = mirror USBOUT, x2 = USBMASK, x4 = bitstuff cnt]
-;Numbers in brackets are time since first bit of sync pattern is sent (start of instruction)
-usbSendAndReti:
- in x2, USBDDR ;[-12] 12 cycles until SOP
- ori x2, USBMASK ;[-11]
- sbi USBOUT, USBMINUS ;[-10] prepare idle state; D+ and D- must have been 0 (no pullups)
- out USBDDR, x2 ;[-8] <--- acquire bus
- in x1, USBOUT ;[-7] port mirror for tx loop
- ldi shift, 0x40 ;[-6] sync byte is first byte sent (we enter loop after ror)
- ldi x2, USBMASK ;[-5]
- push x4 ;[-4]
-doExorN1:
- eor x1, x2 ;[-2] [06] [62]
- ldi x4, 6 ;[-1] [07] [63]
-commonN1:
-stuffN2Delay:
- out USBOUT, x1 ;[00] [08] [64] <--- set bit
- ror shift ;[01]
- brcc doExorN2 ;[02]
- subi x4, 1 ;[03]
- brne commonN2 ;[04]
- lsl shift ;[05] compensate ror after rjmp stuffDelay
- rjmp stuffN2Delay ;[06] after ror, C bit is reliably clear
-doExorN2:
- eor x1, x2 ;[04] [12]
- ldi x4, 6 ;[05] [13]
-commonN2:
- nop ;[06] [14]
- subi cnt, 171 ;[07] [15] trick: (3 * 171) & 0xff = 1
- out USBOUT, x1 ;[08] [16] <--- set bit
- brcs txBitloop ;[09] [25] [41]
-
-stuff6Delay:
- ror shift ;[42] [50]
- brcc doExor6 ;[43]
- subi x4, 1 ;[44]
- brne common6 ;[45]
- lsl shift ;[46] compensate ror after rjmp stuffDelay
- nop ;[47] stuffing consists of just waiting 8 cycles
- rjmp stuff6Delay ;[48] after ror, C bit is reliably clear
-doExor6:
- eor x1, x2 ;[45] [53]
- ldi x4, 6 ;[46]
-common6:
-stuff7Delay:
- ror shift ;[47] [55]
- out USBOUT, x1 ;[48] <--- set bit
- brcc doExor7 ;[49]
- subi x4, 1 ;[50]
- brne common7 ;[51]
- lsl shift ;[52] compensate ror after rjmp stuffDelay
- rjmp stuff7Delay ;[53] after ror, C bit is reliably clear
-doExor7:
- eor x1, x2 ;[51] [59]
- ldi x4, 6 ;[52]
-common7:
- ld shift, y+ ;[53]
- tst cnt ;[55]
- out USBOUT, x1 ;[56] <--- set bit
- brne txByteLoop ;[57]
-
-;make SE0:
- cbr x1, USBMASK ;[58] prepare SE0 [spec says EOP may be 15 to 18 cycles]
- lds x2, usbNewDeviceAddr;[59]
- lsl x2 ;[61] we compare with left shifted address
- subi YL, 2 + 20 ;[62] Only assign address on data packets, not ACK/NAK in x3
- sbci YH, 0 ;[63]
- out USBOUT, x1 ;[00] <-- out SE0 -- from now 2 bits = 16 cycles until bus idle
-;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm:
-;set address only after data packet was sent, not after handshake
- breq skipAddrAssign ;[01]
- sts usbDeviceAddr, x2 ; if not skipped: SE0 is one cycle longer
-skipAddrAssign:
-;end of usbDeviceAddress transfer
- ldi x2, 1<<USB_INTR_PENDING_BIT;[03] int0 occurred during TX -- clear pending flag
- USB_STORE_PENDING(x2) ;[04]
- ori x1, USBIDLE ;[05]
- in x2, USBDDR ;[06]
- cbr x2, USBMASK ;[07] set both pins to input
- mov x3, x1 ;[08]
- cbr x3, USBMASK ;[09] configure no pullup on both pins
- pop x4 ;[10]
- nop2 ;[12]
- nop2 ;[14]
- out USBOUT, x1 ;[16] <-- out J (idle) -- end of SE0 (EOP signal)
- out USBDDR, x2 ;[17] <-- release bus now
- out USBOUT, x3 ;[18] <-- ensure no pull-up resistors are active
- rjmp doReturn
diff --git a/tmk_core/protocol/vusb/usbdrv/usbdrvasm128.inc b/tmk_core/protocol/vusb/usbdrv/usbdrvasm128.inc
deleted file mode 100644
index bcd6621cc2..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/usbdrvasm128.inc
+++ /dev/null
@@ -1,750 +0,0 @@
-/* Name: usbdrvasm128.inc
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2008-10-11
- * Tabsize: 4
- * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbdrvasm128.inc 758 2009-08-06 10:12:54Z cs $
- */
-
-/* Do not link this file! Link usbdrvasm.S instead, which includes the
- * appropriate implementation!
- */
-
-/*
-General Description:
-This file is the 12.8 MHz version of the USB driver. It is intended for use
-with the internal RC oscillator. Although 12.8 MHz is outside the guaranteed
-calibration range of the oscillator, almost all AVRs can reach this frequency.
-This version contains a phase locked loop in the receiver routine to cope with
-slight clock rate deviations of up to +/- 1%.
-
-See usbdrv.h for a description of the entire driver.
-
-LIMITATIONS
-===========
-Although it may seem very handy to save the crystal and use the internal
-RC oscillator of the CPU, this method (and this module) has some serious
-limitations:
-(1) The guaranteed calibration range of the oscillator is only 8.1 MHz.
-They typical range is 14.5 MHz and most AVRs can actually reach this rate.
-(2) Writing EEPROM and Flash may be unreliable (short data lifetime) since
-the write procedure is timed from the RC oscillator.
-(3) End Of Packet detection (SE0) should be in bit 1, bit it is only checked
-if bits 0 and 1 both read as 0 on D- and D+ read as 0 in the middle. This may
-cause problems with old hubs which delay SE0 by up to one cycle.
-(4) Code size is much larger than that of the other modules.
-
-Since almost all of this code is timing critical, don't change unless you
-really know what you are doing! Many parts require not only a maximum number
-of CPU cycles, but even an exact number of cycles!
-
-Implementation notes:
-======================
-min frequency: 67 cycles for 8 bit -> 12.5625 MHz
-max frequency: 69.286 cycles for 8 bit -> 12.99 MHz
-nominal frequency: 12.77 MHz ( = sqrt(min * max))
-
-sampling positions: (next even number in range [+/- 0.5])
-cycle index range: 0 ... 66
-bits:
-.5, 8.875, 17.25, 25.625, 34, 42.375, 50.75, 59.125
-[0/1], [9], [17], [25/+26], [34], [+42/43], [51], [59]
-
-bit number: 0 1 2 3 4 5 6 7
-spare cycles 1 2 1 2 1 1 1 0
-
-operations to perform: duration cycle
- ----------------
- eor fix, shift 1 -> 00
- andi phase, USBMASK 1 -> 08
- breq se0 1 -> 16 (moved to 11)
- st y+, data 2 -> 24, 25
- mov data, fix 1 -> 33
- ser data 1 -> 41
- subi cnt, 1 1 -> 49
- brcs overflow 1 -> 50
-
-layout of samples and operations:
-[##] = sample bit
-<##> = sample phase
-*##* = operation
-
-0: *00* [01] 02 03 04 <05> 06 07
-1: *08* [09] 10 11 12 <13> 14 15 *16*
-2: [17] 18 19 20 <21> 22 23
-3: *24* *25* [26] 27 28 29 <30> 31 32
-4: *33* [34] 35 36 37 <38> 39 40
-5: *41* [42] 43 44 45 <46> 47 48
-6: *49* *50* [51] 52 53 54 <55> 56 57 58
-7: [59] 60 61 62 <63> 64 65 66
-*****************************************************************************/
-
-/* we prefer positive expressions (do if condition) instead of negative
- * (skip if condition), therefore use defines for skip instructions:
- */
-#define ifioclr sbis
-#define ifioset sbic
-#define ifrclr sbrs
-#define ifrset sbrc
-
-/* The registers "fix" and "data" swap their meaning during the loop. Use
- * defines to keep their name constant.
- */
-#define fix x2
-#define data x1
-#undef phase /* phase has a default definition to x4 */
-#define phase x3
-
-
-USB_INTR_VECTOR:
-;order of registers pushed: YL, SREG [sofError], YH, shift, x1, x2, x3, cnt, r0
- push YL ;2 push only what is necessary to sync with edge ASAP
- in YL, SREG ;1
- push YL ;2
-;----------------------------------------------------------------------------
-; Synchronize with sync pattern:
-;----------------------------------------------------------------------------
-;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K]
-;sync up with J to K edge during sync pattern -- use fastest possible loops
-;The first part waits at most 1 bit long since we must be in sync pattern.
-;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to
-;waitForJ, ensure that this prerequisite is met.
-waitForJ:
- inc YL
- sbis USBIN, USBMINUS
- brne waitForJ ; just make sure we have ANY timeout
-waitForK:
-;The following code results in a sampling window of 1/4 bit which meets the spec.
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS ;[0]
- rjmp foundK ;[1]
-#if USB_COUNT_SOF
- lds YL, usbSofCount
- inc YL
- sts usbSofCount, YL
-#endif /* USB_COUNT_SOF */
-#ifdef USB_SOF_HOOK
- USB_SOF_HOOK
-#endif
- rjmp sofError
-
-foundK:
-;{3, 5} after falling D- edge, average delay: 4 cycles [we want 4 for center sampling]
-;we have 1 bit time for setup purposes, then sample again. Numbers in brackets
-;are cycles from center of first sync (double K) bit after the instruction
- push YH ;[2]
- lds YL, usbInputBufOffset;[4]
- clr YH ;[6]
- subi YL, lo8(-(usbRxBuf));[7]
- sbci YH, hi8(-(usbRxBuf));[8]
-
- sbis USBIN, USBMINUS ;[9] we want two bits K [we want to sample at 8 + 4 - 1.5 = 10.5]
- rjmp haveTwoBitsK ;[10]
- pop YH ;[11] undo the push from before
- rjmp waitForK ;[13] this was not the end of sync, retry
-haveTwoBitsK:
-;----------------------------------------------------------------------------
-; push more registers and initialize values while we sample the first bits:
-;----------------------------------------------------------------------------
-#define fix x2
-#define data x1
-
- push shift ;[12]
- push x1 ;[14]
- push x2 ;[16]
- ldi shift, 0x80 ;[18] prevent bit-unstuffing but init low bits to 0
- ifioset USBIN, USBMINUS ;[19] [01] <--- bit 0 [10.5 + 8 = 18.5]
- ori shift, 1<<0 ;[02]
- push x3 ;[03]
- push cnt ;[05]
- push r0 ;[07]
- ifioset USBIN, USBMINUS ;[09] <--- bit 1
- ori shift, 1<<1 ;[10]
- ser fix ;[11]
- ldi cnt, USB_BUFSIZE ;[12]
- mov data, shift ;[13]
- lsl shift ;[14]
- nop2 ;[15]
- ifioset USBIN, USBMINUS ;[17] <--- bit 2
- ori data, 3<<2 ;[18] store in bit 2 AND bit 3
- eor shift, data ;[19] do nrzi decoding
- andi data, 1<<3 ;[20]
- in phase, USBIN ;[21] <- phase
- brne jumpToEntryAfterSet ;[22] if USBMINS at bit 3 was 1
- nop ;[23]
- rjmp entryAfterClr ;[24]
-jumpToEntryAfterSet:
- rjmp entryAfterSet ;[24]
-
-;----------------------------------------------------------------------------
-; Receiver loop (numbers in brackets are cycles within byte after instr)
-;----------------------------------------------------------------------------
-#undef fix
-#define fix x1
-#undef data
-#define data x2
-
-bit7IsSet:
- ifrclr phase, USBMINUS ;[62] check phase only if D- changed
- lpm ;[63]
- in phase, USBIN ;[64] <- phase (one cycle too late)
- ori shift, 1 << 7 ;[65]
- nop ;[66]
-;;;;rjmp bit0AfterSet ; -> [00] == [67] moved block up to save jump
-bit0AfterSet:
- eor fix, shift ;[00]
-#undef fix
-#define fix x2
-#undef data
-#define data x1 /* we now have result in data, fix is reset to 0xff */
- ifioclr USBIN, USBMINUS ;[01] <--- sample 0
- rjmp bit0IsClr ;[02]
- andi shift, ~(7 << 0) ;[03]
- breq unstuff0s ;[04]
- in phase, USBIN ;[05] <- phase
- rjmp bit1AfterSet ;[06]
-unstuff0s:
- in phase, USBIN ;[06] <- phase (one cycle too late)
- andi fix, ~(1 << 0) ;[07]
- ifioclr USBIN, USBMINUS ;[00]
- ifioset USBIN, USBPLUS ;[01]
- rjmp bit0IsClr ;[02] executed if first expr false or second true
-se0AndStore: ; executed only if both bits 0
- st y+, x1 ;[15/17] cycles after start of byte
- rjmp se0 ;[17/19]
-
-bit0IsClr:
- ifrset phase, USBMINUS ;[04] check phase only if D- changed
- lpm ;[05]
- in phase, USBIN ;[06] <- phase (one cycle too late)
- ori shift, 1 << 0 ;[07]
-bit1AfterClr:
- andi phase, USBMASK ;[08]
- ifioset USBIN, USBMINUS ;[09] <--- sample 1
- rjmp bit1IsSet ;[10]
- breq se0AndStore ;[11] if D- was 0 in bits 0 AND 1 and D+ was 0 in between, we have SE0
- andi shift, ~(7 << 1) ;[12]
- in phase, USBIN ;[13] <- phase
- breq unstuff1c ;[14]
- rjmp bit2AfterClr ;[15]
-unstuff1c:
- andi fix, ~(1 << 1) ;[16]
- nop2 ;[08]
- nop2 ;[10]
-bit1IsSet:
- ifrclr phase, USBMINUS ;[12] check phase only if D- changed
- lpm ;[13]
- in phase, USBIN ;[14] <- phase (one cycle too late)
- ori shift, 1 << 1 ;[15]
- nop ;[16]
-bit2AfterSet:
- ifioclr USBIN, USBMINUS ;[17] <--- sample 2
- rjmp bit2IsClr ;[18]
- andi shift, ~(7 << 2) ;[19]
- breq unstuff2s ;[20]
- in phase, USBIN ;[21] <- phase
- rjmp bit3AfterSet ;[22]
-unstuff2s:
- in phase, USBIN ;[22] <- phase (one cycle too late)
- andi fix, ~(1 << 2) ;[23]
- nop2 ;[16]
- nop2 ;[18]
-bit2IsClr:
- ifrset phase, USBMINUS ;[20] check phase only if D- changed
- lpm ;[21]
- in phase, USBIN ;[22] <- phase (one cycle too late)
- ori shift, 1 << 2 ;[23]
-bit3AfterClr:
- st y+, data ;[24]
-entryAfterClr:
- ifioset USBIN, USBMINUS ;[26] <--- sample 3
- rjmp bit3IsSet ;[27]
- andi shift, ~(7 << 3) ;[28]
- breq unstuff3c ;[29]
- in phase, USBIN ;[30] <- phase
- rjmp bit4AfterClr ;[31]
-unstuff3c:
- in phase, USBIN ;[31] <- phase (one cycle too late)
- andi fix, ~(1 << 3) ;[32]
- nop2 ;[25]
- nop2 ;[27]
-bit3IsSet:
- ifrclr phase, USBMINUS ;[29] check phase only if D- changed
- lpm ;[30]
- in phase, USBIN ;[31] <- phase (one cycle too late)
- ori shift, 1 << 3 ;[32]
-bit4AfterSet:
- mov data, fix ;[33] undo this move by swapping defines
-#undef fix
-#define fix x1
-#undef data
-#define data x2
- ifioclr USBIN, USBMINUS ;[34] <--- sample 4
- rjmp bit4IsClr ;[35]
- andi shift, ~(7 << 4) ;[36]
- breq unstuff4s ;[37]
- in phase, USBIN ;[38] <- phase
- rjmp bit5AfterSet ;[39]
-unstuff4s:
- in phase, USBIN ;[39] <- phase (one cycle too late)
- andi fix, ~(1 << 4) ;[40]
- nop2 ;[33]
- nop2 ;[35]
-bit4IsClr:
- ifrset phase, USBMINUS ;[37] check phase only if D- changed
- lpm ;[38]
- in phase, USBIN ;[39] <- phase (one cycle too late)
- ori shift, 1 << 4 ;[40]
-bit5AfterClr:
- ser data ;[41]
- ifioset USBIN, USBMINUS ;[42] <--- sample 5
- rjmp bit5IsSet ;[43]
- andi shift, ~(7 << 5) ;[44]
- breq unstuff5c ;[45]
- in phase, USBIN ;[46] <- phase
- rjmp bit6AfterClr ;[47]
-unstuff5c:
- in phase, USBIN ;[47] <- phase (one cycle too late)
- andi fix, ~(1 << 5) ;[48]
- nop2 ;[41]
- nop2 ;[43]
-bit5IsSet:
- ifrclr phase, USBMINUS ;[45] check phase only if D- changed
- lpm ;[46]
- in phase, USBIN ;[47] <- phase (one cycle too late)
- ori shift, 1 << 5 ;[48]
-bit6AfterSet:
- subi cnt, 1 ;[49]
- brcs jumpToOverflow ;[50]
- ifioclr USBIN, USBMINUS ;[51] <--- sample 6
- rjmp bit6IsClr ;[52]
- andi shift, ~(3 << 6) ;[53]
- cpi shift, 2 ;[54]
- in phase, USBIN ;[55] <- phase
- brlt unstuff6s ;[56]
- rjmp bit7AfterSet ;[57]
-
-jumpToOverflow:
- rjmp overflow
-
-unstuff6s:
- andi fix, ~(1 << 6) ;[50]
- lpm ;[51]
-bit6IsClr:
- ifrset phase, USBMINUS ;[54] check phase only if D- changed
- lpm ;[55]
- in phase, USBIN ;[56] <- phase (one cycle too late)
- ori shift, 1 << 6 ;[57]
- nop ;[58]
-bit7AfterClr:
- ifioset USBIN, USBMINUS ;[59] <--- sample 7
- rjmp bit7IsSet ;[60]
- andi shift, ~(1 << 7) ;[61]
- cpi shift, 4 ;[62]
- in phase, USBIN ;[63] <- phase
- brlt unstuff7c ;[64]
- rjmp bit0AfterClr ;[65] -> [00] == [67]
-unstuff7c:
- andi fix, ~(1 << 7) ;[58]
- nop ;[59]
- rjmp bit7IsSet ;[60]
-
-bit7IsClr:
- ifrset phase, USBMINUS ;[62] check phase only if D- changed
- lpm ;[63]
- in phase, USBIN ;[64] <- phase (one cycle too late)
- ori shift, 1 << 7 ;[65]
- nop ;[66]
-;;;;rjmp bit0AfterClr ; -> [00] == [67] moved block up to save jump
-bit0AfterClr:
- eor fix, shift ;[00]
-#undef fix
-#define fix x2
-#undef data
-#define data x1 /* we now have result in data, fix is reset to 0xff */
- ifioset USBIN, USBMINUS ;[01] <--- sample 0
- rjmp bit0IsSet ;[02]
- andi shift, ~(7 << 0) ;[03]
- breq unstuff0c ;[04]
- in phase, USBIN ;[05] <- phase
- rjmp bit1AfterClr ;[06]
-unstuff0c:
- in phase, USBIN ;[06] <- phase (one cycle too late)
- andi fix, ~(1 << 0) ;[07]
- ifioclr USBIN, USBMINUS ;[00]
- ifioset USBIN, USBPLUS ;[01]
- rjmp bit0IsSet ;[02] executed if first expr false or second true
- rjmp se0AndStore ;[03] executed only if both bits 0
-bit0IsSet:
- ifrclr phase, USBMINUS ;[04] check phase only if D- changed
- lpm ;[05]
- in phase, USBIN ;[06] <- phase (one cycle too late)
- ori shift, 1 << 0 ;[07]
-bit1AfterSet:
- andi shift, ~(7 << 1) ;[08] compensated by "ori shift, 1<<1" if bit1IsClr
- ifioclr USBIN, USBMINUS ;[09] <--- sample 1
- rjmp bit1IsClr ;[10]
- breq unstuff1s ;[11]
- nop2 ;[12] do not check for SE0 if bit 0 was 1
- in phase, USBIN ;[14] <- phase (one cycle too late)
- rjmp bit2AfterSet ;[15]
-unstuff1s:
- in phase, USBIN ;[13] <- phase
- andi fix, ~(1 << 1) ;[14]
- lpm ;[07]
- nop2 ;[10]
-bit1IsClr:
- ifrset phase, USBMINUS ;[12] check phase only if D- changed
- lpm ;[13]
- in phase, USBIN ;[14] <- phase (one cycle too late)
- ori shift, 1 << 1 ;[15]
- nop ;[16]
-bit2AfterClr:
- ifioset USBIN, USBMINUS ;[17] <--- sample 2
- rjmp bit2IsSet ;[18]
- andi shift, ~(7 << 2) ;[19]
- breq unstuff2c ;[20]
- in phase, USBIN ;[21] <- phase
- rjmp bit3AfterClr ;[22]
-unstuff2c:
- in phase, USBIN ;[22] <- phase (one cycle too late)
- andi fix, ~(1 << 2) ;[23]
- nop2 ;[16]
- nop2 ;[18]
-bit2IsSet:
- ifrclr phase, USBMINUS ;[20] check phase only if D- changed
- lpm ;[21]
- in phase, USBIN ;[22] <- phase (one cycle too late)
- ori shift, 1 << 2 ;[23]
-bit3AfterSet:
- st y+, data ;[24]
-entryAfterSet:
- ifioclr USBIN, USBMINUS ;[26] <--- sample 3
- rjmp bit3IsClr ;[27]
- andi shift, ~(7 << 3) ;[28]
- breq unstuff3s ;[29]
- in phase, USBIN ;[30] <- phase
- rjmp bit4AfterSet ;[31]
-unstuff3s:
- in phase, USBIN ;[31] <- phase (one cycle too late)
- andi fix, ~(1 << 3) ;[32]
- nop2 ;[25]
- nop2 ;[27]
-bit3IsClr:
- ifrset phase, USBMINUS ;[29] check phase only if D- changed
- lpm ;[30]
- in phase, USBIN ;[31] <- phase (one cycle too late)
- ori shift, 1 << 3 ;[32]
-bit4AfterClr:
- mov data, fix ;[33] undo this move by swapping defines
-#undef fix
-#define fix x1
-#undef data
-#define data x2
- ifioset USBIN, USBMINUS ;[34] <--- sample 4
- rjmp bit4IsSet ;[35]
- andi shift, ~(7 << 4) ;[36]
- breq unstuff4c ;[37]
- in phase, USBIN ;[38] <- phase
- rjmp bit5AfterClr ;[39]
-unstuff4c:
- in phase, USBIN ;[39] <- phase (one cycle too late)
- andi fix, ~(1 << 4) ;[40]
- nop2 ;[33]
- nop2 ;[35]
-bit4IsSet:
- ifrclr phase, USBMINUS ;[37] check phase only if D- changed
- lpm ;[38]
- in phase, USBIN ;[39] <- phase (one cycle too late)
- ori shift, 1 << 4 ;[40]
-bit5AfterSet:
- ser data ;[41]
- ifioclr USBIN, USBMINUS ;[42] <--- sample 5
- rjmp bit5IsClr ;[43]
- andi shift, ~(7 << 5) ;[44]
- breq unstuff5s ;[45]
- in phase, USBIN ;[46] <- phase
- rjmp bit6AfterSet ;[47]
-unstuff5s:
- in phase, USBIN ;[47] <- phase (one cycle too late)
- andi fix, ~(1 << 5) ;[48]
- nop2 ;[41]
- nop2 ;[43]
-bit5IsClr:
- ifrset phase, USBMINUS ;[45] check phase only if D- changed
- lpm ;[46]
- in phase, USBIN ;[47] <- phase (one cycle too late)
- ori shift, 1 << 5 ;[48]
-bit6AfterClr:
- subi cnt, 1 ;[49]
- brcs overflow ;[50]
- ifioset USBIN, USBMINUS ;[51] <--- sample 6
- rjmp bit6IsSet ;[52]
- andi shift, ~(3 << 6) ;[53]
- cpi shift, 2 ;[54]
- in phase, USBIN ;[55] <- phase
- brlt unstuff6c ;[56]
- rjmp bit7AfterClr ;[57]
-unstuff6c:
- andi fix, ~(1 << 6) ;[50]
- lpm ;[51]
-bit6IsSet:
- ifrclr phase, USBMINUS ;[54] check phase only if D- changed
- lpm ;[55]
- in phase, USBIN ;[56] <- phase (one cycle too late)
- ori shift, 1 << 6 ;[57]
-bit7AfterSet:
- ifioclr USBIN, USBMINUS ;[59] <--- sample 7
- rjmp bit7IsClr ;[60]
- andi shift, ~(1 << 7) ;[61]
- cpi shift, 4 ;[62]
- in phase, USBIN ;[63] <- phase
- brlt unstuff7s ;[64]
- rjmp bit0AfterSet ;[65] -> [00] == [67]
-unstuff7s:
- andi fix, ~(1 << 7) ;[58]
- nop ;[59]
- rjmp bit7IsClr ;[60]
-
-macro POP_STANDARD ; 14 cycles
- pop r0
- pop cnt
- pop x3
- pop x2
- pop x1
- pop shift
- pop YH
- endm
-macro POP_RETI ; 5 cycles
- pop YL
- out SREG, YL
- pop YL
- endm
-
-#include "asmcommon.inc"
-
-;----------------------------------------------------------------------------
-; Transmitting data
-;----------------------------------------------------------------------------
-
-txByteLoop:
-txBitloop:
-stuffN1Delay: ; [03]
- ror shift ;[-5] [11] [63]
- brcc doExorN1 ;[-4] [64]
- subi x3, 1 ;[-3]
- brne commonN1 ;[-2]
- lsl shift ;[-1] compensate ror after rjmp stuffDelay
- nop ;[00] stuffing consists of just waiting 8 cycles
- rjmp stuffN1Delay ;[01] after ror, C bit is reliably clear
-
-sendNakAndReti:
- ldi cnt, USBPID_NAK ;[-19]
- rjmp sendCntAndReti ;[-18]
-sendAckAndReti:
- ldi cnt, USBPID_ACK ;[-17]
-sendCntAndReti:
- mov r0, cnt ;[-16]
- ldi YL, 0 ;[-15] R0 address is 0
- ldi YH, 0 ;[-14]
- ldi cnt, 2 ;[-13]
-; rjmp usbSendAndReti fallthrough
-
-; USB spec says:
-; idle = J
-; J = (D+ = 0), (D- = 1) or USBOUT = 0x01
-; K = (D+ = 1), (D- = 0) or USBOUT = 0x02
-; Spec allows 7.5 bit times from EOP to SOP for replies (= 60 cycles)
-
-;usbSend:
-;pointer to data in 'Y'
-;number of bytes in 'cnt' -- including sync byte
-;uses: x1...x3, shift, cnt, Y [x1 = mirror USBOUT, x2 = USBMASK, x3 = bitstuff cnt]
-;Numbers in brackets are time since first bit of sync pattern is sent (start of instruction)
-usbSendAndReti:
- in x2, USBDDR ;[-10] 10 cycles until SOP
- ori x2, USBMASK ;[-9]
- sbi USBOUT, USBMINUS ;[-8] prepare idle state; D+ and D- must have been 0 (no pullups)
- out USBDDR, x2 ;[-6] <--- acquire bus
- in x1, USBOUT ;[-5] port mirror for tx loop
- ldi shift, 0x40 ;[-4] sync byte is first byte sent (we enter loop after ror)
- ldi x2, USBMASK ;[-3]
-doExorN1:
- eor x1, x2 ;[-2] [06] [62]
- ldi x3, 6 ;[-1] [07] [63]
-commonN1:
-stuffN2Delay:
- out USBOUT, x1 ;[00] [08] [64] <--- set bit
- ror shift ;[01]
- brcc doExorN2 ;[02]
- subi x3, 1 ;[03]
- brne commonN2 ;[04]
- lsl shift ;[05] compensate ror after rjmp stuffDelay
- rjmp stuffN2Delay ;[06] after ror, C bit is reliably clear
-doExorN2:
- eor x1, x2 ;[04] [12]
- ldi x3, 6 ;[05] [13]
-commonN2:
- nop2 ;[06] [14]
- subi cnt, 171 ;[08] [16] trick: (3 * 171) & 0xff = 1
- out USBOUT, x1 ;[09] [17] <--- set bit
- brcs txBitloop ;[10] [27] [44]
-
-stuff6Delay:
- ror shift ;[45] [53]
- brcc doExor6 ;[46]
- subi x3, 1 ;[47]
- brne common6 ;[48]
- lsl shift ;[49] compensate ror after rjmp stuffDelay
- nop ;[50] stuffing consists of just waiting 8 cycles
- rjmp stuff6Delay ;[51] after ror, C bit is reliably clear
-doExor6:
- eor x1, x2 ;[48] [56]
- ldi x3, 6 ;[49]
-common6:
-stuff7Delay:
- ror shift ;[50] [58]
- out USBOUT, x1 ;[51] <--- set bit
- brcc doExor7 ;[52]
- subi x3, 1 ;[53]
- brne common7 ;[54]
- lsl shift ;[55] compensate ror after rjmp stuffDelay
- rjmp stuff7Delay ;[56] after ror, C bit is reliably clear
-doExor7:
- eor x1, x2 ;[54] [62]
- ldi x3, 6 ;[55]
-common7:
- ld shift, y+ ;[56]
- nop ;[58]
- tst cnt ;[59]
- out USBOUT, x1 ;[60] [00]<--- set bit
- brne txByteLoop ;[61] [01]
-;make SE0:
- cbr x1, USBMASK ;[02] prepare SE0 [spec says EOP may be 15 to 18 cycles]
- lds x2, usbNewDeviceAddr;[03]
- lsl x2 ;[05] we compare with left shifted address
- subi YL, 2 + 0 ;[06] Only assign address on data packets, not ACK/NAK in r0
- sbci YH, 0 ;[07]
- out USBOUT, x1 ;[00] <-- out SE0 -- from now 2 bits = 16 cycles until bus idle
-;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm:
-;set address only after data packet was sent, not after handshake
- breq skipAddrAssign ;[01]
- sts usbDeviceAddr, x2 ; if not skipped: SE0 is one cycle longer
-skipAddrAssign:
-;end of usbDeviceAddress transfer
- ldi x2, 1<<USB_INTR_PENDING_BIT;[03] int0 occurred during TX -- clear pending flag
- USB_STORE_PENDING(x2) ;[04]
- ori x1, USBIDLE ;[05]
- in x2, USBDDR ;[06]
- cbr x2, USBMASK ;[07] set both pins to input
- mov x3, x1 ;[08]
- cbr x3, USBMASK ;[09] configure no pullup on both pins
- lpm ;[10]
- lpm ;[13]
- out USBOUT, x1 ;[16] <-- out J (idle) -- end of SE0 (EOP signal)
- out USBDDR, x2 ;[17] <-- release bus now
- out USBOUT, x3 ;[18] <-- ensure no pull-up resistors are active
- rjmp doReturn
-
-
-
-/*****************************************************************************
-The following PHP script generates a code skeleton for the receiver routine:
-
-<?php
-
-function printCmdBuffer($thisBit)
-{
-global $cycle;
-
- $nextBit = ($thisBit + 1) % 8;
- $s = ob_get_contents();
- ob_end_clean();
- $s = str_replace("#", $thisBit, $s);
- $s = str_replace("@", $nextBit, $s);
- $lines = explode("\n", $s);
- for($i = 0; $i < count($lines); $i++){
- $s = $lines[$i];
- if(ereg("\\[([0-9-][0-9])\\]", $s, $regs)){
- $c = $cycle + (int)$regs[1];
- $s = ereg_replace("\\[[0-9-][0-9]\\]", sprintf("[%02d]", $c), $s);
- }
- if(strlen($s) > 0)
- echo "$s\n";
- }
-}
-
-function printBit($isAfterSet, $bitNum)
-{
- ob_start();
- if($isAfterSet){
-?>
- ifioclr USBIN, USBMINUS ;[00] <--- sample
- rjmp bit#IsClr ;[01]
- andi shift, ~(7 << #) ;[02]
- breq unstuff#s ;[03]
- in phase, USBIN ;[04] <- phase
- rjmp bit@AfterSet ;[05]
-unstuff#s:
- in phase, USBIN ;[05] <- phase (one cycle too late)
- andi fix, ~(1 << #) ;[06]
- nop2 ;[-1]
- nop2 ;[01]
-bit#IsClr:
- ifrset phase, USBMINUS ;[03] check phase only if D- changed
- lpm ;[04]
- in phase, USBIN ;[05] <- phase (one cycle too late)
- ori shift, 1 << # ;[06]
-<?php
- }else{
-?>
- ifioset USBIN, USBMINUS ;[00] <--- sample
- rjmp bit#IsSet ;[01]
- andi shift, ~(7 << #) ;[02]
- breq unstuff#c ;[03]
- in phase, USBIN ;[04] <- phase
- rjmp bit@AfterClr ;[05]
-unstuff#c:
- in phase, USBIN ;[05] <- phase (one cycle too late)
- andi fix, ~(1 << #) ;[06]
- nop2 ;[-1]
- nop2 ;[01]
-bit#IsSet:
- ifrclr phase, USBMINUS ;[03] check phase only if D- changed
- lpm ;[04]
- in phase, USBIN ;[05] <- phase (one cycle too late)
- ori shift, 1 << # ;[06]
-<?php
- }
- printCmdBuffer($bitNum);
-}
-
-$bitStartCycles = array(1, 9, 17, 26, 34, 42, 51, 59);
-for($i = 0; $i < 16; $i++){
- $bit = $i % 8;
- $emitClrCode = ($i + (int)($i / 8)) % 2;
- $cycle = $bitStartCycles[$bit];
- if($emitClrCode){
- printf("bit%dAfterClr:\n", $bit);
- }else{
- printf("bit%dAfterSet:\n", $bit);
- }
- ob_start();
- echo " ***** ;[-1]\n";
- printCmdBuffer($bit);
- printBit(!$emitClrCode, $bit);
- if($i == 7)
- echo "\n";
-}
-
-?>
-*****************************************************************************/
diff --git a/tmk_core/protocol/vusb/usbdrv/usbdrvasm15.inc b/tmk_core/protocol/vusb/usbdrv/usbdrvasm15.inc
deleted file mode 100644
index 401b7f8fff..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/usbdrvasm15.inc
+++ /dev/null
@@ -1,423 +0,0 @@
-/* Name: usbdrvasm15.inc
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: contributed by V. Bosch
- * Creation Date: 2007-08-06
- * Tabsize: 4
- * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * Revision: $Id: usbdrvasm15.inc 740 2009-04-13 18:23:31Z cs $
- */
-
-/* Do not link this file! Link usbdrvasm.S instead, which includes the
- * appropriate implementation!
- */
-
-/*
-General Description:
-This file is the 15 MHz version of the asssembler part of the USB driver. It
-requires a 15 MHz crystal (not a ceramic resonator and not a calibrated RC
-oscillator).
-
-See usbdrv.h for a description of the entire driver.
-
-Since almost all of this code is timing critical, don't change unless you
-really know what you are doing! Many parts require not only a maximum number
-of CPU cycles, but even an exact number of cycles!
-*/
-
-;max stack usage: [ret(2), YL, SREG, YH, bitcnt, shift, x1, x2, x3, x4, cnt] = 12 bytes
-;nominal frequency: 15 MHz -> 10.0 cycles per bit, 80.0 cycles per byte
-; Numbers in brackets are clocks counted from center of last sync bit
-; when instruction starts
-
-;----------------------------------------------------------------------------
-; order of registers pushed:
-; YL, SREG [sofError] YH, shift, x1, x2, x3, bitcnt, cnt, x4
-;----------------------------------------------------------------------------
-USB_INTR_VECTOR:
- push YL ;2 push only what is necessary to sync with edge ASAP
- in YL, SREG ;1
- push YL ;2
-;----------------------------------------------------------------------------
-; Synchronize with sync pattern:
-;
-; sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K]
-; sync up with J to K edge during sync pattern -- use fastest possible loops
-;The first part waits at most 1 bit long since we must be in sync pattern.
-;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to
-;waitForJ, ensure that this prerequisite is met.
-waitForJ:
- inc YL
- sbis USBIN, USBMINUS
- brne waitForJ ; just make sure we have ANY timeout
-;-------------------------------------------------------------------------------
-; The following code results in a sampling window of < 1/4 bit
-; which meets the spec.
-;-------------------------------------------------------------------------------
-waitForK: ;-
- sbis USBIN, USBMINUS ;1 [00] <-- sample
- rjmp foundK ;2 [01]
- sbis USBIN, USBMINUS ; <-- sample
- rjmp foundK
- sbis USBIN, USBMINUS ; <-- sample
- rjmp foundK
- sbis USBIN, USBMINUS ; <-- sample
- rjmp foundK
- sbis USBIN, USBMINUS ; <-- sample
- rjmp foundK
- sbis USBIN, USBMINUS ; <-- sample
- rjmp foundK
-#if USB_COUNT_SOF
- lds YL, usbSofCount
- inc YL
- sts usbSofCount, YL
-#endif /* USB_COUNT_SOF */
-#ifdef USB_SOF_HOOK
- USB_SOF_HOOK
-#endif
- rjmp sofError
-;------------------------------------------------------------------------------
-; {3, 5} after falling D- edge, average delay: 4 cycles [we want 5 for
-; center sampling]
-; we have 1 bit time for setup purposes, then sample again.
-; Numbers in brackets are cycles from center of first sync (double K)
-; bit after the instruction
-;------------------------------------------------------------------------------
-foundK: ;- [02]
- lds YL, usbInputBufOffset;2 [03+04] tx loop
- push YH ;2 [05+06]
- clr YH ;1 [07]
- subi YL, lo8(-(usbRxBuf)) ;1 [08] [rx loop init]
- sbci YH, hi8(-(usbRxBuf)) ;1 [09] [rx loop init]
- push shift ;2 [10+11]
- ser shift ;1 [12]
- sbis USBIN, USBMINUS ;1 [-1] [13] <--sample:we want two bits K (sample 1 cycle too early)
- rjmp haveTwoBitsK ;2 [00] [14]
- pop shift ;2 [15+16] undo the push from before
- pop YH ;2 [17+18] undo the push from before
- rjmp waitForK ;2 [19+20] this was not the end of sync, retry
-; The entire loop from waitForK until rjmp waitForK above must not exceed two
-; bit times (= 20 cycles).
-
-;----------------------------------------------------------------------------
-; push more registers and initialize values while we sample the first bits:
-;----------------------------------------------------------------------------
-haveTwoBitsK: ;- [01]
- push x1 ;2 [02+03]
- push x2 ;2 [04+05]
- push x3 ;2 [06+07]
- push bitcnt ;2 [08+09]
- in x1, USBIN ;1 [00] [10] <-- sample bit 0
- bst x1, USBMINUS ;1 [01]
- bld shift, 0 ;1 [02]
- push cnt ;2 [03+04]
- ldi cnt, USB_BUFSIZE ;1 [05]
- push x4 ;2 [06+07] tx loop
- rjmp rxLoop ;2 [08]
-;----------------------------------------------------------------------------
-; Receiver loop (numbers in brackets are cycles within byte after instr)
-;----------------------------------------------------------------------------
-unstuff0: ;- [07] (branch taken)
- andi x3, ~0x01 ;1 [08]
- mov x1, x2 ;1 [09] x2 contains last sampled (stuffed) bit
- in x2, USBIN ;1 [00] [10] <-- sample bit 1 again
- andi x2, USBMASK ;1 [01]
- breq se0Hop ;1 [02] SE0 check for bit 1
- ori shift, 0x01 ;1 [03] 0b00000001
- nop ;1 [04]
- rjmp didUnstuff0 ;2 [05]
-;-----------------------------------------------------
-unstuff1: ;- [05] (branch taken)
- mov x2, x1 ;1 [06] x1 contains last sampled (stuffed) bit
- andi x3, ~0x02 ;1 [07]
- ori shift, 0x02 ;1 [08] 0b00000010
- nop ;1 [09]
- in x1, USBIN ;1 [00] [10] <-- sample bit 2 again
- andi x1, USBMASK ;1 [01]
- breq se0Hop ;1 [02] SE0 check for bit 2
- rjmp didUnstuff1 ;2 [03]
-;-----------------------------------------------------
-unstuff2: ;- [05] (branch taken)
- andi x3, ~0x04 ;1 [06]
- ori shift, 0x04 ;1 [07] 0b00000100
- mov x1, x2 ;1 [08] x2 contains last sampled (stuffed) bit
- nop ;1 [09]
- in x2, USBIN ;1 [00] [10] <-- sample bit 3
- andi x2, USBMASK ;1 [01]
- breq se0Hop ;1 [02] SE0 check for bit 3
- rjmp didUnstuff2 ;2 [03]
-;-----------------------------------------------------
-unstuff3: ;- [00] [10] (branch taken)
- in x2, USBIN ;1 [01] [11] <-- sample stuffed bit 3 one cycle too late
- andi x2, USBMASK ;1 [02]
- breq se0Hop ;1 [03] SE0 check for stuffed bit 3
- andi x3, ~0x08 ;1 [04]
- ori shift, 0x08 ;1 [05] 0b00001000
- rjmp didUnstuff3 ;2 [06]
-;----------------------------------------------------------------------------
-; extra jobs done during bit interval:
-;
-; bit 0: store, clear [SE0 is unreliable here due to bit dribbling in hubs],
-; overflow check, jump to the head of rxLoop
-; bit 1: SE0 check
-; bit 2: SE0 check, recovery from delay [bit 0 tasks took too long]
-; bit 3: SE0 check, recovery from delay [bit 0 tasks took too long]
-; bit 4: SE0 check, none
-; bit 5: SE0 check, none
-; bit 6: SE0 check, none
-; bit 7: SE0 check, reconstruct: x3 is 0 at bit locations we changed, 1 at others
-;----------------------------------------------------------------------------
-rxLoop: ;- [09]
- in x2, USBIN ;1 [00] [10] <-- sample bit 1 (or possibly bit 0 stuffed)
- andi x2, USBMASK ;1 [01]
- brne SkipSe0Hop ;1 [02]
-se0Hop: ;- [02]
- rjmp se0 ;2 [03] SE0 check for bit 1
-SkipSe0Hop: ;- [03]
- ser x3 ;1 [04]
- andi shift, 0xf9 ;1 [05] 0b11111001
- breq unstuff0 ;1 [06]
-didUnstuff0: ;- [06]
- eor x1, x2 ;1 [07]
- bst x1, USBMINUS ;1 [08]
- bld shift, 1 ;1 [09]
- in x1, USBIN ;1 [00] [10] <-- sample bit 2 (or possibly bit 1 stuffed)
- andi x1, USBMASK ;1 [01]
- breq se0Hop ;1 [02] SE0 check for bit 2
- andi shift, 0xf3 ;1 [03] 0b11110011
- breq unstuff1 ;1 [04] do remaining work for bit 1
-didUnstuff1: ;- [04]
- eor x2, x1 ;1 [05]
- bst x2, USBMINUS ;1 [06]
- bld shift, 2 ;1 [07]
- nop2 ;2 [08+09]
- in x2, USBIN ;1 [00] [10] <-- sample bit 3 (or possibly bit 2 stuffed)
- andi x2, USBMASK ;1 [01]
- breq se0Hop ;1 [02] SE0 check for bit 3
- andi shift, 0xe7 ;1 [03] 0b11100111
- breq unstuff2 ;1 [04]
-didUnstuff2: ;- [04]
- eor x1, x2 ;1 [05]
- bst x1, USBMINUS ;1 [06]
- bld shift, 3 ;1 [07]
-didUnstuff3: ;- [07]
- andi shift, 0xcf ;1 [08] 0b11001111
- breq unstuff3 ;1 [09]
- in x1, USBIN ;1 [00] [10] <-- sample bit 4
- andi x1, USBMASK ;1 [01]
- breq se0Hop ;1 [02] SE0 check for bit 4
- eor x2, x1 ;1 [03]
- bst x2, USBMINUS ;1 [04]
- bld shift, 4 ;1 [05]
-didUnstuff4: ;- [05]
- andi shift, 0x9f ;1 [06] 0b10011111
- breq unstuff4 ;1 [07]
- nop2 ;2 [08+09]
- in x2, USBIN ;1 [00] [10] <-- sample bit 5
- andi x2, USBMASK ;1 [01]
- breq se0 ;1 [02] SE0 check for bit 5
- eor x1, x2 ;1 [03]
- bst x1, USBMINUS ;1 [04]
- bld shift, 5 ;1 [05]
-didUnstuff5: ;- [05]
- andi shift, 0x3f ;1 [06] 0b00111111
- breq unstuff5 ;1 [07]
- nop2 ;2 [08+09]
- in x1, USBIN ;1 [00] [10] <-- sample bit 6
- andi x1, USBMASK ;1 [01]
- breq se0 ;1 [02] SE0 check for bit 6
- eor x2, x1 ;1 [03]
- bst x2, USBMINUS ;1 [04]
- bld shift, 6 ;1 [05]
-didUnstuff6: ;- [05]
- cpi shift, 0x02 ;1 [06] 0b00000010
- brlo unstuff6 ;1 [07]
- nop2 ;2 [08+09]
- in x2, USBIN ;1 [00] [10] <-- sample bit 7
- andi x2, USBMASK ;1 [01]
- breq se0 ;1 [02] SE0 check for bit 7
- eor x1, x2 ;1 [03]
- bst x1, USBMINUS ;1 [04]
- bld shift, 7 ;1 [05]
-didUnstuff7: ;- [05]
- cpi shift, 0x04 ;1 [06] 0b00000100
- brlo unstuff7 ;1 [07]
- eor x3, shift ;1 [08] reconstruct: x3 is 0 at bit locations we changed, 1 at others
- nop ;1 [09]
- in x1, USBIN ;1 [00] [10] <-- sample bit 0
- st y+, x3 ;2 [01+02] store data
- eor x2, x1 ;1 [03]
- bst x2, USBMINUS ;1 [04]
- bld shift, 0 ;1 [05]
- subi cnt, 1 ;1 [06]
- brcs overflow ;1 [07]
- rjmp rxLoop ;2 [08]
-;-----------------------------------------------------
-unstuff4: ;- [08]
- andi x3, ~0x10 ;1 [09]
- in x1, USBIN ;1 [00] [10] <-- sample stuffed bit 4
- andi x1, USBMASK ;1 [01]
- breq se0 ;1 [02] SE0 check for stuffed bit 4
- ori shift, 0x10 ;1 [03]
- rjmp didUnstuff4 ;2 [04]
-;-----------------------------------------------------
-unstuff5: ;- [08]
- ori shift, 0x20 ;1 [09]
- in x2, USBIN ;1 [00] [10] <-- sample stuffed bit 5
- andi x2, USBMASK ;1 [01]
- breq se0 ;1 [02] SE0 check for stuffed bit 5
- andi x3, ~0x20 ;1 [03]
- rjmp didUnstuff5 ;2 [04]
-;-----------------------------------------------------
-unstuff6: ;- [08]
- andi x3, ~0x40 ;1 [09]
- in x1, USBIN ;1 [00] [10] <-- sample stuffed bit 6
- andi x1, USBMASK ;1 [01]
- breq se0 ;1 [02] SE0 check for stuffed bit 6
- ori shift, 0x40 ;1 [03]
- rjmp didUnstuff6 ;2 [04]
-;-----------------------------------------------------
-unstuff7: ;- [08]
- andi x3, ~0x80 ;1 [09]
- in x2, USBIN ;1 [00] [10] <-- sample stuffed bit 7
- andi x2, USBMASK ;1 [01]
- breq se0 ;1 [02] SE0 check for stuffed bit 7
- ori shift, 0x80 ;1 [03]
- rjmp didUnstuff7 ;2 [04]
-
-macro POP_STANDARD ; 16 cycles
- pop x4
- pop cnt
- pop bitcnt
- pop x3
- pop x2
- pop x1
- pop shift
- pop YH
- endm
-macro POP_RETI ; 5 cycles
- pop YL
- out SREG, YL
- pop YL
- endm
-
-#include "asmcommon.inc"
-
-;---------------------------------------------------------------------------
-; USB spec says:
-; idle = J
-; J = (D+ = 0), (D- = 1)
-; K = (D+ = 1), (D- = 0)
-; Spec allows 7.5 bit times from EOP to SOP for replies
-;---------------------------------------------------------------------------
-bitstuffN: ;- [04]
- eor x1, x4 ;1 [05]
- clr x2 ;1 [06]
- nop ;1 [07]
- rjmp didStuffN ;1 [08]
-;---------------------------------------------------------------------------
-bitstuff6: ;- [04]
- eor x1, x4 ;1 [05]
- clr x2 ;1 [06]
- rjmp didStuff6 ;1 [07]
-;---------------------------------------------------------------------------
-bitstuff7: ;- [02]
- eor x1, x4 ;1 [03]
- clr x2 ;1 [06]
- nop ;1 [05]
- rjmp didStuff7 ;1 [06]
-;---------------------------------------------------------------------------
-sendNakAndReti: ;- [-19]
- ldi x3, USBPID_NAK ;1 [-18]
- rjmp sendX3AndReti ;1 [-17]
-;---------------------------------------------------------------------------
-sendAckAndReti: ;- [-17]
- ldi cnt, USBPID_ACK ;1 [-16]
-sendCntAndReti: ;- [-16]
- mov x3, cnt ;1 [-15]
-sendX3AndReti: ;- [-15]
- ldi YL, 20 ;1 [-14] x3==r20 address is 20
- ldi YH, 0 ;1 [-13]
- ldi cnt, 2 ;1 [-12]
-; rjmp usbSendAndReti fallthrough
-;---------------------------------------------------------------------------
-;usbSend:
-;pointer to data in 'Y'
-;number of bytes in 'cnt' -- including sync byte [range 2 ... 12]
-;uses: x1...x4, btcnt, shift, cnt, Y
-;Numbers in brackets are time since first bit of sync pattern is sent
-;We need not to match the transfer rate exactly because the spec demands
-;only 1.5% precision anyway.
-usbSendAndReti: ;- [-13] 13 cycles until SOP
- in x2, USBDDR ;1 [-12]
- ori x2, USBMASK ;1 [-11]
- sbi USBOUT, USBMINUS ;2 [-09-10] prepare idle state; D+ and D- must have been 0 (no pullups)
- in x1, USBOUT ;1 [-08] port mirror for tx loop
- out USBDDR, x2 ;1 [-07] <- acquire bus
- ; need not init x2 (bitstuff history) because sync starts with 0
- ldi x4, USBMASK ;1 [-06] exor mask
- ldi shift, 0x80 ;1 [-05] sync byte is first byte sent
- ldi bitcnt, 6 ;1 [-04]
-txBitLoop: ;- [-04] [06]
- sbrs shift, 0 ;1 [-03] [07]
- eor x1, x4 ;1 [-02] [08]
- ror shift ;1 [-01] [09]
-didStuffN: ;- [09]
- out USBOUT, x1 ;1 [00] [10] <-- out N
- ror x2 ;1 [01]
- cpi x2, 0xfc ;1 [02]
- brcc bitstuffN ;1 [03]
- dec bitcnt ;1 [04]
- brne txBitLoop ;1 [05]
- sbrs shift, 0 ;1 [06]
- eor x1, x4 ;1 [07]
- ror shift ;1 [08]
-didStuff6: ;- [08]
- nop ;1 [09]
- out USBOUT, x1 ;1 [00] [10] <-- out 6
- ror x2 ;1 [01]
- cpi x2, 0xfc ;1 [02]
- brcc bitstuff6 ;1 [03]
- sbrs shift, 0 ;1 [04]
- eor x1, x4 ;1 [05]
- ror shift ;1 [06]
- ror x2 ;1 [07]
-didStuff7: ;- [07]
- ldi bitcnt, 6 ;1 [08]
- cpi x2, 0xfc ;1 [09]
- out USBOUT, x1 ;1 [00] [10] <-- out 7
- brcc bitstuff7 ;1 [01]
- ld shift, y+ ;2 [02+03]
- dec cnt ;1 [04]
- brne txBitLoop ;1 [05]
-makeSE0:
- cbr x1, USBMASK ;1 [06] prepare SE0 [spec says EOP may be 19 to 23 cycles]
- lds x2, usbNewDeviceAddr;2 [07+08]
- lsl x2 ;1 [09] we compare with left shifted address
-;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm:
-;set address only after data packet was sent, not after handshake
- out USBOUT, x1 ;1 [00] [10] <-- out SE0-- from now 2 bits==20 cycl. until bus idle
- subi YL, 20 + 2 ;1 [01] Only assign address on data packets, not ACK/NAK in x3
- sbci YH, 0 ;1 [02]
- breq skipAddrAssign ;1 [03]
- sts usbDeviceAddr, x2 ;2 [04+05] if not skipped: SE0 is one cycle longer
-;----------------------------------------------------------------------------
-;end of usbDeviceAddress transfer
-skipAddrAssign: ;- [03/04]
- ldi x2, 1<<USB_INTR_PENDING_BIT ;1 [05] int0 occurred during TX -- clear pending flag
- USB_STORE_PENDING(x2) ;1 [06]
- ori x1, USBIDLE ;1 [07]
- in x2, USBDDR ;1 [08]
- cbr x2, USBMASK ;1 [09] set both pins to input
- mov x3, x1 ;1 [10]
- cbr x3, USBMASK ;1 [11] configure no pullup on both pins
- ldi x4, 3 ;1 [12]
-se0Delay: ;- [12] [15]
- dec x4 ;1 [13] [16]
- brne se0Delay ;1 [14] [17]
- nop2 ;2 [18+19]
- out USBOUT, x1 ;1 [20] <--out J (idle) -- end of SE0 (EOP sig.)
- out USBDDR, x2 ;1 [21] <--release bus now
- out USBOUT, x3 ;1 [22] <--ensure no pull-up resistors are active
- rjmp doReturn ;1 [23]
-;---------------------------------------------------------------------------
diff --git a/tmk_core/protocol/vusb/usbdrv/usbdrvasm16.inc b/tmk_core/protocol/vusb/usbdrv/usbdrvasm16.inc
deleted file mode 100644
index 207b6e48a1..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/usbdrvasm16.inc
+++ /dev/null
@@ -1,346 +0,0 @@
-/* Name: usbdrvasm16.inc
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2007-06-15
- * Tabsize: 4
- * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * Revision: $Id: usbdrvasm16.inc 760 2009-08-09 18:59:43Z cs $
- */
-
-/* Do not link this file! Link usbdrvasm.S instead, which includes the
- * appropriate implementation!
- */
-
-/*
-General Description:
-This file is the 16 MHz version of the asssembler part of the USB driver. It
-requires a 16 MHz crystal (not a ceramic resonator and not a calibrated RC
-oscillator).
-
-See usbdrv.h for a description of the entire driver.
-
-Since almost all of this code is timing critical, don't change unless you
-really know what you are doing! Many parts require not only a maximum number
-of CPU cycles, but even an exact number of cycles!
-*/
-
-;max stack usage: [ret(2), YL, SREG, YH, bitcnt, shift, x1, x2, x3, x4, cnt] = 12 bytes
-;nominal frequency: 16 MHz -> 10.6666666 cycles per bit, 85.333333333 cycles per byte
-; Numbers in brackets are clocks counted from center of last sync bit
-; when instruction starts
-
-USB_INTR_VECTOR:
-;order of registers pushed: YL, SREG YH, [sofError], bitcnt, shift, x1, x2, x3, x4, cnt
- push YL ;[-25] push only what is necessary to sync with edge ASAP
- in YL, SREG ;[-23]
- push YL ;[-22]
- push YH ;[-20]
-;----------------------------------------------------------------------------
-; Synchronize with sync pattern:
-;----------------------------------------------------------------------------
-;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K]
-;sync up with J to K edge during sync pattern -- use fastest possible loops
-;The first part waits at most 1 bit long since we must be in sync pattern.
-;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to
-;waitForJ, ensure that this prerequisite is met.
-waitForJ:
- inc YL
- sbis USBIN, USBMINUS
- brne waitForJ ; just make sure we have ANY timeout
-waitForK:
-;The following code results in a sampling window of < 1/4 bit which meets the spec.
- sbis USBIN, USBMINUS ;[-15]
- rjmp foundK ;[-14]
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
-#if USB_COUNT_SOF
- lds YL, usbSofCount
- inc YL
- sts usbSofCount, YL
-#endif /* USB_COUNT_SOF */
-#ifdef USB_SOF_HOOK
- USB_SOF_HOOK
-#endif
- rjmp sofError
-foundK: ;[-12]
-;{3, 5} after falling D- edge, average delay: 4 cycles [we want 5 for center sampling]
-;we have 1 bit time for setup purposes, then sample again. Numbers in brackets
-;are cycles from center of first sync (double K) bit after the instruction
- push bitcnt ;[-12]
-; [---] ;[-11]
- lds YL, usbInputBufOffset;[-10]
-; [---] ;[-9]
- clr YH ;[-8]
- subi YL, lo8(-(usbRxBuf));[-7] [rx loop init]
- sbci YH, hi8(-(usbRxBuf));[-6] [rx loop init]
- push shift ;[-5]
-; [---] ;[-4]
- ldi bitcnt, 0x55 ;[-3] [rx loop init]
- sbis USBIN, USBMINUS ;[-2] we want two bits K (sample 2 cycles too early)
- rjmp haveTwoBitsK ;[-1]
- pop shift ;[0] undo the push from before
- pop bitcnt ;[2] undo the push from before
- rjmp waitForK ;[4] this was not the end of sync, retry
-; The entire loop from waitForK until rjmp waitForK above must not exceed two
-; bit times (= 21 cycles).
-
-;----------------------------------------------------------------------------
-; push more registers and initialize values while we sample the first bits:
-;----------------------------------------------------------------------------
-haveTwoBitsK:
- push x1 ;[1]
- push x2 ;[3]
- push x3 ;[5]
- ldi shift, 0 ;[7]
- ldi x3, 1<<4 ;[8] [rx loop init] first sample is inverse bit, compensate that
- push x4 ;[9] == leap
-
- in x1, USBIN ;[11] <-- sample bit 0
- andi x1, USBMASK ;[12]
- bst x1, USBMINUS ;[13]
- bld shift, 7 ;[14]
- push cnt ;[15]
- ldi leap, 0 ;[17] [rx loop init]
- ldi cnt, USB_BUFSIZE;[18] [rx loop init]
- rjmp rxbit1 ;[19] arrives at [21]
-
-;----------------------------------------------------------------------------
-; Receiver loop (numbers in brackets are cycles within byte after instr)
-;----------------------------------------------------------------------------
-
-; duration of unstuffing code should be 10.66666667 cycles. We adjust "leap"
-; accordingly to approximate this value in the long run.
-
-unstuff6:
- andi x2, USBMASK ;[03]
- ori x3, 1<<6 ;[04] will not be shifted any more
- andi shift, ~0x80;[05]
- mov x1, x2 ;[06] sampled bit 7 is actually re-sampled bit 6
- subi leap, -1 ;[07] total duration = 11 bits -> subtract 1/3
- rjmp didUnstuff6 ;[08]
-
-unstuff7:
- ori x3, 1<<7 ;[09] will not be shifted any more
- in x2, USBIN ;[00] [10] re-sample bit 7
- andi x2, USBMASK ;[01]
- andi shift, ~0x80;[02]
- subi leap, 2 ;[03] total duration = 10 bits -> add 1/3
- rjmp didUnstuff7 ;[04]
-
-unstuffEven:
- ori x3, 1<<6 ;[09] will be shifted right 6 times for bit 0
- in x1, USBIN ;[00] [10]
- andi shift, ~0x80;[01]
- andi x1, USBMASK ;[02]
- breq se0 ;[03]
- subi leap, -1 ;[04] total duration = 11 bits -> subtract 1/3
- nop2 ;[05]
- rjmp didUnstuffE ;[06]
-
-unstuffOdd:
- ori x3, 1<<5 ;[09] will be shifted right 4 times for bit 1
- in x2, USBIN ;[00] [10]
- andi shift, ~0x80;[01]
- andi x2, USBMASK ;[02]
- breq se0 ;[03]
- subi leap, -1 ;[04] total duration = 11 bits -> subtract 1/3
- nop2 ;[05]
- rjmp didUnstuffO ;[06]
-
-rxByteLoop:
- andi x1, USBMASK ;[03]
- eor x2, x1 ;[04]
- subi leap, 1 ;[05]
- brpl skipLeap ;[06]
- subi leap, -3 ;1 one leap cycle every 3rd byte -> 85 + 1/3 cycles per byte
- nop ;1
-skipLeap:
- subi x2, 1 ;[08]
- ror shift ;[09]
-didUnstuff6:
- cpi shift, 0xfc ;[10]
- in x2, USBIN ;[00] [11] <-- sample bit 7
- brcc unstuff6 ;[01]
- andi x2, USBMASK ;[02]
- eor x1, x2 ;[03]
- subi x1, 1 ;[04]
- ror shift ;[05]
-didUnstuff7:
- cpi shift, 0xfc ;[06]
- brcc unstuff7 ;[07]
- eor x3, shift ;[08] reconstruct: x3 is 1 at bit locations we changed, 0 at others
- st y+, x3 ;[09] store data
-rxBitLoop:
- in x1, USBIN ;[00] [11] <-- sample bit 0/2/4
- andi x1, USBMASK ;[01]
- eor x2, x1 ;[02]
- andi x3, 0x3f ;[03] topmost two bits reserved for 6 and 7
- subi x2, 1 ;[04]
- ror shift ;[05]
- cpi shift, 0xfc ;[06]
- brcc unstuffEven ;[07]
-didUnstuffE:
- lsr x3 ;[08]
- lsr x3 ;[09]
-rxbit1:
- in x2, USBIN ;[00] [10] <-- sample bit 1/3/5
- andi x2, USBMASK ;[01]
- breq se0 ;[02]
- eor x1, x2 ;[03]
- subi x1, 1 ;[04]
- ror shift ;[05]
- cpi shift, 0xfc ;[06]
- brcc unstuffOdd ;[07]
-didUnstuffO:
- subi bitcnt, 0xab;[08] == addi 0x55, 0x55 = 0x100/3
- brcs rxBitLoop ;[09]
-
- subi cnt, 1 ;[10]
- in x1, USBIN ;[00] [11] <-- sample bit 6
- brcc rxByteLoop ;[01]
- rjmp overflow
-
-macro POP_STANDARD ; 14 cycles
- pop cnt
- pop x4
- pop x3
- pop x2
- pop x1
- pop shift
- pop bitcnt
- endm
-macro POP_RETI ; 7 cycles
- pop YH
- pop YL
- out SREG, YL
- pop YL
- endm
-
-#include "asmcommon.inc"
-
-; USB spec says:
-; idle = J
-; J = (D+ = 0), (D- = 1)
-; K = (D+ = 1), (D- = 0)
-; Spec allows 7.5 bit times from EOP to SOP for replies
-
-bitstuffN:
- eor x1, x4 ;[5]
- ldi x2, 0 ;[6]
- nop2 ;[7]
- nop ;[9]
- out USBOUT, x1 ;[10] <-- out
- rjmp didStuffN ;[0]
-
-bitstuff6:
- eor x1, x4 ;[5]
- ldi x2, 0 ;[6] Carry is zero due to brcc
- rol shift ;[7] compensate for ror shift at branch destination
- rjmp didStuff6 ;[8]
-
-bitstuff7:
- ldi x2, 0 ;[2] Carry is zero due to brcc
- rjmp didStuff7 ;[3]
-
-
-sendNakAndReti:
- ldi x3, USBPID_NAK ;[-18]
- rjmp sendX3AndReti ;[-17]
-sendAckAndReti:
- ldi cnt, USBPID_ACK ;[-17]
-sendCntAndReti:
- mov x3, cnt ;[-16]
-sendX3AndReti:
- ldi YL, 20 ;[-15] x3==r20 address is 20
- ldi YH, 0 ;[-14]
- ldi cnt, 2 ;[-13]
-; rjmp usbSendAndReti fallthrough
-
-;usbSend:
-;pointer to data in 'Y'
-;number of bytes in 'cnt' -- including sync byte [range 2 ... 12]
-;uses: x1...x4, btcnt, shift, cnt, Y
-;Numbers in brackets are time since first bit of sync pattern is sent
-;We don't match the transfer rate exactly (don't insert leap cycles every third
-;byte) because the spec demands only 1.5% precision anyway.
-usbSendAndReti: ; 12 cycles until SOP
- in x2, USBDDR ;[-12]
- ori x2, USBMASK ;[-11]
- sbi USBOUT, USBMINUS;[-10] prepare idle state; D+ and D- must have been 0 (no pullups)
- in x1, USBOUT ;[-8] port mirror for tx loop
- out USBDDR, x2 ;[-7] <- acquire bus
-; need not init x2 (bitstuff history) because sync starts with 0
- ldi x4, USBMASK ;[-6] exor mask
- ldi shift, 0x80 ;[-5] sync byte is first byte sent
-txByteLoop:
- ldi bitcnt, 0x35 ;[-4] [6] binary 0011 0101
-txBitLoop:
- sbrs shift, 0 ;[-3] [7]
- eor x1, x4 ;[-2] [8]
- out USBOUT, x1 ;[-1] [9] <-- out N
- ror shift ;[0] [10]
- ror x2 ;[1]
-didStuffN:
- cpi x2, 0xfc ;[2]
- brcc bitstuffN ;[3]
- lsr bitcnt ;[4]
- brcc txBitLoop ;[5]
- brne txBitLoop ;[6]
-
- sbrs shift, 0 ;[7]
- eor x1, x4 ;[8]
-didStuff6:
- out USBOUT, x1 ;[-1] [9] <-- out 6
- ror shift ;[0] [10]
- ror x2 ;[1]
- cpi x2, 0xfc ;[2]
- brcc bitstuff6 ;[3]
- ror shift ;[4]
-didStuff7:
- ror x2 ;[5]
- sbrs x2, 7 ;[6]
- eor x1, x4 ;[7]
- nop ;[8]
- cpi x2, 0xfc ;[9]
- out USBOUT, x1 ;[-1][10] <-- out 7
- brcc bitstuff7 ;[0] [11]
- ld shift, y+ ;[1]
- dec cnt ;[3]
- brne txByteLoop ;[4]
-;make SE0:
- cbr x1, USBMASK ;[5] prepare SE0 [spec says EOP may be 21 to 25 cycles]
- lds x2, usbNewDeviceAddr;[6]
- lsl x2 ;[8] we compare with left shifted address
- subi YL, 20 + 2 ;[9] Only assign address on data packets, not ACK/NAK in x3
- sbci YH, 0 ;[10]
- out USBOUT, x1 ;[11] <-- out SE0 -- from now 2 bits = 22 cycles until bus idle
-;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm:
-;set address only after data packet was sent, not after handshake
- breq skipAddrAssign ;[0]
- sts usbDeviceAddr, x2; if not skipped: SE0 is one cycle longer
-skipAddrAssign:
-;end of usbDeviceAddress transfer
- ldi x2, 1<<USB_INTR_PENDING_BIT;[2] int0 occurred during TX -- clear pending flag
- USB_STORE_PENDING(x2) ;[3]
- ori x1, USBIDLE ;[4]
- in x2, USBDDR ;[5]
- cbr x2, USBMASK ;[6] set both pins to input
- mov x3, x1 ;[7]
- cbr x3, USBMASK ;[8] configure no pullup on both pins
- ldi x4, 4 ;[9]
-se0Delay:
- dec x4 ;[10] [13] [16] [19]
- brne se0Delay ;[11] [14] [17] [20]
- out USBOUT, x1 ;[21] <-- out J (idle) -- end of SE0 (EOP signal)
- out USBDDR, x2 ;[22] <-- release bus now
- out USBOUT, x3 ;[23] <-- ensure no pull-up resistors are active
- rjmp doReturn
diff --git a/tmk_core/protocol/vusb/usbdrv/usbdrvasm165.inc b/tmk_core/protocol/vusb/usbdrv/usbdrvasm165.inc
deleted file mode 100644
index 79b3c61cf8..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/usbdrvasm165.inc
+++ /dev/null
@@ -1,453 +0,0 @@
-/* Name: usbdrvasm165.inc
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2007-04-22
- * Tabsize: 4
- * Copyright: (c) 2007 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * Revision: $Id: usbdrvasm165.inc 740 2009-04-13 18:23:31Z cs $
- */
-
-/* Do not link this file! Link usbdrvasm.S instead, which includes the
- * appropriate implementation!
- */
-
-/*
-General Description:
-This file is the 16.5 MHz version of the USB driver. It is intended for the
-ATTiny45 and similar controllers running on 16.5 MHz internal RC oscillator.
-This version contains a phase locked loop in the receiver routine to cope with
-slight clock rate deviations of up to +/- 1%.
-
-See usbdrv.h for a description of the entire driver.
-
-Since almost all of this code is timing critical, don't change unless you
-really know what you are doing! Many parts require not only a maximum number
-of CPU cycles, but even an exact number of cycles!
-*/
-
-;Software-receiver engine. Strict timing! Don't change unless you can preserve timing!
-;interrupt response time: 4 cycles + insn running = 7 max if interrupts always enabled
-;max allowable interrupt latency: 59 cycles -> max 52 cycles interrupt disable
-;max stack usage: [ret(2), r0, SREG, YL, YH, shift, x1, x2, x3, x4, cnt] = 12 bytes
-;nominal frequency: 16.5 MHz -> 11 cycles per bit
-; 16.3125 MHz < F_CPU < 16.6875 MHz (+/- 1.1%)
-; Numbers in brackets are clocks counted from center of last sync bit
-; when instruction starts
-
-
-USB_INTR_VECTOR:
-;order of registers pushed: YL, SREG [sofError], r0, YH, shift, x1, x2, x3, x4, cnt
- push YL ;[-23] push only what is necessary to sync with edge ASAP
- in YL, SREG ;[-21]
- push YL ;[-20]
-;----------------------------------------------------------------------------
-; Synchronize with sync pattern:
-;----------------------------------------------------------------------------
-;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K]
-;sync up with J to K edge during sync pattern -- use fastest possible loops
-;The first part waits at most 1 bit long since we must be in sync pattern.
-;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to
-;waitForJ, ensure that this prerequisite is met.
-waitForJ:
- inc YL
- sbis USBIN, USBMINUS
- brne waitForJ ; just make sure we have ANY timeout
-waitForK:
-;The following code results in a sampling window of < 1/4 bit which meets the spec.
- sbis USBIN, USBMINUS ;[-15]
- rjmp foundK ;[-14]
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
-#if USB_COUNT_SOF
- lds YL, usbSofCount
- inc YL
- sts usbSofCount, YL
-#endif /* USB_COUNT_SOF */
-#ifdef USB_SOF_HOOK
- USB_SOF_HOOK
-#endif
- rjmp sofError
-foundK: ;[-12]
-;{3, 5} after falling D- edge, average delay: 4 cycles [we want 5 for center sampling]
-;we have 1 bit time for setup purposes, then sample again. Numbers in brackets
-;are cycles from center of first sync (double K) bit after the instruction
- push r0 ;[-12]
-; [---] ;[-11]
- push YH ;[-10]
-; [---] ;[-9]
- lds YL, usbInputBufOffset;[-8]
-; [---] ;[-7]
- clr YH ;[-6]
- subi YL, lo8(-(usbRxBuf));[-5] [rx loop init]
- sbci YH, hi8(-(usbRxBuf));[-4] [rx loop init]
- mov r0, x2 ;[-3] [rx loop init]
- sbis USBIN, USBMINUS ;[-2] we want two bits K (sample 2 cycles too early)
- rjmp haveTwoBitsK ;[-1]
- pop YH ;[0] undo the pushes from before
- pop r0 ;[2]
- rjmp waitForK ;[4] this was not the end of sync, retry
-; The entire loop from waitForK until rjmp waitForK above must not exceed two
-; bit times (= 22 cycles).
-
-;----------------------------------------------------------------------------
-; push more registers and initialize values while we sample the first bits:
-;----------------------------------------------------------------------------
-haveTwoBitsK: ;[1]
- push shift ;[1]
- push x1 ;[3]
- push x2 ;[5]
- push x3 ;[7]
- ldi shift, 0xff ;[9] [rx loop init]
- ori x3, 0xff ;[10] [rx loop init] == ser x3, clear zero flag
-
- in x1, USBIN ;[11] <-- sample bit 0
- bst x1, USBMINUS ;[12]
- bld shift, 0 ;[13]
- push x4 ;[14] == phase
-; [---] ;[15]
- push cnt ;[16]
-; [---] ;[17]
- ldi phase, 0 ;[18] [rx loop init]
- ldi cnt, USB_BUFSIZE;[19] [rx loop init]
- rjmp rxbit1 ;[20]
-; [---] ;[21]
-
-;----------------------------------------------------------------------------
-; Receiver loop (numbers in brackets are cycles within byte after instr)
-;----------------------------------------------------------------------------
-/*
-byte oriented operations done during loop:
-bit 0: store data
-bit 1: SE0 check
-bit 2: overflow check
-bit 3: catch up
-bit 4: rjmp to achieve conditional jump range
-bit 5: PLL
-bit 6: catch up
-bit 7: jump, fixup bitstuff
-; 87 [+ 2] cycles
-------------------------------------------------------------------
-*/
-continueWithBit5:
- in x2, USBIN ;[055] <-- bit 5
- eor r0, x2 ;[056]
- or phase, r0 ;[057]
- sbrc phase, USBMINUS ;[058]
- lpm ;[059] optional nop3; modifies r0
- in phase, USBIN ;[060] <-- phase
- eor x1, x2 ;[061]
- bst x1, USBMINUS ;[062]
- bld shift, 5 ;[063]
- andi shift, 0x3f ;[064]
- in x1, USBIN ;[065] <-- bit 6
- breq unstuff5 ;[066] *** unstuff escape
- eor phase, x1 ;[067]
- eor x2, x1 ;[068]
- bst x2, USBMINUS ;[069]
- bld shift, 6 ;[070]
-didUnstuff6: ;[ ]
- in r0, USBIN ;[071] <-- phase
- cpi shift, 0x02 ;[072]
- brlo unstuff6 ;[073] *** unstuff escape
-didUnstuff5: ;[ ]
- nop2 ;[074]
-; [---] ;[075]
- in x2, USBIN ;[076] <-- bit 7
- eor x1, x2 ;[077]
- bst x1, USBMINUS ;[078]
- bld shift, 7 ;[079]
-didUnstuff7: ;[ ]
- eor r0, x2 ;[080]
- or phase, r0 ;[081]
- in r0, USBIN ;[082] <-- phase
- cpi shift, 0x04 ;[083]
- brsh rxLoop ;[084]
-; [---] ;[085]
-unstuff7: ;[ ]
- andi x3, ~0x80 ;[085]
- ori shift, 0x80 ;[086]
- in x2, USBIN ;[087] <-- sample stuffed bit 7
- nop ;[088]
- rjmp didUnstuff7 ;[089]
-; [---] ;[090]
- ;[080]
-
-unstuff5: ;[067]
- eor phase, x1 ;[068]
- andi x3, ~0x20 ;[069]
- ori shift, 0x20 ;[070]
- in r0, USBIN ;[071] <-- phase
- mov x2, x1 ;[072]
- nop ;[073]
- nop2 ;[074]
-; [---] ;[075]
- in x1, USBIN ;[076] <-- bit 6
- eor r0, x1 ;[077]
- or phase, r0 ;[078]
- eor x2, x1 ;[079]
- bst x2, USBMINUS ;[080]
- bld shift, 6 ;[081] no need to check bitstuffing, we just had one
- in r0, USBIN ;[082] <-- phase
- rjmp didUnstuff5 ;[083]
-; [---] ;[084]
- ;[074]
-
-unstuff6: ;[074]
- andi x3, ~0x40 ;[075]
- in x1, USBIN ;[076] <-- bit 6 again
- ori shift, 0x40 ;[077]
- nop2 ;[078]
-; [---] ;[079]
- rjmp didUnstuff6 ;[080]
-; [---] ;[081]
- ;[071]
-
-unstuff0: ;[013]
- eor r0, x2 ;[014]
- or phase, r0 ;[015]
- andi x2, USBMASK ;[016] check for SE0
- in r0, USBIN ;[017] <-- phase
- breq didUnstuff0 ;[018] direct jump to se0 would be too long
- andi x3, ~0x01 ;[019]
- ori shift, 0x01 ;[020]
- mov x1, x2 ;[021] mov existing sample
- in x2, USBIN ;[022] <-- bit 1 again
- rjmp didUnstuff0 ;[023]
-; [---] ;[024]
- ;[014]
-
-unstuff1: ;[024]
- eor r0, x1 ;[025]
- or phase, r0 ;[026]
- andi x3, ~0x02 ;[027]
- in r0, USBIN ;[028] <-- phase
- ori shift, 0x02 ;[029]
- mov x2, x1 ;[030]
- rjmp didUnstuff1 ;[031]
-; [---] ;[032]
- ;[022]
-
-unstuff2: ;[035]
- eor r0, x2 ;[036]
- or phase, r0 ;[037]
- andi x3, ~0x04 ;[038]
- in r0, USBIN ;[039] <-- phase
- ori shift, 0x04 ;[040]
- mov x1, x2 ;[041]
- rjmp didUnstuff2 ;[042]
-; [---] ;[043]
- ;[033]
-
-unstuff3: ;[043]
- in x2, USBIN ;[044] <-- bit 3 again
- eor r0, x2 ;[045]
- or phase, r0 ;[046]
- andi x3, ~0x08 ;[047]
- ori shift, 0x08 ;[048]
- nop ;[049]
- in r0, USBIN ;[050] <-- phase
- rjmp didUnstuff3 ;[051]
-; [---] ;[052]
- ;[042]
-
-unstuff4: ;[053]
- andi x3, ~0x10 ;[054]
- in x1, USBIN ;[055] <-- bit 4 again
- ori shift, 0x10 ;[056]
- rjmp didUnstuff4 ;[057]
-; [---] ;[058]
- ;[048]
-
-rxLoop: ;[085]
- eor x3, shift ;[086] reconstruct: x3 is 0 at bit locations we changed, 1 at others
- in x1, USBIN ;[000] <-- bit 0
- st y+, x3 ;[001]
-; [---] ;[002]
- eor r0, x1 ;[003]
- or phase, r0 ;[004]
- eor x2, x1 ;[005]
- in r0, USBIN ;[006] <-- phase
- ser x3 ;[007]
- bst x2, USBMINUS ;[008]
- bld shift, 0 ;[009]
- andi shift, 0xf9 ;[010]
-rxbit1: ;[ ]
- in x2, USBIN ;[011] <-- bit 1
- breq unstuff0 ;[012] *** unstuff escape
- andi x2, USBMASK ;[013] SE0 check for bit 1
-didUnstuff0: ;[ ] Z only set if we detected SE0 in bitstuff
- breq se0 ;[014]
- eor r0, x2 ;[015]
- or phase, r0 ;[016]
- in r0, USBIN ;[017] <-- phase
- eor x1, x2 ;[018]
- bst x1, USBMINUS ;[019]
- bld shift, 1 ;[020]
- andi shift, 0xf3 ;[021]
-didUnstuff1: ;[ ]
- in x1, USBIN ;[022] <-- bit 2
- breq unstuff1 ;[023] *** unstuff escape
- eor r0, x1 ;[024]
- or phase, r0 ;[025]
- subi cnt, 1 ;[026] overflow check
- brcs overflow ;[027]
- in r0, USBIN ;[028] <-- phase
- eor x2, x1 ;[029]
- bst x2, USBMINUS ;[030]
- bld shift, 2 ;[031]
- andi shift, 0xe7 ;[032]
-didUnstuff2: ;[ ]
- in x2, USBIN ;[033] <-- bit 3
- breq unstuff2 ;[034] *** unstuff escape
- eor r0, x2 ;[035]
- or phase, r0 ;[036]
- eor x1, x2 ;[037]
- bst x1, USBMINUS ;[038]
- in r0, USBIN ;[039] <-- phase
- bld shift, 3 ;[040]
- andi shift, 0xcf ;[041]
-didUnstuff3: ;[ ]
- breq unstuff3 ;[042] *** unstuff escape
- nop ;[043]
- in x1, USBIN ;[044] <-- bit 4
- eor x2, x1 ;[045]
- bst x2, USBMINUS ;[046]
- bld shift, 4 ;[047]
-didUnstuff4: ;[ ]
- eor r0, x1 ;[048]
- or phase, r0 ;[049]
- in r0, USBIN ;[050] <-- phase
- andi shift, 0x9f ;[051]
- breq unstuff4 ;[052] *** unstuff escape
- rjmp continueWithBit5;[053]
-; [---] ;[054]
-
-macro POP_STANDARD ; 16 cycles
- pop cnt
- pop x4
- pop x3
- pop x2
- pop x1
- pop shift
- pop YH
- pop r0
- endm
-macro POP_RETI ; 5 cycles
- pop YL
- out SREG, YL
- pop YL
- endm
-
-#include "asmcommon.inc"
-
-
-; USB spec says:
-; idle = J
-; J = (D+ = 0), (D- = 1)
-; K = (D+ = 1), (D- = 0)
-; Spec allows 7.5 bit times from EOP to SOP for replies
-
-bitstuff7:
- eor x1, x4 ;[4]
- ldi x2, 0 ;[5]
- nop2 ;[6] C is zero (brcc)
- rjmp didStuff7 ;[8]
-
-bitstuffN:
- eor x1, x4 ;[5]
- ldi x2, 0 ;[6]
- lpm ;[7] 3 cycle NOP, modifies r0
- out USBOUT, x1 ;[10] <-- out
- rjmp didStuffN ;[0]
-
-#define bitStatus x3
-
-sendNakAndReti:
- ldi cnt, USBPID_NAK ;[-19]
- rjmp sendCntAndReti ;[-18]
-sendAckAndReti:
- ldi cnt, USBPID_ACK ;[-17]
-sendCntAndReti:
- mov r0, cnt ;[-16]
- ldi YL, 0 ;[-15] R0 address is 0
- ldi YH, 0 ;[-14]
- ldi cnt, 2 ;[-13]
-; rjmp usbSendAndReti fallthrough
-
-;usbSend:
-;pointer to data in 'Y'
-;number of bytes in 'cnt' -- including sync byte [range 2 ... 12]
-;uses: x1...x4, shift, cnt, Y
-;Numbers in brackets are time since first bit of sync pattern is sent
-usbSendAndReti: ; 12 cycles until SOP
- in x2, USBDDR ;[-12]
- ori x2, USBMASK ;[-11]
- sbi USBOUT, USBMINUS;[-10] prepare idle state; D+ and D- must have been 0 (no pullups)
- in x1, USBOUT ;[-8] port mirror for tx loop
- out USBDDR, x2 ;[-7] <- acquire bus
-; need not init x2 (bitstuff history) because sync starts with 0
- ldi x4, USBMASK ;[-6] exor mask
- ldi shift, 0x80 ;[-5] sync byte is first byte sent
- ldi bitStatus, 0xff ;[-4] init bit loop counter, works for up to 12 bytes
-byteloop:
-bitloop:
- sbrs shift, 0 ;[8] [-3]
- eor x1, x4 ;[9] [-2]
- out USBOUT, x1 ;[10] [-1] <-- out
- ror shift ;[0]
- ror x2 ;[1]
-didStuffN:
- cpi x2, 0xfc ;[2]
- brcc bitstuffN ;[3]
- nop ;[4]
- subi bitStatus, 37 ;[5] 256 / 7 ~=~ 37
- brcc bitloop ;[6] when we leave the loop, bitStatus has almost the initial value
- sbrs shift, 0 ;[7]
- eor x1, x4 ;[8]
- ror shift ;[9]
-didStuff7:
- out USBOUT, x1 ;[10] <-- out
- ror x2 ;[0]
- cpi x2, 0xfc ;[1]
- brcc bitstuff7 ;[2]
- ld shift, y+ ;[3]
- dec cnt ;[5]
- brne byteloop ;[6]
-;make SE0:
- cbr x1, USBMASK ;[7] prepare SE0 [spec says EOP may be 21 to 25 cycles]
- lds x2, usbNewDeviceAddr;[8]
- lsl x2 ;[10] we compare with left shifted address
- out USBOUT, x1 ;[11] <-- out SE0 -- from now 2 bits = 22 cycles until bus idle
-;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm:
-;set address only after data packet was sent, not after handshake
- subi YL, 2 ;[0] Only assign address on data packets, not ACK/NAK in r0
- sbci YH, 0 ;[1]
- breq skipAddrAssign ;[2]
- sts usbDeviceAddr, x2; if not skipped: SE0 is one cycle longer
-skipAddrAssign:
-;end of usbDeviceAddress transfer
- ldi x2, 1<<USB_INTR_PENDING_BIT;[4] int0 occurred during TX -- clear pending flag
- USB_STORE_PENDING(x2) ;[5]
- ori x1, USBIDLE ;[6]
- in x2, USBDDR ;[7]
- cbr x2, USBMASK ;[8] set both pins to input
- mov x3, x1 ;[9]
- cbr x3, USBMASK ;[10] configure no pullup on both pins
- ldi x4, 4 ;[11]
-se0Delay:
- dec x4 ;[12] [15] [18] [21]
- brne se0Delay ;[13] [16] [19] [22]
- out USBOUT, x1 ;[23] <-- out J (idle) -- end of SE0 (EOP signal)
- out USBDDR, x2 ;[24] <-- release bus now
- out USBOUT, x3 ;[25] <-- ensure no pull-up resistors are active
- rjmp doReturn
-
diff --git a/tmk_core/protocol/vusb/usbdrv/usbdrvasm18-crc.inc b/tmk_core/protocol/vusb/usbdrv/usbdrvasm18-crc.inc
deleted file mode 100644
index f83347df7f..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/usbdrvasm18-crc.inc
+++ /dev/null
@@ -1,707 +0,0 @@
-/* Name: usbdrvasm18.inc
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Lukas Schrittwieser (based on 20 MHz usbdrvasm20.inc by Jeroen Benschop)
- * Creation Date: 2009-01-20
- * Tabsize: 4
- * Copyright: (c) 2008 by Lukas Schrittwieser and OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * Revision: $Id: usbdrvasm18-crc.inc 740 2009-04-13 18:23:31Z cs $
- */
-
-/* Do not link this file! Link usbdrvasm.S instead, which includes the
- * appropriate implementation!
- */
-
-/*
-General Description:
-This file is the 18 MHz version of the asssembler part of the USB driver. It
-requires a 18 MHz crystal (not a ceramic resonator and not a calibrated RC
-oscillator).
-
-See usbdrv.h for a description of the entire driver.
-
-Since almost all of this code is timing critical, don't change unless you
-really know what you are doing! Many parts require not only a maximum number
-of CPU cycles, but even an exact number of cycles!
-*/
-
-
-;max stack usage: [ret(2), YL, SREG, YH, [sofError], bitcnt(x5), shift, x1, x2, x3, x4, cnt, ZL, ZH] = 14 bytes
-;nominal frequency: 18 MHz -> 12 cycles per bit
-; Numbers in brackets are clocks counted from center of last sync bit
-; when instruction starts
-;register use in receive loop to receive the data bytes:
-; shift assembles the byte currently being received
-; x1 holds the D+ and D- line state
-; x2 holds the previous line state
-; cnt holds the number of bytes left in the receive buffer
-; x3 holds the higher crc byte (see algorithm below)
-; x4 is used as temporary register for the crc algorithm
-; x5 is used for unstuffing: when unstuffing the last received bit is inverted in shift (to prevent further
-; unstuffing calls. In the same time the corresponding bit in x5 is cleared to mark the bit as beening iverted
-; zl lower crc value and crc table index
-; zh used for crc table accesses
-
-;--------------------------------------------------------------------------------------------------------------
-; CRC mods:
-; table driven crc checker, Z points to table in prog space
-; ZL is the lower crc byte, x3 is the higher crc byte
-; x4 is used as temp register to store different results
-; the initialization of the crc register is not 0xFFFF but 0xFE54. This is because during the receipt of the
-; first data byte an virtual zero data byte is added to the crc register, this results in the correct initial
-; value of 0xFFFF at beginning of the second data byte before the first data byte is added to the crc.
-; The magic number 0xFE54 results form the crc table: At tabH[0x54] = 0xFF = crcH (required) and
-; tabL[0x54] = 0x01 -> crcL = 0x01 xor 0xFE = 0xFF
-; bitcnt is renamed to x5 and is used for unstuffing purposes, the unstuffing works like in the 12MHz version
-;--------------------------------------------------------------------------------------------------------------
-; CRC algorithm:
-; The crc register is formed by x3 (higher byte) and ZL (lower byte). The algorithm uses a 'reversed' form
-; i.e. that it takes the least significant bit first and shifts to the right. So in fact the highest order
-; bit seen from the polynomial devision point of view is the lsb of ZL. (If this sounds strange to you i
-; propose a research on CRC :-) )
-; Each data byte received is xored to ZL, the lower crc byte. This byte now builds the crc
-; table index. Next the new high byte is loaded from the table and stored in x4 until we have space in x3
-; (its destination).
-; Afterwards the lower table is loaded from the table and stored in ZL (the old index is overwritten as
-; we don't need it anymore. In fact this is a right shift by 8 bits.) Now the old crc high value is xored
-; to ZL, this is the second shift of the old crc value. Now x4 (the temp reg) is moved to x3 and the crc
-; calculation is done.
-; Prior to the first byte the two CRC register have to be initialized to 0xFFFF (as defined in usb spec)
-; however the crc engine also runs during the receipt of the first byte, therefore x3 and zl are initialized
-; to a magic number which results in a crc value of 0xFFFF after the first complete byte.
-;
-; This algorithm is split into the extra cycles of the different bits:
-; bit7: XOR the received byte to ZL
-; bit5: load the new high byte to x4
-; bit6: load the lower xor byte from the table, xor zl and x3, store result in zl (=the new crc low value)
-; move x4 (the new high byte) to x3, the crc value is ready
-;
-
-
-macro POP_STANDARD ; 18 cycles
- pop ZH
- pop ZL
- pop cnt
- pop x5
- pop x3
- pop x2
- pop x1
- pop shift
- pop x4
- endm
-macro POP_RETI ; 7 cycles
- pop YH
- pop YL
- out SREG, YL
- pop YL
- endm
-
-macro CRC_CLEANUP_AND_CHECK
- ; the last byte has already been xored with the lower crc byte, we have to do the table lookup and xor
- ; x3 is the higher crc byte, zl the lower one
- ldi ZH, hi8(usbCrcTableHigh);[+1] get the new high byte from the table
- lpm x2, Z ;[+2][+3][+4]
- ldi ZH, hi8(usbCrcTableLow);[+5] get the new low xor byte from the table
- lpm ZL, Z ;[+6][+7][+8]
- eor ZL, x3 ;[+7] xor the old high byte with the value from the table, x2:ZL now holds the crc value
- cpi ZL, 0x01 ;[+8] if the crc is ok we have a fixed remainder value of 0xb001 in x2:ZL (see usb spec)
- brne ignorePacket ;[+9] detected a crc fault -> paket is ignored and retransmitted by the host
- cpi x2, 0xb0 ;[+10]
- brne ignorePacket ;[+11] detected a crc fault -> paket is ignored and retransmitted by the host
- endm
-
-
-USB_INTR_VECTOR:
-;order of registers pushed: YL, SREG, YH, [sofError], x4, shift, x1, x2, x3, x5, cnt, ZL, ZH
- push YL ;[-28] push only what is necessary to sync with edge ASAP
- in YL, SREG ;[-26]
- push YL ;[-25]
- push YH ;[-23]
-;----------------------------------------------------------------------------
-; Synchronize with sync pattern:
-;----------------------------------------------------------------------------
-;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K]
-;sync up with J to K edge during sync pattern -- use fastest possible loops
-;The first part waits at most 1 bit long since we must be in sync pattern.
-;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to
-;waitForJ, ensure that this prerequisite is met.
-waitForJ:
- inc YL
- sbis USBIN, USBMINUS
- brne waitForJ ; just make sure we have ANY timeout
-waitForK:
-;The following code results in a sampling window of < 1/4 bit which meets the spec.
- sbis USBIN, USBMINUS ;[-17]
- rjmp foundK ;[-16]
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
-#if USB_COUNT_SOF
- lds YL, usbSofCount
- inc YL
- sts usbSofCount, YL
-#endif /* USB_COUNT_SOF */
-#ifdef USB_SOF_HOOK
- USB_SOF_HOOK
-#endif
- rjmp sofError
-foundK: ;[-15]
-;{3, 5} after falling D- edge, average delay: 4 cycles
-;bit0 should be at 30 (2.5 bits) for center sampling. Currently at 4 so 26 cylces till bit 0 sample
-;use 1 bit time for setup purposes, then sample again. Numbers in brackets
-;are cycles from center of first sync (double K) bit after the instruction
- push x4 ;[-14]
-; [---] ;[-13]
- lds YL, usbInputBufOffset;[-12] used to toggle the two usb receive buffers
-; [---] ;[-11]
- clr YH ;[-10]
- subi YL, lo8(-(usbRxBuf));[-9] [rx loop init]
- sbci YH, hi8(-(usbRxBuf));[-8] [rx loop init]
- push shift ;[-7]
-; [---] ;[-6]
- ldi shift, 0x80 ;[-5] the last bit is the end of byte marker for the pid receiver loop
- clc ;[-4] the carry has to be clear for receipt of pid bit 0
- sbis USBIN, USBMINUS ;[-3] we want two bits K (sample 3 cycles too early)
- rjmp haveTwoBitsK ;[-2]
- pop shift ;[-1] undo the push from before
- pop x4 ;[1]
- rjmp waitForK ;[3] this was not the end of sync, retry
-; The entire loop from waitForK until rjmp waitForK above must not exceed two
-; bit times (= 24 cycles).
-
-;----------------------------------------------------------------------------
-; push more registers and initialize values while we sample the first bits:
-;----------------------------------------------------------------------------
-haveTwoBitsK:
- push x1 ;[0]
- push x2 ;[2]
- push x3 ;[4] crc high byte
- ldi x2, 1<<USBPLUS ;[6] [rx loop init] current line state is K state. D+=="1", D-=="0"
- push x5 ;[7]
- push cnt ;[9]
- ldi cnt, USB_BUFSIZE ;[11]
-
-
-;--------------------------------------------------------------------------------------------------------------
-; receives the pid byte
-; there is no real unstuffing algorithm implemented here as a stuffing bit is impossible in the pid byte.
-; That's because the last four bits of the byte are the inverted of the first four bits. If we detect a
-; unstuffing condition something went wrong and abort
-; shift has to be initialized to 0x80
-;--------------------------------------------------------------------------------------------------------------
-
-; pid bit 0 - used for even more register saving (we need the z pointer)
- in x1, USBIN ;[0] sample line state
- andi x1, USBMASK ;[1] filter only D+ and D- bits
- eor x2, x1 ;[2] generate inverted of actual bit
- sbrc x2, USBMINUS ;[3] if the bit is set we received a zero
- sec ;[4]
- ror shift ;[5] we perform no unstuffing check here as this is the first bit
- mov x2, x1 ;[6]
- push ZL ;[7]
- ;[8]
- push ZH ;[9]
- ;[10]
- ldi x3, 0xFE ;[11] x3 is the high order crc value
-
-
-bitloopPid:
- in x1, USBIN ;[0] sample line state
- andi x1, USBMASK ;[1] filter only D+ and D- bits
- breq nse0 ;[2] both lines are low so handle se0
- eor x2, x1 ;[3] generate inverted of actual bit
- sbrc x2, USBMINUS ;[4] set the carry if we received a zero
- sec ;[5]
- ror shift ;[6]
- ldi ZL, 0x54 ;[7] ZL is the low order crc value
- ser x4 ;[8] the is no bit stuffing check here as the pid bit can't be stuffed. if so
- ; some error occured. In this case the paket is discarded later on anyway.
- mov x2, x1 ;[9] prepare for the next cycle
- brcc bitloopPid ;[10] while 0s drop out of shift we get the next bit
- eor x4, shift ;[11] invert all bits in shift and store result in x4
-
-;--------------------------------------------------------------------------------------------------------------
-; receives data bytes and calculates the crc
-; the last USBIN state has to be in x2
-; this is only the first half, due to branch distanc limitations the second half of the loop is near the end
-; of this asm file
-;--------------------------------------------------------------------------------------------------------------
-
-rxDataStart:
- in x1, USBIN ;[0] sample line state (note: a se0 check is not useful due to bit dribbling)
- ser x5 ;[1] prepare the unstuff marker register
- eor x2, x1 ;[2] generates the inverted of the actual bit
- bst x2, USBMINUS ;[3] copy the bit from x2
- bld shift, 0 ;[4] and store it in shift
- mov x2, shift ;[5] make a copy of shift for unstuffing check
- andi x2, 0xF9 ;[6] mask the last six bits, if we got six zeros (which are six ones in fact)
- breq unstuff0 ;[7] then Z is set now and we branch to the unstuffing handler
-didunstuff0:
- subi cnt, 1 ;[8] cannot use dec because it doesn't affect the carry flag
- brcs nOverflow ;[9] Too many bytes received. Ignore packet
- st Y+, x4 ;[10] store the last received byte
- ;[11] st needs two cycles
-
-; bit1
- in x2, USBIN ;[0] sample line state
- andi x1, USBMASK ;[1] check for se0 during bit 0
- breq nse0 ;[2]
- andi x2, USBMASK ;[3] check se0 during bit 1
- breq nse0 ;[4]
- eor x1, x2 ;[5]
- bst x1, USBMINUS ;[6]
- bld shift, 1 ;[7]
- mov x1, shift ;[8]
- andi x1, 0xF3 ;[9]
- breq unstuff1 ;[10]
-didunstuff1:
- nop ;[11]
-
-; bit2
- in x1, USBIN ;[0] sample line state
- andi x1, USBMASK ;[1] check for se0 (as there is nothing else to do here
- breq nOverflow ;[2]
- eor x2, x1 ;[3] generates the inverted of the actual bit
- bst x2, USBMINUS ;[4]
- bld shift, 2 ;[5] store the bit
- mov x2, shift ;[6]
- andi x2, 0xE7 ;[7] if we have six zeros here (which means six 1 in the stream)
- breq unstuff2 ;[8] the next bit is a stuffing bit
-didunstuff2:
- nop2 ;[9]
- ;[10]
- nop ;[11]
-
-; bit3
- in x2, USBIN ;[0] sample line state
- andi x2, USBMASK ;[1] check for se0
- breq nOverflow ;[2]
- eor x1, x2 ;[3]
- bst x1, USBMINUS ;[4]
- bld shift, 3 ;[5]
- mov x1, shift ;[6]
- andi x1, 0xCF ;[7]
- breq unstuff3 ;[8]
-didunstuff3:
- nop ;[9]
- rjmp rxDataBit4 ;[10]
- ;[11]
-
-; the avr branch instructions allow an offset of +63 insturction only, so we need this
-; 'local copy' of se0
-nse0:
- rjmp se0 ;[4]
- ;[5]
-; the same same as for se0 is needed for overflow and StuffErr
-nOverflow:
-stuffErr:
- rjmp overflow
-
-
-unstuff0: ;[8] this is the branch delay of breq unstuffX
- andi x1, USBMASK ;[9] do an se0 check here (if the last crc byte ends with 5 one's we might end up here
- breq didunstuff0 ;[10] event tough the message is complete -> jump back and store the byte
- ori shift, 0x01 ;[11] invert the last received bit to prevent furhter unstuffing
- in x2, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors
- andi x5, 0xFE ;[1] mark this bit as inverted (will be corrected before storing shift)
- eor x1, x2 ;[2] x1 and x2 have to be different because the stuff bit is always a zero
- andi x1, USBMASK ;[3] mask the interesting bits
- breq stuffErr ;[4] if the stuff bit is a 1-bit something went wrong
- mov x1, x2 ;[5] the next bit expects the last state to be in x1
- rjmp didunstuff0 ;[6]
- ;[7] jump delay of rjmp didunstuffX
-
-unstuff1: ;[11] this is the jump delay of breq unstuffX
- in x1, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors
- ori shift, 0x02 ;[1] invert the last received bit to prevent furhter unstuffing
- andi x5, 0xFD ;[2] mark this bit as inverted (will be corrected before storing shift)
- eor x2, x1 ;[3] x1 and x2 have to be different because the stuff bit is always a zero
- andi x2, USBMASK ;[4] mask the interesting bits
- breq stuffErr ;[5] if the stuff bit is a 1-bit something went wrong
- mov x2, x1 ;[6] the next bit expects the last state to be in x2
- nop2 ;[7]
- ;[8]
- rjmp didunstuff1 ;[9]
- ;[10] jump delay of rjmp didunstuffX
-
-unstuff2: ;[9] this is the jump delay of breq unstuffX
- ori shift, 0x04 ;[10] invert the last received bit to prevent furhter unstuffing
- andi x5, 0xFB ;[11] mark this bit as inverted (will be corrected before storing shift)
- in x2, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors
- eor x1, x2 ;[1] x1 and x2 have to be different because the stuff bit is always a zero
- andi x1, USBMASK ;[2] mask the interesting bits
- breq stuffErr ;[3] if the stuff bit is a 1-bit something went wrong
- mov x1, x2 ;[4] the next bit expects the last state to be in x1
- nop2 ;[5]
- ;[6]
- rjmp didunstuff2 ;[7]
- ;[8] jump delay of rjmp didunstuffX
-
-unstuff3: ;[9] this is the jump delay of breq unstuffX
- ori shift, 0x08 ;[10] invert the last received bit to prevent furhter unstuffing
- andi x5, 0xF7 ;[11] mark this bit as inverted (will be corrected before storing shift)
- in x1, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors
- eor x2, x1 ;[1] x1 and x2 have to be different because the stuff bit is always a zero
- andi x2, USBMASK ;[2] mask the interesting bits
- breq stuffErr ;[3] if the stuff bit is a 1-bit something went wrong
- mov x2, x1 ;[4] the next bit expects the last state to be in x2
- nop2 ;[5]
- ;[6]
- rjmp didunstuff3 ;[7]
- ;[8] jump delay of rjmp didunstuffX
-
-
-
-; the include has to be here due to branch distance restirctions
-#define __USE_CRC__
-#include "asmcommon.inc"
-
-
-
-; USB spec says:
-; idle = J
-; J = (D+ = 0), (D- = 1)
-; K = (D+ = 1), (D- = 0)
-; Spec allows 7.5 bit times from EOP to SOP for replies
-; 7.5 bit times is 90 cycles. ...there is plenty of time
-
-
-sendNakAndReti:
- ldi x3, USBPID_NAK ;[-18]
- rjmp sendX3AndReti ;[-17]
-sendAckAndReti:
- ldi cnt, USBPID_ACK ;[-17]
-sendCntAndReti:
- mov x3, cnt ;[-16]
-sendX3AndReti:
- ldi YL, 20 ;[-15] x3==r20 address is 20
- ldi YH, 0 ;[-14]
- ldi cnt, 2 ;[-13]
-; rjmp usbSendAndReti fallthrough
-
-;usbSend:
-;pointer to data in 'Y'
-;number of bytes in 'cnt' -- including sync byte [range 2 ... 12]
-;uses: x1...x4, btcnt, shift, cnt, Y
-;Numbers in brackets are time since first bit of sync pattern is sent
-
-usbSendAndReti: ; 12 cycles until SOP
- in x2, USBDDR ;[-12]
- ori x2, USBMASK ;[-11]
- sbi USBOUT, USBMINUS;[-10] prepare idle state; D+ and D- must have been 0 (no pullups)
- in x1, USBOUT ;[-8] port mirror for tx loop
- out USBDDR, x2 ;[-6] <- acquire bus
- ldi x2, 0 ;[-6] init x2 (bitstuff history) because sync starts with 0
- ldi x4, USBMASK ;[-5] exor mask
- ldi shift, 0x80 ;[-4] sync byte is first byte sent
-txByteLoop:
- ldi bitcnt, 0x40 ;[-3]=[9] binary 01000000
-txBitLoop: ; the loop sends the first 7 bits of the byte
- sbrs shift, 0 ;[-2]=[10] if we have to send a 1 don't change the line state
- eor x1, x4 ;[-1]=[11]
- out USBOUT, x1 ;[0]
- ror shift ;[1]
- ror x2 ;[2] transfers the last sent bit to the stuffing history
-didStuffN:
- nop ;[3]
- nop ;[4]
- cpi x2, 0xfc ;[5] if we sent six consecutive ones
- brcc bitstuffN ;[6]
- lsr bitcnt ;[7]
- brne txBitLoop ;[8] restart the loop while the 1 is still in the bitcount
-
-; transmit bit 7
- sbrs shift, 0 ;[9]
- eor x1, x4 ;[10]
-didStuff7:
- ror shift ;[11]
- out USBOUT, x1 ;[0] transfer bit 7 to the pins
- ror x2 ;[1] move the bit into the stuffing history
- cpi x2, 0xfc ;[2]
- brcc bitstuff7 ;[3]
- ld shift, y+ ;[4] get next byte to transmit
- dec cnt ;[5] decrement byte counter
- brne txByteLoop ;[7] if we have more bytes start next one
- ;[8] branch delay
-
-;make SE0:
- cbr x1, USBMASK ;[8] prepare SE0 [spec says EOP may be 25 to 30 cycles]
- lds x2, usbNewDeviceAddr;[9]
- lsl x2 ;[11] we compare with left shifted address
- out USBOUT, x1 ;[0] <-- out SE0 -- from now 2 bits = 24 cycles until bus idle
- subi YL, 20 + 2 ;[1] Only assign address on data packets, not ACK/NAK in x3
- sbci YH, 0 ;[2]
-;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm:
-;set address only after data packet was sent, not after handshake
- breq skipAddrAssign ;[3]
- sts usbDeviceAddr, x2 ; if not skipped: SE0 is one cycle longer
-skipAddrAssign:
-;end of usbDeviceAddress transfer
- ldi x2, 1<<USB_INTR_PENDING_BIT;[5] int0 occurred during TX -- clear pending flag
- USB_STORE_PENDING(x2) ;[6]
- ori x1, USBIDLE ;[7]
- in x2, USBDDR ;[8]
- cbr x2, USBMASK ;[9] set both pins to input
- mov x3, x1 ;[10]
- cbr x3, USBMASK ;[11] configure no pullup on both pins
- ldi x4, 4 ;[12]
-se0Delay:
- dec x4 ;[13] [16] [19] [22]
- brne se0Delay ;[14] [17] [20] [23]
- out USBOUT, x1 ;[24] <-- out J (idle) -- end of SE0 (EOP signal)
- out USBDDR, x2 ;[25] <-- release bus now
- out USBOUT, x3 ;[26] <-- ensure no pull-up resistors are active
- rjmp doReturn
-
-bitstuffN:
- eor x1, x4 ;[8] generate a zero
- ldi x2, 0 ;[9] reset the bit stuffing history
- nop2 ;[10]
- out USBOUT, x1 ;[0] <-- send the stuffing bit
- rjmp didStuffN ;[1]
-
-bitstuff7:
- eor x1, x4 ;[5]
- ldi x2, 0 ;[6] reset bit stuffing history
- clc ;[7] fill a zero into the shift register
- rol shift ;[8] compensate for ror shift at branch destination
- rjmp didStuff7 ;[9]
- ;[10] jump delay
-
-;--------------------------------------------------------------------------------------------------------------
-; receives data bytes and calculates the crc
-; second half of the data byte receiver loop
-; most parts of the crc algorithm are here
-;--------------------------------------------------------------------------------------------------------------
-
-nOverflow2:
- rjmp overflow
-
-rxDataBit4:
- in x1, USBIN ;[0] sample line state
- andi x1, USBMASK ;[1] check for se0
- breq nOverflow2 ;[2]
- eor x2, x1 ;[3]
- bst x2, USBMINUS ;[4]
- bld shift, 4 ;[5]
- mov x2, shift ;[6]
- andi x2, 0x9F ;[7]
- breq unstuff4 ;[8]
-didunstuff4:
- nop2 ;[9][10]
- nop ;[11]
-
-; bit5
- in x2, USBIN ;[0] sample line state
- ldi ZH, hi8(usbCrcTableHigh);[1] use the table for the higher byte
- eor x1, x2 ;[2]
- bst x1, USBMINUS ;[3]
- bld shift, 5 ;[4]
- mov x1, shift ;[5]
- andi x1, 0x3F ;[6]
- breq unstuff5 ;[7]
-didunstuff5:
- lpm x4, Z ;[8] load the higher crc xor-byte and store it for later use
- ;[9] lpm needs 3 cycles
- ;[10]
- ldi ZH, hi8(usbCrcTableLow);[11] load the lower crc xor byte adress
-
-; bit6
- in x1, USBIN ;[0] sample line state
- eor x2, x1 ;[1]
- bst x2, USBMINUS ;[2]
- bld shift, 6 ;[3]
- mov x2, shift ;[4]
- andi x2, 0x7E ;[5]
- breq unstuff6 ;[6]
-didunstuff6:
- lpm ZL, Z ;[7] load the lower xor crc byte
- ;[8] lpm needs 3 cycles
- ;[9]
- eor ZL, x3 ;[10] xor the old high crc byte with the low xor-byte
- mov x3, x4 ;[11] move the new high order crc value from temp to its destination
-
-; bit7
- in x2, USBIN ;[0] sample line state
- eor x1, x2 ;[1]
- bst x1, USBMINUS ;[2]
- bld shift, 7 ;[3] now shift holds the complete but inverted data byte
- mov x1, shift ;[4]
- andi x1, 0xFC ;[5]
- breq unstuff7 ;[6]
-didunstuff7:
- eor x5, shift ;[7] x5 marks all bits which have not been inverted by the unstuffing subs
- mov x4, x5 ;[8] keep a copy of the data byte it will be stored during next bit0
- eor ZL, x4 ;[9] feed the actual byte into the crc algorithm
- rjmp rxDataStart ;[10] next byte
- ;[11] during the reception of the next byte this one will be fed int the crc algorithm
-
-unstuff4: ;[9] this is the jump delay of rjmp unstuffX
- ori shift, 0x10 ;[10] invert the last received bit to prevent furhter unstuffing
- andi x5, 0xEF ;[11] mark this bit as inverted (will be corrected before storing shift)
- in x2, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors
- eor x1, x2 ;[1] x1 and x2 have to be different because the stuff bit is always a zero
- andi x1, USBMASK ;[2] mask the interesting bits
- breq stuffErr2 ;[3] if the stuff bit is a 1-bit something went wrong
- mov x1, x2 ;[4] the next bit expects the last state to be in x1
- nop2 ;[5]
- ;[6]
- rjmp didunstuff4 ;[7]
- ;[8] jump delay of rjmp didunstuffX
-
-unstuff5: ;[8] this is the jump delay of rjmp unstuffX
- nop ;[9]
- ori shift, 0x20 ;[10] invert the last received bit to prevent furhter unstuffing
- andi x5, 0xDF ;[11] mark this bit as inverted (will be corrected before storing shift)
- in x1, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors
- eor x2, x1 ;[1] x1 and x2 have to be different because the stuff bit is always a zero
- andi x2, USBMASK ;[2] mask the interesting bits
- breq stuffErr2 ;[3] if the stuff bit is a 1-bit something went wrong
- mov x2, x1 ;[4] the next bit expects the last state to be in x2
- nop ;[5]
- rjmp didunstuff5 ;[6]
- ;[7] jump delay of rjmp didunstuffX
-
-unstuff6: ;[7] this is the jump delay of rjmp unstuffX
- nop2 ;[8]
- ;[9]
- ori shift, 0x40 ;[10] invert the last received bit to prevent furhter unstuffing
- andi x5, 0xBF ;[11] mark this bit as inverted (will be corrected before storing shift)
- in x2, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors
- eor x1, x2 ;[1] x1 and x2 have to be different because the stuff bit is always a zero
- andi x1, USBMASK ;[2] mask the interesting bits
- breq stuffErr2 ;[3] if the stuff bit is a 1-bit something went wrong
- mov x1, x2 ;[4] the next bit expects the last state to be in x1
- rjmp didunstuff6 ;[5]
- ;[6] jump delay of rjmp didunstuffX
-
-unstuff7: ;[7] this is the jump delay of rjmp unstuffX
- nop ;[8]
- nop ;[9]
- ori shift, 0x80 ;[10] invert the last received bit to prevent furhter unstuffing
- andi x5, 0x7F ;[11] mark this bit as inverted (will be corrected before storing shift)
- in x1, USBIN ;[0] we have some free cycles so we could check for bit stuffing errors
- eor x2, x1 ;[1] x1 and x2 have to be different because the stuff bit is always a zero
- andi x2, USBMASK ;[2] mask the interesting bits
- breq stuffErr2 ;[3] if the stuff bit is a 1-bit something went wrong
- mov x2, x1 ;[4] the next bit expects the last state to be in x2
- rjmp didunstuff7 ;[5]
- ;[6] jump delay of rjmp didunstuff7
-
-; local copy of the stuffErr desitnation for the second half of the receiver loop
-stuffErr2:
- rjmp stuffErr
-
-;--------------------------------------------------------------------------------------------------------------
-; The crc table follows. It has to be aligned to enable a fast loading of the needed bytes.
-; There are two tables of 256 entries each, the low and the high byte table.
-; Table values were generated with the following C code:
-/*
-#include <stdio.h>
-int main (int argc, char **argv)
-{
- int i, j;
- for (i=0; i<512; i++){
- unsigned short crc = i & 0xff;
- for(j=0; j<8; j++) crc = (crc >> 1) ^ ((crc & 1) ? 0xa001 : 0);
- if((i & 7) == 0) printf("\n.byte ");
- printf("0x%02x, ", (i > 0xff ? (crc >> 8) : crc) & 0xff);
- if(i == 255) printf("\n");
- }
- return 0;
-}
-
-// Use the following algorithm to compute CRC values:
-ushort computeCrc(uchar *msg, uchar msgLen)
-{
- uchar i;
- ushort crc = 0xffff;
- for(i = 0; i < msgLen; i++)
- crc = usbCrcTable16[lo8(crc) ^ msg[i]] ^ hi8(crc);
- return crc;
-}
-*/
-
-.balign 256
-usbCrcTableLow:
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
-.byte 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-
-; .balign 256
-usbCrcTableHigh:
-.byte 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2
-.byte 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04
-.byte 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E
-.byte 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8
-.byte 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A
-.byte 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC
-.byte 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6
-.byte 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10
-.byte 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32
-.byte 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4
-.byte 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE
-.byte 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38
-.byte 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA
-.byte 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C
-.byte 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26
-.byte 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0
-.byte 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62
-.byte 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4
-.byte 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE
-.byte 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68
-.byte 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA
-.byte 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C
-.byte 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76
-.byte 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0
-.byte 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92
-.byte 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54
-.byte 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E
-.byte 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98
-.byte 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A
-.byte 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C
-.byte 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86
-.byte 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40
-
diff --git a/tmk_core/protocol/vusb/usbdrv/usbdrvasm20.inc b/tmk_core/protocol/vusb/usbdrv/usbdrvasm20.inc
deleted file mode 100644
index 303abaf64c..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/usbdrvasm20.inc
+++ /dev/null
@@ -1,360 +0,0 @@
-/* Name: usbdrvasm20.inc
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Jeroen Benschop
- * Based on usbdrvasm16.inc from Christian Starkjohann
- * Creation Date: 2008-03-05
- * Tabsize: 4
- * Copyright: (c) 2008 by Jeroen Benschop and OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * Revision: $Id: usbdrvasm20.inc 740 2009-04-13 18:23:31Z cs $
- */
-
-/* Do not link this file! Link usbdrvasm.S instead, which includes the
- * appropriate implementation!
- */
-
-/*
-General Description:
-This file is the 20 MHz version of the asssembler part of the USB driver. It
-requires a 20 MHz crystal (not a ceramic resonator and not a calibrated RC
-oscillator).
-
-See usbdrv.h for a description of the entire driver.
-
-Since almost all of this code is timing critical, don't change unless you
-really know what you are doing! Many parts require not only a maximum number
-of CPU cycles, but even an exact number of cycles!
-*/
-
-#define leap2 x3
-#ifdef __IAR_SYSTEMS_ASM__
-#define nextInst $+2
-#else
-#define nextInst .+0
-#endif
-
-;max stack usage: [ret(2), YL, SREG, YH, bitcnt, shift, x1, x2, x3, x4, cnt] = 12 bytes
-;nominal frequency: 20 MHz -> 13.333333 cycles per bit, 106.666667 cycles per byte
-; Numbers in brackets are clocks counted from center of last sync bit
-; when instruction starts
-;register use in receive loop:
-; shift assembles the byte currently being received
-; x1 holds the D+ and D- line state
-; x2 holds the previous line state
-; x4 (leap) is used to add a leap cycle once every three bytes received
-; X3 (leap2) is used to add a leap cycle once every three stuff bits received
-; bitcnt is used to determine when a stuff bit is due
-; cnt holds the number of bytes left in the receive buffer
-
-USB_INTR_VECTOR:
-;order of registers pushed: YL, SREG YH, [sofError], bitcnt, shift, x1, x2, x3, x4, cnt
- push YL ;[-28] push only what is necessary to sync with edge ASAP
- in YL, SREG ;[-26]
- push YL ;[-25]
- push YH ;[-23]
-;----------------------------------------------------------------------------
-; Synchronize with sync pattern:
-;----------------------------------------------------------------------------
-;sync byte (D-) pattern LSb to MSb: 01010100 [1 = idle = J, 0 = K]
-;sync up with J to K edge during sync pattern -- use fastest possible loops
-;The first part waits at most 1 bit long since we must be in sync pattern.
-;YL is guarenteed to be < 0x80 because I flag is clear. When we jump to
-;waitForJ, ensure that this prerequisite is met.
-waitForJ:
- inc YL
- sbis USBIN, USBMINUS
- brne waitForJ ; just make sure we have ANY timeout
-waitForK:
-;The following code results in a sampling window of < 1/4 bit which meets the spec.
- sbis USBIN, USBMINUS ;[-19]
- rjmp foundK ;[-18]
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
- sbis USBIN, USBMINUS
- rjmp foundK
-#if USB_COUNT_SOF
- lds YL, usbSofCount
- inc YL
- sts usbSofCount, YL
-#endif /* USB_COUNT_SOF */
-#ifdef USB_SOF_HOOK
- USB_SOF_HOOK
-#endif
- rjmp sofError
-foundK: ;[-16]
-;{3, 5} after falling D- edge, average delay: 4 cycles
-;bit0 should be at 34 for center sampling. Currently at 4 so 30 cylces till bit 0 sample
-;use 1 bit time for setup purposes, then sample again. Numbers in brackets
-;are cycles from center of first sync (double K) bit after the instruction
- push bitcnt ;[-16]
-; [---] ;[-15]
- lds YL, usbInputBufOffset;[-14]
-; [---] ;[-13]
- clr YH ;[-12]
- subi YL, lo8(-(usbRxBuf));[-11] [rx loop init]
- sbci YH, hi8(-(usbRxBuf));[-10] [rx loop init]
- push shift ;[-9]
-; [---] ;[-8]
- ldi shift,0x40 ;[-7] set msb to "1" so processing bit7 can be detected
- nop2 ;[-6]
-; [---] ;[-5]
- ldi bitcnt, 5 ;[-4] [rx loop init]
- sbis USBIN, USBMINUS ;[-3] we want two bits K (sample 3 cycles too early)
- rjmp haveTwoBitsK ;[-2]
- pop shift ;[-1] undo the push from before
- pop bitcnt ;[1]
- rjmp waitForK ;[3] this was not the end of sync, retry
-; The entire loop from waitForK until rjmp waitForK above must not exceed two
-; bit times (= 27 cycles).
-
-;----------------------------------------------------------------------------
-; push more registers and initialize values while we sample the first bits:
-;----------------------------------------------------------------------------
-haveTwoBitsK:
- push x1 ;[0]
- push x2 ;[2]
- push x3 ;[4] (leap2)
- ldi leap2, 0x55 ;[6] add leap cycle on 2nd,5th,8th,... stuff bit
- push x4 ;[7] == leap
- ldi leap, 0x55 ;[9] skip leap cycle on 2nd,5th,8th,... byte received
- push cnt ;[10]
- ldi cnt, USB_BUFSIZE ;[12] [rx loop init]
- ldi x2, 1<<USBPLUS ;[13] current line state is K state. D+=="1", D-=="0"
-bit0:
- in x1, USBIN ;[0] sample line state
- andi x1, USBMASK ;[1] filter only D+ and D- bits
- rjmp handleBit ;[2] make bit0 14 cycles long
-
-;----------------------------------------------------------------------------
-; Process bit7. However, bit 6 still may need unstuffing.
-;----------------------------------------------------------------------------
-
-b6checkUnstuff:
- dec bitcnt ;[9]
- breq unstuff6 ;[10]
-bit7:
- subi cnt, 1 ;[11] cannot use dec becaus it does not affect the carry flag
- brcs overflow ;[12] Too many bytes received. Ignore packet
- in x1, USBIN ;[0] sample line state
- andi x1, USBMASK ;[1] filter only D+ and D- bits
- cpse x1, x2 ;[2] when previous line state equals current line state, handle "1"
- rjmp b7handle0 ;[3] when line state differs, handle "0"
- sec ;[4]
- ror shift ;[5] shift "1" into the data
- st y+, shift ;[6] store the data into the buffer
- ldi shift, 0x40 ;[7] reset data for receiving the next byte
- subi leap, 0x55 ;[9] trick to introduce a leap cycle every 3 bytes
- brcc nextInst ;[10 or 11] it will fail after 85 bytes. However low speed can only receive 11
- dec bitcnt ;[11 or 12]
- brne bit0 ;[12 or 13]
- ldi x1, 1 ;[13 or 14] unstuffing bit 7
- in bitcnt, USBIN ;[0] sample stuff bit
- rjmp unstuff ;[1]
-
-b7handle0:
- mov x2,x1 ;[5] Set x2 to current line state
- ldi bitcnt, 6 ;[6]
- lsr shift ;[7] shift "0" into the data
- st y+, shift ;[8] store data into the buffer
- ldi shift, 0x40 ;[10] reset data for receiving the next byte
- subi leap, 0x55 ;[11] trick to introduce a leap cycle every 3 bytes
- brcs bit0 ;[12] it will fail after 85 bytes. However low speed can only receive 11
- rjmp bit0 ;[13]
-
-
-;----------------------------------------------------------------------------
-; Handle unstuff
-; x1==0xFF indicate unstuffing bit6
-;----------------------------------------------------------------------------
-
-unstuff6:
- ldi x1,0xFF ;[12] indicate unstuffing bit 6
- in bitcnt, USBIN ;[0] sample stuff bit
- nop ;[1] fix timing
-unstuff: ;b0-5 b6 b7
- mov x2,bitcnt ;[3] [2] [3] Set x2 to match line state
- subi leap2, 0x55 ;[4] [3] [4] delay loop
- brcs nextInst ;[5] [4] [5] add one cycle every three stuff bits
- sbci leap2,0 ;[6] [5] [6]
- ldi bitcnt,6 ;[7] [6] [7] reset bit stuff counter
- andi x2, USBMASK ;[8] [7] [8] only keep D+ and D-
- cpi x1,0 ;[9] [8] [9]
- brmi bit7 ;[10] [9] [10] finished unstuffing bit6 When x1<0
- breq bitloop ;[11] --- [11] finished unstuffing bit0-5 when x1=0
- nop ;--- --- [12]
- in x1, USBIN ;--- --- [0] sample line state for bit0
- andi x1, USBMASK ;--- --- [1] filter only D+ and D- bits
- rjmp handleBit ;--- --- [2] make bit0 14 cycles long
-
-;----------------------------------------------------------------------------
-; Receiver loop (numbers in brackets are cycles within byte after instr)
-;----------------------------------------------------------------------------
-bitloop:
- in x1, USBIN ;[0] sample line state
- andi x1, USBMASK ;[1] filter only D+ and D- bits
- breq se0 ;[2] both lines are low so handle se0
-handleBit:
- cpse x1, x2 ;[3] when previous line state equals current line state, handle "1"
- rjmp handle0 ;[4] when line state differs, handle "0"
- sec ;[5]
- ror shift ;[6] shift "1" into the data
- brcs b6checkUnstuff ;[7] When after shift C is set, next bit is bit7
- nop2 ;[8]
- dec bitcnt ;[10]
- brne bitloop ;[11]
- ldi x1,0 ;[12] indicate unstuff for bit other than bit6 or bit7
- in bitcnt, USBIN ;[0] sample stuff bit
- rjmp unstuff ;[1]
-
-handle0:
- mov x2, x1 ;[6] Set x2 to current line state
- ldi bitcnt, 6 ;[7] reset unstuff counter.
- lsr shift ;[8] shift "0" into the data
- brcs bit7 ;[9] When after shift C is set, next bit is bit7
- nop ;[10]
- rjmp bitloop ;[11]
-
-;----------------------------------------------------------------------------
-; End of receive loop. Now start handling EOP
-;----------------------------------------------------------------------------
-
-macro POP_STANDARD ; 14 cycles
- pop cnt
- pop x4
- pop x3
- pop x2
- pop x1
- pop shift
- pop bitcnt
- endm
-macro POP_RETI ; 7 cycles
- pop YH
- pop YL
- out SREG, YL
- pop YL
- endm
-
-
-
-#include "asmcommon.inc"
-
-; USB spec says:
-; idle = J
-; J = (D+ = 0), (D- = 1)
-; K = (D+ = 1), (D- = 0)
-; Spec allows 7.5 bit times from EOP to SOP for replies
-; 7.5 bit times is 100 cycles. This implementation arrives a bit later at se0
-; then specified in the include file but there is plenty of time
-
-bitstuffN:
- eor x1, x4 ;[8]
- ldi x2, 0 ;[9]
- nop2 ;[10]
- out USBOUT, x1 ;[12] <-- out
- rjmp didStuffN ;[0]
-
-bitstuff7:
- eor x1, x4 ;[6]
- ldi x2, 0 ;[7] Carry is zero due to brcc
- rol shift ;[8] compensate for ror shift at branch destination
- nop2 ;[9]
- rjmp didStuff7 ;[11]
-
-sendNakAndReti:
- ldi x3, USBPID_NAK ;[-18]
- rjmp sendX3AndReti ;[-17]
-sendAckAndReti:
- ldi cnt, USBPID_ACK ;[-17]
-sendCntAndReti:
- mov x3, cnt ;[-16]
-sendX3AndReti:
- ldi YL, 20 ;[-15] x3==r20 address is 20
- ldi YH, 0 ;[-14]
- ldi cnt, 2 ;[-13]
-; rjmp usbSendAndReti fallthrough
-
-;usbSend:
-;pointer to data in 'Y'
-;number of bytes in 'cnt' -- including sync byte [range 2 ... 12]
-;uses: x1...x4, btcnt, shift, cnt, Y
-;Numbers in brackets are time since first bit of sync pattern is sent
-;We don't match the transfer rate exactly (don't insert leap cycles every third
-;byte) because the spec demands only 1.5% precision anyway.
-usbSendAndReti: ; 12 cycles until SOP
- in x2, USBDDR ;[-12]
- ori x2, USBMASK ;[-11]
- sbi USBOUT, USBMINUS;[-10] prepare idle state; D+ and D- must have been 0 (no pullups)
- in x1, USBOUT ;[-8] port mirror for tx loop
- out USBDDR, x2 ;[-7] <- acquire bus
-; need not init x2 (bitstuff history) because sync starts with 0
- ldi x4, USBMASK ;[-6] exor mask
- ldi shift, 0x80 ;[-5] sync byte is first byte sent
-txByteLoop:
- ldi bitcnt, 0x49 ;[-4] [10] binary 01001001
-txBitLoop:
- sbrs shift, 0 ;[-3] [10] [11]
- eor x1, x4 ;[-2] [11] [12]
- out USBOUT, x1 ;[-1] [12] [13] <-- out N
- ror shift ;[0] [13] [14]
- ror x2 ;[1]
-didStuffN:
- nop2 ;[2]
- nop ;[4]
- cpi x2, 0xfc ;[5]
- brcc bitstuffN ;[6]
- lsr bitcnt ;[7]
- brcc txBitLoop ;[8]
- brne txBitLoop ;[9]
-
- sbrs shift, 0 ;[10]
- eor x1, x4 ;[11]
-didStuff7:
- out USBOUT, x1 ;[-1] [13] <-- out 7
- ror shift ;[0] [14]
- ror x2 ;[1]
- nop ;[2]
- cpi x2, 0xfc ;[3]
- brcc bitstuff7 ;[4]
- ld shift, y+ ;[5]
- dec cnt ;[7]
- brne txByteLoop ;[8]
-;make SE0:
- cbr x1, USBMASK ;[9] prepare SE0 [spec says EOP may be 25 to 30 cycles]
- lds x2, usbNewDeviceAddr;[10]
- lsl x2 ;[12] we compare with left shifted address
- out USBOUT, x1 ;[13] <-- out SE0 -- from now 2 bits = 22 cycles until bus idle
- subi YL, 20 + 2 ;[0] Only assign address on data packets, not ACK/NAK in x3
- sbci YH, 0 ;[1]
-;2006-03-06: moved transfer of new address to usbDeviceAddr from C-Code to asm:
-;set address only after data packet was sent, not after handshake
- breq skipAddrAssign ;[2]
- sts usbDeviceAddr, x2; if not skipped: SE0 is one cycle longer
-skipAddrAssign:
-;end of usbDeviceAddress transfer
- ldi x2, 1<<USB_INTR_PENDING_BIT;[4] int0 occurred during TX -- clear pending flag
- USB_STORE_PENDING(x2) ;[5]
- ori x1, USBIDLE ;[6]
- in x2, USBDDR ;[7]
- cbr x2, USBMASK ;[8] set both pins to input
- mov x3, x1 ;[9]
- cbr x3, USBMASK ;[10] configure no pullup on both pins
- ldi x4, 5 ;[11]
-se0Delay:
- dec x4 ;[12] [15] [18] [21] [24]
- brne se0Delay ;[13] [16] [19] [22] [25]
- out USBOUT, x1 ;[26] <-- out J (idle) -- end of SE0 (EOP signal)
- out USBDDR, x2 ;[27] <-- release bus now
- out USBOUT, x3 ;[28] <-- ensure no pull-up resistors are active
- rjmp doReturn
diff --git a/tmk_core/protocol/vusb/usbdrv/usbportability.h b/tmk_core/protocol/vusb/usbdrv/usbportability.h
deleted file mode 100644
index 206041097d..0000000000
--- a/tmk_core/protocol/vusb/usbdrv/usbportability.h
+++ /dev/null
@@ -1,146 +0,0 @@
-/* Name: usbportability.h
- * Project: V-USB, virtual USB port for Atmel's(r) AVR(r) microcontrollers
- * Author: Christian Starkjohann
- * Creation Date: 2008-06-17
- * Tabsize: 4
- * Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH
- * License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
- * This Revision: $Id: usbportability.h 785 2010-05-30 17:57:07Z cs $
- */
-
-// clang-format off
-
-/*
-General Description:
-This header is intended to contain all (or at least most of) the compiler
-and library dependent stuff. The C code is written for avr-gcc and avr-libc.
-The API of other development environments is converted to gcc's and avr-libc's
-API by means of defines.
-
-This header also contains all system includes since they depend on the
-development environment.
-
-Thanks to Oleg Semyonov for his help with the IAR tools port!
-*/
-
-#ifndef __usbportability_h_INCLUDED__
-#define __usbportability_h_INCLUDED__
-
-/* We check explicitly for IAR and CodeVision. Default is avr-gcc/avr-libc. */
-
-/* ------------------------------------------------------------------------- */
-#if defined __IAR_SYSTEMS_ICC__ || defined __IAR_SYSTEMS_ASM__ /* check for IAR */
-/* ------------------------------------------------------------------------- */
-
-#ifndef ENABLE_BIT_DEFINITIONS
-# define ENABLE_BIT_DEFINITIONS 1 /* Enable bit definitions */
-#endif
-
-/* Include IAR headers */
-#include <ioavr.h>
-#ifndef __IAR_SYSTEMS_ASM__
-# include <inavr.h>
-#endif
-
-#define __attribute__(arg) /* not supported on IAR */
-
-#ifdef __IAR_SYSTEMS_ASM__
-# define __ASSEMBLER__ /* IAR does not define standard macro for asm */
-#endif
-
-#ifdef __HAS_ELPM__
-# define PROGMEM __farflash
-#else
-# define PROGMEM __flash
-#endif
-
-#define USB_READ_FLASH(addr) (*(PROGMEM char *)(addr))
-
-/* The following definitions are not needed by the driver, but may be of some
- * help if you port a gcc based project to IAR.
- */
-#define cli() __disable_interrupt()
-#define sei() __enable_interrupt()
-#define wdt_reset() __watchdog_reset()
-#define _BV(x) (1 << (x))
-
-/* assembler compatibility macros */
-#define nop2 rjmp $+2 /* jump to next instruction */
-#define XL r26
-#define XH r27
-#define YL r28
-#define YH r29
-#define ZL r30
-#define ZH r31
-#define lo8(x) LOW(x)
-#define hi8(x) (((x)>>8) & 0xff) /* not HIGH to allow XLINK to make a proper range check */
-
-/* Depending on the device you use, you may get problems with the way usbdrv.h
- * handles the differences between devices. Since IAR does not use #defines
- * for MCU registers, we can't check for the existence of a particular
- * register with an #ifdef. If the autodetection mechanism fails, include
- * definitions for the required USB_INTR_* macros in your usbconfig.h. See
- * usbconfig-prototype.h and usbdrv.h for details.
- */
-
-/* ------------------------------------------------------------------------- */
-#elif __CODEVISIONAVR__ /* check for CodeVision AVR */
-/* ------------------------------------------------------------------------- */
-/* This port is not working (yet) */
-
-/* #define F_CPU _MCU_CLOCK_FREQUENCY_ seems to be defined automatically */
-
-#include <io.h>
-#include <delay.h>
-
-#define __attribute__(arg) /* not supported on IAR */
-
-#define PROGMEM __flash
-#define USB_READ_FLASH(addr) (*(PROGMEM char *)(addr))
-
-#ifndef __ASSEMBLER__
-static inline void cli(void)
-{
- #asm("cli");
-}
-static inline void sei(void)
-{
- #asm("sei");
-}
-#endif
-#define _delay_ms(t) delay_ms(t)
-#define _BV(x) (1 << (x))
-#define USB_CFG_USE_SWITCH_STATEMENT 1 /* macro for if() cascase fails for unknown reason */
-
-#define macro .macro
-#define endm .endmacro
-#define nop2 rjmp .+0 /* jump to next instruction */
-
-/* ------------------------------------------------------------------------- */
-#else /* default development environment is avr-gcc/avr-libc */
-/* ------------------------------------------------------------------------- */
-
-#include <avr/io.h>
-#ifdef __ASSEMBLER__
-# define _VECTOR(N) __vector_ ## N /* io.h does not define this for asm */
-#else
-# include <avr/pgmspace.h>
-#endif
-
-#if USB_CFG_DRIVER_FLASH_PAGE
-# define USB_READ_FLASH(addr) pgm_read_byte_far(((long)USB_CFG_DRIVER_FLASH_PAGE << 16) | (long)(addr))
-#else
-# define USB_READ_FLASH(addr) pgm_read_byte(addr)
-#endif
-
-#define macro .macro
-#define endm .endm
-#define nop2 rjmp .+0 /* jump to next instruction */
-
-#endif /* development environment */
-
-/* for conveniecne, ensure that PRG_RDB exists */
-#ifndef PRG_RDB
-# define PRG_RDB(addr) USB_READ_FLASH(addr)
-#endif
-#endif /* __usbportability_h_INCLUDED__ */
diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c
index c4baf5ab04..5feff889a1 100644
--- a/tmk_core/protocol/vusb/vusb.c
+++ b/tmk_core/protocol/vusb/vusb.c
@@ -15,25 +15,54 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <avr/eeprom.h>
#include <avr/wdt.h>
+#include <util/delay.h>
#include <stdint.h>
-#include "usbdrv.h"
+#include <usbdrv/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 <util/delay.h>
+#include "print.h"
+#include "debug.h"
+#include "usb_descriptor_common.h"
#ifdef RAW_ENABLE
# include "raw_hid.h"
#endif
-#if (defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)) && defined(RAW_ENABLE)
-# error "Enabling Mousekeys/Extrakeys and Raw HID at the same time is not currently supported on V-USB."
+#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;
@@ -120,7 +149,60 @@ void raw_hid_task(void) {
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
/*------------------------------------------------------------------*
@@ -208,12 +290,12 @@ usbMsgLen_t usbFunctionSetup(uchar data[8]) {
if (rq->bRequest == USBRQ_HID_GET_REPORT) {
debug("GET_REPORT:");
/* we only have one report type, so don't look at wValue */
- usbMsgPtr = (void *)&keyboard_report;
+ usbMsgPtr = (usbMsgPtr_t)&keyboard_report;
return sizeof(keyboard_report);
} else if (rq->bRequest == USBRQ_HID_GET_IDLE) {
debug("GET_IDLE: ");
// debug_hex(vusb_idle_rate);
- usbMsgPtr = &vusb_idle_rate;
+ usbMsgPtr = (usbMsgPtr_t)&vusb_idle_rate;
return 1;
} else if (rq->bRequest == USBRQ_HID_SET_IDLE) {
vusb_idle_rate = rq->wValue.bytes[1];
@@ -326,6 +408,29 @@ const PROGMEM uchar keyboard_hid_report[] = {
0xC0 // End Collection
};
+#ifdef RAW_ENABLE
+const PROGMEM uchar raw_hid_report[] = {
+ 0x06, RAW_USAGE_PAGE_LO, RAW_USAGE_PAGE_HI, // Usage Page (Vendor Defined)
+ 0x09, RAW_USAGE_ID, // 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
@@ -410,26 +515,26 @@ const PROGMEM uchar mouse_extra_hid_report[] = {
};
#endif
-#ifdef RAW_ENABLE
-const PROGMEM uchar raw_hid_report[] = {
- 0x06, 0x60, 0xFF, // Usage Page (Vendor Defined)
- 0x09, 0x61, // Usage (Vendor Defined)
+#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, 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)
+ 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, 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
+ 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
@@ -511,11 +616,7 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = {
.bDescriptorType = USBDESCR_CONFIG
},
.wTotalLength = sizeof(usbConfigurationDescriptor_t),
-# if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE) || defined(RAW_ENABLE)
- .bNumInterfaces = 2,
-# else
- .bNumInterfaces = 1,
-# endif
+ .bNumInterfaces = TOTAL_INTERFACES,
.bConfigurationValue = 0x01,
.iConfiguration = 0x00,
.bmAttributes = (1 << 7) | USBATTR_REMOTEWAKE,
@@ -530,7 +631,7 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = {
.bLength = sizeof(usbInterfaceDescriptor_t),
.bDescriptorType = USBDESCR_INTERFACE
},
- .bInterfaceNumber = 0,
+ .bInterfaceNumber = KEYBOARD_INTERFACE,
.bAlternateSetting = 0x00,
.bNumEndpoints = 1,
.bInterfaceClass = 0x03,
@@ -560,6 +661,55 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = {
.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
@@ -569,7 +719,7 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = {
.bLength = sizeof(usbInterfaceDescriptor_t),
.bDescriptorType = USBDESCR_INTERFACE
},
- .bInterfaceNumber = 1,
+ .bInterfaceNumber = MOUSE_EXTRA_INTERFACE,
.bAlternateSetting = 0x00,
.bNumEndpoints = 1,
.bInterfaceClass = 0x03,
@@ -597,14 +747,18 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = {
.bmAttributes = 0x03,
.wMaxPacketSize = 8,
.bInterval = USB_POLLING_INTERVAL_MS
- }
-# elif defined(RAW_ENABLE)
- .rawInterface = {
+ },
+# endif
+# if defined(CONSOLE_ENABLE)
+ /*
+ * Console
+ */
+ .consoleInterface = {
.header = {
.bLength = sizeof(usbInterfaceDescriptor_t),
.bDescriptorType = USBDESCR_INTERFACE
},
- .bInterfaceNumber = 1,
+ .bInterfaceNumber = CONSOLE_INTERFACE,
.bAlternateSetting = 0x00,
.bNumEndpoints = 2,
.bInterfaceClass = 0x03,
@@ -612,37 +766,37 @@ const PROGMEM usbConfigurationDescriptor_t usbConfigurationDescriptor = {
.bInterfaceProtocol = 0x00,
.iInterface = 0x00
},
- .rawHID = {
+ .consoleHID = {
.header = {
.bLength = sizeof(usbHIDDescriptor_t),
.bDescriptorType = USBDESCR_HID
},
- .bcdHID = 0x0101,
+ .bcdHID = 0x0111,
.bCountryCode = 0x00,
- .bNumDescriptors = 2,
+ .bNumDescriptors = 1,
.bDescriptorType = USBDESCR_HID_REPORT,
- .wDescriptorLength = sizeof(raw_hid_report)
+ .wDescriptorLength = sizeof(console_hid_report)
},
- .rawINEndpoint = {
+ .consoleINEndpoint = {
.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
+ .wMaxPacketSize = CONSOLE_EPSIZE,
+ .bInterval = 0x01
},
- .rawOUTEndpoint = {
+ .consoleOUTEndpoint = {
.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
- }
+ .wMaxPacketSize = CONSOLE_EPSIZE,
+ .bInterval = 0x01
+ },
# endif
};
@@ -661,47 +815,54 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) {
*/
switch (rq->wValue.bytes[1]) {
case USBDESCR_DEVICE:
- usbMsgPtr = (unsigned char *)&usbDeviceDescriptor;
+ usbMsgPtr = (usbMsgPtr_t)&usbDeviceDescriptor;
len = sizeof(usbDeviceDescriptor_t);
break;
case USBDESCR_CONFIG:
- usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor;
+ usbMsgPtr = (usbMsgPtr_t)&usbConfigurationDescriptor;
len = sizeof(usbConfigurationDescriptor_t);
break;
case USBDESCR_STRING:
switch (rq->wValue.bytes[0]) {
case 0:
- usbMsgPtr = (unsigned char *)&usbStringDescriptorZero;
+ usbMsgPtr = (usbMsgPtr_t)&usbStringDescriptorZero;
len = usbStringDescriptorZero.header.bLength;
break;
case 1: // iManufacturer
- usbMsgPtr = (unsigned char *)&usbStringDescriptorManufacturer;
+ usbMsgPtr = (usbMsgPtr_t)&usbStringDescriptorManufacturer;
len = usbStringDescriptorManufacturer.header.bLength;
break;
case 2: // iProduct
- usbMsgPtr = (unsigned char *)&usbStringDescriptorProduct;
+ usbMsgPtr = (usbMsgPtr_t)&usbStringDescriptorProduct;
len = usbStringDescriptorProduct.header.bLength;
break;
case 3: // iSerialNumber
- usbMsgPtr = (unsigned char *)&usbStringDescriptorSerial;
+ usbMsgPtr = (usbMsgPtr_t)&usbStringDescriptorSerial;
len = usbStringDescriptorSerial.header.bLength;
break;
}
break;
case USBDESCR_HID:
switch (rq->wValue.bytes[0]) {
- case 0:
- usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.keyboardHID;
+ case KEYBOARD_INTERFACE:
+ usbMsgPtr = (usbMsgPtr_t)&usbConfigurationDescriptor.keyboardHID;
len = sizeof(usbHIDDescriptor_t);
break;
+#if defined(RAW_ENABLE)
+ case RAW_INTERFACE:
+ usbMsgPtr = (usbMsgPtr_t)&usbConfigurationDescriptor.rawHID;
+ len = sizeof(usbHIDDescriptor_t);
+ break;
+#endif
#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
- case 1:
- usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.mouseExtraHID;
+ case MOUSE_EXTRA_INTERFACE:
+ usbMsgPtr = (usbMsgPtr_t)&usbConfigurationDescriptor.mouseExtraHID;
len = sizeof(usbHIDDescriptor_t);
break;
-#elif defined(RAW_ENABLE)
- case 1:
- usbMsgPtr = (unsigned char *)&usbConfigurationDescriptor.rawHID;
+#endif
+#if defined(CONSOLE_ENABLE)
+ case CONSOLE_INTERFACE:
+ usbMsgPtr = (usbMsgPtr_t)&usbConfigurationDescriptor.consoleHID;
len = sizeof(usbHIDDescriptor_t);
break;
#endif
@@ -710,19 +871,26 @@ USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(struct usbRequest *rq) {
case USBDESCR_HID_REPORT:
/* interface index */
switch (rq->wIndex.word) {
- case 0:
- usbMsgPtr = (unsigned char *)keyboard_hid_report;
+ case KEYBOARD_INTERFACE:
+ usbMsgPtr = (usbMsgPtr_t)keyboard_hid_report;
len = sizeof(keyboard_hid_report);
break;
+#if defined(RAW_ENABLE)
+ case RAW_INTERFACE:
+ usbMsgPtr = (usbMsgPtr_t)raw_hid_report;
+ len = sizeof(raw_hid_report);
+ break;
+#endif
#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
- case 1:
- usbMsgPtr = (unsigned char *)mouse_extra_hid_report;
+ case MOUSE_EXTRA_INTERFACE:
+ usbMsgPtr = (usbMsgPtr_t)mouse_extra_hid_report;
len = sizeof(mouse_extra_hid_report);
break;
-#elif defined(RAW_ENABLE)
- case 1:
- usbMsgPtr = (unsigned char *)raw_hid_report;
- len = sizeof(raw_hid_report);
+#endif
+#if defined(CONSOLE_ENABLE)
+ case CONSOLE_INTERFACE:
+ usbMsgPtr = (usbMsgPtr_t)console_hid_report;
+ len = sizeof(console_hid_report);
break;
#endif
}
diff --git a/tmk_core/protocol/vusb/vusb.h b/tmk_core/protocol/vusb/vusb.h
index e097323fd0..828960fc35 100644
--- a/tmk_core/protocol/vusb/vusb.h
+++ b/tmk_core/protocol/vusb/vusb.h
@@ -89,23 +89,28 @@ typedef struct usbConfigurationDescriptor {
usbHIDDescriptor_t keyboardHID;
usbEndpointDescriptor_t keyboardINEndpoint;
-#if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
- usbInterfaceDescriptor_t mouseExtraInterface;
- usbHIDDescriptor_t mouseExtraHID;
- usbEndpointDescriptor_t mouseExtraINEndpoint;
-#elif defined(RAW_ENABLE)
+#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);
-
-#ifdef RAW_ENABLE
-void raw_hid_task(void);
-#endif
diff --git a/tmk_core/ring_buffer.h b/tmk_core/ring_buffer.h
index 6bea3509b3..25fab638eb 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 <util/atomic.h>
+#include <stdint.h>
+#include <stdbool.h>
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 f45fd37929..9bb341ecb1 100644
--- a/tmk_core/rules.mk
+++ b/tmk_core/rules.mk
@@ -46,7 +46,7 @@ FORMAT = ihex
# Optimization level, can be [0, 1, 2, 3, s].
# 0 = turn off optimization. s = optimize for size.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
-OPT = s
+OPT ?= s
# Compiler flag to set the C Standard level.
# c89 = "ANSI" C
diff --git a/users/anderson/dmc12.c b/users/anderson/dmc12.c
new file mode 100644
index 0000000000..1dd89dce41
--- /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 0000000000..6b2bf94a51
--- /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 0000000000..ff50648599
--- /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 0000000000..2da4e76154
--- /dev/null
+++ b/users/anderson/seq.h
@@ -0,0 +1,14 @@
+#include "quantum.h"
+
+#include <string.h>
+
+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 0000000000..3af729563c
--- /dev/null
+++ b/users/anderson/smoothled.c
@@ -0,0 +1,34 @@
+#include <smoothled.h>
+
+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 0000000000..bf4f8c1770
--- /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/art/art.c b/users/art/art.c
new file mode 100644
index 0000000000..5596e237f8
--- /dev/null
+++ b/users/art/art.c
@@ -0,0 +1,464 @@
+#include "art.h"
+#include "string.h"
+
+__attribute__ ((weak))
+bool process_record_keymap(uint16_t keycode, keyrecord_t *record) {
+ return true;
+}
+
+__attribute__ ((weak))
+void led_show_current_os(void) {
+}
+
+static bool mac_ctrl_on = false; //for switching tabs
+static bool mac_gui_on = false; //for switching languages
+static bool mac_alt_tab_on = false; //for switching windows
+
+static const char *key_up[2] = {SS_UP(X_LALT), SS_UP(X_LCTL)};
+static const char *key_down[2] = {SS_DOWN(X_LALT), SS_DOWN(X_LCTL)};
+
+int char_to_del = 1;
+static bool sarcasm_on = false;
+static bool sarcasm_key = false;
+
+void backspace_n_times(int times) {
+ for (int i=0; i<times; i++) {
+ SEND_STRING(SS_TAP(X_BSPC));
+ }
+}
+
+void send_string_remembering_length(char *string) {
+ send_string(string);
+ char_to_del = strlen(string);
+}
+
+void send_shifted_strings(char *string1, char *string2) {
+ if ( get_mods() & MOD_MASK_SHIFT ) {
+ clear_mods();
+ send_string_remembering_length(string2);
+ } else {
+ send_string_remembering_length(string1);
+ }
+}
+
+void send_shifted_strings_add(char *string1, char *string2) {
+ bool shifted = get_mods() & MOD_MASK_SHIFT;
+ clear_mods();
+
+ send_string_remembering_length(string1);
+
+ if (shifted) {
+ send_string(string2);
+ char_to_del = strlen(string1) + strlen(string2);
+ }
+}
+
+bool is_mac_with_base_layer_off(void) {
+ return !is_win && !layer_state_is(BASE);
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (sarcasm_on) {
+ sarcasm_key = ! sarcasm_key;
+ if (sarcasm_key) {
+ SEND_STRING(SS_TAP(X_CAPS));
+ }
+ }
+
+ //Checking all other non-backspace keys to clear the backspace buffer. This is to prevent the bug of deleting N chars sometime after using a macro
+ if (record->event.pressed && (keycode != KC_BSPACE && keycode != XXXXXXX)) {
+ char_to_del = 1;
+ }
+
+ switch (keycode) {
+ case KC_TAB:
+ if (record->event.pressed && is_mac_with_base_layer_off()) {
+ uint8_t mods = get_mods();
+ uint8_t mod_state = mods & MOD_MASK_ALT;
+ if (get_mods() & mod_state) {
+ del_mods(mod_state);
+ add_mods(MOD_LCTL);
+ mac_alt_tab_on = true;
+ }
+
+ mod_state = mods & MOD_MASK_CTRL;
+ if (get_mods() & mod_state && !mac_alt_tab_on) {
+ del_mods(mod_state);
+ add_mods(MOD_LGUI);
+ mac_ctrl_on = true;
+ }
+ }
+ break;
+ case KC_LSFT:
+ if (record->event.pressed && is_mac_with_base_layer_off()) {
+ uint8_t mods = get_mods();
+ uint8_t mod_state = mods & MOD_MASK_AG;
+ if (get_mods() & mod_state) {
+ del_mods(mod_state);
+ add_mods(MOD_LGUI);
+ mac_gui_on = true;
+ SEND_STRING(SS_TAP(X_SPACE));
+ return false;
+ } else {
+ return true;
+ }
+ }
+ break;
+ case KC_LEFT:
+ case KC_RIGHT:
+ if (record->event.pressed && is_mac_with_base_layer_off()) {
+ /* && !mac_ctrl_on/!mac_alt_tab_on are required since setting the state while holding the key changes
+ the modifier from OS's perspective. As a result, just the pressed key cannot be the single source
+ of truth to determine which state we're in, and a separate bool is required */
+ uint8_t mods = get_mods();
+ uint8_t mod_state = mods & MOD_MASK_ALT;
+ //Allows Ctrl <-/-> on Mac if Ctrl Tab is already pressed
+ if (get_mods() & mod_state && mac_alt_tab_on && !mac_ctrl_on) {
+ del_mods(mod_state);
+ add_mods(MOD_LCTL);
+ }
+
+ mod_state = mods & MOD_MASK_CTRL;
+ if (get_mods() & mod_state && !mac_alt_tab_on) {
+ del_mods(mod_state);
+ add_mods(MOD_LALT);
+ mac_ctrl_on = true;
+ }
+ }
+ break;
+ case KC_DEL:
+ if (record->event.pressed && is_mac_with_base_layer_off()) {
+ uint8_t mod_state = get_mods() & MOD_MASK_CTRL;
+ if (get_mods() & mod_state) {
+ del_mods(mod_state);
+ add_mods(MOD_LALT);
+ mac_ctrl_on = true;
+ }
+ }
+ break;
+ case KC_LALT:
+ if (!record->event.pressed && is_mac_with_base_layer_off()) {
+ if (mac_alt_tab_on) {
+ unregister_mods(MOD_LCTL);
+ mac_alt_tab_on = false;
+ return false;
+ } else if (mac_gui_on) {
+ SEND_STRING(SS_UP(X_LGUI));
+ mac_gui_on = false;
+ return false;
+ }
+ }
+ break;
+ case KC_RALT:
+ if (!record->event.pressed && mac_alt_tab_on && is_mac_with_base_layer_off()) {
+ unregister_mods(MOD_LCTL);
+ mac_alt_tab_on = false;
+ return false;
+ }
+ break;
+ case KC_LCTL:
+ case KC_RCTL:
+ if (!record->event.pressed && mac_ctrl_on && is_mac_with_base_layer_off()) {
+ SEND_STRING(SS_UP(X_LGUI) SS_UP(X_LALT));
+ mac_ctrl_on = false;
+ return false;
+ }
+ break;
+
+ case KC_HOME:
+ if (record->event.pressed && is_mac_with_base_layer_off()) {
+ SEND_STRING(SS_LCTL(SS_TAP(X_LEFT)));
+ return false;
+ }
+ break;
+ case KC_END:
+ if (record->event.pressed && is_mac_with_base_layer_off()) {
+ SEND_STRING(SS_LCTL(SS_TAP(X_RIGHT)));
+ return false;
+ }
+ break;
+ case KC_BSPC:
+ if (record->event.pressed) {
+ if (char_to_del > 1) {
+ layer_off(GIT_C);
+ layer_off(GIT_S);
+ backspace_n_times(char_to_del);
+ char_to_del = 1;
+ return false;
+ }
+
+ if (is_mac_with_base_layer_off()) {
+ uint8_t mod_state = get_mods() & MOD_MASK_CTRL;
+ if (get_mods() & mod_state) {
+ del_mods(mod_state);
+ add_mods(MOD_LALT);
+ mac_ctrl_on = true;
+ }
+ }
+ }
+ break;
+
+ /* -------------------------------------------------------------------------
+ * CUSTOM MACROS
+ * ------------------------------------------------------------------------ */
+ case CTRL_CTV:
+ if (record->event.pressed) {
+ if ( get_mods() & MOD_MASK_SHIFT ) {
+ clear_mods();
+ SEND_STRING(SS_LCTL("ctv"));
+ } else {
+ SEND_STRING(SS_LCTL("ctv") SS_TAP(X_ENTER));
+ }
+ }
+ break;
+ case CTRL_LCTV:
+ if (record->event.pressed) {
+ if ( get_mods() & MOD_MASK_SHIFT ) {
+ //Firefox
+ clear_mods();
+ SEND_STRING(SS_LCTL("lcP"));
+ wait_ms(200);
+ SEND_STRING(SS_LCTL("v") SS_TAP(X_ENTER));
+ } else if ( get_mods() & MOD_MASK_CTRL ) {
+ //Chrome
+ clear_mods();
+ SEND_STRING(SS_LCTL("lcNv") SS_TAP(X_ENTER));
+ } else {
+ SEND_STRING(SS_LCTL("lctv"));
+ }
+ }
+ break;
+ case CTRL_CAV:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTL("c" SS_TAP(X_TAB)));
+ wait_ms(50);
+ SEND_STRING(SS_LCTL("av"));
+ }
+ break;
+ case SARCASM:
+ if (record->event.pressed) {
+ sarcasm_on = !sarcasm_on;
+ }
+ break;
+
+ /* -------------------------------------------------------------------------
+ * OS TOGGLING
+ * ------------------------------------------------------------------------ */
+ case TOG_OS:
+ if (record->event.pressed) {
+ is_win = ! is_win;
+ led_show_current_os();
+ }
+ break;
+ case CTR_ALT:
+ if (record->event.pressed) {
+ send_string(key_down[is_win]);
+ } else {
+ send_string(key_up[is_win]);
+ }
+ break;
+ case OS_CTRL:
+ if (is_win) {
+ if (record->event.pressed) {
+ SEND_STRING(SS_DOWN(X_LCTL));
+ } else {
+ SEND_STRING(SS_UP(X_LCTL));
+ }
+ } else {
+ if (record->event.pressed) {
+ SEND_STRING(SS_DOWN(X_LGUI));
+ } else {
+ SEND_STRING(SS_UP(X_LGUI));
+ }
+ }
+ break;
+ case OS_WIN:
+ if (is_win) {
+ if (record->event.pressed) {
+ SEND_STRING(SS_DOWN(X_LGUI));
+ } else {
+ SEND_STRING(SS_UP(X_LGUI));
+ }
+ } else {
+ if (record->event.pressed) {
+ SEND_STRING(SS_DOWN(X_LCTL));
+ } else {
+ SEND_STRING(SS_UP(X_LCTL));
+ }
+ }
+ break;
+
+ /* -------------------------------------------------------------------------
+ * STRING MACROS
+ * ------------------------------------------------------------------------ */
+ // case :
+ // if (record->event.pressed) {
+ // send_string_remembering_length("");
+ // }
+ // break;
+ // case :
+ // if (record->event.pressed) {
+ // send_string_remembering_length("", "");
+ // }
+ // break;
+ case TILD_BLOCK:
+ if (record->event.pressed) {
+ SEND_STRING("```" SS_LSFT(SS_TAP(X_ENTER) SS_TAP(X_ENTER)) "```" SS_TAP(X_UP));
+ char_to_del = 4;
+ }
+ break;
+ case ADMINS:
+ if (record->event.pressed) {
+ send_shifted_strings_add("admin", "/aurora/status");
+ }
+ break;
+ case PRESCRIPTION:
+ if (record->event.pressed) {
+ SEND_STRING("55\t12122019\t");
+ char_to_del = 8;
+ }
+ break;
+ case FOURS:
+ if (record->event.pressed) {
+ SEND_STRING("4444333322221111\t1\t12\t21\t123\n");
+ char_to_del = 16;
+ }
+ break;
+
+ case G_ADD:
+ if (record->event.pressed) {
+ send_string_remembering_length("git add ");
+ }
+ break;
+ case G_BRCH:
+ if (record->event.pressed) {
+ send_shifted_strings_add("git branch ", "-d ");
+ }
+ break;
+ case G_C:
+ if (record->event.pressed) {
+ send_string_remembering_length("git c[Heckout/Ommit]");
+ layer_on(GIT_C);
+ }
+ break;
+ case G_CHEC:
+ if (!record->event.pressed) {
+ bool shifted = get_mods() & MOD_MASK_SHIFT;
+ clear_mods();
+
+ backspace_n_times(15);
+ SEND_STRING("heckout ");
+ char_to_del = 13;
+ if (shifted) {
+ SEND_STRING("-b ");
+ char_to_del = 16;
+ }
+ layer_off(GIT_C);
+ }
+ break;
+ case G_COMM:
+ if (!record->event.pressed) {
+ bool shifted = get_mods() & MOD_MASK_SHIFT;
+ clear_mods();
+
+ backspace_n_times(15);
+ SEND_STRING("ommit -");
+ char_to_del = 15;
+ if (shifted) {
+ SEND_STRING("a");
+ char_to_del = 16;
+ }
+ SEND_STRING("m \"\"" SS_TAP(X_LEFT));
+ layer_off(GIT_C);
+ }
+ break;
+ case G_DEV:
+ if (record->event.pressed) {
+ send_shifted_strings("develop", "master");
+ }
+ break;
+ case G_DIFF:
+ if (record->event.pressed) {
+ send_string_remembering_length("git diff ");
+ }
+ break;
+ case G_FTCH:
+ if (record->event.pressed) {
+ send_string_remembering_length("git fetch ");
+ }
+ break;
+ case G_LOG:
+ if (record->event.pressed) {
+ send_string_remembering_length("git log ");
+ }
+ break;
+ case G_MERG:
+ if (record->event.pressed) {
+ send_string_remembering_length("git merge ");
+ }
+ break;
+ case G_P:
+ if (record->event.pressed) {
+ send_shifted_strings_add("git pu", "sh -u ");
+ }
+ break;
+ case G_RST:
+ if (record->event.pressed) {
+ send_string_remembering_length("git reset ");
+ }
+ break;
+ case G_S:
+ if (!record->event.pressed) {
+ send_string_remembering_length("git s[taSh/How/taTus]");
+ layer_on(GIT_S);
+ }
+ break;
+ case G_SHOW:
+ if (!record->event.pressed) {
+ backspace_n_times(16);
+ SEND_STRING("how ");
+ char_to_del = 9;
+ layer_off(GIT_S);
+ }
+ break;
+ case G_STSH:
+ if (!record->event.pressed) {
+ bool shifted = get_mods() & MOD_MASK_SHIFT;
+ clear_mods();
+
+ backspace_n_times(16);
+ SEND_STRING("tash ");
+ char_to_del = 10;
+
+ if (shifted) {
+ clear_mods();
+ SEND_STRING("apply ");
+
+ char_to_del = 16;
+ }
+
+ layer_off(GIT_S);
+ }
+ break;
+ case G_STAT:
+ if (!record->event.pressed) {
+ backspace_n_times(16);
+ SEND_STRING("tatus ");
+ char_to_del = 11;
+ layer_off(GIT_S);
+ }
+ break;
+
+ case CTL_ALT_START ... CTL_ALT_END:
+ if (record->event.pressed) {
+ if (is_win) {
+ tap_code16(LCTL(keycode - CTL_ALT_START));
+ } else {
+ tap_code16(LALT(keycode - CTL_ALT_START));
+ }
+ }
+ break;
+ }
+
+ return process_record_keymap(keycode, record);
+}
diff --git a/users/art/art.h b/users/art/art.h
new file mode 100644
index 0000000000..58b005b933
--- /dev/null
+++ b/users/art/art.h
@@ -0,0 +1,69 @@
+#pragma once
+#include QMK_KEYBOARD_H
+
+#define CTL_ALT(kc) (CTL_ALT_START + ((kc) & 0xff))
+
+extern bool is_win;
+
+enum layer_names {
+ QWERTY,
+ WORKMAN,
+ BASE, //only specific for split75
+#if defined(KEYBOARD_wheatfield_split75)
+ QWERTY_MOD,
+ LAYOUT_CHG,
+#elif defined(KEYBOARD_ergodone)
+ FKEYS,
+ CTRL_NAV,
+ SHIFT_NAV,
+#endif
+
+ MEDIA,
+ COMBOS,
+ STRINGS,
+ CONFIG,
+ NAV,
+ NUMPAD,
+ GIT,
+ GIT_C,
+ GIT_S
+};
+
+enum custom_keycodes_art {
+ CTRL_CTV = SAFE_RANGE,
+ CTRL_LCTV,
+ CTRL_CAV,
+ SARCASM,
+
+ TOG_OS,
+ CTR_ALT,
+ OS_CTRL,
+ OS_WIN,
+
+ TILD_BLOCK,
+ ADMINS,
+ PRESCRIPTION,
+ FOURS,
+
+ G_ADD,
+ G_BRCH,
+ G_C,
+ G_CHEC,
+ G_COMM,
+ G_DEV,
+ G_DIFF,
+ G_FTCH,
+ G_LOG,
+ G_MERG,
+ G_P,
+ G_RST,
+ G_S,
+ G_STAT,
+ G_STSH,
+ G_SHOW,
+
+ CTL_ALT_START,
+ CTL_ALT_END = CTL_ALT_START + 0xff,
+
+ NEW_SAFE_RANGE //for keymap specific codes
+};
diff --git a/users/art/config.h b/users/art/config.h
new file mode 100644
index 0000000000..72419ff376
--- /dev/null
+++ b/users/art/config.h
@@ -0,0 +1,4 @@
+#pragma once
+
+#undef TAPPING_TOGGLE
+#define TAPPING_TOGGLE 2
diff --git a/users/art/rules.mk b/users/art/rules.mk
new file mode 100644
index 0000000000..2b701eb949
--- /dev/null
+++ b/users/art/rules.mk
@@ -0,0 +1 @@
+SRC += art.c \ No newline at end of file
diff --git a/users/ericgebhart/ericgebhart.c b/users/ericgebhart/ericgebhart.c
index 76143c6ed1..abb87899b7 100644
--- a/users/ericgebhart/ericgebhart.c
+++ b/users/ericgebhart/ericgebhart.c
@@ -61,11 +61,6 @@ uint32_t layer_state_set_keymap (uint32_t state) {
__attribute__ ((weak))
void led_set_keymap(uint8_t usb_led) {}
-// Runs just one time when the keyboard initializes.
-void matrix_init_user(void) {
- //ACTION_DEFAULT_LAYER_SET(DVORAK) ;
-}
-
// check default layerstate to see which layer we are on.
// if (biton32(layer_state) == _DIABLO) { --- current layer
// if (biton32(default_layer_state) == _DIABLO) { --- current default layer
diff --git a/users/konstantin/config.h b/users/konstantin/config.h
index dcea9be279..2629cdd570 100644
--- a/users/konstantin/config.h
+++ b/users/konstantin/config.h
@@ -1,7 +1,10 @@
#pragma once
+// Keyboard reports
#define FORCE_NKRO
+#define USB_POLLING_INTERVAL_MS 1
+// Mouse keys
#define MOUSEKEY_DELAY 0
#define MOUSEKEY_INTERVAL 10
#define MOUSEKEY_MAX_SPEED 4
@@ -11,22 +14,25 @@
#define MOUSEKEY_WHEEL_MAX_SPEED 4
#define MOUSEKEY_WHEEL_TIME_TO_MAX 50
-#define NO_ACTION_FUNCTION
-#define NO_ACTION_MACRO
-#define NO_ACTION_ONESHOT
-
+// RGB lighting
#undef RGBLIGHT_ANIMATIONS
#define RGBLIGHT_EFFECT_BREATHING
#define RGBLIGHT_EFFECT_RAINBOW_MOOD
#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
#define RGBLIGHT_EFFECT_SNAKE
+// Tapping
#define PERMISSIVE_HOLD
#define TAPPING_TERM 200
#define TAPPING_TOGGLE 3
+// Unicode
#define UNICODE_CYCLE_PERSIST false
#define UNICODE_SELECTED_MODES UC_WINC, UC_WIN, UC_LNX
#define UNICODE_KEY_WINC KC_RGUI
-#define USB_POLLING_INTERVAL_MS 1
+// Firmware size reduction
+#undef LOCKING_SUPPORT_ENABLE
+#define NO_ACTION_FUNCTION
+#define NO_ACTION_MACRO
+#define NO_ACTION_ONESHOT
diff --git a/users/konstantin/konstantin.h b/users/konstantin/konstantin.h
index 0936e3c3ea..72a1616238 100644
--- a/users/konstantin/konstantin.h
+++ b/users/konstantin/konstantin.h
@@ -76,7 +76,7 @@ enum layers_user {
L_NUMPAD,
#endif
- L_RANGE_KEYMAP,
+ LAYERS_KEYMAP,
};
void keyboard_pre_init_keymap(void);
diff --git a/users/konstantin/rules.mk b/users/konstantin/rules.mk
index d989f486c5..6fe3a8ad83 100644
--- a/users/konstantin/rules.mk
+++ b/users/konstantin/rules.mk
@@ -13,4 +13,6 @@ ifneq (,$(filter yes,$(UNICODE_ENABLE) $(UNICODEMAP_ENABLE)))
SRC += unicode.c
endif
-LTO_ENABLE = yes
+ifneq ($(PLATFORM),CHIBIOS)
+ LTO_ENABLE = yes
+endif
diff --git a/users/miles2go/babblePaste.c b/users/miles2go/babblePaste.c
new file mode 100644
index 0000000000..2a32024cd2
--- /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 0000000000..606640227c
--- /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 0000000000..cc1c31bd0d
--- /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 0000000000..a0c461f24e
--- /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 0000000000..201da0d1a3
--- /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 0000000000..aa822d9ba1
--- /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 0000000000..9f769c582d
--- /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 0000000000..8887d523bb
--- /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 0000000000..7eebc0b208
--- /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 0000000000..e9d8c23dac
--- /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 0000000000..3fb52b8a59
--- /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 0000000000..bedc08fc02
--- /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 0000000000..d36bf25b2c
--- /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 <print.h>
+#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 0000000000..a720d81c18
--- /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 0000000000..7eb39e1082
--- /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 0000000000..f1da2f4d7a
--- /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 <print.h>
+
+__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 0000000000..dfb344212e
--- /dev/null
+++ b/users/miles2go/milestogo.h
@@ -0,0 +1,289 @@
+/* Modified from
+Copyright 2017 Christopher Courtney <drashna@live.com> @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 <http://www.gnu.org/licenses/>.
+*/
+
+
+#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 0000000000..b55f51b15f
--- /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 0000000000..7fb7719527
--- /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/ninjonas/ninjonas.c b/users/ninjonas/ninjonas.c
index 7e5afcec87..d66a5b008c 100644
--- a/users/ninjonas/ninjonas.c
+++ b/users/ninjonas/ninjonas.c
@@ -36,4 +36,4 @@ void keyboard_post_init_user() {
}
#endif
layer_state_set_user(layer_state);
-} \ No newline at end of file
+}
diff --git a/users/ridingqwerty/ridingqwerty.c b/users/ridingqwerty/ridingqwerty.c
index ee6e7e897a..19b417a80f 100644
--- a/users/ridingqwerty/ridingqwerty.c
+++ b/users/ridingqwerty/ridingqwerty.c
@@ -45,7 +45,7 @@ layer_state_t layer_state_set_user(layer_state_t state) {
return state;
}
-uint16_t get_tapping_term(uint16_t keycode) {
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case RC(ENT):
case ED(ESC):
diff --git a/users/rossman360/rossman360.c b/users/rossman360/rossman360.c
index a1c4ad8f9f..dc7d766390 100644
--- a/users/rossman360/rossman360.c
+++ b/users/rossman360/rossman360.c
@@ -75,6 +75,11 @@ switch (keycode) {
SEND_STRING(SS_TAP(X_LEFT) SS_TAP(X_LEFT) SS_LCTRL(SS_TAP(X_LEFT)) SS_TAP(X_DELETE));
}
break;
+ case EMDASH:
+ if (record->event.pressed) {
+ SEND_STRING(SS_LCTRL(SS_LSFT(SS_TAP(X_U))) SS_TAP(X_2) SS_TAP(X_0) SS_TAP(X_1) SS_TAP(X_4) SS_TAP(X_SPACE) SS_TAP(X_SPACE));
+ }
+ break;
};
return true;
};
diff --git a/users/rossman360/rossman360.h b/users/rossman360/rossman360.h
index 57f6234fa4..994916b541 100644
--- a/users/rossman360/rossman360.h
+++ b/users/rossman360/rossman360.h
@@ -19,6 +19,7 @@
#define CTRLSP MT(MOD_LCTL, KC_SPACE)
#define RVOLU LCTL(KC_RBRC)
#define RVOLD LCTL(KC_LBRC)
+#define QUIT LCTL(KC_Q)
// Define all of
enum custom_keycodes {
@@ -32,4 +33,5 @@ enum custom_keycodes {
WREFRESH,
PMERGE,
REMCAPS,
+ EMDASH
};
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 0000000000..4f39b7631c
--- /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/stanrc85/stanrc85.c b/users/stanrc85/stanrc85.c
index 6ea0e33bc1..c1aaad1a1a 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 ceb7167e10..0007e0898c 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/tominabox1/tominabox1.c b/users/tominabox1/tominabox1.c
index 95e6ee7803..d2e9e12581 100644
--- a/users/tominabox1/tominabox1.c
+++ b/users/tominabox1/tominabox1.c
@@ -106,7 +106,7 @@ qk_tap_dance_action_t tap_dance_actions[] = {
#endif // CRKBD
-uint16_t get_tapping_term(uint16_t keycode) {
+uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case LSFT_T(KC_CAPS):
return 250;
diff --git a/users/vosechu/vosechu.h b/users/vosechu/vosechu.h
index 5cd2217ea1..3e65f8c955 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 4b05ea4ec4..e000b97acd 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 d4b7084186..63e73c32e6 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 ca2376145d..b6a4e5cfa1 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/util/bootloader_at90usb128x_1_0_1.hex b/util/bootloader_at90usb128_1.0.1.hex
index 90491a82a6..90491a82a6 100644
--- a/util/bootloader_at90usb128x_1_0_1.hex
+++ b/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 0000000000..69dd45bbd6
--- /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 0000000000..698fe002c5
--- /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 8b4cd39152..0000000000
--- 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 b35a310d55..0000000000
--- 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
index 20174989ae..20174989ae 100644
--- a/util/bootloader_atmega32u4_1_0_0.hex
+++ b/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 0000000000..0e4c872bbf
--- /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/freebsd_install.sh b/util/freebsd_install.sh
index 8157592031..09669024cc 100755
--- a/util/freebsd_install.sh
+++ b/util/freebsd_install.sh
@@ -1,7 +1,5 @@
#!/bin/sh
-util_dir=$(dirname "$0")
-pkg update
-pkg install -y \
+packages=$(cat <<EOF
git \
wget \
gmake \
@@ -13,9 +11,29 @@ pkg install -y \
avr-libc \
dfu-programmer \
dfu-util \
+ avrdude \
arm-none-eabi-gcc \
arm-none-eabi-binutils \
arm-none-eabi-newlib \
diffutils \
python3
-pip3 install -r ${util_dir}/../requirements.txt
+EOF
+)
+util_dir=$(dirname "$0")
+if [ $(id -u) = 0 ]; then
+ pkg update
+ pkg install -y ${packages}
+ echo ""
+ echo "Re-run the setup as your normal user to install the qmk python dependencies"
+ exit 1
+else
+ if command -v sudo > /dev/null 2>&1; then
+ sudo pkg update
+ sudp pkg install -y ${packages}
+ else
+ echo "Make sure you run setup as root first to install base OS dependencies..."
+ echo ""
+ fi
+
+ python3 -m pip install --user -r ${util_dir}/../requirements.txt
+fi
diff --git a/util/linux_install.sh b/util/linux_install.sh
index d30f786558..43044f85cb 100755
--- a/util/linux_install.sh
+++ b/util/linux_install.sh
@@ -208,19 +208,13 @@ elif grep ID /etc/os-release | grep -q solus; then
printf "\n$SOLUS_INFO\n"
elif grep ID /etc/os-release | grep -q void; then
- # musl Void systems don't have glibc cross compilers avaliable in their repos.
- # glibc Void systems do have musl cross compilers though, for some reason.
- # So, default to musl, and switch to glibc if it is installed.
- CROSS_ARM=cross-arm-linux-musleabi
- if xbps-query glibc > /dev/null; then # Check is glibc if installed
- CROSS_ARM=cross-arm-linux-gnueabi
- fi
-
sudo xbps-install \
avr-binutils \
avr-gcc \
avr-libc \
- $CROSS_ARM \
+ cross-arm-none-eabi-binutils \
+ cross-arm-none-eabi-gcc \
+ cross-arm-none-eabi-newlib \
avrdude \
dfu-programmer \
dfu-util \
diff --git a/util/macos_install.sh b/util/macos_install.sh
index a4037cce9e..9c19aeac2d 100755
--- a/util/macos_install.sh
+++ b/util/macos_install.sh
@@ -21,11 +21,10 @@ if ! brew --version >/dev/null 2>&1; then
done
fi
-brew tap osx-cross/avr
-brew tap osx-cross/arm
+# All macOS dependencies are managed in the homebrew package:
+# https://github.com/qmk/homebrew-qmk
brew update
-brew install avr-gcc@8 arm-gcc-bin@8 dfu-programmer avrdude clang-format dfu-util python3
-brew install --HEAD https://raw.githubusercontent.com/robertgzr/homebrew-tap/master/bootloadhid.rb
+brew install qmk/qmk/qmk
brew link --force avr-gcc@8
brew link --force arm-gcc-bin@8
diff --git a/util/msys2_install.sh b/util/msys2_install.sh
index 55df9c007b..41200dc786 100755
--- a/util/msys2_install.sh
+++ b/util/msys2_install.sh
@@ -19,7 +19,11 @@ function install_avr {
mv avr-gcc-8.3.0-x86-mingw avr8-gnu-toolchain
rm avr8-gnu-toolchain/bin/make.exe
rm avr-gcc-8.3.0-x86-mingw.zip
- pacman --needed --disable-download-timeout -S mingw-w64-x86_64-avrdude
+
+ # FIXME: As of 2020-05-19, the MSYS2 avrdude cannot flash USBaspLoader devices, for some reason
+ # (warning: cannot set sck period)
+ # However, the avr-gcc toolchain above contains an avrdude which can, so let's just not install this for now
+ #pacman --needed --disable-download-timeout -S mingw-w64-x86_64-avrdude
}
function install_arm {