summaryrefslogtreecommitdiffstats
path: root/keyboards/handwired
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/handwired')
-rw-r--r--keyboards/handwired/108key_trackpoint/108key_trackpoint.c1
-rw-r--r--keyboards/handwired/108key_trackpoint/108key_trackpoint.h23
-rw-r--r--keyboards/handwired/108key_trackpoint/config.h73
-rw-r--r--keyboards/handwired/108key_trackpoint/info.json125
-rw-r--r--keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c14
-rw-r--r--keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c14
-rw-r--r--keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c14
-rw-r--r--keyboards/handwired/108key_trackpoint/readme.md23
-rw-r--r--keyboards/handwired/108key_trackpoint/rules.mk82
-rw-r--r--keyboards/handwired/CMD60/README.md35
-rw-r--r--keyboards/handwired/CMD60/keymaps/default/keymap.c66
-rw-r--r--keyboards/handwired/MS_sculpt_mobile/MS_sculpt_mobile.c1
-rw-r--r--keyboards/handwired/MS_sculpt_mobile/keymaps/default/config.h8
-rw-r--r--keyboards/handwired/MS_sculpt_mobile/keymaps/default/readme.md1
-rw-r--r--keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/readme.md1
-rw-r--r--keyboards/handwired/MS_sculpt_mobile/readme.md58
-rw-r--r--keyboards/handwired/arrow_pad/arrow_pad.h30
-rw-r--r--keyboards/handwired/arrow_pad/info.json62
-rw-r--r--keyboards/handwired/arrow_pad/keymaps/default/keymap.c146
-rw-r--r--keyboards/handwired/arrow_pad/keymaps/pad_21/keymap.c165
-rw-r--r--keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk2
-rw-r--r--keyboards/handwired/arrow_pad/keymaps/pad_24/keymap.c146
-rw-r--r--keyboards/handwired/arrow_pad/keymaps/pad_24/rules.mk2
-rw-r--r--keyboards/handwired/arrow_pad/readme.md12
-rw-r--r--keyboards/handwired/atreus50/atreus50.h4
-rw-r--r--keyboards/handwired/atreus50/info.json70
-rw-r--r--keyboards/handwired/atreus50/keymaps/ajp10304/config.h2
-rw-r--r--keyboards/handwired/atreus50/keymaps/ajp10304/keymap.c34
-rw-r--r--keyboards/handwired/atreus50/keymaps/default/keymap.c109
-rw-r--r--keyboards/handwired/atreus50/readme.md18
-rw-r--r--keyboards/handwired/atreus50/rules.mk2
-rw-r--r--keyboards/handwired/bluepill/bluepill.c1
-rw-r--r--keyboards/handwired/bluepill/bluepill.h54
-rw-r--r--keyboards/handwired/bluepill/bluepill70/bluepill70.c1
-rw-r--r--keyboards/handwired/bluepill/bluepill70/bluepill70.h4
-rw-r--r--keyboards/handwired/bluepill/bluepill70/bootloader_defs.h10
-rw-r--r--keyboards/handwired/bluepill/bluepill70/chconf.h524
-rw-r--r--keyboards/handwired/bluepill/bluepill70/config.h25
-rw-r--r--keyboards/handwired/bluepill/bluepill70/flash.sh2
-rw-r--r--keyboards/handwired/bluepill/bluepill70/halconf.h354
-rw-r--r--keyboards/handwired/bluepill/bluepill70/info.json187
-rw-r--r--keyboards/handwired/bluepill/bluepill70/led.c38
-rw-r--r--keyboards/handwired/bluepill/bluepill70/matrix.c225
-rw-r--r--keyboards/handwired/bluepill/bluepill70/mcuconf.h209
-rw-r--r--keyboards/handwired/bluepill/bluepill70/rules.mk47
-rw-r--r--keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.c49
-rw-r--r--keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.h170
-rw-r--r--keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.mk5
-rw-r--r--keyboards/handwired/bluepill/config.h58
-rw-r--r--keyboards/handwired/bluepill/keymaps/default/keymap.c69
-rw-r--r--keyboards/handwired/bluepill/keymaps/iso/keymap.c69
-rw-r--r--keyboards/handwired/bluepill/ld/MKL26Z64.ld105
-rw-r--r--keyboards/handwired/bluepill/ld/STM32F103x8_stm32duino_bootloader.ld88
-rw-r--r--keyboards/handwired/bluepill/readme.md60
-rw-r--r--keyboards/handwired/bluepill/rules.mk10
-rw-r--r--keyboards/handwired/cmd60/cmd60.c (renamed from keyboards/handwired/CMD60/CMD60.c)2
-rw-r--r--keyboards/handwired/cmd60/cmd60.h (renamed from keyboards/handwired/CMD60/CMD60.h)18
-rw-r--r--keyboards/handwired/cmd60/config.h (renamed from keyboards/handwired/CMD60/config.h)0
-rw-r--r--keyboards/handwired/cmd60/info.json74
-rw-r--r--keyboards/handwired/cmd60/keymaps/default/keymap.c46
-rw-r--r--keyboards/handwired/cmd60/readme.md19
-rw-r--r--keyboards/handwired/cmd60/rules.mk (renamed from keyboards/handwired/CMD60/rules.mk)0
-rw-r--r--keyboards/handwired/dactyl/config.h2
-rw-r--r--keyboards/handwired/dactyl_manuform/4x5/info.json59
-rw-r--r--keyboards/handwired/dactyl_manuform/4x5/keymaps/default/config.h5
-rw-r--r--keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/config.h5
-rw-r--r--keyboards/handwired/dactyl_manuform/4x5/rules.mk3
-rw-r--r--keyboards/handwired/dactyl_manuform/4x6/4x6.c14
-rw-r--r--keyboards/handwired/dactyl_manuform/4x6/4x6.h36
-rw-r--r--keyboards/handwired/dactyl_manuform/4x6/config.h40
-rw-r--r--keyboards/handwired/dactyl_manuform/4x6/info.json65
-rw-r--r--keyboards/handwired/dactyl_manuform/4x6/keymaps/default/config.h31
-rw-r--r--keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c87
-rw-r--r--keyboards/handwired/dactyl_manuform/4x6/rules.mk20
-rw-r--r--keyboards/handwired/dactyl_manuform/5x6/info.json77
-rw-r--r--keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/config.h9
-rw-r--r--keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/keymap.c80
-rw-r--r--keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/rules.mk7
-rw-r--r--keyboards/handwired/dactyl_manuform/5x6/rules.mk3
-rw-r--r--keyboards/handwired/dactyl_manuform/5x7/info.json87
-rw-r--r--keyboards/handwired/dactyl_manuform/5x7/rules.mk2
-rw-r--r--keyboards/handwired/dactyl_manuform/6x6/info.json89
-rw-r--r--keyboards/handwired/dactyl_manuform/6x6/rules.mk3
-rw-r--r--keyboards/handwired/dactyl_manuform/config.h7
-rw-r--r--keyboards/handwired/dactyl_manuform/dactyl_manuform.h10
-rw-r--r--keyboards/handwired/dactyl_manuform/readme.md4
-rw-r--r--keyboards/handwired/dactyl_manuform/rules.mk2
-rw-r--r--keyboards/handwired/fivethirteen/README.md28
-rw-r--r--keyboards/handwired/fivethirteen/fivethirteen.h22
-rw-r--r--keyboards/handwired/fivethirteen/info.json77
-rw-r--r--keyboards/handwired/fivethirteen/keymaps/default/keymap.c21
-rw-r--r--keyboards/handwired/fivethirteen/readme.md12
-rw-r--r--keyboards/handwired/frenchdev/frenchdev.h2
-rw-r--r--keyboards/handwired/frenchdev/info.json114
-rw-r--r--keyboards/handwired/frenchdev/keymaps/default/keymap.c14
-rw-r--r--keyboards/handwired/frenchdev/readme.md16
-rw-r--r--keyboards/handwired/gamenum/gamenum.h18
-rw-r--r--keyboards/handwired/gamenum/info.json30
-rw-r--r--keyboards/handwired/gamenum/keymaps/default/keymap.c76
-rw-r--r--keyboards/handwired/gamenum/readme.md (renamed from keyboards/handwired/gamenum/README.md)73
-rw-r--r--keyboards/handwired/ibm122m/config.h190
-rw-r--r--keyboards/handwired/ibm122m/ibm122m.c43
-rw-r--r--keyboards/handwired/ibm122m/ibm122m.h41
-rw-r--r--keyboards/handwired/ibm122m/info.json136
-rw-r--r--keyboards/handwired/ibm122m/keymaps/default/config.h19
-rw-r--r--keyboards/handwired/ibm122m/keymaps/default/keymap.c46
-rw-r--r--keyboards/handwired/ibm122m/keymaps/default/readme.md2
-rw-r--r--keyboards/handwired/ibm122m/keymaps/lukaus/config.h19
-rw-r--r--keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c586
-rw-r--r--keyboards/handwired/ibm122m/keymaps/lukaus/readme.md2
-rw-r--r--keyboards/handwired/ibm122m/readme.md16
-rw-r--r--keyboards/handwired/ibm122m/rules.mk67
-rw-r--r--keyboards/handwired/jn68m/config.h54
-rw-r--r--keyboards/handwired/jn68m/info.json16
-rw-r--r--keyboards/handwired/jn68m/jn68m.c37
-rw-r--r--keyboards/handwired/jn68m/jn68m.h49
-rw-r--r--keyboards/handwired/jn68m/keymaps/default/config.h19
-rw-r--r--keyboards/handwired/jn68m/keymaps/default/keymap.c75
-rw-r--r--keyboards/handwired/jn68m/readme.md14
-rw-r--r--keyboards/handwired/jn68m/rules.mk81
-rw-r--r--keyboards/handwired/kbod/config.h9
-rw-r--r--keyboards/handwired/kbod/info.json74
-rw-r--r--keyboards/handwired/kbod/kbod.h2
-rw-r--r--keyboards/handwired/kbod/keymaps/default/config.h7
-rw-r--r--keyboards/handwired/kbod/keymaps/default/keymap.c54
-rw-r--r--keyboards/handwired/kbod/keymaps/default/rules.mk2
-rw-r--r--keyboards/handwired/kbod/readme.md23
-rw-r--r--keyboards/handwired/maartenwut/info.json80
-rw-r--r--keyboards/handwired/maartenwut/readme.md4
-rw-r--r--keyboards/handwired/minorca/info.json55
-rw-r--r--keyboards/handwired/minorca/keymaps/default/keymap.c53
-rw-r--r--keyboards/handwired/minorca/keymaps/default/rules.mk2
-rw-r--r--keyboards/handwired/minorca/keymaps/rgb/keymap.c75
-rw-r--r--keyboards/handwired/minorca/keymaps/rgb/rules.mk2
-rw-r--r--keyboards/handwired/minorca/minorca.h12
-rw-r--r--keyboards/handwired/minorca/readme.md36
-rw-r--r--keyboards/handwired/minorca/rules.mk2
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/babblePaste.c (renamed from keyboards/handwired/MS_sculpt_mobile/babblePaste.c)146
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/babblePaste.h (renamed from keyboards/handwired/MS_sculpt_mobile/babblePaste.h)34
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/babblePaste.txt (renamed from keyboards/handwired/MS_sculpt_mobile/babblePaste.txt)0
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/config.h (renamed from keyboards/handwired/MS_sculpt_mobile/config.h)8
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/info.json96
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/keymaps/default/config.h3
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/keymaps/default/keymap.c (renamed from keyboards/handwired/MS_sculpt_mobile/keymaps/default/keymap.c)46
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/keymaps/default/readme.md1
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/keymaps/default/rules.mk (renamed from keyboards/handwired/MS_sculpt_mobile/keymaps/default/rules.mk)2
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/config.h (renamed from keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/config.h)14
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/keymap.c (renamed from keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/keymap.c)20
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/readme.md1
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/rules.mk (renamed from keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk)2
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/ms_sculpt_mobile.c1
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/ms_sculpt_mobile.h (renamed from keyboards/handwired/MS_sculpt_mobile/MS_sculpt_mobile.h)4
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/readme.md55
-rw-r--r--keyboards/handwired/ms_sculpt_mobile/rules.mk (renamed from keyboards/handwired/MS_sculpt_mobile/rules.mk)0
-rw-r--r--keyboards/handwired/nicekey/keymaps/default/keymap.c2
-rw-r--r--keyboards/handwired/nicekey/nicekey.h13
-rw-r--r--keyboards/handwired/nicekey/readme.md4
-rw-r--r--keyboards/handwired/not_so_minidox/info.json63
-rw-r--r--keyboards/handwired/not_so_minidox/readme.md4
-rw-r--r--keyboards/handwired/not_so_minidox/rules.mk2
-rw-r--r--keyboards/handwired/numpad20/info.json33
-rw-r--r--keyboards/handwired/numpad20/keymaps/default/keymap.c19
-rw-r--r--keyboards/handwired/numpad20/numpad20.h12
-rw-r--r--keyboards/handwired/onekey/keymaps/default/keymap.c4
-rw-r--r--keyboards/handwired/onekey/onekey.h13
-rw-r--r--keyboards/handwired/onekey/readme.md2
-rw-r--r--keyboards/handwired/ortho5x13/info.json77
-rw-r--r--keyboards/handwired/ortho5x13/keymaps/default/keymap.c237
-rw-r--r--keyboards/handwired/ortho5x13/readme.md2
-rw-r--r--keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.c56
-rw-r--r--keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.h166
-rw-r--r--keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.mk5
-rw-r--r--keyboards/handwired/ortho60/bootloader_defs.h10
-rw-r--r--keyboards/handwired/ortho60/chconf.h524
-rw-r--r--keyboards/handwired/ortho60/config.h74
-rw-r--r--keyboards/handwired/ortho60/halconf.h353
-rw-r--r--keyboards/handwired/ortho60/hsv2rgb.c80
-rw-r--r--keyboards/handwired/ortho60/hsv2rgb.h23
-rw-r--r--keyboards/handwired/ortho60/info.json73
-rw-r--r--keyboards/handwired/ortho60/keymaps/default/keymap.c98
-rw-r--r--keyboards/handwired/ortho60/ld/MKL26Z64.ld105
-rw-r--r--keyboards/handwired/ortho60/ld/STM32F103x8_stm32duino_bootloader.ld88
-rw-r--r--keyboards/handwired/ortho60/led.c51
-rw-r--r--keyboards/handwired/ortho60/mcuconf.h209
-rw-r--r--keyboards/handwired/ortho60/ortho60.c32
-rw-r--r--keyboards/handwired/ortho60/ortho60.h33
-rw-r--r--keyboards/handwired/ortho60/readme.md3
-rw-r--r--keyboards/handwired/ortho60/rules.mk56
-rw-r--r--keyboards/handwired/ortho60/underglow.c157
-rw-r--r--keyboards/handwired/ortho60/underglow.h10
-rw-r--r--keyboards/handwired/pilcrow/info.json53
-rw-r--r--keyboards/handwired/pilcrow/keymaps/default/config.h7
-rw-r--r--keyboards/handwired/pilcrow/keymaps/default/keymap.c116
-rw-r--r--keyboards/handwired/pilcrow/keymaps/default/rules.mk2
-rw-r--r--keyboards/handwired/pilcrow/pilcrow.h2
-rw-r--r--keyboards/handwired/pilcrow/readme.md30
-rw-r--r--keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.c56
-rw-r--r--keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.h166
-rw-r--r--keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.mk5
-rw-r--r--keyboards/handwired/practice60/bootloader_defs.h10
-rw-r--r--keyboards/handwired/practice60/chconf.h524
-rw-r--r--keyboards/handwired/practice60/config.h74
-rw-r--r--keyboards/handwired/practice60/halconf.h353
-rw-r--r--keyboards/handwired/practice60/hsv2rgb.c80
-rw-r--r--keyboards/handwired/practice60/hsv2rgb.h23
-rw-r--r--keyboards/handwired/practice60/info.json74
-rw-r--r--keyboards/handwired/practice60/keymaps/default/keymap.c48
-rw-r--r--keyboards/handwired/practice60/ld/MKL26Z64.ld105
-rw-r--r--keyboards/handwired/practice60/ld/STM32F103x8_stm32duino_bootloader.ld88
-rw-r--r--keyboards/handwired/practice60/led.c51
-rw-r--r--keyboards/handwired/practice60/mcuconf.h209
-rw-r--r--keyboards/handwired/practice60/practice60.c32
-rw-r--r--keyboards/handwired/practice60/practice60.h17
-rw-r--r--keyboards/handwired/practice60/readme.md3
-rw-r--r--keyboards/handwired/practice60/rules.mk56
-rw-r--r--keyboards/handwired/practice60/underglow.c157
-rw-r--r--keyboards/handwired/practice60/underglow.h10
-rw-r--r--keyboards/handwired/prime_exl/config.h56
-rw-r--r--keyboards/handwired/prime_exl/info.json12
-rw-r--r--keyboards/handwired/prime_exl/keymaps/default/config.h19
-rw-r--r--keyboards/handwired/prime_exl/keymaps/default/keymap.c143
-rw-r--r--keyboards/handwired/prime_exl/keymaps/default/readme.md1
-rw-r--r--keyboards/handwired/prime_exl/prime_exl.c43
-rw-r--r--keyboards/handwired/prime_exl/prime_exl.h40
-rw-r--r--keyboards/handwired/prime_exl/readme.md15
-rw-r--r--keyboards/handwired/prime_exl/rules.mk80
-rw-r--r--keyboards/handwired/promethium/config.h27
-rw-r--r--keyboards/handwired/promethium/info.json68
-rw-r--r--keyboards/handwired/promethium/keymaps/default/config.h9
-rw-r--r--keyboards/handwired/promethium/keymaps/default/keymap.c30
-rw-r--r--keyboards/handwired/promethium/keymaps/default/rules.mk2
-rw-r--r--keyboards/handwired/promethium/keymaps/priyadi/config.h9
-rw-r--r--keyboards/handwired/promethium/keymaps/priyadi/keymap.c30
-rw-r--r--keyboards/handwired/promethium/keymaps/priyadi/rules.mk2
-rw-r--r--keyboards/handwired/promethium/promethium.h19
-rw-r--r--keyboards/handwired/promethium/rules.mk2
-rw-r--r--keyboards/handwired/pteron/config.h34
-rw-r--r--keyboards/handwired/pteron/info.json78
-rw-r--r--keyboards/handwired/pteron/keymaps/FSund/keymap.c118
-rw-r--r--keyboards/handwired/pteron/keymaps/default/keymap.c104
-rw-r--r--keyboards/handwired/pteron/pteron.c1
-rw-r--r--keyboards/handwired/pteron/pteron.h17
-rw-r--r--keyboards/handwired/pteron/readme.md15
-rw-r--r--keyboards/handwired/pteron/rules.mk58
-rw-r--r--keyboards/handwired/qc60/config.h3
-rw-r--r--keyboards/handwired/qc60/proto/config.h2
-rw-r--r--keyboards/handwired/qc60/rules.mk2
-rwxr-xr-xkeyboards/handwired/reddot/keymaps/default/keymap.c4
-rw-r--r--keyboards/handwired/space_oddity/config.h4
-rw-r--r--keyboards/handwired/terminus_mini/keymaps/default/rules.mk2
-rw-r--r--keyboards/handwired/terminus_mini/rules.mk2
-rw-r--r--keyboards/handwired/tradestation/config.h52
-rw-r--r--keyboards/handwired/tradestation/info.json15
-rw-r--r--keyboards/handwired/tradestation/keymaps/default/keymap.c61
-rw-r--r--keyboards/handwired/tradestation/license201
-rw-r--r--keyboards/handwired/tradestation/readme.md25
-rw-r--r--keyboards/handwired/tradestation/rules.mk65
-rw-r--r--keyboards/handwired/tradestation/tradestation.c1
-rw-r--r--keyboards/handwired/tradestation/tradestation.h27
-rw-r--r--keyboards/handwired/woodpad/keymaps/default/rules.mk2
-rw-r--r--keyboards/handwired/woodpad/keymaps/drashna/keymap.c2
-rw-r--r--keyboards/handwired/xeal60/config.h24
-rw-r--r--keyboards/handwired/xeal60/info.json12
-rw-r--r--keyboards/handwired/xeal60/keymaps/default/config.h37
-rw-r--r--keyboards/handwired/xeal60/keymaps/default/keymap.c129
-rw-r--r--keyboards/handwired/xeal60/keymaps/default/rules.mk3
-rw-r--r--keyboards/handwired/xeal60/lets_split.c1
-rw-r--r--keyboards/handwired/xeal60/lets_split.h28
-rw-r--r--keyboards/handwired/xeal60/matrix.c470
-rw-r--r--keyboards/handwired/xeal60/readme.md187
-rw-r--r--keyboards/handwired/xeal60/rev1/config.h93
-rw-r--r--keyboards/handwired/xeal60/rev1/rev1.c15
-rw-r--r--keyboards/handwired/xeal60/rev1/rev1.h33
-rw-r--r--keyboards/handwired/xeal60/rev1/rules.mk1
-rw-r--r--keyboards/handwired/xeal60/rules.mk77
-rw-r--r--keyboards/handwired/xeal60/serial.c228
-rw-r--r--keyboards/handwired/xeal60/serial.h26
-rw-r--r--keyboards/handwired/xeal60/split_util.c86
-rw-r--r--keyboards/handwired/xeal60/split_util.h20
-rw-r--r--keyboards/handwired/xealous/config.h5
-rw-r--r--keyboards/handwired/xealous/readme.md4
-rw-r--r--keyboards/handwired/xealous/rules.mk2
282 files changed, 14140 insertions, 1440 deletions
diff --git a/keyboards/handwired/108key_trackpoint/108key_trackpoint.c b/keyboards/handwired/108key_trackpoint/108key_trackpoint.c
new file mode 100644
index 000000000..3834f8961
--- /dev/null
+++ b/keyboards/handwired/108key_trackpoint/108key_trackpoint.c
@@ -0,0 +1 @@
+#include "108key_trackpoint.h"
diff --git a/keyboards/handwired/108key_trackpoint/108key_trackpoint.h b/keyboards/handwired/108key_trackpoint/108key_trackpoint.h
new file mode 100644
index 000000000..100f4cb93
--- /dev/null
+++ b/keyboards/handwired/108key_trackpoint/108key_trackpoint.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K000, K002, K003, K004, K005, K007, K008, K009, K010, K011, K012, K013, K014, K015, K016, K017, K019, K020, K021, K022, \
+ \
+ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, K214, K215, K216, K217, K219, K220, K221, K222, \
+ K300, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, K319, K320, K321, \
+ K400, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, K419, K420, K421, K422, \
+ K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, K513, K516, K519, K520, K521, \
+ K600, K601, K603, K606, K610, K611, K613, K614, K615, K616, K617, K619, K621, K622, \
+ K705, K706, K707 \
+) { \
+ { K000, KC_NO, K002, K003, K004, K005, KC_NO, K007, K008, K009, K010, K011, K012, K013, K014, K015, K016, K017, KC_NO, K019, K020, K021, K022 }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, KC_NO, K214, K215, K216, K217, KC_NO, K219, K220, K221, K222 }, \
+ { K300, KC_NO, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, K313, K314, K315, K316, K317, KC_NO, K319, K320, K321, KC_NO }, \
+ { K400, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, K410, K411, K412, K413, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K419, K420, K421, K422 }, \
+ { KC_NO, K501, K502, K503, K504, K505, K506, K507, K508, K509, K510, K511, KC_NO, K513, KC_NO, KC_NO, K516, KC_NO, KC_NO, K519, K520, K521, KC_NO }, \
+ { K600, K601, KC_NO, K603, KC_NO, KC_NO, K606, KC_NO, KC_NO, KC_NO, K610, K611, KC_NO, K613, K614, K615, K616, K617, KC_NO, K619, KC_NO, K621, K622 }, \
+ { KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K705, K706, K707, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \
+}
diff --git a/keyboards/handwired/108key_trackpoint/config.h b/keyboards/handwired/108key_trackpoint/config.h
new file mode 100644
index 000000000..7a63fe262
--- /dev/null
+++ b/keyboards/handwired/108key_trackpoint/config.h
@@ -0,0 +1,73 @@
+#pragma once
+
+#include "config_common.h"
+
+#define VENDOR_ID 0x1234
+#define PRODUCT_ID 0x5678
+#define DEVICE_VER 0x0001
+#define MANUFACTURER QMK
+#define PRODUCT 108Key-Trackpoint
+#define DESCRIPTION A 108 key ANSI keyboard with a trackpoint and three mouse buttons
+
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 23
+
+#ifdef PS2_USE_USART
+ #define PS2_CLOCK_PORT PORTD
+ #define PS2_CLOCK_PIN PIND
+ #define PS2_CLOCK_DDR DDRD
+ #define PS2_CLOCK_BIT 5
+ #define PS2_DATA_PORT PORTD
+ #define PS2_DATA_PIN PIND
+ #define PS2_DATA_DDR DDRD
+ #define PS2_DATA_BIT 2
+
+ /* synchronous, odd parity, 1-bit stop, 8-bit data, sample at falling edge */
+ /* set DDR of CLOCK as input to be slave */
+ #define PS2_USART_INIT() do { \
+ PS2_CLOCK_DDR &= ~(1<<PS2_CLOCK_BIT); \
+ PS2_DATA_DDR &= ~(1<<PS2_DATA_BIT); \
+ UCSR1C = ((1 << UMSEL10) | \
+ (3 << UPM10) | \
+ (0 << USBS1) | \
+ (3 << UCSZ10) | \
+ (0 << UCPOL1)); \
+ UCSR1A = 0; \
+ UBRR1H = 0; \
+ UBRR1L = 0; \
+ } while (0)
+ #define PS2_USART_RX_INT_ON() do { \
+ UCSR1B = ((1 << RXCIE1) | \
+ (1 << RXEN1)); \
+ } while (0)
+ #define PS2_USART_RX_POLL_ON() do { \
+ UCSR1B = (1 << RXEN1); \
+ } while (0)
+ #define PS2_USART_OFF() do { \
+ UCSR1C = 0; \
+ UCSR1B &= ~((1 << RXEN1) | \
+ (1 << TXEN1)); \
+ } while (0)
+ #define PS2_USART_RX_READY (UCSR1A & (1<<RXC1))
+ #define PS2_USART_RX_DATA UDR1
+ #define PS2_USART_ERROR (UCSR1A & ((1<<FE1) | (1<<DOR1) | (1<<UPE1)))
+ #define PS2_USART_RX_VECT USART1_RX_vect
+#endif
+
+#define MATRIX_ROW_PINS { B0, B1, B2, B3, B4, B5, B6, B7 }
+#define MATRIX_COL_PINS { C0, C1, C2, C3, C4, C5, C6, C7, D0, D1, F0, D3, D4, F1, D6, D7, E0, E1, E2, E3, E4, E5, E6 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+#define DEBOUNCING_DELAY 5
+
+#define LOCKING_SUPPORT_ENABLE
+#define LOCKING_RESYNC_ENABLE
+
+/* key combination for commkand */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
diff --git a/keyboards/handwired/108key_trackpoint/info.json b/keyboards/handwired/108key_trackpoint/info.json
new file mode 100644
index 000000000..bd221892b
--- /dev/null
+++ b/keyboards/handwired/108key_trackpoint/info.json
@@ -0,0 +1,125 @@
+{
+ "keyboard_name": "108 Key with TrackPoint",
+ "url": "",
+ "maintainer": "mkem114",
+ "width": 22.5,
+ "height": 7.5,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 111,
+ "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":"Mute", "x":18.5, "y":0},
+ {"label":"Previous", "x":19.5, "y":0},
+ {"label":"Next", "x":20.5, "y":0},
+ {"label":"Play", "x":21.5, "y":0},
+ {"label":"`", "x":0, "y":1.5},
+ {"label":"1", "x":1, "y":1.5},
+ {"label":"2", "x":2, "y":1.5},
+ {"label":"3", "x":3, "y":1.5},
+ {"label":"4", "x":4, "y":1.5},
+ {"label":"5", "x":5, "y":1.5},
+ {"label":"6", "x":6, "y":1.5},
+ {"label":"7", "x":7, "y":1.5},
+ {"label":"8", "x":8, "y":1.5},
+ {"label":"9", "x":9, "y":1.5},
+ {"label":"0", "x":10, "y":1.5},
+ {"label":"-", "x":11, "y":1.5},
+ {"label":"=", "x":12, "y":1.5},
+ {"label":"Backspace", "x":13, "y":1.5, "w":2},
+ {"label":"Insert", "x":15.25, "y":1.5},
+ {"label":"Home", "x":16.25, "y":1.5},
+ {"label":"Page Up", "x":17.25, "y":1.5},
+ {"label":"Num Lock", "x":18.5, "y":1.5},
+ {"label":"/", "x":19.5, "y":1.5},
+ {"label":"*", "x":20.5, "y":1.5},
+ {"label":"-", "x":21.5, "y":1.5},
+ {"label":"Tab", "x":0, "y":2.5, "w":1.5},
+ {"label":"Q", "x":1.5, "y":2.5},
+ {"label":"W", "x":2.5, "y":2.5},
+ {"label":"E", "x":3.5, "y":2.5},
+ {"label":"R", "x":4.5, "y":2.5},
+ {"label":"T", "x":5.5, "y":2.5},
+ {"label":"Y", "x":6.5, "y":2.5},
+ {"label":"U", "x":7.5, "y":2.5},
+ {"label":"I", "x":8.5, "y":2.5},
+ {"label":"O", "x":9.5, "y":2.5},
+ {"label":"P", "x":10.5, "y":2.5},
+ {"label":"[", "x":11.5, "y":2.5},
+ {"label":"]", "x":12.5, "y":2.5},
+ {"label":"\\", "x":13.5, "y":2.5, "w":1.5},
+ {"label":"Delete", "x":15.25, "y":2.5},
+ {"label":"End", "x":16.25, "y":2.5},
+ {"label":"Page Down", "x":17.25, "y":2.5},
+ {"label":"7", "x":18.5, "y":2.5},
+ {"label":"8", "x":19.5, "y":2.5},
+ {"label":"9", "x":20.5, "y":2.5},
+ {"label":"Caps Lock", "x":0, "y":3.5, "w":1.75},
+ {"label":"A", "x":1.75, "y":3.5},
+ {"label":"S", "x":2.75, "y":3.5},
+ {"label":"D", "x":3.75, "y":3.5},
+ {"label":"F", "x":4.75, "y":3.5},
+ {"label":"G", "x":5.75, "y":3.5},
+ {"label":"H", "x":6.75, "y":3.5},
+ {"label":"J", "x":7.75, "y":3.5},
+ {"label":"K", "x":8.75, "y":3.5},
+ {"label":"L", "x":9.75, "y":3.5},
+ {"label":";", "x":10.75, "y":3.5},
+ {"label":"'", "x":11.75, "y":3.5},
+ {"label":"Enter", "x":12.75, "y":3.5, "w":2.25},
+ {"label":"4", "x":18.5, "y":3.5},
+ {"label":"5", "x":19.5, "y":3.5},
+ {"label":"6", "x":20.5, "y":3.5},
+ {"label":"+", "x":21.5, "y":2.5, "h":2},
+ {"label":"Shift", "x":0, "y":4.5, "w":2.25},
+ {"label":"Z", "x":2.25, "y":4.5},
+ {"label":"X", "x":3.25, "y":4.5},
+ {"label":"C", "x":4.25, "y":4.5},
+ {"label":"V", "x":5.25, "y":4.5},
+ {"label":"B", "x":6.25, "y":4.5},
+ {"label":"N", "x":7.25, "y":4.5},
+ {"label":"M", "x":8.25, "y":4.5},
+ {"label":",", "x":9.25, "y":4.5},
+ {"label":".", "x":10.25, "y":4.5},
+ {"label":"/", "x":11.25, "y":4.5},
+ {"label":"Shift", "x":12.25, "y":4.5, "w":2.75},
+ {"label":"Up", "x":16.25, "y":4.5},
+ {"label":"1", "x":18.5, "y":4.5},
+ {"label":"2", "x":19.5, "y":4.5},
+ {"label":"3", "x":20.5, "y":4.5},
+ {"label":"Ctrl", "x":0, "y":5.5, "w":1.25},
+ {"label":"LGUI", "x":1.25, "y":5.5, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":5.5, "w":1.25},
+ {"label":"Space", "x":3.75, "y":5.5, "w":6.25},
+ {"label":"Alt", "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":"Ctrl", "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":"0", "x":18.5, "y":5.5, "w":2},
+ {"label":".", "x":20.5, "y":5.5},
+ {"label":"Enter", "x":21.5, "y":4.5, "h":2},
+ {"label":"Mouse1", "x":5.25, "y":6.5},
+ {"label":"Mouse3", "x":6.25, "y":6.5},
+ {"label":"Mouse2", "x":7.25, "y":6.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c b/keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c
new file mode 100644
index 000000000..3345aca16
--- /dev/null
+++ b/keyboards/handwired/108key_trackpoint/keymaps/default/keymap.c
@@ -0,0 +1,14 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT (
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY,
+
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, KC_LGUI, KC_APP, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT,
+ KC_BTN1, KC_BTN3, KC_BTN2
+ )
+};
diff --git a/keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c b/keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c
new file mode 100644
index 000000000..0181ad9f7
--- /dev/null
+++ b/keyboards/handwired/108key_trackpoint/keymaps/dvorak/keymap.c
@@ -0,0 +1,14 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT (
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY,
+
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9,
+ KC_CAPS, 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_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, KC_LGUI, KC_APP, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT,
+ KC_BTN1, KC_BTN3, KC_BTN2
+ )
+};
diff --git a/keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c b/keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c
new file mode 100644
index 000000000..d6223c496
--- /dev/null
+++ b/keyboards/handwired/108key_trackpoint/keymaps/dvorak_media/keymap.c
@@ -0,0 +1,14 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT (
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SLCK, KC_PAUS, KC_MUTE, KC_VOLD, KC_VOLU, KC_MNXT,
+
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_LBRC, KC_RBRC, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, KC_EQL, KC_BSLS, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9,
+ KC_MPLY, 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_P4, KC_P5, KC_P6, KC_PPLS,
+ KC_LSFT, KC_SCLN, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_LSFT, KC_UP, KC_P1, KC_P2, KC_P3,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_LALT, KC_LGUI, KC_APP, KC_LCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT,
+ KC_BTN1, KC_BTN3, KC_BTN2
+ )
+};
diff --git a/keyboards/handwired/108key_trackpoint/readme.md b/keyboards/handwired/108key_trackpoint/readme.md
new file mode 100644
index 000000000..468fdf94d
--- /dev/null
+++ b/keyboards/handwired/108key_trackpoint/readme.md
@@ -0,0 +1,23 @@
+# 108 Key with TrackPoint
+
+![wiring](https://raw.githubusercontent.com/qmk/qmk.fm/gh-pages/keyboards/handwired/108key_trackpoint/wiring.JPG)
+
+This is based off the handwired/trackpoint keyboard and generated code from [Keyboard Firmware Builder](https://kbfirmware.com/).
+
+Keyboard Maintainer: [mkem114](https://github.com/mkem114)
+Hardware Supported (tested): Teensy++ 2.0
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/108key_trackpoint: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).
+
+You may have to modify the source code to suit 104 keys, RGB back-lights, different micro-controllers, or big ass enter.
+
+There are three keymaps:
+* qwerty with the four extra keys being: mute, media prev, media next, and media play
+* dvorak with the four extra keys being: mute, media prev, media next, and media play
+* dvorak_media with the caps lock being media play and the four extra keys being: mute, volume down, volume up, and media next
+
+To figure out how to wire your specific TrackPoint have a look out: [How to integrate a trackpoint in a mechanical keyboard](https://github.com/alonswartz/trackpoint).
diff --git a/keyboards/handwired/108key_trackpoint/rules.mk b/keyboards/handwired/108key_trackpoint/rules.mk
new file mode 100644
index 000000000..84ec52eee
--- /dev/null
+++ b/keyboards/handwired/108key_trackpoint/rules.mk
@@ -0,0 +1,82 @@
+# MCU name
+MCU = at90usb1286
+#MCU = atmega32u4
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# atmega32a bootloadHID
+BOOTLOADER = halfkay
+
+
+# If you don't know the bootloader type, then you can specify the
+# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line
+# Teensy halfKay 512
+# Teensy++ halfKay 1024
+# Atmel DFU loader 4096
+# LUFA bootloader 4096
+# USBaspLoader 2048
+# OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = yes # Console for debug(+400)
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# 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
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+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
+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 (+400)
+PS2_MOUSE_ENABLE = yes
+PS2_USE_USART = yes
diff --git a/keyboards/handwired/CMD60/README.md b/keyboards/handwired/CMD60/README.md
deleted file mode 100644
index 8b0dd109f..000000000
--- a/keyboards/handwired/CMD60/README.md
+++ /dev/null
@@ -1,35 +0,0 @@
-CMD60 keyboard firmware
-======================
-
-##CMD60
-
-This layout has been designed to optimize use of the left-hand, and it focussed specifically on programmers who work
-with text editors like SublimeText and Atom. It utilizes the power of Space_fn, and features a caps lock swap for Fn2
-and enter key on tap. These features allow you to keep your right hand on the mouse more and should enable you to
-achieve a higher level of productivity if you take the time to learn its function layers.
-
-## Quantum MK Firmware
-
-For the full Quantum feature list, see [the parent readme.md](/docs/README.md).
-
-## Building
-
-Download or clone the whole firmware and navigate to the keyboards/handwired/CMD60 folder.
-Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use
-the Teensy Loader to program your .hex file.
-
-Depending on which keymap you would like to use, you will have to compile slightly differently.
-
-### Default
-
-To build with the default keymap, simply run `make`.
-
-### Other Keymaps
-
-To build the firmware binary hex file with a keymap just do `make` with `keymap` option like:
-
-```
-$ make keymap=[default|jack|<name>]
-```
-
-Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`
diff --git a/keyboards/handwired/CMD60/keymaps/default/keymap.c b/keyboards/handwired/CMD60/keymaps/default/keymap.c
deleted file mode 100644
index 9f9cbcd66..000000000
--- a/keyboards/handwired/CMD60/keymaps/default/keymap.c
+++ /dev/null
@@ -1,66 +0,0 @@
-#include "CMD60.h"
-
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [0] = KEYMAP( /* CMD60 - QWERTY */
- KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
- KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
- LT(3, KC_ENT), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NO, KC_ENT, \
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_NO, KC_NO, KC_RSFT, \
- KC_LCTL, KC_LGUI, KC_LALT, LT(2, KC_SPC), MO(3), MO(4), MO(5), TG(1) \
- ),
- [1] = KEYMAP( /* CMD60 - GameMode */
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
- KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \
- KC_LSFT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_RSFT, \
- KC_TRNS, KC_NO, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
- ),
- [2] = KEYMAP( /* CMD60 - Arrows */
- 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_BSPC, KC_UP, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSPC, KC_UP, KC_DEL, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, \
- KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, \
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_TRNS, \
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
- ),
- [3] = KEYMAP( /* CMD60 - Functions */
- 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_AUDIO_MUTE, KC_BSPC, KC_PGUP, KC_DEL, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_UP, KC_PGDN, KC_TRNS, KC_PAUSE, KC_SLCK, KC_PSCREEN, \
- KC_TRNS, KC_HOME, KC_PGDN, KC_END, KC_TRNS, KC_TRNS, KC_HOME, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_INSERT, KC_NO, KC_TRNS, \
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_NO, KC_TRNS, \
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
- ),
- [4] = KEYMAP( /* CMD60 - Mouse */
- KC_SYSTEM_SLEEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_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_BTN1, KC_MS_UP, KC_MS_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_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRNS, KC_NO, KC_TRNS, \
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MS_WH_UP, KC_MS_BTN3, KC_MS_WH_DOWN, KC_NO, KC_NO, KC_TRNS, \
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
- ),
- [5] = KEYMAP( /* CMD60 - Media */
- KC_SYSTEM_WAKE, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, \
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, \
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK, KC_MEDIA_PLAY_PAUSE, \
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_WWW_BACK, KC_WWW_FORWARD, KC_NO, KC_NO, KC_WWW_REFRESH, \
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS \
- ),
-};
-
-const uint16_t PROGMEM fn_actions[] = {
-
-};
-
-
-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/handwired/MS_sculpt_mobile/MS_sculpt_mobile.c b/keyboards/handwired/MS_sculpt_mobile/MS_sculpt_mobile.c
deleted file mode 100644
index 64982fb62..000000000
--- a/keyboards/handwired/MS_sculpt_mobile/MS_sculpt_mobile.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "MS_sculpt_mobile.h"
diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/config.h b/keyboards/handwired/MS_sculpt_mobile/keymaps/default/config.h
deleted file mode 100644
index 4f3a425b7..000000000
--- a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/config.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#ifndef CONFIG_USER_H
-#define CONFIG_USER_H
-
-#include "../../../MS_sculpt_mobile/config.h"
-
-// place overrides here
-
-#endif
diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/readme.md b/keyboards/handwired/MS_sculpt_mobile/keymaps/default/readme.md
deleted file mode 100644
index e67ddc6fe..000000000
--- a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/readme.md
+++ /dev/null
@@ -1 +0,0 @@
-# The default keymap for microsoft-sculpt-mobile
diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/readme.md b/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/readme.md
deleted file mode 100644
index 96ee0e77a..000000000
--- a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/readme.md
+++ /dev/null
@@ -1 +0,0 @@
-# A more programmer oriented keymap for microsoft-sculpt-mobile
diff --git a/keyboards/handwired/MS_sculpt_mobile/readme.md b/keyboards/handwired/MS_sculpt_mobile/readme.md
deleted file mode 100644
index d435b449f..000000000
--- a/keyboards/handwired/MS_sculpt_mobile/readme.md
+++ /dev/null
@@ -1,58 +0,0 @@
-
-This is a way to take a Microsoft ergonomic bluetooth keyboard, and make it
-into a hard-wired keyboard running QMK.
-
-The keyboard is known under several different names:
-Mobile Bluetooth 5000, Mobile 6000, Sculpt mobile, and Asus rebranded
-
-I had a stack of them,since they're cheap on ebay, travel well, and are just ergo enough.
-
-The ribbon cable is 1mm pitch, which is hard to hand solder. I bought a cheap set of
-"pitch adapter" boards https://www.amazon.com/Double-Sided-0-4mm-1-0-Adapter-60mmx38mm/dp/B00OK42118
-
-Cut the original ribbon cable sockets off the bluetooth board using a razor, they're hard to desolder.
-They're also allow the cable to be inserted on top or bottom.
-
-If I was going to do it again, I'd make the MCU connection come out the top of the keyboard
-and avoid the wires dangling out the bottom.
-
-As I was debugging the matrix, I started to get random failures. In desparation I tried a second MCU,
-but had the same problems. It turns out that the ribbon cable connections can get worn. Shave a
-half millimeter off the end of the ribbon cable & the errors go away.
-
-My method for discovering the matrix was to set up a KEYMAP macro that included all pins.
-See MATRIX_TESTING_KEYMAP if you need it. Then set up a keymap that has all printable symbols
-in the first 4 rows. test each key & record output. Then switch the printable symbols to the
-bottom 4 rows & repeat. This was enough to show the matrix.
-
-
-The full original keymap for the sculpt is
- A B C D E F G H --->
-0 b n m , . /
-1 g h "
-2 7 8 9 0 Del PgUp
-3 p [ ] \
-4 y u i o
-5 ~ - += j k l ; 5
-6 a s d q w e, Up left
-7 F7 F8 F9 F10 F11 F12 f
-
------> I J K L M N O P Q R
-0 Caps FN
-1 Vol+ mute Rctl vol- pgdn LCTL
-2 Rshift LShift
-3 Ralt LAlt
-4 LGUI
-5 6 bakspc 1 2 3 4 F4 F5 F6
-6 Down right spc F1 F2 F3 tab
-7 r t z x c v enter Esc
-
-This works with 18 cols + 8 rows on a Teensy++, or Arm based Teensy.
-
-The Astar mini has all pins exposed , so you can do 18x8
-If you want a speaker, LEDs &etc, you'll need to free up a pin. I recommend joining columns
-R and L to the same pin.
-
-Building - add ASTAR=1 to the compile line or leave out for teensy2++
-
-
diff --git a/keyboards/handwired/arrow_pad/arrow_pad.h b/keyboards/handwired/arrow_pad/arrow_pad.h
index 62882b9b5..b93fd113f 100644
--- a/keyboards/handwired/arrow_pad/arrow_pad.h
+++ b/keyboards/handwired/arrow_pad/arrow_pad.h
@@ -10,4 +10,34 @@
#include <avr/io.h>
#include <stddef.h>
+// This is the 21-key keypad to 4x6 element matrix mapping
+#define LAYOUT( \
+ KM_ESC, KM_TAB, KM_BSL, KM_ARR, \
+ KM_NUM, KM_FSL, KM_AST, KM_MIN, \
+ KM___7, KM___8, KM___9, KM_EQU, \
+ KM___4, KM___5, KM___6, KM_PLS, \
+ KM___1, KM___2, KM___3, ___ENT, \
+ KM___0, _____0, KM_DOT, KM_ENT \
+) { \
+ { KM_ESC, KM_TAB, KM_BSL, KM_ARR }, \
+ { KM_NUM, KM_FSL, KM_AST, KM_MIN }, \
+ { KM___7, KM___8, KM___9, KM_EQU }, \
+ { KM___4, KM___5, KM___6, KM_PLS }, \
+ { KM___1, KM___2, KM___3, KC_NO }, \
+ { KM___0, KC_NO, KM_DOT, KM_ENT } \
+}
+
+// This is the 21-key keypad to 2x11 element matrix mapping
+#define LAYOUT_pad21( \
+ KM_ESC, KM_TAB, KM_BSL, KM_ARR, \
+ KM_NUM, KM_FSL, KM_AST, KM_MIN, \
+ KM___7, KM___8, KM___9, \
+ KM___4, KM___5, KM___6, KM_PLS, \
+ KM___1, KM___2, KM___3, \
+ KM___0, KM_DOT, KM_ENT \
+) { \
+ { KM_ESC, KM_TAB, KM_BSL, KM_ARR, KM___7, KM___8, KM___9, KM_PLS, KM___1, KM___2, KM___3, }, \
+ { KM_NUM, KM_FSL, KM_AST, KM_MIN, KM___4, KM___5, KM___6, KM_ENT, KC_NO, KM___0, KM_DOT, }, \
+}
+
#endif
diff --git a/keyboards/handwired/arrow_pad/info.json b/keyboards/handwired/arrow_pad/info.json
new file mode 100644
index 000000000..ad15e8e74
--- /dev/null
+++ b/keyboards/handwired/arrow_pad/info.json
@@ -0,0 +1,62 @@
+{
+ "keyboard_name": "arrow_pad",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 4,
+ "height": 6,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"KM_ESC", "x":0, "y":0},
+ {"label":"KM_TAB", "x":1, "y":0},
+ {"label":"KM_BSL", "x":2, "y":0},
+ {"label":"KM_ARR", "x":3, "y":0},
+ {"label":"KM_NUM", "x":0, "y":1},
+ {"label":"KM_FSL", "x":1, "y":1},
+ {"label":"KM_AST", "x":2, "y":1},
+ {"label":"KM_MIN", "x":3, "y":1},
+ {"label":"KM___7", "x":0, "y":2},
+ {"label":"KM___8", "x":1, "y":2},
+ {"label":"KM___9", "x":2, "y":2},
+ {"label":"KM_EQU", "x":3, "y":2},
+ {"label":"KM___4", "x":0, "y":3},
+ {"label":"KM___5", "x":1, "y":3},
+ {"label":"KM___6", "x":2, "y":3},
+ {"label":"KM_PLS", "x":3, "y":3},
+ {"label":"KM___1", "x":0, "y":4},
+ {"label":"KM___2", "x":1, "y":4},
+ {"label":"KM___3", "x":2, "y":4},
+ {"label":"___ENT", "x":3, "y":4},
+ {"label":"KM___0", "x":0, "y":5},
+ {"label":"_____0", "x":1, "y":5},
+ {"label":"KM_DOT", "x":2, "y":5},
+ {"label":"KM_ENT", "x":3, "y":5}
+ ]
+ },
+ "LAYOUT_pad21": {
+ "layout": [
+ {"label":"KM_ESC", "x":0, "y":0},
+ {"label":"KM_TAB", "x":1, "y":0},
+ {"label":"KM_BSL", "x":2, "y":0},
+ {"label":"KM_ARR", "x":3, "y":0},
+ {"label":"KM_NUM", "x":0, "y":1},
+ {"label":"KM_FSL", "x":1, "y":1},
+ {"label":"KM_AST", "x":2, "y":1},
+ {"label":"KM_MIN", "x":3, "y":1},
+ {"label":"KM___7", "x":0, "y":2},
+ {"label":"KM___8", "x":1, "y":2},
+ {"label":"KM___9", "x":2, "y":2},
+ {"label":"KM___4", "x":0, "y":3},
+ {"label":"KM___5", "x":1, "y":3},
+ {"label":"KM___6", "x":2, "y":3},
+ {"label":"KM_PLS", "x":3, "y":2, "h":2},
+ {"label":"KM___1", "x":0, "y":4},
+ {"label":"KM___2", "x":1, "y":4},
+ {"label":"KM___3", "x":2, "y":4},
+ {"label":"KM___0", "x":0, "y":5, "w":2},
+ {"label":"KM_DOT", "x":2, "y":5},
+ {"label":"KM_ENT", "x":3, "y":4, "h":2}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/arrow_pad/keymaps/default/keymap.c b/keyboards/handwired/arrow_pad/keymaps/default/keymap.c
index b5d304708..dd729c59a 100644
--- a/keyboards/handwired/arrow_pad/keymaps/default/keymap.c
+++ b/keyboards/handwired/arrow_pad/keymaps/default/keymap.c
@@ -1,35 +1,18 @@
-#include "arrow_pad.h"
+#include QMK_KEYBOARD_H
#include "led.h"
-// This is the 21-key keypad to 2x11 element matrix mapping
-#define LAYOUT( \
- KM_ESC, KM_TAB, KM_BSL, KM_ARR, \
- KM_NUM, KM_FSL, KM_AST, KM_MIN, \
- KM___7, KM___8, KM___9, KM_EQU, \
- KM___4, KM___5, KM___6, KM_PLS, \
- KM___1, KM___2, KM___3, ___ENT, \
- KM___0, _____0, KM_DOT, KM_ENT \
-) { \
- { KM_ESC, KM_TAB, KM_BSL, KM_ARR }, \
- { KM_NUM, KM_FSL, KM_AST, KM_MIN }, \
- { KM___7, KM___8, KM___9, KM_EQU }, \
- { KM___4, KM___5, KM___6, KM_PLS }, \
- { KM___1, KM___2, KM___3, KC_NO }, \
- { KM___0, KC_NO, KM_DOT, KM_ENT } \
-}
-
-#define LAYER_BASE 0
-#define LAYER_EDIT 1
-#define LAYER_FUNCTION 2
-
-#define MACRO_COPY_CUT 0
-#define MACRO_SHIFT_CONTROL 1
-#define MACRO_CONTROL_ALT 2
+enum layers {
+ LAYER_BASE,
+ LAYER_EDIT,
+ LAYER_FUNCTION
+};
-#define M_COPY KC_FN5
-#define M_SHFCT KC_FN6
-#define M_CTALT KC_FN7
+enum custom_keycodes {
+ M_COPY = SAFE_RANGE, // KC_FN5: MACRO_COPY_CUT
+ M_SHFCT, // KC_FN6: MACRO_SHIFT_CONTROL
+ M_CTALT // KC_FN7: MACRO_CONTROL_ALT
+};
#define SC_UNDO LCTL(KC_Z)
#define SC_REDO LCTL(KC_Y)
@@ -42,13 +25,10 @@
#define SC_ACLS LALT(KC_F4)
#define SC_CCLS LCTL(KC_F4)
-#define _______ KC_TRNS
-#define XXXXXXX KC_NO
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[LAYER_BASE] = LAYOUT( \
- KC_ESC, KC_TAB, KC_BSLS, KC_FN0, \
+ KC_ESC, KC_TAB, KC_BSLS, MO(2), \
KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
KC_P7, KC_P8, KC_P9, KC_PEQL, \
KC_P4, KC_P5, KC_P6, KC_PPLS, \
@@ -57,15 +37,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[LAYER_EDIT] = LAYOUT( \
KC_ESC, KC_TAB, KC_SPC, _______, \
- KC_FN1, SC_PSTE, SC_REDO, SC_UNDO, \
+ TG(1), SC_PSTE, SC_REDO, SC_UNDO, \
KC_HOME, KC_UP, KC_PGUP, KC_LALT, \
KC_LEFT, M_COPY, KC_RGHT, KC_LCTL, \
KC_END, KC_DOWN, KC_PGDN, XXXXXXX, \
- KC_BSPC, KC_PENT, KC_DEL, M_SHFCT),
+ KC_BSPC, KC_PENT, KC_DEL, M_SHFCT ),
[LAYER_FUNCTION] = LAYOUT( \
- KC_FN2, KC_FN3, KC_FN4, _______, \
- KC_FN1, _______, _______, _______, \
+ BL_TOGG, BL_INC, BL_DEC, _______, \
+ TG(1), _______, _______, _______, \
_______, _______, _______, _______, \
_______, _______, _______, _______, \
_______, _______, _______, XXXXXXX, \
@@ -74,68 +54,46 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_LAYER_MOMENTARY(LAYER_FUNCTION),
- [1] = ACTION_LAYER_TOGGLE(LAYER_EDIT),
- [2] = ACTION_BACKLIGHT_TOGGLE(),
- [3] = ACTION_BACKLIGHT_INCREASE(),
- [4] = ACTION_BACKLIGHT_DECREASE(),
- [5] = ACTION_MACRO_TAP(MACRO_COPY_CUT),
- [6] = ACTION_MACRO_TAP(MACRO_SHIFT_CONTROL),
- [7] = ACTION_MACRO_TAP(MACRO_CONTROL_ALT),
-
-};
-
-
-void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
-}
+bool process_record_user(uint16_t keycode, keyrecord_t * record) {
+ // MACRODOWN only works in this function
+ switch (keycode) {
+
+ case M_COPY:
+ if (record->event.pressed) {
+ register_code(KC_LCTL);
+ if (record->tap.count == 1) {
+ register_code(KC_C);
+ unregister_code(KC_C);
+ } else if (record->tap.count == 2) {
+ register_code(KC_X);
+ unregister_code(KC_X);
+ }
+ unregister_code(KC_LCTL);
+ }
+ break;
+ case M_SHFCT:
+ if (record->event.pressed) {
+ if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT));
+ if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL));
+ if (record->tap.count == 3) register_code(KC_PENT);;
+ } else {
+ unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL));
+ unregister_code(KC_PENT);
+ }
+ break;
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- // MACRODOWN only works in this function
- switch (id) {
-
- case MACRO_COPY_CUT:
- if (record->event.pressed) {
- register_code(KC_LCTL);
- if (record->tap.count == 1) {
- register_code(KC_C);
- unregister_code(KC_C);
- }
- else if (record->tap.count == 2) {
- register_code(KC_X);
- unregister_code(KC_X);
- }
- unregister_code(KC_LCTL);
- }
- break;
-
- case MACRO_SHIFT_CONTROL:
- if (record->event.pressed) {
- if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT));
- if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL));
- if (record->tap.count == 3) register_code(KC_PENT);;
- }
- else {
- unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL));
- unregister_code(KC_PENT);
- }
- break;
-
- case MACRO_CONTROL_ALT:
- if (record->event.pressed) {
- if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL));
- if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT));
- }
- else {
- unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT));
- }
- break;
+ case M_CTALT:
+ if (record->event.pressed) {
+ if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL));
+ if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT));
+ } else {
+ unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT));
}
+ break;
+ }
- return MACRO_NONE;
+ return true;
}
void led_set_user(uint8_t usb_led)
diff --git a/keyboards/handwired/arrow_pad/keymaps/pad_21/keymap.c b/keyboards/handwired/arrow_pad/keymaps/pad_21/keymap.c
index a29f9e101..169297635 100644
--- a/keyboards/handwired/arrow_pad/keymaps/pad_21/keymap.c
+++ b/keyboards/handwired/arrow_pad/keymaps/pad_21/keymap.c
@@ -1,32 +1,18 @@
-#include "arrow_pad.h"
+#include QMK_KEYBOARD_H
#include "led.h"
-// This is the 21-key keypad to 2x11 element matrix mapping
-#define LAYOUT( \
- KM_ESC, KM_TAB, KM_BSL, KM_ARR, \
- KM_NUM, KM_FSL, KM_AST, KM_MIN, \
- KM___7, KM___8, KM___9, ___PLS, \
- KM___4, KM___5, KM___6, KM_PLS, \
- KM___1, KM___2, KM___3, ___ENT, \
- KM___0, _____0, KM_DOT, KM_ENT \
-) { \
- { KM_ESC, KM_TAB, KM_BSL, KM_ARR, KM___7, KM___8, KM___9, KM_PLS, KM___1, KM___2, KM___3, }, \
- { KM_NUM, KM_FSL, KM_AST, KM_MIN, KM___4, KM___5, KM___6, KM_ENT, KC_NO, KM___0, KM_DOT, }, \
-}
-
-
-#define LAYER_BASE 0
-#define LAYER_EDIT 1
-#define LAYER_FUNCTION 2
-
-#define MACRO_COPY_CUT 0
-#define MACRO_SHIFT_CONTROL 1
-#define MACRO_CONTROL_ALT 2
+enum layers {
+ LAYER_BASE,
+ LAYER_EDIT,
+ LAYER_FUNCTION
+};
-#define M_COPY KC_FN5
-#define M_SHFCT KC_FN6
-#define M_CTALT KC_FN7
+enum custom_keycodes {
+ M_COPY = SAFE_RANGE, // KC_FN5: MACRO_COPY_CUT
+ M_SHFCT, // KC_FN6: MACRO_SHIFT_CONTROL
+ M_CTALT // KC_FN7: MACRO_CONTROL_ALT
+};
#define SC_UNDO LCTL(KC_Z)
#define SC_REDO LCTL(KC_Y)
@@ -39,100 +25,75 @@
#define SC_ACLS LALT(KC_F4)
#define SC_CCLS LCTL(KC_F4)
-#define _______ KC_TRNS
-#define XXXXXXX KC_NO
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[LAYER_BASE] = LAYOUT( \
- KC_ESC, KC_TAB, KC_BSLS, KC_FN0, \
+[LAYER_BASE] = LAYOUT_pad21( \
+ KC_ESC, KC_TAB, KC_BSLS, MO(2), \
KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
- KC_P7, KC_P8, KC_P9, XXXXXXX, \
+ KC_P7, KC_P8, KC_P9, \
KC_P4, KC_P5, KC_P6, KC_PPLS, \
- KC_P1, KC_P2, KC_P3, XXXXXXX, \
- KC_P0, XXXXXXX, KC_PDOT, KC_PENT ),
+ KC_P1, KC_P2, KC_P3, \
+ KC_P0, KC_PDOT, KC_PENT ),
-[LAYER_EDIT] = LAYOUT( \
+[LAYER_EDIT] = LAYOUT_pad21( \
KC_ESC, KC_TAB, KC_SPC, _______, \
- KC_FN1, SC_PSTE, SC_REDO, SC_UNDO, \
- KC_HOME, KC_UP, KC_PGUP, XXXXXXX, \
+ TG(1), SC_PSTE, SC_REDO, SC_UNDO, \
+ KC_HOME, KC_UP, KC_PGUP, \
KC_LEFT, M_COPY, KC_RGHT, M_CTALT, \
- KC_END, KC_DOWN, KC_PGDN, XXXXXXX, \
- KC_BSPC, XXXXXXX, KC_DEL, M_SHFCT),
+ KC_END, KC_DOWN, KC_PGDN, \
+ KC_BSPC, KC_DEL, M_SHFCT),
-[LAYER_FUNCTION] = LAYOUT( \
- KC_FN2, KC_FN3, KC_FN4, _______, \
- KC_FN1, _______, _______, _______, \
- _______, _______, _______, XXXXXXX, \
+[LAYER_FUNCTION] = LAYOUT_pad21( \
+ BL_TOGG, BL_INC, BL_DEC, _______, \
+ TG(1), _______, _______, _______, \
+ _______, _______, _______, \
_______, _______, _______, _______, \
- _______, _______, _______, XXXXXXX, \
- RESET, XXXXXXX, _______, _______ ),
-
-};
-
-
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_LAYER_MOMENTARY(LAYER_FUNCTION),
- [1] = ACTION_LAYER_TOGGLE(LAYER_EDIT),
- [2] = ACTION_BACKLIGHT_TOGGLE(),
- [3] = ACTION_BACKLIGHT_INCREASE(),
- [4] = ACTION_BACKLIGHT_DECREASE(),
- [5] = ACTION_MACRO_TAP(MACRO_COPY_CUT),
- [6] = ACTION_MACRO_TAP(MACRO_SHIFT_CONTROL),
- [7] = ACTION_MACRO_TAP(MACRO_CONTROL_ALT),
+ _______, _______, _______, \
+ RESET, _______, _______ ),
};
-void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
-}
+bool process_record_user(uint16_t keycode, keyrecord_t * record) {
+ // MACRODOWN only works in this function
+ switch (keycode) {
+
+ case M_COPY:
+ if (record->event.pressed) {
+ register_code(KC_LCTL);
+ if (record->tap.count == 1) {
+ register_code(KC_C);
+ unregister_code(KC_C);
+ } else if (record->tap.count == 2) {
+ register_code(KC_X);
+ unregister_code(KC_X);
+ }
+ unregister_code(KC_LCTL);
+ }
+ break;
+ case M_SHFCT:
+ if (record->event.pressed) {
+ if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT));
+ if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL));
+ if (record->tap.count == 3) register_code(KC_PENT);;
+ } else {
+ unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL));
+ unregister_code(KC_PENT);
+ }
+ break;
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- // MACRODOWN only works in this function
- switch (id) {
-
- case MACRO_COPY_CUT:
- if (record->event.pressed) {
- register_code(KC_LCTL);
- if (record->tap.count == 1) {
- register_code(KC_C);
- unregister_code(KC_C);
- }
- else if (record->tap.count == 2) {
- register_code(KC_X);
- unregister_code(KC_X);
- }
- unregister_code(KC_LCTL);
- }
- break;
-
- case MACRO_SHIFT_CONTROL:
- if (record->event.pressed) {
- if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT));
- if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL));
- if (record->tap.count == 3) register_code(KC_PENT);;
- }
- else {
- unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL));
- unregister_code(KC_PENT);
- }
- break;
-
- case MACRO_CONTROL_ALT:
- if (record->event.pressed) {
- if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL));
- if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT));
- }
- else {
- unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT));
- }
- break;
+ case M_CTALT:
+ if (record->event.pressed) {
+ if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL));
+ if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT));
+ } else {
+ unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT));
}
+ break;
+ }
- return MACRO_NONE;
+ return true;
}
void led_set_user(uint8_t usb_led)
diff --git a/keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk b/keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk
index af51976a8..d2403c9ec 100644
--- a/keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk
+++ b/keyboards/handwired/arrow_pad/keymaps/pad_21/rules.mk
@@ -9,7 +9,7 @@ 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 this with audio at the same time.
+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
diff --git a/keyboards/handwired/arrow_pad/keymaps/pad_24/keymap.c b/keyboards/handwired/arrow_pad/keymaps/pad_24/keymap.c
index b5d304708..dd729c59a 100644
--- a/keyboards/handwired/arrow_pad/keymaps/pad_24/keymap.c
+++ b/keyboards/handwired/arrow_pad/keymaps/pad_24/keymap.c
@@ -1,35 +1,18 @@
-#include "arrow_pad.h"
+#include QMK_KEYBOARD_H
#include "led.h"
-// This is the 21-key keypad to 2x11 element matrix mapping
-#define LAYOUT( \
- KM_ESC, KM_TAB, KM_BSL, KM_ARR, \
- KM_NUM, KM_FSL, KM_AST, KM_MIN, \
- KM___7, KM___8, KM___9, KM_EQU, \
- KM___4, KM___5, KM___6, KM_PLS, \
- KM___1, KM___2, KM___3, ___ENT, \
- KM___0, _____0, KM_DOT, KM_ENT \
-) { \
- { KM_ESC, KM_TAB, KM_BSL, KM_ARR }, \
- { KM_NUM, KM_FSL, KM_AST, KM_MIN }, \
- { KM___7, KM___8, KM___9, KM_EQU }, \
- { KM___4, KM___5, KM___6, KM_PLS }, \
- { KM___1, KM___2, KM___3, KC_NO }, \
- { KM___0, KC_NO, KM_DOT, KM_ENT } \
-}
-
-#define LAYER_BASE 0
-#define LAYER_EDIT 1
-#define LAYER_FUNCTION 2
-
-#define MACRO_COPY_CUT 0
-#define MACRO_SHIFT_CONTROL 1
-#define MACRO_CONTROL_ALT 2
+enum layers {
+ LAYER_BASE,
+ LAYER_EDIT,
+ LAYER_FUNCTION
+};
-#define M_COPY KC_FN5
-#define M_SHFCT KC_FN6
-#define M_CTALT KC_FN7
+enum custom_keycodes {
+ M_COPY = SAFE_RANGE, // KC_FN5: MACRO_COPY_CUT
+ M_SHFCT, // KC_FN6: MACRO_SHIFT_CONTROL
+ M_CTALT // KC_FN7: MACRO_CONTROL_ALT
+};
#define SC_UNDO LCTL(KC_Z)
#define SC_REDO LCTL(KC_Y)
@@ -42,13 +25,10 @@
#define SC_ACLS LALT(KC_F4)
#define SC_CCLS LCTL(KC_F4)
-#define _______ KC_TRNS
-#define XXXXXXX KC_NO
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[LAYER_BASE] = LAYOUT( \
- KC_ESC, KC_TAB, KC_BSLS, KC_FN0, \
+ KC_ESC, KC_TAB, KC_BSLS, MO(2), \
KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS, \
KC_P7, KC_P8, KC_P9, KC_PEQL, \
KC_P4, KC_P5, KC_P6, KC_PPLS, \
@@ -57,15 +37,15 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[LAYER_EDIT] = LAYOUT( \
KC_ESC, KC_TAB, KC_SPC, _______, \
- KC_FN1, SC_PSTE, SC_REDO, SC_UNDO, \
+ TG(1), SC_PSTE, SC_REDO, SC_UNDO, \
KC_HOME, KC_UP, KC_PGUP, KC_LALT, \
KC_LEFT, M_COPY, KC_RGHT, KC_LCTL, \
KC_END, KC_DOWN, KC_PGDN, XXXXXXX, \
- KC_BSPC, KC_PENT, KC_DEL, M_SHFCT),
+ KC_BSPC, KC_PENT, KC_DEL, M_SHFCT ),
[LAYER_FUNCTION] = LAYOUT( \
- KC_FN2, KC_FN3, KC_FN4, _______, \
- KC_FN1, _______, _______, _______, \
+ BL_TOGG, BL_INC, BL_DEC, _______, \
+ TG(1), _______, _______, _______, \
_______, _______, _______, _______, \
_______, _______, _______, _______, \
_______, _______, _______, XXXXXXX, \
@@ -74,68 +54,46 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
};
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_LAYER_MOMENTARY(LAYER_FUNCTION),
- [1] = ACTION_LAYER_TOGGLE(LAYER_EDIT),
- [2] = ACTION_BACKLIGHT_TOGGLE(),
- [3] = ACTION_BACKLIGHT_INCREASE(),
- [4] = ACTION_BACKLIGHT_DECREASE(),
- [5] = ACTION_MACRO_TAP(MACRO_COPY_CUT),
- [6] = ACTION_MACRO_TAP(MACRO_SHIFT_CONTROL),
- [7] = ACTION_MACRO_TAP(MACRO_CONTROL_ALT),
-
-};
-
-
-void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
-}
+bool process_record_user(uint16_t keycode, keyrecord_t * record) {
+ // MACRODOWN only works in this function
+ switch (keycode) {
+
+ case M_COPY:
+ if (record->event.pressed) {
+ register_code(KC_LCTL);
+ if (record->tap.count == 1) {
+ register_code(KC_C);
+ unregister_code(KC_C);
+ } else if (record->tap.count == 2) {
+ register_code(KC_X);
+ unregister_code(KC_X);
+ }
+ unregister_code(KC_LCTL);
+ }
+ break;
+ case M_SHFCT:
+ if (record->event.pressed) {
+ if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT));
+ if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL));
+ if (record->tap.count == 3) register_code(KC_PENT);;
+ } else {
+ unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL));
+ unregister_code(KC_PENT);
+ }
+ break;
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
-{
- // MACRODOWN only works in this function
- switch (id) {
-
- case MACRO_COPY_CUT:
- if (record->event.pressed) {
- register_code(KC_LCTL);
- if (record->tap.count == 1) {
- register_code(KC_C);
- unregister_code(KC_C);
- }
- else if (record->tap.count == 2) {
- register_code(KC_X);
- unregister_code(KC_X);
- }
- unregister_code(KC_LCTL);
- }
- break;
-
- case MACRO_SHIFT_CONTROL:
- if (record->event.pressed) {
- if (record->tap.count <= 2) register_mods(MOD_BIT(KC_LSFT));
- if (record->tap.count == 2) register_mods(MOD_BIT(KC_LCTL));
- if (record->tap.count == 3) register_code(KC_PENT);;
- }
- else {
- unregister_mods(MOD_BIT(KC_LSFT) | MOD_BIT(KC_LCTL));
- unregister_code(KC_PENT);
- }
- break;
-
- case MACRO_CONTROL_ALT:
- if (record->event.pressed) {
- if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL));
- if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT));
- }
- else {
- unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT));
- }
- break;
+ case M_CTALT:
+ if (record->event.pressed) {
+ if (record->tap.count < 2) register_mods(MOD_BIT(KC_LCTL));
+ if (record->tap.count >= 2) register_mods(MOD_BIT(KC_LALT));
+ } else {
+ unregister_mods(MOD_BIT(KC_LCTL) | MOD_BIT(KC_LALT));
}
+ break;
+ }
- return MACRO_NONE;
+ return true;
}
void led_set_user(uint8_t usb_led)
diff --git a/keyboards/handwired/arrow_pad/keymaps/pad_24/rules.mk b/keyboards/handwired/arrow_pad/keymaps/pad_24/rules.mk
index e31bfe1af..b305f8482 100644
--- a/keyboards/handwired/arrow_pad/keymaps/pad_24/rules.mk
+++ b/keyboards/handwired/arrow_pad/keymaps/pad_24/rules.mk
@@ -9,7 +9,7 @@ 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 this with audio at the same time.
+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
diff --git a/keyboards/handwired/arrow_pad/readme.md b/keyboards/handwired/arrow_pad/readme.md
index d0d172272..43a0e33c4 100644
--- a/keyboards/handwired/arrow_pad/readme.md
+++ b/keyboards/handwired/arrow_pad/readme.md
@@ -94,13 +94,13 @@ More info can be found on [GeekHack](https://geekhack.org/index.php?topic=73632.
The second ArrowPad was a conversion from a 21-key Genovation keypad. It used a 2 row x 11 column matrix.
```
-#define KEYMAP( \
+#define LAYOUT_pad21( \
KM_ESC, KM_TAB, KM_BSL, KM_ARR, \
KM_NUM, KM_FSL, KM_AST, KM_MIN, \
- KM___7, KM___8, KM___9, ___PLS, \
+ KM___7, KM___8, KM___9, \
KM___4, KM___5, KM___6, KM_PLS, \
- KM___1, KM___2, KM___3, ___ENT, \
- KM___0, _____0, KM_DOT, KM_ENT \
+ KM___1, KM___2, KM___3, \
+ KM___0, KM_DOT, KM_ENT \
) { \
{ KM_ESC, KM_TAB, KM_BSL, KM_ARR, KM___7, KM___8, KM___9, KM_PLS, KM___1, KM___2, KM___3, }, \
{ KM_NUM, KM_FSL, KM_AST, KM_MIN, KM___4, KM___5, KM___6, KM_ENT, KC_NO, KM___0, KM_DOT, }, \
@@ -119,7 +119,7 @@ Download or clone the whole firmware and navigate to the keyboards/arrow_pad fol
Depending on which keymap you would like to use, you will have to compile slightly differently.
### Default
-To build with the default keymap, simply run `make default`.
+To build with the default keymap, simply run `make handwired/arrow_pad:default`.
### Other Keymaps
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` in the keymaps folder, and see keymap document (you can find in top readme.md) and existent keymap files.
@@ -127,7 +127,7 @@ Several version of keymap are available in advance but you are recommended to de
To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
```
-$ make [default|pad_21|pad_24|<name>]
+$ make handwired/arrow_pad:[default|pad_21|pad_24|<name>]
```
Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
diff --git a/keyboards/handwired/atreus50/atreus50.h b/keyboards/handwired/atreus50/atreus50.h
index de06f255e..eb31ca1b8 100644
--- a/keyboards/handwired/atreus50/atreus50.h
+++ b/keyboards/handwired/atreus50/atreus50.h
@@ -5,7 +5,7 @@
// The first section contains all of the arguements
// The second converts the arguments into a two-dimensional array
-#define KEYMAP( \
+#define LAYOUT( \
k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
@@ -18,7 +18,7 @@
{ k30, k31, k32, k33, k34, k35, km1, k36, k37, k38, k39, k3a, k3b } \
}
-#define COMPACT_KEYMAP( \
+#define LAYOUT_kc( \
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, \
diff --git a/keyboards/handwired/atreus50/info.json b/keyboards/handwired/atreus50/info.json
new file mode 100644
index 000000000..4e3b4ac49
--- /dev/null
+++ b/keyboards/handwired/atreus50/info.json
@@ -0,0 +1,70 @@
+{
+ "keyboard_name": "Atreus50",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 15,
+ "height": 4.5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"Tab", "x":0, "y":0.5},
+ {"label":"Q", "x":1, "y":0.5},
+ {"label":"W", "x":2, "y":0.25},
+ {"label":"E", "x":3, "y":0},
+ {"label":"R", "x":4, "y":0.25},
+ {"label":"T", "x":5, "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.5},
+ {"label":"-", "x":14, "y":0.5},
+
+ {"label":"Ctrl/Esc", "x":0, "y":1.5},
+ {"label":"A", "x":1, "y":1.5},
+ {"label":"S", "x":2, "y":1.25},
+ {"label":"D", "x":3, "y":1},
+ {"label":"F", "x":4, "y":1.25},
+ {"label":"G", "x":5, "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.5},
+ {"label":"'", "x":14, "y":1.5},
+
+ {"label":"LShift", "x":0, "y":2.5},
+ {"label":"Z", "x":1, "y":2.5},
+ {"label":"X", "x":2, "y":2.25},
+ {"label":"C", "x":3, "y":2},
+ {"label":"V", "x":4, "y":2.25},
+ {"label":"B", "x":5, "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.5},
+ {"label":"Shift/Enter", "x":14, "y":2.5},
+
+ {"label":"`", "x":0, "y":3.5},
+ {"label":"LCtrl", "x":1, "y":3.5},
+ {"label":"LAlt", "x":2, "y":3.25},
+ {"label":"LGUI", "x":3, "y":3},
+ {"label":"Lower", "x":4, "y":3.25},
+ {"label":"Space", "x":5, "y":3.5},
+ {"label":"Fn", "x":6, "y":2.75, "h":1.5},
+
+ {"label":"RShift", "x":8, "y":2.75, "h":1.5},
+ {"label":"Back Space", "x":9, "y":3.5},
+ {"label":"Raise", "x":10, "y":3.25},
+ {"label":"Left", "x":11, "y":3},
+ {"label":"Down", "x":12, "y":3.25},
+ {"label":"Up", "x":13, "y":3.5},
+ {"label":"Right", "x":14, "y":3.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/atreus50/keymaps/ajp10304/config.h b/keyboards/handwired/atreus50/keymaps/ajp10304/config.h
index 6916d1a7d..f5e6bbabe 100644
--- a/keyboards/handwired/atreus50/keymaps/ajp10304/config.h
+++ b/keyboards/handwired/atreus50/keymaps/ajp10304/config.h
@@ -3,8 +3,6 @@
#include "../../config.h"
-#define PREVENT_STUCK_MODIFIERS
-
#undef MATRIX_ROW_PINS
#undef MATRIX_COL_PINS
diff --git a/keyboards/handwired/atreus50/keymaps/ajp10304/keymap.c b/keyboards/handwired/atreus50/keymaps/ajp10304/keymap.c
index 5b13224b0..1e53d050b 100644
--- a/keyboards/handwired/atreus50/keymaps/ajp10304/keymap.c
+++ b/keyboards/handwired/atreus50/keymaps/ajp10304/keymap.c
@@ -1,6 +1,4 @@
-#include "atreus50.h"
-#include "action_layer.h"
-#include "eeconfig.h"
+#include QMK_KEYBOARD_H
#include "keymap_uk.h"
extern keymap_config_t keymap_config;
@@ -37,10 +35,6 @@ enum planck_keycodes {
#include "dynamic_macro.h"
-// Fillers to make layering more clear
-#define _______ KC_TRNS
-#define XXXXXXX KC_NO
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Qwerty
@@ -54,7 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | Fn | Ctrl | Alt | GUI |Lower | Bksp | Ctrl | Alt |Space |Raise | Shift| MENU | Ctrl | Fn2 |
* `-------------------------------------------------------------------------------------------------'
*/
-[_QWERTY] = KEYMAP(
+[_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 ,
MT(MOD_LSFT, KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, MT(MOD_RSFT, KC_ENT) ,
KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSHIFT ,
@@ -72,7 +66,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | Fn | Ctrl | Alt | GUI |Lower | Bksp | Ctrl | Alt |Space |Mouse | MENU | Alt | Ctrl | Fn |
* `-------------------------------------------------------------------------------------------------'
*/
-[_FUNC] = KEYMAP(
+[_FUNC] = 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_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, UK_TILD, KC_INSERT ,
KC_LSHIFT, KC_NONUS_BSLASH, KC_GRAVE, KC_NONUS_HASH, KC_PAST, KC_MINS, KC_EQL, KC_BSLASH, KC_LBRC, KC_RBRC, KC_QUOT, MT(MOD_RSFT, KC_ENT) ,
@@ -90,7 +84,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | |Lower | Del | Ctrl | Alt |Space | | Next | Vol- | Vol+ | Play |
* `-------------------------------------------------------------------------------------------------'
*/
-[_LOWER] = KEYMAP(
+[_LOWER] = LAYOUT(
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, KC_BSPC ,
LSFT(KC_1), LSFT(KC_2), LSFT(KC_3), LSFT(KC_4), LSFT(KC_5), LSFT(KC_6), LSFT(KC_7), LSFT(KC_8), LSFT(KC_9), LSFT(KC_0), LCTL(KC_DEL), LCTL(KC_BSPC) ,
KC_LSPO, KC_NONUS_BSLASH, KC_GRAVE, KC_NONUS_HASH, KC_QUOT, KC_MINS, KC_EQL, KC_NONUS_HASH, KC_LBRC, KC_RBRC, KC_QUOT, MT(MOD_RSFT, KC_ENT) ,
@@ -108,7 +102,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | Mouse| | | | | Alt | Ctrl | Alt |Enter |Raise | | | | |
* `-------------------------------------------------------------------------------------------------'
*/
-[_RAISE] = KEYMAP(
+[_RAISE] = LAYOUT(
KC_GRV, XXXXXXX, M(1), KC_LBRC, KC_RBRC, XXXXXXX, XXXXXXX, KC_PGUP, KC_HOME, KC_PGDOWN, XXXXXXX, KC_PSCREEN ,
KC_GRV, XXXXXXX, XXXXXXX, LSFT(KC_9), LSFT(KC_0), XXXXXXX, XXXXXXX, KC_HOME, KC_UP, KC_END, XXXXXXX, LCTL(LSFT(KC_EQL)) ,
_______, XXXXXXX, XXXXXXX, LSFT(KC_LBRC), LSFT(KC_RBRC), XXXXXXX, LCTL(KC_LEFT), KC_LEFT, KC_DOWN, KC_RIGHT, LCTL(KC_RIGHT), LCTL(KC_MINS) ,
@@ -126,11 +120,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | | | |
* `-------------------------------------------------------------------------------------------------'
*/
-[_ADJUST] = KEYMAP(
+[_ADJUST] = LAYOUT(
M(0), RESET, QWERTY, _______, _______, DYN_REC_START1, DYN_REC_START2, _______, _______, _______, _______, KC_DEL ,
KC_CAPS, _______, _______, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, KC_AUDIO_MUTE, KC_AUDIO_VOL_UP, KC_MEDIA_PLAY_PAUSE, _______, _______ ,
TG(_MAC), _______, _______, _______, _______, DYN_REC_STOP, DYN_REC_STOP, KC_MEDIA_PREV_TRACK, KC_AUDIO_VOL_DOWN, KC_MEDIA_NEXT_TRACK, _______, _______ ,
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/* Mouse
@@ -144,7 +138,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | | | |
* `-------------------------------------------------------------------------------------------------'
*/
-[_MOUSE] = KEYMAP(
+[_MOUSE] = LAYOUT(
KC_ESC , _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ,
KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, _______, _______, _______, _______, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2, _______, _______ ,
KC_MS_ACCEL0, KC_MS_ACCEL1, KC_MS_ACCEL2, _______, _______, _______, _______, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, _______, _______ ,
@@ -162,42 +156,42 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | | | |
* `-------------------------------------------------------------------------------------------------'
*/
-[_FUNC2] = KEYMAP(
+[_FUNC2] = LAYOUT(
_______, _______, M(1), _______, _______, _______, M(5), _______, _______, _______, _______, _______,
_______, _______, M(3), M(7), _______, _______, _______, M(10), _______, _______, _______, _______,
_______, LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V), _______, _______, _______, _______, _______, _______, M(98) ,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
-[_MAC] = KEYMAP(
+[_MAC] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
MFNC, _______, _______, _______, MLWR, _______, _______, _______, _______, MRSE, _______, _______, _______, MFNC2
),
-[_MLWR] = KEYMAP(
+[_MLWR] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
-[_MRSE] = KEYMAP(
+[_MRSE] = LAYOUT(
_______, _______, M(2), _______, _______, _______, _______, _______, _______, _______, _______, _______ ,
_______, _______, _______, _______, _______, _______, _______, LCTL(KC_A), _______, LCTL(KC_E), _______, LGUI(KC_EQL) ,
_______, _______, _______, _______, _______, _______, LALT(KC_LEFT), _______, _______, _______, LALT(KC_RIGHT), LGUI(KC_MINS) ,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
-[_MFNC] = KEYMAP(
+[_MFNC] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, LGUI(KC_PENT) ,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ ,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
-[_MFNC2] = KEYMAP(
+[_MFNC2] = LAYOUT(
_______, _______, M(2), _______, _______, _______, M(6), _______, _______, _______, _______, _______,
_______, _______, M(4), M(8), _______, _______, _______, M(10), _______, _______, _______, _______,
_______, LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V), _______, _______, _______, _______, _______, _______, M(99) ,
diff --git a/keyboards/handwired/atreus50/keymaps/default/keymap.c b/keyboards/handwired/atreus50/keymaps/default/keymap.c
index 21d91a879..97b90a6db 100644
--- a/keyboards/handwired/atreus50/keymaps/default/keymap.c
+++ b/keyboards/handwired/atreus50/keymaps/default/keymap.c
@@ -1,9 +1,4 @@
-#include "atreus50.h"
-#include "action_layer.h"
-#include "eeconfig.h"
-#ifdef AUDIO_ENABLE
- #include "audio.h"
-#endif
+#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.
@@ -28,86 +23,52 @@ enum custom_keycodes {
};
// Fillers to make layering more clear
-#define _______ KC_TRNS
-#define XXXXXXX KC_NO
-#define KC_X0 MT(MOD_LCTL, KC_ESC) // Hold for Left Ctrl, Tap for ESC
-#define KC_X1 LOWER
-#define KC_X2 RAISE
-#define KC_X3 MO(_MOVEMENT)
-#define KC_X4 MT(MOD_LSFT, KC_ENT) // Hold for Left Shift, Tap for Enter
+#define X0 MT(MOD_LCTL, KC_ESC) // Hold for Left Ctrl, Tap for ESC
+#define X3 MO(_MOVEMENT)
+#define X4 MT(MOD_LSFT, KC_ENT) // Hold for Left Shift, Tap for Enter
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [_QWERTY] = COMPACT_KEYMAP(
- //,----+----+----+----+----+----. ,----+----+----+----+----+----.
- TAB , Q , W , E , R , T , Y , U , I , O , P ,MINS,
- //|----+----+----+----+----+----| |----+----+----+----+----+----|
- X0 , A , S , D , F , G , H , J , K , L ,SCLN,QUOT,
- //|----+----+----+----+----+----| |----+----+----+----+----+----|
- LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH, X4 ,
- //|----+----+----+----+----+----|----+----|----+----+----+----+----+----|
- GRV ,LCTL,LALT,LGUI, X1 ,SPC , X3 ,RSFT,BSPC, X2 ,LEFT,DOWN, UP ,RGHT
- //`----+----+----+----+----+----+----+----+----+----+----+----+----+----'
+ [_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_MINS,
+ X0, 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, X4,
+ KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, X3, KC_RSFT, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
- [_COLEMAK] = COMPACT_KEYMAP(
- //,----+----+----+----+----+----. ,----+----+----+----+----+----.
- TAB , Q , W , F , P , G , J , L , U , Y ,SCLN,MINS,
- //|----+----+----+----+----+----| |----+----+----+----+----+----|
- X0 , A , R , S , T , D , H , N , E , I , O ,QUOT,
- //|----+----+----+----+----+----| |----+----+----+----+----+----|
- LSFT, Z , X , C , V , B , K , M ,COMM,DOT ,SLSH, X4 ,
- //|----+----+----+----+----+----|----+----|----+----+----+----+----+----|
- GRV ,LCTL,LALT,LGUI, X1 ,SPC , X3 ,RSFT,BSPC, X2 ,LEFT,DOWN, UP ,RGHT
- //`----+----+----+----+----+----+----+----+----+----+----+----+----+----'
+ [_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_MINS,
+ X0, 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, X4,
+ KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, X3, KC_RSFT, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
- [_DVORAK] = COMPACT_KEYMAP(
- //,----+----+----+----+----+----. ,----+----+----+----+----+----.
- TAB ,QUOT,COMM,DOT , P , Y , F , G , C , R , L ,MINS,
- //|----+----+----+----+----+----| |----+----+----+----+----+----|
- X0 , A , O , E , U , I , D , H , T , N , S ,SLSH,
- //|----+----+----+----+----+----| |----+----+----+----+----+----|
- LSFT,SCLN, Q , J , K , X , B , M , W , V , Z , X4 ,
- //|----+----+----+----+----+----|----+----|----+----+----+----+----+----|
- GRV ,LCTL,LALT,LGUI, X1 ,SPC , X3 ,RSFT,BSPC, X2 ,LEFT,DOWN, UP ,RGHT
- //`----+----+----+----+----+----+----+----+----+----+----+----+----+----'
+ [_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_MINS,
+ X0, 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, X4,
+ KC_GRV, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, X3, KC_RSFT, KC_BSPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT
),
- [_LOWER] = COMPACT_KEYMAP(
- //,----+----+----+----+----+----. ,----+----+----+----+----+----.
- TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN,DEL ,
- //|----+----+----+----+----+----| |----+----+----+----+----+----|
- DEL , F1 , F2 , F3 , F4 , F5 , F6 ,UNDS,PLUS,LCBR,RCBR,PIPE,
- //|----+----+----+----+----+----| |----+----+----+----+----+----|
- , F7 , F8 , F9 ,F10 ,F11 , F12 ,END , , , , ,
- //|----+----+----+----+----+----|----+----|----+----+----+----+----+----|
- , , , , , , , , , ,MNXT,VOLD,VOLU,MPLY
- //`----+----+----+----+----+----+----+----+----+----+----+----+----+----'
+ [_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_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_END, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
),
- [_RAISE] = COMPACT_KEYMAP(
- //,----+----+----+----+----+----. ,----+----+----+----+----+----.
- GRV , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,DEL ,
- //|----+----+----+----+----+----| |----+----+----+----+----+----|
- DEL , F1 , F2 , F3 , F4 , F5 , F6 ,MINS,EQL ,LBRC,RBRC,BSLS,
- //|----+----+----+----+----+----| |----+----+----+----+----+----|
- , F7 , F8 , F9 ,F10 ,F11 , F12 ,NUHS,NUBS, , , ,
- //|----+----+----+----+----+----|----+----|----+----+----+----+----+----|
- , , , , , , , , , ,MNXT,VOLD,VOLU,MPLY
- //`----+----+----+----+----+----+----+----+----+----+----+----+----+----'
+ [_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_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
),
- [_MOVEMENT] = COMPACT_KEYMAP(
- //,----+----+----+----+----+----. ,----+----+----+----+----+----.
- TILD,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR, UP ,LPRN,RPRN,DEL ,
- //|----+----+----+----+----+----| |----+----+----+----+----+----|
- DEL , F1 , F2 , F3 , F4 , F5 , F6 ,LEFT,DOWN,RGHT,RCBR,PIPE,
- //|----+----+----+----+----+----| |----+----+----+----+----+----|
- , F7 , F8 , F9 ,F10 ,F11 , F12 ,END , , , , ,
- //|----+----+----+----+----+----|----+----|----+----+----+----+----+----|
- , , , , , , , ,PGDN,PGUP,MNXT,VOLD,VOLU,MPLY
- //`----+----+----+----+----+----+----+----+----+----+----+----+----+----'
+ [_MOVEMENT] = LAYOUT(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_UP, KC_LPRN, KC_RPRN, KC_DEL,
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_LEFT, KC_DOWN, KC_RGHT, KC_RCBR, KC_PIPE,
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_END, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PGDN, KC_PGUP, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY
),
/* Adjust (Lower + Raise)
@@ -121,7 +82,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | | | |
* `-------------------------------------------------------------------------------------------------'
*/
- [_ADJUST] = KEYMAP( \
+ [_ADJUST] = LAYOUT( \
_______, RESET, RGB_TOG, RGB_MOD, RGB_HUD, RGB_HUI, RGB_SAD, RGB_SAI, RGB_VAD, RGB_VAI, _______, KC_DEL, \
_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, _______, _______, \
_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, \
diff --git a/keyboards/handwired/atreus50/readme.md b/keyboards/handwired/atreus50/readme.md
index 0c24f67db..9449d66e5 100644
--- a/keyboards/handwired/atreus50/readme.md
+++ b/keyboards/handwired/atreus50/readme.md
@@ -1,7 +1,9 @@
-Handwired Atreus50
-==================
+# Handwired Atreus50
-This firmware is for a Handwired Atreus50 using an Arduino Pro Micro.
+This firmware is for a handwired Atreus50 using an Arduino Pro Micro.
+
+Keyboard Maintainer: [The QMK Community](https://github.com/qmk)
+Hardware Supported: Arduino Pro Micro
## Pinout
@@ -11,6 +13,12 @@ The following pins are used:
## Compiling and loading the firmware
-To build the firmware, run `make`.
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/atreus50:default
+
+To flash the firmware onto the microcontroller, run `make avrdude`, and press the reset button.
+
+ make handwired/atreus50:default:avrdude
-To flash the firemware onto the microcontroller, run `make avrdude`, and press the reset button.
+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/atreus50/rules.mk b/keyboards/handwired/atreus50/rules.mk
index 2e2d48f6a..21c4704e0 100644
--- a/keyboards/handwired/atreus50/rules.mk
+++ b/keyboards/handwired/atreus50/rules.mk
@@ -63,7 +63,7 @@ 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 this with audio at the same time.
+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
diff --git a/keyboards/handwired/bluepill/bluepill.c b/keyboards/handwired/bluepill/bluepill.c
new file mode 100644
index 000000000..85c92dfe9
--- /dev/null
+++ b/keyboards/handwired/bluepill/bluepill.c
@@ -0,0 +1 @@
+#include "bluepill.h" \ No newline at end of file
diff --git a/keyboards/handwired/bluepill/bluepill.h b/keyboards/handwired/bluepill/bluepill.h
new file mode 100644
index 000000000..a686d155c
--- /dev/null
+++ b/keyboards/handwired/bluepill/bluepill.h
@@ -0,0 +1,54 @@
+#pragma once
+
+#include "quantum.h"
+#include "led.h"
+
+/* ANSI LAYOUT
+ ESC| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10| F11| F12| PSC| PGU| PGD
+ GRA| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ' | ¡ | BCKS | DEL
+ TAB| Q | W | E | R | T | Y | U | I | O | P | ` | + | | HOM
+ CAP| A | S | D | F | G | H | J | K | L | Ñ | ´ | Ç | ENTER | END
+ LSI| (<)| Z | X | C | V | B | N | M | , | . | - | RSHIF | UP | FNL
+ LCT| WIN| ALT| ESPACE | ALG| FN | RCT| LEF| DOW| RIG
+*/
+
+#define LAYOUT_seventy_ansi( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \
+ K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, \
+ K50, K51, K52, K53, K54, K55, K56, K57, K58, K59 \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0F }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K0E, K1E }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K1D, K2D }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \
+ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E }, \
+ { K50, K51, K52, KC_NO, KC_NO, KC_NO, K53, KC_NO, KC_NO,K54, K55, K56, K57, K58, K59 } \
+}
+
+/* ISO LAYOUT
+ ESC| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10| F11| F12| PSC| PGU| PGD
+ GRA| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ' | ¡ | BCKS | DEL
+ TAB| Q | W | E | R | T | Y | U | I | O | P | ` | + | | HOM
+ CAP| A | S | D | F | G | H | J | K | L | Ñ | ´ | Ç | ENTER | END
+ LSI| < | Z | X | C | V | B | N | M | , | . | - | RSHIF | UP | FNL
+ LCT| WIN| ALT| ESPACE | ALG| FN | RCT| LEF| DOW| RIG
+*/
+
+#define LAYOUT_seventy_iso( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E, \
+ K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, \
+ K50, K51, K52, K53, K54, K55, K56, K57, K58, K59 \
+) { \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0F }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K0E, K1E }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K1D, K2D }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \
+ { K40, K41, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E }, \
+ { K50, K51, K52, KC_NO, KC_NO, KC_NO, K53, KC_NO, KC_NO,K54, K55, K56, K57, K58, K59 } \
+}
diff --git a/keyboards/handwired/bluepill/bluepill70/bluepill70.c b/keyboards/handwired/bluepill/bluepill70/bluepill70.c
new file mode 100644
index 000000000..511c602d4
--- /dev/null
+++ b/keyboards/handwired/bluepill/bluepill70/bluepill70.c
@@ -0,0 +1 @@
+#include "bluepill70.h" \ No newline at end of file
diff --git a/keyboards/handwired/bluepill/bluepill70/bluepill70.h b/keyboards/handwired/bluepill/bluepill70/bluepill70.h
new file mode 100644
index 000000000..8a313cc50
--- /dev/null
+++ b/keyboards/handwired/bluepill/bluepill70/bluepill70.h
@@ -0,0 +1,4 @@
+#pragma once
+#include "bluepill.h"
+// Modified by Xydane
+// #define LAYOUT(k00) {{ k00 }} \ No newline at end of file
diff --git a/keyboards/handwired/bluepill/bluepill70/bootloader_defs.h b/keyboards/handwired/bluepill/bluepill70/bootloader_defs.h
new file mode 100644
index 000000000..0f45203cb
--- /dev/null
+++ b/keyboards/handwired/bluepill/bluepill70/bootloader_defs.h
@@ -0,0 +1,10 @@
+/* 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 an USB bootloader in ROM (only serial),
+// so setting anything here does not make much sense
+// #define STM32_BOOTLOADER_ADDRESS 0x1FFFC800
diff --git a/keyboards/handwired/bluepill/bluepill70/chconf.h b/keyboards/handwired/bluepill/bluepill70/chconf.h
new file mode 100644
index 000000000..dfb1f9dfb
--- /dev/null
+++ b/keyboards/handwired/bluepill/bluepill70/chconf.h
@@ -0,0 +1,524 @@
+/*
+ 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.
+*/
+
+/**
+ * @file 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_
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System time counter resolution.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#define CH_CFG_ST_RESOLUTION 16
+
+/**
+ * @brief System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ * setting also defines the system tick time unit.
+ */
+#define CH_CFG_ST_FREQUENCY 2000
+
+/**
+ * @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.
+ */
+#define CH_CFG_ST_TIMEDELTA 2
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @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.
+ */
+#define CH_CFG_TIME_QUANTUM 0
+
+/**
+ * @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.
+ */
+#define CH_CFG_MEMCORE_SIZE 0
+
+/**
+ * @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.
+ */
+#define CH_CFG_NO_IDLE_THREAD FALSE
+
+/* Use __WFI in the idle thread for waiting. Does lower the power
+ * consumption. */
+#define CORTEX_ENABLE_WFI_IDLE TRUE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @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.
+ */
+#define CH_CFG_OPTIMIZE_SPEED TRUE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @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.
+ */
+#define CH_CFG_USE_TM FALSE
+
+/**
+ * @brief Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_REGISTRY TRUE
+
+/**
+ * @brief Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_WAITEXIT TRUE
+
+/**
+ * @brief Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_SEMAPHORES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
+
+/**
+ * @brief Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_MUTEXES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_CONDVARS TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
+
+/**
+ * @brief Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_EVENTS TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
+
+/**
+ * @brief Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_MESSAGES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MAILBOXES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MEMCORE TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_HEAP TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MEMPOOLS FALSE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_DYNAMIC FALSE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Debug option, kernel statistics.
+ *
+ * @note The default is @p FALSE.
+ */
+#define CH_DBG_STATISTICS FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_SYSTEM_STATE_CHECK FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_ENABLE_CHECKS FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_ENABLE_ASSERTS FALSE
+
+/**
+ * @brief Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
+
+/**
+ * @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.
+ */
+#define CH_DBG_TRACE_BUFFER_SIZE 128
+
+/**
+ * @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.
+ */
+#define CH_DBG_ENABLE_STACK_CHECK FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_FILL_THREADS FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_THREADS_PROFILING FALSE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @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 chThdInit() API.
+ *
+ * @note It is invoked from within @p chThdInit() 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/bluepill/bluepill70/config.h b/keyboards/handwired/bluepill/bluepill70/config.h
new file mode 100644
index 000000000..87fd74633
--- /dev/null
+++ b/keyboards/handwired/bluepill/bluepill70/config.h
@@ -0,0 +1,25 @@
+#pragma once
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x6464
+#define DEVICE_VER 0x0001
+/* in python2: list(u"whatever".encode('utf-16-le')) */
+/* at most 32 characters or the ugly hack in usb_main.c works */
+
+// Modified by Xydane
+#define MANUFACTURER "QMK"
+#define USBSTR_MANUFACTURER 'T', '\x00', 'M', '\x00', 'K', '\x00', ' ', '\x00', '\xc6', '\x00'
+#define PRODUCT "BluePill70"
+#define USBSTR_PRODUCT 'C', '\x00', 'h', '\x00', 'i', '\x00', 'b', '\x00', 'i', '\x00', 'O', '\x00', 'S', '\x00', ' ', '\x00', 'Q', '\x00', 'M', '\x00', 'K', '\x00'
+#define DESCRIPTION "QMK keyboard firmware with ChibiOS"
+
+/* key matrix size */
+// Modified by Xydane
+#define MATRIX_ROWS 6
+#define MATRIX_COLS 15
+#define DIODE_DIRECTION COL2ROW
+
+// Iso fix for Space Cadet, comment for ANSI layouts
+#define LSPO_KEY KC_8
+#define RSPC_KEY KC_9 \ No newline at end of file
diff --git a/keyboards/handwired/bluepill/bluepill70/flash.sh b/keyboards/handwired/bluepill/bluepill70/flash.sh
new file mode 100644
index 000000000..d001ff007
--- /dev/null
+++ b/keyboards/handwired/bluepill/bluepill70/flash.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+Arduino_STM32_usb_hid/tools/linux/maple_upload ttyACM0 2 1EAF:0003 build/ch.bin \ No newline at end of file
diff --git a/keyboards/handwired/bluepill/bluepill70/halconf.h b/keyboards/handwired/bluepill/bluepill70/halconf.h
new file mode 100644
index 000000000..5be284cd3
--- /dev/null
+++ b/keyboards/handwired/bluepill/bluepill70/halconf.h
@@ -0,0 +1,354 @@
+/*
+ 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.
+*/
+
+/**
+ * @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_
+
+#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 DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC FALSE
+#endif
+
+/**
+ * @brief Enables the EXT subsystem.
+ */
+#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__)
+#define HAL_USE_EXT 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 SPI subsystem.
+ */
+#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_SPI 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
+
+/*===========================================================================*/
+/* 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
+
+/*===========================================================================*/
+/* 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 an event sources for incoming packets.
+ */
+#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
+
+/*===========================================================================*/
+/* 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 64 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 64 bytes for both the transmission and receive
+ * buffers.
+ */
+// Modified by Xydane
+#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_SIZE 256
+#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 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
+
+/*===========================================================================*/
+/* 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
+
+#endif /* _HALCONF_H_ */
+
+/** @} */
diff --git a/keyboards/handwired/bluepill/bluepill70/info.json b/keyboards/handwired/bluepill/bluepill70/info.json
new file mode 100644
index 000000000..3f08b50e5
--- /dev/null
+++ b/keyboards/handwired/bluepill/bluepill70/info.json
@@ -0,0 +1,187 @@
+{
+ "keyboard_name": "BluePill 70",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 16,
+ "height": 6,
+ "layouts": {
+ "LAYOUT_seventy_ansi": {
+ "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":"Home", "x":14, "y":0},
+ {"label":"End", "x":15, "y":0},
+ {"label":"`", "x":0, "y":1},
+ {"label":"1", "x":1, "y":1},
+ {"label":"2", "x":2, "y":1},
+ {"label":"3", "x":3, "y":1},
+ {"label":"4", "x":4, "y":1},
+ {"label":"5", "x":5, "y":1},
+ {"label":"6", "x":6, "y":1},
+ {"label":"7", "x":7, "y":1},
+ {"label":"8", "x":8, "y":1},
+ {"label":"9", "x":9, "y":1},
+ {"label":"0", "x":10, "y":1},
+ {"label":"-", "x":11, "y":1},
+ {"label":"=", "x":12, "y":1},
+ {"label":"Backspace", "x":13, "y":1, "w":2},
+ {"label":"Delete", "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":"Page Up", "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":"\\", "x":13.5, "y":2, "w":1.5},
+ {"label":"Page Down", "x":15, "y":3},
+ {"label":"Shift", "x":0, "y":4, "w":1.25},
+ {"label":"ISO \\", "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":"Up", "x":14, "y":4},
+ {"label":"TT(2)", "x":15, "y":4},
+ {"label":"Ctrl", "x":0, "y":5, "w":1.25},
+ {"label":"GUI", "x":1.25, "y":5, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":5, "w":1.25},
+ {"label":"Space", "x":3.75, "y":5, "w":6.25},
+ {"label":"Alt", "x":10, "y":5},
+ {"label":"Fn", "x":11, "y":5},
+ {"label":"Ctrl", "x":12, "y":5},
+ {"label":"Left", "x":13, "y":5},
+ {"label":"Down", "x":14, "y":5},
+ {"label":"Right", "x":15, "y":5}
+ ]
+ },
+ "LAYOUT_seventy_iso": {
+ "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":"Home", "x":14, "y":0},
+ {"label":"End", "x":15, "y":0},
+ {"label":"`", "x":0, "y":1},
+ {"label":"1", "x":1, "y":1},
+ {"label":"2", "x":2, "y":1},
+ {"label":"3", "x":3, "y":1},
+ {"label":"4", "x":4, "y":1},
+ {"label":"5", "x":5, "y":1},
+ {"label":"6", "x":6, "y":1},
+ {"label":"7", "x":7, "y":1},
+ {"label":"8", "x":8, "y":1},
+ {"label":"9", "x":9, "y":1},
+ {"label":"0", "x":10, "y":1},
+ {"label":"-", "x":11, "y":1},
+ {"label":"=", "x":12, "y":1},
+ {"label":"Backspace", "x":13, "y":1, "w":2},
+ {"label":"Delete", "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":"Page Up", "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":"ISO #", "x":12.75, "y":3},
+ {"label":"Enter", "x":13.75, "y":2, "w":1.25, "h":2},
+ {"label":"Page Down", "x":15, "y":3},
+ {"label":"Shift", "x":0, "y":4, "w":1.25},
+ {"label":"ISO \\", "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":"Up", "x":14, "y":4},
+ {"label":"TT(2)", "x":15, "y":4},
+ {"label":"Ctrl", "x":0, "y":5, "w":1.25},
+ {"label":"GUI", "x":1.25, "y":5, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":5, "w":1.25},
+ {"label":"Space", "x":3.75, "y":5, "w":6.25},
+ {"label":"Alt", "x":10, "y":5},
+ {"label":"Fn", "x":11, "y":5},
+ {"label":"Ctrl", "x":12, "y":5},
+ {"label":"Left", "x":13, "y":5},
+ {"label":"Down", "x":14, "y":5},
+ {"label":"Right", "x":15, "y":5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/bluepill/bluepill70/led.c b/keyboards/handwired/bluepill/bluepill70/led.c
new file mode 100644
index 000000000..5c557bbee
--- /dev/null
+++ b/keyboards/handwired/bluepill/bluepill70/led.c
@@ -0,0 +1,38 @@
+/*
+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/>.
+*/
+
+#include "hal.h"
+#include "led.h"
+
+
+void led_set(uint8_t usb_led){
+ if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
+ /* generic STM32F103C8T6 board */
+ #ifdef BOARD_GENERIC_STM32_F103
+ palClearPad(GPIOC, 13);
+ #endif
+ } else {
+ /* generic STM32F103C8T6 board */
+ #ifdef BOARD_GENERIC_STM32_F103
+ palSetPad(GPIOC, 13);
+ #endif
+ }
+}
+
+// inline void gh60_caps_led_off(void) { DDRB &= ~(1<<2); PORTB &= ~(1<<2); }
+
+// inline void gh60_caps_led_on(void) { DDRB |= (1<<2); PORTB &= ~(1<<2); } \ No newline at end of file
diff --git a/keyboards/handwired/bluepill/bluepill70/matrix.c b/keyboards/handwired/bluepill/bluepill70/matrix.c
new file mode 100644
index 000000000..b2c38e522
--- /dev/null
+++ b/keyboards/handwired/bluepill/bluepill70/matrix.c
@@ -0,0 +1,225 @@
+/*
+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/>.
+*/
+
+#include "ch.h"
+#include "hal.h"
+
+/*
+ * scan matrix
+ */
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+#include "wait.h"
+
+//#include "pwm.c"
+
+#ifndef DEBOUNCE
+# define DEBOUNCE 5
+#endif
+static uint8_t debouncing = DEBOUNCE;
+
+/* 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);
+
+inline uint8_t matrix_rows(void){
+ return MATRIX_ROWS;
+}
+
+inline uint8_t matrix_cols(void){
+ return MATRIX_COLS;
+}
+
+/* generic STM32F103C8T6 board */
+#ifdef BOARD_GENERIC_STM32_F103
+// This could be removed, only used now in matrix_init()
+#define LED_ON() do { palClearPad(GPIOA, 1) ;} while (0)
+#define LED_OFF() do { palSetPad(GPIOA, 1); } while (0)
+#endif
+
+__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) {
+}
+
+void matrix_init(void)
+{
+ // initialize row and col
+ unselect_rows();
+ init_cols();
+ // initialize matrix state: all keys off
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+ matrix[i] = 0;
+ matrix_debouncing[i] = 0;
+ }
+ //debug
+ debug_matrix = true;
+ LED_ON();
+ wait_ms(500);
+ LED_OFF();
+
+ matrix_init_quantum();
+}
+
+uint8_t matrix_scan(void){
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ select_row(i);
+ wait_us(30); // without this wait read unstable value.
+ matrix_row_t cols = read_cols();
+ if (matrix_debouncing[i] != cols) {
+ matrix_debouncing[i] = cols;
+ if (debouncing) {
+ debug("bounce!: "); debug_hex(debouncing); debug("\n");
+ }
+ debouncing = DEBOUNCE;
+ }
+ unselect_rows();
+ }
+
+ if (debouncing) {
+ if (--debouncing) {
+ wait_ms(1);
+ } else {
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ matrix[i] = matrix_debouncing[i];
+ }
+ }
+ }
+ 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("\nr/c 0123456789ABCDEF\n");
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ phex(row); print(": ");
+ pbin_reverse16(matrix_get_row(row));
+ print("\n");
+ }
+}
+
+/* Column pin configuration
+ */
+// Modified by Xydane
+static void init_cols(void){
+ palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_PULLUP);
+ palSetPadMode(GPIOA, 15, PAL_MODE_INPUT_PULLUP);
+ palSetPadMode(GPIOA, 10, PAL_MODE_INPUT_PULLUP);
+ palSetPadMode(GPIOA, 9, PAL_MODE_INPUT_PULLUP);
+ palSetPadMode(GPIOA, 8, PAL_MODE_INPUT_PULLUP);
+ palSetPadMode(GPIOB, 15, PAL_MODE_INPUT_PULLUP);
+ palSetPadMode(GPIOB, 14, PAL_MODE_INPUT_PULLUP);
+ palSetPadMode(GPIOB, 13, PAL_MODE_INPUT_PULLUP);
+ palSetPadMode(GPIOB, 12, PAL_MODE_INPUT_PULLUP);
+ palSetPadMode(GPIOB, 11, PAL_MODE_INPUT_PULLUP);
+ palSetPadMode(GPIOB, 10, PAL_MODE_INPUT_PULLUP);
+ palSetPadMode(GPIOB, 1, PAL_MODE_INPUT_PULLUP);
+ palSetPadMode(GPIOB, 0, PAL_MODE_INPUT_PULLUP);
+ palSetPadMode(GPIOA, 7, PAL_MODE_INPUT_PULLUP);
+ palSetPadMode(GPIOA, 6, PAL_MODE_INPUT_PULLUP);
+}
+
+/* Returns status of switches(1:on, 0:off) */
+// Modified by Xydane
+static matrix_row_t read_cols(void){
+ return ((palReadPad(GPIOA, 5)==PAL_HIGH) ? 0 : (1<<0))
+ | ((palReadPad(GPIOA, 15)==PAL_HIGH) ? 0 : (1<<1))
+ | ((palReadPad(GPIOA, 10)==PAL_HIGH) ? 0 : (1<<2))
+ | ((palReadPad(GPIOA, 9)==PAL_HIGH) ? 0 : (1<<3))
+ | ((palReadPad(GPIOA, 8)==PAL_HIGH) ? 0 : (1<<4))
+ | ((palReadPad(GPIOB, 15)==PAL_HIGH) ? 0 : (1<<5))
+ | ((palReadPad(GPIOB, 14)==PAL_HIGH) ? 0 : (1<<6))
+ | ((palReadPad(GPIOB, 13)==PAL_HIGH) ? 0 : (1<<7))
+ | ((palReadPad(GPIOB, 12)==PAL_HIGH) ? 0 : (1<<8))
+ | ((palReadPad(GPIOB, 11)==PAL_HIGH) ? 0 : (1<<9))
+ | ((palReadPad(GPIOB, 10)==PAL_HIGH) ? 0 : (1<<10))
+ | ((palReadPad(GPIOB, 1)==PAL_HIGH) ? 0 : (1<<11))
+ | ((palReadPad(GPIOB, 0)==PAL_HIGH) ? 0 : (1<<12))
+ | ((palReadPad(GPIOA, 7)==PAL_HIGH) ? 0 : (1<<13))
+ | ((palReadPad(GPIOA, 6)==PAL_HIGH) ? 0 : (1<<14));
+}
+
+/* Row pin configuration
+ */
+// Modified by Xydane
+static void unselect_rows(void){
+ palSetPadMode(GPIOB, 9, PAL_MODE_INPUT);
+ palSetPadMode(GPIOB, 8, PAL_MODE_INPUT);
+ palSetPadMode(GPIOB, 7, PAL_MODE_INPUT);
+ palSetPadMode(GPIOB, 6, PAL_MODE_INPUT);
+ palSetPadMode(GPIOB, 5, PAL_MODE_INPUT);
+ palSetPadMode(GPIOA, 4, PAL_MODE_INPUT);
+}
+
+// Modified by Xydane
+static void select_row(uint8_t row){
+ (void)row;
+ switch (row) {
+ case 0:
+ palSetPadMode(GPIOB, 9, PAL_MODE_OUTPUT_PUSHPULL);
+ palClearPad(GPIOB, 9);
+ break;
+ case 1:
+ palSetPadMode(GPIOB, 8, PAL_MODE_OUTPUT_PUSHPULL);
+ palClearPad(GPIOB, 8);
+ break;
+ case 2:
+ palSetPadMode(GPIOB, 7, PAL_MODE_OUTPUT_PUSHPULL);
+ palClearPad(GPIOB, 7);
+ break;
+ case 3:
+ palSetPadMode(GPIOB, 6, PAL_MODE_OUTPUT_PUSHPULL);
+ palClearPad(GPIOB, 6);
+ break;
+ case 4:
+ palSetPadMode(GPIOB, 5, PAL_MODE_OUTPUT_PUSHPULL);
+ palClearPad(GPIOB, 5);
+ break;
+ case 5:
+ palSetPadMode(GPIOA, 4, PAL_MODE_OUTPUT_PUSHPULL);
+ palClearPad(GPIOA, 4);
+ break;
+ }
+}
diff --git a/keyboards/handwired/bluepill/bluepill70/mcuconf.h b/keyboards/handwired/bluepill/bluepill70/mcuconf.h
new file mode 100644
index 000000000..60d9931c3
--- /dev/null
+++ b/keyboards/handwired/bluepill/bluepill70/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 FALSE
+#define STM32_PWM_USE_TIM4 TRUE
+#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_ */ \ No newline at end of file
diff --git a/keyboards/handwired/bluepill/bluepill70/rules.mk b/keyboards/handwired/bluepill/bluepill70/rules.mk
new file mode 100644
index 000000000..e89abca8c
--- /dev/null
+++ b/keyboards/handwired/bluepill/bluepill70/rules.mk
@@ -0,0 +1,47 @@
+# project specific files
+SRC = matrix.c \
+ led.c
+
+# GENERIC STM32F103C8T6 board - stm32duino bootloader
+#OPT_DEFS = -DCORTEX_VTOR_INIT=0x2000
+#MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
+#BOARD = GENERIC_STM32_F103
+
+# GENERIC STM32F103C8T6 board - no bootloader (programmer over serial or SWD) // Modified by Xydane
+OPT_DEFS =
+MCU_LDSCRIPT = STM32F103x8
+BOARD = GENERIC_STM32_F103
+
+# MAPLE MINI
+# OPT_DEFS = -DCORTEX_VTOR_INIT=0x5000
+# MCU_LDSCRIPT = STM32F103xB_maplemini_bootloader
+# BOARD = MAPLEMINI_STM32_F103
+
+## chip/board settings
+# the next two should match the directories in
+# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+MCU_FAMILY = STM32
+MCU_SERIES = STM32F1xx
+# linker script to use
+# it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
+# or <this_dir>/ld/
+# startup code to use
+# is should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
+MCU_STARTUP = stm32f1xx
+# it should exist either in <chibios>/os/hal/boards/
+# or <this_dir>/boards
+# Cortex version
+# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
+MCU = cortex-m3
+# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+ARMV = 7
+# If you want to be able to jump to bootloader from firmware on STM32 MCUs,
+# set the correct BOOTLOADER_ADDRESS. Either set it here, or define it in
+# ./bootloader_defs.h or in ./boards/<FOO>/bootloader_defs.h (if you have
+# a custom board definition that you plan to reuse).
+# If you're not setting it here, leave it commented out.
+# It is chip dependent, the correct number can be looked up here (page 175):
+# http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
+# This also requires a patch to chibios:
+# <tmk_dir>/tmk_core/tool/chibios/ch-bootloader-jump.patch
+#STM32_BOOTLOADER_ADDRESS = 0x1FFFC800 \ No newline at end of file
diff --git a/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.c b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.c
new file mode 100644
index 000000000..2809c9d18
--- /dev/null
+++ b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.c
@@ -0,0 +1,49 @@
+/*
+ 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.
+*/
+
+#include "hal.h"
+
+/**
+ * @brief PAL setup.
+ * @details Digital I/O ports static configuration as defined in @p board.h.
+ * This variable is used by the HAL when initializing the PAL driver.
+ */
+#if HAL_USE_PAL || defined(__DOXYGEN__)
+const PALConfig pal_default_config =
+{
+ {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH},
+ {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH},
+ {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH},
+ {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH},
+ {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH},
+};
+#endif
+
+/*
+ * Early initialization code.
+ * This initialization must be performed just after stack setup and before
+ * any other initialization.
+ */
+void __early_init(void) {
+
+ stm32_clock_init();
+}
+
+/*
+ * Board-specific initialization code.
+ */
+void boardInit(void) {
+}
diff --git a/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.h b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.h
new file mode 100644
index 000000000..75bb848fd
--- /dev/null
+++ b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.h
@@ -0,0 +1,170 @@
+/*
+ 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 _BOARD_H_
+#define _BOARD_H_
+
+/*
+ * Setup for a Generic STM32F103 board.
+ */
+
+/*
+ * Board identifier.
+ */
+#define BOARD_GENERIC_STM32_F103
+#define BOARD_NAME "Generic STM32F103x board"
+
+/*
+ * Board frequencies.
+ */
+#define STM32_LSECLK 32768
+#define STM32_HSECLK 8000000
+
+/*
+ * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h.
+ */
+#define STM32F103xB
+
+/*
+ * IO pins assignments
+ */
+
+/* on-board */
+
+#define GPIOC_LED 13
+#define GPIOD_OSC_IN 0
+#define GPIOD_OSC_OUT 1
+
+/* Backlighting */
+
+/*#define GPIOC_BACKLIGHT_PIN 15*/
+
+/* In case your board has a "USB enable" hardware
+ controlled by a pin, define it here. (It could be just
+ a 1.5k resistor connected to D+ line.)
+*/
+/*
+#define GPIOB_USB_DISC 10
+*/
+
+/*
+ * I/O ports initial setup, this configuration is established soon after reset
+ * in the initialization code.
+ *
+ * The digits have the following meaning:
+ * 0 - Analog input.
+ * 1 - Push Pull output 10MHz.
+ * 2 - Push Pull output 2MHz.
+ * 3 - Push Pull output 50MHz.
+ * 4 - Digital input.
+ * 5 - Open Drain output 10MHz.
+ * 6 - Open Drain output 2MHz.
+ * 7 - Open Drain output 50MHz.
+ * 8 - Digital input with PullUp or PullDown resistor depending on ODR.
+ * 9 - Alternate Push Pull output 10MHz.
+ * A - Alternate Push Pull output 2MHz.
+ * B - Alternate Push Pull output 50MHz.
+ * C - Reserved.
+ * D - Alternate Open Drain output 10MHz.
+ * E - Alternate Open Drain output 2MHz.
+ * F - Alternate Open Drain output 50MHz.
+ * Please refer to the STM32 Reference Manual for details.
+ */
+
+/*
+ * Port A setup.
+ * Everything input with pull-up except:
+ * PA2 - Alternate output (USART2 TX).
+ * PA3 - Normal input (USART2 RX).
+ * PA9 - Alternate output (USART1 TX).
+ * PA10 - Normal input (USART1 RX).
+ */
+#define VAL_GPIOACRL 0x88884B88 /* PA7...PA0 */
+#define VAL_GPIOACRH 0x888884B8 /* PA15...PA8 */
+#define VAL_GPIOAODR 0xFFFFFFFF
+
+/*
+ * Port B setup.
+ * Everything input with pull-up except:
+ * PB10 - Push Pull output (USB switch).
+ */
+#define VAL_GPIOBCRL 0x88888888 /* PB7...PB0 */
+#define VAL_GPIOBCRH 0x88888388 /* PB15...PB8 */
+#define VAL_GPIOBODR 0xFFFFFFFF
+
+/*
+ * Port C setup.
+ * Everything input with pull-up except:
+ * PC13 - Push Pull output (LED).
+ */
+#define VAL_GPIOCCRL 0x88888888 /* PC7...PC0 */
+#define VAL_GPIOCCRH 0x88388888 /* PC15...PC8 */
+#define VAL_GPIOCODR 0xFFFFFFFF
+
+/*
+ * Port D setup.
+ * Everything input with pull-up except:
+ * PD0 - Normal input (XTAL).
+ * PD1 - Normal input (XTAL).
+ */
+#define VAL_GPIODCRL 0x88888844 /* PD7...PD0 */
+#define VAL_GPIODCRH 0x88888888 /* PD15...PD8 */
+#define VAL_GPIODODR 0xFFFFFFFF
+
+/*
+ * Port E setup.
+ * Everything input with pull-up except:
+ */
+#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */
+#define VAL_GPIOECRH 0x88888888 /* PE15...PE8 */
+#define VAL_GPIOEODR 0xFFFFFFFF
+
+/*
+ * USB bus activation macro, required by the USB driver.
+ */
+/* The point is that most of the generic STM32F103* boards
+ have a 1.5k resistor connected on one end to the D+ line
+ and on the other end to some pin. Or even a slightly more
+ complicated "USB enable" circuit, controlled by a pin.
+ That should go here.
+
+ However on some boards (e.g. one that I have), there's no
+ such hardware. In which case it's better to not do anything.
+*/
+/*
+#define usb_lld_connect_bus(usbp) palClearPad(GPIOB, GPIOB_USB_DISC)
+*/
+#define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT);
+
+/*
+ * USB bus de-activation macro, required by the USB driver.
+ */
+/*
+#define usb_lld_disconnect_bus(usbp) palSetPad(GPIOB, GPIOB_USB_DISC)
+*/
+#define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12);
+
+#if !defined(_FROM_ASM_)
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void boardInit(void);
+#ifdef __cplusplus
+}
+#endif
+#endif /* _FROM_ASM_ */
+
+#endif /* _BOARD_H_ */
diff --git a/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.mk b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.mk
new file mode 100644
index 000000000..6b8b312fd
--- /dev/null
+++ b/keyboards/handwired/bluepill/boards/GENERIC_STM32_F103/board.mk
@@ -0,0 +1,5 @@
+# List of all the board related files.
+BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F103/board.c
+
+# Required include directories
+BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F103
diff --git a/keyboards/handwired/bluepill/config.h b/keyboards/handwired/bluepill/config.h
new file mode 100644
index 000000000..aeab1808a
--- /dev/null
+++ b/keyboards/handwired/bluepill/config.h
@@ -0,0 +1,58 @@
+/*
+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
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* Set 0 if debouncing isn't needed */
+// Modified by Xydane
+#define DEBOUNCE 1
+
+/* 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 */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/* Backlighting include */
+/*#define BACKLIGHT_PIN 19
+#define BACKLIGHT_LEVELS 5
+#define BACKLIGHT_BREATHING
+#define BREATHING_PERIOD 6*/
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION \ No newline at end of file
diff --git a/keyboards/handwired/bluepill/keymaps/default/keymap.c b/keyboards/handwired/bluepill/keymaps/default/keymap.c
new file mode 100644
index 000000000..8a3493039
--- /dev/null
+++ b/keyboards/handwired/bluepill/keymaps/default/keymap.c
@@ -0,0 +1,69 @@
+/*
+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 QMK_KEYBOARD_H
+
+// Define layer names
+#define _NORMAL 0
+#define _FNONE 1
+#define _FNTWO 2
+
+// Highly Modified by Xydane
+const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_NORMAL] = LAYOUT_seventy_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_PSCREEN,KC_HOME, KC_END, \
+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_DELETE, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGUP, \
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_ENT, KC_SLASH,KC_PGDOWN, \
+ KC_LSPO, XXXXXXX,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSPC,KC_UP, TT(2), \
+ KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT ),
+
+ [_FNONE] = LAYOUT_seventy_ansi(
+ KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, 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_P7, KC_P8, KC_P9, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P1, KC_P2, KC_P3, KC_PAST, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \
+ KC_TRNS, XXXXXXX, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_P0, KC_PDOT,KC_PENT, KC_PSLS, KC_TRNS,KC_TRNS,KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS ),
+
+ [_FNTWO] = LAYOUT_seventy_ansi(
+ KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, 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_P7, KC_P8, KC_P9, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P1, KC_P2, KC_P3, KC_PAST, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \
+ KC_TRNS, XXXXXXX, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_P0, KC_PDOT,KC_PENT, KC_PSLS, KC_TRNS,KC_TRNS,KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS ),
+};
+
+/* Layer based ilumination, just binary */
+uint32_t layer_state_set_user(uint32_t state) {
+ switch (biton32(state)) {
+ case _FNONE:
+ palSetPad(GPIOA, 0); //OFF Color A
+ palClearPad(GPIOA, 1); //ON Color B
+ break;
+ case _FNTWO:
+ palClearPad(GPIOA, 0); //ON Color A
+ palClearPad(GPIOA, 1); //ON Color B
+ break;
+ default: // for any other layers, or the default layer
+ palClearPad(GPIOA, 0); //ON Color A
+ palSetPad(GPIOA, 1); //OFF Color B
+ break;
+ }
+ return state;
+} \ No newline at end of file
diff --git a/keyboards/handwired/bluepill/keymaps/iso/keymap.c b/keyboards/handwired/bluepill/keymaps/iso/keymap.c
new file mode 100644
index 000000000..a6aedde7a
--- /dev/null
+++ b/keyboards/handwired/bluepill/keymaps/iso/keymap.c
@@ -0,0 +1,69 @@
+/*
+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 QMK_KEYBOARD_H
+
+// Define layer names
+#define _NORMAL 0
+#define _FNONE 1
+#define _FNTWO 2
+
+// Highly Modified by Xydane
+const uint16_t keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_NORMAL] = LAYOUT_seventy_iso(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCREEN,KC_HOME, KC_END, \
+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_DELETE, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_PGUP, \
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,KC_QUOT, KC_NUHS, KC_ENT,KC_PGDOWN, \
+ KC_LSPO, KC_NUBS,KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM,KC_DOT, KC_SLSH, KC_RSPC,KC_UP, TT(2), \
+ KC_LCTL, KC_LGUI,KC_LALT, KC_SPC, KC_RALT,MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT ),
+
+ [_FNONE] = LAYOUT_seventy_iso(
+ KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS,KC_MUTE,KC_VOLD,KC_VOLU, KC_TRNS,KC_TRNS,KC_NLCK, KC_CALC, KC_TRNS,KC_TRNS,KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P7, KC_P8, KC_P9, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P1, KC_P2, KC_P3, KC_PAST, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_P0, KC_PDOT,KC_PENT, KC_PSLS, KC_TRNS,KC_TRNS,KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS ),
+
+ [_FNTWO] = LAYOUT_seventy_iso(
+ KC_TRNS, KC_MPRV, KC_MSTP, KC_MPLY, KC_MNXT, KC_TRNS,KC_MUTE,KC_VOLD,KC_VOLU, KC_TRNS,KC_TRNS,KC_NLCK, KC_CALC, KC_TRNS,KC_TRNS,KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P7, KC_P8, KC_P9, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P4, KC_P5, KC_P6, KC_PPLS, KC_TRNS, KC_TRNS, KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_P1, KC_P2, KC_P3, KC_PAST, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_P0, KC_PDOT,KC_PENT, KC_PSLS, KC_TRNS,KC_TRNS,KC_TRNS, \
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,KC_TRNS,KC_TRNS ),
+};
+
+/* Layer based ilumination, just binary */
+uint32_t layer_state_set_user(uint32_t state) {
+ switch (biton32(state)) {
+ case _FNONE:
+ palSetPad(GPIOA, 0); //OFF Color A
+ palClearPad(GPIOA, 1); //ON Color B
+ break;
+ case _FNTWO:
+ palClearPad(GPIOA, 0); //ON Color A
+ palClearPad(GPIOA, 1); //ON Color B
+ break;
+ default: // for any other layers, or the default layer
+ palClearPad(GPIOA, 0); //ON Color A
+ palSetPad(GPIOA, 1); //OFF Color B
+ break;
+ }
+ return state;
+} \ No newline at end of file
diff --git a/keyboards/handwired/bluepill/ld/MKL26Z64.ld b/keyboards/handwired/bluepill/ld/MKL26Z64.ld
new file mode 100644
index 000000000..c4ca8b874
--- /dev/null
+++ b/keyboards/handwired/bluepill/ld/MKL26Z64.ld
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2013-2016 Fabio Utzig, http://fabioutzig.com
+ * (C) 2016 flabbergast <s3+flabbergast@sdfeu.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * KL26Z64 memory setup.
+ */
+MEMORY
+{
+ flash0 : org = 0x00000000, len = 0x100
+ flash1 : org = 0x00000400, len = 0x10
+ flash2 : org = 0x00000410, len = 62k - 0x410
+ flash3 : org = 0x0000F800, len = 2k
+ flash4 : org = 0x00000000, len = 0
+ flash5 : org = 0x00000000, len = 0
+ flash6 : org = 0x00000000, len = 0
+ flash7 : org = 0x00000000, len = 0
+ ram0 : org = 0x1FFFF800, len = 8k
+ 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
+}
+
+/* Flash region for the configuration bytes.*/
+SECTIONS
+{
+ .cfmprotect : ALIGN(4) SUBALIGN(4)
+ {
+ KEEP(*(.cfmconfig))
+ } > flash1
+}
+
+/* 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", flash2);
+REGION_ALIAS("XTORS_FLASH_LMA", flash2);
+
+/* Flash region to be used for code text.*/
+REGION_ALIAS("TEXT_FLASH", flash2);
+REGION_ALIAS("TEXT_FLASH_LMA", flash2);
+
+/* Flash region to be used for read only data.*/
+REGION_ALIAS("RODATA_FLASH", flash2);
+REGION_ALIAS("RODATA_FLASH_LMA", flash2);
+
+/* Flash region to be used for various.*/
+REGION_ALIAS("VARIOUS_FLASH", flash2);
+REGION_ALIAS("VARIOUS_FLASH_LMA", flash2);
+
+/* Flash region to be used for RAM(n) initialization data.*/
+REGION_ALIAS("RAM_INIT_FLASH_LMA", flash2);
+
+/* 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", flash2);
+
+/* 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);
+
+__eeprom_workarea_start__ = ORIGIN(flash3);
+__eeprom_workarea_size__ = LENGTH(flash3);
+__eeprom_workarea_end__ = __eeprom_workarea_start__ + __eeprom_workarea_size__;
+
+/* Generic rules inclusion.*/
+INCLUDE rules.ld
diff --git a/keyboards/handwired/bluepill/ld/STM32F103x8_stm32duino_bootloader.ld b/keyboards/handwired/bluepill/ld/STM32F103x8_stm32duino_bootloader.ld
new file mode 100644
index 000000000..f9bfe9c00
--- /dev/null
+++ b/keyboards/handwired/bluepill/ld/STM32F103x8_stm32duino_bootloader.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.
+*/
+
+/*
+ * ST32F103xB memory setup for use with the maplemini bootloader.
+ * You will have to
+ * #define CORTEX_VTOR_INIT 0x5000
+ * in your projects chconf.h
+ */
+MEMORY
+{
+ flash0 : org = 0x08002000, len = 128k - 0x2000
+ 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 = 20k
+ 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/handwired/bluepill/readme.md b/keyboards/handwired/bluepill/readme.md
new file mode 100644
index 000000000..b8ca96992
--- /dev/null
+++ b/keyboards/handwired/bluepill/readme.md
@@ -0,0 +1,60 @@
+
+# BluePill handwired
+
+Keyboards using a BluePill controller (generic Chinese STM32F103C8T6) and based on the [KC64 of Xydane](https://github.com/Xydane/qmk_firmware).
+
+Keyboard Maintainer: [FPazos](https://github.com/fpazos), but I hope to leave the project in better hands.
+Hardware Supported: Bluepill STM32F103C8T6
+Hardware Availability: Everywhere
+
+Make example for BluePill70 (after setting up your build environment):
+
+ make handwired/bluepill/bluepill70: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).
+
+Read everything before using it.
+
+## Introduction
+
+First of all thanks to [Xydane](https://github.com/Xydane) at [GeekHack](https://geekhack.org/) for his advice and his repository, without it you couldn't be reading this.
+
+That's was an attempt to create a firmware using an STM32F103C8T6, and in a "future", also developing a revision for split keyboards. But...
+As I'm mainly a web developer I didn't even get to debug the controller, not to speak about ChibiOS. So I just structured everything, created a working 70% layout and leave the project to someone with more knowledge and patience.
+
+## Resistor fix
+
+If you want to use the Bluepill USB port, it's very likely that you need to solder a 1.8 kΩ between PA12 and 3.3V. That depends on the PC's motherboard but I needed, more info [here](https://wiki.stm32duino.com/index.php?title=Blue_Pill).
+
+## No bootloader
+
+Neither Xydane or I used the bootloader, the code for it is commented and you can use it if you want. I didn't achieve to run it and just used a serial programmer (FTDI, ST-LINK).
+
+## Adding layouts and revisions
+
+If you want to create new layouts just add them to the keymaps folder. If you prefer to develop a more complex revision just copy the bluepill70 folder, rename it and create a new keymap in /keymap.c (I tried to divide the project even more but it didn't worked).
+
+## Pinout
+
+That's the pinout;
+
+ A5 A15 A10 A9 A8 B15 B14 B13 B12 B11 B10 B1 B0 A7 A6
+ B9 ESC| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10| F11| F12| PSC| PGU| PGD
+ B8 GRA| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | ' | ¡ | BCKS | DEL
+ B7 TAB| Q | W | E | R | T | Y | U | I | O | P | ` | + | | HOM
+ B6 CAP| A | S | D | F | G | H | J | K | L | Ñ | ´ | Ç | ENTER | END
+ B5 LSI| < | Z | X | C | V | B | N | M | , | . | - | RSHIF | UP | FNT
+ A4 LCT| WIN| ALT| ESPACE | ALG| FN | RCT| LEF| DOW| RIG
+
+And the wiring:
+ISO
+![Wiring](https://i.imgur.com/ZCaxVzs.jpg)
+ANSI
+![Wiring](https://i.imgur.com/dBUJCdD.jpg)
+
+It also uses:
+PC13: Caps Lock led.
+
+Backlight dual color leds, my version is for common anode that's more common, for leds with common anode just replace the palSetPad with palClearPad and viceversa.
+PA1: Backlight color A.
+PA0: Backlight color B.
diff --git a/keyboards/handwired/bluepill/rules.mk b/keyboards/handwired/bluepill/rules.mk
new file mode 100644
index 000000000..38bacae34
--- /dev/null
+++ b/keyboards/handwired/bluepill/rules.mk
@@ -0,0 +1,10 @@
+#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover
+CUSTOM_MATRIX = yes # Custom matrix file
+MOUSEKEY_ENABLE = no
+
+DEFAULT_FOLDER = handwired/bluepill/bluepill70 \ No newline at end of file
diff --git a/keyboards/handwired/CMD60/CMD60.c b/keyboards/handwired/cmd60/cmd60.c
index 799848e34..91bbbd453 100644
--- a/keyboards/handwired/CMD60/CMD60.c
+++ b/keyboards/handwired/cmd60/cmd60.c
@@ -1,4 +1,4 @@
-#include "CMD60.h"
+#include "cmd60.h"
void matrix_init_kb(void) {
// put your keyboard start-up code here
diff --git a/keyboards/handwired/CMD60/CMD60.h b/keyboards/handwired/cmd60/cmd60.h
index f90871fc7..2e0baa999 100644
--- a/keyboards/handwired/CMD60/CMD60.h
+++ b/keyboards/handwired/cmd60/cmd60.h
@@ -3,18 +3,18 @@
#include "quantum.h"
-#define KEYMAP( \
+#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, \
- 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, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3D, \
K40, K41, K42, K45, K4A, K4B, K4C, K4D \
) { \
- { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
- { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
- { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D }, \
- { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D }, \
- { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, KC_NO,K4A, K4B, K4C, K4D } \
+ { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \
+ { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \
+ { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, KC_NO, K2D }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, KC_NO, KC_NO, K3D }, \
+ { K40, K41, K42, KC_NO, KC_NO, K45, KC_NO, KC_NO, KC_NO, KC_NO, K4A, K4B, K4C, K4D } \
}
-#endif \ No newline at end of file
+#endif
diff --git a/keyboards/handwired/CMD60/config.h b/keyboards/handwired/cmd60/config.h
index 27eb400b8..27eb400b8 100644
--- a/keyboards/handwired/CMD60/config.h
+++ b/keyboards/handwired/cmd60/config.h
diff --git a/keyboards/handwired/cmd60/info.json b/keyboards/handwired/cmd60/info.json
new file mode 100644
index 000000000..8d555dc07
--- /dev/null
+++ b/keyboards/handwired/cmd60/info.json
@@ -0,0 +1,74 @@
+{
+ "keyboard_name": "CMD60",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 15,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"`", "x":0, "y":0},
+ {"label":"1", "x":1, "y":0},
+ {"label":"2", "x":2, "y":0},
+ {"label":"3", "x":3, "y":0},
+ {"label":"4", "x":4, "y":0},
+ {"label":"5", "x":5, "y":0},
+ {"label":"6", "x":6, "y":0},
+ {"label":"7", "x":7, "y":0},
+ {"label":"8", "x":8, "y":0},
+ {"label":"9", "x":9, "y":0},
+ {"label":"0", "x":10, "y":0},
+ {"label":"-", "x":11, "y":0},
+ {"label":"=", "x":12, "y":0},
+ {"label":"Backspace", "x":13, "y":0, "w":2},
+ {"label":"Tab", "x":0, "y":1, "w":1.5},
+ {"label":"Q", "x":1.5, "y":1},
+ {"label":"W", "x":2.5, "y":1},
+ {"label":"E", "x":3.5, "y":1},
+ {"label":"R", "x":4.5, "y":1},
+ {"label":"T", "x":5.5, "y":1},
+ {"label":"Y", "x":6.5, "y":1},
+ {"label":"U", "x":7.5, "y":1},
+ {"label":"I", "x":8.5, "y":1},
+ {"label":"O", "x":9.5, "y":1},
+ {"label":"P", "x":10.5, "y":1},
+ {"label":"[", "x":11.5, "y":1},
+ {"label":"]", "x":12.5, "y":1},
+ {"label":"\\", "x":13.5, "y":1, "w":1.5},
+ {"label":"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":"GUI", "x":1.25, "y":4, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":4, "w":1.25},
+ {"label":"Space", "x":3.75, "y":4, "w":6.25},
+ {"label":"Alt", "x":10, "y":4, "w":1.25},
+ {"label":"GUI", "x":11.25, "y":4, "w":1.25},
+ {"label":"Menu", "x":12.5, "y":4, "w":1.25},
+ {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/cmd60/keymaps/default/keymap.c b/keyboards/handwired/cmd60/keymaps/default/keymap.c
new file mode 100644
index 000000000..448d81dc1
--- /dev/null
+++ b/keyboards/handwired/cmd60/keymaps/default/keymap.c
@@ -0,0 +1,46 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT( /* CMD60 - QWERTY */
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
+ LT(3, KC_ENT), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
+ KC_LCTL, KC_LGUI, KC_LALT, LT(2, KC_SPC), MO(3), MO(4), MO(5), TG(1) \
+ ),
+ [1] = LAYOUT( /* CMD60 - GameMode */
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ KC_LSFT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_RSFT, \
+ _______, XXXXXXX, _______, KC_SPC, _______, _______, _______, _______ \
+ ),
+ [2] = LAYOUT( /* CMD60 - Arrows */
+ 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_BSPC, KC_UP, KC_DEL, _______, _______, _______, KC_BSPC, KC_UP, KC_DEL, KC_PSCR, KC_SLCK, KC_PAUS, _______, \
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, \
+ _______, _______, _______, _______, KC_SPC, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______ \
+ ),
+ [3] = LAYOUT( /* CMD60 - Functions */
+ 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_MUTE, KC_BSPC, KC_PGUP, KC_DEL, _______, _______, _______, KC_PGUP, KC_UP, KC_PGDN, _______, KC_PAUS, KC_SLCK, KC_PSCR, \
+ _______, KC_HOME, KC_PGDN, KC_END, _______, _______, KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, _______, KC_INS, _______, \
+ _______, _______, _______, _______, _______, _______, KC_END, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______ \
+ ),
+ [4] = LAYOUT( /* CMD60 - Mouse */
+ KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_MS_U, KC_BTN2, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_WH_U, KC_BTN3, KC_WH_D, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______ \
+ ),
+ [5] = LAYOUT( /* CMD60 - Media */
+ KC_WAKE, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_VOLD, KC_VOLU, KC_MUTE, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_MNXT, KC_MPLY, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_WBAK, KC_WFWD, KC_WREF, \
+ _______, _______, _______, _______, _______, _______, _______, _______ \
+ ),
+};
diff --git a/keyboards/handwired/cmd60/readme.md b/keyboards/handwired/cmd60/readme.md
new file mode 100644
index 000000000..933ac16d5
--- /dev/null
+++ b/keyboards/handwired/cmd60/readme.md
@@ -0,0 +1,19 @@
+# CMD60
+
+![CMD60](https://i.imgur.com/r9LA6Lx.jpg)
+
+This layout has been designed to optimize use of the left-hand, and it focussed specifically on programmers who work
+with text editors like SublimeText and Atom. It utilizes the power of Space_fn, and features a caps lock swap for Fn2
+and enter key on tap. These features allow you to keep your right hand on the mouse more and should enable you to
+achieve a higher level of productivity if you take the time to learn its function layers.
+
+[Build Log](https://redd.it/4mkuu8)
+
+Keyboard Maintainer: [The QMK Community](https://github.com/qmk)
+Hardware Supported: CMD60 handwired, Teensy 2.0
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/cmd60: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/CMD60/rules.mk b/keyboards/handwired/cmd60/rules.mk
index d980716ea..d980716ea 100644
--- a/keyboards/handwired/CMD60/rules.mk
+++ b/keyboards/handwired/cmd60/rules.mk
diff --git a/keyboards/handwired/dactyl/config.h b/keyboards/handwired/dactyl/config.h
index a990cc720..08931ecd3 100644
--- a/keyboards/handwired/dactyl/config.h
+++ b/keyboards/handwired/dactyl/config.h
@@ -63,8 +63,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 15
-#define PREVENT_STUCK_MODIFIERS
-
#define USB_MAX_POWER_CONSUMPTION 500
#endif
diff --git a/keyboards/handwired/dactyl_manuform/4x5/info.json b/keyboards/handwired/dactyl_manuform/4x5/info.json
new file mode 100644
index 000000000..4ee52e164
--- /dev/null
+++ b/keyboards/handwired/dactyl_manuform/4x5/info.json
@@ -0,0 +1,59 @@
+{
+ "keyboard_name": "Dactyl Manuform 4x5",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 15,
+ "height": 7,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"L00", "x":0, "y":0},
+ {"label":"L01", "x":1, "y":0},
+ {"label":"L02", "x":2, "y":0},
+ {"label":"L03", "x":3, "y":0},
+ {"label":"L04", "x":4, "y":0},
+ {"label":"R00", "x":10, "y":0},
+ {"label":"R01", "x":11, "y":0},
+ {"label":"R02", "x":12, "y":0},
+ {"label":"R03", "x":13, "y":0},
+ {"label":"R04", "x":14, "y":0},
+ {"label":"L10", "x":0, "y":1},
+ {"label":"L11", "x":1, "y":1},
+ {"label":"L12", "x":2, "y":1},
+ {"label":"L13", "x":3, "y":1},
+ {"label":"L14", "x":4, "y":1},
+ {"label":"R10", "x":10, "y":1},
+ {"label":"R11", "x":11, "y":1},
+ {"label":"R12", "x":12, "y":1},
+ {"label":"R13", "x":13, "y":1},
+ {"label":"R14", "x":14, "y":1},
+ {"label":"L20", "x":0, "y":2},
+ {"label":"L21", "x":1, "y":2},
+ {"label":"L22", "x":2, "y":2},
+ {"label":"L23", "x":3, "y":2},
+ {"label":"L24", "x":4, "y":2},
+ {"label":"R20", "x":10, "y":2},
+ {"label":"R21", "x":11, "y":2},
+ {"label":"R22", "x":12, "y":2},
+ {"label":"R23", "x":13, "y":2},
+ {"label":"R24", "x":14, "y":2},
+ {"label":"L31", "x":1, "y":3},
+ {"label":"L32", "x":2, "y":3},
+ {"label":"R32", "x":12, "y":3},
+ {"label":"R33", "x":13, "y":3},
+ {"label":"L33", "x":3, "y":4},
+ {"label":"L34", "x":4, "y":4},
+ {"label":"R30", "x":10, "y":4},
+ {"label":"R31", "x":11, "y":4},
+ {"label":"L44", "x":5, "y":5},
+ {"label":"L43", "x":6, "y":5},
+ {"label":"R41", "x":8, "y":5},
+ {"label":"R40", "x":9, "y":5},
+ {"label":"L42", "x":5, "y":6},
+ {"label":"L41", "x":6, "y":6},
+ {"label":"R43", "x":8, "y":6},
+ {"label":"R42", "x":9, "y":6}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/config.h b/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/config.h
index 216917ed7..682c7a868 100644
--- a/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/config.h
+++ b/keyboards/handwired/dactyl_manuform/4x5/keymaps/default/config.h
@@ -18,8 +18,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 CONFIG_USER_H
-#define CONFIG_USER_H
+#pragma once
#include "../../config.h"
@@ -33,5 +32,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// #define MASTER_LEFT
// #define MASTER_RIGHT
#define EE_HANDS
-
-#endif
diff --git a/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/config.h b/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/config.h
index 216917ed7..682c7a868 100644
--- a/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/config.h
+++ b/keyboards/handwired/dactyl_manuform/4x5/keymaps/dvorak/config.h
@@ -18,8 +18,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 CONFIG_USER_H
-#define CONFIG_USER_H
+#pragma once
#include "../../config.h"
@@ -33,5 +32,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// #define MASTER_LEFT
// #define MASTER_RIGHT
#define EE_HANDS
-
-#endif
diff --git a/keyboards/handwired/dactyl_manuform/4x5/rules.mk b/keyboards/handwired/dactyl_manuform/4x5/rules.mk
index 14b6e1e4e..750807051 100644
--- a/keyboards/handwired/dactyl_manuform/4x5/rules.mk
+++ b/keyboards/handwired/dactyl_manuform/4x5/rules.mk
@@ -14,8 +14,7 @@ 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 this with audio at the same time.
+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
-
diff --git a/keyboards/handwired/dactyl_manuform/4x6/4x6.c b/keyboards/handwired/dactyl_manuform/4x6/4x6.c
new file mode 100644
index 000000000..1d305c854
--- /dev/null
+++ b/keyboards/handwired/dactyl_manuform/4x6/4x6.c
@@ -0,0 +1,14 @@
+#include "4x6.h"
+
+
+#ifdef SSD1306OLED
+void led_set_kb(uint8_t usb_led) {
+ // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
+ led_set_user(usb_led);
+}
+#endif
+
+void matrix_init_kb(void) {
+ matrix_init_user();
+};
+
diff --git a/keyboards/handwired/dactyl_manuform/4x6/4x6.h b/keyboards/handwired/dactyl_manuform/4x6/4x6.h
new file mode 100644
index 000000000..25741be57
--- /dev/null
+++ b/keyboards/handwired/dactyl_manuform/4x6/4x6.h
@@ -0,0 +1,36 @@
+#pragma once
+
+#include "dactyl_manuform.h"
+#include "quantum.h"
+
+#ifdef USE_I2C
+#include <stddef.h>
+#ifdef __AVR__
+ #include <avr/io.h>
+ #include <avr/interrupt.h>
+#endif
+#endif
+
+#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, \
+ L32, L33, R32, R33, \
+ L34, L35, R30, R31, \
+ L44, L45, R40, R41, \
+ L42, L43, R42, R43 \
+ ) \
+ { \
+ { L00, L01, L02, L03, L04, L05 }, \
+ { L10, L11, L12, L13, L14, L15 }, \
+ { L20, L21, L22, L23, L24, L25 }, \
+ { KC_NO, KC_NO, L32, L33, L34, L35 }, \
+ { KC_NO, KC_NO, L42, L43, L44, L45 }, \
+\
+ { R00, R01, R02, R03, R04, R05 }, \
+ { R10, R11, R12, R13, R14, R15 }, \
+ { R20, R21, R22, R23, R24, R25 }, \
+ { R30, R31, R32, R33, KC_NO, KC_NO }, \
+ { R40, R41, R42, R43, KC_NO, KC_NO } \
+\
+ }
diff --git a/keyboards/handwired/dactyl_manuform/4x6/config.h b/keyboards/handwired/dactyl_manuform/4x6/config.h
new file mode 100644
index 000000000..d4a192287
--- /dev/null
+++ b/keyboards/handwired/dactyl_manuform/4x6/config.h
@@ -0,0 +1,40 @@
+/*
+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"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x3060
+#define DEVICE_VER 0x0001
+#define MANUFACTURER tshort
+#define DESCRIPTION A split keyboard for the cheap makers
+
+/* key matrix size */
+// Rows are doubled-up
+#define MATRIX_ROWS 10
+#define MATRIX_COLS 6
+
+// row-driven
+#define MATRIX_ROW_PINS { F7, B1, B3, B2, B6 }
+#define MATRIX_COL_PINS { D4, C6, D7, E6, B4, B5 }
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
diff --git a/keyboards/handwired/dactyl_manuform/4x6/info.json b/keyboards/handwired/dactyl_manuform/4x6/info.json
new file mode 100644
index 000000000..ba358a703
--- /dev/null
+++ b/keyboards/handwired/dactyl_manuform/4x6/info.json
@@ -0,0 +1,65 @@
+{
+ "keyboard_name": "Dactyl Manuform 4x6",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 17,
+ "height": 7,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"L00", "x":0, "y":0},
+ {"label":"L01", "x":1, "y":0},
+ {"label":"L02", "x":2, "y":0},
+ {"label":"L03", "x":3, "y":0},
+ {"label":"L04", "x":4, "y":0},
+ {"label":"L05", "x":5, "y":0},
+ {"label":"R00", "x":11, "y":0},
+ {"label":"R01", "x":12, "y":0},
+ {"label":"R02", "x":13, "y":0},
+ {"label":"R03", "x":14, "y":0},
+ {"label":"R04", "x":15, "y":0},
+ {"label":"R05", "x":16, "y":0},
+ {"label":"L10", "x":0, "y":1},
+ {"label":"L11", "x":1, "y":1},
+ {"label":"L12", "x":2, "y":1},
+ {"label":"L13", "x":3, "y":1},
+ {"label":"L14", "x":4, "y":1},
+ {"label":"L15", "x":5, "y":1},
+ {"label":"R10", "x":11, "y":1},
+ {"label":"R11", "x":12, "y":1},
+ {"label":"R12", "x":13, "y":1},
+ {"label":"R13", "x":14, "y":1},
+ {"label":"R14", "x":15, "y":1},
+ {"label":"R15", "x":16, "y":1},
+ {"label":"L20", "x":0, "y":2},
+ {"label":"L21", "x":1, "y":2},
+ {"label":"L22", "x":2, "y":2},
+ {"label":"L23", "x":3, "y":2},
+ {"label":"L24", "x":4, "y":2},
+ {"label":"L25", "x":5, "y":2},
+ {"label":"R20", "x":11, "y":2},
+ {"label":"R21", "x":12, "y":2},
+ {"label":"R22", "x":13, "y":2},
+ {"label":"R23", "x":14, "y":2},
+ {"label":"R24", "x":15, "y":2},
+ {"label":"R25", "x":16, "y":2},
+ {"label":"L32", "x":2, "y":3},
+ {"label":"L33", "x":3, "y":3},
+ {"label":"R32", "x":13, "y":3},
+ {"label":"R33", "x":14, "y":3},
+ {"label":"L34", "x":4, "y":4},
+ {"label":"L35", "x":5, "y":4},
+ {"label":"R30", "x":11, "y":4},
+ {"label":"R31", "x":12, "y":4},
+ {"label":"L44", "x":6, "y":5},
+ {"label":"L45", "x":7, "y":5},
+ {"label":"R40", "x":9, "y":5},
+ {"label":"R41", "x":10, "y":5},
+ {"label":"L42", "x":6, "y":6},
+ {"label":"L43", "x":7, "y":6},
+ {"label":"R42", "x":9, "y":6},
+ {"label":"R43", "x":10, "y":6}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/config.h b/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/config.h
new file mode 100644
index 000000000..1fc2c617f
--- /dev/null
+++ b/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/config.h
@@ -0,0 +1,31 @@
+/*
+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
+
+/* Use I2C or Serial, not both */
+#define USE_SERIAL
+// #define USE_I2C
+
+/* Select hand configuration */
+
+// #define MASTER_LEFT
+// #define MASTER_RIGHT
+#define EE_HANDS
diff --git a/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c b/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c
new file mode 100644
index 000000000..ad23beef5
--- /dev/null
+++ b/keyboards/handwired/dactyl_manuform/4x6/keymaps/default/keymap.c
@@ -0,0 +1,87 @@
+#include QMK_KEYBOARD_H
+
+extern keymap_config_t keymap_config;
+
+#define _BASE 0
+#define _RAISE 1
+#define _LOWER 2
+
+// Fillers to make layering more clear
+
+#define ____ KC_TRNS
+
+#define SFT_ESC SFT_T(KC_ESC)
+#define CTL_BSPC CTL_T(KC_BSPC)
+#define ALT_SPC ALT_T(KC_SPC)
+#define SFT_ENT SFT_T(KC_ENT)
+
+#define KC_ML KC_MS_LEFT
+#define KC_MR KC_MS_RIGHT
+#define KC_MU KC_MS_UP
+#define KC_MD KC_MS_DOWN
+#define KC_MB1 KC_MS_BTN1
+#define KC_MB2 KC_MS_BTN1
+
+#define RAISE MO(_RAISE)
+#define LOWER MO(_LOWER)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Base (qwerty)
+ * +-----------------------------------------+ +-----------------------------------------+
+ * | ESC | q | w | e | r | t | | y | u | i | o | p | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | TAB | a | s | d | f | g | | h | j | k | l | ; | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | SHFT | z | x | c | v | b | | n | m | , | . | / | |
+ * +------+------+------+------+-------------+ +-------------+------+------+------+------+
+ * | [ | ] | | | |
+ * +-------------+-------------+ +-------------+-------------+
+ * | | | | | |
+ * |------+------| |------+------|
+ * | | | | | |
+ * +-------------+ +-------------+
+ * +-------------+ +-------------+
+ * | | | | | |
+ * |------+------| |------+------|
+ * | | | | | |
+ * +-------------+ +-------------+
+ */
+
+[_BASE] = LAYOUT( \
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_MINS, \
+ KC_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_BSLASH, \
+ KC_LBRC,KC_RBRC, KC_PLUS,KC_EQL, \
+ RAISE, KC_SPC, KC_ENT, LOWER, \
+ KC_TAB, KC_HOME, KC_END, KC_DEL, \
+ KC_BSPC,KC_GRV, KC_LGUI,KC_LALT \
+),
+
+[_LOWER] = LAYOUT(
+ _______,_______,_______,_______,_______,KC_LBRC, KC_RBRC, KC_P7, KC_P8, KC_P9, RESET, KC_PLUS, \
+ _______,KC_HOME,KC_PGUP,KC_PGDN,KC_END ,KC_LPRN, KC_RPRN, KC_P4, KC_P5, KC_P6, KC_MINS,KC_PIPE, \
+ _______,_______,_______,_______,_______,_______, _______, KC_P1, KC_P2, KC_P3, KC_EQL, KC_UNDS, \
+ _______,KC_PSCR, _______, KC_P0, \
+ _______,_______, _______,_______, \
+ _______,_______, _______,_______, \
+ _______,_______, _______,_______ \
+),
+
+[_RAISE] = LAYOUT(
+ _______,RESET, _______,_______,_______,KC_LBRC, KC_RBRC,_______,KC_NLCK,KC_INS, KC_SLCK,KC_MUTE, \
+ _______,KC_LEFT,KC_UP ,KC_DOWN,KC_RGHT,KC_LPRN, KC_RPRN,KC_MPRV,KC_MPLY,KC_MNXT,_______,KC_VOLU, \
+ _______,_______,_______,_______,_______,_______, _______,_______,_______,_______,_______,KC_VOLD, \
+ _______,_______, KC_EQL, _______, \
+ _______,_______, _______,_______, \
+ _______,_______, _______,_______, \
+ _______,_______, _______,_______ \
+)
+};
+
+
+void persistent_default_layer_set(uint16_t default_layer) {
+ eeconfig_update_default_layer(default_layer);
+ default_layer_set(default_layer);
+}
+
diff --git a/keyboards/handwired/dactyl_manuform/4x6/rules.mk b/keyboards/handwired/dactyl_manuform/4x6/rules.mk
new file mode 100644
index 000000000..750807051
--- /dev/null
+++ b/keyboards/handwired/dactyl_manuform/4x6/rules.mk
@@ -0,0 +1,20 @@
+
+# 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 = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = no # Console for debug(+400)
+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 = 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
diff --git a/keyboards/handwired/dactyl_manuform/5x6/info.json b/keyboards/handwired/dactyl_manuform/5x6/info.json
new file mode 100644
index 000000000..d7aa3acee
--- /dev/null
+++ b/keyboards/handwired/dactyl_manuform/5x6/info.json
@@ -0,0 +1,77 @@
+{
+ "keyboard_name": "Dactyl Manuform 5x6",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 17,
+ "height": 8,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"L00", "x":0, "y":0},
+ {"label":"L01", "x":1, "y":0},
+ {"label":"L02", "x":2, "y":0},
+ {"label":"L03", "x":3, "y":0},
+ {"label":"L04", "x":4, "y":0},
+ {"label":"L05", "x":5, "y":0},
+ {"label":"R00", "x":11, "y":0},
+ {"label":"R01", "x":12, "y":0},
+ {"label":"R02", "x":13, "y":0},
+ {"label":"R03", "x":14, "y":0},
+ {"label":"R04", "x":15, "y":0},
+ {"label":"R05", "x":16, "y":0},
+ {"label":"L10", "x":0, "y":1},
+ {"label":"L11", "x":1, "y":1},
+ {"label":"L12", "x":2, "y":1},
+ {"label":"L13", "x":3, "y":1},
+ {"label":"L14", "x":4, "y":1},
+ {"label":"L15", "x":5, "y":1},
+ {"label":"R10", "x":11, "y":1},
+ {"label":"R11", "x":12, "y":1},
+ {"label":"R12", "x":13, "y":1},
+ {"label":"R13", "x":14, "y":1},
+ {"label":"R14", "x":15, "y":1},
+ {"label":"R15", "x":16, "y":1},
+ {"label":"L20", "x":0, "y":2},
+ {"label":"L21", "x":1, "y":2},
+ {"label":"L22", "x":2, "y":2},
+ {"label":"L23", "x":3, "y":2},
+ {"label":"L24", "x":4, "y":2},
+ {"label":"L25", "x":5, "y":2},
+ {"label":"R20", "x":11, "y":2},
+ {"label":"R21", "x":12, "y":2},
+ {"label":"R22", "x":13, "y":2},
+ {"label":"R23", "x":14, "y":2},
+ {"label":"R24", "x":15, "y":2},
+ {"label":"R25", "x":16, "y":2},
+ {"label":"L30", "x":0, "y":3},
+ {"label":"L31", "x":1, "y":3},
+ {"label":"L32", "x":2, "y":3},
+ {"label":"L33", "x":3, "y":3},
+ {"label":"L34", "x":4, "y":3},
+ {"label":"L35", "x":5, "y":3},
+ {"label":"R30", "x":11, "y":3},
+ {"label":"R31", "x":12, "y":3},
+ {"label":"R32", "x":13, "y":3},
+ {"label":"R33", "x":14, "y":3},
+ {"label":"R34", "x":15, "y":3},
+ {"label":"R35", "x":16, "y":3},
+ {"label":"L42", "x":2, "y":4},
+ {"label":"L43", "x":3, "y":4},
+ {"label":"R42", "x":13, "y":4},
+ {"label":"R43", "x":14, "y":4},
+ {"label":"L44", "x":4, "y":5},
+ {"label":"L45", "x":5, "y":5},
+ {"label":"R40", "x":11, "y":5},
+ {"label":"R41", "x":12, "y":5},
+ {"label":"L54", "x":6, "y":6},
+ {"label":"L55", "x":7, "y":6},
+ {"label":"R50", "x":9, "y":6},
+ {"label":"R51", "x":10, "y":6},
+ {"label":"L52", "x":6, "y":7},
+ {"label":"L53", "x":7, "y":7},
+ {"label":"R52", "x":9, "y":7},
+ {"label":"R53", "x":10, "y":7}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/config.h b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/config.h
new file mode 100644
index 000000000..10b969326
--- /dev/null
+++ b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/config.h
@@ -0,0 +1,9 @@
+#pragma once
+
+#include "333fred_config.h"
+
+#define USE_SERIAL
+#define EE_HANDS
+
+#undef TAPPING_TERM
+#define TAPPING_TERM 200
diff --git a/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/keymap.c b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/keymap.c
new file mode 100644
index 000000000..c37009f24
--- /dev/null
+++ b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/keymap.c
@@ -0,0 +1,80 @@
+#include QMK_KEYBOARD_H
+#include "333fred.h"
+
+enum custom_macros {
+ DLEFT,
+ DRIGHT,
+ PSCREEN_APP
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [BASE] = LAYOUT_5x6(
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLS,
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
+ OSM(MOD_LSFT), CTL_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, OSM(MOD_RSFT),
+ KC_F4, KC_F5, TG(CODEFLOW), KC_EQL,
+ KC_LALT, KC_BSPC, KC_SPC, OSL(VIM),
+ KC_TAB, TD(TD_SYM_VIM), KC_ENT, KC_RGUI,
+ KC_LCTL, KC_DEL, KC_UP, KC_DOWN
+ ),
+
+ [CODEFLOW] = LAYOUT_5x6(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ KC_F7, KC_F8, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______
+ ),
+
+ [SYMB] = LAYOUT_5x6(
+ _______, 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_LPRN, KC_RPRN, KC_PIPE, _______, KC_7, KC_8, KC_9, _______, KC_F12,
+ _______, KC_HASH, KC_DLR, KC_LCBR, KC_RCBR, KC_GRV, _______, KC_4, KC_5, KC_6, _______, _______,
+ _______, KC_PERC, KC_CIRC, KC_LBRC, KC_RBRC, KC_TILD, _______, KC_1, KC_2, KC_3, _______, _______,
+ KC_F7, KC_F8, KC_0, KC_ENT,
+ _______, _______, KC_MPLY, KC_MNXT,
+ _______, _______, KC_MPRV, _______,
+ _______, _______, KC_VOLU, KC_VOLD
+ ),
+
+ [VIM] = LAYOUT_5x6(
+ _______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, RESET, _______,
+ _______, _______, _______, _______, KC_LSFT, _______, _______, _______, _______, _______, _______, _______,
+ _______, M(DLEFT), M(DRIGHT), KC_LCTL, KC_LGUI, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______,
+ _______, _______, _______, _______
+ ),
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
+ switch(id) {
+ case DLEFT:
+ if (record->event.pressed) { // Windows move desktop left
+ return MACRO(D(LCTL), D(LGUI), T(LEFT), U(LGUI), U(LCTL), END);
+ }
+ break;
+ case DRIGHT:
+ if (record->event.pressed) { // Windows move desktop right
+ return MACRO(D(LCTL), D(LGUI), T(RIGHT), U(LGUI), U(LCTL), END);
+ }
+ break;
+ case PSCREEN_APP: if (record->event.pressed) {
+ return MACRO(D(LALT), T(PSCR), U(LALT), END);
+ }
+ break;
+ }
+ return MACRO_NONE;
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ tap_dance_process_record(keycode);
+ return true;
+}
diff --git a/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/rules.mk b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/rules.mk
new file mode 100644
index 000000000..79ef33e7c
--- /dev/null
+++ b/keyboards/handwired/dactyl_manuform/5x6/keymaps/333fred/rules.mk
@@ -0,0 +1,7 @@
+
+NKRO_ENABLE = yes
+KEY_LOCK_ENABLE = yes
+TAP_DANCE_ENABLE = yes
+CONSOLE_ENABLE = no
+PERMISSIVE_HOLD = yes
+EXTRAFLAGS += -flto
diff --git a/keyboards/handwired/dactyl_manuform/5x6/rules.mk b/keyboards/handwired/dactyl_manuform/5x6/rules.mk
index 14b6e1e4e..750807051 100644
--- a/keyboards/handwired/dactyl_manuform/5x6/rules.mk
+++ b/keyboards/handwired/dactyl_manuform/5x6/rules.mk
@@ -14,8 +14,7 @@ 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 this with audio at the same time.
+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
-
diff --git a/keyboards/handwired/dactyl_manuform/5x7/info.json b/keyboards/handwired/dactyl_manuform/5x7/info.json
new file mode 100644
index 000000000..b4b2c7b79
--- /dev/null
+++ b/keyboards/handwired/dactyl_manuform/5x7/info.json
@@ -0,0 +1,87 @@
+{
+ "keyboard_name": "Dactyl Manuform 5x7",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 17,
+ "height": 16,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"L11", "x":0, "y":0},
+ {"label":"L12", "x":1, "y":0},
+ {"label":"L13", "x":2, "y":0},
+ {"label":"L14", "x":3, "y":0},
+ {"label":"L15", "x":4, "y":0},
+ {"label":"L16", "x":5, "y":0},
+ {"label":"L17", "x":6, "y":0},
+ {"label":"L21", "x":0, "y":1},
+ {"label":"L22", "x":1, "y":1},
+ {"label":"L23", "x":2, "y":1},
+ {"label":"L24", "x":3, "y":1},
+ {"label":"L25", "x":4, "y":1},
+ {"label":"L26", "x":5, "y":1},
+ {"label":"L27", "x":6, "y":1},
+ {"label":"L31", "x":0, "y":2},
+ {"label":"L32", "x":1, "y":2},
+ {"label":"L33", "x":2, "y":2},
+ {"label":"L34", "x":3, "y":2},
+ {"label":"L35", "x":4, "y":2},
+ {"label":"L36", "x":5, "y":2},
+ {"label":"L37", "x":6, "y":2},
+ {"label":"L41", "x":0, "y":3},
+ {"label":"L42", "x":1, "y":3},
+ {"label":"L43", "x":2, "y":3},
+ {"label":"L44", "x":3, "y":3},
+ {"label":"L45", "x":4, "y":3},
+ {"label":"L46", "x":5, "y":3},
+ {"label":"L51", "x":0, "y":4},
+ {"label":"L52", "x":1, "y":4},
+ {"label":"L53", "x":2, "y":4},
+ {"label":"L54", "x":3, "y":4},
+ {"label":"L55", "x":4, "y":5},
+ {"label":"L56", "x":5, "y":5},
+ {"label":"L65", "x":6, "y":6},
+ {"label":"L66", "x":7, "y":6},
+ {"label":"L63", "x":6, "y":7},
+ {"label":"L64", "x":7, "y":7},
+ {"label":"R11", "x":10, "y":0},
+ {"label":"R12", "x":11, "y":0},
+ {"label":"R13", "x":12, "y":0},
+ {"label":"R14", "x":13, "y":0},
+ {"label":"R15", "x":14, "y":0},
+ {"label":"R16", "x":15, "y":0},
+ {"label":"R17", "x":16, "y":0},
+ {"label":"R21", "x":10, "y":1},
+ {"label":"R22", "x":11, "y":1},
+ {"label":"R23", "x":12, "y":1},
+ {"label":"R24", "x":13, "y":1},
+ {"label":"R25", "x":14, "y":1},
+ {"label":"R26", "x":15, "y":1},
+ {"label":"R27", "x":16, "y":1},
+ {"label":"R31", "x":10, "y":2},
+ {"label":"R32", "x":11, "y":2},
+ {"label":"R33", "x":12, "y":2},
+ {"label":"R34", "x":13, "y":2},
+ {"label":"R35", "x":14, "y":2},
+ {"label":"R36", "x":15, "y":2},
+ {"label":"R37", "x":16, "y":2},
+ {"label":"R42", "x":11, "y":3},
+ {"label":"R43", "x":12, "y":3},
+ {"label":"R44", "x":13, "y":3},
+ {"label":"R45", "x":14, "y":3},
+ {"label":"R46", "x":15, "y":3},
+ {"label":"R47", "x":16, "y":3},
+ {"label":"R54", "x":13, "y":4},
+ {"label":"R55", "x":14, "y":4},
+ {"label":"R56", "x":15, "y":4},
+ {"label":"R57", "x":16, "y":4},
+ {"label":"R52", "x":11, "y":5},
+ {"label":"R53", "x":12, "y":5},
+ {"label":"R62", "x":9, "y":6},
+ {"label":"R63", "x":10, "y":6},
+ {"label":"R64", "x":9, "y":7},
+ {"label":"R65", "x":10, "y":7}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/dactyl_manuform/5x7/rules.mk b/keyboards/handwired/dactyl_manuform/5x7/rules.mk
index fc9cbcccd..750807051 100644
--- a/keyboards/handwired/dactyl_manuform/5x7/rules.mk
+++ b/keyboards/handwired/dactyl_manuform/5x7/rules.mk
@@ -14,7 +14,7 @@ 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 this with audio at the same time.
+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
diff --git a/keyboards/handwired/dactyl_manuform/6x6/info.json b/keyboards/handwired/dactyl_manuform/6x6/info.json
new file mode 100644
index 000000000..2ae91d469
--- /dev/null
+++ b/keyboards/handwired/dactyl_manuform/6x6/info.json
@@ -0,0 +1,89 @@
+{
+ "keyboard_name": "Dactyl Manuform 6x6",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 17,
+ "height": 9,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"L00", "x":0, "y":0},
+ {"label":"L01", "x":1, "y":0},
+ {"label":"L02", "x":2, "y":0},
+ {"label":"L03", "x":3, "y":0},
+ {"label":"L04", "x":4, "y":0},
+ {"label":"L05", "x":5, "y":0},
+ {"label":"R00", "x":11, "y":0},
+ {"label":"R01", "x":12, "y":0},
+ {"label":"R02", "x":13, "y":0},
+ {"label":"R03", "x":14, "y":0},
+ {"label":"R04", "x":15, "y":0},
+ {"label":"R05", "x":16, "y":0},
+ {"label":"L10", "x":0, "y":1},
+ {"label":"L11", "x":1, "y":1},
+ {"label":"L12", "x":2, "y":1},
+ {"label":"L13", "x":3, "y":1},
+ {"label":"L14", "x":4, "y":1},
+ {"label":"L15", "x":5, "y":1},
+ {"label":"R10", "x":11, "y":1},
+ {"label":"R11", "x":12, "y":1},
+ {"label":"R12", "x":13, "y":1},
+ {"label":"R13", "x":14, "y":1},
+ {"label":"R14", "x":15, "y":1},
+ {"label":"R15", "x":16, "y":1},
+ {"label":"L20", "x":0, "y":2},
+ {"label":"L21", "x":1, "y":2},
+ {"label":"L22", "x":2, "y":2},
+ {"label":"L23", "x":3, "y":2},
+ {"label":"L24", "x":4, "y":2},
+ {"label":"L25", "x":5, "y":2},
+ {"label":"R20", "x":11, "y":2},
+ {"label":"R21", "x":12, "y":2},
+ {"label":"R22", "x":13, "y":2},
+ {"label":"R23", "x":14, "y":2},
+ {"label":"R24", "x":15, "y":2},
+ {"label":"R25", "x":16, "y":2},
+ {"label":"L30", "x":0, "y":3},
+ {"label":"L31", "x":1, "y":3},
+ {"label":"L32", "x":2, "y":3},
+ {"label":"L33", "x":3, "y":3},
+ {"label":"L34", "x":4, "y":3},
+ {"label":"L35", "x":5, "y":3},
+ {"label":"R30", "x":11, "y":3},
+ {"label":"R31", "x":12, "y":3},
+ {"label":"R32", "x":13, "y":3},
+ {"label":"R33", "x":14, "y":3},
+ {"label":"R34", "x":15, "y":3},
+ {"label":"R35", "x":16, "y":3},
+ {"label":"L40", "x":0, "y":4},
+ {"label":"L41", "x":1, "y":4},
+ {"label":"L42", "x":2, "y":4},
+ {"label":"L43", "x":3, "y":4},
+ {"label":"L44", "x":4, "y":4},
+ {"label":"L45", "x":5, "y":4},
+ {"label":"R40", "x":11, "y":4},
+ {"label":"R41", "x":12, "y":4},
+ {"label":"R42", "x":13, "y":4},
+ {"label":"R43", "x":14, "y":4},
+ {"label":"R44", "x":15, "y":4},
+ {"label":"R45", "x":16, "y":4},
+ {"label":"L52", "x":2, "y":5},
+ {"label":"L53", "x":3, "y":5},
+ {"label":"R52", "x":13, "y":5},
+ {"label":"R53", "x":14, "y":5},
+ {"label":"L54", "x":4, "y":6},
+ {"label":"L55", "x":5, "y":6},
+ {"label":"R50", "x":11, "y":6},
+ {"label":"R51", "x":12, "y":6},
+ {"label":"L64", "x":6, "y":7},
+ {"label":"L65", "x":7, "y":7},
+ {"label":"R60", "x":9, "y":7},
+ {"label":"R61", "x":10, "y":7},
+ {"label":"L62", "x":6, "y":8},
+ {"label":"L63", "x":7, "y":8},
+ {"label":"R62", "x":9, "y":8},
+ {"label":"R63", "x":10, "y":8}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/dactyl_manuform/6x6/rules.mk b/keyboards/handwired/dactyl_manuform/6x6/rules.mk
index 14b6e1e4e..750807051 100644
--- a/keyboards/handwired/dactyl_manuform/6x6/rules.mk
+++ b/keyboards/handwired/dactyl_manuform/6x6/rules.mk
@@ -14,8 +14,7 @@ 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 this with audio at the same time.
+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
-
diff --git a/keyboards/handwired/dactyl_manuform/config.h b/keyboards/handwired/dactyl_manuform/config.h
index 19cd356d8..0e6f3f98e 100644
--- a/keyboards/handwired/dactyl_manuform/config.h
+++ b/keyboards/handwired/dactyl_manuform/config.h
@@ -38,6 +38,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
@@ -53,7 +56,7 @@ 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
@@ -74,5 +77,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
-
-
diff --git a/keyboards/handwired/dactyl_manuform/dactyl_manuform.h b/keyboards/handwired/dactyl_manuform/dactyl_manuform.h
index 8b60097bc..eea0757d5 100644
--- a/keyboards/handwired/dactyl_manuform/dactyl_manuform.h
+++ b/keyboards/handwired/dactyl_manuform/dactyl_manuform.h
@@ -1,13 +1,15 @@
#pragma once
-#ifdef KEYBOARD_handwired_dactyl_manuform_6x6
- #include "6x6.h"
+#ifdef KEYBOARD_handwired_dactyl_manuform_4x5
+ #include "4x5.h"
+#elif KEYBOARD_handwired_dactyl_manuform_4x6
+ #include "4x6.h"
#elif KEYBOARD_handwired_dactyl_manuform_5x6
#include "5x6.h"
-#elif KEYBOARD_handwired_dactyl_manuform_4x5
- #include "4x5.h"
#elif KEYBOARD_handwired_dactyl_manuform_5x7
#include "5x7.h"
+#elif KEYBOARD_handwired_dactyl_manuform_6x6
+ #include "6x6.h"
#endif
//void promicro_bootloader_jmp(bool program);
diff --git a/keyboards/handwired/dactyl_manuform/readme.md b/keyboards/handwired/dactyl_manuform/readme.md
index 00288a876..0d08c67a0 100644
--- a/keyboards/handwired/dactyl_manuform/readme.md
+++ b/keyboards/handwired/dactyl_manuform/readme.md
@@ -131,13 +131,13 @@ file will run on both hands instead of having to flash left and right handed
versions of the firmware to each half. To flash the EEPROM file for the left
half run:
```
-avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-lefthand.eep
+avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-lefthand.eep"
// or the equivalent in dfu-programmer
```
and similarly for right half
```
-avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-righhand.eep
+avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-righthand.eep"
// or the equivalent in dfu-programmer
```
diff --git a/keyboards/handwired/dactyl_manuform/rules.mk b/keyboards/handwired/dactyl_manuform/rules.mk
index adb058c8a..a93de3685 100644
--- a/keyboards/handwired/dactyl_manuform/rules.mk
+++ b/keyboards/handwired/dactyl_manuform/rules.mk
@@ -58,7 +58,7 @@ 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 this with audio at the same time.
+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
diff --git a/keyboards/handwired/fivethirteen/README.md b/keyboards/handwired/fivethirteen/README.md
deleted file mode 100644
index a965650fc..000000000
--- a/keyboards/handwired/fivethirteen/README.md
+++ /dev/null
@@ -1,28 +0,0 @@
-fivethirteen keyboard firmware
-======================
-
-## Quantum MK Firmware
-
-For the full Quantum feature list, see [the parent readme.md](/doc/README.md).
-
-## Building
-
-Download or clone the whole firmware and navigate to the keyboards/handwired/fivethirteen folder.
-Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use
-the Teensy Loader to program your .hex file.
-
-Depending on which keymap you would like to use, you will have to compile slightly differently.
-
-### Default
-
-To build with the default keymap, simply run `make`.
-
-### Other Keymaps
-
-To build the firmware binary hex file with a keymap just do `make` with `keymap` option like:
-
-```
-$ make keymap=[default|jack|<name>]
-```
-
-Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`
diff --git a/keyboards/handwired/fivethirteen/fivethirteen.h b/keyboards/handwired/fivethirteen/fivethirteen.h
index faa6de737..6d14b7f1c 100644
--- a/keyboards/handwired/fivethirteen/fivethirteen.h
+++ b/keyboards/handwired/fivethirteen/fivethirteen.h
@@ -3,19 +3,19 @@
#include "quantum.h"
-#define KEYMAP( \
- k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k010, k011, k012, \
- k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k110, k111, k112, \
- k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k210, k211, k212, \
- k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k310, k311, k312, \
- k40, k41, k42, k43, k44, k46, k47, k48, k49, k410, k411, k412 \
+#define LAYOUT( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k010, k011, k012, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k110, k111, k112, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k210, k211, k212, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k310, k311, k312, \
+ k40, k41, k42, k43, k44, k46, k47, k48, k49, k410, k411, k412 \
) \
{ \
- { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k010, k011, k012 }, \
- { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k110, k111, k112 }, \
- { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k210, k211, k212 }, \
- { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k310, k311, k312 }, \
- { k40, k41, k42, k43, k44, KC_NO, k46, k47, k48, k49, k410, k411, k412 } \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k010, k011, k012 }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k110, k111, k112 }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k210, k211, k212 }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k310, k311, k312 }, \
+ { k40, k41, k42, k43, k44, KC_NO, k46, k47, k48, k49, k410, k411, k412 } \
}
#endif
diff --git a/keyboards/handwired/fivethirteen/info.json b/keyboards/handwired/fivethirteen/info.json
new file mode 100644
index 000000000..f95cbbe01
--- /dev/null
+++ b/keyboards/handwired/fivethirteen/info.json
@@ -0,0 +1,77 @@
+{
+ "keyboard_name": "fivethirteen",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 13,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "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":"Tab", "x":0, "y":1},
+ {"label":"Q", "x":1, "y":1},
+ {"label":"W", "x":2, "y":1},
+ {"label":"E", "x":3, "y":1},
+ {"label":"R", "x":4, "y":1},
+ {"label":"T", "x":5, "y":1},
+ {"label":"Y", "x":6, "y":1},
+ {"label":"U", "x":7, "y":1},
+ {"label":"I", "x":8, "y":1},
+ {"label":"O", "x":9, "y":1},
+ {"label":"P", "x":10, "y":1},
+ {"label":"[", "x":11, "y":1},
+ {"label":"]", "x":12, "y":1},
+ {"label":"Ctrl/Esc", "x":0, "y":2},
+ {"label":"A", "x":1, "y":2},
+ {"label":"S", "x":2, "y":2},
+ {"label":"D", "x":3, "y":2},
+ {"label":"F", "x":4, "y":2},
+ {"label":"G", "x":5, "y":2},
+ {"label":"H", "x":6, "y":2},
+ {"label":"J", "x":7, "y":2},
+ {"label":"K", "x":8, "y":2},
+ {"label":"L", "x":9, "y":2},
+ {"label":";", "x":10, "y":2},
+ {"label":"'", "x":11, "y":2},
+ {"label":"Enter", "x":12, "y":2},
+ {"label":"Shift", "x":0, "y":3},
+ {"label":"Z", "x":1, "y":3},
+ {"label":"X", "x":2, "y":3},
+ {"label":"C", "x":3, "y":3},
+ {"label":"V", "x":4, "y":3},
+ {"label":"B", "x":5, "y":3},
+ {"label":"N", "x":6, "y":3},
+ {"label":"M", "x":7, "y":3},
+ {"label":",", "x":8, "y":3},
+ {"label":".", "x":9, "y":3},
+ {"label":"/", "x":10, "y":3},
+ {"label":"Up", "x":11, "y":3},
+ {"label":"\\", "x":12, "y":3},
+ {"label":"MO(MOS)", "x":0, "y":4},
+ {"label":"Ctrl", "x":1, "y":4},
+ {"label":"Alt", "x":2, "y":4},
+ {"label":"GUI", "x":3, "y":4},
+ {"label":"MO(HDN)", "x":4, "y":4},
+ {"label":"Space", "x":5, "y":4, "w":2},
+ {"label":"Shift/Backspace", "x":7, "y":4},
+ {"label":"MO(OSY)", "x":8, "y":4},
+ {"label":"MO(HDN)", "x":9, "y":4},
+ {"label":"Left", "x":10, "y":4},
+ {"label":"Down", "x":11, "y":4},
+ {"label":"Right", "x":12, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/fivethirteen/keymaps/default/keymap.c b/keyboards/handwired/fivethirteen/keymaps/default/keymap.c
index d718510d5..d92f32e35 100644
--- a/keyboards/handwired/fivethirteen/keymaps/default/keymap.c
+++ b/keyboards/handwired/fivethirteen/keymaps/default/keymap.c
@@ -1,6 +1,4 @@
-#include "fivethirteen.h"
-
-#define _______ KC_TRNS
+#include QMK_KEYBOARD_H
#define HDN 1
#define OSY 2
@@ -9,28 +7,28 @@
#define SFT_BSP SFT_T(KC_BSPC)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = KEYMAP(
+[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_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, \
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, KC_UP, KC_BSLS, \
MO(MOS), KC_LCTL, KC_LALT, KC_LGUI, MO(HDN), KC_SPC , SFT_BSP, MO(OSY), MO(HDN), KC_LEFT, KC_DOWN, KC_RGHT \
),
-[HDN] = KEYMAP(
+[HDN] = 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_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, _______, _______, \
_______, KC_TILD, KC_GRV, KC_BSLS, KC_PIPE, KC_MINS, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_TILD, KC_GRV, _______, \
_______, _______, _______, _______, _______, _______, _______, KC_ENT, _______, _______, _______, KC_PGUP, _______, \
_______, _______, _______, _______, _______, KC_UNDS , KC_DEL, _______, _______, KC_HOME, KC_PGDN, KC_END \
),
-[OSY] = KEYMAP(
+[OSY] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, KC_VOLD, KC_VOLU, KC_MUTE, KC_PWR, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
),
-[MOS] = KEYMAP(
+[MOS] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_BTN2, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, _______, _______, _______, \
@@ -38,12 +36,3 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
)
};
-
-
-const uint16_t PROGMEM fn_actions[] = {
-
-};
-
-const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
- return MACRO_NONE;
-};
diff --git a/keyboards/handwired/fivethirteen/readme.md b/keyboards/handwired/fivethirteen/readme.md
new file mode 100644
index 000000000..1a22fc9b9
--- /dev/null
+++ b/keyboards/handwired/fivethirteen/readme.md
@@ -0,0 +1,12 @@
+# fivethirteen
+
+A handwired 5x13 ortholinear keyboard with a 2U space bar.
+
+Keyboard Maintainer: [The QMK Community](https://github.com/qmk)
+Hardware Supported: fivethirteen handwired
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/fivethirteen: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/frenchdev/frenchdev.h b/keyboards/handwired/frenchdev/frenchdev.h
index 82121e044..82dbe18b8 100644
--- a/keyboards/handwired/frenchdev/frenchdev.h
+++ b/keyboards/handwired/frenchdev/frenchdev.h
@@ -77,7 +77,7 @@ inline void frenchdev_led_all_set(uint8_t n)
frenchdev_led_3_set(n);
}
-#define KEYMAP( \
+#define LAYOUT( \
\
k01, k02, k03, k04, k05, k06, k09, k0a, k0b, k0c, k0d, k0e, \
k10, k11, k12, k13, k14, k15, k16, k19, k1a, k1b, k1c, k1d, k1e, k1f, \
diff --git a/keyboards/handwired/frenchdev/info.json b/keyboards/handwired/frenchdev/info.json
new file mode 100644
index 000000000..0f3c0a94f
--- /dev/null
+++ b/keyboards/handwired/frenchdev/info.json
@@ -0,0 +1,114 @@
+{
+ "keyboard_name": "",
+ "url": "",
+ "maintainer": "qmk",
+ "bootloader": "",
+ "width": 20,
+ "height": 8,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"F1", "x":1, "y":0.9},
+ {"label":"F2", "x":2, "y":0.3},
+ {"label":"F3", "x":3, "y":0},
+ {"label":"F4", "x":4, "y":0.4},
+ {"label":"F5", "x":5, "y":0.5},
+ {"label":"F6", "x":6, "y":0.5},
+ {"label":"F7", "x":13, "y":0.5},
+ {"label":"F8", "x":14, "y":0.5},
+ {"label":"F9", "x":15, "y":0.4},
+ {"label":"F10", "x":16, "y":0},
+ {"label":"F11", "x":17, "y":0.3},
+ {"label":"F12", "x":18, "y":0.9},
+
+ {"label":"Esc", "x":0, "y":1.9},
+ {"label":"\"", "x":1, "y":1.9},
+ {"label":"\u00ab", "x":2, "y":1.3},
+ {"label":"\u00bb", "x":3, "y":1},
+ {"label":"(", "x":4, "y":1.4},
+ {"label":")", "x":5, "y":1.5},
+ {"label":"\u00a8", "x":6, "y":1.5},
+ {"label":"^", "x":13, "y":1.5},
+ {"label":"@", "x":14, "y":1.5},
+ {"label":"+", "x":15, "y":1.4},
+ {"label":"-", "x":16, "y":1},
+ {"label":"/", "x":17, "y":1.3},
+ {"label":"*", "x":18, "y":1.9},
+ {"label":"Backspace", "x":19, "y":1.9},
+
+ {"label":"Tab", "x":0, "y":2.9},
+ {"label":"B", "x":1, "y":2.9},
+ {"label":"&Eacute;", "x":2, "y":2.3},
+ {"label":"P", "x":3, "y":2},
+ {"label":"O", "x":4, "y":2.4},
+ {"label":"&Egrave;", "x":5, "y":2.5},
+ {"label":"_", "x":6, "y":2.5},
+ {"label":"=", "x":13, "y":2.5},
+ {"label":"K", "x":14, "y":2.5},
+ {"label":"V", "x":15, "y":2.4},
+ {"label":"D", "x":16, "y":2},
+ {"label":"L", "x":17, "y":2.3},
+ {"label":"J", "x":18, "y":2.9},
+ {"label":"Enter", "x":19, "y":2.9},
+
+ {"label":"`", "x":0, "y":3.9},
+ {"label":"A", "x":1, "y":3.9},
+ {"label":"U", "x":2, "y":3.3},
+ {"label":"E", "x":3, "y":3},
+ {"label":"I", "x":4, "y":3.4},
+ {"label":"F", "x":5, "y":3.5},
+ {"label":";", "x":6, "y":3.5},
+ {"label":"!", "x":13, "y":3.5},
+ {"label":"C", "x":14, "y":3.5},
+ {"label":"T", "x":15, "y":3.4},
+ {"label":"S", "x":16, "y":3},
+ {"label":"R", "x":17, "y":3.3},
+ {"label":"N", "x":18, "y":3.9},
+ {"label":"'", "x":19, "y":3.9},
+
+ {"label":"Shift", "x":0, "y":4.9},
+ {"label":"Z", "x":1, "y":4.9},
+ {"label":"&Agrave;", "x":2, "y":4.3},
+ {"label":"Y", "x":3, "y":4},
+ {"label":"X", "x":4, "y":4.4},
+ {"label":"]", "x":5, "y":4.5},
+ {"label":"Shift/Space", "x":6.5, "y":5},
+ {"label":"Ctrl/Backspace", "x":7.5, "y":5},
+ {"label":"Layer 2/Insert", "x":8.5, "y":5},
+ {"label":"Layer 2 Lock", "x":10.5, "y":5},
+ {"label":"Ctrl/Delete", "x":11.5, "y":5},
+ {"label":"Shift/Space", "x":12.5, "y":5},
+ {"label":"M", "x":14, "y":4.5},
+ {"label":"G", "x":15, "y":4.4},
+ {"label":"Up", "x":16, "y":4},
+ {"label":"H", "x":17, "y":4.3},
+ {"label":"Q", "x":18, "y":4.9},
+ {"label":"Shift", "x":19, "y":4.9},
+
+ {"label":"Ctrl", "x":0, "y":5.9},
+ {"label":"GUI", "x":1, "y":5.9},
+ {"label":"Keypad /", "x":2, "y":5.3},
+ {"label":".", "x":3, "y":5},
+ {"label":",", "x":4, "y":5.4},
+ {"label":"Space", "x":5, "y":5.5},
+ {"label":"Layer 1/Space", "x":6.5, "y":6},
+ {"label":"Alt", "x":7.5, "y":6},
+ {"label":"Caps Lock", "x":11.5, "y":6},
+ {"label":"Layer 1/Space", "x":12.5, "y":6},
+ {"label":"Space", "x":14, "y":5.5},
+ {"label":"Left", "x":15, "y":5.4},
+ {"label":"Down", "x":16, "y":5},
+ {"label":"Right", "x":17, "y":5.3},
+ {"label":":", "x":18, "y":5.9},
+ {"label":"Ctrl", "x":19, "y":5.9},
+
+ {"label":"Left Pedal 1", "x":2.25, "y":7.5, "w":1.5, "h":2},
+ {"label":"Left Pedal 2", "x":3.75, "y":7.5, "w":1.5, "h":2},
+ {"label":"Left Pedal 3", "x":5.25, "y":7.5, "w":1.5, "h":2},
+ {"label":"Right Pedal 1", "x":13.25, "y":7.5, "w":1.5, "h":2},
+ {"label":"Right Pedal 2", "x":14.75, "y":7.5, "w":1.5, "h":2},
+ {"label":"Right Pedal 3", "x":16.25, "y":7.5, "w":1.5, "h":2}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/frenchdev/keymaps/default/keymap.c b/keyboards/handwired/frenchdev/keymaps/default/keymap.c
index e6d72d013..635383b55 100644
--- a/keyboards/handwired/frenchdev/keymaps/default/keymap.c
+++ b/keyboards/handwired/frenchdev/keymaps/default/keymap.c
@@ -1,8 +1,6 @@
-#include "frenchdev.h"
+#include QMK_KEYBOARD_H
#include "mousekey.h"
-#include "action.h"
-#include "action_layer.h"
-#include "keymap_extras/keymap_bepo.h"
+#include "keymap_bepo.h"
// Each layer gets a name for readability, which is then used in the keymap matrix below.
@@ -67,7 +65,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `-------------/ \-------------/ .. \-------------/ \-------------/ *
*M(M_LP)
*/
-[_BASE] = KEYMAP(
+[_BASE] = 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_ESC, BP_DQOT, BP_LGIL, BP_RGIL, BP_LPRN, BP_RPRN, BP_DTRM, BP_DCRC, BP_AT, BP_PLUS, BP_MINS, BP_SLSH, BP_ASTR, KC_BSPC, \
KC_TAB, BP_B, BP_ECUT, BP_O, BP_P, BP_EGRV, BP_UNDS, BP_EQL, BP_K, BP_V, BP_D, BP_L, BP_J, KC_ENT, \
@@ -99,7 +97,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `-------------/ \-------------/ .. \-------------/ \-------------/ *
*
*/
-[_SYMBOLS] = KEYMAP(
+[_SYMBOLS] = 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, BP_DCUR, BP_PARG, BP_SECT, BP_DGRK, KC_TRNS, BP_TILD, BP_DCAR, BP_LEQL, BP_GEQL, BP_PSMS, BP_OBEL, BP_TIMS, KC_TRNS, \
KC_TRNS, BP_BSLS, BP_ASTR, BP_LCBR, BP_RCBR, BP_GRV, KC_TRNS, BP_DIFF, BP_HASH, BP_LBRC, BP_RBRC, BP_PERC, BP_PMIL, KC_TRNS, \
@@ -131,7 +129,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `-------------/ \-------------/ .. \-------------/ \-------------/ *
*
*/
-[_MEDIA] = KEYMAP(
+[_MEDIA] = LAYOUT(
RESET, KC_SLCK, KC_PAUS, KC_MUTE, KC_VOLD, KC_VOLU, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, KC_CALC, KC_NLCK, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_MSTP, KC_MPRV, KC_MNXT, KC_MPLY, KC_MPLY, KC_MPRV, KC_MNXT, KC_MSTP, KC_TRNS, KC_PMNS, KC_TRNS, \
KC_TRNS, KC_TRNS, KC_TRNS, KC_WH_U, KC_TRNS, KC_BTN4, KC_BTN5, KC_BTN4, KC_BTN5, KC_KP_7, KC_KP_8, KC_KP_9, KC_PPLS, KC_TRNS, \
@@ -163,7 +161,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*
*/
-[_TRNS] = KEYMAP(
+[_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, \
diff --git a/keyboards/handwired/frenchdev/readme.md b/keyboards/handwired/frenchdev/readme.md
index 698b4befb..9d7c59e71 100644
--- a/keyboards/handwired/frenchdev/readme.md
+++ b/keyboards/handwired/frenchdev/readme.md
@@ -6,29 +6,29 @@ Concept based on
with the added possibility to connect up to 6 external switches like pedals,
and somewhat like the katy, not all keys are on the same level for easier reach.
-###Photos
+### Photos
- [default layout](http://i.imgur.com/r2Nvr4p.png)
- [editable layout on keyboard layout editor](http://www.keyboard-layout-editor.com/#/gists/4480e3ab8026eb7c710a7e22203ef4aa) (keys placement is NOT precise on this)
- [the thing when finished](http://imgur.com/a/6FY8v)
- [concept and cardboard mockup](http://imgur.com/a/R0vvs)
-##Build instructions
+## Build instructions
docker run --rm -e keymap=default -e keyboard=frenchdev --rm -v D:/Repositories/qmk:/qmk:rw edasque/qmk_firmware
-##Laser-cuttable file
+## Laser-cuttable file
There is intentionnaly no hole for the TRRS connector, you are supposed to use a drill for it.
This way if you don't want to use the pedals you don't have a useless hole. Plus it's cleaner.
http://qmk.fm/frenchdev/frenchdev_v1_lasercut_template.svg
-##Side stickers
+## Side stickers
You can find my original file here : http://qmk.fm/frenchdev/example_printable_stickers.svg
I used it when training but now I use blanks and the layout is different.
I still uploaded it because I think it can be a good jumpstart for any temporary stickers on the
side of keycaps.
-##List of parts
+## List of parts
- I2C mcp23018
- [teensy 2](https://www.pjrc.com/store/teensy.html)
- 3 LED, 5mm tall with flat head
@@ -43,13 +43,13 @@ side of keycaps.
- 20 R2 keys
- 22 R1 keys
-if you fancy adding pedals :
+If you fancy adding pedals :
[these are good enough and cheap](https://www.amazon.fr/gp/product/B00V7WITKI/ref=oh_aui_detailpage_o04_s00?ie=UTF8&psc=1). You also need a RCA connector for each of those to replace the included cable
If you (or your coworkers) find them too loud you can replace the switch inside them.
For once we don't really care about what's inside :)
-##Various indications
+## Various indications
The PHYSICAL rows and columns are connected as such :
@@ -96,7 +96,7 @@ and on left hand (main) :
We use pull up resistor for SCL and VDA, see https://github.com/ErgoDox-EZ/docs/blob/master/ErgoDox%20EZ%20Schematic.pdf for example
-the connector is a standard TRRS (jack with audio + mic)
+The connector is a standard TRRS (jack with audio + mic)
Diode direction is row to column
diff --git a/keyboards/handwired/gamenum/gamenum.h b/keyboards/handwired/gamenum/gamenum.h
index ea633b9bf..3a1429ff8 100644
--- a/keyboards/handwired/gamenum/gamenum.h
+++ b/keyboards/handwired/gamenum/gamenum.h
@@ -3,19 +3,19 @@
#include "quantum.h"
-#define KEYMAP( \
+#define LAYOUT( \
k00, k01, k02, k03, \
k10, k11, k12, k13, \
- k20, k21, k22, \
- k30, k31, k32, \
- k41, k42, k43 \
+ k20, k21, k22, \
+ k30, k31, k32, \
+ k41, k42, k43 \
) \
{ \
- { k00, k01, k02, k03}, \
- { k10, k11, k12, k13}, \
- { k20, k21, k22, KC_NO}, \
- { k30, k31, k32, KC_NO}, \
- { KC_NO, k41, k42, k43} \
+ { k00, k01, k02, k03 }, \
+ { k10, k11, k12, k13 }, \
+ { k20, k21, k22, KC_NO }, \
+ { k30, k31, k32, KC_NO }, \
+ { KC_NO, k41, k42, k43 } \
}
#endif
diff --git a/keyboards/handwired/gamenum/info.json b/keyboards/handwired/gamenum/info.json
new file mode 100644
index 000000000..dc80f027e
--- /dev/null
+++ b/keyboards/handwired/gamenum/info.json
@@ -0,0 +1,30 @@
+{
+ "keyboard_name": "gamenum",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 4,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"Fn", "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, "h":2},
+ {"label":"4", "x":0, "y":2},
+ {"label":"5", "x":1, "y":2},
+ {"label":"6", "x":2, "y":2},
+ {"label":"1", "x":0, "y":3},
+ {"label":"2", "x":1, "y":3},
+ {"label":"3", "x":2, "y":3},
+ {"label":"0", "x":0, "y":4, "w":2},
+ {"label":".", "x":2, "y":4},
+ {"label":"Ent", "x":3, "y":3, "h":2}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/gamenum/keymaps/default/keymap.c b/keyboards/handwired/gamenum/keymaps/default/keymap.c
index 6950b741a..a18ffc89b 100644
--- a/keyboards/handwired/gamenum/keymaps/default/keymap.c
+++ b/keyboards/handwired/gamenum/keymaps/default/keymap.c
@@ -1,36 +1,32 @@
-#include "gamenum.h"
-#include "action_layer.h"
-#include "eeconfig.h"
+#include QMK_KEYBOARD_H
-#define _______ KC_TRNS
-
#define DEF 0
#define HDN 1
#define OSY 2
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[DEF] = KEYMAP(
- KC_FN0, KC_SLSH, KC_ASTR, KC_MINS, \
- KC_7, KC_8, KC_9, KC_PLUS, \
- KC_4, KC_5, KC_6, \
- KC_1, KC_2, KC_3, \
- KC_0, KC_DOT, KC_ENT \
-),
-[HDN] = KEYMAP(
- KC_FN1, KC_1, KC_2, KC_3, \
- KC_Q, KC_W, KC_E, KC_R, \
- KC_A, KC_S, KC_D, \
- KC_Z, KC_X, KC_C, \
- KC_LSFT, KC_LALT, KC_SPC \
-),
-[OSY] = KEYMAP(
- KC_A, KC_Q, KC_1, KC_FN2, \
- KC_S, KC_W, KC_2, KC_LALT, \
- KC_D, KC_E, KC_3, \
- KC_F, KC_R, KC_4, \
- KC_SPC, KC_T, KC_TAB \
-)
+ [DEF] = LAYOUT(
+ KC_FN0, KC_SLSH, KC_ASTR, KC_MINS, \
+ KC_7, KC_8, KC_9, KC_PLUS, \
+ KC_4, KC_5, KC_6, \
+ KC_1, KC_2, KC_3, \
+ KC_0, KC_DOT, KC_ENT \
+ ),
+ [HDN] = LAYOUT(
+ KC_FN1, KC_1, KC_2, KC_3, \
+ KC_Q, KC_W, KC_E, KC_R, \
+ KC_A, KC_S, KC_D, \
+ KC_Z, KC_X, KC_C, \
+ KC_LSFT, KC_LALT, KC_SPC \
+ ),
+ [OSY] = LAYOUT(
+ KC_A, KC_Q, KC_1, KC_FN2, \
+ KC_S, KC_W, KC_2, KC_LALT, \
+ KC_D, KC_E, KC_3, \
+ KC_F, KC_R, KC_4, \
+ KC_SPC, KC_T, KC_TAB \
+ )
};
@@ -48,21 +44,21 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
bool process_record_user (uint16_t keycode, keyrecord_t *record) {
switch(keycode) {
case KC_FN0:
- if (record->event.pressed) {
- PORTC |= (1 << 6); // PC6 goes high
- }
- break;
+ if (record->event.pressed) {
+ PORTC |= (1 << 6); // PC6 goes high
+ }
+ break;
case KC_FN1:
- if (record->event.pressed) {
- PORTC &= ~(1 << 6); // PC6 goes high
- PORTD |= (1<<4);
- }
- break;
+ if (record->event.pressed) {
+ PORTC &= ~(1 << 6); // PC6 goes high
+ PORTD |= (1<<4);
+ }
+ break;
case KC_FN2:
- if (record->event.pressed) {
- PORTD &= ~(1 << 4); // PC6 goes high
- }
- break;
+ if (record->event.pressed) {
+ PORTD &= ~(1 << 4); // PC6 goes high
+ }
+ break;
}
return true;
-} \ No newline at end of file
+}
diff --git a/keyboards/handwired/gamenum/README.md b/keyboards/handwired/gamenum/readme.md
index bf8045be1..ee28cc182 100644
--- a/keyboards/handwired/gamenum/README.md
+++ b/keyboards/handwired/gamenum/readme.md
@@ -1,5 +1,16 @@
-GameNum firmware
-======================
+# GameNum
+
+A handwired standard numpad oriented toward gaming on the go.
+
+Keyboard Maintainer: [The QMK Community](https://github.com/qmk)
+Hardware Supported: GameNum, Pro Micro
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/gamenum: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).
+
## Board overview
The GameNum was designed to facilitate the use of mechanical keys for gaming even when your packing space is limited.
@@ -22,7 +33,7 @@ The indicator LED's are normally assigned to `pin C6` and `pin D4`, C6 goes high
Keep in mind that the minus of the diodes should point towards the pro micros inputs.
-##LED hookup
+## LED hookup
![led overview](http://i.imgur.com/U6m865n.jpg)
@@ -34,13 +45,13 @@ Keep in mind here that the number after the name should correspond with the numb
Next thing to do is to add the actual layer for the keymap.
```
-[DEF] = KEYMAP(
- KC_FN0, KC_SLSH, KC_ASTR, KC_MINS, \
- KC_7, KC_8, KC_9, KC_PLUS, \
- KC_4, KC_5, KC_6, \
- KC_1, KC_2, KC_3, \
- KC_0, KC_DOT, KC_ENT \
-)
+ [DEF] = LAYOUT(
+ KC_FN0, KC_SLSH, KC_ASTR, KC_MINS, \
+ KC_7, KC_8, KC_9, KC_PLUS, \
+ KC_4, KC_5, KC_6, \
+ KC_1, KC_2, KC_3, \
+ KC_0, KC_DOT, KC_ENT \
+ )
```
This is the default layer for the gamenum. It's generally easiest to just copy this and change things as you see fit. Keep in mind that at least 1 button on the pad has to be used to switch to the next layer in the stack or you will be stuck in that layer FOREVER! D:
@@ -54,8 +65,8 @@ Now for the LEDs, if you plan on adding extra LED's to the keyboard to indicate
Look for this piece of code:
```
- DDRD |= (1<<4);
- PORTD &= ~(1<<4);
+ DDRD |= (1<<4);
+ PORTD &= ~(1<<4);
```
Copy it and change the letter after DDR and PORT to the letter of your pin. Change the 4 to the number of your pin. `DDRx |= (1<<y);` defines that pin as an output. `PORTx &= ~(1<<y);` sets the pin to LOW turning off the LED.
@@ -64,39 +75,11 @@ Now go back to `keymap.c` and look for the `process_record_user` function. The f
```
case KC_FN1:
- if (record->event.pressed) {
- PORTC &= ~(1 << 6); // PC6 goes low
- PORTD |= (1<<4); //PD4 goes high
- }
- break;
+ if (record->event.pressed) {
+ PORTC &= ~(1 << 6); // PC6 goes low
+ PORTD |= (1<<4); //PD4 goes high
+ }
+ break;
```
This is the code for the KC_FN1 button. Notice how we check against what key is pressed in the case and then set pin C6 low and pin D4 high. Adjust this as you see fit.
-
-
-## Quantum MK Firmware
-
-For the full Quantum feature list, see [the parent readme.md](/docs/README.md).
-
-## Building
-
-Download or clone the whole firmware and navigate to the keyboards/handwired/gamenum folder.
-Read the README.md for the qmk repository on how to set up your developer enviroment to build your firmware with.
-Building firmware on Windows can be a bit of a hassle. Linux is a lot easier to use if you have some experience with it. A raspberry pi will already be able to build the firmware for you.
-Once your dev env is set up, you'll be able to type `make` to generate your .hex - you can then use AVRDudess to program your .hex file.
-
-### Default
-
-To build with the default keymap, simply run `make`.
-
-### Other Keymaps
-
-To build the firmware binary hex file with a keymap just do `make` with `keymap` option like:
-
-```
-$ make keymap=[default|jack|<name>]
-```
-
-Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`
-
-
diff --git a/keyboards/handwired/ibm122m/config.h b/keyboards/handwired/ibm122m/config.h
new file mode 100644
index 000000000..1c8e0587d
--- /dev/null
+++ b/keyboards/handwired/ibm122m/config.h
@@ -0,0 +1,190 @@
+/*
+Copyright 2018 REPLACE_WITH_YOUR_NAME
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General 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 0x0000
+#define DEVICE_VER 0x0001
+#define MANUFACTURER IBM
+#define PRODUCT IBM Model M 122 key
+#define DESCRIPTION Mapping by github.com/lukexorz
+
+/* key matrix size */
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 20
+
+/*
+ * 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 { E6, B7, D0, D1, D2, D3, D4, D5, D6, D7, E0, E1, C0, C1, C2, C3, C4, C5, C7, F1 }
+#define MATRIX_ROW_PINS { F0, B5, B4, B3, B2, B1, B0, E7 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
+#define DIODE_DIRECTION ROW2COL
+
+// #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 DEBOUNCING_DELAY 15
+
+/* 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 */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+#define B6_AUDIO
+#define C6_AUDIO
+
+/* 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/handwired/ibm122m/ibm122m.c b/keyboards/handwired/ibm122m/ibm122m.c
new file mode 100644
index 000000000..1c52b94ec
--- /dev/null
+++ b/keyboards/handwired/ibm122m/ibm122m.c
@@ -0,0 +1,43 @@
+/* Copyright 2018 REPLACE_WITH_YOUR_NAME
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "ibm122m.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/handwired/ibm122m/ibm122m.h b/keyboards/handwired/ibm122m/ibm122m.h
new file mode 100644
index 000000000..a52bf4bc4
--- /dev/null
+++ b/keyboards/handwired/ibm122m/ibm122m.h
@@ -0,0 +1,41 @@
+/* Copyright 2018 REPLACE_WITH_YOUR_NAME
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 following is an example using the Planck MIT layout
+// The first section contains all of the arguments
+// The second converts the arguments into a two-dimensional array
+#define LAYOUT( \
+ k09, k19, k1A, k29, k39, k3A, k49, k59, k5A, k69, k79, k7A, \
+ k0A, k0B, k1B, k2A, k2B, k3B, k4A, k4B, k5B, k6A, k6B, k7B, \
+ k31, k32, k34, k24, k25, k26, k27, k37, k38, k28, k2C, k2D, k2E, k3E, k3C, k3F, k3G, k3H, k2G, k2F, k2H, k2I, k20, \
+ k21, k41, k42, k44, k45, k46, k47, k57, k58, k48, k4C, k4D, k4E, k5E, k5C, k6F, k1G, k5G, k4G, k4F, k4H, k4I, k40, \
+ k51, k52, k62, k14, k15, k16, k17, k07, k08, k18, k1C, k1D, k1E, k0E, k6E, k0G, k1F, k1H, k1I, k10, \
+ k11, k12, k73, k74, k64, k65, k66, k67, k77, k78, k68, k6C, k6D, k7E, k63, k60, k0J, k1J, k61, k6H, k6I, k7J, \
+ k02, k01, k00, k70, k71, k03, k72, k0F, k7H, k7I \
+) \
+{ \
+ { k00, k01, k02, k03, KC_NO, KC_NO, KC_NO, k07, k08, k09, k0A, k0B, KC_NO, KC_NO, k0E, k0F, k0G, KC_NO, KC_NO, k0J }, \
+ { k10, k11, k12, KC_NO, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, k1F, k1G, k1H, k1I, k1J }, \
+ { k20, k21, KC_NO, KC_NO, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2E, k2F, k2G, k2H, k2I, KC_NO }, \
+ { KC_NO, k31, k32, KC_NO, k34, KC_NO, KC_NO, k37, k38, k39, k3A, k3B, k3C, KC_NO, k3E, k3F, k3G, k3H, KC_NO, KC_NO }, \
+ { k40, k41, k42, KC_NO, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k4F, k4G, k4H, k4I, KC_NO }, \
+ { KC_NO, k51, k52, KC_NO, KC_NO, KC_NO, KC_NO, k57, k58, k59, k5A, k5B, k5C, KC_NO, k5E, KC_NO, k5G, KC_NO, KC_NO, KC_NO }, \
+ { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6A, k6B, k6C, k6D, k6E, k6F, KC_NO, k6H, k6I, KC_NO }, \
+ { k70, k71, k72, k73, k74, KC_NO, KC_NO, k77, k78, k79, k7A, k7B, KC_NO, KC_NO, k7E, KC_NO, KC_NO, k7H, k7I, k7J }, \
+}
diff --git a/keyboards/handwired/ibm122m/info.json b/keyboards/handwired/ibm122m/info.json
new file mode 100644
index 000000000..b9ce9e8f8
--- /dev/null
+++ b/keyboards/handwired/ibm122m/info.json
@@ -0,0 +1,136 @@
+{
+ "keyboard_name": "IBM Model M 122-key",
+ "url": "",
+ "maintainer": "qmk",
+ "bootloader": "",
+ "width": 24.75,
+ "height": 8,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"F13", "x":3.25, "y":0},
+ {"label":"F14", "x":4.25, "y":0},
+ {"label":"F15", "x":5.25, "y":0},
+ {"label":"F16", "x":6.25, "y":0},
+ {"label":"F17", "x":7.25, "y":0},
+ {"label":"F18", "x":8.25, "y":0},
+ {"label":"F19", "x":9.25, "y":0},
+ {"label":"F20", "x":10.25, "y":0},
+ {"label":"F21", "x":11.25, "y":0},
+ {"label":"F22", "x":12.25, "y":0},
+ {"label":"F23", "x":13.25, "y":0},
+ {"label":"F24", "x":14.25, "y":0},
+ {"label":"F1", "x":3.25, "y":1},
+ {"label":"F2", "x":4.25, "y":1},
+ {"label":"F3", "x":5.25, "y":1},
+ {"label":"F4", "x":6.25, "y":1},
+ {"label":"F5", "x":7.25, "y":1},
+ {"label":"F6", "x":8.25, "y":1},
+ {"label":"F7", "x":9.25, "y":1},
+ {"label":"F8", "x":10.25, "y":1},
+ {"label":"F9", "x":11.25, "y":1},
+ {"label":"F10", "x":12.25, "y":1},
+ {"label":"F11", "x":13.25, "y":1},
+ {"label":"F12", "x":14.25, "y":1},
+ {"label":"Esc", "x":0, "y":3},
+ {"x":1, "y":3},
+ {"label":"`", "x":2.25, "y":3},
+ {"label":"1", "x":3.25, "y":3},
+ {"label":"2", "x":4.25, "y":3},
+ {"label":"3", "x":5.25, "y":3},
+ {"label":"4", "x":6.25, "y":3},
+ {"label":"5", "x":7.25, "y":3},
+ {"label":"6", "x":8.25, "y":3},
+ {"label":"7", "x":9.25, "y":3},
+ {"label":"8", "x":10.25, "y":3},
+ {"label":"9", "x":11.25, "y":3},
+ {"label":"0", "x":12.25, "y":3},
+ {"label":"-", "x":13.25, "y":3},
+ {"label":"=", "x":14.25, "y":3},
+ {"label":"Backspace", "x":15.25, "y":3, "w":2},
+ {"label":"Insert", "x":17.5, "y":3},
+ {"label":"Home", "x":18.5, "y":3},
+ {"label":"Page Up", "x":19.5, "y":3},
+ {"label":"Num Lock", "x":20.75, "y":3},
+ {"label":"/", "x":21.75, "y":3},
+ {"label":"*", "x":22.75, "y":3},
+ {"label":"-", "x":23.75, "y":3},
+ {"x":0, "y":4},
+ {"x":1, "y":4},
+ {"label":"Tab", "x":2.25, "y":4, "w":1.5},
+ {"label":"Q", "x":3.75, "y":4},
+ {"label":"W", "x":4.75, "y":4},
+ {"label":"E", "x":5.75, "y":4},
+ {"label":"R", "x":6.75, "y":4},
+ {"label":"T", "x":7.75, "y":4},
+ {"label":"Y", "x":8.75, "y":4},
+ {"label":"U", "x":9.75, "y":4},
+ {"label":"I", "x":10.75, "y":4},
+ {"label":"O", "x":11.75, "y":4},
+ {"label":"P", "x":12.75, "y":4},
+ {"label":"[", "x":13.75, "y":4},
+ {"label":"]", "x":14.75, "y":4},
+ {"label":"Enter", "x":16, "y":4, "w":1.25, "h":2},
+ {"label":"Delete", "x":17.5, "y":4},
+ {"label":"End", "x":18.5, "y":4},
+ {"label":"Page Down", "x":19.5, "y":4},
+ {"label":"7", "x":20.75, "y":4},
+ {"label":"8", "x":21.75, "y":4},
+ {"label":"9", "x":22.75, "y":4},
+ {"label":"+", "x":23.75, "y":4},
+ {"x":0, "y":5},
+ {"x":1, "y":5},
+ {"label":"Caps Lock", "x":2.25, "y":5, "w":1.75},
+ {"label":"A", "x":4, "y":5},
+ {"label":"S", "x":5, "y":5},
+ {"label":"D", "x":6, "y":5},
+ {"label":"F", "x":7, "y":5},
+ {"label":"G", "x":8, "y":5},
+ {"label":"H", "x":9, "y":5},
+ {"label":"J", "x":10, "y":5},
+ {"label":"K", "x":11, "y":5},
+ {"label":"L", "x":12, "y":5},
+ {"label":";", "x":13, "y":5},
+ {"label":"'", "x":14, "y":5},
+ {"label":"#", "x":15, "y":5},
+ {"label":"Up", "x":18.5, "y":5},
+ {"label":"4", "x":20.75, "y":5},
+ {"label":"5", "x":21.75, "y":5},
+ {"label":"6", "x":22.75, "y":5},
+ {"x":23.75, "y":5},
+ {"x":0, "y":6},
+ {"x":1, "y":6},
+ {"label":"Shift", "x":2.25, "y":6, "w":1.25},
+ {"label":"\\", "x":3.5, "y":6},
+ {"label":"Z", "x":4.5, "y":6},
+ {"label":"X", "x":5.5, "y":6},
+ {"label":"C", "x":6.5, "y":6},
+ {"label":"V", "x":7.5, "y":6},
+ {"label":"B", "x":8.5, "y":6},
+ {"label":"N", "x":9.5, "y":6},
+ {"label":"M", "x":10.5, "y":6},
+ {"label":",", "x":11.5, "y":6},
+ {"label":".", "x":12.5, "y":6},
+ {"label":"/", "x":13.5, "y":6},
+ {"label":"Shift", "x":14.5, "y":6, "w":2.75},
+ {"label":"Left", "x":17.5, "y":6},
+ {"x":18.5, "y":6},
+ {"label":"Right", "x":19.5, "y":6},
+ {"label":"1", "x":20.75, "y":6},
+ {"label":"2", "x":21.75, "y":6},
+ {"label":"3", "x":22.75, "y":6},
+ {"label":"Enter", "x":23.75, "y":6, "h":2},
+ {"x":0, "y":7},
+ {"x":1, "y":7},
+ {"label":"Ctrl", "x":2.25, "y":7, "w":1.5},
+ {"label":"Alt", "x":4.75, "y":7, "w":1.5},
+ {"x":6.25, "y":7, "w":7},
+ {"label":"AltGr", "x":13.25, "y":7, "w":1.5},
+ {"label":"Ctrl", "x":15.75, "y":7, "w":1.5},
+ {"label":"Down", "x":18.5, "y":7},
+ {"label":"0", "x":20.75, "y":7, "w":2},
+ {"label":".", "x":22.75, "y":7}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/ibm122m/keymaps/default/config.h b/keyboards/handwired/ibm122m/keymaps/default/config.h
new file mode 100644
index 000000000..0453a7258
--- /dev/null
+++ b/keyboards/handwired/ibm122m/keymaps/default/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2018 REPLACE_WITH_YOUR_NAME
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 below
diff --git a/keyboards/handwired/ibm122m/keymaps/default/keymap.c b/keyboards/handwired/ibm122m/keymaps/default/keymap.c
new file mode 100644
index 000000000..fc383498a
--- /dev/null
+++ b/keyboards/handwired/ibm122m/keymaps/default/keymap.c
@@ -0,0 +1,46 @@
+/* Copyright 2018 REPLACE_WITH_YOUR_NAME
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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] = {
+ // Original Layer
+ [0] = LAYOUT(
+ 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_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ KC_ESC, KC_NO, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_NO, 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_ENT, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_NO, KC_NO, 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_UP, KC_P4, KC_P5, KC_P6, KC_BSPC,
+ KC_NO, KC_NO, 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_LEFT, KC_NO, KC_RIGHT, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_NO, KC_NO, KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RCTL, KC_DOWN, KC_P0, KC_PDOT
+ ),
+};
+
+void matrix_init_user(void) {
+
+}
+
+void matrix_scan_user(void) {
+
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+
+ return true;
+}
+
+void led_set_user(uint8_t usb_led) {
+
+}
diff --git a/keyboards/handwired/ibm122m/keymaps/default/readme.md b/keyboards/handwired/ibm122m/keymaps/default/readme.md
new file mode 100644
index 000000000..aa592c973
--- /dev/null
+++ b/keyboards/handwired/ibm122m/keymaps/default/readme.md
@@ -0,0 +1,2 @@
+# The default keymap for ibm122m2
+The 10 keys to the left of the alphanumerics are unbound (other than Escape on the top-left one) as I have no idea what is supposed to go there.
diff --git a/keyboards/handwired/ibm122m/keymaps/lukaus/config.h b/keyboards/handwired/ibm122m/keymaps/lukaus/config.h
new file mode 100644
index 000000000..bf338e196
--- /dev/null
+++ b/keyboards/handwired/ibm122m/keymaps/lukaus/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2018 REPLACE_WITH_YOUR_NAME
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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/handwired/ibm122m/keymaps/lukaus/keymap.c b/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c
new file mode 100644
index 000000000..9cd58c0ec
--- /dev/null
+++ b/keyboards/handwired/ibm122m/keymaps/lukaus/keymap.c
@@ -0,0 +1,586 @@
+/* Copyright 2018 REPLACE_WITH_YOUR_NAME
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 {
+ PLACEHOLDER = SAFE_RANGE,
+
+ DVP_ESC, // Grave escape basically i think
+ DVP_AMPR,
+ DVP_LBRACKET,
+ DVP_LCBR,
+ DVP_RCBR,
+ DVP_LPRN,
+ DVP_AT,
+ DVP_EQUAL,
+ DVP_ASTERISK,
+ DVP_RPRN,
+ DVP_PLUS,
+ DVP_RBRACKET,
+ DVP_EXLM,
+ DVP_HASH,
+ SHFT_DOT,
+ SHFT_COMMA
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ // Programmer's Dvorak
+ [0] = LAYOUT(
+ 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_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ KC_ESC, TO(1), DVP_ESC, DVP_AMPR, DVP_LBRACKET, DVP_LCBR, DVP_RCBR, DVP_LPRN, DVP_EQUAL,DVP_ASTERISK, DVP_RPRN, DVP_PLUS, DVP_RBRACKET, DVP_EXLM, DVP_HASH, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_NO, TO(2), KC_TAB, KC_SCOLON,KC_COMMA, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, DVP_AT, KC_ENTER, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_NO, KC_NO, MO(3), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINUS, KC_BSLS, KC_UP, KC_P4, KC_P5, KC_P6, MO(4),
+ LCTL(KC_F), KC_LALT, KC_LSHIFT,KC_ESC, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_LEFT, KC_BTN3, KC_RIGHT, KC_P1, KC_P2, KC_P3, KC_PENT,
+ LCTL(KC_C), LCTL(KC_V), KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, KC_P0, KC_PDOT
+ ),
+
+ // Qwerty layer + function
+ [1] = LAYOUT(
+ 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_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ KC_ESC, TO(0), KC_GRV, 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_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_NO, 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_ENTER, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_NO, KC_NO, MO(3), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_UP, KC_P4, KC_P5, KC_P6, KC_BSPC,
+ KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_WH_D, KC_RIGHT, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_NO, KC_LALT,KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, KC_P0, KC_PDOT
+ ),
+
+ // Orirginal Layer
+ [2] = LAYOUT(
+ 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_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ KC_ESC, TO(1), KC_GRV, 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_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ KC_NO, TO(0), 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_ENTER, KC_DEL, KC_END, KC_PGDN, KC_P7, KC_P8, KC_P9, KC_PPLS,
+ KC_NO, KC_NO, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_BSLS, KC_UP, KC_P4, KC_P5, KC_P6, KC_BSPC,
+ KC_NO, KC_NO, KC_LSHIFT,KC_NO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_WH_D, KC_RIGHT, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_NO, KC_LALT,KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, KC_P0, KC_PDOT
+ ),
+
+ // Function Layer
+ [3] = 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_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, KC_F21, KC_F22, KC_F23, KC_F24,
+ MU_TOG, KC_NO, KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ MU_MOD, KC_NO, KC_TAB, KC_NO, KC_MEDIA_PREV_TRACK, KC_MEDIA_PLAY_PAUSE, KC_MEDIA_NEXT_TRACK, KC_NO, KC_NO, KC_PGUP, KC_DEL, KC_NO, KC_NO, KC_LBRC, KC_RBRC,KC_ENTER, KC_DEL, KC_END, KC_PGDN, KC_NO, KC_NO, KC_NO, KC_PPLS,
+ KC_NO, KC_NO, KC_TRNS, KC_NO, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, KC_AUDIO_MUTE, KC_NO, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_SCOLON, KC_QUOT, KC_BSLS, KC_UP, LSFT(KC_E), LSFT(KC_F), KC_NO, KC_BSPC,
+ KC_NO, KC_LALT, KC_LSHIFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_PGDN, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_WH_D, KC_RIGHT, LSFT(KC_B), LSFT(KC_C), LSFT(KC_D), KC_PENT,
+ KC_NO, KC_NO, KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_CAPS, KC_DOWN, LSFT(KC_A), KC_PDOT
+ ),
+
+ // Literally just the numpad is different
+ [4] = LAYOUT(
+ 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_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ KC_ESC, TO(1), DVP_ESC, DVP_AMPR, DVP_LBRACKET, DVP_LCBR, DVP_RCBR, DVP_LPRN, DVP_EQUAL,DVP_ASTERISK, DVP_RPRN, DVP_PLUS, DVP_RBRACKET, DVP_EXLM, DVP_HASH, KC_BSPC, KC_INS, KC_HOME, KC_PGUP, KC_NO, KC_NO, KC_NO, KC_NO,
+ KC_NO, TO(2), KC_TAB, KC_SCOLON,KC_COMMA, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_SLSH, DVP_AT, KC_ENTER, KC_DEL, KC_END, KC_PGDN, KC_BTN1, KC_MS_U, KC_BTN2, KC_NO,
+ KC_NO, KC_NO, TO(0), KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, KC_MINUS, KC_BSLS, KC_UP, KC_MS_L, KC_NO, KC_MS_R, KC_TRNS,
+ LCTL(KC_F), KC_LALT, KC_LSHIFT,KC_NO, KC_QUOT, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, KC_RSFT, KC_LEFT, KC_BTN3, KC_RIGHT, KC_GT, KC_MS_D, KC_GT, KC_PENT,
+ LCTL(KC_C), LCTL(KC_V), KC_LCTRL, KC_LGUI, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, KC_BTN1, KC_PDOT
+
+ ),
+
+ /*
+ [4] = LAYOUT(
+ 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_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ MU_TOG, TO(0), KC_DLR, 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_INS, KC_HOME, KC_PGUP, KC_NLCK, KC_PSLS, KC_PAST, KC_PMNS,
+ MU_MOD, KC_NO, KC_TAB, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_LBRC, KC_RBRC,KC_ENTER, KC_DEL, KC_END, KC_PGDN, KC_NO, KC_NO, KC_NO, KC_PPLS,
+ KC_NO, KC_NO, KC_TRNS, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_QUOT, KC_BSLS, KC_UP, LSFT(KC_E), LSFT(KC_F), KC_NO, KC_BSPC,
+ KC_NO, KC_LALT, KC_LSHIFT,KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_COMMA, KC_DOT, KC_SLSH, KC_RSFT, KC_LEFT, KC_WH_D, KC_RIGHT, LSFT(KC_B), LSFT(KC_C), LSFT(KC_D), KC_PENT,
+ KC_NO, KC_LGUI, KC_LCTRL, KC_LALT, KC_SPC, KC_RALT, KC_RCTRL, KC_DOWN, LSFT(KC_A), KC_PDOT
+
+ ),*/
+ /*[0] = LAYOUT(
+ KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_NO,TO(1),KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1, KC_1,
+ KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, TO(2),KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2, KC_2,
+ KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3, KC_3,
+ KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_4, KC_BSPC,KC_4,KC_4,KC_4, KC_4,
+ KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5, KC_5,
+ KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6, KC_6,
+ KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7, KC_7,
+ KC_8, KC_SPC,KC_8,KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, KC_8, TO(1)
+
+ ),
+ [1] = LAYOUT(
+ KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, TO(0),KC_NO,KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T,
+ KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, TO(2),KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T,
+ KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T,
+ KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_BSPC,KC_Q,KC_R,KC_S, KC_T,
+ KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T,
+ KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T,
+ KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, KC_T,
+ KC_A, KC_SPC,KC_C,KC_D, KC_E, KC_F, KC_G, KC_H, KC_I, KC_J, KC_K, KC_L, KC_M, KC_N, KC_O, KC_P, KC_Q, KC_R, KC_S, TO(0)
+ ),
+ [2] = LAYOUT(
+ KC_LCTRL, KC_LALT, KC_C, KC_RALT, KC_E, KC_F, KC_G, KC_G, KC_H, KC_J, TO(0), TO(1), KC_M, KC_N, KC_QUOT, KC_DOWN, KC_UP, KC_R, KC_S, KC_ENTER,
+ KC_PPLS, KC_B, KC_C, KC_D, KC_A, KC_S, KC_D, KC_F, KC_J, KC_J, KC_K, KC_NO, KC_K, KC_L, KC_SCOLON, KC_P4, KC_DEL, KC_P5, KC_P6, KC_RIGHT,
+ KC_PMNS, KC_1, KC_C, KC_D, KC_1, KC_2, KC_3, KC_4, KC_7, KC_J, KC_K, KC_L, KC_8, KC_9, KC_0, KC_NLCK, KC_PGUP,KC_PSLS, KC_PAST, KC_T,
+ KC_A, KC_ESC, TO(0),KC_D, KC_GRV, KC_F, KC_G, KC_5, KC_6, KC_J, KC_K, KC_L, KC_EQL, KC_N, KC_MINUS, KC_BSPC, KC_INS, KC_HOME, KC_S, KC_T,
+ KC_PPLS, KC_NO, KC_TAB, KC_D, KC_Q, KC_W, KC_E, KC_R, KC_U, KC_J, KC_K, KC_L, KC_I, KC_O, KC_P, KC_P7, KC_PGDN,KC_P8, KC_P9, KC_T,
+ KC_A, KC_B, KC_C, KC_D, KC_E, KC_F, KC_G, KC_T, KC_Y, KC_J, KC_K, KC_L, KC_RBRC, KC_N, KC_LBRC, KC_P, KC_END, KC_R, KC_S, KC_T,
+ KC_LEFT, KC_P1, KC_CAPS, KC_RSFT, KC_Z, KC_X, KC_C, KC_V, KC_M, KC_J, KC_K, KC_L, KC_COMMA, KC_DOT, KC_BSLS, KC_PENT, KC_Q, KC_P2, KC_P3, KC_T,
+ KC_LGUI, KC_SPACE, KC_RCTRL, KC_LSHIFT, KC_E, KC_F, KC_G, KC_B, KC_N, KC_J, KC_K, KC_L, KC_M, KC_N, KC_SLSH, KC_P, KC_Q, KC_P0, KC_PDOT, KC_KP_ENTER
+ ),*/
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+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;
+};
+
+
+void matrix_init_user(void) {
+
+}
+
+void matrix_scan_user(void) {
+
+}
+
+bool left_shift_down = false;
+bool right_shift_down = false;
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case KC_LSHIFT:
+ if (record->event.pressed)
+ {
+ left_shift_down = true;
+ return true;
+ }
+ else
+ {
+ left_shift_down = false;
+ return true;
+ }
+ break;
+ case KC_RSHIFT:
+
+ if (record->event.pressed)
+ {
+ right_shift_down = true;
+ return true;
+ }
+ else
+ {
+ right_shift_down = false;
+ return true;
+ }
+ break;
+
+
+ case DVP_ESC:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ SEND_STRING("~");
+ return false;
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("$");
+ return false;
+ }
+ break;
+
+ case DVP_AMPR:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ SEND_STRING("%");
+
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("&");
+ return false;
+ }
+ break;
+
+ case DVP_LBRACKET:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_7);
+ unregister_code(KC_7);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ return false;
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("[");
+ return false;
+ }
+ break;
+
+ case DVP_LCBR:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_5);
+ unregister_code(KC_5);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ return false;
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("{");
+ return false;
+ }
+ break;
+
+ case DVP_RCBR:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_3);
+ unregister_code(KC_3);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ return false;
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("}");
+ return false;
+ }
+ break;
+
+
+ case DVP_LPRN:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_1);
+ unregister_code(KC_1);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ return false;
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("(");
+ return false;
+ }
+ break;
+//
+ case DVP_AT:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_LSHIFT);
+ register_code(KC_6);
+ unregister_code(KC_6);
+ unregister_code(KC_LSHIFT);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ return false;
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("@");
+ return false;
+ }
+ break;
+
+
+ case DVP_EQUAL:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_9);
+ unregister_code(KC_9);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ return false;
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("=");
+ return false;
+ }
+ break;
+
+ case DVP_ASTERISK:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_0);
+ unregister_code(KC_0);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ return false;
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("*");
+ return false;
+ }
+ break;
+
+ case DVP_RPRN:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_2);
+ unregister_code(KC_2);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ return false;
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING(")");
+ return false;
+ }
+ break;
+
+ case DVP_PLUS:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_4);
+ unregister_code(KC_4);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("+");
+ }
+ return false;
+ break;
+
+ case DVP_RBRACKET:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_6);
+ unregister_code(KC_6);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("]");
+ }
+ return false;
+ break;
+
+ case DVP_EXLM:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_8);
+ unregister_code(KC_8);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("!");
+ }
+ return false;
+ break;
+
+ case DVP_HASH:
+ if (left_shift_down || right_shift_down)
+ {
+ if(record->event.pressed)
+ {
+ if(left_shift_down)
+ unregister_code(KC_LSHIFT);
+ if(right_shift_down)
+ unregister_code(KC_RSHIFT);
+
+ register_code(KC_GRAVE);
+ unregister_code(KC_GRAVE);
+
+ if(left_shift_down)
+ register_code(KC_LSHIFT);
+ if(right_shift_down)
+ register_code(KC_RSHIFT);
+ }
+ }
+ else
+ {
+ if(record->event.pressed)
+ SEND_STRING("#");
+ }
+ return false;
+ break;
+ case SHFT_DOT:
+ if(record->event.pressed)
+ SEND_STRING(">");
+ break;
+
+ case SHFT_COMMA:
+ if(record->event.pressed)
+ SEND_STRING("<");
+ break;
+
+ }
+
+
+
+ return true;
+}
+
+void led_set_user(uint8_t usb_led) {
+
+}
diff --git a/keyboards/handwired/ibm122m/keymaps/lukaus/readme.md b/keyboards/handwired/ibm122m/keymaps/lukaus/readme.md
new file mode 100644
index 000000000..5d3f6abe1
--- /dev/null
+++ b/keyboards/handwired/ibm122m/keymaps/lukaus/readme.md
@@ -0,0 +1,2 @@
+# Lukaus' for ibm122m2
+Programmer's Dvorak as the default layer with a Qwerty layer that can access a function layer. Also includes the default layout, slightly modified
diff --git a/keyboards/handwired/ibm122m/readme.md b/keyboards/handwired/ibm122m/readme.md
new file mode 100644
index 000000000..09dac49c0
--- /dev/null
+++ b/keyboards/handwired/ibm122m/readme.md
@@ -0,0 +1,16 @@
+# ibm122m
+
+![IBM Model M 122 key](https://i.imgur.com/Oo3Ozqz.jpg)
+
+This is a keymap for the IBM Model M 122 key terminal keyboard running on a Teensy 2.0++
+I wired it to weird pins on mine (mainly to accomodate speakers), so make sure to update the pin arrays.
+
+Keyboard Maintainer: [Luke Stanley](https://github.com/lukexorz)
+Hardware Supported: Teensy 2.0++
+Hardware Availability: https://www.pjrc.com/store/teensypp.html
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/ibm122m:default
+
+See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.
diff --git a/keyboards/handwired/ibm122m/rules.mk b/keyboards/handwired/ibm122m/rules.mk
new file mode 100644
index 000000000..ba4be6766
--- /dev/null
+++ b/keyboards/handwired/ibm122m/rules.mk
@@ -0,0 +1,67 @@
+# MCU name
+MCU = at90usb1286
+BOOTLOADER = halfKay
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Boot Section Size in *bytes*
+# Teensy halfKay 512
+# Teensy++ halfKay 1024
+# Atmel DFU loader 4096
+# LUFA bootloader 4096
+# USBaspLoader 2048
+
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = yes # Console for debug(+400)
+COMMAND_ENABLE = yes # Commands for debug and configuration
+# 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 (+2400 to 4200, depending on config)
+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/handwired/jn68m/config.h b/keyboards/handwired/jn68m/config.h
new file mode 100644
index 000000000..22ab1158d
--- /dev/null
+++ b/keyboards/handwired/jn68m/config.h
@@ -0,0 +1,54 @@
+/*
+Copyright 2018 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 0xC714
+#define PRODUCT_ID 0x1010
+#define DEVICE_VER 0x0001
+#define MANUFACTURER MxBlue
+#define PRODUCT JN68M
+#define DESCRIPTION Custom PCB for VA68M
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 16
+
+/* key matrix pins */
+#define MATRIX_ROW_PINS { B0, B1, D5, D3, D2 }
+#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, C7, C6, B6, B5, B4, D7, D6, D4, E6, D1 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
+#define DIODE_DIRECTION COL2ROW
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCING_DELAY 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 magic key command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
diff --git a/keyboards/handwired/jn68m/info.json b/keyboards/handwired/jn68m/info.json
new file mode 100644
index 000000000..ce95563e9
--- /dev/null
+++ b/keyboards/handwired/jn68m/info.json
@@ -0,0 +1,16 @@
+{
+ "keyboard_name": "JN68M",
+ "url": "",
+ "maintainer": "qmk",
+ "bootloader": "atmel-dfu",
+ "width": 17.25,
+ "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, "w":2}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15.25, "y":1}, {"x":16.25, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":2.75}, {"x":15.25, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":14.25, "y":4}, {"x":15.25, "y":4}, {"x":16.25, "y":4}]
+ },
+ "LAYOUT_splitbs": {
+ "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":2, "y":0}, {"x":3, "y":0}, {"x":4, "y":0}, {"x":5, "y":0}, {"x":6, "y":0}, {"x":7, "y":0}, {"x":8, "y":0}, {"x":9, "y":0}, {"x":10, "y":0}, {"x":11, "y":0}, {"x":12, "y":0}, {"x":13, "y":0}, {"x":14, "y":0}, {"x":15.25, "y":0}, {"x":16.25, "y":0}, {"x":0, "y":1, "w":1.5}, {"x":1.5, "y":1}, {"x":2.5, "y":1}, {"x":3.5, "y":1}, {"x":4.5, "y":1}, {"x":5.5, "y":1}, {"x":6.5, "y":1}, {"x":7.5, "y":1}, {"x":8.5, "y":1}, {"x":9.5, "y":1}, {"x":10.5, "y":1}, {"x":11.5, "y":1}, {"x":12.5, "y":1}, {"x":13.5, "y":1, "w":1.5}, {"x":15.25, "y":1}, {"x":16.25, "y":1}, {"x":0, "y":2, "w":1.75}, {"x":1.75, "y":2}, {"x":2.75, "y":2}, {"x":3.75, "y":2}, {"x":4.75, "y":2}, {"x":5.75, "y":2}, {"x":6.75, "y":2}, {"x":7.75, "y":2}, {"x":8.75, "y":2}, {"x":9.75, "y":2}, {"x":10.75, "y":2}, {"x":11.75, "y":2}, {"x":12.75, "y":2, "w":2.25}, {"x":0, "y":3, "w":2.25}, {"x":2.25, "y":3}, {"x":3.25, "y":3}, {"x":4.25, "y":3}, {"x":5.25, "y":3}, {"x":6.25, "y":3}, {"x":7.25, "y":3}, {"x":8.25, "y":3}, {"x":9.25, "y":3}, {"x":10.25, "y":3}, {"x":11.25, "y":3}, {"x":12.25, "y":3, "w":2.75}, {"x":15.25, "y":3}, {"x":0, "y":4, "w":1.25}, {"x":1.25, "y":4, "w":1.25}, {"x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"x":10, "y":4, "w":1.25}, {"x":11.25, "y":4, "w":1.25}, {"x":12.5, "y":4, "w":1.25}, {"x":14.25, "y":4}, {"x":15.25, "y":4}, {"x":16.25, "y":4}]
+ }
+ }
+}
diff --git a/keyboards/handwired/jn68m/jn68m.c b/keyboards/handwired/jn68m/jn68m.c
new file mode 100644
index 000000000..b61b17aa9
--- /dev/null
+++ b/keyboards/handwired/jn68m/jn68m.c
@@ -0,0 +1,37 @@
+/* Copyright 2018 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 "jn68m.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);
+}
diff --git a/keyboards/handwired/jn68m/jn68m.h b/keyboards/handwired/jn68m/jn68m.h
new file mode 100644
index 000000000..d47f9f6c9
--- /dev/null
+++ b/keyboards/handwired/jn68m/jn68m.h
@@ -0,0 +1,49 @@
+/* Copyright 2018 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/>.
+ */
+#ifndef JN68M_H
+#define JN68M_H
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10, K11, K12, K13, K14, K67, K68,\
+ K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K69, K70,\
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, \
+ K43, K44, K45, K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, \
+ K56, K57, K58, K59, K60, K61, K63, K64, K65, K66 \
+) { \
+ { K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10, K11, K12, K13, K14, K67, K68 }, \
+ { K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K69, K70 }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42,KC_NO,KC_NO,KC_NO}, \
+ { K43, K44, K45, K46, K47, K48, K49, K50, K51, K52,KC_NO,K53, K54,KC_NO,K55,KC_NO}, \
+ { K56, K57, K58,KC_NO,KC_NO,K59,KC_NO,KC_NO,KC_NO,K60,KC_NO,K61, K63, K64, K65, K66} \
+}
+
+#define LAYOUT_splitbs( \
+ K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10, K11, K12, K13, K14, K15, K67, K68,\
+ K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K69, K70,\
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, \
+ K43, K44, K45, K46, K47, K48, K49, K50, K51, K52, K53, K54, K55, \
+ K56, K57, K58, K59, K60, K61, K63, K64, K65, K66 \
+) { \
+ { K1 , K2 , K3 , K4 , K5 , K6 , K7 , K8 , K9 , K10, K11, K12, K13, K14, K67, K68 }, \
+ { K16, K17, K18, K19, K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K69, K70 }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K40, K41, K42, K15,KC_NO,KC_NO}, \
+ { K43, K44, K45, K46, K47, K48, K49, K50, K51, K52,KC_NO,K53, K54,KC_NO,K55,KC_NO}, \
+ { K56, K57, K58,KC_NO,KC_NO,K59,KC_NO,KC_NO,KC_NO,K60,KC_NO,K61, K63, K64, K65, K66} \
+}
+
+#endif
diff --git a/keyboards/handwired/jn68m/keymaps/default/config.h b/keyboards/handwired/jn68m/keymaps/default/config.h
new file mode 100644
index 000000000..4496c5910
--- /dev/null
+++ b/keyboards/handwired/jn68m/keymaps/default/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2018 REPLACE_WITH_YOUR_NAME
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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/handwired/jn68m/keymaps/default/keymap.c b/keyboards/handwired/jn68m/keymaps/default/keymap.c
new file mode 100644
index 000000000..98eede94c
--- /dev/null
+++ b/keyboards/handwired/jn68m/keymaps/default/keymap.c
@@ -0,0 +1,75 @@
+/* Copyright 2018 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
+
+// Defines the keycodes used by our macros in process_record_user
+enum custom_keycodes {
+ QMKBEST = SAFE_RANGE,
+ QMKURL
+};
+
+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_BSPC, KC_INS, 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_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_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [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, KC_DEL, KC_PSCR, KC_HOME,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_END, KC_TRNS, KC_TRNS, KC_TRNS,
+ RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_APP, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case QMKBEST:
+ if (record->event.pressed) {
+ // when keycode QMKBEST is pressed
+ SEND_STRING("QMK is the best thing ever!");
+ } else {
+ // when keycode QMKBEST is released
+ }
+ break;
+ case QMKURL:
+ if (record->event.pressed) {
+ // when keycode QMKURL is pressed
+ SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER));
+ } else {
+ // when keycode QMKURL is released
+ }
+ break;
+ }
+ return true;
+}
+
+void matrix_init_user(void) {
+
+}
+
+void matrix_scan_user(void) {
+
+}
+
+void led_set_user(uint8_t usb_led) {
+
+}
diff --git a/keyboards/handwired/jn68m/readme.md b/keyboards/handwired/jn68m/readme.md
new file mode 100644
index 000000000..f219564ca
--- /dev/null
+++ b/keyboards/handwired/jn68m/readme.md
@@ -0,0 +1,14 @@
+# JN68M
+
+A custom replacement PCB for the VA68M and a birthday present for a mate.
+PCB designed by /u/Xelus22
+
+Keyboard Maintainer: [MxBlue](https://github.com/mxblu)
+Hardware Supported: ATMega32u4
+Hardware Availability: Unavailable unless you happen to be Justin ;)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/jn68m: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/jn68m/rules.mk b/keyboards/handwired/jn68m/rules.mk
new file mode 100644
index 000000000..42d85ada1
--- /dev/null
+++ b/keyboards/handwired/jn68m/rules.mk
@@ -0,0 +1,81 @@
+# MCU name
+#MCU = at90usb1286
+MCU = atmega32u4
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# atmega32a bootloadHID
+BOOTLOADER = atmel-dfu
+
+
+# If you don't know the bootloader type, then you can specify the
+# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line
+# Teensy halfKay 512
+# Teensy++ halfKay 1024
+# Atmel DFU loader 4096
+# LUFA bootloader 4096
+# USBaspLoader 2048
+# OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = no # Console for debug(+400)
+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 (+2400 to 4200, depending on config)
+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 (+400)
diff --git a/keyboards/handwired/kbod/config.h b/keyboards/handwired/kbod/config.h
index f3d0c8bf2..d3869f99e 100644
--- a/keyboards/handwired/kbod/config.h
+++ b/keyboards/handwired/kbod/config.h
@@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef CONFIG_H
-#define CONFIG_H
+#pragma once
#include "config_common.h"
@@ -48,7 +47,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
#define DIODE_DIRECTION COL2ROW
-
+
// #define BACKLIGHT_PIN B7
// #define BACKLIGHT_BREATHING
// #define BACKLIGHT_LEVELS 3
@@ -159,9 +158,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
-#define PREVENT_STUCK_MODIFIERS
-
#undef TAPPING_TOGGLE
#define TAPPING_TOGGLE 2
-
-#endif
diff --git a/keyboards/handwired/kbod/info.json b/keyboards/handwired/kbod/info.json
new file mode 100644
index 000000000..02586164b
--- /dev/null
+++ b/keyboards/handwired/kbod/info.json
@@ -0,0 +1,74 @@
+{
+ "keyboard_name": "kbod",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 15,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"`", "x":0, "y":0},
+ {"label":"1", "x":1, "y":0},
+ {"label":"2", "x":2, "y":0},
+ {"label":"3", "x":3, "y":0},
+ {"label":"4", "x":4, "y":0},
+ {"label":"5", "x":5, "y":0},
+ {"label":"6", "x":6, "y":0},
+ {"label":"7", "x":7, "y":0},
+ {"label":"8", "x":8, "y":0},
+ {"label":"9", "x":9, "y":0},
+ {"label":"0", "x":10, "y":0},
+ {"label":"-", "x":11, "y":0},
+ {"label":"=", "x":12, "y":0},
+ {"label":"Backspace", "x":13, "y":0, "w":2},
+ {"label":"Tab", "x":0, "y":1, "w":1.5},
+ {"label":"Q", "x":1.5, "y":1},
+ {"label":"W", "x":2.5, "y":1},
+ {"label":"E", "x":3.5, "y":1},
+ {"label":"R", "x":4.5, "y":1},
+ {"label":"T", "x":5.5, "y":1},
+ {"label":"Y", "x":6.5, "y":1},
+ {"label":"U", "x":7.5, "y":1},
+ {"label":"I", "x":8.5, "y":1},
+ {"label":"O", "x":9.5, "y":1},
+ {"label":"P", "x":10.5, "y":1},
+ {"label":"[", "x":11.5, "y":1},
+ {"label":"]", "x":12.5, "y":1},
+ {"label":"\\", "x":13.5, "y":1, "w":1.5},
+ {"label":"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":"GUI", "x":1.25, "y":4, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":4, "w":1.25},
+ {"label":"Space", "x":3.75, "y":4, "w":6.25},
+ {"label":"Alt", "x":10, "y":4, "w":1.25},
+ {"label":"GUI", "x":11.25, "y":4, "w":1.25},
+ {"label":"Menu", "x":12.5, "y":4, "w":1.25},
+ {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/kbod/kbod.h b/keyboards/handwired/kbod/kbod.h
index 356063624..5d9dbd05b 100644
--- a/keyboards/handwired/kbod/kbod.h
+++ b/keyboards/handwired/kbod/kbod.h
@@ -3,7 +3,7 @@
#include "quantum.h"
-#define KEYMAP( \
+#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, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, \
diff --git a/keyboards/handwired/kbod/keymaps/default/config.h b/keyboards/handwired/kbod/keymaps/default/config.h
index df06a2620..271f48d00 100644
--- a/keyboards/handwired/kbod/keymaps/default/config.h
+++ b/keyboards/handwired/kbod/keymaps/default/config.h
@@ -1,8 +1,3 @@
-#ifndef CONFIG_USER_H
-#define CONFIG_USER_H
-
-#include "../../config.h"
+#pragma once
// place overrides here
-
-#endif \ No newline at end of file
diff --git a/keyboards/handwired/kbod/keymaps/default/keymap.c b/keyboards/handwired/kbod/keymaps/default/keymap.c
index 1386b742f..063a94b4d 100644
--- a/keyboards/handwired/kbod/keymaps/default/keymap.c
+++ b/keyboards/handwired/kbod/keymaps/default/keymap.c
@@ -1,6 +1,4 @@
-#include "kbod.h"
-
-#define _____ KC_TRNS
+#include QMK_KEYBOARD_H
#define MODS_PRESSED(btn) (get_mods() & (MOD_BIT(KC_L##btn)|MOD_BIT(KC_R##btn)))
@@ -25,33 +23,33 @@ if (record->event.pressed) { \
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- KEYMAP( /* Base */
- F(0), KC_1, KC_2, KC_3, F(1), KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQUAL, 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_BSLASH,
- KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOT, KC_ENTER,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSFT,
- TT(1), KC_LCTL, KC_LALT, KC_SPACE, KC_RALT, KC_RGUI, KC_APP, KC_RCTL
+ LAYOUT( /* Base */
+ F(0), KC_1, KC_2, KC_3, F(1), KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
+ TT(1), KC_LCTL, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_APP, KC_RCTL \
),
- KEYMAP( /* Cursor layer */
- 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_DEL,
- TT(3), _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_INSERT,
- TT(2), _____, _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_HOME, _____,
- _____, _____, _____, _____, _____, _____, _____, _____, KC_PGUP, KC_PGDN, KC_END, KC_UP,
- _____, _____, _____, _____, _____, KC_LEFT, KC_DOWN, KC_RIGHT
+ LAYOUT( /* Cursor layer */
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, \
+ TT(3), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, \
+ TT(2), _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, KC_END, KC_UP, \
+ _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT \
),
- KEYMAP( /* Keypad layer */
- TO(0), KC_1, KC_2, KC_3, F(1), KC_5, KC_6, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, KC_BSPC,
- _____, _____, _____, _____, _____, _____, _____, KC_P4, KC_P5, KC_P6, _____, _____, _____, _____,
- _____, _____, _____, _____, _____, _____, _____, KC_P1, KC_P2, KC_P3, _____, _____, _____,
- _____, _____, _____, _____, _____, _____, _____, KC_P0, KC_PDOT, KC_MS_BTN1, KC_MS_UP, KC_MS_BTN2,
- _____, _____, _____, _____, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_MS_BTN3
+ LAYOUT( /* Keypad layer */
+ TO(0), KC_1, KC_2, KC_3, F(1), KC_5, KC_6, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, KC_BSPC, \
+ _______, _______, _______, _______, _______, _______, _______, KC_P4, KC_P5, KC_P6, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, KC_P1, KC_P2, KC_P3, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, KC_P0, KC_PDOT, KC_BTN1, KC_MS_U, KC_BTN2, \
+ _______, _______, _______, _______, KC_MS_L, KC_MS_D, KC_MS_R, KC_BTN3 \
),
- KEYMAP( /* Multimedia layer */
- TO(0), _____, _____, _____, _____, _____, _____, _____, _____, _____, KC_AUDIO_MUTE, KC_AUDIO_VOL_DOWN, KC_AUDIO_VOL_UP, _____,
- _____, _____, KC_WAKE, _____, _____, _____, _____, _____, _____, _____, KC_MSTP, KC_MPRV, KC_MNXT, _____,
- _____, _____, KC_SLEP, _____, _____, _____, _____, _____, _____, _____, _____, _____, _____,
- _____, _____, KC_PWR, _____, _____, _____, _____, _____, _____, KC_MS_BTN1, KC_MS_WH_UP, KC_MS_BTN2,
- _____, _____, _____, KC_MPLY, KC_MS_WH_LEFT, KC_MS_WH_DOWN, KC_MS_WH_RIGHT, KC_MS_BTN3
+ LAYOUT( /* Multimedia layer */
+ TO(0), _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MUTE, KC_VOLD, KC_VOLU, _______, \
+ _______, _______, KC_WAKE, _______, _______, _______, _______, _______, _______, _______, KC_MSTP, KC_MPRV, KC_MNXT, _______, \
+ _______, _______, KC_SLEP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, KC_PWR, _______, _______, _______, _______, _______, _______, KC_BTN1, KC_WH_U, KC_BTN2, \
+ _______, _______, _______, KC_MPLY, KC_WH_L, KC_WH_D, KC_WH_R, KC_BTN3 \
),
};
@@ -101,4 +99,4 @@ void matrix_scan_user(void) {
} else {
PORTC &= ~_BV(PC7);
}
-} \ No newline at end of file
+}
diff --git a/keyboards/handwired/kbod/keymaps/default/rules.mk b/keyboards/handwired/kbod/keymaps/default/rules.mk
index eb6bf940a..5b9ff0bfd 100644
--- a/keyboards/handwired/kbod/keymaps/default/rules.mk
+++ b/keyboards/handwired/kbod/keymaps/default/rules.mk
@@ -13,5 +13,5 @@ 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 this with audio at the same time.
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
diff --git a/keyboards/handwired/kbod/readme.md b/keyboards/handwired/kbod/readme.md
index d2f2c01ae..470ccce0e 100644
--- a/keyboards/handwired/kbod/readme.md
+++ b/keyboards/handwired/kbod/readme.md
@@ -1,21 +1,18 @@
-KBOD keyboard firmware
-======================
+# KBOD
-KBOD is a 60% Keyboard kit, hand-wired, with Arduino Micro as its controller. It's utilize 8x8 matrix and has layout similar to GH-60
+![KBOD](https://f4.fudanchii.net/shx/2017/02/IMG_20170212_224547.jpg)
-## Quantum MK Firmware
+KBOD is a 60% Keyboard kit, hand-wired, with Arduino Micro as its controller. It utilizes an 8x8 matrix and has layout similar to GH60. [More info](https://github.com/fudanchii/keyboard_of_disapproval)
-For the full Quantum feature list, see [the parent readme](/).
+Keyboard Maintainer: [The QMK Community](https://github.com/qmk)
+Hardware Supported: Arduino Micro
-## Building
+Make example for this keyboard (after setting up your build environment):
-Download or clone the whole firmware and use ```make handwired/kbod:default``` to generate the .hex file. You may flash it with avrdude
+ make handwired/kbod:default
-## Flashing
-Something along this line:
+Flashing your firmware may be done with avrdude. The command should be something along this line:
-```
-avrdude -p m32u4 -c avr109 -P <COM PORT> -C <avrdude conf file> -e -u flash:w:handwired_kbod_default.hex
-```
+ avrdude -p m32u4 -c avr109 -P <COM PORT> -C <avrdude conf file> -e -u flash:w:handwired_kbod_default.hex
-[More info](https://github.com/fudanchii/keyboard_of_disapproval) \ 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/handwired/maartenwut/info.json b/keyboards/handwired/maartenwut/info.json
new file mode 100644
index 000000000..98720d24f
--- /dev/null
+++ b/keyboards/handwired/maartenwut/info.json
@@ -0,0 +1,80 @@
+{
+ "keyboard_name": "Maartenwut Ortho",
+ "url": "",
+ "maintainer": "maartenwut",
+ "width": 14,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"`", "x":0, "y":0},
+ {"label":"1", "x":1, "y":0},
+ {"label":"2", "x":2, "y":0},
+ {"label":"3", "x":3, "y":0},
+ {"label":"4", "x":4, "y":0},
+ {"label":"5", "x":5, "y":0},
+ {"label":"6", "x":6, "y":0},
+ {"label":"7", "x":7, "y":0},
+ {"label":"8", "x":8, "y":0},
+ {"label":"9", "x":9, "y":0},
+ {"label":"0", "x":10, "y":0},
+ {"label":"-", "x":11, "y":0},
+ {"label":"=", "x":12, "y":0},
+ {"label":"Backspace", "x":13, "y":0},
+ {"label":"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":6, "y":1},
+ {"label":"U", "x":7, "y":1},
+ {"label":"I", "x":8, "y":1},
+ {"label":"O", "x":9, "y":1},
+ {"label":"P", "x":10, "y":1},
+ {"label":"[", "x":11, "y":1},
+ {"label":"]", "x":12, "y":1},
+ {"label":"\\", "x":13, "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":6, "y":2},
+ {"label":"J", "x":7, "y":2},
+ {"label":"K", "x":8, "y":2},
+ {"label":"L", "x":9, "y":2},
+ {"label":";", "x":10, "y":2},
+ {"label":"'", "x":11, "y":2},
+ {"label":"Delete", "x":12, "y":2},
+ {"label":"Enter", "x":13, "y":2},
+ {"label":"Shift", "x":0, "y":3},
+ {"label":"Z", "x":1, "y":3},
+ {"label":"X", "x":2, "y":3},
+ {"label":"C", "x":3, "y":3},
+ {"label":"V", "x":4, "y":3},
+ {"label":"B", "x":5, "y":3},
+ {"label":"N", "x":6, "y":3},
+ {"label":"M", "x":7, "y":3},
+ {"label":",", "x":8, "y":3},
+ {"label":".", "x":9, "y":3},
+ {"label":"/", "x":10, "y":3},
+ {"label":"Shift", "x":11, "y":3},
+ {"label":"Up", "x":12, "y":3},
+ {"label":"Print Screen", "x":13, "y":3},
+ {"label":"Ctrl", "x":0, "y":4},
+ {"label":"GUI", "x":1, "y":4},
+ {"label":"Alt", "x":2, "y":4},
+ {"label":"Fn", "x":3, "y":4},
+ {"label":"Fn3 / Space", "x":4, "y":4, "w":2.25},
+ {"label":"Space", "x":6.25, "y":4, "w":2.75},
+ {"label":"Fn2", "x":9, "y":4},
+ {"label":"Alt", "x":10, "y":4},
+ {"label":"Left", "x":11, "y":4},
+ {"label":"Down", "x":12, "y":4},
+ {"label":"Right", "x":13, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/maartenwut/readme.md b/keyboards/handwired/maartenwut/readme.md
index 31fc76743..0ae738271 100644
--- a/keyboards/handwired/maartenwut/readme.md
+++ b/keyboards/handwired/maartenwut/readme.md
@@ -2,7 +2,7 @@
Custom handwired keyboard for maartenwut.
-Keyboard Maintainer: [Maarten Dekekrs](https://github.com/maartenwut)
+Keyboard Maintainer: [Maarten Dekkers](https://github.com/maartenwut)
Hardware Supported: Custom handwired
Hardware Availability:
@@ -10,4 +10,4 @@ Make example for this keyboard (after setting up your build environment):
make handwired/maartenwut:default
-See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ 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/handwired/minorca/info.json b/keyboards/handwired/minorca/info.json
new file mode 100644
index 000000000..dafee6345
--- /dev/null
+++ b/keyboards/handwired/minorca/info.json
@@ -0,0 +1,55 @@
+{
+ "keyboard_name": "Minorca Handwired",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 12,
+ "height": 4,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"KA00", "x":0, "y":0},
+ {"label":"KA01", "x":1, "y":0},
+ {"label":"KA02", "x":2, "y":0},
+ {"label":"KA03", "x":3, "y":0},
+ {"label":"KA04", "x":4, "y":0},
+ {"label":"KA05", "x":5, "y":0},
+ {"label":"KA06", "x":6, "y":0},
+ {"label":"KA07", "x":7, "y":0},
+ {"label":"KA08", "x":8, "y":0},
+ {"label":"KA09", "x":9, "y":0},
+ {"label":"KA10", "x":10, "y":0},
+ {"label":"KA11", "x":11, "y":0},
+ {"label":"KB00", "x":0, "y":1, "w":1.25},
+ {"label":"KB01", "x":1.25, "y":1},
+ {"label":"KB02", "x":2.25, "y":1},
+ {"label":"KB03", "x":3.25, "y":1},
+ {"label":"KB04", "x":4.25, "y":1},
+ {"label":"KB05", "x":5.25, "y":1},
+ {"label":"KB06", "x":6.25, "y":1},
+ {"label":"KB07", "x":7.25, "y":1},
+ {"label":"KB08", "x":8.25, "y":1},
+ {"label":"KB09", "x":9.25, "y":1},
+ {"label":"KB11", "x":10.25, "y":1, "w":1.75},
+ {"label":"KC00", "x":0, "y":2, "w":1.75},
+ {"label":"KC02", "x":1.75, "y":2},
+ {"label":"KC03", "x":2.75, "y":2},
+ {"label":"KC04", "x":3.75, "y":2},
+ {"label":"KC05", "x":4.75, "y":2},
+ {"label":"KC06", "x":5.75, "y":2},
+ {"label":"KC07", "x":6.75, "y":2},
+ {"label":"KC08", "x":7.75, "y":2},
+ {"label":"KC09", "x":8.75, "y":2},
+ {"label":"KC10", "x":9.75, "y":2},
+ {"label":"KC11", "x":10.75, "y":2, "w":1.25},
+ {"label":"KD00", "x":0, "y":3, "w":1.25},
+ {"label":"KD02", "x":1.25, "y":3, "w":1.25},
+ {"label":"KD03", "x":2.5, "y":3, "w":1.25},
+ {"label":"KD04", "x":3.75, "y":3, "w":2.25},
+ {"label":"KD07", "x":6, "y":3, "w":2.25},
+ {"label":"KD09", "x":8.25, "y":3, "w":1.25},
+ {"label":"KD10", "x":9.5, "y":3},
+ {"label":"KD11", "x":10.5, "y":3, "w":1.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/minorca/keymaps/default/keymap.c b/keyboards/handwired/minorca/keymaps/default/keymap.c
index 3392f25ef..29ed7aa03 100644
--- a/keyboards/handwired/minorca/keymaps/default/keymap.c
+++ b/keyboards/handwired/minorca/keymaps/default/keymap.c
@@ -1,7 +1,4 @@
-
-#include "minorca.h"
-#include "action_layer.h"
-#include "eeconfig.h"
+#include QMK_KEYBOARD_H
extern keymap_config_t keymap_config;
@@ -10,33 +7,23 @@ extern keymap_config_t keymap_config;
// Layer names don't all need to be of the same length, obviously, and you can also skip them
// entirely and just use numbers.
-// Fillers to make layering more clear
-#define _______ KC_TRNS
-#define XXXXXXX KC_NO
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [0] = { /* Base */
- {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, XXXXXXX, KC_ENT },
- {KC_LCTRL,XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_QUOT, KC_FN1, KC_FN0 },
- {KC_NO, XXXXXXX, KC_NO, KC_LALT, KC_SPC, XXXXXXX, XXXXXXX, KC_SPC, XXXXXXX, KC_DOT, KC_SLSH, KC_NO }
- },
- [1] = { /* First */
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DELT },
- {KC_TAB, KC_MPRV, KC_MPLY, KC_MNXT, KC_PGUP, KC_HOME, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, XXXXXXX, KC_LGUI },
- {KC_LCTRL,XXXXXXX, KC_Z, KC_X, KC_C, KC_PGDN, KC_END, KC_L, KC_SCLN, KC_UP, KC_FN1, KC_FN0 },
- {KC_NO, XXXXXXX, KC_NO, KC_LALT, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, KC_DOWN, KC_RIGHT,KC_NO }
- },
- [2] = { /* Second */
- {KC_ESC, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DELT },
- {KC_TAB, KC_MUTE, KC_VOLD, KC_VOLU, KC_TILD, KC_PIPE, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, XXXXXXX, KC_ENT },
- {KC_CAPS, XXXXXXX, KC_LSFT, KC_RSFT, KC_PAUSE,KC_F10, KC_F11, KC_F12, KC_NO, KC_UP, KC_FN1, KC_FN0 },
- {KC_NO, XXXXXXX, KC_NO, KC_LALT, _______, XXXXXXX, XXXXXXX, _______, XXXXXXX, KC_DOWN, KC_RIGHT,KC_NO }
- },
-};
-
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_LAYER_MOMENTARY(1), // to First overlay
- [1] = ACTION_LAYER_MOMENTARY(2), // to Second overlay
-
-}; \ No newline at end of file
+ [0] = LAYOUT( /* Base */
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT, \
+ KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_QUOT, MO(2), MO(1), \
+ XXXXXXX, XXXXXXX, KC_LALT, KC_SPC, KC_SPC, KC_DOT, KC_SLSH, XXXXXXX \
+ ),
+ [1] = LAYOUT( /* First */
+ 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_MPRV, KC_MPLY, KC_MNXT, KC_PGUP, KC_HOME, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_LGUI, \
+ KC_LCTL, KC_Z, KC_X, KC_C, KC_PGDN, KC_END, KC_L, KC_SCLN, KC_UP, _______, _______, \
+ XXXXXXX, XXXXXXX, KC_LALT, _______, _______, KC_DOWN, KC_RGHT, XXXXXXX \
+ ),
+ [2] = LAYOUT( /* Second */
+ KC_ESC, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \
+ KC_TAB, KC_MUTE, KC_VOLD, KC_VOLU, KC_TILD, KC_PIPE, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_ENT, \
+ KC_CAPS, KC_LSFT, KC_RSFT, KC_PAUS, KC_F10, KC_F11, KC_F12, XXXXXXX, KC_UP, _______, _______, \
+ XXXXXXX, XXXXXXX, KC_LALT, _______, _______, KC_DOWN, KC_RGHT, XXXXXXX \
+ ),
+};
diff --git a/keyboards/handwired/minorca/keymaps/default/rules.mk b/keyboards/handwired/minorca/keymaps/default/rules.mk
index 0ea7a6935..584798d1a 100644
--- a/keyboards/handwired/minorca/keymaps/default/rules.mk
+++ b/keyboards/handwired/minorca/keymaps/default/rules.mk
@@ -15,7 +15,7 @@ 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 this with audio at the same time.
+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
diff --git a/keyboards/handwired/minorca/keymaps/rgb/keymap.c b/keyboards/handwired/minorca/keymaps/rgb/keymap.c
index e1ee49dce..c99a255e4 100644
--- a/keyboards/handwired/minorca/keymaps/rgb/keymap.c
+++ b/keyboards/handwired/minorca/keymaps/rgb/keymap.c
@@ -1,7 +1,4 @@
-
-#include "minorca.h"
-#include "action_layer.h"
-#include "eeconfig.h"
+#include QMK_KEYBOARD_H
extern keymap_config_t keymap_config;
@@ -14,50 +11,34 @@ extern keymap_config_t keymap_config;
#define _RAISE 2
#define _TB 3
-// Macro name shortcuts
-#define QWERTY M(_QWERTY)
-#define LOWER M(_LOWER)
-#define RAISE M(_RAISE)
-
-// Fillers to make layering more clear
-#define _______ KC_TRNS
-#define XXXXXXX KC_NO
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[_QWERTY] = { /* Qwerty */
- {KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC},
- {FUNC(0), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, XXXXXXX, KC_QUOT},
- {KC_LSFT, XXXXXXX, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, FUNC(1)},
- {KC_LCTL, XXXXXXX, KC_LGUI, KC_LALT, FUNC(2), XXXXXXX, XXXXXXX, FUNC(3), XXXXXXX, KC_RALT, KC_APP, KC_RCTL}
-},
-
-[_RAISE] = {
- {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, KC_TRNS, KC_TRNS, KC_PAUSE, KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL), S(KC_LBRC), XXXXXXX, S(KC_BSLS)},
- {KC_TRNS, XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_ENT},
- {KC_TRNS, XXXXXXX, KC_TRNS, KC_TRNS, KC_TRNS, XXXXXXX, XXXXXXX, KC_TRNS, XXXXXXX, KC_MNXT, KC_MUTE, KC_MPLY}
-},
-
-[_LOWER] = {
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DELETE},
- {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL, KC_LBRC, XXXXXXX, KC_BSLS},
- {KC_TRNS, XXXXXXX, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_PGUP, KC_ENT},
- {KC_TRNS, XXXXXXX, KC_TRNS, KC_TRNS, KC_TRNS, XXXXXXX, XXXXXXX, KC_TRNS, XXXXXXX, KC_HOME, KC_PGDN, KC_END}
-},
-
-[_TB] = { /* Tab */
- {KC_ESC, KC_CALC, KC_WHOM, KC_MAIL, KC_MYCM, 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, XXXXXXX, KC_TRNS},
- {KC_TRNS, XXXXXXX, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_UP, KC_ENT},
- {BL_STEP, XXXXXXX, KC_TRNS, KC_TRNS, KC_TRNS, XXXXXXX, XXXXXXX, KC_TRNS, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT}
-}
-};
-
+ [_QWERTY] = LAYOUT( /* Qwerty */ \
+ KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, \
+ LT(_TB, KC_TAB), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, MT(MOD_RSFT, KC_ENT), \
+ KC_LCTL, KC_LGUI, KC_LALT, LT(_RAISE, KC_SPC), LT(_LOWER, KC_SPC), KC_RALT, KC_APP, KC_RCTL \
+ ),
+
+ [_RAISE] = LAYOUT( \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \
+ _______, _______, _______, KC_PAUS, _______, _______, _______, KC_UNDS, KC_PLUS, KC_LCBR, KC_PIPE, \
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_ENT, \
+ _______, _______, _______, _______, _______, KC_MNXT, KC_MUTE, KC_MPLY \
+ ),
+
+ [_LOWER] = 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_MINS, KC_EQL, KC_LBRC, KC_BSLS, \
+ _______, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_PGUP, KC_ENT, \
+ _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END \
+ ),
+
+ [_TB] = LAYOUT( /* Tab */ \
+ KC_ESC, KC_CALC, KC_WHOM, KC_MAIL, KC_MYCM, _______, _______, _______, _______, _______, KC_PSCR, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, KC_UP, KC_ENT, \
+ BL_STEP, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT \
+ )
-const uint16_t PROGMEM fn_actions[] = {
- [0] = ACTION_LAYER_TAP_KEY(_TB, KC_TAB),
- [1] = ACTION_MODS_TAP_KEY(MOD_RSFT, KC_ENT),
- [2] = ACTION_LAYER_TAP_KEY(_RAISE, KC_SPC),
- [3] = ACTION_LAYER_TAP_KEY(_LOWER, KC_SPC),
};
diff --git a/keyboards/handwired/minorca/keymaps/rgb/rules.mk b/keyboards/handwired/minorca/keymaps/rgb/rules.mk
index da44256f9..6e430d59e 100644
--- a/keyboards/handwired/minorca/keymaps/rgb/rules.mk
+++ b/keyboards/handwired/minorca/keymaps/rgb/rules.mk
@@ -15,7 +15,7 @@ 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. Do not enable this with audio at the same time.
+RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
diff --git a/keyboards/handwired/minorca/minorca.h b/keyboards/handwired/minorca/minorca.h
index 158e5b4c5..2df4ebdc4 100644
--- a/keyboards/handwired/minorca/minorca.h
+++ b/keyboards/handwired/minorca/minorca.h
@@ -3,4 +3,16 @@
#include "quantum.h"
+#define LAYOUT( \
+ KA00, KA01, KA02, KA03, KA04, KA05, KA06, KA07, KA08, KA09, KA10, KA11, \
+ KB00, KB01, KB02, KB03, KB04, KB05, KB06, KB07, KB08, KB09, KB11, \
+ KC00, KC02, KC03, KC04, KC05, KC06, KC07, KC08, KC09, KC10, KC11, \
+ KD00, KD02, KD03, KD04, KD07, KD09, KD10, KD11 \
+) { \
+ { KA00, KA01, KA02, KA03, KA04, KA05, KA06, KA07, KA08, KA09, KA10, KA11 }, \
+ { KB00, KB01, KB02, KB03, KB04, KB05, KB06, KB07, KB08, KB09, KC_NO, KB11 }, \
+ { KC00, KC_NO, KC02, KC03, KC04, KC05, KC06, KC07, KC08, KC09, KC10, KC11 }, \
+ { KD00, KC_NO, KD02, KD03, KD04, KC_NO, KC_NO, KD07, KC_NO, KD09, KD10, KD11 } \
+}
+
#endif
diff --git a/keyboards/handwired/minorca/readme.md b/keyboards/handwired/minorca/readme.md
index 0253506e0..c91045960 100644
--- a/keyboards/handwired/minorca/readme.md
+++ b/keyboards/handwired/minorca/readme.md
@@ -1,33 +1,13 @@
-minorca keyboard firmware
-======================
-Handwired 40% keyboard
+# minorca
-http://www.panc.co/blog/minorcasebright-information-page
+A handwired 40% keyboard by panc.co.
-## Quantum MK Firmware
+Keyboard Maintainer: [The QMK Community](https://github.com/qmk)
+Hardware Supported: panc.co minorca
+Hardware Availability: [panc.co](https://www.panc.co/blog/minorcasebright-information-page)
-For the full Quantum feature list, see [the parent readme.md](/readme.md).
+Make example for this keyboard (after setting up your build environment):
-## Building
+ make handwired/minorca:default
-Download or clone the whole firmware and navigate to the keyboards/planck folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use `make dfu` to program your PCB once you hit the reset button.
-
-Depending on which keymap you would like to use, you will have to compile slightly differently.
-
-### Default
-To build with the default keymap, simply run `make`.
-
-### Other Keymaps
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` in the keymaps folder, and see keymap document (you can find in top readme.md) and existent keymap files.
-
-To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
-```
-$ make KEYMAP=[default|jack|<name>]
-```
-Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
-
-### Notable forks (which some of the keymap files are from)
-- [Shane's Fork](https://github.com/shanecelis/tmk_keyboard/tree/master/keyboard/planck)
-- [Pierre's Fork](https://github.com/pcarrier/tmk_keyboard/blob/pcarrier/planck/keyboard/gh60/keymap_planck.c)
-- [Nathan's Fork](https://github.com/nathanrosspowell/tmk_keyboard/tree/planck-jack/keyboard/planck)
-- [Matthew's Fork](https://github.com/pepers/tmk_keyboard/tree/master/keyboard/planck)
+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/minorca/rules.mk b/keyboards/handwired/minorca/rules.mk
index ce502b820..3e408e2b9 100644
--- a/keyboards/handwired/minorca/rules.mk
+++ b/keyboards/handwired/minorca/rules.mk
@@ -61,7 +61,7 @@ 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. Do not enable this with audio at the same time.
+RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend \ No newline at end of file
diff --git a/keyboards/handwired/MS_sculpt_mobile/babblePaste.c b/keyboards/handwired/ms_sculpt_mobile/babblePaste.c
index 22394cc7d..e03564870 100644
--- a/keyboards/handwired/MS_sculpt_mobile/babblePaste.c
+++ b/keyboards/handwired/ms_sculpt_mobile/babblePaste.c
@@ -1,13 +1,13 @@
-/* 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.
+/* 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
+and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jeebak/keymap.c
*/
-#include "../MS_sculpt_mobile/babblePaste.h"
+#include "babblePaste.h"
#include "action_macro.h"
@@ -16,14 +16,14 @@ and https://github.com/qmk/qmk_firmware/blob/master/keyboards/planck/keymaps/jee
// GLOBAL variable to determine mode. Sets startup default if no eeppom
uint8_t babble_mode =0 ;
-// small function that we might also want to call from a keymap.
+// small function that we might also want to call from a keymap.
macro_t* switch_babble_mode( uint8_t id) {
babble_mode= id;
return MACRO_NONE; //less typing where called
}
-
+
// Today I learned that the preprocessor can not create a switch statement label from an argument
// And else statements have problems, see https://gcc.gnu.org/onlinedocs/gcc-3.0.1/cpp_3.html#SEC15
#define BABLM(ent, macro...) \
@@ -32,8 +32,8 @@ macro_t* switch_babble_mode( uint8_t id) {
/* this function runs the appropriate babblepaste macro, given
-the global babble_mode, and a shortcut from the ENUM in babblePaste.h
-TODO, the pointers in this function should be stored in a PROGMEM array, not ram.
+the global babble_mode, and a shortcut from the ENUM in babblePaste.h
+TODO, the pointers in this function should be stored in a PROGMEM array, not ram.
But that requires even more clever preprocessor foo.
*/
const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
@@ -43,20 +43,20 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
return MACRO_NONE;
}
*/
-
+
#ifdef MS_MODE
- if ( BABL_WINDOWS == shortcut ) { return switch_babble_mode(MS_MODE); }
-#endif
+ if ( BABL_WINDOWS == shortcut ) { return switch_babble_mode(MS_MODE); }
+#endif
#ifdef MAC_MODE
- if ( BABL_MAC == shortcut) { return switch_babble_mode(MAC_MODE); }
+ if ( BABL_MAC == shortcut) { return switch_babble_mode(MAC_MODE); }
#endif
#ifdef LINUX_MODE
if ( BABL_LINUX == shortcut ) { return switch_babble_mode(LINUX_MODE); }
-#endif
+#endif
#ifdef READMUX_MODE
if ( BABL_READLINE == shortcut ) { switch_babble_mode(READMUX_MODE); return MACRO_NONE; }
-#endif
+#endif
#ifdef VI_MODE
if ( BABL_VI == shortcut ) { return switch_babble_mode(VI_MODE); }
#endif
@@ -66,11 +66,11 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
- switch(babble_mode) {
+ switch(babble_mode) {
#ifdef MS_MODE
-
- case MS_MODE:
+
+ case MS_MODE:
BABLM( BABL_GO_LEFT_1C, T(LEFT), END );
BABLM( BABL_GO_RIGHT_1C , T(RIGHT), END );
BABLM( BABL_GO_LEFT_WORD, D(LCTL), T(LEFT), U(LCTL), END );
@@ -93,7 +93,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_REDO, D(LCTL), T(Y), U(LCTL), END );
BABLM( BABL_CUT, D(LCTL), T(X), U(LCTL), END );
BABLM( BABL_COPY, D(LCTL), T(C), U(LCTL), END );
- BABLM( BABL_PASTE, D(LCTL), T(V), U(LCTL), END );
+ BABLM( BABL_PASTE, D(LCTL), T(V), U(LCTL), END );
BABLM( BABL_SELECT_ALL, D(LCTL), T(A), U(LCTL), END );
BABLM( BABL_FIND, D(LCTL),T(F), U(LCTL),END );
BABLM( BABL_FIND_NEXT, T(F3),END );
@@ -114,7 +114,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_BROWSER_BACK, D(LALT), T(LEFT), U(LALT),END );
BABLM( BABL_BROWSER_FIND, D(LCTL), T(F), U(LCTL),END );
BABLM( BABL_BROWSER_BOOKMARK, D(LCTL), T(D), U(LCTL),END );
- //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LCTL),END ); // EDGE
+ //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LCTL),END ); // EDGE
BABLM( BABL_BROWSER_DEV_TOOLS, D(LCTL), T(T), U(LCTL),END ); // Chrome
// Chrome
BABLM( BABL_BROWSER_RELOAD, D(LCTL), T(F5), U(LCTL),END ); // hard reload w/o cache
@@ -126,8 +126,8 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
// Todo, ring bell, flash light, show user this isn't supported
return MACRO_NONE;
-
-
+
+
#endif /* MS_MODE*/
@@ -146,7 +146,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_GO_PREV_LINE , T(UP), END );
BABLM( BABL_PGDN , T(PGDN), END );
BABLM( BABL_PGUP , T(PGUP), END );
- BABLM( BABL_DEL_RIGHT_1C , D(DEL), END );
+ BABLM( BABL_DEL_RIGHT_1C , D(DEL), END );
BABLM( BABL_DEL_LEFT_WORD , D(LCTL), T(BSPACE), U(LCTL), END );
BABLM( BABL_DEL_RIGHT_WORD , D(LCTL), T(DEL), U(LCTL), END );
BABLM( BABL_DEL_TO_LINE_END, D(RSFT), T(HOME), U(RSFT), T(DEL), END);
@@ -156,8 +156,8 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_REDO , D(LCTL), T(Y), U(LCTL), END );
BABLM( BABL_CUT , D(LCTL), T(X), U(LCTL), END );
BABLM( BABL_COPY , D(LCTL), T(C), U(LCTL), END );
- BABLM( BABL_PASTE , D(LCTL), T(V), U(LCTL), END );
- BABLM( BABL_SELECT_ALL, D(LCTL), T(A), U(LCTL), END );
+ BABLM( BABL_PASTE , D(LCTL), T(V), U(LCTL), END );
+ BABLM( BABL_SELECT_ALL, D(LCTL), T(A), U(LCTL), END );
BABLM( BABL_FIND, D(LCTL),T(F), U(LCTL),END );
/* BABLM(BABL_FIND_NEXT , T(F3),END ); KDE */
BABLM( BABL_FIND_NEXT, D(LCTL),T(G), U(LCTL),END ); // Gnome*/
@@ -167,7 +167,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_SWITCH_APP_NEXT, D(LCTL),T(TAB), U(LCTL),END );
BABLM( BABL_SWITCH_APP_LAST, D(LSFT),D(LCTL),T(TAB), U(LCTL), U(LSFT),END );
BABLM( BABL_CLOSE_APP, D(LALT),T(F4), U(LALT),END );
- //BABLM( BABL_HELP, END );
+ //BABLM( BABL_HELP, END );
#ifndef BABL_NOBROWSER
BABLM( BABL_BROWSER_NEW_TAB, D(LCTL), T(T), U(LCTL),END );
@@ -188,9 +188,9 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
#endif
#endif
return MACRO_NONE;
-
-#endif
-
+
+#endif
+
#ifdef MAC_MODE
case MAC_MODE:
@@ -206,7 +206,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_GO_PREV_LINE , T(UP), END );
BABLM( BABL_PGDN , D(LALT),T(DOWN), U(LALT), END );
BABLM( BABL_PGUP , D(LALT),T(UP), U(LALT), END );
- BABLM( BABL_DEL_RIGHT_1C , D(DEL), END );
+ BABLM( BABL_DEL_RIGHT_1C , D(DEL), END );
BABLM( BABL_DEL_LEFT_WORD , D(LALT), T(BSPACE), U(LALT), END );
BABLM( BABL_DEL_RIGHT_WORD, D(LALT), T(DEL), U(LALT), END );
BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END );// there must be another way
@@ -216,7 +216,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_REDO , D(LSFT),D(LGUI), T(Z), U(LSFT),U(LGUI), END );
BABLM( BABL_CUT , D(LGUI), T(X), U(LGUI), END );
BABLM( BABL_COPY , D(LGUI), T(C), U(LGUI), END );
- BABLM( BABL_PASTE , D(LGUI), T(V), U(LGUI), END );
+ BABLM( BABL_PASTE , D(LGUI), T(V), U(LGUI), END );
BABLM( BABL_SELECT_ALL , D(LGUI), T(A), U(LGUI), END );
BABLM( BABL_FIND , D(LGUI),T(F), U(LGUI),END );
BABLM( BABL_FIND_NEXT, D(LGUI),T(G), U(LGUI),END );
@@ -238,7 +238,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END );
BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END );
BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END );
- //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE
+ //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE
BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome
// Chrome
BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache
@@ -247,10 +247,10 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_BROWSER_ZOOM_OUT, D(LGUI), T(MINS), U(LGUI),END );
#endif
#endif
-
+
return MACRO_NONE;
-#endif
-
+#endif
+
#ifdef EMACS_MODE
case EMACS_MODE:
@@ -269,18 +269,18 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_GO_PREV_LINE , D(LCTL), T(P), U(LCTL), END );
BABLM( BABL_PGDN , D(LCTL), T(V), U(LCTL), END );
BABLM( BABL_PGUP , D(LALT), T(V), U(LALT), END );
- BABLM( BABL_DEL_RIGHT_1C, D(LCTL), T(D), U(LCTL),END );
+ BABLM( BABL_DEL_RIGHT_1C, D(LCTL), T(D), U(LCTL),END );
BABLM( BABL_DEL_LEFT_WORD , D(LCTL), T(BSPACE), U(LCTL), END );
BABLM( BABL_DEL_RIGHT_WORD , D(LALT), T(D), U(LALT), END );
- BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END );
+ BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END );
BABLM( BABL_DEL_TO_LINE_START, T(ESC), T(0), D(LCTL), T(K), U(LCTL), END );
#ifndef BABL_MOVEMENTONLY
BABLM( BABL_UNDO , D(LCTL), T(X), U(LCTL),T(C), END );
BABLM( BABL_REDO , D(LCTL), T(X), U(LCTL),T(C), END ); // arguably
BABLM( BABL_CUT , D(LCTL), T(W), U(LCTL), END );
BABLM( BABL_COPY , D(LALT), T(W), U(LALT), END ); //really?
- BABLM( BABL_PASTE , D(LCTL), T(Y), U(LCTL), END );
- BABLM( BABL_SELECT_ALL ,D(LCTL), T(X), U(LCTL),T(H), END );
+ BABLM( BABL_PASTE , D(LCTL), T(Y), U(LCTL), END );
+ BABLM( BABL_SELECT_ALL ,D(LCTL), T(X), U(LCTL),T(H), END );
BABLM( BABL_FIND , D(LCTL), T(S), U(LCTL),END );
BABLM( BABL_FIND_NEXT , D(LCTL), T(S), U(LCTL),END );
BABLM( BABL_FIND_REPLACE , D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END );
@@ -290,7 +290,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_CLOSE_APP , D(LCTL), T(X), U(LCTL),T(C),END );
BABLM( BABL_HELP , D(LCTL),T(H), U(LCTL),T(A),END); // start search in help
#ifndef BABL_NOBROWSER
-/* you get to figure w3 out
+/* you get to figure w3 out
BABLM( BABL_BROWSER_NEW_TAB, D(LGUI), T(T), U(LGUI),END );
BABLM( BABL_BROWSER_CLOSE_TAB, D(LGUI), T(W), U(LGUI),END );
BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LGUI), D(RSFT),T(T), U(RSFT),U(LGUI),END );
@@ -301,7 +301,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END );
BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END );
BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END );
- //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE
+ //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE
BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome
// Chrome
BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache
@@ -312,18 +312,18 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
#endif
#endif
break;
-
+
return MACRO_NONE;
}
-
-#endif
+
+#endif
#ifdef VI_MODE
case VI_MODE:
// you have to track the modes yourself. Otherwise motion is awful (bell, bell, bell)
-
-
+
+
BABLM( BABL_GO_LEFT_1C , T(H), END );
BABLM( BABL_GO_RIGHT_1C , T(L), END );
BABLM( BABL_GO_LEFT_WORD , T(B),END );
@@ -336,18 +336,18 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_GO_PREV_LINE, T(K), END );
BABLM( BABL_PGDN ,D(LCTL), T(F), U(LCTL), END );
BABLM( BABL_PGUP , D(LCTL), T(B), U(LCTL), END );
- BABLM( BABL_DEL_RIGHT_1C , T(X),END );
+ BABLM( BABL_DEL_RIGHT_1C , T(X),END );
BABLM( BABL_DEL_LEFT_WORD , T(D),T(G),T(E),END );
BABLM( BABL_DEL_RIGHT_WORD , T(D),T(W),END );
BABLM( BABL_DEL_TO_LINE_END, T(D),D(LSFT), T(4),U(LSFT) ,END ); // d$
- BABLM( BABL_DEL_TO_LINE_START, T(D),D(LSFT), T(6),U(LSFT) ,END );
+ BABLM( BABL_DEL_TO_LINE_START, T(D),D(LSFT), T(6),U(LSFT) ,END );
#ifndef BABL_MOVEMENTONLY
BABLM( BABL_UNDO , T(U), END );
- BABLM( BABL_REDO , D(LCTL), T(R), U(LCTL), END );
+ BABLM( BABL_REDO , D(LCTL), T(R), U(LCTL), END );
BABLM( BABL_CUT , T(X), END );
BABLM( BABL_COPY , T(Y),END );
- BABLM( BABL_PASTE , T(P), END );
- BABLM( BABL_SELECT_ALL , D(LSFT), T(SCLN),U(LSFT),D(LSFT), T(5),U(LSFT),T(Y), END ); // wrong but helpful?
+ BABLM( BABL_PASTE , T(P), END );
+ BABLM( BABL_SELECT_ALL , D(LSFT), T(SCLN),U(LSFT),D(LSFT), T(5),U(LSFT),T(Y), END ); // wrong but helpful?
BABLM( BABL_FIND , T(SLASH),END );
BABLM( BABL_FIND_NEXT , T(N),END );
BABLM( BABL_FIND_REPLACE , D(LALT),D(LSFT), T(5),U(LSFT), U(LALT), END );
@@ -357,7 +357,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM(BABL_CLOSE_APP, D(LSFT), T(SCLN),U(LSFT), T(Q), D(RSFT), T(1),U(RSFT), END );
BABLM(BABL_HELP, D(LSFT), T(SCLN),U(LSFT),T(H),END); // start search in help
#ifndef BABL_NOBROWSER
-/* you get to figure this out
+/* you get to figure this out
BABLM( BABL_BROWSER_NEW_TAB, D(LGUI), T(T), U(LGUI),END );
BABLM( BABL_BROWSER_CLOSE_TAB, D(LGUI), T(W), U(LGUI),END );
BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LGUI), D(RSFT),T(T), U(RSFT),U(LGUI),END );
@@ -368,7 +368,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END );
BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END );
BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END );
- //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE
+ //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE
BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome
// Chrome
BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache
@@ -377,8 +377,8 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_BROWSER_ZOOM_OUT, D(LGUI), T(MINS), U(LGUI),END );
*/
#endif
-#endif
- return MACRO_NONE;
+#endif
+ return MACRO_NONE;
#endif
@@ -387,10 +387,10 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
#ifdef READMUX_MODE
// Readline command line editing + tmux windowing
// I havent decided how much to do readline and how much tmux
-
-
- case READMUX_MODE:
-
+
+
+ case READMUX_MODE:
+
BABLM( BABL_GO_LEFT_1C , T(LEFT), END );
BABLM( BABL_GO_RIGHT_1C , T(RIGHT), END );
BABLM( BABL_GO_LEFT_WORD , D(LALT), T(B), U(LALT), END );
@@ -403,28 +403,28 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_GO_PREV_LINE , D(LCTL), T(P), U(LCTL), END );
BABLM( BABL_PGDN , T(PGDN), END );
BABLM( BABL_PGUP , T(PGUP), END );
- BABLM( BABL_DEL_RIGHT_1C , D(LCTL), T(D), U(LCTL),END );
+ BABLM( BABL_DEL_RIGHT_1C , D(LCTL), T(D), U(LCTL),END );
BABLM( BABL_DEL_LEFT_WORD , D(LCTL), T(W), U(LCTL), END );
BABLM( BABL_DEL_RIGHT_WORD , D(LALT), T(D), U(LALT), END );
- BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END );
+ BABLM( BABL_DEL_TO_LINE_END, D(LCTL), T(K), U(LCTL), END );
BABLM( BABL_DEL_TO_LINE_START, D(LCTL), T(U), U(LCTL), END );
#ifndef BABL_MOVEMENTONLY
BABLM( BABL_UNDO , D(LALT), T(R), U(LALT) , END );
BABLM( BABL_REDO , D(LCTL), T(X), U(LCTL),T(C), END ); // arguably
BABLM( BABL_CUT , D(LCTL), T(K), U(LCTL), END ); // wrong half the time
- //BABLM( BABL_COPY ,END );
- BABLM( BABL_PASTE , D(LCTL), T(Y), U(LCTL), END );
- BABLM( BABL_SELECT_ALL , D(LCTL), T(A), T(K), T(Y), U(LCTL) , END );
+ //BABLM( BABL_COPY ,END );
+ BABLM( BABL_PASTE , D(LCTL), T(Y), U(LCTL), END );
+ BABLM( BABL_SELECT_ALL , D(LCTL), T(A), T(K), T(Y), U(LCTL) , END );
BABLM( BABL_FIND , D(LCTL), T(R), U(LCTL), END ); // search history
BABLM(BABL_FIND_NEXT, D(LCTL), T(S), U(LCTL), END );
- //BABLM( BABL_FIND_REPLACE ,END );
+ //BABLM( BABL_FIND_REPLACE ,END );
BABLM( BABL_RUNAPP , D(LCTL), T(B), U(LCTL), T(C),END ); //tmux
BABLM( BABL_SWITCH_APP_NEXT , D(LCTL), T(B), U(LCTL), T(N),END ); //tmux
BABLM( BABL_SWITCH_APP_LAST , D(LCTL), T(B), U(LCTL), T(P),END ); //tmux
BABLM( BABL_CLOSE_APP , D(LCTL), T(B), U(LCTL), T(D),END); // usually what I want
- // BABLM( BABL_HELP ,END );
+ // BABLM( BABL_HELP ,END );
#ifndef BABL_NOBROWSER
-/* Add lynx shortcuts?
+/* Add lynx shortcuts?
BABLM( BABL_BROWSER_NEW_TAB, D(LGUI), T(T), U(LGUI),END );
BABLM( BABL_BROWSER_CLOSE_TAB, D(LGUI), T(W), U(LGUI),END );
BABLM( BABL_BROWSER_REOPEN_LAST_TAB, D(LGUI), D(RSFT),T(T), U(RSFT),U(LGUI),END );
@@ -435,7 +435,7 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
BABLM( BABL_BROWSER_BACK, D(LGUI), T(LEFT), U(LGUI),END );
BABLM( BABL_BROWSER_FIND, D(LGUI), T(F), U(LGUI),END );
BABLM( BABL_BROWSER_BOOKMARK, D(LGUI), T(D), U(LGUI),END );
- //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE
+ //BABLM( BABL_BROWSER_DEV_TOOLS, T(F12), U(LGUI),END ); // EDGE
BABLM( BABL_BROWSER_DEV_TOOLS, D(LGUI), D(LALT), T(I), U(LALT),U(LGUI),END ); // Chrome
// Chrome
BABLM( BABL_BROWSER_RELOAD, D(LGUI), T(R), U(LGUI),END ); // add shift for reload w/o cache
@@ -445,12 +445,12 @@ const macro_t *babblePaste (keyrecord_t *record, uint8_t shortcut) {
*/
#endif
#endif
-
+
return MACRO_NONE;
-
-#endif
- default:
+#endif
+
+ default:
return MACRO_NONE;
}
diff --git a/keyboards/handwired/MS_sculpt_mobile/babblePaste.h b/keyboards/handwired/ms_sculpt_mobile/babblePaste.h
index cedd7d92b..1e8206212 100644
--- a/keyboards/handwired/MS_sculpt_mobile/babblePaste.h
+++ b/keyboards/handwired/ms_sculpt_mobile/babblePaste.h
@@ -1,15 +1,15 @@
-/* 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.
+/* 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.
+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
*/
#ifndef _babblePaste_h_included__
#define _babblePaste_h_included__
-#include "../MS_sculpt_mobile/config.h"
+#include "config.h"
#include "action_layer.h"
#include "quantum_keycodes.h"
@@ -18,11 +18,11 @@ and jeebak & algernon's keymap
/* ***************************
// Uncomment any modes you want. Whatever mode = 0 will be the default on boot
-// Expect to get errors if you comment a feature out and leave it in your keymap.
+// Expect to get errors if you comment a feature out and leave it in your keymap.
#define USE_BABLPASTE
-//#define MS_MODE 0 // Windows.
+//#define MS_MODE 0 // Windows.
//#define MAC_MODE 1
//#define LINUX_MODE 2 //aka gnome+KDE
//#define EMACS_MODE 3
@@ -42,7 +42,7 @@ and jeebak & algernon's keymap
//#define BABL_MOVEMENTONLY
-// Define starting number for BABL macros in the macro range.
+// Define starting number for BABL macros in the macro range.
// Probably can start the default even lower
#define BABL_START_NUM 50
@@ -53,7 +53,7 @@ enum {
// left & right
BABL_GO_LEFT_1C= BABL_START_NUM,
BABL_GO_RIGHT_1C,
- BABL_GO_LEFT_WORD,
+ BABL_GO_LEFT_WORD,
BABL_GO_RIGHT_WORD,
BABL_GO_START_LINE,
BABL_GO_END_LINE,
@@ -65,7 +65,7 @@ enum {
BABL_PGDN,
BABL_PGUP,
// And the delete options
- //BABL_DEL_LEFT_1C == backspace, so why bother.
+ //BABL_DEL_LEFT_1C == backspace, so why bother.
BABL_DEL_RIGHT_1C, // usually = Del
BABL_DEL_LEFT_WORD,
BABL_DEL_RIGHT_WORD,
@@ -110,7 +110,7 @@ enum {
BABL_BROWSER_FULLSCREEN,
BABL_BROWSER_ZOOM_IN,
BABL_BROWSER_ZOOM_OUT,
-
+
#endif
#endif
@@ -137,8 +137,8 @@ enum {
};
-// BUG, used to jump to babble functiion. Surely there is a way to calculate size of enum?
-#define BABL_NUM_MACROS 48+4 // 48 + # of defined modes.
+// BUG, used to jump to babble functiion. Surely there is a way to calculate size of enum?
+#define BABL_NUM_MACROS 48+4 // 48 + # of defined modes.
/* And all the shorthand keymap ready versions */
// First the mode switching macros
@@ -161,7 +161,7 @@ enum {
#define B_READ M(BABL_READLINE)
#endif
-// and all the movement & action.
+// and all the movement & action.
#define B_L1C M(BABL_GO_LEFT_1C)
#define B_R1C M(BABL_GO_RIGHT_1C)
@@ -175,7 +175,7 @@ enum {
#define B_UP M(BABL_GO_PREV_LINE)
#define B_PGDN M(BABL_PGDN)
#define B_PGUP M(BABL_PGUP)
-//#define B_BKSP M(BABL_DEL_LEFT_1C) == backspace so why bother.
+//#define B_BKSP M(BABL_DEL_LEFT_1C) == backspace so why bother.
#define B_DEL M(BABL_DEL_RIGHT_1C) // usually = Del
#define B_DLW M(BABL_DEL_LEFT_WORD)
#define B_DRW M(BABL_DEL_RIGHT_WORD)
@@ -210,8 +210,8 @@ enum {
#define B_BFUlL M(BABL_BROWSER_FULLSCREEN)
#define B_ZMIN M(BABL_BROWSER_ZOOM_IN)
#define B_ZMOT M(BABL_BROWSER_ZOOM_OUT)
-
-
+
+
diff --git a/keyboards/handwired/MS_sculpt_mobile/babblePaste.txt b/keyboards/handwired/ms_sculpt_mobile/babblePaste.txt
index cf75e153e..cf75e153e 100644
--- a/keyboards/handwired/MS_sculpt_mobile/babblePaste.txt
+++ b/keyboards/handwired/ms_sculpt_mobile/babblePaste.txt
diff --git a/keyboards/handwired/MS_sculpt_mobile/config.h b/keyboards/handwired/ms_sculpt_mobile/config.h
index f89514278..c3bdf333e 100644
--- a/keyboards/handwired/MS_sculpt_mobile/config.h
+++ b/keyboards/handwired/ms_sculpt_mobile/config.h
@@ -28,10 +28,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define DESCRIPTION 6000
/* key matrix size */
-#define MATRIX_ROWS 8
-#define MATRIX_COLS 18
+#define MATRIX_ROWS 8
+#define MATRIX_COLS 18
-#ifdef ASTAR
+#ifdef ASTAR
#define PRODUCT sculpt mobile astar
/*0 1 2 3 4 5 6 7 8 */
#define MATRIX_ROW_PINS {D7, C6, D4, D0, D1, D3, D2, E2}
@@ -95,6 +95,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
-#define PREVENT_STUCK_MODIFIERS
-
#endif
diff --git a/keyboards/handwired/ms_sculpt_mobile/info.json b/keyboards/handwired/ms_sculpt_mobile/info.json
new file mode 100644
index 000000000..86d5fde2e
--- /dev/null
+++ b/keyboards/handwired/ms_sculpt_mobile/info.json
@@ -0,0 +1,96 @@
+{
+ "keyboard_name": "MS Sculpt Mobile",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 16,
+ "height": 6,
+ "layouts": {
+ "LAYOUT": {
+ "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":"PrtSc", "x":13, "y":0},
+ {"label":"Home", "x":14, "y":0},
+ {"label":"End", "x":15, "y":0},
+ {"label":"`", "x":0, "y":1},
+ {"label":"1", "x":1, "y":1},
+ {"label":"2", "x":2, "y":1},
+ {"label":"3", "x":3, "y":1},
+ {"label":"4", "x":4, "y":1},
+ {"label":"5", "x":5, "y":1},
+ {"label":"6", "x":6, "y":1},
+ {"label":"7", "x":7, "y":1},
+ {"label":"8", "x":8, "y":1},
+ {"label":"9", "x":9, "y":1},
+ {"label":"0", "x":10, "y":1},
+ {"label":"-", "x":11, "y":1},
+ {"label":"=", "x":12, "y":1},
+ {"label":"Backspace", "x":13, "y":1, "w":2},
+ {"label":"Del", "x":15, "y":1, "h":1.6},
+ {"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":"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":2.6, "h":1.2},
+ {"label":"LShift", "x":0, "y":4, "w":2.25},
+ {"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":"RShift", "x":12.25, "y":4, "w":1.75},
+ {"label":"Up", "x":14, "y":4},
+ {"label":"PgDn", "x":15, "y":3.8, "h":1.2},
+ {"label":"LCtrl", "x":0, "y":5, "w":1.25},
+ {"label":"LWin", "x":1.25, "y":5, "w":1.25},
+ {"label":"LAlt", "x":2.5, "y":5, "w":1.25},
+ {"label":"Space", "x":3.75, "y":5, "w":5.5},
+ {"label":"RAlt", "x":9.25, "y":5, "w":1.25},
+ {"label":"Fn", "x":10.5, "y":5, "w":1.25},
+ {"label":"RCtrl", "x":11.75, "y":5, "w":1.25},
+ {"label":"Left", "x":13, "y":5},
+ {"label":"Down", "x":14, "y":5},
+ {"label":"Right", "x":15, "y":5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/ms_sculpt_mobile/keymaps/default/config.h b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/config.h
new file mode 100644
index 000000000..271f48d00
--- /dev/null
+++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/config.h
@@ -0,0 +1,3 @@
+#pragma once
+
+// place overrides here
diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/keymap.c b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/keymap.c
index a8802c99a..d4d0f33e9 100644
--- a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/keymap.c
+++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/keymap.c
@@ -1,7 +1,7 @@
-#include "../../MS_sculpt_mobile.h"
+#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-/*
+/*
*
* |ESC | F1 | F2 | F3 | F4 | F5 | F6 | f7 | F8 | F9 | F10| F11| F12|Vol-|Vol+|Mute|
* -------------------------------------------------------------------------------'
@@ -10,42 +10,22 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | tab | q | w | e | r | t | y | u | i | o | p | [ | ] | \ | |
* -------------------------------------------------------------------------------'
* | caps | 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 |Ralt | FN | Rctl |Left|Down|Rght|
-* ---------------------------------------------------------------------------------
+* ---------------------------------------------------------------------------------
*/
-[0] = KEYMAP( \
- 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, KC_MUTE,\
- 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_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_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_SPACE, KC_RALT, RSFT(KC_1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT
-)
-
+ [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_VOLD, KC_VOLU, KC_MUTE, \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
+ KC_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, RSFT(KC_1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT \
+ )
};
-const uint16_t PROGMEM fn_actions[] = {
-
-};
-
-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;
-};
-
void matrix_init_user(void) {
diff --git a/keyboards/handwired/ms_sculpt_mobile/keymaps/default/readme.md b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/readme.md
new file mode 100644
index 000000000..91575f7cd
--- /dev/null
+++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for Microsoft Sculpt Mobile
diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/rules.mk b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/rules.mk
index b3c01678f..3955a3ff4 100644
--- a/keyboards/handwired/MS_sculpt_mobile/keymaps/default/rules.mk
+++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/default/rules.mk
@@ -13,5 +13,5 @@ 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 this with audio at the same time.
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/config.h b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/config.h
index 5c04f647c..9d6be063e 100644
--- a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/config.h
+++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/config.h
@@ -1,23 +1,20 @@
-#ifndef CONFIG_USER_H
-#define CONFIG_USER_H
-
-#include "../../../MS_sculpt_mobile/config.h"
+#pragma once
#define USE_BABLPASTE
-// Expect to get errors if you comment a feature out and leave it in your keymap.
+// Expect to get errors if you comment a feature out and leave it in your keymap.
#ifdef USE_BABLPASTE
//define BabblePaste maps
-// Windows.
+// Windows.
#define MAC_MODE 0
#define MS_MODE 1
//aka gnome+KDE
-//#define LINUX_MODE 2
+//#define LINUX_MODE 2
//#define EMACS_MODE 3
#define VI_MODE 3
// Readline and tmux
-#define READMUX_MODE 2
+#define READMUX_MODE 2
//#define WORDSTAR_MODE 5
#endif
@@ -29,4 +26,3 @@
//#define BABL_NOBROWSER
// place overrides here
-#endif
diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/keymap.c b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/keymap.c
index c9b16e75e..c5ed18797 100644
--- a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/keymap.c
+++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/keymap.c
@@ -1,11 +1,5 @@
-#include "../../../MS_sculpt_mobile/babblePaste.h"
-#include "../../MS_sculpt_mobile.h"
-#include "action_layer.h"
-#include "action_util.h"
-
-#ifdef AUDIO_ENABLE
- #include "audio.h"
-#endif
+#include "babblePaste.h"
+#include QMK_KEYBOARD_H
#define _QWR 0
#define _CDH 2
@@ -59,7 +53,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* ---------------------------------------------------------------------------------
*/
-[_QWR] = KEYMAP( \
+[_QWR] = 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_VOLD, KC_VOLU, CDH,\
KC_ESC, KC_1, KC_2, KC_3 ,KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, KC_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,\
@@ -68,7 +62,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_LCTL, KC_LGUI, KC_LALT, KC_FN1, KC_RGUI,TT_SYM,KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT
),
-[_CDH] = KEYMAP (\
+[_CDH] = LAYOUT(\
____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, QWR, \
KC_ESC, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, ____, ____, ____,\
@@ -95,7 +89,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* ---------------------------------------------------------------------------------
*/
-[_SYM] = KEYMAP (\
+[_SYM] = LAYOUT(\
____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
M(VIBRK), KC_CIRC, KC_LCBR, KC_RCBR,KC_AT, KC_PERC, ____, KC_LBRC,KC_LPRN,KC_RPRN,KC_UNDS, ____, ____, ____,\
@@ -118,7 +112,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* ---------------------------------------------------------------------------------
*/
-[_MOV] = KEYMAP (\
+[_MOV] = LAYOUT(\
____, B_MAC,B_WIN,B_READ, B_VI, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
____, ____, B_PAPP, B_NAPP, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
____, B_UNDO, ____, B_BFND, ____, B_PTAB, B_DSOL, B_DLW, B_UP, B_DRW, B_DEOL, ____, ____, ____, \
@@ -127,7 +121,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
____, ____, ____, ____, ____, ____, ____, ____, ____, ____
),
-[_TRAN] = KEYMAP (\
+[_TRAN] = LAYOUT(\
____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, ____, \
diff --git a/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/readme.md b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/readme.md
new file mode 100644
index 000000000..3cb1380d1
--- /dev/null
+++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/readme.md
@@ -0,0 +1 @@
+# A more programmer oriented keymap for Microsoft Sculpt Mobile
diff --git a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/rules.mk
index 4f62657b3..ddfea8255 100644
--- a/keyboards/handwired/MS_sculpt_mobile/keymaps/milestogo/rules.mk
+++ b/keyboards/handwired/ms_sculpt_mobile/keymaps/milestogo/rules.mk
@@ -13,5 +13,5 @@ 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 this with audio at the same time.
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
diff --git a/keyboards/handwired/ms_sculpt_mobile/ms_sculpt_mobile.c b/keyboards/handwired/ms_sculpt_mobile/ms_sculpt_mobile.c
new file mode 100644
index 000000000..53773e5d8
--- /dev/null
+++ b/keyboards/handwired/ms_sculpt_mobile/ms_sculpt_mobile.c
@@ -0,0 +1 @@
+#include "ms_sculpt_mobile.h"
diff --git a/keyboards/handwired/MS_sculpt_mobile/MS_sculpt_mobile.h b/keyboards/handwired/ms_sculpt_mobile/ms_sculpt_mobile.h
index 1583dea6e..cfa07c92e 100644
--- a/keyboards/handwired/MS_sculpt_mobile/MS_sculpt_mobile.h
+++ b/keyboards/handwired/ms_sculpt_mobile/ms_sculpt_mobile.h
@@ -4,7 +4,7 @@
#include "quantum.h"
-#define KEYMAP( \
+#define LAYOUT( \
k7Q, k6O, k6P, k6Q, k5O, k5P, k5Q, k7A, k7B, k7C, k7D, k7E, k7F, k1O, k1K, k1L, \
k5A, k5K, k5L, k5M, k5N, k5H, k5I, k2A, k2B, k2C, k2D, k5B, k5C, k5J, k2E, \
k6R, k6D, k6E, k6F, k7I, k7J, k4A, k4B, k4C, k4D, k3A, k3B, k3C, k3D, \
@@ -24,7 +24,7 @@
}
-#define MATRIX_TESTING_KEYMAP( \
+#define MATRIX_TESTING_LAYOUT( \
k0A, k0B, k0C, k0D, k0E, k0F, k0G, k0H, k0I, k0, k0J, k0K, k0L, k0M, k0N, k0O, k0P, k0Q,\
k1A, k1B, k1C, k1D, k1E, k1F, k1G, k1H, k1I, k1, k1J, k1K, k1L, k1M, k1N, k1O, k1P, k1Q,\
k2A, k2B, k2C, k2D, k2E, k2F, k2G, k2H, k2I, k2, k2J, k2K, k2L, k2M, k2N, k2O, k2P, k2Q,\
diff --git a/keyboards/handwired/ms_sculpt_mobile/readme.md b/keyboards/handwired/ms_sculpt_mobile/readme.md
new file mode 100644
index 000000000..98fd1f8d1
--- /dev/null
+++ b/keyboards/handwired/ms_sculpt_mobile/readme.md
@@ -0,0 +1,55 @@
+# Microsoft Sculpt Mobile
+
+This is a way to take a Microsoft ergonomic bluetooth keyboard, and make it
+into a hard-wired keyboard running QMK.
+
+The keyboard is known under several different names:
+Mobile Bluetooth 5000, Mobile 6000, Sculpt mobile, and Asus rebranded.
+
+I had a stack of them, since they're cheap on ebay, travel well, and are just ergo enough.
+
+The ribbon cable is 1mm pitch, which is hard to hand solder. I bought a cheap set of
+"pitch adapter" boards https://www.amazon.com/Double-Sided-0-4mm-1-0-Adapter-60mmx38mm/dp/B00OK42118
+
+Cut the original ribbon cable sockets off the bluetooth board using a razor, they're hard to desolder.
+They're also allow the cable to be inserted on top or bottom.
+
+If I was going to do it again, I'd make the MCU connection come out the top of the keyboard
+and avoid the wires dangling out the bottom.
+
+As I was debugging the matrix, I started to get random failures. In desparation I tried a second MCU,
+but had the same problems. It turns out that the ribbon cable connections can get worn. Shave a
+half millimeter off the end of the ribbon cable & the errors go away.
+
+My method for discovering the matrix was to set up a LAYOUT macro that included all pins.
+See MATRIX_TESTING_LAYOUT if you need it. Then set up a keymap that has all printable symbols
+in the first 4 rows. test each key & record output. Then switch the printable symbols to the
+bottom 4 rows & repeat. This was enough to show the matrix.
+
+
+The full original keymap for the Sculpt is
+
+| | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R |
+|:-:|:--:|:--:|:--:|:---:|:---:|:---:|:----:|:----:|:----:|:-----:|:----:|:------:|:----:|:-----:|:----:|:------:|:----:|:---:|
+| 0 | b | n | m | , | . | / | | | | Caps | | | | | | | | Fn |
+| 1 | g | h | " | | | | | | | | Vol+ | Mute | RCtl | | Vol- | PgDn | LCtl | |
+| 2 | 7 | 8 | 9 | 0 | Del | | PgUp | | | | | RShift | | | | LShift | | |
+| 3 | p | [ | ] | \ | | | | | | | RAlt | | | | LAlt | | | |
+| 4 | y | u | i | o | | | | | | | | | | LGUI | | | | |
+| 5 | ~ | - | += | j | k | l | ; | 5 | 6 | Bksp | 1 | 2 | 3 | 4 | F4 | F5 | F6 | |
+| 6 | a | s | d | q | w | e | Up | Left | Down | Right | | | | Space | F1 | F2 | F3 | Tab |
+| 7 | F7 | F8 | F9 | F10 | F11 | F12 | | f | r | t | z | x | c | | v | Enter | Esc | |
+
+This works with 18 cols + 8 rows on a Teensy++, or ARM-based Teensy.
+
+The Astar mini has all pins exposed , so you can do 18x8
+If you want a speaker, LEDs, etc., you'll need to free up a pin. I recommend joining columns
+R and L to the same pin.
+
+Building - add ASTAR=1 to the compile line or leave out for teensy2++
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/ms_sculpt_mobile: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/MS_sculpt_mobile/rules.mk b/keyboards/handwired/ms_sculpt_mobile/rules.mk
index 680c057d3..680c057d3 100644
--- a/keyboards/handwired/MS_sculpt_mobile/rules.mk
+++ b/keyboards/handwired/ms_sculpt_mobile/rules.mk
diff --git a/keyboards/handwired/nicekey/keymaps/default/keymap.c b/keyboards/handwired/nicekey/keymaps/default/keymap.c
index 573237715..139ea6a3b 100644
--- a/keyboards/handwired/nicekey/keymaps/default/keymap.c
+++ b/keyboards/handwired/nicekey/keymaps/default/keymap.c
@@ -71,5 +71,5 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- {{ RANDOM_STRING_MACRO }}
+ LAYOUT( RANDOM_STRING_MACRO )
};
diff --git a/keyboards/handwired/nicekey/nicekey.h b/keyboards/handwired/nicekey/nicekey.h
index 7a4a4835e..ee5bcfd6b 100644
--- a/keyboards/handwired/nicekey/nicekey.h
+++ b/keyboards/handwired/nicekey/nicekey.h
@@ -1 +1,12 @@
-#include "quantum.h" \ No newline at end of file
+#ifndef NICEKEY_H
+#define NICEKEY_H
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ k00 \
+ ) { \
+ { k00 } \
+}
+
+#endif
diff --git a/keyboards/handwired/nicekey/readme.md b/keyboards/handwired/nicekey/readme.md
index a867e907e..e108b38dd 100644
--- a/keyboards/handwired/nicekey/readme.md
+++ b/keyboards/handwired/nicekey/readme.md
@@ -5,7 +5,7 @@
Custom handwired nicekey, a one key keyboard that writes random compliments.
-Keyboard Maintainer: spydon
+Keyboard Maintainer: [spydon](https://github.com/spydon)
Hardware Supported: Custom handwired one key
Hardware Availability:
@@ -15,4 +15,4 @@ Make example for this keyboard (after setting up your build environment):
make handwired/nicekey:default
-See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) 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/handwired/not_so_minidox/info.json b/keyboards/handwired/not_so_minidox/info.json
new file mode 100644
index 000000000..022209502
--- /dev/null
+++ b/keyboards/handwired/not_so_minidox/info.json
@@ -0,0 +1,63 @@
+{
+ "keyboard_name": "Not So MiniDox",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 12,
+ "height": 5.75,
+ "layouts": {
+ "LAYOUT": {
+ "key_count": 42,
+ "layout": [
+ {"x":0, "y":0.375},
+ {"x":1, "y":0.25},
+ {"x":2, "y":0.125},
+ {"x":3, "y":0},
+ {"x":4, "y":0.125},
+ {"x":5, "y":0.25},
+
+ {"x":8, "y":0.25},
+ {"x":9, "y":0.125},
+ {"x":10, "y":0},
+ {"x":11, "y":0.125},
+ {"x":12, "y":0.25},
+ {"x":13, "y":0.375},
+
+ {"x":0, "y":1.375},
+ {"x":1, "y":1.25},
+ {"x":2, "y":1.125},
+ {"x":3, "y":1},
+ {"x":4, "y":1.125},
+ {"x":5, "y":1.25},
+
+ {"x":8, "y":1.25},
+ {"x":9, "y":1.125},
+ {"x":10, "y":1},
+ {"x":11, "y":1.125},
+ {"x":12, "y":1.25},
+ {"x":13, "y":1.375},
+
+ {"x":0, "y":2.375},
+ {"x":1, "y":2.25},
+ {"x":2, "y":2.125},
+ {"x":3, "y":2},
+ {"x":4, "y":2.125},
+ {"x":5, "y":2.25},
+
+ {"x":8, "y":2.25},
+ {"x":9, "y":2.125},
+ {"x":10, "y":2},
+ {"x":11, "y":2.125},
+ {"x":12, "y":2.25},
+ {"x":13, "y":2.375},
+
+ {"x":3.5, "y":4.75},
+ {"x":4.5, "y":4.75},
+ {"x":5.5, "y":3.75, "h":2},
+
+ {"x":7.5, "y":3.75, "h":2},
+ {"x":8.5, "y":4.75},
+ {"x":9.5, "y":4.75}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/not_so_minidox/readme.md b/keyboards/handwired/not_so_minidox/readme.md
index 22d355873..bd4060735 100644
--- a/keyboards/handwired/not_so_minidox/readme.md
+++ b/keyboards/handwired/not_so_minidox/readme.md
@@ -50,13 +50,13 @@ file will run on both hands instead of having to flash left and right handed
versions of the firmware to each half. To flash the EEPROM file for the left
half run:
```
-avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-lefthand.eep
+avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-lefthand.eep"
// or the equivalent in dfu-programmer
```
and similarly for right half
```
-avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-righhand.eep
+avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-righthand.eep"
// or the equivalent in dfu-programmer
```
diff --git a/keyboards/handwired/not_so_minidox/rules.mk b/keyboards/handwired/not_so_minidox/rules.mk
index fe4cc014e..833dd4b79 100644
--- a/keyboards/handwired/not_so_minidox/rules.mk
+++ b/keyboards/handwired/not_so_minidox/rules.mk
@@ -63,7 +63,7 @@ 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 this with audio at the same time.
+RGBLIGHT_ENABLE ?= no # Enable WS2812 RGB underlight.
USE_I2C ?= 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
diff --git a/keyboards/handwired/numpad20/info.json b/keyboards/handwired/numpad20/info.json
new file mode 100644
index 000000000..691acb315
--- /dev/null
+++ b/keyboards/handwired/numpad20/info.json
@@ -0,0 +1,33 @@
+{
+ "keyboard_name": "numpad20 handwired",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 4,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"K00", "x":0, "y":0},
+ {"label":"K01", "x":1, "y":0},
+ {"label":"K02", "x":2, "y":0},
+ {"label":"K03", "x":3, "y":0},
+ {"label":"K10", "x":0, "y":1},
+ {"label":"K11", "x":1, "y":1},
+ {"label":"K12", "x":2, "y":1},
+ {"label":"K13", "x":3, "y":1},
+ {"label":"K20", "x":0, "y":2},
+ {"label":"K21", "x":1, "y":2},
+ {"label":"K22", "x":2, "y":2},
+ {"label":"K23", "x":3, "y":2},
+ {"label":"K30", "x":0, "y":3},
+ {"label":"K31", "x":1, "y":3},
+ {"label":"K32", "x":2, "y":3},
+ {"label":"K33", "x":3, "y":3},
+ {"label":"K40", "x":0, "y":4},
+ {"label":"K41", "x":1, "y":4},
+ {"label":"K42", "x":2, "y":4},
+ {"label":"K43", "x":3, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/numpad20/keymaps/default/keymap.c b/keyboards/handwired/numpad20/keymaps/default/keymap.c
index 65799bfee..414b104af 100644
--- a/keyboards/handwired/numpad20/keymaps/default/keymap.c
+++ b/keyboards/handwired/numpad20/keymaps/default/keymap.c
@@ -1,16 +1,11 @@
-#include "numpad20.h"
-
-#define KC_ KC_TRNS
+#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
- LEFT,RGHT, UP ,DOWN, \
- P7 , P8 , P9 ,PLUS, \
- P4 , P5 , P6 ,MINS, \
- P1 , P2 , P3 , ENT, \
- P0 ,DOT ,RGHT, TAB \
- )
-};
-
-const uint16_t PROGMEM fn_actions[] = {
+ KC_LEFT, KC_RGHT, KC_UP, KC_DOWN, \
+ KC_P7, KC_P8, KC_P9, KC_PLUS, \
+ KC_P4, KC_P5, KC_P6, KC_MINS, \
+ KC_P1, KC_P2, KC_P3, KC_ENT, \
+ KC_P0, KC_DOT, KC_RGHT, KC_TAB \
+ )
};
diff --git a/keyboards/handwired/numpad20/numpad20.h b/keyboards/handwired/numpad20/numpad20.h
index a2aa8d16b..c15aa9ac7 100644
--- a/keyboards/handwired/numpad20/numpad20.h
+++ b/keyboards/handwired/numpad20/numpad20.h
@@ -10,11 +10,11 @@
K30, K31, K32, K33, \
K40, K41, K42, K43 \
) { \
- { KC_##K00, KC_##K01, KC_##K02, KC_##K03 }, \
- { KC_##K10, KC_##K11, KC_##K12, KC_##K13 }, \
- { KC_##K20, KC_##K21, KC_##K22, KC_##K23 }, \
- { KC_##K30, KC_##K31, KC_##K32, KC_##K33 }, \
- { KC_##K40, KC_##K41, KC_##K42, KC_##K43 } \
+ { K00, K01, K02, K03 }, \
+ { K10, K11, K12, K13 }, \
+ { K20, K21, K22, K23 }, \
+ { K30, K31, K32, K33 }, \
+ { K40, K41, K42, K43 } \
}
-#endif \ No newline at end of file
+#endif
diff --git a/keyboards/handwired/onekey/keymaps/default/keymap.c b/keyboards/handwired/onekey/keymaps/default/keymap.c
index 10c486718..dd64f9fa5 100644
--- a/keyboards/handwired/onekey/keymaps/default/keymap.c
+++ b/keyboards/handwired/onekey/keymaps/default/keymap.c
@@ -1,5 +1,5 @@
-#include "onekey.h"
+#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- {{ KC_A }}
+ LAYOUT( KC_A )
};
diff --git a/keyboards/handwired/onekey/onekey.h b/keyboards/handwired/onekey/onekey.h
index 7a4a4835e..8ce6fec2d 100644
--- a/keyboards/handwired/onekey/onekey.h
+++ b/keyboards/handwired/onekey/onekey.h
@@ -1 +1,12 @@
-#include "quantum.h" \ No newline at end of file
+#ifndef ONEKEY_H
+#define ONEKEY_H
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ k00 \
+ ) { \
+ { k00 } \
+}
+
+#endif
diff --git a/keyboards/handwired/onekey/readme.md b/keyboards/handwired/onekey/readme.md
index c28e284f3..eab3b75a9 100644
--- a/keyboards/handwired/onekey/readme.md
+++ b/keyboards/handwired/onekey/readme.md
@@ -12,4 +12,4 @@ Make example for this keyboard (after setting up your build environment):
make handwired/onekey:default
-See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ 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/handwired/ortho5x13/info.json b/keyboards/handwired/ortho5x13/info.json
new file mode 100644
index 000000000..15a65081a
--- /dev/null
+++ b/keyboards/handwired/ortho5x13/info.json
@@ -0,0 +1,77 @@
+{
+ "keyboard_name": "ortho5x13",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 13,
+ "height": 6,
+ "layouts": {
+ "LAYOUT": {
+ "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":"Tab", "x":0, "y":1},
+ {"label":"Q", "x":1, "y":1},
+ {"label":"W", "x":2, "y":1},
+ {"label":"E", "x":3, "y":1},
+ {"label":"R", "x":4, "y":1},
+ {"label":"T", "x":5, "y":1},
+ {"label":"Y", "x":6, "y":1},
+ {"label":"U", "x":7, "y":1},
+ {"label":"I", "x":8, "y":1},
+ {"label":"O", "x":9, "y":1},
+ {"label":"P", "x":10, "y":1},
+ {"label":"[", "x":11, "y":1},
+ {"label":"]", "x":12, "y":1},
+ {"label":"`", "x":0, "y":2},
+ {"label":"A", "x":1, "y":2},
+ {"label":"S", "x":2, "y":2},
+ {"label":"D", "x":3, "y":2},
+ {"label":"F", "x":4, "y":2},
+ {"label":"G", "x":5, "y":2},
+ {"label":"H", "x":6, "y":2},
+ {"label":"J", "x":7, "y":2},
+ {"label":"K", "x":8, "y":2},
+ {"label":"L", "x":9, "y":2},
+ {"label":";", "x":10, "y":2},
+ {"label":",", "x":11, "y":2},
+ {"label":"\\", "x":12, "y":2},
+ {"label":"Shift", "x":0, "y":3},
+ {"label":"Z", "x":1, "y":3},
+ {"label":"X", "x":2, "y":3},
+ {"label":"C", "x":3, "y":3},
+ {"label":"V", "x":4, "y":3},
+ {"label":"B", "x":5, "y":3},
+ {"label":"N", "x":6, "y":3},
+ {"label":"M", "x":7, "y":3},
+ {"label":",", "x":8, "y":3},
+ {"label":".", "x":9, "y":3},
+ {"label":"/", "x":10, "y":3},
+ {"label":"Enter", "x":11, "y":3},
+ {"label":"Up", "x":12, "y":3},
+ {"label":"Hyper", "x":0, "y":4},
+ {"label":"Ctrl", "x":1, "y":4},
+ {"label":"Alt", "x":2, "y":4},
+ {"label":"GUI", "x":3, "y":4},
+ {"label":"Lower", "x":4, "y":4},
+ {"label":"Space", "x":5, "y":4, "w":2},
+ {"label":"Raise", "x":7, "y":4},
+ {"label":"Backspace", "x":8, "y":4},
+ {"label":"Shift", "x":9, "y":4},
+ {"label":"Left", "x":10, "y":4},
+ {"label":"Right", "x":11, "y":4},
+ {"label":"Down", "x":12, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/ortho5x13/keymaps/default/keymap.c b/keyboards/handwired/ortho5x13/keymaps/default/keymap.c
index 0d5d0c430..0c8bbb055 100644
--- a/keyboards/handwired/ortho5x13/keymaps/default/keymap.c
+++ b/keyboards/handwired/ortho5x13/keymaps/default/keymap.c
@@ -1,9 +1,4 @@
-#include "ortho5x13.h"
-#include "action_layer.h"
-#include "eeconfig.h"
-#ifdef AUDIO_ENABLE
- #include "audio.h"
-#endif
+#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.
@@ -25,146 +20,142 @@ enum custom_keycodes {
BACKLIT
};
-// Fillers to make layering more clear
-#define _______ KC_TRNS
-#define XXXXXXX KC_NO
-
#define KC_L1 LOWER
#define KC_L2 RAISE
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-/* Qwerty
+ /* Qwerty
+ * ,------------------------------------------------------------------------------------------.
+ * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |
+ * |------+------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] |
+ * |------+------+------+------+------+-------------+------+------+------+------+------+------|
+ * | ` | A | S | D | F | G | H | J | K | L | ; | ' | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | Up |
+ * |------+------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Hyper| Ctrl | Alt | GUI |Lower | Space |Raise | Bksp |Shift | Left | Down |Right |
+ * `------------------------------------------------------------------------------------------'
+ */
+ [_QWERTY] = LAYOUT(
+ //,--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------.
+ KC_ESC ,KC_1 ,KC_2 ,KC_3 ,KC_4 ,KC_5 ,KC_6 ,KC_7 ,KC_8 ,KC_9 ,KC_0 ,KC_MINS ,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_LBRC ,KC_RBRC ,
+ //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
+ KC_GRV ,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_LSFT ,KC_Z ,KC_X ,KC_C ,KC_V ,KC_B ,KC_N ,KC_M ,KC_COMM ,KC_DOT ,KC_SLSH ,KC_ENT ,KC_UP ,
+ //|--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+--------+--------|
+ KC_HYPR ,KC_LCTL ,KC_LALT ,KC_LGUI ,KC_L1 , KC_SPC ,KC_L2 ,KC_BSPC ,KC_RSFT ,KC_LEFT ,KC_RGHT ,KC_DOWN
+ //`--------+--------+--------+--------+--------+-----------------+--------+--------+--------+--------+--------+--------'
+ ),
+
+/* Colemak
* ,------------------------------------------------------------------------------------------.
- * | Esc | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | |
* |------+------+------+------+------+------+------+------+------+------+------+------+------|
- * | Tab | Q | W | E | R | T | Y | U | I | O | P | [ | ] |
+ * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del | |
* |------+------+------+------+------+-------------+------+------+------+------+------+------|
- * | ` | A | S | D | F | G | H | J | K | L | ; | ' | \ |
+ * | Esc | A | R | S | T | D | H | N | E | I | O | " | |
* |------+------+------+------+------+------|------+------+------+------+------+------+------|
- * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter | Up |
+ * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter | |
* |------+------+------+------+------+------+------+------+------+------+------+------+------|
- * | Hyper| Ctrl | Alt | GUI |Lower | Space |Raise | Bksp |Shift | Left | Down |Right |
+ * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | |
* `------------------------------------------------------------------------------------------'
*/
-[_QWERTY] = LAYOUT_compact(
- //,----+----+----+----+----+----+----+----+----+----+----+----+----.
- ESC , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 ,MINS,EQL ,
- //|----+----+----+----+----+----+----+----+----+----+----+----+----|
- TAB , Q , W , E , R , T , Y , U , I , O , P ,LBRC,RBRC,
- //|----+----+----+----+----+----+----+----+----+----+----+----+----|
- GRV , A , S , D , F , G , H , J , K , L ,SCLN,QUOT,BSLS,
- //|----+----+----+----+----+----+----+----+----+----+----+----+----|
- LSFT, Z , X , C , V , B , N , M ,COMM,DOT ,SLSH,ENT , UP ,
- //|----+----+----+----+----+---------+----+----+----+----+----+----|
- HYPR,LCTL,LALT,LGUI, L1 , SPACE , L2 ,BSPC,RSFT,LEFT,RGHT,DOWN
- //`----+----+----+----+----+---------+----+----+----+----+----+----'
- ),
-
-/* Colemak
- * ,-----------------------------------------------------------------------------------.
- * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Del |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Esc | A | R | S | T | D | H | N | E | I | O | " |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
- * `-----------------------------------------------------------------------------------'
- */
-[_COLEMAK] = {
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
- {KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL},
- {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 },
- {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
-},
+[_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_BSPC, _______,
+ KC_TAB, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, KC_DEL , _______,
+ 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 , _______,
+ BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______
+),
/* Dvorak
- * ,-----------------------------------------------------------------------------------.
- * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Tab | " | , | . | P | Y | F | G | C | R | L | Del |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Esc | A | O | E | U | I | D | H | T | N | S | / |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
- * `-----------------------------------------------------------------------------------'
+ * ,------------------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | " | , | . | P | Y | F | G | C | R | L | Del | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------+------|
+ * | Esc | A | O | E | U | I | D | H | T | N | S | / | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------+------|
+ * | Shift| ; | Q | J | K | X | B | M | W | V | Z |Enter | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right | |
+ * `------------------------------------------------------------------------------------------'
*/
-[_DVORAK] = {
- {KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC},
- {KC_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL},
- {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 },
- {BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT}
-},
+[_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_TAB, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, KC_DEL , _______,
+ 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 , _______,
+ BACKLIT, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______
+),
/* Lower
- * ,-----------------------------------------------------------------------------------.
- * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | Next | Vol- | Vol+ | Play |
- * `-----------------------------------------------------------------------------------'
+ * ,------------------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------+------|
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | |Enter | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play | |
+ * `------------------------------------------------------------------------------------------'
*/
-[_LOWER] = {
- {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
- {KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL},
- {KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
- {_______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),_______, _______, _______},
- {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
-},
+[_LOWER] = LAYOUT(
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, _______,
+ 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 | Bksp |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | Next | Vol- | Vol+ | Play |
- * `-----------------------------------------------------------------------------------'
+ * ,------------------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | |Enter | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play | |
+ * `------------------------------------------------------------------------------------------'
*/
-[_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_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}
-},
+[_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_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)
- * ,-----------------------------------------------------------------------------------.
- * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | Reset| | | | | | | | | | Del |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | |Voice-|Voice+|Musoff|Mus on| | | | | | | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | | | | |
- * `-----------------------------------------------------------------------------------'
+ * ,------------------------------------------------------------------------------------------.
+ * | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | Reset| | | | | | | | | | Del | |
+ * |------+------+------+------+------+-------------+------+------+------+------+------+------|
+ * | | | |Audoff|Aud on|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------+------|
+ * | |Voice-|Voice+|Musoff|Mus on| | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * `------------------------------------------------------------------------------------------'
*/
-[_ADJUST] = {
- {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, COLEMAK, DVORAK, _______, _______},
- {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______},
- {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
-}
+[_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, COLEMAK, DVORAK, _______, _______, _______,
+ _______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
+)
};
@@ -286,4 +277,4 @@ void music_scale_user(void)
PLAY_SONG(music_scale);
}
-#endif \ No newline at end of file
+#endif
diff --git a/keyboards/handwired/ortho5x13/readme.md b/keyboards/handwired/ortho5x13/readme.md
index 7241ddae8..444cfec96 100644
--- a/keyboards/handwired/ortho5x13/readme.md
+++ b/keyboards/handwired/ortho5x13/readme.md
@@ -10,4 +10,4 @@ Make example for this keyboard (after setting up your build environment):
make handwired/ortho5x13:default
-See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information. \ 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/handwired/ortho60/boards/GENERIC_STM32_F103/board.c b/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.c
new file mode 100644
index 000000000..8c5a87f35
--- /dev/null
+++ b/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.c
@@ -0,0 +1,56 @@
+/*
+ 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.
+*/
+
+#include "hal.h"
+
+// Value to place in RTC backup register 10 for persistent bootloader mode
+#define RTC_BOOTLOADER_FLAG 0x424C
+
+/**
+ * @brief PAL setup.
+ * @details Digital I/O ports static configuration as defined in @p board.h.
+ * This variable is used by the HAL when initializing the PAL driver.
+ */
+#if HAL_USE_PAL || defined(__DOXYGEN__)
+const PALConfig pal_default_config =
+{
+ {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH},
+ {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH},
+ {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH},
+ {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH},
+ {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH},
+};
+#endif
+
+/*
+ * Early initialization code.
+ * This initialization must be performed just after stack setup and before
+ * any other initialization.
+ */
+void __early_init(void) {
+
+ stm32_clock_init();
+}
+
+/*
+ * Board-specific initialization code.
+ */
+void boardInit(void) {
+ //JTAG-DP Disabled and SW-DP Enabled
+ AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
+ //Set backup register DR10 to enter bootloader on reset
+ BKP->DR10 = RTC_BOOTLOADER_FLAG;
+}
diff --git a/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.h b/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.h
new file mode 100644
index 000000000..9427adabf
--- /dev/null
+++ b/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.h
@@ -0,0 +1,166 @@
+/*
+ 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 _BOARD_H_
+#define _BOARD_H_
+
+/*
+ * Setup for a Generic STM32F103 board.
+ */
+
+/*
+ * Board identifier.
+ */
+#define BOARD_GENERIC_STM32_F103
+#define BOARD_NAME "Generic STM32F103x board"
+
+/*
+ * Board frequencies.
+ */
+#define STM32_LSECLK 32768
+#define STM32_HSECLK 8000000
+
+/*
+ * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h.
+ */
+#define STM32F103xB
+
+/*
+ * IO pins assignments
+ */
+
+/* on-board */
+
+#define GPIOA_LED 8
+#define GPIOD_OSC_IN 0
+#define GPIOD_OSC_OUT 1
+
+/* In case your board has a "USB enable" hardware
+ controlled by a pin, define it here. (It could be just
+ a 1.5k resistor connected to D+ line.)
+*/
+/*
+#define GPIOB_USB_DISC 10
+*/
+
+/*
+ * I/O ports initial setup, this configuration is established soon after reset
+ * in the initialization code.
+ *
+ * The digits have the following meaning:
+ * 0 - Analog input.
+ * 1 - Push Pull output 10MHz.
+ * 2 - Push Pull output 2MHz.
+ * 3 - Push Pull output 50MHz.
+ * 4 - Digital input.
+ * 5 - Open Drain output 10MHz.
+ * 6 - Open Drain output 2MHz.
+ * 7 - Open Drain output 50MHz.
+ * 8 - Digital input with PullUp or PullDown resistor depending on ODR.
+ * 9 - Alternate Push Pull output 10MHz.
+ * A - Alternate Push Pull output 2MHz.
+ * B - Alternate Push Pull output 50MHz.
+ * C - Reserved.
+ * D - Alternate Open Drain output 10MHz.
+ * E - Alternate Open Drain output 2MHz.
+ * F - Alternate Open Drain output 50MHz.
+ * Please refer to the STM32 Reference Manual for details.
+ */
+
+/*
+ * Port A setup.
+ * Everything input with pull-up except:
+ * PA2 - Alternate output (USART2 TX).
+ * PA3 - Normal input (USART2 RX).
+ * PA9 - Alternate output (USART1 TX).
+ * PA10 - Normal input (USART1 RX).
+ */
+#define VAL_GPIOACRL 0x88884B88 /* PA7...PA0 */
+#define VAL_GPIOACRH 0x888884B8 /* PA15...PA8 */
+#define VAL_GPIOAODR 0xFFFFFFFF
+
+/*
+ * Port B setup.
+ * Everything input with pull-up except:
+ * PB10 - Push Pull output (USB switch).
+ */
+#define VAL_GPIOBCRL 0x88888888 /* PB7...PB0 */
+#define VAL_GPIOBCRH 0x88888388 /* PB15...PB8 */
+#define VAL_GPIOBODR 0xFFFFFFFF
+
+/*
+ * Port C setup.
+ * Everything input with pull-up except:
+ * PC13 - Push Pull output (LED).
+ */
+#define VAL_GPIOCCRL 0x88888888 /* PC7...PC0 */
+#define VAL_GPIOCCRH 0x88388888 /* PC15...PC8 */
+#define VAL_GPIOCODR 0xFFFFFFFF
+
+/*
+ * Port D setup.
+ * Everything input with pull-up except:
+ * PD0 - Normal input (XTAL).
+ * PD1 - Normal input (XTAL).
+ */
+#define VAL_GPIODCRL 0x88888844 /* PD7...PD0 */
+#define VAL_GPIODCRH 0x88888888 /* PD15...PD8 */
+#define VAL_GPIODODR 0xFFFFFFFF
+
+/*
+ * Port E setup.
+ * Everything input with pull-up except:
+ */
+#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */
+#define VAL_GPIOECRH 0x88888888 /* PE15...PE8 */
+#define VAL_GPIOEODR 0xFFFFFFFF
+
+/*
+ * USB bus activation macro, required by the USB driver.
+ */
+/* The point is that most of the generic STM32F103* boards
+ have a 1.5k resistor connected on one end to the D+ line
+ and on the other end to some pin. Or even a slightly more
+ complicated "USB enable" circuit, controlled by a pin.
+ That should go here.
+
+ However on some boards (e.g. one that I have), there's no
+ such hardware. In which case it's better to not do anything.
+*/
+/*
+#define usb_lld_connect_bus(usbp) palClearPad(GPIOB, GPIOB_USB_DISC)
+*/
+#define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT);
+
+/*
+ * USB bus de-activation macro, required by the USB driver.
+ */
+/*
+#define usb_lld_disconnect_bus(usbp) palSetPad(GPIOB, GPIOB_USB_DISC)
+*/
+#define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12);
+
+#if !defined(_FROM_ASM_)
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void boardInit(void);
+#ifdef __cplusplus
+}
+#endif
+#endif /* _FROM_ASM_ */
+
+#endif /* _BOARD_H_ */
diff --git a/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.mk b/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.mk
new file mode 100644
index 000000000..6b8b312fd
--- /dev/null
+++ b/keyboards/handwired/ortho60/boards/GENERIC_STM32_F103/board.mk
@@ -0,0 +1,5 @@
+# List of all the board related files.
+BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F103/board.c
+
+# Required include directories
+BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F103
diff --git a/keyboards/handwired/ortho60/bootloader_defs.h b/keyboards/handwired/ortho60/bootloader_defs.h
new file mode 100644
index 000000000..0f45203cb
--- /dev/null
+++ b/keyboards/handwired/ortho60/bootloader_defs.h
@@ -0,0 +1,10 @@
+/* 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 an USB bootloader in ROM (only serial),
+// so setting anything here does not make much sense
+// #define STM32_BOOTLOADER_ADDRESS 0x1FFFC800
diff --git a/keyboards/handwired/ortho60/chconf.h b/keyboards/handwired/ortho60/chconf.h
new file mode 100644
index 000000000..bbd9b2da6
--- /dev/null
+++ b/keyboards/handwired/ortho60/chconf.h
@@ -0,0 +1,524 @@
+/*
+ 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.
+*/
+
+/**
+ * @file 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_
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System time counter resolution.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#define CH_CFG_ST_RESOLUTION 32
+
+/**
+ * @brief System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ * setting also defines the system tick time unit.
+ */
+#define CH_CFG_ST_FREQUENCY 100000
+
+/**
+ * @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.
+ */
+#define CH_CFG_ST_TIMEDELTA 0
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @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.
+ */
+#define CH_CFG_TIME_QUANTUM 0
+
+/**
+ * @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.
+ */
+#define CH_CFG_MEMCORE_SIZE 0
+
+/**
+ * @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.
+ */
+#define CH_CFG_NO_IDLE_THREAD FALSE
+
+/* Use __WFI in the idle thread for waiting. Does lower the power
+ * consumption. */
+#define CORTEX_ENABLE_WFI_IDLE TRUE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @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.
+ */
+#define CH_CFG_OPTIMIZE_SPEED TRUE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @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.
+ */
+#define CH_CFG_USE_TM FALSE
+
+/**
+ * @brief Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_REGISTRY TRUE
+
+/**
+ * @brief Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_WAITEXIT TRUE
+
+/**
+ * @brief Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_SEMAPHORES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
+
+/**
+ * @brief Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_MUTEXES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_CONDVARS TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
+
+/**
+ * @brief Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_EVENTS TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
+
+/**
+ * @brief Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_MESSAGES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MAILBOXES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MEMCORE TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_HEAP TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MEMPOOLS FALSE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_DYNAMIC FALSE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Debug option, kernel statistics.
+ *
+ * @note The default is @p FALSE.
+ */
+#define CH_DBG_STATISTICS FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_SYSTEM_STATE_CHECK FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_ENABLE_CHECKS FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_ENABLE_ASSERTS FALSE
+
+/**
+ * @brief Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
+
+/**
+ * @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.
+ */
+#define CH_DBG_TRACE_BUFFER_SIZE 128
+
+/**
+ * @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.
+ */
+#define CH_DBG_ENABLE_STACK_CHECK FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_FILL_THREADS FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_THREADS_PROFILING FALSE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @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 chThdInit() API.
+ *
+ * @note It is invoked from within @p chThdInit() 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/ortho60/config.h b/keyboards/handwired/ortho60/config.h
new file mode 100644
index 000000000..dd06f3f95
--- /dev/null
+++ b/keyboards/handwired/ortho60/config.h
@@ -0,0 +1,74 @@
+/*
+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 0x6464
+#define DEVICE_VER 0x0001
+/* in python2: list(u"whatever".encode('utf-16-le')) */
+/* at most 32 characters or the ugly hack in usb_main.c borks */
+#define MANUFACTURER QMK
+#define PRODUCT Ortho60
+#define DESCRIPTION Ortho60
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 12
+
+#define MATRIX_COL_PINS { B11, B10, B1, B0, A7, A6, A5, A4, A3, A2, A1, A0 }
+#define MATRIX_ROW_PINS { B3, B4, B5, B6, B7 }
+#define DIODE_DIRECTION COL2ROW
+
+#define BACKLIGHT_LEVELS 1
+
+/* 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
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
diff --git a/keyboards/handwired/ortho60/halconf.h b/keyboards/handwired/ortho60/halconf.h
new file mode 100644
index 000000000..5fba285a3
--- /dev/null
+++ b/keyboards/handwired/ortho60/halconf.h
@@ -0,0 +1,353 @@
+/*
+ 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.
+*/
+
+/**
+ * @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_
+
+#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 DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC FALSE
+#endif
+
+/**
+ * @brief Enables the EXT subsystem.
+ */
+#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__)
+#define HAL_USE_EXT 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 SPI subsystem.
+ */
+#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_SPI TRUE
+#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
+
+/*===========================================================================*/
+/* 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
+
+/*===========================================================================*/
+/* 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 an event sources for incoming packets.
+ */
+#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
+
+/*===========================================================================*/
+/* 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 64 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 64 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_SIZE 1
+#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 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
+
+/*===========================================================================*/
+/* 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
+
+#endif /* _HALCONF_H_ */
+
+/** @} */
diff --git a/keyboards/handwired/ortho60/hsv2rgb.c b/keyboards/handwired/ortho60/hsv2rgb.c
new file mode 100644
index 000000000..adb7af8fa
--- /dev/null
+++ b/keyboards/handwired/ortho60/hsv2rgb.c
@@ -0,0 +1,80 @@
+/* hsv2rgb.c
+ * Integer only conversion functions between HSV and RGB
+ */
+
+#include "hsv2rgb.h"
+
+// TODO fix these buggy macros
+#define max(x,y) ((x>y) ? x:y)
+#define min(x,y) ((x>y) ? y:x)
+#define min3(x,y,z) (min(min(x,y),z))
+#define max3(x,y,z) (max(max(x,y),z))
+
+
+rgb_color hsv2rgb(hsv_color hsv)
+{
+ // From : http://qscribble.blogspot.fr/2008/06/integer-conversion-from-hsl-to-rgb.html
+ int h = hsv.h;
+ int s = hsv.s;
+ int v = hsv.v;
+ rgb_color rgb = {0, 0, 0};
+
+ if (v == 0)
+ return rgb;
+
+ // sextant = 0 .. 5
+ int sextant = (h*6)/256;
+ // f = 0 .. 42
+ int f = h - (sextant*256)/6;
+
+ int p = (v * (256 - s))/256;
+ int q = (v * (256*43 - s*f))/(256*43);
+ int t = (v * (256*43 - s*(43-f)))/(256*43);
+
+ // Corrige les erreurs dues aux arrondis
+ p = max(min(p, 255), 0);
+ q = max(min(q, 255), 0);
+ t = max(min(t, 255), 0);
+
+ switch(sextant){
+ case 0: rgb.r = v; rgb.g = t; rgb.b = p; break;
+ case 1: rgb.r = q; rgb.g = v; rgb.b = p; break;
+ case 2: rgb.r = p; rgb.g = v; rgb.b = t; break;
+ case 3: rgb.r = p; rgb.g = q; rgb.b = v; break;
+ case 4: rgb.r = t; rgb.g = p; rgb.b = v; break;
+ default:rgb.r = v; rgb.g = p; rgb.b = q; break;
+ }
+ return rgb;
+}
+
+
+hsv_color rgb2hsv(rgb_color rgb)
+{
+ // From : http://www.ruinelli.ch/rgb-to-hsv
+ hsv_color hsv = {0, 0, 0};
+ int min, max, delta;
+
+ min = min3(rgb.r, rgb.g, rgb.b);
+ max = max3(rgb.r, rgb.g, rgb.b);
+
+ if(max==0) {
+ hsv.h = 0;
+ hsv.s = 0;
+ hsv.v = 0;
+ return hsv;
+ }
+
+ hsv.v = max;
+ delta = max - min;
+
+ hsv.s = (delta)*255 / max;
+
+ if(rgb.r == max)
+ hsv.h = (rgb.g - rgb.b)*42/delta; // between yellow & magenta
+ else if(rgb.g == max)
+ hsv.h = 120 + (rgb.b - rgb.r)*42/delta; // between cyan & yellow
+ else
+ hsv.h = 240 + (rgb.r - rgb.g)*42/delta; // between magenta & cyan
+
+ return hsv;
+} \ No newline at end of file
diff --git a/keyboards/handwired/ortho60/hsv2rgb.h b/keyboards/handwired/ortho60/hsv2rgb.h
new file mode 100644
index 000000000..99566c32c
--- /dev/null
+++ b/keyboards/handwired/ortho60/hsv2rgb.h
@@ -0,0 +1,23 @@
+/* hsv2rgb.h
+ * Convert Hue Saturation Value to Red Green Blue
+ *
+ * Programme de convertion d'une information HSV en RGB
+ */
+#ifndef HSV2RGB_H
+#define HSV2RGB_H
+
+typedef struct {
+ unsigned char h;
+ unsigned char s;
+ unsigned char v;
+} hsv_color;
+
+typedef struct {
+ unsigned char r;
+ unsigned char g;
+ unsigned char b;
+} rgb_color;
+
+rgb_color hsv2rgb(hsv_color hsv);
+
+#endif \ No newline at end of file
diff --git a/keyboards/handwired/ortho60/info.json b/keyboards/handwired/ortho60/info.json
new file mode 100644
index 000000000..b6e485441
--- /dev/null
+++ b/keyboards/handwired/ortho60/info.json
@@ -0,0 +1,73 @@
+{
+ "keyboard_name": "Ortho60",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 12,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_ortho_5x12": {
+ "layout": [
+ {"label":"`", "x":0, "y":0},
+ {"label":"1", "x":1, "y":0},
+ {"label":"2", "x":2, "y":0},
+ {"label":"3", "x":3, "y":0},
+ {"label":"4", "x":4, "y":0},
+ {"label":"5", "x":5, "y":0},
+ {"label":"6", "x":6, "y":0},
+ {"label":"7", "x":7, "y":0},
+ {"label":"8", "x":8, "y":0},
+ {"label":"9", "x":9, "y":0},
+ {"label":"0", "x":10, "y":0},
+ {"label":"Backspace", "x":11, "y":0},
+ {"label":"Tab", "x":0, "y":1},
+ {"label":"Q", "x":1, "y":1},
+ {"label":"W", "x":2, "y":1},
+ {"label":"E", "x":3, "y":1},
+ {"label":"R", "x":4, "y":1},
+ {"label":"T", "x":5, "y":1},
+ {"label":"Y", "x":6, "y":1},
+ {"label":"U", "x":7, "y":1},
+ {"label":"I", "x":8, "y":1},
+ {"label":"O", "x":9, "y":1},
+ {"label":"P", "x":10, "y":1},
+ {"label":"Delete", "x":11, "y":1},
+ {"label":"Esc", "x":0, "y":2},
+ {"label":"A", "x":1, "y":2},
+ {"label":"S", "x":2, "y":2},
+ {"label":"D", "x":3, "y":2},
+ {"label":"F", "x":4, "y":2},
+ {"label":"G", "x":5, "y":2},
+ {"label":"H", "x":6, "y":2},
+ {"label":"J", "x":7, "y":2},
+ {"label":"K", "x":8, "y":2},
+ {"label":"L", "x":9, "y":2},
+ {"label":";", "x":10, "y":2},
+ {"label":"'", "x":11, "y":2},
+ {"label":"Shift", "x":0, "y":3},
+ {"label":"Z", "x":1, "y":3},
+ {"label":"X", "x":2, "y":3},
+ {"label":"C", "x":3, "y":3},
+ {"label":"V", "x":4, "y":3},
+ {"label":"B", "x":5, "y":3},
+ {"label":"N", "x":6, "y":3},
+ {"label":"M", "x":7, "y":3},
+ {"label":",", "x":8, "y":3},
+ {"label":".", "x":9, "y":3},
+ {"label":"/", "x":10, "y":3},
+ {"label":"Enter", "x":11, "y":3},
+ {"label":"Fn", "x":0, "y":4},
+ {"label":"Ctrl", "x":1, "y":4},
+ {"label":"Alt", "x":2, "y":4},
+ {"label":"Meta", "x":3, "y":4},
+ {"label":"Lower", "x":4, "y":4},
+ {"label":"Space", "x":5, "y":4},
+ {"label":"Space", "x":6, "y":4},
+ {"label":"Raise", "x":7, "y":4},
+ {"label":"Left", "x":8, "y":4},
+ {"label":"Down", "x":9, "y":4},
+ {"label":"Right", "x":10, "y":4},
+ {"label":"up", "x":11, "y":4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/ortho60/keymaps/default/keymap.c b/keyboards/handwired/ortho60/keymaps/default/keymap.c
new file mode 100644
index 000000000..8617b6341
--- /dev/null
+++ b/keyboards/handwired/ortho60/keymaps/default/keymap.c
@@ -0,0 +1,98 @@
+/*
+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 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
+// entirely and just use numbers.
+#define _BASE 0
+#define _RAISE 1
+#define _LOWER 2
+
+enum custom_keycodes {
+ QWERTY = SAFE_RANGE,
+ LOWER,
+ RAISE
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab | Q | W | E | R | T | Y | U | I | O | P | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | S | D | F | G | H | J | K | L | ; | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | N | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt | GUI |Lower | Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_BASE] = LAYOUT_ortho_5x12( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, \
+ KC_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_ENT, \
+ BL_TOGG, KC_LCTL, KC_LALT, KC_LGUI, LOWER, KC_SPC, KC_SPC, RAISE, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT \
+),
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | ~ | ! | @ | # | $ | % | ^ | & | * | ( | ) | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | _ | + | { | } | | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO ~ |ISO | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = LAYOUT_ortho_5x12( \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC, \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_HOME, KC_END, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | F6 | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | F12 |ISO # |ISO / | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = LAYOUT_ortho_5x12( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+)
+};
diff --git a/keyboards/handwired/ortho60/ld/MKL26Z64.ld b/keyboards/handwired/ortho60/ld/MKL26Z64.ld
new file mode 100644
index 000000000..c4ca8b874
--- /dev/null
+++ b/keyboards/handwired/ortho60/ld/MKL26Z64.ld
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2013-2016 Fabio Utzig, http://fabioutzig.com
+ * (C) 2016 flabbergast <s3+flabbergast@sdfeu.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * KL26Z64 memory setup.
+ */
+MEMORY
+{
+ flash0 : org = 0x00000000, len = 0x100
+ flash1 : org = 0x00000400, len = 0x10
+ flash2 : org = 0x00000410, len = 62k - 0x410
+ flash3 : org = 0x0000F800, len = 2k
+ flash4 : org = 0x00000000, len = 0
+ flash5 : org = 0x00000000, len = 0
+ flash6 : org = 0x00000000, len = 0
+ flash7 : org = 0x00000000, len = 0
+ ram0 : org = 0x1FFFF800, len = 8k
+ 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
+}
+
+/* Flash region for the configuration bytes.*/
+SECTIONS
+{
+ .cfmprotect : ALIGN(4) SUBALIGN(4)
+ {
+ KEEP(*(.cfmconfig))
+ } > flash1
+}
+
+/* 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", flash2);
+REGION_ALIAS("XTORS_FLASH_LMA", flash2);
+
+/* Flash region to be used for code text.*/
+REGION_ALIAS("TEXT_FLASH", flash2);
+REGION_ALIAS("TEXT_FLASH_LMA", flash2);
+
+/* Flash region to be used for read only data.*/
+REGION_ALIAS("RODATA_FLASH", flash2);
+REGION_ALIAS("RODATA_FLASH_LMA", flash2);
+
+/* Flash region to be used for various.*/
+REGION_ALIAS("VARIOUS_FLASH", flash2);
+REGION_ALIAS("VARIOUS_FLASH_LMA", flash2);
+
+/* Flash region to be used for RAM(n) initialization data.*/
+REGION_ALIAS("RAM_INIT_FLASH_LMA", flash2);
+
+/* 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", flash2);
+
+/* 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);
+
+__eeprom_workarea_start__ = ORIGIN(flash3);
+__eeprom_workarea_size__ = LENGTH(flash3);
+__eeprom_workarea_end__ = __eeprom_workarea_start__ + __eeprom_workarea_size__;
+
+/* Generic rules inclusion.*/
+INCLUDE rules.ld
diff --git a/keyboards/handwired/ortho60/ld/STM32F103x8_stm32duino_bootloader.ld b/keyboards/handwired/ortho60/ld/STM32F103x8_stm32duino_bootloader.ld
new file mode 100644
index 000000000..d0688ef60
--- /dev/null
+++ b/keyboards/handwired/ortho60/ld/STM32F103x8_stm32duino_bootloader.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.
+*/
+
+/*
+ * ST32F103xB memory setup for use with the maplemini bootloader.
+ * You will have to
+ * #define CORTEX_VTOR_INIT 0x5000
+ * in your projects chconf.h
+ */
+MEMORY
+{
+ flash0 : org = 0x08002000, len = 64k - 0x2000
+ 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 = 20k
+ 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/handwired/ortho60/led.c b/keyboards/handwired/ortho60/led.c
new file mode 100644
index 000000000..f15baed16
--- /dev/null
+++ b/keyboards/handwired/ortho60/led.c
@@ -0,0 +1,51 @@
+/*
+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/>.
+*/
+
+#include "hal.h"
+#include "backlight.h"
+#include "led.h"
+#include "printf.h"
+
+void backlight_init_ports(void) {
+ printf("backlight_init_ports()\n");
+ #ifdef BACKLIGHT_ENABLE
+ palSetPadMode(GPIOA, 8, PAL_MODE_OUTPUT_PUSHPULL);
+ palSetPad(GPIOA, 8);
+ #endif
+}
+
+void backlight_set(uint8_t level) {
+ printf("backlight_set(%d)\n", level);
+ #ifdef BACKLIGHT_ENABLE
+ if (level == 0) {
+ // Turn backlight off
+ palSetPad(GPIOA, 8);
+ } else {
+ // Turn backlight on
+ palClearPad(GPIOA, 8);
+ }
+ #endif
+}
+
+void led_set(uint8_t usb_led)
+{
+ if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
+ palClearPad(GPIOC, 13);
+ } else {
+ palSetPad(GPIOC, 13);
+ }
+}
diff --git a/keyboards/handwired/ortho60/mcuconf.h b/keyboards/handwired/ortho60/mcuconf.h
new file mode 100644
index 000000000..9945e7408
--- /dev/null
+++ b/keyboards/handwired/ortho60/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 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 TRUE
+#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/handwired/ortho60/ortho60.c b/keyboards/handwired/ortho60/ortho60.c
new file mode 100644
index 000000000..32db007b6
--- /dev/null
+++ b/keyboards/handwired/ortho60/ortho60.c
@@ -0,0 +1,32 @@
+
+#include "ortho60.h"
+
+#include "ch.h"
+#include "hal.h"
+
+#include "underglow.h"
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+
+/* generic STM32F103C8T6 board */
+#ifdef BOARD_GENERIC_STM32_F103
+#define LED_ON() do { palClearPad(GPIOC, 13) ;} while (0)
+#define LED_OFF() do { palSetPad(GPIOC, 13); } while (0)
+#define LED_TGL() do { palTogglePad(GPIOC, 13); } while (0)
+#endif
+
+void matrix_init_kb(void){
+ /* MOSI pin*/
+ palSetPadMode(GPIOB, 15, PAL_MODE_STM32_ALTERNATE_PUSHPULL);
+
+ LED_ON();
+ palSetPad(GPIOA, 8);
+ wait_ms(500);
+ palClearPad(GPIOA, 8);
+ LED_OFF();
+
+ leds_init();
+
+
+}
diff --git a/keyboards/handwired/ortho60/ortho60.h b/keyboards/handwired/ortho60/ortho60.h
new file mode 100644
index 000000000..0f3ae127a
--- /dev/null
+++ b/keyboards/handwired/ortho60/ortho60.h
@@ -0,0 +1,33 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_1x2uC( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \
+ k40, k41, k42, k43, k44, k45 , k47, k48, k49, k4a, k4b \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b }, \
+ { k40, k41, k42, k43, k44, k45, KC_NO, k47, k48, k49, k4a, k4b }, \
+}
+
+#define LAYOUT_ortho_5x12( \
+ k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
+ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, \
+ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, \
+ k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, \
+ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b \
+) \
+{ \
+ { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b }, \
+ { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b }, \
+ { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b }, \
+ { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b }, \
+ { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b }, \
+}
diff --git a/keyboards/handwired/ortho60/readme.md b/keyboards/handwired/ortho60/readme.md
new file mode 100644
index 000000000..8db1b7df7
--- /dev/null
+++ b/keyboards/handwired/ortho60/readme.md
@@ -0,0 +1,3 @@
+# Ortho 60
+
+Blue Pill STM32F103C8T6 based 12x5 Ortholinear Board
diff --git a/keyboards/handwired/ortho60/rules.mk b/keyboards/handwired/ortho60/rules.mk
new file mode 100644
index 000000000..3f4574473
--- /dev/null
+++ b/keyboards/handwired/ortho60/rules.mk
@@ -0,0 +1,56 @@
+# project specific files
+SRC = led.c \
+ underglow.c \
+ hsv2rgb.c
+
+# GENERIC STM32F103C8T6 board - stm32duino bootloader
+OPT_DEFS = -DCORTEX_VTOR_INIT=0x2000
+MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
+BOARD = GENERIC_STM32_F103
+
+# OPT_DEFS =
+# MCU_LDSCRIPT = STM32F103x8
+# BOARD = GENERIC_STM32_F103
+
+## chip/board settings
+# the next two should match the directories in
+# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+MCU_FAMILY = STM32
+MCU_SERIES = STM32F1xx
+# linker script to use
+# it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
+# or <this_dir>/ld/
+# startup code to use
+# is should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
+MCU_STARTUP = stm32f1xx
+# it should exist either in <chibios>/os/hal/boards/
+# or <this_dir>/boards
+# Cortex version
+# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
+MCU = cortex-m3
+# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+ARMV = 7
+# If you want to be able to jump to bootloader from firmware on STM32 MCUs,
+# set the correct BOOTLOADER_ADDRESS. Either set it here, or define it in
+# ./bootloader_defs.h or in ./boards/<FOO>/bootloader_defs.h (if you have
+# a custom board definition that you plan to reuse).
+# If you're not setting it here, leave it commented out.
+# It is chip dependent, the correct number can be looked up here (page 175):
+# http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
+# This also requires a patch to chibios:
+# <tmk_dir>/tmk_core/tool/chibios/ch-bootloader-jump.patch
+#STM32_BOOTLOADER_ADDRESS = 0x1FFFC800
+
+
+#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = yes
+
+LAYOUTS = ortho_5x12
+
+DEFAULT_FOLDER = handwired/ortho60
diff --git a/keyboards/handwired/ortho60/underglow.c b/keyboards/handwired/ortho60/underglow.c
new file mode 100644
index 000000000..1383af189
--- /dev/null
+++ b/keyboards/handwired/ortho60/underglow.c
@@ -0,0 +1,157 @@
+#include "ch.h"
+#include "hal.h"
+
+#include "hsv2rgb.h"
+#include "underglow.h"
+
+#define BYTES_FOR_LED_BYTE 4
+#define NB_COLORS 3
+#define BYTES_FOR_LED BYTES_FOR_LED_BYTE*NB_COLORS
+#define DATA_SIZE BYTES_FOR_LED*NB_LEDS
+#define RESET_SIZE 200
+#define PREAMBLE_SIZE 4
+
+// Define the spi your LEDs are plugged to here
+#define LEDS_SPI SPID2
+// Define the number of LEDs you wish to control in your LED strip
+#define NB_LEDS 8
+
+#define LED_SPIRAL 1
+
+static uint8_t txbuf[PREAMBLE_SIZE + DATA_SIZE + RESET_SIZE];
+static uint8_t get_protocol_eq(uint8_t data, int pos);
+
+/*
+ * This lib is meant to be used asynchronously, thus the colors contained in
+ * the txbuf will be sent in loop, so that the colors are always the ones you
+ * put in the table (the user thus have less to worry about)
+ *
+ * Since the data are sent via DMA, and the call to spiSend is a blocking one,
+ * the processor ressources are not used to much, if you see your program being
+ * too slow, simply add a:
+ * chThdSleepMilliseconds(x);
+ * after the spiSend, where you increment x untill you are satisfied with your
+ * program speed, another trick may be to lower this thread priority : your call
+ */
+static THD_WORKING_AREA(LEDS_THREAD_WA, 128);
+static THD_FUNCTION(ledsThread, arg) {
+ (void) arg;
+ while(1){
+ spiSend(&LEDS_SPI, PREAMBLE_SIZE + DATA_SIZE + RESET_SIZE, txbuf);
+ }
+}
+
+#if LED_SPIRAL
+/*
+ * 'Led spiral' is a simple demo in which we put all the leds to the same
+ * color, where this color does all the hsv circle in loop.
+ * If you want to launch the thread that will chage the led colors to the
+ * appropriate value, simply set LED_SPIRAL to 1.
+ */
+static THD_WORKING_AREA(HSVTRANS_WA, 128);
+static THD_FUNCTION(hsv_transThread, arg){
+ (void) arg;
+ hsv_color color = {0, 255, 127};
+ while(1){
+ color.h += 1;
+ color.h %= 256;
+ set_leds_color_hsv(color);
+ chThdSleepMilliseconds(50);
+ }
+}
+#endif
+
+static const SPIConfig spicfg = {
+ NULL,
+ GPIOB,
+ 15,
+ SPI_CR1_BR_1|SPI_CR1_BR_0 // baudrate : fpclk / 8 => 1tick is 0.32us
+};
+
+/*
+ * Function used to initialize the driver.
+ *
+ * Starts by shutting off all the LEDs.
+ * Then gets access on the LED_SPI driver.
+ * May eventually launch an animation on the LEDs (e.g. a thread setting the
+ * txbuff values)
+ */
+void leds_init(void){
+ for(int i = 0; i < RESET_SIZE; i++)
+ txbuf[DATA_SIZE+i] = 0x00;
+ for (int i=0; i<PREAMBLE_SIZE; i++)
+ txbuf[i] = 0x00;
+ spiAcquireBus(&LEDS_SPI); /* Acquire ownership of the bus. */
+ spiStart(&LEDS_SPI, &spicfg); /* Setup transfer parameters. */
+ spiSelect(&LEDS_SPI); /* Slave Select assertion. */
+ chThdCreateStatic(LEDS_THREAD_WA, sizeof(LEDS_THREAD_WA),NORMALPRIO, ledsThread, NULL);
+#if LED_SPIRAL
+ chThdCreateStatic(HSVTRANS_WA, sizeof(HSVTRANS_WA),
+ NORMALPRIO, hsv_transThread, NULL);
+#endif
+}
+
+/*
+ * As the trick here is to use the SPI to send a huge pattern of 0 and 1 to
+ * the ws2812b protocol, we use this helper function to translate bytes into
+ * 0s and 1s for the LED (with the appropriate timing).
+ */
+static uint8_t get_protocol_eq(uint8_t data, int pos){
+ uint8_t eq = 0;
+ if (data & (1 << (2*(3-pos))))
+ eq = 0b1110;
+ else
+ eq = 0b1000;
+ if (data & (2 << (2*(3-pos))))
+ eq += 0b11100000;
+ else
+ eq += 0b10000000;
+ return eq;
+}
+
+/*
+ * If you want to set a LED's color in the HSV color space, simply call this
+ * function with a hsv_color containing the desired color and the index of the
+ * led on the LED strip (starting from 0, the first one being the closest the
+ * first plugged to the board)
+ *
+ * Only set the color of the LEDs through the functions given by this API
+ * (unless you really know what you are doing)
+ */
+void set_led_color_hsv(hsv_color color, int pos){
+ set_led_color_rgb(hsv2rgb(color), pos);
+}
+
+/*
+ * If you want to set a LED's color in the RGB color space, simply call this
+ * function with a hsv_color containing the desired color and the index of the
+ * led on the LED strip (starting from 0, the first one being the closest the
+ * first plugged to the board)
+ *
+ * Only set the color of the LEDs through the functions given by this API
+ * (unless you really know what you are doing)
+ */
+void set_led_color_rgb(rgb_color color, int pos){
+ for(int j = 0; j < 4; j++)
+ txbuf[PREAMBLE_SIZE + BYTES_FOR_LED*pos + j] = get_protocol_eq(color.g, j);
+ for(int j = 0; j < 4; j++)
+ txbuf[PREAMBLE_SIZE + BYTES_FOR_LED*pos + BYTES_FOR_LED_BYTE+j] = get_protocol_eq(color.r, j);
+ for(int j = 0; j < 4; j++)
+ txbuf[PREAMBLE_SIZE + BYTES_FOR_LED*pos + BYTES_FOR_LED_BYTE*2+j] = get_protocol_eq(color.b, j);
+}
+
+/*
+ * Same as the two above, but sets all the LEDs in the LED strip (HSV)
+ */
+void set_leds_color_hsv(hsv_color color){
+ for(int i = 0; i < NB_LEDS; i++)
+ set_led_color_hsv(color, i);
+}
+
+/*
+ * Same as the two above, but sets all the LEDs in the LED strip (RGB)
+ */
+void set_leds_color_rgb(rgb_color color){
+ for(int i = 0; i < NB_LEDS; i++)
+ set_led_color_rgb(color, i);
+} \ No newline at end of file
diff --git a/keyboards/handwired/ortho60/underglow.h b/keyboards/handwired/ortho60/underglow.h
new file mode 100644
index 000000000..ff1195279
--- /dev/null
+++ b/keyboards/handwired/ortho60/underglow.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#include "hsv2rgb.h"
+
+void set_leds_color_hsv(hsv_color color);
+void set_leds_color_rgb(rgb_color color);
+void set_led_color_hsv(hsv_color color, int pos);
+void set_led_color_rgb(rgb_color color, int pos);
+
+void leds_init(void);
diff --git a/keyboards/handwired/pilcrow/info.json b/keyboards/handwired/pilcrow/info.json
new file mode 100644
index 000000000..824e2abbc
--- /dev/null
+++ b/keyboards/handwired/pilcrow/info.json
@@ -0,0 +1,53 @@
+{
+ "keyboard_name": "pilcrow",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 10,
+ "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":"Y", "x":5, "y":0},
+ {"label":"U", "x":6, "y":0},
+ {"label":"I", "x":7, "y":0},
+ {"label":"O", "x":8, "y":0},
+ {"label":"P", "x":9, "y":0},
+ {"label":"A", "x":0, "y":1},
+ {"label":"S", "x":1, "y":1},
+ {"label":"D", "x":2, "y":1},
+ {"label":"F", "x":3, "y":1},
+ {"label":"G", "x":4, "y":1},
+ {"label":"H", "x":5, "y":1},
+ {"label":"J", "x":6, "y":1},
+ {"label":"K", "x":7, "y":1},
+ {"label":"L", "x":8, "y":1},
+ {"label":";", "x":9, "y":1},
+ {"label":"Z", "x":0, "y":2},
+ {"label":"X", "x":1, "y":2},
+ {"label":"C", "x":2, "y":2},
+ {"label":"V", "x":3, "y":2},
+ {"label":"B", "x":4, "y":2},
+ {"label":"N", "x":5, "y":2},
+ {"label":"M", "x":6, "y":2},
+ {"label":",", "x":7, "y":2},
+ {"label":".", "x":8, "y":2},
+ {"label":"/", "x":9, "y":2},
+ {"label":"Ctrl", "x":0, "y":3},
+ {"label":"Alt", "x":1, "y":3},
+ {"label":"GUI", "x":2, "y":3},
+ {"label":"MO(1)", "x":3, "y":3},
+ {"label":"Space", "x":4, "y":3},
+ {"label":"Shift / Space", "x":5, "y":3},
+ {"label":"MO(2)", "x":6, "y":3},
+ {"label":"MO(3)", "x":7, "y":3},
+ {"label":"Delete", "x":8, "y":3},
+ {"label":"Esc", "x":9, "y":3}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/pilcrow/keymaps/default/config.h b/keyboards/handwired/pilcrow/keymaps/default/config.h
index df06a2620..271f48d00 100644
--- a/keyboards/handwired/pilcrow/keymaps/default/config.h
+++ b/keyboards/handwired/pilcrow/keymaps/default/config.h
@@ -1,8 +1,3 @@
-#ifndef CONFIG_USER_H
-#define CONFIG_USER_H
-
-#include "../../config.h"
+#pragma once
// place overrides here
-
-#endif \ No newline at end of file
diff --git a/keyboards/handwired/pilcrow/keymaps/default/keymap.c b/keyboards/handwired/pilcrow/keymaps/default/keymap.c
index e382e4c6a..617ff4f6c 100644
--- a/keyboards/handwired/pilcrow/keymaps/default/keymap.c
+++ b/keyboards/handwired/pilcrow/keymaps/default/keymap.c
@@ -1,76 +1,58 @@
-#include "pilcrow.h"
-#define _______ KC_TRNS
-const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[0] = KEYMAP( \
- KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \
- KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \
- KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \
- KC_LCTL, KC_LALT, KC_LGUI, MO(1), KC_SPC, MT(MOD_LSFT, KC_SPC), MO(2), MO(3), KC_DEL, KC_ESC \
-),
-
-/* Colemak
- * ,-----------------------------------------------------------------------------------.
- * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Esc | A | R | S | T | D | H | N | E | I | O | " |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
- * `-----------------------------------------------------------------------------------'
- */
-[1] = KEYMAP( \
- 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_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_PIPE, S(KC_QUOT), \
- _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, KC_MNXT, KC_VOLD, KC_GRV \
-),
-[2] = KEYMAP( \
- KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \
- KC_TAB, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT,KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, \
- OSM(MOD_LSFT), KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_BSLS, KC_QUOT, \
- _______, _______, _______, _______, KC_ENT, KC_ENT, _______, KC_MNXT, KC_VOLD, KC_VOLU \
-),
+#include QMK_KEYBOARD_H
-/* Adjust (Lower + Raise)
- * ,-----------------------------------------------------------------------------------.
- * | | Reset| | | | | | | | | | Del |
- * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
- * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | | | | | | | | | | | | |
- * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | | | | | | | | | | | |
- * `-----------------------------------------------------------------------------------'
- */
-[3] = KEYMAP( \
- RESET, KC_UP, _______, _______, _______, _______, _______, KC_MS_WH_DOWN, KC_MS_U, KC_MS_WH_UP, \
- KC_LEFT, KC_DOWN, KC_RIGHT, AU_ON, AU_OFF, AG_NORM, AG_SWAP, KC_MS_L,KC_MS_D, KC_MS_R, \
- RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, \
- _______, _______, _______, _______, KC_MS_BTN1, KC_MS_BTN2, _______, _______, _______, _______ \
-)
-};
+#define SFT_SPC MT(MOD_LSFT, KC_SPC)
-const uint16_t PROGMEM fn_actions[] = {
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT( \
+ KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, \
+ KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, \
+ KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, \
+ KC_LCTL, KC_LALT, KC_LGUI, MO(1), KC_SPC, SFT_SPC, MO(2), MO(3), KC_DEL, KC_ESC \
+ ),
-};
+ /* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * | Tab | Q | W | F | P | G | J | L | U | Y | ; | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc | A | R | S | T | D | H | N | E | I | O | " |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | K | M | , | . | / |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |Adjust| Ctrl | Alt | GUI |Lower |Space |Space |Raise | Left | Down | Up |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [1] = LAYOUT( \
+ 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_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, S(KC_NUHS), S(KC_NUBS), KC_PIPE, S(KC_QUOT), \
+ _______, _______, _______, _______, KC_BSPC, KC_BSPC, _______, KC_MNXT, KC_VOLD, KC_GRV \
+ ),
+ [2] = LAYOUT( \
+ KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, \
+ KC_TAB, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, \
+ OSM(MOD_LSFT), KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_BSLS, KC_QUOT, \
+ _______, _______, _______, _______, KC_ENT, KC_ENT, _______, KC_MNXT, KC_VOLD, KC_VOLU \
+ ),
-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;
+ /* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * | | Reset| | | | | | | | | | Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | | | |Aud on|Audoff|AGnorm|AGswap|Qwerty|Colemk|Dvorak| | |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | | | | | | | | | | | | |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | | | | | | | | | | | |
+ * `-----------------------------------------------------------------------------------'
+ */
+ [3] = LAYOUT( \
+ RESET, KC_UP, _______, _______, _______, _______, _______, KC_WH_D, KC_MS_U, KC_WH_U, \
+ KC_LEFT, KC_DOWN, KC_RGHT, AU_ON, AU_OFF, AG_NORM, AG_SWAP, KC_MS_L, KC_MS_D, KC_MS_R, \
+ RGB_TOG, RGB_MOD, RGB_HUI, RGB_HUD, RGB_SAI, RGB_SAD, RGB_VAI, RGB_VAD, _______, _______, \
+ _______, _______, _______, _______, KC_BTN1, KC_BTN2, _______, _______, _______, _______ \
+ )
};
-
void matrix_init_user(void) {
}
diff --git a/keyboards/handwired/pilcrow/keymaps/default/rules.mk b/keyboards/handwired/pilcrow/keymaps/default/rules.mk
index b3c01678f..3955a3ff4 100644
--- a/keyboards/handwired/pilcrow/keymaps/default/rules.mk
+++ b/keyboards/handwired/pilcrow/keymaps/default/rules.mk
@@ -13,5 +13,5 @@ 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 this with audio at the same time.
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
diff --git a/keyboards/handwired/pilcrow/pilcrow.h b/keyboards/handwired/pilcrow/pilcrow.h
index 7138ccb3f..37d2914f2 100644
--- a/keyboards/handwired/pilcrow/pilcrow.h
+++ b/keyboards/handwired/pilcrow/pilcrow.h
@@ -7,7 +7,7 @@
// The following is an example using the Planck MIT layout
// The first section contains all of the arguements
// The second converts the arguments into a two-dimensional array
-#define KEYMAP( \
+#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, \
diff --git a/keyboards/handwired/pilcrow/readme.md b/keyboards/handwired/pilcrow/readme.md
index 7a7f6d2af..79f22518e 100644
--- a/keyboards/handwired/pilcrow/readme.md
+++ b/keyboards/handwired/pilcrow/readme.md
@@ -1,28 +1,14 @@
-pilcrow keyboard firmware
-======================
+# pilcrow
-## Quantum MK Firmware
+![pilcrow](https://i.imgur.com/KQdn2kg.jpg)
-For the full Quantum feature list, see [the parent readme](/).
+A 4x10 ortholinear keyboard powered by a Teensy.
-## Building
+Keyboard Maintainer: [The QMK Community](https://github.com/qmk)
+Hardware Supported: Teensy-powered pilcrow
-Download or clone the whole firmware and navigate to the keyboards/pilcrow folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.
+Make example for this keyboard (after setting up your build environment):
-Depending on which keymap you would like to use, you will have to compile slightly differently.
+ make handwired/pilcrow:default
-### Default
-
-To build with the default keymap, simply run `make default`.
-
-### Other Keymaps
-
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.
-
-To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
-
-```
-$ make [default|jack|<name>]
-```
-
-Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
+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/practice60/boards/GENERIC_STM32_F103/board.c b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.c
new file mode 100644
index 000000000..8c5a87f35
--- /dev/null
+++ b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.c
@@ -0,0 +1,56 @@
+/*
+ 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.
+*/
+
+#include "hal.h"
+
+// Value to place in RTC backup register 10 for persistent bootloader mode
+#define RTC_BOOTLOADER_FLAG 0x424C
+
+/**
+ * @brief PAL setup.
+ * @details Digital I/O ports static configuration as defined in @p board.h.
+ * This variable is used by the HAL when initializing the PAL driver.
+ */
+#if HAL_USE_PAL || defined(__DOXYGEN__)
+const PALConfig pal_default_config =
+{
+ {VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH},
+ {VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH},
+ {VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH},
+ {VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH},
+ {VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH},
+};
+#endif
+
+/*
+ * Early initialization code.
+ * This initialization must be performed just after stack setup and before
+ * any other initialization.
+ */
+void __early_init(void) {
+
+ stm32_clock_init();
+}
+
+/*
+ * Board-specific initialization code.
+ */
+void boardInit(void) {
+ //JTAG-DP Disabled and SW-DP Enabled
+ AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;
+ //Set backup register DR10 to enter bootloader on reset
+ BKP->DR10 = RTC_BOOTLOADER_FLAG;
+}
diff --git a/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.h b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.h
new file mode 100644
index 000000000..9427adabf
--- /dev/null
+++ b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.h
@@ -0,0 +1,166 @@
+/*
+ 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 _BOARD_H_
+#define _BOARD_H_
+
+/*
+ * Setup for a Generic STM32F103 board.
+ */
+
+/*
+ * Board identifier.
+ */
+#define BOARD_GENERIC_STM32_F103
+#define BOARD_NAME "Generic STM32F103x board"
+
+/*
+ * Board frequencies.
+ */
+#define STM32_LSECLK 32768
+#define STM32_HSECLK 8000000
+
+/*
+ * MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h.
+ */
+#define STM32F103xB
+
+/*
+ * IO pins assignments
+ */
+
+/* on-board */
+
+#define GPIOA_LED 8
+#define GPIOD_OSC_IN 0
+#define GPIOD_OSC_OUT 1
+
+/* In case your board has a "USB enable" hardware
+ controlled by a pin, define it here. (It could be just
+ a 1.5k resistor connected to D+ line.)
+*/
+/*
+#define GPIOB_USB_DISC 10
+*/
+
+/*
+ * I/O ports initial setup, this configuration is established soon after reset
+ * in the initialization code.
+ *
+ * The digits have the following meaning:
+ * 0 - Analog input.
+ * 1 - Push Pull output 10MHz.
+ * 2 - Push Pull output 2MHz.
+ * 3 - Push Pull output 50MHz.
+ * 4 - Digital input.
+ * 5 - Open Drain output 10MHz.
+ * 6 - Open Drain output 2MHz.
+ * 7 - Open Drain output 50MHz.
+ * 8 - Digital input with PullUp or PullDown resistor depending on ODR.
+ * 9 - Alternate Push Pull output 10MHz.
+ * A - Alternate Push Pull output 2MHz.
+ * B - Alternate Push Pull output 50MHz.
+ * C - Reserved.
+ * D - Alternate Open Drain output 10MHz.
+ * E - Alternate Open Drain output 2MHz.
+ * F - Alternate Open Drain output 50MHz.
+ * Please refer to the STM32 Reference Manual for details.
+ */
+
+/*
+ * Port A setup.
+ * Everything input with pull-up except:
+ * PA2 - Alternate output (USART2 TX).
+ * PA3 - Normal input (USART2 RX).
+ * PA9 - Alternate output (USART1 TX).
+ * PA10 - Normal input (USART1 RX).
+ */
+#define VAL_GPIOACRL 0x88884B88 /* PA7...PA0 */
+#define VAL_GPIOACRH 0x888884B8 /* PA15...PA8 */
+#define VAL_GPIOAODR 0xFFFFFFFF
+
+/*
+ * Port B setup.
+ * Everything input with pull-up except:
+ * PB10 - Push Pull output (USB switch).
+ */
+#define VAL_GPIOBCRL 0x88888888 /* PB7...PB0 */
+#define VAL_GPIOBCRH 0x88888388 /* PB15...PB8 */
+#define VAL_GPIOBODR 0xFFFFFFFF
+
+/*
+ * Port C setup.
+ * Everything input with pull-up except:
+ * PC13 - Push Pull output (LED).
+ */
+#define VAL_GPIOCCRL 0x88888888 /* PC7...PC0 */
+#define VAL_GPIOCCRH 0x88388888 /* PC15...PC8 */
+#define VAL_GPIOCODR 0xFFFFFFFF
+
+/*
+ * Port D setup.
+ * Everything input with pull-up except:
+ * PD0 - Normal input (XTAL).
+ * PD1 - Normal input (XTAL).
+ */
+#define VAL_GPIODCRL 0x88888844 /* PD7...PD0 */
+#define VAL_GPIODCRH 0x88888888 /* PD15...PD8 */
+#define VAL_GPIODODR 0xFFFFFFFF
+
+/*
+ * Port E setup.
+ * Everything input with pull-up except:
+ */
+#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */
+#define VAL_GPIOECRH 0x88888888 /* PE15...PE8 */
+#define VAL_GPIOEODR 0xFFFFFFFF
+
+/*
+ * USB bus activation macro, required by the USB driver.
+ */
+/* The point is that most of the generic STM32F103* boards
+ have a 1.5k resistor connected on one end to the D+ line
+ and on the other end to some pin. Or even a slightly more
+ complicated "USB enable" circuit, controlled by a pin.
+ That should go here.
+
+ However on some boards (e.g. one that I have), there's no
+ such hardware. In which case it's better to not do anything.
+*/
+/*
+#define usb_lld_connect_bus(usbp) palClearPad(GPIOB, GPIOB_USB_DISC)
+*/
+#define usb_lld_connect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_INPUT);
+
+/*
+ * USB bus de-activation macro, required by the USB driver.
+ */
+/*
+#define usb_lld_disconnect_bus(usbp) palSetPad(GPIOB, GPIOB_USB_DISC)
+*/
+#define usb_lld_disconnect_bus(usbp) palSetPadMode(GPIOA, 12, PAL_MODE_OUTPUT_PUSHPULL); palClearPad(GPIOA, 12);
+
+#if !defined(_FROM_ASM_)
+#ifdef __cplusplus
+extern "C" {
+#endif
+ void boardInit(void);
+#ifdef __cplusplus
+}
+#endif
+#endif /* _FROM_ASM_ */
+
+#endif /* _BOARD_H_ */
diff --git a/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.mk b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.mk
new file mode 100644
index 000000000..6b8b312fd
--- /dev/null
+++ b/keyboards/handwired/practice60/boards/GENERIC_STM32_F103/board.mk
@@ -0,0 +1,5 @@
+# List of all the board related files.
+BOARDSRC = $(BOARD_PATH)/boards/GENERIC_STM32_F103/board.c
+
+# Required include directories
+BOARDINC = $(BOARD_PATH)/boards/GENERIC_STM32_F103
diff --git a/keyboards/handwired/practice60/bootloader_defs.h b/keyboards/handwired/practice60/bootloader_defs.h
new file mode 100644
index 000000000..0f45203cb
--- /dev/null
+++ b/keyboards/handwired/practice60/bootloader_defs.h
@@ -0,0 +1,10 @@
+/* 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 an USB bootloader in ROM (only serial),
+// so setting anything here does not make much sense
+// #define STM32_BOOTLOADER_ADDRESS 0x1FFFC800
diff --git a/keyboards/handwired/practice60/chconf.h b/keyboards/handwired/practice60/chconf.h
new file mode 100644
index 000000000..bbd9b2da6
--- /dev/null
+++ b/keyboards/handwired/practice60/chconf.h
@@ -0,0 +1,524 @@
+/*
+ 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.
+*/
+
+/**
+ * @file 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_
+
+/*===========================================================================*/
+/**
+ * @name System timers settings
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief System time counter resolution.
+ * @note Allowed values are 16 or 32 bits.
+ */
+#define CH_CFG_ST_RESOLUTION 32
+
+/**
+ * @brief System tick frequency.
+ * @details Frequency of the system timer that drives the system ticks. This
+ * setting also defines the system tick time unit.
+ */
+#define CH_CFG_ST_FREQUENCY 100000
+
+/**
+ * @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.
+ */
+#define CH_CFG_ST_TIMEDELTA 0
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @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.
+ */
+#define CH_CFG_TIME_QUANTUM 0
+
+/**
+ * @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.
+ */
+#define CH_CFG_MEMCORE_SIZE 0
+
+/**
+ * @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.
+ */
+#define CH_CFG_NO_IDLE_THREAD FALSE
+
+/* Use __WFI in the idle thread for waiting. Does lower the power
+ * consumption. */
+#define CORTEX_ENABLE_WFI_IDLE TRUE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @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.
+ */
+#define CH_CFG_OPTIMIZE_SPEED TRUE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @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.
+ */
+#define CH_CFG_USE_TM FALSE
+
+/**
+ * @brief Threads registry APIs.
+ * @details If enabled then the registry APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_REGISTRY TRUE
+
+/**
+ * @brief Threads synchronization APIs.
+ * @details If enabled then the @p chThdWait() function is included in
+ * the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_WAITEXIT TRUE
+
+/**
+ * @brief Semaphores APIs.
+ * @details If enabled then the Semaphores APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_SEMAPHORES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_SEMAPHORES_PRIORITY FALSE
+
+/**
+ * @brief Mutexes APIs.
+ * @details If enabled then the mutexes APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_MUTEXES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MUTEXES_RECURSIVE FALSE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_CONDVARS TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
+
+/**
+ * @brief Events Flags APIs.
+ * @details If enabled then the event flags APIs are included in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_EVENTS TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_EVENTS_TIMEOUT TRUE
+
+/**
+ * @brief Synchronous Messages APIs.
+ * @details If enabled then the synchronous messages APIs are included
+ * in the kernel.
+ *
+ * @note The default is @p TRUE.
+ */
+#define CH_CFG_USE_MESSAGES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MESSAGES_PRIORITY FALSE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MAILBOXES TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MEMCORE TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_HEAP TRUE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_MEMPOOLS FALSE
+
+/**
+ * @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.
+ */
+#define CH_CFG_USE_DYNAMIC FALSE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Debug options
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @brief Debug option, kernel statistics.
+ *
+ * @note The default is @p FALSE.
+ */
+#define CH_DBG_STATISTICS FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_SYSTEM_STATE_CHECK FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_ENABLE_CHECKS FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_ENABLE_ASSERTS FALSE
+
+/**
+ * @brief Debug option, trace buffer.
+ * @details If enabled then the trace buffer is activated.
+ *
+ * @note The default is @p CH_DBG_TRACE_MASK_DISABLED.
+ */
+#define CH_DBG_TRACE_MASK CH_DBG_TRACE_MASK_DISABLED
+
+/**
+ * @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.
+ */
+#define CH_DBG_TRACE_BUFFER_SIZE 128
+
+/**
+ * @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.
+ */
+#define CH_DBG_ENABLE_STACK_CHECK FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_FILL_THREADS FALSE
+
+/**
+ * @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.
+ */
+#define CH_DBG_THREADS_PROFILING FALSE
+
+/** @} */
+
+/*===========================================================================*/
+/**
+ * @name Kernel hooks
+ * @{
+ */
+/*===========================================================================*/
+
+/**
+ * @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 chThdInit() API.
+ *
+ * @note It is invoked from within @p chThdInit() 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/practice60/config.h b/keyboards/handwired/practice60/config.h
new file mode 100644
index 000000000..31ddd77d1
--- /dev/null
+++ b/keyboards/handwired/practice60/config.h
@@ -0,0 +1,74 @@
+/*
+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 0x6464
+#define DEVICE_VER 0x0001
+/* in python2: list(u"whatever".encode('utf-16-le')) */
+/* at most 32 characters or the ugly hack in usb_main.c borks */
+#define MANUFACTURER QMK
+#define PRODUCT Practice 60
+#define DESCRIPTION Practice 60
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 14
+
+#define MATRIX_COL_PINS { B11, B10, B1, B0, A7, A6, A5, A4, A3, A2, A1, A0, C15, C14 }
+#define MATRIX_ROW_PINS { B3, B4, B5, B6, B7 }
+#define DIODE_DIRECTION COL2ROW
+
+#define BACKLIGHT_LEVELS 1
+
+/* 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
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
diff --git a/keyboards/handwired/practice60/halconf.h b/keyboards/handwired/practice60/halconf.h
new file mode 100644
index 000000000..5fba285a3
--- /dev/null
+++ b/keyboards/handwired/practice60/halconf.h
@@ -0,0 +1,353 @@
+/*
+ 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.
+*/
+
+/**
+ * @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_
+
+#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 DAC subsystem.
+ */
+#if !defined(HAL_USE_DAC) || defined(__DOXYGEN__)
+#define HAL_USE_DAC FALSE
+#endif
+
+/**
+ * @brief Enables the EXT subsystem.
+ */
+#if !defined(HAL_USE_EXT) || defined(__DOXYGEN__)
+#define HAL_USE_EXT 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 SPI subsystem.
+ */
+#if !defined(HAL_USE_SPI) || defined(__DOXYGEN__)
+#define HAL_USE_SPI TRUE
+#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
+
+/*===========================================================================*/
+/* 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
+
+/*===========================================================================*/
+/* 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 an event sources for incoming packets.
+ */
+#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
+
+/*===========================================================================*/
+/* 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 64 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 64 bytes for both the transmission and receive
+ * buffers.
+ */
+#if !defined(SERIAL_USB_BUFFERS_SIZE) || defined(__DOXYGEN__)
+#define SERIAL_USB_BUFFERS_SIZE 1
+#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 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
+
+/*===========================================================================*/
+/* 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
+
+#endif /* _HALCONF_H_ */
+
+/** @} */
diff --git a/keyboards/handwired/practice60/hsv2rgb.c b/keyboards/handwired/practice60/hsv2rgb.c
new file mode 100644
index 000000000..adb7af8fa
--- /dev/null
+++ b/keyboards/handwired/practice60/hsv2rgb.c
@@ -0,0 +1,80 @@
+/* hsv2rgb.c
+ * Integer only conversion functions between HSV and RGB
+ */
+
+#include "hsv2rgb.h"
+
+// TODO fix these buggy macros
+#define max(x,y) ((x>y) ? x:y)
+#define min(x,y) ((x>y) ? y:x)
+#define min3(x,y,z) (min(min(x,y),z))
+#define max3(x,y,z) (max(max(x,y),z))
+
+
+rgb_color hsv2rgb(hsv_color hsv)
+{
+ // From : http://qscribble.blogspot.fr/2008/06/integer-conversion-from-hsl-to-rgb.html
+ int h = hsv.h;
+ int s = hsv.s;
+ int v = hsv.v;
+ rgb_color rgb = {0, 0, 0};
+
+ if (v == 0)
+ return rgb;
+
+ // sextant = 0 .. 5
+ int sextant = (h*6)/256;
+ // f = 0 .. 42
+ int f = h - (sextant*256)/6;
+
+ int p = (v * (256 - s))/256;
+ int q = (v * (256*43 - s*f))/(256*43);
+ int t = (v * (256*43 - s*(43-f)))/(256*43);
+
+ // Corrige les erreurs dues aux arrondis
+ p = max(min(p, 255), 0);
+ q = max(min(q, 255), 0);
+ t = max(min(t, 255), 0);
+
+ switch(sextant){
+ case 0: rgb.r = v; rgb.g = t; rgb.b = p; break;
+ case 1: rgb.r = q; rgb.g = v; rgb.b = p; break;
+ case 2: rgb.r = p; rgb.g = v; rgb.b = t; break;
+ case 3: rgb.r = p; rgb.g = q; rgb.b = v; break;
+ case 4: rgb.r = t; rgb.g = p; rgb.b = v; break;
+ default:rgb.r = v; rgb.g = p; rgb.b = q; break;
+ }
+ return rgb;
+}
+
+
+hsv_color rgb2hsv(rgb_color rgb)
+{
+ // From : http://www.ruinelli.ch/rgb-to-hsv
+ hsv_color hsv = {0, 0, 0};
+ int min, max, delta;
+
+ min = min3(rgb.r, rgb.g, rgb.b);
+ max = max3(rgb.r, rgb.g, rgb.b);
+
+ if(max==0) {
+ hsv.h = 0;
+ hsv.s = 0;
+ hsv.v = 0;
+ return hsv;
+ }
+
+ hsv.v = max;
+ delta = max - min;
+
+ hsv.s = (delta)*255 / max;
+
+ if(rgb.r == max)
+ hsv.h = (rgb.g - rgb.b)*42/delta; // between yellow & magenta
+ else if(rgb.g == max)
+ hsv.h = 120 + (rgb.b - rgb.r)*42/delta; // between cyan & yellow
+ else
+ hsv.h = 240 + (rgb.r - rgb.g)*42/delta; // between magenta & cyan
+
+ return hsv;
+} \ No newline at end of file
diff --git a/keyboards/handwired/practice60/hsv2rgb.h b/keyboards/handwired/practice60/hsv2rgb.h
new file mode 100644
index 000000000..99566c32c
--- /dev/null
+++ b/keyboards/handwired/practice60/hsv2rgb.h
@@ -0,0 +1,23 @@
+/* hsv2rgb.h
+ * Convert Hue Saturation Value to Red Green Blue
+ *
+ * Programme de convertion d'une information HSV en RGB
+ */
+#ifndef HSV2RGB_H
+#define HSV2RGB_H
+
+typedef struct {
+ unsigned char h;
+ unsigned char s;
+ unsigned char v;
+} hsv_color;
+
+typedef struct {
+ unsigned char r;
+ unsigned char g;
+ unsigned char b;
+} rgb_color;
+
+rgb_color hsv2rgb(hsv_color hsv);
+
+#endif \ No newline at end of file
diff --git a/keyboards/handwired/practice60/info.json b/keyboards/handwired/practice60/info.json
new file mode 100644
index 000000000..cffbcf492
--- /dev/null
+++ b/keyboards/handwired/practice60/info.json
@@ -0,0 +1,74 @@
+{
+ "keyboard_name": "Practice 60",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 15,
+ "height": 5,
+ "layouts": {
+ "LAYOUT_60_ansi": {
+ "layout": [
+ {"label":"`", "x":0, "y":0},
+ {"label":"1", "x":1, "y":0},
+ {"label":"2", "x":2, "y":0},
+ {"label":"3", "x":3, "y":0},
+ {"label":"4", "x":4, "y":0},
+ {"label":"5", "x":5, "y":0},
+ {"label":"6", "x":6, "y":0},
+ {"label":"7", "x":7, "y":0},
+ {"label":"8", "x":8, "y":0},
+ {"label":"9", "x":9, "y":0},
+ {"label":"0", "x":10, "y":0},
+ {"label":"-", "x":11, "y":0},
+ {"label":"=", "x":12, "y":0},
+ {"label":"Backspace", "x":13, "y":0, "w":2},
+ {"label":"Tab", "x":0, "y":1, "w":1.5},
+ {"label":"Q", "x":1.5, "y":1},
+ {"label":"W", "x":2.5, "y":1},
+ {"label":"E", "x":3.5, "y":1},
+ {"label":"R", "x":4.5, "y":1},
+ {"label":"T", "x":5.5, "y":1},
+ {"label":"Y", "x":6.5, "y":1},
+ {"label":"U", "x":7.5, "y":1},
+ {"label":"I", "x":8.5, "y":1},
+ {"label":"O", "x":9.5, "y":1},
+ {"label":"P", "x":10.5, "y":1},
+ {"label":"[", "x":11.5, "y":1},
+ {"label":"]", "x":12.5, "y":1},
+ {"label":"\\", "x":13.5, "y":1, "w":1.5},
+ {"label":"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":"GUI", "x":1.25, "y":4, "w":1.25},
+ {"label":"Alt", "x":2.5, "y":4, "w":1.25},
+ {"label":"Space", "x":3.75, "y":4, "w":6.25},
+ {"label":"Alt", "x":10, "y":4, "w":1.25},
+ {"label":"GUI", "x":11.25, "y":4, "w":1.25},
+ {"label":"Menu", "x":12.5, "y":4, "w":1.25},
+ {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/practice60/keymaps/default/keymap.c b/keyboards/handwired/practice60/keymaps/default/keymap.c
new file mode 100644
index 000000000..ac6e75509
--- /dev/null
+++ b/keyboards/handwired/practice60/keymaps/default/keymap.c
@@ -0,0 +1,48 @@
+/*
+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 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
+// entirely and just use numbers.
+#define _BASE 0
+#define _FN1 1
+
+enum custom_keycodes {
+ QWERTY = SAFE_RANGE,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_BASE] = LAYOUT_60_ansi(
+ KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, MT(MOD_LSFT, KC_Y), KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, \
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(_FN1), KC_RCTL
+ ),
+
+ [_FN1] = LAYOUT_60_ansi(
+ KC_GESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_BSPC, \
+ RGB_TOG, RGB_MOD, KC_UP, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ BL_INC, BL_DEC, BL_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ KC_GRV, _______, _______, _______, _______, _______, _______, _______
+ )
+};
diff --git a/keyboards/handwired/practice60/ld/MKL26Z64.ld b/keyboards/handwired/practice60/ld/MKL26Z64.ld
new file mode 100644
index 000000000..c4ca8b874
--- /dev/null
+++ b/keyboards/handwired/practice60/ld/MKL26Z64.ld
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2013-2016 Fabio Utzig, http://fabioutzig.com
+ * (C) 2016 flabbergast <s3+flabbergast@sdfeu.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * KL26Z64 memory setup.
+ */
+MEMORY
+{
+ flash0 : org = 0x00000000, len = 0x100
+ flash1 : org = 0x00000400, len = 0x10
+ flash2 : org = 0x00000410, len = 62k - 0x410
+ flash3 : org = 0x0000F800, len = 2k
+ flash4 : org = 0x00000000, len = 0
+ flash5 : org = 0x00000000, len = 0
+ flash6 : org = 0x00000000, len = 0
+ flash7 : org = 0x00000000, len = 0
+ ram0 : org = 0x1FFFF800, len = 8k
+ 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
+}
+
+/* Flash region for the configuration bytes.*/
+SECTIONS
+{
+ .cfmprotect : ALIGN(4) SUBALIGN(4)
+ {
+ KEEP(*(.cfmconfig))
+ } > flash1
+}
+
+/* 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", flash2);
+REGION_ALIAS("XTORS_FLASH_LMA", flash2);
+
+/* Flash region to be used for code text.*/
+REGION_ALIAS("TEXT_FLASH", flash2);
+REGION_ALIAS("TEXT_FLASH_LMA", flash2);
+
+/* Flash region to be used for read only data.*/
+REGION_ALIAS("RODATA_FLASH", flash2);
+REGION_ALIAS("RODATA_FLASH_LMA", flash2);
+
+/* Flash region to be used for various.*/
+REGION_ALIAS("VARIOUS_FLASH", flash2);
+REGION_ALIAS("VARIOUS_FLASH_LMA", flash2);
+
+/* Flash region to be used for RAM(n) initialization data.*/
+REGION_ALIAS("RAM_INIT_FLASH_LMA", flash2);
+
+/* 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", flash2);
+
+/* 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);
+
+__eeprom_workarea_start__ = ORIGIN(flash3);
+__eeprom_workarea_size__ = LENGTH(flash3);
+__eeprom_workarea_end__ = __eeprom_workarea_start__ + __eeprom_workarea_size__;
+
+/* Generic rules inclusion.*/
+INCLUDE rules.ld
diff --git a/keyboards/handwired/practice60/ld/STM32F103x8_stm32duino_bootloader.ld b/keyboards/handwired/practice60/ld/STM32F103x8_stm32duino_bootloader.ld
new file mode 100644
index 000000000..d0688ef60
--- /dev/null
+++ b/keyboards/handwired/practice60/ld/STM32F103x8_stm32duino_bootloader.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.
+*/
+
+/*
+ * ST32F103xB memory setup for use with the maplemini bootloader.
+ * You will have to
+ * #define CORTEX_VTOR_INIT 0x5000
+ * in your projects chconf.h
+ */
+MEMORY
+{
+ flash0 : org = 0x08002000, len = 64k - 0x2000
+ 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 = 20k
+ 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/handwired/practice60/led.c b/keyboards/handwired/practice60/led.c
new file mode 100644
index 000000000..f15baed16
--- /dev/null
+++ b/keyboards/handwired/practice60/led.c
@@ -0,0 +1,51 @@
+/*
+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/>.
+*/
+
+#include "hal.h"
+#include "backlight.h"
+#include "led.h"
+#include "printf.h"
+
+void backlight_init_ports(void) {
+ printf("backlight_init_ports()\n");
+ #ifdef BACKLIGHT_ENABLE
+ palSetPadMode(GPIOA, 8, PAL_MODE_OUTPUT_PUSHPULL);
+ palSetPad(GPIOA, 8);
+ #endif
+}
+
+void backlight_set(uint8_t level) {
+ printf("backlight_set(%d)\n", level);
+ #ifdef BACKLIGHT_ENABLE
+ if (level == 0) {
+ // Turn backlight off
+ palSetPad(GPIOA, 8);
+ } else {
+ // Turn backlight on
+ palClearPad(GPIOA, 8);
+ }
+ #endif
+}
+
+void led_set(uint8_t usb_led)
+{
+ if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
+ palClearPad(GPIOC, 13);
+ } else {
+ palSetPad(GPIOC, 13);
+ }
+}
diff --git a/keyboards/handwired/practice60/mcuconf.h b/keyboards/handwired/practice60/mcuconf.h
new file mode 100644
index 000000000..9945e7408
--- /dev/null
+++ b/keyboards/handwired/practice60/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 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 TRUE
+#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/handwired/practice60/practice60.c b/keyboards/handwired/practice60/practice60.c
new file mode 100644
index 000000000..5d0fffbd0
--- /dev/null
+++ b/keyboards/handwired/practice60/practice60.c
@@ -0,0 +1,32 @@
+
+#include "practice60.h"
+
+#include "ch.h"
+#include "hal.h"
+
+#include "underglow.h"
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+
+/* generic STM32F103C8T6 board */
+#ifdef BOARD_GENERIC_STM32_F103
+#define LED_ON() do { palClearPad(GPIOC, 13) ;} while (0)
+#define LED_OFF() do { palSetPad(GPIOC, 13); } while (0)
+#define LED_TGL() do { palTogglePad(GPIOC, 13); } while (0)
+#endif
+
+void matrix_init_kb(void){
+ /* MOSI pin*/
+ palSetPadMode(GPIOB, 15, PAL_MODE_STM32_ALTERNATE_PUSHPULL);
+
+ LED_ON();
+ palSetPad(GPIOA, 8);
+ wait_ms(500);
+ palClearPad(GPIOA, 8);
+ LED_OFF();
+
+ leds_init();
+
+
+}
diff --git a/keyboards/handwired/practice60/practice60.h b/keyboards/handwired/practice60/practice60.h
new file mode 100644
index 000000000..5ebba8fb8
--- /dev/null
+++ b/keyboards/handwired/practice60/practice60.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_60_ansi( \
+ K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \
+ K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \
+ K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, \
+ K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, \
+ K40, K41, K42, K43, K49, K4A, K4B, K4C \
+) { \
+ { 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, KC_NO }, \
+ { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, KC_NO, KC_NO }, \
+ { K40, K41, K42, K43, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, K49, K4A, K4B, K4C, KC_NO } \
+}
diff --git a/keyboards/handwired/practice60/readme.md b/keyboards/handwired/practice60/readme.md
new file mode 100644
index 000000000..b23d7de69
--- /dev/null
+++ b/keyboards/handwired/practice60/readme.md
@@ -0,0 +1,3 @@
+# Practice 60
+
+Blue Pill STM32F103C8T6 based 60% board \ No newline at end of file
diff --git a/keyboards/handwired/practice60/rules.mk b/keyboards/handwired/practice60/rules.mk
new file mode 100644
index 000000000..915b07320
--- /dev/null
+++ b/keyboards/handwired/practice60/rules.mk
@@ -0,0 +1,56 @@
+# project specific files
+SRC = led.c \
+ underglow.c \
+ hsv2rgb.c
+
+# GENERIC STM32F103C8T6 board - stm32duino bootloader
+OPT_DEFS = -DCORTEX_VTOR_INIT=0x2000
+MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
+BOARD = GENERIC_STM32_F103
+
+# OPT_DEFS =
+# MCU_LDSCRIPT = STM32F103x8
+# BOARD = GENERIC_STM32_F103
+
+## chip/board settings
+# the next two should match the directories in
+# <chibios>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
+MCU_FAMILY = STM32
+MCU_SERIES = STM32F1xx
+# linker script to use
+# it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
+# or <this_dir>/ld/
+# startup code to use
+# is should exist in <chibios>/os/common/ports/ARMCMx/compilers/GCC/mk/
+MCU_STARTUP = stm32f1xx
+# it should exist either in <chibios>/os/hal/boards/
+# or <this_dir>/boards
+# Cortex version
+# Teensy LC is cortex-m0; Teensy 3.x are cortex-m4
+MCU = cortex-m3
+# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
+ARMV = 7
+# If you want to be able to jump to bootloader from firmware on STM32 MCUs,
+# set the correct BOOTLOADER_ADDRESS. Either set it here, or define it in
+# ./bootloader_defs.h or in ./boards/<FOO>/bootloader_defs.h (if you have
+# a custom board definition that you plan to reuse).
+# If you're not setting it here, leave it commented out.
+# It is chip dependent, the correct number can be looked up here (page 175):
+# http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
+# This also requires a patch to chibios:
+# <tmk_dir>/tmk_core/tool/chibios/ch-bootloader-jump.patch
+#STM32_BOOTLOADER_ADDRESS = 0x1FFFC800
+
+
+#BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = yes # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
+NKRO_ENABLE = yes # USB Nkey Rollover
+BACKLIGHT_ENABLE = yes
+
+LAYOUTS = 60_ansi
+
+DEFAULT_FOLDER = handwired/practice60
diff --git a/keyboards/handwired/practice60/underglow.c b/keyboards/handwired/practice60/underglow.c
new file mode 100644
index 000000000..1383af189
--- /dev/null
+++ b/keyboards/handwired/practice60/underglow.c
@@ -0,0 +1,157 @@
+#include "ch.h"
+#include "hal.h"
+
+#include "hsv2rgb.h"
+#include "underglow.h"
+
+#define BYTES_FOR_LED_BYTE 4
+#define NB_COLORS 3
+#define BYTES_FOR_LED BYTES_FOR_LED_BYTE*NB_COLORS
+#define DATA_SIZE BYTES_FOR_LED*NB_LEDS
+#define RESET_SIZE 200
+#define PREAMBLE_SIZE 4
+
+// Define the spi your LEDs are plugged to here
+#define LEDS_SPI SPID2
+// Define the number of LEDs you wish to control in your LED strip
+#define NB_LEDS 8
+
+#define LED_SPIRAL 1
+
+static uint8_t txbuf[PREAMBLE_SIZE + DATA_SIZE + RESET_SIZE];
+static uint8_t get_protocol_eq(uint8_t data, int pos);
+
+/*
+ * This lib is meant to be used asynchronously, thus the colors contained in
+ * the txbuf will be sent in loop, so that the colors are always the ones you
+ * put in the table (the user thus have less to worry about)
+ *
+ * Since the data are sent via DMA, and the call to spiSend is a blocking one,
+ * the processor ressources are not used to much, if you see your program being
+ * too slow, simply add a:
+ * chThdSleepMilliseconds(x);
+ * after the spiSend, where you increment x untill you are satisfied with your
+ * program speed, another trick may be to lower this thread priority : your call
+ */
+static THD_WORKING_AREA(LEDS_THREAD_WA, 128);
+static THD_FUNCTION(ledsThread, arg) {
+ (void) arg;
+ while(1){
+ spiSend(&LEDS_SPI, PREAMBLE_SIZE + DATA_SIZE + RESET_SIZE, txbuf);
+ }
+}
+
+#if LED_SPIRAL
+/*
+ * 'Led spiral' is a simple demo in which we put all the leds to the same
+ * color, where this color does all the hsv circle in loop.
+ * If you want to launch the thread that will chage the led colors to the
+ * appropriate value, simply set LED_SPIRAL to 1.
+ */
+static THD_WORKING_AREA(HSVTRANS_WA, 128);
+static THD_FUNCTION(hsv_transThread, arg){
+ (void) arg;
+ hsv_color color = {0, 255, 127};
+ while(1){
+ color.h += 1;
+ color.h %= 256;
+ set_leds_color_hsv(color);
+ chThdSleepMilliseconds(50);
+ }
+}
+#endif
+
+static const SPIConfig spicfg = {
+ NULL,
+ GPIOB,
+ 15,
+ SPI_CR1_BR_1|SPI_CR1_BR_0 // baudrate : fpclk / 8 => 1tick is 0.32us
+};
+
+/*
+ * Function used to initialize the driver.
+ *
+ * Starts by shutting off all the LEDs.
+ * Then gets access on the LED_SPI driver.
+ * May eventually launch an animation on the LEDs (e.g. a thread setting the
+ * txbuff values)
+ */
+void leds_init(void){
+ for(int i = 0; i < RESET_SIZE; i++)
+ txbuf[DATA_SIZE+i] = 0x00;
+ for (int i=0; i<PREAMBLE_SIZE; i++)
+ txbuf[i] = 0x00;
+ spiAcquireBus(&LEDS_SPI); /* Acquire ownership of the bus. */
+ spiStart(&LEDS_SPI, &spicfg); /* Setup transfer parameters. */
+ spiSelect(&LEDS_SPI); /* Slave Select assertion. */
+ chThdCreateStatic(LEDS_THREAD_WA, sizeof(LEDS_THREAD_WA),NORMALPRIO, ledsThread, NULL);
+#if LED_SPIRAL
+ chThdCreateStatic(HSVTRANS_WA, sizeof(HSVTRANS_WA),
+ NORMALPRIO, hsv_transThread, NULL);
+#endif
+}
+
+/*
+ * As the trick here is to use the SPI to send a huge pattern of 0 and 1 to
+ * the ws2812b protocol, we use this helper function to translate bytes into
+ * 0s and 1s for the LED (with the appropriate timing).
+ */
+static uint8_t get_protocol_eq(uint8_t data, int pos){
+ uint8_t eq = 0;
+ if (data & (1 << (2*(3-pos))))
+ eq = 0b1110;
+ else
+ eq = 0b1000;
+ if (data & (2 << (2*(3-pos))))
+ eq += 0b11100000;
+ else
+ eq += 0b10000000;
+ return eq;
+}
+
+/*
+ * If you want to set a LED's color in the HSV color space, simply call this
+ * function with a hsv_color containing the desired color and the index of the
+ * led on the LED strip (starting from 0, the first one being the closest the
+ * first plugged to the board)
+ *
+ * Only set the color of the LEDs through the functions given by this API
+ * (unless you really know what you are doing)
+ */
+void set_led_color_hsv(hsv_color color, int pos){
+ set_led_color_rgb(hsv2rgb(color), pos);
+}
+
+/*
+ * If you want to set a LED's color in the RGB color space, simply call this
+ * function with a hsv_color containing the desired color and the index of the
+ * led on the LED strip (starting from 0, the first one being the closest the
+ * first plugged to the board)
+ *
+ * Only set the color of the LEDs through the functions given by this API
+ * (unless you really know what you are doing)
+ */
+void set_led_color_rgb(rgb_color color, int pos){
+ for(int j = 0; j < 4; j++)
+ txbuf[PREAMBLE_SIZE + BYTES_FOR_LED*pos + j] = get_protocol_eq(color.g, j);
+ for(int j = 0; j < 4; j++)
+ txbuf[PREAMBLE_SIZE + BYTES_FOR_LED*pos + BYTES_FOR_LED_BYTE+j] = get_protocol_eq(color.r, j);
+ for(int j = 0; j < 4; j++)
+ txbuf[PREAMBLE_SIZE + BYTES_FOR_LED*pos + BYTES_FOR_LED_BYTE*2+j] = get_protocol_eq(color.b, j);
+}
+
+/*
+ * Same as the two above, but sets all the LEDs in the LED strip (HSV)
+ */
+void set_leds_color_hsv(hsv_color color){
+ for(int i = 0; i < NB_LEDS; i++)
+ set_led_color_hsv(color, i);
+}
+
+/*
+ * Same as the two above, but sets all the LEDs in the LED strip (RGB)
+ */
+void set_leds_color_rgb(rgb_color color){
+ for(int i = 0; i < NB_LEDS; i++)
+ set_led_color_rgb(color, i);
+} \ No newline at end of file
diff --git a/keyboards/handwired/practice60/underglow.h b/keyboards/handwired/practice60/underglow.h
new file mode 100644
index 000000000..ff1195279
--- /dev/null
+++ b/keyboards/handwired/practice60/underglow.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#include "hsv2rgb.h"
+
+void set_leds_color_hsv(hsv_color color);
+void set_leds_color_rgb(rgb_color color);
+void set_led_color_hsv(hsv_color color, int pos);
+void set_led_color_rgb(rgb_color color, int pos);
+
+void leds_init(void);
diff --git a/keyboards/handwired/prime_exl/config.h b/keyboards/handwired/prime_exl/config.h
new file mode 100644
index 000000000..e34fbb8cc
--- /dev/null
+++ b/keyboards/handwired/prime_exl/config.h
@@ -0,0 +1,56 @@
+/*
+Copyright 2018 Holten Campbell
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General 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 0x4024
+#define DEVICE_VER 0x0001
+#define MANUFACTURER PrimeKB
+#define PRODUCT Prime_EXL
+#define DESCRIPTION Ergo
+
+/* key matrix size */
+#define MATRIX_ROWS 10
+#define MATRIX_COLS 9
+
+/* Keyboard Matrix Assignments */
+#define MATRIX_ROW_PINS { B1, E6, D5, D6, B4, D7, D4, F1, F0, B0 }
+#define MATRIX_COL_PINS { D0, B3, B2, D1, D2, D3, F7, F6, F5 }
+#define UNUSED_PINS
+
+/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
+#define DIODE_DIRECTION COL2ROW
+
+#define BACKLIGHT_PIN B7
+#define BACKLIGHT_LEVELS 5
+
+/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
+#define DEBOUNCING_DELAY 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 magic key command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
diff --git a/keyboards/handwired/prime_exl/info.json b/keyboards/handwired/prime_exl/info.json
new file mode 100644
index 000000000..edab78860
--- /dev/null
+++ b/keyboards/handwired/prime_exl/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "Prime_EXL",
+ "url": "https://www.primekb.com",
+ "maintainer": "holtenc",
+ "width": 18,
+ "height": 5,
+ "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}]
+ }
+ }
+}
diff --git a/keyboards/handwired/prime_exl/keymaps/default/config.h b/keyboards/handwired/prime_exl/keymaps/default/config.h
new file mode 100644
index 000000000..83bd38a81
--- /dev/null
+++ b/keyboards/handwired/prime_exl/keymaps/default/config.h
@@ -0,0 +1,19 @@
+/* Copyright 2018 Holten Campbell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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/handwired/prime_exl/keymaps/default/keymap.c b/keyboards/handwired/prime_exl/keymaps/default/keymap.c
new file mode 100644
index 000000000..0e1c60d4a
--- /dev/null
+++ b/keyboards/handwired/prime_exl/keymaps/default/keymap.c
@@ -0,0 +1,143 @@
+/* Copyright 2018 Holten Campbell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 the keycodes used by our macros in process_record_user
+enum custom_keycodes {
+ QMKBEST = SAFE_RANGE,
+ QMKURL
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [0] = LAYOUT(
+ KC_NLCK, KC_LPRN, KC_RPRN, KC_PSLS, KC_PAST, KC_BSPC, 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_F1, KC_F2, KC_P7, KC_P8, KC_P9, KC_DEL, KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT,
+ KC_F3, KC_F4, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MO(3), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT,
+ KC_F5, KC_F6, KC_P1, KC_P2, KC_P3, KC_PPLS, KC_LCTL, KC_LALT, KC_LBRC, KC_RBRC, MO(1), KC_SPC, KC_MINS, KC_EQL, KC_LGUI, MO(4),
+ KC_F7, KC_F8, TO(2), KC_PDOT, KC_P0, KC_PENT
+ ),
+
+ [1] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_DEL,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_SCLN, KC_BSLS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS,
+ BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [2] = LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_F9, 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_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_QUOT, KC_ENT,
+ KC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, MO(3), KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_LCTL, KC_LALT, KC_LBRC, KC_RBRC, MO(5), KC_SPC, KC_MINS, KC_EQL, KC_LGUI, MO(4),
+ KC_LCTL, KC_LALT, TO(0), KC_P, KC_H, KC_SPC
+ ),
+
+ [3] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [4] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+ [5] = LAYOUT(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_DEL,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_SCLN, KC_BSLS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS,
+ BL_TOGG, BL_STEP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
+ ),
+
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case QMKBEST:
+ if (record->event.pressed) {
+ // when keycode QMKBEST is pressed
+ SEND_STRING("QMK is the best thing ever!");
+ } else {
+ // when keycode QMKBEST is released
+ }
+ break;
+ case QMKURL:
+ if (record->event.pressed) {
+ // when keycode QMKURL is pressed
+ SEND_STRING("https://qmk.fm/" SS_TAP(X_ENTER));
+ } else {
+ // when keycode QMKURL is released
+ }
+ break;
+ }
+ return true;
+}
+
+void matrix_init_user(void) {
+ // set CapsLock LED to output and low
+ DDRC |= (1 << 6);
+ PORTC &= ~(1 << 6);
+ // set NumLock LED to output and low
+ DDRB |= (1 << 6);
+ PORTB &= ~(1 << 6);
+ // set ScrollLock LED to output and low
+ DDRB |= (1 << 5);
+ PORTB &= ~(1 << 5);
+}
+
+void matrix_scan_user(void) {
+
+}
+
+
+void led_set_user(uint8_t usb_led) {
+ if (usb_led & (1<<USB_LED_NUM_LOCK)) {
+ PORTB |= (1<<6);
+ } else {
+ PORTB &= ~(1<<6);
+ }
+ if (usb_led & (1<<USB_LED_CAPS_LOCK)) {
+ PORTB |= (1<<5);
+ } else {
+ PORTB &= ~(1<<5);
+ }
+ /*
+ if (usb_led & (1<<USB_LED_SCROLL_LOCK)) {
+ PORTC |= (1<<6);
+ } else {
+ PORTC &= ~(1<<6);
+ }
+ */
+}
+
+//function for layer indicator LED
+uint32_t layer_state_set_user(uint32_t state)
+{
+ if (biton32(state) == 2) {
+ PORTC |= (1<<6);
+ } else {
+ PORTC &= ~(1<<6);
+ }
+ return state;
+}
diff --git a/keyboards/handwired/prime_exl/keymaps/default/readme.md b/keyboards/handwired/prime_exl/keymaps/default/readme.md
new file mode 100644
index 000000000..c2278bd46
--- /dev/null
+++ b/keyboards/handwired/prime_exl/keymaps/default/readme.md
@@ -0,0 +1 @@
+# The default keymap for prime_exl \ No newline at end of file
diff --git a/keyboards/handwired/prime_exl/prime_exl.c b/keyboards/handwired/prime_exl/prime_exl.c
new file mode 100644
index 000000000..d088f6ad1
--- /dev/null
+++ b/keyboards/handwired/prime_exl/prime_exl.c
@@ -0,0 +1,43 @@
+/* Copyright 2018 Holten Campbell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "prime_exl.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/handwired/prime_exl/prime_exl.h b/keyboards/handwired/prime_exl/prime_exl.h
new file mode 100644
index 000000000..727db5db8
--- /dev/null
+++ b/keyboards/handwired/prime_exl/prime_exl.h
@@ -0,0 +1,40 @@
+/* Copyright 2018 Holten Campbell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 PRIME_EXL_H
+#define PRIME_EXL_H
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K040, K050, K041, K051, K042, K052, K043, K053, K044, K054, K045, K055, K046, K056, K047, K057, K048, K058, \
+ K030, K060, K031, K061, K032, K062, K033, K063, K034, K064, K035, K065, K036, K066, K037, K067, K038, K068, \
+ K020, K070, K021, K071, K022, K072, K023, K073, K024, K074, K025, K075, K085, K026, K076, K027, K077, K028, K078, \
+ K010, K080, K011, K081, K012, K082, K013, K083, K014, K084, K015, K016, K086, K017, K087, K018, \
+ K000, K090, K001, K091, K002, K092 \
+) { \
+ { K000, K001, K002, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO }, \
+ { K010, K011, K012, K013, K014, K015, K016, K017, K018 }, \
+ { K020, K021, K022, K023, K024, K025, K026, K027, K028 }, \
+ { K030, K031, K032, K033, K034, K035, K036, K037, K038 }, \
+ { K040, K041, K042, K043, K044, K045, K046, K047, K048 }, \
+ { K050, K051, K052, K053, K054, K055, K056, K057, K058 }, \
+ { K060, K061, K062, K063, K064, K065, K066, K067, K068 }, \
+ { K070, K071, K072, K073, K074, K075, K076, K077, K078 }, \
+ { K080, K081, K082, K083, K084, K085, K086, K087, KC_NO }, \
+ { K090, K091, K092, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO } \
+}
+
+#endif \ No newline at end of file
diff --git a/keyboards/handwired/prime_exl/readme.md b/keyboards/handwired/prime_exl/readme.md
new file mode 100644
index 000000000..f99cba004
--- /dev/null
+++ b/keyboards/handwired/prime_exl/readme.md
@@ -0,0 +1,15 @@
+# Prime_EXL
+
+![Prime_EXL](https://i.imgur.com/3t524g8.jpg)
+
+An ergonomic 45% keyboard with a macro/numpad added to the left side.
+
+Keyboard Maintainer: [Holtenc](https://github.com/holtenc/)
+Hardware Supported: Prime_EXL PCB, ATMega32u4
+Hardware Availability: Prototype
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/prime_exl: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/prime_exl/rules.mk b/keyboards/handwired/prime_exl/rules.mk
new file mode 100644
index 000000000..5cce4e811
--- /dev/null
+++ b/keyboards/handwired/prime_exl/rules.mk
@@ -0,0 +1,80 @@
+# MCU name
+MCU = atmega32u4
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# atmega32a bootloadHID
+BOOTLOADER = atmel-dfu
+
+
+# If you don't know the bootloader type, then you can specify the
+# Boot Section Size in *bytes* by uncommenting out the OPT_DEFS line
+# Teensy halfKay 512
+# Teensy++ halfKay 1024
+# Atmel DFU loader 4096
+# LUFA bootloader 4096
+# USBaspLoader 2048
+# OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = no # Console for debug(+400)
+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 on B7 by default
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+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
+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 (+400)
diff --git a/keyboards/handwired/promethium/config.h b/keyboards/handwired/promethium/config.h
index ea5f2b76e..dca0aec2e 100644
--- a/keyboards/handwired/promethium/config.h
+++ b/keyboards/handwired/promethium/config.h
@@ -15,8 +15,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef CONFIG_H
-#define CONFIG_H
+#pragma once
#include "config_common.h"
@@ -159,27 +158,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MAX_VOLTAGE 4.2
#define MIN_VOLTAGE 3.2
-#define ___ KC_NO
-
-#define KEYMAP_CUSTOM( \
- k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \
- k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \
- k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \
- k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, \
- tp1, tp2, tp3 \
-) \
-{ \
- {k11, k12, k13, k14, k15, k16}, \
- {k21, k22, k23, k24, k25, k26}, \
- {k31, k32, k33, k34, k35, k36}, \
- {k41, k42, k43, k44, k45, k46}, \
- {k17, k18, k19, k1a, k1b, k1c}, \
- {k27, k28, k29, k2a, k2b, k2c}, \
- {k37, k38, k39, k3a, k3b, k3c}, \
- {k47, k48, k49, k4a, k4b, k4c}, \
- {tp1, tp2, tp3, ___, ___, ___} \
-}
-
#ifndef __ASSEMBLER__ // assembler doesn't like enum in .h file
enum led_sequence {
LED_IND_LINUX,
@@ -351,6 +329,3 @@ enum led_sequence {
#define PS2_USART_ERROR (UCSR1A & ((1<<FE1) | (1<<DOR1) | (1<<UPE1)))
#define PS2_USART_RX_VECT USART1_RX_vect
#endif
-
-
-#endif
diff --git a/keyboards/handwired/promethium/info.json b/keyboards/handwired/promethium/info.json
new file mode 100644
index 000000000..2742ffa64
--- /dev/null
+++ b/keyboards/handwired/promethium/info.json
@@ -0,0 +1,68 @@
+{
+ "keyboard_name": "Promethium51",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 16,
+ "height": 5,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ { "label": "k11", "x": 0, "y": 0.50 },
+ { "label": "k12", "x": 1, "y": 0.30 },
+ { "label": "k13", "x": 2, "y": 0.15 },
+ { "label": "k14", "x": 3, "y": 0 },
+ { "label": "k15", "x": 4, "y": 0.15 },
+ { "label": "k16", "x": 5, "y": 0.15 },
+ { "label": "k17", "x": 10, "y": 0.15 },
+ { "label": "k18", "x": 11, "y": 0.15 },
+ { "label": "k19", "x": 12, "y": 0 },
+ { "label": "k1a", "x": 13, "y": 0.15 },
+ { "label": "k1b", "x": 14, "y": 0.30 },
+ { "label": "k1c", "x": 15, "y": 0.50 },
+
+ { "label": "k21", "x": 0, "y": 1.50 },
+ { "label": "k22", "x": 1, "y": 1.30 },
+ { "label": "k23", "x": 2, "y": 1.15 },
+ { "label": "k24", "x": 3, "y": 1 },
+ { "label": "k25", "x": 4, "y": 1.15 },
+ { "label": "k26", "x": 5, "y": 1.15 },
+ { "label": "k27", "x": 10, "y": 1.15 },
+ { "label": "k28", "x": 11, "y": 1.15 },
+ { "label": "k29", "x": 12, "y": 1 },
+ { "label": "k2a", "x": 13, "y": 1.15 },
+ { "label": "k2b", "x": 14, "y": 1.30 },
+ { "label": "k2c", "x": 15, "y": 1.50 },
+
+ { "label": "k31", "x": 0, "y": 2.50 },
+ { "label": "k32", "x": 1, "y": 2.30 },
+ { "label": "k33", "x": 2, "y": 2.15 },
+ { "label": "k34", "x": 3, "y": 2 },
+ { "label": "k35", "x": 4, "y": 2.15 },
+ { "label": "k36", "x": 5, "y": 2.15 },
+ { "label": "k37", "x": 10, "y": 2.15 },
+ { "label": "k38", "x": 11, "y": 2.15 },
+ { "label": "k39", "x": 12, "y": 2 },
+ { "label": "k3a", "x": 13, "y": 2.15 },
+ { "label": "k3b", "x": 14, "y": 2.30 },
+ { "label": "k3c", "x": 15, "y": 2.50 },
+
+ { "label": "k41", "x": 0, "y": 3.50 },
+ { "label": "k42", "x": 1, "y": 3.30 },
+ { "label": "k43", "x": 2, "y": 3.15 },
+ { "label": "k44", "x": 3, "y": 3 },
+ { "label": "k45", "x": 4, "y": 3.15 },
+ { "label": "k46", "x": 5, "y": 3.15 },
+ { "label": "k47", "x": 10, "y": 3.15 },
+ { "label": "k48", "x": 11, "y": 3.15 },
+ { "label": "k49", "x": 12, "y": 3 },
+ { "label": "k4a", "x": 13, "y": 3.15 },
+ { "label": "k4b", "x": 14, "y": 3.30 },
+ { "label": "k4c", "x": 15, "y": 3.50 },
+
+ { "label": "tp1", "x": 6.5, "y": 3.15 },
+ { "label": "tp2", "x": 7.5, "y": 3.15 },
+ { "label": "tp3", "x": 8.5, "y": 3.15 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/promethium/keymaps/default/config.h b/keyboards/handwired/promethium/keymaps/default/config.h
index fa86e2247..0630fd43e 100644
--- a/keyboards/handwired/promethium/keymaps/default/config.h
+++ b/keyboards/handwired/promethium/keymaps/default/config.h
@@ -1,7 +1,4 @@
-#ifndef CONFIG_USER_H
-#define CONFIG_USER_H
-
-#include "../../config.h"
+#pragma once
#define PRIYADI_PROMETHIUM
@@ -11,8 +8,6 @@
/* skip bootmagic and eeconfig */
#define BOOTMAGIC_KEY_SKIP KC_SPACE
-#define PREVENT_STUCK_MODIFIERS
-
#define RGBSPS_ENABLE
#define RGBSPS_DEMO_ENABLE
@@ -25,5 +20,3 @@
#define DOUBLESPACE_LAYER_ENABLE
// #define TOLELOT_ENABLE
-
-#endif
diff --git a/keyboards/handwired/promethium/keymaps/default/keymap.c b/keyboards/handwired/promethium/keymaps/default/keymap.c
index e229b67e5..a1ca79f9a 100644
--- a/keyboards/handwired/promethium/keymaps/default/keymap.c
+++ b/keyboards/handwired/promethium/keymaps/default/keymap.c
@@ -686,7 +686,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | Ctrl | Alt | GUI | Punc | Num | Space | Fun |Greek | GUI |AltGr | Ctrl |
* `-----------------------------------------------------------------------------------'
*/
-[_QWERTY] = KEYMAP_CUSTOM(
+[_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_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, 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,
@@ -706,7 +706,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `-----------------------------------------------------------------------------------'
*/
#ifdef LAYOUT_DVORAK
-[_DVORAK] = KEYMAP_CUSTOM(
+[_DVORAK] = LAYOUT(
_______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______,
_______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______,
_______, KC_SLSH, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______,
@@ -728,7 +728,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
#ifdef LAYOUT_COLEMAK
-[_COLEMAK] = KEYMAP_CUSTOM(
+[_COLEMAK] = LAYOUT(
_______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, _______,
_______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______,
_______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
@@ -750,7 +750,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
#ifdef LAYOUT_NORMAN
-[_NORMAN] = KEYMAP_CUSTOM(
+[_NORMAN] = LAYOUT(
_______, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_QUOT, _______,
_______, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, _______,
_______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
@@ -772,7 +772,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
#ifdef LAYOUT_WORKMAN
-[_WORKMAN] = KEYMAP_CUSTOM(
+[_WORKMAN] = LAYOUT(
_______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_QUOT, _______,
_______, 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_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______,
@@ -792,7 +792,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | : | |
* `-----------------------------------------------------------------------------------'
*/
-[_PUNC] = KEYMAP_CUSTOM(
+[_PUNC] = LAYOUT(
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
@@ -811,7 +811,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | x | | | | | 0 | , | . | : | |
* `-----------------------------------------------------------------------------------'
*/
-[_NUM] = KEYMAP_CUSTOM(
+[_NUM] = LAYOUT(
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, S(KC_A), KC_1, KC_2, KC_3, S(KC_D), _______,
KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, S(KC_B), KC_4, KC_5, KC_6, S(KC_E), _______,
KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C), KC_7, KC_8, KC_9, S(KC_F), _______,
@@ -830,7 +830,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_FUN] = KEYMAP_CUSTOM(
+[_FUN] = LAYOUT(
XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_INS, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
KC_CAPS, KC_F5, KC_F6, KC_F7, KC_F8, KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
_______, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______,
@@ -849,7 +849,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_GREEKU] = KEYMAP_CUSTOM(
+[_GREEKU] = LAYOUT(
_______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC), X(UPI), _______,
_______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA), X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
_______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA), X(UNU), X(UMU), KC_COMM, KC_DOT, KC_SLSH, _______,
@@ -868,7 +868,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_GREEKL] = KEYMAP_CUSTOM(
+[_GREEKL] = LAYOUT(
_______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC), X(LPI), _______,
_______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA), X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
_______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA), X(LNU), X(LMU), KC_COMM, KC_DOT, KC_SLSH, _______,
@@ -887,7 +887,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_EMPTY] = KEYMAP_CUSTOM(
+[_EMPTY] = 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,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
@@ -906,7 +906,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_EMOJI] = KEYMAP_CUSTOM(
+[_EMOJI] = LAYOUT(
X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
@@ -925,7 +925,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_GUI] = KEYMAP_CUSTOM(
+[_GUI] = LAYOUT(
XXXXXXX, G(KC_1), G(KC_2), G(KC_3), G(KC_4), G(KC_5), G(KC_6), G(KC_7), G(KC_8), G(KC_9), G(KC_0), XXXXXXX,
KC_ESC, XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC, KC_SPC, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
@@ -944,7 +944,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_SYS] = KEYMAP_CUSTOM(
+[_SYS] = LAYOUT(
DEBUG, QWERTY, WIN, XXXXXXX, RESET, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, RGBDEMO,
XXXXXXX, FC_TOG, XXXXXXX, DVORAK, XXXXXXX, GLOW, XXXXXXX, XXXXXXX, WORKMAN, LINUX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BT, NORMAN, OSX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
@@ -1365,4 +1365,4 @@ void turn_off_capslock() {
rcv = ps2_host_send(0x01);
}
}
-#endif \ No newline at end of file
+#endif
diff --git a/keyboards/handwired/promethium/keymaps/default/rules.mk b/keyboards/handwired/promethium/keymaps/default/rules.mk
index a0d4261fa..5761be517 100644
--- a/keyboards/handwired/promethium/keymaps/default/rules.mk
+++ b/keyboards/handwired/promethium/keymaps/default/rules.mk
@@ -16,7 +16,7 @@ AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
UNICODEMAP_ENABLE = yes
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.
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
PS2_MOUSE_ENABLE = yes
PS2_USE_INT = yes
FAUXCLICKY_ENABLE = yes
diff --git a/keyboards/handwired/promethium/keymaps/priyadi/config.h b/keyboards/handwired/promethium/keymaps/priyadi/config.h
index fa86e2247..0630fd43e 100644
--- a/keyboards/handwired/promethium/keymaps/priyadi/config.h
+++ b/keyboards/handwired/promethium/keymaps/priyadi/config.h
@@ -1,7 +1,4 @@
-#ifndef CONFIG_USER_H
-#define CONFIG_USER_H
-
-#include "../../config.h"
+#pragma once
#define PRIYADI_PROMETHIUM
@@ -11,8 +8,6 @@
/* skip bootmagic and eeconfig */
#define BOOTMAGIC_KEY_SKIP KC_SPACE
-#define PREVENT_STUCK_MODIFIERS
-
#define RGBSPS_ENABLE
#define RGBSPS_DEMO_ENABLE
@@ -25,5 +20,3 @@
#define DOUBLESPACE_LAYER_ENABLE
// #define TOLELOT_ENABLE
-
-#endif
diff --git a/keyboards/handwired/promethium/keymaps/priyadi/keymap.c b/keyboards/handwired/promethium/keymaps/priyadi/keymap.c
index e229b67e5..a1ca79f9a 100644
--- a/keyboards/handwired/promethium/keymaps/priyadi/keymap.c
+++ b/keyboards/handwired/promethium/keymaps/priyadi/keymap.c
@@ -686,7 +686,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | Ctrl | Alt | GUI | Punc | Num | Space | Fun |Greek | GUI |AltGr | Ctrl |
* `-----------------------------------------------------------------------------------'
*/
-[_QWERTY] = KEYMAP_CUSTOM(
+[_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_ESC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, 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,
@@ -706,7 +706,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* `-----------------------------------------------------------------------------------'
*/
#ifdef LAYOUT_DVORAK
-[_DVORAK] = KEYMAP_CUSTOM(
+[_DVORAK] = LAYOUT(
_______, KC_QUOT, KC_COMM, KC_DOT, KC_P, KC_Y, KC_F, KC_G, KC_C, KC_R, KC_L, _______,
_______, KC_A, KC_O, KC_E, KC_U, KC_I, KC_D, KC_H, KC_T, KC_N, KC_S, _______,
_______, KC_SLSH, KC_Q, KC_J, KC_K, KC_X, KC_B, KC_M, KC_W, KC_V, KC_Z, _______,
@@ -728,7 +728,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
#ifdef LAYOUT_COLEMAK
-[_COLEMAK] = KEYMAP_CUSTOM(
+[_COLEMAK] = LAYOUT(
_______, KC_Q, KC_W, KC_F, KC_P, KC_G, KC_J, KC_L, KC_U, KC_Y, KC_QUOT, _______,
_______, KC_A, KC_R, KC_S, KC_T, KC_D, KC_H, KC_N, KC_E, KC_I, KC_O, _______,
_______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_K, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
@@ -750,7 +750,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
#ifdef LAYOUT_NORMAN
-[_NORMAN] = KEYMAP_CUSTOM(
+[_NORMAN] = LAYOUT(
_______, KC_Q, KC_W, KC_D, KC_F, KC_K, KC_J, KC_U, KC_R, KC_L, KC_QUOT, _______,
_______, KC_A, KC_S, KC_E, KC_T, KC_G, KC_Y, KC_N, KC_I, KC_O, KC_H, _______,
_______, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_P, KC_M, KC_COMM, KC_DOT, KC_SLSH, _______,
@@ -772,7 +772,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
#ifdef LAYOUT_WORKMAN
-[_WORKMAN] = KEYMAP_CUSTOM(
+[_WORKMAN] = LAYOUT(
_______, KC_Q, KC_D, KC_R, KC_W, KC_B, KC_J, KC_F, KC_U, KC_P, KC_QUOT, _______,
_______, 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_M, KC_C, KC_V, KC_K, KC_L, KC_COMM, KC_DOT, KC_SLSH, _______,
@@ -792,7 +792,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | : | |
* `-----------------------------------------------------------------------------------'
*/
-[_PUNC] = KEYMAP_CUSTOM(
+[_PUNC] = LAYOUT(
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, X(LTEQ), X(GTEQ), _______,
KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, X(NOTEQ),KC_LPRN, KC_RPRN, KC_LABK, KC_RABK, _______,
KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, X(PLMIN),KC_LBRC, KC_RBRC, KC_LCBR, KC_RCBR, _______,
@@ -811,7 +811,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | x | | | | | 0 | , | . | : | |
* `-----------------------------------------------------------------------------------'
*/
-[_NUM] = KEYMAP_CUSTOM(
+[_NUM] = LAYOUT(
KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, S(KC_A), KC_1, KC_2, KC_3, S(KC_D), _______,
KC_GRV, KC_ASTR, KC_BSLS, KC_MINS, KC_EQL, KC_SLSH, S(KC_B), KC_4, KC_5, KC_6, S(KC_E), _______,
KC_AMPR, KC_CIRC, KC_PIPE, KC_UNDS, KC_PLUS, KC_QUES, S(KC_C), KC_7, KC_8, KC_9, S(KC_F), _______,
@@ -830,7 +830,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_FUN] = KEYMAP_CUSTOM(
+[_FUN] = LAYOUT(
XXXXXXX, KC_F1, KC_F2, KC_F3, KC_F4, KC_INS, XXXXXXX, KC_PGUP, KC_UP, KC_PGDN, KC_PGUP, KC_DEL,
KC_CAPS, KC_F5, KC_F6, KC_F7, KC_F8, KC_PSCR, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
_______, KC_F9, KC_F10, KC_F11, KC_F12, KC_PAUS, XXXXXXX, XXXXXXX, KC_HOME, KC_END, XXXXXXX, _______,
@@ -849,7 +849,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_GREEKU] = KEYMAP_CUSTOM(
+[_GREEKU] = LAYOUT(
_______, XXXXXXX, XXXXXXX,X(UEPSI), X(URHO), X(UTAU),X(UUPSI),X(UTHET),X(UIOTA),X(UOMIC), X(UPI), _______,
_______,X(UALPH),X(USIGM),X(UDELT), X(UPHI),X(UGAMM), X(UETA), X(UXI),X(UKAPP),X(ULAMB), KC_QUOT, _______,
_______,X(UZETA), X(UCHI), X(UPSI),X(UOMEG),X(UBETA), X(UNU), X(UMU), KC_COMM, KC_DOT, KC_SLSH, _______,
@@ -868,7 +868,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_GREEKL] = KEYMAP_CUSTOM(
+[_GREEKL] = LAYOUT(
_______, XXXXXXX,X(FSIGM),X(LEPSI), X(LRHO), X(LTAU),X(LUPSI),X(LTHET),X(LIOTA),X(LOMIC), X(LPI), _______,
_______,X(LALPH),X(LSIGM),X(LDELT), X(LPHI),X(LGAMM), X(LETA), X(LXI),X(LKAPP),X(LLAMB), KC_QUOT, _______,
_______,X(LZETA), X(LCHI), X(LPSI),X(LOMEG),X(LBETA), X(LNU), X(LMU), KC_COMM, KC_DOT, KC_SLSH, _______,
@@ -887,7 +887,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_EMPTY] = KEYMAP_CUSTOM(
+[_EMPTY] = 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,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
@@ -906,7 +906,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_EMOJI] = KEYMAP_CUSTOM(
+[_EMOJI] = LAYOUT(
X(HART2), X(CRY2),X(WEARY),X(EYERT),X(SMIRK), X(TJOY),X(RECYC),X(UNAMU),X(MUSIC),X(OKHND),X(PENSV), X(PHEW),
X(THMUP), X(PRAY),X(SMILE),X(SMIL2),X(FLUSH), X(GRIN),X(HEART), X(BYE), X(KISS),X(CELEB), X(COOL),X(NOEVS),
X(THMDN),X(SLEEP), X(CLAP), X(CRY), X(VIC),X(BHART), X(SUN),X(SMEYE), X(WINK), X(MOON),X(CONFU),X(NOEVH),
@@ -925,7 +925,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_GUI] = KEYMAP_CUSTOM(
+[_GUI] = LAYOUT(
XXXXXXX, G(KC_1), G(KC_2), G(KC_3), G(KC_4), G(KC_5), G(KC_6), G(KC_7), G(KC_8), G(KC_9), G(KC_0), XXXXXXX,
KC_ESC, XXXXXXX, S(KC_TAB),KC_ESC, KC_TAB, XXXXXXX, XXXXXXX, KC_WWWB, XXXXXXX, KC_WWWF, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, KC_VOLD, KC_MUTE, KC_VOLU, KC_SPC, KC_SPC, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, XXXXXXX,
@@ -944,7 +944,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* | | | | | | | | | | | | |
* `-----------------------------------------------------------------------------------'
*/
-[_SYS] = KEYMAP_CUSTOM(
+[_SYS] = LAYOUT(
DEBUG, QWERTY, WIN, XXXXXXX, RESET, XXXXXXX, XXXXXXX, OUT_USB, XXXXXXX, XXXXXXX, XXXXXXX, RGBDEMO,
XXXXXXX, FC_TOG, XXXXXXX, DVORAK, XXXXXXX, GLOW, XXXXXXX, XXXXXXX, WORKMAN, LINUX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, COLEMAK, XXXXXXX, OUT_BT, NORMAN, OSX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
@@ -1365,4 +1365,4 @@ void turn_off_capslock() {
rcv = ps2_host_send(0x01);
}
}
-#endif \ No newline at end of file
+#endif
diff --git a/keyboards/handwired/promethium/keymaps/priyadi/rules.mk b/keyboards/handwired/promethium/keymaps/priyadi/rules.mk
index a0d4261fa..5761be517 100644
--- a/keyboards/handwired/promethium/keymaps/priyadi/rules.mk
+++ b/keyboards/handwired/promethium/keymaps/priyadi/rules.mk
@@ -16,7 +16,7 @@ AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
UNICODEMAP_ENABLE = yes
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.
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
PS2_MOUSE_ENABLE = yes
PS2_USE_INT = yes
FAUXCLICKY_ENABLE = yes
diff --git a/keyboards/handwired/promethium/promethium.h b/keyboards/handwired/promethium/promethium.h
index 260f140c5..b8d635220 100644
--- a/keyboards/handwired/promethium/promethium.h
+++ b/keyboards/handwired/promethium/promethium.h
@@ -7,4 +7,23 @@ void battery_poll(uint8_t level);
void led_set_kb(uint8_t usb_led);
void led_set_user(uint8_t usb_led);
+#define LAYOUT( \
+ k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \
+ k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, \
+ k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \
+ k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, k4b, k4c, \
+ tp1, tp2, tp3 \
+) \
+{ \
+ {k11, k12, k13, k14, k15, k16}, \
+ {k21, k22, k23, k24, k25, k26}, \
+ {k31, k32, k33, k34, k35, k36}, \
+ {k41, k42, k43, k44, k45, k46}, \
+ {k17, k18, k19, k1a, k1b, k1c}, \
+ {k27, k28, k29, k2a, k2b, k2c}, \
+ {k37, k38, k39, k3a, k3b, k3c}, \
+ {k47, k48, k49, k4a, k4b, k4c}, \
+ {tp1, tp2, tp3, KC_NO, KC_NO, KC_NO} \
+}
+
#endif
diff --git a/keyboards/handwired/promethium/rules.mk b/keyboards/handwired/promethium/rules.mk
index 69903dceb..21328b7f8 100644
--- a/keyboards/handwired/promethium/rules.mk
+++ b/keyboards/handwired/promethium/rules.mk
@@ -62,7 +62,7 @@ AUDIO_ENABLE = no # Audio output on port C6
UNICODE_ENABLE = no # Unicode
UNICODEMAP_ENABLE = yes
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.
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
PS2_MOUSE_ENABLE = yes
PS2_USE_INT = yes
API_SYSEX_ENABLE = no
diff --git a/keyboards/handwired/pteron/config.h b/keyboards/handwired/pteron/config.h
new file mode 100644
index 000000000..9650839e3
--- /dev/null
+++ b/keyboards/handwired/pteron/config.h
@@ -0,0 +1,34 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x6060
+#define DEVICE_VER 0x0001
+#define MANUFACTURER QMK Community
+#define PRODUCT Pteron Keyboard
+#define DESCRIPTION Pteron Keyboard
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 12
+
+/* key matrix pins */
+#define MATRIX_ROW_PINS { D7, E6, B4, B5, B6 }
+#define MATRIX_COL_PINS { F4, F6, F5, F7, B1, B3, C6, D4, D0, D1, D2, D3 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION ROW2COL
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCING_DELAY 5 // 5 is default
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/* prevent stuck modifiers */
+#define PREVENT_STUCK_MODIFIERS
diff --git a/keyboards/handwired/pteron/info.json b/keyboards/handwired/pteron/info.json
new file mode 100644
index 000000000..7b3b1b696
--- /dev/null
+++ b/keyboards/handwired/pteron/info.json
@@ -0,0 +1,78 @@
+{
+ "keyboard_name": "pteron",
+ "url": "",
+ "maintainer": "FSund",
+ "width": 17,
+ "height": 5.95,
+ "layouts": {
+ "LAYOUT": {
+ "layout": [
+ {"label":"K000", "x":0, "y":0.75},
+ {"label":"K001", "x":1, "y":0.75},
+ {"label":"K002", "x":2, "y":0.25},
+ {"label":"K003", "x":3, "y":0},
+ {"label":"K004", "x":4, "y":0.35},
+ {"label":"K005", "x":5, "y":0.45},
+
+ {"label":"K006", "x":11, "y":0.45},
+ {"label":"K007", "x":12, "y":0.35},
+ {"label":"K008", "x":13, "y":0},
+ {"label":"K009", "x":14, "y":0.25},
+ {"label":"K010", "x":15, "y":0.75},
+ {"label":"K011", "x":16, "y":0.75},
+
+ {"label":"K100", "x":0, "y":1.75},
+ {"label":"K101", "x":1, "y":1.75},
+ {"label":"K102", "x":2, "y":1.25},
+ {"label":"K103", "x":3, "y":1},
+ {"label":"K104", "x":4, "y":1.35},
+ {"label":"K105", "x":5, "y":1.45},
+
+ {"label":"K106", "x":11, "y":1.45},
+ {"label":"K107", "x":12, "y":1.35},
+ {"label":"K108", "x":13, "y":1},
+ {"label":"K109", "x":14, "y":1.25},
+ {"label":"K110", "x":15, "y":1.75},
+ {"label":"K111", "x":16, "y":1.75},
+
+ {"label":"K200", "x":0, "y":2.75},
+ {"label":"K201", "x":1, "y":2.75},
+ {"label":"K202", "x":2, "y":2.25},
+ {"label":"K203", "x":3, "y":2},
+ {"label":"K204", "x":4, "y":2.35},
+ {"label":"K205", "x":5, "y":2.45},
+
+ {"label":"K206", "x":11, "y":2.45},
+ {"label":"K207", "x":12, "y":2.35},
+ {"label":"K208", "x":13, "y":2},
+ {"label":"K209", "x":14, "y":2.25},
+ {"label":"K210", "x":15, "y":2.75},
+ {"label":"K211", "x":16, "y":2.75},
+
+ {"label":"K300", "x":0, "y":3.75},
+ {"label":"K301", "x":1, "y":3.75},
+ {"label":"K302", "x":2, "y":3.25},
+ {"label":"K303", "x":3, "y":3},
+ {"label":"K304", "x":4, "y":3.35},
+ {"label":"K305", "x":5, "y":3.45},
+
+ {"label":"K306", "x":11, "y":3.45},
+ {"label":"K307", "x":12, "y":3.35},
+ {"label":"K308", "x":13, "y":3},
+ {"label":"K309", "x":14, "y":3.25},
+ {"label":"K310", "x":15, "y":3.75},
+ {"label":"K311", "x":16, "y":3.75},
+
+ {"label":"K402", "x":4, "y":4.35},
+ {"label":"K403", "x":5, "y":4.45},
+ {"label":"K404", "x":6, "y":4.65},
+ {"label":"K405", "x":7, "y":4.95},
+
+ {"label":"K406", "x":9, "y":4.95},
+ {"label":"K407", "x":10, "y":4.65},
+ {"label":"K408", "x":11, "y":4.45},
+ {"label":"K409", "x":12, "y":4.35}
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/pteron/keymaps/FSund/keymap.c b/keyboards/handwired/pteron/keymaps/FSund/keymap.c
new file mode 100644
index 000000000..f34beae06
--- /dev/null
+++ b/keyboards/handwired/pteron/keymaps/FSund/keymap.c
@@ -0,0 +1,118 @@
+#include QMK_KEYBOARD_H
+
+enum pteron_layers {
+ _QWERTY,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+// use S() to produce shifted versions of keys
+// #define S(kc) LSFT(kc) // defined by default
+
+// alt gr
+#define G(kc) RALT(kc)
+
+// custom keycodes
+// use F_ prefix to avoid problems
+
+// NB! I use Norwegian keyboard layout on my machines, so the keymap probably
+// doesn't make much sense for US/ANSI users
+
+#define F_FSLH S(KC_7) // forward slash
+#define F_BSLH KC_EQL // backward slash
+#define F_EQL S(KC_0) // equals sign
+#define F_APOS KC_BSLS // '
+#define F_TIMES S(KC_BSLS) // *
+#define F_PLUS KC_MINS // +
+#define F_QUEST S(KC_MINS) // ?
+#define F_HAT S(KC_RBRC) // ^
+#define F_TILD G(KC_RBRC) // ~
+#define F_UML KC_RBRC // ¨ (umlaut)
+#define F_SECT S(KC_GRV) // section sign ("law sign") (shifted key below esc)
+#define F_GRAVE S(KC_EQL)
+#define F_ACUTE G(KC_EQL)
+
+#define KC_AA KC_LBRC
+#define KC_OE KC_SCLN
+#define KC_AE KC_QUOT
+
+// brackets
+#define F_SBRL G(KC_8) // square bracket left
+#define F_SBRR G(KC_9) // square bracket right
+#define F_CBRL G(KC_7) // curly bracket left
+#define F_CBRR G(KC_0) // curly bracket right
+#define F_RBRL S(KC_8) // round bracket left
+#define F_RBRR S(KC_9) // round bracket right
+#define F_ABRL KC_NUBS // angle bracket left
+#define F_ABRR S(KC_NUBS) // angle bracket right
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* QWERTY
+ * +-----------------------------------------+ +-----------------------------------------+
+ * | Esc | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Å |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Ctrl | A | S | D | F | G | | H | J | K | L | Ø | Æ |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Shft | Z | X | C | V | B | | N | M | , | . | - | Shft |
+ * +---------------------------+------+------+-------------+ +-------------+------+------+---------------------------+
+ * | LOWR | Spc | Alt | Win | | Win | Alt | Spc | RISE |
+ * +---------------------------+ +---------------------------+
+ */
+
+[_QWERTY] = LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_AA,
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_OE, KC_AE,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSHIFT,
+ LOWER, KC_SPC, KC_LALT, KC_LGUI, KC_RGUI, KC_RALT, KC_ENT, RAISE
+ ),
+
+/* LOWER
+ * +-----------------------------------------+ +-----------------------------------------+
+ * | | | | | | | | | | | | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | | | | | | | \ | / | [ | ] | = | Del |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | F1 | F2 | F3 | F4 | F5 | | < | > | ( | ) | * | ~ |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | F6 | F7 | F8 | F9 | F10 | | F11 | F12 | { | } | + | |
+ * +---------------------------+------+------+-------------+ +-------------+------+------+---------------------------+
+ * | | | | | | | | | |
+ * +---------------------------+ +---------------------------+
+ */
+
+[_LOWER] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, F_BSLH, F_FSLH, F_SBRL, F_SBRR, F_EQL, KC_DEL,
+ KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, F_ABRL, F_ABRR, F_RBRL, F_RBRR, F_TIMES, F_TILD,
+ _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, F_CBRL, F_CBRR, F_PLUS, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+[_RAISE] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_AA,
+ F_SECT, S(KC_1), S(KC_2), S(KC_3), S(KC_4), S(KC_5), F_QUEST, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, F_APOS,
+ _______, S(KC_6), G(KC_2), G(KC_3), G(KC_4), G(KC_5), F_HAT, KC_HOME, KC_PGDN, KC_PGUP, KC_END, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ ),
+
+[_ADJUST] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, F_UML, F_GRAVE, F_ACUTE, _______, RESET, _______, _______, _______, _______, KC_PSCR, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_VOLU, KC_MNXT, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______
+ )
+};
+
+uint32_t layer_state_set_user(uint32_t state) {
+ return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+}
diff --git a/keyboards/handwired/pteron/keymaps/default/keymap.c b/keyboards/handwired/pteron/keymaps/default/keymap.c
new file mode 100644
index 000000000..3079cc7af
--- /dev/null
+++ b/keyboards/handwired/pteron/keymaps/default/keymap.c
@@ -0,0 +1,104 @@
+#include QMK_KEYBOARD_H
+
+enum pteron_layers {
+ _QWERTY,
+ _LOWER,
+ _RAISE,
+ _ADJUST
+};
+
+
+#define LOWER MO(_LOWER)
+#define RAISE MO(_RAISE)
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+/* Qwerty
+ * +-----------------------------------------+ +-----------------------------------------+
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Tab | Q | W | E | R | T | | Y | U | I | O | P | Del |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Esc | A | S | D | F | G | | H | J | K | L | ; | " |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Shift| Z | X | C | V | B | | N | M | , | . | / |Enter |
+ * +-------------+------+------+------+------| |------+------+------+------+-------------+
+ * |Lower | SPC | Alt | GUI | | Alt | GUI | SPC |Raise |
+ * +---------------------------+ +---------------------------+
+ */
+[_QWERTY] = LAYOUT( \
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_DEL, \
+ KC_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, \
+ LOWER, KC_SPC, KC_LALT, KC_LGUI, KC_RALT, KC_RGUI, KC_SPC, RAISE \
+),
+
+/* Lower
+ * +-----------------------------------------+ +-----------------------------------------+
+ * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Bksp |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ~ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | _ | + | { | } | | |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | | F12 |ISO ~ |ISO | | | | |
+ * +-------------+------+------+------+------| |------+------+------+------+-------------+
+ * | | | | | | 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_BSPC, \
+ KC_TILD, KC_EXLM, KC_AT, KC_HASH, KC_DLR, KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL, \
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE, \
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,S(KC_NUHS),S(KC_NUBS),KC_HOME, KC_END, _______, \
+ _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* Raise
+ * +-----------------------------------------+ +-----------------------------------------+
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Bksp |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | ` | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | Del |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | Del | F1 | F2 | F3 | F4 | F5 | | F6 | - | = | [ | ] | \ |
+ * |------+------+------+------+------+------| |------+------+------+------+------+------|
+ * | | F7 | F8 | F9 | F10 | F11 | | F12 |ISO # |ISO / | | | |
+ * +-------------+------+------+------+------| |------+------+------+------+-------------+
+ * | | | | | | Next | Vol- | Vol+ | Play |
+ * +---------------------------+ +---------------------------+
+ */
+[_RAISE] = LAYOUT( \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, \
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_DEL, \
+ KC_DEL, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC, KC_BSLS, \
+ _______, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_NUHS, KC_NUBS, KC_PGUP, KC_PGDN, _______, \
+ _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY \
+),
+
+/* 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| | | | | |
+ * +-------------+------+------+------+------| |------+------+------+------+-------------+
+ * | | | | | | | | | |
+ * +---------------------------+ +---------------------------+
+ */
+[_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, DEBUG, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______ \
+)
+
+};
+
+uint32_t layer_state_set_user(uint32_t state) {
+ return update_tri_layer_state(state, _LOWER, _RAISE, _ADJUST);
+}
diff --git a/keyboards/handwired/pteron/pteron.c b/keyboards/handwired/pteron/pteron.c
new file mode 100644
index 000000000..972b45aa2
--- /dev/null
+++ b/keyboards/handwired/pteron/pteron.c
@@ -0,0 +1 @@
+#include "pteron.h"
diff --git a/keyboards/handwired/pteron/pteron.h b/keyboards/handwired/pteron/pteron.h
new file mode 100644
index 000000000..f29c2619a
--- /dev/null
+++ b/keyboards/handwired/pteron/pteron.h
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT( \
+ K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011, \
+ K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, \
+ K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, \
+ K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, \
+ K402, K403, K404, K405, K406, K407, K408, K409 \
+) { \
+ { K000, K001, K002, K003, K004, K005, K006, K007, K008, K009, K010, K011 }, \
+ { K100, K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111 }, \
+ { K200, K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211 }, \
+ { K300, K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311 }, \
+ { KC_NO, KC_NO, K402, K403, K404, K405, K406, K407, K408, K409, KC_NO, KC_NO } \
+}
diff --git a/keyboards/handwired/pteron/readme.md b/keyboards/handwired/pteron/readme.md
new file mode 100644
index 000000000..a66d41edb
--- /dev/null
+++ b/keyboards/handwired/pteron/readme.md
@@ -0,0 +1,15 @@
+# Pteron
+
+![Pteron](https://i.imgur.com/9QhPlVD.jpg)
+
+An ergonomic keyboard heavily inspired by the [Atreus](https://github.com/technomancy/atreus), [Iris](https://github.com/keebio/iris-case) and [Atreis](https://github.com/dekonnection/atreis) keyboards. More info and files for laser cutting plates and case are in the [Pteron repository](https://github.com/FSund/pteron-keyboard).
+
+Keyboard Maintainer: [Filip Sund](https://github.com/FSund)
+Hardware Supported: Pro Micro
+Hardware Availability: Handwired, no PCB's available (for now)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/pteron: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/handwired/pteron/rules.mk b/keyboards/handwired/pteron/rules.mk
new file mode 100644
index 000000000..10218020e
--- /dev/null
+++ b/keyboards/handwired/pteron/rules.mk
@@ -0,0 +1,58 @@
+# MCU name
+MCU = atmega32u4
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+# Bootloader
+# This definition is optional, and if your keyboard supports multiple bootloaders of
+# different sizes, comment this out, and the correct address will be loaded
+# automatically (+60). See bootloader.mk for all options.
+BOOTLOADER = caterina
+
+# Build Options
+# comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = no # Console for debug(+400)
+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
+RGBLIGHT_ENABLE = no
+UNICODE_ENABLE = no
+UNICODEMAP_ENABLE = no \ No newline at end of file
diff --git a/keyboards/handwired/qc60/config.h b/keyboards/handwired/qc60/config.h
index 3b6f84390..00d095ddf 100644
--- a/keyboards/handwired/qc60/config.h
+++ b/keyboards/handwired/qc60/config.h
@@ -18,6 +18,9 @@
/* Set 0 if debouncing isn't needed */
#define DEBOUNCING_DELAY 5
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D0
+
/* key combination for command */
#define IS_COMMAND() ( \
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
diff --git a/keyboards/handwired/qc60/proto/config.h b/keyboards/handwired/qc60/proto/config.h
index 81466b019..8c21fa926 100644
--- a/keyboards/handwired/qc60/proto/config.h
+++ b/keyboards/handwired/qc60/proto/config.h
@@ -10,5 +10,3 @@
/* ws2812 RGB LED */
#define RGB_DI_PIN D3
#define RGBLED_NUM 1 // Number of LEDs
-// #define ws2812_PORTREG PORTD
-// #define ws2812_DDRREG DDRD
diff --git a/keyboards/handwired/qc60/rules.mk b/keyboards/handwired/qc60/rules.mk
index 1be83d5f8..e61b18b00 100644
--- a/keyboards/handwired/qc60/rules.mk
+++ b/keyboards/handwired/qc60/rules.mk
@@ -58,7 +58,7 @@ 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 this with audio at the same time.
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
SPLIT_KEYBOARD = yes
diff --git a/keyboards/handwired/reddot/keymaps/default/keymap.c b/keyboards/handwired/reddot/keymaps/default/keymap.c
index 44ee2ce51..73aeff225 100755
--- a/keyboards/handwired/reddot/keymaps/default/keymap.c
+++ b/keyboards/handwired/reddot/keymaps/default/keymap.c
@@ -8,14 +8,14 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPACE, KC_DELETE, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_INSERT, KC_HOME, KC_PGUP,\
KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_DELETE, KC_END, KC_PGDOWN, KC_KP_PLUS,\
KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_ENT, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_KP_1, KC_UP, KC_KP_3,\
- FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, NO_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER),
+ FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, KC_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER),
[1] = KEYMAP(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TAB, KC_CAPS, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_FN0, KC_KP_SLASH, KC_KP_ASTERISK, KC_KP_MINUS,\
KC_LALT, FR_AMP, FR_EACU, FR_QUOT, FR_APOS, FR_LPRN, KC_BSPACE, KC_DELETE, FR_MINS, FR_EGRV, FR_UNDS, FR_CCED, FR_AGRV, FR_RPRN, FR_EQL, KC_7, KC_8, KC_9,\
KC_LGUI, FR_A, FR_Z, KC_E, KC_R, KC_T, KC_LSFT, KC_ENT, KC_Y, KC_U, KC_I, KC_O, KC_P, FR_CIRC, FR_DLR, KC_4, KC_5, KC_6, KC_KP_PLUS,\
KC_LCTL, FR_Q, KC_S, KC_D, KC_F, KC_G, KC_ENT, KC_H, KC_J, KC_K, KC_L, FR_M, FR_UGRV, FR_ASTR, KC_1, KC_2, KC_3,\
- FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, NO_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER),
+ FR_LESS, FR_W, KC_X, KC_C, KC_V, KC_B, KC_SPACE, KC_SPACE, KC_N, FR_COMM, FR_SCLN, FR_COLN, FR_EXLM, KC_ALGR, KC_LEFT, KC_DOWN, KC_RIGHT, KC_KP_ENTER),
};
diff --git a/keyboards/handwired/space_oddity/config.h b/keyboards/handwired/space_oddity/config.h
index 9c9361ced..46d854099 100644
--- a/keyboards/handwired/space_oddity/config.h
+++ b/keyboards/handwired/space_oddity/config.h
@@ -49,10 +49,6 @@
keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
-/* prevent stuck modifiers */
-#define PREVENT_STUCK_MODIFIERS
-
-
#ifdef RGB_DI_PIN
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 0
diff --git a/keyboards/handwired/terminus_mini/keymaps/default/rules.mk b/keyboards/handwired/terminus_mini/keymaps/default/rules.mk
index 1485c0832..42ab51f15 100644
--- a/keyboards/handwired/terminus_mini/keymaps/default/rules.mk
+++ b/keyboards/handwired/terminus_mini/keymaps/default/rules.mk
@@ -29,6 +29,6 @@ MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
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.
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
TAP_DANCE_ENABLE = no # Enable Tap Dance
diff --git a/keyboards/handwired/terminus_mini/rules.mk b/keyboards/handwired/terminus_mini/rules.mk
index d7acbf7d5..9ecba25d8 100644
--- a/keyboards/handwired/terminus_mini/rules.mk
+++ b/keyboards/handwired/terminus_mini/rules.mk
@@ -63,7 +63,7 @@ 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 this with audio at the same time.
+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
TAP_DANCE_ENABLE = no # Enable tap dance
diff --git a/keyboards/handwired/tradestation/config.h b/keyboards/handwired/tradestation/config.h
new file mode 100644
index 000000000..346577a92
--- /dev/null
+++ b/keyboards/handwired/tradestation/config.h
@@ -0,0 +1,52 @@
+#pragma once
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0xFEED
+#define PRODUCT_ID 0x6060
+#define DEVICE_VER 0x0001
+#define MANUFACTURER Flehrad
+#define PRODUCT Trade Station
+ #define DESCRIPTION A Pro Micro-powered macropad layout by Didier Luximon. 1/8U gap space top two rows and 1/4U gap between 2U bottom two rows.
+
+/* key matrix size */
+#define MATRIX_ROWS 4
+#define MATRIX_COLS 4
+
+/* key matrix pins */
+#define MATRIX_ROW_PINS { D1, C6, D4, D0 }
+#define MATRIX_COL_PINS { F7, B1, D7, E6 }
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* number of backlight levels */
+
+#ifdef BACKLIGHT_PIN
+#define BACKLIGHT_LEVELS 3
+#endif
+
+/* Set 0 if debouncing isn't needed */
+#define DEBOUNCING_DELAY 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 */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+
+#ifdef RGB_DI_PIN
+#define RGBLIGHT_ANIMATIONS
+ #define RGBLED_NUM 5
+#define RGBLIGHT_HUE_STEP 8
+#define RGBLIGHT_SAT_STEP 8
+#define RGBLIGHT_VAL_STEP 8
+#endif
diff --git a/keyboards/handwired/tradestation/info.json b/keyboards/handwired/tradestation/info.json
new file mode 100644
index 000000000..f26d4ec37
--- /dev/null
+++ b/keyboards/handwired/tradestation/info.json
@@ -0,0 +1,15 @@
+{
+ "keyboard_name": "Tradestation",
+ "url": "",
+ "maintainer": "Flehrad",
+ "bootloader": "",
+ "width": 4.3,
+ "height": 4.5,
+ "layouts": {
+ "LAYOUT_tradestation": {
+ "layout": [{"x":0, "y":0}, {"x":1.1, "y":0}, {"x":2.2, "y":0}, {"x":3.3, "y":0}, {"x":0, "y":1.1}, {"x":1.1, "y":1.1}, {"x":2.2, "y":1.1}, {"x":3.3, "y":1.1}, {"x":0, "y":2.25, "w":2}, {"x":2.25, "y":2.25, "w":2}, {"x":0, "y":3.5, "w":2}, {"x":2.25, "y":3.5, "w":2}]
+ },
+ "LAYOUT_ortho_4x4": {
+ "layout": [{"x":0, "y":0}, {"x":1.1, "y":0}, {"x":2.2, "y":0}, {"x":3.3, "y":0}, {"x":0, "y":1.1}, {"x":1.1, "y":1.1}, {"x":2.2, "y":1.1}, {"x":3.3, "y":1.1}, {"x":0, "y":2.25}, {"x":1, "y":2.25}, {"x":2.25, "y":2.25}, {"x":3.25, "y":2.25}, {"x":0, "y":3.5}, {"x":1, "y":3.5}, {"x":2.25, "y":3.5}, {"x":3.25, "y":3.5}]
+ }
+}
diff --git a/keyboards/handwired/tradestation/keymaps/default/keymap.c b/keyboards/handwired/tradestation/keymaps/default/keymap.c
new file mode 100644
index 000000000..3497dcb94
--- /dev/null
+++ b/keyboards/handwired/tradestation/keymaps/default/keymap.c
@@ -0,0 +1,61 @@
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ LAYOUT_ortho_4x4(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ 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_tradestation(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS),
+};
+
+
+void matrix_init_user(void) {
+}
+
+void matrix_scan_user(void) {
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ return true;
+}
+
+void led_set_user(uint8_t usb_led) {
+
+ if (usb_led & (1 << USB_LED_NUM_LOCK)) {
+
+ } else {
+
+ }
+
+ if (usb_led & (1 << USB_LED_CAPS_LOCK)) {
+
+ } else {
+
+ }
+
+ if (usb_led & (1 << USB_LED_SCROLL_LOCK)) {
+
+ } else {
+
+ }
+
+ if (usb_led & (1 << USB_LED_COMPOSE)) {
+
+ } else {
+
+ }
+
+ if (usb_led & (1 << USB_LED_KANA)) {
+
+ } else {
+
+ }
+
+}
diff --git a/keyboards/handwired/tradestation/license b/keyboards/handwired/tradestation/license
new file mode 100644
index 000000000..261eeb9e9
--- /dev/null
+++ b/keyboards/handwired/tradestation/license
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ 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.
diff --git a/keyboards/handwired/tradestation/readme.md b/keyboards/handwired/tradestation/readme.md
new file mode 100644
index 000000000..69c0331a9
--- /dev/null
+++ b/keyboards/handwired/tradestation/readme.md
@@ -0,0 +1,25 @@
+# Tradestation
+QMK for Tradestation Macropad
+
+This macropad was layout designed by Didier Luximon
+
+This PCB supports an overall 4x4 matrix with unique spacing.
+* Top two rows are 1U keys with 1/8U spacing
+* Bottom two rows are available with 4x2 1U as clusters of 2x1U or as 2x2 2U, spaced with 1/4U
+
+For QMK Configurator, the info.json is utilised.
+- For 2U keys , the first 1u row/column key assignment is the same as the 2u position.
+
+Build requires a pro micro.
+
+Can be built as single PCB with custom case, or as two PCB style with standoffs.
+
+If you like this simple PCB and want to make a donation, you can at https://paypal.me/theboardpodcast
+
+Check out our:
+
+YouTube (https://www.youtube.com/channel/UCg98oJZNffR9nDLJNkorjqw)
+
+Podcast (www.libsyn.com/theboardpodcast)
+
+Patreon (www.patreon.com/theboardpodcast)
diff --git a/keyboards/handwired/tradestation/rules.mk b/keyboards/handwired/tradestation/rules.mk
new file mode 100644
index 000000000..9d49888b5
--- /dev/null
+++ b/keyboards/handwired/tradestation/rules.mk
@@ -0,0 +1,65 @@
+# MCU name
+MCU = atmega32u4
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+# Bootloader selection
+# Teensy halfkay
+# Pro Micro caterina
+# Atmel DFU atmel-dfu
+# LUFA DFU lufa-dfu
+# QMK DFU qmk-dfu
+# atmega32a bootloadHID
+BOOTLOADER = caterina
+
+# Boot Section Size in *bytes*
+# OPT_DEFS += -DBOOTLOADER_SIZE=4096
+
+
+# Build Options
+# comment out to disable the options.
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = no # Console for debug(+400)
+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 = no
+ LAYOUTS = ortho_4x4
diff --git a/keyboards/handwired/tradestation/tradestation.c b/keyboards/handwired/tradestation/tradestation.c
new file mode 100644
index 000000000..a3285a2cc
--- /dev/null
+++ b/keyboards/handwired/tradestation/tradestation.c
@@ -0,0 +1 @@
+#include "tradestation.h"
diff --git a/keyboards/handwired/tradestation/tradestation.h b/keyboards/handwired/tradestation/tradestation.h
new file mode 100644
index 000000000..15e40e3b5
--- /dev/null
+++ b/keyboards/handwired/tradestation/tradestation.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#include "quantum.h"
+
+#define LAYOUT_ortho_4x4( \
+ K00, K01, K02, K03, \
+ K10, K11, K12, K13, \
+ K20, K21, K22, K23, \
+ K30, K31, K32, K33 \
+) { \
+ { K00, K01, K02, K03 }, \
+ { K10, K11, K12, K13 }, \
+ { K20, K21, K22, K23 }, \
+ { K30, K31, K32, K33 } \
+}
+
+#define LAYOUT_tradestation( \
+ K00, K01, K02, K03, \
+ K10, K11, K12, K13, \
+ K20, K22, \
+ K30, K32 \
+) { \
+ { K00, K01, K02, K03 }, \
+ { K10, K11, K12, K13 }, \
+ { K20, KC_NO, K22, KC_NO }, \
+ { K30, KC_NO, K32, KC_NO } \
+}
diff --git a/keyboards/handwired/woodpad/keymaps/default/rules.mk b/keyboards/handwired/woodpad/keymaps/default/rules.mk
index b8879076b..f060db79c 100644
--- a/keyboards/handwired/woodpad/keymaps/default/rules.mk
+++ b/keyboards/handwired/woodpad/keymaps/default/rules.mk
@@ -29,7 +29,7 @@ MIDI_ENABLE = no # MIDI support (+2400 to 4200, depending on config)
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.
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
ifndef QUANTUM_DIR
diff --git a/keyboards/handwired/woodpad/keymaps/drashna/keymap.c b/keyboards/handwired/woodpad/keymaps/drashna/keymap.c
index fd1ff0053..f7df5eac7 100644
--- a/keyboards/handwired/woodpad/keymaps/drashna/keymap.c
+++ b/keyboards/handwired/woodpad/keymaps/drashna/keymap.c
@@ -64,7 +64,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_RESET, KC_MUTE, KC_VOLD, KC_VOLU,\
KC_MAKE, _______, RGB_HUI, RGB_HUD, \
KC_MPLY, KC_MSTP, KC_MPRV, KC_MNXT, \
- RGB_TOG, RGB_SMOD, RGB_SAI, RGB_VAI, \
+ RGB_TOG, RGB_MOD, RGB_SAI, RGB_VAI, \
_______, KC_RGB_T, RGB_SAD, RGB_VAD \
),
diff --git a/keyboards/handwired/xeal60/config.h b/keyboards/handwired/xeal60/config.h
new file mode 100644
index 000000000..c910d8f24
--- /dev/null
+++ b/keyboards/handwired/xeal60/config.h
@@ -0,0 +1,24 @@
+/*
+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/>.
+*/
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+#endif
diff --git a/keyboards/handwired/xeal60/info.json b/keyboards/handwired/xeal60/info.json
new file mode 100644
index 000000000..aa1c3b8ef
--- /dev/null
+++ b/keyboards/handwired/xeal60/info.json
@@ -0,0 +1,12 @@
+{
+ "keyboard_name": "Let's Split",
+ "url": "",
+ "maintainer": "qmk",
+ "width": 13,
+ "height": 4,
+ "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":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/handwired/xeal60/keymaps/default/config.h b/keyboards/handwired/xeal60/keymaps/default/config.h
new file mode 100644
index 000000000..5a6261c4f
--- /dev/null
+++ b/keyboards/handwired/xeal60/keymaps/default/config.h
@@ -0,0 +1,37 @@
+/*
+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/>.
+*/
+
+#ifndef CONFIG_USER_H
+#define CONFIG_USER_H
+
+#include "../../config.h"
+
+/* Use I2C or Serial, not both */
+
+#define USE_SERIAL
+// #define USE_I2C
+
+/* Select hand configuration */
+
+#define MASTER_LEFT
+// #define MASTER_RIGHT
+// #define EE_HANDS
+
+#endif
diff --git a/keyboards/handwired/xeal60/keymaps/default/keymap.c b/keyboards/handwired/xeal60/keymaps/default/keymap.c
new file mode 100644
index 000000000..d770d0c6a
--- /dev/null
+++ b/keyboards/handwired/xeal60/keymaps/default/keymap.c
@@ -0,0 +1,129 @@
+#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
+// entirely and just use numbers.
+#define _QWERTY 0
+#define _NUMPAD 1
+#define _RAISE 4
+
+enum custom_keycodes {
+ QWERTY = SAFE_RANGE,
+ NUMPAD,
+ RAISE
+};
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+/*
+ * ,-----------------------------------------------------------.
+ * |Esc~| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |
+ * |-----------------------------------------------------------|
+ * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ |
+ * |-----------------------------------------------------------|
+ * |FN | A| S| D| F| G| H| J| K| L| ;| '|Return |
+ * |-----------------------------------------------------------|
+ * |Shift | Z| X| C| V| B| N| M| ,| .| /| Shift |
+ * |-----------------------------------------------------------|
+ * |Ctrl|Gui |Alt | NUM | Space | Space |Alt |FN |Menu |Ctrl |
+ * `-----------------------------------------------------------'
+ */
+ /* Layer 0: Qwerty */
+ [_QWERTY] = LAYOUT_split60( \
+ 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, \
+ RAISE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, \
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, \
+ KC_LCTL, KC_LGUI, KC_LALT, NUMPAD, KC_SPC, KC_SPC, KC_RALT, RAISE, KC_MENU, KC_RCTL \
+ ),
+
+/*
+ * ,-----------------------------------------------------------.
+ * | | | | | | | | | /| *| -| | | |
+ * |-----------------------------------------------------------|
+ * | | | | | | | | 7| 8| 9| +| | | |
+ * |-----------------------------------------------------------|
+ * | | | | | | | | 4| 5| 6|Bspc| |Return |
+ * |-----------------------------------------------------------|
+ * | | | | | | | | 1| 2| 3| .| |
+ * |-----------------------------------------------------------|
+ * | | | | QWE | | 0 | . | | | |
+ * `-----------------------------------------------------------'
+ */
+
+ /* Layer 1: Numpad */
+ [_NUMPAD] = LAYOUT_split60( \
+ _______, _______, _______, _______, _______, _______, _______, _______, KC_PSLS, KC_PAST, KC_MINUS, _______, _______, KC_BSPC, \
+ _______, _______, _______, _______, _______, _______, _______, KC_7, KC_8, KC_9, KC_PLUS, _______, _______, KC_BSLS, \
+ _______, _______, _______, _______, _______, _______, _______, KC_4, KC_5, KC_6, KC_BSPC, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, KC_DOT, _______, \
+ _______, _______, _______, QWERTY, KC_SPC, KC_0, KC_DOT, RAISE, _______, _______ \
+ ),
+
+/*
+ * ,-----------------------------------------------------------.
+ * | | | | | | | | | | | | | | |
+ * |-----------------------------------------------------------|
+ * | | | ^ | | | | |pUp| ^ |pDn| | | | |
+ * |-----------------------------------------------------------|
+ * | | < | v | > | | |Hom| < | v | > | | | |
+ * |-----------------------------------------------------------|
+ * | | | | | | |End| | | | | |
+ * |-----------------------------------------------------------|
+ * | | | | | | | | | | |
+ * `-----------------------------------------------------------'
+ */
+
+ /* Layer 2: RAISE */
+ [_RAISE] = LAYOUT_split60( \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______ \
+ )
+
+};
+
+#ifdef AUDIO_ENABLE
+float tone_qwerty[][2] = SONG(QWERTY_SOUND);
+float tone_numpad[][2] = SONG(DVORAK_SOUND);
+#endif
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case QWERTY:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ PLAY_SONG(tone_qwerty);
+ #endif
+ default_layer_set(1UL<<_QWERTY);
+ }
+ return false;
+ break;
+ case NUMPAD:
+ if (record->event.pressed) {
+ #ifdef AUDIO_ENABLE
+ PLAY_SONG(tone_numpad);
+ #endif
+ default_layer_set(1UL<<_NUMPAD);
+ }
+ return false;
+ break;
+ case RAISE:
+ if (record->event.pressed) {
+ layer_on(_RAISE);
+ } else {
+ layer_off(_RAISE);
+ }
+ return false;
+ break;
+ }
+ return true;
+}
diff --git a/keyboards/handwired/xeal60/keymaps/default/rules.mk b/keyboards/handwired/xeal60/keymaps/default/rules.mk
new file mode 100644
index 000000000..457a3d01d
--- /dev/null
+++ b/keyboards/handwired/xeal60/keymaps/default/rules.mk
@@ -0,0 +1,3 @@
+ifndef QUANTUM_DIR
+ include ../../../../Makefile
+endif
diff --git a/keyboards/handwired/xeal60/lets_split.c b/keyboards/handwired/xeal60/lets_split.c
new file mode 100644
index 000000000..3caa114c2
--- /dev/null
+++ b/keyboards/handwired/xeal60/lets_split.c
@@ -0,0 +1 @@
+#include "lets_split.h"
diff --git a/keyboards/handwired/xeal60/lets_split.h b/keyboards/handwired/xeal60/lets_split.h
new file mode 100644
index 000000000..0442982fa
--- /dev/null
+++ b/keyboards/handwired/xeal60/lets_split.h
@@ -0,0 +1,28 @@
+#ifndef LETS_SPLIT_H
+#define LETS_SPLIT_H
+
+#include "quantum.h"
+
+#ifdef KEYBOARD_lets_split_rev1
+ #include "rev1.h"
+#endif
+
+
+// Used to create a keymap using only KC_ prefixed keys
+#define LAYOUT_kc( \
+ L00, L01, L02, L03, L04, L05, L06, L07, R00, R01, R02, R03, R04, R05, R06, R07, \
+ L10, L11, L12, L13, L14, L15, L16, L17, R10, R11, R12, R13, R14, R15, R16, R17, \
+ L20, L21, L22, L23, L24, L25, L26, L27, R20, R21, R22, R23, R24, R25, R26, R27, \
+ L30, L31, L32, L33, L34, L35, L36, L37, R30, R31, R32, R33, R34, R35, R36, R37, \
+ L40, L41, L42, L43, L44, L45, L46, L47, R40, R41, R42, R43, R44, R45, R46, R47 \
+ ) \
+ LAYOUT( \
+ KC_##L00, KC_##L01, KC_##L02, KC_##L03, KC_##L04, KC_##L05, KC_##L06, KC_##L07, KC_##R00, KC_##R01, KC_##R02, KC_##R03, KC_##R04, KC_##R05, KC_##R06, KC_##R07,\
+ KC_##L10, KC_##L11, KC_##L12, KC_##L13, KC_##L14, KC_##L15, KC_##L16, KC_##L17, KC_##R10, KC_##R11, KC_##R12, KC_##R13, KC_##R14, KC_##R15, KC_##R16, KC_##R17,\
+ KC_##L20, KC_##L21, KC_##L22, KC_##L23, KC_##L24, KC_##L25, KC_##L26, KC_##L27, KC_##R20, KC_##R21, KC_##R22, KC_##R23, KC_##R24, KC_##R25, KC_##R26, KC_##R27,\
+ KC_##L30, KC_##L31, KC_##L32, KC_##L33, KC_##L34, KC_##L35, KC_##L36, KC_##L37, KC_##R30, KC_##R31, KC_##R32, KC_##R33, KC_##R34, KC_##R35, KC_##R36, KC_##R37 \
+ )
+
+#define LAYOUT_XEAL LAYOUT_kc
+
+#endif
diff --git a/keyboards/handwired/xeal60/matrix.c b/keyboards/handwired/xeal60/matrix.c
new file mode 100644
index 000000000..f753d234a
--- /dev/null
+++ b/keyboards/handwired/xeal60/matrix.c
@@ -0,0 +1,470 @@
+/*
+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 <avr/io.h>
+#include "wait.h"
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+#include "split_util.h"
+#include "pro_micro.h"
+#include "config.h"
+#include "timer.h"
+
+#ifdef USE_I2C
+# include "i2c.h"
+#else // USE_SERIAL
+# include "serial.h"
+#endif
+
+#ifndef DEBOUNCING_DELAY
+# define DEBOUNCING_DELAY 5
+#endif
+
+#if (DEBOUNCING_DELAY > 0)
+ static uint16_t debouncing_time;
+ static bool debouncing = false;
+#endif
+
+#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)
+#else
+# error "Currently only supports 8 COLS"
+#endif
+static matrix_row_t matrix_debouncing[MATRIX_ROWS];
+
+#define ERROR_DISCONNECT_COUNT 5
+
+#define ROWS_PER_HAND (MATRIX_ROWS/2)
+
+static uint8_t error_count = 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];
+
+#if (DIODE_DIRECTION == COL2ROW)
+ static void init_cols(void);
+ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row);
+ static void unselect_rows(void);
+ static void select_row(uint8_t row);
+ static void unselect_row(uint8_t row);
+#elif (DIODE_DIRECTION == ROW2COL)
+ static void init_rows(void);
+ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col);
+ static void unselect_cols(void);
+ static void unselect_col(uint8_t col);
+ static void select_col(uint8_t col);
+#endif
+
+__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) {
+}
+
+__attribute__ ((weak))
+void matrix_slave_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)
+{
+#ifdef DISABLE_JTAG
+ // JTAG disable for PORT F. write JTD bit twice within four cycles.
+ MCUCR |= (1<<JTD);
+ MCUCR |= (1<<JTD);
+#endif
+
+ debug_enable = true;
+ debug_matrix = true;
+ debug_mouse = true;
+ // initialize row and col
+#if (DIODE_DIRECTION == COL2ROW)
+ unselect_rows();
+ init_cols();
+#elif (DIODE_DIRECTION == ROW2COL)
+ unselect_cols();
+ init_rows();
+#endif
+
+ TX_RX_LED_INIT;
+
+ // initialize matrix state: all keys off
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+ matrix[i] = 0;
+ matrix_debouncing[i] = 0;
+ }
+
+ matrix_init_quantum();
+
+}
+
+uint8_t _matrix_scan(void)
+{
+ int offset = isLeftHand ? 0 : (ROWS_PER_HAND);
+#if (DIODE_DIRECTION == COL2ROW)
+ // Set row, read cols
+ for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) {
+# if (DEBOUNCING_DELAY > 0)
+ bool matrix_changed = read_cols_on_row(matrix_debouncing+offset, current_row);
+
+ if (matrix_changed) {
+ debouncing = true;
+ debouncing_time = timer_read();
+ }
+
+# else
+ read_cols_on_row(matrix+offset, current_row);
+# endif
+
+ }
+
+#elif (DIODE_DIRECTION == ROW2COL)
+ // Set col, read rows
+ for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
+# if (DEBOUNCING_DELAY > 0)
+ bool matrix_changed = read_rows_on_col(matrix_debouncing+offset, current_col);
+ if (matrix_changed) {
+ debouncing = true;
+ debouncing_time = timer_read();
+ }
+# else
+ read_rows_on_col(matrix+offset, current_col);
+# endif
+
+ }
+#endif
+
+# if (DEBOUNCING_DELAY > 0)
+ if (debouncing && (timer_elapsed(debouncing_time) > DEBOUNCING_DELAY)) {
+ for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
+ matrix[i+offset] = matrix_debouncing[i+offset];
+ }
+ debouncing = false;
+ }
+# endif
+
+ return 1;
+}
+
+#ifdef USE_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(void) {
+ int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
+
+ if (serial_update_buffers()) {
+ return 1;
+ }
+
+ for (int i = 0; i < ROWS_PER_HAND; ++i) {
+ matrix[slaveOffset+i] = serial_slave_buffer[i];
+ }
+ return 0;
+}
+#endif
+
+uint8_t matrix_scan(void)
+{
+ uint8_t ret = _matrix_scan();
+
+#ifdef USE_I2C
+ if( i2c_transaction() ) {
+#else // USE_SERIAL
+ if( serial_transaction() ) {
+#endif
+ // turn on the indicator led when halves are disconnected
+ TXLED1;
+
+ 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
+ TXLED0;
+ error_count = 0;
+ }
+ matrix_scan_quantum();
+ return ret;
+}
+
+void matrix_slave_scan(void) {
+ _matrix_scan();
+
+ int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
+
+#ifdef USE_I2C
+ for (int i = 0; i < ROWS_PER_HAND; ++i) {
+ i2c_slave_buffer[i] = matrix[offset+i];
+ }
+#else // USE_SERIAL
+ for (int i = 0; i < ROWS_PER_HAND; ++i) {
+ serial_slave_buffer[i] = matrix[offset+i];
+ }
+#endif
+ matrix_slave_scan_user();
+}
+
+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;
+}
+
+#if (DIODE_DIRECTION == COL2ROW)
+
+static void init_cols(void)
+{
+ for(uint8_t x = 0; x < MATRIX_COLS; x++) {
+ uint8_t pin = col_pins[x];
+ _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN
+ _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI
+ }
+}
+
+static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
+{
+ // Store last value of row prior to reading
+ matrix_row_t last_row_value = current_matrix[current_row];
+
+ // Clear data in matrix row
+ current_matrix[current_row] = 0;
+
+ // Select row and wait for row selecton to stabilize
+ select_row(current_row);
+ wait_us(30);
+
+ // For each col...
+ for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
+
+ // Select the col pin to read (active low)
+ uint8_t pin = col_pins[col_index];
+ uint8_t pin_state = (_SFR_IO8(pin >> 4) & _BV(pin & 0xF));
+
+ // Populate the matrix row with the state of the col pin
+ current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index);
+ }
+
+ // Unselect row
+ unselect_row(current_row);
+
+ return (last_row_value != current_matrix[current_row]);
+}
+
+static void select_row(uint8_t row)
+{
+ uint8_t pin = row_pins[row];
+ _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT
+ _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW
+}
+
+static void unselect_row(uint8_t row)
+{
+ uint8_t pin = row_pins[row];
+ _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN
+ _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI
+}
+
+static void unselect_rows(void)
+{
+ for(uint8_t x = 0; x < ROWS_PER_HAND; x++) {
+ uint8_t pin = row_pins[x];
+ _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN
+ _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI
+ }
+}
+
+#elif (DIODE_DIRECTION == ROW2COL)
+
+static void init_rows(void)
+{
+ for(uint8_t x = 0; x < ROWS_PER_HAND; x++) {
+ uint8_t pin = row_pins[x];
+ _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN
+ _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI
+ }
+}
+
+static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
+{
+ bool matrix_changed = false;
+
+ // Select col and wait for col selecton to stabilize
+ select_col(current_col);
+ wait_us(30);
+
+ // For each row...
+ for(uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++)
+ {
+
+ // Store last value of row prior to reading
+ matrix_row_t last_row_value = current_matrix[row_index];
+
+ // Check row pin state
+ if ((_SFR_IO8(row_pins[row_index] >> 4) & _BV(row_pins[row_index] & 0xF)) == 0)
+ {
+ // Pin LO, set col bit
+ current_matrix[row_index] |= (ROW_SHIFTER << current_col);
+ }
+ else
+ {
+ // Pin HI, clear col bit
+ current_matrix[row_index] &= ~(ROW_SHIFTER << current_col);
+ }
+
+ // Determine if the matrix changed state
+ if ((last_row_value != current_matrix[row_index]) && !(matrix_changed))
+ {
+ matrix_changed = true;
+ }
+ }
+
+ // Unselect col
+ unselect_col(current_col);
+
+ return matrix_changed;
+}
+
+static void select_col(uint8_t col)
+{
+ uint8_t pin = col_pins[col];
+ _SFR_IO8((pin >> 4) + 1) |= _BV(pin & 0xF); // OUT
+ _SFR_IO8((pin >> 4) + 2) &= ~_BV(pin & 0xF); // LOW
+}
+
+static void unselect_col(uint8_t col)
+{
+ uint8_t pin = col_pins[col];
+ _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN
+ _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI
+}
+
+static void unselect_cols(void)
+{
+ for(uint8_t x = 0; x < MATRIX_COLS; x++) {
+ uint8_t pin = col_pins[x];
+ _SFR_IO8((pin >> 4) + 1) &= ~_BV(pin & 0xF); // IN
+ _SFR_IO8((pin >> 4) + 2) |= _BV(pin & 0xF); // HI
+ }
+}
+
+#endif
diff --git a/keyboards/handwired/xeal60/readme.md b/keyboards/handwired/xeal60/readme.md
new file mode 100644
index 000000000..80fe08b93
--- /dev/null
+++ b/keyboards/handwired/xeal60/readme.md
@@ -0,0 +1,187 @@
+Let's Split
+======
+
+This readme and most of the code are from https://github.com/ahtn/tmk_keyboard/
+
+Split keyboard firmware for Arduino Pro Micro or other ATmega32u4
+based boards.
+
+**Hardware files for the Let's Split are now stored at http://qmk.fm/lets_split/**
+**Hardware files for the sockets version can be found at https://github.com/dumle29/let-s-Split-v2/tree/socket-reverseable**
+
+## Build Guide
+
+A build guide for putting together the Let's Split v2 can be found here: [An Overly Verbose Guide to Building a Let's Split Keyboard](https://github.com/nicinabox/lets-split-guide)
+
+There is additional information there about flashing and adding RGB underglow.
+
+A build guide for putting together the sockets version can be found here: *Guide will be made and linked here when the PCBs have been received and tested*
+
+## First Time Setup
+
+Download or clone the `qmk_firmware` repo and navigate to its top level directory. Once your build environment is setup, you'll be able to generate the default .hex using:
+
+```
+$ make lets_split/rev2:default
+```
+
+You will see a lot of output and if everything worked correctly you will see the built hex file:
+
+```
+lets_split_rev2_default.hex
+```
+
+If you would like to use one of the alternative keymaps, or create your own, copy one of the existing [keymaps](keymaps/) and run make like so:
+
+
+```
+$ make lets_split/rev2:YOUR_KEYMAP_NAME
+```
+
+If everything worked correctly you will see a file:
+
+```
+lets_split_rev2_YOUR_KEYMAP_NAME.hex
+```
+
+For more information on customizing keymaps, take a look at the primary documentation for [Customizing Your Keymap](/docs/faq_keymap.md) in the main readme.md.
+
+### Let's split 1.0
+If you have a first generation Let's Split you will need to use the revision 1 code. To do so, use `rev1` in all your commands instead.
+
+Features
+--------
+
+For the full Quantum Mechanical Keyboard feature list, see [the parent readme.md](/readme.md).
+
+Some features supported by the firmware:
+
+* Either half can connect to the computer via USB, or both halves can be used
+ independently.
+* You only need 3 wires to connect the two halves. Two for VCC and GND and one
+ for serial communication.
+* Optional support for I2C connection between the two halves if for some
+ reason you require a faster connection between the two halves. Note this
+ requires an extra wire between halves and pull-up resistors on the data lines.
+
+Required Hardware
+-----------------
+
+Apart from diodes and key switches for the keyboard matrix in each half, you
+will need:
+
+* 2 Arduino Pro Micros. You can find these on AliExpress for ≈3.50USD each.
+* 2 TRRS sockets and 1 TRRS cable, or 2 TRS sockets and 1 TRS cable
+
+Alternatively, you can use any sort of cable and socket that has at least 3
+wires. If you want to use I2C to communicate between halves, you will need a
+cable with at least 4 wires and 2x 4.7kΩ pull-up resistors
+
+Optional Hardware
+-----------------
+
+A speaker can be hooked-up to either side to the `5` (`C6`) pin and `GND`, and turned on via `AUDIO_ENABLE`.
+
+Wiring
+------
+
+The 3 wires of the TRS/TRRS cable need to connect GND, VCC, and digital pin 3 (i.e.
+PD0 on the ATmega32u4) between the two Pro Micros.
+
+Next, wire your key matrix to any of the remaining 17 IO pins of the pro micro
+and modify the `matrix.c` accordingly.
+
+The wiring for serial:
+
+![serial wiring](https://i.imgur.com/C3D1GAQ.png)
+
+The wiring for i2c:
+
+![i2c wiring](https://i.imgur.com/Hbzhc6E.png)
+
+The pull-up resistors may be placed on either half. It is also possible
+to use 4 resistors and have the pull-ups in both halves, but this is
+unnecessary in simple use cases.
+
+You can change your configuration between serial and i2c by modifying your `config.h` file.
+
+Notes on Software Configuration
+-------------------------------
+
+Configuring the firmware is similar to any other QMK project. One thing
+to note is that `MATRIX_ROWS` in `config.h` is the total number of rows between
+the two halves, i.e. if your split keyboard has 4 rows in each half, then use
+`MATRIX_ROWS=8`.
+
+Also, the current implementation assumes a maximum of 8 columns, but it would
+not be very difficult to adapt it to support more if required.
+
+Flashing
+-------
+From the top level `qmk_firmware` directory run `make KEYBOARD:KEYMAP:avrdude` for automatic serial port resolution and flashing.
+Example: `make lets_split/rev2:default:avrdude`
+
+
+Choosing which board to plug the USB cable into (choosing Master)
+--------
+Because the two boards are identical, the firmware has logic to differentiate the left and right board.
+
+It uses two strategies to figure things out: looking at the EEPROM (memory on the chip) or looking if the current board has the usb cable.
+
+The EEPROM approach requires additional setup (flashing the eeprom) but allows you to swap the usb cable to either side.
+
+The USB cable approach is easier to setup and if you just want the usb cable on the left board, you do not need to do anything extra.
+
+### Setting the left hand as master
+If you always plug the usb cable into the left board, nothing extra is needed as this is the default. Comment out `EE_HANDS` and comment out `I2C_MASTER_RIGHT` or `MASTER_RIGHT` if for some reason it was set.
+
+### Setting the right hand as master
+If you always plug the usb cable into the right board, add an extra flag to your `config.h`
+```
+ #define MASTER_RIGHT
+```
+
+### Setting EE_hands to use either hands as master
+If you define `EE_HANDS` in your `config.h`, you will need to set the
+EEPROM for the left and right halves.
+
+The EEPROM is used to store whether the
+half is left handed or right handed. This makes it so that the same firmware
+file will run on both hands instead of having to flash left and right handed
+versions of the firmware to each half. To flash the EEPROM file for the left
+half run:
+```
+avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-lefthand.eep
+// or the equivalent in dfu-programmer
+
+```
+and similarly for right half
+```
+avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-righhand.eep
+// or the equivalent in dfu-programmer
+```
+
+NOTE: replace `$(COM_PORT)` with the port of your device (e.g. `/dev/ttyACM0`)
+
+After you have flashed the EEPROM, you then need to set `EE_HANDS` in your config.h, rebuild the hex files and reflash.
+
+Note that you need to program both halves, but you have the option of using
+different keymaps for each half. You could program the left half with a QWERTY
+layout and the right half with a Colemak layout using bootmagic's default layout option.
+Then if you connect the left half to a computer by USB the keyboard will use QWERTY and Colemak when the
+right half is connected.
+
+
+Notes on Using Pro Micro 3.3V
+-----------------------------
+
+Do update the `F_CPU` parameter in `rules.mk` to `8000000` which reflects
+the frequency on the 3.3V board.
+
+Also, if the slave board is producing weird characters in certain columns,
+update the following line in `matrix.c` to the following:
+
+```
+// _delay_us(30); // without this wait read unstable value.
+_delay_us(300); // without this wait read unstable value.
+```
diff --git a/keyboards/handwired/xeal60/rev1/config.h b/keyboards/handwired/xeal60/rev1/config.h
new file mode 100644
index 000000000..504b3fe8c
--- /dev/null
+++ b/keyboards/handwired/xeal60/rev1/config.h
@@ -0,0 +1,93 @@
+/*
+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/>.
+*/
+
+#ifndef REV1_CONFIG_H
+#define REV1_CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+#define VENDOR_ID 0x4131
+#define PRODUCT_ID 0x5141
+#define DEVICE_VER 0x0001
+#define MANUFACTURER XeaLouS
+#define PRODUCT XeaL60
+#define DESCRIPTION A split keyboard
+
+/* key matrix size */
+// Rows are doubled-up
+#define MATRIX_ROWS 10
+#define MATRIX_COLS 8
+
+// wiring of each half
+//ascii art of pro micro
+// PORT
+//PD3 TX0 RAW
+//PD2 RX1 GND
+// GND RESET
+// GND VCC
+//PD1 2 A3 PF4
+//PD0 3 A2 PF5
+//PD4 4 A1 PF6
+//PC6 5 A0 PF7
+//PD7 6 15 PB1
+//PE6 7 14 PB3
+//PB4 8 13 PB2
+//PB5 9 10 PB6
+
+#define MATRIX_ROW_PINS { B5, B4, E6, D7, C6 }
+#define MATRIX_COL_PINS { B6, B2, B3, B1, F7, F6, F5 }
+
+/* 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 DEBOUNCING_DELAY 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 */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/*
+ * 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/handwired/xeal60/rev1/rev1.c b/keyboards/handwired/xeal60/rev1/rev1.c
new file mode 100644
index 000000000..c243f71bc
--- /dev/null
+++ b/keyboards/handwired/xeal60/rev1/rev1.c
@@ -0,0 +1,15 @@
+#include "lets_split.h"
+
+void matrix_init_kb(void) {
+
+ // // green led on
+ // DDRD |= (1<<5);
+ // PORTD &= ~(1<<5);
+
+ // // orange led on
+ // DDRB |= (1<<0);
+ // PORTB &= ~(1<<0);
+
+ matrix_init_user();
+};
+
diff --git a/keyboards/handwired/xeal60/rev1/rev1.h b/keyboards/handwired/xeal60/rev1/rev1.h
new file mode 100644
index 000000000..8f25d7d2f
--- /dev/null
+++ b/keyboards/handwired/xeal60/rev1/rev1.h
@@ -0,0 +1,33 @@
+#ifndef REV1_H
+#define REV1_H
+
+#include "lets_split.h"
+
+//void promicro_bootloader_jmp(bool program);
+#include "quantum.h"
+
+//void promicro_bootloader_jmp(bool program);
+
+#define LAYOUT( \
+ L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \
+ L10, L11, L12, L13, L14, L15, L16, L17, R11, R12, R13, R14, R15, R16, \
+ L20, L21, L22, L23, L24, L25, L26, R21, R22, R23, R24, R25, R26, \
+ L30, L31, L32, L33, L34, L35, R31, R32, R33, R34, R35, R36, \
+ L40, L41, L42, L43, L44, R42, R43, R44, R45, R46 \
+ ) \
+ { \
+ { L00, L01, L02, L03, L04, L05, L06 }, \
+ { L10, L11, L12, L13, L14, L15, L16, L17 }, \
+ { L20, L21, L22, L23, L24, L25, L26 }, \
+ { L30, L31, L32, L33, L34, L35 }, \
+ { L40, L41, L42, L43, L44 }, \
+ { R00, R01, R02, R03, R04, R05, R06}, \
+ { R11, R12, R13, R14, R15, R16 }, \
+ { R21, R22, R23, R24, R25, R26 }, \
+ { R31, R32, R33, R34, R35, R36 }, \
+ { R42, R43, R44, R45, R46 } \
+ }
+
+#define LAYOUT_split60 LAYOUT
+
+#endif
diff --git a/keyboards/handwired/xeal60/rev1/rules.mk b/keyboards/handwired/xeal60/rev1/rules.mk
new file mode 100644
index 000000000..f84561674
--- /dev/null
+++ b/keyboards/handwired/xeal60/rev1/rules.mk
@@ -0,0 +1 @@
+BACKLIGHT_ENABLE = no \ No newline at end of file
diff --git a/keyboards/handwired/xeal60/rules.mk b/keyboards/handwired/xeal60/rules.mk
new file mode 100644
index 000000000..6dde257ec
--- /dev/null
+++ b/keyboards/handwired/xeal60/rules.mk
@@ -0,0 +1,77 @@
+SRC += matrix.c \
+ split_util.c \
+ serial.c \
+ ssd1306.c
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+# Bootloader
+# This definition is optional, and if your keyboard supports multiple bootloaders of
+# different sizes, comment this out, and the correct address will be loaded
+# automatically (+60). See bootloader.mk for all options.
+BOOTLOADER = caterina
+
+# Interrupt driven control endpoint task(+60)
+OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
+
+# Build Options
+# change to "no" to disable the options, or define them in the Makefile in
+# the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = no # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes # Audio control and System control(+450)
+CONSOLE_ENABLE = no # Console for debug(+400)
+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 = 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 = yes
+USE_I2C = 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
+
+CUSTOM_MATRIX = yes
+
+LAYOUTS = ortho_4x12
+
+DEFAULT_FOLDER = lets_split/rev2
diff --git a/keyboards/handwired/xeal60/serial.c b/keyboards/handwired/xeal60/serial.c
new file mode 100644
index 000000000..74bcbb6bf
--- /dev/null
+++ b/keyboards/handwired/xeal60/serial.c
@@ -0,0 +1,228 @@
+/*
+ * WARNING: be careful changing this code, it is very timing dependent
+ */
+
+#ifndef F_CPU
+#define F_CPU 16000000
+#endif
+
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+#include <stdbool.h>
+#include "serial.h"
+
+#ifndef USE_I2C
+
+// Serial pulse period in microseconds. Its probably a bad idea to lower this
+// value.
+#define SERIAL_DELAY 24
+
+uint8_t volatile serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH] = {0};
+uint8_t volatile serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH] = {0};
+
+#define SLAVE_DATA_CORRUPT (1<<0)
+volatile uint8_t status = 0;
+
+inline static
+void serial_delay(void) {
+ _delay_us(SERIAL_DELAY);
+}
+
+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(void) {
+ SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK;
+ SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
+}
+
+inline static
+uint8_t serial_read_pin(void) {
+ return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK);
+}
+
+inline static
+void serial_low(void) {
+ SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK;
+}
+
+inline static
+void serial_high(void) {
+ SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
+}
+
+void serial_master_init(void) {
+ serial_output();
+ serial_high();
+}
+
+void serial_slave_init(void) {
+ serial_input();
+
+ // Enable INT0
+ EIMSK |= _BV(INT0);
+ // Trigger on falling edge of INT0
+ EICRA &= ~(_BV(ISC00) | _BV(ISC01));
+}
+
+// Used by the master to synchronize timing with the slave.
+static
+void 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 sync_send(void) {
+ serial_output();
+
+ serial_low();
+ serial_delay();
+
+ serial_high();
+}
+
+// Reads a byte from the serial line
+static
+uint8_t 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();
+ _delay_us(1);
+ }
+
+ return byte;
+}
+
+// Sends a byte with MSB ordering
+static
+void 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
+ISR(SERIAL_PIN_INTERRUPT) {
+ sync_send();
+
+ uint8_t checksum = 0;
+ for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) {
+ serial_write_byte(serial_slave_buffer[i]);
+ sync_send();
+ checksum += serial_slave_buffer[i];
+ }
+ serial_write_byte(checksum);
+ sync_send();
+
+ // wait for the sync to finish sending
+ serial_delay();
+
+ // read the middle of pulses
+ _delay_us(SERIAL_DELAY/2);
+
+ uint8_t checksum_computed = 0;
+ for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
+ serial_master_buffer[i] = serial_read_byte();
+ sync_send();
+ checksum_computed += serial_master_buffer[i];
+ }
+ uint8_t checksum_received = serial_read_byte();
+ sync_send();
+
+ serial_input(); // end transaction
+
+ if ( checksum_computed != checksum_received ) {
+ status |= SLAVE_DATA_CORRUPT;
+ } else {
+ status &= ~SLAVE_DATA_CORRUPT;
+ }
+}
+
+inline
+bool serial_slave_DATA_CORRUPT(void) {
+ return status & SLAVE_DATA_CORRUPT;
+}
+
+// Copies the serial_slave_buffer to the master and sends the
+// serial_master_buffer to the slave.
+//
+// Returns:
+// 0 => no error
+// 1 => slave did not respond
+int serial_update_buffers(void) {
+ // this code is very time dependent, so we need to disable interrupts
+ cli();
+
+ // signal to the slave that we want to start a transaction
+ serial_output();
+ serial_low();
+ _delay_us(1);
+
+ // wait for the slaves response
+ serial_input();
+ serial_high();
+ _delay_us(SERIAL_DELAY);
+
+ // check if the slave is present
+ if (serial_read_pin()) {
+ // slave failed to pull the line low, assume not present
+ sei();
+ return 1;
+ }
+
+ // if the slave is present syncronize with it
+ sync_recv();
+
+ uint8_t checksum_computed = 0;
+ // receive data from the slave
+ for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) {
+ serial_slave_buffer[i] = serial_read_byte();
+ sync_recv();
+ checksum_computed += serial_slave_buffer[i];
+ }
+ uint8_t checksum_received = serial_read_byte();
+ sync_recv();
+
+ if (checksum_computed != checksum_received) {
+ sei();
+ return 1;
+ }
+
+ uint8_t checksum = 0;
+ // send data to the slave
+ for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
+ serial_write_byte(serial_master_buffer[i]);
+ sync_recv();
+ checksum += serial_master_buffer[i];
+ }
+ serial_write_byte(checksum);
+ sync_recv();
+
+ // always, release the line when not in use
+ serial_output();
+ serial_high();
+
+ sei();
+ return 0;
+}
+
+#endif
diff --git a/keyboards/handwired/xeal60/serial.h b/keyboards/handwired/xeal60/serial.h
new file mode 100644
index 000000000..15fe4db7b
--- /dev/null
+++ b/keyboards/handwired/xeal60/serial.h
@@ -0,0 +1,26 @@
+#ifndef MY_SERIAL_H
+#define MY_SERIAL_H
+
+#include "config.h"
+#include <stdbool.h>
+
+/* TODO: some defines for interrupt setup */
+#define SERIAL_PIN_DDR DDRD
+#define SERIAL_PIN_PORT PORTD
+#define SERIAL_PIN_INPUT PIND
+#define SERIAL_PIN_MASK _BV(PD0)
+#define SERIAL_PIN_INTERRUPT INT0_vect
+
+#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
+#define SERIAL_MASTER_BUFFER_LENGTH 1
+
+// Buffers for master - slave communication
+extern volatile uint8_t serial_slave_buffer[SERIAL_SLAVE_BUFFER_LENGTH];
+extern volatile uint8_t serial_master_buffer[SERIAL_MASTER_BUFFER_LENGTH];
+
+void serial_master_init(void);
+void serial_slave_init(void);
+int serial_update_buffers(void);
+bool serial_slave_data_corrupt(void);
+
+#endif
diff --git a/keyboards/handwired/xeal60/split_util.c b/keyboards/handwired/xeal60/split_util.c
new file mode 100644
index 000000000..346cbc908
--- /dev/null
+++ b/keyboards/handwired/xeal60/split_util.c
@@ -0,0 +1,86 @@
+#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"
+#include "config.h"
+#include "timer.h"
+
+#ifdef USE_I2C
+# include "i2c.h"
+#else
+# include "serial.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_I2C
+ i2c_master_init();
+#ifdef SSD1306OLED
+ matrix_master_OLED_init ();
+#endif
+#else
+ serial_master_init();
+#endif
+}
+
+static void keyboard_slave_setup(void) {
+ timer_init();
+#ifdef USE_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();
+}
+
+void keyboard_slave_loop(void) {
+ matrix_init();
+
+ while (1) {
+ matrix_slave_scan();
+ }
+}
+
+// this code runs before the usb and keyboard is initialized
+void matrix_setup(void) {
+ split_keyboard_setup();
+
+ if (!has_usb()) {
+ keyboard_slave_loop();
+ }
+}
diff --git a/keyboards/handwired/xeal60/split_util.h b/keyboards/handwired/xeal60/split_util.h
new file mode 100644
index 000000000..595a0659e
--- /dev/null
+++ b/keyboards/handwired/xeal60/split_util.h
@@ -0,0 +1,20 @@
+#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 keyboard_slave_loop(void);
+
+void matrix_master_OLED_init (void);
+
+#endif
diff --git a/keyboards/handwired/xealous/config.h b/keyboards/handwired/xealous/config.h
index 415a0dcf5..7bce502c1 100644
--- a/keyboards/handwired/xealous/config.h
+++ b/keyboards/handwired/xealous/config.h
@@ -21,10 +21,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* Use I2C or Serial, not both */
-// #define USE_SERIAL
#define USE_I2C
#define SCL_CLOCK 400000UL
+// #define USE_SERIAL
+/* serial.c configuration for split keyboard */
+// #define SOFT_SERIAL_PIN D0
+
/* Select hand configuration */
#define MASTER_LEFT
diff --git a/keyboards/handwired/xealous/readme.md b/keyboards/handwired/xealous/readme.md
index 97bebbfe3..14947cc90 100644
--- a/keyboards/handwired/xealous/readme.md
+++ b/keyboards/handwired/xealous/readme.md
@@ -130,13 +130,13 @@ file will run on both hands instead of having to flash left and right handed
versions of the firmware to each half. To flash the EEPROM file for the left
half run:
```
-avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-lefthand.eep
+avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-lefthand.eep"
// or the equivalent in dfu-programmer
```
and similarly for right half
```
-avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:eeprom-righhand.eep
+avrdude -p atmega32u4 -P $(COM_PORT) -c avr109 -U eeprom:w:"./quantum/split_common/eeprom-righthand.eep"
// or the equivalent in dfu-programmer
```
diff --git a/keyboards/handwired/xealous/rules.mk b/keyboards/handwired/xealous/rules.mk
index 717895960..eebd11d86 100644
--- a/keyboards/handwired/xealous/rules.mk
+++ b/keyboards/handwired/xealous/rules.mk
@@ -59,7 +59,7 @@ MIDI_ENABLE = no # MIDI controls
AUDIO_ENABLE = yes # 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.
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
SPLIT_KEYBOARD = yes # Use shared split_common code
SUBPROJECT_rev1 = yes