summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build_test.mk1
-rw-r--r--builddefs/bootloader.mk40
-rw-r--r--builddefs/mcu_selection.mk40
-rw-r--r--builddefs/message.mk5
-rw-r--r--common_features.mk11
-rw-r--r--data/mappings/keyboard_aliases.json3
-rw-r--r--data/schemas/keyboard.jsonschema4
-rw-r--r--docs/ChangeLog/20220226/PR15304.md13
-rw-r--r--docs/feature_combo.md42
-rw-r--r--docs/feature_debounce_type.md1
-rw-r--r--docs/feature_haptic_feedback.md4
-rw-r--r--docs/feature_key_lock.md3
-rw-r--r--docs/feature_pointing_device.md159
-rw-r--r--docs/feature_split_keyboard.md8
-rw-r--r--docs/feature_wpm.md2
-rw-r--r--docs/internals_gpio_control.md24
-rw-r--r--docs/keycodes.md1
-rw-r--r--docs/keycodes_magic.md1
-rw-r--r--docs/platformdev_chibios_earlyinit.md1
-rw-r--r--drivers/bluetooth/rn42.c99
-rw-r--r--drivers/bluetooth/rn42.h25
-rw-r--r--drivers/led/issi/is31fl3733-simple.c248
-rw-r--r--drivers/led/issi/is31fl3733-simple.h260
-rw-r--r--drivers/sensors/adns9800.c10
-rw-r--r--drivers/sensors/pimoroni_trackball.c22
-rw-r--r--drivers/sensors/pimoroni_trackball.h9
-rw-r--r--drivers/sensors/pmw3360.c279
-rw-r--r--drivers/sensors/pmw3360.h35
-rw-r--r--drivers/sensors/pmw3389.c294
-rw-r--r--drivers/sensors/pmw3389.h76
-rw-r--r--drivers/sensors/pmw3389_firmware.h558
-rw-r--r--keyboards/40percentclub/ut47/keymaps/default/keymap.c6
-rw-r--r--keyboards/40percentclub/ut47/keymaps/non-us/keymap.c6
-rw-r--r--keyboards/40percentclub/ut47/keymaps/nordic/keymap.c6
-rw-r--r--keyboards/40percentclub/ut47/keymaps/rgb/keymap.c6
-rw-r--r--keyboards/40percentclub/ut47/matrix.c14
-rw-r--r--keyboards/40percentclub/ut47/rules.mk3
-rw-r--r--keyboards/40percentclub/ut47/ut47.c8
-rw-r--r--keyboards/7skb/7skb.h7
-rw-r--r--keyboards/7skb/readme.md17
-rw-r--r--keyboards/7skb/rules.mk22
-rw-r--r--keyboards/7splus/readme.md17
-rw-r--r--keyboards/ai03/orbit/config.h13
-rw-r--r--keyboards/ai03/orbit/keymaps/default/keymap.c16
-rw-r--r--keyboards/ai03/orbit/matrix.c328
-rw-r--r--keyboards/ai03/orbit/orbit.c270
-rw-r--r--keyboards/ai03/orbit/orbit.h17
-rw-r--r--keyboards/ai03/orbit/readme.md6
-rw-r--r--keyboards/ai03/orbit/rules.mk10
-rw-r--r--keyboards/ai03/orbit/serial.c545
-rw-r--r--keyboards/ai03/orbit/serial.h62
-rw-r--r--keyboards/ai03/orbit/split_flags.c5
-rw-r--r--keyboards/ai03/orbit/split_flags.h15
-rw-r--r--keyboards/ai03/orbit/split_util.c87
-rw-r--r--keyboards/ai03/orbit/split_util.h10
-rw-r--r--keyboards/ai03/orbit/transport.c238
-rw-r--r--keyboards/ai03/orbit/transport.h42
-rw-r--r--keyboards/ajisai74/readme.md17
-rw-r--r--keyboards/allison/readme.md15
-rw-r--r--keyboards/allison_numpad/readme.md15
-rw-r--r--keyboards/amj96/matrix.c6
-rw-r--r--keyboards/angel17/readme.md15
-rw-r--r--keyboards/angel17/rules.mk22
-rw-r--r--keyboards/angel64/alpha/matrix.c287
-rw-r--r--keyboards/angel64/alpha/readme.md15
-rw-r--r--keyboards/angel64/readme.md15
-rw-r--r--keyboards/angel64/rev1/matrix.c287
-rw-r--r--keyboards/angel64/rev1/readme.md15
-rw-r--r--keyboards/angel64/rules.mk25
-rw-r--r--keyboards/arch_36/readme.md16
-rw-r--r--keyboards/barleycorn/readme.md23
-rw-r--r--keyboards/bat43/bat43.h10
-rw-r--r--keyboards/bat43/readme.md15
-rw-r--r--keyboards/bat43/rules.mk20
-rw-r--r--keyboards/bpiphany/kitten_paw/matrix.c7
-rw-r--r--keyboards/bpiphany/pegasushoof/2013/matrix.c7
-rw-r--r--keyboards/business_card/business_card.h25
-rw-r--r--keyboards/business_card/readme.md15
-rw-r--r--keyboards/business_card/rules.mk20
-rw-r--r--keyboards/capsunlocked/cu24/config.h (renamed from keyboards/cu24/config.h)0
-rw-r--r--keyboards/capsunlocked/cu24/cu24.c (renamed from keyboards/cu24/cu24.c)0
-rw-r--r--keyboards/capsunlocked/cu24/cu24.h (renamed from keyboards/cu24/cu24.h)0
-rw-r--r--keyboards/capsunlocked/cu24/info.json (renamed from keyboards/cu24/info.json)0
-rw-r--r--keyboards/capsunlocked/cu24/keymaps/default/keymap.c (renamed from keyboards/cu24/keymaps/default/keymap.c)0
-rw-r--r--keyboards/capsunlocked/cu24/keymaps/default/readme.md (renamed from keyboards/cu24/keymaps/default/readme.md)0
-rw-r--r--keyboards/capsunlocked/cu24/readme.md15
-rw-r--r--keyboards/capsunlocked/cu24/rules.mk (renamed from keyboards/cu24/rules.mk)0
-rw-r--r--keyboards/capsunlocked/cu75/config.h (renamed from keyboards/cu75/config.h)0
-rw-r--r--keyboards/capsunlocked/cu75/cu75.c (renamed from keyboards/cu75/cu75.c)0
-rw-r--r--keyboards/capsunlocked/cu75/cu75.h (renamed from keyboards/cu75/cu75.h)0
-rw-r--r--keyboards/capsunlocked/cu75/cu75/.noci (renamed from keyboards/7skb/.noci)0
-rw-r--r--keyboards/capsunlocked/cu75/info.json (renamed from keyboards/cu75/info.json)0
-rw-r--r--keyboards/capsunlocked/cu75/keymaps/default/keymap.c (renamed from keyboards/cu75/keymaps/default/keymap.c)0
-rw-r--r--keyboards/capsunlocked/cu75/keymaps/default/rules.mk (renamed from keyboards/cu75/keymaps/default/rules.mk)0
-rw-r--r--keyboards/capsunlocked/cu75/keymaps/iso/keymap.c (renamed from keyboards/cu75/keymaps/iso/keymap.c)0
-rw-r--r--keyboards/capsunlocked/cu75/keymaps/iso/rules.mk (renamed from keyboards/cu75/keymaps/iso/rules.mk)0
-rw-r--r--keyboards/capsunlocked/cu75/readme.md17
-rw-r--r--keyboards/capsunlocked/cu75/rules.mk (renamed from keyboards/cu75/rules.mk)0
-rw-r--r--keyboards/capsunlocked/cu80/v1/config.h (renamed from keyboards/cu80/config.h)0
-rw-r--r--keyboards/capsunlocked/cu80/v1/info.json (renamed from keyboards/cu80/info.json)0
-rw-r--r--keyboards/capsunlocked/cu80/v1/keymaps/default/keymap.c (renamed from keyboards/cu80/keymaps/default/keymap.c)0
-rw-r--r--keyboards/capsunlocked/cu80/v1/keymaps/default/readme.md (renamed from keyboards/cu80/keymaps/default/readme.md)0
-rw-r--r--keyboards/capsunlocked/cu80/v1/readme.md15
-rw-r--r--keyboards/capsunlocked/cu80/v1/rules.mk (renamed from keyboards/cu80/rules.mk)0
-rw-r--r--keyboards/capsunlocked/cu80/v1/v1.c18
-rw-r--r--keyboards/capsunlocked/cu80/v1/v1.h (renamed from keyboards/cu80/cu80.h)0
-rw-r--r--keyboards/centromere/config.h9
-rw-r--r--keyboards/centromere/matrix.c126
-rw-r--r--keyboards/centromere/rules.mk23
-rw-r--r--keyboards/chili/readme.md15
-rw-r--r--keyboards/chimera_ergo/config.h9
-rw-r--r--keyboards/chimera_ergo/matrix.c135
-rw-r--r--keyboards/chimera_ergo/rules.mk19
-rw-r--r--keyboards/chimera_ls/config.h9
-rw-r--r--keyboards/chimera_ls/matrix.c139
-rw-r--r--keyboards/chimera_ls/rules.mk17
-rw-r--r--keyboards/chimera_ortho/config.h9
-rw-r--r--keyboards/chimera_ortho/matrix.c125
-rw-r--r--keyboards/chimera_ortho/rules.mk17
-rw-r--r--keyboards/chimera_ortho_plus/config.h9
-rw-r--r--keyboards/chimera_ortho_plus/matrix.c125
-rw-r--r--keyboards/chimera_ortho_plus/rules.mk5
-rw-r--r--keyboards/choc_taro/readme.md15
-rw-r--r--keyboards/claw44/claw44.h5
-rw-r--r--keyboards/claw44/readme.md15
-rw-r--r--keyboards/claw44/rules.mk20
-rw-r--r--keyboards/clueboard/60/info.json1
-rw-r--r--keyboards/clueboard/66/rev4/info.json1
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/info.json1
-rw-r--r--keyboards/clueboard/california/info.json1
-rw-r--r--keyboards/comet46/config.h9
-rw-r--r--keyboards/comet46/matrix.c125
-rw-r--r--keyboards/comet46/rules.mk18
-rw-r--r--keyboards/converter/palm_usb/config.h55
-rw-r--r--keyboards/converter/palm_usb/matrix.c15
-rw-r--r--keyboards/converter/palm_usb/post_rules.mk7
-rw-r--r--keyboards/converter/palm_usb/rules.mk1
-rw-r--r--keyboards/converter/sun_usb/command_extra.c22
-rw-r--r--keyboards/converter/sun_usb/config.h47
-rw-r--r--keyboards/converter/sun_usb/led.c6
-rw-r--r--keyboards/converter/sun_usb/matrix.c27
-rw-r--r--keyboards/converter/sun_usb/post_rules.mk6
-rw-r--r--keyboards/converter/sun_usb/rules.mk1
-rw-r--r--keyboards/converter/usb_usb/custom_matrix.cpp4
-rw-r--r--keyboards/cu24/readme.md15
-rw-r--r--keyboards/cu75/readme.md17
-rw-r--r--keyboards/cu80/cu80.c1
-rw-r--r--keyboards/cu80/readme.md15
-rw-r--r--keyboards/dailycraft/bat43/.noci (renamed from keyboards/angel17/.noci)0
-rw-r--r--keyboards/dailycraft/bat43/bat43.c (renamed from keyboards/bat43/bat43.c)0
-rw-r--r--keyboards/dailycraft/bat43/bat43.h10
-rw-r--r--keyboards/dailycraft/bat43/config.h (renamed from keyboards/bat43/config.h)0
-rw-r--r--keyboards/dailycraft/bat43/keymaps/default/keymap.c (renamed from keyboards/bat43/keymaps/default/keymap.c)0
-rw-r--r--keyboards/dailycraft/bat43/keymaps/default/readme.md (renamed from keyboards/bat43/keymaps/default/readme.md)0
-rw-r--r--keyboards/dailycraft/bat43/keymaps/via/keymap.c (renamed from keyboards/bat43/keymaps/via/keymap.c)0
-rw-r--r--keyboards/dailycraft/bat43/keymaps/via/readme.md (renamed from keyboards/bat43/keymaps/via/readme.md)0
-rw-r--r--keyboards/dailycraft/bat43/keymaps/via/rules.mk (renamed from keyboards/allison/keymaps/via/rules.mk)0
-rw-r--r--keyboards/dailycraft/bat43/readme.md26
-rw-r--r--keyboards/dailycraft/bat43/rev1/.noci (renamed from keyboards/angel17/alpha/.noci)0
-rw-r--r--keyboards/dailycraft/bat43/rev1/info.json (renamed from keyboards/bat43/rev1/info.json)0
-rw-r--r--keyboards/dailycraft/bat43/rev1/rev1.c (renamed from keyboards/bat43/rev1/rev1.c)0
-rw-r--r--keyboards/dailycraft/bat43/rev1/rev1.h (renamed from keyboards/bat43/rev1/rev1.h)0
-rw-r--r--keyboards/dailycraft/bat43/rev1/rules.mk (renamed from keyboards/bat43/rev1/rules.mk)0
-rw-r--r--keyboards/dailycraft/bat43/rev2/.noci (renamed from keyboards/angel64/.noci)0
-rw-r--r--keyboards/dailycraft/bat43/rev2/info.json (renamed from keyboards/bat43/rev2/info.json)0
-rw-r--r--keyboards/dailycraft/bat43/rev2/rev2.c (renamed from keyboards/bat43/rev2/rev2.c)0
-rw-r--r--keyboards/dailycraft/bat43/rev2/rev2.h (renamed from keyboards/bat43/rev2/rev2.h)0
-rw-r--r--keyboards/dailycraft/bat43/rev2/rules.mk (renamed from keyboards/bat43/rev2/rules.mk)0
-rw-r--r--keyboards/dailycraft/bat43/rules.mk20
-rw-r--r--keyboards/dailycraft/claw44/.noci (renamed from keyboards/angel64/alpha/.noci)0
-rw-r--r--keyboards/dailycraft/claw44/claw44.c (renamed from keyboards/claw44/claw44.c)0
-rw-r--r--keyboards/dailycraft/claw44/claw44.h5
-rw-r--r--keyboards/dailycraft/claw44/config.h (renamed from keyboards/claw44/config.h)0
-rw-r--r--keyboards/dailycraft/claw44/keymaps/default/config.h (renamed from keyboards/claw44/keymaps/default/config.h)0
-rw-r--r--keyboards/dailycraft/claw44/keymaps/default/keymap.c (renamed from keyboards/claw44/keymaps/default/keymap.c)0
-rw-r--r--keyboards/dailycraft/claw44/keymaps/oled/config.h (renamed from keyboards/claw44/keymaps/oled/config.h)0
-rw-r--r--keyboards/dailycraft/claw44/keymaps/oled/keymap.c (renamed from keyboards/claw44/keymaps/oled/keymap.c)0
-rw-r--r--keyboards/dailycraft/claw44/keymaps/oled/rules.mk (renamed from keyboards/claw44/keymaps/oled/rules.mk)0
-rw-r--r--keyboards/dailycraft/claw44/keymaps/via/config.h (renamed from keyboards/claw44/keymaps/via/config.h)0
-rw-r--r--keyboards/dailycraft/claw44/keymaps/via/keymap.c (renamed from keyboards/claw44/keymaps/via/keymap.c)0
-rw-r--r--keyboards/dailycraft/claw44/keymaps/via/rules.mk (renamed from keyboards/allison_numpad/keymaps/via/rules.mk)0
-rw-r--r--keyboards/dailycraft/claw44/lib/glcdfont.c (renamed from keyboards/claw44/lib/glcdfont.c)0
-rw-r--r--keyboards/dailycraft/claw44/readme.md26
-rw-r--r--keyboards/dailycraft/claw44/rev1/.noci (renamed from keyboards/bat43/.noci)0
-rw-r--r--keyboards/dailycraft/claw44/rev1/config.h (renamed from keyboards/claw44/rev1/config.h)0
-rw-r--r--keyboards/dailycraft/claw44/rev1/info.json (renamed from keyboards/claw44/rev1/info.json)0
-rw-r--r--keyboards/dailycraft/claw44/rev1/readme.md (renamed from keyboards/claw44/rev1/readme.md)0
-rw-r--r--keyboards/dailycraft/claw44/rev1/rev1.c (renamed from keyboards/7skb/rev1/rev1.c)0
-rw-r--r--keyboards/dailycraft/claw44/rev1/rev1.h (renamed from keyboards/claw44/rev1/rev1.h)0
-rw-r--r--keyboards/dailycraft/claw44/rev1/rules.mk (renamed from keyboards/claw44/rev1/rules.mk)0
-rw-r--r--keyboards/dailycraft/claw44/rules.mk20
-rw-r--r--keyboards/dailycraft/owl8/config.h (renamed from keyboards/owl8/config.h)0
-rw-r--r--keyboards/dailycraft/owl8/info.json (renamed from keyboards/owl8/info.json)0
-rw-r--r--keyboards/dailycraft/owl8/keymaps/default/keymap.c (renamed from keyboards/owl8/keymaps/default/keymap.c)0
-rw-r--r--keyboards/dailycraft/owl8/keymaps/default/readme.md (renamed from keyboards/owl8/keymaps/default/readme.md)0
-rw-r--r--keyboards/dailycraft/owl8/keymaps/via/keymap.c (renamed from keyboards/owl8/keymaps/via/keymap.c)0
-rw-r--r--keyboards/dailycraft/owl8/keymaps/via/readme.md (renamed from keyboards/owl8/keymaps/via/readme.md)0
-rw-r--r--keyboards/dailycraft/owl8/keymaps/via/rules.mk (renamed from keyboards/barleycorn/keymaps/via/rules.mk)0
-rw-r--r--keyboards/dailycraft/owl8/owl8.c (renamed from keyboards/owl8/owl8.c)0
-rw-r--r--keyboards/dailycraft/owl8/owl8.h (renamed from keyboards/owl8/owl8.h)0
-rw-r--r--keyboards/dailycraft/owl8/readme.md26
-rw-r--r--keyboards/dailycraft/owl8/rules.mk (renamed from keyboards/owl8/rules.mk)0
-rw-r--r--keyboards/dailycraft/wings42/config.h (renamed from keyboards/7skb/config.h)0
-rw-r--r--keyboards/dailycraft/wings42/readme.md26
-rw-r--r--keyboards/dailycraft/wings42/rev1/config.h (renamed from keyboards/wings42/rev1/config.h)0
-rw-r--r--keyboards/dailycraft/wings42/rev1/keymaps/default/keymap.c (renamed from keyboards/wings42/rev1/keymaps/default/keymap.c)0
-rw-r--r--keyboards/dailycraft/wings42/rev1/keymaps/default/readme.md (renamed from keyboards/wings42/rev1/keymaps/default/readme.md)0
-rw-r--r--keyboards/dailycraft/wings42/rev1/keymaps/via/keymap.c (renamed from keyboards/wings42/rev1/keymaps/via/keymap.c)0
-rw-r--r--keyboards/dailycraft/wings42/rev1/keymaps/via/rules.mk (renamed from keyboards/bat43/keymaps/via/rules.mk)0
-rw-r--r--keyboards/dailycraft/wings42/rev1/readme.md26
-rw-r--r--keyboards/dailycraft/wings42/rev1/rev1.c (renamed from keyboards/wings42/rev1/rev1.c)0
-rw-r--r--keyboards/dailycraft/wings42/rev1/rev1.h (renamed from keyboards/wings42/rev1/rev1.h)0
-rw-r--r--keyboards/dailycraft/wings42/rev1/rules.mk (renamed from keyboards/7skb/rev1/rules.mk)0
-rw-r--r--keyboards/dailycraft/wings42/rev1_extkeys/config.h (renamed from keyboards/wings42/rev1_extkeys/config.h)0
-rw-r--r--keyboards/dailycraft/wings42/rev1_extkeys/keymaps/default/keymap.c (renamed from keyboards/wings42/rev1_extkeys/keymaps/default/keymap.c)0
-rw-r--r--keyboards/dailycraft/wings42/rev1_extkeys/keymaps/default/readme.md (renamed from keyboards/wings42/rev1_extkeys/keymaps/default/readme.md)0
-rw-r--r--keyboards/dailycraft/wings42/rev1_extkeys/keymaps/via/keymap.c (renamed from keyboards/wings42/rev1_extkeys/keymaps/via/keymap.c)0
-rw-r--r--keyboards/dailycraft/wings42/rev1_extkeys/keymaps/via/rules.mk (renamed from keyboards/chili/keymaps/via/rules.mk)0
-rw-r--r--keyboards/dailycraft/wings42/rev1_extkeys/readme.md26
-rw-r--r--keyboards/dailycraft/wings42/rev1_extkeys/rev1_extkeys.c (renamed from keyboards/wings42/rev1_extkeys/rev1_extkeys.c)0
-rw-r--r--keyboards/dailycraft/wings42/rev1_extkeys/rev1_extkeys.h (renamed from keyboards/wings42/rev1_extkeys/rev1_extkeys.h)0
-rw-r--r--keyboards/dailycraft/wings42/rev1_extkeys/rules.mk (renamed from keyboards/angel64/alpha/rules.mk)0
-rw-r--r--keyboards/dailycraft/wings42/rev2/config.h (renamed from keyboards/wings42/rev2/config.h)0
-rw-r--r--keyboards/dailycraft/wings42/rev2/keymaps/default/keymap.c (renamed from keyboards/wings42/rev2/keymaps/default/keymap.c)0
-rw-r--r--keyboards/dailycraft/wings42/rev2/keymaps/default/readme.md (renamed from keyboards/wings42/rev2/keymaps/default/readme.md)0
-rw-r--r--keyboards/dailycraft/wings42/rev2/keymaps/via/config.h (renamed from keyboards/wings42/rev2/keymaps/via/config.h)0
-rw-r--r--keyboards/dailycraft/wings42/rev2/keymaps/via/keymap.c (renamed from keyboards/wings42/rev2/keymaps/via/keymap.c)0
-rw-r--r--keyboards/dailycraft/wings42/rev2/keymaps/via/rules.mk (renamed from keyboards/wings42/rev2/keymaps/via/rules.mk)0
-rw-r--r--keyboards/dailycraft/wings42/rev2/readme.md26
-rw-r--r--keyboards/dailycraft/wings42/rev2/rev2.c (renamed from keyboards/wings42/rev2/rev2.c)0
-rw-r--r--keyboards/dailycraft/wings42/rev2/rev2.h (renamed from keyboards/wings42/rev2/rev2.h)0
-rw-r--r--keyboards/dailycraft/wings42/rev2/rules.mk (renamed from keyboards/angel64/rev1/rules.mk)0
-rw-r--r--keyboards/dailycraft/wings42/rules.mk22
-rw-r--r--keyboards/dailycraft/wings42/wings42.c (renamed from keyboards/wings42/wings42.c)0
-rw-r--r--keyboards/dailycraft/wings42/wings42.h30
-rw-r--r--keyboards/dc01/arrow/matrix.c8
-rw-r--r--keyboards/dc01/left/matrix.c8
-rw-r--r--keyboards/dc01/numpad/matrix.c8
-rw-r--r--keyboards/dc01/right/matrix.c8
-rw-r--r--keyboards/delilah/readme.md22
-rw-r--r--keyboards/dichotomy/config.h9
-rwxr-xr-xkeyboards/dichotomy/dichotomy.c8
-rwxr-xr-xkeyboards/dichotomy/matrix.c10
-rwxr-xr-xkeyboards/dichotomy/rules.mk3
-rw-r--r--keyboards/dm9records/ergoinu/config.h10
-rw-r--r--keyboards/dm9records/ergoinu/ergoinu.c17
-rw-r--r--keyboards/dm9records/ergoinu/ergoinu.h5
-rw-r--r--keyboards/dm9records/ergoinu/keymaps/default/config.h24
-rw-r--r--keyboards/dm9records/ergoinu/keymaps/default/keymap.c41
-rw-r--r--keyboards/dm9records/ergoinu/keymaps/default/rules.mk18
-rw-r--r--keyboards/dm9records/ergoinu/keymaps/default_jis/config.h24
-rw-r--r--keyboards/dm9records/ergoinu/keymaps/default_jis/keymap.c26
-rw-r--r--keyboards/dm9records/ergoinu/keymaps/default_jis/rules.mk18
-rw-r--r--keyboards/dm9records/ergoinu/matrix.c292
-rw-r--r--keyboards/dm9records/ergoinu/post_rules.mk9
-rw-r--r--keyboards/dm9records/ergoinu/readme.md9
-rw-r--r--keyboards/dm9records/ergoinu/rules.mk20
-rw-r--r--keyboards/dm9records/ergoinu/serial.c295
-rw-r--r--keyboards/dm9records/ergoinu/serial.h24
-rw-r--r--keyboards/dm9records/ergoinu/serial_config.h11
-rw-r--r--keyboards/dm9records/ergoinu/split_util.c56
-rw-r--r--keyboards/dm9records/ergoinu/split_util.h12
-rw-r--r--keyboards/duck/jetfire/matrix.c6
-rw-r--r--keyboards/durgod/boards/DURGOD_STM32_F070/bootloader_defs.h7
-rw-r--r--keyboards/durgod/boards/DURGOD_STM32_F070/chconf.h2
-rw-r--r--keyboards/durgod/boards/DURGOD_STM32_F070/mcuconf.h2
-rw-r--r--keyboards/durgod/dgk6x/config.h3
-rw-r--r--keyboards/durgod/dgk6x/halconf.h3
-rw-r--r--keyboards/durgod/dgk6x/rules.mk4
-rw-r--r--keyboards/durgod/k3x0/config.h3
-rw-r--r--keyboards/durgod/k3x0/halconf.h2
-rw-r--r--keyboards/edi/hardlight/mk2/rules.mk2
-rw-r--r--keyboards/edi/standaside/config.h (renamed from keyboards/standaside/config.h)0
-rw-r--r--keyboards/edi/standaside/info.json (renamed from keyboards/standaside/info.json)0
-rw-r--r--keyboards/edi/standaside/keymaps/default/keymap.c (renamed from keyboards/standaside/keymaps/default/keymap.c)0
-rw-r--r--keyboards/edi/standaside/readme.md15
-rw-r--r--keyboards/edi/standaside/rules.mk (renamed from keyboards/standaside/rules.mk)0
-rw-r--r--keyboards/edi/standaside/standaside.c (renamed from keyboards/standaside/standaside.c)0
-rw-r--r--keyboards/edi/standaside/standaside.h (renamed from keyboards/standaside/standaside.h)0
-rw-r--r--keyboards/ergoarrows/readme.md17
-rw-r--r--keyboards/ergodox_stm32/matrix.c4
-rw-r--r--keyboards/ergodox_stm32/rules.mk4
-rw-r--r--keyboards/ergotaco/matrix.c5
-rw-r--r--keyboards/ez_maker/directpins/proton_c/info.json1
-rw-r--r--keyboards/forever65/info.json1
-rw-r--r--keyboards/gboards/gergoplex/matrix.c5
-rw-r--r--keyboards/geminate60/readme.md16
-rw-r--r--keyboards/georgi/matrix.c5
-rw-r--r--keyboards/gergo/matrix.c5
-rw-r--r--keyboards/getta25/getta25.h7
-rw-r--r--keyboards/getta25/readme.md17
-rw-r--r--keyboards/getta25/rules.mk21
-rw-r--r--keyboards/gingham/readme.md23
-rw-r--r--keyboards/gmmk/pro/ansi/keymaps/cedrikl/keymap.c154
-rw-r--r--keyboards/gmmk/pro/ansi/keymaps/cedrikl/rgb_matrix_map.h185
-rw-r--r--keyboards/gmmk/pro/ansi/keymaps/cedrikl/rules.mk2
-rw-r--r--keyboards/gmmk/pro/iso/keymaps/vitoni/config.h20
-rw-r--r--keyboards/gmmk/pro/iso/keymaps/vitoni/keymap.c148
-rw-r--r--keyboards/gmmk/pro/iso/keymaps/vitoni/readme.adoc104
-rw-r--r--keyboards/handwired/dactyl/matrix.c8
-rw-r--r--keyboards/handwired/frenchdev/matrix.c6
-rw-r--r--keyboards/handwired/not_so_minidox/config.h5
-rw-r--r--keyboards/handwired/not_so_minidox/i2c.c162
-rw-r--r--keyboards/handwired/not_so_minidox/i2c.h46
-rw-r--r--keyboards/handwired/not_so_minidox/keymaps/default/keymap.c56
-rw-r--r--keyboards/handwired/not_so_minidox/matrix.c308
-rw-r--r--keyboards/handwired/not_so_minidox/rules.mk17
-rw-r--r--keyboards/handwired/not_so_minidox/serial.c228
-rw-r--r--keyboards/handwired/not_so_minidox/serial.h23
-rw-r--r--keyboards/handwired/not_so_minidox/split_util.c84
-rw-r--r--keyboards/handwired/not_so_minidox/split_util.h17
-rw-r--r--keyboards/handwired/onekey/teensy_32/rules.mk3
-rw-r--r--keyboards/handwired/onekey/teensy_lc/rules.mk3
-rw-r--r--keyboards/handwired/promethium/matrix.c8
-rw-r--r--keyboards/handwired/pterodactyl/matrix.c8
-rw-r--r--keyboards/handwired/tractyl_manuform/4x6_right/rules.mk6
-rw-r--r--keyboards/handwired/tractyl_manuform/5x6_right/config.h1
-rw-r--r--keyboards/handwired/tractyl_manuform/5x6_right/keymaps/drashna/keymap.c2
-rw-r--r--keyboards/handwired/tractyl_manuform/5x6_right/rules.mk2
-rw-r--r--keyboards/handwired/tractyl_manuform/config.h5
-rw-r--r--keyboards/handwired/tractyl_manuform/tm_sync.c180
-rw-r--r--keyboards/handwired/tractyl_manuform/tractyl_manuform.c56
-rw-r--r--keyboards/handwired/tractyl_manuform/tractyl_manuform.h15
-rw-r--r--keyboards/handwired/wakizashi40/config.h20
-rw-r--r--keyboards/handwired/wakizashi40/info.json88
-rw-r--r--keyboards/handwired/wakizashi40/keymaps/default/keymap.c44
-rw-r--r--keyboards/handwired/wakizashi40/keymaps/via/keymap.c92
-rw-r--r--keyboards/handwired/wakizashi40/keymaps/via/rules.mk4
-rw-r--r--keyboards/handwired/wakizashi40/readme.md19
-rw-r--r--keyboards/handwired/wakizashi40/rules.mk1
-rw-r--r--keyboards/helix/pico/matrix.c6
-rw-r--r--keyboards/helix/rev1/matrix.c6
-rw-r--r--keyboards/helix/rev2/matrix.c6
-rw-r--r--keyboards/hhkb/ansi/matrix.c9
-rw-r--r--keyboards/hhkb/jp/matrix.c9
-rwxr-xr-xkeyboards/hid_liber/matrix.c6
-rwxr-xr-xkeyboards/honeycomb/config.h9
-rwxr-xr-xkeyboards/honeycomb/honeycomb.c6
-rwxr-xr-xkeyboards/honeycomb/matrix.c10
-rwxr-xr-xkeyboards/honeycomb/rules.mk3
-rw-r--r--keyboards/id67/readme.md29
-rw-r--r--keyboards/id80/readme.md27
-rw-r--r--keyboards/id80/rules.mk24
-rw-r--r--keyboards/idobao/id67/default_rgb/config.h (renamed from keyboards/id67/default_rgb/config.h)0
-rw-r--r--keyboards/idobao/id67/default_rgb/default_rgb.c (renamed from keyboards/id67/default_rgb/default_rgb.c)0
-rw-r--r--keyboards/idobao/id67/default_rgb/default_rgb.h (renamed from keyboards/id67/default_rgb/default_rgb.h)0
-rw-r--r--keyboards/idobao/id67/default_rgb/info.json (renamed from keyboards/id67/default_rgb/info.json)0
-rw-r--r--keyboards/idobao/id67/default_rgb/readme.md (renamed from keyboards/id67/default_rgb/readme.md)0
-rw-r--r--keyboards/idobao/id67/default_rgb/rules.mk (renamed from keyboards/id67/default_rgb/rules.mk)0
-rw-r--r--keyboards/idobao/id67/keymaps/default/keymap.c (renamed from keyboards/id67/keymaps/default/keymap.c)0
-rw-r--r--keyboards/idobao/id67/keymaps/via/keymap.c (renamed from keyboards/id67/keymaps/via/keymap.c)0
-rw-r--r--keyboards/idobao/id67/keymaps/via/rules.mk (renamed from keyboards/id67/keymaps/via/rules.mk)0
-rw-r--r--keyboards/idobao/id67/readme.md29
-rw-r--r--keyboards/idobao/id67/rgb/config.h (renamed from keyboards/id67/rgb/config.h)0
-rw-r--r--keyboards/idobao/id67/rgb/info.json (renamed from keyboards/id67/rgb/info.json)0
-rw-r--r--keyboards/idobao/id67/rgb/keymaps/default/keymap.c (renamed from keyboards/id67/rgb/keymaps/default/keymap.c)0
-rw-r--r--keyboards/idobao/id67/rgb/keymaps/thewerther/config.h (renamed from keyboards/id67/rgb/keymaps/thewerther/config.h)0
-rw-r--r--keyboards/idobao/id67/rgb/keymaps/thewerther/keymap.c (renamed from keyboards/id67/rgb/keymaps/thewerther/keymap.c)0
-rw-r--r--keyboards/idobao/id67/rgb/keymaps/thewerther/rules.mk (renamed from keyboards/id67/rgb/keymaps/thewerther/rules.mk)0
-rw-r--r--keyboards/idobao/id67/rgb/readme.md (renamed from keyboards/id67/rgb/readme.md)0
-rw-r--r--keyboards/idobao/id67/rgb/rgb.c (renamed from keyboards/id67/rgb/rgb.c)0
-rw-r--r--keyboards/idobao/id67/rgb/rgb.h (renamed from keyboards/id67/rgb/rgb.h)0
-rw-r--r--keyboards/idobao/id67/rgb/rules.mk (renamed from keyboards/id67/rgb/rules.mk)0
-rw-r--r--keyboards/idobao/id75/config.h (renamed from keyboards/idobo/config.h)0
-rw-r--r--keyboards/idobao/id75/id75.c16
-rw-r--r--keyboards/idobao/id75/id75.h (renamed from keyboards/idobo/idobo.h)0
-rw-r--r--keyboards/idobao/id75/info.json (renamed from keyboards/idobo/info.json)0
-rw-r--r--keyboards/idobao/id75/keymaps/default/keymap.c (renamed from keyboards/idobo/keymaps/default/keymap.c)0
-rw-r--r--keyboards/idobao/id75/keymaps/default/readme.md (renamed from keyboards/idobo/keymaps/default/readme.md)0
-rw-r--r--keyboards/idobao/id75/keymaps/default75/keymap.c (renamed from keyboards/idobo/keymaps/default75/keymap.c)0
-rw-r--r--keyboards/idobao/id75/keymaps/default75/readme.md (renamed from keyboards/idobo/keymaps/default75/readme.md)0
-rw-r--r--keyboards/idobao/id75/keymaps/drewdobo/config.h (renamed from keyboards/idobo/keymaps/drewdobo/config.h)0
-rw-r--r--keyboards/idobao/id75/keymaps/drewdobo/keymap.c (renamed from keyboards/idobo/keymaps/drewdobo/keymap.c)0
-rw-r--r--keyboards/idobao/id75/keymaps/drewdobo/readme.md (renamed from keyboards/idobo/keymaps/drewdobo/readme.md)0
-rw-r--r--keyboards/idobao/id75/keymaps/drewdobo/rules.mk (renamed from keyboards/idobo/keymaps/drewdobo/rules.mk)0
-rw-r--r--keyboards/idobao/id75/keymaps/egstad/config.h (renamed from keyboards/idobo/keymaps/egstad/config.h)0
-rw-r--r--keyboards/idobao/id75/keymaps/egstad/keymap.c (renamed from keyboards/idobo/keymaps/egstad/keymap.c)0
-rw-r--r--keyboards/idobao/id75/keymaps/egstad/readme.md (renamed from keyboards/idobo/keymaps/egstad/readme.md)0
-rw-r--r--keyboards/idobao/id75/keymaps/egstad/rules.mk (renamed from keyboards/idobo/keymaps/egstad/rules.mk)0
-rw-r--r--keyboards/idobao/id75/keymaps/gkbd/config.h (renamed from keyboards/idobo/keymaps/gkbd/config.h)0
-rw-r--r--keyboards/idobao/id75/keymaps/gkbd/keymap.c (renamed from keyboards/idobo/keymaps/gkbd/keymap.c)0
-rw-r--r--keyboards/idobao/id75/keymaps/gkbd/readme.md (renamed from keyboards/idobo/keymaps/gkbd/readme.md)0
-rw-r--r--keyboards/idobao/id75/keymaps/gkbd/rules.mk (renamed from keyboards/idobo/keymaps/gkbd/rules.mk)0
-rw-r--r--keyboards/idobao/id75/keymaps/gkbd_75/config.h (renamed from keyboards/idobo/keymaps/gkbd_75/config.h)0
-rw-r--r--keyboards/idobao/id75/keymaps/gkbd_75/keymap.c (renamed from keyboards/idobo/keymaps/gkbd_75/keymap.c)0
-rw-r--r--keyboards/idobao/id75/keymaps/gkbd_75/readme.md (renamed from keyboards/idobo/keymaps/gkbd_75/readme.md)0
-rw-r--r--keyboards/idobao/id75/keymaps/gkbd_orthon/config.h (renamed from keyboards/idobo/keymaps/gkbd_orthon/config.h)0
-rw-r--r--keyboards/idobao/id75/keymaps/gkbd_orthon/keymap.c (renamed from keyboards/idobo/keymaps/gkbd_orthon/keymap.c)0
-rw-r--r--keyboards/idobao/id75/keymaps/gkbd_orthon/readme.md (renamed from keyboards/idobo/keymaps/gkbd_orthon/readme.md)0
-rw-r--r--keyboards/idobao/id75/keymaps/greenshadowmaker/keyboard-layout-editor-gsm-idobo.json (renamed from keyboards/idobo/keymaps/greenshadowmaker/keyboard-layout-editor-gsm-idobo.json)0
-rw-r--r--keyboards/idobao/id75/keymaps/greenshadowmaker/keymap.c (renamed from keyboards/idobo/keymaps/greenshadowmaker/keymap.c)0
-rw-r--r--keyboards/idobao/id75/keymaps/greenshadowmaker/readme.md (renamed from keyboards/idobo/keymaps/greenshadowmaker/readme.md)0
-rw-r--r--keyboards/idobao/id75/keymaps/greenshadowmaker/rules.mk (renamed from keyboards/idobo/keymaps/greenshadowmaker/rules.mk)0
-rw-r--r--keyboards/idobao/id75/keymaps/ifohancroft/config.h (renamed from keyboards/idobo/keymaps/ifohancroft/config.h)0
-rw-r--r--keyboards/idobao/id75/keymaps/ifohancroft/keymap.c (renamed from keyboards/idobo/keymaps/ifohancroft/keymap.c)0
-rw-r--r--keyboards/idobao/id75/keymaps/ifohancroft/readme.md (renamed from keyboards/idobo/keymaps/ifohancroft/readme.md)0
-rw-r--r--keyboards/idobao/id75/keymaps/ifohancroft/rules.mk (renamed from keyboards/idobo/keymaps/ifohancroft/rules.mk)0
-rw-r--r--keyboards/idobao/id75/keymaps/pathnirvana/config.h (renamed from keyboards/idobo/keymaps/pathnirvana/config.h)0
-rw-r--r--keyboards/idobao/id75/keymaps/pathnirvana/keymap.c (renamed from keyboards/idobo/keymaps/pathnirvana/keymap.c)0
-rw-r--r--keyboards/idobao/id75/keymaps/pathnirvana/rules.mk (renamed from keyboards/idobo/keymaps/pathnirvana/rules.mk)0
-rw-r--r--keyboards/idobao/id75/keymaps/revok75/config.h (renamed from keyboards/idobo/keymaps/revok75/config.h)0
-rw-r--r--keyboards/idobao/id75/keymaps/revok75/keymap.c (renamed from keyboards/idobo/keymaps/revok75/keymap.c)0
-rw-r--r--keyboards/idobao/id75/keymaps/revok75/readme.md (renamed from keyboards/idobo/keymaps/revok75/readme.md)0
-rw-r--r--keyboards/idobao/id75/keymaps/revok75/rules.mk (renamed from keyboards/idobo/keymaps/revok75/rules.mk)0
-rw-r--r--keyboards/idobao/id75/keymaps/via/keymap.c (renamed from keyboards/idobo/keymaps/via/keymap.c)0
-rw-r--r--keyboards/idobao/id75/keymaps/via/rules.mk (renamed from keyboards/choc_taro/keymaps/via/rules.mk)0
-rw-r--r--keyboards/idobao/id75/keymaps/xaceofspaidsx/config.h (renamed from keyboards/idobo/keymaps/xaceofspaidsx/config.h)0
-rw-r--r--keyboards/idobao/id75/keymaps/xaceofspaidsx/keymap.c (renamed from keyboards/idobo/keymaps/xaceofspaidsx/keymap.c)0
-rw-r--r--keyboards/idobao/id75/keymaps/xaceofspaidsx/readme.md (renamed from keyboards/idobo/keymaps/xaceofspaidsx/readme.md)0
-rw-r--r--keyboards/idobao/id75/keymaps/xaceofspaidsx/rules.mk (renamed from keyboards/idobo/keymaps/xaceofspaidsx/rules.mk)0
-rw-r--r--keyboards/idobao/id75/readme.md19
-rw-r--r--keyboards/idobao/id75/rules.mk (renamed from keyboards/idobo/rules.mk)0
-rw-r--r--keyboards/idobao/id80/ansi/config.h (renamed from keyboards/id80/ansi/config.h)0
-rw-r--r--keyboards/idobao/id80/ansi/keymaps/default/keymap.c (renamed from keyboards/id80/ansi/keymaps/default/keymap.c)0
-rw-r--r--keyboards/idobao/id80/ansi/keymaps/default/readme.md (renamed from keyboards/id80/ansi/keymaps/default/readme.md)0
-rw-r--r--keyboards/idobao/id80/ansi/keymaps/msf/config.h (renamed from keyboards/id80/ansi/keymaps/msf/config.h)0
-rw-r--r--keyboards/idobao/id80/ansi/keymaps/msf/keymap.c (renamed from keyboards/id80/ansi/keymaps/msf/keymap.c)0
-rw-r--r--keyboards/idobao/id80/ansi/keymaps/msf/readme.md (renamed from keyboards/id80/ansi/keymaps/msf/readme.md)0
-rw-r--r--keyboards/idobao/id80/ansi/keymaps/msf/rules.mk (renamed from keyboards/id80/ansi/keymaps/msf/rules.mk)0
-rw-r--r--keyboards/idobao/id80/ansi/keymaps/via/keymap.c (renamed from keyboards/id80/ansi/keymaps/via/keymap.c)0
-rw-r--r--keyboards/idobao/id80/ansi/keymaps/via/rules.mk (renamed from keyboards/id80/ansi/keymaps/via/rules.mk)0
-rw-r--r--keyboards/idobao/id80/ansi/readme.md (renamed from keyboards/id80/ansi/readme.md)0
-rw-r--r--keyboards/idobao/id80/ansi/rules.mk (renamed from keyboards/id80/ansi/rules.mk)0
-rw-r--r--keyboards/idobao/id80/config.h (renamed from keyboards/id80/config.h)0
-rw-r--r--keyboards/idobao/id80/id80.c (renamed from keyboards/id80/id80.c)0
-rw-r--r--keyboards/idobao/id80/id80.h (renamed from keyboards/id80/id80.h)0
-rw-r--r--keyboards/idobao/id80/info.json (renamed from keyboards/id80/info.json)0
-rw-r--r--keyboards/idobao/id80/iso/config.h (renamed from keyboards/id80/iso/config.h)0
-rw-r--r--keyboards/idobao/id80/iso/keymaps/default/keymap.c (renamed from keyboards/id80/iso/keymaps/default/keymap.c)0
-rw-r--r--keyboards/idobao/id80/iso/keymaps/default/readme.md (renamed from keyboards/id80/iso/keymaps/default/readme.md)0
-rw-r--r--keyboards/idobao/id80/iso/keymaps/via/keymap.c (renamed from keyboards/id80/iso/keymaps/via/keymap.c)0
-rw-r--r--keyboards/idobao/id80/iso/keymaps/via/rules.mk (renamed from keyboards/id80/iso/keymaps/via/rules.mk)0
-rw-r--r--keyboards/idobao/id80/iso/readme.md (renamed from keyboards/id80/iso/readme.md)0
-rw-r--r--keyboards/idobao/id80/iso/rules.mk (renamed from keyboards/id80/iso/rules.mk)0
-rw-r--r--keyboards/idobao/id80/keymaps/rverst/keymap.c (renamed from keyboards/id80/keymaps/rverst/keymap.c)0
-rw-r--r--keyboards/idobao/id80/keymaps/rverst/readme.md (renamed from keyboards/id80/keymaps/rverst/readme.md)0
-rw-r--r--keyboards/idobao/id80/keymaps/rverst/rverst.json (renamed from keyboards/id80/keymaps/rverst/rverst.json)0
-rw-r--r--keyboards/idobao/id80/readme.md27
-rw-r--r--keyboards/idobao/id80/rules.mk24
-rw-r--r--keyboards/idobo/idobo.c16
-rw-r--r--keyboards/idobo/readme.md17
-rw-r--r--keyboards/jisplit89/jisplit89.h22
-rw-r--r--keyboards/jisplit89/readme.md17
-rw-r--r--keyboards/jisplit89/rules.mk22
-rw-r--r--keyboards/just60/readme.md17
-rw-r--r--keyboards/kakunpc/angel17/.noci (renamed from keyboards/bat43/rev1/.noci)0
-rw-r--r--keyboards/kakunpc/angel17/alpha/.noci (renamed from keyboards/bat43/rev2/.noci)0
-rw-r--r--keyboards/kakunpc/angel17/alpha/alpha.c (renamed from keyboards/angel17/alpha/alpha.c)0
-rw-r--r--keyboards/kakunpc/angel17/alpha/alpha.h (renamed from keyboards/angel17/alpha/alpha.h)0
-rw-r--r--keyboards/kakunpc/angel17/alpha/config.h (renamed from keyboards/angel17/alpha/config.h)0
-rw-r--r--keyboards/kakunpc/angel17/alpha/rules.mk (renamed from keyboards/angel17/alpha/rules.mk)0
-rw-r--r--keyboards/kakunpc/angel17/info.json (renamed from keyboards/angel17/info.json)0
-rw-r--r--keyboards/kakunpc/angel17/keymaps/default/keymap.c (renamed from keyboards/angel17/keymaps/default/keymap.c)0
-rw-r--r--keyboards/kakunpc/angel17/keymaps/default/readme.md (renamed from keyboards/angel17/keymaps/default/readme.md)0
-rw-r--r--keyboards/kakunpc/angel17/readme.md15
-rw-r--r--keyboards/kakunpc/angel17/rev1/config.h (renamed from keyboards/angel17/rev1/config.h)0
-rw-r--r--keyboards/kakunpc/angel17/rev1/rev1.c (renamed from keyboards/angel17/rev1/rev1.c)0
-rw-r--r--keyboards/kakunpc/angel17/rev1/rev1.h (renamed from keyboards/angel17/rev1/rev1.h)0
-rw-r--r--keyboards/kakunpc/angel17/rev1/rules.mk (renamed from keyboards/angel17/rev1/rules.mk)0
-rw-r--r--keyboards/kakunpc/angel17/rules.mk22
-rw-r--r--keyboards/kakunpc/angel64/.noci (renamed from keyboards/business_card/.noci)0
-rw-r--r--keyboards/kakunpc/angel64/alpha/.noci (renamed from keyboards/business_card/alpha/.noci)0
-rw-r--r--keyboards/kakunpc/angel64/alpha/alpha.c (renamed from keyboards/angel64/alpha/alpha.c)0
-rw-r--r--keyboards/kakunpc/angel64/alpha/alpha.h (renamed from keyboards/angel64/alpha/alpha.h)0
-rw-r--r--keyboards/kakunpc/angel64/alpha/config.h (renamed from keyboards/angel64/alpha/config.h)0
-rw-r--r--keyboards/kakunpc/angel64/alpha/info.json (renamed from keyboards/angel64/alpha/info.json)0
-rw-r--r--keyboards/kakunpc/angel64/alpha/keymaps/default/keymap.c (renamed from keyboards/angel64/alpha/keymaps/default/keymap.c)0
-rw-r--r--keyboards/kakunpc/angel64/alpha/keymaps/default/readme.md (renamed from keyboards/angel64/alpha/keymaps/default/readme.md)0
-rw-r--r--keyboards/kakunpc/angel64/alpha/matrix.c280
-rw-r--r--keyboards/kakunpc/angel64/alpha/readme.md15
-rw-r--r--keyboards/kakunpc/angel64/alpha/rules.mk (renamed from keyboards/jisplit89/rev1/rules.mk)0
-rw-r--r--keyboards/kakunpc/angel64/readme.md15
-rw-r--r--keyboards/kakunpc/angel64/rev1/config.h (renamed from keyboards/angel64/rev1/config.h)0
-rw-r--r--keyboards/kakunpc/angel64/rev1/info.json (renamed from keyboards/angel64/rev1/info.json)0
-rw-r--r--keyboards/kakunpc/angel64/rev1/keymaps/default/keymap.c (renamed from keyboards/angel64/rev1/keymaps/default/keymap.c)0
-rw-r--r--keyboards/kakunpc/angel64/rev1/keymaps/default/readme.md (renamed from keyboards/angel64/rev1/keymaps/default/readme.md)0
-rw-r--r--keyboards/kakunpc/angel64/rev1/keymaps/kakunpc/config.h (renamed from keyboards/angel64/rev1/keymaps/kakunpc/config.h)0
-rw-r--r--keyboards/kakunpc/angel64/rev1/keymaps/kakunpc/keymap.c (renamed from keyboards/angel64/rev1/keymaps/kakunpc/keymap.c)0
-rw-r--r--keyboards/kakunpc/angel64/rev1/keymaps/kakunpc/readme.md (renamed from keyboards/angel64/rev1/keymaps/kakunpc/readme.md)0
-rw-r--r--keyboards/kakunpc/angel64/rev1/matrix.c280
-rw-r--r--keyboards/kakunpc/angel64/rev1/readme.md15
-rw-r--r--keyboards/kakunpc/angel64/rev1/rev1.c (renamed from keyboards/angel64/rev1/rev1.c)0
-rw-r--r--keyboards/kakunpc/angel64/rev1/rev1.h (renamed from keyboards/angel64/rev1/rev1.h)0
-rw-r--r--keyboards/kakunpc/angel64/rev1/rules.mk (renamed from keyboards/naked48/keymaps/salicylic_with_setta21/rules.mk)0
-rw-r--r--keyboards/kakunpc/angel64/rules.mk25
-rw-r--r--keyboards/kakunpc/business_card/.noci (renamed from keyboards/claw44/.noci)0
-rw-r--r--keyboards/kakunpc/business_card/alpha/.noci (renamed from keyboards/claw44/rev1/.noci)0
-rw-r--r--keyboards/kakunpc/business_card/alpha/alpha.c (renamed from keyboards/business_card/alpha/alpha.c)0
-rw-r--r--keyboards/kakunpc/business_card/alpha/alpha.h (renamed from keyboards/business_card/alpha/alpha.h)0
-rw-r--r--keyboards/kakunpc/business_card/alpha/config.h (renamed from keyboards/business_card/alpha/config.h)0
-rw-r--r--keyboards/kakunpc/business_card/alpha/info.json (renamed from keyboards/business_card/alpha/info.json)0
-rw-r--r--keyboards/kakunpc/business_card/alpha/keymaps/default/config.h (renamed from keyboards/business_card/alpha/keymaps/default/config.h)0
-rw-r--r--keyboards/kakunpc/business_card/alpha/keymaps/default/keymap.c (renamed from keyboards/business_card/alpha/keymaps/default/keymap.c)0
-rw-r--r--keyboards/kakunpc/business_card/alpha/keymaps/default/readme.md (renamed from keyboards/business_card/alpha/keymaps/default/readme.md)0
-rw-r--r--keyboards/kakunpc/business_card/alpha/rules.mk (renamed from keyboards/business_card/alpha/rules.mk)0
-rw-r--r--keyboards/kakunpc/business_card/beta/beta.c (renamed from keyboards/business_card/beta/beta.c)0
-rw-r--r--keyboards/kakunpc/business_card/beta/beta.h (renamed from keyboards/business_card/beta/beta.h)0
-rw-r--r--keyboards/kakunpc/business_card/beta/config.h (renamed from keyboards/business_card/beta/config.h)0
-rw-r--r--keyboards/kakunpc/business_card/beta/info.json (renamed from keyboards/business_card/beta/info.json)0
-rw-r--r--keyboards/kakunpc/business_card/beta/keymaps/default/config.h (renamed from keyboards/business_card/beta/keymaps/default/config.h)0
-rw-r--r--keyboards/kakunpc/business_card/beta/keymaps/default/keymap.c (renamed from keyboards/business_card/beta/keymaps/default/keymap.c)0
-rw-r--r--keyboards/kakunpc/business_card/beta/keymaps/default/readme.md (renamed from keyboards/business_card/beta/keymaps/default/readme.md)0
-rw-r--r--keyboards/kakunpc/business_card/beta/rules.mk (renamed from keyboards/business_card/beta/rules.mk)0
-rw-r--r--keyboards/kakunpc/business_card/business_card.c (renamed from keyboards/business_card/business_card.c)0
-rw-r--r--keyboards/kakunpc/business_card/business_card.h25
-rw-r--r--keyboards/kakunpc/business_card/config.h (renamed from keyboards/business_card/config.h)0
-rw-r--r--keyboards/kakunpc/business_card/readme.md15
-rw-r--r--keyboards/kakunpc/business_card/rules.mk20
-rw-r--r--keyboards/kakunpc/choc_taro/choc_taro.c (renamed from keyboards/choc_taro/choc_taro.c)0
-rw-r--r--keyboards/kakunpc/choc_taro/choc_taro.h (renamed from keyboards/choc_taro/choc_taro.h)0
-rw-r--r--keyboards/kakunpc/choc_taro/config.h (renamed from keyboards/choc_taro/config.h)0
-rw-r--r--keyboards/kakunpc/choc_taro/info.json (renamed from keyboards/choc_taro/info.json)0
-rw-r--r--keyboards/kakunpc/choc_taro/keymaps/default/keymap.c (renamed from keyboards/choc_taro/keymaps/default/keymap.c)0
-rw-r--r--keyboards/kakunpc/choc_taro/keymaps/default/readme.md (renamed from keyboards/choc_taro/keymaps/default/readme.md)0
-rw-r--r--keyboards/kakunpc/choc_taro/keymaps/via/keymap.c (renamed from keyboards/choc_taro/keymaps/via/keymap.c)0
-rw-r--r--keyboards/kakunpc/choc_taro/keymaps/via/readme.md (renamed from keyboards/choc_taro/keymaps/via/readme.md)0
-rw-r--r--keyboards/kakunpc/choc_taro/keymaps/via/rules.mk (renamed from keyboards/claw44/keymaps/via/rules.mk)0
-rw-r--r--keyboards/kakunpc/choc_taro/matrix.c (renamed from keyboards/choc_taro/matrix.c)0
-rw-r--r--keyboards/kakunpc/choc_taro/readme.md15
-rw-r--r--keyboards/kakunpc/choc_taro/rules.mk (renamed from keyboards/choc_taro/rules.mk)0
-rw-r--r--keyboards/kakunpc/rabbit_capture_plan/config.h (renamed from keyboards/rabbit_capture_plan/config.h)0
-rw-r--r--keyboards/kakunpc/rabbit_capture_plan/info.json (renamed from keyboards/rabbit_capture_plan/info.json)0
-rw-r--r--keyboards/kakunpc/rabbit_capture_plan/keymaps/default/keymap.c (renamed from keyboards/rabbit_capture_plan/keymaps/default/keymap.c)0
-rw-r--r--keyboards/kakunpc/rabbit_capture_plan/keymaps/default/readme.md (renamed from keyboards/rabbit_capture_plan/keymaps/default/readme.md)0
-rw-r--r--keyboards/kakunpc/rabbit_capture_plan/keymaps/via/keymap.c (renamed from keyboards/rabbit_capture_plan/keymaps/via/keymap.c)0
-rw-r--r--keyboards/kakunpc/rabbit_capture_plan/keymaps/via/readme.md (renamed from keyboards/rabbit_capture_plan/keymaps/via/readme.md)0
-rw-r--r--keyboards/kakunpc/rabbit_capture_plan/keymaps/via/rules.mk (renamed from keyboards/delilah/keymaps/via/rules.mk)0
-rw-r--r--keyboards/kakunpc/rabbit_capture_plan/rabbit_capture_plan.c (renamed from keyboards/rabbit_capture_plan/rabbit_capture_plan.c)0
-rw-r--r--keyboards/kakunpc/rabbit_capture_plan/rabbit_capture_plan.h (renamed from keyboards/rabbit_capture_plan/rabbit_capture_plan.h)0
-rw-r--r--keyboards/kakunpc/rabbit_capture_plan/readme.md19
-rw-r--r--keyboards/kakunpc/rabbit_capture_plan/rules.mk (renamed from keyboards/rabbit_capture_plan/rules.mk)0
-rw-r--r--keyboards/kakunpc/suihankey/alpha/alpha.c (renamed from keyboards/suihankey/alpha/alpha.c)0
-rw-r--r--keyboards/kakunpc/suihankey/alpha/alpha.h (renamed from keyboards/suihankey/alpha/alpha.h)0
-rw-r--r--keyboards/kakunpc/suihankey/alpha/config.h (renamed from keyboards/suihankey/alpha/config.h)0
-rw-r--r--keyboards/kakunpc/suihankey/alpha/info.json (renamed from keyboards/suihankey/alpha/info.json)0
-rw-r--r--keyboards/kakunpc/suihankey/alpha/keymaps/default/keymap.c (renamed from keyboards/suihankey/alpha/keymaps/default/keymap.c)0
-rw-r--r--keyboards/kakunpc/suihankey/alpha/keymaps/default/readme.md (renamed from keyboards/suihankey/alpha/keymaps/default/readme.md)0
-rw-r--r--keyboards/kakunpc/suihankey/alpha/readme.md (renamed from keyboards/suihankey/alpha/readme.md)0
-rw-r--r--keyboards/kakunpc/suihankey/alpha/rules.mk (renamed from keyboards/reviung34/keymaps/default_rgb/rules.mk)0
-rw-r--r--keyboards/kakunpc/suihankey/readme.md18
-rw-r--r--keyboards/kakunpc/suihankey/rev1/config.h (renamed from keyboards/suihankey/rev1/config.h)0
-rw-r--r--keyboards/kakunpc/suihankey/rev1/info.json (renamed from keyboards/suihankey/rev1/info.json)0
-rw-r--r--keyboards/kakunpc/suihankey/rev1/keymaps/default/keymap.c (renamed from keyboards/suihankey/rev1/keymaps/default/keymap.c)0
-rw-r--r--keyboards/kakunpc/suihankey/rev1/keymaps/default/readme.md (renamed from keyboards/suihankey/rev1/keymaps/default/readme.md)0
-rw-r--r--keyboards/kakunpc/suihankey/rev1/readme.md (renamed from keyboards/suihankey/rev1/readme.md)0
-rw-r--r--keyboards/kakunpc/suihankey/rev1/rev1.c (renamed from keyboards/suihankey/rev1/rev1.c)0
-rw-r--r--keyboards/kakunpc/suihankey/rev1/rev1.h (renamed from keyboards/suihankey/rev1/rev1.h)0
-rw-r--r--keyboards/kakunpc/suihankey/rev1/rules.mk (renamed from keyboards/reviung34/keymaps/default_rgb2u/rules.mk)0
-rw-r--r--keyboards/kakunpc/suihankey/rules.mk23
-rw-r--r--keyboards/kakunpc/suihankey/split/.noci (renamed from keyboards/cu75/.noci)0
-rw-r--r--keyboards/kakunpc/suihankey/split/alpha/.noci (renamed from keyboards/getta25/.noci)0
-rw-r--r--keyboards/kakunpc/suihankey/split/alpha/alpha.c (renamed from keyboards/suihankey/split/alpha/alpha.c)0
-rw-r--r--keyboards/kakunpc/suihankey/split/alpha/alpha.h (renamed from keyboards/suihankey/split/alpha/alpha.h)0
-rw-r--r--keyboards/kakunpc/suihankey/split/alpha/config.h (renamed from keyboards/suihankey/split/alpha/config.h)0
-rw-r--r--keyboards/kakunpc/suihankey/split/alpha/readme.md18
-rw-r--r--keyboards/kakunpc/suihankey/split/alpha/rules.mk (renamed from keyboards/reviung39/keymaps/default/rules.mk)0
-rw-r--r--keyboards/kakunpc/suihankey/split/info.json (renamed from keyboards/suihankey/split/info.json)0
-rw-r--r--keyboards/kakunpc/suihankey/split/keymaps/default/keymap.c (renamed from keyboards/suihankey/split/keymaps/default/keymap.c)0
-rw-r--r--keyboards/kakunpc/suihankey/split/keymaps/default/readme.md (renamed from keyboards/suihankey/split/keymaps/default/readme.md)0
-rw-r--r--keyboards/kakunpc/suihankey/split/readme.md18
-rw-r--r--keyboards/kakunpc/suihankey/split/rev1/config.h (renamed from keyboards/suihankey/split/rev1/config.h)0
-rw-r--r--keyboards/kakunpc/suihankey/split/rev1/readme.md18
-rw-r--r--keyboards/kakunpc/suihankey/split/rev1/rev1.c (renamed from keyboards/suihankey/split/rev1/rev1.c)0
-rw-r--r--keyboards/kakunpc/suihankey/split/rev1/rev1.h (renamed from keyboards/suihankey/split/rev1/rev1.h)0
-rw-r--r--keyboards/kakunpc/suihankey/split/rev1/rules.mk (renamed from keyboards/suihankey/split/rev1/rules.mk)0
-rw-r--r--keyboards/kakunpc/suihankey/split/rules.mk4
-rw-r--r--keyboards/kakunpc/thedogkeyboard/config.h (renamed from keyboards/thedogkeyboard/config.h)0
-rw-r--r--keyboards/kakunpc/thedogkeyboard/info.json (renamed from keyboards/thedogkeyboard/info.json)0
-rw-r--r--keyboards/kakunpc/thedogkeyboard/keymaps/default/keymap.c (renamed from keyboards/thedogkeyboard/keymaps/default/keymap.c)0
-rw-r--r--keyboards/kakunpc/thedogkeyboard/keymaps/default/readme.md (renamed from keyboards/thedogkeyboard/keymaps/default/readme.md)0
-rw-r--r--keyboards/kakunpc/thedogkeyboard/keymaps/kakunpc/keymap.c (renamed from keyboards/thedogkeyboard/keymaps/kakunpc/keymap.c)0
-rw-r--r--keyboards/kakunpc/thedogkeyboard/keymaps/kakunpc/readme.md (renamed from keyboards/thedogkeyboard/keymaps/kakunpc/readme.md)0
-rw-r--r--keyboards/kakunpc/thedogkeyboard/matrix.c280
-rw-r--r--keyboards/kakunpc/thedogkeyboard/readme.md15
-rw-r--r--keyboards/kakunpc/thedogkeyboard/rules.mk (renamed from keyboards/thedogkeyboard/rules.mk)0
-rw-r--r--keyboards/kakunpc/thedogkeyboard/thedogkeyboard.c (renamed from keyboards/thedogkeyboard/thedogkeyboard.c)0
-rw-r--r--keyboards/kakunpc/thedogkeyboard/thedogkeyboard.h (renamed from keyboards/thedogkeyboard/thedogkeyboard.h)0
-rw-r--r--keyboards/kelowna/rgb64/readme.md17
-rw-r--r--keyboards/kinesis/alvicstep/matrix.c6
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/bm65hsrgb_iso.c59
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/config.h (renamed from keyboards/kprepublic/bm65hsrgb_iso/config.h)0
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/info.json (renamed from keyboards/kprepublic/bm65hsrgb_iso/info.json)0
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/config.h (renamed from keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/config.h)0
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/keymap.c (renamed from keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/keymap.c)0
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/keymap.h (renamed from keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/keymap.h)0
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/readme.md (renamed from keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/readme.md)0
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/rules.mk (renamed from keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/rules.mk)0
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/default/keymap.c (renamed from keyboards/kprepublic/bm65hsrgb_iso/keymaps/default/keymap.c)0
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/keymap.c (renamed from keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/keymap.c)0
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/readme.md (renamed from keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/readme.md)0
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/rules.mk (renamed from keyboards/7skb/keymaps/via/rules.mk)0
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/readme.md (renamed from keyboards/kprepublic/bm65hsrgb_iso/readme.md)0
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/rev1.c59
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/rev1.h (renamed from keyboards/kprepublic/bm65hsrgb_iso/bm65hsrgb_iso.h)0
-rw-r--r--keyboards/kprepublic/bm65hsrgb_iso/rev1/rules.mk (renamed from keyboards/kprepublic/bm65hsrgb_iso/rules.mk)0
-rw-r--r--keyboards/kprepublic/bm68hsrgb/bm68hsrgb.c52
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/config.h (renamed from keyboards/kprepublic/bm68hsrgb/config.h)0
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/info.json (renamed from keyboards/kprepublic/bm68hsrgb/info.json)0
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/keymaps/default/keymap.c (renamed from keyboards/kprepublic/bm68hsrgb/keymaps/default/keymap.c)0
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/keymaps/default/readme.md (renamed from keyboards/kprepublic/bm68hsrgb/keymaps/default/readme.md)0
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/config.h (renamed from keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/config.h)0
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/keymap.c (renamed from keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/keymap.c)0
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/keymap.h (renamed from keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/keymap.h)0
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/readme.md (renamed from keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/readme.md)0
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/keymap.c (renamed from keyboards/kprepublic/bm68hsrgb/keymaps/via/keymap.c)0
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/readme.md (renamed from keyboards/kprepublic/bm68hsrgb/keymaps/via/readme.md)0
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/rules.mk (renamed from keyboards/geminate60/keymaps/via/rules.mk)0
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/readme.md (renamed from keyboards/kprepublic/bm68hsrgb/readme.md)0
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/rev1.c52
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/rev1.h (renamed from keyboards/kprepublic/bm68hsrgb/bm68hsrgb.h)0
-rw-r--r--keyboards/kprepublic/bm68hsrgb/rev1/rules.mk (renamed from keyboards/kprepublic/bm68hsrgb/rules.mk)0
-rw-r--r--keyboards/lck75/readme.md17
-rw-r--r--keyboards/lefishe/readme.md24
-rw-r--r--keyboards/ls_60/readme.md17
-rw-r--r--keyboards/lyso1/lck75/config.h (renamed from keyboards/lck75/config.h)0
-rw-r--r--keyboards/lyso1/lck75/info.json (renamed from keyboards/lck75/info.json)0
-rw-r--r--keyboards/lyso1/lck75/keymaps/7u/keymap.c (renamed from keyboards/lck75/keymaps/7u/keymap.c)0
-rw-r--r--keyboards/lyso1/lck75/keymaps/7u_iso/keymap.c (renamed from keyboards/lck75/keymaps/7u_iso/keymap.c)0
-rw-r--r--keyboards/lyso1/lck75/keymaps/7u_sbs/keymap.c (renamed from keyboards/lck75/keymaps/7u_sbs/keymap.c)0
-rw-r--r--keyboards/lyso1/lck75/keymaps/default/keymap.c (renamed from keyboards/lck75/keymaps/default/keymap.c)0
-rw-r--r--keyboards/lyso1/lck75/keymaps/iso/keymap.c (renamed from keyboards/lck75/keymaps/iso/keymap.c)0
-rw-r--r--keyboards/lyso1/lck75/keymaps/iso_sbs/keymap.c (renamed from keyboards/lck75/keymaps/iso_sbs/keymap.c)0
-rw-r--r--keyboards/lyso1/lck75/keymaps/sbs/keymap.c (renamed from keyboards/lck75/keymaps/sbs/keymap.c)0
-rw-r--r--keyboards/lyso1/lck75/keymaps/via/keymap.c (renamed from keyboards/lck75/keymaps/via/keymap.c)0
-rw-r--r--keyboards/lyso1/lck75/keymaps/via/rules.mk (renamed from keyboards/lck75/keymaps/via/rules.mk)0
-rw-r--r--keyboards/lyso1/lck75/lck75.c (renamed from keyboards/lck75/lck75.c)0
-rw-r--r--keyboards/lyso1/lck75/lck75.h (renamed from keyboards/lck75/lck75.h)0
-rw-r--r--keyboards/lyso1/lck75/readme.md17
-rw-r--r--keyboards/lyso1/lck75/rules.mk (renamed from keyboards/lck75/rules.mk)0
-rw-r--r--keyboards/lyso1/lefishe/config.h (renamed from keyboards/lefishe/config.h)0
-rw-r--r--keyboards/lyso1/lefishe/info.json (renamed from keyboards/lefishe/info.json)0
-rw-r--r--keyboards/lyso1/lefishe/keymaps/default/keymap.c (renamed from keyboards/lefishe/keymaps/default/keymap.c)0
-rw-r--r--keyboards/lyso1/lefishe/keymaps/wk_sbs/keymap.c (renamed from keyboards/lefishe/keymaps/wk_sbs/keymap.c)0
-rw-r--r--keyboards/lyso1/lefishe/keymaps/wkl/keymap.c (renamed from keyboards/lefishe/keymaps/wkl/keymap.c)0
-rw-r--r--keyboards/lyso1/lefishe/keymaps/wkl_sbs/keymap.c (renamed from keyboards/lefishe/keymaps/wkl_sbs/keymap.c)0
-rw-r--r--keyboards/lyso1/lefishe/lefishe.c (renamed from keyboards/lefishe/lefishe.c)0
-rw-r--r--keyboards/lyso1/lefishe/lefishe.h (renamed from keyboards/lefishe/lefishe.h)0
-rw-r--r--keyboards/lyso1/lefishe/readme.md24
-rw-r--r--keyboards/lyso1/lefishe/rules.mk (renamed from keyboards/lefishe/rules.mk)0
-rw-r--r--keyboards/marksard/treadstone32/info.json (renamed from keyboards/treadstone32/info.json)0
-rw-r--r--keyboards/marksard/treadstone32/keymaps/default/config.h (renamed from keyboards/treadstone32/keymaps/default/config.h)0
-rw-r--r--keyboards/marksard/treadstone32/keymaps/default/keymap.c (renamed from keyboards/treadstone32/keymaps/default/keymap.c)0
-rw-r--r--keyboards/marksard/treadstone32/keymaps/default/readme.md (renamed from keyboards/treadstone32/keymaps/default/readme.md)0
-rw-r--r--keyboards/marksard/treadstone32/keymaps/default/readme_jp.md (renamed from keyboards/treadstone32/keymaps/default/readme_jp.md)0
-rw-r--r--keyboards/marksard/treadstone32/keymaps/default/rules.mk (renamed from keyboards/treadstone32/keymaps/default/rules.mk)0
-rw-r--r--keyboards/marksard/treadstone32/keymaps/like_jis/config.h (renamed from keyboards/treadstone32/keymaps/like_jis/config.h)0
-rw-r--r--keyboards/marksard/treadstone32/keymaps/like_jis/keymap.c (renamed from keyboards/treadstone32/keymaps/like_jis/keymap.c)0
-rw-r--r--keyboards/marksard/treadstone32/keymaps/like_jis/readme.md (renamed from keyboards/treadstone32/keymaps/like_jis/readme.md)0
-rw-r--r--keyboards/marksard/treadstone32/keymaps/like_jis/readme_jp.md (renamed from keyboards/treadstone32/keymaps/like_jis/readme_jp.md)0
-rw-r--r--keyboards/marksard/treadstone32/keymaps/like_jis/rules.mk (renamed from keyboards/treadstone32/keymaps/like_jis/rules.mk)0
-rw-r--r--keyboards/marksard/treadstone32/lite/.noci (renamed from keyboards/jisplit89/.noci)0
-rw-r--r--keyboards/marksard/treadstone32/lite/config.h (renamed from keyboards/treadstone32/lite/config.h)0
-rw-r--r--keyboards/marksard/treadstone32/lite/lite.c (renamed from keyboards/treadstone32/lite/lite.c)0
-rw-r--r--keyboards/marksard/treadstone32/lite/lite.h (renamed from keyboards/treadstone32/lite/lite.h)0
-rw-r--r--keyboards/marksard/treadstone32/lite/rules.mk (renamed from keyboards/treadstone32/lite/rules.mk)0
-rw-r--r--keyboards/marksard/treadstone32/readme.md21
-rw-r--r--keyboards/marksard/treadstone32/rev1/.noci (renamed from keyboards/naked48/.noci)0
-rw-r--r--keyboards/marksard/treadstone32/rev1/config.h (renamed from keyboards/treadstone32/rev1/config.h)0
-rw-r--r--keyboards/marksard/treadstone32/rev1/rev1.c (renamed from keyboards/treadstone32/rev1/rev1.c)0
-rw-r--r--keyboards/marksard/treadstone32/rev1/rev1.h (renamed from keyboards/treadstone32/rev1/rev1.h)0
-rw-r--r--keyboards/marksard/treadstone32/rev1/rules.mk (renamed from keyboards/treadstone32/rev1/rules.mk)0
-rw-r--r--keyboards/marksard/treadstone32/rules.mk18
-rw-r--r--keyboards/marksard/treadstone48/.noci (renamed from keyboards/naked64/.noci)0
-rw-r--r--keyboards/marksard/treadstone48/common/glcdfont.c (renamed from keyboards/treadstone48/common/glcdfont.c)0
-rw-r--r--keyboards/marksard/treadstone48/common/oled_helper.c (renamed from keyboards/treadstone48/common/oled_helper.c)0
-rw-r--r--keyboards/marksard/treadstone48/common/oled_helper.h (renamed from keyboards/treadstone48/common/oled_helper.h)0
-rw-r--r--keyboards/marksard/treadstone48/keymaps/default/config.h49
-rw-r--r--keyboards/marksard/treadstone48/keymaps/default/keymap.c (renamed from keyboards/treadstone48/keymaps/default/keymap.c)0
-rw-r--r--keyboards/marksard/treadstone48/keymaps/default/readme.md (renamed from keyboards/treadstone48/keymaps/default/readme.md)0
-rw-r--r--keyboards/marksard/treadstone48/keymaps/default/readme_jp.md (renamed from keyboards/treadstone48/keymaps/default/readme_jp.md)0
-rw-r--r--keyboards/marksard/treadstone48/keymaps/default/rules.mk (renamed from keyboards/treadstone48/keymaps/default/rules.mk)0
-rw-r--r--keyboards/marksard/treadstone48/keymaps/like_jis/config.h49
-rw-r--r--keyboards/marksard/treadstone48/keymaps/like_jis/keymap.c (renamed from keyboards/treadstone48/keymaps/like_jis/keymap.c)0
-rw-r--r--keyboards/marksard/treadstone48/keymaps/like_jis/readme.md (renamed from keyboards/treadstone48/keymaps/like_jis/readme.md)0
-rw-r--r--keyboards/marksard/treadstone48/keymaps/like_jis/readme_jp.md (renamed from keyboards/treadstone48/keymaps/like_jis/readme_jp.md)0
-rw-r--r--keyboards/marksard/treadstone48/keymaps/like_jis/rules.mk (renamed from keyboards/treadstone48/keymaps/like_jis/rules.mk)0
-rw-r--r--keyboards/marksard/treadstone48/readme.md21
-rw-r--r--keyboards/marksard/treadstone48/rev1/.noci (renamed from keyboards/setta21/rev1/.noci)0
-rw-r--r--keyboards/marksard/treadstone48/rev1/config.h (renamed from keyboards/treadstone48/rev1/config.h)0
-rw-r--r--keyboards/marksard/treadstone48/rev1/info.json (renamed from keyboards/treadstone48/rev1/info.json)0
-rw-r--r--keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/config.h51
-rw-r--r--keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/keymap.c (renamed from keyboards/treadstone48/rev1/keymaps/like_jis_rs/keymap.c)0
-rw-r--r--keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/readme.md (renamed from keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme.md)0
-rw-r--r--keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/readme_jp.md (renamed from keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme_jp.md)0
-rw-r--r--keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/rules.mk (renamed from keyboards/treadstone48/rev1/keymaps/like_jis_rs/rules.mk)0
-rw-r--r--keyboards/marksard/treadstone48/rev1/rev1.c (renamed from keyboards/treadstone48/rev1/rev1.c)0
-rw-r--r--keyboards/marksard/treadstone48/rev1/rev1.h (renamed from keyboards/treadstone48/rev1/rev1.h)0
-rw-r--r--keyboards/marksard/treadstone48/rev1/rules.mk (renamed from keyboards/getta25/rev1/rules.mk)0
-rw-r--r--keyboards/marksard/treadstone48/rev2/config.h (renamed from keyboards/treadstone48/rev2/config.h)0
-rw-r--r--keyboards/marksard/treadstone48/rev2/info.json (renamed from keyboards/treadstone48/rev2/info.json)0
-rw-r--r--keyboards/marksard/treadstone48/rev2/rev2.c (renamed from keyboards/treadstone48/rev2/rev2.c)0
-rw-r--r--keyboards/marksard/treadstone48/rev2/rev2.h (renamed from keyboards/treadstone48/rev2/rev2.h)0
-rw-r--r--keyboards/marksard/treadstone48/rev2/rules.mk (renamed from keyboards/naked48/keymaps/default/rules.mk)0
-rw-r--r--keyboards/marksard/treadstone48/rules.mk25
-rw-r--r--keyboards/massdrop/alt/rules.mk3
-rw-r--r--keyboards/massdrop/ctrl/rules.mk3
-rw-r--r--keyboards/matrix/abelx/boards/abelx_bd/board.c3
-rw-r--r--keyboards/matrix/abelx/bootloader_defs.h7
-rw-r--r--keyboards/matrix/abelx/rules.mk8
-rw-r--r--keyboards/matrix/m20add/bootloader_defs.h5
-rw-r--r--keyboards/matrix/m20add/m20add.c19
-rw-r--r--keyboards/matrix/noah/bootloader_defs.h5
-rw-r--r--keyboards/mechlovin/mechlovin9/rev1/rules.mk3
-rw-r--r--keyboards/mechlovin/olly/jf/rules.mk4
-rw-r--r--keyboards/mechmini/v1/rules.mk2
-rw-r--r--keyboards/meira/matrix.c6
-rw-r--r--keyboards/mitosis/config.h9
-rw-r--r--keyboards/mitosis/matrix.c126
-rw-r--r--keyboards/mitosis/rules.mk21
-rw-r--r--keyboards/mode/m65s/rules.mk5
-rw-r--r--keyboards/nacly/splitreus62/config.h (renamed from keyboards/splitreus62/config.h)0
-rw-r--r--keyboards/nacly/splitreus62/info.json (renamed from keyboards/splitreus62/info.json)0
-rw-r--r--keyboards/nacly/splitreus62/keymaps/default/keymap.c (renamed from keyboards/splitreus62/keymaps/default/keymap.c)0
-rw-r--r--keyboards/nacly/splitreus62/keymaps/scheiklp/config.h (renamed from keyboards/splitreus62/keymaps/scheiklp/config.h)0
-rw-r--r--keyboards/nacly/splitreus62/keymaps/scheiklp/keymap.c (renamed from keyboards/splitreus62/keymaps/scheiklp/keymap.c)0
-rw-r--r--keyboards/nacly/splitreus62/keymaps/scheiklp/rules.mk (renamed from keyboards/splitreus62/keymaps/scheiklp/rules.mk)0
-rw-r--r--keyboards/nacly/splitreus62/readme.md13
-rw-r--r--keyboards/nacly/splitreus62/rules.mk (renamed from keyboards/splitreus62/rules.mk)0
-rw-r--r--keyboards/nacly/splitreus62/splitreus62.c (renamed from keyboards/splitreus62/splitreus62.c)0
-rw-r--r--keyboards/nacly/splitreus62/splitreus62.h (renamed from keyboards/splitreus62/splitreus62.h)0
-rw-r--r--keyboards/nacly/ua62/config.h (renamed from keyboards/ua62/config.h)0
-rw-r--r--keyboards/nacly/ua62/info.json (renamed from keyboards/ua62/info.json)0
-rw-r--r--keyboards/nacly/ua62/keymaps/default/keymap.c (renamed from keyboards/ua62/keymaps/default/keymap.c)0
-rw-r--r--keyboards/nacly/ua62/readme.md14
-rw-r--r--keyboards/nacly/ua62/rules.mk (renamed from keyboards/ua62/rules.mk)0
-rw-r--r--keyboards/nacly/ua62/ua62.c (renamed from keyboards/ua62/ua62.c)0
-rw-r--r--keyboards/nacly/ua62/ua62.h (renamed from keyboards/ua62/ua62.h)0
-rw-r--r--keyboards/nafuda/readme.md17
-rw-r--r--keyboards/naiping/np64/readme.md17
-rw-r--r--keyboards/naiping/nphhkb/readme.md17
-rw-r--r--keyboards/naiping/npminila/readme.md17
-rw-r--r--keyboards/naked48/naked48.h24
-rw-r--r--keyboards/naked48/readme.md18
-rw-r--r--keyboards/naked48/rules.mk24
-rw-r--r--keyboards/naked60/naked60.h24
-rw-r--r--keyboards/naked60/readme.md18
-rw-r--r--keyboards/naked60/rules.mk22
-rw-r--r--keyboards/naked64/naked64.h7
-rw-r--r--keyboards/naked64/readme.md18
-rw-r--r--keyboards/naked64/rules.mk24
-rw-r--r--keyboards/nek_type_a/matrix.c8
-rw-r--r--keyboards/nk1/readme.md32
-rwxr-xr-xkeyboards/nk65/readme.md39
-rwxr-xr-xkeyboards/nk87/readme.md34
-rw-r--r--keyboards/nknl7en/readme.md17
-rw-r--r--keyboards/nknl7jp/readme.md17
-rw-r--r--keyboards/novelkeys/nk1/config.h (renamed from keyboards/nk1/config.h)0
-rwxr-xr-xkeyboards/novelkeys/nk1/info.json (renamed from keyboards/nk1/info.json)0
-rw-r--r--keyboards/novelkeys/nk1/keymaps/default/keymap.c (renamed from keyboards/nk1/keymaps/default/keymap.c)0
-rw-r--r--keyboards/novelkeys/nk1/keymaps/default/readme.md (renamed from keyboards/nk1/keymaps/default/readme.md)0
-rw-r--r--keyboards/novelkeys/nk1/keymaps/via/keymap.c (renamed from keyboards/nk1/keymaps/via/keymap.c)0
-rw-r--r--keyboards/novelkeys/nk1/keymaps/via/readme.md (renamed from keyboards/nk1/keymaps/via/readme.md)0
-rw-r--r--keyboards/novelkeys/nk1/keymaps/via/rules.mk (renamed from keyboards/7splus/keymaps/via/rules.mk)0
-rw-r--r--keyboards/novelkeys/nk1/nk1.c (renamed from keyboards/nk1/nk1.c)0
-rw-r--r--keyboards/novelkeys/nk1/nk1.h (renamed from keyboards/nk1/nk1.h)0
-rw-r--r--keyboards/novelkeys/nk1/readme.md32
-rw-r--r--keyboards/novelkeys/nk1/rules.mk (renamed from keyboards/nk1/rules.mk)0
-rwxr-xr-xkeyboards/novelkeys/nk65/config.h (renamed from keyboards/nk65/config.h)0
-rw-r--r--keyboards/novelkeys/nk65/halconf.h (renamed from keyboards/nk65/halconf.h)0
-rwxr-xr-xkeyboards/novelkeys/nk65/info.json (renamed from keyboards/nk65/info.json)0
-rwxr-xr-xkeyboards/novelkeys/nk65/keymaps/default/keymap.c (renamed from keyboards/nk65/keymaps/default/keymap.c)0
-rwxr-xr-xkeyboards/novelkeys/nk65/keymaps/default/readme.md (renamed from keyboards/nk65/keymaps/default/readme.md)0
-rwxr-xr-xkeyboards/novelkeys/nk65/keymaps/madhatter/keymap.c (renamed from keyboards/nk65/keymaps/madhatter/keymap.c)0
-rwxr-xr-xkeyboards/novelkeys/nk65/keymaps/via/keymap.c (renamed from keyboards/nk65/keymaps/via/keymap.c)0
-rwxr-xr-xkeyboards/novelkeys/nk65/keymaps/via/readme.md (renamed from keyboards/nk65/keymaps/via/readme.md)0
-rwxr-xr-x[-rw-r--r--]keyboards/novelkeys/nk65/keymaps/via/rules.mk (renamed from keyboards/gingham/keymaps/via/rules.mk)0
-rw-r--r--keyboards/novelkeys/nk65/mcuconf.h (renamed from keyboards/nk65/mcuconf.h)0
-rwxr-xr-xkeyboards/novelkeys/nk65/nk65.c (renamed from keyboards/nk65/nk65.c)0
-rwxr-xr-xkeyboards/novelkeys/nk65/nk65.h (renamed from keyboards/nk65/nk65.h)0
-rwxr-xr-xkeyboards/novelkeys/nk65/readme.md39
-rwxr-xr-xkeyboards/novelkeys/nk65/rules.mk (renamed from keyboards/nk65/rules.mk)0
-rwxr-xr-xkeyboards/novelkeys/nk65/v1_4/config.h (renamed from keyboards/nk65/v1_4/config.h)0
-rwxr-xr-xkeyboards/novelkeys/nk65/v1_4/readme.md (renamed from keyboards/nk65/v1_4/readme.md)0
-rwxr-xr-xkeyboards/novelkeys/nk65/v1_4/rules.mk (renamed from keyboards/nk65/v1_4/rules.mk)0
-rwxr-xr-xkeyboards/novelkeys/nk87/config.h (renamed from keyboards/nk87/config.h)0
-rw-r--r--keyboards/novelkeys/nk87/halconf.h (renamed from keyboards/nk87/halconf.h)0
-rwxr-xr-xkeyboards/novelkeys/nk87/info.json (renamed from keyboards/nk87/info.json)0
-rwxr-xr-xkeyboards/novelkeys/nk87/keymaps/default/keymap.c (renamed from keyboards/nk87/keymaps/default/keymap.c)0
-rwxr-xr-xkeyboards/novelkeys/nk87/keymaps/default/readme.md (renamed from keyboards/nk87/keymaps/default/readme.md)0
-rwxr-xr-xkeyboards/novelkeys/nk87/keymaps/via/keymap.c (renamed from keyboards/nk87/keymaps/via/keymap.c)0
-rwxr-xr-xkeyboards/novelkeys/nk87/keymaps/via/readme.md (renamed from keyboards/nk87/keymaps/via/readme.md)0
-rwxr-xr-x[-rw-r--r--]keyboards/novelkeys/nk87/keymaps/via/rules.mk (renamed from keyboards/idobo/keymaps/via/rules.mk)0
-rw-r--r--keyboards/novelkeys/nk87/mcuconf.h (renamed from keyboards/nk87/mcuconf.h)0
-rwxr-xr-xkeyboards/novelkeys/nk87/nk87.c (renamed from keyboards/nk87/nk87.c)0
-rwxr-xr-xkeyboards/novelkeys/nk87/nk87.h (renamed from keyboards/nk87/nk87.h)0
-rwxr-xr-xkeyboards/novelkeys/nk87/readme.md34
-rwxr-xr-xkeyboards/novelkeys/nk87/rules.mk (renamed from keyboards/nk87/rules.mk)0
-rwxr-xr-xkeyboards/novelkeys/novelpad/config.h (renamed from keyboards/novelpad/config.h)0
-rw-r--r--keyboards/novelkeys/novelpad/info.json (renamed from keyboards/novelpad/info.json)0
-rwxr-xr-xkeyboards/novelkeys/novelpad/keymaps/0xdec/keymap.c (renamed from keyboards/novelpad/keymaps/0xdec/keymap.c)0
-rwxr-xr-xkeyboards/novelkeys/novelpad/keymaps/default/keymap.c (renamed from keyboards/novelpad/keymaps/default/keymap.c)0
-rwxr-xr-xkeyboards/novelkeys/novelpad/novelpad.c (renamed from keyboards/novelpad/novelpad.c)0
-rwxr-xr-xkeyboards/novelkeys/novelpad/novelpad.h (renamed from keyboards/novelpad/novelpad.h)0
-rw-r--r--keyboards/novelkeys/novelpad/readme.md15
-rwxr-xr-xkeyboards/novelkeys/novelpad/rules.mk (renamed from keyboards/novelpad/rules.mk)0
-rw-r--r--keyboards/novelpad/readme.md15
-rw-r--r--keyboards/obosob/arch_36/arch_36.c (renamed from keyboards/arch_36/arch_36.c)0
-rw-r--r--keyboards/obosob/arch_36/arch_36.h (renamed from keyboards/arch_36/arch_36.h)0
-rw-r--r--keyboards/obosob/arch_36/config.h (renamed from keyboards/arch_36/config.h)0
-rw-r--r--keyboards/obosob/arch_36/info.json (renamed from keyboards/arch_36/info.json)0
-rw-r--r--keyboards/obosob/arch_36/keymaps/default/keymap.c (renamed from keyboards/arch_36/keymaps/default/keymap.c)0
-rw-r--r--keyboards/obosob/arch_36/keymaps/obosob/config.h (renamed from keyboards/arch_36/keymaps/obosob/config.h)0
-rw-r--r--keyboards/obosob/arch_36/keymaps/obosob/keymap.c (renamed from keyboards/arch_36/keymaps/obosob/keymap.c)0
-rw-r--r--keyboards/obosob/arch_36/keymaps/obosob/readme.md (renamed from keyboards/arch_36/keymaps/obosob/readme.md)0
-rw-r--r--keyboards/obosob/arch_36/keymaps/obosob/rules.mk (renamed from keyboards/arch_36/keymaps/obosob/rules.mk)0
-rw-r--r--keyboards/obosob/arch_36/readme.md16
-rw-r--r--keyboards/obosob/arch_36/rules.mk (renamed from keyboards/arch_36/rules.mk)0
-rw-r--r--keyboards/obosob/steal_this_keyboard/config.h (renamed from keyboards/steal_this_keyboard/config.h)0
-rw-r--r--keyboards/obosob/steal_this_keyboard/info.json (renamed from keyboards/steal_this_keyboard/info.json)0
-rw-r--r--keyboards/obosob/steal_this_keyboard/keymaps/default/config.h (renamed from keyboards/steal_this_keyboard/keymaps/default/config.h)0
-rw-r--r--keyboards/obosob/steal_this_keyboard/keymaps/default/keymap.c (renamed from keyboards/steal_this_keyboard/keymaps/default/keymap.c)0
-rw-r--r--keyboards/obosob/steal_this_keyboard/readme.md11
-rw-r--r--keyboards/obosob/steal_this_keyboard/rules.mk (renamed from keyboards/steal_this_keyboard/rules.mk)0
-rw-r--r--keyboards/obosob/steal_this_keyboard/steal_this_keyboard.c (renamed from keyboards/steal_this_keyboard/steal_this_keyboard.c)0
-rw-r--r--keyboards/obosob/steal_this_keyboard/steal_this_keyboard.h (renamed from keyboards/steal_this_keyboard/steal_this_keyboard.h)0
-rw-r--r--keyboards/owl8/readme.md19
-rw-r--r--keyboards/planck/keymaps/thermal_printer/config.h12
-rw-r--r--keyboards/ploopyco/mouse/readme.md2
-rw-r--r--keyboards/ploopyco/trackball/readme.md4
-rw-r--r--keyboards/ploopyco/trackball/trackball.c2
-rw-r--r--keyboards/prototypist/allison/allison.c (renamed from keyboards/allison/allison.c)0
-rw-r--r--keyboards/prototypist/allison/allison.h (renamed from keyboards/allison/allison.h)0
-rw-r--r--keyboards/prototypist/allison/config.h (renamed from keyboards/allison/config.h)0
-rw-r--r--keyboards/prototypist/allison/info.json (renamed from keyboards/allison/info.json)0
-rw-r--r--keyboards/prototypist/allison/keymaps/default/keymap.c (renamed from keyboards/allison/keymaps/default/keymap.c)0
-rw-r--r--keyboards/prototypist/allison/keymaps/default/readme.md (renamed from keyboards/allison/keymaps/default/readme.md)0
-rw-r--r--keyboards/prototypist/allison/keymaps/via/keymap.c (renamed from keyboards/allison/keymaps/via/keymap.c)0
-rw-r--r--keyboards/prototypist/allison/keymaps/via/readme.md (renamed from keyboards/allison/keymaps/via/readme.md)0
-rw-r--r--keyboards/prototypist/allison/keymaps/via/rules.mk (renamed from keyboards/jisplit89/keymaps/via/rules.mk)0
-rw-r--r--keyboards/prototypist/allison/readme.md15
-rw-r--r--keyboards/prototypist/allison/rules.mk (renamed from keyboards/allison/rules.mk)0
-rw-r--r--keyboards/prototypist/allison_numpad/allison_numpad.c (renamed from keyboards/allison_numpad/allison_numpad.c)0
-rw-r--r--keyboards/prototypist/allison_numpad/allison_numpad.h (renamed from keyboards/allison_numpad/allison_numpad.h)0
-rw-r--r--keyboards/prototypist/allison_numpad/config.h (renamed from keyboards/allison_numpad/config.h)0
-rw-r--r--keyboards/prototypist/allison_numpad/info.json (renamed from keyboards/allison_numpad/info.json)0
-rw-r--r--keyboards/prototypist/allison_numpad/keymaps/default/keymap.c (renamed from keyboards/allison_numpad/keymaps/default/keymap.c)0
-rw-r--r--keyboards/prototypist/allison_numpad/keymaps/default/readme.md (renamed from keyboards/allison_numpad/keymaps/default/readme.md)0
-rw-r--r--keyboards/prototypist/allison_numpad/keymaps/via/keymap.c (renamed from keyboards/allison_numpad/keymaps/via/keymap.c)0
-rw-r--r--keyboards/prototypist/allison_numpad/keymaps/via/readme.md (renamed from keyboards/allison_numpad/keymaps/via/readme.md)0
-rw-r--r--keyboards/prototypist/allison_numpad/keymaps/via/rules.mk (renamed from keyboards/kelowna/rgb64/keymaps/via/rules.mk)0
-rw-r--r--keyboards/prototypist/allison_numpad/readme.md15
-rw-r--r--keyboards/prototypist/allison_numpad/rules.mk (renamed from keyboards/allison_numpad/rules.mk)0
-rw-r--r--keyboards/rabbit_capture_plan/readme.md19
-rw-r--r--keyboards/rainkeeb/readme.md24
-rw-r--r--keyboards/rainkeebs/delilah/config.h (renamed from keyboards/delilah/config.h)0
-rw-r--r--keyboards/rainkeebs/delilah/delilah.c (renamed from keyboards/delilah/delilah.c)0
-rw-r--r--keyboards/rainkeebs/delilah/delilah.h (renamed from keyboards/delilah/delilah.h)0
-rw-r--r--keyboards/rainkeebs/delilah/info.json (renamed from keyboards/delilah/info.json)0
-rw-r--r--keyboards/rainkeebs/delilah/keymaps/default/keymap.c (renamed from keyboards/delilah/keymaps/default/keymap.c)0
-rw-r--r--keyboards/rainkeebs/delilah/keymaps/via/keymap.c (renamed from keyboards/delilah/keymaps/via/keymap.c)0
-rw-r--r--keyboards/rainkeebs/delilah/keymaps/via/rules.mk (renamed from keyboards/kprepublic/bm68hsrgb/keymaps/via/rules.mk)0
-rw-r--r--keyboards/rainkeebs/delilah/readme.md22
-rw-r--r--keyboards/rainkeebs/delilah/rules.mk (renamed from keyboards/delilah/rules.mk)0
-rw-r--r--keyboards/rainkeebs/rainkeeb/config.h (renamed from keyboards/rainkeeb/config.h)0
-rw-r--r--keyboards/rainkeebs/rainkeeb/info.json (renamed from keyboards/rainkeeb/info.json)0
-rw-r--r--keyboards/rainkeebs/rainkeeb/keymaps/default/keymap.c (renamed from keyboards/rainkeeb/keymaps/default/keymap.c)0
-rw-r--r--keyboards/rainkeebs/rainkeeb/keymaps/via/keymap.c (renamed from keyboards/rainkeeb/keymaps/via/keymap.c)0
-rw-r--r--keyboards/rainkeebs/rainkeeb/keymaps/via/rules.mk (renamed from keyboards/ajisai74/keymaps/via/rules.mk)0
-rw-r--r--keyboards/rainkeebs/rainkeeb/rainkeeb.c (renamed from keyboards/rainkeeb/rainkeeb.c)0
-rw-r--r--keyboards/rainkeebs/rainkeeb/rainkeeb.h (renamed from keyboards/rainkeeb/rainkeeb.h)0
-rw-r--r--keyboards/rainkeebs/rainkeeb/readme.md24
-rw-r--r--keyboards/rainkeebs/rainkeeb/rules.mk (renamed from keyboards/rainkeeb/rules.mk)0
-rw-r--r--keyboards/rainkeebs/yasui/config.h (renamed from keyboards/yasui/config.h)0
-rw-r--r--keyboards/rainkeebs/yasui/info.json (renamed from keyboards/yasui/info.json)0
-rw-r--r--keyboards/rainkeebs/yasui/keymaps/default/keymap.c (renamed from keyboards/yasui/keymaps/default/keymap.c)0
-rw-r--r--keyboards/rainkeebs/yasui/keymaps/via/keymap.c (renamed from keyboards/yasui/keymaps/via/keymap.c)0
-rw-r--r--keyboards/rainkeebs/yasui/keymaps/via/rules.mk (renamed from keyboards/ls_60/keymaps/via/rules.mk)0
-rw-r--r--keyboards/rainkeebs/yasui/readme.md22
-rw-r--r--keyboards/rainkeebs/yasui/rules.mk (renamed from keyboards/yasui/rules.mk)0
-rw-r--r--keyboards/rainkeebs/yasui/yasui.c (renamed from keyboards/yasui/yasui.c)0
-rw-r--r--keyboards/rainkeebs/yasui/yasui.h (renamed from keyboards/yasui/yasui.h)0
-rw-r--r--keyboards/redox_w/config.h9
-rw-r--r--keyboards/redox_w/matrix.c135
-rw-r--r--keyboards/redox_w/rules.mk19
-rwxr-xr-xkeyboards/redscarf_iiplus/verb/matrix.c7
-rwxr-xr-xkeyboards/redscarf_iiplus/verc/matrix.c7
-rw-r--r--keyboards/redscarf_iiplus/verd/matrix.c7
-rw-r--r--keyboards/reviung/reviung33/config.h (renamed from keyboards/reviung33/config.h)0
-rw-r--r--keyboards/reviung/reviung33/info.json (renamed from keyboards/reviung33/info.json)0
-rw-r--r--keyboards/reviung/reviung33/keymaps/default/keymap.c (renamed from keyboards/reviung33/keymaps/default/keymap.c)0
-rw-r--r--keyboards/reviung/reviung33/keymaps/default/readme.md (renamed from keyboards/reviung33/keymaps/default/readme.md)0
-rw-r--r--keyboards/reviung/reviung33/keymaps/default_jp/keymap.c (renamed from keyboards/reviung33/keymaps/default_jp/keymap.c)0
-rw-r--r--keyboards/reviung/reviung33/keymaps/default_jp/readme.md (renamed from keyboards/reviung33/keymaps/default_jp/readme.md)0
-rw-r--r--keyboards/reviung/reviung33/readme.md (renamed from keyboards/reviung33/readme.md)0
-rw-r--r--keyboards/reviung/reviung33/reviung33.c (renamed from keyboards/reviung33/reviung33.c)0
-rw-r--r--keyboards/reviung/reviung33/reviung33.h (renamed from keyboards/reviung33/reviung33.h)0
-rw-r--r--keyboards/reviung/reviung33/rules.mk (renamed from keyboards/reviung33/rules.mk)0
-rwxr-xr-xkeyboards/reviung/reviung34/config.h (renamed from keyboards/reviung34/config.h)0
-rwxr-xr-xkeyboards/reviung/reviung34/info.json (renamed from keyboards/reviung34/info.json)0
-rwxr-xr-xkeyboards/reviung/reviung34/keymaps/default/keymap.c (renamed from keyboards/reviung34/keymaps/default/keymap.c)0
-rwxr-xr-xkeyboards/reviung/reviung34/keymaps/default/readme.md (renamed from keyboards/reviung34/keymaps/default/readme.md)0
-rwxr-xr-xkeyboards/reviung/reviung34/keymaps/default_2uL/keymap.c (renamed from keyboards/reviung34/keymaps/default_2uL/keymap.c)0
-rwxr-xr-xkeyboards/reviung/reviung34/keymaps/default_2uL/readme.md (renamed from keyboards/reviung34/keymaps/default_2uL/readme.md)0
-rwxr-xr-xkeyboards/reviung/reviung34/keymaps/default_jp/keymap.c (renamed from keyboards/reviung34/keymaps/default_jp/keymap.c)0
-rwxr-xr-xkeyboards/reviung/reviung34/keymaps/default_jp/readme.md (renamed from keyboards/reviung34/keymaps/default_jp/readme.md)0
-rw-r--r--keyboards/reviung/reviung34/keymaps/default_rgb/config.h (renamed from keyboards/reviung34/keymaps/default_rgb/config.h)0
-rwxr-xr-xkeyboards/reviung/reviung34/keymaps/default_rgb/keymap.c (renamed from keyboards/reviung34/keymaps/default_rgb/keymap.c)0
-rwxr-xr-xkeyboards/reviung/reviung34/keymaps/default_rgb/readme.md (renamed from keyboards/reviung34/keymaps/default_rgb/readme.md)0
-rw-r--r--keyboards/reviung/reviung34/keymaps/default_rgb/rules.mk (renamed from keyboards/reviung39/keymaps/default_s/rules.mk)0
-rw-r--r--keyboards/reviung/reviung34/keymaps/default_rgb2u/config.h (renamed from keyboards/reviung34/keymaps/default_rgb2u/config.h)0
-rwxr-xr-xkeyboards/reviung/reviung34/keymaps/default_rgb2u/keymap.c (renamed from keyboards/reviung34/keymaps/default_rgb2u/keymap.c)0
-rwxr-xr-xkeyboards/reviung/reviung34/keymaps/default_rgb2u/readme.md (renamed from keyboards/reviung34/keymaps/default_rgb2u/readme.md)0
-rw-r--r--keyboards/reviung/reviung34/keymaps/default_rgb2u/rules.mk (renamed from keyboards/suihankey/alpha/rules.mk)0
-rwxr-xr-xkeyboards/reviung/reviung34/readme.md (renamed from keyboards/reviung34/readme.md)0
-rwxr-xr-xkeyboards/reviung/reviung34/reviung34.c (renamed from keyboards/reviung34/reviung34.c)0
-rwxr-xr-xkeyboards/reviung/reviung34/reviung34.h (renamed from keyboards/reviung34/reviung34.h)0
-rwxr-xr-xkeyboards/reviung/reviung34/rules.mk (renamed from keyboards/reviung34/rules.mk)0
-rw-r--r--keyboards/reviung/reviung39/config.h (renamed from keyboards/reviung39/config.h)0
-rw-r--r--keyboards/reviung/reviung39/info.json (renamed from keyboards/reviung39/info.json)0
-rw-r--r--keyboards/reviung/reviung39/keymaps/default/config.h (renamed from keyboards/reviung39/keymaps/default/config.h)0
-rw-r--r--keyboards/reviung/reviung39/keymaps/default/keymap.c (renamed from keyboards/reviung39/keymaps/default/keymap.c)0
-rw-r--r--keyboards/reviung/reviung39/keymaps/default/readme.md (renamed from keyboards/reviung39/keymaps/default/readme.md)0
-rw-r--r--keyboards/reviung/reviung39/keymaps/default/rules.mk (renamed from keyboards/suihankey/rev1/rules.mk)0
-rw-r--r--keyboards/reviung/reviung39/keymaps/default_s/config.h (renamed from keyboards/reviung39/keymaps/default_s/config.h)0
-rw-r--r--keyboards/reviung/reviung39/keymaps/default_s/keymap.c (renamed from keyboards/reviung39/keymaps/default_s/keymap.c)0
-rw-r--r--keyboards/reviung/reviung39/keymaps/default_s/readme.md (renamed from keyboards/reviung39/keymaps/default_s/readme.md)0
-rw-r--r--keyboards/reviung/reviung39/keymaps/default_s/rules.mk (renamed from keyboards/suihankey/split/alpha/rules.mk)0
-rw-r--r--keyboards/reviung/reviung39/keymaps/toshi0383/config.h (renamed from keyboards/reviung39/keymaps/toshi0383/config.h)0
-rw-r--r--keyboards/reviung/reviung39/keymaps/toshi0383/keymap.c (renamed from keyboards/reviung39/keymaps/toshi0383/keymap.c)0
-rw-r--r--keyboards/reviung/reviung39/keymaps/toshi0383/readme.md (renamed from keyboards/reviung39/keymaps/toshi0383/readme.md)0
-rw-r--r--keyboards/reviung/reviung39/keymaps/toshi0383/rules.mk (renamed from keyboards/reviung39/keymaps/toshi0383/rules.mk)0
-rw-r--r--keyboards/reviung/reviung39/keymaps/via/keymap.c (renamed from keyboards/reviung39/keymaps/via/keymap.c)0
-rw-r--r--keyboards/reviung/reviung39/keymaps/via/rules.mk (renamed from keyboards/reviung39/keymaps/via/rules.mk)0
-rw-r--r--keyboards/reviung/reviung39/readme.md (renamed from keyboards/reviung39/readme.md)0
-rw-r--r--keyboards/reviung/reviung39/reviung39.c (renamed from keyboards/reviung39/reviung39.c)0
-rw-r--r--keyboards/reviung/reviung39/reviung39.h (renamed from keyboards/reviung39/reviung39.h)0
-rw-r--r--keyboards/reviung/reviung39/rules.mk (renamed from keyboards/reviung39/rules.mk)0
-rw-r--r--keyboards/reviung/reviung41/config.h (renamed from keyboards/reviung41/config.h)0
-rw-r--r--keyboards/reviung/reviung41/info.json (renamed from keyboards/reviung41/info.json)0
-rw-r--r--keyboards/reviung/reviung41/keymaps/ciutadellla/config.h (renamed from keyboards/reviung41/keymaps/ciutadellla/config.h)0
-rw-r--r--keyboards/reviung/reviung41/keymaps/ciutadellla/keymap.c (renamed from keyboards/reviung41/keymaps/ciutadellla/keymap.c)0
-rw-r--r--keyboards/reviung/reviung41/keymaps/ciutadellla/rules.mk (renamed from keyboards/reviung41/keymaps/ciutadellla/rules.mk)0
-rw-r--r--keyboards/reviung/reviung41/keymaps/default/keymap.c (renamed from keyboards/reviung41/keymaps/default/keymap.c)0
-rw-r--r--keyboards/reviung/reviung41/keymaps/default/readme.md (renamed from keyboards/reviung41/keymaps/default/readme.md)0
-rw-r--r--keyboards/reviung/reviung41/keymaps/via/keymap.c (renamed from keyboards/reviung41/keymaps/via/keymap.c)0
-rw-r--r--keyboards/reviung/reviung41/keymaps/via/rules.mk (renamed from keyboards/reviung41/keymaps/via/rules.mk)0
-rw-r--r--keyboards/reviung/reviung41/readme.md (renamed from keyboards/reviung41/readme.md)0
-rw-r--r--keyboards/reviung/reviung41/reviung41.c (renamed from keyboards/reviung41/reviung41.c)0
-rw-r--r--keyboards/reviung/reviung41/reviung41.h (renamed from keyboards/reviung41/reviung41.h)0
-rw-r--r--keyboards/reviung/reviung41/rules.mk (renamed from keyboards/reviung41/rules.mk)0
-rw-r--r--keyboards/reviung/reviung5/config.h (renamed from keyboards/reviung5/config.h)0
-rw-r--r--keyboards/reviung/reviung5/info.json (renamed from keyboards/reviung5/info.json)0
-rw-r--r--keyboards/reviung/reviung5/keymaps/default/keymap.c (renamed from keyboards/reviung5/keymaps/default/keymap.c)0
-rw-r--r--keyboards/reviung/reviung5/keymaps/default/readme.md (renamed from keyboards/reviung5/keymaps/default/readme.md)0
-rw-r--r--keyboards/reviung/reviung5/keymaps/default_lre/keymap.c (renamed from keyboards/reviung5/keymaps/default_lre/keymap.c)0
-rw-r--r--keyboards/reviung/reviung5/keymaps/default_lre/readme.md (renamed from keyboards/reviung5/keymaps/default_lre/readme.md)0
-rw-r--r--keyboards/reviung/reviung5/keymaps/default_rre/keymap.c (renamed from keyboards/reviung5/keymaps/default_rre/keymap.c)0
-rw-r--r--keyboards/reviung/reviung5/keymaps/default_rre/readme.md (renamed from keyboards/reviung5/keymaps/default_rre/readme.md)0
-rw-r--r--keyboards/reviung/reviung5/readme.md (renamed from keyboards/reviung5/readme.md)0
-rw-r--r--keyboards/reviung/reviung5/reviung5.c (renamed from keyboards/reviung5/reviung5.c)0
-rw-r--r--keyboards/reviung/reviung5/reviung5.h (renamed from keyboards/reviung5/reviung5.h)0
-rw-r--r--keyboards/reviung/reviung5/rules.mk (renamed from keyboards/reviung5/rules.mk)0
-rw-r--r--keyboards/reviung/reviung53/config.h (renamed from keyboards/reviung53/config.h)0
-rw-r--r--keyboards/reviung/reviung53/info.json (renamed from keyboards/reviung53/info.json)0
-rw-r--r--keyboards/reviung/reviung53/keymaps/default/keymap.c (renamed from keyboards/reviung53/keymaps/default/keymap.c)0
-rw-r--r--keyboards/reviung/reviung53/keymaps/default/readme.md (renamed from keyboards/reviung53/keymaps/default/readme.md)0
-rw-r--r--keyboards/reviung/reviung53/keymaps/via/keymap.c (renamed from keyboards/reviung53/keymaps/via/keymap.c)0
-rw-r--r--keyboards/reviung/reviung53/keymaps/via/readme.md (renamed from keyboards/reviung53/keymaps/via/readme.md)0
-rw-r--r--keyboards/reviung/reviung53/keymaps/via/rules.mk (renamed from keyboards/naiping/np64/keymaps/via/rules.mk)0
-rw-r--r--keyboards/reviung/reviung53/readme.md (renamed from keyboards/reviung53/readme.md)0
-rw-r--r--keyboards/reviung/reviung53/reviung53.c (renamed from keyboards/reviung53/reviung53.c)0
-rw-r--r--keyboards/reviung/reviung53/reviung53.h (renamed from keyboards/reviung53/reviung53.h)0
-rw-r--r--keyboards/reviung/reviung53/rules.mk (renamed from keyboards/reviung53/rules.mk)0
-rw-r--r--keyboards/reviung/reviung61/config.h (renamed from keyboards/reviung61/config.h)0
-rw-r--r--keyboards/reviung/reviung61/info.json (renamed from keyboards/reviung61/info.json)0
-rw-r--r--keyboards/reviung/reviung61/keymaps/default/keymap.c (renamed from keyboards/reviung61/keymaps/default/keymap.c)0
-rw-r--r--keyboards/reviung/reviung61/keymaps/default/readme.md (renamed from keyboards/reviung61/keymaps/default/readme.md)0
-rw-r--r--keyboards/reviung/reviung61/keymaps/default_rgb/config.h (renamed from keyboards/reviung61/keymaps/default_rgb/config.h)0
-rw-r--r--keyboards/reviung/reviung61/keymaps/default_rgb/keymap.c (renamed from keyboards/reviung61/keymaps/default_rgb/keymap.c)0
-rw-r--r--keyboards/reviung/reviung61/keymaps/default_rgb/readme.md (renamed from keyboards/reviung61/keymaps/default_rgb/readme.md)0
-rw-r--r--keyboards/reviung/reviung61/keymaps/default_rgb/rules.mk (renamed from keyboards/reviung61/keymaps/default_rgb/rules.mk)0
-rw-r--r--keyboards/reviung/reviung61/readme.md (renamed from keyboards/reviung61/readme.md)0
-rw-r--r--keyboards/reviung/reviung61/reviung61.c (renamed from keyboards/reviung61/reviung61.c)0
-rw-r--r--keyboards/reviung/reviung61/reviung61.h (renamed from keyboards/reviung61/reviung61.h)0
-rw-r--r--keyboards/reviung/reviung61/rules.mk (renamed from keyboards/reviung61/rules.mk)0
-rw-r--r--keyboards/rgbkb/mun/rules.mk3
-rw-r--r--keyboards/rocketboard_16/rules.mk2
-rw-r--r--keyboards/salicylic_acid3/7skb/.noci (renamed from keyboards/suihankey/split/.noci)0
-rw-r--r--keyboards/salicylic_acid3/7skb/7skb.c (renamed from keyboards/7skb/7skb.c)0
-rw-r--r--keyboards/salicylic_acid3/7skb/7skb.h7
-rw-r--r--keyboards/salicylic_acid3/7skb/config.h (renamed from keyboards/getta25/config.h)0
-rw-r--r--keyboards/salicylic_acid3/7skb/info.json (renamed from keyboards/7skb/info.json)0
-rw-r--r--keyboards/salicylic_acid3/7skb/keymaps/default/config.h (renamed from keyboards/7skb/keymaps/default/config.h)0
-rw-r--r--keyboards/salicylic_acid3/7skb/keymaps/default/keymap.c (renamed from keyboards/7skb/keymaps/default/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/7skb/keymaps/salicylic/config.h (renamed from keyboards/7skb/keymaps/salicylic/config.h)0
-rw-r--r--keyboards/salicylic_acid3/7skb/keymaps/salicylic/keymap.c (renamed from keyboards/7skb/keymaps/salicylic/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/7skb/keymaps/salicylic/rules.mk (renamed from keyboards/7skb/keymaps/salicylic/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/7skb/keymaps/via/keymap.c (renamed from keyboards/7skb/keymaps/via/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/7skb/keymaps/via/readme.md (renamed from keyboards/7skb/keymaps/via/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/7skb/keymaps/via/rules.mk (renamed from keyboards/ergoarrows/keymaps/via/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/7skb/readme.md17
-rw-r--r--keyboards/salicylic_acid3/7skb/rev1/config.h (renamed from keyboards/7skb/rev1/config.h)0
-rw-r--r--keyboards/salicylic_acid3/7skb/rev1/rev1.c (renamed from keyboards/claw44/rev1/rev1.c)0
-rw-r--r--keyboards/salicylic_acid3/7skb/rev1/rev1.h (renamed from keyboards/7skb/rev1/rev1.h)0
-rw-r--r--keyboards/salicylic_acid3/7skb/rev1/rules.mk (renamed from keyboards/naked48/rev1/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/7skb/rules.mk22
-rw-r--r--keyboards/salicylic_acid3/7splus/7splus.c (renamed from keyboards/7splus/7splus.c)0
-rw-r--r--keyboards/salicylic_acid3/7splus/7splus.h (renamed from keyboards/7splus/7splus.h)0
-rw-r--r--keyboards/salicylic_acid3/7splus/config.h (renamed from keyboards/7splus/config.h)0
-rw-r--r--keyboards/salicylic_acid3/7splus/info.json (renamed from keyboards/7splus/info.json)0
-rw-r--r--keyboards/salicylic_acid3/7splus/keymaps/default/keymap.c (renamed from keyboards/7splus/keymaps/default/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/7splus/keymaps/salicylic/config.h (renamed from keyboards/7splus/keymaps/salicylic/config.h)0
-rw-r--r--keyboards/salicylic_acid3/7splus/keymaps/salicylic/keymap.c (renamed from keyboards/7splus/keymaps/salicylic/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/7splus/keymaps/salicylic/rules.mk (renamed from keyboards/7splus/keymaps/salicylic/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/7splus/keymaps/via/config.h (renamed from keyboards/7splus/keymaps/via/config.h)0
-rw-r--r--keyboards/salicylic_acid3/7splus/keymaps/via/keymap.c (renamed from keyboards/7splus/keymaps/via/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/7splus/keymaps/via/rules.mk (renamed from keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/7splus/readme.md17
-rw-r--r--keyboards/salicylic_acid3/7splus/rules.mk (renamed from keyboards/7splus/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/ajisai74.c (renamed from keyboards/ajisai74/ajisai74.c)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/ajisai74.h (renamed from keyboards/ajisai74/ajisai74.h)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/config.h (renamed from keyboards/ajisai74/config.h)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/info.json (renamed from keyboards/ajisai74/info.json)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/keymaps/default/config.h (renamed from keyboards/ajisai74/keymaps/default/config.h)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/keymaps/default/keymap.c (renamed from keyboards/ajisai74/keymaps/default/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/keymaps/jis/config.h (renamed from keyboards/ajisai74/keymaps/jis/config.h)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/keymaps/jis/keymap.c (renamed from keyboards/ajisai74/keymaps/jis/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/keymaps/jis/rules.mk (renamed from keyboards/ajisai74/keymaps/jis/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/keymaps/salicylic/config.h (renamed from keyboards/ajisai74/keymaps/salicylic/config.h)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/keymaps/salicylic/keymap.c (renamed from keyboards/ajisai74/keymaps/salicylic/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/keymaps/salicylic/rules.mk (renamed from keyboards/ajisai74/keymaps/salicylic/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/keymaps/via/config.h (renamed from keyboards/ajisai74/keymaps/via/config.h)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/keymaps/via/keymap.c (renamed from keyboards/ajisai74/keymaps/via/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/keymaps/via/rules.mk (renamed from keyboards/nk1/keymaps/via/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/ajisai74/readme.md17
-rw-r--r--keyboards/salicylic_acid3/ajisai74/rules.mk (renamed from keyboards/ajisai74/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/ergoarrows/config.h (renamed from keyboards/ergoarrows/config.h)0
-rw-r--r--keyboards/salicylic_acid3/ergoarrows/ergoarrows.c (renamed from keyboards/ergoarrows/ergoarrows.c)0
-rw-r--r--keyboards/salicylic_acid3/ergoarrows/ergoarrows.h (renamed from keyboards/ergoarrows/ergoarrows.h)0
-rw-r--r--keyboards/salicylic_acid3/ergoarrows/info.json (renamed from keyboards/ergoarrows/info.json)0
-rw-r--r--keyboards/salicylic_acid3/ergoarrows/keymaps/default/config.h (renamed from keyboards/ergoarrows/keymaps/default/config.h)0
-rw-r--r--keyboards/salicylic_acid3/ergoarrows/keymaps/default/keymap.c (renamed from keyboards/ergoarrows/keymaps/default/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/ergoarrows/keymaps/salicylic/config.h (renamed from keyboards/ergoarrows/keymaps/salicylic/config.h)0
-rw-r--r--keyboards/salicylic_acid3/ergoarrows/keymaps/salicylic/keymap.c (renamed from keyboards/ergoarrows/keymaps/salicylic/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/ergoarrows/keymaps/via/config.h (renamed from keyboards/ergoarrows/keymaps/via/config.h)0
-rw-r--r--keyboards/salicylic_acid3/ergoarrows/keymaps/via/keymap.c (renamed from keyboards/ergoarrows/keymaps/via/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/ergoarrows/keymaps/via/rules.mk (renamed from keyboards/nknl7en/keymaps/via/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/ergoarrows/readme.md17
-rw-r--r--keyboards/salicylic_acid3/ergoarrows/rules.mk (renamed from keyboards/ergoarrows/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/getta25/.noci (renamed from keyboards/suihankey/split/alpha/.noci)0
-rw-r--r--keyboards/salicylic_acid3/getta25/config.h (renamed from keyboards/naked64/config.h)0
-rw-r--r--keyboards/salicylic_acid3/getta25/getta25.c (renamed from keyboards/getta25/getta25.c)0
-rw-r--r--keyboards/salicylic_acid3/getta25/getta25.h7
-rw-r--r--keyboards/salicylic_acid3/getta25/info.json (renamed from keyboards/getta25/info.json)0
-rw-r--r--keyboards/salicylic_acid3/getta25/keymaps/default/config.h (renamed from keyboards/getta25/keymaps/default/config.h)0
-rw-r--r--keyboards/salicylic_acid3/getta25/keymaps/default/keymap.c (renamed from keyboards/getta25/keymaps/default/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/getta25/keymaps/oled/config.h (renamed from keyboards/getta25/keymaps/oled/config.h)0
-rw-r--r--keyboards/salicylic_acid3/getta25/keymaps/oled/glcdfont.c (renamed from keyboards/getta25/keymaps/oled/glcdfont.c)0
-rw-r--r--keyboards/salicylic_acid3/getta25/keymaps/oled/keymap.c (renamed from keyboards/getta25/keymaps/oled/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/getta25/keymaps/oled/rules.mk (renamed from keyboards/getta25/keymaps/oled/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/getta25/readme.md17
-rw-r--r--keyboards/salicylic_acid3/getta25/rev1/config.h (renamed from keyboards/getta25/rev1/config.h)0
-rw-r--r--keyboards/salicylic_acid3/getta25/rev1/rev1.c (renamed from keyboards/getta25/rev1/rev1.c)0
-rw-r--r--keyboards/salicylic_acid3/getta25/rev1/rev1.h (renamed from keyboards/getta25/rev1/rev1.h)0
-rw-r--r--keyboards/salicylic_acid3/getta25/rev1/rules.mk (renamed from keyboards/treadstone48/rev1/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/getta25/rules.mk21
-rw-r--r--keyboards/salicylic_acid3/jisplit89/.noci (renamed from keyboards/treadstone32/lite/.noci)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/config.h (renamed from keyboards/jisplit89/config.h)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/info.json (renamed from keyboards/jisplit89/info.json)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/jisplit89.c (renamed from keyboards/jisplit89/jisplit89.c)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/jisplit89.h22
-rw-r--r--keyboards/salicylic_acid3/jisplit89/keymaps/default/keymap.c (renamed from keyboards/jisplit89/keymaps/default/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/keymaps/salicylic/config.h (renamed from keyboards/jisplit89/keymaps/salicylic/config.h)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/keymaps/salicylic/keymap.c (renamed from keyboards/jisplit89/keymaps/salicylic/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/keymaps/salicylic/rules.mk (renamed from keyboards/jisplit89/keymaps/salicylic/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/keymaps/via/config.h (renamed from keyboards/jisplit89/keymaps/via/config.h)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/keymaps/via/keymap.c (renamed from keyboards/jisplit89/keymaps/via/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/keymaps/via/rules.mk (renamed from keyboards/naiping/nphhkb/keymaps/via/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/readme.md17
-rw-r--r--keyboards/salicylic_acid3/jisplit89/rev1/config.h (renamed from keyboards/jisplit89/rev1/config.h)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/rev1/rev1.c (renamed from keyboards/jisplit89/rev1/rev1.c)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/rev1/rev1.h (renamed from keyboards/jisplit89/rev1/rev1.h)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/rev1/rules.mk (renamed from keyboards/naked60/rev1/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/jisplit89/rules.mk22
-rw-r--r--keyboards/salicylic_acid3/nafuda/config.h (renamed from keyboards/nafuda/config.h)0
-rw-r--r--keyboards/salicylic_acid3/nafuda/info.json (renamed from keyboards/nafuda/info.json)0
-rw-r--r--keyboards/salicylic_acid3/nafuda/keymaps/default/config.h (renamed from keyboards/nafuda/keymaps/default/config.h)0
-rw-r--r--keyboards/salicylic_acid3/nafuda/keymaps/default/keymap.c (renamed from keyboards/nafuda/keymaps/default/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/nafuda/keymaps/default/readme.md (renamed from keyboards/nafuda/keymaps/default/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/nafuda/nafuda.c (renamed from keyboards/nafuda/nafuda.c)0
-rw-r--r--keyboards/salicylic_acid3/nafuda/nafuda.h (renamed from keyboards/nafuda/nafuda.h)0
-rw-r--r--keyboards/salicylic_acid3/nafuda/readme.md17
-rw-r--r--keyboards/salicylic_acid3/nafuda/rules.mk (renamed from keyboards/nafuda/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked48/.noci (renamed from keyboards/treadstone32/rev1/.noci)0
-rw-r--r--keyboards/salicylic_acid3/naked48/config.h (renamed from keyboards/naked48/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked48/info.json (renamed from keyboards/naked48/info.json)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/default/config.h (renamed from keyboards/naked48/keymaps/default/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/default/keymap.c (renamed from keyboards/naked48/keymaps/default/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/default/readme.md (renamed from keyboards/naked48/keymaps/default/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/default/rules.mk (renamed from keyboards/treadstone48/rev2/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/config.h (renamed from keyboards/naked48/keymaps/default_with_nafuda/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/keymap.c (renamed from keyboards/naked48/keymaps/default_with_nafuda/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/readme.md (renamed from keyboards/naked48/keymaps/default_with_nafuda/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/rules.mk (renamed from keyboards/naked48/keymaps/default_with_nafuda/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/default_with_setta21/config.h (renamed from keyboards/naked48/keymaps/default_with_setta21/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/default_with_setta21/keymap.c (renamed from keyboards/naked48/keymaps/default_with_setta21/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/default_with_setta21/readme.md (renamed from keyboards/naked48/keymaps/default_with_setta21/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/salicylic/config.h (renamed from keyboards/naked48/keymaps/salicylic/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/salicylic/keymap.c (renamed from keyboards/naked48/keymaps/salicylic/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/salicylic/readme.md (renamed from keyboards/naked48/keymaps/salicylic/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/salicylic/rules.mk (renamed from keyboards/naked48/keymaps/salicylic/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_nafuda/config.h (renamed from keyboards/naked48/keymaps/salicylic_with_nafuda/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_nafuda/keymap.c (renamed from keyboards/naked48/keymaps/salicylic_with_nafuda/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_nafuda/readme.md (renamed from keyboards/naked48/keymaps/salicylic_with_nafuda/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_nafuda/rules.mk (renamed from keyboards/naked48/keymaps/salicylic_with_nafuda/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_setta21/config.h (renamed from keyboards/naked48/keymaps/salicylic_with_setta21/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_setta21/keymap.c (renamed from keyboards/naked48/keymaps/salicylic_with_setta21/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_setta21/readme.md (renamed from keyboards/naked48/keymaps/salicylic_with_setta21/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_setta21/rules.mk (renamed from keyboards/naked64/keymaps/default/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/scheiklp/config.h (renamed from keyboards/naked48/keymaps/scheiklp/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/scheiklp/keymap.c (renamed from keyboards/naked48/keymaps/scheiklp/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/scheiklp/readme.md (renamed from keyboards/naked48/keymaps/scheiklp/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/scheiklp/rules.mk (renamed from keyboards/naked48/keymaps/scheiklp/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/via/config.h (renamed from keyboards/naked48/keymaps/via/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/via/keymap.c (renamed from keyboards/naked48/keymaps/via/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/via/rules.mk (renamed from keyboards/naked48/keymaps/via/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/via_rgb_matrix/config.h (renamed from keyboards/naked48/keymaps/via_rgb_matrix/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/via_rgb_matrix/keymap.c (renamed from keyboards/naked48/keymaps/via_rgb_matrix/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked48/keymaps/via_rgb_matrix/rules.mk (renamed from keyboards/naked48/keymaps/via_rgb_matrix/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked48/naked48.c (renamed from keyboards/naked48/naked48.c)0
-rw-r--r--keyboards/salicylic_acid3/naked48/naked48.h24
-rw-r--r--keyboards/salicylic_acid3/naked48/readme.md18
-rw-r--r--keyboards/salicylic_acid3/naked48/rev1/config.h (renamed from keyboards/naked48/rev1/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked48/rev1/rev1.c (renamed from keyboards/naked48/rev1/rev1.c)0
-rw-r--r--keyboards/salicylic_acid3/naked48/rev1/rev1.h (renamed from keyboards/naked48/rev1/rev1.h)0
-rw-r--r--keyboards/salicylic_acid3/naked48/rev1/rules.mk (renamed from keyboards/naked64/keymaps/default_with_setta21/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked48/rules.mk24
-rw-r--r--keyboards/salicylic_acid3/naked60/config.h (renamed from keyboards/naked60/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked60/info.json (renamed from keyboards/naked60/info.json)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/333fred/config.h (renamed from keyboards/naked60/keymaps/333fred/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/333fred/keymap.c (renamed from keyboards/naked60/keymaps/333fred/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/default/config.h (renamed from keyboards/naked60/keymaps/default/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/default/keymap.c (renamed from keyboards/naked60/keymaps/default/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/default/readme.md (renamed from keyboards/naked60/keymaps/default/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/default_with_nafuda/config.h (renamed from keyboards/naked60/keymaps/default_with_nafuda/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/default_with_nafuda/keymap.c (renamed from keyboards/naked60/keymaps/default_with_nafuda/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/default_with_nafuda/readme.md (renamed from keyboards/naked60/keymaps/default_with_nafuda/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/default_with_setta21/config.h (renamed from keyboards/naked60/keymaps/default_with_setta21/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/default_with_setta21/keymap.c (renamed from keyboards/naked60/keymaps/default_with_setta21/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/default_with_setta21/readme.md (renamed from keyboards/naked60/keymaps/default_with_setta21/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/salicylic/config.h (renamed from keyboards/naked60/keymaps/salicylic/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/salicylic/keymap.c (renamed from keyboards/naked60/keymaps/salicylic/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/salicylic/readme.md (renamed from keyboards/naked60/keymaps/salicylic/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/salicylic/rules.mk (renamed from keyboards/naked60/keymaps/salicylic/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_nafuda/config.h (renamed from keyboards/naked60/keymaps/salicylic_with_nafuda/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_nafuda/keymap.c (renamed from keyboards/naked60/keymaps/salicylic_with_nafuda/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_nafuda/readme.md (renamed from keyboards/naked60/keymaps/salicylic_with_nafuda/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_nafuda/rules.mk (renamed from keyboards/naked60/keymaps/salicylic_with_nafuda/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_setta21/config.h (renamed from keyboards/naked60/keymaps/salicylic_with_setta21/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_setta21/keymap.c (renamed from keyboards/naked60/keymaps/salicylic_with_setta21/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_setta21/readme.md (renamed from keyboards/naked60/keymaps/salicylic_with_setta21/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_setta21/rules.mk (renamed from keyboards/naked60/keymaps/salicylic_with_setta21/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/via/config.h (renamed from keyboards/naked60/keymaps/via/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/via/keymap.c (renamed from keyboards/naked60/keymaps/via/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked60/keymaps/via/rules.mk (renamed from keyboards/naiping/npminila/keymaps/via/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked60/naked60.c (renamed from keyboards/naked60/naked60.c)0
-rw-r--r--keyboards/salicylic_acid3/naked60/naked60.h24
-rw-r--r--keyboards/salicylic_acid3/naked60/readme.md18
-rw-r--r--keyboards/salicylic_acid3/naked60/rev1/config.h (renamed from keyboards/naked60/rev1/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked60/rev1/rev1.c (renamed from keyboards/naked60/rev1/rev1.c)0
-rw-r--r--keyboards/salicylic_acid3/naked60/rev1/rev1.h (renamed from keyboards/naked60/rev1/rev1.h)0
-rw-r--r--keyboards/salicylic_acid3/naked60/rev1/rules.mk (renamed from keyboards/naked64/rev1/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked60/rules.mk22
-rw-r--r--keyboards/salicylic_acid3/naked64/.noci (renamed from keyboards/treadstone48/.noci)0
-rw-r--r--keyboards/salicylic_acid3/naked64/config.h (renamed from keyboards/setta21/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked64/info.json (renamed from keyboards/naked64/info.json)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/default/config.h (renamed from keyboards/naked64/keymaps/default/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/default/keymap.c (renamed from keyboards/naked64/keymaps/default/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/default/readme.md (renamed from keyboards/naked64/keymaps/default/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/default/rules.mk (renamed from keyboards/setta21/rev1/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/default_with_setta21/config.h (renamed from keyboards/naked64/keymaps/default_with_setta21/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/default_with_setta21/keymap.c (renamed from keyboards/naked64/keymaps/default_with_setta21/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/default_with_setta21/readme.md (renamed from keyboards/naked64/keymaps/default_with_setta21/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/default_with_setta21/rules.mk (renamed from keyboards/wings42/rev1/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/salicylic/config.h (renamed from keyboards/naked64/keymaps/salicylic/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/salicylic/keymap.c (renamed from keyboards/naked64/keymaps/salicylic/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/salicylic/readme.md (renamed from keyboards/naked64/keymaps/salicylic/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/salicylic/rules.mk (renamed from keyboards/naked64/keymaps/salicylic/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/salicylic_with_setta21/config.h (renamed from keyboards/naked64/keymaps/salicylic_with_setta21/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/salicylic_with_setta21/keymap.c (renamed from keyboards/naked64/keymaps/salicylic_with_setta21/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/salicylic_with_setta21/readme.md (renamed from keyboards/naked64/keymaps/salicylic_with_setta21/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/naked64/keymaps/salicylic_with_setta21/rules.mk (renamed from keyboards/naked64/keymaps/salicylic_with_setta21/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked64/naked64.c (renamed from keyboards/naked64/naked64.c)0
-rw-r--r--keyboards/salicylic_acid3/naked64/naked64.h7
-rw-r--r--keyboards/salicylic_acid3/naked64/readme.md18
-rw-r--r--keyboards/salicylic_acid3/naked64/rev1/config.h (renamed from keyboards/naked64/rev1/config.h)0
-rw-r--r--keyboards/salicylic_acid3/naked64/rev1/rev1.c (renamed from keyboards/naked64/rev1/rev1.c)0
-rw-r--r--keyboards/salicylic_acid3/naked64/rev1/rev1.h (renamed from keyboards/naked64/rev1/rev1.h)0
-rw-r--r--keyboards/salicylic_acid3/naked64/rev1/rules.mk (renamed from keyboards/wings42/rev1_extkeys/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/naked64/rules.mk24
-rw-r--r--keyboards/salicylic_acid3/nknl7en/config.h (renamed from keyboards/nknl7en/config.h)0
-rw-r--r--keyboards/salicylic_acid3/nknl7en/info.json (renamed from keyboards/nknl7en/info.json)0
-rw-r--r--keyboards/salicylic_acid3/nknl7en/keymaps/default/config.h (renamed from keyboards/nknl7en/keymaps/default/config.h)0
-rw-r--r--keyboards/salicylic_acid3/nknl7en/keymaps/default/keymap.c (renamed from keyboards/nknl7en/keymaps/default/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/nknl7en/keymaps/salicylic/config.h (renamed from keyboards/nknl7en/keymaps/salicylic/config.h)0
-rw-r--r--keyboards/salicylic_acid3/nknl7en/keymaps/salicylic/keymap.c (renamed from keyboards/nknl7en/keymaps/salicylic/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/nknl7en/keymaps/via/config.h (renamed from keyboards/nknl7en/keymaps/via/config.h)0
-rw-r--r--keyboards/salicylic_acid3/nknl7en/keymaps/via/keymap.c (renamed from keyboards/nknl7en/keymaps/via/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/nknl7en/keymaps/via/rules.mk (renamed from keyboards/nknl7jp/keymaps/via/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/nknl7en/nknl7en.c (renamed from keyboards/nknl7en/nknl7en.c)0
-rw-r--r--keyboards/salicylic_acid3/nknl7en/nknl7en.h (renamed from keyboards/nknl7en/nknl7en.h)0
-rw-r--r--keyboards/salicylic_acid3/nknl7en/readme.md17
-rw-r--r--keyboards/salicylic_acid3/nknl7en/rules.mk (renamed from keyboards/nknl7en/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/nknl7jp/config.h (renamed from keyboards/nknl7jp/config.h)0
-rw-r--r--keyboards/salicylic_acid3/nknl7jp/info.json (renamed from keyboards/nknl7jp/info.json)0
-rw-r--r--keyboards/salicylic_acid3/nknl7jp/keymaps/default/config.h (renamed from keyboards/nknl7jp/keymaps/default/config.h)0
-rw-r--r--keyboards/salicylic_acid3/nknl7jp/keymaps/default/keymap.c (renamed from keyboards/nknl7jp/keymaps/default/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/nknl7jp/keymaps/salicylic/config.h (renamed from keyboards/nknl7jp/keymaps/salicylic/config.h)0
-rw-r--r--keyboards/salicylic_acid3/nknl7jp/keymaps/salicylic/keymap.c (renamed from keyboards/nknl7jp/keymaps/salicylic/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/nknl7jp/keymaps/via/config.h (renamed from keyboards/nknl7jp/keymaps/via/config.h)0
-rw-r--r--keyboards/salicylic_acid3/nknl7jp/keymaps/via/keymap.c (renamed from keyboards/nknl7jp/keymaps/via/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/nknl7jp/keymaps/via/rules.mk (renamed from keyboards/rainkeeb/keymaps/via/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/nknl7jp/nknl7jp.c (renamed from keyboards/nknl7jp/nknl7jp.c)0
-rw-r--r--keyboards/salicylic_acid3/nknl7jp/nknl7jp.h (renamed from keyboards/nknl7jp/nknl7jp.h)0
-rw-r--r--keyboards/salicylic_acid3/nknl7jp/readme.md17
-rw-r--r--keyboards/salicylic_acid3/nknl7jp/rules.mk (renamed from keyboards/nknl7jp/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/setta21/config.h (renamed from keyboards/wings42/config.h)0
-rw-r--r--keyboards/salicylic_acid3/setta21/info.json (renamed from keyboards/setta21/info.json)0
-rw-r--r--keyboards/salicylic_acid3/setta21/keymaps/default/config.h (renamed from keyboards/setta21/keymaps/default/config.h)0
-rw-r--r--keyboards/salicylic_acid3/setta21/keymaps/default/keymap.c (renamed from keyboards/setta21/keymaps/default/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/setta21/keymaps/default/readme.md (renamed from keyboards/setta21/keymaps/default/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/setta21/keymaps/salicylic/config.h (renamed from keyboards/setta21/keymaps/salicylic/config.h)0
-rw-r--r--keyboards/salicylic_acid3/setta21/keymaps/salicylic/keymap.c (renamed from keyboards/setta21/keymaps/salicylic/keymap.c)0
-rw-r--r--keyboards/salicylic_acid3/setta21/keymaps/salicylic/readme.md (renamed from keyboards/setta21/keymaps/salicylic/readme.md)0
-rw-r--r--keyboards/salicylic_acid3/setta21/keymaps/salicylic/rules.mk (renamed from keyboards/setta21/keymaps/salicylic/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/setta21/readme.md17
-rw-r--r--keyboards/salicylic_acid3/setta21/rev1/.noci (renamed from keyboards/treadstone48/rev1/.noci)0
-rw-r--r--keyboards/salicylic_acid3/setta21/rev1/config.h (renamed from keyboards/setta21/rev1/config.h)0
-rw-r--r--keyboards/salicylic_acid3/setta21/rev1/rev1.c (renamed from keyboards/setta21/rev1/rev1.c)0
-rw-r--r--keyboards/salicylic_acid3/setta21/rev1/rev1.h (renamed from keyboards/setta21/rev1/rev1.h)0
-rw-r--r--keyboards/salicylic_acid3/setta21/rev1/rules.mk (renamed from keyboards/wings42/rev2/rules.mk)0
-rw-r--r--keyboards/salicylic_acid3/setta21/rules.mk26
-rw-r--r--keyboards/salicylic_acid3/setta21/setta21.c (renamed from keyboards/setta21/setta21.c)0
-rw-r--r--keyboards/salicylic_acid3/setta21/setta21.h7
-rw-r--r--keyboards/seigaiha/readme.md23
-rw-r--r--keyboards/sekigon/grs_70ec/matrix.c47
-rw-r--r--keyboards/setta21/readme.md17
-rw-r--r--keyboards/setta21/rules.mk26
-rw-r--r--keyboards/setta21/setta21.h7
-rw-r--r--keyboards/sirius/uni660/rev1/config.h9
-rw-r--r--keyboards/sirius/uni660/rev1/matrix.c131
-rw-r--r--keyboards/sirius/uni660/rev1/rules.mk5
-rw-r--r--keyboards/sirius/uni660/rev2/ansi/config.h9
-rw-r--r--keyboards/sirius/uni660/rev2/iso/config.h9
-rw-r--r--keyboards/sirius/uni660/rev2/matrix.c131
-rw-r--r--keyboards/sirius/uni660/rev2/rules.mk5
-rw-r--r--keyboards/sirius/unigo66/custom_matrix.cpp4
-rw-r--r--keyboards/sixkeyboard/matrix.c5
-rw-r--r--keyboards/spiderisland/winry25tc/readme.md14
-rw-r--r--keyboards/splitreus62/readme.md13
-rw-r--r--keyboards/standaside/readme.md15
-rw-r--r--keyboards/steal_this_keyboard/readme.md11
-rw-r--r--keyboards/suihankey/readme.md18
-rw-r--r--keyboards/suihankey/rules.mk23
-rw-r--r--keyboards/suihankey/split/alpha/readme.md18
-rw-r--r--keyboards/suihankey/split/readme.md18
-rw-r--r--keyboards/suihankey/split/rev1/readme.md18
-rw-r--r--keyboards/suihankey/split/rules.mk4
-rw-r--r--keyboards/sx60/matrix.c8
-rw-r--r--keyboards/telophase/config.h9
-rw-r--r--keyboards/telophase/matrix.c10
-rw-r--r--keyboards/telophase/rules.mk3
-rw-r--r--keyboards/tgr/jane/v2ce/rules.mk2
-rw-r--r--keyboards/thedogkeyboard/matrix.c287
-rw-r--r--keyboards/thedogkeyboard/readme.md15
-rw-r--r--keyboards/tiger910/readme.md15
-rw-r--r--keyboards/treadstone32/readme.md21
-rw-r--r--keyboards/treadstone32/rules.mk18
-rw-r--r--keyboards/treadstone48/keymaps/default/config.h49
-rw-r--r--keyboards/treadstone48/keymaps/like_jis/config.h49
-rw-r--r--keyboards/treadstone48/readme.md21
-rw-r--r--keyboards/treadstone48/rev1/keymaps/like_jis_rs/config.h51
-rw-r--r--keyboards/treadstone48/rules.mk25
-rw-r--r--keyboards/ua62/readme.md14
-rw-r--r--keyboards/weirdo/geminate60/chconf.h (renamed from keyboards/geminate60/chconf.h)0
-rw-r--r--keyboards/weirdo/geminate60/config.h (renamed from keyboards/geminate60/config.h)0
-rw-r--r--keyboards/weirdo/geminate60/geminate60.c (renamed from keyboards/geminate60/geminate60.c)0
-rw-r--r--keyboards/weirdo/geminate60/geminate60.h (renamed from keyboards/geminate60/geminate60.h)0
-rw-r--r--keyboards/weirdo/geminate60/info.json (renamed from keyboards/geminate60/info.json)0
-rw-r--r--keyboards/weirdo/geminate60/keymaps/default/keymap.c (renamed from keyboards/geminate60/keymaps/default/keymap.c)0
-rw-r--r--keyboards/weirdo/geminate60/keymaps/via/keymap.c (renamed from keyboards/geminate60/keymaps/via/keymap.c)0
-rw-r--r--keyboards/weirdo/geminate60/keymaps/via/rules.mk (renamed from keyboards/naked60/keymaps/via/rules.mk)0
-rw-r--r--keyboards/weirdo/geminate60/readme.md16
-rw-r--r--keyboards/weirdo/geminate60/rules.mk (renamed from keyboards/geminate60/rules.mk)0
-rw-r--r--keyboards/weirdo/kelowna/rgb64/config.h (renamed from keyboards/kelowna/rgb64/config.h)0
-rw-r--r--keyboards/weirdo/kelowna/rgb64/info.json (renamed from keyboards/kelowna/rgb64/info.json)0
-rw-r--r--keyboards/weirdo/kelowna/rgb64/keymaps/default/keymap.c (renamed from keyboards/kelowna/rgb64/keymaps/default/keymap.c)0
-rw-r--r--keyboards/weirdo/kelowna/rgb64/keymaps/via/keymap.c (renamed from keyboards/kelowna/rgb64/keymaps/via/keymap.c)0
-rw-r--r--[-rwxr-xr-x]keyboards/weirdo/kelowna/rgb64/keymaps/via/rules.mk (renamed from keyboards/nk65/keymaps/via/rules.mk)0
-rw-r--r--keyboards/weirdo/kelowna/rgb64/readme.md17
-rw-r--r--keyboards/weirdo/kelowna/rgb64/rgb64.c (renamed from keyboards/kelowna/rgb64/rgb64.c)0
-rw-r--r--keyboards/weirdo/kelowna/rgb64/rgb64.h (renamed from keyboards/kelowna/rgb64/rgb64.h)0
-rw-r--r--keyboards/weirdo/kelowna/rgb64/rules.mk (renamed from keyboards/kelowna/rgb64/rules.mk)0
-rw-r--r--keyboards/weirdo/ls_60/chconf.h (renamed from keyboards/ls_60/chconf.h)0
-rw-r--r--keyboards/weirdo/ls_60/config.h (renamed from keyboards/ls_60/config.h)0
-rw-r--r--keyboards/weirdo/ls_60/info.json (renamed from keyboards/ls_60/info.json)0
-rw-r--r--keyboards/weirdo/ls_60/keymaps/default/keymap.c (renamed from keyboards/ls_60/keymaps/default/keymap.c)0
-rw-r--r--keyboards/weirdo/ls_60/keymaps/via/keymap.c (renamed from keyboards/ls_60/keymaps/via/keymap.c)0
-rw-r--r--[-rwxr-xr-x]keyboards/weirdo/ls_60/keymaps/via/rules.mk (renamed from keyboards/nk87/keymaps/via/rules.mk)0
-rw-r--r--keyboards/weirdo/ls_60/ls_60.c (renamed from keyboards/ls_60/ls_60.c)0
-rw-r--r--keyboards/weirdo/ls_60/ls_60.h (renamed from keyboards/ls_60/ls_60.h)0
-rw-r--r--keyboards/weirdo/ls_60/readme.md17
-rw-r--r--keyboards/weirdo/ls_60/rules.mk (renamed from keyboards/ls_60/rules.mk)0
-rw-r--r--keyboards/weirdo/naiping/np64/chconf.h (renamed from keyboards/naiping/np64/chconf.h)0
-rw-r--r--keyboards/weirdo/naiping/np64/config.h (renamed from keyboards/naiping/np64/config.h)0
-rw-r--r--keyboards/weirdo/naiping/np64/info.json (renamed from keyboards/naiping/np64/info.json)0
-rw-r--r--keyboards/weirdo/naiping/np64/keymaps/default/keymap.c (renamed from keyboards/naiping/np64/keymaps/default/keymap.c)0
-rw-r--r--keyboards/weirdo/naiping/np64/keymaps/via/keymap.c (renamed from keyboards/naiping/np64/keymaps/via/keymap.c)0
-rw-r--r--keyboards/weirdo/naiping/np64/keymaps/via/rules.mk (renamed from keyboards/owl8/keymaps/via/rules.mk)0
-rw-r--r--keyboards/weirdo/naiping/np64/np64.c (renamed from keyboards/naiping/np64/np64.c)0
-rw-r--r--keyboards/weirdo/naiping/np64/np64.h (renamed from keyboards/naiping/np64/np64.h)0
-rw-r--r--keyboards/weirdo/naiping/np64/readme.md17
-rw-r--r--keyboards/weirdo/naiping/np64/rules.mk (renamed from keyboards/naiping/np64/rules.mk)0
-rw-r--r--keyboards/weirdo/naiping/nphhkb/chconf.h (renamed from keyboards/naiping/nphhkb/chconf.h)0
-rw-r--r--keyboards/weirdo/naiping/nphhkb/config.h (renamed from keyboards/naiping/nphhkb/config.h)0
-rw-r--r--keyboards/weirdo/naiping/nphhkb/info.json (renamed from keyboards/naiping/nphhkb/info.json)0
-rw-r--r--keyboards/weirdo/naiping/nphhkb/keymaps/default/keymap.c (renamed from keyboards/naiping/nphhkb/keymaps/default/keymap.c)0
-rw-r--r--keyboards/weirdo/naiping/nphhkb/keymaps/via/keymap.c (renamed from keyboards/naiping/nphhkb/keymaps/via/keymap.c)0
-rw-r--r--keyboards/weirdo/naiping/nphhkb/keymaps/via/rules.mk (renamed from keyboards/rabbit_capture_plan/keymaps/via/rules.mk)0
-rw-r--r--keyboards/weirdo/naiping/nphhkb/nphhkb.c (renamed from keyboards/naiping/nphhkb/nphhkb.c)0
-rw-r--r--keyboards/weirdo/naiping/nphhkb/nphhkb.h (renamed from keyboards/naiping/nphhkb/nphhkb.h)0
-rw-r--r--keyboards/weirdo/naiping/nphhkb/readme.md17
-rw-r--r--keyboards/weirdo/naiping/nphhkb/rules.mk (renamed from keyboards/naiping/nphhkb/rules.mk)0
-rw-r--r--keyboards/weirdo/naiping/npminila/chconf.h (renamed from keyboards/naiping/npminila/chconf.h)0
-rw-r--r--keyboards/weirdo/naiping/npminila/config.h (renamed from keyboards/naiping/npminila/config.h)0
-rw-r--r--keyboards/weirdo/naiping/npminila/info.json (renamed from keyboards/naiping/npminila/info.json)0
-rw-r--r--keyboards/weirdo/naiping/npminila/keymaps/default/keymap.c (renamed from keyboards/naiping/npminila/keymaps/default/keymap.c)0
-rw-r--r--keyboards/weirdo/naiping/npminila/keymaps/via/keymap.c (renamed from keyboards/naiping/npminila/keymaps/via/keymap.c)0
-rw-r--r--keyboards/weirdo/naiping/npminila/keymaps/via/rules.mk (renamed from keyboards/reviung53/keymaps/via/rules.mk)0
-rw-r--r--keyboards/weirdo/naiping/npminila/npminila.c (renamed from keyboards/naiping/npminila/npminila.c)0
-rw-r--r--keyboards/weirdo/naiping/npminila/npminila.h (renamed from keyboards/naiping/npminila/npminila.h)0
-rw-r--r--keyboards/weirdo/naiping/npminila/readme.md17
-rw-r--r--keyboards/weirdo/naiping/npminila/rules.mk (renamed from keyboards/naiping/npminila/rules.mk)0
-rw-r--r--keyboards/weirdo/tiger910/config.h (renamed from keyboards/tiger910/config.h)0
-rw-r--r--keyboards/weirdo/tiger910/info.json (renamed from keyboards/tiger910/info.json)0
-rw-r--r--keyboards/weirdo/tiger910/keymaps/default/keymap.c (renamed from keyboards/tiger910/keymaps/default/keymap.c)0
-rw-r--r--keyboards/weirdo/tiger910/keymaps/via/keymap.c (renamed from keyboards/tiger910/keymaps/via/keymap.c)0
-rw-r--r--keyboards/weirdo/tiger910/keymaps/via/rules.mk (renamed from keyboards/tiger910/keymaps/via/rules.mk)0
-rw-r--r--keyboards/weirdo/tiger910/readme.md15
-rw-r--r--keyboards/weirdo/tiger910/rules.mk (renamed from keyboards/tiger910/rules.mk)0
-rw-r--r--keyboards/weirdo/tiger910/tiger910.c (renamed from keyboards/tiger910/tiger910.c)0
-rw-r--r--keyboards/weirdo/tiger910/tiger910.h (renamed from keyboards/tiger910/tiger910.h)0
-rw-r--r--keyboards/wings42/readme.md19
-rw-r--r--keyboards/wings42/rev1/readme.md21
-rw-r--r--keyboards/wings42/rev1_extkeys/readme.md21
-rw-r--r--keyboards/wings42/rev2/readme.md21
-rw-r--r--keyboards/wings42/rules.mk22
-rw-r--r--keyboards/wings42/wings42.h30
-rw-r--r--keyboards/winry/winry25tc/config.h (renamed from keyboards/spiderisland/winry25tc/config.h)0
-rw-r--r--keyboards/winry/winry25tc/info.json (renamed from keyboards/spiderisland/winry25tc/info.json)0
-rw-r--r--keyboards/winry/winry25tc/keymaps/default/keymap.c (renamed from keyboards/spiderisland/winry25tc/keymaps/default/keymap.c)0
-rw-r--r--keyboards/winry/winry25tc/readme.md19
-rw-r--r--keyboards/winry/winry25tc/rules.mk (renamed from keyboards/spiderisland/winry25tc/rules.mk)0
-rw-r--r--keyboards/winry/winry25tc/winry25tc.c (renamed from keyboards/spiderisland/winry25tc/winry25tc.c)0
-rw-r--r--keyboards/winry/winry25tc/winry25tc.h (renamed from keyboards/spiderisland/winry25tc/winry25tc.h)0
-rw-r--r--keyboards/yanghu/unicorne/config.h6
-rw-r--r--keyboards/yasui/readme.md22
-rw-r--r--keyboards/yd68/readme.md15
-rw-r--r--keyboards/ydkb/chili/chili.c (renamed from keyboards/chili/chili.c)0
-rw-r--r--keyboards/ydkb/chili/chili.h (renamed from keyboards/chili/chili.h)0
-rw-r--r--keyboards/ydkb/chili/config.h (renamed from keyboards/chili/config.h)0
-rw-r--r--keyboards/ydkb/chili/info.json (renamed from keyboards/chili/info.json)0
-rw-r--r--keyboards/ydkb/chili/keymaps/default/keymap.c (renamed from keyboards/chili/keymaps/default/keymap.c)0
-rw-r--r--keyboards/ydkb/chili/keymaps/via/keymap.c (renamed from keyboards/chili/keymaps/via/keymap.c)0
-rw-r--r--keyboards/ydkb/chili/keymaps/via/rules.mk (renamed from keyboards/seigaiha/keymaps/via/rules.mk)0
-rw-r--r--keyboards/ydkb/chili/readme.md15
-rw-r--r--keyboards/ydkb/chili/rules.mk (renamed from keyboards/chili/rules.mk)0
-rw-r--r--keyboards/ydkb/just60/config.h (renamed from keyboards/just60/config.h)0
-rw-r--r--keyboards/ydkb/just60/info.json (renamed from keyboards/just60/info.json)0
-rw-r--r--keyboards/ydkb/just60/just60.h (renamed from keyboards/just60/just60.h)0
-rw-r--r--keyboards/ydkb/just60/keymaps/default/keymap.c (renamed from keyboards/just60/keymaps/default/keymap.c)0
-rw-r--r--keyboards/ydkb/just60/keymaps/default/readme.md (renamed from keyboards/just60/keymaps/default/readme.md)0
-rw-r--r--keyboards/ydkb/just60/keymaps/thinxer/keymap.c (renamed from keyboards/just60/keymaps/thinxer/keymap.c)0
-rw-r--r--keyboards/ydkb/just60/keymaps/thinxer/readme.md (renamed from keyboards/just60/keymaps/thinxer/readme.md)0
-rw-r--r--keyboards/ydkb/just60/keymaps/thinxer/rules.mk (renamed from keyboards/just60/keymaps/thinxer/rules.mk)0
-rw-r--r--keyboards/ydkb/just60/readme.md17
-rw-r--r--keyboards/ydkb/just60/rules.mk (renamed from keyboards/just60/rules.mk)0
-rw-r--r--keyboards/ydkb/yd68/config.h (renamed from keyboards/yd68/config.h)0
-rw-r--r--keyboards/ydkb/yd68/info.json (renamed from keyboards/yd68/info.json)0
-rw-r--r--keyboards/ydkb/yd68/keymaps/default/keymap.c (renamed from keyboards/yd68/keymaps/default/keymap.c)0
-rw-r--r--keyboards/ydkb/yd68/keymaps/default/readme.md (renamed from keyboards/yd68/keymaps/default/readme.md)0
-rw-r--r--keyboards/ydkb/yd68/readme.md15
-rw-r--r--keyboards/ydkb/yd68/rules.mk (renamed from keyboards/yd68/rules.mk)0
-rw-r--r--keyboards/ydkb/yd68/yd68.c (renamed from keyboards/yd68/yd68.c)0
-rw-r--r--keyboards/ydkb/yd68/yd68.h (renamed from keyboards/yd68/yd68.h)0
-rw-r--r--keyboards/yiancardesigns/barleycorn/barleycorn.c (renamed from keyboards/barleycorn/barleycorn.c)0
-rw-r--r--keyboards/yiancardesigns/barleycorn/barleycorn.h (renamed from keyboards/barleycorn/barleycorn.h)0
-rw-r--r--keyboards/yiancardesigns/barleycorn/config.h (renamed from keyboards/barleycorn/config.h)0
-rw-r--r--keyboards/yiancardesigns/barleycorn/info.json (renamed from keyboards/barleycorn/info.json)0
-rw-r--r--keyboards/yiancardesigns/barleycorn/keymaps/default/keymap.c (renamed from keyboards/barleycorn/keymaps/default/keymap.c)0
-rw-r--r--keyboards/yiancardesigns/barleycorn/keymaps/default/readme.md (renamed from keyboards/barleycorn/keymaps/default/readme.md)0
-rw-r--r--keyboards/yiancardesigns/barleycorn/keymaps/iso/keymap.c (renamed from keyboards/barleycorn/keymaps/iso/keymap.c)0
-rw-r--r--keyboards/yiancardesigns/barleycorn/keymaps/iso/readme.md (renamed from keyboards/barleycorn/keymaps/iso/readme.md)0
-rw-r--r--keyboards/yiancardesigns/barleycorn/keymaps/via/keymap.c (renamed from keyboards/barleycorn/keymaps/via/keymap.c)0
-rw-r--r--keyboards/yiancardesigns/barleycorn/keymaps/via/readme.md (renamed from keyboards/barleycorn/keymaps/via/readme.md)0
-rw-r--r--keyboards/yiancardesigns/barleycorn/keymaps/via/rules.mk (renamed from keyboards/wings42/rev1/keymaps/via/rules.mk)0
-rw-r--r--keyboards/yiancardesigns/barleycorn/matrix.c (renamed from keyboards/barleycorn/matrix.c)0
-rw-r--r--keyboards/yiancardesigns/barleycorn/readme.md23
-rw-r--r--keyboards/yiancardesigns/barleycorn/rules.mk (renamed from keyboards/barleycorn/rules.mk)0
-rw-r--r--keyboards/yiancardesigns/gingham/config.h (renamed from keyboards/gingham/config.h)0
-rw-r--r--keyboards/yiancardesigns/gingham/gingham.c (renamed from keyboards/gingham/gingham.c)0
-rw-r--r--keyboards/yiancardesigns/gingham/gingham.h (renamed from keyboards/gingham/gingham.h)0
-rw-r--r--keyboards/yiancardesigns/gingham/info.json (renamed from keyboards/gingham/info.json)0
-rw-r--r--keyboards/yiancardesigns/gingham/keymaps/codecoffeecode/keymap.c (renamed from keyboards/gingham/keymaps/codecoffeecode/keymap.c)0
-rw-r--r--keyboards/yiancardesigns/gingham/keymaps/codecoffeecode/readme.md (renamed from keyboards/gingham/keymaps/codecoffeecode/readme.md)0
-rw-r--r--keyboards/yiancardesigns/gingham/keymaps/default/keymap.c (renamed from keyboards/gingham/keymaps/default/keymap.c)0
-rw-r--r--keyboards/yiancardesigns/gingham/keymaps/default/readme.md (renamed from keyboards/gingham/keymaps/default/readme.md)0
-rw-r--r--keyboards/yiancardesigns/gingham/keymaps/iso/keymap.c (renamed from keyboards/gingham/keymaps/iso/keymap.c)0
-rw-r--r--keyboards/yiancardesigns/gingham/keymaps/iso/readme.md (renamed from keyboards/gingham/keymaps/iso/readme.md)0
-rw-r--r--keyboards/yiancardesigns/gingham/keymaps/via/keymap.c (renamed from keyboards/gingham/keymaps/via/keymap.c)0
-rw-r--r--keyboards/yiancardesigns/gingham/keymaps/via/readme.md (renamed from keyboards/gingham/keymaps/via/readme.md)0
-rw-r--r--keyboards/yiancardesigns/gingham/keymaps/via/rules.mk (renamed from keyboards/wings42/rev1_extkeys/keymaps/via/rules.mk)0
-rw-r--r--keyboards/yiancardesigns/gingham/matrix.c (renamed from keyboards/gingham/matrix.c)0
-rw-r--r--keyboards/yiancardesigns/gingham/readme.md23
-rw-r--r--keyboards/yiancardesigns/gingham/rules.mk (renamed from keyboards/gingham/rules.mk)0
-rw-r--r--keyboards/yiancardesigns/seigaiha/config.h (renamed from keyboards/seigaiha/config.h)0
-rw-r--r--keyboards/yiancardesigns/seigaiha/info.json (renamed from keyboards/seigaiha/info.json)0
-rw-r--r--keyboards/yiancardesigns/seigaiha/keymaps/default/keymap.c (renamed from keyboards/seigaiha/keymaps/default/keymap.c)0
-rw-r--r--keyboards/yiancardesigns/seigaiha/keymaps/default/readme.md (renamed from keyboards/seigaiha/keymaps/default/readme.md)0
-rw-r--r--keyboards/yiancardesigns/seigaiha/keymaps/via/keymap.c (renamed from keyboards/seigaiha/keymaps/via/keymap.c)0
-rw-r--r--keyboards/yiancardesigns/seigaiha/keymaps/via/readme.md (renamed from keyboards/seigaiha/keymaps/via/readme.md)0
-rw-r--r--keyboards/yiancardesigns/seigaiha/keymaps/via/rules.mk (renamed from keyboards/yasui/keymaps/via/rules.mk)0
-rw-r--r--keyboards/yiancardesigns/seigaiha/matrix.c (renamed from keyboards/seigaiha/matrix.c)0
-rw-r--r--keyboards/yiancardesigns/seigaiha/readme.md23
-rw-r--r--keyboards/yiancardesigns/seigaiha/rules.mk (renamed from keyboards/seigaiha/rules.mk)0
-rw-r--r--keyboards/yiancardesigns/seigaiha/seigaiha.c (renamed from keyboards/seigaiha/seigaiha.c)0
-rw-r--r--keyboards/yiancardesigns/seigaiha/seigaiha.h (renamed from keyboards/seigaiha/seigaiha.h)0
-rw-r--r--keyboards/ymd75/readme.md24
-rw-r--r--keyboards/ymd75/rules.mk1
-rw-r--r--keyboards/ymd75/ymd75.h11
-rw-r--r--keyboards/ymd96/readme.md19
-rw-r--r--keyboards/ymdk/np21/config.h (renamed from keyboards/ymdk_np21/config.h)0
-rw-r--r--keyboards/ymdk/np21/info.json (renamed from keyboards/ymdk_np21/info.json)0
-rw-r--r--keyboards/ymdk/np21/keymaps/default/keymap.c (renamed from keyboards/ymdk_np21/keymaps/default/keymap.c)0
-rw-r--r--keyboards/ymdk/np21/keymaps/default/readme.md (renamed from keyboards/ymdk_np21/keymaps/default/readme.md)0
-rw-r--r--keyboards/ymdk/np21/keymaps/via/keymap.c (renamed from keyboards/ymdk_np21/keymaps/via/keymap.c)0
-rw-r--r--keyboards/ymdk/np21/keymaps/via/rules.mk (renamed from keyboards/ymdk_np21/keymaps/via/rules.mk)0
-rw-r--r--keyboards/ymdk/np21/np21.c19
-rw-r--r--keyboards/ymdk/np21/np21.h (renamed from keyboards/ymdk_np21/ymdk_np21.h)0
-rw-r--r--keyboards/ymdk/np21/readme.md21
-rw-r--r--keyboards/ymdk/np21/rules.mk (renamed from keyboards/ymdk_np21/rules.mk)0
-rw-r--r--keyboards/ymdk/ymd75/.noci (renamed from keyboards/ymd75/.noci)0
-rw-r--r--keyboards/ymdk/ymd75/config.h (renamed from keyboards/ymd75/config.h)0
-rw-r--r--keyboards/ymdk/ymd75/info.json (renamed from keyboards/ymd75/info.json)0
-rw-r--r--keyboards/ymdk/ymd75/keymaps/default/keymap.c (renamed from keyboards/ymd75/keymaps/default/keymap.c)0
-rw-r--r--keyboards/ymdk/ymd75/keymaps/default_iso/keymap.c (renamed from keyboards/ymd75/keymaps/default_iso/keymap.c)0
-rw-r--r--keyboards/ymdk/ymd75/keymaps/default_iso_rwkl/keymap.c (renamed from keyboards/ymd75/keymaps/default_iso_rwkl/keymap.c)0
-rw-r--r--keyboards/ymdk/ymd75/keymaps/via/keymap.c (renamed from keyboards/ymd75/keymaps/via/keymap.c)0
-rw-r--r--keyboards/ymdk/ymd75/keymaps/via/rules.mk (renamed from keyboards/ymd75/keymaps/via/rules.mk)0
-rw-r--r--keyboards/ymdk/ymd75/readme.md24
-rw-r--r--keyboards/ymdk/ymd75/rev1/.noci (renamed from keyboards/ymd75/rev1/.noci)0
-rw-r--r--keyboards/ymdk/ymd75/rev1/config.h (renamed from keyboards/ymd75/rev1/config.h)0
-rw-r--r--keyboards/ymdk/ymd75/rev1/rev1.c (renamed from keyboards/ymd75/rev1/rev1.c)0
-rw-r--r--keyboards/ymdk/ymd75/rev1/rev1.h (renamed from keyboards/ymd75/rev1/rev1.h)0
-rw-r--r--keyboards/ymdk/ymd75/rev1/rules.mk (renamed from keyboards/ymd75/rev1/rules.mk)0
-rw-r--r--keyboards/ymdk/ymd75/rev2/.noci (renamed from keyboards/ymd75/rev2/.noci)0
-rw-r--r--keyboards/ymdk/ymd75/rev2/config.h (renamed from keyboards/ymd75/rev2/config.h)0
-rw-r--r--keyboards/ymdk/ymd75/rev2/rev2.c (renamed from keyboards/ymd75/rev2/rev2.c)0
-rw-r--r--keyboards/ymdk/ymd75/rev2/rev2.h (renamed from keyboards/ymd75/rev2/rev2.h)0
-rw-r--r--keyboards/ymdk/ymd75/rev2/rules.mk (renamed from keyboards/ymd75/rev2/rules.mk)0
-rw-r--r--keyboards/ymdk/ymd75/rev3/config.h (renamed from keyboards/ymd75/rev3/config.h)0
-rw-r--r--keyboards/ymdk/ymd75/rev3/rev3.c (renamed from keyboards/ymd75/rev3/rev3.c)0
-rw-r--r--keyboards/ymdk/ymd75/rev3/rev3.h (renamed from keyboards/ymd75/rev3/rev3.h)0
-rw-r--r--keyboards/ymdk/ymd75/rev3/rules.mk (renamed from keyboards/ymd75/rev3/rules.mk)0
-rw-r--r--keyboards/ymdk/ymd75/rules.mk1
-rw-r--r--keyboards/ymdk/ymd75/ymd75.c (renamed from keyboards/ymd75/ymd75.c)0
-rw-r--r--keyboards/ymdk/ymd75/ymd75.h11
-rw-r--r--keyboards/ymdk/ymd96/config.h (renamed from keyboards/ymd96/config.h)0
-rw-r--r--keyboards/ymdk/ymd96/info.json (renamed from keyboards/ymd96/info.json)0
-rw-r--r--keyboards/ymdk/ymd96/keymaps/AnthonyWharton/README.md (renamed from keyboards/ymd96/keymaps/AnthonyWharton/README.md)0
-rw-r--r--keyboards/ymdk/ymd96/keymaps/AnthonyWharton/config.h (renamed from keyboards/ymd96/keymaps/AnthonyWharton/config.h)0
-rw-r--r--keyboards/ymdk/ymd96/keymaps/AnthonyWharton/keymap.c (renamed from keyboards/ymd96/keymaps/AnthonyWharton/keymap.c)0
-rw-r--r--keyboards/ymdk/ymd96/keymaps/default/keymap.c (renamed from keyboards/ymd96/keymaps/default/keymap.c)0
-rw-r--r--keyboards/ymdk/ymd96/keymaps/epx/keymap.c (renamed from keyboards/ymd96/keymaps/epx/keymap.c)0
-rw-r--r--keyboards/ymdk/ymd96/keymaps/hgoel89/config.h (renamed from keyboards/ymd96/keymaps/hgoel89/config.h)0
-rw-r--r--keyboards/ymdk/ymd96/keymaps/hgoel89/keymap.c (renamed from keyboards/ymd96/keymaps/hgoel89/keymap.c)0
-rw-r--r--keyboards/ymdk/ymd96/keymaps/hgoel89/readme.md (renamed from keyboards/ymd96/keymaps/hgoel89/readme.md)0
-rw-r--r--keyboards/ymdk/ymd96/keymaps/hgoel89/rules.mk (renamed from keyboards/ymd96/keymaps/hgoel89/rules.mk)0
-rw-r--r--keyboards/ymdk/ymd96/readme.md19
-rw-r--r--keyboards/ymdk/ymd96/rules.mk (renamed from keyboards/ymd96/rules.mk)0
-rw-r--r--keyboards/ymdk/ymd96/ymd96.c (renamed from keyboards/ymd96/ymd96.c)0
-rw-r--r--keyboards/ymdk/ymd96/ymd96.h (renamed from keyboards/ymd96/ymd96.h)0
-rw-r--r--keyboards/ymdk_np21/readme.md21
-rw-r--r--keyboards/ymdk_np21/ymdk_np21.c19
-rw-r--r--keyboards/yosino58/rev1/matrix.c6
-rwxr-xr-xlib/python/qmk/cli/generate/develop_pr_list.py2
-rw-r--r--lib/python/qmk/info.py7
-rw-r--r--platforms/arm_atsam/bootloader.c57
-rw-r--r--platforms/arm_atsam/bootloaders/md_boot.c72
-rw-r--r--platforms/arm_atsam/gpio.h12
-rw-r--r--platforms/avr/bootloader.c293
-rw-r--r--platforms/avr/bootloaders/bootloadhid.c33
-rw-r--r--platforms/avr/bootloaders/caterina.c39
-rw-r--r--platforms/avr/bootloaders/dfu.c52
-rw-r--r--platforms/avr/bootloaders/halfkay.c128
-rw-r--r--platforms/avr/bootloaders/none.c19
-rw-r--r--platforms/avr/bootloaders/usbasploader.c56
-rw-r--r--platforms/avr/drivers/i2c_master.c7
-rw-r--r--platforms/avr/drivers/serial.c7
-rw-r--r--platforms/avr/gpio.h17
-rw-r--r--platforms/chibios/boards/BLACKPILL_STM32_F401/configs/bootloader_defs.h5
-rw-r--r--platforms/chibios/boards/BLACKPILL_STM32_F411/configs/bootloader_defs.h5
-rw-r--r--platforms/chibios/boards/GENERIC_STM32_F042X6/configs/bootloader_defs.h5
-rw-r--r--platforms/chibios/boards/GENERIC_STM32_F072XB/configs/bootloader_defs.h5
-rw-r--r--platforms/chibios/boards/GENERIC_STM32_F303XC/configs/bootloader_defs.h5
-rw-r--r--platforms/chibios/boards/GENERIC_STM32_F405XG/configs/config.h2
-rw-r--r--platforms/chibios/boards/GENERIC_STM32_F407XE/configs/config.h2
-rw-r--r--platforms/chibios/boards/GENERIC_STM32_F446XE/configs/config.h2
-rw-r--r--platforms/chibios/boards/GENERIC_STM32_G431XB/configs/config.h23
-rw-r--r--platforms/chibios/boards/GENERIC_STM32_L412XB/configs/config.h1
-rw-r--r--platforms/chibios/boards/GENERIC_STM32_L433XC/configs/config.h1
-rw-r--r--platforms/chibios/boards/GENERIC_WB32_F3G71XX/configs/bootloader_defs.h12
-rw-r--r--platforms/chibios/boards/QMK_PROTON_C/configs/bootloader_defs.h7
-rw-r--r--platforms/chibios/bootloader.c145
-rw-r--r--platforms/chibios/bootloaders/gd32v_dfu.c40
-rw-r--r--platforms/chibios/bootloaders/halfkay.c25
-rw-r--r--platforms/chibios/bootloaders/kiibohd.c32
-rw-r--r--platforms/chibios/bootloaders/none.c23
-rw-r--r--platforms/chibios/bootloaders/stm32_dfu.c94
-rw-r--r--platforms/chibios/bootloaders/stm32duino.c21
-rw-r--r--platforms/chibios/bootloaders/tinyuf2.c34
-rw-r--r--platforms/chibios/drivers/i2c_master.c59
-rw-r--r--platforms/chibios/drivers/i2c_master.h61
-rw-r--r--platforms/chibios/gpio.h24
-rw-r--r--platforms/common.mk2
-rw-r--r--platforms/test/bootloaders/none.c (renamed from platforms/test/bootloader.c)0
-rw-r--r--quantum/action.c16
-rw-r--r--quantum/action_util.c9
-rw-r--r--quantum/audio/audio.c3
-rw-r--r--quantum/debounce.h2
-rw-r--r--quantum/debounce/asym_eager_defer_pk.c1
-rw-r--r--quantum/debounce/none.c2
-rw-r--r--quantum/debounce/sym_defer_g.c2
-rw-r--r--quantum/debounce/sym_defer_pk.c1
-rw-r--r--quantum/debounce/sym_defer_pr.c72
-rw-r--r--quantum/debounce/sym_eager_pk.c1
-rw-r--r--quantum/debounce/sym_eager_pr.c1
-rw-r--r--quantum/debounce/tests/rules.mk5
-rw-r--r--quantum/debounce/tests/sym_defer_pr_tests.cpp238
-rw-r--r--quantum/debounce/tests/testlist.mk1
-rw-r--r--quantum/deferred_exec.c85
-rw-r--r--quantum/deferred_exec.h119
-rw-r--r--quantum/keyboard.c83
-rw-r--r--quantum/led_matrix/led_matrix.h4
-rw-r--r--quantum/matrix.c35
-rw-r--r--quantum/matrix.h3
-rw-r--r--quantum/matrix_common.c80
-rw-r--r--quantum/pointing_device.c389
-rw-r--r--quantum/pointing_device.h16
-rw-r--r--quantum/pointing_device_drivers.c65
-rw-r--r--quantum/process_keycode/process_audio.c1
-rw-r--r--quantum/process_keycode/process_audio.h1
-rw-r--r--quantum/process_keycode/process_combo.c39
-rw-r--r--quantum/process_keycode/process_key_lock.c5
-rw-r--r--quantum/process_keycode/process_key_lock.h1
-rw-r--r--quantum/process_keycode/process_magic.c4
-rw-r--r--quantum/process_keycode/process_printer.c5
-rw-r--r--quantum/process_keycode/process_printer.h2
-rw-r--r--quantum/process_keycode/process_rgb.c6
-rw-r--r--quantum/quantum.c12
-rw-r--r--quantum/quantum.h4
-rw-r--r--quantum/quantum_keycodes.h3
-rw-r--r--quantum/rgb_matrix/animations/pixel_fractal_anim.h4
-rw-r--r--quantum/split_common/split_util.h1
-rw-r--r--quantum/split_common/transaction_id_define.h6
-rw-r--r--quantum/split_common/transactions.c81
-rw-r--r--quantum/split_common/transport.h13
-rw-r--r--quantum/wpm.c75
-rw-r--r--quantum/wpm.h2
-rw-r--r--readme.md4
-rw-r--r--tests/auto_shift/test_auto_shift.cpp3
-rw-r--r--tests/basic/test_action_layer.cpp33
-rw-r--r--tests/basic/test_keypress.cpp55
-rw-r--r--tests/basic/test_one_shot_keys.cpp8
-rw-r--r--tests/tap_hold_configurations/permissive_hold/test_tap_hold.cpp3
-rw-r--r--tests/tap_hold_configurations/permissive_hold_ignore_mod_tap_interrupt/test_tap_hold.cpp3
-rw-r--r--tests/tap_hold_configurations/tapping_force_hold/test_action_layer.cpp3
-rw-r--r--tests/tap_hold_configurations/tapping_force_hold/test_tap_hold.cpp2
-rw-r--r--tests/test_common/test_fixture.cpp3
-rw-r--r--tmk_core/protocol/arm_atsam/arm_atsam_protocol.h1
-rw-r--r--tmk_core/protocol/arm_atsam/md_bootloader.h24
-rw-r--r--tmk_core/protocol/arm_atsam/startup.c6
-rw-r--r--tmk_core/protocol/arm_atsam/usb/udc.c5
-rw-r--r--tmk_core/protocol/chibios/usb_main.c2
-rw-r--r--tmk_core/protocol/lufa/lufa.c77
-rw-r--r--tmk_core/protocol/usb_descriptor.c2
-rw-r--r--tmk_core/protocol/vusb/vusb.c1
-rw-r--r--users/cedrikl/cedrikl.c36
-rw-r--r--users/cedrikl/cedrikl.h21
-rw-r--r--users/cedrikl/config.h25
-rw-r--r--users/cedrikl/rules.mk4
-rw-r--r--users/drashna/oled/oled_stuff.c13
-rw-r--r--users/drashna/oled/oled_stuff.h2
-rw-r--r--users/vitoni/readme.adoc16
-rw-r--r--users/vitoni/rgb_matrix_effects.c236
-rw-r--r--users/vitoni/rgb_matrix_effects.h174
-rw-r--r--users/vitoni/rules.mk4
-rw-r--r--users/vitoni/utils.c129
-rw-r--r--users/vitoni/utils.h80
-rw-r--r--users/vitoni/vitoni.c131
-rw-r--r--users/vitoni/vitoni.h30
-rwxr-xr-xutil/update_chibios_mirror.sh8
1602 files changed, 9400 insertions, 10098 deletions
diff --git a/build_test.mk b/build_test.mk
index 136a0455f0..ec6699b4ea 100644
--- a/build_test.mk
+++ b/build_test.mk
@@ -43,6 +43,7 @@ all: elf
VPATH += $(COMMON_VPATH)
PLATFORM:=TEST
PLATFORM_KEY:=test
+BOOTLOADER_TYPE:=none
ifeq ($(strip $(DEBUG)), 1)
CONSOLE_ENABLE = yes
diff --git a/builddefs/bootloader.mk b/builddefs/bootloader.mk
index ccb92392d9..470febc346 100644
--- a/builddefs/bootloader.mk
+++ b/builddefs/bootloader.mk
@@ -30,6 +30,7 @@
# bootloadhid HIDBootFlash compatible (ATmega32A)
# usbasploader USBaspLoader (ATmega328P)
# ARM:
+# halfkay PJRC Teensy
# kiibohd Input:Club Kiibohd bootloader (only used on their boards)
# stm32duino STM32Duino (STM32F103x8)
# stm32-dfu STM32 USB DFU in ROM
@@ -43,6 +44,8 @@
ifeq ($(strip $(BOOTLOADER)), atmel-dfu)
OPT_DEFS += -DBOOTLOADER_ATMEL_DFU
OPT_DEFS += -DBOOTLOADER_DFU
+ BOOTLOADER_TYPE = dfu
+
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
BOOTLOADER_SIZE = 4096
endif
@@ -53,6 +56,8 @@ endif
ifeq ($(strip $(BOOTLOADER)), lufa-dfu)
OPT_DEFS += -DBOOTLOADER_LUFA_DFU
OPT_DEFS += -DBOOTLOADER_DFU
+ BOOTLOADER_TYPE = dfu
+
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
BOOTLOADER_SIZE ?= 4096
endif
@@ -63,6 +68,8 @@ endif
ifeq ($(strip $(BOOTLOADER)), qmk-dfu)
OPT_DEFS += -DBOOTLOADER_QMK_DFU
OPT_DEFS += -DBOOTLOADER_DFU
+ BOOTLOADER_TYPE = dfu
+
ifneq (,$(filter $(MCU), at90usb162 atmega16u2 atmega32u2 atmega16u4 atmega32u4 at90usb646 at90usb647))
BOOTLOADER_SIZE ?= 4096
endif
@@ -73,10 +80,14 @@ endif
ifeq ($(strip $(BOOTLOADER)), qmk-hid)
OPT_DEFS += -DBOOTLOADER_QMK_HID
OPT_DEFS += -DBOOTLOADER_HID
+ BOOTLOADER_TYPE = dfu
+
BOOTLOADER_SIZE ?= 4096
endif
ifeq ($(strip $(BOOTLOADER)), halfkay)
OPT_DEFS += -DBOOTLOADER_HALFKAY
+ BOOTLOADER_TYPE = halfkay
+
ifeq ($(strip $(MCU)), atmega32u4)
BOOTLOADER_SIZE = 512
endif
@@ -86,18 +97,26 @@ ifeq ($(strip $(BOOTLOADER)), halfkay)
endif
ifeq ($(strip $(BOOTLOADER)), caterina)
OPT_DEFS += -DBOOTLOADER_CATERINA
+ BOOTLOADER_TYPE = caterina
+
BOOTLOADER_SIZE = 4096
endif
ifneq (,$(filter $(BOOTLOADER), bootloadhid bootloadHID))
OPT_DEFS += -DBOOTLOADER_BOOTLOADHID
+ BOOTLOADER_TYPE = bootloadhid
+
BOOTLOADER_SIZE = 4096
endif
ifneq (,$(filter $(BOOTLOADER), usbasploader USBasp))
OPT_DEFS += -DBOOTLOADER_USBASP
+ BOOTLOADER_TYPE = usbasploader
+
BOOTLOADER_SIZE = 4096
endif
ifeq ($(strip $(BOOTLOADER)), lufa-ms)
OPT_DEFS += -DBOOTLOADER_MS
+ BOOTLOADER_TYPE = dfu
+
BOOTLOADER_SIZE ?= 8192
FIRMWARE_FORMAT = bin
cpfirmware: lufa_warning
@@ -115,6 +134,7 @@ endif
ifeq ($(strip $(BOOTLOADER)), stm32-dfu)
OPT_DEFS += -DBOOTLOADER_STM32_DFU
+ BOOTLOADER_TYPE = stm32_dfu
# Options to pass to dfu-util when flashing
DFU_ARGS ?= -d 0483:DF11 -a 0 -s 0x08000000:leave
@@ -122,6 +142,7 @@ ifeq ($(strip $(BOOTLOADER)), stm32-dfu)
endif
ifeq ($(strip $(BOOTLOADER)), apm32-dfu)
OPT_DEFS += -DBOOTLOADER_APM32_DFU
+ BOOTLOADER_TYPE = stm32_dfu
# Options to pass to dfu-util when flashing
DFU_ARGS ?= -d 314B:0106 -a 0 -s 0x08000000:leave
@@ -129,6 +150,7 @@ ifeq ($(strip $(BOOTLOADER)), apm32-dfu)
endif
ifeq ($(strip $(BOOTLOADER)), gd32v-dfu)
OPT_DEFS += -DBOOTLOADER_GD32V_DFU
+ BOOTLOADER_TYPE = gd32v_dfu
# Options to pass to dfu-util when flashing
DFU_ARGS ?= -d 28E9:0189 -a 0 -s 0x08000000:leave
@@ -136,6 +158,8 @@ ifeq ($(strip $(BOOTLOADER)), gd32v-dfu)
endif
ifeq ($(strip $(BOOTLOADER)), kiibohd)
OPT_DEFS += -DBOOTLOADER_KIIBOHD
+ BOOTLOADER_TYPE = kiibohd
+
ifeq ($(strip $(MCU_ORIG)), MK20DX128)
MCU_LDSCRIPT = MK20DX128BLDR4
endif
@@ -151,8 +175,7 @@ ifeq ($(strip $(BOOTLOADER)), stm32duino)
OPT_DEFS += -DBOOTLOADER_STM32DUINO
MCU_LDSCRIPT = STM32F103x8_stm32duino_bootloader
BOARD = STM32_F103_STM32DUINO
- # STM32F103 does NOT have an USB bootloader in ROM (only serial), so setting anything here does not make much sense
- STM32_BOOTLOADER_ADDRESS = 0x80000000
+ BOOTLOADER_TYPE = stm32duino
# Options to pass to dfu-util when flashing
DFU_ARGS = -d 1EAF:0003 -a 2 -R
@@ -160,4 +183,17 @@ ifeq ($(strip $(BOOTLOADER)), stm32duino)
endif
ifeq ($(strip $(BOOTLOADER)), tinyuf2)
OPT_DEFS += -DBOOTLOADER_TINYUF2
+ BOOTLOADER_TYPE = tinyuf2
+endif
+ifeq ($(strip $(BOOTLOADER)), halfkay)
+ OPT_DEFS += -DBOOTLOADER_HALFKAY
+ BOOTLOADER_TYPE = halfkay
+endif
+ifeq ($(strip $(BOOTLOADER)), md-boot)
+ OPT_DEFS += -DBOOTLOADER_MD_BOOT
+ BOOTLOADER_TYPE = md_boot
+endif
+
+ifeq ($(strip $(BOOTLOADER_TYPE)),)
+ BOOTLOADER_TYPE = none
endif
diff --git a/builddefs/mcu_selection.mk b/builddefs/mcu_selection.mk
index 46d34aabe4..3a5768de73 100644
--- a/builddefs/mcu_selection.mk
+++ b/builddefs/mcu_selection.mk
@@ -143,6 +143,9 @@ ifneq ($(findstring STM32F042, $(MCU)),)
# This ensures that the EEPROM page buffer fits into RAM
USE_PROCESS_STACKSIZE = 0x600
USE_EXCEPTIONS_STACKSIZE = 0x300
+
+ # Bootloader address for STM32 DFU
+ STM32_BOOTLOADER_ADDRESS ?= 0x1FFFC400
endif
ifneq ($(findstring STM32F072, $(MCU)),)
@@ -175,6 +178,9 @@ ifneq ($(findstring STM32F072, $(MCU)),)
# UF2 settings
UF2_FAMILY ?= STM32F0
+
+ # Bootloader address for STM32 DFU
+ STM32_BOOTLOADER_ADDRESS ?= 0x1FFFC800
endif
ifneq ($(findstring STM32F103, $(MCU)),)
@@ -239,6 +245,9 @@ ifneq ($(findstring STM32F303, $(MCU)),)
# UF2 settings
UF2_FAMILY ?= STM32F3
+
+ # Bootloader address for STM32 DFU
+ STM32_BOOTLOADER_ADDRESS ?= 0x1FFFD800
endif
ifneq ($(findstring STM32F401, $(MCU)),)
@@ -276,6 +285,9 @@ ifneq ($(findstring STM32F401, $(MCU)),)
# UF2 settings
UF2_FAMILY ?= STM32F4
+
+ # Bootloader address for STM32 DFU
+ STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
endif
ifneq ($(findstring STM32F405, $(MCU)),)
@@ -308,6 +320,9 @@ ifneq ($(findstring STM32F405, $(MCU)),)
# UF2 settings
UF2_FAMILY ?= STM32F4
+
+ # Bootloader address for STM32 DFU
+ STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
endif
ifneq ($(findstring STM32F407, $(MCU)),)
@@ -340,6 +355,9 @@ ifneq ($(findstring STM32F407, $(MCU)),)
# UF2 settings
UF2_FAMILY ?= STM32F4
+
+ # Bootloader address for STM32 DFU
+ STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
endif
ifneq ($(findstring STM32F411, $(MCU)),)
@@ -377,6 +395,9 @@ ifneq ($(findstring STM32F411, $(MCU)),)
# UF2 settings
UF2_FAMILY ?= STM32F4
+
+ # Bootloader address for STM32 DFU
+ STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
endif
ifneq ($(findstring STM32F446, $(MCU)),)
@@ -406,6 +427,9 @@ ifneq ($(findstring STM32F446, $(MCU)),)
BOARD ?= GENERIC_STM32_F446XE
USE_FPU ?= yes
+
+ # Bootloader address for STM32 DFU
+ STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
endif
ifneq ($(findstring STM32G431, $(MCU)),)
@@ -438,6 +462,9 @@ ifneq ($(findstring STM32G431, $(MCU)),)
# UF2 settings
UF2_FAMILY ?= STM32G4
+
+ # Bootloader address for STM32 DFU
+ STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
endif
ifneq ($(findstring STM32G474, $(MCU)),)
@@ -470,6 +497,9 @@ ifneq ($(findstring STM32G474, $(MCU)),)
# UF2 settings
UF2_FAMILY ?= STM32G4
+
+ # Bootloader address for STM32 DFU
+ STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
endif
ifneq (,$(filter $(MCU),STM32L433 STM32L443))
@@ -504,6 +534,9 @@ ifneq (,$(filter $(MCU),STM32L433 STM32L443))
# UF2 settings
UF2_FAMILY ?= STM32L4
+
+ # Bootloader address for STM32 DFU
+ STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
endif
ifneq (,$(filter $(MCU),STM32L412 STM32L422))
@@ -538,6 +571,9 @@ ifneq (,$(filter $(MCU),STM32L412 STM32L422))
# UF2 settings
UF2_FAMILY ?= STM32L4
+
+ # Bootloader address for STM32 DFU
+ STM32_BOOTLOADER_ADDRESS ?= 0x1FFF0000
endif
ifneq ($(findstring WB32F3G71, $(MCU)),)
@@ -567,6 +603,10 @@ ifneq ($(findstring WB32F3G71, $(MCU)),)
BOARD ?= GENERIC_WB32_F3G71XX
USE_FPU ?= no
+
+ # Bootloader address for WB32 DFU
+ STM32_BOOTLOADER_ADDRESS ?= 0x1FFFE000
+ WB32_BOOTLOADER_ADDRESS ?= 0x1FFFE000
endif
ifneq ($(findstring GD32VF103, $(MCU)),)
diff --git a/builddefs/message.mk b/builddefs/message.mk
index cb4ef43719..1187491452 100644
--- a/builddefs/message.mk
+++ b/builddefs/message.mk
@@ -87,6 +87,7 @@ define GENERATE_MSG_AVAILABLE_KEYMAPS
endef
MSG_AVAILABLE_KEYMAPS = $(eval $(call GENERATE_MSG_AVAILABLE_KEYMAPS))$(MSG_AVAILABLE_KEYMAPS_ACTUAL)
+MSG_BOOTLOADER_NOT_FOUND_BASE = Bootloader not found. Make sure the board is in bootloader mode. See https://docs.qmk.fm/\#/newbs_flashing\n
MSG_CHECK_FILESIZE = Checking file size of $(TARGET).$(FIRMWARE_FORMAT)
MSG_CHECK_FILESIZE_SKIPPED = (Firmware size check does not yet support $(MCU_ORIG); skipping)
MSG_FILE_TOO_BIG = $(ERROR_COLOR)The firmware is too large!$(NO_COLOR) $(CURRENT_SIZE)/$(MAX_SIZE) ($(OVER_SIZE) bytes over)\n
@@ -97,6 +98,6 @@ MSG_PYTHON_MISSING = $(ERROR_COLOR)ERROR:$(NO_COLOR) Cannot run \"qmk hello\"!\n
Please run $(BOLD)qmk setup$(NO_COLOR) to install all the dependencies QMK requires.\n\n
MSG_FLASH_BOOTLOADER = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's bootloader is not specified or is not supported by the \":flash\" target at this time.\n\n
MSG_FLASH_ARCH = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's architecture is not supported by the \":flash\" target at this time.\n\n
-MSG_BOOTLOADER_NOT_FOUND = $(ERROR_COLOR)ERROR:$(NO_COLOR) Bootloader not found. Trying again in 5s (Ctrl+C to cancel)\n
+MSG_BOOTLOADER_NOT_FOUND = $(ERROR_COLOR)ERROR:$(NO_COLOR) $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again in 5s (Ctrl+C to cancel)\n
BOOTLOADER_RETRY_TIME ?= 0.5
-MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY = Bootloader not found. Trying again every $(BOOTLOADER_RETRY_TIME)s (Ctrl+C to cancel)
+MSG_BOOTLOADER_NOT_FOUND_QUICK_RETRY = $(MSG_BOOTLOADER_NOT_FOUND_BASE) Trying again every $(BOOTLOADER_RETRY_TIME)s (Ctrl+C to cancel)
diff --git a/common_features.mk b/common_features.mk
index 8c593024f0..b13f9a45d2 100644
--- a/common_features.mk
+++ b/common_features.mk
@@ -109,7 +109,7 @@ ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/mousekey.c
endif
-VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick cirque_pinnacle_i2c cirque_pinnacle_spi pmw3360 pimoroni_trackball custom
+VALID_POINTING_DEVICE_DRIVER_TYPES := adns5050 adns9800 analog_joystick cirque_pinnacle_i2c cirque_pinnacle_spi pmw3360 pmw3389 pimoroni_trackball custom
POINTING_DEVICE_DRIVER ?= custom
ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
ifeq ($(filter $(POINTING_DEVICE_DRIVER),$(VALID_POINTING_DEVICE_DRIVER_TYPES)),)
@@ -144,6 +144,9 @@ ifeq ($(strip $(POINTING_DEVICE_ENABLE)), yes)
else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pmw3360)
OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
QUANTUM_LIB_SRC += spi_master.c
+ else ifeq ($(strip $(POINTING_DEVICE_DRIVER)), pmw3389)
+ OPT_DEFS += -DSTM32_SPI -DHAL_USE_SPI=TRUE
+ QUANTUM_LIB_SRC += spi_master.c
endif
endif
endif
@@ -356,7 +359,7 @@ endif
ifeq ($(strip $(PRINTING_ENABLE)), yes)
OPT_DEFS += -DPRINTING_ENABLE
SRC += $(QUANTUM_DIR)/process_keycode/process_printer.c
- SRC += $(TMK_DIR)/protocol/serial_uart.c
+ QUANTUM_LIB_SRC += uart.c
endif
VARIABLE_TRACE ?= no
@@ -604,6 +607,7 @@ ifeq ($(strip $(UNICODE_ENABLE)), yes)
endif
ifeq ($(strip $(UNICODE_COMMON)), yes)
+ OPT_DEFS += -DUNICODE_COMMON_ENABLE
SRC += $(QUANTUM_DIR)/process_keycode/process_unicode_common.c
endif
@@ -719,6 +723,7 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
ifeq ($(strip $(BLUETOOTH_DRIVER)), RN42)
OPT_DEFS += -DMODULE_RN42
- SRC += $(TMK_DIR)/protocol/serial_uart.c
+ SRC += $(DRIVER_PATH)/bluetooth/rn42.c
+ QUANTUM_LIB_SRC += uart.c
endif
endif
diff --git a/data/mappings/keyboard_aliases.json b/data/mappings/keyboard_aliases.json
index b1c1acba8f..c30d90f43d 100644
--- a/data/mappings/keyboard_aliases.json
+++ b/data/mappings/keyboard_aliases.json
@@ -221,6 +221,9 @@
LAYOUT: 'LAYOUT_all'
}
},
+ idobo: {
+ target: 'idobao/id75'
+ },
'jj40': {
target: 'kprepublic/jj40'
},
diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema
index 308f9b782b..94bbbe7e85 100644
--- a/data/schemas/keyboard.jsonschema
+++ b/data/schemas/keyboard.jsonschema
@@ -57,7 +57,7 @@
},
"bootloader": {
"type": "string",
- "enum": ["atmel-dfu", "bootloadhid", "bootloadHID", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "micronucleus", "qmk-dfu", "qmk-hid", "stm32-dfu", "stm32duino", "gd32v-dfu", "wb32-dfu", "unknown", "usbasploader", "USBasp", "tinyuf2"],
+ "enum": ["atmel-dfu", "bootloadhid", "bootloadHID", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "md-boot", "micronucleus", "qmk-dfu", "qmk-hid", "stm32-dfu", "stm32duino", "gd32v-dfu", "wb32-dfu", "unknown", "usbasploader", "USBasp", "tinyuf2"],
},
"bootloader_instructions": {
"type": "string",
@@ -69,7 +69,7 @@
"properties": {
"debounce_type": {
"type": "string",
- "enum": ["custom", "eager_pk", "eager_pr", "sym_defer_pk", "sym_eager_pk"]
+ "enum": ["custom", "eager_pk", "eager_pr", "sym_defer_pk", "sym_defer_pr", "sym_eager_pk"]
},
"firmware_format": {
"type": "string",
diff --git a/docs/ChangeLog/20220226/PR15304.md b/docs/ChangeLog/20220226/PR15304.md
new file mode 100644
index 0000000000..3cdb40db10
--- /dev/null
+++ b/docs/ChangeLog/20220226/PR15304.md
@@ -0,0 +1,13 @@
+### Split Common core now supports Pointing Devices ([#15304](https://github.com/qmk/qmk_firmware/pull/15304))
+
+Pointing devices can now be shared across a split keyboard with support for a single pointing device or a pointing device on each side.
+
+This feature can be enabled with `#define SPLIT_POINTING_ENABLE` and one of the following options:
+
+| Setting | Description |
+|---------------------------|------------------------------------|
+|`POINTING_DEVICE_LEFT` | Pointing device on the left side |
+|`POINTING_DEVICE_RIGHT` | Pointing device on the right side |
+|`POINTING_DEVICE_COMBINED` | Pointing device on both sides |
+
+See the [Pointing Device](../feature_pointing_device.md) documentation for further configuration options.
diff --git a/docs/feature_combo.md b/docs/feature_combo.md
index 47128c431b..c0e10f09d5 100644
--- a/docs/feature_combo.md
+++ b/docs/feature_combo.md
@@ -141,10 +141,13 @@ Processing combos has two buffers, one for the key presses, another for the comb
## Modifier Combos
If a combo resolves to a Modifier, the window for processing the combo can be extended independently from normal combos. By default, this is disabled but can be enabled with `#define COMBO_MUST_HOLD_MODS`, and the time window can be configured with `#define COMBO_HOLD_TERM 150` (default: `TAPPING_TERM`). With `COMBO_MUST_HOLD_MODS`, you cannot tap the combo any more which makes the combo less prone to misfires.
-## Per Combo Timing, Holding and Tapping
-For each combo, it is possible to configure the time window it has to pressed in, if it needs to be held down, or if it needs to be tapped.
+## Strict key press order
+By defining `COMBO_MUST_PRESS_IN_ORDER` combos only activate when the keys are pressed in the same order as they are defined in the key array.
-For example, tap-only combos are useful if any (or all) of the underlying keys is a Mod-Tap or a Layer-Tap key. When you tap the combo, you get the combo result. When you press the combo and hold it down, the combo doesn't actually activate. Instead the keys are processed separately as if the combo wasn't even there.
+## Per Combo Timing, Holding, Tapping and Key Press Order
+For each combo, it is possible to configure the time window it has to pressed in, if it needs to be held down, if it needs to be tapped, or if its keys need to be pressed in order.
+
+For example, tap-only combos are useful if any (or all) of the underlying keys are mod-tap or layer-tap keys. When you tap the combo, you get the combo result. When you press the combo and hold it down, the combo doesn't activate. Instead the keys are processed separately as if the combo wasn't even there.
In order to use these features, the following configuration options and functions need to be defined. Coming up with useful timings and configuration is left as an exercise for the reader.
@@ -153,6 +156,7 @@ In order to use these features, the following configuration options and function
| `COMBO_TERM_PER_COMBO` | uint16_t get_combo_term(uint16_t index, combo_t \*combo) | Optional per-combo timeout window. (default: `COMBO_TERM`) |
| `COMBO_MUST_HOLD_PER_COMBO` | bool get_combo_must_hold(uint16_t index, combo_t \*combo) | Controls if a given combo should fire immediately on tap or if it needs to be held. (default: `false`) |
| `COMBO_MUST_TAP_PER_COMBO` | bool get_combo_must_tap(uint16_t index, combo_t \*combo) | Controls if a given combo should fire only if tapped within `COMBO_HOLD_TERM`. (default: `false`) |
+| `COMBO_MUST_PRESS_IN_ORDER_PER_COMBO` | bool get_combo_must_press_in_order(uint16_t index, combo_t \*combo) | Controls if a given combo should fire only if its keys are pressed in order. (default: `true`) |
Examples:
```c
@@ -216,6 +220,38 @@ bool get_combo_must_tap(uint16_t index, combo_t *combo) {
return false;
}
+
+bool get_combo_must_press_in_order(uint16_t combo_index, combo_t *combo) {
+ switch (combo_index) {
+ /* List combos here that you want to only activate if their keys
+ * are pressed in the same order as they are defined in the combo's key
+ * array. */
+ case COMBO_NAME_HERE:
+ return true;
+ default:
+ return false;
+ }
+}
+```
+
+## Generic hook to (dis)allow a combo activation
+
+By defining `COMBO_SHOULD_TRIGGER` and its companying function `bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode, keyrecord_t *record)` you can block or allow combos to activate on the conditions of your choice.
+For example, you could disallow some combos on the base layer and allow them on another. Or disable combos on the home row when a timer is running.
+
+Examples:
+```c
+bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode, keyrecord_t *record) {
+ /* Disable combo `SOME_COMBO` on layer `_LAYER_A` */
+ switch (combo_index) {
+ case SOME_COMBO:
+ if (layer_state_is(_LAYER_A)) {
+ return false;
+ }
+ }
+
+ return true;
+}
```
## Variable Length Combos
diff --git a/docs/feature_debounce_type.md b/docs/feature_debounce_type.md
index f37a785b1e..9cd736a24a 100644
--- a/docs/feature_debounce_type.md
+++ b/docs/feature_debounce_type.md
@@ -116,6 +116,7 @@ Where name of algorithm is one of:
For use in keyboards where refreshing ```NUM_KEYS``` 8-bit counters is computationally expensive / low scan rate, and fingers usually only hit one row at a time. This could be
appropriate for the ErgoDox models; the matrix is rotated 90°, and hence its "rows" are really columns, and each finger only hits a single "row" at a time in normal use.
* ```sym_eager_pk``` - debouncing per key. On any state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key
+* ```sym_defer_pr``` - debouncing per row. On any state change, a per-row timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that row, the entire row is pushed. Can improve responsiveness over `sym_defer_g` while being less susceptible than per-key debouncers to noise.
* ```sym_defer_pk``` - debouncing per key. On any state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that key, the key status change is pushed.
* ```asym_eager_defer_pk``` - debouncing per key. On a key-down state change, response is immediate, followed by ```DEBOUNCE``` milliseconds of no further input for that key. On a key-up state change, a per-key timer is set. When ```DEBOUNCE``` milliseconds of no changes have occurred on that key, the key-up status change is pushed.
diff --git a/docs/feature_haptic_feedback.md b/docs/feature_haptic_feedback.md
index c8c74cb8f0..bbdf7e122c 100644
--- a/docs/feature_haptic_feedback.md
+++ b/docs/feature_haptic_feedback.md
@@ -167,7 +167,7 @@ List of waveform sequences from the datasheet:
```
#define DRV_GREETING *sequence name or number*
```
-If haptic feedback is enabled, the keyboard will vibrate to a specific sqeuence during startup. That can be selected using the following define:
+If haptic feedback is enabled, the keyboard will vibrate to a specific sequence during startup. That can be selected using the following define:
```
#define DRV_MODE_DEFAULT *sequence name or number*
@@ -207,4 +207,4 @@ With the entry of `#define NO_HAPTIC_LOCKKEYS` in config.h, none of the followin
With the entry of `#define NO_HAPTIC_NAV` in config.h, none of the following keys will trigger a feedback: Print Screen, Pause, Insert, Delete, Page Down, Page Up, Left Arrow, Up Arrow, Right Arrow, Down Arrow, End, Home.
### NO_HAPTIC_NUMERIC
-With the entry of `#define NO_HAPTIC_NUMERIC` in config.h, none of the following keys between 0 and 9 (KC_1 ... KC_0) will trigger a feedback. \ No newline at end of file
+With the entry of `#define NO_HAPTIC_NUMERIC` in config.h, none of the following keys between 0 and 9 (KC_1 ... KC_0) will trigger a feedback.
diff --git a/docs/feature_key_lock.md b/docs/feature_key_lock.md
index 8e6e29f0e6..7681394229 100644
--- a/docs/feature_key_lock.md
+++ b/docs/feature_key_lock.md
@@ -19,4 +19,5 @@ First, enable Key Lock by setting `KEY_LOCK_ENABLE = yes` in your `rules.mk`. Th
Key Lock is only able to hold standard action keys and [One Shot modifier](one_shot_keys.md) keys (for example, if you have your Shift defined as `OSM(KC_LSFT)`).
This does not include any of the QMK special functions (except One Shot modifiers), or shifted versions of keys such as `KC_LPRN`. If it's in the [Basic Keycodes](keycodes_basic.md) list, it can be held.
-Switching layers will not cancel the Key Lock.
+Switching layers will not cancel the Key Lock. The Key Lock can be cancelled by calling the `cancel_key_lock()` function.
+
diff --git a/docs/feature_pointing_device.md b/docs/feature_pointing_device.md
index 098a787ed8..5f1260eede 100644
--- a/docs/feature_pointing_device.md
+++ b/docs/feature_pointing_device.md
@@ -30,7 +30,7 @@ The ADNS 5050 sensor uses a serial type protocol for communication, and requires
The CPI range is 125-1375, in increments of 125. Defaults to 500 CPI.
-### ADSN 9800 Sensor
+### ADNS 9800 Sensor
To use the ADNS 9800 sensor, add this to your `rules.mk`
@@ -69,7 +69,7 @@ The Analog Joystick is an analog (ADC) driven sensor. There are a variety of jo
|`ANALOG_JOYSTICK_AXIS_MAX` | (Optional) Sets the upper range to be considered movement. | `1023` |
|`ANALOG_JOYSTICK_SPEED_REGULATOR` | (Optional) The divisor used to slow down movement. (lower makes it faster) | `20` |
|`ANALOG_JOYSTICK_READ_INTERVAL` | (Optional) The interval in milliseconds between reads. | `10` |
-|`ANALOG_JOYSTICK_SPEED_MAX` | (Optional) The maxiumum value used for motion. | `2` |
+|`ANALOG_JOYSTICK_SPEED_MAX` | (Optional) The maximum value used for motion. | `2` |
|`ANALOG_JOYSTICK_CLICK_PIN` | (Optional) The pin wired up to the press switch of the analog stick. | _not defined_ |
@@ -127,11 +127,10 @@ The Pimoroni Trackball module is a I2C based breakout board with an RGB enable t
| Setting | Description | Default |
|-------------------------------------|------------------------------------------------------------------------------------|---------|
|`PIMORONI_TRACKBALL_ADDRESS` | (Required) Sets the I2C Address for the Pimoroni Trackball. | `0x0A` |
-|`PIMORONI_TRACKBALL_TIMEOUT` | (Optional) The timeout for i2c communication with the trackpad in milliseconds. | `100` |
-|`PIMORONI_TRACKBALL_INTERVAL_MS` | (Optional) The update/read interval for the sensor in milliseconds. | `8` |
+|`PIMORONI_TRACKBALL_TIMEOUT` | (Optional) The timeout for i2c communication with the trackball in milliseconds. | `100` |
|`PIMORONI_TRACKBALL_SCALE` | (Optional) The multiplier used to generate reports from the sensor. | `5` |
|`PIMORONI_TRACKBALL_DEBOUNCE_CYCLES` | (Optional) The number of scan cycles used for debouncing on the ball press. | `20` |
-|`PIMORONI_TRACKBALL_ERROR_COUNT` | (Optional) Specifies the number of read/write errors until the sensor is disabled. | `10` |
+|`PIMORONI_TRACKBALL_ERROR_COUNT` | (Optional) Specifies the number of read/write errors until the sensor is disabled. | `10` |
### PMW 3360 Sensor
@@ -145,16 +144,39 @@ The PMW 3360 is an SPI driven optical sensor, that uses a built in IR LED for su
| Setting | Description | Default |
|-----------------------------|--------------------------------------------------------------------------------------------|---------------|
-|`PMW3360_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
-|`PMW3360_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
-|`PMW3360_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
-|`PMW3360_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
-|`PMW3360_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
-|`PMW3360_LIFTOFF_DISTANCE` | (Optional) Sets the lift off distance at run time | `0x02` |
-|`ROTATIONAL_TRANSFORM_ANGLE` | (Optional) Allows for the sensor data to be rotated +/- 30 degrees directly in the sensor. | `0` |
+|`PMW3360_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
+|`PMW3360_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
+|`PMW3360_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
+|`PMW3360_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
+|`PMW3360_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
+|`PMW3360_LIFTOFF_DISTANCE` | (Optional) Sets the lift off distance at run time | `0x02` |
+|`ROTATIONAL_TRANSFORM_ANGLE` | (Optional) Allows for the sensor data to be rotated +/- 127 degrees directly in the sensor. | `0` |
+|`PMW3360_LEGACY_FIRMWARE_UPLOAD` | (Optional) Switches to older, manual upload of firmware, for compatibility. | _not defined_ |
The CPI range is 100-12000, in increments of 100. Defaults to 1600 CPI.
+### PMW 3389 Sensor
+
+To use the PMW 3389 sensor, add this to your `rules.mk`
+
+```make
+POINTING_DEVICE_DRIVER = pmw3389
+```
+
+The PMW 3389 is an SPI driven optical sensor, that uses a built in IR LED for surface tracking.
+
+| Setting | Description | Default |
+|---------------------------------|--------------------------------------------------------------------------------------------|---------------|
+|`PMW3389_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
+|`PMW3389_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `2000000` |
+|`PMW3389_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
+|`PMW3389_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `3` |
+|`PMW3389_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
+|`PMW3389_LIFTOFF_DISTANCE` | (Optional) Sets the lift off distance at run time | `0x02` |
+|`ROTATIONAL_TRANSFORM_ANGLE` | (Optional) Allows for the sensor data to be rotated +/- 30 degrees directly in the sensor. | `0` |
+
+The CPI range is 50-16000, in increments of 50. Defaults to 2000 CPI.
+
### Custom Driver
@@ -171,14 +193,35 @@ void pointing_device_driver_set_cpi(uint16_t cpi) {}
## Common Configuration
-| Setting | Description | Default |
-|-------------------------------|-----------------------------------------------------------------------|---------------|
-|`POINTING_DEVICE_ROTATION_90` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
-|`POINTING_DEVICE_ROTATION_180` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
-|`POINTING_DEVICE_ROTATION_270` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
-|`POINTING_DEVICE_INVERT_X` | (Optional) Inverts the X axis report. | _not defined_ |
-|`POINTING_DEVICE_INVERT_Y` | (Optional) Inverts the Y axis report. | _not defined_ |
-|`POINTING_DEVICE_MOTION_PIN` | (Optional) If supported, will only read from sensor if pin is active. | _not defined_ |
+| Setting | Description | Default |
+|----------------------------------|-----------------------------------------------------------------------|-------------------|
+|`POINTING_DEVICE_ROTATION_90` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
+|`POINTING_DEVICE_ROTATION_180` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
+|`POINTING_DEVICE_ROTATION_270` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
+|`POINTING_DEVICE_INVERT_X` | (Optional) Inverts the X axis report. | _not defined_ |
+|`POINTING_DEVICE_INVERT_Y` | (Optional) Inverts the Y axis report. | _not defined_ |
+|`POINTING_DEVICE_MOTION_PIN` | (Optional) If supported, will only read from sensor if pin is active. | _not defined_ |
+|`POINTING_DEVICE_TASK_THROTTLE_MS` | (Optional) Limits the frequency that the sensor is polled for motion. | _not defined_ |
+
+!> When using `SPLIT_POINTING_ENABLE` the `POINTING_DEVICE_MOTION_PIN` functionality is not supported and would recommend `POINTING_DEVICE_TASK_THROTTLE_MS` be set to `1`. Increasing this value will increase transport performance at the cost of possible mouse responsiveness.
+
+
+## Split Keyboard Configuration
+
+The following configuration options are only available when using `SPLIT_POINTING_ENABLE` see [data sync options](feature_split_keyboard.md?id=data-sync-options). The rotation and invert `*_RIGHT` options are only used with `POINTING_DEVICE_COMBINED`. If using `POINTING_DEVICE_LEFT` or `POINTING_DEVICE_RIGHT` use the common configuration above to configure your pointing device.
+
+| Setting | Description | Default |
+|----------------------------------------|-----------------------------------------------------------------------|---------------|
+|`POINTING_DEVICE_LEFT` | Pointing device on the left side (Required - pick one only) | _not defined_ |
+|`POINTING_DEVICE_RIGHT` | Pointing device on the right side (Required - pick one only) | _not defined_ |
+|`POINTING_DEVICE_COMBINED` | Pointing device on both sides (Required - pick one only) | _not defined_ |
+|`POINTING_DEVICE_ROTATION_90_RIGHT` | (Optional) Rotates the X and Y data by 90 degrees. | _not defined_ |
+|`POINTING_DEVICE_ROTATION_180_RIGHT` | (Optional) Rotates the X and Y data by 180 degrees. | _not defined_ |
+|`POINTING_DEVICE_ROTATION_270_RIGHT` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
+|`POINTING_DEVICE_INVERT_X_RIGHT` | (Optional) Inverts the X axis report. | _not defined_ |
+|`POINTING_DEVICE_INVERT_Y_RIGHT` | (Optional) Inverts the Y axis report. | _not defined_ |
+
+!> If there is a `_RIGHT` configuration option or callback, the [common configuration](feature_pointing_device.md?id=common-configuration) option will work for the left. For correct left/right detection you should setup a [handedness option](feature_split_keyboard?id=setting-handedness), `EE_HANDS` is usually a good option for an existing board that doesn't do handedness by hardware.
## Callbacks and Functions
@@ -188,7 +231,7 @@ void pointing_device_driver_set_cpi(uint16_t cpi) {}
| `pointing_device_init_kb(void)` | Callback to allow for keyboard level initialization. Useful for additional hardware sensors. |
| `pointing_device_init_user(void)` | Callback to allow for user level initialization. Useful for additional hardware sensors. |
| `pointing_device_task_kb(mouse_report)` | Callback that sends sensor data, so keyboard code can intercept and modify the data. Returns a mouse report. |
-| `pointing_device_task_user(mouse_report)` | Callback that sends sensor data, so user coe can intercept and modify the data. Returns a mouse report. |
+| `pointing_device_task_user(mouse_report)` | Callback that sends sensor data, so user code can intercept and modify the data. Returns a mouse report. |
| `pointing_device_handle_buttons(buttons, pressed, button)` | Callback to handle hardware button presses. Returns a `uint8_t`. |
| `pointing_device_get_cpi(void)` | Gets the current CPI/DPI setting from the sensor, if supported. |
| `pointing_device_set_cpi(uint16_t)` | Sets the CPI/DPI, if supported. |
@@ -196,6 +239,21 @@ void pointing_device_driver_set_cpi(uint16_t cpi) {}
| `pointing_device_set_report(mouse_report)` | Sets the mouse report to the assigned `mouse_report_t` data structured passed to the function. |
| `pointing_device_send(void)` | Sends the current mouse report to the host system. Function can be replaced. |
| `has_mouse_report_changed(old, new)` | Compares the old and new `mouse_report_t` data and returns true only if it has changed. |
+| `pointing_device_adjust_by_defines(mouse_report)` | Applies rotations and invert configurations to a raw mouse report. |
+
+
+## Split Keyboard Callbacks and Functions
+
+The combined functions below are only available when using `SPLIT_POINTING_ENABLE` and `POINTING_DEVICE_COMBINED`. The 2 callbacks `pointing_device_task_combined_*` replace the single sided equivalents above. See the [combined pointing devices example](feature_pointing_device.md?id=combined-pointing-devices)
+
+| Function | Description |
+|-----------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------|
+| `pointing_device_set_shared_report(mouse_report)` | Sets the shared mouse report to the assigned `mouse_report_t` data structured passed to the function. |
+| `pointing_device_set_cpi_on_side(bool, uint16_t)` | Sets the CPI/DPI of one side, if supported. Passing `true` will set the left and `false` the right` |
+| `pointing_device_combine_reports(left_report, right_report)` | Returns a combined mouse_report of left_report and right_report (as a `mouse_report_t` data structure) |
+| `pointing_device_task_combined_kb(left_report, right_report)` | Callback, so keyboard code can intercept and modify the data. Returns a combined mouse report. |
+| `pointing_device_task_combined_user(left_report, right_report)` | Callback, so user code can intercept and modify. Returns a combined mouse report using `pointing_device_combine_reports` |
+| `pointing_device_adjust_by_defines_right(mouse_report)` | Applies right side rotations and invert configurations to a raw mouse report. |
# Manipulating Mouse Reports
@@ -274,3 +332,62 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
```
This allows you to toggle between scrolling and cursor movement by pressing the DRAG_SCROLL key.
+
+## Split Examples
+
+The following examples make use the `SPLIT_POINTING_ENABLE` functionality and show how to manipulate the mouse report for a scrolling mode.
+
+### Single Pointing Device
+
+The following example will work with either `POINTING_DEVICE_LEFT` or `POINTING_DEVICE_RIGHT` and enables scrolling mode while on a particular layer.
+
+```c
+
+static bool scrolling_mode = false;
+
+layer_state_t layer_state_set_user(layer_state_t state) {
+ switch (get_highest_layer(state)) {
+ case _RAISE: // If we're on the _RAISE layer enable scrolling mode
+ scrolling_mode = true;
+ pointing_device_set_cpi(2000);
+ break;
+ default:
+ if (scrolling_mode) { // check if we were scrolling before and set disable if so
+ scrolling_mode = false;
+ pointing_device_set_cpi(8000);
+ }
+ break;
+ }
+ return state;
+}
+
+report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) {
+ if (scrolling_mode) {
+ mouse_report.h = mouse_report.x;
+ mouse_report.v = mouse_report.y;
+ mouse_report.x = 0;
+ mouse_report.y = 0;
+ }
+ return mouse_report;
+}
+```
+
+### Combined Pointing Devices
+
+The following example requires `POINTING_DEVICE_COMBINED` and sets the left side pointing device to scroll only.
+
+```c
+void keyboard_post_init_user(void) {
+ pointing_device_set_cpi_on_side(true, 1000); //Set cpi on left side to a low value for slower scrolling.
+ pointing_device_set_cpi_on_side(false, 8000); //Set cpi on right side to a reasonable value for mousing.
+}
+
+report_mouse_t pointing_device_task_combined_user(report_mouse_t left_report, report_mouse_t right_report) {
+ left_report.h = left_report.x;
+ left_report.v = left_report.y;
+ left_report.x = 0;
+ left_report.y = 0;
+ return pointing_device_combine_reports(left_report, right_report);
+}
+```
+=======
diff --git a/docs/feature_split_keyboard.md b/docs/feature_split_keyboard.md
index dbc7740f98..6ef70bf788 100644
--- a/docs/feature_split_keyboard.md
+++ b/docs/feature_split_keyboard.md
@@ -273,6 +273,14 @@ This enables transmitting the current OLED on/off status to the slave side of th
This enables transmitting the current ST7565 on/off status to the slave side of the split keyboard. The purpose of this feature is to support state (on/off state only) syncing.
+```c
+#define SPLIT_POINTING_ENABLE
+```
+
+This enables transmitting the pointing device status to the master side of the split keyboard. The purpose of this feature is to enable use pointing devices on the slave side.
+
+!> There is additional required configuration for `SPLIT_POINTING_ENABLE` outlined in the [pointing device documentation](feature_pointing_device.md?id=split-keyboard-configuration).
+
### Custom data sync between sides :id=custom-data-sync
QMK's split transport allows for arbitrary data transactions at both the keyboard and user levels. This is modelled on a remote procedure call, with the master invoking a function on the slave side, with the ability to send data from master to slave, process it slave side, and send data back from slave to master.
diff --git a/docs/feature_wpm.md b/docs/feature_wpm.md
index 87145c97e3..9f98ef8336 100644
--- a/docs/feature_wpm.md
+++ b/docs/feature_wpm.md
@@ -16,7 +16,7 @@ For split keyboards using soft serial, the computed WPM score will be available
| `WPM_ALLOW_COUNT_REGRESSION` | _Not defined_ | If defined allows the WPM to be decreased when hitting Delete or Backspace |
| `WPM_UNFILTERED` | _Not defined_ | If undefined (the default), WPM values will be smoothed to avoid sudden changes in value |
| `WPM_SAMPLE_SECONDS` | `5` | This defines how many seconds of typing to average, when calculating WPM |
-| `WPM_SAMPLE_PERIODS` | `50` | This defines how many sampling periods to use when calculating WPM |
+| `WPM_SAMPLE_PERIODS` | `25` | This defines how many sampling periods to use when calculating WPM |
| `WPM_LAUNCH_CONTROL` | _Not defined_ | If defined, WPM values will be calculated using partial buffers when typing begins |
'WPM_UNFILTERED' is potentially useful if you're filtering data in some other way (and also because it reduces the code required for the WPM feature), or if reducing measurement latency to a minimum is important for you.
diff --git a/docs/internals_gpio_control.md b/docs/internals_gpio_control.md
index ccd3f8c74d..e1f1515b71 100644
--- a/docs/internals_gpio_control.md
+++ b/docs/internals_gpio_control.md
@@ -6,17 +6,19 @@ QMK has a GPIO control abstraction layer which is microcontroller agnostic. This
The following functions provide basic control of GPIOs and are found in `platforms/<platform>/gpio.h`.
-|Function |Description | Old AVR Examples | Old ChibiOS/ARM Examples |
-|------------------------|--------------------------------------------------|-------------------------------------------------|-------------------------------------------------|
-| `setPinInput(pin)` | Set pin as input with high impedance (High-Z) | `DDRB &= ~(1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT)` |
-| `setPinInputHigh(pin)` | Set pin as input with builtin pull-up resistor | `DDRB &= ~(1<<2); PORTB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT_PULLUP)` |
-| `setPinInputLow(pin)` | Set pin as input with builtin pull-down resistor | N/A (Not supported on AVR) | `palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN)` |
-| `setPinOutput(pin)` | Set pin as output | `DDRB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)` |
-| `writePinHigh(pin)` | Set pin level as high, assuming it is an output | `PORTB \|= (1<<2)` | `palSetLine(pin)` |
-| `writePinLow(pin)` | Set pin level as low, assuming it is an output | `PORTB &= ~(1<<2)` | `palClearLine(pin)` |
-| `writePin(pin, level)` | Set pin level, assuming it is an output | `(level) ? PORTB \|= (1<<2) : PORTB &= ~(1<<2)` | `(level) ? palSetLine(pin) : palClearLine(pin)` |
-| `readPin(pin)` | Returns the level of the pin | `_SFR_IO8(pin >> 4) & _BV(pin & 0xF)` | `palReadLine(pin)` |
-| `togglePin(pin)` | Invert pin level, assuming it is an output | `PORTB ^= (1<<2)` | `palToggleLine(pin)` |
+| Function | Description | Old AVR Examples | Old ChibiOS/ARM Examples |
+|------------------------------|-----------------------------------------------------|-------------------------------------------------|--------------------------------------------------|
+| `setPinInput(pin)` | Set pin as input with high impedance (High-Z) | `DDRB &= ~(1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT)` |
+| `setPinInputHigh(pin)` | Set pin as input with builtin pull-up resistor | `DDRB &= ~(1<<2); PORTB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_INPUT_PULLUP)` |
+| `setPinInputLow(pin)` | Set pin as input with builtin pull-down resistor | N/A (Not supported on AVR) | `palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN)` |
+| `setPinOutput(pin)` | Set pin as output (alias of `setPinOutputPushPull`) | `DDRB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)` |
+| `setPinOutputPushPull(pin)` | Set pin as output, push/pull mode | `DDRB \|= (1<<2)` | `palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)` |
+| `setPinOutputOpenDrain(pin)` | Set pin as output, open-drain mode | N/A (Not implemented on AVR) | `palSetLineMode(pin, PAL_MODE_OUTPUT_OPENDRAIN)` |
+| `writePinHigh(pin)` | Set pin level as high, assuming it is an output | `PORTB \|= (1<<2)` | `palSetLine(pin)` |
+| `writePinLow(pin)` | Set pin level as low, assuming it is an output | `PORTB &= ~(1<<2)` | `palClearLine(pin)` |
+| `writePin(pin, level)` | Set pin level, assuming it is an output | `(level) ? PORTB \|= (1<<2) : PORTB &= ~(1<<2)` | `(level) ? palSetLine(pin) : palClearLine(pin)` |
+| `readPin(pin)` | Returns the level of the pin | `_SFR_IO8(pin >> 4) & _BV(pin & 0xF)` | `palReadLine(pin)` |
+| `togglePin(pin)` | Invert pin level, assuming it is an output | `PORTB ^= (1<<2)` | `palToggleLine(pin)` |
## Advanced Settings :id=advanced-settings
diff --git a/docs/keycodes.md b/docs/keycodes.md
index 84a6d456ba..dba530fc79 100644
--- a/docs/keycodes.md
+++ b/docs/keycodes.md
@@ -326,6 +326,7 @@ See also: [Magic Keycodes](keycodes_magic.md)
|----------------------------------|---------|--------------------------------------------------------------------------|
|`MAGIC_SWAP_CONTROL_CAPSLOCK` |`CL_SWAP`|Swap Caps Lock and Left Control |
|`MAGIC_UNSWAP_CONTROL_CAPSLOCK` |`CL_NORM`|Unswap Caps Lock and Left Control |
+|`MAGIC_TOGGLE_CONTROL_CAPSLOCK` |`CL_TOGG`|Toggle Caps Lock and Left Control swap |
|`MAGIC_CAPSLOCK_TO_CONTROL` |`CL_CTRL`|Treat Caps Lock as Control |
|`MAGIC_UNCAPSLOCK_TO_CONTROL` |`CL_CAPS`|Stop treating Caps Lock as Control |
|`MAGIC_SWAP_LCTL_LGUI` |`LCG_SWP`|Swap Left Control and GUI |
diff --git a/docs/keycodes_magic.md b/docs/keycodes_magic.md
index 7e1b1a4f62..01eb69168e 100644
--- a/docs/keycodes_magic.md
+++ b/docs/keycodes_magic.md
@@ -6,6 +6,7 @@
|----------------------------------|---------|--------------------------------------------------------------------------|
|`MAGIC_SWAP_CONTROL_CAPSLOCK` |`CL_SWAP`|Swap Caps Lock and Left Control |
|`MAGIC_UNSWAP_CONTROL_CAPSLOCK` |`CL_NORM`|Unswap Caps Lock and Left Control |
+|`MAGIC_TOGGLE_CONTROL_CAPSLOCK` |`CL_TOGG`|Toggle Caps Lock and Left Control swap |
|`MAGIC_CAPSLOCK_TO_CONTROL` |`CL_CTRL`|Treat Caps Lock as Control |
|`MAGIC_UNCAPSLOCK_TO_CONTROL` |`CL_CAPS`|Stop treating Caps Lock as Control |
|`MAGIC_SWAP_LCTL_LGUI` |`LCG_SWP`|Swap Left Control and GUI |
diff --git a/docs/platformdev_chibios_earlyinit.md b/docs/platformdev_chibios_earlyinit.md
index eb932bc774..aaa91ba438 100644
--- a/docs/platformdev_chibios_earlyinit.md
+++ b/docs/platformdev_chibios_earlyinit.md
@@ -17,7 +17,6 @@ As such, if you wish to override this API consider limiting use to writing to lo
| `config.h` override | Description | Default |
|-----------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|
| `#define EARLY_INIT_PERFORM_BOOTLOADER_JUMP` | Whether or not bootloader is to be executed during the early initialisation code of QMK. | `FALSE` |
-| `#define STM32_BOOTLOADER_ADDRESS` | Relevant for single-bank STM32 MCUs, signifies the memory address to jump to bootloader. Consult [AN2606](https://www.st.com/content/st_com/en/search.html#q=an2606-t=resources-page=1) for the _System Memory_ address for your MCU. This value should be of the format `0x11111111`. | `<none>` |
| `#define STM32_BOOTLOADER_DUAL_BANK` | Relevant for dual-bank STM32 MCUs, signifies that a GPIO is to be toggled in order to enter bootloader mode. | `FALSE` |
| `#define STM32_BOOTLOADER_DUAL_BANK_GPIO` | Relevant for dual-bank STM32 MCUs, the pin to toggle when attempting to enter bootloader mode, e.g. `B8` | `<none>` |
| `#define STM32_BOOTLOADER_DUAL_BANK_POLARITY` | Relevant for dual-bank STM32 MCUs, the value to set the pin to in order to trigger charging of the RC circuit. e.g. `0` or `1`. | `0` |
diff --git a/drivers/bluetooth/rn42.c b/drivers/bluetooth/rn42.c
new file mode 100644
index 0000000000..2ef40bb7e0
--- /dev/null
+++ b/drivers/bluetooth/rn42.c
@@ -0,0 +1,99 @@
+/* Copyright 2021
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "report.h"
+#include "uart.h"
+
+#ifndef RN42_BAUD_RATE
+# define RN42_BAUD_RATE 115200
+#endif
+
+// https://cdn.sparkfun.com/datasheets/Wireless/Bluetooth/bluetooth_cr_UG-v1.0r.pdf#G7.663734
+static inline uint16_t rn42_consumer_usage_to_bitmap(uint16_t usage) {
+ switch (usage) {
+ case AC_HOME:
+ return 0x0001;
+ case AL_EMAIL:
+ return 0x0002;
+ case AC_SEARCH:
+ return 0x0004;
+ case AL_KEYBOARD_LAYOUT:
+ return 0x0008;
+ case AUDIO_VOL_UP:
+ return 0x0010;
+ case AUDIO_VOL_DOWN:
+ return 0x0020;
+ case AUDIO_MUTE:
+ return 0x0040;
+ case TRANSPORT_PLAY_PAUSE:
+ return 0x0080;
+ case TRANSPORT_NEXT_TRACK:
+ return 0x0100;
+ case TRANSPORT_PREV_TRACK:
+ return 0x0200;
+ case TRANSPORT_STOP:
+ return 0x0400;
+ case TRANSPORT_EJECT:
+ return 0x0800;
+ case TRANSPORT_FAST_FORWARD:
+ return 0x1000;
+ case TRANSPORT_REWIND:
+ return 0x2000;
+ case TRANSPORT_STOP_EJECT:
+ return 0x4000;
+ case AL_LOCAL_BROWSER:
+ return 0x8000;
+ default:
+ return 0;
+ }
+}
+
+void rn42_init(void) { uart_init(RN42_BAUD_RATE); }
+
+void rn42_send_keyboard(report_keyboard_t *report) {
+ uart_write(0xFD);
+ uart_write(0x09);
+ uart_write(0x01);
+ uart_write(report->mods);
+ uart_write(0x00);
+ for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) {
+ uart_write(report->keys[i]);
+ }
+}
+
+void rn42_send_mouse(report_mouse_t *report) {
+ uart_write(0xFD);
+ uart_write(0x00);
+ uart_write(0x03);
+ uart_write(report->buttons);
+ uart_write(report->x);
+ uart_write(report->y);
+ uart_write(report->v); // should try sending the wheel v here
+ uart_write(report->h); // should try sending the wheel h here
+ uart_write(0x00);
+}
+
+void rn42_send_consumer(uint16_t data) {
+ static uint16_t last_data = 0;
+ if (data == last_data) return;
+ last_data = data;
+ uint16_t bitmap = rn42_consumer_usage_to_bitmap(data);
+ uart_write(0xFD);
+ uart_write(0x03);
+ uart_write(0x03);
+ uart_write(bitmap & 0xFF);
+ uart_write((bitmap >> 8) & 0xFF);
+}
diff --git a/drivers/bluetooth/rn42.h b/drivers/bluetooth/rn42.h
new file mode 100644
index 0000000000..4747759111
--- /dev/null
+++ b/drivers/bluetooth/rn42.h
@@ -0,0 +1,25 @@
+/* Copyright 2021
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "report.h"
+
+void rn42_init(void);
+
+void rn42_send_keyboard(report_keyboard_t *report);
+
+void rn42_send_mouse(report_mouse_t *report);
+
+void rn42_send_consumer(uint16_t data);
diff --git a/drivers/led/issi/is31fl3733-simple.c b/drivers/led/issi/is31fl3733-simple.c
new file mode 100644
index 0000000000..777895bf89
--- /dev/null
+++ b/drivers/led/issi/is31fl3733-simple.c
@@ -0,0 +1,248 @@
+/* Copyright 2017 Jason Williams
+ * Copyright 2018 Jack Humbert
+ * Copyright 2018 Yiancar
+ * Copyright 2021 Doni Crosby
+ * Copyright 2021 Leo Deng
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "is31fl3733-simple.h"
+#include "i2c_master.h"
+#include "wait.h"
+
+// This is a 7-bit address, that gets left-shifted and bit 0
+// set to 0 for write, 1 for read (as per I2C protocol)
+// The address will vary depending on your wiring:
+// 00 <-> GND
+// 01 <-> SCL
+// 10 <-> SDA
+// 11 <-> VCC
+// ADDR1 represents A1:A0 of the 7-bit address.
+// ADDR2 represents A3:A2 of the 7-bit address.
+// The result is: 0b101(ADDR2)(ADDR1)
+#define ISSI_ADDR_DEFAULT 0x50
+
+#define ISSI_COMMANDREGISTER 0xFD
+#define ISSI_COMMANDREGISTER_WRITELOCK 0xFE
+#define ISSI_INTERRUPTMASKREGISTER 0xF0
+#define ISSI_INTERRUPTSTATUSREGISTER 0xF1
+
+#define ISSI_PAGE_LEDCONTROL 0x00 // PG0
+#define ISSI_PAGE_PWM 0x01 // PG1
+#define ISSI_PAGE_AUTOBREATH 0x02 // PG2
+#define ISSI_PAGE_FUNCTION 0x03 // PG3
+
+#define ISSI_REG_CONFIGURATION 0x00 // PG3
+#define ISSI_REG_GLOBALCURRENT 0x01 // PG3
+#define ISSI_REG_RESET 0x11 // PG3
+#define ISSI_REG_SWPULLUP 0x0F // PG3
+#define ISSI_REG_CSPULLUP 0x10 // PG3
+
+#ifndef ISSI_TIMEOUT
+# define ISSI_TIMEOUT 100
+#endif
+
+#ifndef ISSI_PERSISTENCE
+# define ISSI_PERSISTENCE 0
+#endif
+
+#ifndef ISSI_PWM_FREQUENCY
+# define ISSI_PWM_FREQUENCY 0b000 // PFS - IS31FL3733B only
+#endif
+
+#ifndef ISSI_SWPULLUP
+# define ISSI_SWPULLUP PUR_0R
+#endif
+
+#ifndef ISSI_CSPULLUP
+# define ISSI_CSPULLUP PUR_0R
+#endif
+
+// Transfer buffer for TWITransmitData()
+uint8_t g_twi_transfer_buffer[20];
+
+// These buffers match the IS31FL3733 PWM registers.
+// The control buffers match the PG0 LED On/Off registers.
+// Storing them like this is optimal for I2C transfers to the registers.
+// We could optimize this and take out the unused registers from these
+// buffers and the transfers in IS31FL3733_write_pwm_buffer() but it's
+// probably not worth the extra complexity.
+uint8_t g_pwm_buffer[LED_DRIVER_COUNT][192];
+bool g_pwm_buffer_update_required[LED_DRIVER_COUNT] = {false};
+
+/* There's probably a better way to init this... */
+#if LED_DRIVER_COUNT == 1
+uint8_t g_led_control_registers[LED_DRIVER_COUNT][24] = {{0}};
+#elif LED_DRIVER_COUNT == 2
+uint8_t g_led_control_registers[LED_DRIVER_COUNT][24] = {{0}, {0}};
+#elif LED_DRIVER_COUNT == 3
+uint8_t g_led_control_registers[LED_DRIVER_COUNT][24] = {{0}, {0}, {0}};
+#elif LED_DRIVER_COUNT == 4
+uint8_t g_led_control_registers[LED_DRIVER_COUNT][24] = {{0}, {0}, {0}, {0}};
+#endif
+bool g_led_control_registers_update_required[LED_DRIVER_COUNT] = {false};
+
+bool IS31FL3733_write_register(uint8_t addr, uint8_t reg, uint8_t data) {
+ // If the transaction fails function returns false.
+ g_twi_transfer_buffer[0] = reg;
+ g_twi_transfer_buffer[1] = data;
+
+#if ISSI_PERSISTENCE > 0
+ for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
+ if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) != 0) {
+ return false;
+ }
+ }
+#else
+ if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 2, ISSI_TIMEOUT) != 0) {
+ return false;
+ }
+#endif
+ return true;
+}
+
+bool IS31FL3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer) {
+ // Assumes PG1 is already selected.
+ // If any of the transactions fails function returns false.
+ // Transmit PWM registers in 12 transfers of 16 bytes.
+ // g_twi_transfer_buffer[] is 20 bytes
+
+ // Iterate over the pwm_buffer contents at 16 byte intervals.
+ for (int i = 0; i < 192; i += 16) {
+ g_twi_transfer_buffer[0] = i;
+ // Copy the data from i to i+15.
+ // Device will auto-increment register for data after the first byte
+ // Thus this sets registers 0x00-0x0F, 0x10-0x1F, etc. in one transfer.
+ for (int j = 0; j < 16; j++) {
+ g_twi_transfer_buffer[1 + j] = pwm_buffer[i + j];
+ }
+
+#if ISSI_PERSISTENCE > 0
+ for (uint8_t i = 0; i < ISSI_PERSISTENCE; i++) {
+ if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) != 0) {
+ return false;
+ }
+ }
+#else
+ if (i2c_transmit(addr << 1, g_twi_transfer_buffer, 17, ISSI_TIMEOUT) != 0) {
+ return false;
+ }
+#endif
+ }
+ return true;
+}
+
+void IS31FL3733_init(uint8_t addr, uint8_t sync) {
+ // In order to avoid the LEDs being driven with garbage data
+ // in the LED driver's PWM registers, shutdown is enabled last.
+ // Set up the mode and other settings, clear the PWM registers,
+ // then disable software shutdown.
+ // Sync is passed so set it according to the datasheet.
+
+ // Unlock the command register.
+ IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
+
+ // Select PG0
+ IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
+ // Turn off all LEDs.
+ for (int i = 0x00; i <= 0x17; i++) {
+ IS31FL3733_write_register(addr, i, 0x00);
+ }
+
+ // Unlock the command register.
+ IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
+
+ // Select PG1
+ IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
+ // Set PWM on all LEDs to 0
+ // No need to setup Breath registers to PWM as that is the default.
+ for (int i = 0x00; i <= 0xBF; i++) {
+ IS31FL3733_write_register(addr, i, 0x00);
+ }
+
+ // Unlock the command register.
+ IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
+
+ // Select PG3
+ IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_FUNCTION);
+ // Set de-ghost pull-up resistors (SWx)
+ IS31FL3733_write_register(addr, ISSI_REG_SWPULLUP, ISSI_SWPULLUP);
+ // Set de-ghost pull-down resistors (CSx)
+ IS31FL3733_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP);
+ // Set global current to maximum.
+ IS31FL3733_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
+ // Disable software shutdown.
+ IS31FL3733_write_register(addr, ISSI_REG_CONFIGURATION, ((sync & 0b11) << 6) | ((ISSI_PWM_FREQUENCY & 0b111) << 3) | 0x01);
+
+ // Wait 10ms to ensure the device has woken up.
+ wait_ms(10);
+}
+
+void IS31FL3733_set_value(int index, uint8_t value) {
+ if (index >= 0 && index < DRIVER_LED_TOTAL) {
+ is31_led led = g_is31_leds[index];
+
+ g_pwm_buffer[led.driver][led.v] = value;
+ g_pwm_buffer_update_required[led.driver] = true;
+ }
+}
+
+void IS31FL3733_set_value_all(uint8_t value) {
+ for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
+ IS31FL3733_set_value(i, value);
+ }
+}
+
+void IS31FL3733_set_led_control_register(uint8_t index, bool value) {
+ is31_led led = g_is31_leds[index];
+
+ uint8_t control_register = led.v / 8;
+ uint8_t bit_value = led.v % 8;
+
+ if (value) {
+ g_led_control_registers[led.driver][control_register] |= (1 << bit_value);
+ } else {
+ g_led_control_registers[led.driver][control_register] &= ~(1 << bit_value);
+ }
+
+ g_led_control_registers_update_required[led.driver] = true;
+}
+
+void IS31FL3733_update_pwm_buffers(uint8_t addr, uint8_t index) {
+ if (g_pwm_buffer_update_required[index]) {
+ // Firstly we need to unlock the command register and select PG1.
+ IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
+ IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_PWM);
+
+ // If any of the transactions fail we risk writing dirty PG0,
+ // refresh page 0 just in case.
+ if (!IS31FL3733_write_pwm_buffer(addr, g_pwm_buffer[index])) {
+ g_led_control_registers_update_required[index] = true;
+ }
+ g_pwm_buffer_update_required[index] = false;
+ }
+}
+
+void IS31FL3733_update_led_control_registers(uint8_t addr, uint8_t index) {
+ if (g_led_control_registers_update_required[index]) {
+ // Firstly we need to unlock the command register and select PG0
+ IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER_WRITELOCK, 0xC5);
+ IS31FL3733_write_register(addr, ISSI_COMMANDREGISTER, ISSI_PAGE_LEDCONTROL);
+ for (int i = 0; i < 24; i++) {
+ IS31FL3733_write_register(addr, i, g_led_control_registers[index][i]);
+ }
+ g_led_control_registers_update_required[index] = false;
+ }
+}
diff --git a/drivers/led/issi/is31fl3733-simple.h b/drivers/led/issi/is31fl3733-simple.h
new file mode 100644
index 0000000000..f071db5e40
--- /dev/null
+++ b/drivers/led/issi/is31fl3733-simple.h
@@ -0,0 +1,260 @@
+/* Copyright 2017 Jason Williams
+ * Copyright 2018 Jack Humbert
+ * Copyright 2018 Yiancar
+ * Copyright 2021 Doni Crosby
+ * Copyright 2021 Leo Deng
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 <stdint.h>
+#include <stdbool.h>
+#include "progmem.h"
+
+typedef struct is31_led {
+ uint8_t driver : 2;
+ uint8_t v;
+} __attribute__((packed)) is31_led;
+
+extern const is31_led __flash g_is31_leds[DRIVER_LED_TOTAL];
+
+void IS31FL3733_init(uint8_t addr, uint8_t sync);
+bool IS31FL3733_write_register(uint8_t addr, uint8_t reg, uint8_t data);
+bool IS31FL3733_write_pwm_buffer(uint8_t addr, uint8_t *pwm_buffer);
+
+void IS31FL3733_set_value(int index, uint8_t value);
+void IS31FL3733_set_value_all(uint8_t value);
+
+void IS31FL3733_set_led_control_register(uint8_t index, bool value);
+
+// This should not be called from an interrupt
+// (eg. from a timer interrupt).
+// Call this while idle (in between matrix scans).
+// If the buffer is dirty, it will update the driver with the buffer.
+void IS31FL3733_update_pwm_buffers(uint8_t addr, uint8_t index);
+void IS31FL3733_update_led_control_registers(uint8_t addr, uint8_t index);
+
+#define PUR_0R 0x00 // No PUR resistor
+#define PUR_05KR 0x02 // 0.5k Ohm resistor in t_NOL
+#define PUR_3KR 0x03 // 3.0k Ohm resistor on all the time
+#define PUR_4KR 0x04 // 4.0k Ohm resistor on all the time
+#define PUR_8KR 0x05 // 8.0k Ohm resistor on all the time
+#define PUR_16KR 0x06 // 16k Ohm resistor on all the time
+#define PUR_32KR 0x07 // 32k Ohm resistor in t_NOL
+
+#define A_1 0x00
+#define A_2 0x01
+#define A_3 0x02
+#define A_4 0x03
+#define A_5 0x04
+#define A_6 0x05
+#define A_7 0x06
+#define A_8 0x07
+#define A_9 0x08
+#define A_10 0x09
+#define A_11 0x0A
+#define A_12 0x0B
+#define A_13 0x0C
+#define A_14 0x0D
+#define A_15 0x0E
+#define A_16 0x0F
+
+#define B_1 0x10
+#define B_2 0x11
+#define B_3 0x12
+#define B_4 0x13
+#define B_5 0x14
+#define B_6 0x15
+#define B_7 0x16
+#define B_8 0x17
+#define B_9 0x18
+#define B_10 0x19
+#define B_11 0x1A
+#define B_12 0x1B
+#define B_13 0x1C
+#define B_14 0x1D
+#define B_15 0x1E
+#define B_16 0x1F
+
+#define C_1 0x20
+#define C_2 0x21
+#define C_3 0x22
+#define C_4 0x23
+#define C_5 0x24
+#define C_6 0x25
+#define C_7 0x26
+#define C_8 0x27
+#define C_9 0x28
+#define C_10 0x29
+#define C_11 0x2A
+#define C_12 0x2B
+#define C_13 0x2C
+#define C_14 0x2D
+#define C_15 0x2E
+#define C_16 0x2F
+
+#define D_1 0x30
+#define D_2 0x31
+#define D_3 0x32
+#define D_4 0x33
+#define D_5 0x34
+#define D_6 0x35
+#define D_7 0x36
+#define D_8 0x37
+#define D_9 0x38
+#define D_10 0x39
+#define D_11 0x3A
+#define D_12 0x3B
+#define D_13 0x3C
+#define D_14 0x3D
+#define D_15 0x3E
+#define D_16 0x3F
+
+#define E_1 0x40
+#define E_2 0x41
+#define E_3 0x42
+#define E_4 0x43
+#define E_5 0x44
+#define E_6 0x45
+#define E_7 0x46
+#define E_8 0x47
+#define E_9 0x48
+#define E_10 0x49
+#define E_11 0x4A
+#define E_12 0x4B
+#define E_13 0x4C
+#define E_14 0x4D
+#define E_15 0x4E
+#define E_16 0x4F
+
+#define F_1 0x50
+#define F_2 0x51
+#define F_3 0x52
+#define F_4 0x53
+#define F_5 0x54
+#define F_6 0x55
+#define F_7 0x56
+#define F_8 0x57
+#define F_9 0x58
+#define F_10 0x59
+#define F_11 0x5A
+#define F_12 0x5B
+#define F_13 0x5C
+#define F_14 0x5D
+#define F_15 0x5E
+#define F_16 0x5F
+
+#define G_1 0x60
+#define G_2 0x61
+#define G_3 0x62
+#define G_4 0x63
+#define G_5 0x64
+#define G_6 0x65
+#define G_7 0x66
+#define G_8 0x67
+#define G_9 0x68
+#define G_10 0x69
+#define G_11 0x6A
+#define G_12 0x6B
+#define G_13 0x6C
+#define G_14 0x6D
+#define G_15 0x6E
+#define G_16 0x6F
+
+#define H_1 0x70
+#define H_2 0x71
+#define H_3 0x72
+#define H_4 0x73
+#define H_5 0x74
+#define H_6 0x75
+#define H_7 0x76
+#define H_8 0x77
+#define H_9 0x78
+#define H_10 0x79
+#define H_11 0x7A
+#define H_12 0x7B
+#define H_13 0x7C
+#define H_14 0x7D
+#define H_15 0x7E
+#define H_16 0x7F
+
+#define I_1 0x80
+#define I_2 0x81
+#define I_3 0x82
+#define I_4 0x83
+#define I_5 0x84
+#define I_6 0x85
+#define I_7 0x86
+#define I_8 0x87
+#define I_9 0x88
+#define I_10 0x89
+#define I_11 0x8A
+#define I_12 0x8B
+#define I_13 0x8C
+#define I_14 0x8D
+#define I_15 0x8E
+#define I_16 0x8F
+
+#define J_1 0x90
+#define J_2 0x91
+#define J_3 0x92
+#define J_4 0x93
+#define J_5 0x94
+#define J_6 0x95
+#define J_7 0x96
+#define J_8 0x97
+#define J_9 0x98
+#define J_10 0x99
+#define J_11 0x9A
+#define J_12 0x9B
+#define J_13 0x9C
+#define J_14 0x9D
+#define J_15 0x9E
+#define J_16 0x9F
+
+#define K_1 0xA0
+#define K_2 0xA1
+#define K_3 0xA2
+#define K_4 0xA3
+#define K_5 0xA4
+#define K_6 0xA5
+#define K_7 0xA6
+#define K_8 0xA7
+#define K_9 0xA8
+#define K_10 0xA9
+#define K_11 0xAA
+#define K_12 0xAB
+#define K_13 0xAC
+#define K_14 0xAD
+#define K_15 0xAE
+#define K_16 0xAF
+
+#define L_1 0xB0
+#define L_2 0xB1
+#define L_3 0xB2
+#define L_4 0xB3
+#define L_5 0xB4
+#define L_6 0xB5
+#define L_7 0xB6
+#define L_8 0xB7
+#define L_9 0xB8
+#define L_10 0xB9
+#define L_11 0xBA
+#define L_12 0xBB
+#define L_13 0xBC
+#define L_14 0xBD
+#define L_15 0xBE
+#define L_16 0xBF
diff --git a/drivers/sensors/adns9800.c b/drivers/sensors/adns9800.c
index c52f991804..425cf9912f 100644
--- a/drivers/sensors/adns9800.c
+++ b/drivers/sensors/adns9800.c
@@ -154,8 +154,8 @@ void adns9800_init() {
}
config_adns9800_t adns9800_get_config(void) {
- uint8_t config_1 = adns9800_read(REG_Configuration_I);
- return (config_adns9800_t){(config_1 & 0xFF) * CPI_STEP};
+ uint8_t cpival = adns9800_read(REG_Configuration_I);
+ return (config_adns9800_t){(cpival & 0xFF) * CPI_STEP};
}
void adns9800_set_config(config_adns9800_t config) {
@@ -164,8 +164,8 @@ void adns9800_set_config(config_adns9800_t config) {
}
uint16_t adns9800_get_cpi(void) {
- uint8_t config_1 = adns9800_read(REG_Configuration_I);
- return (uint16_t){(config_1 & 0xFF) * CPI_STEP};
+ uint8_t cpival = adns9800_read(REG_Configuration_I);
+ return (uint16_t)(cpival & 0xFF) * CPI_STEP;
}
void adns9800_set_cpi(uint16_t cpi) {
@@ -184,7 +184,7 @@ static int16_t convertDeltaToInt(uint8_t high, uint8_t low) {
}
report_adns9800_t adns9800_get_report(void) {
- report_adns9800_t report = {0, 0};
+ report_adns9800_t report = {0};
adns9800_spi_start();
diff --git a/drivers/sensors/pimoroni_trackball.c b/drivers/sensors/pimoroni_trackball.c
index 7d390056ea..2867e763bc 100644
--- a/drivers/sensors/pimoroni_trackball.c
+++ b/drivers/sensors/pimoroni_trackball.c
@@ -33,8 +33,24 @@
static uint16_t precision = 128;
-float pimoroni_trackball_get_precision(void) { return ((float)precision / 128); }
-void pimoroni_trackball_set_precision(float floatprecision) { precision = (floatprecision * 128); }
+uint16_t pimoroni_trackball_get_cpi(void) { return (precision * 125); }
+/**
+ * @brief Sets the scaling value for pimoroni trackball
+ *
+ * Sets a scaling value for pimoroni trackball to allow runtime adjustment. This isn't used by the sensor and is an
+ * approximation so the functions are consistent across drivers.
+ *
+ * NOTE: This rounds down to the nearest number divisable by 125 that's a positive integer, values below 125 are clamped to 125.
+ *
+ * @param cpi uint16_t
+ */
+void pimoroni_trackball_set_cpi(uint16_t cpi) {
+ if (cpi < 249) {
+ precision = 1;
+ } else {
+ precision = (cpi - (cpi % 125)) / 125;
+ }
+}
void pimoroni_trackball_set_rgbw(uint8_t r, uint8_t g, uint8_t b, uint8_t w) {
uint8_t data[4] = {r, g, b, w};
@@ -60,7 +76,7 @@ i2c_status_t read_pimoroni_trackball(pimoroni_data_t* data) {
return status;
}
-__attribute__((weak)) void pimironi_trackball_device_init(void) {
+__attribute__((weak)) void pimoroni_trackball_device_init(void) {
i2c_init();
pimoroni_trackball_set_rgbw(0x00, 0x00, 0x00, 0x00);
}
diff --git a/drivers/sensors/pimoroni_trackball.h b/drivers/sensors/pimoroni_trackball.h
index 59ee8724ba..e20ee748a7 100644
--- a/drivers/sensors/pimoroni_trackball.h
+++ b/drivers/sensors/pimoroni_trackball.h
@@ -23,9 +23,6 @@
#ifndef PIMORONI_TRACKBALL_ADDRESS
# define PIMORONI_TRACKBALL_ADDRESS 0x0A
#endif
-#ifndef PIMORONI_TRACKBALL_INTERVAL_MS
-# define PIMORONI_TRACKBALL_INTERVAL_MS 8
-#endif
#ifndef PIMORONI_TRACKBALL_SCALE
# define PIMORONI_TRACKBALL_SCALE 5
#endif
@@ -52,10 +49,10 @@ typedef struct {
uint8_t click;
} pimoroni_data_t;
-void pimironi_trackball_device_init(void);
+void pimoroni_trackball_device_init(void);
void pimoroni_trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white);
int16_t pimoroni_trackball_get_offsets(uint8_t negative_dir, uint8_t positive_dir, uint8_t scale);
void pimoroni_trackball_adapt_values(int8_t* mouse, int16_t* offset);
-float pimoroni_trackball_get_precision(void);
-void pimoroni_trackball_set_precision(float precision);
+uint16_t pimoroni_trackball_get_cpi(void);
+void pimoroni_trackball_set_cpi(uint16_t cpi);
i2c_status_t read_pimoroni_trackball(pimoroni_data_t* data);
diff --git a/drivers/sensors/pmw3360.c b/drivers/sensors/pmw3360.c
index 50d1c35801..0dac600cc2 100644
--- a/drivers/sensors/pmw3360.c
+++ b/drivers/sensors/pmw3360.c
@@ -16,67 +16,71 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "spi_master.h"
#include "pmw3360.h"
#include "wait.h"
#include "debug.h"
#include "print.h"
-#include PMW3360_FIRMWARE_H
+#include "pmw3360_firmware.h"
// Registers
// clang-format off
-#define REG_Product_ID 0x00
-#define REG_Revision_ID 0x01
-#define REG_Motion 0x02
-#define REG_Delta_X_L 0x03
-#define REG_Delta_X_H 0x04
-#define REG_Delta_Y_L 0x05
-#define REG_Delta_Y_H 0x06
-#define REG_SQUAL 0x07
-#define REG_Raw_Data_Sum 0x08
-#define REG_Maximum_Raw_data 0x09
-#define REG_Minimum_Raw_data 0x0A
-#define REG_Shutter_Lower 0x0B
-#define REG_Shutter_Upper 0x0C
-#define REG_Control 0x0D
-#define REG_Config1 0x0F
-#define REG_Config2 0x10
-#define REG_Angle_Tune 0x11
-#define REG_Frame_Capture 0x12
-#define REG_SROM_Enable 0x13
-#define REG_Run_Downshift 0x14
-#define REG_Rest1_Rate_Lower 0x15
-#define REG_Rest1_Rate_Upper 0x16
-#define REG_Rest1_Downshift 0x17
-#define REG_Rest2_Rate_Lower 0x18
-#define REG_Rest2_Rate_Upper 0x19
-#define REG_Rest2_Downshift 0x1A
-#define REG_Rest3_Rate_Lower 0x1B
-#define REG_Rest3_Rate_Upper 0x1C
-#define REG_Observation 0x24
-#define REG_Data_Out_Lower 0x25
-#define REG_Data_Out_Upper 0x26
-#define REG_Raw_Data_Dump 0x29
-#define REG_SROM_ID 0x2A
-#define REG_Min_SQ_Run 0x2B
-#define REG_Raw_Data_Threshold 0x2C
-#define REG_Config5 0x2F
-#define REG_Power_Up_Reset 0x3A
-#define REG_Shutdown 0x3B
-#define REG_Inverse_Product_ID 0x3F
-#define REG_LiftCutoff_Tune3 0x41
-#define REG_Angle_Snap 0x42
-#define REG_LiftCutoff_Tune1 0x4A
-#define REG_Motion_Burst 0x50
-#define REG_LiftCutoff_Tune_Timeout 0x58
-#define REG_LiftCutoff_Tune_Min_Length 0x5A
-#define REG_SROM_Load_Burst 0x62
-#define REG_Lift_Config 0x63
-#define REG_Raw_Data_Burst 0x64
-#define REG_LiftCutoff_Tune2 0x65
+#define REG_Product_ID 0x00
+#define REG_Revision_ID 0x01
+#define REG_Motion 0x02
+#define REG_Delta_X_L 0x03
+#define REG_Delta_X_H 0x04
+#define REG_Delta_Y_L 0x05
+#define REG_Delta_Y_H 0x06
+#define REG_SQUAL 0x07
+#define REG_Raw_Data_Sum 0x08
+#define REG_Maximum_Raw_data 0x09
+#define REG_Minimum_Raw_data 0x0a
+#define REG_Shutter_Lower 0x0b
+#define REG_Shutter_Upper 0x0c
+#define REG_Control 0x0d
+#define REG_Config1 0x0f
+#define REG_Config2 0x10
+#define REG_Angle_Tune 0x11
+#define REG_Frame_Capture 0x12
+#define REG_SROM_Enable 0x13
+#define REG_Run_Downshift 0x14
+#define REG_Rest1_Rate_Lower 0x15
+#define REG_Rest1_Rate_Upper 0x16
+#define REG_Rest1_Downshift 0x17
+#define REG_Rest2_Rate_Lower 0x18
+#define REG_Rest2_Rate_Upper 0x19
+#define REG_Rest2_Downshift 0x1a
+#define REG_Rest3_Rate_Lower 0x1b
+#define REG_Rest3_Rate_Upper 0x1c
+#define REG_Observation 0x24
+#define REG_Data_Out_Lower 0x25
+#define REG_Data_Out_Upper 0x26
+#define REG_Raw_Data_Dump 0x29
+#define REG_SROM_ID 0x2a
+#define REG_Min_SQ_Run 0x2b
+#define REG_Raw_Data_Threshold 0x2c
+#define REG_Config5 0x2f
+#define REG_Power_Up_Reset 0x3a
+#define REG_Shutdown 0x3b
+#define REG_Inverse_Product_ID 0x3f
+#define REG_LiftCutoff_Tune3 0x41
+#define REG_Angle_Snap 0x42
+#define REG_LiftCutoff_Tune1 0x4a
+#define REG_Motion_Burst 0x50
+#define REG_LiftCutoff_Tune_Timeout 0x58
+#define REG_LiftCutoff_Tune_Min_Length 0x5a
+#define REG_SROM_Load_Burst 0x62
+#define REG_Lift_Config 0x63
+#define REG_Raw_Data_Burst 0x64
+#define REG_LiftCutoff_Tune2 0x65
+
+#define CPI_STEP 100
// clang-format on
+// limits to 0--119, resulting in a CPI range of 100 -- 12000 (as only steps of 100 are possible).
#ifndef MAX_CPI
-# define MAX_CPI 0x77 // limits to 0--119, should be max cpi/100
+# define MAX_CPI 0x77
#endif
bool _inBurst = false;
@@ -86,66 +90,50 @@ void print_byte(uint8_t byte) { dprintf("%c%c%c%c%c%c%c%c|", (byte & 0x80 ? '1'
#endif
#define constrain(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)))
-bool spi_start_adv(void) {
+bool pmw3360_spi_start(void) {
bool status = spi_start(PMW3360_CS_PIN, PMW3360_SPI_LSBFIRST, PMW3360_SPI_MODE, PMW3360_SPI_DIVISOR);
+ // tNCS-SCLK, 120ns
wait_us(1);
return status;
}
-void spi_stop_adv(void) {
- wait_us(1);
- spi_stop();
-}
+spi_status_t pmw3360_write(uint8_t reg_addr, uint8_t data) {
+ pmw3360_spi_start();
-spi_status_t spi_write_adv(uint8_t reg_addr, uint8_t data) {
if (reg_addr != REG_Motion_Burst) {
_inBurst = false;
}
- spi_start_adv();
// send address of the register, with MSBit = 1 to indicate it's a write
spi_status_t status = spi_write(reg_addr | 0x80);
status = spi_write(data);
- // tSCLK-NCS for write operation
- wait_us(20);
-
- // tSWW/tSWR (=120us) minus tSCLK-NCS. Could be shortened, but is looks like a safe lower bound
- wait_us(100);
+ // tSCLK-NCS for write operation is 35us
+ wait_us(35);
spi_stop();
+
+ // tSWW/tSWR (=180us) minus tSCLK-NCS. Could be shortened, but is looks like a safe lower bound
+ wait_us(145);
return status;
}
-uint8_t spi_read_adv(uint8_t reg_addr) {
- spi_start_adv();
+uint8_t pmw3360_read(uint8_t reg_addr) {
+ pmw3360_spi_start();
// send adress of the register, with MSBit = 0 to indicate it's a read
spi_write(reg_addr & 0x7f);
-
+ // tSRAD (=160us)
+ wait_us(160);
uint8_t data = spi_read();
// tSCLK-NCS for read operation is 120ns
wait_us(1);
+ spi_stop();
// tSRW/tSRR (=20us) minus tSCLK-NCS
wait_us(19);
-
- spi_stop();
return data;
}
-void pmw3360_set_cpi(uint16_t cpi) {
- uint8_t cpival = constrain((cpi / 100) - 1, 0, MAX_CPI);
-
- spi_start_adv();
- spi_write_adv(REG_Config1, cpival);
- spi_stop();
-}
-
-uint16_t pmw3360_get_cpi(void) {
- uint8_t cpival = spi_read_adv(REG_Config1);
- return (uint16_t)((cpival + 1) & 0xFF) * 100;
-}
-
bool pmw3360_init(void) {
setPinOutput(PMW3360_CS_PIN);
@@ -153,42 +141,51 @@ bool pmw3360_init(void) {
_inBurst = false;
spi_stop();
- spi_start_adv();
+ pmw3360_spi_start();
spi_stop();
- spi_write_adv(REG_Shutdown, 0xb6); // Shutdown first
+ pmw3360_write(REG_Shutdown, 0xb6); // Shutdown first
wait_ms(300);
- spi_start_adv();
+ pmw3360_spi_start();
wait_us(40);
- spi_stop_adv();
+ spi_stop();
wait_us(40);
- spi_write_adv(REG_Power_Up_Reset, 0x5a);
+ // power up, need to first drive NCS high then low, see above.
+ pmw3360_write(REG_Power_Up_Reset, 0x5a);
wait_ms(50);
- spi_read_adv(REG_Motion);
- spi_read_adv(REG_Delta_X_L);
- spi_read_adv(REG_Delta_X_H);
- spi_read_adv(REG_Delta_Y_L);
- spi_read_adv(REG_Delta_Y_H);
+ // read registers and discard
+ pmw3360_read(REG_Motion);
+ pmw3360_read(REG_Delta_X_L);
+ pmw3360_read(REG_Delta_X_H);
+ pmw3360_read(REG_Delta_Y_L);
+ pmw3360_read(REG_Delta_Y_H);
pmw3360_upload_firmware();
- spi_stop_adv();
+ spi_stop();
wait_ms(10);
pmw3360_set_cpi(PMW3360_CPI);
wait_ms(1);
- spi_write_adv(REG_Config2, 0x00);
+ pmw3360_write(REG_Config2, 0x00);
- spi_write_adv(REG_Angle_Tune, constrain(ROTATIONAL_TRANSFORM_ANGLE, -30, 30));
+ pmw3360_write(REG_Angle_Tune, constrain(ROTATIONAL_TRANSFORM_ANGLE, -127, 127));
- spi_write_adv(REG_Lift_Config, PMW3360_LIFTOFF_DISTANCE);
+ pmw3360_write(REG_Lift_Config, PMW3360_LIFTOFF_DISTANCE);
bool init_success = pmw3360_check_signature();
+#ifdef CONSOLE_ENABLE
+ if (init_success) {
+ dprintf("pmw3360 signature verified");
+ } else {
+ dprintf("pmw3360 signature verification failed!");
+ }
+#endif
writePinLow(PMW3360_CS_PIN);
@@ -196,86 +193,98 @@ bool pmw3360_init(void) {
}
void pmw3360_upload_firmware(void) {
- spi_write_adv(REG_SROM_Enable, 0x1d);
+ // Datasheet claims we need to disable REST mode first, but during startup
+ // it's already disabled and we're not turning it on ...
+ // pmw3360_write(REG_Config2, 0x00); // disable REST mode
+ pmw3360_write(REG_SROM_Enable, 0x1d);
wait_ms(10);
- spi_write_adv(REG_SROM_Enable, 0x18);
+ pmw3360_write(REG_SROM_Enable, 0x18);
- spi_start_adv();
+ pmw3360_spi_start();
spi_write(REG_SROM_Load_Burst | 0x80);
wait_us(15);
+#ifdef PMW3360_LEGACY_FIRMWARE_UPLOAD
unsigned char c;
for (int i = 0; i < FIRMWARE_LENGTH; i++) {
c = (unsigned char)pgm_read_byte(firmware_data + i);
spi_write(c);
wait_us(15);
}
+#else
+ spi_transmit(firmware_data, sizeof(firmware_data));
+#endif
wait_us(200);
- spi_read_adv(REG_SROM_ID);
-
- spi_write_adv(REG_Config2, 0x00);
-
- spi_stop();
- wait_ms(10);
+ pmw3360_read(REG_SROM_ID);
+ pmw3360_write(REG_Config2, 0x00);
}
bool pmw3360_check_signature(void) {
- uint8_t pid = spi_read_adv(REG_Product_ID);
- uint8_t iv_pid = spi_read_adv(REG_Inverse_Product_ID);
- uint8_t SROM_ver = spi_read_adv(REG_SROM_ID);
+ uint8_t pid = pmw3360_read(REG_Product_ID);
+ uint8_t iv_pid = pmw3360_read(REG_Inverse_Product_ID);
+ uint8_t SROM_ver = pmw3360_read(REG_SROM_ID);
return (pid == firmware_signature[0] && iv_pid == firmware_signature[1] && SROM_ver == firmware_signature[2]); // signature for SROM 0x04
}
+uint16_t pmw3360_get_cpi(void) {
+ uint8_t cpival = pmw3360_read(REG_Config1);
+ return (uint16_t)((cpival + 1) & 0xFF) * CPI_STEP;
+}
+
+void pmw3360_set_cpi(uint16_t cpi) {
+ uint8_t cpival = constrain((cpi / CPI_STEP) - 1, 0, MAX_CPI);
+ pmw3360_write(REG_Config1, cpival);
+}
+
report_pmw3360_t pmw3360_read_burst(void) {
+ report_pmw3360_t report = {0};
+
if (!_inBurst) {
#ifdef CONSOLE_ENABLE
dprintf("burst on");
#endif
- spi_write_adv(REG_Motion_Burst, 0x00);
+ pmw3360_write(REG_Motion_Burst, 0x00);
_inBurst = true;
}
- spi_start_adv();
+ pmw3360_spi_start();
spi_write(REG_Motion_Burst);
- wait_us(35); // waits for tSRAD
+ wait_us(35); // waits for tSRAD_MOTBR
- report_pmw3360_t data = {0};
+ report.motion = spi_read();
+ spi_read(); // skip Observation
+ // delta registers
+ report.dx = spi_read();
+ report.mdx = spi_read();
+ report.dy = spi_read();
+ report.mdy = spi_read();
- data.motion = spi_read();
- spi_write(0x00); // skip Observation
- data.dx = spi_read();
- data.mdx = spi_read();
- data.dy = spi_read();
- data.mdy = spi_read();
+ if (report.motion & 0b111) { // panic recovery, sometimes burst mode works weird.
+ _inBurst = false;
+ }
spi_stop();
#ifdef CONSOLE_ENABLE
if (debug_mouse) {
- print_byte(data.motion);
- print_byte(data.dx);
- print_byte(data.mdx);
- print_byte(data.dy);
- print_byte(data.mdy);
+ print_byte(report.motion);
+ print_byte(report.dx);
+ print_byte(report.mdx);
+ print_byte(report.dy);
+ print_byte(report.mdy);
dprintf("\n");
}
#endif
- data.isMotion = (data.motion & 0x80) != 0;
- data.isOnSurface = (data.motion & 0x08) == 0;
- data.dx |= (data.mdx << 8);
- data.dx = data.dx * -1;
- data.dy |= (data.mdy << 8);
- data.dy = data.dy * -1;
-
- spi_stop();
+ report.isMotion = (report.motion & 0x80) != 0;
+ report.isOnSurface = (report.motion & 0x08) == 0;
+ report.dx |= (report.mdx << 8);
+ report.dx = report.dx * -1;
+ report.dy |= (report.mdy << 8);
+ report.dy = report.dy * -1;
- if (data.motion & 0b111) { // panic recovery, sometimes burst mode works weird.
- _inBurst = false;
- }
-
- return data;
+ return report;
}
diff --git a/drivers/sensors/pmw3360.h b/drivers/sensors/pmw3360.h
index 9aa8e13f8e..4e17aa0c46 100644
--- a/drivers/sensors/pmw3360.h
+++ b/drivers/sensors/pmw3360.h
@@ -19,8 +19,6 @@
#pragma once
#include <stdint.h>
-#include "report.h"
-#include "spi_master.h"
#ifndef PMW3360_CPI
# define PMW3360_CPI 1600
@@ -58,21 +56,6 @@
# error "No chip select pin defined -- missing PMW3360_CS_PIN"
#endif
-/*
-The pmw33660 and pmw3389 use the same registers and timing and such.
-The only differences between the two is the firmware used, and the
-range for the DPI. So add a semi-secret hack to allow use of the
-pmw3389's firmware blob. Also, can set the max cpi range too.
-This should work for the 3390 and 3391 too, in theory.
-*/
-#ifndef PMW3360_FIRMWARE_H
-# define PMW3360_FIRMWARE_H "pmw3360_firmware.h"
-#endif
-
-#ifdef CONSOLE_ENABLE
-void print_byte(uint8_t byte);
-#endif
-
typedef struct {
int8_t motion;
bool isMotion; // True if a motion is detected.
@@ -83,16 +66,10 @@ typedef struct {
int8_t mdy;
} report_pmw3360_t;
-bool spi_start_adv(void);
-void spi_stop_adv(void);
-spi_status_t spi_write_adv(uint8_t reg_addr, uint8_t data);
-uint8_t spi_read_adv(uint8_t reg_addr);
-bool pmw3360_init(void);
-void pmw3360_set_cpi(uint16_t cpi);
-uint16_t pmw3360_get_cpi(void);
-void pmw3360_upload_firmware(void);
-bool pmw3360_check_signature(void);
+bool pmw3360_init(void);
+void pmw3360_upload_firmware(void);
+bool pmw3360_check_signature(void);
+uint16_t pmw3360_get_cpi(void);
+void pmw3360_set_cpi(uint16_t cpi);
+/* Reads and clears the current delta values on the sensor */
report_pmw3360_t pmw3360_read_burst(void);
-
-#define degToRad(angleInDegrees) ((angleInDegrees)*M_PI / 180.0)
-#define radToDeg(angleInRadians) ((angleInRadians)*180.0 / M_PI)
diff --git a/drivers/sensors/pmw3389.c b/drivers/sensors/pmw3389.c
new file mode 100644
index 0000000000..d6f02b6a59
--- /dev/null
+++ b/drivers/sensors/pmw3389.c
@@ -0,0 +1,294 @@
+/* Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
+ * Copyright 2019 Sunjun Kim
+ * Copyright 2020 Ploopy Corporation
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "spi_master.h"
+#include "pmw3389.h"
+#include "wait.h"
+#include "debug.h"
+#include "print.h"
+#include "pmw3389_firmware.h"
+
+// Registers
+// clang-format off
+#define REG_Product_ID 0x00
+#define REG_Revision_ID 0x01
+#define REG_Motion 0x02
+#define REG_Delta_X_L 0x03
+#define REG_Delta_X_H 0x04
+#define REG_Delta_Y_L 0x05
+#define REG_Delta_Y_H 0x06
+#define REG_SQUAL 0x07
+#define REG_RawData_Sum 0x08
+#define REG_Maximum_RawData 0x09
+#define REG_Minimum_RawData 0x0a
+#define REG_Shutter_Lower 0x0b
+#define REG_Shutter_Upper 0x0c
+#define REG_Ripple_Control 0x0d
+#define REG_Resolution_L 0x0e
+#define REG_Resolution_H 0x0f
+#define REG_Config2 0x10
+#define REG_Angle_Tune 0x11
+#define REG_Frame_Capture 0x12
+#define REG_SROM_Enable 0x13
+#define REG_Run_Downshift 0x14
+#define REG_Rest1_Rate_Lower 0x15
+#define REG_Rest1_Rate_Upper 0x16
+#define REG_Rest1_Downshift 0x17
+#define REG_Rest2_Rate_Lower 0x18
+#define REG_Rest2_Rate_Upper 0x19
+#define REG_Rest2_Downshift 0x1a
+#define REG_Rest3_Rate_Lower 0x1b
+#define REG_Rest3_Rate_Upper 0x1c
+#define REG_Observation 0x24
+#define REG_Data_Out_Lower 0x25
+#define REG_Data_Out_Upper 0x26
+#define REG_SROM_ID 0x2a
+#define REG_Min_SQ_Run 0x2b
+#define REG_RawData_Threshold 0x2c
+#define REG_Control2 0x2d
+#define REG_Config5_L 0x2e
+#define REG_Config5_H 0x2f
+#define REG_Power_Up_Reset 0X3a
+#define REG_Shutdown 0x3b
+#define REG_Inverse_Product_ID 0x3f
+#define REG_LiftCutoff_Cal3 0x41
+#define REG_Angle_Snap 0x42
+#define REG_LiftCutoff_Cal1 0x4a
+#define REG_Motion_Burst 0x50
+#define REG_SROM_Load_Burst 0x62
+#define REG_Lift_Config 0x63
+#define REG_RawData_Burst 0x64
+#define REG_LiftCutoff_Cal2 0x65
+#define REG_LiftCutoff_Cal_Timeout 0x71
+#define REG_LiftCutoff_Cal_Min_Length 0x72
+#define REG_PWM_Period_Cnt 0x73
+#define REG_PWM_Width_Cnt 0x74
+
+#define CPI_STEP 50
+// clang-format on
+
+// limits to 0--319, resulting in a CPI range of 50 -- 16000 (as only steps of 50 are possible).
+#ifndef MAX_CPI
+# define MAX_CPI 0x013f
+#endif
+
+bool _inBurst = false;
+
+#ifdef CONSOLE_ENABLE
+void print_byte(uint8_t byte) { dprintf("%c%c%c%c%c%c%c%c|", (byte & 0x80 ? '1' : '0'), (byte & 0x40 ? '1' : '0'), (byte & 0x20 ? '1' : '0'), (byte & 0x10 ? '1' : '0'), (byte & 0x08 ? '1' : '0'), (byte & 0x04 ? '1' : '0'), (byte & 0x02 ? '1' : '0'), (byte & 0x01 ? '1' : '0')); }
+#endif
+#define constrain(amt, low, high) ((amt) < (low) ? (low) : ((amt) > (high) ? (high) : (amt)))
+
+bool pmw3389_spi_start(void) {
+ bool status = spi_start(PMW3389_CS_PIN, PMW3389_SPI_LSBFIRST, PMW3389_SPI_MODE, PMW3389_SPI_DIVISOR);
+ // tNCS-SCLK, 120ns
+ wait_us(1);
+ return status;
+}
+
+spi_status_t pmw3389_write(uint8_t reg_addr, uint8_t data) {
+ pmw3389_spi_start();
+
+ if (reg_addr != REG_Motion_Burst) {
+ _inBurst = false;
+ }
+
+ // send address of the register, with MSBit = 1 to indicate it's a write
+ spi_status_t status = spi_write(reg_addr | 0x80);
+ status = spi_write(data);
+
+ // tSCLK-NCS for write operation is 35 us
+ wait_us(35);
+ spi_stop();
+
+ // tSWW/tSWR (=180us) minus tSCLK-NCS. Could be shortened, but is looks like a safe lower bound
+ wait_us(145);
+ return status;
+}
+
+uint8_t pmw3389_read(uint8_t reg_addr) {
+ pmw3389_spi_start();
+ // send adress of the register, with MSBit = 0 to indicate it's a read
+ spi_write(reg_addr & 0x7f);
+ // tSRAD (=160us)
+ wait_us(160);
+ uint8_t data = spi_read();
+
+ // tSCLK-NCS, 120ns
+ wait_us(1);
+ spi_stop();
+
+ // tSRW/tSRR (=20us) minus tSCLK-NCS
+ wait_us(19);
+ return data;
+}
+
+bool pmw3389_init(void) {
+ setPinOutput(PMW3389_CS_PIN);
+
+ spi_init();
+ _inBurst = false;
+
+ spi_stop();
+ pmw3389_spi_start();
+ spi_stop();
+
+ pmw3389_write(REG_Shutdown, 0xb6); // Shutdown first
+ wait_ms(300);
+
+ pmw3389_spi_start();
+ wait_us(40);
+ spi_stop();
+ wait_us(40);
+
+ // power up, need to first drive NCS high then low, see above.
+ pmw3389_write(REG_Power_Up_Reset, 0x5a);
+ wait_ms(50);
+
+ // read registers and discard
+ pmw3389_read(REG_Motion);
+ pmw3389_read(REG_Delta_X_L);
+ pmw3389_read(REG_Delta_X_H);
+ pmw3389_read(REG_Delta_Y_L);
+ pmw3389_read(REG_Delta_Y_H);
+
+ pmw3389_upload_firmware();
+
+ spi_stop();
+
+ wait_ms(10);
+ pmw3389_set_cpi(PMW3389_CPI);
+
+ wait_ms(1);
+
+ pmw3389_write(REG_Config2, 0x00);
+
+ pmw3389_write(REG_Angle_Tune, constrain(ROTATIONAL_TRANSFORM_ANGLE, -127, 127));
+
+ pmw3389_write(REG_Lift_Config, PMW3389_LIFTOFF_DISTANCE);
+
+ bool init_success = pmw3389_check_signature();
+#ifdef CONSOLE_ENABLE
+ if (init_success) {
+ dprintf("pmw3389 signature verified");
+ } else {
+ dprintf("pmw3389 signature verification failed!");
+ }
+#endif
+
+ writePinLow(PMW3389_CS_PIN);
+
+ return init_success;
+}
+
+void pmw3389_upload_firmware(void) {
+ // Datasheet claims we need to disable REST mode first, but during startup
+ // it's already disabled and we're not turning it on ...
+ // pmw3389_write(REG_Config2, 0x00); // disable REST mode
+ pmw3389_write(REG_SROM_Enable, 0x1d);
+
+ wait_ms(10);
+
+ pmw3389_write(REG_SROM_Enable, 0x18);
+
+ pmw3389_spi_start();
+ spi_write(REG_SROM_Load_Burst | 0x80);
+ wait_us(15);
+
+ // legacy only for PMW3389 spi_transmit failed to load firmware
+ unsigned char c;
+ for (int i = 0; i < FIRMWARE_LENGTH; i++) {
+ c = (unsigned char)pgm_read_byte(firmware_data + i);
+ spi_write(c);
+ wait_us(15);
+ }
+
+ wait_us(200);
+
+ pmw3389_read(REG_SROM_ID);
+ pmw3389_write(REG_Config2, 0x00);
+}
+
+bool pmw3389_check_signature(void) {
+ uint8_t pid = pmw3389_read(REG_Product_ID);
+ uint8_t iv_pid = pmw3389_read(REG_Inverse_Product_ID);
+ uint8_t SROM_ver = pmw3389_read(REG_SROM_ID);
+ return (pid == firmware_signature[0] && iv_pid == firmware_signature[1] && SROM_ver == firmware_signature[2]); // signature for SROM 0x04
+}
+
+uint16_t pmw3389_get_cpi(void) {
+ uint16_t cpival = (pmw3389_read(REG_Resolution_H) << 8) | pmw3389_read(REG_Resolution_L);
+ return (uint16_t)((cpival + 1) & 0xffff) * CPI_STEP;
+}
+
+void pmw3389_set_cpi(uint16_t cpi) {
+ uint16_t cpival = constrain((cpi / CPI_STEP) - 1, 0, MAX_CPI);
+ // Sets upper byte first for more consistent setting of cpi
+ pmw3389_write(REG_Resolution_H, (cpival >> 8) & 0xff);
+ pmw3389_write(REG_Resolution_L, cpival & 0xff);
+}
+
+report_pmw3389_t pmw3389_read_burst(void) {
+ report_pmw3389_t report = {0};
+
+ if (!_inBurst) {
+#ifdef CONSOLE_ENABLE
+ dprintf("burst on");
+#endif
+ pmw3389_write(REG_Motion_Burst, 0x00);
+ _inBurst = true;
+ }
+
+ pmw3389_spi_start();
+ spi_write(REG_Motion_Burst);
+ wait_us(35); // waits for tSRAD_MOTBR
+
+ report.motion = spi_read();
+ spi_read(); // skip Observation
+ // delta registers
+ report.dx = spi_read();
+ report.mdx = spi_read();
+ report.dy = spi_read();
+ report.mdy = spi_read();
+
+ if (report.motion & 0b111) { // panic recovery, sometimes burst mode works weird.
+ _inBurst = false;
+ }
+
+ spi_stop();
+
+#ifdef CONSOLE_ENABLE
+ if (debug_mouse) {
+ print_byte(report.motion);
+ print_byte(report.dx);
+ print_byte(report.mdx);
+ print_byte(report.dy);
+ print_byte(report.mdy);
+ dprintf("\n");
+ }
+#endif
+
+ report.isMotion = (report.motion & 0x80) != 0;
+ report.isOnSurface = (report.motion & 0x08) == 0;
+ report.dx |= (report.mdx << 8);
+ report.dx = report.dx * -1;
+ report.dy |= (report.mdy << 8);
+ report.dy = report.dy * -1;
+
+ return report;
+}
diff --git a/drivers/sensors/pmw3389.h b/drivers/sensors/pmw3389.h
new file mode 100644
index 0000000000..a7c95e6076
--- /dev/null
+++ b/drivers/sensors/pmw3389.h
@@ -0,0 +1,76 @@
+/* Copyright 2021 Alabastard (@Alabastard-64)
+ * Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
+ * Copyright 2019 Sunjun Kim
+ * Copyright 2020 Ploopy Corporation
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 <stdint.h>
+
+#ifndef PMW3389_CPI
+# define PMW3389_CPI 2000
+#endif
+
+#ifndef PMW3389_CLOCK_SPEED
+# define PMW3389_CLOCK_SPEED 2000000
+#endif
+
+#ifndef PMW3389_SPI_LSBFIRST
+# define PMW3389_SPI_LSBFIRST false
+#endif
+
+#ifndef PMW3389_SPI_MODE
+# define PMW3389_SPI_MODE 3
+#endif
+
+#ifndef PMW3389_SPI_DIVISOR
+# ifdef __AVR__
+# define PMW3389_SPI_DIVISOR (F_CPU / PMW3389_CLOCK_SPEED)
+# else
+# define PMW3389_SPI_DIVISOR 64
+# endif
+#endif
+
+#ifndef PMW3389_LIFTOFF_DISTANCE
+# define PMW3389_LIFTOFF_DISTANCE 0x02
+#endif
+
+#ifndef ROTATIONAL_TRANSFORM_ANGLE
+# define ROTATIONAL_TRANSFORM_ANGLE 0x00
+#endif
+
+#ifndef PMW3389_CS_PIN
+# error "No chip select pin defined -- missing PMW3389_CS_PIN"
+#endif
+
+typedef struct {
+ int8_t motion;
+ bool isMotion; // True if a motion is detected.
+ bool isOnSurface; // True when a chip is on a surface
+ int16_t dx; // displacement on x directions. Unit: Count. (CPI * Count = Inch value)
+ int8_t mdx;
+ int16_t dy; // displacement on y directions.
+ int8_t mdy;
+} report_pmw3389_t;
+
+bool pmw3389_init(void);
+void pmw3389_upload_firmware(void);
+bool pmw3389_check_signature(void);
+uint16_t pmw3389_get_cpi(void);
+void pmw3389_set_cpi(uint16_t cpi);
+/* Reads and clears the current delta values on the sensor */
+report_pmw3389_t pmw3389_read_burst(void);
diff --git a/drivers/sensors/pmw3389_firmware.h b/drivers/sensors/pmw3389_firmware.h
index 0564dab73a..cd9638b605 100644
--- a/drivers/sensors/pmw3389_firmware.h
+++ b/drivers/sensors/pmw3389_firmware.h
@@ -18,286 +18,290 @@
#pragma once
+#include "progmem.h"
+
// PID, Inverse PID, SROM version
const uint8_t firmware_signature[] PROGMEM = {0x42, 0xBD, 0x04};
+#define FIRMWARE_LENGTH 4094
+
+// Firmware Blob for PMW3389
+
// clang-format off
-// Firmware Blob foor PMW3389
-const uint16_t firmware_length = 4094;
-// clang-format off
-const uint8_t firmware_data[] PROGMEM = { // SROM 0x04
-0x01, 0xe8, 0xba, 0x26, 0x0b, 0xb2, 0xbe, 0xfe, 0x7e, 0x5f, 0x3c, 0xdb, 0x15, 0xa8, 0xb3,
-0xe4, 0x2b, 0xb5, 0xe8, 0x53, 0x07, 0x6d, 0x3b, 0xd1, 0x20, 0xc2, 0x06, 0x6f, 0x3d, 0xd9,
-0x11, 0xa0, 0xc2, 0xe7, 0x2d, 0xb9, 0xd1, 0x20, 0xa3, 0xa5, 0xc8, 0xf3, 0x64, 0x4a, 0xf7,
-0x4d, 0x18, 0x93, 0xa4, 0xca, 0xf7, 0x6c, 0x5a, 0x36, 0xee, 0x5e, 0x3e, 0xfe, 0x7e, 0x7e,
-0x5f, 0x1d, 0x99, 0xb0, 0xc3, 0xe5, 0x29, 0xd3, 0x03, 0x65, 0x48, 0x12, 0x87, 0x6d, 0x58,
-0x32, 0xe6, 0x2f, 0xdc, 0x3a, 0xf2, 0x4f, 0xfd, 0x59, 0x11, 0x81, 0x61, 0x21, 0xc0, 0x02,
-0x86, 0x8e, 0x7f, 0x5d, 0x38, 0xf2, 0x47, 0x0c, 0x7b, 0x55, 0x28, 0xb3, 0xe4, 0x4a, 0x16,
-0xab, 0xbf, 0xdd, 0x38, 0xf2, 0x66, 0x4e, 0xff, 0x5d, 0x19, 0x91, 0xa0, 0xa3, 0xa5, 0xc8,
-0x12, 0xa6, 0xaf, 0xdc, 0x3a, 0xd1, 0x41, 0x60, 0x75, 0x58, 0x24, 0x92, 0xd4, 0x72, 0x6c,
-0xe0, 0x2f, 0xfd, 0x23, 0x8d, 0x1c, 0x5b, 0xb2, 0x97, 0x36, 0x3d, 0x0b, 0xa2, 0x49, 0xb1,
-0x58, 0xf2, 0x1f, 0xc0, 0xcb, 0xf8, 0x41, 0x4f, 0xcd, 0x1e, 0x6b, 0x39, 0xa7, 0x2b, 0xe9,
-0x30, 0x16, 0x83, 0xd2, 0x0e, 0x47, 0x8f, 0xe3, 0xb1, 0xdf, 0xa2, 0x15, 0xdb, 0x5d, 0x30,
-0xc5, 0x1a, 0xab, 0x31, 0x99, 0xf3, 0xfa, 0xb2, 0x86, 0x69, 0xad, 0x7a, 0xe8, 0xa7, 0x18,
-0x6a, 0xcc, 0xc8, 0x65, 0x23, 0x87, 0xa8, 0x5f, 0xf5, 0x21, 0x59, 0x75, 0x09, 0x71, 0x45,
-0x55, 0x25, 0x4b, 0xda, 0xa1, 0xc3, 0xf7, 0x41, 0xab, 0x59, 0xd9, 0x74, 0x12, 0x55, 0x5f,
-0xbc, 0xaf, 0xd9, 0xfd, 0xb0, 0x1e, 0xa3, 0x0f, 0xff, 0xde, 0x11, 0x16, 0x6a, 0xae, 0x0e,
-0xe1, 0x5d, 0x3c, 0x10, 0x43, 0x9a, 0xa1, 0x0b, 0x24, 0x8f, 0x0d, 0x7f, 0x0b, 0x5e, 0x4c,
-0x42, 0xa4, 0x84, 0x2c, 0x40, 0xd0, 0x55, 0x39, 0xe6, 0x4b, 0xf8, 0x9b, 0x2f, 0xdc, 0x28,
-0xff, 0xfa, 0xb5, 0x85, 0x19, 0xe5, 0x28, 0xa1, 0x77, 0xaa, 0x73, 0xf3, 0x03, 0xc7, 0x62,
-0xa6, 0x91, 0x18, 0xc9, 0xb0, 0xcd, 0x05, 0xdc, 0xca, 0x81, 0x26, 0x1a, 0x47, 0x40, 0xda,
-0x36, 0x7d, 0x6a, 0x53, 0xc8, 0x5a, 0x77, 0x5d, 0x19, 0xa4, 0x1b, 0x23, 0x83, 0xd0, 0xb2,
-0xaa, 0x0e, 0xbf, 0x77, 0x4e, 0x3a, 0x3b, 0x59, 0x00, 0x31, 0x0d, 0x02, 0x1b, 0x88, 0x7a,
-0xd4, 0xbd, 0x9d, 0xcc, 0x58, 0x04, 0x69, 0xf6, 0x3b, 0xca, 0x42, 0xe2, 0xfd, 0xc3, 0x3d,
-0x39, 0xc5, 0xd0, 0x71, 0xe4, 0xc8, 0xb7, 0x3e, 0x3f, 0xc8, 0xe9, 0xca, 0xc9, 0x3f, 0x04,
-0x4e, 0x1b, 0x79, 0xca, 0xa5, 0x61, 0xc2, 0xed, 0x1d, 0xa6, 0xda, 0x5a, 0xe9, 0x7f, 0x65,
-0x8c, 0xbe, 0x12, 0x6e, 0xa4, 0x5b, 0x33, 0x2f, 0x84, 0x28, 0x9c, 0x1c, 0x88, 0x2d, 0xff,
-0x07, 0xbf, 0xa6, 0xd7, 0x5a, 0x88, 0x86, 0xb0, 0x3f, 0xf6, 0x31, 0x5b, 0x11, 0x6d, 0xf5,
-0x58, 0xeb, 0x58, 0x02, 0x9e, 0xb5, 0x9a, 0xb1, 0xff, 0x25, 0x9d, 0x8b, 0x4f, 0xb6, 0x0a,
-0xf9, 0xea, 0x3e, 0x3f, 0x21, 0x09, 0x65, 0x21, 0x22, 0xfe, 0x3d, 0x4e, 0x11, 0x5b, 0x9e,
-0x5a, 0x59, 0x8b, 0xdd, 0xd8, 0xce, 0xd6, 0xd9, 0x59, 0xd2, 0x1e, 0xfd, 0xef, 0x0d, 0x1b,
-0xd9, 0x61, 0x7f, 0xd7, 0x2d, 0xad, 0x62, 0x09, 0xe5, 0x22, 0x63, 0xea, 0xc7, 0x31, 0xd9,
-0xa1, 0x38, 0x80, 0x5c, 0xa7, 0x32, 0x82, 0xec, 0x1b, 0xa2, 0x49, 0x5a, 0x06, 0xd2, 0x7c,
-0xc9, 0x96, 0x57, 0xbb, 0x17, 0x75, 0xfc, 0x7a, 0x8f, 0x0d, 0x77, 0xb5, 0x7a, 0x8e, 0x3e,
-0xf4, 0xba, 0x2f, 0x69, 0x13, 0x26, 0xd6, 0xd9, 0x21, 0x60, 0x2f, 0x21, 0x3e, 0x87, 0xee,
-0xfd, 0x87, 0x16, 0x0d, 0xc8, 0x08, 0x00, 0x25, 0x71, 0xac, 0x2c, 0x03, 0x2a, 0x37, 0x2d,
-0xb3, 0x34, 0x09, 0x91, 0xe3, 0x06, 0x2c, 0x38, 0x37, 0x95, 0x3b, 0x17, 0x7a, 0xaf, 0xac,
-0x99, 0x55, 0xab, 0x41, 0x39, 0x5f, 0x8e, 0xa6, 0x43, 0x80, 0x03, 0x88, 0x6f, 0x7d, 0xbd,
-0x5a, 0xb4, 0x2b, 0x32, 0x23, 0x5a, 0xa9, 0x31, 0x32, 0x39, 0x4c, 0x5b, 0xf4, 0x6b, 0xaf,
-0x66, 0x6f, 0x3c, 0x8e, 0x2d, 0x82, 0x97, 0x9f, 0x4a, 0x01, 0xdc, 0x99, 0x98, 0x00, 0xec,
-0x38, 0x7a, 0x79, 0x70, 0xa6, 0x85, 0xd6, 0x21, 0x63, 0x0d, 0x45, 0x9a, 0x2e, 0x5e, 0xa7,
-0xb1, 0xea, 0x66, 0x6a, 0xbc, 0x62, 0x2d, 0x7b, 0x7d, 0x85, 0xea, 0x95, 0x2f, 0xc0, 0xe8,
-0x6f, 0x35, 0xa0, 0x3a, 0x02, 0x25, 0xbc, 0xb2, 0x5f, 0x5c, 0x43, 0x96, 0xcc, 0x26, 0xd2,
-0x16, 0xb4, 0x96, 0x73, 0xd7, 0x13, 0xc7, 0xae, 0x53, 0x15, 0x31, 0x89, 0x68, 0x66, 0x6d,
-0x2c, 0x92, 0x1f, 0xcc, 0x5b, 0xa7, 0x8f, 0x5d, 0xbb, 0xc9, 0xdb, 0xe8, 0x3b, 0x9d, 0x61,
-0x74, 0x8b, 0x05, 0xa1, 0x58, 0x52, 0x68, 0xee, 0x3d, 0x39, 0x79, 0xa0, 0x9b, 0xdd, 0xe1,
-0x55, 0xc9, 0x60, 0xeb, 0xad, 0xb8, 0x5b, 0xc2, 0x5a, 0xb5, 0x2c, 0x18, 0x55, 0xa9, 0x50,
-0xc3, 0xf6, 0x72, 0x5f, 0xcc, 0xe2, 0xf4, 0x55, 0xb5, 0xd6, 0xb5, 0x4a, 0x99, 0xa5, 0x28,
-0x74, 0x97, 0x18, 0xe8, 0xc0, 0x84, 0x89, 0x50, 0x03, 0x86, 0x4d, 0x1a, 0xb7, 0x09, 0x90,
-0xa2, 0x01, 0x04, 0xbb, 0x73, 0x62, 0xcb, 0x97, 0x22, 0x70, 0x5d, 0x52, 0x41, 0x8e, 0xd9,
-0x90, 0x15, 0xaa, 0xab, 0x0a, 0x31, 0x65, 0xb4, 0xda, 0xd0, 0xee, 0x24, 0xc9, 0x41, 0x91,
-0x1e, 0xbc, 0x46, 0x70, 0x40, 0x9d, 0xda, 0x0e, 0x2a, 0xe4, 0xb2, 0x4c, 0x9f, 0xf2, 0xfc,
-0xf3, 0x84, 0x17, 0x44, 0x1e, 0xd7, 0xca, 0x23, 0x1f, 0x3f, 0x5a, 0x22, 0x3d, 0xaf, 0x9b,
-0x2d, 0xfc, 0x41, 0xad, 0x26, 0xb4, 0x45, 0x67, 0x0b, 0x80, 0x0e, 0xf9, 0x61, 0x37, 0xec,
-0x3b, 0xf4, 0x4b, 0x14, 0xdf, 0x5a, 0x0c, 0x3a, 0x50, 0x0b, 0x14, 0x0c, 0x72, 0xae, 0xc6,
-0xc5, 0xec, 0x35, 0x53, 0x2d, 0x59, 0xed, 0x91, 0x74, 0xe2, 0xc4, 0xc8, 0xf2, 0x25, 0x6b,
-0x97, 0x6f, 0xc9, 0x76, 0xce, 0xa9, 0xb1, 0x99, 0x8f, 0x5a, 0x92, 0x3b, 0xc4, 0x8d, 0x54,
-0x50, 0x40, 0x72, 0xd6, 0x90, 0x83, 0xfc, 0xe5, 0x49, 0x8b, 0x17, 0xf5, 0xfd, 0x6b, 0x8d,
-0x32, 0x02, 0xe9, 0x0a, 0xfe, 0xbf, 0x00, 0x6b, 0xa3, 0xad, 0x5f, 0x09, 0x4b, 0x97, 0x2b,
-0x00, 0x58, 0x65, 0x2e, 0x07, 0x49, 0x0a, 0x3b, 0x6b, 0x2e, 0x50, 0x6c, 0x1d, 0xac, 0xb7,
-0x6a, 0x26, 0xd8, 0x13, 0xa4, 0xca, 0x16, 0xae, 0xab, 0x93, 0xb9, 0x1c, 0x1c, 0xb4, 0x47,
-0x6a, 0x38, 0x36, 0x17, 0x27, 0xc9, 0x7f, 0xc7, 0x64, 0xcb, 0x89, 0x58, 0xc5, 0x61, 0xc2,
-0xc6, 0xea, 0x15, 0x0b, 0x34, 0x0c, 0x5d, 0x61, 0x76, 0x6e, 0x2b, 0x62, 0x40, 0x92, 0xa3,
-0x6c, 0xef, 0xf4, 0xe4, 0xc3, 0xa1, 0xa8, 0xf5, 0x94, 0x79, 0x0d, 0xd1, 0x3d, 0xcb, 0x3d,
-0x40, 0xb6, 0xd0, 0xf0, 0x10, 0x54, 0xd8, 0x47, 0x25, 0x51, 0xc5, 0x41, 0x79, 0x00, 0xe5,
-0xa0, 0x72, 0xde, 0xbb, 0x3b, 0x62, 0x17, 0xf6, 0xbc, 0x5d, 0x00, 0x76, 0x2e, 0xa7, 0x3b,
-0xb6, 0xf1, 0x98, 0x72, 0x59, 0x2a, 0x73, 0xb0, 0x21, 0xd6, 0x49, 0xe0, 0xc0, 0xd5, 0xeb,
-0x02, 0x7d, 0x4b, 0x41, 0x28, 0x70, 0x2d, 0xec, 0x2b, 0x71, 0x1f, 0x0b, 0xb9, 0x71, 0x63,
-0x06, 0xe6, 0xbc, 0x60, 0xbb, 0xf4, 0x9a, 0x62, 0x43, 0x09, 0x18, 0x4e, 0x93, 0x06, 0x4d,
-0x76, 0xfa, 0x7f, 0xbd, 0x02, 0xe4, 0x50, 0x91, 0x12, 0xe5, 0x86, 0xff, 0x64, 0x1e, 0xaf,
-0x7e, 0xb3, 0xb2, 0xde, 0x89, 0xc1, 0xa2, 0x6f, 0x40, 0x7b, 0x41, 0x51, 0x63, 0xea, 0x25,
-0xd1, 0x97, 0x57, 0x92, 0xa8, 0x45, 0xa1, 0xa5, 0x45, 0x21, 0x43, 0x7f, 0x83, 0x15, 0x29,
-0xd0, 0x30, 0x53, 0x32, 0xb4, 0x5a, 0x17, 0x96, 0xbc, 0xc2, 0x68, 0xa9, 0xb7, 0xaf, 0xac,
-0xdf, 0xf1, 0xe3, 0x89, 0xba, 0x24, 0x79, 0x54, 0xc6, 0x14, 0x07, 0x1c, 0x1e, 0x0d, 0x3a,
-0x6b, 0xe5, 0x3d, 0x4e, 0x10, 0x60, 0x96, 0xec, 0x6c, 0xda, 0x47, 0xae, 0x03, 0x25, 0x39,
-0x1d, 0x74, 0xc8, 0xac, 0x6a, 0xf2, 0x6b, 0x05, 0x2a, 0x9a, 0xe7, 0xe8, 0x92, 0xd6, 0xc2,
-0x6d, 0xfa, 0xe8, 0xa7, 0x9d, 0x5f, 0x48, 0xc9, 0x75, 0xf1, 0x66, 0x6a, 0xdb, 0x5d, 0x9a,
-0xcd, 0x27, 0xdd, 0xb9, 0x24, 0x04, 0x9c, 0x18, 0xc2, 0x6d, 0x0c, 0x91, 0x34, 0x48, 0x42,
-0x6f, 0xe9, 0x59, 0x70, 0xc4, 0x7e, 0x81, 0x0e, 0x32, 0x0a, 0x93, 0x48, 0xb0, 0xc0, 0x15,
-0x9e, 0x05, 0xac, 0x36, 0x16, 0xcb, 0x59, 0x65, 0xa0, 0x83, 0xdf, 0x3e, 0xda, 0xfb, 0x1d,
-0x1a, 0xdb, 0x65, 0xec, 0x9a, 0xc6, 0xc3, 0x8e, 0x3c, 0x45, 0xfd, 0xc8, 0xf5, 0x1c, 0x6a,
-0x67, 0x0d, 0x8f, 0x99, 0x7d, 0x30, 0x21, 0x8c, 0xea, 0x22, 0x87, 0x65, 0xc9, 0xb2, 0x4c,
-0xe4, 0x1b, 0x46, 0xba, 0x54, 0xbd, 0x7c, 0xca, 0xd5, 0x8f, 0x5b, 0xa5, 0x01, 0x04, 0xd8,
-0x0a, 0x16, 0xbf, 0xb9, 0x50, 0x2e, 0x37, 0x2f, 0x64, 0xf3, 0x70, 0x11, 0x02, 0x05, 0x31,
-0x9b, 0xa0, 0xb2, 0x01, 0x5e, 0x4f, 0x19, 0xc9, 0xd4, 0xea, 0xa1, 0x79, 0x54, 0x53, 0xa7,
-0xde, 0x2f, 0x49, 0xd3, 0xd1, 0x63, 0xb5, 0x03, 0x15, 0x4e, 0xbf, 0x04, 0xb3, 0x26, 0x8b,
-0x20, 0xb2, 0x45, 0xcf, 0xcd, 0x5b, 0x82, 0x32, 0x88, 0x61, 0xa7, 0xa8, 0xb2, 0xa0, 0x72,
-0x96, 0xc0, 0xdb, 0x2b, 0xe2, 0x5f, 0xba, 0xe3, 0xf5, 0x8a, 0xde, 0xf1, 0x18, 0x01, 0x16,
-0x40, 0xd9, 0x86, 0x12, 0x09, 0x18, 0x1b, 0x05, 0x0c, 0xb1, 0xb5, 0x47, 0xe2, 0x43, 0xab,
-0xfe, 0x92, 0x63, 0x7e, 0x95, 0x2b, 0xf0, 0xaf, 0xe1, 0xf1, 0xc3, 0x4a, 0xff, 0x2b, 0x09,
-0xbb, 0x4a, 0x0e, 0x9a, 0xc4, 0xd8, 0x64, 0x7d, 0x83, 0xa0, 0x4f, 0x44, 0xdb, 0xc4, 0xa8,
-0x58, 0xef, 0xfc, 0x9e, 0x77, 0xf9, 0xa6, 0x8f, 0x58, 0x8b, 0x12, 0xf4, 0xe9, 0x81, 0x12,
-0x47, 0x51, 0x41, 0x83, 0xef, 0xf6, 0x73, 0xbc, 0x8e, 0x0f, 0x4c, 0x8f, 0x4e, 0x69, 0x90,
-0x77, 0x29, 0x5d, 0x92, 0xb0, 0x6d, 0x06, 0x67, 0x29, 0x60, 0xbd, 0x4b, 0x17, 0xc8, 0x89,
-0x69, 0x28, 0x29, 0xd6, 0x78, 0xcb, 0x11, 0x4c, 0xba, 0x8b, 0x68, 0xae, 0x7e, 0x9f, 0xef,
-0x95, 0xda, 0xe2, 0x9e, 0x7f, 0xe9, 0x55, 0xe5, 0xe1, 0xe2, 0xb7, 0xe6, 0x5f, 0xbb, 0x2c,
-0xa2, 0xe6, 0xee, 0xc7, 0x0a, 0x60, 0xa9, 0xd1, 0x80, 0xdf, 0x7f, 0xd6, 0x97, 0xab, 0x1d,
-0x22, 0x25, 0xfc, 0x79, 0x23, 0xe0, 0xae, 0xc5, 0xef, 0x16, 0xa4, 0xa1, 0x0f, 0x92, 0xa9,
-0xc7, 0xe3, 0x3a, 0x55, 0xdf, 0x62, 0x49, 0xd9, 0xf5, 0x84, 0x49, 0xc5, 0x90, 0x34, 0xd3,
-0xe1, 0xac, 0x99, 0x21, 0xb1, 0x02, 0x76, 0x4a, 0xfa, 0xd4, 0xbb, 0xa4, 0x9c, 0xa2, 0xe2,
-0xcb, 0x3d, 0x3b, 0x14, 0x75, 0x60, 0xd1, 0x02, 0xb4, 0xa3, 0xb4, 0x72, 0x06, 0xf9, 0x19,
-0x9c, 0xe2, 0xe4, 0xa7, 0x0f, 0x25, 0x88, 0xc6, 0x86, 0xd6, 0x8c, 0x74, 0x4e, 0x6e, 0xfc,
-0xa8, 0x48, 0x9e, 0xa7, 0x9d, 0x1a, 0x4b, 0x37, 0x09, 0xc8, 0xb0, 0x10, 0xbe, 0x6f, 0xfe,
-0xa3, 0xc4, 0x7a, 0xb5, 0x3d, 0xe8, 0x30, 0xf1, 0x0d, 0xa0, 0xb2, 0x44, 0xfc, 0x9b, 0x8c,
-0xf8, 0x61, 0xed, 0x81, 0xd1, 0x62, 0x11, 0xb4, 0xe1, 0xd5, 0x39, 0x52, 0x89, 0xd3, 0xa8,
-0x49, 0x31, 0xdf, 0xb6, 0xf9, 0x91, 0xf4, 0x1c, 0x9d, 0x09, 0x95, 0x40, 0x56, 0xe7, 0xe3,
-0xcd, 0x5c, 0x92, 0xc1, 0x1d, 0x6b, 0xe9, 0x78, 0x6f, 0x8e, 0x94, 0x42, 0x66, 0xa2, 0xaa,
-0xd3, 0xc8, 0x2e, 0xe3, 0xf6, 0x07, 0x72, 0x0b, 0x6b, 0x1e, 0x7b, 0xb9, 0x7c, 0xe0, 0xa0,
-0xbc, 0xd9, 0x25, 0xdf, 0x87, 0xa8, 0x5f, 0x9c, 0xcc, 0xf0, 0xdb, 0x42, 0x8e, 0x07, 0x31,
-0x13, 0x01, 0x66, 0x32, 0xd1, 0xb8, 0xd6, 0xe3, 0x5e, 0x12, 0x76, 0x61, 0xd3, 0x38, 0x89,
-0xe6, 0x17, 0x6f, 0xa5, 0xf2, 0x71, 0x0e, 0xa5, 0xe2, 0x88, 0x30, 0xbb, 0xbe, 0x8a, 0xea,
-0xc7, 0x62, 0xc4, 0xcf, 0xb8, 0xcd, 0x33, 0x8d, 0x3d, 0x3e, 0xb5, 0x60, 0x3a, 0x03, 0x92,
-0xe4, 0x6d, 0x1b, 0xe0, 0xb4, 0x84, 0x08, 0x55, 0x88, 0xa7, 0x3a, 0xb9, 0x3d, 0x43, 0xc3,
-0xc0, 0xfa, 0x07, 0x6a, 0xca, 0x94, 0xad, 0x99, 0x55, 0xf1, 0xf1, 0xc0, 0x23, 0x87, 0x1d,
-0x3d, 0x1c, 0xd1, 0x66, 0xa0, 0x57, 0x10, 0x52, 0xa2, 0x7f, 0xbe, 0xf9, 0x88, 0xb6, 0x02,
-0xbf, 0x08, 0x23, 0xa9, 0x0c, 0x63, 0x17, 0x2a, 0xae, 0xf5, 0xf7, 0xb7, 0x21, 0x83, 0x92,
-0x31, 0x23, 0x0d, 0x20, 0xc3, 0xc2, 0x05, 0x21, 0x62, 0x8e, 0x45, 0xe8, 0x14, 0xc1, 0xda,
-0x75, 0xb8, 0xf8, 0x92, 0x01, 0xd0, 0x5d, 0x18, 0x9f, 0x99, 0x11, 0x19, 0xf5, 0x35, 0xe8,
-0x7f, 0x20, 0x88, 0x8c, 0x05, 0x75, 0xf5, 0xd7, 0x40, 0x17, 0xbb, 0x1e, 0x36, 0x52, 0xd9,
-0xa4, 0x9c, 0xc2, 0x9d, 0x42, 0x81, 0xd8, 0xc7, 0x8a, 0xe7, 0x4c, 0x81, 0xe0, 0xb7, 0x57,
-0xed, 0x48, 0x8b, 0xf0, 0x97, 0x15, 0x61, 0xd9, 0x2c, 0x7c, 0x45, 0xaf, 0xc2, 0xcd, 0xfc,
-0xaa, 0x13, 0xad, 0x59, 0xcc, 0xb2, 0xb2, 0x6e, 0xdd, 0x63, 0x9c, 0x32, 0x0f, 0xec, 0x83,
-0xbe, 0x78, 0xac, 0x91, 0x44, 0x1a, 0x1f, 0xea, 0xfd, 0x5d, 0x8e, 0xb4, 0xc0, 0x84, 0xd4,
-0xac, 0xb4, 0x87, 0x5f, 0xac, 0xef, 0xdf, 0xcd, 0x12, 0x56, 0xc8, 0xcd, 0xfe, 0xc5, 0xda,
-0xd3, 0xc1, 0x69, 0xf3, 0x61, 0x05, 0xea, 0x25, 0xe2, 0x12, 0x05, 0x8f, 0x39, 0x08, 0x08,
-0x7c, 0x37, 0xb6, 0x7e, 0x5b, 0xd8, 0xb1, 0x0e, 0xf2, 0xdb, 0x4b, 0xf1, 0xad, 0x90, 0x01,
-0x57, 0xcd, 0xa0, 0xb4, 0x52, 0xe8, 0xf3, 0xd7, 0x8a, 0xbd, 0x4f, 0x9f, 0x21, 0x40, 0x72,
-0xa4, 0xfc, 0x0b, 0x01, 0x2b, 0x2f, 0xb6, 0x4c, 0x95, 0x2d, 0x35, 0x33, 0x41, 0x6b, 0xa0,
-0x93, 0xe7, 0x2c, 0xf2, 0xd3, 0x72, 0x8b, 0xf4, 0x4f, 0x15, 0x3c, 0xaf, 0xd6, 0x12, 0xde,
-0x3f, 0x83, 0x3f, 0xff, 0xf8, 0x7f, 0xf6, 0xcc, 0xa6, 0x7f, 0xc9, 0x9a, 0x6e, 0x1f, 0xc1,
-0x0c, 0xfb, 0xee, 0x9c, 0xe7, 0xaf, 0xc9, 0x26, 0x54, 0xef, 0xb0, 0x39, 0xef, 0xb2, 0xe9,
-0x23, 0xc4, 0xef, 0xd1, 0xa1, 0xa4, 0x25, 0x24, 0x6f, 0x8d, 0x6a, 0xe5, 0x8a, 0x32, 0x3a,
-0xaf, 0xfc, 0xda, 0xce, 0x18, 0x25, 0x42, 0x07, 0x4d, 0x45, 0x8b, 0xdf, 0x85, 0xcf, 0x55,
-0xb2, 0x24, 0xfe, 0x9c, 0x69, 0x74, 0xa7, 0x6e, 0xa0, 0xce, 0xc0, 0x39, 0xf4, 0x86, 0xc6,
-0x8d, 0xae, 0xb9, 0x48, 0x64, 0x13, 0x0b, 0x40, 0x81, 0xa2, 0xc9, 0xa8, 0x85, 0x51, 0xee,
-0x9f, 0xcf, 0xa2, 0x8c, 0x19, 0x52, 0x48, 0xe2, 0xc1, 0xa8, 0x58, 0xb4, 0x10, 0x24, 0x06,
-0x58, 0x51, 0xfc, 0xb9, 0x12, 0xec, 0xfd, 0x73, 0xb4, 0x6d, 0x84, 0xfa, 0x06, 0x8b, 0x05,
-0x0b, 0x2d, 0xd6, 0xd6, 0x1f, 0x29, 0x82, 0x9f, 0x19, 0x12, 0x1e, 0xb2, 0x04, 0x8f, 0x7f,
-0x4d, 0xbd, 0x30, 0x2e, 0xe3, 0xe0, 0x88, 0x29, 0xc5, 0x93, 0xd6, 0x6c, 0x1f, 0x29, 0x45,
-0x91, 0xa7, 0x58, 0xcd, 0x05, 0x17, 0xd6, 0x6d, 0xb3, 0xca, 0x66, 0xcc, 0x3c, 0x4a, 0x74,
-0xfd, 0x08, 0x10, 0xa6, 0x99, 0x92, 0x10, 0xd2, 0x85, 0xab, 0x6e, 0x1d, 0x0e, 0x8b, 0x26,
-0x46, 0xd1, 0x6c, 0x84, 0xc0, 0x26, 0x43, 0x59, 0x68, 0xf0, 0x13, 0x1d, 0xfb, 0xe3, 0xd1,
-0xd2, 0xb4, 0x71, 0x9e, 0xf2, 0x59, 0x6a, 0x33, 0x29, 0x79, 0xd2, 0xd7, 0x26, 0xf1, 0xae,
-0x78, 0x9e, 0x1f, 0x0f, 0x3f, 0xe3, 0xe8, 0xd0, 0x27, 0x78, 0x77, 0xf6, 0xac, 0x9c, 0x56,
-0x39, 0x73, 0x8a, 0x6b, 0x2f, 0x34, 0x78, 0xb1, 0x11, 0xdb, 0xa4, 0x5c, 0x80, 0x01, 0x71,
-0x6a, 0xc2, 0xd1, 0x2e, 0x5e, 0x76, 0x28, 0x70, 0x93, 0xae, 0x3e, 0x78, 0xb0, 0x1f, 0x0f,
-0xda, 0xbf, 0xfb, 0x8a, 0x67, 0x65, 0x4f, 0x91, 0xed, 0x49, 0x75, 0x78, 0x62, 0xa2, 0x93,
-0xb5, 0x70, 0x7f, 0x4d, 0x08, 0x4e, 0x79, 0x61, 0xa8, 0x5f, 0x7f, 0xb4, 0x65, 0x9f, 0x91,
-0x54, 0x3a, 0xe8, 0x50, 0x33, 0xd3, 0xd5, 0x8a, 0x7c, 0xf3, 0x9e, 0x8b, 0x77, 0x7b, 0xc6,
-0xc6, 0x0c, 0x45, 0x95, 0x1f, 0xb0, 0xd0, 0x0b, 0x27, 0x4a, 0xfd, 0xc7, 0xf7, 0x0d, 0x5a,
-0x43, 0xc9, 0x7d, 0x35, 0xb0, 0x7d, 0xc4, 0x9c, 0x57, 0x1e, 0x76, 0x0d, 0xf1, 0x95, 0x30,
-0x71, 0xcc, 0xb3, 0x66, 0x3b, 0x63, 0xa8, 0x6c, 0xa3, 0x43, 0xa0, 0x24, 0xcc, 0xb7, 0x53,
-0xfe, 0xfe, 0xbc, 0x6e, 0x60, 0x89, 0xaf, 0x16, 0x21, 0xc8, 0x91, 0x6a, 0x89, 0xce, 0x80,
-0x2c, 0xf1, 0x59, 0xce, 0xc3, 0x60, 0x61, 0x3b, 0x0b, 0x19, 0xfe, 0x99, 0xac, 0x65, 0x90,
-0x15, 0x12, 0x05, 0xac, 0x7e, 0xff, 0x98, 0x7b, 0x66, 0x64, 0x0e, 0x4b, 0x5b, 0xaa, 0x8d,
-0x3b, 0xd2, 0x56, 0xcf, 0x99, 0x39, 0xee, 0x22, 0x81, 0xd0, 0x60, 0x06, 0x66, 0x20, 0x81,
-0x48, 0x3c, 0x6f, 0x3a, 0x77, 0xba, 0xcb, 0x52, 0xac, 0x79, 0x56, 0xaf, 0xe9, 0x16, 0x17,
-0x0a, 0xa3, 0x82, 0x08, 0xd5, 0x3c, 0x97, 0xcb, 0x09, 0xff, 0x7f, 0xf9, 0x4f, 0x60, 0x05,
-0xb9, 0x53, 0x26, 0xaa, 0xb8, 0x50, 0xaa, 0x19, 0x25, 0xae, 0x5f, 0xea, 0x8a, 0xd0, 0x89,
-0x12, 0x80, 0x43, 0x50, 0x24, 0x12, 0x21, 0x14, 0xcd, 0x77, 0xeb, 0x21, 0xcc, 0x5c, 0x09,
-0x64, 0xf3, 0xc7, 0xcb, 0xc5, 0x4b, 0xc3, 0xe7, 0xed, 0xe7, 0x86, 0x2c, 0x1d, 0x8e, 0x19,
-0x52, 0x9b, 0x2a, 0x0c, 0x18, 0x72, 0x0b, 0x1e, 0x1b, 0xb0, 0x0f, 0x42, 0x99, 0x04, 0xae,
-0xd5, 0xb7, 0x89, 0x1a, 0xb9, 0x4f, 0xd6, 0xaf, 0xf3, 0xc9, 0x93, 0x6f, 0xb0, 0x60, 0x83,
-0x6e, 0x6b, 0xd1, 0x5f, 0x3f, 0x1a, 0x83, 0x1e, 0x24, 0x00, 0x87, 0xb5, 0x3e, 0xdb, 0xf9,
-0x4d, 0xa7, 0x16, 0x2e, 0x19, 0x5b, 0x8f, 0x1b, 0x0d, 0x47, 0x72, 0x42, 0xe9, 0x0a, 0x11,
-0x08, 0x2d, 0x88, 0x1c, 0xbc, 0xc7, 0xb4, 0xbe, 0x29, 0x4d, 0x03, 0x5e, 0xec, 0xdf, 0xf3,
-0x3d, 0x2f, 0xe8, 0x1d, 0x9a, 0xd2, 0xd1, 0xab, 0x41, 0x3d, 0x87, 0x11, 0x45, 0xb0, 0x0d,
-0x46, 0xf5, 0xe8, 0x95, 0x62, 0x1c, 0x68, 0xf7, 0xa6, 0x5b, 0x39, 0x4e, 0xbf, 0x47, 0xba,
-0x5d, 0x7f, 0xb7, 0x6a, 0xf4, 0xba, 0x1d, 0x69, 0xf6, 0xa4, 0xe7, 0xe4, 0x6b, 0x3b, 0x0d,
-0x23, 0x16, 0x4a, 0xb2, 0x68, 0xf0, 0xb2, 0x0d, 0x09, 0x17, 0x6a, 0x63, 0x8c, 0x83, 0xd3,
-0xbd, 0x05, 0xc9, 0xf6, 0xf0, 0xa1, 0x31, 0x0b, 0x2c, 0xac, 0x83, 0xac, 0x80, 0x34, 0x32,
-0xb4, 0xec, 0xd0, 0xbc, 0x54, 0x82, 0x9a, 0xc8, 0xf6, 0xa0, 0x7d, 0xc6, 0x79, 0x73, 0xf4,
-0x20, 0x99, 0xf3, 0xb4, 0x01, 0xde, 0x91, 0x27, 0xf2, 0xc0, 0xdc, 0x81, 0x00, 0x4e, 0x7e,
-0x07, 0x99, 0xc8, 0x3a, 0x51, 0xbc, 0x38, 0xd6, 0x8a, 0xa2, 0xde, 0x3b, 0x6a, 0x8c, 0x1a,
-0x7c, 0x81, 0x0f, 0x3a, 0x1f, 0xe4, 0x05, 0x7b, 0x20, 0x35, 0x6b, 0xa5, 0x6a, 0xa7, 0xe7,
-0xbc, 0x9c, 0x20, 0xec, 0x00, 0x15, 0xe2, 0x51, 0xaf, 0x77, 0xeb, 0x29, 0x3c, 0x7d, 0x2e,
-0x00, 0x5c, 0x81, 0x21, 0xfa, 0x35, 0x6f, 0x40, 0xef, 0xfb, 0xd1, 0x3f, 0xcc, 0x9d, 0x55,
-0x53, 0xfb, 0x5a, 0xa5, 0x56, 0x89, 0x0b, 0x52, 0xeb, 0x57, 0x73, 0x4f, 0x1b, 0x67, 0x24,
-0xcb, 0xb8, 0x6a, 0x10, 0x69, 0xd6, 0xfb, 0x52, 0x40, 0xff, 0x20, 0xa5, 0xf3, 0x72, 0xe1,
-0x3d, 0xa4, 0x8c, 0x81, 0x66, 0x16, 0x0d, 0x5d, 0xad, 0xa8, 0x50, 0x25, 0x78, 0x31, 0x77,
-0x0c, 0x57, 0xe4, 0xe9, 0x15, 0x2d, 0xdb, 0x07, 0x87, 0xc8, 0xb0, 0x43, 0xde, 0xfc, 0xfe,
-0xa9, 0xeb, 0xf5, 0xb0, 0xd3, 0x7b, 0xe9, 0x1f, 0x6e, 0xca, 0xe4, 0x03, 0x95, 0xc5, 0xd1,
-0x59, 0x72, 0x63, 0xf0, 0x86, 0x54, 0xe8, 0x16, 0x62, 0x0b, 0x35, 0x29, 0xc2, 0x68, 0xd0,
-0xd6, 0x3e, 0x90, 0x60, 0x57, 0x1d, 0xc9, 0xed, 0x3f, 0xed, 0xb0, 0x2f, 0x7e, 0x97, 0x02,
-0x51, 0xec, 0xee, 0x6f, 0x82, 0x74, 0x76, 0x7f, 0xfb, 0xd6, 0xc4, 0xc3, 0xdd, 0xe8, 0xb1,
-0x60, 0xfc, 0xc6, 0xb9, 0x0d, 0x6a, 0x33, 0x78, 0xc6, 0xc1, 0xbf, 0x86, 0x2c, 0x50, 0xcc,
-0x9a, 0x70, 0x8e, 0x7b, 0xec, 0xab, 0x95, 0xac, 0x53, 0xa0, 0x4b, 0x07, 0x88, 0xaf, 0x42,
-0xed, 0x19, 0x8d, 0xf6, 0x32, 0x17, 0x48, 0x47, 0x1d, 0x41, 0x6f, 0xfe, 0x2e, 0xa7, 0x8f,
-0x4b, 0xa0, 0x51, 0xf3, 0xbf, 0x02, 0x0a, 0x48, 0x58, 0xf7, 0xa1, 0x6d, 0xea, 0xa5, 0x13,
-0x5a, 0x5b, 0xea, 0x0c, 0x9e, 0x52, 0x4f, 0x9e, 0xb9, 0x71, 0x7f, 0x23, 0x83, 0xda, 0x1b,
-0x86, 0x9a, 0x41, 0x29, 0xda, 0x70, 0xe7, 0x64, 0xa1, 0x7b, 0xd5, 0x0a, 0x22, 0x0d, 0x5c,
-0x40, 0xc4, 0x81, 0x07, 0x25, 0x35, 0x4a, 0x1c, 0x10, 0xdb, 0x45, 0x0a, 0xff, 0x36, 0xd4,
-0xe0, 0xeb, 0x5f, 0x68, 0xd6, 0x67, 0xc6, 0xd0, 0x8b, 0x76, 0x1a, 0x7d, 0x59, 0x42, 0xa1,
-0xcb, 0x96, 0x4d, 0x84, 0x09, 0x9a, 0x3d, 0xe0, 0x52, 0x85, 0x6e, 0x48, 0x90, 0x85, 0x2a,
-0x63, 0xb2, 0x69, 0xd2, 0x00, 0x43, 0x31, 0x37, 0xb3, 0x52, 0xaf, 0x62, 0xfa, 0xc1, 0xe0,
-0x03, 0xfb, 0x62, 0xaa, 0x88, 0xc9, 0xb2, 0x2c, 0xd5, 0xa8, 0xf5, 0xa5, 0x4c, 0x12, 0x59,
-0x4e, 0x06, 0x5e, 0x9b, 0x15, 0x66, 0x11, 0xb2, 0x27, 0x92, 0xdc, 0x98, 0x59, 0xde, 0xdf,
-0xfa, 0x9a, 0x32, 0x2e, 0xc0, 0x5d, 0x3c, 0x33, 0x41, 0x6d, 0xaf, 0xb2, 0x25, 0x23, 0x14,
-0xa5, 0x7b, 0xc7, 0x9b, 0x68, 0xf3, 0xda, 0xeb, 0xe3, 0xa9, 0xe2, 0x6f, 0x0e, 0x1d, 0x1c,
-0xba, 0x55, 0xb6, 0x34, 0x6a, 0x93, 0x1f, 0x1f, 0xb8, 0x34, 0xc8, 0x84, 0x08, 0xb1, 0x6b,
-0x6a, 0x28, 0x74, 0x74, 0xe5, 0xeb, 0x75, 0xe9, 0x7c, 0xd8, 0xba, 0xd8, 0x42, 0xa5, 0xee,
-0x1f, 0x80, 0xd9, 0x96, 0xb2, 0x2e, 0xe7, 0xbf, 0xba, 0xeb, 0xd1, 0x69, 0xbb, 0x8f, 0xfd,
-0x5a, 0x63, 0x8f, 0x39, 0x7f, 0xdf, 0x1d, 0x37, 0xd2, 0x18, 0x35, 0x9d, 0xb6, 0xcc, 0xe4,
-0x27, 0x81, 0x89, 0x38, 0x38, 0x68, 0x33, 0xe7, 0x78, 0xd8, 0x76, 0xf5, 0xee, 0xd0, 0x4a,
-0x07, 0x69, 0x19, 0x7a, 0xad, 0x18, 0xb1, 0x94, 0x61, 0x45, 0x53, 0xa2, 0x48, 0xda, 0x96,
-0x4a, 0xf9, 0xee, 0x94, 0x2a, 0x1f, 0x6e, 0x18, 0x3c, 0x92, 0x46, 0xd1, 0x1a, 0x28, 0x18,
-0x32, 0x1f, 0x3a, 0x45, 0xbe, 0x04, 0x35, 0x92, 0xe5, 0xa3, 0xcb, 0xb5, 0x2e, 0x32, 0x43,
-0xac, 0x65, 0x17, 0x89, 0x99, 0x15, 0x03, 0x9e, 0xb1, 0x23, 0x2f, 0xed, 0x76, 0x4d, 0xd8,
-0xac, 0x21, 0x40, 0xc4, 0x99, 0x4e, 0x65, 0x71, 0x2c, 0xb3, 0x45, 0xab, 0xfb, 0xe7, 0x72,
-0x39, 0x56, 0x30, 0x6d, 0xfb, 0x74, 0xeb, 0x99, 0xf3, 0xcd, 0x57, 0x5c, 0x78, 0x75, 0xe9,
-0x8d, 0xc3, 0xa2, 0xfb, 0x5d, 0xe0, 0x90, 0xc5, 0x55, 0xad, 0x91, 0x53, 0x4e, 0x9e, 0xbd,
-0x8c, 0x49, 0xa4, 0xa4, 0x69, 0x10, 0x0c, 0xc5, 0x76, 0xe9, 0x25, 0x86, 0x8d, 0x66, 0x23,
-0xa8, 0xdb, 0x5c, 0xe8, 0xd9, 0x30, 0xe1, 0x15, 0x7b, 0xc0, 0x99, 0x0f, 0x03, 0xec, 0xaa,
-0x12, 0xef, 0xce, 0xd4, 0xea, 0x55, 0x5c, 0x08, 0x86, 0xf4, 0xf4, 0xb0, 0x83, 0x42, 0x95,
-0x37, 0xb6, 0x38, 0xe0, 0x2b, 0x54, 0x89, 0xbd, 0x4e, 0x20, 0x9d, 0x3f, 0xc3, 0x4b, 0xb7,
-0xec, 0xfa, 0x5a, 0x14, 0x03, 0xcb, 0x64, 0xc8, 0x34, 0x4a, 0x4b, 0x6e, 0xf8, 0x6e, 0x56,
-0xf6, 0xdd, 0x5f, 0xa1, 0x24, 0xe2, 0xd4, 0xd0, 0x82, 0x64, 0x1f, 0x8e, 0x9b, 0xfa, 0xb4,
-0xcb, 0xdb, 0x0a, 0xe8, 0x15, 0xfc, 0x15, 0xab, 0x4b, 0x18, 0xbf, 0xd4, 0x42, 0x14, 0x48,
-0x82, 0x85, 0xdd, 0xeb, 0x49, 0x1b, 0x0b, 0x0b, 0x05, 0xe9, 0xb4, 0xa1, 0x33, 0x0a, 0x5d,
-0x0e, 0x6c, 0x4b, 0xc0, 0xd6, 0x6c, 0x7c, 0xfb, 0x69, 0x0b, 0x53, 0x19, 0xe4, 0xf3, 0x35,
-0xfc, 0xbe, 0xa1, 0x34, 0x02, 0x09, 0x4f, 0x74, 0x86, 0x92, 0xcd, 0x5d, 0x1a, 0xc1, 0x27,
-0x0c, 0xf2, 0xc5, 0xcf, 0xdd, 0x23, 0x93, 0x02, 0xbd, 0x41, 0x5e, 0x42, 0xf0, 0xa0, 0x9d,
-0x0c, 0x72, 0xc8, 0xec, 0x32, 0x0a, 0x8a, 0xfd, 0x3d, 0x5a, 0x41, 0x27, 0x0c, 0x88, 0x59,
-0xad, 0x94, 0x2e, 0xef, 0x5d, 0x8f, 0xc7, 0xdf, 0x66, 0xe4, 0xdd, 0x56, 0x6c, 0x7b, 0xca,
-0x55, 0x81, 0xae, 0xae, 0x5c, 0x1b, 0x1a, 0xab, 0xae, 0x99, 0x8d, 0xcc, 0x42, 0x97, 0x59,
-0xf4, 0x14, 0x3f, 0x75, 0xc6, 0xd1, 0x88, 0xba, 0xaa, 0x84, 0x4a, 0xd0, 0x34, 0x08, 0x3b,
-0x7d, 0xdb, 0x15, 0x06, 0xb0, 0x5c, 0xbd, 0x40, 0xf5, 0xa8, 0xec, 0xae, 0x36, 0x40, 0xdd,
-0x90, 0x1c, 0x3e, 0x0d, 0x7e, 0x73, 0xc7, 0xc2, 0xc5, 0x6a, 0xff, 0x52, 0x05, 0x7f, 0xbe,
-0xd0, 0x92, 0xfd, 0xb3, 0x6f, 0xff, 0x5d, 0xb7, 0x97, 0x64, 0x73, 0x7b, 0xca, 0xd1, 0x98,
-0x24, 0x6b, 0x0b, 0x01, 0x68, 0xdd, 0x27, 0x85, 0x85, 0xb5, 0x83, 0xc1, 0xe0, 0x50, 0x64,
-0xc7, 0xaf, 0xf1, 0xc6, 0x4d, 0xb1, 0xef, 0xc9, 0xb4, 0x0a, 0x6d, 0x65, 0xf3, 0x47, 0xcc,
-0xa3, 0x02, 0x21, 0x0c, 0xbe, 0x22, 0x29, 0x05, 0xcf, 0x5f, 0xe8, 0x94, 0x6c, 0xe5, 0xdc,
-0xc4, 0xdf, 0xbe, 0x3e, 0xa8, 0xb4, 0x18, 0xb0, 0x99, 0xb8, 0x6f, 0xff, 0x5d, 0xb9, 0xfd,
-0x3b, 0x5d, 0x16, 0xbf, 0x3e, 0xd8, 0xb3, 0xd8, 0x08, 0x34, 0xf6, 0x47, 0x35, 0x5b, 0x72,
-0x1a, 0x33, 0xad, 0x52, 0x5d, 0xb8, 0xd0, 0x77, 0xc6, 0xab, 0xba, 0x55, 0x09, 0x5f, 0x02,
-0xf8, 0xd4, 0x5f, 0x53, 0x06, 0x91, 0xcd, 0x74, 0x42, 0xae, 0x54, 0x91, 0x81, 0x62, 0x13,
-0x6f, 0xd8, 0xa9, 0x77, 0xc3, 0x6c, 0xcb, 0xf1, 0x29, 0x5a, 0xcc, 0xda, 0x35, 0xbd, 0x52,
-0x23, 0xbe, 0x59, 0xeb, 0x12, 0x6d, 0xb7, 0x53, 0xee, 0xfc, 0xb4, 0x1b, 0x13, 0x5e, 0xba,
-0x16, 0x7c, 0xc5, 0xf3, 0xe3, 0x6d, 0x07, 0x78, 0xf5, 0x2b, 0x21, 0x05, 0x88, 0x4c, 0xc0,
-0xa1, 0xe3, 0x36, 0x10, 0xf8, 0x1b, 0xd8, 0x17, 0xfb, 0x6a, 0x4e, 0xd8, 0xb3, 0x47, 0x2d,
-0x99, 0xbd, 0xbb, 0x5d, 0x37, 0x7d, 0xba, 0xf1, 0xe1, 0x7c, 0xc0, 0xc5, 0x54, 0x62, 0x7f,
-0xcf, 0x5a, 0x4a, 0x93, 0xcc, 0xf1, 0x1b, 0x34, 0xc8, 0xa6, 0x05, 0x4c, 0x55, 0x8b, 0x54,
-0x84, 0xd5, 0x77, 0xeb, 0xc0, 0x6d, 0x3a, 0x29, 0xbd, 0x75, 0x61, 0x09, 0x9a, 0x2c, 0xbb,
-0xf7, 0x18, 0x79, 0x34, 0x90, 0x24, 0xa5, 0x81, 0x70, 0x87, 0xc5, 0x02, 0x7c, 0xba, 0xd4,
-0x5e, 0x14, 0x8e, 0xe4, 0xed, 0xa2, 0x61, 0x6a, 0xb9, 0x6e, 0xb5, 0x4a, 0xb9, 0x01, 0x46,
-0xf4, 0xcf, 0xbc, 0x09, 0x2f, 0x27, 0x4b, 0xbd, 0x86, 0x7a, 0x10, 0xe1, 0xd4, 0xc8, 0xd9,
-0x20, 0x8d, 0x8a, 0x63, 0x00, 0x63, 0x44, 0xeb, 0x54, 0x0b, 0x75, 0x49, 0x10, 0xa2, 0xa7,
-0xad, 0xb9, 0xd1, 0x01, 0x80, 0x63, 0x25, 0xc8, 0x12, 0xa6, 0xce, 0x1e, 0xbe, 0xfe, 0x7e,
-0x5f, 0x3c, 0xdb, 0x34, 0xea, 0x37, 0xec, 0x3b, 0xd5, 0x28, 0xd2, 0x07, 0x8c, 0x9a, 0xb6,
-0xee, 0x5e, 0x3e, 0xdf, 0x1d, 0x99, 0xb0, 0xe2, 0x46, 0xef, 0x5c, 0x1b, 0xb4, 0xea, 0x56,
-0x2e, 0xde, 0x1f, 0x9d, 0xb8, 0xd3, 0x24, 0xab, 0xd4, 0x2a, 0xd6, 0x2e, 0xde, 0x1f, 0x9d,
-0xb8, 0xf2, 0x66, 0x2f, 0xbd, 0xf8, 0x72, 0x66, 0x4e, 0x1e, 0x9f, 0x9d, 0xb8, 0xf2, 0x47,
-0x0c, 0x9a, 0xb6, 0xee, 0x3f, 0xfc, 0x7a, 0x57, 0x0d, 0x79, 0x70, 0x62, 0x27, 0xad, 0xb9,
-0xd1, 0x01, 0x61, 0x40, 0x02, 0x67, 0x2d, 0xd8, 0x32, 0xe6, 0x2f, 0xdc, 0x3a, 0xd7, 0x2c,
-0xbb, 0xf4, 0x4b, 0xf5, 0x49, 0xf1, 0x60, 0x23, 0xc4, 0x0a, 0x77, 0x4d, 0xf9, 0x51, 0x01,
-0x80, 0x63, 0x25, 0xa9, 0xb1, 0xe0, 0x42, 0xe7, 0x4c, 0x1a, 0x97, 0xac, 0xbb, 0xf4, 0x6a,
-0x37, 0xcd, 0x18, 0xb2, 0xe6, 0x2f, 0xdc, 0x1b, 0x95, 0xa8, 0xd2, 0x07, 0x6d, 0x58, 0x32,
-0xe6, 0x4e, 0x1e, 0x9f, 0xbc, 0xfa, 0x57, 0x0d, 0x79, 0x51, 0x20, 0xc2, 0x06, 0x6f, 0x5c,
-0x1b, 0x95, 0xa8, 0xb3, 0xc5, 0xe9, 0x31, 0xe0, 0x23, 0xc4, 0x0a, 0x77, 0x4d, 0x18, 0x93,
-0x85, 0x69, 0x31, 0xc1, 0xe1, 0x21, 0xc0, 0xe3, 0x44, 0x0a, 0x77, 0x6c, 0x5a, 0x17, 0x8d,
-0x98, 0x93, 0xa4, 0xab, 0xd4, 0x2a, 0xb7, 0xec, 0x5a, 0x17, 0xac, 0xbb, 0xf4, 0x4b, 0x14,
-0xaa, 0xb7, 0xec, 0x3b, 0xd5, 0x28, 0xb3, 0xc5, 0xe9, 0x31, 0xc1, 0x00, 0x82, 0x67, 0x4c,
-0xfb, 0x55, 0x28, 0xd2, 0x26, 0xaf, 0xbd, 0xd9, 0x11, 0x81, 0x61, 0x21, 0xa1, 0xa1, 0xc0,
-0x02, 0x86, 0x6f, 0x5c, 0x1b, 0xb4, 0xcb, 0x14, 0x8b, 0x94, 0xaa, 0xd6, 0x2e, 0xbf, 0xdd,
-0x19, 0xb0, 0xe2, 0x46, 0x0e, 0x7f, 0x7c, 0x5b, 0x15, 0x89, 0x90, 0x83, 0x84, 0x6b, 0x54,
-0x0b, 0x75, 0x68, 0x52, 0x07, 0x6d, 0x58, 0x32, 0xc7, 0xed, 0x58, 0x32, 0xc7, 0xed, 0x58,
-0x32, 0xe6, 0x4e, 0xff, 0x7c, 0x7a, 0x76, 0x6e, 0x3f, 0xdd, 0x38, 0xd3, 0x05, 0x88, 0x92,
-0xa6, 0xaf, 0xdc, 0x1b, 0xb4, 0xcb, 0xf5, 0x68, 0x52, 0x07, 0x8c, 0x7b, 0x55, 0x09, 0x90,
-0x83, 0x84, 0x6b, 0x54, 0x2a, 0xb7, 0xec, 0x3b, 0xd5, 0x09, 0x90, 0xa2, 0xc6, 0x0e, 0x7f,
-0x7c, 0x7a, 0x57, 0x0d, 0x98, 0xb2, 0xc7, 0xed, 0x58, 0x32, 0xc7, 0x0c, 0x7b, 0x74, 0x4b,
-0x14, 0x8b, 0x94, 0xaa, 0xb7, 0xcd, 0x18, 0x93, 0xa4, 0xca, 0x16, 0xae, 0xbf, 0xdd, 0x19,
-0xb0, 0xe2, 0x46, 0x0e, 0x7f, 0x5d, 0x19, 0x91, 0x81, 0x80, 0x63, 0x44, 0xeb, 0x35, 0xc9,
-0x10, 0x83, 0x65, 0x48, 0x12, 0xa6, 0xce, 0x1e, 0x9f, 0xbc, 0xdb, 0x15, 0x89, 0x71, 0x60,
-0x23, 0xc4, 0xeb, 0x54, 0x2a, 0xb7, 0xec, 0x5a, 0x36, 0xcf, 0x81, 0x10, 0xac, 0x74 };
+const uint8_t firmware_data[FIRMWARE_LENGTH] PROGMEM = {
+ 0x01, 0xe8, 0xba, 0x26, 0x0b, 0xb2, 0xbe, 0xfe, 0x7e, 0x5f, 0x3c, 0xdb, 0x15, 0xa8, 0xb3,
+ 0xe4, 0x2b, 0xb5, 0xe8, 0x53, 0x07, 0x6d, 0x3b, 0xd1, 0x20, 0xc2, 0x06, 0x6f, 0x3d, 0xd9,
+ 0x11, 0xa0, 0xc2, 0xe7, 0x2d, 0xb9, 0xd1, 0x20, 0xa3, 0xa5, 0xc8, 0xf3, 0x64, 0x4a, 0xf7,
+ 0x4d, 0x18, 0x93, 0xa4, 0xca, 0xf7, 0x6c, 0x5a, 0x36, 0xee, 0x5e, 0x3e, 0xfe, 0x7e, 0x7e,
+ 0x5f, 0x1d, 0x99, 0xb0, 0xc3, 0xe5, 0x29, 0xd3, 0x03, 0x65, 0x48, 0x12, 0x87, 0x6d, 0x58,
+ 0x32, 0xe6, 0x2f, 0xdc, 0x3a, 0xf2, 0x4f, 0xfd, 0x59, 0x11, 0x81, 0x61, 0x21, 0xc0, 0x02,
+ 0x86, 0x8e, 0x7f, 0x5d, 0x38, 0xf2, 0x47, 0x0c, 0x7b, 0x55, 0x28, 0xb3, 0xe4, 0x4a, 0x16,
+ 0xab, 0xbf, 0xdd, 0x38, 0xf2, 0x66, 0x4e, 0xff, 0x5d, 0x19, 0x91, 0xa0, 0xa3, 0xa5, 0xc8,
+ 0x12, 0xa6, 0xaf, 0xdc, 0x3a, 0xd1, 0x41, 0x60, 0x75, 0x58, 0x24, 0x92, 0xd4, 0x72, 0x6c,
+ 0xe0, 0x2f, 0xfd, 0x23, 0x8d, 0x1c, 0x5b, 0xb2, 0x97, 0x36, 0x3d, 0x0b, 0xa2, 0x49, 0xb1,
+ 0x58, 0xf2, 0x1f, 0xc0, 0xcb, 0xf8, 0x41, 0x4f, 0xcd, 0x1e, 0x6b, 0x39, 0xa7, 0x2b, 0xe9,
+ 0x30, 0x16, 0x83, 0xd2, 0x0e, 0x47, 0x8f, 0xe3, 0xb1, 0xdf, 0xa2, 0x15, 0xdb, 0x5d, 0x30,
+ 0xc5, 0x1a, 0xab, 0x31, 0x99, 0xf3, 0xfa, 0xb2, 0x86, 0x69, 0xad, 0x7a, 0xe8, 0xa7, 0x18,
+ 0x6a, 0xcc, 0xc8, 0x65, 0x23, 0x87, 0xa8, 0x5f, 0xf5, 0x21, 0x59, 0x75, 0x09, 0x71, 0x45,
+ 0x55, 0x25, 0x4b, 0xda, 0xa1, 0xc3, 0xf7, 0x41, 0xab, 0x59, 0xd9, 0x74, 0x12, 0x55, 0x5f,
+ 0xbc, 0xaf, 0xd9, 0xfd, 0xb0, 0x1e, 0xa3, 0x0f, 0xff, 0xde, 0x11, 0x16, 0x6a, 0xae, 0x0e,
+ 0xe1, 0x5d, 0x3c, 0x10, 0x43, 0x9a, 0xa1, 0x0b, 0x24, 0x8f, 0x0d, 0x7f, 0x0b, 0x5e, 0x4c,
+ 0x42, 0xa4, 0x84, 0x2c, 0x40, 0xd0, 0x55, 0x39, 0xe6, 0x4b, 0xf8, 0x9b, 0x2f, 0xdc, 0x28,
+ 0xff, 0xfa, 0xb5, 0x85, 0x19, 0xe5, 0x28, 0xa1, 0x77, 0xaa, 0x73, 0xf3, 0x03, 0xc7, 0x62,
+ 0xa6, 0x91, 0x18, 0xc9, 0xb0, 0xcd, 0x05, 0xdc, 0xca, 0x81, 0x26, 0x1a, 0x47, 0x40, 0xda,
+ 0x36, 0x7d, 0x6a, 0x53, 0xc8, 0x5a, 0x77, 0x5d, 0x19, 0xa4, 0x1b, 0x23, 0x83, 0xd0, 0xb2,
+ 0xaa, 0x0e, 0xbf, 0x77, 0x4e, 0x3a, 0x3b, 0x59, 0x00, 0x31, 0x0d, 0x02, 0x1b, 0x88, 0x7a,
+ 0xd4, 0xbd, 0x9d, 0xcc, 0x58, 0x04, 0x69, 0xf6, 0x3b, 0xca, 0x42, 0xe2, 0xfd, 0xc3, 0x3d,
+ 0x39, 0xc5, 0xd0, 0x71, 0xe4, 0xc8, 0xb7, 0x3e, 0x3f, 0xc8, 0xe9, 0xca, 0xc9, 0x3f, 0x04,
+ 0x4e, 0x1b, 0x79, 0xca, 0xa5, 0x61, 0xc2, 0xed, 0x1d, 0xa6, 0xda, 0x5a, 0xe9, 0x7f, 0x65,
+ 0x8c, 0xbe, 0x12, 0x6e, 0xa4, 0x5b, 0x33, 0x2f, 0x84, 0x28, 0x9c, 0x1c, 0x88, 0x2d, 0xff,
+ 0x07, 0xbf, 0xa6, 0xd7, 0x5a, 0x88, 0x86, 0xb0, 0x3f, 0xf6, 0x31, 0x5b, 0x11, 0x6d, 0xf5,
+ 0x58, 0xeb, 0x58, 0x02, 0x9e, 0xb5, 0x9a, 0xb1, 0xff, 0x25, 0x9d, 0x8b, 0x4f, 0xb6, 0x0a,
+ 0xf9, 0xea, 0x3e, 0x3f, 0x21, 0x09, 0x65, 0x21, 0x22, 0xfe, 0x3d, 0x4e, 0x11, 0x5b, 0x9e,
+ 0x5a, 0x59, 0x8b, 0xdd, 0xd8, 0xce, 0xd6, 0xd9, 0x59, 0xd2, 0x1e, 0xfd, 0xef, 0x0d, 0x1b,
+ 0xd9, 0x61, 0x7f, 0xd7, 0x2d, 0xad, 0x62, 0x09, 0xe5, 0x22, 0x63, 0xea, 0xc7, 0x31, 0xd9,
+ 0xa1, 0x38, 0x80, 0x5c, 0xa7, 0x32, 0x82, 0xec, 0x1b, 0xa2, 0x49, 0x5a, 0x06, 0xd2, 0x7c,
+ 0xc9, 0x96, 0x57, 0xbb, 0x17, 0x75, 0xfc, 0x7a, 0x8f, 0x0d, 0x77, 0xb5, 0x7a, 0x8e, 0x3e,
+ 0xf4, 0xba, 0x2f, 0x69, 0x13, 0x26, 0xd6, 0xd9, 0x21, 0x60, 0x2f, 0x21, 0x3e, 0x87, 0xee,
+ 0xfd, 0x87, 0x16, 0x0d, 0xc8, 0x08, 0x00, 0x25, 0x71, 0xac, 0x2c, 0x03, 0x2a, 0x37, 0x2d,
+ 0xb3, 0x34, 0x09, 0x91, 0xe3, 0x06, 0x2c, 0x38, 0x37, 0x95, 0x3b, 0x17, 0x7a, 0xaf, 0xac,
+ 0x99, 0x55, 0xab, 0x41, 0x39, 0x5f, 0x8e, 0xa6, 0x43, 0x80, 0x03, 0x88, 0x6f, 0x7d, 0xbd,
+ 0x5a, 0xb4, 0x2b, 0x32, 0x23, 0x5a, 0xa9, 0x31, 0x32, 0x39, 0x4c, 0x5b, 0xf4, 0x6b, 0xaf,
+ 0x66, 0x6f, 0x3c, 0x8e, 0x2d, 0x82, 0x97, 0x9f, 0x4a, 0x01, 0xdc, 0x99, 0x98, 0x00, 0xec,
+ 0x38, 0x7a, 0x79, 0x70, 0xa6, 0x85, 0xd6, 0x21, 0x63, 0x0d, 0x45, 0x9a, 0x2e, 0x5e, 0xa7,
+ 0xb1, 0xea, 0x66, 0x6a, 0xbc, 0x62, 0x2d, 0x7b, 0x7d, 0x85, 0xea, 0x95, 0x2f, 0xc0, 0xe8,
+ 0x6f, 0x35, 0xa0, 0x3a, 0x02, 0x25, 0xbc, 0xb2, 0x5f, 0x5c, 0x43, 0x96, 0xcc, 0x26, 0xd2,
+ 0x16, 0xb4, 0x96, 0x73, 0xd7, 0x13, 0xc7, 0xae, 0x53, 0x15, 0x31, 0x89, 0x68, 0x66, 0x6d,
+ 0x2c, 0x92, 0x1f, 0xcc, 0x5b, 0xa7, 0x8f, 0x5d, 0xbb, 0xc9, 0xdb, 0xe8, 0x3b, 0x9d, 0x61,
+ 0x74, 0x8b, 0x05, 0xa1, 0x58, 0x52, 0x68, 0xee, 0x3d, 0x39, 0x79, 0xa0, 0x9b, 0xdd, 0xe1,
+ 0x55, 0xc9, 0x60, 0xeb, 0xad, 0xb8, 0x5b, 0xc2, 0x5a, 0xb5, 0x2c, 0x18, 0x55, 0xa9, 0x50,
+ 0xc3, 0xf6, 0x72, 0x5f, 0xcc, 0xe2, 0xf4, 0x55, 0xb5, 0xd6, 0xb5, 0x4a, 0x99, 0xa5, 0x28,
+ 0x74, 0x97, 0x18, 0xe8, 0xc0, 0x84, 0x89, 0x50, 0x03, 0x86, 0x4d, 0x1a, 0xb7, 0x09, 0x90,
+ 0xa2, 0x01, 0x04, 0xbb, 0x73, 0x62, 0xcb, 0x97, 0x22, 0x70, 0x5d, 0x52, 0x41, 0x8e, 0xd9,
+ 0x90, 0x15, 0xaa, 0xab, 0x0a, 0x31, 0x65, 0xb4, 0xda, 0xd0, 0xee, 0x24, 0xc9, 0x41, 0x91,
+ 0x1e, 0xbc, 0x46, 0x70, 0x40, 0x9d, 0xda, 0x0e, 0x2a, 0xe4, 0xb2, 0x4c, 0x9f, 0xf2, 0xfc,
+ 0xf3, 0x84, 0x17, 0x44, 0x1e, 0xd7, 0xca, 0x23, 0x1f, 0x3f, 0x5a, 0x22, 0x3d, 0xaf, 0x9b,
+ 0x2d, 0xfc, 0x41, 0xad, 0x26, 0xb4, 0x45, 0x67, 0x0b, 0x80, 0x0e, 0xf9, 0x61, 0x37, 0xec,
+ 0x3b, 0xf4, 0x4b, 0x14, 0xdf, 0x5a, 0x0c, 0x3a, 0x50, 0x0b, 0x14, 0x0c, 0x72, 0xae, 0xc6,
+ 0xc5, 0xec, 0x35, 0x53, 0x2d, 0x59, 0xed, 0x91, 0x74, 0xe2, 0xc4, 0xc8, 0xf2, 0x25, 0x6b,
+ 0x97, 0x6f, 0xc9, 0x76, 0xce, 0xa9, 0xb1, 0x99, 0x8f, 0x5a, 0x92, 0x3b, 0xc4, 0x8d, 0x54,
+ 0x50, 0x40, 0x72, 0xd6, 0x90, 0x83, 0xfc, 0xe5, 0x49, 0x8b, 0x17, 0xf5, 0xfd, 0x6b, 0x8d,
+ 0x32, 0x02, 0xe9, 0x0a, 0xfe, 0xbf, 0x00, 0x6b, 0xa3, 0xad, 0x5f, 0x09, 0x4b, 0x97, 0x2b,
+ 0x00, 0x58, 0x65, 0x2e, 0x07, 0x49, 0x0a, 0x3b, 0x6b, 0x2e, 0x50, 0x6c, 0x1d, 0xac, 0xb7,
+ 0x6a, 0x26, 0xd8, 0x13, 0xa4, 0xca, 0x16, 0xae, 0xab, 0x93, 0xb9, 0x1c, 0x1c, 0xb4, 0x47,
+ 0x6a, 0x38, 0x36, 0x17, 0x27, 0xc9, 0x7f, 0xc7, 0x64, 0xcb, 0x89, 0x58, 0xc5, 0x61, 0xc2,
+ 0xc6, 0xea, 0x15, 0x0b, 0x34, 0x0c, 0x5d, 0x61, 0x76, 0x6e, 0x2b, 0x62, 0x40, 0x92, 0xa3,
+ 0x6c, 0xef, 0xf4, 0xe4, 0xc3, 0xa1, 0xa8, 0xf5, 0x94, 0x79, 0x0d, 0xd1, 0x3d, 0xcb, 0x3d,
+ 0x40, 0xb6, 0xd0, 0xf0, 0x10, 0x54, 0xd8, 0x47, 0x25, 0x51, 0xc5, 0x41, 0x79, 0x00, 0xe5,
+ 0xa0, 0x72, 0xde, 0xbb, 0x3b, 0x62, 0x17, 0xf6, 0xbc, 0x5d, 0x00, 0x76, 0x2e, 0xa7, 0x3b,
+ 0xb6, 0xf1, 0x98, 0x72, 0x59, 0x2a, 0x73, 0xb0, 0x21, 0xd6, 0x49, 0xe0, 0xc0, 0xd5, 0xeb,
+ 0x02, 0x7d, 0x4b, 0x41, 0x28, 0x70, 0x2d, 0xec, 0x2b, 0x71, 0x1f, 0x0b, 0xb9, 0x71, 0x63,
+ 0x06, 0xe6, 0xbc, 0x60, 0xbb, 0xf4, 0x9a, 0x62, 0x43, 0x09, 0x18, 0x4e, 0x93, 0x06, 0x4d,
+ 0x76, 0xfa, 0x7f, 0xbd, 0x02, 0xe4, 0x50, 0x91, 0x12, 0xe5, 0x86, 0xff, 0x64, 0x1e, 0xaf,
+ 0x7e, 0xb3, 0xb2, 0xde, 0x89, 0xc1, 0xa2, 0x6f, 0x40, 0x7b, 0x41, 0x51, 0x63, 0xea, 0x25,
+ 0xd1, 0x97, 0x57, 0x92, 0xa8, 0x45, 0xa1, 0xa5, 0x45, 0x21, 0x43, 0x7f, 0x83, 0x15, 0x29,
+ 0xd0, 0x30, 0x53, 0x32, 0xb4, 0x5a, 0x17, 0x96, 0xbc, 0xc2, 0x68, 0xa9, 0xb7, 0xaf, 0xac,
+ 0xdf, 0xf1, 0xe3, 0x89, 0xba, 0x24, 0x79, 0x54, 0xc6, 0x14, 0x07, 0x1c, 0x1e, 0x0d, 0x3a,
+ 0x6b, 0xe5, 0x3d, 0x4e, 0x10, 0x60, 0x96, 0xec, 0x6c, 0xda, 0x47, 0xae, 0x03, 0x25, 0x39,
+ 0x1d, 0x74, 0xc8, 0xac, 0x6a, 0xf2, 0x6b, 0x05, 0x2a, 0x9a, 0xe7, 0xe8, 0x92, 0xd6, 0xc2,
+ 0x6d, 0xfa, 0xe8, 0xa7, 0x9d, 0x5f, 0x48, 0xc9, 0x75, 0xf1, 0x66, 0x6a, 0xdb, 0x5d, 0x9a,
+ 0xcd, 0x27, 0xdd, 0xb9, 0x24, 0x04, 0x9c, 0x18, 0xc2, 0x6d, 0x0c, 0x91, 0x34, 0x48, 0x42,
+ 0x6f, 0xe9, 0x59, 0x70, 0xc4, 0x7e, 0x81, 0x0e, 0x32, 0x0a, 0x93, 0x48, 0xb0, 0xc0, 0x15,
+ 0x9e, 0x05, 0xac, 0x36, 0x16, 0xcb, 0x59, 0x65, 0xa0, 0x83, 0xdf, 0x3e, 0xda, 0xfb, 0x1d,
+ 0x1a, 0xdb, 0x65, 0xec, 0x9a, 0xc6, 0xc3, 0x8e, 0x3c, 0x45, 0xfd, 0xc8, 0xf5, 0x1c, 0x6a,
+ 0x67, 0x0d, 0x8f, 0x99, 0x7d, 0x30, 0x21, 0x8c, 0xea, 0x22, 0x87, 0x65, 0xc9, 0xb2, 0x4c,
+ 0xe4, 0x1b, 0x46, 0xba, 0x54, 0xbd, 0x7c, 0xca, 0xd5, 0x8f, 0x5b, 0xa5, 0x01, 0x04, 0xd8,
+ 0x0a, 0x16, 0xbf, 0xb9, 0x50, 0x2e, 0x37, 0x2f, 0x64, 0xf3, 0x70, 0x11, 0x02, 0x05, 0x31,
+ 0x9b, 0xa0, 0xb2, 0x01, 0x5e, 0x4f, 0x19, 0xc9, 0xd4, 0xea, 0xa1, 0x79, 0x54, 0x53, 0xa7,
+ 0xde, 0x2f, 0x49, 0xd3, 0xd1, 0x63, 0xb5, 0x03, 0x15, 0x4e, 0xbf, 0x04, 0xb3, 0x26, 0x8b,
+ 0x20, 0xb2, 0x45, 0xcf, 0xcd, 0x5b, 0x82, 0x32, 0x88, 0x61, 0xa7, 0xa8, 0xb2, 0xa0, 0x72,
+ 0x96, 0xc0, 0xdb, 0x2b, 0xe2, 0x5f, 0xba, 0xe3, 0xf5, 0x8a, 0xde, 0xf1, 0x18, 0x01, 0x16,
+ 0x40, 0xd9, 0x86, 0x12, 0x09, 0x18, 0x1b, 0x05, 0x0c, 0xb1, 0xb5, 0x47, 0xe2, 0x43, 0xab,
+ 0xfe, 0x92, 0x63, 0x7e, 0x95, 0x2b, 0xf0, 0xaf, 0xe1, 0xf1, 0xc3, 0x4a, 0xff, 0x2b, 0x09,
+ 0xbb, 0x4a, 0x0e, 0x9a, 0xc4, 0xd8, 0x64, 0x7d, 0x83, 0xa0, 0x4f, 0x44, 0xdb, 0xc4, 0xa8,
+ 0x58, 0xef, 0xfc, 0x9e, 0x77, 0xf9, 0xa6, 0x8f, 0x58, 0x8b, 0x12, 0xf4, 0xe9, 0x81, 0x12,
+ 0x47, 0x51, 0x41, 0x83, 0xef, 0xf6, 0x73, 0xbc, 0x8e, 0x0f, 0x4c, 0x8f, 0x4e, 0x69, 0x90,
+ 0x77, 0x29, 0x5d, 0x92, 0xb0, 0x6d, 0x06, 0x67, 0x29, 0x60, 0xbd, 0x4b, 0x17, 0xc8, 0x89,
+ 0x69, 0x28, 0x29, 0xd6, 0x78, 0xcb, 0x11, 0x4c, 0xba, 0x8b, 0x68, 0xae, 0x7e, 0x9f, 0xef,
+ 0x95, 0xda, 0xe2, 0x9e, 0x7f, 0xe9, 0x55, 0xe5, 0xe1, 0xe2, 0xb7, 0xe6, 0x5f, 0xbb, 0x2c,
+ 0xa2, 0xe6, 0xee, 0xc7, 0x0a, 0x60, 0xa9, 0xd1, 0x80, 0xdf, 0x7f, 0xd6, 0x97, 0xab, 0x1d,
+ 0x22, 0x25, 0xfc, 0x79, 0x23, 0xe0, 0xae, 0xc5, 0xef, 0x16, 0xa4, 0xa1, 0x0f, 0x92, 0xa9,
+ 0xc7, 0xe3, 0x3a, 0x55, 0xdf, 0x62, 0x49, 0xd9, 0xf5, 0x84, 0x49, 0xc5, 0x90, 0x34, 0xd3,
+ 0xe1, 0xac, 0x99, 0x21, 0xb1, 0x02, 0x76, 0x4a, 0xfa, 0xd4, 0xbb, 0xa4, 0x9c, 0xa2, 0xe2,
+ 0xcb, 0x3d, 0x3b, 0x14, 0x75, 0x60, 0xd1, 0x02, 0xb4, 0xa3, 0xb4, 0x72, 0x06, 0xf9, 0x19,
+ 0x9c, 0xe2, 0xe4, 0xa7, 0x0f, 0x25, 0x88, 0xc6, 0x86, 0xd6, 0x8c, 0x74, 0x4e, 0x6e, 0xfc,
+ 0xa8, 0x48, 0x9e, 0xa7, 0x9d, 0x1a, 0x4b, 0x37, 0x09, 0xc8, 0xb0, 0x10, 0xbe, 0x6f, 0xfe,
+ 0xa3, 0xc4, 0x7a, 0xb5, 0x3d, 0xe8, 0x30, 0xf1, 0x0d, 0xa0, 0xb2, 0x44, 0xfc, 0x9b, 0x8c,
+ 0xf8, 0x61, 0xed, 0x81, 0xd1, 0x62, 0x11, 0xb4, 0xe1, 0xd5, 0x39, 0x52, 0x89, 0xd3, 0xa8,
+ 0x49, 0x31, 0xdf, 0xb6, 0xf9, 0x91, 0xf4, 0x1c, 0x9d, 0x09, 0x95, 0x40, 0x56, 0xe7, 0xe3,
+ 0xcd, 0x5c, 0x92, 0xc1, 0x1d, 0x6b, 0xe9, 0x78, 0x6f, 0x8e, 0x94, 0x42, 0x66, 0xa2, 0xaa,
+ 0xd3, 0xc8, 0x2e, 0xe3, 0xf6, 0x07, 0x72, 0x0b, 0x6b, 0x1e, 0x7b, 0xb9, 0x7c, 0xe0, 0xa0,
+ 0xbc, 0xd9, 0x25, 0xdf, 0x87, 0xa8, 0x5f, 0x9c, 0xcc, 0xf0, 0xdb, 0x42, 0x8e, 0x07, 0x31,
+ 0x13, 0x01, 0x66, 0x32, 0xd1, 0xb8, 0xd6, 0xe3, 0x5e, 0x12, 0x76, 0x61, 0xd3, 0x38, 0x89,
+ 0xe6, 0x17, 0x6f, 0xa5, 0xf2, 0x71, 0x0e, 0xa5, 0xe2, 0x88, 0x30, 0xbb, 0xbe, 0x8a, 0xea,
+ 0xc7, 0x62, 0xc4, 0xcf, 0xb8, 0xcd, 0x33, 0x8d, 0x3d, 0x3e, 0xb5, 0x60, 0x3a, 0x03, 0x92,
+ 0xe4, 0x6d, 0x1b, 0xe0, 0xb4, 0x84, 0x08, 0x55, 0x88, 0xa7, 0x3a, 0xb9, 0x3d, 0x43, 0xc3,
+ 0xc0, 0xfa, 0x07, 0x6a, 0xca, 0x94, 0xad, 0x99, 0x55, 0xf1, 0xf1, 0xc0, 0x23, 0x87, 0x1d,
+ 0x3d, 0x1c, 0xd1, 0x66, 0xa0, 0x57, 0x10, 0x52, 0xa2, 0x7f, 0xbe, 0xf9, 0x88, 0xb6, 0x02,
+ 0xbf, 0x08, 0x23, 0xa9, 0x0c, 0x63, 0x17, 0x2a, 0xae, 0xf5, 0xf7, 0xb7, 0x21, 0x83, 0x92,
+ 0x31, 0x23, 0x0d, 0x20, 0xc3, 0xc2, 0x05, 0x21, 0x62, 0x8e, 0x45, 0xe8, 0x14, 0xc1, 0xda,
+ 0x75, 0xb8, 0xf8, 0x92, 0x01, 0xd0, 0x5d, 0x18, 0x9f, 0x99, 0x11, 0x19, 0xf5, 0x35, 0xe8,
+ 0x7f, 0x20, 0x88, 0x8c, 0x05, 0x75, 0xf5, 0xd7, 0x40, 0x17, 0xbb, 0x1e, 0x36, 0x52, 0xd9,
+ 0xa4, 0x9c, 0xc2, 0x9d, 0x42, 0x81, 0xd8, 0xc7, 0x8a, 0xe7, 0x4c, 0x81, 0xe0, 0xb7, 0x57,
+ 0xed, 0x48, 0x8b, 0xf0, 0x97, 0x15, 0x61, 0xd9, 0x2c, 0x7c, 0x45, 0xaf, 0xc2, 0xcd, 0xfc,
+ 0xaa, 0x13, 0xad, 0x59, 0xcc, 0xb2, 0xb2, 0x6e, 0xdd, 0x63, 0x9c, 0x32, 0x0f, 0xec, 0x83,
+ 0xbe, 0x78, 0xac, 0x91, 0x44, 0x1a, 0x1f, 0xea, 0xfd, 0x5d, 0x8e, 0xb4, 0xc0, 0x84, 0xd4,
+ 0xac, 0xb4, 0x87, 0x5f, 0xac, 0xef, 0xdf, 0xcd, 0x12, 0x56, 0xc8, 0xcd, 0xfe, 0xc5, 0xda,
+ 0xd3, 0xc1, 0x69, 0xf3, 0x61, 0x05, 0xea, 0x25, 0xe2, 0x12, 0x05, 0x8f, 0x39, 0x08, 0x08,
+ 0x7c, 0x37, 0xb6, 0x7e, 0x5b, 0xd8, 0xb1, 0x0e, 0xf2, 0xdb, 0x4b, 0xf1, 0xad, 0x90, 0x01,
+ 0x57, 0xcd, 0xa0, 0xb4, 0x52, 0xe8, 0xf3, 0xd7, 0x8a, 0xbd, 0x4f, 0x9f, 0x21, 0x40, 0x72,
+ 0xa4, 0xfc, 0x0b, 0x01, 0x2b, 0x2f, 0xb6, 0x4c, 0x95, 0x2d, 0x35, 0x33, 0x41, 0x6b, 0xa0,
+ 0x93, 0xe7, 0x2c, 0xf2, 0xd3, 0x72, 0x8b, 0xf4, 0x4f, 0x15, 0x3c, 0xaf, 0xd6, 0x12, 0xde,
+ 0x3f, 0x83, 0x3f, 0xff, 0xf8, 0x7f, 0xf6, 0xcc, 0xa6, 0x7f, 0xc9, 0x9a, 0x6e, 0x1f, 0xc1,
+ 0x0c, 0xfb, 0xee, 0x9c, 0xe7, 0xaf, 0xc9, 0x26, 0x54, 0xef, 0xb0, 0x39, 0xef, 0xb2, 0xe9,
+ 0x23, 0xc4, 0xef, 0xd1, 0xa1, 0xa4, 0x25, 0x24, 0x6f, 0x8d, 0x6a, 0xe5, 0x8a, 0x32, 0x3a,
+ 0xaf, 0xfc, 0xda, 0xce, 0x18, 0x25, 0x42, 0x07, 0x4d, 0x45, 0x8b, 0xdf, 0x85, 0xcf, 0x55,
+ 0xb2, 0x24, 0xfe, 0x9c, 0x69, 0x74, 0xa7, 0x6e, 0xa0, 0xce, 0xc0, 0x39, 0xf4, 0x86, 0xc6,
+ 0x8d, 0xae, 0xb9, 0x48, 0x64, 0x13, 0x0b, 0x40, 0x81, 0xa2, 0xc9, 0xa8, 0x85, 0x51, 0xee,
+ 0x9f, 0xcf, 0xa2, 0x8c, 0x19, 0x52, 0x48, 0xe2, 0xc1, 0xa8, 0x58, 0xb4, 0x10, 0x24, 0x06,
+ 0x58, 0x51, 0xfc, 0xb9, 0x12, 0xec, 0xfd, 0x73, 0xb4, 0x6d, 0x84, 0xfa, 0x06, 0x8b, 0x05,
+ 0x0b, 0x2d, 0xd6, 0xd6, 0x1f, 0x29, 0x82, 0x9f, 0x19, 0x12, 0x1e, 0xb2, 0x04, 0x8f, 0x7f,
+ 0x4d, 0xbd, 0x30, 0x2e, 0xe3, 0xe0, 0x88, 0x29, 0xc5, 0x93, 0xd6, 0x6c, 0x1f, 0x29, 0x45,
+ 0x91, 0xa7, 0x58, 0xcd, 0x05, 0x17, 0xd6, 0x6d, 0xb3, 0xca, 0x66, 0xcc, 0x3c, 0x4a, 0x74,
+ 0xfd, 0x08, 0x10, 0xa6, 0x99, 0x92, 0x10, 0xd2, 0x85, 0xab, 0x6e, 0x1d, 0x0e, 0x8b, 0x26,
+ 0x46, 0xd1, 0x6c, 0x84, 0xc0, 0x26, 0x43, 0x59, 0x68, 0xf0, 0x13, 0x1d, 0xfb, 0xe3, 0xd1,
+ 0xd2, 0xb4, 0x71, 0x9e, 0xf2, 0x59, 0x6a, 0x33, 0x29, 0x79, 0xd2, 0xd7, 0x26, 0xf1, 0xae,
+ 0x78, 0x9e, 0x1f, 0x0f, 0x3f, 0xe3, 0xe8, 0xd0, 0x27, 0x78, 0x77, 0xf6, 0xac, 0x9c, 0x56,
+ 0x39, 0x73, 0x8a, 0x6b, 0x2f, 0x34, 0x78, 0xb1, 0x11, 0xdb, 0xa4, 0x5c, 0x80, 0x01, 0x71,
+ 0x6a, 0xc2, 0xd1, 0x2e, 0x5e, 0x76, 0x28, 0x70, 0x93, 0xae, 0x3e, 0x78, 0xb0, 0x1f, 0x0f,
+ 0xda, 0xbf, 0xfb, 0x8a, 0x67, 0x65, 0x4f, 0x91, 0xed, 0x49, 0x75, 0x78, 0x62, 0xa2, 0x93,
+ 0xb5, 0x70, 0x7f, 0x4d, 0x08, 0x4e, 0x79, 0x61, 0xa8, 0x5f, 0x7f, 0xb4, 0x65, 0x9f, 0x91,
+ 0x54, 0x3a, 0xe8, 0x50, 0x33, 0xd3, 0xd5, 0x8a, 0x7c, 0xf3, 0x9e, 0x8b, 0x77, 0x7b, 0xc6,
+ 0xc6, 0x0c, 0x45, 0x95, 0x1f, 0xb0, 0xd0, 0x0b, 0x27, 0x4a, 0xfd, 0xc7, 0xf7, 0x0d, 0x5a,
+ 0x43, 0xc9, 0x7d, 0x35, 0xb0, 0x7d, 0xc4, 0x9c, 0x57, 0x1e, 0x76, 0x0d, 0xf1, 0x95, 0x30,
+ 0x71, 0xcc, 0xb3, 0x66, 0x3b, 0x63, 0xa8, 0x6c, 0xa3, 0x43, 0xa0, 0x24, 0xcc, 0xb7, 0x53,
+ 0xfe, 0xfe, 0xbc, 0x6e, 0x60, 0x89, 0xaf, 0x16, 0x21, 0xc8, 0x91, 0x6a, 0x89, 0xce, 0x80,
+ 0x2c, 0xf1, 0x59, 0xce, 0xc3, 0x60, 0x61, 0x3b, 0x0b, 0x19, 0xfe, 0x99, 0xac, 0x65, 0x90,
+ 0x15, 0x12, 0x05, 0xac, 0x7e, 0xff, 0x98, 0x7b, 0x66, 0x64, 0x0e, 0x4b, 0x5b, 0xaa, 0x8d,
+ 0x3b, 0xd2, 0x56, 0xcf, 0x99, 0x39, 0xee, 0x22, 0x81, 0xd0, 0x60, 0x06, 0x66, 0x20, 0x81,
+ 0x48, 0x3c, 0x6f, 0x3a, 0x77, 0xba, 0xcb, 0x52, 0xac, 0x79, 0x56, 0xaf, 0xe9, 0x16, 0x17,
+ 0x0a, 0xa3, 0x82, 0x08, 0xd5, 0x3c, 0x97, 0xcb, 0x09, 0xff, 0x7f, 0xf9, 0x4f, 0x60, 0x05,
+ 0xb9, 0x53, 0x26, 0xaa, 0xb8, 0x50, 0xaa, 0x19, 0x25, 0xae, 0x5f, 0xea, 0x8a, 0xd0, 0x89,
+ 0x12, 0x80, 0x43, 0x50, 0x24, 0x12, 0x21, 0x14, 0xcd, 0x77, 0xeb, 0x21, 0xcc, 0x5c, 0x09,
+ 0x64, 0xf3, 0xc7, 0xcb, 0xc5, 0x4b, 0xc3, 0xe7, 0xed, 0xe7, 0x86, 0x2c, 0x1d, 0x8e, 0x19,
+ 0x52, 0x9b, 0x2a, 0x0c, 0x18, 0x72, 0x0b, 0x1e, 0x1b, 0xb0, 0x0f, 0x42, 0x99, 0x04, 0xae,
+ 0xd5, 0xb7, 0x89, 0x1a, 0xb9, 0x4f, 0xd6, 0xaf, 0xf3, 0xc9, 0x93, 0x6f, 0xb0, 0x60, 0x83,
+ 0x6e, 0x6b, 0xd1, 0x5f, 0x3f, 0x1a, 0x83, 0x1e, 0x24, 0x00, 0x87, 0xb5, 0x3e, 0xdb, 0xf9,
+ 0x4d, 0xa7, 0x16, 0x2e, 0x19, 0x5b, 0x8f, 0x1b, 0x0d, 0x47, 0x72, 0x42, 0xe9, 0x0a, 0x11,
+ 0x08, 0x2d, 0x88, 0x1c, 0xbc, 0xc7, 0xb4, 0xbe, 0x29, 0x4d, 0x03, 0x5e, 0xec, 0xdf, 0xf3,
+ 0x3d, 0x2f, 0xe8, 0x1d, 0x9a, 0xd2, 0xd1, 0xab, 0x41, 0x3d, 0x87, 0x11, 0x45, 0xb0, 0x0d,
+ 0x46, 0xf5, 0xe8, 0x95, 0x62, 0x1c, 0x68, 0xf7, 0xa6, 0x5b, 0x39, 0x4e, 0xbf, 0x47, 0xba,
+ 0x5d, 0x7f, 0xb7, 0x6a, 0xf4, 0xba, 0x1d, 0x69, 0xf6, 0xa4, 0xe7, 0xe4, 0x6b, 0x3b, 0x0d,
+ 0x23, 0x16, 0x4a, 0xb2, 0x68, 0xf0, 0xb2, 0x0d, 0x09, 0x17, 0x6a, 0x63, 0x8c, 0x83, 0xd3,
+ 0xbd, 0x05, 0xc9, 0xf6, 0xf0, 0xa1, 0x31, 0x0b, 0x2c, 0xac, 0x83, 0xac, 0x80, 0x34, 0x32,
+ 0xb4, 0xec, 0xd0, 0xbc, 0x54, 0x82, 0x9a, 0xc8, 0xf6, 0xa0, 0x7d, 0xc6, 0x79, 0x73, 0xf4,
+ 0x20, 0x99, 0xf3, 0xb4, 0x01, 0xde, 0x91, 0x27, 0xf2, 0xc0, 0xdc, 0x81, 0x00, 0x4e, 0x7e,
+ 0x07, 0x99, 0xc8, 0x3a, 0x51, 0xbc, 0x38, 0xd6, 0x8a, 0xa2, 0xde, 0x3b, 0x6a, 0x8c, 0x1a,
+ 0x7c, 0x81, 0x0f, 0x3a, 0x1f, 0xe4, 0x05, 0x7b, 0x20, 0x35, 0x6b, 0xa5, 0x6a, 0xa7, 0xe7,
+ 0xbc, 0x9c, 0x20, 0xec, 0x00, 0x15, 0xe2, 0x51, 0xaf, 0x77, 0xeb, 0x29, 0x3c, 0x7d, 0x2e,
+ 0x00, 0x5c, 0x81, 0x21, 0xfa, 0x35, 0x6f, 0x40, 0xef, 0xfb, 0xd1, 0x3f, 0xcc, 0x9d, 0x55,
+ 0x53, 0xfb, 0x5a, 0xa5, 0x56, 0x89, 0x0b, 0x52, 0xeb, 0x57, 0x73, 0x4f, 0x1b, 0x67, 0x24,
+ 0xcb, 0xb8, 0x6a, 0x10, 0x69, 0xd6, 0xfb, 0x52, 0x40, 0xff, 0x20, 0xa5, 0xf3, 0x72, 0xe1,
+ 0x3d, 0xa4, 0x8c, 0x81, 0x66, 0x16, 0x0d, 0x5d, 0xad, 0xa8, 0x50, 0x25, 0x78, 0x31, 0x77,
+ 0x0c, 0x57, 0xe4, 0xe9, 0x15, 0x2d, 0xdb, 0x07, 0x87, 0xc8, 0xb0, 0x43, 0xde, 0xfc, 0xfe,
+ 0xa9, 0xeb, 0xf5, 0xb0, 0xd3, 0x7b, 0xe9, 0x1f, 0x6e, 0xca, 0xe4, 0x03, 0x95, 0xc5, 0xd1,
+ 0x59, 0x72, 0x63, 0xf0, 0x86, 0x54, 0xe8, 0x16, 0x62, 0x0b, 0x35, 0x29, 0xc2, 0x68, 0xd0,
+ 0xd6, 0x3e, 0x90, 0x60, 0x57, 0x1d, 0xc9, 0xed, 0x3f, 0xed, 0xb0, 0x2f, 0x7e, 0x97, 0x02,
+ 0x51, 0xec, 0xee, 0x6f, 0x82, 0x74, 0x76, 0x7f, 0xfb, 0xd6, 0xc4, 0xc3, 0xdd, 0xe8, 0xb1,
+ 0x60, 0xfc, 0xc6, 0xb9, 0x0d, 0x6a, 0x33, 0x78, 0xc6, 0xc1, 0xbf, 0x86, 0x2c, 0x50, 0xcc,
+ 0x9a, 0x70, 0x8e, 0x7b, 0xec, 0xab, 0x95, 0xac, 0x53, 0xa0, 0x4b, 0x07, 0x88, 0xaf, 0x42,
+ 0xed, 0x19, 0x8d, 0xf6, 0x32, 0x17, 0x48, 0x47, 0x1d, 0x41, 0x6f, 0xfe, 0x2e, 0xa7, 0x8f,
+ 0x4b, 0xa0, 0x51, 0xf3, 0xbf, 0x02, 0x0a, 0x48, 0x58, 0xf7, 0xa1, 0x6d, 0xea, 0xa5, 0x13,
+ 0x5a, 0x5b, 0xea, 0x0c, 0x9e, 0x52, 0x4f, 0x9e, 0xb9, 0x71, 0x7f, 0x23, 0x83, 0xda, 0x1b,
+ 0x86, 0x9a, 0x41, 0x29, 0xda, 0x70, 0xe7, 0x64, 0xa1, 0x7b, 0xd5, 0x0a, 0x22, 0x0d, 0x5c,
+ 0x40, 0xc4, 0x81, 0x07, 0x25, 0x35, 0x4a, 0x1c, 0x10, 0xdb, 0x45, 0x0a, 0xff, 0x36, 0xd4,
+ 0xe0, 0xeb, 0x5f, 0x68, 0xd6, 0x67, 0xc6, 0xd0, 0x8b, 0x76, 0x1a, 0x7d, 0x59, 0x42, 0xa1,
+ 0xcb, 0x96, 0x4d, 0x84, 0x09, 0x9a, 0x3d, 0xe0, 0x52, 0x85, 0x6e, 0x48, 0x90, 0x85, 0x2a,
+ 0x63, 0xb2, 0x69, 0xd2, 0x00, 0x43, 0x31, 0x37, 0xb3, 0x52, 0xaf, 0x62, 0xfa, 0xc1, 0xe0,
+ 0x03, 0xfb, 0x62, 0xaa, 0x88, 0xc9, 0xb2, 0x2c, 0xd5, 0xa8, 0xf5, 0xa5, 0x4c, 0x12, 0x59,
+ 0x4e, 0x06, 0x5e, 0x9b, 0x15, 0x66, 0x11, 0xb2, 0x27, 0x92, 0xdc, 0x98, 0x59, 0xde, 0xdf,
+ 0xfa, 0x9a, 0x32, 0x2e, 0xc0, 0x5d, 0x3c, 0x33, 0x41, 0x6d, 0xaf, 0xb2, 0x25, 0x23, 0x14,
+ 0xa5, 0x7b, 0xc7, 0x9b, 0x68, 0xf3, 0xda, 0xeb, 0xe3, 0xa9, 0xe2, 0x6f, 0x0e, 0x1d, 0x1c,
+ 0xba, 0x55, 0xb6, 0x34, 0x6a, 0x93, 0x1f, 0x1f, 0xb8, 0x34, 0xc8, 0x84, 0x08, 0xb1, 0x6b,
+ 0x6a, 0x28, 0x74, 0x74, 0xe5, 0xeb, 0x75, 0xe9, 0x7c, 0xd8, 0xba, 0xd8, 0x42, 0xa5, 0xee,
+ 0x1f, 0x80, 0xd9, 0x96, 0xb2, 0x2e, 0xe7, 0xbf, 0xba, 0xeb, 0xd1, 0x69, 0xbb, 0x8f, 0xfd,
+ 0x5a, 0x63, 0x8f, 0x39, 0x7f, 0xdf, 0x1d, 0x37, 0xd2, 0x18, 0x35, 0x9d, 0xb6, 0xcc, 0xe4,
+ 0x27, 0x81, 0x89, 0x38, 0x38, 0x68, 0x33, 0xe7, 0x78, 0xd8, 0x76, 0xf5, 0xee, 0xd0, 0x4a,
+ 0x07, 0x69, 0x19, 0x7a, 0xad, 0x18, 0xb1, 0x94, 0x61, 0x45, 0x53, 0xa2, 0x48, 0xda, 0x96,
+ 0x4a, 0xf9, 0xee, 0x94, 0x2a, 0x1f, 0x6e, 0x18, 0x3c, 0x92, 0x46, 0xd1, 0x1a, 0x28, 0x18,
+ 0x32, 0x1f, 0x3a, 0x45, 0xbe, 0x04, 0x35, 0x92, 0xe5, 0xa3, 0xcb, 0xb5, 0x2e, 0x32, 0x43,
+ 0xac, 0x65, 0x17, 0x89, 0x99, 0x15, 0x03, 0x9e, 0xb1, 0x23, 0x2f, 0xed, 0x76, 0x4d, 0xd8,
+ 0xac, 0x21, 0x40, 0xc4, 0x99, 0x4e, 0x65, 0x71, 0x2c, 0xb3, 0x45, 0xab, 0xfb, 0xe7, 0x72,
+ 0x39, 0x56, 0x30, 0x6d, 0xfb, 0x74, 0xeb, 0x99, 0xf3, 0xcd, 0x57, 0x5c, 0x78, 0x75, 0xe9,
+ 0x8d, 0xc3, 0xa2, 0xfb, 0x5d, 0xe0, 0x90, 0xc5, 0x55, 0xad, 0x91, 0x53, 0x4e, 0x9e, 0xbd,
+ 0x8c, 0x49, 0xa4, 0xa4, 0x69, 0x10, 0x0c, 0xc5, 0x76, 0xe9, 0x25, 0x86, 0x8d, 0x66, 0x23,
+ 0xa8, 0xdb, 0x5c, 0xe8, 0xd9, 0x30, 0xe1, 0x15, 0x7b, 0xc0, 0x99, 0x0f, 0x03, 0xec, 0xaa,
+ 0x12, 0xef, 0xce, 0xd4, 0xea, 0x55, 0x5c, 0x08, 0x86, 0xf4, 0xf4, 0xb0, 0x83, 0x42, 0x95,
+ 0x37, 0xb6, 0x38, 0xe0, 0x2b, 0x54, 0x89, 0xbd, 0x4e, 0x20, 0x9d, 0x3f, 0xc3, 0x4b, 0xb7,
+ 0xec, 0xfa, 0x5a, 0x14, 0x03, 0xcb, 0x64, 0xc8, 0x34, 0x4a, 0x4b, 0x6e, 0xf8, 0x6e, 0x56,
+ 0xf6, 0xdd, 0x5f, 0xa1, 0x24, 0xe2, 0xd4, 0xd0, 0x82, 0x64, 0x1f, 0x8e, 0x9b, 0xfa, 0xb4,
+ 0xcb, 0xdb, 0x0a, 0xe8, 0x15, 0xfc, 0x15, 0xab, 0x4b, 0x18, 0xbf, 0xd4, 0x42, 0x14, 0x48,
+ 0x82, 0x85, 0xdd, 0xeb, 0x49, 0x1b, 0x0b, 0x0b, 0x05, 0xe9, 0xb4, 0xa1, 0x33, 0x0a, 0x5d,
+ 0x0e, 0x6c, 0x4b, 0xc0, 0xd6, 0x6c, 0x7c, 0xfb, 0x69, 0x0b, 0x53, 0x19, 0xe4, 0xf3, 0x35,
+ 0xfc, 0xbe, 0xa1, 0x34, 0x02, 0x09, 0x4f, 0x74, 0x86, 0x92, 0xcd, 0x5d, 0x1a, 0xc1, 0x27,
+ 0x0c, 0xf2, 0xc5, 0xcf, 0xdd, 0x23, 0x93, 0x02, 0xbd, 0x41, 0x5e, 0x42, 0xf0, 0xa0, 0x9d,
+ 0x0c, 0x72, 0xc8, 0xec, 0x32, 0x0a, 0x8a, 0xfd, 0x3d, 0x5a, 0x41, 0x27, 0x0c, 0x88, 0x59,
+ 0xad, 0x94, 0x2e, 0xef, 0x5d, 0x8f, 0xc7, 0xdf, 0x66, 0xe4, 0xdd, 0x56, 0x6c, 0x7b, 0xca,
+ 0x55, 0x81, 0xae, 0xae, 0x5c, 0x1b, 0x1a, 0xab, 0xae, 0x99, 0x8d, 0xcc, 0x42, 0x97, 0x59,
+ 0xf4, 0x14, 0x3f, 0x75, 0xc6, 0xd1, 0x88, 0xba, 0xaa, 0x84, 0x4a, 0xd0, 0x34, 0x08, 0x3b,
+ 0x7d, 0xdb, 0x15, 0x06, 0xb0, 0x5c, 0xbd, 0x40, 0xf5, 0xa8, 0xec, 0xae, 0x36, 0x40, 0xdd,
+ 0x90, 0x1c, 0x3e, 0x0d, 0x7e, 0x73, 0xc7, 0xc2, 0xc5, 0x6a, 0xff, 0x52, 0x05, 0x7f, 0xbe,
+ 0xd0, 0x92, 0xfd, 0xb3, 0x6f, 0xff, 0x5d, 0xb7, 0x97, 0x64, 0x73, 0x7b, 0xca, 0xd1, 0x98,
+ 0x24, 0x6b, 0x0b, 0x01, 0x68, 0xdd, 0x27, 0x85, 0x85, 0xb5, 0x83, 0xc1, 0xe0, 0x50, 0x64,
+ 0xc7, 0xaf, 0xf1, 0xc6, 0x4d, 0xb1, 0xef, 0xc9, 0xb4, 0x0a, 0x6d, 0x65, 0xf3, 0x47, 0xcc,
+ 0xa3, 0x02, 0x21, 0x0c, 0xbe, 0x22, 0x29, 0x05, 0xcf, 0x5f, 0xe8, 0x94, 0x6c, 0xe5, 0xdc,
+ 0xc4, 0xdf, 0xbe, 0x3e, 0xa8, 0xb4, 0x18, 0xb0, 0x99, 0xb8, 0x6f, 0xff, 0x5d, 0xb9, 0xfd,
+ 0x3b, 0x5d, 0x16, 0xbf, 0x3e, 0xd8, 0xb3, 0xd8, 0x08, 0x34, 0xf6, 0x47, 0x35, 0x5b, 0x72,
+ 0x1a, 0x33, 0xad, 0x52, 0x5d, 0xb8, 0xd0, 0x77, 0xc6, 0xab, 0xba, 0x55, 0x09, 0x5f, 0x02,
+ 0xf8, 0xd4, 0x5f, 0x53, 0x06, 0x91, 0xcd, 0x74, 0x42, 0xae, 0x54, 0x91, 0x81, 0x62, 0x13,
+ 0x6f, 0xd8, 0xa9, 0x77, 0xc3, 0x6c, 0xcb, 0xf1, 0x29, 0x5a, 0xcc, 0xda, 0x35, 0xbd, 0x52,
+ 0x23, 0xbe, 0x59, 0xeb, 0x12, 0x6d, 0xb7, 0x53, 0xee, 0xfc, 0xb4, 0x1b, 0x13, 0x5e, 0xba,
+ 0x16, 0x7c, 0xc5, 0xf3, 0xe3, 0x6d, 0x07, 0x78, 0xf5, 0x2b, 0x21, 0x05, 0x88, 0x4c, 0xc0,
+ 0xa1, 0xe3, 0x36, 0x10, 0xf8, 0x1b, 0xd8, 0x17, 0xfb, 0x6a, 0x4e, 0xd8, 0xb3, 0x47, 0x2d,
+ 0x99, 0xbd, 0xbb, 0x5d, 0x37, 0x7d, 0xba, 0xf1, 0xe1, 0x7c, 0xc0, 0xc5, 0x54, 0x62, 0x7f,
+ 0xcf, 0x5a, 0x4a, 0x93, 0xcc, 0xf1, 0x1b, 0x34, 0xc8, 0xa6, 0x05, 0x4c, 0x55, 0x8b, 0x54,
+ 0x84, 0xd5, 0x77, 0xeb, 0xc0, 0x6d, 0x3a, 0x29, 0xbd, 0x75, 0x61, 0x09, 0x9a, 0x2c, 0xbb,
+ 0xf7, 0x18, 0x79, 0x34, 0x90, 0x24, 0xa5, 0x81, 0x70, 0x87, 0xc5, 0x02, 0x7c, 0xba, 0xd4,
+ 0x5e, 0x14, 0x8e, 0xe4, 0xed, 0xa2, 0x61, 0x6a, 0xb9, 0x6e, 0xb5, 0x4a, 0xb9, 0x01, 0x46,
+ 0xf4, 0xcf, 0xbc, 0x09, 0x2f, 0x27, 0x4b, 0xbd, 0x86, 0x7a, 0x10, 0xe1, 0xd4, 0xc8, 0xd9,
+ 0x20, 0x8d, 0x8a, 0x63, 0x00, 0x63, 0x44, 0xeb, 0x54, 0x0b, 0x75, 0x49, 0x10, 0xa2, 0xa7,
+ 0xad, 0xb9, 0xd1, 0x01, 0x80, 0x63, 0x25, 0xc8, 0x12, 0xa6, 0xce, 0x1e, 0xbe, 0xfe, 0x7e,
+ 0x5f, 0x3c, 0xdb, 0x34, 0xea, 0x37, 0xec, 0x3b, 0xd5, 0x28, 0xd2, 0x07, 0x8c, 0x9a, 0xb6,
+ 0xee, 0x5e, 0x3e, 0xdf, 0x1d, 0x99, 0xb0, 0xe2, 0x46, 0xef, 0x5c, 0x1b, 0xb4, 0xea, 0x56,
+ 0x2e, 0xde, 0x1f, 0x9d, 0xb8, 0xd3, 0x24, 0xab, 0xd4, 0x2a, 0xd6, 0x2e, 0xde, 0x1f, 0x9d,
+ 0xb8, 0xf2, 0x66, 0x2f, 0xbd, 0xf8, 0x72, 0x66, 0x4e, 0x1e, 0x9f, 0x9d, 0xb8, 0xf2, 0x47,
+ 0x0c, 0x9a, 0xb6, 0xee, 0x3f, 0xfc, 0x7a, 0x57, 0x0d, 0x79, 0x70, 0x62, 0x27, 0xad, 0xb9,
+ 0xd1, 0x01, 0x61, 0x40, 0x02, 0x67, 0x2d, 0xd8, 0x32, 0xe6, 0x2f, 0xdc, 0x3a, 0xd7, 0x2c,
+ 0xbb, 0xf4, 0x4b, 0xf5, 0x49, 0xf1, 0x60, 0x23, 0xc4, 0x0a, 0x77, 0x4d, 0xf9, 0x51, 0x01,
+ 0x80, 0x63, 0x25, 0xa9, 0xb1, 0xe0, 0x42, 0xe7, 0x4c, 0x1a, 0x97, 0xac, 0xbb, 0xf4, 0x6a,
+ 0x37, 0xcd, 0x18, 0xb2, 0xe6, 0x2f, 0xdc, 0x1b, 0x95, 0xa8, 0xd2, 0x07, 0x6d, 0x58, 0x32,
+ 0xe6, 0x4e, 0x1e, 0x9f, 0xbc, 0xfa, 0x57, 0x0d, 0x79, 0x51, 0x20, 0xc2, 0x06, 0x6f, 0x5c,
+ 0x1b, 0x95, 0xa8, 0xb3, 0xc5, 0xe9, 0x31, 0xe0, 0x23, 0xc4, 0x0a, 0x77, 0x4d, 0x18, 0x93,
+ 0x85, 0x69, 0x31, 0xc1, 0xe1, 0x21, 0xc0, 0xe3, 0x44, 0x0a, 0x77, 0x6c, 0x5a, 0x17, 0x8d,
+ 0x98, 0x93, 0xa4, 0xab, 0xd4, 0x2a, 0xb7, 0xec, 0x5a, 0x17, 0xac, 0xbb, 0xf4, 0x4b, 0x14,
+ 0xaa, 0xb7, 0xec, 0x3b, 0xd5, 0x28, 0xb3, 0xc5, 0xe9, 0x31, 0xc1, 0x00, 0x82, 0x67, 0x4c,
+ 0xfb, 0x55, 0x28, 0xd2, 0x26, 0xaf, 0xbd, 0xd9, 0x11, 0x81, 0x61, 0x21, 0xa1, 0xa1, 0xc0,
+ 0x02, 0x86, 0x6f, 0x5c, 0x1b, 0xb4, 0xcb, 0x14, 0x8b, 0x94, 0xaa, 0xd6, 0x2e, 0xbf, 0xdd,
+ 0x19, 0xb0, 0xe2, 0x46, 0x0e, 0x7f, 0x7c, 0x5b, 0x15, 0x89, 0x90, 0x83, 0x84, 0x6b, 0x54,
+ 0x0b, 0x75, 0x68, 0x52, 0x07, 0x6d, 0x58, 0x32, 0xc7, 0xed, 0x58, 0x32, 0xc7, 0xed, 0x58,
+ 0x32, 0xe6, 0x4e, 0xff, 0x7c, 0x7a, 0x76, 0x6e, 0x3f, 0xdd, 0x38, 0xd3, 0x05, 0x88, 0x92,
+ 0xa6, 0xaf, 0xdc, 0x1b, 0xb4, 0xcb, 0xf5, 0x68, 0x52, 0x07, 0x8c, 0x7b, 0x55, 0x09, 0x90,
+ 0x83, 0x84, 0x6b, 0x54, 0x2a, 0xb7, 0xec, 0x3b, 0xd5, 0x09, 0x90, 0xa2, 0xc6, 0x0e, 0x7f,
+ 0x7c, 0x7a, 0x57, 0x0d, 0x98, 0xb2, 0xc7, 0xed, 0x58, 0x32, 0xc7, 0x0c, 0x7b, 0x74, 0x4b,
+ 0x14, 0x8b, 0x94, 0xaa, 0xb7, 0xcd, 0x18, 0x93, 0xa4, 0xca, 0x16, 0xae, 0xbf, 0xdd, 0x19,
+ 0xb0, 0xe2, 0x46, 0x0e, 0x7f, 0x5d, 0x19, 0x91, 0x81, 0x80, 0x63, 0x44, 0xeb, 0x35, 0xc9,
+ 0x10, 0x83, 0x65, 0x48, 0x12, 0xa6, 0xce, 0x1e, 0x9f, 0xbc, 0xdb, 0x15, 0x89, 0x71, 0x60,
+ 0x23, 0xc4, 0xeb, 0x54, 0x2a, 0xb7, 0xec, 0x5a, 0x36, 0xcf, 0x81, 0x10, 0xac, 0x74
+};
// clang-format off
diff --git a/keyboards/40percentclub/ut47/keymaps/default/keymap.c b/keyboards/40percentclub/ut47/keymaps/default/keymap.c
index 0fa7838dfd..4eb2c190c1 100644
--- a/keyboards/40percentclub/ut47/keymaps/default/keymap.c
+++ b/keyboards/40percentclub/ut47/keymaps/default/keymap.c
@@ -15,7 +15,7 @@
*/
#include QMK_KEYBOARD_H
#ifdef LED_ENABLE
- #include "protocol/serial.h"
+ #include "uart.h"
#endif
#define LT3_TAB LT(3, KC_TAB)
@@ -108,11 +108,11 @@ LAYOUT( /* Tab */
//LED keymap functions
#ifdef LED_ENABLE
void led_chmode(void) {
- serial_send(101);
+ uart_write(0x65);
}
void led_toggle(void) {
- serial_send(100);
+ uart_write(0x64);
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
diff --git a/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c b/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c
index 0c1c2e7599..8a0ba7b391 100644
--- a/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c
+++ b/keyboards/40percentclub/ut47/keymaps/non-us/keymap.c
@@ -15,7 +15,7 @@
*/
#include QMK_KEYBOARD_H
#ifdef LED_ENABLE
- #include "protocol/serial.h"
+ #include "uart.h"
#endif
#define LT3_TAB LT(3, KC_TAB)
@@ -108,11 +108,11 @@ LAYOUT( /* Tab */
//LED keymap functions
#ifdef LED_ENABLE
void led_chmode(void) {
- serial_send(101);
+ uart_write(0x65);
}
void led_toggle(void) {
- serial_send(100);
+ uart_write(0x64);
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
diff --git a/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c b/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c
index 52372e2857..5e79cdb9a4 100644
--- a/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c
+++ b/keyboards/40percentclub/ut47/keymaps/nordic/keymap.c
@@ -15,7 +15,7 @@
*/
#include QMK_KEYBOARD_H
#ifdef LED_ENABLE
- #include "protocol/serial.h"
+ #include "uart.h"
#endif
@@ -151,11 +151,11 @@ LAYOUT( /* GAMING, toggled on and off - L5 */
//LED keymap functions
#ifdef LED_ENABLE
void led_chmode(void) {
- serial_send(101);
+ uart_write(0x65);
}
void led_toggle(void) {
- serial_send(100);
+ uart_write(0x64);
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
diff --git a/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c b/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c
index ae8ad3e378..75dba3a2d4 100644
--- a/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c
+++ b/keyboards/40percentclub/ut47/keymaps/rgb/keymap.c
@@ -15,7 +15,7 @@
*/
#include QMK_KEYBOARD_H
#ifdef LED_ENABLE
- #include "protocol/serial.h"
+ #include "uart.h"
#endif
#define LT3_TAB LT(3, KC_TAB)
@@ -60,11 +60,11 @@ LAYOUT( /* Tab */
//LED keymap functions
#ifdef LED_ENABLE
void led_chmode(void) {
- serial_send(101);
+ uart_write(0x65);
}
void led_toggle(void) {
- serial_send(100);
+ uart_write(0x64);
}
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
diff --git a/keyboards/40percentclub/ut47/matrix.c b/keyboards/40percentclub/ut47/matrix.c
index e47c7f8e13..89537592c5 100644
--- a/keyboards/40percentclub/ut47/matrix.c
+++ b/keyboards/40percentclub/ut47/matrix.c
@@ -26,10 +26,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "debug.h"
#include "util.h"
#include "matrix.h"
-#ifdef LED_ENABLE
- #include "protocol/serial.h"
-#endif
-
#ifndef DEBOUNCE
# define DEBOUNCE 5
@@ -69,10 +65,6 @@ void matrix_init(void)
matrix[i] = 0;
matrix_debouncing[i] = 0;
}
-
-#ifdef LED_ENABLE
- serial_init();
-#endif
}
uint8_t matrix_scan(void)
@@ -104,12 +96,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/40percentclub/ut47/rules.mk b/keyboards/40percentclub/ut47/rules.mk
index 29cee474ff..6c9805e0fc 100644
--- a/keyboards/40percentclub/ut47/rules.mk
+++ b/keyboards/40percentclub/ut47/rules.mk
@@ -18,4 +18,5 @@ AUDIO_ENABLE = no # Audio output
# custom matrix setup
CUSTOM_MATRIX = yes
-SRC += matrix.c protocol/serial_uart.c
+SRC += matrix.c
+QUANTUM_LIB_SRC += uart.c
diff --git a/keyboards/40percentclub/ut47/ut47.c b/keyboards/40percentclub/ut47/ut47.c
index 9054335e5a..864edaeb57 100644
--- a/keyboards/40percentclub/ut47/ut47.c
+++ b/keyboards/40percentclub/ut47/ut47.c
@@ -15,7 +15,11 @@
*/
#include "ut47.h"
#ifdef LED_ENABLE
- #include "protocol/serial.h"
+ #include "uart.h"
+
+void matrix_init_kb() {
+ uart_init(9600);
+}
#endif
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
@@ -23,7 +27,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
// runs for every action, just before processing by the firmware
if (record->event.pressed) {
#ifdef LED_ENABLE
- serial_send((record->event.key.row*16)+record->event.key.col);
+ uart_write((record->event.key.row*16)+record->event.key.col);
#endif
}
return process_record_user(keycode, record);
diff --git a/keyboards/7skb/7skb.h b/keyboards/7skb/7skb.h
deleted file mode 100644
index 9e23d0ad3c..0000000000
--- a/keyboards/7skb/7skb.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#pragma once
-
-#include "quantum.h"
-
-#ifdef KEYBOARD_7skb_rev1
- #include "rev1.h"
-#endif
diff --git a/keyboards/7skb/readme.md b/keyboards/7skb/readme.md
deleted file mode 100644
index 18e4eef3ea..0000000000
--- a/keyboards/7skb/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# 7skb
-
-![7skb](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20191124/20191124025208.png)
-
-This is 63 keys Custom keyboard.
-
-* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
-* Hardware Supported: 7skb PCB, Pro Micro
-* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1673395)
-
-Make example for this keyboard (after setting up your build environment):
-
- make 7skb:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://salicylic-acid3.hatenablog.com/entry/7skb-mx-build-guide)
diff --git a/keyboards/7skb/rules.mk b/keyboards/7skb/rules.mk
deleted file mode 100644
index ea7399dc75..0000000000
--- a/keyboards/7skb/rules.mk
+++ /dev/null
@@ -1,22 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = caterina
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-AUDIO_ENABLE = no # Audio output
-RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
-
-SPLIT_KEYBOARD = yes
-
-DEFAULT_FOLDER = 7skb/rev1
diff --git a/keyboards/7splus/readme.md b/keyboards/7splus/readme.md
deleted file mode 100644
index a733595249..0000000000
--- a/keyboards/7splus/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# 7sPlus
-
-![7splus](https://s2.booth.pm/1d33594d-0c5f-4f93-baf5-2e89e0d99afc/i/2425503/044ca31d-6715-475c-b8c4-1dfdeb57b682_base_resized.jpg)
-
-This is 85 keys Custom keyboard.
-
-* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
-* Hardware Supported: 7sPlus PCB, Pro Micro
-* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/2425503)
-
-Make example for this keyboard (after setting up your build environment):
-
- make 7splus:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://salicylic-acid3.hatenablog.com/entry/7splus-build-guide)
diff --git a/keyboards/ai03/orbit/config.h b/keyboards/ai03/orbit/config.h
index 9ad384c8ff..0e4f4c3baf 100644
--- a/keyboards/ai03/orbit/config.h
+++ b/keyboards/ai03/orbit/config.h
@@ -44,13 +44,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_COL_PINS { C7, B4, D7, D6, D4, F1, F0 }
#define MATRIX_ROW_PINS_RIGHT { B6, B5, B4, D7, E6 }
#define MATRIX_COL_PINS_RIGHT { D4, D6, F1, F0, F4, F5, C6 }
-
-#define SPLIT_HAND_PIN D5
-
-//#define USE_I2C
-
-#define SELECT_SOFT_SERIAL_SPEED 1
-
#define UNUSED_PINS
/* COL2ROW, ROW2COL */
@@ -60,6 +53,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
* Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
*/
#define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6
+#define SELECT_SOFT_SERIAL_SPEED 1
+
+#define SPLIT_LED_STATE_ENABLE
+#define SPLIT_LAYER_STATE_ENABLE
+
+#define SPLIT_HAND_PIN D5
#define BACKLIGHT_PIN B7
// #define BACKLIGHT_BREATHING
diff --git a/keyboards/ai03/orbit/keymaps/default/keymap.c b/keyboards/ai03/orbit/keymaps/default/keymap.c
index fa383d7c00..c9696ccde6 100644
--- a/keyboards/ai03/orbit/keymaps/default/keymap.c
+++ b/keyboards/ai03/orbit/keymaps/default/keymap.c
@@ -48,25 +48,13 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case MANUAL:
- if (record->event.pressed)
- {
- // Keypress
+ if (record->event.pressed) {
SEND_STRING("https://kb.ai03.me/redir/orbit");
- }
- else
- {
- // Key release
}
break;
case DBLZERO:
- if (record->event.pressed)
- {
- // Keypress
+ if (record->event.pressed) {
SEND_STRING("00");
- }
- else
- {
- // Key release
}
break;
}
diff --git a/keyboards/ai03/orbit/matrix.c b/keyboards/ai03/orbit/matrix.c
deleted file mode 100644
index b8e3296686..0000000000
--- a/keyboards/ai03/orbit/matrix.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
-Copyright 2012 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * scan matrix
- */
-#include <stdint.h>
-#include <stdbool.h>
-#include "wait.h"
-#include "util.h"
-#include "matrix.h"
-#include "split_util.h"
-#include "config.h"
-#include "split_flags.h"
-#include "quantum.h"
-#include "debounce.h"
-#include "transport.h"
-
-#if (MATRIX_COLS <= 8)
-# define print_matrix_header() print("\nr/c 01234567\n")
-# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop(matrix[i])
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop16(matrix[i])
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop32(matrix[i])
-# define ROW_SHIFTER ((uint32_t)1)
-#endif
-
-#define ERROR_DISCONNECT_COUNT 5
-
-//#define ROWS_PER_HAND (MATRIX_ROWS / 2)
-
-#ifdef DIRECT_PINS
-static pin_t direct_pins[MATRIX_ROWS][MATRIX_COLS] = DIRECT_PINS;
-#else
-static pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
-static pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
-#endif
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-static matrix_row_t raw_matrix[ROWS_PER_HAND];
-
-// row offsets for each hand
-uint8_t thisHand, thatHand;
-
-// user-defined overridable functions
-
-__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) {}
-
-// helper functions
-
-inline uint8_t matrix_rows(void) { return MATRIX_ROWS; }
-
-inline uint8_t matrix_cols(void) { return MATRIX_COLS; }
-
-bool matrix_is_modified(void) {
- if (debounce_active()) 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_matrix_header();
-
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row);
- print(": ");
- print_matrix_row(row);
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void) {
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += matrix_bitpop(i);
- }
- return count;
-}
-
-// matrix code
-
-#ifdef DIRECT_PINS
-
-static void init_pins(void) {
- for (int row = 0; row < MATRIX_ROWS; row++) {
- for (int col = 0; col < MATRIX_COLS; col++) {
- pin_t pin = direct_pins[row][col];
- if (pin != NO_PIN) {
- setPinInputHigh(pin);
- }
- }
- }
-}
-
-static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) {
- matrix_row_t last_row_value = current_matrix[current_row];
- current_matrix[current_row] = 0;
-
- for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
- pin_t pin = direct_pins[current_row][col_index];
- if (pin != NO_PIN) {
- current_matrix[current_row] |= readPin(pin) ? 0 : (ROW_SHIFTER << col_index);
- }
- }
-
- return (last_row_value != current_matrix[current_row]);
-}
-
-#elif (DIODE_DIRECTION == COL2ROW)
-
-static void select_row(uint8_t row) {
- setPinOutput(row_pins[row]);
- writePinLow(row_pins[row]);
-}
-
-static void unselect_row(uint8_t row) { setPinInputHigh(row_pins[row]); }
-
-static void unselect_rows(void) {
- for (uint8_t x = 0; x < ROWS_PER_HAND; x++) {
- setPinInputHigh(row_pins[x]);
- }
-}
-
-static void init_pins(void) {
- unselect_rows();
- for (uint8_t x = 0; x < MATRIX_COLS; x++) {
- setPinInputHigh(col_pins[x]);
- }
-}
-
-static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) {
- // Store last value of row prior to reading
- matrix_row_t last_row_value = current_matrix[current_row];
-
- // Clear data in matrix row
- current_matrix[current_row] = 0;
-
- // Select row and wait for row selecton to stabilize
- select_row(current_row);
- wait_us(30);
-
- // For each col...
- for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
- // Populate the matrix row with the state of the col pin
- current_matrix[current_row] |= readPin(col_pins[col_index]) ? 0 : (ROW_SHIFTER << col_index);
- }
-
- // Unselect row
- unselect_row(current_row);
-
- return (last_row_value != current_matrix[current_row]);
-}
-
-#elif (DIODE_DIRECTION == ROW2COL)
-
-static void select_col(uint8_t col) {
- setPinOutput(col_pins[col]);
- writePinLow(col_pins[col]);
-}
-
-static void unselect_col(uint8_t col) { setPinInputHigh(col_pins[col]); }
-
-static void unselect_cols(void) {
- for (uint8_t x = 0; x < MATRIX_COLS; x++) {
- setPinInputHigh(col_pins[x]);
- }
-}
-
-static void init_pins(void) {
- unselect_cols();
- for (uint8_t x = 0; x < ROWS_PER_HAND; x++) {
- setPinInputHigh(row_pins[x]);
- }
-}
-
-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 (readPin(row_pins[row_index])) {
- // Pin HI, clear col bit
- current_matrix[row_index] &= ~(ROW_SHIFTER << current_col);
- } else {
- // Pin LO, set 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;
-}
-
-#endif
-
-void matrix_init(void) {
- debug_enable = true;
- debug_matrix = true;
- debug_mouse = true;
-
- // Set pinout for right half if pinout for that half is defined
- if (!isLeftHand) {
-#ifdef MATRIX_ROW_PINS_RIGHT
- const uint8_t row_pins_right[MATRIX_ROWS] = MATRIX_ROW_PINS_RIGHT;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- row_pins[i] = row_pins_right[i];
- }
-#endif
-#ifdef MATRIX_COL_PINS_RIGHT
- const uint8_t col_pins_right[MATRIX_COLS] = MATRIX_COL_PINS_RIGHT;
- for (uint8_t i = 0; i < MATRIX_COLS; i++) {
- col_pins[i] = col_pins_right[i];
- }
-#endif
- }
-
- thisHand = isLeftHand ? 0 : (ROWS_PER_HAND);
- thatHand = ROWS_PER_HAND - thisHand;
-
- // initialize key pins
- init_pins();
-
- // initialize matrix state: all keys off
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- matrix[i] = 0;
- }
-
- debounce_init(ROWS_PER_HAND);
-
- matrix_init_quantum();
-}
-
-uint8_t _matrix_scan(void) {
- bool changed = false;
-
-#if defined(DIRECT_PINS) || (DIODE_DIRECTION == COL2ROW)
- // Set row, read cols
- for (uint8_t current_row = 0; current_row < ROWS_PER_HAND; current_row++) {
- changed |= read_cols_on_row(raw_matrix, current_row);
- }
-#elif (DIODE_DIRECTION == ROW2COL)
- // Set col, read rows
- for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
- changed |= read_rows_on_col(raw_matrix, current_col);
- }
-#endif
-
- debounce(raw_matrix, matrix + thisHand, ROWS_PER_HAND, changed);
-
- return 1;
-}
-
-uint8_t matrix_scan(void) {
- uint8_t ret = _matrix_scan();
-
- if (is_keyboard_master()) {
- static uint8_t error_count;
-
- if (!transport_master(matrix + thatHand)) {
- error_count++;
-
- if (error_count > ERROR_DISCONNECT_COUNT) {
- // reset other half if disconnected
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- matrix[thatHand + i] = 0;
- }
- }
- } else {
- error_count = 0;
- }
-
- matrix_scan_quantum();
- } else {
- transport_slave(matrix + thisHand);
- matrix_slave_scan_user();
- }
-
- return ret;
-}
diff --git a/keyboards/ai03/orbit/orbit.c b/keyboards/ai03/orbit/orbit.c
index 97553e318a..5097f9cd90 100644
--- a/keyboards/ai03/orbit/orbit.c
+++ b/keyboards/ai03/orbit/orbit.c
@@ -15,196 +15,124 @@
*/
#include "orbit.h"
#include "split_util.h"
-#include "transport.h"
+void led_init_ports(void) {
+ // Initialize indicator LEDs to output
+ if (isLeftHand) {
+ setPinOutput(C6);
+ setPinOutput(B6);
+ setPinOutput(B5);
+ } else {
+ setPinOutput(F6);
+ setPinOutput(F7);
+ setPinOutput(C7);
+ }
+
+ set_layer_indicators(0);
+}
// Call led_toggle to set LEDs easily
// LED IDs:
-//
+//
// (LEFT) 0 1 2 | 3 4 5 (RIGHT)
-
-void led_toggle(int id, bool on) {
-
- if (isLeftHand) {
- switch(id) {
- case 0:
- // Left hand C6
- if (on)
- //PORTC |= (1<<6);
- writePinHigh(C6);
- else
- //PORTC &= ~(1<<6);
- writePinLow(C6);
- break;
- case 1:
- // Left hand B6
- if (on)
- //PORTB |= (1<<6);
- writePinHigh(B6);
- else
- //PORTB &= ~(1<<6);
- writePinLow(B6);
- break;
- case 2:
- // Left hand B5
- if (on)
- //PORTB |= (1<<5);
- writePinHigh(B5);
- else
- //PORTB &= ~(1<<5);
- writePinLow(B5);
- break;
- default:
- break;
- }
- } else {
- switch(id) {
- case 3:
- // Right hand F6
- if (on)
- //PORTF |= (1<<6);
- writePinHigh(F6);
- else
- //PORTF &= ~(1<<6);
- writePinLow(F6);
- break;
- case 4:
- // Right hand F7
- if (on)
- //PORTF |= (1<<7);
- writePinHigh(F7);
- else
- //PORTF &= ~(1<<7);
- writePinLow(F7);
- break;
- case 5:
- // Right hand C7
- if (on)
- //PORTC |= (1<<7);
- writePinHigh(C7);
- else
- //PORTC &= ~(1<<7);
- writePinLow(C7);
- break;
- default:
- break;
- }
- }
+void led_toggle(uint8_t id, bool on) {
+ if (isLeftHand) {
+ switch (id) {
+ case 0:
+ // Left hand C6
+ writePin(C6, on);
+ break;
+ case 1:
+ // Left hand B6
+ writePin(B6, on);
+ break;
+ case 2:
+ // Left hand B5
+ writePin(B5, on);
+ break;
+ default:
+ break;
+ }
+ } else {
+ switch (id) {
+ case 3:
+ // Right hand F6
+ writePin(F6, on);
+ break;
+ case 4:
+ // Right hand F7
+ writePin(F7, on);
+ break;
+ case 5:
+ // Right hand C7
+ writePin(C7, on);
+ break;
+ default:
+ break;
+ }
+ }
}
// Set all LEDs at once using an array of 6 booleans
// LED IDs:
-//
+//
// (LEFT) 0 1 2 | 3 4 5 (RIGHT)
-//
+//
// Ex. set_all_leds({ false, false, false, true, true, true }) would turn off left hand, turn on right hand
void set_all_leds(bool leds[6]) {
- for (int i = 0; i < 6; i++) {
- led_toggle(i, leds[i]);
- }
+ for (int i = 0; i < 6; i++) {
+ led_toggle(i, leds[i]);
+ }
}
void set_layer_indicators(uint8_t layer) {
-
- switch (layer)
- {
- case 0:
- led_toggle(0, true);
- led_toggle(1, false);
- led_toggle(2, false);
- break;
- case 1:
- led_toggle(0, true);
- led_toggle(1, true);
- led_toggle(2, false);
- break;
- case 2:
- led_toggle(0, true);
- led_toggle(1, true);
- led_toggle(2, true);
- break;
- case 3:
- led_toggle(0, false);
- led_toggle(1, true);
- led_toggle(2, true);
- break;
- case 4:
- led_toggle(0, false);
- led_toggle(1, false);
- led_toggle(2, true);
- break;
- default:
- led_toggle(0, true);
- led_toggle(1, false);
- led_toggle(2, true);
- break;
- }
-
+ switch (layer) {
+ case 0:
+ led_toggle(0, true);
+ led_toggle(1, false);
+ led_toggle(2, false);
+ break;
+ case 1:
+ led_toggle(0, true);
+ led_toggle(1, true);
+ led_toggle(2, false);
+ break;
+ case 2:
+ led_toggle(0, true);
+ led_toggle(1, true);
+ led_toggle(2, true);
+ break;
+ case 3:
+ led_toggle(0, false);
+ led_toggle(1, true);
+ led_toggle(2, true);
+ break;
+ case 4:
+ led_toggle(0, false);
+ led_toggle(1, false);
+ led_toggle(2, true);
+ break;
+ default:
+ led_toggle(0, true);
+ led_toggle(1, false);
+ led_toggle(2, true);
+ break;
+ }
}
-void matrix_init_kb(void) {
- // put your keyboard start-up code here
- // runs once when the firmware starts up
-
- // Initialize indicator LEDs to output
- if (isLeftHand)
- {
- setPinOutput(C6);
- setPinOutput(B6);
- setPinOutput(B5);
- //DDRC |= (1<<6);
- //DDRB |= (1<<6);
- //DDRB |= (1<<5);
- }
- else
- {
- setPinOutput(F6);
- setPinOutput(F7);
- setPinOutput(C7);
- //DDRF |= (1<<6);
- //DDRF |= (1<<7);
- //DDRC |= (1<<7);
- }
-
- set_layer_indicators(0);
-
- matrix_init_user();
+bool led_update_kb(led_t led_state) {
+ bool res = led_update_user(led_state);
+ if (res) {
+ led_toggle(3, led_state.num_lock);
+ led_toggle(4, led_state.caps_lock);
+ led_toggle(5, led_state.scroll_lock);
+ }
+ return res;
}
-void led_set_kb(uint8_t usb_led) {
- // put your keyboard LED indicator (ex: Caps Lock LED) toggling code here
-
- if (is_keyboard_master()) {
-
- serial_m2s_buffer.nlock_led = IS_LED_ON(usb_led, USB_LED_NUM_LOCK);
- serial_m2s_buffer.clock_led = IS_LED_ON(usb_led, USB_LED_CAPS_LOCK);
- serial_m2s_buffer.slock_led = IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK);
-
- led_toggle(3, IS_LED_ON(usb_led, USB_LED_NUM_LOCK));
- led_toggle(4, IS_LED_ON(usb_led, USB_LED_CAPS_LOCK));
- led_toggle(5, IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK));
-
- }
-
- led_set_user(usb_led);
-}
+layer_state_t layer_state_set_kb(layer_state_t state) {
+ set_layer_indicators(get_highest_layer(state));
-uint32_t layer_state_set_kb(uint32_t state) {
-
- if (is_keyboard_master())
- {
- serial_m2s_buffer.current_layer = biton32(state);
-
- // If left half, do the LED toggle thing
- if (isLeftHand)
- {
- set_layer_indicators(biton32(state));
- }
-
- }
- // NOTE: Do not set slave LEDs here.
- // This is not called on slave
-
- return layer_state_set_user(state);
+ return layer_state_set_user(state);
}
diff --git a/keyboards/ai03/orbit/orbit.h b/keyboards/ai03/orbit/orbit.h
index 39f1ebb0e3..7f3b1aca32 100644
--- a/keyboards/ai03/orbit/orbit.h
+++ b/keyboards/ai03/orbit/orbit.h
@@ -18,6 +18,8 @@
#include "quantum.h"
+#define XXX KC_NO
+
/* This a shortcut to help you visually see your layout.
*
* The first section contains all of the arguments representing the physical
@@ -26,17 +28,6 @@
* The second converts the arguments into a two-dimensional array which
* represents the switch matrix.
*/
-
-#ifdef USE_I2C
-#include <stddef.h>
-#ifdef __AVR__
- #include <avr/io.h>
- #include <avr/interrupt.h>
-#endif
-#endif
-
-#define XXX KC_NO
-
#define LAYOUT( \
L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \
L10, L11, L12, L13, L14, L15, L16, R10, R11, R12, R13, R14, R15, R16, \
@@ -56,6 +47,6 @@
{ R40, R41, R42, R43, R44, R45, XXX } \
}
-extern void led_toggle(int id, bool on);
+void led_toggle(uint8_t id, bool on);
void set_all_leds(bool leds[6]);
-extern void set_layer_indicators(uint8_t layer);
+void set_layer_indicators(uint8_t layer);
diff --git a/keyboards/ai03/orbit/readme.md b/keyboards/ai03/orbit/readme.md
index 58ba2079d5..0c320929b6 100644
--- a/keyboards/ai03/orbit/readme.md
+++ b/keyboards/ai03/orbit/readme.md
@@ -4,9 +4,9 @@
A split ergonomic keyboard project.
-Keyboard Maintainer: [ai03](https://github.com/ai03-2725)
-Hardware Supported: The [Orbit PCB](https://github.com/ai03-2725/Orbit)
-Hardware Availability: [This repository](https://github.com/ai03-2725/Orbit) has PCB files. Case group buy orders are currently closed.
+* Keyboard Maintainer: [ai03](https://github.com/ai03-2725)
+* Hardware Supported: The [Orbit PCB](https://github.com/ai03-2725/Orbit)
+* Hardware Availability: [This repository](https://github.com/ai03-2725/Orbit) has PCB files. Case group buy orders are currently closed.
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/ai03/orbit/rules.mk b/keyboards/ai03/orbit/rules.mk
index f98e2382f1..a0f1ab94a9 100644
--- a/keyboards/ai03/orbit/rules.mk
+++ b/keyboards/ai03/orbit/rules.mk
@@ -16,12 +16,4 @@ NKRO_ENABLE = yes # Enable N-Key Rollover
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
-USE_I2C = no # I2C for split communication
-CUSTOM_MATRIX = yes # For providing custom matrix.c (in this case, override regular matrix.c with split matrix.c)
-# SPLIT_KEYBOARD = yes # Split keyboard flag disabled as manual edits had to be done to the split common files
-
-SRC += split_util.c \
- split_flags.c \
- serial.c \
- transport.c \
- matrix.c
+SPLIT_KEYBOARD = yes # Split keyboard flag disabled as manual edits had to be done to the split common files
diff --git a/keyboards/ai03/orbit/serial.c b/keyboards/ai03/orbit/serial.c
deleted file mode 100644
index 636dfa0906..0000000000
--- a/keyboards/ai03/orbit/serial.c
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- * WARNING: be careful changing this code, it is very timing dependent
- *
- * 2018-10-28 checked
- * avr-gcc 4.9.2
- * avr-gcc 5.4.0
- * avr-gcc 7.3.0
- */
-
-#ifndef F_CPU
-#define F_CPU 16000000
-#endif
-
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-#include <stddef.h>
-#include <stdbool.h>
-#include "serial.h"
-
-#ifdef SOFT_SERIAL_PIN
-
-#ifdef __AVR_ATmega32U4__
- // if using ATmega32U4 I2C, can not use PD0 and PD1 in soft serial.
- #ifdef USE_AVR_I2C
- #if SOFT_SERIAL_PIN == D0 || SOFT_SERIAL_PIN == D1
- #error Using ATmega32U4 I2C, so can not use PD0, PD1
- #endif
- #endif
-
- #if SOFT_SERIAL_PIN >= D0 && SOFT_SERIAL_PIN <= D3
- #define SERIAL_PIN_DDR DDRD
- #define SERIAL_PIN_PORT PORTD
- #define SERIAL_PIN_INPUT PIND
- #if SOFT_SERIAL_PIN == D0
- #define SERIAL_PIN_MASK _BV(PD0)
- #define EIMSK_BIT _BV(INT0)
- #define EICRx_BIT (~(_BV(ISC00) | _BV(ISC01)))
- #define SERIAL_PIN_INTERRUPT INT0_vect
- #elif SOFT_SERIAL_PIN == D1
- #define SERIAL_PIN_MASK _BV(PD1)
- #define EIMSK_BIT _BV(INT1)
- #define EICRx_BIT (~(_BV(ISC10) | _BV(ISC11)))
- #define SERIAL_PIN_INTERRUPT INT1_vect
- #elif SOFT_SERIAL_PIN == D2
- #define SERIAL_PIN_MASK _BV(PD2)
- #define EIMSK_BIT _BV(INT2)
- #define EICRx_BIT (~(_BV(ISC20) | _BV(ISC21)))
- #define SERIAL_PIN_INTERRUPT INT2_vect
- #elif SOFT_SERIAL_PIN == D3
- #define SERIAL_PIN_MASK _BV(PD3)
- #define EIMSK_BIT _BV(INT3)
- #define EICRx_BIT (~(_BV(ISC30) | _BV(ISC31)))
- #define SERIAL_PIN_INTERRUPT INT3_vect
- #endif
- #elif SOFT_SERIAL_PIN == E6
- #define SERIAL_PIN_DDR DDRE
- #define SERIAL_PIN_PORT PORTE
- #define SERIAL_PIN_INPUT PINE
- #define SERIAL_PIN_MASK _BV(PE6)
- #define EIMSK_BIT _BV(INT6)
- #define EICRx_BIT (~(_BV(ISC60) | _BV(ISC61)))
- #define SERIAL_PIN_INTERRUPT INT6_vect
- #else
- #error invalid SOFT_SERIAL_PIN value
- #endif
-
-#else
- #error serial.c now support ATmega32U4 only
-#endif
-
-#define ALWAYS_INLINE __attribute__((always_inline))
-#define NO_INLINE __attribute__((noinline))
-#define _delay_sub_us(x) __builtin_avr_delay_cycles(x)
-
-// parity check
-#define ODD_PARITY 1
-#define EVEN_PARITY 0
-#define PARITY EVEN_PARITY
-
-#ifdef SERIAL_DELAY
- // custom setup in config.h
- // #define TID_SEND_ADJUST 2
- // #define SERIAL_DELAY 6 // micro sec
- // #define READ_WRITE_START_ADJUST 30 // cycles
- // #define READ_WRITE_WIDTH_ADJUST 8 // cycles
-#else
-// ============ Standard setups ============
-
-#ifndef SELECT_SOFT_SERIAL_SPEED
-#define SELECT_SOFT_SERIAL_SPEED 1
-// 0: about 189kbps (Experimental only)
-// 1: about 137kbps (default)
-// 2: about 75kbps
-// 3: about 39kbps
-// 4: about 26kbps
-// 5: about 20kbps
-#endif
-
-#if __GNUC__ < 6
- #define TID_SEND_ADJUST 14
-#else
- #define TID_SEND_ADJUST 2
-#endif
-
-#if SELECT_SOFT_SERIAL_SPEED == 0
- // Very High speed
- #define SERIAL_DELAY 4 // micro sec
- #if __GNUC__ < 6
- #define READ_WRITE_START_ADJUST 33 // cycles
- #define READ_WRITE_WIDTH_ADJUST 3 // cycles
- #else
- #define READ_WRITE_START_ADJUST 34 // cycles
- #define READ_WRITE_WIDTH_ADJUST 7 // cycles
- #endif
-#elif SELECT_SOFT_SERIAL_SPEED == 1
- // High speed
- #define SERIAL_DELAY 6 // micro sec
- #if __GNUC__ < 6
- #define READ_WRITE_START_ADJUST 30 // cycles
- #define READ_WRITE_WIDTH_ADJUST 3 // cycles
- #else
- #define READ_WRITE_START_ADJUST 33 // cycles
- #define READ_WRITE_WIDTH_ADJUST 7 // cycles
- #endif
-#elif SELECT_SOFT_SERIAL_SPEED == 2
- // Middle speed
- #define SERIAL_DELAY 12 // micro sec
- #define READ_WRITE_START_ADJUST 30 // cycles
- #if __GNUC__ < 6
- #define READ_WRITE_WIDTH_ADJUST 3 // cycles
- #else
- #define READ_WRITE_WIDTH_ADJUST 7 // cycles
- #endif
-#elif SELECT_SOFT_SERIAL_SPEED == 3
- // Low speed
- #define SERIAL_DELAY 24 // micro sec
- #define READ_WRITE_START_ADJUST 30 // cycles
- #if __GNUC__ < 6
- #define READ_WRITE_WIDTH_ADJUST 3 // cycles
- #else
- #define READ_WRITE_WIDTH_ADJUST 7 // cycles
- #endif
-#elif SELECT_SOFT_SERIAL_SPEED == 4
- // Very Low speed
- #define SERIAL_DELAY 36 // micro sec
- #define READ_WRITE_START_ADJUST 30 // cycles
- #if __GNUC__ < 6
- #define READ_WRITE_WIDTH_ADJUST 3 // cycles
- #else
- #define READ_WRITE_WIDTH_ADJUST 7 // cycles
- #endif
-#elif SELECT_SOFT_SERIAL_SPEED == 5
- // Ultra Low speed
- #define SERIAL_DELAY 48 // micro sec
- #define READ_WRITE_START_ADJUST 30 // cycles
- #if __GNUC__ < 6
- #define READ_WRITE_WIDTH_ADJUST 3 // cycles
- #else
- #define READ_WRITE_WIDTH_ADJUST 7 // cycles
- #endif
-#else
-#error invalid SELECT_SOFT_SERIAL_SPEED value
-#endif /* SELECT_SOFT_SERIAL_SPEED */
-#endif /* SERIAL_DELAY */
-
-#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2)
-#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2)
-
-#define SLAVE_INT_WIDTH_US 1
-#ifndef SERIAL_USE_MULTI_TRANSACTION
- #define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY
-#else
- #define SLAVE_INT_ACK_WIDTH_UNIT 2
- #define SLAVE_INT_ACK_WIDTH 4
-#endif
-
-static SSTD_t *Transaction_table = NULL;
-static uint8_t Transaction_table_size = 0;
-
-inline static void serial_delay(void) ALWAYS_INLINE;
-inline static
-void serial_delay(void) {
- _delay_us(SERIAL_DELAY);
-}
-
-inline static void serial_delay_half1(void) ALWAYS_INLINE;
-inline static
-void serial_delay_half1(void) {
- _delay_us(SERIAL_DELAY_HALF1);
-}
-
-inline static void serial_delay_half2(void) ALWAYS_INLINE;
-inline static
-void serial_delay_half2(void) {
- _delay_us(SERIAL_DELAY_HALF2);
-}
-
-inline static void serial_output(void) ALWAYS_INLINE;
-inline static
-void serial_output(void) {
- SERIAL_PIN_DDR |= SERIAL_PIN_MASK;
-}
-
-// make the serial pin an input with pull-up resistor
-inline static void serial_input_with_pullup(void) ALWAYS_INLINE;
-inline static
-void serial_input_with_pullup(void) {
- SERIAL_PIN_DDR &= ~SERIAL_PIN_MASK;
- SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
-}
-
-inline static uint8_t serial_read_pin(void) ALWAYS_INLINE;
-inline static
-uint8_t serial_read_pin(void) {
- return !!(SERIAL_PIN_INPUT & SERIAL_PIN_MASK);
-}
-
-inline static void serial_low(void) ALWAYS_INLINE;
-inline static
-void serial_low(void) {
- SERIAL_PIN_PORT &= ~SERIAL_PIN_MASK;
-}
-
-inline static void serial_high(void) ALWAYS_INLINE;
-inline static
-void serial_high(void) {
- SERIAL_PIN_PORT |= SERIAL_PIN_MASK;
-}
-
-void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size)
-{
- Transaction_table = sstd_table;
- Transaction_table_size = (uint8_t)sstd_table_size;
- serial_output();
- serial_high();
-}
-
-void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size)
-{
- Transaction_table = sstd_table;
- Transaction_table_size = (uint8_t)sstd_table_size;
- serial_input_with_pullup();
-
- // Enable INT0-INT3,INT6
- EIMSK |= EIMSK_BIT;
-#if SERIAL_PIN_MASK == _BV(PE6)
- // Trigger on falling edge of INT6
- EICRB &= EICRx_BIT;
-#else
- // Trigger on falling edge of INT0-INT3
- EICRA &= EICRx_BIT;
-#endif
-}
-
-// Used by the sender to synchronize timing with the reciver.
-static void sync_recv(void) NO_INLINE;
-static
-void sync_recv(void) {
- for (uint8_t i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) {
- }
- // This shouldn't hang if the target disconnects because the
- // serial line will float to high if the target does disconnect.
- while (!serial_read_pin());
-}
-
-// Used by the reciver to send a synchronization signal to the sender.
-static void sync_send(void) NO_INLINE;
-static
-void sync_send(void) {
- serial_low();
- serial_delay();
- serial_high();
-}
-
-// Reads a byte from the serial line
-static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) NO_INLINE;
-static uint8_t serial_read_chunk(uint8_t *pterrcount, uint8_t bit) {
- uint8_t byte, i, p, pb;
-
- _delay_sub_us(READ_WRITE_START_ADJUST);
- for( i = 0, byte = 0, p = PARITY; i < bit; i++ ) {
- serial_delay_half1(); // read the middle of pulses
- if( serial_read_pin() ) {
- byte = (byte << 1) | 1; p ^= 1;
- } else {
- byte = (byte << 1) | 0; p ^= 0;
- }
- _delay_sub_us(READ_WRITE_WIDTH_ADJUST);
- serial_delay_half2();
- }
- /* recive parity bit */
- serial_delay_half1(); // read the middle of pulses
- pb = serial_read_pin();
- _delay_sub_us(READ_WRITE_WIDTH_ADJUST);
- serial_delay_half2();
-
- *pterrcount += (p != pb)? 1 : 0;
-
- return byte;
-}
-
-// Sends a byte with MSB ordering
-void serial_write_chunk(uint8_t data, uint8_t bit) NO_INLINE;
-void serial_write_chunk(uint8_t data, uint8_t bit) {
- uint8_t b, p;
- for( p = PARITY, b = 1<<(bit-1); b ; b >>= 1) {
- if(data & b) {
- serial_high(); p ^= 1;
- } else {
- serial_low(); p ^= 0;
- }
- serial_delay();
- }
- /* send parity bit */
- if(p & 1) { serial_high(); }
- else { serial_low(); }
- serial_delay();
-
- serial_low(); // sync_send() / senc_recv() need raise edge
-}
-
-static void serial_send_packet(uint8_t *buffer, uint8_t size) NO_INLINE;
-static
-void serial_send_packet(uint8_t *buffer, uint8_t size) {
- for (uint8_t i = 0; i < size; ++i) {
- uint8_t data;
- data = buffer[i];
- sync_send();
- serial_write_chunk(data,8);
- }
-}
-
-static uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) NO_INLINE;
-static
-uint8_t serial_recive_packet(uint8_t *buffer, uint8_t size) {
- uint8_t pecount = 0;
- for (uint8_t i = 0; i < size; ++i) {
- uint8_t data;
- sync_recv();
- data = serial_read_chunk(&pecount, 8);
- buffer[i] = data;
- }
- return pecount == 0;
-}
-
-inline static
-void change_sender2reciver(void) {
- sync_send(); //0
- serial_delay_half1(); //1
- serial_low(); //2
- serial_input_with_pullup(); //2
- serial_delay_half1(); //3
-}
-
-inline static
-void change_reciver2sender(void) {
- sync_recv(); //0
- serial_delay(); //1
- serial_low(); //3
- serial_output(); //3
- serial_delay_half1(); //4
-}
-
-static inline uint8_t nibble_bits_count(uint8_t bits)
-{
- bits = (bits & 0x5) + (bits >> 1 & 0x5);
- bits = (bits & 0x3) + (bits >> 2 & 0x3);
- return bits;
-}
-
-// interrupt handle to be used by the target device
-ISR(SERIAL_PIN_INTERRUPT) {
-
-#ifndef SERIAL_USE_MULTI_TRANSACTION
- serial_low();
- serial_output();
- SSTD_t *trans = Transaction_table;
-#else
- // recive transaction table index
- uint8_t tid, bits;
- uint8_t pecount = 0;
- sync_recv();
- bits = serial_read_chunk(&pecount,7);
- tid = bits>>3;
- bits = (bits&7) != nibble_bits_count(tid);
- if( bits || pecount> 0 || tid > Transaction_table_size ) {
- return;
- }
- serial_delay_half1();
-
- serial_high(); // response step1 low->high
- serial_output();
- _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT*SLAVE_INT_ACK_WIDTH);
- SSTD_t *trans = &Transaction_table[tid];
- serial_low(); // response step2 ack high->low
-#endif
-
- // target send phase
- if( trans->target2initiator_buffer_size > 0 )
- serial_send_packet((uint8_t *)trans->target2initiator_buffer,
- trans->target2initiator_buffer_size);
- // target switch to input
- change_sender2reciver();
-
- // target recive phase
- if( trans->initiator2target_buffer_size > 0 ) {
- if (serial_recive_packet((uint8_t *)trans->initiator2target_buffer,
- trans->initiator2target_buffer_size) ) {
- *trans->status = TRANSACTION_ACCEPTED;
- } else {
- *trans->status = TRANSACTION_DATA_ERROR;
- }
- } else {
- *trans->status = TRANSACTION_ACCEPTED;
- }
-
- sync_recv(); //weit initiator output to high
-}
-
-/////////
-// start transaction by initiator
-//
-// int soft_serial_transaction(int sstd_index)
-//
-// Returns:
-// TRANSACTION_END
-// TRANSACTION_NO_RESPONSE
-// TRANSACTION_DATA_ERROR
-// this code is very time dependent, so we need to disable interrupts
-#ifndef SERIAL_USE_MULTI_TRANSACTION
-int soft_serial_transaction(void) {
- SSTD_t *trans = Transaction_table;
-#else
-int soft_serial_transaction(int sstd_index) {
- if( sstd_index > Transaction_table_size )
- return TRANSACTION_TYPE_ERROR;
- SSTD_t *trans = &Transaction_table[sstd_index];
-#endif
- cli();
-
- // signal to the target that we want to start a transaction
- serial_output();
- serial_low();
- _delay_us(SLAVE_INT_WIDTH_US);
-
-#ifndef SERIAL_USE_MULTI_TRANSACTION
- // wait for the target response
- serial_input_with_pullup();
- _delay_us(SLAVE_INT_RESPONSE_TIME);
-
- // check if the target is present
- if (serial_read_pin()) {
- // target failed to pull the line low, assume not present
- serial_output();
- serial_high();
- *trans->status = TRANSACTION_NO_RESPONSE;
- sei();
- return TRANSACTION_NO_RESPONSE;
- }
-
-#else
- // send transaction table index
- int tid = (sstd_index<<3) | (7 & nibble_bits_count(sstd_index));
- sync_send();
- _delay_sub_us(TID_SEND_ADJUST);
- serial_write_chunk(tid, 7);
- serial_delay_half1();
-
- // wait for the target response (step1 low->high)
- serial_input_with_pullup();
- while( !serial_read_pin() ) {
- _delay_sub_us(2);
- }
-
- // check if the target is present (step2 high->low)
- for( int i = 0; serial_read_pin(); i++ ) {
- if (i > SLAVE_INT_ACK_WIDTH + 1) {
- // slave failed to pull the line low, assume not present
- serial_output();
- serial_high();
- *trans->status = TRANSACTION_NO_RESPONSE;
- sei();
- return TRANSACTION_NO_RESPONSE;
- }
- _delay_sub_us(SLAVE_INT_ACK_WIDTH_UNIT);
- }
-#endif
-
- // initiator recive phase
- // if the target is present syncronize with it
- if( trans->target2initiator_buffer_size > 0 ) {
- if (!serial_recive_packet((uint8_t *)trans->target2initiator_buffer,
- trans->target2initiator_buffer_size) ) {
- serial_output();
- serial_high();
- *trans->status = TRANSACTION_DATA_ERROR;
- sei();
- return TRANSACTION_DATA_ERROR;
- }
- }
-
- // initiator switch to output
- change_reciver2sender();
-
- // initiator send phase
- if( trans->initiator2target_buffer_size > 0 ) {
- serial_send_packet((uint8_t *)trans->initiator2target_buffer,
- trans->initiator2target_buffer_size);
- }
-
- // always, release the line when not in use
- sync_send();
-
- *trans->status = TRANSACTION_END;
- sei();
- return TRANSACTION_END;
-}
-
-#ifdef SERIAL_USE_MULTI_TRANSACTION
-int soft_serial_get_and_clean_status(int sstd_index) {
- SSTD_t *trans = &Transaction_table[sstd_index];
- cli();
- int retval = *trans->status;
- *trans->status = 0;;
- sei();
- return retval;
-}
-#endif
-
-#endif
-
-// Helix serial.c history
-// 2018-1-29 fork from let's split and add PD2, modify sync_recv() (#2308, bceffdefc)
-// 2018-6-28 bug fix master to slave comm and speed up (#3255, 1038bbef4)
-// (adjusted with avr-gcc 4.9.2)
-// 2018-7-13 remove USE_SERIAL_PD2 macro (#3374, f30d6dd78)
-// (adjusted with avr-gcc 4.9.2)
-// 2018-8-11 add support multi-type transaction (#3608, feb5e4aae)
-// (adjusted with avr-gcc 4.9.2)
-// 2018-10-21 fix serial and RGB animation conflict (#4191, 4665e4fff)
-// (adjusted with avr-gcc 7.3.0)
-// 2018-10-28 re-adjust compiler depend value of delay (#4269, 8517f8a66)
-// (adjusted with avr-gcc 5.4.0, 7.3.0)
-// 2018-12-17 copy to TOP/quantum/split_common/ and remove backward compatibility code (#4669)
diff --git a/keyboards/ai03/orbit/serial.h b/keyboards/ai03/orbit/serial.h
deleted file mode 100644
index 1c1e640069..0000000000
--- a/keyboards/ai03/orbit/serial.h
+++ /dev/null
@@ -1,62 +0,0 @@
-#pragma once
-
-#include <stdbool.h>
-
-// /////////////////////////////////////////////////////////////////
-// Need Soft Serial defines in config.h
-// /////////////////////////////////////////////////////////////////
-// ex.
-// #define SOFT_SERIAL_PIN ?? // ?? = D0,D1,D2,D3,E6
-// OPTIONAL: #define SELECT_SOFT_SERIAL_SPEED ? // ? = 1,2,3,4,5
-// // 1: about 137kbps (default)
-// // 2: about 75kbps
-// // 3: about 39kbps
-// // 4: about 26kbps
-// // 5: about 20kbps
-//
-// //// USE simple API (using signle-type transaction function)
-// /* nothing */
-// //// USE flexible API (using multi-type transaction function)
-// #define SERIAL_USE_MULTI_TRANSACTION
-//
-// /////////////////////////////////////////////////////////////////
-
-// Soft Serial Transaction Descriptor
-typedef struct _SSTD_t {
- uint8_t *status;
- uint8_t initiator2target_buffer_size;
- uint8_t *initiator2target_buffer;
- uint8_t target2initiator_buffer_size;
- uint8_t *target2initiator_buffer;
-} SSTD_t;
-#define TID_LIMIT( table ) (sizeof(table) / sizeof(SSTD_t))
-
-// initiator is transaction start side
-void soft_serial_initiator_init(SSTD_t *sstd_table, int sstd_table_size);
-// target is interrupt accept side
-void soft_serial_target_init(SSTD_t *sstd_table, int sstd_table_size);
-
-// initiator resullt
-#define TRANSACTION_END 0
-#define TRANSACTION_NO_RESPONSE 0x1
-#define TRANSACTION_DATA_ERROR 0x2
-#define TRANSACTION_TYPE_ERROR 0x4
-#ifndef SERIAL_USE_MULTI_TRANSACTION
-int soft_serial_transaction(void);
-#else
-int soft_serial_transaction(int sstd_index);
-#endif
-
-// target status
-// *SSTD_t.status has
-// initiator:
-// TRANSACTION_END
-// or TRANSACTION_NO_RESPONSE
-// or TRANSACTION_DATA_ERROR
-// target:
-// TRANSACTION_DATA_ERROR
-// or TRANSACTION_ACCEPTED
-#define TRANSACTION_ACCEPTED 0x8
-#ifdef SERIAL_USE_MULTI_TRANSACTION
-int soft_serial_get_and_clean_status(int sstd_index);
-#endif
diff --git a/keyboards/ai03/orbit/split_flags.c b/keyboards/ai03/orbit/split_flags.c
deleted file mode 100644
index 1f5825d650..0000000000
--- a/keyboards/ai03/orbit/split_flags.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#include "split_flags.h"
-
-volatile bool RGB_DIRTY = false;
-
-volatile bool BACKLIT_DIRTY = false; \ No newline at end of file
diff --git a/keyboards/ai03/orbit/split_flags.h b/keyboards/ai03/orbit/split_flags.h
deleted file mode 100644
index aaac474a7d..0000000000
--- a/keyboards/ai03/orbit/split_flags.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#pragma once
-
-#include <stdbool.h>
-#include <stdint.h>
-
-/**
-* Global Flags
-**/
-
-//RGB Stuff
-extern volatile bool RGB_DIRTY;
-
-
-//Backlight Stuff
-extern volatile bool BACKLIT_DIRTY;
diff --git a/keyboards/ai03/orbit/split_util.c b/keyboards/ai03/orbit/split_util.c
deleted file mode 100644
index 2352e5a111..0000000000
--- a/keyboards/ai03/orbit/split_util.c
+++ /dev/null
@@ -1,87 +0,0 @@
-#include "split_util.h"
-#include "matrix.h"
-#include "keyboard.h"
-#include "config.h"
-#include "timer.h"
-#include "split_flags.h"
-#include "transport.h"
-#include "quantum.h"
-
-#ifdef EE_HANDS
-# include "eeprom.h"
-# include "eeconfig.h"
-#endif
-
-volatile bool isLeftHand = true;
-
-__attribute__((weak))
-bool is_keyboard_left(void) {
- #ifdef SPLIT_HAND_PIN
- // Test pin SPLIT_HAND_PIN for High/Low, if low it's right hand
- setPinInput(SPLIT_HAND_PIN);
- return readPin(SPLIT_HAND_PIN);
- #else
- #ifdef EE_HANDS
- return eeprom_read_byte(EECONFIG_HANDEDNESS);
- #else
- #ifdef MASTER_RIGHT
- return !is_keyboard_master();
- #else
- return is_keyboard_master();
- #endif
- #endif
- #endif
-}
-
-bool is_keyboard_master(void)
-{
-#ifdef __AVR__
- static enum { UNKNOWN, MASTER, SLAVE } usbstate = UNKNOWN;
-
- // only check once, as this is called often
- if (usbstate == UNKNOWN)
- {
- USBCON |= (1 << OTGPADE); // enables VBUS pad
- wait_us(5);
-
- usbstate = (USBSTA & (1 << VBUS)) ? MASTER : SLAVE; // checks state of VBUS
- }
-
- return (usbstate == MASTER);
-#else
- return true;
-#endif
-}
-
-static void keyboard_master_setup(void) {
-#if defined(USE_I2C)
- #ifdef SSD1306OLED
- matrix_master_OLED_init ();
- #endif
-#endif
- transport_master_init();
-
- // For master the Backlight info needs to be sent on startup
- // Otherwise the salve won't start with the proper info until an update
- BACKLIT_DIRTY = true;
-}
-
-static void keyboard_slave_setup(void)
-{
- transport_slave_init();
-}
-
-// this code runs before the usb and keyboard is initialized
-void matrix_setup(void)
-{
- isLeftHand = is_keyboard_left();
-
- if (is_keyboard_master())
- {
- keyboard_master_setup();
- }
- else
- {
- keyboard_slave_setup();
- }
-}
diff --git a/keyboards/ai03/orbit/split_util.h b/keyboards/ai03/orbit/split_util.h
deleted file mode 100644
index 20f7535bf4..0000000000
--- a/keyboards/ai03/orbit/split_util.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#pragma once
-
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-extern volatile bool isLeftHand;
-
-void matrix_master_OLED_init (void);
diff --git a/keyboards/ai03/orbit/transport.c b/keyboards/ai03/orbit/transport.c
deleted file mode 100644
index 447fafed14..0000000000
--- a/keyboards/ai03/orbit/transport.c
+++ /dev/null
@@ -1,238 +0,0 @@
-
-#include "transport.h"
-
-#include "config.h"
-#include "matrix.h"
-#include "quantum.h"
-
-#include "orbit.h"
-
-#define ROWS_PER_HAND (MATRIX_ROWS/2)
-
-#ifdef RGBLIGHT_ENABLE
-# include "rgblight.h"
-#endif
-
-#ifdef BACKLIGHT_ENABLE
-# include "backlight.h"
- extern backlight_config_t backlight_config;
-#endif
-
-#if defined(USE_I2C)
-
-#include "i2c.h"
-
-#ifndef SLAVE_I2C_ADDRESS
-# define SLAVE_I2C_ADDRESS 0x32
-#endif
-
-#if (MATRIX_COLS > 8)
-# error "Currently only supports 8 COLS"
-#endif
-
-// Get rows from other half over i2c
-bool transport_master(matrix_row_t matrix[]) {
- int err = 0;
-
- // write backlight info
-#ifdef BACKLIGHT_ENABLE
- if (BACKLIT_DIRTY) {
- err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE);
- if (err) { goto i2c_error; }
-
- // Backlight location
- err = i2c_master_write(I2C_BACKLIT_START);
- if (err) { goto i2c_error; }
-
- // Write backlight
- i2c_master_write(get_backlight_level());
-
- BACKLIT_DIRTY = false;
- }
-#endif
-
- err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE);
- if (err) { goto i2c_error; }
-
- // start of matrix stored at I2C_KEYMAP_START
- err = i2c_master_write(I2C_KEYMAP_START);
- 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[i] = i2c_master_read(I2C_ACK);
- }
- matrix[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 false;
- }
-
-#ifdef RGBLIGHT_ENABLE
- if (RGB_DIRTY) {
- err = i2c_master_start(SLAVE_I2C_ADDRESS + I2C_WRITE);
- if (err) { goto i2c_error; }
-
- // RGB Location
- err = i2c_master_write(I2C_RGB_START);
- if (err) { goto i2c_error; }
-
- uint32_t dword = eeconfig_read_rgblight();
-
- // Write RGB
- err = i2c_master_write_data(&dword, 4);
- if (err) { goto i2c_error; }
-
- RGB_DIRTY = false;
- i2c_master_stop();
- }
-#endif
-
- return true;
-}
-
-void transport_slave(matrix_row_t matrix[]) {
-
- for (int i = 0; i < ROWS_PER_HAND; ++i)
- {
- i2c_slave_buffer[I2C_KEYMAP_START + i] = matrix[i];
- }
- // Read Backlight Info
- #ifdef BACKLIGHT_ENABLE
- if (BACKLIT_DIRTY)
- {
- backlight_set(i2c_slave_buffer[I2C_BACKLIT_START]);
- BACKLIT_DIRTY = false;
- }
- #endif
- #ifdef RGBLIGHT_ENABLE
- if (RGB_DIRTY)
- {
- // Disable interupts (RGB data is big)
- cli();
- // Create new DWORD for RGB data
- uint32_t dword;
-
- // Fill the new DWORD with the data that was sent over
- uint8_t * dword_dat = (uint8_t *)(&dword);
- for (int i = 0; i < 4; i++)
- {
- dword_dat[i] = i2c_slave_buffer[I2C_RGB_START + i];
- }
-
- // Update the RGB now with the new data and set RGB_DIRTY to false
- rgblight_update_dword(dword);
- RGB_DIRTY = false;
- // Re-enable interupts now that RGB is set
- sei();
- }
- #endif
-}
-
-void transport_master_init(void) {
- i2c_master_init();
-}
-
-void transport_slave_init(void) {
- i2c_slave_init(SLAVE_I2C_ADDRESS);
-}
-
-#else // USE_SERIAL
-
-#include "serial.h"
-
-
-
-volatile Serial_s2m_buffer_t serial_s2m_buffer = {};
-volatile Serial_m2s_buffer_t serial_m2s_buffer = {};
-uint8_t volatile status0 = 0;
-
-SSTD_t transactions[] = {
- { (uint8_t *)&status0,
- sizeof(serial_m2s_buffer), (uint8_t *)&serial_m2s_buffer,
- sizeof(serial_s2m_buffer), (uint8_t *)&serial_s2m_buffer
- }
-};
-
-uint8_t slave_layer_cache;
-uint8_t slave_nlock_cache;
-uint8_t slave_clock_cache;
-uint8_t slave_slock_cache;
-
-void transport_master_init(void)
-{ soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); }
-
-void transport_slave_init(void)
-{
- soft_serial_target_init(transactions, TID_LIMIT(transactions));
- slave_layer_cache = 255;
- slave_nlock_cache = 255;
- slave_clock_cache = 255;
- slave_slock_cache = 255;
-}
-
-bool transport_master(matrix_row_t matrix[]) {
-
- if (soft_serial_transaction()) {
- return false;
- }
-
- // TODO: if MATRIX_COLS > 8 change to unpack()
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- matrix[i] = serial_s2m_buffer.smatrix[i];
- }
-
- #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
- // Code to send RGB over serial goes here (not implemented yet)
- #endif
-
- #ifdef BACKLIGHT_ENABLE
- // Write backlight level for slave to read
- serial_m2s_buffer.backlight_level = backlight_config.enable ? backlight_config.level : 0;
- #endif
-
- return true;
-}
-
-void transport_slave(matrix_row_t matrix[]) {
-
- // TODO: if MATRIX_COLS > 8 change to pack()
- for (int i = 0; i < ROWS_PER_HAND; ++i)
- {
- serial_s2m_buffer.smatrix[i] = matrix[i];
- }
- #ifdef BACKLIGHT_ENABLE
- backlight_set(serial_m2s_buffer.backlight_level);
- #endif
- #if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
- // Add serial implementation for RGB here
- #endif
-
- if (slave_layer_cache != serial_m2s_buffer.current_layer) {
- slave_layer_cache = serial_m2s_buffer.current_layer;
- set_layer_indicators(slave_layer_cache);
- }
-
- if (slave_nlock_cache != serial_m2s_buffer.nlock_led) {
- slave_nlock_cache = serial_m2s_buffer.nlock_led;
- led_toggle(3, slave_nlock_cache);
- }
- if (slave_clock_cache != serial_m2s_buffer.clock_led) {
- slave_clock_cache = serial_m2s_buffer.clock_led;
- led_toggle(4, slave_clock_cache);
- }
- if (slave_slock_cache != serial_m2s_buffer.slock_led) {
- slave_slock_cache = serial_m2s_buffer.slock_led;
- led_toggle(5, slave_slock_cache);
- }
-
-}
-
-#endif
diff --git a/keyboards/ai03/orbit/transport.h b/keyboards/ai03/orbit/transport.h
deleted file mode 100644
index 757eae6f5c..0000000000
--- a/keyboards/ai03/orbit/transport.h
+++ /dev/null
@@ -1,42 +0,0 @@
-#pragma once
-
-#include "matrix.h"
-
-#define ROWS_PER_HAND (MATRIX_ROWS/2)
-
-typedef struct _Serial_s2m_buffer_t {
- // TODO: if MATRIX_COLS > 8 change to uint8_t packed_matrix[] for pack/unpack
- matrix_row_t smatrix[ROWS_PER_HAND];
-} Serial_s2m_buffer_t;
-
-typedef struct _Serial_m2s_buffer_t {
-#ifdef BACKLIGHT_ENABLE
- uint8_t backlight_level;
-#endif
-#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
- rgblight_config_t rgblight_config; //not yet use
- //
- // When MCUs on both sides drive their respective RGB LED chains,
- // it is necessary to synchronize, so it is necessary to communicate RGB information.
- // In that case, define the RGBLIGHT_SPLIT macro.
- //
- // Otherwise, if the master side MCU drives both sides RGB LED chains,
- // there is no need to communicate.
-#endif
-
- uint8_t current_layer;
- uint8_t nlock_led;
- uint8_t clock_led;
- uint8_t slock_led;
-
-} Serial_m2s_buffer_t;
-
-extern volatile Serial_s2m_buffer_t serial_s2m_buffer;
-extern volatile Serial_m2s_buffer_t serial_m2s_buffer;
-
-void transport_master_init(void);
-void transport_slave_init(void);
-
-// returns false if valid data not received from slave
-bool transport_master(matrix_row_t matrix[]);
-void transport_slave(matrix_row_t matrix[]);
diff --git a/keyboards/ajisai74/readme.md b/keyboards/ajisai74/readme.md
deleted file mode 100644
index af66ce0fc5..0000000000
--- a/keyboards/ajisai74/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# AJisai74
-
-![ajisai74](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20200812/20200812214740.png)
-
-This is 74 keys Custom keyboard.
-
-* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
-* Hardware Supported: AJisai74 PCB, Pro Micro
-* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/2291877)
-
-Make example for this keyboard (after setting up your build environment):
-
- make ajisai74:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://salicylic-acid3.hatenablog.com/entry/ajisai74-build-guide)
diff --git a/keyboards/allison/readme.md b/keyboards/allison/readme.md
deleted file mode 100644
index 60670cbad8..0000000000
--- a/keyboards/allison/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Allison
-
-![Allison](https://i.imgur.com/tvLtu4K.jpg)
-
-A custom luxurious 60 with F-row and Macro
-
-* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
-* Hardware Supported: ATmega32U4
-* Hardware Availability: Small production run by mrpetrov#9585 and [protoTypist](https://discord.gg/UvskpBB)
-
-Make example for this keyboard (after setting up your build environment):
-
- make allison: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/allison_numpad/readme.md b/keyboards/allison_numpad/readme.md
deleted file mode 100644
index 82992339e1..0000000000
--- a/keyboards/allison_numpad/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Allison Numpad
-
-![Allison Numpad](https://i.imgur.com/tvLtu4K.jpg)
-
-A custom luxurious numpad to match Allison
-
-* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
-* Hardware Supported: ATmega32U4
-* Hardware Availability: Small production run by mrpetrov#9585 and [protoTypist](https://discord.gg/UvskpBB)
-
-Make example for this keyboard (after setting up your build environment):
-
- make allison_numpad: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/amj96/matrix.c b/keyboards/amj96/matrix.c
index 8e7bbaa791..ffd66d120f 100644
--- a/keyboards/amj96/matrix.c
+++ b/keyboards/amj96/matrix.c
@@ -108,12 +108,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/angel17/readme.md b/keyboards/angel17/readme.md
deleted file mode 100644
index 8c9b806685..0000000000
--- a/keyboards/angel17/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# angel17
-
-![angel17](https://i.gyazo.com/30787446262c5818bc60e0ffb34c96ed.jpg)
-
-Keyboard for tablets.
-
-Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
-Hardware Supported: angel17_alpha, promicro
-Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
-
-Make example for this keyboard (after setting up your build environment):
-
- make angel17: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/angel17/rules.mk b/keyboards/angel17/rules.mk
deleted file mode 100644
index 6c73399ec1..0000000000
--- a/keyboards/angel17/rules.mk
+++ /dev/null
@@ -1,22 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = caterina
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-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
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
-AUDIO_ENABLE = no # Audio output
-
-LAYOUTS = numpad_5x4
-
-DEFAULT_FOLDER = angel17/rev1
diff --git a/keyboards/angel64/alpha/matrix.c b/keyboards/angel64/alpha/matrix.c
deleted file mode 100644
index 474fbec030..0000000000
--- a/keyboards/angel64/alpha/matrix.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
-Copyright 2012-2018 Jun Wako, Jack Humbert, Yiancar
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-#include <stdint.h>
-#include <stdbool.h>
-#include "wait.h"
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "debounce.h"
-#include "quantum.h"
-
-#if (MATRIX_COLS <= 8)
-# define print_matrix_header() print("\nr/c 01234567\n")
-# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop(matrix[i])
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop16(matrix[i])
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop32(matrix[i])
-# define ROW_SHIFTER ((uint32_t)1)
-#endif
-
-#ifdef MATRIX_MASKED
- extern const matrix_row_t matrix_mask[];
-#endif
-
-static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
-static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t raw_matrix[MATRIX_ROWS]; //raw values
-static matrix_row_t matrix[MATRIX_ROWS]; //debounced values
-
-__attribute__ ((weak))
-void matrix_init_quantum(void) {
- matrix_init_kb();
-}
-
-__attribute__ ((weak))
-void matrix_scan_quantum(void) {
- matrix_scan_kb();
-}
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void) {
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void) {
- return MATRIX_COLS;
-}
-
-//Deprecated.
-bool matrix_is_modified(void)
-{
- if (debounce_active()) 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)
-{
- // Matrix mask lets you disable switches in the returned matrix data. For example, if you have a
- // switch blocker installed and the switch is always pressed.
-#ifdef MATRIX_MASKED
- return matrix[row] & matrix_mask[row];
-#else
- return matrix[row];
-#endif
-}
-
-void matrix_print(void)
-{
- print_matrix_header();
-
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row); print(": ");
- print_matrix_row(row);
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += matrix_bitpop(i);
- }
- return count;
-}
-
-static void select_row(uint8_t row)
-{
- setPinOutput(row_pins[row]);
- writePinLow(row_pins[row]);
-}
-
-static void unselect_row(uint8_t row)
-{
- setPinInputHigh(row_pins[row]);
-}
-
-static void unselect_rows(void)
-{
- for(uint8_t x = 0; x < MATRIX_ROWS; x++) {
- setPinInputHigh(row_pins[x]);
- }
-}
-
-static void select_col(uint8_t col)
-{
- setPinOutput(col_pins[col]);
- writePinLow(col_pins[col]);
-}
-
-static void unselect_col(uint8_t col)
-{
- setPinInputHigh(col_pins[col]);
-}
-
-static void unselect_cols(void)
-{
- for(uint8_t x = 0; x < MATRIX_COLS; x++) {
- setPinInputHigh(col_pins[x]);
- }
-}
-
-static void init_pins(void) {
- unselect_rows();
- unselect_cols();
- for (uint8_t x = 0; x < MATRIX_COLS; x++) {
- setPinInputHigh(col_pins[x]);
- }
- for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
- setPinInputHigh(row_pins[x]);
- }
-}
-
-static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
-{
- // Store last value of row prior to reading
- matrix_row_t last_row_value = current_matrix[current_row];
-
- // Clear data in matrix row
- current_matrix[current_row] = 0;
-
- // Select row and wait for row selecton to stabilize
- select_row(current_row);
- wait_us(30);
-
- // For each col...
- for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
-
- // Select the col pin to read (active low)
- uint8_t pin_state = readPin(col_pins[col_index]);
-
- // Populate the matrix row with the state of the col pin
- current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index);
- }
-
- // Unselect row
- unselect_row(current_row);
-
- return (last_row_value != current_matrix[current_row]);
-}
-
-static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
-{
- bool matrix_changed = false;
-
- // Select col and wait for col selecton to stabilize
- select_col(current_col);
- wait_us(30);
-
- // For each row...
- for(uint8_t row_index = 0; row_index < MATRIX_ROWS/2; row_index++)
- {
- uint8_t tmp = row_index + MATRIX_ROWS/2;
- // Store last value of row prior to reading
- matrix_row_t last_row_value = current_matrix[tmp];
-
- // Check row pin state
- if (readPin(row_pins[row_index]) == 0)
- {
- // Pin LO, set col bit
- current_matrix[tmp] |= (ROW_SHIFTER << current_col);
- }
- else
- {
- // Pin HI, clear col bit
- current_matrix[tmp] &= ~(ROW_SHIFTER << current_col);
- }
-
- // Determine if the matrix changed state
- if ((last_row_value != current_matrix[tmp]) && !(matrix_changed))
- {
- matrix_changed = true;
- }
- }
-
- // Unselect col
- unselect_col(current_col);
-
- return matrix_changed;
-}
-
-void matrix_init(void) {
-
- // initialize key pins
- init_pins();
-
- // initialize matrix state: all keys off
- for (uint8_t i=0; i < MATRIX_ROWS; i++) {
- raw_matrix[i] = 0;
- matrix[i] = 0;
- }
-
- debounce_init(MATRIX_ROWS);
-
- matrix_init_quantum();
-}
-
-uint8_t matrix_scan(void)
-{
- bool changed = false;
-
- // Set row, read cols
- for (uint8_t current_row = 0; current_row < MATRIX_ROWS / 2; current_row++) {
- changed |= read_cols_on_row(raw_matrix, current_row);
- }
- //else
- // Set col, read rows
- for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
- changed |= read_rows_on_col(raw_matrix, current_col);
- }
-
- debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
-
- matrix_scan_quantum();
- return (uint8_t)changed;
-}
diff --git a/keyboards/angel64/alpha/readme.md b/keyboards/angel64/alpha/readme.md
deleted file mode 100644
index d646edeb7e..0000000000
--- a/keyboards/angel64/alpha/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# angel64
-
-![angel64](https://i.gyazo.com/6e2ea6c58d3253c496dc0518f2641ff9.jpg)
-
-Keyboard for tablets.
-
-* Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
-* Hardware Supported: angel64_alpha, promicro
-* Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
-
-Make example for this keyboard (after setting up your build environment):
-
- make angel64/alpha: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/angel64/readme.md b/keyboards/angel64/readme.md
deleted file mode 100644
index 791620144e..0000000000
--- a/keyboards/angel64/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# angel64
-
-![angel64](https://i.gyazo.com/d114d4b1789009dbe8c910eaeb3295c5.jpg)
-
-Keyboard for tablets.
-
-* Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
-* Hardware Supported: angel64_alpha, angel64_rev1, promicro
-* Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
-
-Make example for this keyboard (after setting up your build environment):
-
- make angel64: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/angel64/rev1/matrix.c b/keyboards/angel64/rev1/matrix.c
deleted file mode 100644
index 474fbec030..0000000000
--- a/keyboards/angel64/rev1/matrix.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
-Copyright 2012-2018 Jun Wako, Jack Humbert, Yiancar
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-#include <stdint.h>
-#include <stdbool.h>
-#include "wait.h"
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "debounce.h"
-#include "quantum.h"
-
-#if (MATRIX_COLS <= 8)
-# define print_matrix_header() print("\nr/c 01234567\n")
-# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop(matrix[i])
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop16(matrix[i])
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop32(matrix[i])
-# define ROW_SHIFTER ((uint32_t)1)
-#endif
-
-#ifdef MATRIX_MASKED
- extern const matrix_row_t matrix_mask[];
-#endif
-
-static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
-static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t raw_matrix[MATRIX_ROWS]; //raw values
-static matrix_row_t matrix[MATRIX_ROWS]; //debounced values
-
-__attribute__ ((weak))
-void matrix_init_quantum(void) {
- matrix_init_kb();
-}
-
-__attribute__ ((weak))
-void matrix_scan_quantum(void) {
- matrix_scan_kb();
-}
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void) {
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void) {
- return MATRIX_COLS;
-}
-
-//Deprecated.
-bool matrix_is_modified(void)
-{
- if (debounce_active()) 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)
-{
- // Matrix mask lets you disable switches in the returned matrix data. For example, if you have a
- // switch blocker installed and the switch is always pressed.
-#ifdef MATRIX_MASKED
- return matrix[row] & matrix_mask[row];
-#else
- return matrix[row];
-#endif
-}
-
-void matrix_print(void)
-{
- print_matrix_header();
-
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row); print(": ");
- print_matrix_row(row);
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += matrix_bitpop(i);
- }
- return count;
-}
-
-static void select_row(uint8_t row)
-{
- setPinOutput(row_pins[row]);
- writePinLow(row_pins[row]);
-}
-
-static void unselect_row(uint8_t row)
-{
- setPinInputHigh(row_pins[row]);
-}
-
-static void unselect_rows(void)
-{
- for(uint8_t x = 0; x < MATRIX_ROWS; x++) {
- setPinInputHigh(row_pins[x]);
- }
-}
-
-static void select_col(uint8_t col)
-{
- setPinOutput(col_pins[col]);
- writePinLow(col_pins[col]);
-}
-
-static void unselect_col(uint8_t col)
-{
- setPinInputHigh(col_pins[col]);
-}
-
-static void unselect_cols(void)
-{
- for(uint8_t x = 0; x < MATRIX_COLS; x++) {
- setPinInputHigh(col_pins[x]);
- }
-}
-
-static void init_pins(void) {
- unselect_rows();
- unselect_cols();
- for (uint8_t x = 0; x < MATRIX_COLS; x++) {
- setPinInputHigh(col_pins[x]);
- }
- for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
- setPinInputHigh(row_pins[x]);
- }
-}
-
-static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
-{
- // Store last value of row prior to reading
- matrix_row_t last_row_value = current_matrix[current_row];
-
- // Clear data in matrix row
- current_matrix[current_row] = 0;
-
- // Select row and wait for row selecton to stabilize
- select_row(current_row);
- wait_us(30);
-
- // For each col...
- for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
-
- // Select the col pin to read (active low)
- uint8_t pin_state = readPin(col_pins[col_index]);
-
- // Populate the matrix row with the state of the col pin
- current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index);
- }
-
- // Unselect row
- unselect_row(current_row);
-
- return (last_row_value != current_matrix[current_row]);
-}
-
-static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
-{
- bool matrix_changed = false;
-
- // Select col and wait for col selecton to stabilize
- select_col(current_col);
- wait_us(30);
-
- // For each row...
- for(uint8_t row_index = 0; row_index < MATRIX_ROWS/2; row_index++)
- {
- uint8_t tmp = row_index + MATRIX_ROWS/2;
- // Store last value of row prior to reading
- matrix_row_t last_row_value = current_matrix[tmp];
-
- // Check row pin state
- if (readPin(row_pins[row_index]) == 0)
- {
- // Pin LO, set col bit
- current_matrix[tmp] |= (ROW_SHIFTER << current_col);
- }
- else
- {
- // Pin HI, clear col bit
- current_matrix[tmp] &= ~(ROW_SHIFTER << current_col);
- }
-
- // Determine if the matrix changed state
- if ((last_row_value != current_matrix[tmp]) && !(matrix_changed))
- {
- matrix_changed = true;
- }
- }
-
- // Unselect col
- unselect_col(current_col);
-
- return matrix_changed;
-}
-
-void matrix_init(void) {
-
- // initialize key pins
- init_pins();
-
- // initialize matrix state: all keys off
- for (uint8_t i=0; i < MATRIX_ROWS; i++) {
- raw_matrix[i] = 0;
- matrix[i] = 0;
- }
-
- debounce_init(MATRIX_ROWS);
-
- matrix_init_quantum();
-}
-
-uint8_t matrix_scan(void)
-{
- bool changed = false;
-
- // Set row, read cols
- for (uint8_t current_row = 0; current_row < MATRIX_ROWS / 2; current_row++) {
- changed |= read_cols_on_row(raw_matrix, current_row);
- }
- //else
- // Set col, read rows
- for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
- changed |= read_rows_on_col(raw_matrix, current_col);
- }
-
- debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
-
- matrix_scan_quantum();
- return (uint8_t)changed;
-}
diff --git a/keyboards/angel64/rev1/readme.md b/keyboards/angel64/rev1/readme.md
deleted file mode 100644
index 4ce77807c9..0000000000
--- a/keyboards/angel64/rev1/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# angel64
-
-![angel64](https://i.gyazo.com/d114d4b1789009dbe8c910eaeb3295c5.jpg)
-
-Keyboard for tablets.
-
-* Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
-* Hardware Supported: angel64_rev1, promicro
-* Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
-
-Make example for this keyboard (after setting up your build environment):
-
- make angel64/rev1:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/angel64/rules.mk b/keyboards/angel64/rules.mk
deleted file mode 100644
index 9bf41a18cc..0000000000
--- a/keyboards/angel64/rules.mk
+++ /dev/null
@@ -1,25 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = atmel-dfu
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = no # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
-AUDIO_ENABLE = no # Audio output
-OLED_ENABLE = yes
-OLED_DRIVER = SSD1306
-CUSTOM_MATRIX = yes
-
-SRC += matrix.c
-
-DEFAULT_FOLDER = angel64/rev1
diff --git a/keyboards/arch_36/readme.md b/keyboards/arch_36/readme.md
deleted file mode 100644
index d0e16434ee..0000000000
--- a/keyboards/arch_36/readme.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Arch-36
-
-An ergonomic 30% split keyboard
-
-* Keyboard Maintainer: [obosob](https://github.com/obosob)
-* Hardware Supported: Pro Micro 5V/16MHz and compatible.
-
-Make example for this keyboard (after setting up your build environment):
-
- make arch_36:default
-
-Example of flashing this keyboard:
-
- make arch_36:default:flash
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/barleycorn/readme.md b/keyboards/barleycorn/readme.md
deleted file mode 100644
index dd96c69e9a..0000000000
--- a/keyboards/barleycorn/readme.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# Barleycorn
-
-![Barleycorn](https://i.imgur.com/vi3L1HYl.png)
-
-An f-row less compact 1800 kit with only through hole components.
-
-* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
-* Hardware Supported: ATMEGA328p with vusb [PCB](https://github.com/yiancar/barleycorn_pcb)
-* Hardware Availability: https://mykeyboard.eu/, https://novelkeys.xyz
-
-Make example for this keyboard (after setting up your build environment):
-
- make barleycorn:default
-
-Flashing example for this keyboard:
-
- make barleycorn:default:flash
-
-Bootloader:
-use usbasploader from HSGW's repository.
-https://github.com/hsgw/USBaspLoader/tree/plaid
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/bat43/bat43.h b/keyboards/bat43/bat43.h
deleted file mode 100644
index 42d44107b4..0000000000
--- a/keyboards/bat43/bat43.h
+++ /dev/null
@@ -1,10 +0,0 @@
-#pragma once
-
-#ifdef KEYBOARD_bat43_rev1
- #include "rev1.h"
-#endif
-#ifdef KEYBOARD_bat43_rev2
- #include "rev2.h"
-#endif
-
-#include "quantum.h"
diff --git a/keyboards/bat43/readme.md b/keyboards/bat43/readme.md
deleted file mode 100644
index 7097aa7af5..0000000000
--- a/keyboards/bat43/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# bat43
-
-![bat43](https://user-images.githubusercontent.com/30647434/78112239-e9ef8300-7438-11ea-810b-994a75ffa24e.jpg)
-
-A 43-key keyboard.
-
-* Keyboard Maintainer: [yfuku](https://github.com/yfuku)
-* Hardware Supported: bat43 PCB, Pro Micro
-* Hardware Availability: https://yfuku.booth.pm/
-
-Make example for this keyboard (after setting up your build environment):
-
- make bat43: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/bat43/rules.mk b/keyboards/bat43/rules.mk
deleted file mode 100644
index 7bd7394e4f..0000000000
--- a/keyboards/bat43/rules.mk
+++ /dev/null
@@ -1,20 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = caterina
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = no # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
-AUDIO_ENABLE = no # Audio output
-
-DEFAULT_FOLDER = bat43/rev2
diff --git a/keyboards/bpiphany/kitten_paw/matrix.c b/keyboards/bpiphany/kitten_paw/matrix.c
index b59089cdf4..56114858f1 100644
--- a/keyboards/bpiphany/kitten_paw/matrix.c
+++ b/keyboards/bpiphany/kitten_paw/matrix.c
@@ -117,13 +117,6 @@ uint8_t matrix_scan(void) {
return 1;
}
-bool matrix_is_modified(void) {
- if (debouncing)
- return false;
- else
- return true;
-}
-
inline bool matrix_is_on(uint8_t row, uint8_t col) {
return (matrix[row] & ((matrix_row_t)1<<col));
}
diff --git a/keyboards/bpiphany/pegasushoof/2013/matrix.c b/keyboards/bpiphany/pegasushoof/2013/matrix.c
index 037f323c00..09244982d9 100644
--- a/keyboards/bpiphany/pegasushoof/2013/matrix.c
+++ b/keyboards/bpiphany/pegasushoof/2013/matrix.c
@@ -110,13 +110,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
- if (debouncing)
- return false;
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/business_card/business_card.h b/keyboards/business_card/business_card.h
deleted file mode 100644
index f330a01822..0000000000
--- a/keyboards/business_card/business_card.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/* Copyright 2019 kakunpc
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-#pragma once
-
-#ifdef KEYBOARD_business_card_alpha
- #include "alpha.h"
-#endif
-#ifdef KEYBOARD_business_card_beta
- #include "beta.h"
-#endif
-
-#include "quantum.h"
diff --git a/keyboards/business_card/readme.md b/keyboards/business_card/readme.md
deleted file mode 100644
index c1bb32c9c3..0000000000
--- a/keyboards/business_card/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# business_card
-
-![business_card](imgur.com image replace me!)
-
-A short description of the keyboard/project
-
-Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
-Hardware Supported: The PCBs, controllers supported
-Hardware Availability: links to where you can find this hardware
-
-Make example for this keyboard (after setting up your build environment):
-
- make business_card: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/business_card/rules.mk b/keyboards/business_card/rules.mk
deleted file mode 100644
index cda401220e..0000000000
--- a/keyboards/business_card/rules.mk
+++ /dev/null
@@ -1,20 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = atmel-dfu
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys
-EXTRAKEY_ENABLE = no # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
-AUDIO_ENABLE = no # Audio output
-
-DEFAULT_FOLDER = business_card/beta
diff --git a/keyboards/cu24/config.h b/keyboards/capsunlocked/cu24/config.h
index a2a4e727ff..a2a4e727ff 100644
--- a/keyboards/cu24/config.h
+++ b/keyboards/capsunlocked/cu24/config.h
diff --git a/keyboards/cu24/cu24.c b/keyboards/capsunlocked/cu24/cu24.c
index 0c976f076f..0c976f076f 100644
--- a/keyboards/cu24/cu24.c
+++ b/keyboards/capsunlocked/cu24/cu24.c
diff --git a/keyboards/cu24/cu24.h b/keyboards/capsunlocked/cu24/cu24.h
index 8e3daa4758..8e3daa4758 100644
--- a/keyboards/cu24/cu24.h
+++ b/keyboards/capsunlocked/cu24/cu24.h
diff --git a/keyboards/cu24/info.json b/keyboards/capsunlocked/cu24/info.json
index 532bc13bee..532bc13bee 100644
--- a/keyboards/cu24/info.json
+++ b/keyboards/capsunlocked/cu24/info.json
diff --git a/keyboards/cu24/keymaps/default/keymap.c b/keyboards/capsunlocked/cu24/keymaps/default/keymap.c
index aa2d834dfa..aa2d834dfa 100644
--- a/keyboards/cu24/keymaps/default/keymap.c
+++ b/keyboards/capsunlocked/cu24/keymaps/default/keymap.c
diff --git a/keyboards/cu24/keymaps/default/readme.md b/keyboards/capsunlocked/cu24/keymaps/default/readme.md
index 5528d6c0d8..5528d6c0d8 100644
--- a/keyboards/cu24/keymaps/default/readme.md
+++ b/keyboards/capsunlocked/cu24/keymaps/default/readme.md
diff --git a/keyboards/capsunlocked/cu24/readme.md b/keyboards/capsunlocked/cu24/readme.md
new file mode 100644
index 0000000000..250ff8847f
--- /dev/null
+++ b/keyboards/capsunlocked/cu24/readme.md
@@ -0,0 +1,15 @@
+# CU24
+
+![CU24](https://i.imgur.com/AU1QisF.jpg)
+
+A luxurious 24 key keypad with various layouts. Includes RGB underglow, backlight and an aluminium, brass and nylon case.
+
+Keyboard Maintainer: [Yiancar](https://github.com/yiancar)
+Hardware Supported: PCB v1.0 (uses a 32u4)
+Hardware Availability: [caps-unlocked.com](http://caps-unlocked.com/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make capsunlocked/cu24:default
+
+See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
diff --git a/keyboards/cu24/rules.mk b/keyboards/capsunlocked/cu24/rules.mk
index 87e6fffce0..87e6fffce0 100644
--- a/keyboards/cu24/rules.mk
+++ b/keyboards/capsunlocked/cu24/rules.mk
diff --git a/keyboards/cu75/config.h b/keyboards/capsunlocked/cu75/config.h
index cfcb08cce1..cfcb08cce1 100644
--- a/keyboards/cu75/config.h
+++ b/keyboards/capsunlocked/cu75/config.h
diff --git a/keyboards/cu75/cu75.c b/keyboards/capsunlocked/cu75/cu75.c
index 273dd09271..273dd09271 100644
--- a/keyboards/cu75/cu75.c
+++ b/keyboards/capsunlocked/cu75/cu75.c
diff --git a/keyboards/cu75/cu75.h b/keyboards/capsunlocked/cu75/cu75.h
index 444c8daaec..444c8daaec 100644
--- a/keyboards/cu75/cu75.h
+++ b/keyboards/capsunlocked/cu75/cu75.h
diff --git a/keyboards/7skb/.noci b/keyboards/capsunlocked/cu75/cu75/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/7skb/.noci
+++ b/keyboards/capsunlocked/cu75/cu75/.noci
diff --git a/keyboards/cu75/info.json b/keyboards/capsunlocked/cu75/info.json
index 07812ddb58..07812ddb58 100644
--- a/keyboards/cu75/info.json
+++ b/keyboards/capsunlocked/cu75/info.json
diff --git a/keyboards/cu75/keymaps/default/keymap.c b/keyboards/capsunlocked/cu75/keymaps/default/keymap.c
index b1e3e9f97a..b1e3e9f97a 100644
--- a/keyboards/cu75/keymaps/default/keymap.c
+++ b/keyboards/capsunlocked/cu75/keymaps/default/keymap.c
diff --git a/keyboards/cu75/keymaps/default/rules.mk b/keyboards/capsunlocked/cu75/keymaps/default/rules.mk
index bbd4c8c9fd..bbd4c8c9fd 100644
--- a/keyboards/cu75/keymaps/default/rules.mk
+++ b/keyboards/capsunlocked/cu75/keymaps/default/rules.mk
diff --git a/keyboards/cu75/keymaps/iso/keymap.c b/keyboards/capsunlocked/cu75/keymaps/iso/keymap.c
index ce7d51eed0..ce7d51eed0 100644
--- a/keyboards/cu75/keymaps/iso/keymap.c
+++ b/keyboards/capsunlocked/cu75/keymaps/iso/keymap.c
diff --git a/keyboards/cu75/keymaps/iso/rules.mk b/keyboards/capsunlocked/cu75/keymaps/iso/rules.mk
index be27fed69c..be27fed69c 100644
--- a/keyboards/cu75/keymaps/iso/rules.mk
+++ b/keyboards/capsunlocked/cu75/keymaps/iso/rules.mk
diff --git a/keyboards/capsunlocked/cu75/readme.md b/keyboards/capsunlocked/cu75/readme.md
new file mode 100644
index 0000000000..78882b2573
--- /dev/null
+++ b/keyboards/capsunlocked/cu75/readme.md
@@ -0,0 +1,17 @@
+# CU75
+
+![CU75](https://i.imgur.com/42ltqi6.jpg)
+
+A luxurious 75% keyboard with various layouts. Includes RGB underglow, backlight and an aluminium, brass and nylon case.
+
+Keyboard Maintainer: [Yiancar](https://github.com/yiancar) and [LFKeyboards](https://github.com/lfkeyboards)
+Hardware Supported: PCB v1.0 (uses a 32u4)
+Hardware Availability: [caps-unlocked.com](http://caps-unlocked.com/)
+
+This PCB uses lighting libraries from LFKeyboards
+
+Make example for this keyboard (after setting up your build environment):
+
+ make capsunlocked/cu75:default
+
+See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
diff --git a/keyboards/cu75/rules.mk b/keyboards/capsunlocked/cu75/rules.mk
index 6274267ab1..6274267ab1 100644
--- a/keyboards/cu75/rules.mk
+++ b/keyboards/capsunlocked/cu75/rules.mk
diff --git a/keyboards/cu80/config.h b/keyboards/capsunlocked/cu80/v1/config.h
index d5123cdbad..d5123cdbad 100644
--- a/keyboards/cu80/config.h
+++ b/keyboards/capsunlocked/cu80/v1/config.h
diff --git a/keyboards/cu80/info.json b/keyboards/capsunlocked/cu80/v1/info.json
index 937dfd8b5a..937dfd8b5a 100644
--- a/keyboards/cu80/info.json
+++ b/keyboards/capsunlocked/cu80/v1/info.json
diff --git a/keyboards/cu80/keymaps/default/keymap.c b/keyboards/capsunlocked/cu80/v1/keymaps/default/keymap.c
index befdb527db..befdb527db 100644
--- a/keyboards/cu80/keymaps/default/keymap.c
+++ b/keyboards/capsunlocked/cu80/v1/keymaps/default/keymap.c
diff --git a/keyboards/cu80/keymaps/default/readme.md b/keyboards/capsunlocked/cu80/v1/keymaps/default/readme.md
index e1fd6d7384..e1fd6d7384 100644
--- a/keyboards/cu80/keymaps/default/readme.md
+++ b/keyboards/capsunlocked/cu80/v1/keymaps/default/readme.md
diff --git a/keyboards/capsunlocked/cu80/v1/readme.md b/keyboards/capsunlocked/cu80/v1/readme.md
new file mode 100644
index 0000000000..9d6141a4a0
--- /dev/null
+++ b/keyboards/capsunlocked/cu80/v1/readme.md
@@ -0,0 +1,15 @@
+# CU80
+
+![cu80](https://i.imgur.com/p8D4POn.png)
+
+A customizable 80% keyboard.
+
+* Keyboard Maintainer: [aHolland909](https://github.com/aholland909)
+* Hardware Supported: CU80
+* Hardware Availability: [CapsUnlocked](https://caps-unlocked.com/group-buy-cu80/)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make capsunlocked/cu80/v1: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/cu80/rules.mk b/keyboards/capsunlocked/cu80/v1/rules.mk
index 6bfd2008a8..6bfd2008a8 100644
--- a/keyboards/cu80/rules.mk
+++ b/keyboards/capsunlocked/cu80/v1/rules.mk
diff --git a/keyboards/capsunlocked/cu80/v1/v1.c b/keyboards/capsunlocked/cu80/v1/v1.c
new file mode 100644
index 0000000000..96161175b2
--- /dev/null
+++ b/keyboards/capsunlocked/cu80/v1/v1.c
@@ -0,0 +1,18 @@
+/*
+Copyright 2020 Andy Holland
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General 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 "v1.h"
diff --git a/keyboards/cu80/cu80.h b/keyboards/capsunlocked/cu80/v1/v1.h
index 607b7e3afb..607b7e3afb 100644
--- a/keyboards/cu80/cu80.h
+++ b/keyboards/capsunlocked/cu80/v1/v1.h
diff --git a/keyboards/centromere/config.h b/keyboards/centromere/config.h
index e502e2534b..b4cae20332 100644
--- a/keyboards/centromere/config.h
+++ b/keyboards/centromere/config.h
@@ -56,12 +56,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
-
-//UART settings for communication with the RF microcontroller
-#define SERIAL_UART_BAUD 500000
-#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
-#define SERIAL_UART_INIT_CUSTOM \
- /* enable TX and RX */ \
- UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
- /* 8-bit data */ \
- UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
diff --git a/keyboards/centromere/matrix.c b/keyboards/centromere/matrix.c
index 7256cd5cb5..bbd771f41b 100644
--- a/keyboards/centromere/matrix.c
+++ b/keyboards/centromere/matrix.c
@@ -15,80 +15,21 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <stdint.h>
-#include <stdbool.h>
-#if defined(__AVR__)
-#include <avr/io.h>
-#endif
-#include "wait.h"
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "timer.h"
-#include "protocol/serial.h"
-
-#if (MATRIX_COLS <= 8)
-# define print_matrix_header() print("\nr/c 01234567\n")
-# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop(matrix[i])
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop16(matrix[i])
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop32(matrix[i])
-# define ROW_SHIFTER ((uint32_t)1)
-#endif
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void) {
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void) {
- return MATRIX_COLS;
-}
-void matrix_init(void) {
+#include "quantum.h"
+#include "matrix.h"
+#include "uart.h"
- matrix_init_quantum();
- serial_init();
+void matrix_init_custom(void) {
+ uart_init(500000);
}
-uint8_t matrix_scan(void)
-{
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
uint32_t timeout = 0;
+ bool changed = false;
//the s character requests the RF remote slave to send the matrix information
- SERIAL_UART_DATA = 's';
+ uart_write('s');
//trust the external keystates, erase the last set of data
uint8_t uart_data[11] = {0};
@@ -96,58 +37,27 @@ uint8_t matrix_scan(void)
//there are 10 bytes corresponding to 1w columns, and an end byte
for (uint8_t i = 0; i < 11; i++) {
//wait for the serial data, timeout if it's been too long
- while(!SERIAL_UART_RXD_PRESENT){
+ while (!uart_available()) {
timeout++;
- if (timeout > 10000){
+ if (timeout > 10000) {
break;
}
}
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
//check for the end packet, the key state bytes use the LSBs, so 0xE0
//will only show up here if the correct bytes were recieved
- if (uart_data[10] == 0xE0)
- {
+ if (uart_data[10] == 0xE0) {
//shifting and transferring the keystates to the QMK matrix variable
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 5;
+ matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 5;
+ if (current_matrix[i] != current_row) {
+ changed = true;
+ }
+ current_matrix[i] = current_row;
}
}
-
- matrix_scan_quantum();
- return 1;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & ((matrix_row_t)1<<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print_matrix_header();
-
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row); print(": ");
- print_matrix_row(row);
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += matrix_bitpop(i);
- }
- return count;
+ return changed;
}
diff --git a/keyboards/centromere/rules.mk b/keyboards/centromere/rules.mk
index ed777e1b9e..113e1e6aff 100644
--- a/keyboards/centromere/rules.mk
+++ b/keyboards/centromere/rules.mk
@@ -11,16 +11,19 @@ BOOTLOADER = caterina
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-CUSTOM_MATRIX = yes # Remote matrix from the wireless bridge
-NKRO_ENABLE = yes # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-UNICODE_ENABLE = yes # Unicode
+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
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+UNICODE_ENABLE = yes
+CUSTOM_MATRIX = lite
-# # project specific files
-SRC += matrix.c serial_uart.c
+# project specific files
+SRC += matrix.c
+QUANTUM_LIB_SRC += uart.c
LAYOUTS = split_3x5_3 split_3x6_3
diff --git a/keyboards/chili/readme.md b/keyboards/chili/readme.md
deleted file mode 100644
index a383f98fb0..0000000000
--- a/keyboards/chili/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# YDKB Chili
-
-[Chili PCB](https://i.imgur.com/fKi896a.jpg)
-
-The YDKB Chili is a Cherry G80-3000 replacement PCB utilizing the ATmega32U4 microcontroller.
-
-* Keyboard Maintainer: QMK community
-* Hardware Supported: YDKB Chili
-* Hardware Availability: [TaoBao](https://item.taobao.com/item.htm?id=565823984744)
-
-Make example for this keyboard (after setting up your build environment):
-
- make chili:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/chimera_ergo/config.h b/keyboards/chimera_ergo/config.h
index 0767a218b5..3c0cc5c162 100644
--- a/keyboards/chimera_ergo/config.h
+++ b/keyboards/chimera_ergo/config.h
@@ -56,12 +56,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
-
-//UART settings for communication with the RF microcontroller
-#define SERIAL_UART_BAUD 1000000
-#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
-#define SERIAL_UART_INIT_CUSTOM \
- /* enable TX and RX */ \
- UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
- /* 8-bit data */ \
- UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
diff --git a/keyboards/chimera_ergo/matrix.c b/keyboards/chimera_ergo/matrix.c
index 577176c466..603ad0f386 100644
--- a/keyboards/chimera_ergo/matrix.c
+++ b/keyboards/chimera_ergo/matrix.c
@@ -15,89 +15,21 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <stdint.h>
-#include <stdbool.h>
-#if defined(__AVR__)
-#include <avr/io.h>
-#endif
-#include "wait.h"
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "timer.h"
-#include "protocol/serial.h"
-
-#if (MATRIX_COLS <= 8)
-# define print_matrix_header() print("\nr/c 01234567\n")
-# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop(matrix[i])
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop16(matrix[i])
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop32(matrix[i])
-# define ROW_SHIFTER ((uint32_t)1)
-#endif
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-
-__attribute__ ((weak))
-void matrix_init_quantum(void) {
- matrix_init_kb();
-}
-
-__attribute__ ((weak))
-void matrix_scan_quantum(void) {
- matrix_scan_kb();
-}
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void) {
- return MATRIX_ROWS;
-}
-inline
-uint8_t matrix_cols(void) {
- return MATRIX_COLS;
-}
-
-void matrix_init(void) {
+#include "quantum.h"
+#include "matrix.h"
+#include "uart.h"
- matrix_init_quantum();
- serial_init();
+void matrix_init_custom(void) {
+ uart_init(1000000);
}
-uint8_t matrix_scan(void)
-{
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
uint32_t timeout = 0;
+ bool changed = false;
//the s character requests the RF slave to send the matrix
- SERIAL_UART_DATA = 's';
+ uart_write('s');
//trust the external keystates entirely, erase the last data
uint8_t uart_data[14] = {0};
@@ -107,58 +39,27 @@ uint8_t matrix_scan(void)
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
- while(!SERIAL_UART_RXD_PRESENT){
+ while (!uart_available()) {
timeout++;
- if (timeout > 10000){
+ if (timeout > 10000) {
break;
}
}
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
//check for the end packet, the key state bytes use the LSBs, so 0xE0
//will only show up here if the correct bytes were recieved
- if (uart_data[10] == 0xE0)
- {
+ if (uart_data[10] == 0xE0) {
//shifting and transferring the keystates to the QMK matrix variable
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 6;
+ matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 6;
+ if (current_matrix[i] != current_row) {
+ changed = true;
+ }
+ current_matrix[i] = current_row;
}
}
-
- matrix_scan_quantum();
- return 1;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & ((matrix_row_t)1<<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print_matrix_header();
-
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row); print(": ");
- print_matrix_row(row);
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += matrix_bitpop(i);
- }
- return count;
+ return changed;
}
diff --git a/keyboards/chimera_ergo/rules.mk b/keyboards/chimera_ergo/rules.mk
index a8bd3a027a..8cb1736147 100644
--- a/keyboards/chimera_ergo/rules.mk
+++ b/keyboards/chimera_ergo/rules.mk
@@ -8,13 +8,16 @@ BOOTLOADER = caterina
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-CUSTOM_MATRIX = yes # Remote matrix from the wireless bridge
+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
NKRO_ENABLE = yes # Enable N-Key Rollover
-# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+CUSTOM_MATRIX = lite
-# # project specific files
-SRC += matrix.c serial_uart.c
+# project specific files
+SRC += matrix.c
+QUANTUM_LIB_SRC += uart.c
diff --git a/keyboards/chimera_ls/config.h b/keyboards/chimera_ls/config.h
index 2eb028471d..ca92e1e2e4 100644
--- a/keyboards/chimera_ls/config.h
+++ b/keyboards/chimera_ls/config.h
@@ -56,12 +56,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
-
-//UART settings for communication with the RF microcontroller
-#define SERIAL_UART_BAUD 1000000
-#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
-#define SERIAL_UART_INIT_CUSTOM \
- /* enable TX and RX */ \
- UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
- /* 8-bit data */ \
- UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
diff --git a/keyboards/chimera_ls/matrix.c b/keyboards/chimera_ls/matrix.c
index 9edd91818f..a92c3e8431 100644
--- a/keyboards/chimera_ls/matrix.c
+++ b/keyboards/chimera_ls/matrix.c
@@ -15,93 +15,21 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <stdint.h>
-#include <stdbool.h>
-#if defined(__AVR__)
-#include <avr/io.h>
-#endif
-#include "wait.h"
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "timer.h"
-#include "protocol/serial.h"
-
-#if (MATRIX_COLS <= 8)
-# define print_matrix_header() print("\nr/c 01234567\n")
-# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop(matrix[i])
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop16(matrix[i])
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop32(matrix[i])
-# define ROW_SHIFTER ((uint32_t)1)
-#elif (MATRIX_COLS <= 64)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse64(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop64(matrix[i])
-# define ROW_SHIFTER ((uint64_t)1)
-#endif
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-
-__attribute__ ((weak))
-void matrix_init_quantum(void) {
- matrix_init_kb();
-}
-
-__attribute__ ((weak))
-void matrix_scan_quantum(void) {
- matrix_scan_kb();
-}
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void) {
- return MATRIX_ROWS;
-}
-inline
-uint8_t matrix_cols(void) {
- return MATRIX_COLS;
-}
+#include "quantum.h"
+#include "matrix.h"
+#include "uart.h"
-void matrix_init(void) {
- matrix_init_quantum();
- serial_init();
+void matrix_init_custom(void) {
+ uart_init(1000000);
}
-uint8_t matrix_scan(void)
-{
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
uint32_t timeout = 0;
+ bool changed = false;
//the s character requests the RF slave to send the matrix
- SERIAL_UART_DATA = 's';
+ uart_write('s');
//trust the external keystates entirely, erase the last data
uint8_t uart_data[11] = {0};
@@ -111,58 +39,27 @@ uint8_t matrix_scan(void)
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
- while(!SERIAL_UART_RXD_PRESENT){
+ while (!uart_available()) {
timeout++;
- if (timeout > 10000){
+ if (timeout > 10000) {
break;
}
}
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
//check for the end packet, the key state bytes use the LSBs, so 0xE0
//will only show up here if the correct bytes were recieved
- if (uart_data[10] == 0xE0)
- {
+ if (uart_data[10] == 0xE0) {
//shifting and transferring the keystates to the QMK matrix variable
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 5;
+ matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 5;
+ if (current_matrix[i] != current_row) {
+ changed = true;
+ }
+ current_matrix[i] = current_row;
}
}
-
- matrix_scan_quantum();
- return 1;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & ((matrix_row_t)1<<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print_matrix_header();
-
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row); print(": ");
- print_matrix_row(row);
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += matrix_bitpop(i);
- }
- return count;
+ return changed;
}
diff --git a/keyboards/chimera_ls/rules.mk b/keyboards/chimera_ls/rules.mk
index 377c379911..b7f6db5aa5 100644
--- a/keyboards/chimera_ls/rules.mk
+++ b/keyboards/chimera_ls/rules.mk
@@ -8,16 +8,19 @@ BOOTLOADER = caterina
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-CUSTOM_MATRIX = yes # Remote matrix from the wireless bridge
+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
NKRO_ENABLE = yes # Enable N-Key Rollover
-# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+CUSTOM_MATRIX = lite
# project specific files
-SRC += matrix.c serial_uart.c
+SRC += matrix.c
+QUANTUM_LIB_SRC += uart.c
LAYOUTS = ortho_4x12
diff --git a/keyboards/chimera_ortho/config.h b/keyboards/chimera_ortho/config.h
index 974502525c..3d86343a67 100644
--- a/keyboards/chimera_ortho/config.h
+++ b/keyboards/chimera_ortho/config.h
@@ -56,12 +56,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
-
-//UART settings for communication with the RF microcontroller
-#define SERIAL_UART_BAUD 1000000
-#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
-#define SERIAL_UART_INIT_CUSTOM \
- /* enable TX and RX */ \
- UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
- /* 8-bit data */ \
- UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
diff --git a/keyboards/chimera_ortho/matrix.c b/keyboards/chimera_ortho/matrix.c
index 34930af7e2..a92c3e8431 100644
--- a/keyboards/chimera_ortho/matrix.c
+++ b/keyboards/chimera_ortho/matrix.c
@@ -15,79 +15,21 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <stdint.h>
-#include <stdbool.h>
-#if defined(__AVR__)
-#include <avr/io.h>
-#endif
-#include "wait.h"
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "timer.h"
-#include "protocol/serial.h"
-
-#if (MATRIX_COLS <= 8)
-# define print_matrix_header() print("\nr/c 01234567\n")
-# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop(matrix[i])
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop16(matrix[i])
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop32(matrix[i])
-# define ROW_SHIFTER ((uint32_t)1)
-#endif
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void) {
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void) {
- return MATRIX_COLS;
-}
-void matrix_init(void) {
+#include "quantum.h"
+#include "matrix.h"
+#include "uart.h"
- matrix_init_quantum();
- serial_init();
+void matrix_init_custom(void) {
+ uart_init(1000000);
}
-uint8_t matrix_scan(void)
-{
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
uint32_t timeout = 0;
+ bool changed = false;
//the s character requests the RF slave to send the matrix
- SERIAL_UART_DATA = 's';
+ uart_write('s');
//trust the external keystates entirely, erase the last data
uint8_t uart_data[11] = {0};
@@ -97,58 +39,27 @@ uint8_t matrix_scan(void)
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
- while(!SERIAL_UART_RXD_PRESENT){
+ while (!uart_available()) {
timeout++;
- if (timeout > 10000){
+ if (timeout > 10000) {
break;
}
}
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
//check for the end packet, the key state bytes use the LSBs, so 0xE0
//will only show up here if the correct bytes were recieved
- if (uart_data[10] == 0xE0)
- {
+ if (uart_data[10] == 0xE0) {
//shifting and transferring the keystates to the QMK matrix variable
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 5;
+ matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 5;
+ if (current_matrix[i] != current_row) {
+ changed = true;
+ }
+ current_matrix[i] = current_row;
}
}
-
- matrix_scan_quantum();
- return 1;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & ((matrix_row_t)1<<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print_matrix_header();
-
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row); print(": ");
- print_matrix_row(row);
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += matrix_bitpop(i);
- }
- return count;
+ return changed;
}
diff --git a/keyboards/chimera_ortho/rules.mk b/keyboards/chimera_ortho/rules.mk
index fbe6872001..8cb1736147 100644
--- a/keyboards/chimera_ortho/rules.mk
+++ b/keyboards/chimera_ortho/rules.mk
@@ -8,13 +8,16 @@ BOOTLOADER = caterina
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-CUSTOM_MATRIX = yes # Remote matrix from the wireless bridge
+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
NKRO_ENABLE = yes # Enable N-Key Rollover
-# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+CUSTOM_MATRIX = lite
# project specific files
-SRC += matrix.c serial_uart.c
+SRC += matrix.c
+QUANTUM_LIB_SRC += uart.c
diff --git a/keyboards/chimera_ortho_plus/config.h b/keyboards/chimera_ortho_plus/config.h
index 4b12796e95..ebffb85657 100644
--- a/keyboards/chimera_ortho_plus/config.h
+++ b/keyboards/chimera_ortho_plus/config.h
@@ -56,12 +56,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
-
-//UART settings for communication with the RF microcontroller
-#define SERIAL_UART_BAUD 1000000
-#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
-#define SERIAL_UART_INIT_CUSTOM \
- /* enable TX and RX */ \
- UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
- /* 8-bit data */ \
- UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
diff --git a/keyboards/chimera_ortho_plus/matrix.c b/keyboards/chimera_ortho_plus/matrix.c
index 818e05ac98..603ad0f386 100644
--- a/keyboards/chimera_ortho_plus/matrix.c
+++ b/keyboards/chimera_ortho_plus/matrix.c
@@ -15,79 +15,21 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <stdint.h>
-#include <stdbool.h>
-#if defined(__AVR__)
-#include <avr/io.h>
-#endif
-#include "wait.h"
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "timer.h"
-#include "protocol/serial.h"
-
-#if (MATRIX_COLS <= 8)
-# define print_matrix_header() print("\nr/c 01234567\n")
-# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop(matrix[i])
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop16(matrix[i])
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop32(matrix[i])
-# define ROW_SHIFTER ((uint32_t)1)
-#endif
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void) {
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void) {
- return MATRIX_COLS;
-}
-void matrix_init(void) {
+#include "quantum.h"
+#include "matrix.h"
+#include "uart.h"
- matrix_init_quantum();
- serial_init();
+void matrix_init_custom(void) {
+ uart_init(1000000);
}
-uint8_t matrix_scan(void)
-{
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
uint32_t timeout = 0;
+ bool changed = false;
//the s character requests the RF slave to send the matrix
- SERIAL_UART_DATA = 's';
+ uart_write('s');
//trust the external keystates entirely, erase the last data
uint8_t uart_data[14] = {0};
@@ -97,58 +39,27 @@ uint8_t matrix_scan(void)
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
- while(!SERIAL_UART_RXD_PRESENT){
+ while (!uart_available()) {
timeout++;
- if (timeout > 10000){
+ if (timeout > 10000) {
break;
}
}
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
//check for the end packet, the key state bytes use the LSBs, so 0xE0
//will only show up here if the correct bytes were recieved
- if (uart_data[10] == 0xE0)
- {
+ if (uart_data[10] == 0xE0) {
//shifting and transferring the keystates to the QMK matrix variable
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 6;
+ matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 6;
+ if (current_matrix[i] != current_row) {
+ changed = true;
+ }
+ current_matrix[i] = current_row;
}
}
-
- matrix_scan_quantum();
- return 1;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & ((matrix_row_t)1<<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print_matrix_header();
-
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row); print(": ");
- print_matrix_row(row);
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += matrix_bitpop(i);
- }
- return count;
+ return changed;
}
diff --git a/keyboards/chimera_ortho_plus/rules.mk b/keyboards/chimera_ortho_plus/rules.mk
index e99e79c327..0a8a31e7dd 100644
--- a/keyboards/chimera_ortho_plus/rules.mk
+++ b/keyboards/chimera_ortho_plus/rules.mk
@@ -17,7 +17,8 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
UNICODE_ENABLE = yes
-CUSTOM_MATRIX = yes
+CUSTOM_MATRIX = lite
# project specific files
-SRC += matrix.c serial_uart.c
+SRC += matrix.c
+QUANTUM_LIB_SRC += uart.c
diff --git a/keyboards/choc_taro/readme.md b/keyboards/choc_taro/readme.md
deleted file mode 100644
index f0900c2fe4..0000000000
--- a/keyboards/choc_taro/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# choc_taro
-
-![choc_taro](https://i.gyazo.com/717ddeed13cd2f956ed01b71c6e96f87.jpg)
-
-gh60 compatible choc keyboard
-
-* Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
-* Hardware Supported: choc taro pcb
-* Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
-
-Make example for this keyboard (after setting up your build environment):
-
- make choc_taro: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/claw44/claw44.h b/keyboards/claw44/claw44.h
deleted file mode 100644
index 4ca25fcb2b..0000000000
--- a/keyboards/claw44/claw44.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#pragma once
-
-#ifdef KEYBOARD_claw44_rev1
- #include "rev1.h"
-#endif
diff --git a/keyboards/claw44/readme.md b/keyboards/claw44/readme.md
deleted file mode 100644
index 7e72e08971..0000000000
--- a/keyboards/claw44/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Claw44
-
-![Claw44](https://i.imgur.com/5a8iogl.jpg)
-
-A split keyboard with 3x6 vertically staggered keys and 4 thumb keys.
-
-Keyboard Maintainer: [@yfuku_](https://twitter.com/yfuku_)
-Hardware Supported: Claw44 PCB, ProMicro
-Hardware Availability: https://yfuku.booth.pm/
-
-Make example for this keyboard (after setting up your build environment):
-
- make claw44: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/claw44/rules.mk b/keyboards/claw44/rules.mk
deleted file mode 100644
index 6ba5e853fb..0000000000
--- a/keyboards/claw44/rules.mk
+++ /dev/null
@@ -1,20 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = caterina
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys
-EXTRAKEY_ENABLE = no # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-AUDIO_ENABLE = no # Audio output
-RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
-
-DEFAULT_FOLDER = claw44/rev1
diff --git a/keyboards/clueboard/60/info.json b/keyboards/clueboard/60/info.json
index 1698d221d3..6e0d90fe1d 100644
--- a/keyboards/clueboard/60/info.json
+++ b/keyboards/clueboard/60/info.json
@@ -5,6 +5,7 @@
"debounce": 6,
"processor": "STM32F303",
"board": "QMK_PROTON_C",
+ "bootloader": "stm32-dfu",
"diode_direction": "COL2ROW",
"features": {
"audio": true,
diff --git a/keyboards/clueboard/66/rev4/info.json b/keyboards/clueboard/66/rev4/info.json
index f1f1ae4dec..b40abf402f 100644
--- a/keyboards/clueboard/66/rev4/info.json
+++ b/keyboards/clueboard/66/rev4/info.json
@@ -5,6 +5,7 @@
"debounce": 5,
"processor": "STM32F303",
"board": "QMK_PROTON_C",
+ "bootloader": "stm32-dfu",
"diode_direction": "COL2ROW",
"features": {
"audio": true,
diff --git a/keyboards/clueboard/66_hotswap/gen1/info.json b/keyboards/clueboard/66_hotswap/gen1/info.json
index 5e0e5b8aca..cf6288b545 100644
--- a/keyboards/clueboard/66_hotswap/gen1/info.json
+++ b/keyboards/clueboard/66_hotswap/gen1/info.json
@@ -5,6 +5,7 @@
"debounce": 5,
"processor": "STM32F303",
"board": "QMK_PROTON_C",
+ "bootloader": "stm32-dfu",
"diode_direction": "COL2ROW",
"features": {
"audio": true,
diff --git a/keyboards/clueboard/california/info.json b/keyboards/clueboard/california/info.json
index e40b2338cd..24a9399923 100644
--- a/keyboards/clueboard/california/info.json
+++ b/keyboards/clueboard/california/info.json
@@ -4,6 +4,7 @@
"maintainer": "skullydazed",
"processor": "STM32F303",
"board": "QMK_PROTON_C",
+ "bootloader": "stm32-dfu",
"matrix_pins": {
"direct": [
["A10", "A9"],
diff --git a/keyboards/comet46/config.h b/keyboards/comet46/config.h
index 067dabb103..5ea40c14c5 100644
--- a/keyboards/comet46/config.h
+++ b/keyboards/comet46/config.h
@@ -62,12 +62,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MODS_CTRL_MASK (MOD_BIT(KC_LCTL)|MOD_BIT(KC_RCTRL))
#define MODS_ALT_MASK (MOD_BIT(KC_LALT)|MOD_BIT(KC_RALT))
#define MODS_GUI_MASK (MOD_BIT(KC_LGUI)|MOD_BIT(KC_RGUI))
-
-//UART settings for communication with the RF microcontroller
-#define SERIAL_UART_BAUD 1000000
-#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
-#define SERIAL_UART_INIT_CUSTOM \
- /* enable TX and RX */ \
- UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
- /* 8-bit data */ \
- UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
diff --git a/keyboards/comet46/matrix.c b/keyboards/comet46/matrix.c
index 34930af7e2..a92c3e8431 100644
--- a/keyboards/comet46/matrix.c
+++ b/keyboards/comet46/matrix.c
@@ -15,79 +15,21 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <stdint.h>
-#include <stdbool.h>
-#if defined(__AVR__)
-#include <avr/io.h>
-#endif
-#include "wait.h"
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "timer.h"
-#include "protocol/serial.h"
-
-#if (MATRIX_COLS <= 8)
-# define print_matrix_header() print("\nr/c 01234567\n")
-# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop(matrix[i])
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop16(matrix[i])
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop32(matrix[i])
-# define ROW_SHIFTER ((uint32_t)1)
-#endif
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void) {
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void) {
- return MATRIX_COLS;
-}
-void matrix_init(void) {
+#include "quantum.h"
+#include "matrix.h"
+#include "uart.h"
- matrix_init_quantum();
- serial_init();
+void matrix_init_custom(void) {
+ uart_init(1000000);
}
-uint8_t matrix_scan(void)
-{
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
uint32_t timeout = 0;
+ bool changed = false;
//the s character requests the RF slave to send the matrix
- SERIAL_UART_DATA = 's';
+ uart_write('s');
//trust the external keystates entirely, erase the last data
uint8_t uart_data[11] = {0};
@@ -97,58 +39,27 @@ uint8_t matrix_scan(void)
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
- while(!SERIAL_UART_RXD_PRESENT){
+ while (!uart_available()) {
timeout++;
- if (timeout > 10000){
+ if (timeout > 10000) {
break;
}
}
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
//check for the end packet, the key state bytes use the LSBs, so 0xE0
//will only show up here if the correct bytes were recieved
- if (uart_data[10] == 0xE0)
- {
+ if (uart_data[10] == 0xE0) {
//shifting and transferring the keystates to the QMK matrix variable
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 5;
+ matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 5;
+ if (current_matrix[i] != current_row) {
+ changed = true;
+ }
+ current_matrix[i] = current_row;
}
}
-
- matrix_scan_quantum();
- return 1;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & ((matrix_row_t)1<<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print_matrix_header();
-
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row); print(": ");
- print_matrix_row(row);
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += matrix_bitpop(i);
- }
- return count;
+ return changed;
}
diff --git a/keyboards/comet46/rules.mk b/keyboards/comet46/rules.mk
index 814622226a..e177fc6441 100644
--- a/keyboards/comet46/rules.mk
+++ b/keyboards/comet46/rules.mk
@@ -8,16 +8,18 @@ BOOTLOADER = caterina
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys
-EXTRAKEY_ENABLE = no # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-CUSTOM_MATRIX = yes # Remote matrix from the wireless bridge
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = no # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = yes # Enable N-Key Rollover
-# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+CUSTOM_MATRIX = lite
# project specific files
SRC += matrix.c \
i2c.c \
- ssd1306.c \
- serial_uart.c
+ ssd1306.c
+QUANTUM_LIB_SRC += uart.c
diff --git a/keyboards/converter/palm_usb/config.h b/keyboards/converter/palm_usb/config.h
index 4afc654e85..35032835cd 100644
--- a/keyboards/converter/palm_usb/config.h
+++ b/keyboards/converter/palm_usb/config.h
@@ -60,58 +60,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
get_mods() == (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) || \
get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
-
-
-/* Serial(USART) configuration
- * asynchronous, negative logic, 9600baud, no flow control
- * 1-start bit, 8-data bit, non parity, 1-stop bit
- */
-#define SERIAL_SOFT_BAUD 9600
-#define SERIAL_SOFT_PARITY_NONE
-#define SERIAL_SOFT_BIT_ORDER_LSB
-#if (HANDSPRING == 0)
- #define SERIAL_SOFT_LOGIC_NEGATIVE //RS232 logic
-#endif
-/* RXD Port */
-#define SERIAL_SOFT_RXD_ENABLE
-
-// we are using Pro micro pin 3 / D0 as serial
-#define SERIAL_SOFT_RXD_DDR DDRD
-#define SERIAL_SOFT_RXD_PORT PORTD
-#define SERIAL_SOFT_RXD_PIN PIND
-#define SERIAL_SOFT_RXD_BIT 0
-#define SERIAL_SOFT_RXD_VECT INT0_vect
-
-/* RXD Interupt */
-#define SERIAL_SOFT_RXD_INIT() do { \
- /* pin configuration: input with pull-up */ \
- SERIAL_SOFT_RXD_DDR &= ~(1<<SERIAL_SOFT_RXD_BIT); \
- SERIAL_SOFT_RXD_PORT |= (1<<SERIAL_SOFT_RXD_BIT); \
- /* enable interrupt: INT0(rising edge) */ \
- EICRA |= ((1<<ISC01)|(1<<ISC00)); \
- EIMSK |= (1<<INT0); \
- sei(); \
-} while (0)
-#define SERIAL_SOFT_RXD_INT_ENTER()
-#define SERIAL_SOFT_RXD_INT_EXIT() do { \
- /* clear interrupt flag */ \
- EIFR = (1<<INTF0); \
-} while (0)
-#define SERIAL_SOFT_RXD_READ() (SERIAL_SOFT_RXD_PIN&(1<<SERIAL_SOFT_RXD_BIT))
-
-/* TXD Port */
-#define SERIAL_SOFT_TXD_ENABLE
-#define SERIAL_SOFT_TXD_DDR DDRD
-#define SERIAL_SOFT_TXD_PORT PORTD
-#define SERIAL_SOFT_TXD_PIN PIND
-#define SERIAL_SOFT_TXD_BIT 3
-#define SERIAL_SOFT_TXD_HI() do { SERIAL_SOFT_TXD_PORT |= (1<<SERIAL_SOFT_TXD_BIT); } while (0)
-#define SERIAL_SOFT_TXD_LO() do { SERIAL_SOFT_TXD_PORT &= ~(1<<SERIAL_SOFT_TXD_BIT); } while (0)
-#define SERIAL_SOFT_TXD_INIT() do { \
- /* pin configuration: output */ \
- SERIAL_SOFT_TXD_DDR |= (1<<SERIAL_SOFT_TXD_BIT); \
- /* idle */ \
- SERIAL_SOFT_TXD_ON(); \
-} while (0)
-
-
diff --git a/keyboards/converter/palm_usb/matrix.c b/keyboards/converter/palm_usb/matrix.c
index 289284b616..010fd56c79 100644
--- a/keyboards/converter/palm_usb/matrix.c
+++ b/keyboards/converter/palm_usb/matrix.c
@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
-#include "protocol/serial.h"
+#include "uart.h"
#include "timer.h"
@@ -58,8 +58,6 @@ static uint16_t disconnect_counter = 0;
#define COL(code) ((code & COL_MASK) )
#define KEYUP(code) ((code & KEY_MASK) >>7 )
-static bool is_modified = false;
-
__attribute__ ((weak))
void matrix_init_kb(void) {
matrix_init_user();
@@ -166,7 +164,7 @@ uint8_t rts_reset(void) {
uint8_t get_serial_byte(void) {
static uint8_t code;
while(1) {
- code = serial_recv();
+ code = uart_read();
if (code) {
debug_hex(code); debug(" ");
return code;
@@ -242,7 +240,7 @@ void matrix_init(void)
debug_enable = true;
//debug_matrix =true;
- serial_init(); // arguments all #defined
+ uart_init(9600); // arguments all #defined
#if (HANDSPRING == 0)
pins_init(); // set all inputs and outputs.
@@ -292,7 +290,7 @@ void matrix_init(void)
uint8_t matrix_scan(void)
{
uint8_t code;
- code = serial_recv();
+ code = uart_read();
if (!code) {
/*
disconnect_counter ++;
@@ -354,11 +352,6 @@ uint8_t matrix_scan(void)
return code;
}
-bool matrix_is_modified(void)
-{
- return is_modified;
-}
-
inline
bool matrix_has_ghost(void)
{
diff --git a/keyboards/converter/palm_usb/post_rules.mk b/keyboards/converter/palm_usb/post_rules.mk
deleted file mode 100644
index 9c11076701..0000000000
--- a/keyboards/converter/palm_usb/post_rules.mk
+++ /dev/null
@@ -1,7 +0,0 @@
-ifdef HARDWARE_SERIAL
- # Untested with palm_usb
- SRC += protocol/serial_uart.c
- OPT_DEFS += -DHARDWARE_SERIAL
-else
- SRC += protocol/serial_soft.c
-endif
diff --git a/keyboards/converter/palm_usb/rules.mk b/keyboards/converter/palm_usb/rules.mk
index c5e680b883..a1d2e39b23 100644
--- a/keyboards/converter/palm_usb/rules.mk
+++ b/keyboards/converter/palm_usb/rules.mk
@@ -20,5 +20,6 @@ RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
CUSTOM_MATRIX = yes
SRC += matrix.c
+QUANTUM_LIB_SRC += uart.c
DEFAULT_FOLDER = converter/palm_usb/stowaway
diff --git a/keyboards/converter/sun_usb/command_extra.c b/keyboards/converter/sun_usb/command_extra.c
index 756a9160bb..332776ab90 100644
--- a/keyboards/converter/sun_usb/command_extra.c
+++ b/keyboards/converter/sun_usb/command_extra.c
@@ -1,5 +1,5 @@
#include QMK_KEYBOARD_H
-#include "protocol/serial.h"
+#include "uart.h"
bool sun_bell = false;
bool sun_click = false;
@@ -20,41 +20,41 @@ bool command_extra(uint8_t code)
return false;
case KC_DEL:
print("Reset\n");
- serial_send(0x01);
+ uart_write(0x01);
break;
case KC_HOME:
sun_bell = !sun_bell;
if (sun_bell) {
print("Bell On\n");
- serial_send(0x02);
+ uart_write(0x02);
} else {
print("Bell Off\n");
- serial_send(0x03);
+ uart_write(0x03);
}
break;
case KC_END:
sun_click = !sun_click;
if (sun_click) {
print("Click On\n");
- serial_send(0x0A);
+ uart_write(0x0A);
} else {
print("Click Off\n");
- serial_send(0x0B);
+ uart_write(0x0B);
}
break;
case KC_PGUP:
print("LED all on\n");
- serial_send(0x0E);
- serial_send(0xFF);
+ uart_write(0x0E);
+ uart_write(0xFF);
break;
case KC_PGDOWN:
print("LED all off\n");
- serial_send(0x0E);
- serial_send(0x00);
+ uart_write(0x0E);
+ uart_write(0x00);
break;
case KC_INSERT:
print("layout\n");
- serial_send(0x0F);
+ uart_write(0x0F);
break;
default:
xprintf("Unknown extra command: %02X\n", code);
diff --git a/keyboards/converter/sun_usb/config.h b/keyboards/converter/sun_usb/config.h
index c67ae5ebae..0a4aa019f7 100644
--- a/keyboards/converter/sun_usb/config.h
+++ b/keyboards/converter/sun_usb/config.h
@@ -33,50 +33,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
get_mods() == (MOD_BIT(KC_LGUI) | MOD_BIT(KC_RGUI)) || \
get_mods() == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
)
-
-
-/* Serial(USART) configuration
- * asynchronous, negative logic, 1200baud, no flow control
- * 1-start bit, 8-data bit, non parity, 1-stop bit
- */
-#define SERIAL_SOFT_BAUD 1200
-#define SERIAL_SOFT_PARITY_NONE
-#define SERIAL_SOFT_BIT_ORDER_LSB
-#define SERIAL_SOFT_LOGIC_NEGATIVE
-/* RXD Port */
-#define SERIAL_SOFT_RXD_ENABLE
-#define SERIAL_SOFT_RXD_DDR DDRD
-#define SERIAL_SOFT_RXD_PORT PORTD
-#define SERIAL_SOFT_RXD_PIN PIND
-#define SERIAL_SOFT_RXD_BIT 2
-#define SERIAL_SOFT_RXD_VECT INT2_vect
-/* RXD Interupt */
-#define SERIAL_SOFT_RXD_INIT() do { \
- /* pin configuration: input with pull-up */ \
- SERIAL_SOFT_RXD_DDR &= ~(1<<SERIAL_SOFT_RXD_BIT); \
- SERIAL_SOFT_RXD_PORT |= (1<<SERIAL_SOFT_RXD_BIT); \
- /* enable interrupt: INT2(rising edge) */ \
- EICRA |= ((1<<ISC21)|(1<<ISC20)); \
- EIMSK |= (1<<INT2); \
- sei(); \
-} while (0)
-#define SERIAL_SOFT_RXD_INT_ENTER()
-#define SERIAL_SOFT_RXD_INT_EXIT() do { \
- /* clear interrupt flag */ \
- EIFR = (1<<INTF2); \
-} while (0)
-#define SERIAL_SOFT_RXD_READ() (SERIAL_SOFT_RXD_PIN&(1<<SERIAL_SOFT_RXD_BIT))
-/* TXD Port */
-#define SERIAL_SOFT_TXD_ENABLE
-#define SERIAL_SOFT_TXD_DDR DDRD
-#define SERIAL_SOFT_TXD_PORT PORTD
-#define SERIAL_SOFT_TXD_PIN PIND
-#define SERIAL_SOFT_TXD_BIT 3
-#define SERIAL_SOFT_TXD_HI() do { SERIAL_SOFT_TXD_PORT |= (1<<SERIAL_SOFT_TXD_BIT); } while (0)
-#define SERIAL_SOFT_TXD_LO() do { SERIAL_SOFT_TXD_PORT &= ~(1<<SERIAL_SOFT_TXD_BIT); } while (0)
-#define SERIAL_SOFT_TXD_INIT() do { \
- /* pin configuration: output */ \
- SERIAL_SOFT_TXD_DDR |= (1<<SERIAL_SOFT_TXD_BIT); \
- /* idle */ \
- SERIAL_SOFT_TXD_ON(); \
-} while (0)
diff --git a/keyboards/converter/sun_usb/led.c b/keyboards/converter/sun_usb/led.c
index a409699e92..f8d183fd48 100644
--- a/keyboards/converter/sun_usb/led.c
+++ b/keyboards/converter/sun_usb/led.c
@@ -16,7 +16,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
-#include "protocol/serial.h"
+#include "uart.h"
void led_set(uint8_t usb_led)
{
@@ -27,6 +27,6 @@ void led_set(uint8_t usb_led)
if (usb_led & (1<<USB_LED_CAPS_LOCK)) sun_led |= (1<<3);
xprintf("LED: %02X\n", usb_led);
- serial_send(0x0E);
- serial_send(sun_led);
+ uart_write(0x0E);
+ uart_write(sun_led);
}
diff --git a/keyboards/converter/sun_usb/matrix.c b/keyboards/converter/sun_usb/matrix.c
index 21f45111ec..e28d165d52 100644
--- a/keyboards/converter/sun_usb/matrix.c
+++ b/keyboards/converter/sun_usb/matrix.c
@@ -16,7 +16,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
-#include "protocol/serial.h"
+#include "uart.h"
/*
* Matrix Array usage:
@@ -38,8 +38,6 @@ static uint8_t matrix[MATRIX_ROWS];
#define ROW(code) ((code>>3)&0xF)
#define COL(code) (code&0x07)
-static bool is_modified = false;
-
__attribute__ ((weak))
void matrix_init_kb(void) {
matrix_init_user();
@@ -76,7 +74,7 @@ void matrix_init(void)
/* PORTD |= (1<<6); */
debug_enable = true;
- serial_init();
+ uart_init(1200);
// initialize matrix state: all keys off
for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00;
@@ -86,12 +84,12 @@ void matrix_init(void)
/* print("Reseting "); */
/* while (1) { */
/* print("."); */
- /* while (serial_recv()); */
- /* serial_send(0x01); */
+ /* while (uart_read()); */
+ /* uart_write(0x01); */
/* _delay_ms(500); */
- /* if (serial_recv() == 0xFF) { */
+ /* if (uart_read() == 0xFF) { */
/* _delay_ms(500); */
- /* if (serial_recv() == 0x04) */
+ /* if (uart_read() == 0x04) */
/* break; */
/* } */
/* } */
@@ -106,7 +104,7 @@ void matrix_init(void)
uint8_t matrix_scan(void)
{
uint8_t code;
- code = serial_recv();
+ code = uart_read();
if (!code) return 0;
debug_hex(code); debug(" ");
@@ -115,7 +113,7 @@ uint8_t matrix_scan(void)
case 0xFF: // reset success: FF 04
print("reset: ");
_delay_ms(500);
- code = serial_recv();
+ code = uart_read();
xprintf("%02X\n", code);
if (code == 0x04) {
// LED status
@@ -125,12 +123,12 @@ uint8_t matrix_scan(void)
case 0xFE: // layout: FE <layout>
print("layout: ");
_delay_ms(500);
- xprintf("%02X\n", serial_recv());
+ xprintf("%02X\n", uart_read());
return 0;
case 0x7E: // reset fail: 7E 01
print("reset fail: ");
_delay_ms(500);
- xprintf("%02X\n", serial_recv());
+ xprintf("%02X\n", uart_read());
return 0;
case 0x7F:
// all keys up
@@ -154,11 +152,6 @@ uint8_t matrix_scan(void)
return code;
}
-bool matrix_is_modified(void)
-{
- return is_modified;
-}
-
inline
bool matrix_has_ghost(void)
{
diff --git a/keyboards/converter/sun_usb/post_rules.mk b/keyboards/converter/sun_usb/post_rules.mk
deleted file mode 100644
index 2ea1f0a5bf..0000000000
--- a/keyboards/converter/sun_usb/post_rules.mk
+++ /dev/null
@@ -1,6 +0,0 @@
-ifdef HARDWARE_SERIAL
- SRC += protocol/serial_uart.c
- OPT_DEFS += -DHARDWARE_SERIAL
-else
- SRC += protocol/serial_soft.c
-endif
diff --git a/keyboards/converter/sun_usb/rules.mk b/keyboards/converter/sun_usb/rules.mk
index 2f2ddde1d0..d25bcc7ffa 100644
--- a/keyboards/converter/sun_usb/rules.mk
+++ b/keyboards/converter/sun_usb/rules.mk
@@ -20,5 +20,6 @@ RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
CUSTOM_MATRIX = yes
SRC += matrix.c led.c
+QUANTUM_LIB_SRC += uart.c
DEFAULT_FOLDER = converter/sun_usb/type5
diff --git a/keyboards/converter/usb_usb/custom_matrix.cpp b/keyboards/converter/usb_usb/custom_matrix.cpp
index 296f7fcd02..91986f6eb9 100644
--- a/keyboards/converter/usb_usb/custom_matrix.cpp
+++ b/keyboards/converter/usb_usb/custom_matrix.cpp
@@ -192,10 +192,6 @@ extern "C"
return 1;
}
- bool matrix_is_modified(void) {
- return matrix_is_mod;
- }
-
bool matrix_is_on(uint8_t row, uint8_t col) {
uint8_t code = CODE(row, col);
diff --git a/keyboards/cu24/readme.md b/keyboards/cu24/readme.md
deleted file mode 100644
index ca3f3f5a04..0000000000
--- a/keyboards/cu24/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# CU24
-
-![CU24](https://geekhack.org/index.php?action=dlattach;topic=93289.0;attach=185492;image)
-
-A luxurious 24 key keypad with various layouts. Includes RGB underglow, backlight and an aluminium, brass and nylon case.
-
-Keyboard Maintainer: [Yiancar](https://github.com/yiancar)
-Hardware Supported: PCB v1.0 (uses a 32u4)
-Hardware Availability: [caps-unlocked.com](http://caps-unlocked.com/)
-
-Make example for this keyboard (after setting up your build environment):
-
- make CU24:default
-
-See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
diff --git a/keyboards/cu75/readme.md b/keyboards/cu75/readme.md
deleted file mode 100644
index 43603440fd..0000000000
--- a/keyboards/cu75/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# CU75
-
-![CU75](https://geekhack.org/index.php?action=dlattach;topic=91767.0;attach=179167;image)
-
-A luxurious 75% keyboard with various layouts. Includes RGB underglow, backlight and an aluminium, brass and nylon case.
-
-Keyboard Maintainer: [Yiancar](https://github.com/yiancar) and [LFKeyboards](https://github.com/lfkeyboards)
-Hardware Supported: PCB v1.0 (uses a 32u4)
-Hardware Availability: [caps-unlocked.com](http://caps-unlocked.com/)
-
-This PCB uses lighting libraries from LFKeyboards
-
-Make example for this keyboard (after setting up your build environment):
-
- make CU75:default
-
-See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
diff --git a/keyboards/cu80/cu80.c b/keyboards/cu80/cu80.c
deleted file mode 100644
index f794161717..0000000000
--- a/keyboards/cu80/cu80.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "cu80.h" \ No newline at end of file
diff --git a/keyboards/cu80/readme.md b/keyboards/cu80/readme.md
deleted file mode 100644
index cb48c875b9..0000000000
--- a/keyboards/cu80/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# CU80
-
-![cu80](https://cdn11.bigcommerce.com/s-vdedjo0w46/images/stencil/900x900/products/287/2336/DSCF3583__16019.1567722956.png?c=2)
-
-A customizable 80% keyboard.
-
-* Keyboard Maintainer: [aHolland909](https://github.com/aholland909)
-* Hardware Supported: CU80
-* Hardware Availability: [CapsUnlocked](https://caps-unlocked.com/group-buy-cu80/)
-
-Make example for this keyboard (after setting up your build environment):
-
- make cu80: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/angel17/.noci b/keyboards/dailycraft/bat43/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/angel17/.noci
+++ b/keyboards/dailycraft/bat43/.noci
diff --git a/keyboards/bat43/bat43.c b/keyboards/dailycraft/bat43/bat43.c
index 5d52c672b6..5d52c672b6 100644
--- a/keyboards/bat43/bat43.c
+++ b/keyboards/dailycraft/bat43/bat43.c
diff --git a/keyboards/dailycraft/bat43/bat43.h b/keyboards/dailycraft/bat43/bat43.h
new file mode 100644
index 0000000000..046788a0a1
--- /dev/null
+++ b/keyboards/dailycraft/bat43/bat43.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#ifdef KEYBOARD_dailycraft_bat43_rev1
+ #include "rev1.h"
+#endif
+#ifdef KEYBOARD_dailycraft_bat43_rev2
+ #include "rev2.h"
+#endif
+
+#include "quantum.h"
diff --git a/keyboards/bat43/config.h b/keyboards/dailycraft/bat43/config.h
index 19b485fd16..19b485fd16 100644
--- a/keyboards/bat43/config.h
+++ b/keyboards/dailycraft/bat43/config.h
diff --git a/keyboards/bat43/keymaps/default/keymap.c b/keyboards/dailycraft/bat43/keymaps/default/keymap.c
index 5e4faccf98..5e4faccf98 100644
--- a/keyboards/bat43/keymaps/default/keymap.c
+++ b/keyboards/dailycraft/bat43/keymaps/default/keymap.c
diff --git a/keyboards/bat43/keymaps/default/readme.md b/keyboards/dailycraft/bat43/keymaps/default/readme.md
index f72376d89e..f72376d89e 100644
--- a/keyboards/bat43/keymaps/default/readme.md
+++ b/keyboards/dailycraft/bat43/keymaps/default/readme.md
diff --git a/keyboards/bat43/keymaps/via/keymap.c b/keyboards/dailycraft/bat43/keymaps/via/keymap.c
index 0bd07b6017..0bd07b6017 100644
--- a/keyboards/bat43/keymaps/via/keymap.c
+++ b/keyboards/dailycraft/bat43/keymaps/via/keymap.c
diff --git a/keyboards/bat43/keymaps/via/readme.md b/keyboards/dailycraft/bat43/keymaps/via/readme.md
index f72376d89e..f72376d89e 100644
--- a/keyboards/bat43/keymaps/via/readme.md
+++ b/keyboards/dailycraft/bat43/keymaps/via/readme.md
diff --git a/keyboards/allison/keymaps/via/rules.mk b/keyboards/dailycraft/bat43/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/allison/keymaps/via/rules.mk
+++ b/keyboards/dailycraft/bat43/keymaps/via/rules.mk
diff --git a/keyboards/dailycraft/bat43/readme.md b/keyboards/dailycraft/bat43/readme.md
new file mode 100644
index 0000000000..6b58aa5ca3
--- /dev/null
+++ b/keyboards/dailycraft/bat43/readme.md
@@ -0,0 +1,26 @@
+# bat43
+
+![bat43](https://user-images.githubusercontent.com/30647434/78112239-e9ef8300-7438-11ea-810b-994a75ffa24e.jpg)
+
+A 43-key keyboard.
+
+* Keyboard Maintainer: [yfuku](https://github.com/yfuku)
+* Hardware Supported: bat43 PCB, Pro Micro
+* Hardware Availability: https://shop.dailycraft.jp/
+
+Make example for this keyboard (after setting up your build environment):
+
+ make dailycraft/bat43:default
+
+Flashing example for this keyboard:
+
+ make dailycraft/bat43:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 2 ways:
+
+* **Physical reset button**: Briefly press the button on the PCB
+* **Keycode in layout**: Press the key mapped to `RESET` if it is available
diff --git a/keyboards/angel17/alpha/.noci b/keyboards/dailycraft/bat43/rev1/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/angel17/alpha/.noci
+++ b/keyboards/dailycraft/bat43/rev1/.noci
diff --git a/keyboards/bat43/rev1/info.json b/keyboards/dailycraft/bat43/rev1/info.json
index 0384bb5feb..0384bb5feb 100644
--- a/keyboards/bat43/rev1/info.json
+++ b/keyboards/dailycraft/bat43/rev1/info.json
diff --git a/keyboards/bat43/rev1/rev1.c b/keyboards/dailycraft/bat43/rev1/rev1.c
index cff7598740..cff7598740 100644
--- a/keyboards/bat43/rev1/rev1.c
+++ b/keyboards/dailycraft/bat43/rev1/rev1.c
diff --git a/keyboards/bat43/rev1/rev1.h b/keyboards/dailycraft/bat43/rev1/rev1.h
index cf21486a9e..cf21486a9e 100644
--- a/keyboards/bat43/rev1/rev1.h
+++ b/keyboards/dailycraft/bat43/rev1/rev1.h
diff --git a/keyboards/bat43/rev1/rules.mk b/keyboards/dailycraft/bat43/rev1/rules.mk
index 8b13789179..8b13789179 100644
--- a/keyboards/bat43/rev1/rules.mk
+++ b/keyboards/dailycraft/bat43/rev1/rules.mk
diff --git a/keyboards/angel64/.noci b/keyboards/dailycraft/bat43/rev2/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/angel64/.noci
+++ b/keyboards/dailycraft/bat43/rev2/.noci
diff --git a/keyboards/bat43/rev2/info.json b/keyboards/dailycraft/bat43/rev2/info.json
index 352d9a6beb..352d9a6beb 100644
--- a/keyboards/bat43/rev2/info.json
+++ b/keyboards/dailycraft/bat43/rev2/info.json
diff --git a/keyboards/bat43/rev2/rev2.c b/keyboards/dailycraft/bat43/rev2/rev2.c
index cffc0acd32..cffc0acd32 100644
--- a/keyboards/bat43/rev2/rev2.c
+++ b/keyboards/dailycraft/bat43/rev2/rev2.c
diff --git a/keyboards/bat43/rev2/rev2.h b/keyboards/dailycraft/bat43/rev2/rev2.h
index f84cdbaa4d..f84cdbaa4d 100644
--- a/keyboards/bat43/rev2/rev2.h
+++ b/keyboards/dailycraft/bat43/rev2/rev2.h
diff --git a/keyboards/bat43/rev2/rules.mk b/keyboards/dailycraft/bat43/rev2/rules.mk
index 8b13789179..8b13789179 100644
--- a/keyboards/bat43/rev2/rules.mk
+++ b/keyboards/dailycraft/bat43/rev2/rules.mk
diff --git a/keyboards/dailycraft/bat43/rules.mk b/keyboards/dailycraft/bat43/rules.mk
new file mode 100644
index 0000000000..c2e1c5755f
--- /dev/null
+++ b/keyboards/dailycraft/bat43/rules.mk
@@ -0,0 +1,20 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = no # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+DEFAULT_FOLDER = dailycraft/bat43/rev2
diff --git a/keyboards/angel64/alpha/.noci b/keyboards/dailycraft/claw44/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/angel64/alpha/.noci
+++ b/keyboards/dailycraft/claw44/.noci
diff --git a/keyboards/claw44/claw44.c b/keyboards/dailycraft/claw44/claw44.c
index d87103065c..d87103065c 100644
--- a/keyboards/claw44/claw44.c
+++ b/keyboards/dailycraft/claw44/claw44.c
diff --git a/keyboards/dailycraft/claw44/claw44.h b/keyboards/dailycraft/claw44/claw44.h
new file mode 100644
index 0000000000..76ecda6e90
--- /dev/null
+++ b/keyboards/dailycraft/claw44/claw44.h
@@ -0,0 +1,5 @@
+#pragma once
+
+#ifdef KEYBOARD_dailycraft_claw44_rev1
+ #include "rev1.h"
+#endif
diff --git a/keyboards/claw44/config.h b/keyboards/dailycraft/claw44/config.h
index 0bd74ff833..0bd74ff833 100644
--- a/keyboards/claw44/config.h
+++ b/keyboards/dailycraft/claw44/config.h
diff --git a/keyboards/claw44/keymaps/default/config.h b/keyboards/dailycraft/claw44/keymaps/default/config.h
index 98469e4ccf..98469e4ccf 100644
--- a/keyboards/claw44/keymaps/default/config.h
+++ b/keyboards/dailycraft/claw44/keymaps/default/config.h
diff --git a/keyboards/claw44/keymaps/default/keymap.c b/keyboards/dailycraft/claw44/keymaps/default/keymap.c
index 204c0c94e6..204c0c94e6 100644
--- a/keyboards/claw44/keymaps/default/keymap.c
+++ b/keyboards/dailycraft/claw44/keymaps/default/keymap.c
diff --git a/keyboards/claw44/keymaps/oled/config.h b/keyboards/dailycraft/claw44/keymaps/oled/config.h
index 5379ce677d..5379ce677d 100644
--- a/keyboards/claw44/keymaps/oled/config.h
+++ b/keyboards/dailycraft/claw44/keymaps/oled/config.h
diff --git a/keyboards/claw44/keymaps/oled/keymap.c b/keyboards/dailycraft/claw44/keymaps/oled/keymap.c
index 1778ac6167..1778ac6167 100644
--- a/keyboards/claw44/keymaps/oled/keymap.c
+++ b/keyboards/dailycraft/claw44/keymaps/oled/keymap.c
diff --git a/keyboards/claw44/keymaps/oled/rules.mk b/keyboards/dailycraft/claw44/keymaps/oled/rules.mk
index d34d066ded..d34d066ded 100644
--- a/keyboards/claw44/keymaps/oled/rules.mk
+++ b/keyboards/dailycraft/claw44/keymaps/oled/rules.mk
diff --git a/keyboards/claw44/keymaps/via/config.h b/keyboards/dailycraft/claw44/keymaps/via/config.h
index 98469e4ccf..98469e4ccf 100644
--- a/keyboards/claw44/keymaps/via/config.h
+++ b/keyboards/dailycraft/claw44/keymaps/via/config.h
diff --git a/keyboards/claw44/keymaps/via/keymap.c b/keyboards/dailycraft/claw44/keymaps/via/keymap.c
index 5373b76876..5373b76876 100644
--- a/keyboards/claw44/keymaps/via/keymap.c
+++ b/keyboards/dailycraft/claw44/keymaps/via/keymap.c
diff --git a/keyboards/allison_numpad/keymaps/via/rules.mk b/keyboards/dailycraft/claw44/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/allison_numpad/keymaps/via/rules.mk
+++ b/keyboards/dailycraft/claw44/keymaps/via/rules.mk
diff --git a/keyboards/claw44/lib/glcdfont.c b/keyboards/dailycraft/claw44/lib/glcdfont.c
index 9fa1c806aa..9fa1c806aa 100644
--- a/keyboards/claw44/lib/glcdfont.c
+++ b/keyboards/dailycraft/claw44/lib/glcdfont.c
diff --git a/keyboards/dailycraft/claw44/readme.md b/keyboards/dailycraft/claw44/readme.md
new file mode 100644
index 0000000000..e533bd7c82
--- /dev/null
+++ b/keyboards/dailycraft/claw44/readme.md
@@ -0,0 +1,26 @@
+# Claw44
+
+![Claw44](https://i.imgur.com/5a8iogl.jpg)
+
+A split keyboard with 3x6 vertically staggered keys and 4 thumb keys.
+
+* Keyboard Maintainer: [yfuku](https://github.com/yfuku)
+* Hardware Supported: Claw44 PCB, ProMicro
+* Hardware Availability: https://shop.dailycraft.jp/
+
+Make example for this keyboard (after setting up your build environment):
+
+ make dailycraft/claw44:default
+
+Flashing example for this keyboard:
+
+ make dailycraft/claw44:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 2 ways:
+
+* **Physical reset button**: Briefly press the button on the PCB
+* **Keycode in layout**: Press the key mapped to `RESET` if it is available
diff --git a/keyboards/bat43/.noci b/keyboards/dailycraft/claw44/rev1/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/bat43/.noci
+++ b/keyboards/dailycraft/claw44/rev1/.noci
diff --git a/keyboards/claw44/rev1/config.h b/keyboards/dailycraft/claw44/rev1/config.h
index 8116b605cd..8116b605cd 100644
--- a/keyboards/claw44/rev1/config.h
+++ b/keyboards/dailycraft/claw44/rev1/config.h
diff --git a/keyboards/claw44/rev1/info.json b/keyboards/dailycraft/claw44/rev1/info.json
index 3301e7d2ec..3301e7d2ec 100644
--- a/keyboards/claw44/rev1/info.json
+++ b/keyboards/dailycraft/claw44/rev1/info.json
diff --git a/keyboards/claw44/rev1/readme.md b/keyboards/dailycraft/claw44/rev1/readme.md
index 5ad967af80..5ad967af80 100644
--- a/keyboards/claw44/rev1/readme.md
+++ b/keyboards/dailycraft/claw44/rev1/readme.md
diff --git a/keyboards/7skb/rev1/rev1.c b/keyboards/dailycraft/claw44/rev1/rev1.c
index 520a869e57..520a869e57 100644
--- a/keyboards/7skb/rev1/rev1.c
+++ b/keyboards/dailycraft/claw44/rev1/rev1.c
diff --git a/keyboards/claw44/rev1/rev1.h b/keyboards/dailycraft/claw44/rev1/rev1.h
index 9a05977153..9a05977153 100644
--- a/keyboards/claw44/rev1/rev1.h
+++ b/keyboards/dailycraft/claw44/rev1/rev1.h
diff --git a/keyboards/claw44/rev1/rules.mk b/keyboards/dailycraft/claw44/rev1/rules.mk
index a66eb7d352..a66eb7d352 100644
--- a/keyboards/claw44/rev1/rules.mk
+++ b/keyboards/dailycraft/claw44/rev1/rules.mk
diff --git a/keyboards/dailycraft/claw44/rules.mk b/keyboards/dailycraft/claw44/rules.mk
new file mode 100644
index 0000000000..69c59f28e6
--- /dev/null
+++ b/keyboards/dailycraft/claw44/rules.mk
@@ -0,0 +1,20 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = no # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = no # Audio output
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
+
+DEFAULT_FOLDER = dailycraft/claw44/rev1
diff --git a/keyboards/owl8/config.h b/keyboards/dailycraft/owl8/config.h
index d28fd9c927..d28fd9c927 100644
--- a/keyboards/owl8/config.h
+++ b/keyboards/dailycraft/owl8/config.h
diff --git a/keyboards/owl8/info.json b/keyboards/dailycraft/owl8/info.json
index e50484ba90..e50484ba90 100644
--- a/keyboards/owl8/info.json
+++ b/keyboards/dailycraft/owl8/info.json
diff --git a/keyboards/owl8/keymaps/default/keymap.c b/keyboards/dailycraft/owl8/keymaps/default/keymap.c
index e840263639..e840263639 100644
--- a/keyboards/owl8/keymaps/default/keymap.c
+++ b/keyboards/dailycraft/owl8/keymaps/default/keymap.c
diff --git a/keyboards/owl8/keymaps/default/readme.md b/keyboards/dailycraft/owl8/keymaps/default/readme.md
index e0129daa2d..e0129daa2d 100644
--- a/keyboards/owl8/keymaps/default/readme.md
+++ b/keyboards/dailycraft/owl8/keymaps/default/readme.md
diff --git a/keyboards/owl8/keymaps/via/keymap.c b/keyboards/dailycraft/owl8/keymaps/via/keymap.c
index 6e3f6ea90b..6e3f6ea90b 100644
--- a/keyboards/owl8/keymaps/via/keymap.c
+++ b/keyboards/dailycraft/owl8/keymaps/via/keymap.c
diff --git a/keyboards/owl8/keymaps/via/readme.md b/keyboards/dailycraft/owl8/keymaps/via/readme.md
index c4fa65987c..c4fa65987c 100644
--- a/keyboards/owl8/keymaps/via/readme.md
+++ b/keyboards/dailycraft/owl8/keymaps/via/readme.md
diff --git a/keyboards/barleycorn/keymaps/via/rules.mk b/keyboards/dailycraft/owl8/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/barleycorn/keymaps/via/rules.mk
+++ b/keyboards/dailycraft/owl8/keymaps/via/rules.mk
diff --git a/keyboards/owl8/owl8.c b/keyboards/dailycraft/owl8/owl8.c
index a31289891a..a31289891a 100644
--- a/keyboards/owl8/owl8.c
+++ b/keyboards/dailycraft/owl8/owl8.c
diff --git a/keyboards/owl8/owl8.h b/keyboards/dailycraft/owl8/owl8.h
index 5e561f580c..5e561f580c 100644
--- a/keyboards/owl8/owl8.h
+++ b/keyboards/dailycraft/owl8/owl8.h
diff --git a/keyboards/dailycraft/owl8/readme.md b/keyboards/dailycraft/owl8/readme.md
new file mode 100644
index 0000000000..c7fab17476
--- /dev/null
+++ b/keyboards/dailycraft/owl8/readme.md
@@ -0,0 +1,26 @@
+# owl8
+
+![owl8](https://raw.githubusercontent.com/yfuku/owl8/master/images/owl8.jpg)
+
+macropad
+
+* Keyboard Maintainer: [yfuku](https://github.com/yfuku)
+* Hardware Supported: owl8 PCB, Pro Micro
+* Hardware Availability: https://shop.dailycraft.jp/
+
+Make example for this keyboard (after setting up your build environment):
+
+ make dailycraft/owl8:default
+
+Flashing example for this keyboard:
+
+ make dailycraft/owl8:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 2 ways:
+
+* **Physical reset button**: Briefly press the button on the PCB
+* **Keycode in layout**: Press the key mapped to `RESET` if it is available
diff --git a/keyboards/owl8/rules.mk b/keyboards/dailycraft/owl8/rules.mk
index 284ea23e78..284ea23e78 100644
--- a/keyboards/owl8/rules.mk
+++ b/keyboards/dailycraft/owl8/rules.mk
diff --git a/keyboards/7skb/config.h b/keyboards/dailycraft/wings42/config.h
index cfb6bf4ffc..cfb6bf4ffc 100644
--- a/keyboards/7skb/config.h
+++ b/keyboards/dailycraft/wings42/config.h
diff --git a/keyboards/dailycraft/wings42/readme.md b/keyboards/dailycraft/wings42/readme.md
new file mode 100644
index 0000000000..c919653397
--- /dev/null
+++ b/keyboards/dailycraft/wings42/readme.md
@@ -0,0 +1,26 @@
+# wings42
+
+![wings42](https://raw.githubusercontent.com/yfuku/wings42/main/images/wings42.jpg)
+
+A split keyboard with 3x6 vertically staggered keys and 3 thumb keys.
+
+* Keyboard Maintainer: [yfuku](https://github.com/yfuku)
+* Hardware Supported: wings42 PCB, Pro Micro
+* Hardware Availability: https://shop.dailycraft.jp/
+
+Make example for this keyboard (after setting up your build environment):
+
+ make dailycraft/wings42:default
+
+Flashing example for this keyboard:
+
+ make dailycraft/wings42:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 2 ways:
+
+* **Physical reset button**: Briefly press the button on the PCB
+* **Keycode in layout**: Press the key mapped to `RESET` if it is available
diff --git a/keyboards/wings42/rev1/config.h b/keyboards/dailycraft/wings42/rev1/config.h
index cfb4274921..cfb4274921 100644
--- a/keyboards/wings42/rev1/config.h
+++ b/keyboards/dailycraft/wings42/rev1/config.h
diff --git a/keyboards/wings42/rev1/keymaps/default/keymap.c b/keyboards/dailycraft/wings42/rev1/keymaps/default/keymap.c
index 442ba5ed9f..442ba5ed9f 100644
--- a/keyboards/wings42/rev1/keymaps/default/keymap.c
+++ b/keyboards/dailycraft/wings42/rev1/keymaps/default/keymap.c
diff --git a/keyboards/wings42/rev1/keymaps/default/readme.md b/keyboards/dailycraft/wings42/rev1/keymaps/default/readme.md
index d99098ad0c..d99098ad0c 100644
--- a/keyboards/wings42/rev1/keymaps/default/readme.md
+++ b/keyboards/dailycraft/wings42/rev1/keymaps/default/readme.md
diff --git a/keyboards/wings42/rev1/keymaps/via/keymap.c b/keyboards/dailycraft/wings42/rev1/keymaps/via/keymap.c
index 442ba5ed9f..442ba5ed9f 100644
--- a/keyboards/wings42/rev1/keymaps/via/keymap.c
+++ b/keyboards/dailycraft/wings42/rev1/keymaps/via/keymap.c
diff --git a/keyboards/bat43/keymaps/via/rules.mk b/keyboards/dailycraft/wings42/rev1/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/bat43/keymaps/via/rules.mk
+++ b/keyboards/dailycraft/wings42/rev1/keymaps/via/rules.mk
diff --git a/keyboards/dailycraft/wings42/rev1/readme.md b/keyboards/dailycraft/wings42/rev1/readme.md
new file mode 100644
index 0000000000..959052c41d
--- /dev/null
+++ b/keyboards/dailycraft/wings42/rev1/readme.md
@@ -0,0 +1,26 @@
+# wings42
+
+![wings42](https://raw.githubusercontent.com/yfuku/wings42/main/images/wings42.jpg)
+
+A split keyboard with 3x6 vertically staggered keys and 3 thumb keys.
+
+* Keyboard Maintainer: [yfuku](https://github.com/yfuku)
+* Hardware Supported: wings42 PCB, Pro Micro
+* Hardware Availability: https://shop.dailycraft.jp/
+
+Make example for this keyboard (after setting up your build environment):
+
+ make dailycraft/wings42/rev1:default
+
+Flashing example for this keyboard:
+
+ make dailycraft/wings42/rev1:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 2 ways:
+
+* **Physical reset button**: Briefly press the button on the PCB
+* **Keycode in layout**: Press the key mapped to `RESET` if it is available
diff --git a/keyboards/wings42/rev1/rev1.c b/keyboards/dailycraft/wings42/rev1/rev1.c
index dccf24c746..dccf24c746 100644
--- a/keyboards/wings42/rev1/rev1.c
+++ b/keyboards/dailycraft/wings42/rev1/rev1.c
diff --git a/keyboards/wings42/rev1/rev1.h b/keyboards/dailycraft/wings42/rev1/rev1.h
index cd6e35a711..cd6e35a711 100644
--- a/keyboards/wings42/rev1/rev1.h
+++ b/keyboards/dailycraft/wings42/rev1/rev1.h
diff --git a/keyboards/7skb/rev1/rules.mk b/keyboards/dailycraft/wings42/rev1/rules.mk
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/7skb/rev1/rules.mk
+++ b/keyboards/dailycraft/wings42/rev1/rules.mk
diff --git a/keyboards/wings42/rev1_extkeys/config.h b/keyboards/dailycraft/wings42/rev1_extkeys/config.h
index f0f04eca59..f0f04eca59 100644
--- a/keyboards/wings42/rev1_extkeys/config.h
+++ b/keyboards/dailycraft/wings42/rev1_extkeys/config.h
diff --git a/keyboards/wings42/rev1_extkeys/keymaps/default/keymap.c b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/default/keymap.c
index 64a2b00c31..64a2b00c31 100644
--- a/keyboards/wings42/rev1_extkeys/keymaps/default/keymap.c
+++ b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/default/keymap.c
diff --git a/keyboards/wings42/rev1_extkeys/keymaps/default/readme.md b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/default/readme.md
index d99098ad0c..d99098ad0c 100644
--- a/keyboards/wings42/rev1_extkeys/keymaps/default/readme.md
+++ b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/default/readme.md
diff --git a/keyboards/wings42/rev1_extkeys/keymaps/via/keymap.c b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/via/keymap.c
index 97c77e182b..97c77e182b 100644
--- a/keyboards/wings42/rev1_extkeys/keymaps/via/keymap.c
+++ b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/via/keymap.c
diff --git a/keyboards/chili/keymaps/via/rules.mk b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/chili/keymaps/via/rules.mk
+++ b/keyboards/dailycraft/wings42/rev1_extkeys/keymaps/via/rules.mk
diff --git a/keyboards/dailycraft/wings42/rev1_extkeys/readme.md b/keyboards/dailycraft/wings42/rev1_extkeys/readme.md
new file mode 100644
index 0000000000..4a34063ad4
--- /dev/null
+++ b/keyboards/dailycraft/wings42/rev1_extkeys/readme.md
@@ -0,0 +1,26 @@
+# wings42
+
+![wings42](https://raw.githubusercontent.com/yfuku/wings42/main/images/wings42.jpg)
+
+A split keyboard with 3x6 vertically staggered keys and 3 thumb keys.
+
+* Keyboard Maintainer: [yfuku](https://github.com/yfuku)
+* Hardware Supported: wings42 PCB, Pro Micro
+* Hardware Availability: https://shop.dailycraft.jp/
+
+Make example for this keyboard (after setting up your build environment):
+
+ make dailycraft/wings42/rev1_extkeys:default
+
+Flashing example for this keyboard:
+
+ make dailycraft/wings42/rev1_extkeys:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 2 ways:
+
+* **Physical reset button**: Briefly press the button on the PCB
+* **Keycode in layout**: Press the key mapped to `RESET` if it is available
diff --git a/keyboards/wings42/rev1_extkeys/rev1_extkeys.c b/keyboards/dailycraft/wings42/rev1_extkeys/rev1_extkeys.c
index 3d0d203704..3d0d203704 100644
--- a/keyboards/wings42/rev1_extkeys/rev1_extkeys.c
+++ b/keyboards/dailycraft/wings42/rev1_extkeys/rev1_extkeys.c
diff --git a/keyboards/wings42/rev1_extkeys/rev1_extkeys.h b/keyboards/dailycraft/wings42/rev1_extkeys/rev1_extkeys.h
index 2ad58047f1..2ad58047f1 100644
--- a/keyboards/wings42/rev1_extkeys/rev1_extkeys.h
+++ b/keyboards/dailycraft/wings42/rev1_extkeys/rev1_extkeys.h
diff --git a/keyboards/angel64/alpha/rules.mk b/keyboards/dailycraft/wings42/rev1_extkeys/rules.mk
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/angel64/alpha/rules.mk
+++ b/keyboards/dailycraft/wings42/rev1_extkeys/rules.mk
diff --git a/keyboards/wings42/rev2/config.h b/keyboards/dailycraft/wings42/rev2/config.h
index 836833718c..836833718c 100644
--- a/keyboards/wings42/rev2/config.h
+++ b/keyboards/dailycraft/wings42/rev2/config.h
diff --git a/keyboards/wings42/rev2/keymaps/default/keymap.c b/keyboards/dailycraft/wings42/rev2/keymaps/default/keymap.c
index df572a6f5a..df572a6f5a 100644
--- a/keyboards/wings42/rev2/keymaps/default/keymap.c
+++ b/keyboards/dailycraft/wings42/rev2/keymaps/default/keymap.c
diff --git a/keyboards/wings42/rev2/keymaps/default/readme.md b/keyboards/dailycraft/wings42/rev2/keymaps/default/readme.md
index d99098ad0c..d99098ad0c 100644
--- a/keyboards/wings42/rev2/keymaps/default/readme.md
+++ b/keyboards/dailycraft/wings42/rev2/keymaps/default/readme.md
diff --git a/keyboards/wings42/rev2/keymaps/via/config.h b/keyboards/dailycraft/wings42/rev2/keymaps/via/config.h
index 3e0c8d146a..3e0c8d146a 100644
--- a/keyboards/wings42/rev2/keymaps/via/config.h
+++ b/keyboards/dailycraft/wings42/rev2/keymaps/via/config.h
diff --git a/keyboards/wings42/rev2/keymaps/via/keymap.c b/keyboards/dailycraft/wings42/rev2/keymaps/via/keymap.c
index e6b4ef840a..e6b4ef840a 100644
--- a/keyboards/wings42/rev2/keymaps/via/keymap.c
+++ b/keyboards/dailycraft/wings42/rev2/keymaps/via/keymap.c
diff --git a/keyboards/wings42/rev2/keymaps/via/rules.mk b/keyboards/dailycraft/wings42/rev2/keymaps/via/rules.mk
index eea5e1e2a2..eea5e1e2a2 100644
--- a/keyboards/wings42/rev2/keymaps/via/rules.mk
+++ b/keyboards/dailycraft/wings42/rev2/keymaps/via/rules.mk
diff --git a/keyboards/dailycraft/wings42/rev2/readme.md b/keyboards/dailycraft/wings42/rev2/readme.md
new file mode 100644
index 0000000000..c919653397
--- /dev/null
+++ b/keyboards/dailycraft/wings42/rev2/readme.md
@@ -0,0 +1,26 @@
+# wings42
+
+![wings42](https://raw.githubusercontent.com/yfuku/wings42/main/images/wings42.jpg)
+
+A split keyboard with 3x6 vertically staggered keys and 3 thumb keys.
+
+* Keyboard Maintainer: [yfuku](https://github.com/yfuku)
+* Hardware Supported: wings42 PCB, Pro Micro
+* Hardware Availability: https://shop.dailycraft.jp/
+
+Make example for this keyboard (after setting up your build environment):
+
+ make dailycraft/wings42:default
+
+Flashing example for this keyboard:
+
+ make dailycraft/wings42:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+## Bootloader
+
+Enter the bootloader in 2 ways:
+
+* **Physical reset button**: Briefly press the button on the PCB
+* **Keycode in layout**: Press the key mapped to `RESET` if it is available
diff --git a/keyboards/wings42/rev2/rev2.c b/keyboards/dailycraft/wings42/rev2/rev2.c
index 96aa6cd314..96aa6cd314 100644
--- a/keyboards/wings42/rev2/rev2.c
+++ b/keyboards/dailycraft/wings42/rev2/rev2.c
diff --git a/keyboards/wings42/rev2/rev2.h b/keyboards/dailycraft/wings42/rev2/rev2.h
index 4720592264..4720592264 100644
--- a/keyboards/wings42/rev2/rev2.h
+++ b/keyboards/dailycraft/wings42/rev2/rev2.h
diff --git a/keyboards/angel64/rev1/rules.mk b/keyboards/dailycraft/wings42/rev2/rules.mk
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/angel64/rev1/rules.mk
+++ b/keyboards/dailycraft/wings42/rev2/rules.mk
diff --git a/keyboards/dailycraft/wings42/rules.mk b/keyboards/dailycraft/wings42/rules.mk
new file mode 100644
index 0000000000..94459dbcc5
--- /dev/null
+++ b/keyboards/dailycraft/wings42/rules.mk
@@ -0,0 +1,22 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+SPLIT_KEYBOARD = yes
+
+DEFAULT_FOLDER = dailycraft/wings42/rev2
diff --git a/keyboards/wings42/wings42.c b/keyboards/dailycraft/wings42/wings42.c
index 824b6cfbb6..824b6cfbb6 100644
--- a/keyboards/wings42/wings42.c
+++ b/keyboards/dailycraft/wings42/wings42.c
diff --git a/keyboards/dailycraft/wings42/wings42.h b/keyboards/dailycraft/wings42/wings42.h
new file mode 100644
index 0000000000..d839f04884
--- /dev/null
+++ b/keyboards/dailycraft/wings42/wings42.h
@@ -0,0 +1,30 @@
+/* Copyright 2021 yfuku
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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"
+
+#ifdef KEYBOARD_dailycraft_wings42_rev1
+# include "rev1.h"
+#endif
+#ifdef KEYBOARD_dailycraft_wings42_rev1_extkeys
+# include "rev1_extkeys.h"
+#endif
+#ifdef KEYBOARD_dailycraft_wings42_rev2
+# include "rev2.h"
+#endif
+
diff --git a/keyboards/dc01/arrow/matrix.c b/keyboards/dc01/arrow/matrix.c
index 0102ad0fa4..b69e147914 100644
--- a/keyboards/dc01/arrow/matrix.c
+++ b/keyboards/dc01/arrow/matrix.c
@@ -205,14 +205,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
-#if (DEBOUNCE > 0)
- if (debouncing) return false;
-#endif
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/dc01/left/matrix.c b/keyboards/dc01/left/matrix.c
index bf5aba8497..084978a1fd 100644
--- a/keyboards/dc01/left/matrix.c
+++ b/keyboards/dc01/left/matrix.c
@@ -230,14 +230,6 @@ if (i2c_transaction(SLAVE_I2C_ADDRESS_NUMPAD, 0x1FFFF, 11)) {
return 1;
}
-bool matrix_is_modified(void)
-{
-#if (DEBOUNCE > 0)
- if (debouncing) return false;
-#endif
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/dc01/numpad/matrix.c b/keyboards/dc01/numpad/matrix.c
index 38130114eb..e8e2a1b14a 100644
--- a/keyboards/dc01/numpad/matrix.c
+++ b/keyboards/dc01/numpad/matrix.c
@@ -205,14 +205,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
-#if (DEBOUNCE > 0)
- if (debouncing) return false;
-#endif
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/dc01/right/matrix.c b/keyboards/dc01/right/matrix.c
index 544c8dc538..2509bd7d4c 100644
--- a/keyboards/dc01/right/matrix.c
+++ b/keyboards/dc01/right/matrix.c
@@ -206,14 +206,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
-#if (DEBOUNCE > 0)
- if (debouncing) return false;
-#endif
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/delilah/readme.md b/keyboards/delilah/readme.md
deleted file mode 100644
index 8ba9d83188..0000000000
--- a/keyboards/delilah/readme.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Delilah
-
-![Delilah](https://i.imgur.com/TqBZycx.png)
-
-A 12.25u, traditional stagger, 40% keyboard. Designed to keep another punctuation key on base layer while still being compact.
-
-* Keyboard Maintainer: Rain
-* Hardware Supported: Delilah PCB v1.0, v1.1
-* Hardware Availability: [rainkeebs](https://www.rainkeebs.mx/)
-
-
-Make example for this keyboard (after setting up your build environment):
-
- qmk compile -kb delilah -kb default
-
-To reset the keyboard, hold the top left key while plugging in, or hit the reset button near the USB port
-
-Install example for this keyboard:
-
- qmk flash -kb delilah -km default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/dichotomy/config.h b/keyboards/dichotomy/config.h
index 03e19b1388..40e7f18e6f 100644
--- a/keyboards/dichotomy/config.h
+++ b/keyboards/dichotomy/config.h
@@ -56,12 +56,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
-
-//UART settings for communication with the RF microcontroller
-#define SERIAL_UART_BAUD 1000000
-#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
-#define SERIAL_UART_INIT_CUSTOM \
- /* enable TX and RX */ \
- UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
- /* 8-bit data */ \
- UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
diff --git a/keyboards/dichotomy/dichotomy.c b/keyboards/dichotomy/dichotomy.c
index 967d7e603c..afd52cc8b3 100755
--- a/keyboards/dichotomy/dichotomy.c
+++ b/keyboards/dichotomy/dichotomy.c
@@ -1,11 +1,13 @@
#include "dichotomy.h"
+//#include "uart.h"
+
void pointing_device_task(void){
/*report_mouse_t currentReport = {};
uint32_t timeout = 0;
//the m character requests the RF slave to send the mouse report
- SERIAL_UART_DATA = 'm';
+ uart_write('m');
//trust the external inputs completely, erase old data
uint8_t uart_data[5] = {0};
@@ -15,7 +17,7 @@ void pointing_device_task(void){
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
- while(!SERIAL_UART_RXD_PRESENT){
+ while(!uart_available()){
timeout++;
if (timeout > 10000){
xprintf("\r\nTIMED OUT");
@@ -23,7 +25,7 @@ void pointing_device_task(void){
}
}
xprintf("\r\nGOT DATA for %d",i);
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
//check for the end packet, bytes 1-4 are movement and scroll
diff --git a/keyboards/dichotomy/matrix.c b/keyboards/dichotomy/matrix.c
index ed83bd452c..806b66d498 100755
--- a/keyboards/dichotomy/matrix.c
+++ b/keyboards/dichotomy/matrix.c
@@ -29,7 +29,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "dichotomy.h"
#include "pointing_device.h"
#include "report.h"
-#include "protocol/serial.h"
+#include "uart.h"
#if (MATRIX_COLS <= 8)
# define print_matrix_header() print("\nr/c 01234567\n")
@@ -94,7 +94,7 @@ uint8_t matrix_cols(void) {
void matrix_init(void) {
matrix_init_quantum();
- serial_init();
+ uart_init(1000000);
}
uint8_t matrix_scan(void)
@@ -104,7 +104,7 @@ uint8_t matrix_scan(void)
uint32_t timeout = 0;
//the s character requests the RF slave to send the matrix
- SERIAL_UART_DATA = 's';
+ uart_write('s');
//trust the external keystates entirely, erase the last data
uint8_t uart_data[11] = {0};
@@ -114,14 +114,14 @@ uint8_t matrix_scan(void)
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
- while(!SERIAL_UART_RXD_PRESENT){
+ while(!uart_available()){
timeout++;
if (timeout > 10000){
xprintf("\r\nTime out in keyboard.");
break;
}
}
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
//check for the end packet, the key state bytes use the LSBs, so 0xE0
diff --git a/keyboards/dichotomy/rules.mk b/keyboards/dichotomy/rules.mk
index 2b5eb0360c..a6029e3dbf 100755
--- a/keyboards/dichotomy/rules.mk
+++ b/keyboards/dichotomy/rules.mk
@@ -18,4 +18,5 @@ NKRO_ENABLE = yes # Enable N-Key Rollover
# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
# # project specific files
-SRC += matrix.c serial_uart.c
+SRC += matrix.c
+QUANTUM_LIB_SRC += uart.c
diff --git a/keyboards/dm9records/ergoinu/config.h b/keyboards/dm9records/ergoinu/config.h
index 113eaf9f76..89ea9e7903 100644
--- a/keyboards/dm9records/ergoinu/config.h
+++ b/keyboards/dm9records/ergoinu/config.h
@@ -20,7 +20,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once
#include "config_common.h"
-#include "serial_config.h"
/* USB Device descriptor parameter
VID & PID are lisenced from microchip sublisence program, Don't use other project! */
@@ -30,11 +29,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MANUFACTURER Dm9Records
#define PRODUCT ergoinu
-#define TAPPING_FORCE_HOLD
-#define TAPPING_TERM 100
-
#define USE_SERIAL
+/* serial.c configuration for split keyboard */
+#define SOFT_SERIAL_PIN D2
+
/* Select hand configuration */
#define MASTER_LEFT
// #define MASTER_RIGHT
@@ -49,6 +48,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define MATRIX_COLS 7
#define MATRIX_COL_PINS { B4, E6, D7, C6, D4, F5, F4 }
+/* COL2ROW, ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
diff --git a/keyboards/dm9records/ergoinu/ergoinu.c b/keyboards/dm9records/ergoinu/ergoinu.c
index c6d099a148..a01ac0a25c 100644
--- a/keyboards/dm9records/ergoinu/ergoinu.c
+++ b/keyboards/dm9records/ergoinu/ergoinu.c
@@ -1 +1,18 @@
+/*
+Copyright 2018 Takuya Urakawa<twitter:@hsgw>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General 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 "ergoinu.h"
diff --git a/keyboards/dm9records/ergoinu/ergoinu.h b/keyboards/dm9records/ergoinu/ergoinu.h
index 43249a8440..c275d3fa27 100644
--- a/keyboards/dm9records/ergoinu/ergoinu.h
+++ b/keyboards/dm9records/ergoinu/ergoinu.h
@@ -19,10 +19,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "quantum.h"
-#ifdef RGBLIGHT_ENABLE
-#include "ws2812.h"
-#endif
-
#define LAYOUT( \
L00, L01, L02, L03, L04, L05, L06, R00, R01, R02, R03, R04, R05, R06, \
L07, L08, L09, L10, L11, L12, L13, R07, R08, R09, R10, R11, R12, R13, \
@@ -41,4 +37,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
{ R27, R26, R25, R24, R23, R22, R21 }, \
{ KC_NO, KC_NO, R32, R31, R30, R29, R28 } \
}
-
diff --git a/keyboards/dm9records/ergoinu/keymaps/default/config.h b/keyboards/dm9records/ergoinu/keymaps/default/config.h
deleted file mode 100644
index bb266f25e7..0000000000
--- a/keyboards/dm9records/ergoinu/keymaps/default/config.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-This is the c configuration file for the keymap
-
-Copyright 2012 Jun Wako <wakojun@gmail.com>
-Copyright 2015 Jack Humbert
-Copyright 2018 Takuya Urakawa <Twitter:@hsgw>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General 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 RGBLIGHT_ANIMATIONS
diff --git a/keyboards/dm9records/ergoinu/keymaps/default/keymap.c b/keyboards/dm9records/ergoinu/keymaps/default/keymap.c
index 00c5da820d..862b538829 100644
--- a/keyboards/dm9records/ergoinu/keymaps/default/keymap.c
+++ b/keyboards/dm9records/ergoinu/keymaps/default/keymap.c
@@ -5,14 +5,6 @@
extern rgblight_config_t rgblight_config;
#endif
-#define JA_CLON KC_QUOT // : and +
-#define JA_AT KC_LBRC // @ and `
-#define JA_HAT KC_EQL // ^ and ~
-#define JA_ENUN KC_RO // \ and _ (EN mark and UNder score)
-#define JA_ENVL KC_JYEN // \ and | (EN mark and Vertical Line)
-#define JA_LBRC KC_RBRC // [ and {
-#define JA_RBRC KC_BSLS // ] and }
-
enum LAYER_NO {
BASE = 0,
META,
@@ -24,33 +16,30 @@ enum CUSTOM_KEYCODES {
RGB_TYPE,
};
-// Fillers to make layering more clear
-#define ______ KC_TRNS
-#define XXXXXX KC_NO
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[BASE] = LAYOUT(
- KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS,
- KC_DEL, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,
- KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_GRV,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT,
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS,
+ KC_DEL, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,
+ KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_GRV,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_RSFT,
MO(META),KC_LALT, KC_LGUI, KC_ENT, KC_SPC, KC_ENT, KC_BSPC, KC_RGUI, KC_RALT, MO(META)
),
[META] = LAYOUT(
MO(CONF),KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS,
- ______, KC_CAPS, ______, ______, ______, ______, ______, ______, ______, ______, KC_SLCK, KC_PSCR, KC_HOME, KC_END,
- ______, ______, ______, ______, ______, ______, ______, ______, ______, KC_PAUS, KC_PGUP, KC_UP, KC_PGDN,
- ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, KC_LEFT, KC_DOWN, KC_RGHT,
- ______, ______, ______, ______, ______, ______, ______, ______, ______, ______
+ _______, KC_CAPS, _______, _______, _______, _______, _______, _______, _______, _______, KC_SLCK, KC_PSCR, KC_HOME, KC_END,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PAUS, KC_PGUP, KC_UP, KC_PGDN,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
- [CONF] = LAYOUT(
- ______, RGB_TYPE,RGB_MOD, RGB_VAI, RGB_HUI, RGB_HUI, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX,
- RGB_RST, RGB_TOG, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_HUD, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX,
- XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX,
- XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX,
- XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX
+
+ [CONF] = LAYOUT(
+ _______, RGB_TYPE,RGB_MOD, RGB_VAI, RGB_HUI, RGB_HUI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ RGB_RST, RGB_TOG, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_HUD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
)
};
diff --git a/keyboards/dm9records/ergoinu/keymaps/default/rules.mk b/keyboards/dm9records/ergoinu/keymaps/default/rules.mk
deleted file mode 100644
index 8567c2ae2e..0000000000
--- a/keyboards/dm9records/ergoinu/keymaps/default/rules.mk
+++ /dev/null
@@ -1,18 +0,0 @@
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys
-EXTRAKEY_ENABLE = no # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-AUDIO_ENABLE = no # Audio output
-RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
-SWAP_HANDS_ENABLE = no # Enable one-hand typing
-
-# ergoinu configs
-DISABLE_PROMICRO_LEDs = yes
-
-# Uncomment these for debugging
-# $(info -- RGBLIGHT_ENABLE=$(RGBLIGHT_ENABLE))
-# $(info -- OPT_DEFS=$(OPT_DEFS))
-# $(info )
diff --git a/keyboards/dm9records/ergoinu/keymaps/default_jis/config.h b/keyboards/dm9records/ergoinu/keymaps/default_jis/config.h
deleted file mode 100644
index bb266f25e7..0000000000
--- a/keyboards/dm9records/ergoinu/keymaps/default_jis/config.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-This is the c configuration file for the keymap
-
-Copyright 2012 Jun Wako <wakojun@gmail.com>
-Copyright 2015 Jack Humbert
-Copyright 2018 Takuya Urakawa <Twitter:@hsgw>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General 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 RGBLIGHT_ANIMATIONS
diff --git a/keyboards/dm9records/ergoinu/keymaps/default_jis/keymap.c b/keyboards/dm9records/ergoinu/keymaps/default_jis/keymap.c
index a9a9f71f4d..32289c44db 100644
--- a/keyboards/dm9records/ergoinu/keymaps/default_jis/keymap.c
+++ b/keyboards/dm9records/ergoinu/keymaps/default_jis/keymap.c
@@ -24,10 +24,6 @@ enum CUSTOM_KEYCODES {
RGB_TYPE,
};
-// Fillers to make layering more clear
-#define ______ KC_TRNS
-#define XXXXXX KC_NO
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[BASE] = LAYOUT(
@@ -38,20 +34,20 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
MO(META),KC_LALT, KC_ZKHK, KC_BSPC, KC_SPC, KC_ENT, KC_BSPC, KC_MHEN, KC_KANA, MO(META)
),
-
[META] = LAYOUT(
MO(CONF),KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS,
- ______, KC_CAPS, ______, KC_UP, ______, ______, ______, ______, ______, ______, KC_SLCK, KC_PSCR, KC_HOME, KC_END,
- ______, KC_LEFT, KC_DOWN, KC_RGHT, ______, ______, ______, ______, ______, KC_PAUS, KC_PGUP, KC_UP, KC_PGDN,
- ______, ______, ______, ______, ______, ______, ______, ______, ______, ______, KC_LEFT, KC_DOWN, KC_RGHT,
- ______, ______, KC_RGUI, KC_DEL, KC_ENT, ______, KC_DEL, KC_HENK, KC_LGUI, ______
+ _______, KC_CAPS, _______, KC_UP, _______, _______, _______, _______, _______, _______, KC_SLCK, KC_PSCR, KC_HOME, KC_END,
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, KC_PAUS, KC_PGUP, KC_UP, KC_PGDN,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT,
+ _______, _______, KC_RGUI, KC_DEL, KC_ENT, _______, KC_DEL, KC_HENK, KC_LGUI, _______
),
- [CONF] = LAYOUT(
- ______, RGB_TYPE,RGB_MOD, RGB_VAI, RGB_HUI, RGB_HUI, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX,
- RGB_RST, RGB_TOG, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_HUD, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX,
- XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX,
- XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX,
- XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX, XXXXXX
+
+ [CONF] = LAYOUT(
+ _______, RGB_TYPE,RGB_MOD, RGB_VAI, RGB_HUI, RGB_HUI, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ RGB_RST, RGB_TOG, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_HUD, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
+ XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
)
};
diff --git a/keyboards/dm9records/ergoinu/keymaps/default_jis/rules.mk b/keyboards/dm9records/ergoinu/keymaps/default_jis/rules.mk
deleted file mode 100644
index 97154be636..0000000000
--- a/keyboards/dm9records/ergoinu/keymaps/default_jis/rules.mk
+++ /dev/null
@@ -1,18 +0,0 @@
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys(+4700)
-EXTRAKEY_ENABLE = no # Audio control and System control(+450)
-CONSOLE_ENABLE = no # Console for debug(+400)
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-AUDIO_ENABLE = no # Audio output
-RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
-SWAP_HANDS_ENABLE = no # Enable one-hand typing
-
-# ergoinu configs
-DISABLE_PROMICRO_LEDs = yes
-
-# Uncomment these for debugging
-# $(info -- RGBLIGHT_ENABLE=$(RGBLIGHT_ENABLE))
-# $(info -- OPT_DEFS=$(OPT_DEFS))
-# $(info )
diff --git a/keyboards/dm9records/ergoinu/matrix.c b/keyboards/dm9records/ergoinu/matrix.c
deleted file mode 100644
index b1c58f88fe..0000000000
--- a/keyboards/dm9records/ergoinu/matrix.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
-Copyright 2012 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * scan matrix
- */
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/io.h>
-#include <avr/wdt.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "split_util.h"
-#include "quantum.h"
-
-#include "serial.h"
-
-#ifndef DEBOUNCE
-# define DEBOUNCE 5
-#endif
-
-#define ERROR_DISCONNECT_COUNT 5
-
-static uint8_t debouncing = DEBOUNCE;
-static const int ROWS_PER_HAND = MATRIX_ROWS/2;
-static uint8_t error_count = 0;
-uint8_t is_master = 0 ;
-
-static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
-static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-static matrix_row_t matrix_debouncing[MATRIX_ROWS];
-
-static matrix_row_t read_cols(void);
-static void init_cols(void);
-static void unselect_rows(void);
-static void select_row(uint8_t row);
-static uint8_t matrix_master_scan(void);
-
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void) {
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void) {
- return MATRIX_COLS;
-}
-
-void matrix_init(void) {
- debug_enable = true;
- debug_matrix = true;
- debug_mouse = true;
- // initialize row and col
- unselect_rows();
- init_cols();
-
- setPinOutput(B0);
- setPinOutput(D5);
-
- #ifdef DISABLE_PROMICRO_LEDs
- writePinHigh(B0);
- writePinHigh(D5);
- #endif
-
- // initialize matrix state: all keys off
- for (uint8_t i=0; i < MATRIX_ROWS; i++) {
- matrix[i] = 0;
- matrix_debouncing[i] = 0;
- }
-
- is_master = has_usb();
-
- matrix_init_quantum();
-}
-
-uint8_t _matrix_scan(void) {
- // Right hand is stored after the left in the matirx so, we need to offset it
- int offset = isLeftHand ? 0 : (ROWS_PER_HAND);
-
- for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
- select_row(i);
- _delay_us(30); // without this wait read unstable value.
- matrix_row_t cols = read_cols();
- if (matrix_debouncing[i+offset] != cols) {
- matrix_debouncing[i+offset] = cols;
- debouncing = DEBOUNCE;
- }
- unselect_rows();
- }
-
- if (debouncing) {
- if (--debouncing) {
- _delay_ms(1);
- } else {
- for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
- matrix[i+offset] = matrix_debouncing[i+offset];
- }
- }
- }
-
- return 1;
-}
-
-int serial_transaction(void) {
- int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
- int ret=serial_update_buffers();
- if (ret ) {
-#ifndef DISABLE_PROMICRO_LEDs
- if(ret==2) writePinLow(B0);
-#endif
- return 1;
- }
-#ifndef DISABLE_PROMICRO_LEDs
- writePinHigh(B0);
-#endif
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- matrix[slaveOffset+i] = serial_slave_buffer[i];
- }
- return 0;
-}
-
-uint8_t matrix_scan(void) {
- if (is_master) {
- matrix_master_scan();
- }else{
- matrix_slave_scan();
-
- int offset = (isLeftHand) ? ROWS_PER_HAND : 0;
-
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- matrix[offset+i] = serial_master_buffer[i];
- }
-
- matrix_scan_quantum();
- }
- return 1;
-}
-
-
-uint8_t matrix_master_scan(void) {
-
- int ret = _matrix_scan();
-
- int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
-
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- serial_master_buffer[i] = matrix[offset+i];
- }
-
- if( serial_transaction() ) {
-#ifndef DISABLE_PROMICRO_LEDs
- // turn on the indicator led when halves are disconnected
- writePinLow(D5);
-#endif
-
- 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 {
-#ifndef DISABLE_PROMICRO_LEDs
- // turn off the indicator led on no error
- writePinHigh(D5);
-#endif
- error_count = 0;
- }
- matrix_scan_quantum();
- return ret;
-}
-
-void matrix_slave_scan(void) {
- _matrix_scan();
-
- int offset = (isLeftHand) ? 0 : ROWS_PER_HAND;
-
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- serial_slave_buffer[i] = matrix[offset+i];
- }
-}
-
-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++) {
- print_hex8(row); print(": ");
- print_bin_reverse16(matrix_get_row(row));
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += bitpop16(matrix[i]);
- }
- return count;
-}
-
-static void init_cols(void)
-{
- for(int x = 0; x < MATRIX_COLS; x++) {
- _SFR_IO8((col_pins[x] >> 4) + 1) &= ~_BV(col_pins[x] & 0xF);
- _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF);
- }
-}
-
-static matrix_row_t read_cols(void)
-{
- matrix_row_t result = 0;
- for(int x = 0; x < MATRIX_COLS; x++) {
- result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x);
- }
- return result;
-}
-
-static void unselect_rows(void)
-{
- for(int x = 0; x < ROWS_PER_HAND; x++) {
- _SFR_IO8((row_pins[x] >> 4) + 1) &= ~_BV(row_pins[x] & 0xF);
- _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF);
- }
-}
-
-static void select_row(uint8_t row)
-{
- _SFR_IO8((row_pins[row] >> 4) + 1) |= _BV(row_pins[row] & 0xF);
- _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF);
-}
diff --git a/keyboards/dm9records/ergoinu/post_rules.mk b/keyboards/dm9records/ergoinu/post_rules.mk
deleted file mode 100644
index 02aa48104c..0000000000
--- a/keyboards/dm9records/ergoinu/post_rules.mk
+++ /dev/null
@@ -1,9 +0,0 @@
-ifneq ($(strip $(ERGOINU)),)
- ifeq ($(findstring promicroled, $(ERGOINU)), promicroled)
- DISABLE_PROMICRO_LEDs = no
- endif
-endif
-
-ifeq ($(strip $(DISABLE_PROMICRO_LEDs)), yes)
- OPT_DEFS += -DDISABLE_PROMICRO_LEDs
-endif
diff --git a/keyboards/dm9records/ergoinu/readme.md b/keyboards/dm9records/ergoinu/readme.md
index de0a1c6c97..45f91dbac2 100644
--- a/keyboards/dm9records/ergoinu/readme.md
+++ b/keyboards/dm9records/ergoinu/readme.md
@@ -1,13 +1,12 @@
-ErgoInu
-===
+# ErgoInu
![ergoinu](https://i.imgur.com/4CCM8Vl.jpg)
An (Not Portable But Small) Ergonomic Split Keyboard.
-Keyboard Maintainer: [hsgw](https://github.com/hsgw/) [twitter](https://twitter.com/hsgw)
-Hardware Supported: Pro Micro
-Hardware Availability & Repository: [https://github.com/hsgw/ergoinu](https://github.com/hsgw/ergoinu)
+* Keyboard Maintainer: [hsgw](https://github.com/hsgw/) [twitter](https://twitter.com/hsgw)
+* Hardware Supported: Pro Micro
+* Hardware Availability & Repository: [https://github.com/hsgw/ergoinu](https://github.com/hsgw/ergoinu)
Make example for this keyboard (after setting up your build environment):
diff --git a/keyboards/dm9records/ergoinu/rules.mk b/keyboards/dm9records/ergoinu/rules.mk
index 0a634ee794..aba3644c9e 100644
--- a/keyboards/dm9records/ergoinu/rules.mk
+++ b/keyboards/dm9records/ergoinu/rules.mk
@@ -7,20 +7,14 @@ BOOTLOADER = caterina
# Build Options
# change yes to no to disable
#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys
-EXTRAKEY_ENABLE = no # Audio control and System control
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
+COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
-RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
-SUBPROJECT_rev1 = no
-USE_I2C = no # i2c is not supported
-CUSTOM_MATRIX = yes
-SRC += matrix.c serial.c split_util.c
-
-# ergoinu configs
-DISABLE_PROMICRO_LEDs = yes
+SPLIT_KEYBOARD = yes
diff --git a/keyboards/dm9records/ergoinu/serial.c b/keyboards/dm9records/ergoinu/serial.c
deleted file mode 100644
index 5919415877..0000000000
--- a/keyboards/dm9records/ergoinu/serial.c
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * 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"
-
-#ifdef USE_SERIAL
-
-#define _delay_sub_us(x) __builtin_avr_delay_cycles(x)
-
-// Serial pulse period in microseconds.
-#define SELECT_SERIAL_SPEED 1
-#if SELECT_SERIAL_SPEED == 0
- // Very High speed
- #define SERIAL_DELAY 4 // micro sec
- #define READ_WRITE_START_ADJUST 30 // cycles
- #define READ_WRITE_WIDTH_ADJUST 10 // cycles
-#elif SELECT_SERIAL_SPEED == 1
- // High speed
- #define SERIAL_DELAY 6 // micro sec
- #define READ_WRITE_START_ADJUST 23 // cycles
- #define READ_WRITE_WIDTH_ADJUST 10 // cycles
-#elif SELECT_SERIAL_SPEED == 2
- // Middle speed
- #define SERIAL_DELAY 12 // micro sec
- #define READ_WRITE_START_ADJUST 25 // cycles
- #define READ_WRITE_WIDTH_ADJUST 10 // cycles
-#elif SELECT_SERIAL_SPEED == 3
- // Low speed
- #define SERIAL_DELAY 24 // micro sec
- #define READ_WRITE_START_ADJUST 25 // cycles
- #define READ_WRITE_WIDTH_ADJUST 10 // cycles
-#elif SELECT_SERIAL_SPEED == 4
- // Very Low speed
- #define SERIAL_DELAY 50 // micro sec
- #define READ_WRITE_START_ADJUST 25 // cycles
- #define READ_WRITE_WIDTH_ADJUST 10 // cycles
-#else
-#error Illegal Serial Speed
-#endif
-
-
-#define SERIAL_DELAY_HALF1 (SERIAL_DELAY/2)
-#define SERIAL_DELAY_HALF2 (SERIAL_DELAY - SERIAL_DELAY/2)
-
-#define SLAVE_INT_WIDTH 1
-#define SLAVE_INT_RESPONSE_TIME SERIAL_DELAY
-
-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_delay_half1(void) {
- _delay_us(SERIAL_DELAY_HALF1);
-}
-
-inline static
-void serial_delay_half2(void) {
- _delay_us(SERIAL_DELAY_HALF2);
-}
-
-inline static
-void serial_output(void) {
- SERIAL_PIN_DDR |= SERIAL_PIN_MASK;
-}
-
-// make the serial pin an input with pull-up resistor
-inline static
-void serial_input_with_pullup(void) {
- 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_with_pullup();
-
-#if SERIAL_PIN_MASK == _BV(PD0)
- // Enable INT0
- EIMSK |= _BV(INT0);
- // Trigger on falling edge of INT0
- EICRA &= ~(_BV(ISC00) | _BV(ISC01));
-#elif SERIAL_PIN_MASK == _BV(PD2)
- // Enable INT2
- EIMSK |= _BV(INT2);
- // Trigger on falling edge of INT2
- EICRA &= ~(_BV(ISC20) | _BV(ISC21));
-#else
- #error unknown SERIAL_PIN_MASK value
-#endif
-}
-
-// Used by the sender to synchronize timing with the reciver.
-static
-void sync_recv(void) {
- for (int i = 0; i < SERIAL_DELAY*5 && serial_read_pin(); i++ ) {
- }
- // 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());
-}
-
-// Used by the reciver to send a synchronization signal to the sender.
-static
-void sync_send(void) {
- serial_low();
- serial_delay();
- serial_high();
-}
-
-// Reads a byte from the serial line
-static
-uint8_t serial_read_byte(void) {
- uint8_t byte = 0;
- _delay_sub_us(READ_WRITE_START_ADJUST);
- for ( uint8_t i = 0; i < 8; ++i) {
- serial_delay_half1(); // read the middle of pulses
- byte = (byte << 1) | serial_read_pin();
- _delay_sub_us(READ_WRITE_WIDTH_ADJUST);
- serial_delay_half2();
- }
- return byte;
-}
-
-// Sends a byte with MSB ordering
-static
-void serial_write_byte(uint8_t data) {
- uint8_t b = 1<<7;
- while( b ) {
- if(data & b) {
- serial_high();
- } else {
- serial_low();
- }
- b >>= 1;
- serial_delay();
- }
- serial_low(); // sync_send() / senc_recv() need raise edge
-}
-
-// interrupt handle to be used by the slave device
-ISR(SERIAL_PIN_INTERRUPT) {
- serial_output();
-
- // slave send phase
- uint8_t checksum = 0;
- for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) {
- sync_send();
- serial_write_byte(serial_slave_buffer[i]);
- checksum += serial_slave_buffer[i];
- }
- sync_send();
- serial_write_byte(checksum);
-
- // slave switch to input
- sync_send(); //0
- serial_delay_half1(); //1
- serial_low(); //2
- serial_input_with_pullup(); //2
- serial_delay_half1(); //3
-
- // slave recive phase
- uint8_t checksum_computed = 0;
- for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
- sync_recv();
- serial_master_buffer[i] = serial_read_byte();
- checksum_computed += serial_master_buffer[i];
- }
- sync_recv();
- uint8_t checksum_received = serial_read_byte();
-
- if ( checksum_computed != checksum_received ) {
- status |= SLAVE_DATA_CORRUPT;
- } else {
- status &= ~SLAVE_DATA_CORRUPT;
- }
-
- sync_recv(); //weit master output to high
-}
-
-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
-// 2 => checksum error
-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(SLAVE_INT_WIDTH);
-
- // wait for the slaves response
- serial_input_with_pullup();
- _delay_us(SLAVE_INT_RESPONSE_TIME);
-
- // check if the slave is present
- if (serial_read_pin()) {
- // slave failed to pull the line low, assume not present
- serial_output();
- serial_high();
- sei();
- return 1;
- }
-
- // master recive phase
- // if the slave is present syncronize with it
-
- uint8_t checksum_computed = 0;
- // receive data from the slave
- for (int i = 0; i < SERIAL_SLAVE_BUFFER_LENGTH; ++i) {
- sync_recv();
- serial_slave_buffer[i] = serial_read_byte();
- checksum_computed += serial_slave_buffer[i];
- }
- sync_recv();
- uint8_t checksum_received = serial_read_byte();
-
- if (checksum_computed != checksum_received) {
- serial_output();
- serial_high();
- sei();
- return 2;
- }
-
- // master switch to output
- sync_recv(); //0
- serial_delay(); //1
- serial_low(); //3
- serial_output(); // 3
- serial_delay_half1(); //4
-
- // master send phase
- uint8_t checksum = 0;
-
- for (int i = 0; i < SERIAL_MASTER_BUFFER_LENGTH; ++i) {
- sync_send();
- serial_write_byte(serial_master_buffer[i]);
- checksum += serial_master_buffer[i];
- }
- sync_send();
- serial_write_byte(checksum);
-
- // always, release the line when not in use
- sync_send();
-
- sei();
- return 0;
-}
-
-#endif
diff --git a/keyboards/dm9records/ergoinu/serial.h b/keyboards/dm9records/ergoinu/serial.h
deleted file mode 100644
index 67cf06ac6b..0000000000
--- a/keyboards/dm9records/ergoinu/serial.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#pragma once
-
-#include <stdbool.h>
-
-// ////////////////////////////////////////////
-// Need Soft Serial defines in serial_config.h
-// ////////////////////////////////////////////
-// ex.
-// #define SERIAL_PIN_DDR DDRD
-// #define SERIAL_PIN_PORT PORTD
-// #define SERIAL_PIN_INPUT PIND
-// #define SERIAL_PIN_MASK _BV(PD?) ?=0,2
-// #define SERIAL_PIN_INTERRUPT INT?_vect ?=0,2
-// #define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
-// #define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2
-
-// 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);
diff --git a/keyboards/dm9records/ergoinu/serial_config.h b/keyboards/dm9records/ergoinu/serial_config.h
deleted file mode 100644
index a16db684ca..0000000000
--- a/keyboards/dm9records/ergoinu/serial_config.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#pragma once
-
-/* Soft Serial defines */
-#define SERIAL_PIN_DDR DDRD
-#define SERIAL_PIN_PORT PORTD
-#define SERIAL_PIN_INPUT PIND
-#define SERIAL_PIN_MASK _BV(PD2)
-#define SERIAL_PIN_INTERRUPT INT2_vect
-
-#define SERIAL_SLAVE_BUFFER_LENGTH MATRIX_ROWS/2
-#define SERIAL_MASTER_BUFFER_LENGTH MATRIX_ROWS/2
diff --git a/keyboards/dm9records/ergoinu/split_util.c b/keyboards/dm9records/ergoinu/split_util.c
deleted file mode 100644
index 0cbc2c69c4..0000000000
--- a/keyboards/dm9records/ergoinu/split_util.c
+++ /dev/null
@@ -1,56 +0,0 @@
-#include <avr/io.h>
-#include <avr/wdt.h>
-#include <avr/power.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-#include <avr/eeprom.h>
-#include "split_util.h"
-#include "matrix.h"
-#include "keyboard.h"
-
-#include "serial.h"
-
-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) {
- serial_master_init();
-}
-
-static void keyboard_slave_setup(void) {
- serial_slave_init();
-}
-
-bool has_usb(void) {
- USBCON |= (1 << OTGPADE); //enables VBUS pad
- _delay_us(5);
- return (USBSTA & (1<<VBUS)); //checks state of VBUS
-}
-
-void split_keyboard_setup(void) {
- setup_handedness();
-
- if (has_usb()) {
- keyboard_master_setup();
- } else {
- keyboard_slave_setup();
- }
- sei();
-}
-
-// this code runs before the usb and keyboard is initialized
-void matrix_setup(void) {
- split_keyboard_setup();
-}
diff --git a/keyboards/dm9records/ergoinu/split_util.h b/keyboards/dm9records/ergoinu/split_util.h
deleted file mode 100644
index 11cfd5455a..0000000000
--- a/keyboards/dm9records/ergoinu/split_util.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-
-#include <stdbool.h>
-#include "eeconfig.h"
-
-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);
diff --git a/keyboards/duck/jetfire/matrix.c b/keyboards/duck/jetfire/matrix.c
index 2dd94a72ac..729fa6dd14 100644
--- a/keyboards/duck/jetfire/matrix.c
+++ b/keyboards/duck/jetfire/matrix.c
@@ -116,12 +116,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/durgod/boards/DURGOD_STM32_F070/bootloader_defs.h b/keyboards/durgod/boards/DURGOD_STM32_F070/bootloader_defs.h
deleted file mode 100644
index 02c48c4e6d..0000000000
--- a/keyboards/durgod/boards/DURGOD_STM32_F070/bootloader_defs.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Address for jumping to bootloader on STM32 chips. */
-/* It is chip dependent, the correct number can be looked up here (page 175):
- * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
- * This also requires a patch to chibios:
- * <tmk_dir>/tmk_core/tool/chibios/ch-bootloader-jump.patch
- */
-#define STM32_BOOTLOADER_ADDRESS 0x1FFFC800
diff --git a/keyboards/durgod/boards/DURGOD_STM32_F070/chconf.h b/keyboards/durgod/boards/DURGOD_STM32_F070/chconf.h
index a7d95c51a9..d70f188178 100644
--- a/keyboards/durgod/boards/DURGOD_STM32_F070/chconf.h
+++ b/keyboards/durgod/boards/DURGOD_STM32_F070/chconf.h
@@ -21,7 +21,7 @@
#pragma once
-#define CH_CFG_ST_FREQUENCY 10000
+#define CH_CFG_ST_FREQUENCY 1000
#define CH_CFG_ST_TIMEDELTA 0
diff --git a/keyboards/durgod/boards/DURGOD_STM32_F070/mcuconf.h b/keyboards/durgod/boards/DURGOD_STM32_F070/mcuconf.h
index 6d67aa96aa..a24c1cee12 100644
--- a/keyboards/durgod/boards/DURGOD_STM32_F070/mcuconf.h
+++ b/keyboards/durgod/boards/DURGOD_STM32_F070/mcuconf.h
@@ -85,7 +85,7 @@
*/
#define STM32_GPT_USE_TIM1 FALSE
#define STM32_GPT_USE_TIM2 FALSE
-#define STM32_GPT_USE_TIM3 FALSE
+#define STM32_GPT_USE_TIM3 TRUE
#define STM32_GPT_USE_TIM14 FALSE
#define STM32_GPT_TIM1_IRQ_PRIORITY 2
#define STM32_GPT_TIM2_IRQ_PRIORITY 2
diff --git a/keyboards/durgod/dgk6x/config.h b/keyboards/durgod/dgk6x/config.h
index 92673e5c24..a15ed86650 100644
--- a/keyboards/durgod/dgk6x/config.h
+++ b/keyboards/durgod/dgk6x/config.h
@@ -22,6 +22,9 @@
#define VENDOR_ID 0xD60D
#define MANUFACTURER Hoksi Technology
+#define USB_POLLING_INTERVAL_MS 1
+#define WAIT_US_TIMER GPTD3
+
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION ROW2COL
diff --git a/keyboards/durgod/dgk6x/halconf.h b/keyboards/durgod/dgk6x/halconf.h
index 1772f8e410..9c1c6e5280 100644
--- a/keyboards/durgod/dgk6x/halconf.h
+++ b/keyboards/durgod/dgk6x/halconf.h
@@ -19,4 +19,7 @@
#ifdef RGB_MATRIX_ENABLE
#define HAL_USE_I2C TRUE
#endif
+
+#define HAL_USE_GPT TRUE
+
#include_next <halconf.h>
diff --git a/keyboards/durgod/dgk6x/rules.mk b/keyboards/durgod/dgk6x/rules.mk
index 56c5b1ac24..660719104d 100644
--- a/keyboards/durgod/dgk6x/rules.mk
+++ b/keyboards/durgod/dgk6x/rules.mk
@@ -1,9 +1,11 @@
# MCU name
# Actually F070, but close enough
MCU = STM32F072
-
BOARD = DURGOD_STM32_F070
+# Bootloader selection
+BOOTLOADER = stm32-dfu
+
# Do not put the microcontroller into power saving mode
NO_SUSPEND_POWER_DOWN = yes
diff --git a/keyboards/durgod/k3x0/config.h b/keyboards/durgod/k3x0/config.h
index ef73a71016..af543bb970 100644
--- a/keyboards/durgod/k3x0/config.h
+++ b/keyboards/durgod/k3x0/config.h
@@ -23,6 +23,9 @@
#define VENDOR_ID 0xD60D
#define MANUFACTURER Hoksi Technology
+#define USB_POLLING_INTERVAL_MS 1
+#define WAIT_US_TIMER GPTD3
+
/* key matrix size (rows in specific keyboard variant) */
#define MATRIX_COLS 16
diff --git a/keyboards/durgod/k3x0/halconf.h b/keyboards/durgod/k3x0/halconf.h
index fa20fe30a9..d2a9d8c7c0 100644
--- a/keyboards/durgod/k3x0/halconf.h
+++ b/keyboards/durgod/k3x0/halconf.h
@@ -19,4 +19,6 @@
#define HAL_USE_PAL TRUE
#define PAL_USE_CALLBACKS TRUE
+#define HAL_USE_GPT TRUE
+
#include_next <halconf.h>
diff --git a/keyboards/edi/hardlight/mk2/rules.mk b/keyboards/edi/hardlight/mk2/rules.mk
index 5ffab4a55e..b3ff36943f 100644
--- a/keyboards/edi/hardlight/mk2/rules.mk
+++ b/keyboards/edi/hardlight/mk2/rules.mk
@@ -2,7 +2,7 @@
MCU = STM32F072
# Bootloader selection
-Bootloader = stm32-dfu
+BOOTLOADER = stm32-dfu
# Wildcard to allow APM32 MCU
DFU_SUFFIX_ARGS = -v FFFF -p FFFF
diff --git a/keyboards/standaside/config.h b/keyboards/edi/standaside/config.h
index 797a463a15..797a463a15 100644
--- a/keyboards/standaside/config.h
+++ b/keyboards/edi/standaside/config.h
diff --git a/keyboards/standaside/info.json b/keyboards/edi/standaside/info.json
index 797a3419b7..797a3419b7 100644
--- a/keyboards/standaside/info.json
+++ b/keyboards/edi/standaside/info.json
diff --git a/keyboards/standaside/keymaps/default/keymap.c b/keyboards/edi/standaside/keymaps/default/keymap.c
index 0f13cb7632..0f13cb7632 100644
--- a/keyboards/standaside/keymaps/default/keymap.c
+++ b/keyboards/edi/standaside/keymaps/default/keymap.c
diff --git a/keyboards/edi/standaside/readme.md b/keyboards/edi/standaside/readme.md
new file mode 100644
index 0000000000..51911c877d
--- /dev/null
+++ b/keyboards/edi/standaside/readme.md
@@ -0,0 +1,15 @@
+# Stand Aside
+
+![Stand Aside](https://i.imgur.com/X6Katar.png)
+
+A compact 60% keyboard designed by Fate Everywhere. Born out of the desire for a Planck with a numpad for technical work. Available for sale (kit and completed) once the store comes up.
+
+Keyboard Maintainer: [Fate Everywhere](https://github.com/fateeverywhere)
+Hardware Supported: Mark 3 Stand Aside.
+Hardware Availability: Seven Store (https://store.7storm.org).
+
+Make example for this keyboard (after setting up your build environment):
+
+ make edi/standaside: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/standaside/rules.mk b/keyboards/edi/standaside/rules.mk
index 8e4bcc5f9b..8e4bcc5f9b 100644
--- a/keyboards/standaside/rules.mk
+++ b/keyboards/edi/standaside/rules.mk
diff --git a/keyboards/standaside/standaside.c b/keyboards/edi/standaside/standaside.c
index 9f445ec044..9f445ec044 100644
--- a/keyboards/standaside/standaside.c
+++ b/keyboards/edi/standaside/standaside.c
diff --git a/keyboards/standaside/standaside.h b/keyboards/edi/standaside/standaside.h
index 9601f1257c..9601f1257c 100644
--- a/keyboards/standaside/standaside.h
+++ b/keyboards/edi/standaside/standaside.h
diff --git a/keyboards/ergoarrows/readme.md b/keyboards/ergoarrows/readme.md
deleted file mode 100644
index 00932548d1..0000000000
--- a/keyboards/ergoarrows/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# ergoarrows
-
-![ergoarrows](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20210117/20210117011553.png)
-
-This is 76 keys Custom keyboard.
-
-* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
-* Hardware Supported: nknl7 PCB, Pro Micro
-* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/2681816)
-
-Make example for this keyboard (after setting up your build environment):
-
- make ergoarrows:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://salicylic-acid3.hatenablog.com/entry/ergo-arrows-build-guide)
diff --git a/keyboards/ergodox_stm32/matrix.c b/keyboards/ergodox_stm32/matrix.c
index 383bf9790a..094d4a9e0f 100644
--- a/keyboards/ergodox_stm32/matrix.c
+++ b/keyboards/ergodox_stm32/matrix.c
@@ -119,10 +119,6 @@ uint8_t matrix_scan(void) {
return 0;
}
-bool matrix_is_modified(void) {
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col) {
return (matrix[row] & (1 << col));
diff --git a/keyboards/ergodox_stm32/rules.mk b/keyboards/ergodox_stm32/rules.mk
index 3a035cee01..3f7197cbf6 100644
--- a/keyboards/ergodox_stm32/rules.mk
+++ b/keyboards/ergodox_stm32/rules.mk
@@ -1,12 +1,8 @@
# MCU name
MCU = STM32F103
-
MCU_LDSCRIPT = stm32f103_bootloader
BOARD = ST_NUCLEO64_F103RB
-CFLAGS += "-Wno-error=deprecated"
-EXTRAFLAGS = -O0 -g
-
BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
MOUSEKEY_ENABLE = no # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
diff --git a/keyboards/ergotaco/matrix.c b/keyboards/ergotaco/matrix.c
index e5af1c27fd..16300a7e4f 100644
--- a/keyboards/ergotaco/matrix.c
+++ b/keyboards/ergotaco/matrix.c
@@ -199,11 +199,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void) // deprecated and evidently not called.
-{
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/ez_maker/directpins/proton_c/info.json b/keyboards/ez_maker/directpins/proton_c/info.json
index a284e5c41f..e3d000424a 100644
--- a/keyboards/ez_maker/directpins/proton_c/info.json
+++ b/keyboards/ez_maker/directpins/proton_c/info.json
@@ -5,6 +5,7 @@
"debounce": 5,
"processor": "STM32F303",
"board": "QMK_PROTON_C",
+ "bootloader": "stm32-dfu",
"features": {
"bootmagic": true,
"extrakey": true,
diff --git a/keyboards/forever65/info.json b/keyboards/forever65/info.json
index 6cb2442a08..9f5a3539e3 100644
--- a/keyboards/forever65/info.json
+++ b/keyboards/forever65/info.json
@@ -3,6 +3,7 @@
"manufacturer": "Nightingale Studios",
"maintainer": "zvecr",
"processor": "STM32F072",
+ "bootloader": "stm32-dfu",
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["A3", "F1", "F0", "C15", "C14", "C13", "B11", "B10", "B2", "B1", "B0", "A7", "A5", "A6", "A4", "B5"],
diff --git a/keyboards/gboards/gergoplex/matrix.c b/keyboards/gboards/gergoplex/matrix.c
index 716390241a..a075b85725 100644
--- a/keyboards/gboards/gergoplex/matrix.c
+++ b/keyboards/gboards/gergoplex/matrix.c
@@ -152,11 +152,6 @@ uint8_t matrix_scan(void) {
return 1;
}
-bool matrix_is_modified(void) // deprecated and evidently not called.
-{
- 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]; }
diff --git a/keyboards/geminate60/readme.md b/keyboards/geminate60/readme.md
deleted file mode 100644
index 7fab7d7df6..0000000000
--- a/keyboards/geminate60/readme.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Geminate60
-
-![Geminate60](https://www.hualigs.cn/image/600d9391f16d7.jpg)
-
-A 60% keyboard based on STM32F303.
-
-* Keyboard Maintainer: [Weirdo](https://github.com/weirdo-f) ([weirdo-f.github.io](https://))
-* Hardware Supported: Geminate60
-* Hardware Availability: Not yet
-
-Make example for this keyboard (after setting up your build environment):
-
- make geminate60:default
-
-The RST pin and GND pin on the board can be quickly shortened twice to enter DFU mode, and then the program can be written.
-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/georgi/matrix.c b/keyboards/georgi/matrix.c
index 438412102b..7d635ad8d7 100644
--- a/keyboards/georgi/matrix.c
+++ b/keyboards/georgi/matrix.c
@@ -220,11 +220,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void) // deprecated and evidently not called.
-{
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/gergo/matrix.c b/keyboards/gergo/matrix.c
index 655e729356..443e97132b 100644
--- a/keyboards/gergo/matrix.c
+++ b/keyboards/gergo/matrix.c
@@ -273,11 +273,6 @@ uint8_t matrix_scan(void) {
return 1;
}
-bool matrix_is_modified(void) // deprecated and evidently not called.
-{
- 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]; }
diff --git a/keyboards/getta25/getta25.h b/keyboards/getta25/getta25.h
deleted file mode 100644
index ff44820173..0000000000
--- a/keyboards/getta25/getta25.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#pragma once
-
-#include "quantum.h"
-
-#ifdef KEYBOARD_getta25_rev1
- #include "rev1.h"
-#endif
diff --git a/keyboards/getta25/readme.md b/keyboards/getta25/readme.md
deleted file mode 100644
index 886e52a2ea..0000000000
--- a/keyboards/getta25/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# getta25
-
-![getta25](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20191127/20191127005608.png)
-
-This is 25 keys tenkeypad.
-
-* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
-* Hardware Supported: Getta25 PCB, Pro Micro
-* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1700006)
-
-Make example for this keyboard (after setting up your build environment):
-
- make getta25:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://salicylic-acid3.hatenablog.com/entry/getta25-rev2-build-guide)
diff --git a/keyboards/getta25/rules.mk b/keyboards/getta25/rules.mk
deleted file mode 100644
index 54265d2285..0000000000
--- a/keyboards/getta25/rules.mk
+++ /dev/null
@@ -1,21 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = caterina
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-AUDIO_ENABLE = no # Audio output
-RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
-OLED_ENABLE = no
-
-DEFAULT_FOLDER = getta25/rev1
diff --git a/keyboards/gingham/readme.md b/keyboards/gingham/readme.md
deleted file mode 100644
index 089af1cf5e..0000000000
--- a/keyboards/gingham/readme.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# Gingham
-
-![gingham](https://yiancar-designs.com/wp-content/uploads/2019/06/IMG_20190625_233619.jpg)
-
-A 60% keyboard with only through hole components.
-
-Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
-Hardware Supported: ATMEGA328p with vusb [PCB](https://github.com/yiancar/gingham_pcb)
-Hardware Availability: https://yiancar-designs.com/, https://novelkeys.xyz, https://mechboards.co.uk/
-
-Make example for this keyboard (after setting up your build environment):
-
- make gingham:default
-
-Flashing example for this keyboard:
-
- make gingham:default:flash
-
-Bootloader:
-use usbasploader HSGW's my repository.
-https://github.com/hsgw/USBaspLoader/tree/plaid
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/gmmk/pro/ansi/keymaps/cedrikl/keymap.c b/keyboards/gmmk/pro/ansi/keymaps/cedrikl/keymap.c
new file mode 100644
index 0000000000..2361ab5660
--- /dev/null
+++ b/keyboards/gmmk/pro/ansi/keymaps/cedrikl/keymap.c
@@ -0,0 +1,154 @@
+/* Copyright 2021 Cedrik Lussier @cedrikl
+.* Directly inspired from the work of jonavin https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/ansi/keymaps/jonavin
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+#include "rgb_matrix_map.h"
+#include "cedrikl.h"
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+// ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 Prt Rotary(Mute)
+// ~ 1 2 3 4 5 6 7 8 9 0 - (=) BackSpc Del
+// Tab Q W E R T Y U I O P [ ] \ PgUp
+// Caps A S D F G H J K L ; " Enter PgDn
+// Sh_L Z X C V B N M , . ? Sh_R Up End
+// Ct_L Win_L Alt_L SPACE Alt_R FN Ct_R Left Down Right
+
+
+ // The FN key by default maps to a momentary toggle to layer 1 to provide access to the RESET key (to put the board into bootloader mode). Without
+ // this mapping, you have to open the case to hit the button on the bottom of the PCB (near the USB cable attachment) while plugging in the USB
+ // cable to get the board into bootloader mode - definitely not fun when you're working on your QMK builds. Remove this and put it back to KC_RGUI
+ // if that's your preference.
+ //
+ // To put the keyboard in bootloader mode, use FN+backslash. If you accidentally put it into bootloader, you can just unplug the USB cable and
+ // it'll be back to normal when you plug it back in.
+ //
+ // This keyboard defaults to 6KRO instead of NKRO for compatibility reasons (some KVMs and BIOSes are incompatible with NKRO).
+ // Since this is, among other things, a "gaming" keyboard, a key combination to enable NKRO on the fly is provided for convenience.
+ // Press Fn+N to toggle between 6KRO and NKRO. This setting is persisted to the EEPROM and thus persists between restarts.
+ [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_DEL, 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_HOME,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT(
+ EEP_RST, 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_MUTE,
+ KC_NLCK, KC_P1, KC_P2, KC_P3, KC_P4, KC_P5, KC_P6, KC_P7, KC_P8, KC_P9, KC_P0, KC_PMNS, KC_PPLS, KC_BSPC, KC_PSCR,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PSLS, KC_PAST, KC_BSLS, KC_PGUP,
+ KC_CAPS, RGB_VAD, RGB_TOG, RGB_VAI, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_PENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_PDOT, KC_SLSH, KC_RSFT, KC_UP, KC_INS,
+ KC_LCTL, KC_RGUI, KC_LALT, KC_SPC, KC_RALT, KC_NO, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
+// clang-format on
+
+#ifdef ENCODER_ENABLE
+ bool encoder_update_user(uint8_t index, bool clockwise) {
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ return true;
+ }
+#endif // ENCODER_ENABLE
+
+
+#ifdef RGB_MATRIX_ENABLE
+//void set_layer_rgb(uint8_t led_min, uint8_t led_max, int layer) {
+// const ledmap *l = &(ledmaps[layer]);
+//
+//
+//
+// for (int i = 0; i < DRIVER_LED_TOTAL; i++) {
+// HSV hsv = {
+// .h = (*l)[i][0],
+// .s = (*l)[i][1],
+// .v = val,
+// };
+//
+// if (hsv.h || hsv.s) {
+// RGB rgb = hsv_to_rgb(hsv);
+// RGB_MATRIX_INDICATOR_SET_COLOR(i, rgb.r, rgb.g, rgb.b);
+// }
+// }
+//}
+
+ // These shorthands are used below to set led colors on each matrix cycle
+ void loop_colorset(const uint8_t *indices, int array_size, const HSV target_color) {
+ HSV work_color = target_color;
+ work_color.v = rgb_matrix_get_val();
+
+ RGB final_color = hsv_to_rgb(work_color);
+
+ for (int i = 0; i < array_size; i++) {
+ rgb_matrix_set_color(indices[i], final_color.r, final_color.g, final_color.b); // Set color A here
+ }
+ }
+
+ // Capslock, Scroll lock and Numlock indicator on Left side lights.
+ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
+ loop_colorset(LED_REGION_A, (sizeof(LED_REGION_A) / sizeof(LED_REGION_A[0])), hsv_cl_blue);
+ loop_colorset(LED_REGION_B, (sizeof(LED_REGION_B) / sizeof(LED_REGION_B[0])), hsv_cl_purple);
+ loop_colorset(LED_REGION_L_SIDE, (sizeof(LED_REGION_L_SIDE) / sizeof(LED_REGION_L_SIDE[0])), hsv_cl_purple);
+ loop_colorset(LED_REGION_R_SIDE, (sizeof(LED_REGION_R_SIDE) / sizeof(LED_REGION_R_SIDE[0])), hsv_cl_purple);
+
+ switch(get_highest_layer(layer_state)){ // special handling per layer
+ case 1: //layer 1
+ //rgb_matrix_set_color_all(RGB_AZURE);
+ loop_colorset(LED_REGION_NUMPAD, (sizeof(LED_REGION_NUMPAD) / sizeof(LED_REGION_NUMPAD[0])), hsv_cl_numpad);
+ loop_colorset(LED_REGION_OTHER, (sizeof(LED_REGION_OTHER) / sizeof(LED_REGION_OTHER[0])), hsv_cl_mods);
+ break;
+ default: //layer 0
+ //
+ break;
+ break;
+ }
+
+ HSV bad_hsv = hsv_cl_bad;
+ bad_hsv.v = rgb_matrix_get_val();
+ RGB bad_rgb = hsv_to_rgb(bad_hsv);
+ led_t led_state = host_keyboard_led_state();
+
+ if (!led_state.num_lock) { // on if NUM lock is OFF
+ rgb_matrix_set_color(LED_R1, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ rgb_matrix_set_color(LED_R2, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ rgb_matrix_set_color(LED_R3, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ rgb_matrix_set_color(LED_R4, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ rgb_matrix_set_color(LED_R5, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ rgb_matrix_set_color(LED_R6, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ rgb_matrix_set_color(LED_R7, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ rgb_matrix_set_color(LED_R8, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ }
+ if (led_state.caps_lock) {
+ rgb_matrix_set_color(LED_L1, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ rgb_matrix_set_color(LED_L2, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ rgb_matrix_set_color(LED_L3, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ rgb_matrix_set_color(LED_L4, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ rgb_matrix_set_color(LED_L5, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ rgb_matrix_set_color(LED_L6, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ rgb_matrix_set_color(LED_L7, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ rgb_matrix_set_color(LED_L8, bad_rgb.r, bad_rgb.g, bad_rgb.b);
+ loop_colorset(LED_REGION_CAPS, (sizeof(LED_REGION_CAPS) / sizeof(LED_REGION_CAPS[0])), hsv_cl_bad);
+ }
+ }
+#endif
diff --git a/keyboards/gmmk/pro/ansi/keymaps/cedrikl/rgb_matrix_map.h b/keyboards/gmmk/pro/ansi/keymaps/cedrikl/rgb_matrix_map.h
new file mode 100644
index 0000000000..484f64b74c
--- /dev/null
+++ b/keyboards/gmmk/pro/ansi/keymaps/cedrikl/rgb_matrix_map.h
@@ -0,0 +1,185 @@
+/* Copyright 2021 Cedrik Lussier @cedrikl
+.* Directly inspired from the work of jonavin https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/ansi/keymaps/jonavin
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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/>.
+ */
+
+#ifdef RGB_MATRIX_ENABLE
+
+ // Custom RGB Colours
+ const HSV hsv_cl_blue = {150, 255, 255};
+ const HSV hsv_cl_purple = {188, 255, 255};
+ const HSV hsv_cl_numpad = {85, 255, 255};
+ const HSV hsv_cl_mods = {42, 255, 255};
+ const HSV hsv_cl_bad = {0, 255, 255};
+
+ // RGB LED locations
+ enum led_location_map {
+ LED_ESC, // 0, ESC, k13
+ LED_GRV, // 1, ~, k16
+ LED_TAB, // 2, Tab, k11
+ LED_CAPS, // 3, Caps, k21
+ LED_LSFT, // 4, Sh_L, k00
+ LED_LCTL, // 5, Ct_L, k06
+ LED_F1, // 6, F1, k26
+ LED_1, // 7, 1, k17
+ LED_Q, // 8, Q, k10
+ LED_A, // 9, A, k12
+ LED_Z, // 10, Z, k14
+ LED_LWIN, // 11, Win_L, k90
+ LED_F2, // 12, F2, k36
+ LED_2, // 13, 2, k27
+ LED_W, // 14, W, k20
+ LED_S, // 15, S, k22
+ LED_X, // 16, X, k24
+ LED_LALT, // 17, Alt_L, k93
+ LED_F3, // 18, F3, k31
+ LED_3, // 19, 3, k37
+ LED_E, // 20, E, k30
+ LED_D, // 21, D, k32
+ LED_C, // 22, C, k34
+ LED_F4, // 23, F4, k33
+ LED_4, // 24, 4, k47
+ LED_R, // 25, R, k40
+ LED_F, // 26, F, k42
+ LED_V, // 27, V, k44
+ LED_F5, // 28, F5, k07
+ LED_5, // 29, 5, k46
+ LED_T, // 30, T, k41
+ LED_G, // 31, G, k43
+ LED_B, // 32, B, k45
+ LED_SPC, // 33, SPACE, k94
+ LED_F6, // 34, F6, k63
+ LED_6, // 35, 6, k56
+ LED_Y, // 36, Y, k51
+ LED_H, // 37, H, k53
+ LED_N, // 38, N, k55
+ LED_F7, // 39, F7, k71
+ LED_7, // 40, 7, k57
+ LED_U, // 41, U, k50
+ LED_J, // 42, J, k52
+ LED_M, // 43, M, k54
+ LED_F8, // 44, F8, k76
+ LED_8, // 45, 8, k67
+ LED_I, // 46, I, k60
+ LED_K, // 47, K, k62
+ LED_COMM, // 48, ,, k64
+ LED_RALT, // 49, Alt_R, k95
+ LED_F9, // 50, F9, ka6
+ LED_9, // 51, 9, k77
+ LED_O, // 52, O, k70
+ LED_L, // 53, L, k72
+ LED_DOT, // 54, ., k74
+ LED_FN, // 55, FN, k92
+ LED_F10, // 56, F10, ka7
+ LED_0, // 57, 0, k87
+ LED_P, // 58, P, k80
+ LED_SCLN, // 59, ;, k82
+ LED_SLSH, // 60, ?, k85
+ LED_F11, // 61, F11, ka3
+ LED_MINS, // 62, -, k86
+ LED_LBRC, // 63, [, k81
+ LED_QUOT, // 64, ", k83
+ LED_RCTL, // 65, Ct_R, k04
+ LED_F12, // 66, F12, ka5
+ LED_L1, // 67, LED, l01
+ LED_R1, // 68, LED, l11
+ LED_DEL, // 69, Prt, k97 -- remapped to DEL
+ LED_L2, // 70, LED, l02
+ LED_R2, // 71, LED, l12
+ LED_HOME, // 72, Del, k65
+ LED_L3, // 73, LED, l03
+ LED_R3, // 74, LED, l13
+ LED_PGUP, // 75, PgUp, k15
+ LED_L4, // 76, LED, l04
+ LED_R4, // 77, LED, l14
+ LED_EQL, // 78, =, k66
+ LED_RGHT, // 79, Right, k05
+ LED_L5, // 80, LED, l05
+ LED_R5, // 81, LED, l15
+ LED_END, // 82, End, k75
+ LED_L6, // 83, LED, l06
+ LED_R6, // 84, LED, l16
+ LED_BSPC, // 85, BSpc, ka1
+ LED_PGDN, // 86, PgDn, k25
+ LED_L7, // 87, LED, l07
+ LED_R7, // 88, LED, l17
+ LED_RBRC, // 89, ], k61
+ LED_RSFT, // 90, Sh_R, k91
+ LED_L8, // 91, LED, l08
+ LED_R8, // 92, LED, l18
+ LED_BSLS, // 93, \, ka2
+ LED_UP, // 94, Up, k35
+ LED_LEFT, // 95, Left, k03
+ LED_ENT, // 96, Enter, ka4
+ LED_DOWN // 97, Down, k73
+ };
+
+const uint8_t LED_REGION_L_SIDE[] = {LED_L1, LED_L2, LED_L3, LED_L4, LED_L5, LED_L6, LED_L7,LED_L8};
+const uint8_t LED_REGION_R_SIDE[] = {LED_R1, LED_R2, LED_R3, LED_R4, LED_R5, LED_R6, LED_R7,LED_R8};
+
+ //const uint8_t LED_MATRIX[] = {
+ // LED_ESC, LED_F1, LED_F2, LED_F3, LED_F4, LED_F5, LED_F6, LED_F7, LED_F8, LED_F9, LED_F10, LED_F11, LED_F12, LED_DEL,
+ // LED_GRV, LED_1, LED_2, LED_3, LED_4, LED_5, LED_6, LED_7, LED_8, LED_9, LED_0, LED_MINS, LED_EQL, LED_BSPC, LED_HOME,
+ // LED_TAB, LED_Q, LED_W, LED_E, LED_R, LED_T, LED_Y, LED_U, LED_I, LED_O, LED_P, LED_LBRC, LED_RBRC, LED_BSLS, LED_PGUP,
+ // LED_CAPS, LED_A, LED_S, LED_D, LED_F, LED_G, LED_H, LED_J, LED_K, LED_L, LED_SCLN, LED_QUOT, LED_ENT, LED_PGDN,
+ // LED_LSFT, LED_Z, LED_X, LED_C, LED_V, LED_B, LED_N, LED_M, LED_COMM, LED_DOT, LED_SLSH, LED_RSFT, LED_UP, LED_END,
+ // LED_LCTL, LED_LWIN, LED_LALT, LED_SPC, LED_RALT, LED_FN, LED_RCTL, LED_LEFT, LED_DOWN, LED_RGHT
+ //};
+
+ const uint8_t LED_REGION_A[] = {
+ LED_ESC, LED_F9, LED_F10, LED_F11, LED_F12, LED_DEL,
+ LED_GRV, LED_1, LED_0, LED_MINS, LED_EQL, LED_BSPC, LED_HOME,
+ LED_TAB, LED_Q, LED_P, LED_LBRC, LED_RBRC, LED_BSLS, LED_PGUP,
+ LED_CAPS, LED_A, LED_SCLN, LED_QUOT, LED_ENT, LED_PGDN,
+ LED_LSFT, LED_Z, LED_SLSH, LED_RSFT, LED_UP, LED_END,
+ LED_LCTL, LED_LWIN, LED_LALT, LED_RCTL, LED_LEFT, LED_DOWN, LED_RGHT
+ };
+ const uint8_t LED_REGION_B[] = {
+ LED_F1, LED_F2, LED_F3, LED_F4, LED_F5, LED_F6, LED_F7, LED_F8,
+ LED_2, LED_3, LED_4, LED_5, LED_6, LED_7, LED_8, LED_9,
+ LED_W, LED_E, LED_R, LED_T, LED_Y, LED_U, LED_I, LED_O,
+ LED_S, LED_D, LED_F, LED_G, LED_H, LED_J, LED_K, LED_L,
+ LED_X, LED_C, LED_V, LED_B, LED_N, LED_M, LED_COMM, LED_DOT,
+ LED_SPC, LED_RALT, LED_FN
+ };
+
+ const uint8_t LED_REGION_NUMPAD[] = {
+
+ LED_GRV, LED_1, LED_2, LED_3, LED_4, LED_5, LED_6, LED_7, LED_8, LED_9, LED_0, LED_MINS, LED_EQL,
+ LED_LBRC, LED_RBRC,
+ LED_ENT,
+ LED_DOT
+
+ };
+
+ const uint8_t LED_REGION_OTHER[] = {
+ LED_ESC, LED_DEL,
+ LED_HOME,
+
+ LED_A, LED_S, LED_D,
+ LED_END,
+ LED_LWIN
+ };
+
+ const uint8_t LED_REGION_CAPS[] = {
+
+ LED_GRV, LED_1,
+ LED_TAB, LED_Q,
+ LED_CAPS, LED_A,
+ LED_LSFT,
+ LED_LCTL
+ };
+
+#endif
diff --git a/keyboards/gmmk/pro/ansi/keymaps/cedrikl/rules.mk b/keyboards/gmmk/pro/ansi/keymaps/cedrikl/rules.mk
new file mode 100644
index 0000000000..4b7ed8bf0b
--- /dev/null
+++ b/keyboards/gmmk/pro/ansi/keymaps/cedrikl/rules.mk
@@ -0,0 +1,2 @@
+IDLE_TIMEOUT_ENABLE = yes
+STARTUP_NUMLOCK_ON = yes
diff --git a/keyboards/gmmk/pro/iso/keymaps/vitoni/config.h b/keyboards/gmmk/pro/iso/keymaps/vitoni/config.h
new file mode 100644
index 0000000000..fd8f1d6859
--- /dev/null
+++ b/keyboards/gmmk/pro/iso/keymaps/vitoni/config.h
@@ -0,0 +1,20 @@
+// Copyright 2021 Victor Toni (@vitoni)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#if defined(RGB_MATRIX_ENABLE)
+ #define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_COLOR
+ // number of milliseconds to wait until turning off RGB automatically
+ #define RGB_DISABLE_TIMEOUT 300000 // 300 seconds / 5 min
+ // start fading out before getting disabled
+ // fading out is timed (depending on the rgb_matrix_config.speed) to have finished before reaching RGB_DISABLE_TIMEOUT
+ #define RGB_DISABLE_WITH_FADE_OUT
+ #define RGB_DISABLE_WHEN_USB_SUSPENDED
+ // number of milliseconds to wait until activating RGB idle effects
+ #define RGB_IDLE_TIMEOUT 4500 // 4.5 seconds
+ // activate breathe effect when idle
+ #define RGB_IDLE_BREATHE
+ // fade in when we have been suspended
+ #define RGB_FADE_IN
+#endif
diff --git a/keyboards/gmmk/pro/iso/keymaps/vitoni/keymap.c b/keyboards/gmmk/pro/iso/keymaps/vitoni/keymap.c
new file mode 100644
index 0000000000..d5b64c153a
--- /dev/null
+++ b/keyboards/gmmk/pro/iso/keymaps/vitoni/keymap.c
@@ -0,0 +1,148 @@
+// Copyright 2021 Glorious, LLC <salman@pcgamingrace.com>,
+// Copyright 2021 Victor Toni (@vitoni)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+#include "vitoni.h"
+
+enum layer_names {
+ _BASE,
+ _MOV,
+ _RGB
+};
+
+// clang-format off
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+// ESC F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 Prt Rotary(Mute)
+// ~ 1 2 3 4 5 6 7 8 9 0 - (=) BackSpc Del
+// Tab Q W E R T Y U I O P [ ] PgUp
+// Caps A S D F G H J K L ; " # Enter PgDn
+// Sh_L / Z X C V B N M , . ? Sh_R Up End
+// Ct_L Win_L Alt_L SPACE Alt_R FN Ct_R Left Down Right
+
+
+ //
+ // This keyboard defaults to 6KRO instead of NKRO for compatibility reasons (some KVMs and BIOSes are incompatible with NKRO).
+ // Since this is, among other things, a "gaming" keyboard, a key combination to enable NKRO on the fly is provided for convenience.
+ // Press CAPS+N to toggle between 6KRO and NKRO. This setting is persisted to the EEPROM and thus persists between restarts.
+ [_BASE] = LAYOUT(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, 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_PGUP,
+ MO(_MOV), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_END,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, TG(_RGB),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [_MOV] = LAYOUT(
+ RESET, KC_MYCM, KC_WHOM, KC_CALC, KC_MSEL, KC_MPRV, KC_MPLY, KC_MSTP, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, KC_PGUP, _______,
+ _______, _______, _______, _______, _______, _______, _______, KC_HOME, KC_PGDN, KC_END
+ ),
+
+ [_RGB] = LAYOUT(
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RESET, RGB_MOD,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_RMOD,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_TOG, RGB_SPI,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAI, RGB_SPD,
+ _______, _______, _______, _______, _______, _______, _______, RGB_HUD, RGB_SAD, RGB_HUI
+ ),
+
+};
+// clang-format on
+
+#if defined(ENCODER_ENABLE)
+bool encoder_update_user(uint8_t index, bool clockwise) {
+ switch (get_highest_layer(layer_state)) {
+ case _MOV:
+ if (clockwise) {
+ tap_code16(C(KC_TAB));
+ } else {
+ tap_code16(S(C(KC_TAB)));
+ }
+ break;
+#if defined(RGB_MATRIX_ENABLE)
+ case _RGB:
+ if (clockwise) {
+ rgb_matrix_increase_val_noeeprom();
+ } else {
+ rgb_matrix_decrease_val_noeeprom();
+ }
+ break;
+#endif // RGB_MATRIX_ENABLE
+ default:
+ if (clockwise) {
+ tap_code(KC_VOLU);
+ } else {
+ tap_code(KC_VOLD);
+ }
+ break;
+ }
+ return true;
+}
+#endif // ENCODER_ENABLE
+
+#if defined(RGB_MATRIX_ENABLE)
+/*
+* Set up default RGB color.
+*/
+void rgb_matrix_set_default_color(void) {
+ rgb_matrix_sethsv_noeeprom_user(HSV_CHARTREUSE);
+}
+
+/*
+* Set up RGB defaults.
+*/
+void rgb_matrix_configure_default_settings(void) {
+ rgb_matrix_set_default_color();
+}
+
+void keyboard_post_init_user(void) {
+ rgb_matrix_enable_noeeprom();
+ rgb_matrix_configure_default_settings();
+}
+
+/*
+* Use RGB underglow to indicate specific layers.
+*/
+layer_state_t layer_state_set_user(layer_state_t state) {
+ switch (get_highest_layer(state)) {
+ case _MOV:
+ rgb_matrix_sethsv_noeeprom_user(HSV_SPRINGGREEN);
+ break;
+ case _RGB:
+ rgb_matrix_sethsv_noeeprom_user(HSV_GREEN);
+ break;
+ default: // for any other layer
+ rgb_matrix_set_default_color();
+ break;
+ }
+ return state;
+}
+
+void matrix_scan_user(void) {
+ matrix_scan_user_rgb();
+}
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ if (!process_record_user_rgb(keycode, record)) {
+ return false;
+ }
+
+ switch (keycode) {
+ case RESET: // when activating RESET mode for flashing
+ if (record->event.pressed) {
+ rgb_matrix_set_color_all(63, 0, 0);
+ rgb_matrix_driver.flush();
+ }
+ return true;
+ }
+ return true; // Process all other keycodes normally
+}
+#endif // RGB_MATRIX_ENABLE
diff --git a/keyboards/gmmk/pro/iso/keymaps/vitoni/readme.adoc b/keyboards/gmmk/pro/iso/keymaps/vitoni/readme.adoc
new file mode 100644
index 0000000000..38a74a568b
--- /dev/null
+++ b/keyboards/gmmk/pro/iso/keymaps/vitoni/readme.adoc
@@ -0,0 +1,104 @@
+= ViToni's keymap for GMMK Pro ISO
+
+== Layout
+Based on the stock layout but making use of CAPS as FN similar to laptop keyboards.
+This frees up the left row for other uses (although not remapped yet).
+Since both Delete and Insert are used for coding they are part of the CAPS layer as well.
+
+The differences are as follows:
+
+=== Layer 0 (`_BASE`)
+Mostly stock + CAPS goes to layer `_MOV`.
+FN toggles the layer `_RGB`.
+
+=== Layer 1 (`_MOV`), accessed by pressing `CAPS` on layer `_BASE`
+[%header]
+|===
+| Key / Action | Mapped to
+| ESC | _RESET_
+| F1 | KC_MYCM
+| F2 | KC_WHOM
+| F3 | KC_CALC
+| F4 | KC_MSEL
+| F5 | KC_MPRV
+| F6 | KC_MPLY
+| F7 | KC_MSTP
+| F8 | KC_MNXT
+| F9 | KC_MUTE
+| F10 | KC_VOLD
+| F11 | KC_VOLU
+| N | NK_TOGG
+| Delete | Insert
+| Left | Home
+| Right | End
+| Up | PgUp
+| Down | PgDn
+|===
+
+=== Layer 2 (`_RGB`), accessed by pressing `FN` on layer `_BASE`
+Revamped the stock FN layer to focus on RGB only.
+
+[%header]
+|===
+| Key / Action | Mapped to
+| Knob clockwise | Value/Brightness up
+| Knob anti-clockwise | Value/Brightness down
+| Backspace | _RESET_
+| Enter | RGB_TOG
+| Del | RGB_MOD
+| PgUp | RGB_RMOD
+| PgDn | RGB_SPI
+| End | RGB_SPD
+| Left | RGB_HUD
+| Right | RGB_HUI
+| Up | RGB_SAI
+| Down | RGB_SAD
+|===
+
+No other changes have been made.
+
+== RGB light
+
+The code customizing RGB light usage is decribed here:
+
+* link:../../../../../../users/vitoni/readme.adoc[/users/vitoni/readme.adoc]
+
+When using `RGB_DISABLE_TIMEOUT` addtional options are available:
+
+* `RGB_FADE_IN` makes the RGB lights fade in instead of setting the value/brightness to 100% (implicitly due to HSV including the brightness) when resuming after RGB lights have been turned off.
+Fade in occurs when the keyboard is initialized and when the RGB brightness has been changed (e.g. suspending, fade out, etc.).
+* `RGB_DISABLE_WITH_FADE_OUT` activates fade out before the keyboard is disabled by `RGB_DISABLE_TIMEOUT`.
+
+Parameters used to define the behavior are:
+[%header]
+|===
+|Key | Default | Description
+
+| RGB_MATRIX_MAXIMUM_BRIGHTNESS
+| 200 (&lt;= UNIT8_MAX)
+| Maximum assumed value for brightness.
+Used to calculate lead time for fade out before suspend timeout.
+
+|===
+
+`RGB_IDLE_TIMEOUT` enables fading out after being idle for the defined time and allows
+* `RGB_IDLE_BREATHE` also activates a brethe effect while idling.
+
+[%header]
+|===
+|Key | Default | Description
+
+|RGB_IDLE_TIMEOUT
+|4500
+|Time in milliseconds without activity before considered to be idle.
+
+|RGB_IDLE_MINIMUM_BRIGHTNESS
+|`RGB_MATRIX_MAXIMUM_BRIGHTNESS` / 5
+|Brightness value RGB is dimmed to when starting to idle. +
+When breathing used as the lower bound of the brightness value.
+
+|RGB_IDLE_MAXIMUM_BRIGHTNESS
+|`RGB_MATRIX_MAXIMUM_BRIGHTNESS` * 2/5
+|Upper bound of brightness value of the RGB light while breathing.
+
+|===
diff --git a/keyboards/handwired/dactyl/matrix.c b/keyboards/handwired/dactyl/matrix.c
index a21cd08e14..a70e8c5aca 100644
--- a/keyboards/handwired/dactyl/matrix.c
+++ b/keyboards/handwired/dactyl/matrix.c
@@ -281,14 +281,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void) // deprecated and evidently not called.
-{
-#if (DEBOUNCE > 0)
- if (debouncing) return false;
-#endif
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/handwired/frenchdev/matrix.c b/keyboards/handwired/frenchdev/matrix.c
index 5ab254a6f9..a043f78538 100644
--- a/keyboards/handwired/frenchdev/matrix.c
+++ b/keyboards/handwired/frenchdev/matrix.c
@@ -174,12 +174,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/handwired/not_so_minidox/config.h b/keyboards/handwired/not_so_minidox/config.h
index de9286eda5..177552e2a6 100644
--- a/keyboards/handwired/not_so_minidox/config.h
+++ b/keyboards/handwired/not_so_minidox/config.h
@@ -40,6 +40,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define USE_SERIAL
+/*
+ * Split Keyboard specific options, make sure you have 'SPLIT_KEYBOARD = yes' in your rules.mk, and define SOFT_SERIAL_PIN.
+ */
+#define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6
+
//#define EE_HANDS
#define MASTER_LEFT
diff --git a/keyboards/handwired/not_so_minidox/i2c.c b/keyboards/handwired/not_so_minidox/i2c.c
deleted file mode 100644
index 084c890c40..0000000000
--- a/keyboards/handwired/not_so_minidox/i2c.c
+++ /dev/null
@@ -1,162 +0,0 @@
-#include <util/twi.h>
-#include <avr/io.h>
-#include <stdlib.h>
-#include <avr/interrupt.h>
-#include <util/twi.h>
-#include <stdbool.h>
-#include "i2c.h"
-
-#ifdef USE_I2C
-
-// Limits the amount of we wait for any one i2c transaction.
-// Since were running SCL line 100kHz (=> 10μs/bit), and each transactions is
-// 9 bits, a single transaction will take around 90μs to complete.
-//
-// (F_CPU/SCL_CLOCK) => # of μC cycles to transfer a bit
-// poll loop takes at least 8 clock cycles to execute
-#define I2C_LOOP_TIMEOUT (9+1)*(F_CPU/SCL_CLOCK)/8
-
-#define BUFFER_POS_INC() (slave_buffer_pos = (slave_buffer_pos+1)%SLAVE_BUFFER_SIZE)
-
-volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE];
-
-static volatile uint8_t slave_buffer_pos;
-static volatile bool slave_has_register_set = false;
-
-// Wait for an i2c operation to finish
-inline static
-void i2c_delay(void) {
- uint16_t lim = 0;
- while(!(TWCR & (1<<TWINT)) && lim < I2C_LOOP_TIMEOUT)
- lim++;
-
- // easier way, but will wait slightly longer
- // _delay_us(100);
-}
-
-// Setup twi to run at 100kHz
-void i2c_master_init(void) {
- // no prescaler
- TWSR = 0;
- // Set TWI clock frequency to SCL_CLOCK. Need TWBR>10.
- // Check datasheets for more info.
- TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
-}
-
-// Start a transaction with the given i2c slave address. The direction of the
-// transfer is set with I2C_READ and I2C_WRITE.
-// returns: 0 => success
-// 1 => error
-uint8_t i2c_master_start(uint8_t address) {
- TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA);
-
- i2c_delay();
-
- // check that we started successfully
- if ( (TW_STATUS != TW_START) && (TW_STATUS != TW_REP_START))
- return 1;
-
- TWDR = address;
- TWCR = (1<<TWINT) | (1<<TWEN);
-
- i2c_delay();
-
- if ( (TW_STATUS != TW_MT_SLA_ACK) && (TW_STATUS != TW_MR_SLA_ACK) )
- return 1; // slave did not acknowledge
- else
- return 0; // success
-}
-
-
-// Finish the i2c transaction.
-void i2c_master_stop(void) {
- TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
-
- uint16_t lim = 0;
- while(!(TWCR & (1<<TWSTO)) && lim < I2C_LOOP_TIMEOUT)
- lim++;
-}
-
-// Write one byte to the i2c slave.
-// returns 0 => slave ACK
-// 1 => slave NACK
-uint8_t i2c_master_write(uint8_t data) {
- TWDR = data;
- TWCR = (1<<TWINT) | (1<<TWEN);
-
- i2c_delay();
-
- // check if the slave acknowledged us
- return (TW_STATUS == TW_MT_DATA_ACK) ? 0 : 1;
-}
-
-// Read one byte from the i2c slave. If ack=1 the slave is acknowledged,
-// if ack=0 the acknowledge bit is not set.
-// returns: byte read from i2c device
-uint8_t i2c_master_read(int ack) {
- TWCR = (1<<TWINT) | (1<<TWEN) | (ack<<TWEA);
-
- i2c_delay();
- return TWDR;
-}
-
-void i2c_reset_state(void) {
- TWCR = 0;
-}
-
-void i2c_slave_init(uint8_t address) {
- TWAR = address << 0; // slave i2c address
- // TWEN - twi enable
- // TWEA - enable address acknowledgement
- // TWINT - twi interrupt flag
- // TWIE - enable the twi interrupt
- TWCR = (1<<TWIE) | (1<<TWEA) | (1<<TWINT) | (1<<TWEN);
-}
-
-ISR(TWI_vect);
-
-ISR(TWI_vect) {
- uint8_t ack = 1;
- switch(TW_STATUS) {
- case TW_SR_SLA_ACK:
- // this device has been addressed as a slave receiver
- slave_has_register_set = false;
- break;
-
- case TW_SR_DATA_ACK:
- // this device has received data as a slave receiver
- // The first byte that we receive in this transaction sets the location
- // of the read/write location of the slaves memory that it exposes over
- // i2c. After that, bytes will be written at slave_buffer_pos, incrementing
- // slave_buffer_pos after each write.
- if(!slave_has_register_set) {
- slave_buffer_pos = TWDR;
- // don't acknowledge the master if this memory loctaion is out of bounds
- if ( slave_buffer_pos >= SLAVE_BUFFER_SIZE ) {
- ack = 0;
- slave_buffer_pos = 0;
- }
- slave_has_register_set = true;
- } else {
- i2c_slave_buffer[slave_buffer_pos] = TWDR;
- BUFFER_POS_INC();
- }
- break;
-
- case TW_ST_SLA_ACK:
- case TW_ST_DATA_ACK:
- // master has addressed this device as a slave transmitter and is
- // requesting data.
- TWDR = i2c_slave_buffer[slave_buffer_pos];
- BUFFER_POS_INC();
- break;
-
- case TW_BUS_ERROR: // something went wrong, reset twi state
- TWCR = 0;
- default:
- break;
- }
- // Reset everything, so we are ready for the next TWI interrupt
- TWCR |= (1<<TWIE) | (1<<TWINT) | (ack<<TWEA) | (1<<TWEN);
-}
-#endif
diff --git a/keyboards/handwired/not_so_minidox/i2c.h b/keyboards/handwired/not_so_minidox/i2c.h
deleted file mode 100644
index 8910e70f10..0000000000
--- a/keyboards/handwired/not_so_minidox/i2c.h
+++ /dev/null
@@ -1,46 +0,0 @@
-#pragma once
-
-#include <stdint.h>
-
-#ifndef F_CPU
-#define F_CPU 16000000UL
-#endif
-
-#define I2C_READ 1
-#define I2C_WRITE 0
-
-#define I2C_ACK 1
-#define I2C_NACK 0
-
-#define SLAVE_BUFFER_SIZE 0x10
-
-// i2c SCL clock frequency
-#define SCL_CLOCK 400000L
-
-extern volatile uint8_t i2c_slave_buffer[SLAVE_BUFFER_SIZE];
-
-void i2c_master_init(void);
-uint8_t i2c_master_start(uint8_t address);
-void i2c_master_stop(void);
-uint8_t i2c_master_write(uint8_t data);
-uint8_t i2c_master_read(int);
-void i2c_reset_state(void);
-void i2c_slave_init(uint8_t address);
-
-
-static inline unsigned char i2c_start_read(unsigned char addr) {
- return i2c_master_start((addr << 1) | I2C_READ);
-}
-
-static inline unsigned char i2c_start_write(unsigned char addr) {
- return i2c_master_start((addr << 1) | I2C_WRITE);
-}
-
-// from SSD1306 scrips
-extern unsigned char i2c_rep_start(unsigned char addr);
-extern void i2c_start_wait(unsigned char addr);
-extern unsigned char i2c_readAck(void);
-extern unsigned char i2c_readNak(void);
-extern unsigned char i2c_read(unsigned char ack);
-
-#define i2c_read(ack) (ack) ? i2c_readAck() : i2c_readNak();
diff --git a/keyboards/handwired/not_so_minidox/keymaps/default/keymap.c b/keyboards/handwired/not_so_minidox/keymaps/default/keymap.c
index 296a7a281d..435eed2f1f 100644
--- a/keyboards/handwired/not_so_minidox/keymaps/default/keymap.c
+++ b/keyboards/handwired/not_so_minidox/keymaps/default/keymap.c
@@ -8,17 +8,10 @@
#define _QWERTY 0
#define _LOWER 1
#define _RAISE 2
-#define _ADJUST 16
+#define _ADJUST 3
-enum custom_keycodes {
- QWERTY = SAFE_RANGE,
- LOWER,
- RAISE,
- ADJUST,
-};
-
-#define KC_LOWR LOWER
-#define KC_RASE RAISE
+#define KC_LOWR MO(_LOWER)
+#define KC_RASE MO(_RAISE)
#define KC_RST RESET
#define KC_CAD LCTL(LALT(KC_DEL))
@@ -72,45 +65,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
)
};
-
-bool process_record_user(uint16_t keycode, keyrecord_t *record) {
- switch (keycode) {
- case QWERTY:
- if (record->event.pressed) {
- set_single_persistent_default_layer(_QWERTY);
- }
- return false;
- break;
- case LOWER:
- if (record->event.pressed) {
- layer_on(_LOWER);
- update_tri_layer(_LOWER, _RAISE, _ADJUST);
- } else {
- layer_off(_LOWER);
- update_tri_layer(_LOWER, _RAISE, _ADJUST);
- }
- return false;
- break;
- case RAISE:
- if (record->event.pressed) {
- layer_on(_RAISE);
- update_tri_layer(_LOWER, _RAISE, _ADJUST);
- } else {
- layer_off(_RAISE);
- update_tri_layer(_LOWER, _RAISE, _ADJUST);
- }
- return false;
- break;
- case ADJUST:
- if (record->event.pressed) {
- layer_on(_ADJUST);
- update_tri_layer(_LOWER, _RAISE, _ADJUST);
- } else {
- layer_off(_ADJUST);
- update_tri_layer(_LOWER, _RAISE, _ADJUST);
- }
- return false;
- break;
- }
- return true;
+layer_state_t layer_state_set_user(layer_state_t state) {
+ return update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST);
}
diff --git a/keyboards/handwired/not_so_minidox/matrix.c b/keyboards/handwired/not_so_minidox/matrix.c
deleted file mode 100644
index b7cec9370c..0000000000
--- a/keyboards/handwired/not_so_minidox/matrix.c
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
-Copyright 2012 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * scan matrix
- */
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/io.h>
-#include <avr/wdt.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "split_util.h"
-#include "config.h"
-#include "quantum.h"
-
-#ifdef USE_I2C
-# include "i2c.h"
-#else // USE_SERIAL
-# include "serial.h"
-#endif
-
-#ifndef DEBOUNCE
-# define DEBOUNCE 5
-#endif
-
-#define ERROR_DISCONNECT_COUNT 5
-
-static uint8_t debouncing = DEBOUNCE;
-static const int ROWS_PER_HAND = MATRIX_ROWS/2;
-static uint8_t error_count = 0;
-
-static const uint8_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
-static const uint8_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-static matrix_row_t matrix_debouncing[MATRIX_ROWS];
-
-static matrix_row_t read_cols(void);
-static void init_cols(void);
-static void unselect_rows(void);
-static void select_row(uint8_t row);
-
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void)
-{
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void)
-{
- return MATRIX_COLS;
-}
-
-void matrix_init(void)
-{
- debug_enable = true;
- debug_matrix = true;
- debug_mouse = true;
- // initialize row and col
- unselect_rows();
- init_cols();
-
- setPinOutput(B0);
- setPinOutput(D5);
-
- // 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)
-{
- // Right hand is stored after the left in the matirx so, we need to offset it
- int offset = isLeftHand ? 0 : (ROWS_PER_HAND);
-
- for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
- select_row(i);
- _delay_us(30); // without this wait read unstable value.
- matrix_row_t cols = read_cols();
- if (matrix_debouncing[i+offset] != cols) {
- matrix_debouncing[i+offset] = cols;
- debouncing = DEBOUNCE;
- }
- unselect_rows();
- }
-
- if (debouncing) {
- if (--debouncing) {
- _delay_ms(1);
- } else {
- for (uint8_t i = 0; i < ROWS_PER_HAND; i++) {
- matrix[i+offset] = matrix_debouncing[i+offset];
- }
- }
- }
-
- return 1;
-}
-
-#ifdef USE_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)
-{
- int 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
- writePinLow(D5);
-
- error_count++;
-
- if (error_count > ERROR_DISCONNECT_COUNT) {
- // reset other half if disconnected
- int slaveOffset = (isLeftHand) ? (ROWS_PER_HAND) : 0;
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- matrix[slaveOffset+i] = 0;
- }
- }
- } else {
- // turn off the indicator led on no error
- writePinHigh(D5);
- error_count = 0;
- }
- matrix_scan_quantum();
- return ret;
-}
-
-void matrix_slave_scan(void) {
- _matrix_scan();
-
- int offset = (isLeftHand) ? 0 : (MATRIX_ROWS / 2);
-
-#ifdef USE_I2C
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- /* i2c_slave_buffer[i] = matrix[offset+i]; */
- i2c_slave_buffer[i] = matrix[offset+i];
- }
-#else // USE_SERIAL
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- serial_slave_buffer[i] = matrix[offset+i];
- }
-#endif
-}
-
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- return true;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & ((matrix_row_t)1<<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print("\nr/c 0123456789ABCDEF\n");
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row); print(": ");
- print_bin_reverse16(matrix_get_row(row));
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += bitpop16(matrix[i]);
- }
- return count;
-}
-
-static void init_cols(void)
-{
- for(int x = 0; x < MATRIX_COLS; x++) {
- _SFR_IO8((col_pins[x] >> 4) + 1) &= ~_BV(col_pins[x] & 0xF);
- _SFR_IO8((col_pins[x] >> 4) + 2) |= _BV(col_pins[x] & 0xF);
- }
-}
-
-static matrix_row_t read_cols(void)
-{
- matrix_row_t result = 0;
- for(int x = 0; x < MATRIX_COLS; x++) {
- result |= (_SFR_IO8(col_pins[x] >> 4) & _BV(col_pins[x] & 0xF)) ? 0 : (1 << x);
- }
- return result;
-}
-
-static void unselect_rows(void)
-{
- for(int x = 0; x < ROWS_PER_HAND; x++) {
- _SFR_IO8((row_pins[x] >> 4) + 1) &= ~_BV(row_pins[x] & 0xF);
- _SFR_IO8((row_pins[x] >> 4) + 2) |= _BV(row_pins[x] & 0xF);
- }
-}
-
-static void select_row(uint8_t row)
-{
- _SFR_IO8((row_pins[row] >> 4) + 1) |= _BV(row_pins[row] & 0xF);
- _SFR_IO8((row_pins[row] >> 4) + 2) &= ~_BV(row_pins[row] & 0xF);
-}
diff --git a/keyboards/handwired/not_so_minidox/rules.mk b/keyboards/handwired/not_so_minidox/rules.mk
index 3eab0fba7e..8f9772df22 100644
--- a/keyboards/handwired/not_so_minidox/rules.mk
+++ b/keyboards/handwired/not_so_minidox/rules.mk
@@ -7,19 +7,14 @@ BOOTLOADER = caterina
# Build Options
# change yes to no to disable
#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = no # Audio control and System control
+EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
+COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
-RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
-USE_I2C = no
-CUSTOM_MATRIX = yes
-SRC += matrix.c \
- i2c.c \
- split_util.c \
- serial.c
+SPLIT_KEYBOARD = yes
diff --git a/keyboards/handwired/not_so_minidox/serial.c b/keyboards/handwired/not_so_minidox/serial.c
deleted file mode 100644
index 74bcbb6bf6..0000000000
--- a/keyboards/handwired/not_so_minidox/serial.c
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * 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/not_so_minidox/serial.h b/keyboards/handwired/not_so_minidox/serial.h
deleted file mode 100644
index 28fcc56ce7..0000000000
--- a/keyboards/handwired/not_so_minidox/serial.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#pragma once
-
-#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);
diff --git a/keyboards/handwired/not_so_minidox/split_util.c b/keyboards/handwired/not_so_minidox/split_util.c
deleted file mode 100644
index 39639c3b4b..0000000000
--- a/keyboards/handwired/not_so_minidox/split_util.c
+++ /dev/null
@@ -1,84 +0,0 @@
-#include <avr/io.h>
-#include <avr/wdt.h>
-#include <avr/power.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-#include <avr/eeprom.h>
-#include "split_util.h"
-#include "matrix.h"
-#include "keyboard.h"
-#include "config.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) {
-#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/not_so_minidox/split_util.h b/keyboards/handwired/not_so_minidox/split_util.h
deleted file mode 100644
index 807412cd38..0000000000
--- a/keyboards/handwired/not_so_minidox/split_util.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#pragma once
-
-#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);
diff --git a/keyboards/handwired/onekey/teensy_32/rules.mk b/keyboards/handwired/onekey/teensy_32/rules.mk
index c1b90d0d2b..937c9d5103 100644
--- a/keyboards/handwired/onekey/teensy_32/rules.mk
+++ b/keyboards/handwired/onekey/teensy_32/rules.mk
@@ -1,5 +1,8 @@
# MCU name
MCU = MK20DX256
+# Bootloader selection
+BOOTLOADER = halfkay
+
# Enter lower-power sleep mode when on the ChibiOS idle thread
OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
diff --git a/keyboards/handwired/onekey/teensy_lc/rules.mk b/keyboards/handwired/onekey/teensy_lc/rules.mk
index b3daabe317..0e3c7edf7a 100644
--- a/keyboards/handwired/onekey/teensy_lc/rules.mk
+++ b/keyboards/handwired/onekey/teensy_lc/rules.mk
@@ -2,5 +2,8 @@
MCU = MKL26Z64
USE_CHIBIOS_CONTRIB = yes
+# Bootloader selection
+BOOTLOADER = halfkay
+
# Enter lower-power sleep mode when on the ChibiOS idle thread
OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE
diff --git a/keyboards/handwired/promethium/matrix.c b/keyboards/handwired/promethium/matrix.c
index e3a41af288..90dbce14a9 100644
--- a/keyboards/handwired/promethium/matrix.c
+++ b/keyboards/handwired/promethium/matrix.c
@@ -148,14 +148,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
-#if (DEBOUNCE > 0)
- if (debouncing) return false;
-#endif
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
diff --git a/keyboards/handwired/pterodactyl/matrix.c b/keyboards/handwired/pterodactyl/matrix.c
index 21e6a128df..d0f74802a0 100644
--- a/keyboards/handwired/pterodactyl/matrix.c
+++ b/keyboards/handwired/pterodactyl/matrix.c
@@ -282,14 +282,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void) // deprecated and evidently not called.
-{
-#if (DEBOUNCE > 0)
- if (debouncing) return false;
-#endif
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/handwired/tractyl_manuform/4x6_right/rules.mk b/keyboards/handwired/tractyl_manuform/4x6_right/rules.mk
index e83e9a7bba..c497bb2ee8 100644
--- a/keyboards/handwired/tractyl_manuform/4x6_right/rules.mk
+++ b/keyboards/handwired/tractyl_manuform/4x6_right/rules.mk
@@ -21,9 +21,7 @@ RGB_MATRIX_DRIVER = WS2812
POINTING_DEVICE_ENABLE = yes
-MOUSE_SHARED_EP = no
+POINTING_DEVICE_DRIVER = pmw3360
+MOUSE_SHARED_EP = yes
SPLIT_KEYBOARD = yes
-
-SRC += drivers/sensors/pmw3360.c
-QUANTUM_LIB_SRC += spi_master.c tm_sync.c
diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/config.h b/keyboards/handwired/tractyl_manuform/5x6_right/config.h
index d7618912f7..b9d8e86c09 100644
--- a/keyboards/handwired/tractyl_manuform/5x6_right/config.h
+++ b/keyboards/handwired/tractyl_manuform/5x6_right/config.h
@@ -52,5 +52,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define OLED_DISPLAY_128X64
-#define POINTING_DEVICE_TASK_THROTTLE
#define POINTING_DEVICE_RIGHT
diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/keymaps/drashna/keymap.c b/keyboards/handwired/tractyl_manuform/5x6_right/keymaps/drashna/keymap.c
index 958f694172..65f8a5260d 100644
--- a/keyboards/handwired/tractyl_manuform/5x6_right/keymaps/drashna/keymap.c
+++ b/keyboards/handwired/tractyl_manuform/5x6_right/keymaps/drashna/keymap.c
@@ -301,7 +301,7 @@ void oled_driver_render_logo_left(void) {
# endif
oled_set_cursor(6, 3);
# if defined(KEYBOARD_handwired_tractyl_manuform_5x6_right)
- render_pointing_dpi_status(0);
+ render_pointing_dpi_status(kb_config_data.device_cpi, 0);
# endif
oled_set_cursor(0, 4);
}
diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk b/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk
index 37bbbb4dae..a689be3dd5 100644
--- a/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk
+++ b/keyboards/handwired/tractyl_manuform/5x6_right/rules.mk
@@ -18,6 +18,4 @@ MOUSE_SHARED_EP = yes
SPLIT_KEYBOARD = yes
-QUANTUM_LIB_SRC += tm_sync.c
-
DEFAULT_FOLDER = handwired/tractyl_manuform/5x6_right/teensy2pp
diff --git a/keyboards/handwired/tractyl_manuform/config.h b/keyboards/handwired/tractyl_manuform/config.h
index cc8a7546f4..15c8102b8f 100644
--- a/keyboards/handwired/tractyl_manuform/config.h
+++ b/keyboards/handwired/tractyl_manuform/config.h
@@ -39,4 +39,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
-#define SPLIT_TRANSACTION_IDS_KB RPC_ID_KB_CONFIG_SYNC, RPC_ID_POINTER_STATE_SYNC
+#define SPLIT_POINTING_ENABLE
+#define POINTING_DEVICE_TASK_THROTTLE_MS 1
+
+#define SPLIT_TRANSACTION_IDS_KB RPC_ID_KB_CONFIG_SYNC
diff --git a/keyboards/handwired/tractyl_manuform/tm_sync.c b/keyboards/handwired/tractyl_manuform/tm_sync.c
deleted file mode 100644
index 549a17a22f..0000000000
--- a/keyboards/handwired/tractyl_manuform/tm_sync.c
+++ /dev/null
@@ -1,180 +0,0 @@
-/* Copyright 2020 Christopher Courtney, aka Drashna Jael're (@drashna) <drashna@live.com>
- * Copyright 2021 Dasky (@daskygit)
-
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include QMK_KEYBOARD_H
-#include "pointing_device.h"
-#include "transactions.h"
-#include <string.h>
-#ifdef MOUSEKEY_ENABLE
-# include "mousekey.h"
-#endif
-
-// typedef struct {
-// uint16_t device_cpi;
-// } kb_config_data_t;
-
-kb_config_data_t kb_config;
-static report_mouse_t shared_mouse_report;
-extern const pointing_device_driver_t pointing_device_driver;
-
-void kb_pointer_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) {
- shared_mouse_report = pointing_device_driver.get_report(shared_mouse_report);
- memcpy(target2initiator_buffer, &shared_mouse_report, sizeof(report_mouse_t));
- shared_mouse_report.x = 0;
- shared_mouse_report.y = 0;
- shared_mouse_report.h = 0;
- shared_mouse_report.v = 0;
-}
-
-void kb_config_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) {
- if (initiator2target_buffer_size == sizeof(kb_config)) {
- memcpy(&kb_config, initiator2target_buffer, sizeof(kb_config));
- }
-
- static uint16_t cpi = 0;
- // Check if the state values are different
- if (cpi != kb_config.device_cpi) {
- cpi = kb_config.device_cpi;
- if (!is_keyboard_left()) {
- pointing_device_set_cpi(cpi);
- }
- }
-}
-
-void keyboard_pre_init_sync(void) {
- memset(&kb_config, 0, sizeof(kb_config));
- memset(&shared_mouse_report, 0, sizeof(shared_mouse_report));
-}
-
-void keyboard_post_init_sync(void) {
- // Register keyboard state sync split transaction
- transaction_register_rpc(RPC_ID_KB_CONFIG_SYNC, kb_config_sync_handler);
- transaction_register_rpc(RPC_ID_POINTER_STATE_SYNC, kb_pointer_sync_handler);
-}
-
-void housekeeping_task_sync(void) {
- if (is_keyboard_master()) {
- // Keep track of the last state, so that we can tell if we need to propagate to slave
- static kb_config_data_t last_kb_config;
- static uint32_t last_sync = 0;
- bool needs_sync = false;
-
- // Check if the state values are different
- if (memcmp(&kb_config, &last_kb_config, sizeof(kb_config))) {
- needs_sync = true;
- memcpy(&last_kb_config, &kb_config, sizeof(kb_config));
- }
- // Send to slave every 500ms regardless of state change
- if (timer_elapsed32(last_sync) > 500) {
- needs_sync = true;
- }
-
- // Perform the sync if requested
- if (needs_sync) {
- if (transaction_rpc_send(RPC_ID_KB_CONFIG_SYNC, sizeof(kb_config), &kb_config)) {
- last_sync = timer_read32();
- }
- }
- }
-}
-
-void trackball_set_cpi(uint16_t cpi) {
- kb_config.device_cpi = cpi;
- if (!is_keyboard_left()) {
- pointing_device_set_cpi(cpi);
- }
-}
-
-void pointing_device_task(void) {
- if (!is_keyboard_master()) {
- return;
- }
-
-#if defined(POINTING_DEVICE_TASK_THROTTLE)
- static uint32_t last_exec = 0;
- if (timer_elapsed32(last_exec) < 1) {
- return;
- }
- last_exec = timer_read32();
-#endif
-
- report_mouse_t local_report = pointing_device_get_report();
-
- // Gather report info
-#ifdef POINTING_DEVICE_MOTION_PIN
- if (!readPin(POINTING_DEVICE_MOTION_PIN))
-#endif
-#if defined(POINTING_DEVICE_COMBINED)
- local_report = pointing_device_driver.get_report(local_report);
- transaction_rpc_recv(RPC_ID_POINTER_STATE_SYNC, sizeof(report_mouse_t), &shared_mouse_report);
- local_report.x = local_report.x | shared_mouse_report.x;
- local_report.y = local_report.y | shared_mouse_report.y;
- local_report.h = local_report.h | shared_mouse_report.h;
- local_report.v = local_report.v | shared_mouse_report.v;
-#elif defined(POINTING_DEVICE_LEFT)
- if (is_keyboard_left()) {
- local_report = pointing_device_driver.get_report(local_report);
- } else {
- transaction_rpc_recv(RPC_ID_POINTER_STATE_SYNC, sizeof(report_mouse_t), &local_report);
- }
-#elif defined(POINTING_DEVICE_RIGHT)
- if (!is_keyboard_left()) {
- local_report = pointing_device_driver.get_report(local_report);
- } else {
- transaction_rpc_recv(RPC_ID_POINTER_STATE_SYNC, sizeof(report_mouse_t), &local_report);
- }
-#else
-# error "You need to define the side(s) the pointing device is on. POINTING_DEVICE_COMBINED / POINTING_DEVICE_LEFT / POINTING_DEVICE_RIGHT"
-#endif
-
- // Support rotation of the sensor data
-#if defined(POINTING_DEVICE_ROTATION_90) || defined(POINTING_DEVICE_ROTATION_180) || defined(POINTING_DEVICE_ROTATION_270)
- int8_t x = local_report.x, y = local_report.y;
-# if defined(POINTING_DEVICE_ROTATION_90)
- local_report.x = y;
- local_report.y = -x;
-# elif defined(POINTING_DEVICE_ROTATION_180)
- local_report.x = -x;
- local_report.y = -y;
-# elif defined(POINTING_DEVICE_ROTATION_270)
- local_report.x = -y;
- local_report.y = x;
-# else
-# error "How the heck did you get here?!"
-# endif
-#endif
- // Support Inverting the X and Y Axises
-#if defined(POINTING_DEVICE_INVERT_X)
- local_report.x = -local_report.x;
-#endif
-#if defined(POINTING_DEVICE_INVERT_Y)
- local_report.y = -local_report.y;
-#endif
-
- // allow kb to intercept and modify report
- local_report = pointing_device_task_kb(local_report);
- // combine with mouse report to ensure that the combined is sent correctly
-#ifdef MOUSEKEY_ENABLE
- report_mouse_t mousekey_report = mousekey_get_report();
- local_report.buttons = local_report.buttons | mousekey_report.buttons;
-#endif
-#if defined(POINTING_DEVICE_COMBINED)
- local_report.buttons = local_report.buttons | shared_mouse_report.buttons;
-#endif
- pointing_device_set_report(local_report);
- pointing_device_send();
-}
diff --git a/keyboards/handwired/tractyl_manuform/tractyl_manuform.c b/keyboards/handwired/tractyl_manuform/tractyl_manuform.c
index 6095bfb7e2..5bdc57ca09 100644
--- a/keyboards/handwired/tractyl_manuform/tractyl_manuform.c
+++ b/keyboards/handwired/tractyl_manuform/tractyl_manuform.c
@@ -17,7 +17,6 @@
#include "tractyl_manuform.h"
#include "transactions.h"
#include <string.h>
-#include "drivers/sensors/pmw3360.h"
#ifndef TRACKBALL_DPI_OPTIONS
# define TRACKBALL_DPI_OPTIONS \
@@ -31,11 +30,10 @@
#endif
keyboard_config_t keyboard_config;
+kb_config_data_t kb_config_data;
uint16_t dpi_array[] = TRACKBALL_DPI_OPTIONS;
#define DPI_OPTION_SIZE (sizeof(dpi_array) / sizeof(uint16_t))
-
-
bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
if (!process_record_user(keycode, record)) {
return false;
@@ -49,7 +47,8 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
keyboard_config.dpi_config = (keyboard_config.dpi_config + 1) % DPI_OPTION_SIZE;
}
eeconfig_update_kb(keyboard_config.raw);
- trackball_set_cpi(dpi_array[keyboard_config.dpi_config]);
+ kb_config_data.device_cpi = dpi_array[keyboard_config.dpi_config];
+ pointing_device_set_cpi(kb_config_data.device_cpi);
}
#endif
@@ -69,7 +68,6 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
return true;
}
-__attribute__((weak)) void keyboard_pre_init_sync(void) {}
__attribute__((weak)) void keyboard_pre_init_sub(void) {}
void keyboard_pre_init_kb(void) {
// debug_enable = true;
@@ -83,20 +81,22 @@ void keyboard_pre_init_kb(void) {
writePin(DEBUG_LED_PIN, !debug_enable);
#endif
+ memset(&kb_config_data, 0, sizeof(kb_config_data));
+
keyboard_pre_init_sub();
- keyboard_pre_init_sync();
keyboard_pre_init_user();
}
-__attribute__((weak)) void keyboard_post_init_sync(void) {}
-void keyboard_post_init_kb(void) {
- keyboard_post_init_sync();
+void keyboard_post_init_kb(void) {
+ transaction_register_rpc(RPC_ID_KB_CONFIG_SYNC, kb_config_sync_handler);
+
keyboard_post_init_user();
}
#ifdef POINTING_DEVICE_ENABLE
void pointing_device_init_kb(void) {
- trackball_set_cpi(dpi_array[keyboard_config.dpi_config]);
+ kb_config_data.device_cpi = dpi_array[keyboard_config.dpi_config];
+ pointing_device_set_cpi(kb_config_data.device_cpi);
pointing_device_init_user();
}
@@ -111,7 +111,8 @@ report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) {
void eeconfig_init_kb(void) {
keyboard_config.dpi_config = TRACKBALL_DPI_DEFAULT;
#ifdef POINTING_DEVICE_ENABLE
- trackball_set_cpi(dpi_array[keyboard_config.dpi_config]);
+ kb_config_data.device_cpi = dpi_array[keyboard_config.dpi_config];
+ pointing_device_set_cpi(kb_config_data.device_cpi);
#endif
eeconfig_update_kb(keyboard_config.raw);
eeconfig_init_user();
@@ -135,12 +136,39 @@ void matrix_scan_kb(void) {
matrix_scan_user();
}
-__attribute__((weak)) void housekeeping_task_sync(void) {}
-void housekeeping_task_kb(void) {
- housekeeping_task_sync();
+void housekeeping_task_kb(void) {
+ if (is_keyboard_master()) {
+ // Keep track of the last state, so that we can tell if we need to propagate to slave
+ static kb_config_data_t last_kb_config;
+ static uint32_t last_sync = 0;
+ bool needs_sync = false;
+
+ // Check if the state values are different
+ if (memcmp(&kb_config_data, &last_kb_config, sizeof(kb_config_data))) {
+ needs_sync = true;
+ memcpy(&last_kb_config, &kb_config_data, sizeof(kb_config_data));
+ }
+ // Send to slave every 500ms regardless of state change
+ if (timer_elapsed32(last_sync) > 500) {
+ needs_sync = true;
+ }
+
+ // Perform the sync if requested
+ if (needs_sync) {
+ if (transaction_rpc_send(RPC_ID_KB_CONFIG_SYNC, sizeof(kb_config_data), &kb_config_data)) {
+ last_sync = timer_read32();
+ }
+ }
+ }
// no need for user function, is called already
}
+void kb_config_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer) {
+ if (initiator2target_buffer_size == sizeof(kb_config_data)) {
+ memcpy(&kb_config_data, initiator2target_buffer, sizeof(kb_config_data));
+ }
+}
+
#ifdef POINTING_DEVICE_ENABLE
void matrix_power_up(void) { pointing_device_task(); }
#endif
diff --git a/keyboards/handwired/tractyl_manuform/tractyl_manuform.h b/keyboards/handwired/tractyl_manuform/tractyl_manuform.h
index 6aa40fc18b..3f8aca4551 100644
--- a/keyboards/handwired/tractyl_manuform/tractyl_manuform.h
+++ b/keyboards/handwired/tractyl_manuform/tractyl_manuform.h
@@ -32,21 +32,26 @@ typedef union {
};
} keyboard_config_t;
+typedef union {
+ uint32_t raw;
+ struct {
+ uint16_t device_cpi;
+ };
+} kb_config_data_t;
+
extern keyboard_config_t keyboard_config;
+extern kb_config_data_t kb_config_data;
enum ploopy_keycodes {
DPI_CONFIG = SAFE_RANGE,
KEYMAP_SAFE_RANGE,
};
-typedef struct {
- uint16_t device_cpi;
-} kb_config_data_t;
-
-void trackball_set_cpi(uint16_t cpi);
void matrix_init_sub_kb(void);
void matrix_scan_sub_kb(void);
void keyboard_pre_init_sync(void);
void keyboard_post_init_sync(void);
void housekeeping_task_sync(void);
+
+void kb_config_sync_handler(uint8_t initiator2target_buffer_size, const void* initiator2target_buffer, uint8_t target2initiator_buffer_size, void* target2initiator_buffer);
diff --git a/keyboards/handwired/wakizashi40/config.h b/keyboards/handwired/wakizashi40/config.h
new file mode 100644
index 0000000000..78f85f2197
--- /dev/null
+++ b/keyboards/handwired/wakizashi40/config.h
@@ -0,0 +1,20 @@
+/* Copyright 2021 xiao (@xia0)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "config_common.h"
+#define DYNAMIC_KEYMAP_LAYER_COUNT 12
diff --git a/keyboards/handwired/wakizashi40/info.json b/keyboards/handwired/wakizashi40/info.json
new file mode 100644
index 0000000000..b64ab55116
--- /dev/null
+++ b/keyboards/handwired/wakizashi40/info.json
@@ -0,0 +1,88 @@
+{
+ "manufacturer": "fumbucker",
+ "keyboard_name": "Wakizashi 40",
+ "maintainer": "fumbucker",
+ "debounce": 5,
+ "processor": "at90usb1286",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "audio": false,
+ "backlight": false,
+ "bluetooth": false,
+ "bootmagic": true,
+ "command": false,
+ "console": true,
+ "extrakey": true,
+ "midi": false,
+ "mousekey": true,
+ "nkro": true,
+ "rgblight": false,
+ "unicode": false
+ },
+ "matrix_pins": {
+ "cols": ["C5", "C4", "D2", "D3", "D4", "D5", "C6", "D7", "B0", "B1", "B2", "B3", "B4"],
+ "rows": ["C0", "C1", "C2", "C3"]
+ },
+ "usb": {
+ "device_ver": "0x0001",
+ "pid": "0x7740",
+ "vid": "0x6662"
+ },
+ "layout_aliases": {
+ "LAYOUT": "LAYOUT_all"
+ },
+ "layouts": {
+ "LAYOUT_all": {
+ "layout": [
+ { "label": "TAB", "matrix": [0, 0], "w": 1.5, "x": 0, "y": 0 },
+ { "label": "Q", "matrix": [0, 2], "w": 1, "x": 1.5, "y": 0 },
+ { "label": "W", "matrix": [0, 3], "w": 1, "x": 2.5, "y": 0 },
+ { "label": "E", "matrix": [0, 4], "w": 1, "x": 3.5, "y": 0 },
+ { "label": "R", "matrix": [0, 5], "w": 1, "x": 4.5, "y": 0 },
+ { "label": "T", "matrix": [0, 6], "w": 1, "x": 5.5, "y": 0 },
+ { "label": "Y", "matrix": [0, 7], "w": 1, "x": 6.5, "y": 0 },
+ { "label": "U", "matrix": [0, 8], "w": 1, "x": 7.5, "y": 0 },
+ { "label": "I", "matrix": [0, 9], "w": 1, "x": 8.5, "y": 0 },
+ { "label": "O", "matrix": [0, 10], "w": 1, "x": 9.5, "y": 0 },
+ { "label": "P", "matrix": [0, 11], "w": 1, "x": 10.5, "y": 0 },
+ { "label": "BACKSPACE", "matrix": [0, 12], "w": 1.5, "x": 11.5, "y": 0 },
+
+ { "label": "CAPSLOCK", "matrix": [1, 0], "w": 1.25, "x": 0, "y": 1 },
+ { "label": "A", "matrix": [1, 1], "w": 1, "x": 1.25, "y": 1 },
+ { "label": "S", "matrix": [1, 2], "w": 1, "x": 2.25, "y": 1 },
+ { "label": "D", "matrix": [1, 3], "w": 1, "x": 3.25, "y": 1 },
+ { "label": "F", "matrix": [1, 4], "w": 1, "x": 4.25, "y": 1 },
+ { "label": "G", "matrix": [1, 5], "w": 1, "x": 5.75, "y": 1 },
+ { "label": "H", "matrix": [1, 7], "w": 1, "x": 6.75, "y": 1 },
+ { "label": "J", "matrix": [1, 8], "w": 1, "x": 7.75, "y": 1 },
+ { "label": "K", "matrix": [1, 9], "w": 1, "x": 8.75, "y": 1 },
+ { "label": "L", "matrix": [1, 10], "w": 1, "x": 9.75, "y": 1 },
+ { "label": "SEMICOLON", "matrix": [1, 11], "w": 1, "x": 10.75, "y": 1 },
+ { "label": "ENTER", "matrix": [1, 12], "w": 1.25, "x": 11.75, "y": 1 },
+
+ { "label": "LSHIFT", "matrix": [2, 0], "w": 1, "x": 0, "y": 2 },
+ { "label": "Z", "matrix": [2, 1], "w": 1, "x": 1, "y": 2 },
+ { "label": "X", "matrix": [2, 2], "w": 1, "x": 2, "y": 2 },
+ { "label": "C", "matrix": [2, 3], "w": 1, "x": 3, "y": 2 },
+ { "label": "V", "matrix": [2, 4], "w": 1, "x": 4, "y": 2 },
+ { "label": "B", "matrix": [2, 5], "w": 1, "x": 5, "y": 2 },
+ { "label": "ESCAPE", "matrix": [2, 6], "w": 1, "x": 6, "y": 2 },
+ { "label": "N", "matrix": [2, 7], "w": 1, "x": 7, "y": 2 },
+ { "label": "M", "matrix": [2, 8], "w": 1, "x": 8, "y": 2 },
+ { "label": "COMMA", "matrix": [2, 9], "w": 1, "x": 9, "y": 2 },
+ { "label": "PERIOD", "matrix": [2, 10], "w": 1, "x": 10, "y": 2 },
+ { "label": "SLASH", "matrix": [2, 11], "w": 1, "x": 11, "y": 2 },
+ { "label": "RSHIFT", "matrix": [2, 12], "w": 1, "x": 12, "y": 2 },
+
+ { "label": "LCTRL", "matrix": [3, 0], "w": 1.25, "x": 0, "y": 3 },
+ { "label": "LWIN", "matrix": [3, 1], "w": 1.25, "x": 1.25, "y": 3 },
+ { "label": "LALT", "matrix": [3, 3], "w": 1.25, "x": 2.5, "y": 3 },
+ { "label": "SPACE1", "matrix": [3, 5], "w": 2.75, "x": 3.75, "y": 3 },
+ { "label": "SPACE2", "matrix": [3, 7], "w": 2.75, "x": 6.5, "y": 3 },
+ { "label": "RALT", "matrix": [3, 9], "w": 1.25, "x": 9.25, "y": 3 },
+ { "label": "MENU", "matrix": [3, 11], "w": 1.25, "x": 10.5, "y": 3 },
+ { "label": "RCTRL", "matrix": [3, 12], "w": 1.25, "x": 11.75, "y": 3 }
+ ]
+ }
+ }
+}
diff --git a/keyboards/handwired/wakizashi40/keymaps/default/keymap.c b/keyboards/handwired/wakizashi40/keymaps/default/keymap.c
new file mode 100644
index 0000000000..910e5bde12
--- /dev/null
+++ b/keyboards/handwired/wakizashi40/keymaps/default/keymap.c
@@ -0,0 +1,44 @@
+/* Copyright 2021 xiao (@xia0)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_all(
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ MO(3), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ESC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, LT(1, KC_SPC), LT(2, KC_SPC), KC_LALT, KC_MENU, KC_LCTL),
+
+ [1] = LAYOUT_all(
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F5, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ MO(3), 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_MINS, KC_TRNS, KC_EQL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSLS,
+ MO(11), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_QUOT,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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_QUOT,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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/wakizashi40/keymaps/via/keymap.c b/keyboards/handwired/wakizashi40/keymaps/via/keymap.c
new file mode 100644
index 0000000000..d456b8b40a
--- /dev/null
+++ b/keyboards/handwired/wakizashi40/keymaps/via/keymap.c
@@ -0,0 +1,92 @@
+/* Copyright 2021 xiao (@xia0)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include QMK_KEYBOARD_H
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT_all(
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
+ MO(3), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_ESC, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
+ KC_LCTL, KC_LGUI, KC_LALT, LT(1, KC_SPC), LT(2, KC_SPC), KC_LALT, KC_MENU, KC_LCTL),
+
+ [1] = LAYOUT_all(
+ KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F5, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12,
+ MO(11), 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_MINS, KC_TRNS, KC_EQL, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [2] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_BSLS,
+ MO(11), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, KC_TRNS, KC_QUOT,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_SPC, KC_SPC, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [3] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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_QUOT,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, 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_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [5] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [6] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [7] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [8] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [9] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [10] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
+
+ [11] = LAYOUT_all(
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
+ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
+
+};
diff --git a/keyboards/handwired/wakizashi40/keymaps/via/rules.mk b/keyboards/handwired/wakizashi40/keymaps/via/rules.mk
new file mode 100644
index 0000000000..7a49719505
--- /dev/null
+++ b/keyboards/handwired/wakizashi40/keymaps/via/rules.mk
@@ -0,0 +1,4 @@
+# rules.mk overrides to enable VIA
+
+VIA_ENABLE = yes
+LTO_ENABLE = yes
diff --git a/keyboards/handwired/wakizashi40/readme.md b/keyboards/handwired/wakizashi40/readme.md
new file mode 100644
index 0000000000..d94a75651c
--- /dev/null
+++ b/keyboards/handwired/wakizashi40/readme.md
@@ -0,0 +1,19 @@
+# Wakizashi 40
+
+![Wakizashi40](https://cdn.thingiverse.com/renders/51/50/81/13/a9/7078248666f70b422127c6662cf79563_preview_featured.jpg)
+
+Reverse stagger 40% keyboard based on the Katana 60.
+
+* Keyboard Maintainer: [fumbucker](https://github.com/xia0)
+* Hardware Supported: Teensy2++
+* Hardware Availability: [thingiverse](https://www.thingiverse.com/thing:3467930)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make handwired/wakizashi40:default
+
+See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information.
+
+## Bootloader
+
+* **Keycode in layout**: Press the key mapped to `RESET` if it is available (Capslock + R).
diff --git a/keyboards/handwired/wakizashi40/rules.mk b/keyboards/handwired/wakizashi40/rules.mk
new file mode 100644
index 0000000000..6e7633bfe0
--- /dev/null
+++ b/keyboards/handwired/wakizashi40/rules.mk
@@ -0,0 +1 @@
+# This file intentionally left blank
diff --git a/keyboards/helix/pico/matrix.c b/keyboards/helix/pico/matrix.c
index b18213d846..039cca6dcf 100644
--- a/keyboards/helix/pico/matrix.c
+++ b/keyboards/helix/pico/matrix.c
@@ -273,12 +273,6 @@ void matrix_slave_scan(void) {
#endif
}
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/helix/rev1/matrix.c b/keyboards/helix/rev1/matrix.c
index aa2cc76905..f59391b596 100644
--- a/keyboards/helix/rev1/matrix.c
+++ b/keyboards/helix/rev1/matrix.c
@@ -239,12 +239,6 @@ void matrix_slave_scan(void) {
#endif
}
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/helix/rev2/matrix.c b/keyboards/helix/rev2/matrix.c
index 8eed7e58b7..699c15358b 100644
--- a/keyboards/helix/rev2/matrix.c
+++ b/keyboards/helix/rev2/matrix.c
@@ -287,12 +287,6 @@ void matrix_slave_scan(void) {
#endif
}
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/hhkb/ansi/matrix.c b/keyboards/hhkb/ansi/matrix.c
index 529ba8b8fc..5dde74cce9 100644
--- a/keyboards/hhkb/ansi/matrix.c
+++ b/keyboards/hhkb/ansi/matrix.c
@@ -163,15 +163,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- if (matrix[i] != matrix_prev[i])
- return true;
- }
- return false;
-}
-
inline
bool matrix_has_ghost(void)
{
diff --git a/keyboards/hhkb/jp/matrix.c b/keyboards/hhkb/jp/matrix.c
index c0dca6a990..81db77fca7 100644
--- a/keyboards/hhkb/jp/matrix.c
+++ b/keyboards/hhkb/jp/matrix.c
@@ -164,15 +164,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- if (matrix[i] != matrix_prev[i])
- return true;
- }
- return false;
-}
-
inline
bool matrix_has_ghost(void)
{
diff --git a/keyboards/hid_liber/matrix.c b/keyboards/hid_liber/matrix.c
index ff59a17153..da73c616d7 100755
--- a/keyboards/hid_liber/matrix.c
+++ b/keyboards/hid_liber/matrix.c
@@ -218,12 +218,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
- // NOTE: no longer used
- return true;
-}
-
inline
bool matrix_has_ghost(void)
{
diff --git a/keyboards/honeycomb/config.h b/keyboards/honeycomb/config.h
index 725f9490cb..c959543618 100755
--- a/keyboards/honeycomb/config.h
+++ b/keyboards/honeycomb/config.h
@@ -45,12 +45,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
-
-//UART settings for communication with the RF microcontroller
-#define SERIAL_UART_BAUD 1000000
-#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
-#define SERIAL_UART_INIT_CUSTOM \
- /* enable TX and RX */ \
- UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
- /* 8-bit data */ \
- UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
diff --git a/keyboards/honeycomb/honeycomb.c b/keyboards/honeycomb/honeycomb.c
index 1254196d39..603400c7a3 100755
--- a/keyboards/honeycomb/honeycomb.c
+++ b/keyboards/honeycomb/honeycomb.c
@@ -7,7 +7,7 @@ void pointing_device_task(void){
uint32_t timeout = 0;
//the m character requests the RF slave to send the mouse report
- SERIAL_UART_DATA = 'm';
+ uart_write('m');
//trust the external inputs completely, erase old data
uint8_t uart_data[5] = {0};
@@ -17,7 +17,7 @@ void pointing_device_task(void){
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
- while(!SERIAL_UART_RXD_PRESENT){
+ while(!uart_available()){
timeout++;
if (timeout > 10000){
xprintf("\r\nTIMED OUT");
@@ -25,7 +25,7 @@ void pointing_device_task(void){
}
}
xprintf("\r\nGOT DATA for %d",i);
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
//check for the end packet, bytes 1-4 are movement and scroll
diff --git a/keyboards/honeycomb/matrix.c b/keyboards/honeycomb/matrix.c
index 7fef6f0fd8..fe1e4ce8ff 100755
--- a/keyboards/honeycomb/matrix.c
+++ b/keyboards/honeycomb/matrix.c
@@ -30,7 +30,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "honeycomb.h"
#include "pointing_device.h"
#include "report.h"
-#include "protocol/serial.h"
+#include "uart.h"
#if (MATRIX_COLS <= 8)
# define print_matrix_header() print("\nr/c 01234567\n")
@@ -95,7 +95,7 @@ uint8_t matrix_cols(void) {
void matrix_init(void) {
matrix_init_quantum();
- serial_init();
+ uart_init(1000000);
}
uint8_t matrix_scan(void)
@@ -103,7 +103,7 @@ uint8_t matrix_scan(void)
uint32_t timeout = 0;
// The 's' character requests the RF slave to send the matrix
- SERIAL_UART_DATA = 's';
+ uart_write('s');
// Trust the external keystates entirely, erase the last data
uint8_t uart_data[4] = {0};
@@ -113,14 +113,14 @@ uint8_t matrix_scan(void)
// Wait for the serial data, timeout if it's been too long
// This only happened in testing with a loose wire, but does no
// harm to leave it in here
- while(!SERIAL_UART_RXD_PRESENT){
+ while(!uart_available()){
timeout++;
if (timeout > 10000){
xprintf("\r\nTime out in keyboard.");
break;
}
}
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
// Check for the end packet, it's our checksum.
diff --git a/keyboards/honeycomb/rules.mk b/keyboards/honeycomb/rules.mk
index 2b5eb0360c..a6029e3dbf 100755
--- a/keyboards/honeycomb/rules.mk
+++ b/keyboards/honeycomb/rules.mk
@@ -18,4 +18,5 @@ NKRO_ENABLE = yes # Enable N-Key Rollover
# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
# # project specific files
-SRC += matrix.c serial_uart.c
+SRC += matrix.c
+QUANTUM_LIB_SRC += uart.c
diff --git a/keyboards/id67/readme.md b/keyboards/id67/readme.md
deleted file mode 100644
index 7949ee1af2..0000000000
--- a/keyboards/id67/readme.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# IDOBAO ID67
-
-A 65% hotswap keyboard from IDOBAO.
-
-## ANSI support:
-
-* Keyboard Maintainer: Tybera
-* Hardware Supported: IDOBAO ID67
-* Hardware Availability: [IDOBAO](https://www.idobao.net/products/idobao-id67-65-hot-swappable-mechanical-keyboard-kit-1)
-
-## Variants
-
-Currently there are two variants for the id67:
-1. `rgb_default` which uses the `RGB Lightning` feature for the on-board LEDs.
-2. `rgb` which uses the more advanced `RGB Matrix` feature for the per-key and underglow (bottom of PCB) LEDs.
-
-Make examples for this keyboard (after setting up your build environment):
-
- make id67/default_rgb:default
-
- make id67/rgb:default
-
-Flashing examples for this keyboard:
-
- make id67/default_rgb:default:flash
-
- make id67/rgb:default:flash
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/id80/readme.md b/keyboards/id80/readme.md
deleted file mode 100644
index 016d2a177f..0000000000
--- a/keyboards/id80/readme.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# IDOBAO ID80
-
-![ID80](https://ae01.alicdn.com/kf/H0f617c6129c24cfaa26a8c9e8e54851aj.jpg)
-
-A 75% hotswap keyboard from IDOBAO.
-
-## ANSI support:
-
-* Keyboard Maintainer: [Sergey Vlasov](https://github.com/sigprof)
-* Hardware Supported: IDOBAO ID80
-* Hardware Availability: [AliExpress](https://www.aliexpress.com/item/4000590804514.html), [Drop](https://drop.com/buy/idobao-id80-75-hot-swappable-mechanical-keyboard-kit?mode=guest_open)
-
-Make example for this keyboard (after setting up your build environment):
-
- make id80/ansi:default
-
-## ISO support:
-
-* Keyboard Maintainer: [Carsten Rose](https://github.com/cwr10010)
-* Hardware Supported: IDOBAO ID80v2
-* Hardware Availability: [IDOBAO](https://www.idobao.net/products/idobao-id80v2-75-hot-swappable-mechanical-keyboard-kit)
-
-Make example for this keyboard (after setting up your build environment):
-
- make id80/iso:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/id80/rules.mk b/keyboards/id80/rules.mk
deleted file mode 100644
index eea8b69900..0000000000
--- a/keyboards/id80/rules.mk
+++ /dev/null
@@ -1,24 +0,0 @@
-# Defalt to the ansi version
-DEFAULT_FOLDER = id80/ansi
-
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = atmel-dfu
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = yes # Enable N-Key Rollover
-BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
-AUDIO_ENABLE = no # Audio output
-
-# partially generated by KBFirmware JSON to QMK Parser
-# https://noroadsleft.github.io/kbf_qmk_converter/
diff --git a/keyboards/id67/default_rgb/config.h b/keyboards/idobao/id67/default_rgb/config.h
index fbf99cf673..fbf99cf673 100644
--- a/keyboards/id67/default_rgb/config.h
+++ b/keyboards/idobao/id67/default_rgb/config.h
diff --git a/keyboards/id67/default_rgb/default_rgb.c b/keyboards/idobao/id67/default_rgb/default_rgb.c
index 972b0b8b06..972b0b8b06 100644
--- a/keyboards/id67/default_rgb/default_rgb.c
+++ b/keyboards/idobao/id67/default_rgb/default_rgb.c
diff --git a/keyboards/id67/default_rgb/default_rgb.h b/keyboards/idobao/id67/default_rgb/default_rgb.h
index 7c0a6d5aa8..7c0a6d5aa8 100644
--- a/keyboards/id67/default_rgb/default_rgb.h
+++ b/keyboards/idobao/id67/default_rgb/default_rgb.h
diff --git a/keyboards/id67/default_rgb/info.json b/keyboards/idobao/id67/default_rgb/info.json
index f3114121c1..f3114121c1 100644
--- a/keyboards/id67/default_rgb/info.json
+++ b/keyboards/idobao/id67/default_rgb/info.json
diff --git a/keyboards/id67/default_rgb/readme.md b/keyboards/idobao/id67/default_rgb/readme.md
index 9559384f1e..9559384f1e 100644
--- a/keyboards/id67/default_rgb/readme.md
+++ b/keyboards/idobao/id67/default_rgb/readme.md
diff --git a/keyboards/id67/default_rgb/rules.mk b/keyboards/idobao/id67/default_rgb/rules.mk
index 574f0067fb..574f0067fb 100644
--- a/keyboards/id67/default_rgb/rules.mk
+++ b/keyboards/idobao/id67/default_rgb/rules.mk
diff --git a/keyboards/id67/keymaps/default/keymap.c b/keyboards/idobao/id67/keymaps/default/keymap.c
index 3bb880891f..3bb880891f 100644
--- a/keyboards/id67/keymaps/default/keymap.c
+++ b/keyboards/idobao/id67/keymaps/default/keymap.c
diff --git a/keyboards/id67/keymaps/via/keymap.c b/keyboards/idobao/id67/keymaps/via/keymap.c
index 8155067b9f..8155067b9f 100644
--- a/keyboards/id67/keymaps/via/keymap.c
+++ b/keyboards/idobao/id67/keymaps/via/keymap.c
diff --git a/keyboards/id67/keymaps/via/rules.mk b/keyboards/idobao/id67/keymaps/via/rules.mk
index ca9fed0e6b..ca9fed0e6b 100644
--- a/keyboards/id67/keymaps/via/rules.mk
+++ b/keyboards/idobao/id67/keymaps/via/rules.mk
diff --git a/keyboards/idobao/id67/readme.md b/keyboards/idobao/id67/readme.md
new file mode 100644
index 0000000000..134d45b18e
--- /dev/null
+++ b/keyboards/idobao/id67/readme.md
@@ -0,0 +1,29 @@
+# IDOBAO ID67
+
+A 65% hotswap keyboard from IDOBAO.
+
+## ANSI support:
+
+* Keyboard Maintainer: Tybera
+* Hardware Supported: IDOBAO ID67
+* Hardware Availability: [IDOBAO](https://www.idobao.net/products/idobao-id67-65-hot-swappable-mechanical-keyboard-kit-1)
+
+## Variants
+
+Currently there are two variants for the id67:
+1. `rgb_default` which uses the `RGB Lightning` feature for the on-board LEDs.
+2. `rgb` which uses the more advanced `RGB Matrix` feature for the per-key and underglow (bottom of PCB) LEDs.
+
+Make examples for this keyboard (after setting up your build environment):
+
+ make idobao/id67/default_rgb:default
+
+ make idobao/id67/rgb:default
+
+Flashing examples for this keyboard:
+
+ make idobao/id67/default_rgb:default:flash
+
+ make idobao/id67/rgb:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/id67/rgb/config.h b/keyboards/idobao/id67/rgb/config.h
index be6594b0c1..be6594b0c1 100644
--- a/keyboards/id67/rgb/config.h
+++ b/keyboards/idobao/id67/rgb/config.h
diff --git a/keyboards/id67/rgb/info.json b/keyboards/idobao/id67/rgb/info.json
index 774d913413..774d913413 100644
--- a/keyboards/id67/rgb/info.json
+++ b/keyboards/idobao/id67/rgb/info.json
diff --git a/keyboards/id67/rgb/keymaps/default/keymap.c b/keyboards/idobao/id67/rgb/keymaps/default/keymap.c
index 450550e12a..450550e12a 100644
--- a/keyboards/id67/rgb/keymaps/default/keymap.c
+++ b/keyboards/idobao/id67/rgb/keymaps/default/keymap.c
diff --git a/keyboards/id67/rgb/keymaps/thewerther/config.h b/keyboards/idobao/id67/rgb/keymaps/thewerther/config.h
index 539e3bbb41..539e3bbb41 100644
--- a/keyboards/id67/rgb/keymaps/thewerther/config.h
+++ b/keyboards/idobao/id67/rgb/keymaps/thewerther/config.h
diff --git a/keyboards/id67/rgb/keymaps/thewerther/keymap.c b/keyboards/idobao/id67/rgb/keymaps/thewerther/keymap.c
index 8af720755f..8af720755f 100644
--- a/keyboards/id67/rgb/keymaps/thewerther/keymap.c
+++ b/keyboards/idobao/id67/rgb/keymaps/thewerther/keymap.c
diff --git a/keyboards/id67/rgb/keymaps/thewerther/rules.mk b/keyboards/idobao/id67/rgb/keymaps/thewerther/rules.mk
index acd3adaa9a..acd3adaa9a 100644
--- a/keyboards/id67/rgb/keymaps/thewerther/rules.mk
+++ b/keyboards/idobao/id67/rgb/keymaps/thewerther/rules.mk
diff --git a/keyboards/id67/rgb/readme.md b/keyboards/idobao/id67/rgb/readme.md
index 8376af1468..8376af1468 100644
--- a/keyboards/id67/rgb/readme.md
+++ b/keyboards/idobao/id67/rgb/readme.md
diff --git a/keyboards/id67/rgb/rgb.c b/keyboards/idobao/id67/rgb/rgb.c
index 5fc007d19a..5fc007d19a 100644
--- a/keyboards/id67/rgb/rgb.c
+++ b/keyboards/idobao/id67/rgb/rgb.c
diff --git a/keyboards/id67/rgb/rgb.h b/keyboards/idobao/id67/rgb/rgb.h
index cca757bfc7..cca757bfc7 100644
--- a/keyboards/id67/rgb/rgb.h
+++ b/keyboards/idobao/id67/rgb/rgb.h
diff --git a/keyboards/id67/rgb/rules.mk b/keyboards/idobao/id67/rgb/rules.mk
index 5ebc2b824a..5ebc2b824a 100644
--- a/keyboards/id67/rgb/rules.mk
+++ b/keyboards/idobao/id67/rgb/rules.mk
diff --git a/keyboards/idobo/config.h b/keyboards/idobao/id75/config.h
index ffe0bb7011..ffe0bb7011 100644
--- a/keyboards/idobo/config.h
+++ b/keyboards/idobao/id75/config.h
diff --git a/keyboards/idobao/id75/id75.c b/keyboards/idobao/id75/id75.c
new file mode 100644
index 0000000000..0a0e08cc32
--- /dev/null
+++ b/keyboards/idobao/id75/id75.c
@@ -0,0 +1,16 @@
+/* Copyright 2018 MechMerlin
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "id75.h"
diff --git a/keyboards/idobo/idobo.h b/keyboards/idobao/id75/id75.h
index 9643a1efd3..9643a1efd3 100644
--- a/keyboards/idobo/idobo.h
+++ b/keyboards/idobao/id75/id75.h
diff --git a/keyboards/idobo/info.json b/keyboards/idobao/id75/info.json
index bacdc42235..bacdc42235 100644
--- a/keyboards/idobo/info.json
+++ b/keyboards/idobao/id75/info.json
diff --git a/keyboards/idobo/keymaps/default/keymap.c b/keyboards/idobao/id75/keymaps/default/keymap.c
index 6c0c09804d..6c0c09804d 100644
--- a/keyboards/idobo/keymaps/default/keymap.c
+++ b/keyboards/idobao/id75/keymaps/default/keymap.c
diff --git a/keyboards/idobo/keymaps/default/readme.md b/keyboards/idobao/id75/keymaps/default/readme.md
index 577c62b51f..577c62b51f 100644
--- a/keyboards/idobo/keymaps/default/readme.md
+++ b/keyboards/idobao/id75/keymaps/default/readme.md
diff --git a/keyboards/idobo/keymaps/default75/keymap.c b/keyboards/idobao/id75/keymaps/default75/keymap.c
index 8d8ae4414c..8d8ae4414c 100644
--- a/keyboards/idobo/keymaps/default75/keymap.c
+++ b/keyboards/idobao/id75/keymaps/default75/keymap.c
diff --git a/keyboards/idobo/keymaps/default75/readme.md b/keyboards/idobao/id75/keymaps/default75/readme.md
index a1c0236ed9..a1c0236ed9 100644
--- a/keyboards/idobo/keymaps/default75/readme.md
+++ b/keyboards/idobao/id75/keymaps/default75/readme.md
diff --git a/keyboards/idobo/keymaps/drewdobo/config.h b/keyboards/idobao/id75/keymaps/drewdobo/config.h
index 58787ce12b..58787ce12b 100644
--- a/keyboards/idobo/keymaps/drewdobo/config.h
+++ b/keyboards/idobao/id75/keymaps/drewdobo/config.h
diff --git a/keyboards/idobo/keymaps/drewdobo/keymap.c b/keyboards/idobao/id75/keymaps/drewdobo/keymap.c
index 9dfc335e82..9dfc335e82 100644
--- a/keyboards/idobo/keymaps/drewdobo/keymap.c
+++ b/keyboards/idobao/id75/keymaps/drewdobo/keymap.c
diff --git a/keyboards/idobo/keymaps/drewdobo/readme.md b/keyboards/idobao/id75/keymaps/drewdobo/readme.md
index 209808ca87..209808ca87 100644
--- a/keyboards/idobo/keymaps/drewdobo/readme.md
+++ b/keyboards/idobao/id75/keymaps/drewdobo/readme.md
diff --git a/keyboards/idobo/keymaps/drewdobo/rules.mk b/keyboards/idobao/id75/keymaps/drewdobo/rules.mk
index f9bbfd4948..f9bbfd4948 100644
--- a/keyboards/idobo/keymaps/drewdobo/rules.mk
+++ b/keyboards/idobao/id75/keymaps/drewdobo/rules.mk
diff --git a/keyboards/idobo/keymaps/egstad/config.h b/keyboards/idobao/id75/keymaps/egstad/config.h
index 45dbd3df82..45dbd3df82 100644
--- a/keyboards/idobo/keymaps/egstad/config.h
+++ b/keyboards/idobao/id75/keymaps/egstad/config.h
diff --git a/keyboards/idobo/keymaps/egstad/keymap.c b/keyboards/idobao/id75/keymaps/egstad/keymap.c
index febbad7c6e..febbad7c6e 100644
--- a/keyboards/idobo/keymaps/egstad/keymap.c
+++ b/keyboards/idobao/id75/keymaps/egstad/keymap.c
diff --git a/keyboards/idobo/keymaps/egstad/readme.md b/keyboards/idobao/id75/keymaps/egstad/readme.md
index 2de44ad9cc..2de44ad9cc 100644
--- a/keyboards/idobo/keymaps/egstad/readme.md
+++ b/keyboards/idobao/id75/keymaps/egstad/readme.md
diff --git a/keyboards/idobo/keymaps/egstad/rules.mk b/keyboards/idobao/id75/keymaps/egstad/rules.mk
index ca3becc383..ca3becc383 100644
--- a/keyboards/idobo/keymaps/egstad/rules.mk
+++ b/keyboards/idobao/id75/keymaps/egstad/rules.mk
diff --git a/keyboards/idobo/keymaps/gkbd/config.h b/keyboards/idobao/id75/keymaps/gkbd/config.h
index 35572307c0..35572307c0 100644
--- a/keyboards/idobo/keymaps/gkbd/config.h
+++ b/keyboards/idobao/id75/keymaps/gkbd/config.h
diff --git a/keyboards/idobo/keymaps/gkbd/keymap.c b/keyboards/idobao/id75/keymaps/gkbd/keymap.c
index 16e16cd855..16e16cd855 100644
--- a/keyboards/idobo/keymaps/gkbd/keymap.c
+++ b/keyboards/idobao/id75/keymaps/gkbd/keymap.c
diff --git a/keyboards/idobo/keymaps/gkbd/readme.md b/keyboards/idobao/id75/keymaps/gkbd/readme.md
index 3951f3e564..3951f3e564 100644
--- a/keyboards/idobo/keymaps/gkbd/readme.md
+++ b/keyboards/idobao/id75/keymaps/gkbd/readme.md
diff --git a/keyboards/idobo/keymaps/gkbd/rules.mk b/keyboards/idobao/id75/keymaps/gkbd/rules.mk
index 039f07c8e3..039f07c8e3 100644
--- a/keyboards/idobo/keymaps/gkbd/rules.mk
+++ b/keyboards/idobao/id75/keymaps/gkbd/rules.mk
diff --git a/keyboards/idobo/keymaps/gkbd_75/config.h b/keyboards/idobao/id75/keymaps/gkbd_75/config.h
index 7813d776e5..7813d776e5 100644
--- a/keyboards/idobo/keymaps/gkbd_75/config.h
+++ b/keyboards/idobao/id75/keymaps/gkbd_75/config.h
diff --git a/keyboards/idobo/keymaps/gkbd_75/keymap.c b/keyboards/idobao/id75/keymaps/gkbd_75/keymap.c
index be67aead4e..be67aead4e 100644
--- a/keyboards/idobo/keymaps/gkbd_75/keymap.c
+++ b/keyboards/idobao/id75/keymaps/gkbd_75/keymap.c
diff --git a/keyboards/idobo/keymaps/gkbd_75/readme.md b/keyboards/idobao/id75/keymaps/gkbd_75/readme.md
index aa14049420..aa14049420 100644
--- a/keyboards/idobo/keymaps/gkbd_75/readme.md
+++ b/keyboards/idobao/id75/keymaps/gkbd_75/readme.md
diff --git a/keyboards/idobo/keymaps/gkbd_orthon/config.h b/keyboards/idobao/id75/keymaps/gkbd_orthon/config.h
index e8fc39faad..e8fc39faad 100644
--- a/keyboards/idobo/keymaps/gkbd_orthon/config.h
+++ b/keyboards/idobao/id75/keymaps/gkbd_orthon/config.h
diff --git a/keyboards/idobo/keymaps/gkbd_orthon/keymap.c b/keyboards/idobao/id75/keymaps/gkbd_orthon/keymap.c
index a603eae657..a603eae657 100644
--- a/keyboards/idobo/keymaps/gkbd_orthon/keymap.c
+++ b/keyboards/idobao/id75/keymaps/gkbd_orthon/keymap.c
diff --git a/keyboards/idobo/keymaps/gkbd_orthon/readme.md b/keyboards/idobao/id75/keymaps/gkbd_orthon/readme.md
index 36479ff9ba..36479ff9ba 100644
--- a/keyboards/idobo/keymaps/gkbd_orthon/readme.md
+++ b/keyboards/idobao/id75/keymaps/gkbd_orthon/readme.md
diff --git a/keyboards/idobo/keymaps/greenshadowmaker/keyboard-layout-editor-gsm-idobo.json b/keyboards/idobao/id75/keymaps/greenshadowmaker/keyboard-layout-editor-gsm-idobo.json
index 19c0780463..19c0780463 100644
--- a/keyboards/idobo/keymaps/greenshadowmaker/keyboard-layout-editor-gsm-idobo.json
+++ b/keyboards/idobao/id75/keymaps/greenshadowmaker/keyboard-layout-editor-gsm-idobo.json
diff --git a/keyboards/idobo/keymaps/greenshadowmaker/keymap.c b/keyboards/idobao/id75/keymaps/greenshadowmaker/keymap.c
index d23bc7c7df..d23bc7c7df 100644
--- a/keyboards/idobo/keymaps/greenshadowmaker/keymap.c
+++ b/keyboards/idobao/id75/keymaps/greenshadowmaker/keymap.c
diff --git a/keyboards/idobo/keymaps/greenshadowmaker/readme.md b/keyboards/idobao/id75/keymaps/greenshadowmaker/readme.md
index 7b6f654c71..7b6f654c71 100644
--- a/keyboards/idobo/keymaps/greenshadowmaker/readme.md
+++ b/keyboards/idobao/id75/keymaps/greenshadowmaker/readme.md
diff --git a/keyboards/idobo/keymaps/greenshadowmaker/rules.mk b/keyboards/idobao/id75/keymaps/greenshadowmaker/rules.mk
index f6587a835e..f6587a835e 100644
--- a/keyboards/idobo/keymaps/greenshadowmaker/rules.mk
+++ b/keyboards/idobao/id75/keymaps/greenshadowmaker/rules.mk
diff --git a/keyboards/idobo/keymaps/ifohancroft/config.h b/keyboards/idobao/id75/keymaps/ifohancroft/config.h
index 09467b4362..09467b4362 100644
--- a/keyboards/idobo/keymaps/ifohancroft/config.h
+++ b/keyboards/idobao/id75/keymaps/ifohancroft/config.h
diff --git a/keyboards/idobo/keymaps/ifohancroft/keymap.c b/keyboards/idobao/id75/keymaps/ifohancroft/keymap.c
index d71dcee6a9..d71dcee6a9 100644
--- a/keyboards/idobo/keymaps/ifohancroft/keymap.c
+++ b/keyboards/idobao/id75/keymaps/ifohancroft/keymap.c
diff --git a/keyboards/idobo/keymaps/ifohancroft/readme.md b/keyboards/idobao/id75/keymaps/ifohancroft/readme.md
index 6a6c2cd34b..6a6c2cd34b 100644
--- a/keyboards/idobo/keymaps/ifohancroft/readme.md
+++ b/keyboards/idobao/id75/keymaps/ifohancroft/readme.md
diff --git a/keyboards/idobo/keymaps/ifohancroft/rules.mk b/keyboards/idobao/id75/keymaps/ifohancroft/rules.mk
index 6609b4097b..6609b4097b 100644
--- a/keyboards/idobo/keymaps/ifohancroft/rules.mk
+++ b/keyboards/idobao/id75/keymaps/ifohancroft/rules.mk
diff --git a/keyboards/idobo/keymaps/pathnirvana/config.h b/keyboards/idobao/id75/keymaps/pathnirvana/config.h
index dd95794254..dd95794254 100644
--- a/keyboards/idobo/keymaps/pathnirvana/config.h
+++ b/keyboards/idobao/id75/keymaps/pathnirvana/config.h
diff --git a/keyboards/idobo/keymaps/pathnirvana/keymap.c b/keyboards/idobao/id75/keymaps/pathnirvana/keymap.c
index ea6831d6da..ea6831d6da 100644
--- a/keyboards/idobo/keymaps/pathnirvana/keymap.c
+++ b/keyboards/idobao/id75/keymaps/pathnirvana/keymap.c
diff --git a/keyboards/idobo/keymaps/pathnirvana/rules.mk b/keyboards/idobao/id75/keymaps/pathnirvana/rules.mk
index 6bfd2bac6a..6bfd2bac6a 100644
--- a/keyboards/idobo/keymaps/pathnirvana/rules.mk
+++ b/keyboards/idobao/id75/keymaps/pathnirvana/rules.mk
diff --git a/keyboards/idobo/keymaps/revok75/config.h b/keyboards/idobao/id75/keymaps/revok75/config.h
index f5c4659880..f5c4659880 100644
--- a/keyboards/idobo/keymaps/revok75/config.h
+++ b/keyboards/idobao/id75/keymaps/revok75/config.h
diff --git a/keyboards/idobo/keymaps/revok75/keymap.c b/keyboards/idobao/id75/keymaps/revok75/keymap.c
index a380240326..a380240326 100644
--- a/keyboards/idobo/keymaps/revok75/keymap.c
+++ b/keyboards/idobao/id75/keymaps/revok75/keymap.c
diff --git a/keyboards/idobo/keymaps/revok75/readme.md b/keyboards/idobao/id75/keymaps/revok75/readme.md
index 780c5401c4..780c5401c4 100644
--- a/keyboards/idobo/keymaps/revok75/readme.md
+++ b/keyboards/idobao/id75/keymaps/revok75/readme.md
diff --git a/keyboards/idobo/keymaps/revok75/rules.mk b/keyboards/idobao/id75/keymaps/revok75/rules.mk
index 7efceba50a..7efceba50a 100644
--- a/keyboards/idobo/keymaps/revok75/rules.mk
+++ b/keyboards/idobao/id75/keymaps/revok75/rules.mk
diff --git a/keyboards/idobo/keymaps/via/keymap.c b/keyboards/idobao/id75/keymaps/via/keymap.c
index de7581ea03..de7581ea03 100644
--- a/keyboards/idobo/keymaps/via/keymap.c
+++ b/keyboards/idobao/id75/keymaps/via/keymap.c
diff --git a/keyboards/choc_taro/keymaps/via/rules.mk b/keyboards/idobao/id75/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/choc_taro/keymaps/via/rules.mk
+++ b/keyboards/idobao/id75/keymaps/via/rules.mk
diff --git a/keyboards/idobo/keymaps/xaceofspaidsx/config.h b/keyboards/idobao/id75/keymaps/xaceofspaidsx/config.h
index a3ed4f762a..a3ed4f762a 100644
--- a/keyboards/idobo/keymaps/xaceofspaidsx/config.h
+++ b/keyboards/idobao/id75/keymaps/xaceofspaidsx/config.h
diff --git a/keyboards/idobo/keymaps/xaceofspaidsx/keymap.c b/keyboards/idobao/id75/keymaps/xaceofspaidsx/keymap.c
index c157317e2d..c157317e2d 100644
--- a/keyboards/idobo/keymaps/xaceofspaidsx/keymap.c
+++ b/keyboards/idobao/id75/keymaps/xaceofspaidsx/keymap.c
diff --git a/keyboards/idobo/keymaps/xaceofspaidsx/readme.md b/keyboards/idobao/id75/keymaps/xaceofspaidsx/readme.md
index ac6e74702c..ac6e74702c 100644
--- a/keyboards/idobo/keymaps/xaceofspaidsx/readme.md
+++ b/keyboards/idobao/id75/keymaps/xaceofspaidsx/readme.md
diff --git a/keyboards/idobo/keymaps/xaceofspaidsx/rules.mk b/keyboards/idobao/id75/keymaps/xaceofspaidsx/rules.mk
index b973e9d8b3..b973e9d8b3 100644
--- a/keyboards/idobo/keymaps/xaceofspaidsx/rules.mk
+++ b/keyboards/idobao/id75/keymaps/xaceofspaidsx/rules.mk
diff --git a/keyboards/idobao/id75/readme.md b/keyboards/idobao/id75/readme.md
new file mode 100644
index 0000000000..9f0f87360c
--- /dev/null
+++ b/keyboards/idobao/id75/readme.md
@@ -0,0 +1,19 @@
+# ID75
+
+![ID75](https://i.imgur.com/VOP1SzD.jpeg)
+
+75Keys Aluminum Mechanical Keyboard.
+
+Firmware here originally appeared on qmkeyboard.cn
+
+Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin)
+Hardware Supported: ID75 PCB
+Hardware Availability:
+* [ID75 on Drop](https://drop.com/buy/id75-hot-swappable-ortholinear-keyboard-kit)
+* [ID75 on IDOBAO](https://idobao.net/products/idobao-id75v1-hot-swappable-mechanical-keyboard-kit)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make idobao/id75: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/idobo/rules.mk b/keyboards/idobao/id75/rules.mk
index 721b7f5606..721b7f5606 100644
--- a/keyboards/idobo/rules.mk
+++ b/keyboards/idobao/id75/rules.mk
diff --git a/keyboards/id80/ansi/config.h b/keyboards/idobao/id80/ansi/config.h
index 253c0757b8..253c0757b8 100644
--- a/keyboards/id80/ansi/config.h
+++ b/keyboards/idobao/id80/ansi/config.h
diff --git a/keyboards/id80/ansi/keymaps/default/keymap.c b/keyboards/idobao/id80/ansi/keymaps/default/keymap.c
index 696fb303e2..696fb303e2 100644
--- a/keyboards/id80/ansi/keymaps/default/keymap.c
+++ b/keyboards/idobao/id80/ansi/keymaps/default/keymap.c
diff --git a/keyboards/id80/ansi/keymaps/default/readme.md b/keyboards/idobao/id80/ansi/keymaps/default/readme.md
index 8ae9f656cd..8ae9f656cd 100644
--- a/keyboards/id80/ansi/keymaps/default/readme.md
+++ b/keyboards/idobao/id80/ansi/keymaps/default/readme.md
diff --git a/keyboards/id80/ansi/keymaps/msf/config.h b/keyboards/idobao/id80/ansi/keymaps/msf/config.h
index 4f3cc95f30..4f3cc95f30 100644
--- a/keyboards/id80/ansi/keymaps/msf/config.h
+++ b/keyboards/idobao/id80/ansi/keymaps/msf/config.h
diff --git a/keyboards/id80/ansi/keymaps/msf/keymap.c b/keyboards/idobao/id80/ansi/keymaps/msf/keymap.c
index 6bb91f0f19..6bb91f0f19 100644
--- a/keyboards/id80/ansi/keymaps/msf/keymap.c
+++ b/keyboards/idobao/id80/ansi/keymaps/msf/keymap.c
diff --git a/keyboards/id80/ansi/keymaps/msf/readme.md b/keyboards/idobao/id80/ansi/keymaps/msf/readme.md
index 7ab300f672..7ab300f672 100644
--- a/keyboards/id80/ansi/keymaps/msf/readme.md
+++ b/keyboards/idobao/id80/ansi/keymaps/msf/readme.md
diff --git a/keyboards/id80/ansi/keymaps/msf/rules.mk b/keyboards/idobao/id80/ansi/keymaps/msf/rules.mk
index ab1e438182..ab1e438182 100644
--- a/keyboards/id80/ansi/keymaps/msf/rules.mk
+++ b/keyboards/idobao/id80/ansi/keymaps/msf/rules.mk
diff --git a/keyboards/id80/ansi/keymaps/via/keymap.c b/keyboards/idobao/id80/ansi/keymaps/via/keymap.c
index 686ce9ce73..686ce9ce73 100644
--- a/keyboards/id80/ansi/keymaps/via/keymap.c
+++ b/keyboards/idobao/id80/ansi/keymaps/via/keymap.c
diff --git a/keyboards/id80/ansi/keymaps/via/rules.mk b/keyboards/idobao/id80/ansi/keymaps/via/rules.mk
index ca9fed0e6b..ca9fed0e6b 100644
--- a/keyboards/id80/ansi/keymaps/via/rules.mk
+++ b/keyboards/idobao/id80/ansi/keymaps/via/rules.mk
diff --git a/keyboards/id80/ansi/readme.md b/keyboards/idobao/id80/ansi/readme.md
index 1bfae43735..1bfae43735 100644
--- a/keyboards/id80/ansi/readme.md
+++ b/keyboards/idobao/id80/ansi/readme.md
diff --git a/keyboards/id80/ansi/rules.mk b/keyboards/idobao/id80/ansi/rules.mk
index 323c12fc6e..323c12fc6e 100644
--- a/keyboards/id80/ansi/rules.mk
+++ b/keyboards/idobao/id80/ansi/rules.mk
diff --git a/keyboards/id80/config.h b/keyboards/idobao/id80/config.h
index c6cf667382..c6cf667382 100644
--- a/keyboards/id80/config.h
+++ b/keyboards/idobao/id80/config.h
diff --git a/keyboards/id80/id80.c b/keyboards/idobao/id80/id80.c
index 4a06660de9..4a06660de9 100644
--- a/keyboards/id80/id80.c
+++ b/keyboards/idobao/id80/id80.c
diff --git a/keyboards/id80/id80.h b/keyboards/idobao/id80/id80.h
index a016e39083..a016e39083 100644
--- a/keyboards/id80/id80.h
+++ b/keyboards/idobao/id80/id80.h
diff --git a/keyboards/id80/info.json b/keyboards/idobao/id80/info.json
index 072b4ca4db..072b4ca4db 100644
--- a/keyboards/id80/info.json
+++ b/keyboards/idobao/id80/info.json
diff --git a/keyboards/id80/iso/config.h b/keyboards/idobao/id80/iso/config.h
index cd9c497442..cd9c497442 100644
--- a/keyboards/id80/iso/config.h
+++ b/keyboards/idobao/id80/iso/config.h
diff --git a/keyboards/id80/iso/keymaps/default/keymap.c b/keyboards/idobao/id80/iso/keymaps/default/keymap.c
index 1cc6067356..1cc6067356 100644
--- a/keyboards/id80/iso/keymaps/default/keymap.c
+++ b/keyboards/idobao/id80/iso/keymaps/default/keymap.c
diff --git a/keyboards/id80/iso/keymaps/default/readme.md b/keyboards/idobao/id80/iso/keymaps/default/readme.md
index 8ae9f656cd..8ae9f656cd 100644
--- a/keyboards/id80/iso/keymaps/default/readme.md
+++ b/keyboards/idobao/id80/iso/keymaps/default/readme.md
diff --git a/keyboards/id80/iso/keymaps/via/keymap.c b/keyboards/idobao/id80/iso/keymaps/via/keymap.c
index 710da2edf1..710da2edf1 100644
--- a/keyboards/id80/iso/keymaps/via/keymap.c
+++ b/keyboards/idobao/id80/iso/keymaps/via/keymap.c
diff --git a/keyboards/id80/iso/keymaps/via/rules.mk b/keyboards/idobao/id80/iso/keymaps/via/rules.mk
index ca9fed0e6b..ca9fed0e6b 100644
--- a/keyboards/id80/iso/keymaps/via/rules.mk
+++ b/keyboards/idobao/id80/iso/keymaps/via/rules.mk
diff --git a/keyboards/id80/iso/readme.md b/keyboards/idobao/id80/iso/readme.md
index 3e0d8ce231..3e0d8ce231 100644
--- a/keyboards/id80/iso/readme.md
+++ b/keyboards/idobao/id80/iso/readme.md
diff --git a/keyboards/id80/iso/rules.mk b/keyboards/idobao/id80/iso/rules.mk
index 323c12fc6e..323c12fc6e 100644
--- a/keyboards/id80/iso/rules.mk
+++ b/keyboards/idobao/id80/iso/rules.mk
diff --git a/keyboards/id80/keymaps/rverst/keymap.c b/keyboards/idobao/id80/keymaps/rverst/keymap.c
index 3656f48dfe..3656f48dfe 100644
--- a/keyboards/id80/keymaps/rverst/keymap.c
+++ b/keyboards/idobao/id80/keymaps/rverst/keymap.c
diff --git a/keyboards/id80/keymaps/rverst/readme.md b/keyboards/idobao/id80/keymaps/rverst/readme.md
index ba33980edb..ba33980edb 100644
--- a/keyboards/id80/keymaps/rverst/readme.md
+++ b/keyboards/idobao/id80/keymaps/rverst/readme.md
diff --git a/keyboards/id80/keymaps/rverst/rverst.json b/keyboards/idobao/id80/keymaps/rverst/rverst.json
index 50235498fe..50235498fe 100644
--- a/keyboards/id80/keymaps/rverst/rverst.json
+++ b/keyboards/idobao/id80/keymaps/rverst/rverst.json
diff --git a/keyboards/idobao/id80/readme.md b/keyboards/idobao/id80/readme.md
new file mode 100644
index 0000000000..bcc4a25d7d
--- /dev/null
+++ b/keyboards/idobao/id80/readme.md
@@ -0,0 +1,27 @@
+# IDOBAO ID80
+
+![ID80](https://ae01.alicdn.com/kf/H0f617c6129c24cfaa26a8c9e8e54851aj.jpg)
+
+A 75% hotswap keyboard from IDOBAO.
+
+## ANSI support:
+
+* Keyboard Maintainer: [Sergey Vlasov](https://github.com/sigprof)
+* Hardware Supported: IDOBAO ID80
+* Hardware Availability: [AliExpress](https://www.aliexpress.com/item/4000590804514.html), [Drop](https://drop.com/buy/idobao-id80-75-hot-swappable-mechanical-keyboard-kit?mode=guest_open)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make idobao/id80/ansi:default
+
+## ISO support:
+
+* Keyboard Maintainer: [Carsten Rose](https://github.com/cwr10010)
+* Hardware Supported: IDOBAO ID80v2
+* Hardware Availability: [IDOBAO](https://www.idobao.net/products/idobao-id80v2-75-hot-swappable-mechanical-keyboard-kit)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make idobao/id80/iso: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/idobao/id80/rules.mk b/keyboards/idobao/id80/rules.mk
new file mode 100644
index 0000000000..f988be4e29
--- /dev/null
+++ b/keyboards/idobao/id80/rules.mk
@@ -0,0 +1,24 @@
+# Defalt to the ansi version
+DEFAULT_FOLDER = idobao/id80/ansi
+
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = yes # Enable N-Key Rollover
+BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+# partially generated by KBFirmware JSON to QMK Parser
+# https://noroadsleft.github.io/kbf_qmk_converter/
diff --git a/keyboards/idobo/idobo.c b/keyboards/idobo/idobo.c
deleted file mode 100644
index ccf654f871..0000000000
--- a/keyboards/idobo/idobo.c
+++ /dev/null
@@ -1,16 +0,0 @@
-/* Copyright 2018 MechMerlin
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-#include "idobo.h"
diff --git a/keyboards/idobo/readme.md b/keyboards/idobo/readme.md
deleted file mode 100644
index 254616decb..0000000000
--- a/keyboards/idobo/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# IDOBO
-
-![IDOBO](imgur.com image replace me!)
-
-75Keys Aluminum Mechanical Keyboard.
-
-Firmware here originally appeared on qmkeyboard.cn
-
-Keyboard Maintainer: [MechMerlin](https://github.com/mechmerlin)
-Hardware Supported: IDOBO PCB
-Hardware Availability: [IDOBO on Drop](https://drop.com/buy/id75-hot-swappable-ortholinear-keyboard-kit)
-
-Make example for this keyboard (after setting up your build environment):
-
- make idobo: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/jisplit89/jisplit89.h b/keyboards/jisplit89/jisplit89.h
deleted file mode 100644
index b59b5a66a2..0000000000
--- a/keyboards/jisplit89/jisplit89.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
-Copyright 2020 Salicylic_Acid
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#pragma once
-
-#ifdef KEYBOARD_jisplit89_rev1
- #include "rev1.h"
-#endif
diff --git a/keyboards/jisplit89/readme.md b/keyboards/jisplit89/readme.md
deleted file mode 100644
index d222874577..0000000000
--- a/keyboards/jisplit89/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# JISplit89
-
-![jisplit89](https://s2.booth.pm/1d33594d-0c5f-4f93-baf5-2e89e0d99afc/i/1916810/ee9743ff-b03d-4ab8-8130-ddaad3c1b30d_base_resized.jpg)
-
-This is 89 keys Custom keyboard.
-
-* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
-* Hardware Supported: jisplit89 PCB, Pro Micro
-* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1916810)
-
-Make example for this keyboard (after setting up your build environment):
-
- make jisplit89:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://salicylic-acid3.hatenablog.com/entry/jisplit89-build-guide)
diff --git a/keyboards/jisplit89/rules.mk b/keyboards/jisplit89/rules.mk
deleted file mode 100644
index 5427cabfa2..0000000000
--- a/keyboards/jisplit89/rules.mk
+++ /dev/null
@@ -1,22 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = caterina
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
-AUDIO_ENABLE = no # Audio output
-
-SPLIT_KEYBOARD = yes
-
-DEFAULT_FOLDER = jisplit89/rev1
diff --git a/keyboards/just60/readme.md b/keyboards/just60/readme.md
deleted file mode 100644
index f78adcd529..0000000000
--- a/keyboards/just60/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Just60
-
-Just60 keyboard produced by Yang. The keyboard comes with a custom Mass Storage Device bootloader and a TMK based firmware from ydkb.io.
-
-To use a QMK based firmware, you might want to install a QMK bootloader. The PCB exposes 6 pins for ISP(In-System Programming), and they are located just under the ATMega32U4 chip. From left to right, the pins are `VCC`, `SCLK`, `MOSI`, `MISO`, `RESET`, `GND`. The `GND` is the square one. You could program the flash with any AVR programmer, or a Raspberry Pi with `avrdude`.
-
-Backlight LEDs and Bluetooth are not working yet.
-
-* Keyboard Maintainer: [Jianfei Wang](https://github.com/thinxer)
-* Hardware Supported: Just60 (atmega32u4)
-* Hardware Availability: https://item.taobao.com/item.htm?id=564176654249
-
-Make example for this keyboard (after setting up your build environment):
-
- make just60: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/bat43/rev1/.noci b/keyboards/kakunpc/angel17/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/bat43/rev1/.noci
+++ b/keyboards/kakunpc/angel17/.noci
diff --git a/keyboards/bat43/rev2/.noci b/keyboards/kakunpc/angel17/alpha/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/bat43/rev2/.noci
+++ b/keyboards/kakunpc/angel17/alpha/.noci
diff --git a/keyboards/angel17/alpha/alpha.c b/keyboards/kakunpc/angel17/alpha/alpha.c
index 1c2936e157..1c2936e157 100644
--- a/keyboards/angel17/alpha/alpha.c
+++ b/keyboards/kakunpc/angel17/alpha/alpha.c
diff --git a/keyboards/angel17/alpha/alpha.h b/keyboards/kakunpc/angel17/alpha/alpha.h
index 5b8600a206..5b8600a206 100644
--- a/keyboards/angel17/alpha/alpha.h
+++ b/keyboards/kakunpc/angel17/alpha/alpha.h
diff --git a/keyboards/angel17/alpha/config.h b/keyboards/kakunpc/angel17/alpha/config.h
index 35e9c132b8..35e9c132b8 100644
--- a/keyboards/angel17/alpha/config.h
+++ b/keyboards/kakunpc/angel17/alpha/config.h
diff --git a/keyboards/angel17/alpha/rules.mk b/keyboards/kakunpc/angel17/alpha/rules.mk
index 4ee22403e9..4ee22403e9 100644
--- a/keyboards/angel17/alpha/rules.mk
+++ b/keyboards/kakunpc/angel17/alpha/rules.mk
diff --git a/keyboards/angel17/info.json b/keyboards/kakunpc/angel17/info.json
index 24a6c6be08..24a6c6be08 100644
--- a/keyboards/angel17/info.json
+++ b/keyboards/kakunpc/angel17/info.json
diff --git a/keyboards/angel17/keymaps/default/keymap.c b/keyboards/kakunpc/angel17/keymaps/default/keymap.c
index 1b9f52846d..1b9f52846d 100644
--- a/keyboards/angel17/keymaps/default/keymap.c
+++ b/keyboards/kakunpc/angel17/keymaps/default/keymap.c
diff --git a/keyboards/angel17/keymaps/default/readme.md b/keyboards/kakunpc/angel17/keymaps/default/readme.md
index a509fef7a3..a509fef7a3 100644
--- a/keyboards/angel17/keymaps/default/readme.md
+++ b/keyboards/kakunpc/angel17/keymaps/default/readme.md
diff --git a/keyboards/kakunpc/angel17/readme.md b/keyboards/kakunpc/angel17/readme.md
new file mode 100644
index 0000000000..16914887a6
--- /dev/null
+++ b/keyboards/kakunpc/angel17/readme.md
@@ -0,0 +1,15 @@
+# angel17
+
+![angel17](https://i.gyazo.com/30787446262c5818bc60e0ffb34c96ed.jpg)
+
+Keyboard for tablets.
+
+Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
+Hardware Supported: angel17_alpha, promicro
+Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kakunpc/angel17/rev1:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/angel17/rev1/config.h b/keyboards/kakunpc/angel17/rev1/config.h
index a43208d2b9..a43208d2b9 100644
--- a/keyboards/angel17/rev1/config.h
+++ b/keyboards/kakunpc/angel17/rev1/config.h
diff --git a/keyboards/angel17/rev1/rev1.c b/keyboards/kakunpc/angel17/rev1/rev1.c
index 40ff30e620..40ff30e620 100644
--- a/keyboards/angel17/rev1/rev1.c
+++ b/keyboards/kakunpc/angel17/rev1/rev1.c
diff --git a/keyboards/angel17/rev1/rev1.h b/keyboards/kakunpc/angel17/rev1/rev1.h
index 5b8600a206..5b8600a206 100644
--- a/keyboards/angel17/rev1/rev1.h
+++ b/keyboards/kakunpc/angel17/rev1/rev1.h
diff --git a/keyboards/angel17/rev1/rules.mk b/keyboards/kakunpc/angel17/rev1/rules.mk
index d0813eb5c3..d0813eb5c3 100644
--- a/keyboards/angel17/rev1/rules.mk
+++ b/keyboards/kakunpc/angel17/rev1/rules.mk
diff --git a/keyboards/kakunpc/angel17/rules.mk b/keyboards/kakunpc/angel17/rules.mk
new file mode 100644
index 0000000000..35c999d465
--- /dev/null
+++ b/keyboards/kakunpc/angel17/rules.mk
@@ -0,0 +1,22 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
+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
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+LAYOUTS = numpad_5x4
+
+DEFAULT_FOLDER = kakunpc/angel17/rev1
diff --git a/keyboards/business_card/.noci b/keyboards/kakunpc/angel64/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/business_card/.noci
+++ b/keyboards/kakunpc/angel64/.noci
diff --git a/keyboards/business_card/alpha/.noci b/keyboards/kakunpc/angel64/alpha/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/business_card/alpha/.noci
+++ b/keyboards/kakunpc/angel64/alpha/.noci
diff --git a/keyboards/angel64/alpha/alpha.c b/keyboards/kakunpc/angel64/alpha/alpha.c
index 1c2936e157..1c2936e157 100644
--- a/keyboards/angel64/alpha/alpha.c
+++ b/keyboards/kakunpc/angel64/alpha/alpha.c
diff --git a/keyboards/angel64/alpha/alpha.h b/keyboards/kakunpc/angel64/alpha/alpha.h
index 6c0898a56a..6c0898a56a 100644
--- a/keyboards/angel64/alpha/alpha.h
+++ b/keyboards/kakunpc/angel64/alpha/alpha.h
diff --git a/keyboards/angel64/alpha/config.h b/keyboards/kakunpc/angel64/alpha/config.h
index b3270fdd8b..b3270fdd8b 100644
--- a/keyboards/angel64/alpha/config.h
+++ b/keyboards/kakunpc/angel64/alpha/config.h
diff --git a/keyboards/angel64/alpha/info.json b/keyboards/kakunpc/angel64/alpha/info.json
index 6fceff4490..6fceff4490 100644
--- a/keyboards/angel64/alpha/info.json
+++ b/keyboards/kakunpc/angel64/alpha/info.json
diff --git a/keyboards/angel64/alpha/keymaps/default/keymap.c b/keyboards/kakunpc/angel64/alpha/keymaps/default/keymap.c
index 0f2a8dada1..0f2a8dada1 100644
--- a/keyboards/angel64/alpha/keymaps/default/keymap.c
+++ b/keyboards/kakunpc/angel64/alpha/keymaps/default/keymap.c
diff --git a/keyboards/angel64/alpha/keymaps/default/readme.md b/keyboards/kakunpc/angel64/alpha/keymaps/default/readme.md
index f4cd48f2ef..f4cd48f2ef 100644
--- a/keyboards/angel64/alpha/keymaps/default/readme.md
+++ b/keyboards/kakunpc/angel64/alpha/keymaps/default/readme.md
diff --git a/keyboards/kakunpc/angel64/alpha/matrix.c b/keyboards/kakunpc/angel64/alpha/matrix.c
new file mode 100644
index 0000000000..2851859cf2
--- /dev/null
+++ b/keyboards/kakunpc/angel64/alpha/matrix.c
@@ -0,0 +1,280 @@
+/*
+Copyright 2012-2018 Jun Wako, Jack Humbert, Yiancar
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+#include <stdint.h>
+#include <stdbool.h>
+#include "wait.h"
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+#include "debounce.h"
+#include "quantum.h"
+
+#if (MATRIX_COLS <= 8)
+# define print_matrix_header() print("\nr/c 01234567\n")
+# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
+# define matrix_bitpop(i) bitpop(matrix[i])
+# define ROW_SHIFTER ((uint8_t)1)
+#elif (MATRIX_COLS <= 16)
+# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
+# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
+# define matrix_bitpop(i) bitpop16(matrix[i])
+# define ROW_SHIFTER ((uint16_t)1)
+#elif (MATRIX_COLS <= 32)
+# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
+# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
+# define matrix_bitpop(i) bitpop32(matrix[i])
+# define ROW_SHIFTER ((uint32_t)1)
+#endif
+
+#ifdef MATRIX_MASKED
+ extern const matrix_row_t matrix_mask[];
+#endif
+
+static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
+static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
+
+/* matrix state(1:on, 0:off) */
+static matrix_row_t raw_matrix[MATRIX_ROWS]; //raw values
+static matrix_row_t matrix[MATRIX_ROWS]; //debounced values
+
+__attribute__ ((weak))
+void matrix_init_quantum(void) {
+ matrix_init_kb();
+}
+
+__attribute__ ((weak))
+void matrix_scan_quantum(void) {
+ matrix_scan_kb();
+}
+
+__attribute__ ((weak))
+void matrix_init_kb(void) {
+ matrix_init_user();
+}
+
+__attribute__ ((weak))
+void matrix_scan_kb(void) {
+ matrix_scan_user();
+}
+
+__attribute__ ((weak))
+void matrix_init_user(void) {
+}
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {
+}
+
+inline
+uint8_t matrix_rows(void) {
+ return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void) {
+ return MATRIX_COLS;
+}
+
+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)
+{
+ // Matrix mask lets you disable switches in the returned matrix data. For example, if you have a
+ // switch blocker installed and the switch is always pressed.
+#ifdef MATRIX_MASKED
+ return matrix[row] & matrix_mask[row];
+#else
+ return matrix[row];
+#endif
+}
+
+void matrix_print(void)
+{
+ print_matrix_header();
+
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ print_hex8(row); print(": ");
+ print_matrix_row(row);
+ print("\n");
+ }
+}
+
+uint8_t matrix_key_count(void)
+{
+ uint8_t count = 0;
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ count += matrix_bitpop(i);
+ }
+ return count;
+}
+
+static void select_row(uint8_t row)
+{
+ setPinOutput(row_pins[row]);
+ writePinLow(row_pins[row]);
+}
+
+static void unselect_row(uint8_t row)
+{
+ setPinInputHigh(row_pins[row]);
+}
+
+static void unselect_rows(void)
+{
+ for(uint8_t x = 0; x < MATRIX_ROWS; x++) {
+ setPinInputHigh(row_pins[x]);
+ }
+}
+
+static void select_col(uint8_t col)
+{
+ setPinOutput(col_pins[col]);
+ writePinLow(col_pins[col]);
+}
+
+static void unselect_col(uint8_t col)
+{
+ setPinInputHigh(col_pins[col]);
+}
+
+static void unselect_cols(void)
+{
+ for(uint8_t x = 0; x < MATRIX_COLS; x++) {
+ setPinInputHigh(col_pins[x]);
+ }
+}
+
+static void init_pins(void) {
+ unselect_rows();
+ unselect_cols();
+ for (uint8_t x = 0; x < MATRIX_COLS; x++) {
+ setPinInputHigh(col_pins[x]);
+ }
+ for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
+ setPinInputHigh(row_pins[x]);
+ }
+}
+
+static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
+{
+ // Store last value of row prior to reading
+ matrix_row_t last_row_value = current_matrix[current_row];
+
+ // Clear data in matrix row
+ current_matrix[current_row] = 0;
+
+ // Select row and wait for row selecton to stabilize
+ select_row(current_row);
+ wait_us(30);
+
+ // For each col...
+ for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
+
+ // Select the col pin to read (active low)
+ uint8_t pin_state = readPin(col_pins[col_index]);
+
+ // Populate the matrix row with the state of the col pin
+ current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index);
+ }
+
+ // Unselect row
+ unselect_row(current_row);
+
+ return (last_row_value != current_matrix[current_row]);
+}
+
+static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
+{
+ bool matrix_changed = false;
+
+ // Select col and wait for col selecton to stabilize
+ select_col(current_col);
+ wait_us(30);
+
+ // For each row...
+ for(uint8_t row_index = 0; row_index < MATRIX_ROWS/2; row_index++)
+ {
+ uint8_t tmp = row_index + MATRIX_ROWS/2;
+ // Store last value of row prior to reading
+ matrix_row_t last_row_value = current_matrix[tmp];
+
+ // Check row pin state
+ if (readPin(row_pins[row_index]) == 0)
+ {
+ // Pin LO, set col bit
+ current_matrix[tmp] |= (ROW_SHIFTER << current_col);
+ }
+ else
+ {
+ // Pin HI, clear col bit
+ current_matrix[tmp] &= ~(ROW_SHIFTER << current_col);
+ }
+
+ // Determine if the matrix changed state
+ if ((last_row_value != current_matrix[tmp]) && !(matrix_changed))
+ {
+ matrix_changed = true;
+ }
+ }
+
+ // Unselect col
+ unselect_col(current_col);
+
+ return matrix_changed;
+}
+
+void matrix_init(void) {
+
+ // initialize key pins
+ init_pins();
+
+ // initialize matrix state: all keys off
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+ raw_matrix[i] = 0;
+ matrix[i] = 0;
+ }
+
+ debounce_init(MATRIX_ROWS);
+
+ matrix_init_quantum();
+}
+
+uint8_t matrix_scan(void)
+{
+ bool changed = false;
+
+ // Set row, read cols
+ for (uint8_t current_row = 0; current_row < MATRIX_ROWS / 2; current_row++) {
+ changed |= read_cols_on_row(raw_matrix, current_row);
+ }
+ //else
+ // Set col, read rows
+ for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
+ changed |= read_rows_on_col(raw_matrix, current_col);
+ }
+
+ debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
+
+ matrix_scan_quantum();
+ return (uint8_t)changed;
+}
diff --git a/keyboards/kakunpc/angel64/alpha/readme.md b/keyboards/kakunpc/angel64/alpha/readme.md
new file mode 100644
index 0000000000..4de66e6706
--- /dev/null
+++ b/keyboards/kakunpc/angel64/alpha/readme.md
@@ -0,0 +1,15 @@
+# angel64
+
+![angel64](https://i.gyazo.com/6e2ea6c58d3253c496dc0518f2641ff9.jpg)
+
+Keyboard for tablets.
+
+* Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
+* Hardware Supported: angel64_alpha, promicro
+* Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kakunpc/angel64/alpha: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/jisplit89/rev1/rules.mk b/keyboards/kakunpc/angel64/alpha/rules.mk
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/jisplit89/rev1/rules.mk
+++ b/keyboards/kakunpc/angel64/alpha/rules.mk
diff --git a/keyboards/kakunpc/angel64/readme.md b/keyboards/kakunpc/angel64/readme.md
new file mode 100644
index 0000000000..41f8233afb
--- /dev/null
+++ b/keyboards/kakunpc/angel64/readme.md
@@ -0,0 +1,15 @@
+# angel64
+
+![angel64](https://i.gyazo.com/d114d4b1789009dbe8c910eaeb3295c5.jpg)
+
+Keyboard for tablets.
+
+* Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
+* Hardware Supported: angel64_alpha, angel64_rev1, promicro
+* Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kakunpc/angel64/rev1:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/angel64/rev1/config.h b/keyboards/kakunpc/angel64/rev1/config.h
index b3270fdd8b..b3270fdd8b 100644
--- a/keyboards/angel64/rev1/config.h
+++ b/keyboards/kakunpc/angel64/rev1/config.h
diff --git a/keyboards/angel64/rev1/info.json b/keyboards/kakunpc/angel64/rev1/info.json
index fe6b4f5e05..fe6b4f5e05 100644
--- a/keyboards/angel64/rev1/info.json
+++ b/keyboards/kakunpc/angel64/rev1/info.json
diff --git a/keyboards/angel64/rev1/keymaps/default/keymap.c b/keyboards/kakunpc/angel64/rev1/keymaps/default/keymap.c
index 7ad3964e24..7ad3964e24 100644
--- a/keyboards/angel64/rev1/keymaps/default/keymap.c
+++ b/keyboards/kakunpc/angel64/rev1/keymaps/default/keymap.c
diff --git a/keyboards/angel64/rev1/keymaps/default/readme.md b/keyboards/kakunpc/angel64/rev1/keymaps/default/readme.md
index f4cd48f2ef..f4cd48f2ef 100644
--- a/keyboards/angel64/rev1/keymaps/default/readme.md
+++ b/keyboards/kakunpc/angel64/rev1/keymaps/default/readme.md
diff --git a/keyboards/angel64/rev1/keymaps/kakunpc/config.h b/keyboards/kakunpc/angel64/rev1/keymaps/kakunpc/config.h
index bf1149ebc6..bf1149ebc6 100644
--- a/keyboards/angel64/rev1/keymaps/kakunpc/config.h
+++ b/keyboards/kakunpc/angel64/rev1/keymaps/kakunpc/config.h
diff --git a/keyboards/angel64/rev1/keymaps/kakunpc/keymap.c b/keyboards/kakunpc/angel64/rev1/keymaps/kakunpc/keymap.c
index 6c5184c1b3..6c5184c1b3 100644
--- a/keyboards/angel64/rev1/keymaps/kakunpc/keymap.c
+++ b/keyboards/kakunpc/angel64/rev1/keymaps/kakunpc/keymap.c
diff --git a/keyboards/angel64/rev1/keymaps/kakunpc/readme.md b/keyboards/kakunpc/angel64/rev1/keymaps/kakunpc/readme.md
index ca7d7961fc..ca7d7961fc 100644
--- a/keyboards/angel64/rev1/keymaps/kakunpc/readme.md
+++ b/keyboards/kakunpc/angel64/rev1/keymaps/kakunpc/readme.md
diff --git a/keyboards/kakunpc/angel64/rev1/matrix.c b/keyboards/kakunpc/angel64/rev1/matrix.c
new file mode 100644
index 0000000000..2851859cf2
--- /dev/null
+++ b/keyboards/kakunpc/angel64/rev1/matrix.c
@@ -0,0 +1,280 @@
+/*
+Copyright 2012-2018 Jun Wako, Jack Humbert, Yiancar
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+#include <stdint.h>
+#include <stdbool.h>
+#include "wait.h"
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+#include "debounce.h"
+#include "quantum.h"
+
+#if (MATRIX_COLS <= 8)
+# define print_matrix_header() print("\nr/c 01234567\n")
+# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
+# define matrix_bitpop(i) bitpop(matrix[i])
+# define ROW_SHIFTER ((uint8_t)1)
+#elif (MATRIX_COLS <= 16)
+# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
+# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
+# define matrix_bitpop(i) bitpop16(matrix[i])
+# define ROW_SHIFTER ((uint16_t)1)
+#elif (MATRIX_COLS <= 32)
+# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
+# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
+# define matrix_bitpop(i) bitpop32(matrix[i])
+# define ROW_SHIFTER ((uint32_t)1)
+#endif
+
+#ifdef MATRIX_MASKED
+ extern const matrix_row_t matrix_mask[];
+#endif
+
+static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
+static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
+
+/* matrix state(1:on, 0:off) */
+static matrix_row_t raw_matrix[MATRIX_ROWS]; //raw values
+static matrix_row_t matrix[MATRIX_ROWS]; //debounced values
+
+__attribute__ ((weak))
+void matrix_init_quantum(void) {
+ matrix_init_kb();
+}
+
+__attribute__ ((weak))
+void matrix_scan_quantum(void) {
+ matrix_scan_kb();
+}
+
+__attribute__ ((weak))
+void matrix_init_kb(void) {
+ matrix_init_user();
+}
+
+__attribute__ ((weak))
+void matrix_scan_kb(void) {
+ matrix_scan_user();
+}
+
+__attribute__ ((weak))
+void matrix_init_user(void) {
+}
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {
+}
+
+inline
+uint8_t matrix_rows(void) {
+ return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void) {
+ return MATRIX_COLS;
+}
+
+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)
+{
+ // Matrix mask lets you disable switches in the returned matrix data. For example, if you have a
+ // switch blocker installed and the switch is always pressed.
+#ifdef MATRIX_MASKED
+ return matrix[row] & matrix_mask[row];
+#else
+ return matrix[row];
+#endif
+}
+
+void matrix_print(void)
+{
+ print_matrix_header();
+
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ print_hex8(row); print(": ");
+ print_matrix_row(row);
+ print("\n");
+ }
+}
+
+uint8_t matrix_key_count(void)
+{
+ uint8_t count = 0;
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ count += matrix_bitpop(i);
+ }
+ return count;
+}
+
+static void select_row(uint8_t row)
+{
+ setPinOutput(row_pins[row]);
+ writePinLow(row_pins[row]);
+}
+
+static void unselect_row(uint8_t row)
+{
+ setPinInputHigh(row_pins[row]);
+}
+
+static void unselect_rows(void)
+{
+ for(uint8_t x = 0; x < MATRIX_ROWS; x++) {
+ setPinInputHigh(row_pins[x]);
+ }
+}
+
+static void select_col(uint8_t col)
+{
+ setPinOutput(col_pins[col]);
+ writePinLow(col_pins[col]);
+}
+
+static void unselect_col(uint8_t col)
+{
+ setPinInputHigh(col_pins[col]);
+}
+
+static void unselect_cols(void)
+{
+ for(uint8_t x = 0; x < MATRIX_COLS; x++) {
+ setPinInputHigh(col_pins[x]);
+ }
+}
+
+static void init_pins(void) {
+ unselect_rows();
+ unselect_cols();
+ for (uint8_t x = 0; x < MATRIX_COLS; x++) {
+ setPinInputHigh(col_pins[x]);
+ }
+ for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
+ setPinInputHigh(row_pins[x]);
+ }
+}
+
+static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
+{
+ // Store last value of row prior to reading
+ matrix_row_t last_row_value = current_matrix[current_row];
+
+ // Clear data in matrix row
+ current_matrix[current_row] = 0;
+
+ // Select row and wait for row selecton to stabilize
+ select_row(current_row);
+ wait_us(30);
+
+ // For each col...
+ for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
+
+ // Select the col pin to read (active low)
+ uint8_t pin_state = readPin(col_pins[col_index]);
+
+ // Populate the matrix row with the state of the col pin
+ current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index);
+ }
+
+ // Unselect row
+ unselect_row(current_row);
+
+ return (last_row_value != current_matrix[current_row]);
+}
+
+static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
+{
+ bool matrix_changed = false;
+
+ // Select col and wait for col selecton to stabilize
+ select_col(current_col);
+ wait_us(30);
+
+ // For each row...
+ for(uint8_t row_index = 0; row_index < MATRIX_ROWS/2; row_index++)
+ {
+ uint8_t tmp = row_index + MATRIX_ROWS/2;
+ // Store last value of row prior to reading
+ matrix_row_t last_row_value = current_matrix[tmp];
+
+ // Check row pin state
+ if (readPin(row_pins[row_index]) == 0)
+ {
+ // Pin LO, set col bit
+ current_matrix[tmp] |= (ROW_SHIFTER << current_col);
+ }
+ else
+ {
+ // Pin HI, clear col bit
+ current_matrix[tmp] &= ~(ROW_SHIFTER << current_col);
+ }
+
+ // Determine if the matrix changed state
+ if ((last_row_value != current_matrix[tmp]) && !(matrix_changed))
+ {
+ matrix_changed = true;
+ }
+ }
+
+ // Unselect col
+ unselect_col(current_col);
+
+ return matrix_changed;
+}
+
+void matrix_init(void) {
+
+ // initialize key pins
+ init_pins();
+
+ // initialize matrix state: all keys off
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+ raw_matrix[i] = 0;
+ matrix[i] = 0;
+ }
+
+ debounce_init(MATRIX_ROWS);
+
+ matrix_init_quantum();
+}
+
+uint8_t matrix_scan(void)
+{
+ bool changed = false;
+
+ // Set row, read cols
+ for (uint8_t current_row = 0; current_row < MATRIX_ROWS / 2; current_row++) {
+ changed |= read_cols_on_row(raw_matrix, current_row);
+ }
+ //else
+ // Set col, read rows
+ for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
+ changed |= read_rows_on_col(raw_matrix, current_col);
+ }
+
+ debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
+
+ matrix_scan_quantum();
+ return (uint8_t)changed;
+}
diff --git a/keyboards/kakunpc/angel64/rev1/readme.md b/keyboards/kakunpc/angel64/rev1/readme.md
new file mode 100644
index 0000000000..4809710a43
--- /dev/null
+++ b/keyboards/kakunpc/angel64/rev1/readme.md
@@ -0,0 +1,15 @@
+# angel64
+
+![angel64](https://i.gyazo.com/d114d4b1789009dbe8c910eaeb3295c5.jpg)
+
+Keyboard for tablets.
+
+* Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
+* Hardware Supported: angel64_rev1, promicro
+* Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kakunpc/angel64/rev1:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/angel64/rev1/rev1.c b/keyboards/kakunpc/angel64/rev1/rev1.c
index 40ff30e620..40ff30e620 100644
--- a/keyboards/angel64/rev1/rev1.c
+++ b/keyboards/kakunpc/angel64/rev1/rev1.c
diff --git a/keyboards/angel64/rev1/rev1.h b/keyboards/kakunpc/angel64/rev1/rev1.h
index f4335601a9..f4335601a9 100644
--- a/keyboards/angel64/rev1/rev1.h
+++ b/keyboards/kakunpc/angel64/rev1/rev1.h
diff --git a/keyboards/naked48/keymaps/salicylic_with_setta21/rules.mk b/keyboards/kakunpc/angel64/rev1/rules.mk
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/naked48/keymaps/salicylic_with_setta21/rules.mk
+++ b/keyboards/kakunpc/angel64/rev1/rules.mk
diff --git a/keyboards/kakunpc/angel64/rules.mk b/keyboards/kakunpc/angel64/rules.mk
new file mode 100644
index 0000000000..ca4e93f35c
--- /dev/null
+++ b/keyboards/kakunpc/angel64/rules.mk
@@ -0,0 +1,25 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = no # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+OLED_ENABLE = yes
+OLED_DRIVER = SSD1306
+CUSTOM_MATRIX = yes
+
+SRC += matrix.c
+
+DEFAULT_FOLDER = kakunpc/angel64/rev1
diff --git a/keyboards/claw44/.noci b/keyboards/kakunpc/business_card/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/claw44/.noci
+++ b/keyboards/kakunpc/business_card/.noci
diff --git a/keyboards/claw44/rev1/.noci b/keyboards/kakunpc/business_card/alpha/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/claw44/rev1/.noci
+++ b/keyboards/kakunpc/business_card/alpha/.noci
diff --git a/keyboards/business_card/alpha/alpha.c b/keyboards/kakunpc/business_card/alpha/alpha.c
index 1c2936e157..1c2936e157 100644
--- a/keyboards/business_card/alpha/alpha.c
+++ b/keyboards/kakunpc/business_card/alpha/alpha.c
diff --git a/keyboards/business_card/alpha/alpha.h b/keyboards/kakunpc/business_card/alpha/alpha.h
index 9807576899..9807576899 100644
--- a/keyboards/business_card/alpha/alpha.h
+++ b/keyboards/kakunpc/business_card/alpha/alpha.h
diff --git a/keyboards/business_card/alpha/config.h b/keyboards/kakunpc/business_card/alpha/config.h
index 81bb16161f..81bb16161f 100644
--- a/keyboards/business_card/alpha/config.h
+++ b/keyboards/kakunpc/business_card/alpha/config.h
diff --git a/keyboards/business_card/alpha/info.json b/keyboards/kakunpc/business_card/alpha/info.json
index 57f0fbd9a6..57f0fbd9a6 100644
--- a/keyboards/business_card/alpha/info.json
+++ b/keyboards/kakunpc/business_card/alpha/info.json
diff --git a/keyboards/business_card/alpha/keymaps/default/config.h b/keyboards/kakunpc/business_card/alpha/keymaps/default/config.h
index 7c15789bdf..7c15789bdf 100644
--- a/keyboards/business_card/alpha/keymaps/default/config.h
+++ b/keyboards/kakunpc/business_card/alpha/keymaps/default/config.h
diff --git a/keyboards/business_card/alpha/keymaps/default/keymap.c b/keyboards/kakunpc/business_card/alpha/keymaps/default/keymap.c
index 64070d23d2..64070d23d2 100644
--- a/keyboards/business_card/alpha/keymaps/default/keymap.c
+++ b/keyboards/kakunpc/business_card/alpha/keymaps/default/keymap.c
diff --git a/keyboards/business_card/alpha/keymaps/default/readme.md b/keyboards/kakunpc/business_card/alpha/keymaps/default/readme.md
index 22cc77eebf..22cc77eebf 100644
--- a/keyboards/business_card/alpha/keymaps/default/readme.md
+++ b/keyboards/kakunpc/business_card/alpha/keymaps/default/readme.md
diff --git a/keyboards/business_card/alpha/rules.mk b/keyboards/kakunpc/business_card/alpha/rules.mk
index e85829c110..e85829c110 100644
--- a/keyboards/business_card/alpha/rules.mk
+++ b/keyboards/kakunpc/business_card/alpha/rules.mk
diff --git a/keyboards/business_card/beta/beta.c b/keyboards/kakunpc/business_card/beta/beta.c
index 7a9aa1b9bd..7a9aa1b9bd 100644
--- a/keyboards/business_card/beta/beta.c
+++ b/keyboards/kakunpc/business_card/beta/beta.c
diff --git a/keyboards/business_card/beta/beta.h b/keyboards/kakunpc/business_card/beta/beta.h
index 21a334e8a9..21a334e8a9 100644
--- a/keyboards/business_card/beta/beta.h
+++ b/keyboards/kakunpc/business_card/beta/beta.h
diff --git a/keyboards/business_card/beta/config.h b/keyboards/kakunpc/business_card/beta/config.h
index 9e4e8da963..9e4e8da963 100644
--- a/keyboards/business_card/beta/config.h
+++ b/keyboards/kakunpc/business_card/beta/config.h
diff --git a/keyboards/business_card/beta/info.json b/keyboards/kakunpc/business_card/beta/info.json
index 58f2a5b20d..58f2a5b20d 100644
--- a/keyboards/business_card/beta/info.json
+++ b/keyboards/kakunpc/business_card/beta/info.json
diff --git a/keyboards/business_card/beta/keymaps/default/config.h b/keyboards/kakunpc/business_card/beta/keymaps/default/config.h
index e04ba7e4d0..e04ba7e4d0 100644
--- a/keyboards/business_card/beta/keymaps/default/config.h
+++ b/keyboards/kakunpc/business_card/beta/keymaps/default/config.h
diff --git a/keyboards/business_card/beta/keymaps/default/keymap.c b/keyboards/kakunpc/business_card/beta/keymaps/default/keymap.c
index 8d2413477e..8d2413477e 100644
--- a/keyboards/business_card/beta/keymaps/default/keymap.c
+++ b/keyboards/kakunpc/business_card/beta/keymaps/default/keymap.c
diff --git a/keyboards/business_card/beta/keymaps/default/readme.md b/keyboards/kakunpc/business_card/beta/keymaps/default/readme.md
index 22cc77eebf..22cc77eebf 100644
--- a/keyboards/business_card/beta/keymaps/default/readme.md
+++ b/keyboards/kakunpc/business_card/beta/keymaps/default/readme.md
diff --git a/keyboards/business_card/beta/rules.mk b/keyboards/kakunpc/business_card/beta/rules.mk
index e85829c110..e85829c110 100644
--- a/keyboards/business_card/beta/rules.mk
+++ b/keyboards/kakunpc/business_card/beta/rules.mk
diff --git a/keyboards/business_card/business_card.c b/keyboards/kakunpc/business_card/business_card.c
index 01beb28220..01beb28220 100644
--- a/keyboards/business_card/business_card.c
+++ b/keyboards/kakunpc/business_card/business_card.c
diff --git a/keyboards/kakunpc/business_card/business_card.h b/keyboards/kakunpc/business_card/business_card.h
new file mode 100644
index 0000000000..125c3080d6
--- /dev/null
+++ b/keyboards/kakunpc/business_card/business_card.h
@@ -0,0 +1,25 @@
+/* Copyright 2019 kakunpc
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#pragma once
+
+#ifdef KEYBOARD_kakunpc_business_card_alpha
+ #include "alpha.h"
+#endif
+#ifdef KEYBOARD_kakunpc_business_card_beta
+ #include "beta.h"
+#endif
+
+#include "quantum.h"
diff --git a/keyboards/business_card/config.h b/keyboards/kakunpc/business_card/config.h
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/business_card/config.h
+++ b/keyboards/kakunpc/business_card/config.h
diff --git a/keyboards/kakunpc/business_card/readme.md b/keyboards/kakunpc/business_card/readme.md
new file mode 100644
index 0000000000..cbd05af410
--- /dev/null
+++ b/keyboards/kakunpc/business_card/readme.md
@@ -0,0 +1,15 @@
+# business_card
+
+![business_card](imgur.com image replace me!)
+
+A short description of the keyboard/project
+
+Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
+Hardware Supported: The PCBs, controllers supported
+Hardware Availability: links to where you can find this hardware
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kakunpc/business_card/beta: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/kakunpc/business_card/rules.mk b/keyboards/kakunpc/business_card/rules.mk
new file mode 100644
index 0000000000..ad9ea936af
--- /dev/null
+++ b/keyboards/kakunpc/business_card/rules.mk
@@ -0,0 +1,20 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = no # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+DEFAULT_FOLDER = kakunpc/business_card/beta
diff --git a/keyboards/choc_taro/choc_taro.c b/keyboards/kakunpc/choc_taro/choc_taro.c
index 2a835b2bd8..2a835b2bd8 100644
--- a/keyboards/choc_taro/choc_taro.c
+++ b/keyboards/kakunpc/choc_taro/choc_taro.c
diff --git a/keyboards/choc_taro/choc_taro.h b/keyboards/kakunpc/choc_taro/choc_taro.h
index cf07b80b5c..cf07b80b5c 100644
--- a/keyboards/choc_taro/choc_taro.h
+++ b/keyboards/kakunpc/choc_taro/choc_taro.h
diff --git a/keyboards/choc_taro/config.h b/keyboards/kakunpc/choc_taro/config.h
index 2852206b14..2852206b14 100644
--- a/keyboards/choc_taro/config.h
+++ b/keyboards/kakunpc/choc_taro/config.h
diff --git a/keyboards/choc_taro/info.json b/keyboards/kakunpc/choc_taro/info.json
index 3a193ee05e..3a193ee05e 100644
--- a/keyboards/choc_taro/info.json
+++ b/keyboards/kakunpc/choc_taro/info.json
diff --git a/keyboards/choc_taro/keymaps/default/keymap.c b/keyboards/kakunpc/choc_taro/keymaps/default/keymap.c
index 4de3c2d55a..4de3c2d55a 100644
--- a/keyboards/choc_taro/keymaps/default/keymap.c
+++ b/keyboards/kakunpc/choc_taro/keymaps/default/keymap.c
diff --git a/keyboards/choc_taro/keymaps/default/readme.md b/keyboards/kakunpc/choc_taro/keymaps/default/readme.md
index a2cb119040..a2cb119040 100644
--- a/keyboards/choc_taro/keymaps/default/readme.md
+++ b/keyboards/kakunpc/choc_taro/keymaps/default/readme.md
diff --git a/keyboards/choc_taro/keymaps/via/keymap.c b/keyboards/kakunpc/choc_taro/keymaps/via/keymap.c
index a1d48eb5e9..a1d48eb5e9 100644
--- a/keyboards/choc_taro/keymaps/via/keymap.c
+++ b/keyboards/kakunpc/choc_taro/keymaps/via/keymap.c
diff --git a/keyboards/choc_taro/keymaps/via/readme.md b/keyboards/kakunpc/choc_taro/keymaps/via/readme.md
index cb3af77dfa..cb3af77dfa 100644
--- a/keyboards/choc_taro/keymaps/via/readme.md
+++ b/keyboards/kakunpc/choc_taro/keymaps/via/readme.md
diff --git a/keyboards/claw44/keymaps/via/rules.mk b/keyboards/kakunpc/choc_taro/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/claw44/keymaps/via/rules.mk
+++ b/keyboards/kakunpc/choc_taro/keymaps/via/rules.mk
diff --git a/keyboards/choc_taro/matrix.c b/keyboards/kakunpc/choc_taro/matrix.c
index 02421551da..02421551da 100644
--- a/keyboards/choc_taro/matrix.c
+++ b/keyboards/kakunpc/choc_taro/matrix.c
diff --git a/keyboards/kakunpc/choc_taro/readme.md b/keyboards/kakunpc/choc_taro/readme.md
new file mode 100644
index 0000000000..8e641c72b8
--- /dev/null
+++ b/keyboards/kakunpc/choc_taro/readme.md
@@ -0,0 +1,15 @@
+# choc_taro
+
+![choc_taro](https://i.gyazo.com/717ddeed13cd2f956ed01b71c6e96f87.jpg)
+
+gh60 compatible choc keyboard
+
+* Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
+* Hardware Supported: choc taro pcb
+* Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kakunpc/choc_taro: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/choc_taro/rules.mk b/keyboards/kakunpc/choc_taro/rules.mk
index b8b8a0bc35..b8b8a0bc35 100644
--- a/keyboards/choc_taro/rules.mk
+++ b/keyboards/kakunpc/choc_taro/rules.mk
diff --git a/keyboards/rabbit_capture_plan/config.h b/keyboards/kakunpc/rabbit_capture_plan/config.h
index b622d33c1a..b622d33c1a 100644
--- a/keyboards/rabbit_capture_plan/config.h
+++ b/keyboards/kakunpc/rabbit_capture_plan/config.h
diff --git a/keyboards/rabbit_capture_plan/info.json b/keyboards/kakunpc/rabbit_capture_plan/info.json
index 4a660cf85e..4a660cf85e 100644
--- a/keyboards/rabbit_capture_plan/info.json
+++ b/keyboards/kakunpc/rabbit_capture_plan/info.json
diff --git a/keyboards/rabbit_capture_plan/keymaps/default/keymap.c b/keyboards/kakunpc/rabbit_capture_plan/keymaps/default/keymap.c
index cbfb6b1410..cbfb6b1410 100644
--- a/keyboards/rabbit_capture_plan/keymaps/default/keymap.c
+++ b/keyboards/kakunpc/rabbit_capture_plan/keymaps/default/keymap.c
diff --git a/keyboards/rabbit_capture_plan/keymaps/default/readme.md b/keyboards/kakunpc/rabbit_capture_plan/keymaps/default/readme.md
index 2ececc3fc2..2ececc3fc2 100644
--- a/keyboards/rabbit_capture_plan/keymaps/default/readme.md
+++ b/keyboards/kakunpc/rabbit_capture_plan/keymaps/default/readme.md
diff --git a/keyboards/rabbit_capture_plan/keymaps/via/keymap.c b/keyboards/kakunpc/rabbit_capture_plan/keymaps/via/keymap.c
index f8109f4f08..f8109f4f08 100644
--- a/keyboards/rabbit_capture_plan/keymaps/via/keymap.c
+++ b/keyboards/kakunpc/rabbit_capture_plan/keymaps/via/keymap.c
diff --git a/keyboards/rabbit_capture_plan/keymaps/via/readme.md b/keyboards/kakunpc/rabbit_capture_plan/keymaps/via/readme.md
index 928cdb8b77..928cdb8b77 100644
--- a/keyboards/rabbit_capture_plan/keymaps/via/readme.md
+++ b/keyboards/kakunpc/rabbit_capture_plan/keymaps/via/readme.md
diff --git a/keyboards/delilah/keymaps/via/rules.mk b/keyboards/kakunpc/rabbit_capture_plan/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/delilah/keymaps/via/rules.mk
+++ b/keyboards/kakunpc/rabbit_capture_plan/keymaps/via/rules.mk
diff --git a/keyboards/rabbit_capture_plan/rabbit_capture_plan.c b/keyboards/kakunpc/rabbit_capture_plan/rabbit_capture_plan.c
index 7a45e61f35..7a45e61f35 100644
--- a/keyboards/rabbit_capture_plan/rabbit_capture_plan.c
+++ b/keyboards/kakunpc/rabbit_capture_plan/rabbit_capture_plan.c
diff --git a/keyboards/rabbit_capture_plan/rabbit_capture_plan.h b/keyboards/kakunpc/rabbit_capture_plan/rabbit_capture_plan.h
index 8065fdfeb9..8065fdfeb9 100644
--- a/keyboards/rabbit_capture_plan/rabbit_capture_plan.h
+++ b/keyboards/kakunpc/rabbit_capture_plan/rabbit_capture_plan.h
diff --git a/keyboards/kakunpc/rabbit_capture_plan/readme.md b/keyboards/kakunpc/rabbit_capture_plan/readme.md
new file mode 100644
index 0000000000..fa80367a12
--- /dev/null
+++ b/keyboards/kakunpc/rabbit_capture_plan/readme.md
@@ -0,0 +1,19 @@
+# rabbit_capture_plan
+
+![rabbit_capture_plan](https://i.gyazo.com/eb25048b17906f897253e8be18db001c.jpg)
+
+This is 70 keys split keyboard with trackball.
+
+* Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
+* Hardware Supported: rabbit capture plan pcb
+* Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kakunpc/rabbit_capture_plan:default
+
+Flashing example for this keyboard:
+
+ make kakunpc/rabbit_capture_plan:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/rabbit_capture_plan/rules.mk b/keyboards/kakunpc/rabbit_capture_plan/rules.mk
index d6f3529e10..d6f3529e10 100644
--- a/keyboards/rabbit_capture_plan/rules.mk
+++ b/keyboards/kakunpc/rabbit_capture_plan/rules.mk
diff --git a/keyboards/suihankey/alpha/alpha.c b/keyboards/kakunpc/suihankey/alpha/alpha.c
index 1c2936e157..1c2936e157 100644
--- a/keyboards/suihankey/alpha/alpha.c
+++ b/keyboards/kakunpc/suihankey/alpha/alpha.c
diff --git a/keyboards/suihankey/alpha/alpha.h b/keyboards/kakunpc/suihankey/alpha/alpha.h
index 02bba47104..02bba47104 100644
--- a/keyboards/suihankey/alpha/alpha.h
+++ b/keyboards/kakunpc/suihankey/alpha/alpha.h
diff --git a/keyboards/suihankey/alpha/config.h b/keyboards/kakunpc/suihankey/alpha/config.h
index b11478adfc..b11478adfc 100644
--- a/keyboards/suihankey/alpha/config.h
+++ b/keyboards/kakunpc/suihankey/alpha/config.h
diff --git a/keyboards/suihankey/alpha/info.json b/keyboards/kakunpc/suihankey/alpha/info.json
index 70029e17c9..70029e17c9 100644
--- a/keyboards/suihankey/alpha/info.json
+++ b/keyboards/kakunpc/suihankey/alpha/info.json
diff --git a/keyboards/suihankey/alpha/keymaps/default/keymap.c b/keyboards/kakunpc/suihankey/alpha/keymaps/default/keymap.c
index b682f0f15d..b682f0f15d 100644
--- a/keyboards/suihankey/alpha/keymaps/default/keymap.c
+++ b/keyboards/kakunpc/suihankey/alpha/keymaps/default/keymap.c
diff --git a/keyboards/suihankey/alpha/keymaps/default/readme.md b/keyboards/kakunpc/suihankey/alpha/keymaps/default/readme.md
index 95eac805a0..95eac805a0 100644
--- a/keyboards/suihankey/alpha/keymaps/default/readme.md
+++ b/keyboards/kakunpc/suihankey/alpha/keymaps/default/readme.md
diff --git a/keyboards/suihankey/alpha/readme.md b/keyboards/kakunpc/suihankey/alpha/readme.md
index fcba60ff1d..fcba60ff1d 100644
--- a/keyboards/suihankey/alpha/readme.md
+++ b/keyboards/kakunpc/suihankey/alpha/readme.md
diff --git a/keyboards/reviung34/keymaps/default_rgb/rules.mk b/keyboards/kakunpc/suihankey/alpha/rules.mk
index 1e3cebb145..1e3cebb145 100644
--- a/keyboards/reviung34/keymaps/default_rgb/rules.mk
+++ b/keyboards/kakunpc/suihankey/alpha/rules.mk
diff --git a/keyboards/kakunpc/suihankey/readme.md b/keyboards/kakunpc/suihankey/readme.md
new file mode 100644
index 0000000000..e8099dbca4
--- /dev/null
+++ b/keyboards/kakunpc/suihankey/readme.md
@@ -0,0 +1,18 @@
+# suihankey
+
+![suihankey](https://i.gyazo.com/f798c5967f2ac457dd520ab8ff83b6ac.jpg)
+
+Compact with only 36 keys is a concept keyboard.
+Supports OLED and RGBLED (optional)
+
+
+
+Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
+Hardware Supported: suihankeyboard_alpha, promicro
+Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kakunpc/suihankey/rev1:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/suihankey/rev1/config.h b/keyboards/kakunpc/suihankey/rev1/config.h
index b2801cd862..b2801cd862 100644
--- a/keyboards/suihankey/rev1/config.h
+++ b/keyboards/kakunpc/suihankey/rev1/config.h
diff --git a/keyboards/suihankey/rev1/info.json b/keyboards/kakunpc/suihankey/rev1/info.json
index 70029e17c9..70029e17c9 100644
--- a/keyboards/suihankey/rev1/info.json
+++ b/keyboards/kakunpc/suihankey/rev1/info.json
diff --git a/keyboards/suihankey/rev1/keymaps/default/keymap.c b/keyboards/kakunpc/suihankey/rev1/keymaps/default/keymap.c
index b682f0f15d..b682f0f15d 100644
--- a/keyboards/suihankey/rev1/keymaps/default/keymap.c
+++ b/keyboards/kakunpc/suihankey/rev1/keymaps/default/keymap.c
diff --git a/keyboards/suihankey/rev1/keymaps/default/readme.md b/keyboards/kakunpc/suihankey/rev1/keymaps/default/readme.md
index 95eac805a0..95eac805a0 100644
--- a/keyboards/suihankey/rev1/keymaps/default/readme.md
+++ b/keyboards/kakunpc/suihankey/rev1/keymaps/default/readme.md
diff --git a/keyboards/suihankey/rev1/readme.md b/keyboards/kakunpc/suihankey/rev1/readme.md
index 1c80a8af63..1c80a8af63 100644
--- a/keyboards/suihankey/rev1/readme.md
+++ b/keyboards/kakunpc/suihankey/rev1/readme.md
diff --git a/keyboards/suihankey/rev1/rev1.c b/keyboards/kakunpc/suihankey/rev1/rev1.c
index 40ff30e620..40ff30e620 100644
--- a/keyboards/suihankey/rev1/rev1.c
+++ b/keyboards/kakunpc/suihankey/rev1/rev1.c
diff --git a/keyboards/suihankey/rev1/rev1.h b/keyboards/kakunpc/suihankey/rev1/rev1.h
index cbc877abd5..cbc877abd5 100644
--- a/keyboards/suihankey/rev1/rev1.h
+++ b/keyboards/kakunpc/suihankey/rev1/rev1.h
diff --git a/keyboards/reviung34/keymaps/default_rgb2u/rules.mk b/keyboards/kakunpc/suihankey/rev1/rules.mk
index 1e3cebb145..1e3cebb145 100644
--- a/keyboards/reviung34/keymaps/default_rgb2u/rules.mk
+++ b/keyboards/kakunpc/suihankey/rev1/rules.mk
diff --git a/keyboards/kakunpc/suihankey/rules.mk b/keyboards/kakunpc/suihankey/rules.mk
new file mode 100644
index 0000000000..332c7d7355
--- /dev/null
+++ b/keyboards/kakunpc/suihankey/rules.mk
@@ -0,0 +1,23 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = atmel-dfu
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = no # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+OLED_ENABLE = yes
+OLED_DRIVER = SSD1306
+SPLIT_KEYBOARD = no
+
+DEFAULT_FOLDER = kakunpc/suihankey/rev1
diff --git a/keyboards/cu75/.noci b/keyboards/kakunpc/suihankey/split/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/cu75/.noci
+++ b/keyboards/kakunpc/suihankey/split/.noci
diff --git a/keyboards/getta25/.noci b/keyboards/kakunpc/suihankey/split/alpha/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/getta25/.noci
+++ b/keyboards/kakunpc/suihankey/split/alpha/.noci
diff --git a/keyboards/suihankey/split/alpha/alpha.c b/keyboards/kakunpc/suihankey/split/alpha/alpha.c
index 1c2936e157..1c2936e157 100644
--- a/keyboards/suihankey/split/alpha/alpha.c
+++ b/keyboards/kakunpc/suihankey/split/alpha/alpha.c
diff --git a/keyboards/suihankey/split/alpha/alpha.h b/keyboards/kakunpc/suihankey/split/alpha/alpha.h
index ba93405ecc..ba93405ecc 100644
--- a/keyboards/suihankey/split/alpha/alpha.h
+++ b/keyboards/kakunpc/suihankey/split/alpha/alpha.h
diff --git a/keyboards/suihankey/split/alpha/config.h b/keyboards/kakunpc/suihankey/split/alpha/config.h
index ae5acdbd4b..ae5acdbd4b 100644
--- a/keyboards/suihankey/split/alpha/config.h
+++ b/keyboards/kakunpc/suihankey/split/alpha/config.h
diff --git a/keyboards/kakunpc/suihankey/split/alpha/readme.md b/keyboards/kakunpc/suihankey/split/alpha/readme.md
new file mode 100644
index 0000000000..4a26a34b97
--- /dev/null
+++ b/keyboards/kakunpc/suihankey/split/alpha/readme.md
@@ -0,0 +1,18 @@
+# suihankey_alpha
+
+![suihankey_alpha](https://i.gyazo.com/f798c5967f2ac457dd520ab8ff83b6ac.jpg)
+
+Compact with only 36 keys is a concept keyboard.
+Supports OLED and RGBLED (optional)
+
+
+
+Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
+Hardware Supported: suihankey_alphaboard_alpha, promicro
+Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kakunpc/suihankey/alpha: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/reviung39/keymaps/default/rules.mk b/keyboards/kakunpc/suihankey/split/alpha/rules.mk
index 1e3cebb145..1e3cebb145 100644
--- a/keyboards/reviung39/keymaps/default/rules.mk
+++ b/keyboards/kakunpc/suihankey/split/alpha/rules.mk
diff --git a/keyboards/suihankey/split/info.json b/keyboards/kakunpc/suihankey/split/info.json
index 2f40949f6b..2f40949f6b 100644
--- a/keyboards/suihankey/split/info.json
+++ b/keyboards/kakunpc/suihankey/split/info.json
diff --git a/keyboards/suihankey/split/keymaps/default/keymap.c b/keyboards/kakunpc/suihankey/split/keymaps/default/keymap.c
index a48072d9f2..a48072d9f2 100644
--- a/keyboards/suihankey/split/keymaps/default/keymap.c
+++ b/keyboards/kakunpc/suihankey/split/keymaps/default/keymap.c
diff --git a/keyboards/suihankey/split/keymaps/default/readme.md b/keyboards/kakunpc/suihankey/split/keymaps/default/readme.md
index 43ede89526..43ede89526 100644
--- a/keyboards/suihankey/split/keymaps/default/readme.md
+++ b/keyboards/kakunpc/suihankey/split/keymaps/default/readme.md
diff --git a/keyboards/kakunpc/suihankey/split/readme.md b/keyboards/kakunpc/suihankey/split/readme.md
new file mode 100644
index 0000000000..ed2058290b
--- /dev/null
+++ b/keyboards/kakunpc/suihankey/split/readme.md
@@ -0,0 +1,18 @@
+# suihankey split
+
+![suihankey](https://i.gyazo.com/f798c5967f2ac457dd520ab8ff83b6ac.jpg)
+
+Compact with only 36 keys is a concept keyboard.
+Supports OLED and RGBLED (optional)
+
+
+
+Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
+Hardware Supported: suihankeyboard_alpha, promicro
+Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kakunpc/suihankey/split: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/suihankey/split/rev1/config.h b/keyboards/kakunpc/suihankey/split/rev1/config.h
index 6b7dd2bac9..6b7dd2bac9 100644
--- a/keyboards/suihankey/split/rev1/config.h
+++ b/keyboards/kakunpc/suihankey/split/rev1/config.h
diff --git a/keyboards/kakunpc/suihankey/split/rev1/readme.md b/keyboards/kakunpc/suihankey/split/rev1/readme.md
new file mode 100644
index 0000000000..a4e60fe1b9
--- /dev/null
+++ b/keyboards/kakunpc/suihankey/split/rev1/readme.md
@@ -0,0 +1,18 @@
+# suihankey_rev1
+
+![suihankey_rev1](https://i.gyazo.com/f798c5967f2ac457dd520ab8ff83b6ac.jpg)
+
+Compact with only 36 keys is a concept keyboard.
+Supports OLED and RGBLED (optional)
+
+
+
+Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
+Hardware Supported: suihankey_rev1board_rev1, promicro
+Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kakunpc/suihankey/rev1:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/suihankey/split/rev1/rev1.c b/keyboards/kakunpc/suihankey/split/rev1/rev1.c
index 40ff30e620..40ff30e620 100644
--- a/keyboards/suihankey/split/rev1/rev1.c
+++ b/keyboards/kakunpc/suihankey/split/rev1/rev1.c
diff --git a/keyboards/suihankey/split/rev1/rev1.h b/keyboards/kakunpc/suihankey/split/rev1/rev1.h
index 98618ba712..98618ba712 100644
--- a/keyboards/suihankey/split/rev1/rev1.h
+++ b/keyboards/kakunpc/suihankey/split/rev1/rev1.h
diff --git a/keyboards/suihankey/split/rev1/rules.mk b/keyboards/kakunpc/suihankey/split/rev1/rules.mk
index d3661099d0..d3661099d0 100644
--- a/keyboards/suihankey/split/rev1/rules.mk
+++ b/keyboards/kakunpc/suihankey/split/rev1/rules.mk
diff --git a/keyboards/kakunpc/suihankey/split/rules.mk b/keyboards/kakunpc/suihankey/split/rules.mk
new file mode 100644
index 0000000000..6da41b20b8
--- /dev/null
+++ b/keyboards/kakunpc/suihankey/split/rules.mk
@@ -0,0 +1,4 @@
+OLED_ENABLE = no
+SPLIT_KEYBOARD = yes
+
+DEFAULT_FOLDER = kakunpc/suihankey/split/rev1
diff --git a/keyboards/thedogkeyboard/config.h b/keyboards/kakunpc/thedogkeyboard/config.h
index 099c157cff..099c157cff 100644
--- a/keyboards/thedogkeyboard/config.h
+++ b/keyboards/kakunpc/thedogkeyboard/config.h
diff --git a/keyboards/thedogkeyboard/info.json b/keyboards/kakunpc/thedogkeyboard/info.json
index df6cc6ffdc..df6cc6ffdc 100644
--- a/keyboards/thedogkeyboard/info.json
+++ b/keyboards/kakunpc/thedogkeyboard/info.json
diff --git a/keyboards/thedogkeyboard/keymaps/default/keymap.c b/keyboards/kakunpc/thedogkeyboard/keymaps/default/keymap.c
index 7632f81b93..7632f81b93 100644
--- a/keyboards/thedogkeyboard/keymaps/default/keymap.c
+++ b/keyboards/kakunpc/thedogkeyboard/keymaps/default/keymap.c
diff --git a/keyboards/thedogkeyboard/keymaps/default/readme.md b/keyboards/kakunpc/thedogkeyboard/keymaps/default/readme.md
index 045729a7a5..045729a7a5 100644
--- a/keyboards/thedogkeyboard/keymaps/default/readme.md
+++ b/keyboards/kakunpc/thedogkeyboard/keymaps/default/readme.md
diff --git a/keyboards/thedogkeyboard/keymaps/kakunpc/keymap.c b/keyboards/kakunpc/thedogkeyboard/keymaps/kakunpc/keymap.c
index cc3ba84d87..cc3ba84d87 100644
--- a/keyboards/thedogkeyboard/keymaps/kakunpc/keymap.c
+++ b/keyboards/kakunpc/thedogkeyboard/keymaps/kakunpc/keymap.c
diff --git a/keyboards/thedogkeyboard/keymaps/kakunpc/readme.md b/keyboards/kakunpc/thedogkeyboard/keymaps/kakunpc/readme.md
index 66eab07b94..66eab07b94 100644
--- a/keyboards/thedogkeyboard/keymaps/kakunpc/readme.md
+++ b/keyboards/kakunpc/thedogkeyboard/keymaps/kakunpc/readme.md
diff --git a/keyboards/kakunpc/thedogkeyboard/matrix.c b/keyboards/kakunpc/thedogkeyboard/matrix.c
new file mode 100644
index 0000000000..2851859cf2
--- /dev/null
+++ b/keyboards/kakunpc/thedogkeyboard/matrix.c
@@ -0,0 +1,280 @@
+/*
+Copyright 2012-2018 Jun Wako, Jack Humbert, Yiancar
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+#include <stdint.h>
+#include <stdbool.h>
+#include "wait.h"
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+#include "debounce.h"
+#include "quantum.h"
+
+#if (MATRIX_COLS <= 8)
+# define print_matrix_header() print("\nr/c 01234567\n")
+# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
+# define matrix_bitpop(i) bitpop(matrix[i])
+# define ROW_SHIFTER ((uint8_t)1)
+#elif (MATRIX_COLS <= 16)
+# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
+# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
+# define matrix_bitpop(i) bitpop16(matrix[i])
+# define ROW_SHIFTER ((uint16_t)1)
+#elif (MATRIX_COLS <= 32)
+# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
+# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
+# define matrix_bitpop(i) bitpop32(matrix[i])
+# define ROW_SHIFTER ((uint32_t)1)
+#endif
+
+#ifdef MATRIX_MASKED
+ extern const matrix_row_t matrix_mask[];
+#endif
+
+static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
+static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
+
+/* matrix state(1:on, 0:off) */
+static matrix_row_t raw_matrix[MATRIX_ROWS]; //raw values
+static matrix_row_t matrix[MATRIX_ROWS]; //debounced values
+
+__attribute__ ((weak))
+void matrix_init_quantum(void) {
+ matrix_init_kb();
+}
+
+__attribute__ ((weak))
+void matrix_scan_quantum(void) {
+ matrix_scan_kb();
+}
+
+__attribute__ ((weak))
+void matrix_init_kb(void) {
+ matrix_init_user();
+}
+
+__attribute__ ((weak))
+void matrix_scan_kb(void) {
+ matrix_scan_user();
+}
+
+__attribute__ ((weak))
+void matrix_init_user(void) {
+}
+
+__attribute__ ((weak))
+void matrix_scan_user(void) {
+}
+
+inline
+uint8_t matrix_rows(void) {
+ return MATRIX_ROWS;
+}
+
+inline
+uint8_t matrix_cols(void) {
+ return MATRIX_COLS;
+}
+
+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)
+{
+ // Matrix mask lets you disable switches in the returned matrix data. For example, if you have a
+ // switch blocker installed and the switch is always pressed.
+#ifdef MATRIX_MASKED
+ return matrix[row] & matrix_mask[row];
+#else
+ return matrix[row];
+#endif
+}
+
+void matrix_print(void)
+{
+ print_matrix_header();
+
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ print_hex8(row); print(": ");
+ print_matrix_row(row);
+ print("\n");
+ }
+}
+
+uint8_t matrix_key_count(void)
+{
+ uint8_t count = 0;
+ for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
+ count += matrix_bitpop(i);
+ }
+ return count;
+}
+
+static void select_row(uint8_t row)
+{
+ setPinOutput(row_pins[row]);
+ writePinLow(row_pins[row]);
+}
+
+static void unselect_row(uint8_t row)
+{
+ setPinInputHigh(row_pins[row]);
+}
+
+static void unselect_rows(void)
+{
+ for(uint8_t x = 0; x < MATRIX_ROWS; x++) {
+ setPinInputHigh(row_pins[x]);
+ }
+}
+
+static void select_col(uint8_t col)
+{
+ setPinOutput(col_pins[col]);
+ writePinLow(col_pins[col]);
+}
+
+static void unselect_col(uint8_t col)
+{
+ setPinInputHigh(col_pins[col]);
+}
+
+static void unselect_cols(void)
+{
+ for(uint8_t x = 0; x < MATRIX_COLS; x++) {
+ setPinInputHigh(col_pins[x]);
+ }
+}
+
+static void init_pins(void) {
+ unselect_rows();
+ unselect_cols();
+ for (uint8_t x = 0; x < MATRIX_COLS; x++) {
+ setPinInputHigh(col_pins[x]);
+ }
+ for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
+ setPinInputHigh(row_pins[x]);
+ }
+}
+
+static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
+{
+ // Store last value of row prior to reading
+ matrix_row_t last_row_value = current_matrix[current_row];
+
+ // Clear data in matrix row
+ current_matrix[current_row] = 0;
+
+ // Select row and wait for row selecton to stabilize
+ select_row(current_row);
+ wait_us(30);
+
+ // For each col...
+ for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
+
+ // Select the col pin to read (active low)
+ uint8_t pin_state = readPin(col_pins[col_index]);
+
+ // Populate the matrix row with the state of the col pin
+ current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index);
+ }
+
+ // Unselect row
+ unselect_row(current_row);
+
+ return (last_row_value != current_matrix[current_row]);
+}
+
+static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
+{
+ bool matrix_changed = false;
+
+ // Select col and wait for col selecton to stabilize
+ select_col(current_col);
+ wait_us(30);
+
+ // For each row...
+ for(uint8_t row_index = 0; row_index < MATRIX_ROWS/2; row_index++)
+ {
+ uint8_t tmp = row_index + MATRIX_ROWS/2;
+ // Store last value of row prior to reading
+ matrix_row_t last_row_value = current_matrix[tmp];
+
+ // Check row pin state
+ if (readPin(row_pins[row_index]) == 0)
+ {
+ // Pin LO, set col bit
+ current_matrix[tmp] |= (ROW_SHIFTER << current_col);
+ }
+ else
+ {
+ // Pin HI, clear col bit
+ current_matrix[tmp] &= ~(ROW_SHIFTER << current_col);
+ }
+
+ // Determine if the matrix changed state
+ if ((last_row_value != current_matrix[tmp]) && !(matrix_changed))
+ {
+ matrix_changed = true;
+ }
+ }
+
+ // Unselect col
+ unselect_col(current_col);
+
+ return matrix_changed;
+}
+
+void matrix_init(void) {
+
+ // initialize key pins
+ init_pins();
+
+ // initialize matrix state: all keys off
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+ raw_matrix[i] = 0;
+ matrix[i] = 0;
+ }
+
+ debounce_init(MATRIX_ROWS);
+
+ matrix_init_quantum();
+}
+
+uint8_t matrix_scan(void)
+{
+ bool changed = false;
+
+ // Set row, read cols
+ for (uint8_t current_row = 0; current_row < MATRIX_ROWS / 2; current_row++) {
+ changed |= read_cols_on_row(raw_matrix, current_row);
+ }
+ //else
+ // Set col, read rows
+ for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
+ changed |= read_rows_on_col(raw_matrix, current_col);
+ }
+
+ debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
+
+ matrix_scan_quantum();
+ return (uint8_t)changed;
+}
diff --git a/keyboards/kakunpc/thedogkeyboard/readme.md b/keyboards/kakunpc/thedogkeyboard/readme.md
new file mode 100644
index 0000000000..c3f73c5303
--- /dev/null
+++ b/keyboards/kakunpc/thedogkeyboard/readme.md
@@ -0,0 +1,15 @@
+# thedogkeyboard
+
+![thedogkeyboard](https://i.gyazo.com/70ac677c1e75c04b812e5dce311f7901.jpg)
+
+ProMicro 100% Keyboard.
+
+* Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
+* Hardware Supported: thedogkeyboard_rev1, promicro
+* Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
+
+Make example for this keyboard (after setting up your build environment):
+
+ make kakunpc/thedogkeyboard: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/thedogkeyboard/rules.mk b/keyboards/kakunpc/thedogkeyboard/rules.mk
index b91a3736ad..b91a3736ad 100644
--- a/keyboards/thedogkeyboard/rules.mk
+++ b/keyboards/kakunpc/thedogkeyboard/rules.mk
diff --git a/keyboards/thedogkeyboard/thedogkeyboard.c b/keyboards/kakunpc/thedogkeyboard/thedogkeyboard.c
index a1808324c8..a1808324c8 100644
--- a/keyboards/thedogkeyboard/thedogkeyboard.c
+++ b/keyboards/kakunpc/thedogkeyboard/thedogkeyboard.c
diff --git a/keyboards/thedogkeyboard/thedogkeyboard.h b/keyboards/kakunpc/thedogkeyboard/thedogkeyboard.h
index 3f4b72c2be..3f4b72c2be 100644
--- a/keyboards/thedogkeyboard/thedogkeyboard.h
+++ b/keyboards/kakunpc/thedogkeyboard/thedogkeyboard.h
diff --git a/keyboards/kelowna/rgb64/readme.md b/keyboards/kelowna/rgb64/readme.md
deleted file mode 100644
index 9300b82819..0000000000
--- a/keyboards/kelowna/rgb64/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# kelownaRGB64
-
-![kelownaRGB64](https://i.imgur.com/DzLy87M.png)
-
-A 60% keyboard based on STM32f303
-
-* Keyboard Maintainer: [Weirdo](https://github.com/Weirdo-F)(https://github.com/Weirdo-F)
-* Hardware Supported: kelownaRGB64
-* Hardware Availability: Not yet
-
-Make example for this keyboard (after setting up your build environment):
-
- make kelowna/rgb64:default
-
-Use the SWD interface on the board to connect to the STlink (JLink) to directly burn firmware without entering the bootloader.
-
-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/kinesis/alvicstep/matrix.c b/keyboards/kinesis/alvicstep/matrix.c
index 71619f8167..9c05374510 100644
--- a/keyboards/kinesis/alvicstep/matrix.c
+++ b/keyboards/kinesis/alvicstep/matrix.c
@@ -136,12 +136,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/bm65hsrgb_iso.c b/keyboards/kprepublic/bm65hsrgb_iso/bm65hsrgb_iso.c
deleted file mode 100644
index 134c271824..0000000000
--- a/keyboards/kprepublic/bm65hsrgb_iso/bm65hsrgb_iso.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* Copyright 2020 ipetepete, 2021 deadolus
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General 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 "bm65hsrgb_iso.h"
-
-#ifdef RGB_MATRIX_ENABLE
-led_config_t g_led_config = { {
- { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 , 14},
- { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29},
- { 30, NO_LED, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43},
- { 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58},
- { 59, 60, NO_LED, NO_LED, NO_LED, 61, NO_LED, NO_LED, 62, 63, NO_LED, 64, 65, 66, 67}
-}, {
- // Esc, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, =, Backspace
- { 0, 0 }, { 15, 0 }, { 30, 0 }, { 45, 0 }, { 60, 0 }, { 75, 0 }, { 90, 0 }, { 105, 0 }, { 120, 0 }, { 135, 0 }, { 150, 0 }, { 165, 0 }, { 180, 0 }, { 202, 0 },{ 224, 0 },
- // Tab, Q, W, E, R, T, Y, U, I, O, P, [, ], ,
- { 7, 16 }, { 22, 16 }, { 37, 16 }, { 52, 16 }, { 67, 16 }, { 82, 16 }, { 97, 16 }, { 112, 16 }, { 127, 16 }, { 142, 16 }, { 157, 16 }, { 172, 16 }, { 187, 16 }, { 206, 16 },{ 224, 16},
- // Capslock, A, S, D, F, G, H, J, K, L, ;, ', Enter
- { 11, 32 }, { 26, 32 }, { 41, 32 }, { 56, 32 }, { 71, 32 }, { 86, 32 }, { 101, 32 }, { 116, 32 }, { 131, 32 }, { 146, 32 }, { 161, 32 }, { 176, 32 }, { 198, 32 }, { 224, 32 },
- // LShift, Z, X, C, V, B, N, M, ,, ., /, Shift, Up,
- { 18, 48 }, { 30, 48 }, { 45, 48 }, { 60, 48 }, { 75, 48 }, { 90, 48 }, { 105, 48 }, { 120, 48 }, { 135, 48 }, { 150, 48 }, { 165, 48 }, { 195, 48 }, { 209, 48 }, { 224, 48 },
- // Ctrl, GUI, Alt, Space, RAlt, FN, Left, Down, Right
- { 3, 64 }, { 22, 64 }, { 33, 64 }, { 101, 64 }, { 135, 64 }, { 153, 64 }, { 194, 64 }, { 209, 64 },{ 224, 64 },
- // UNDERGLOW
- { 216, 32 }, { 180, 32 }, { 144, 32 }, { 108, 32 }, { 72, 32 }, { 36, 32 }
-}, {
- // Esc, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, =, Backspace
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
- // Tab, Q, W, E, R, T, Y, U, I, O, P, [, ], ,
- 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
- // Capslock, A, S, D, F, G, H, J, K, L, ;, ', Enter
- 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
- // LShift, Z, X, C, V, B, N, M, ,, ., /, Shift, Up,
- 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
- // Ctrl, GUI, Alt, Space, RAlt, FN, Left, Down, Right
- 1, 1, 1, 4, 1, 1, 1, 1, 1,
- // UNDERGLOW
- 2, 2, 2, 2, 2, 2
-} };
-
-__attribute__ ((weak))
-void rgb_matrix_indicators_user(void) {
- if (host_keyboard_led_state().caps_lock) {
- rgb_matrix_set_color(30, 0xFF, 0xFF, 0xFF);
- }
-}
-#endif
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/config.h b/keyboards/kprepublic/bm65hsrgb_iso/rev1/config.h
index 30b27dc26e..30b27dc26e 100644
--- a/keyboards/kprepublic/bm65hsrgb_iso/config.h
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/config.h
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/info.json b/keyboards/kprepublic/bm65hsrgb_iso/rev1/info.json
index 9212c43339..9212c43339 100644
--- a/keyboards/kprepublic/bm65hsrgb_iso/info.json
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/info.json
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/config.h b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/config.h
index 1dc1414fa5..1dc1414fa5 100644
--- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/config.h
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/config.h
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/keymap.c b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/keymap.c
index 46de987a68..46de987a68 100644
--- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/keymap.c
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/keymap.c
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/keymap.h b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/keymap.h
index 1459e2c5bb..1459e2c5bb 100644
--- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/keymap.h
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/keymap.h
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/readme.md b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/readme.md
index 095550b01a..095550b01a 100644
--- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/readme.md
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/readme.md
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/rules.mk b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/rules.mk
index c8354ea256..c8354ea256 100644
--- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/deadolus/rules.mk
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/deadolus/rules.mk
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/default/keymap.c b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/default/keymap.c
index bed12e0f72..bed12e0f72 100644
--- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/default/keymap.c
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/default/keymap.c
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/keymap.c b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/keymap.c
index ae36e6b1f5..ae36e6b1f5 100644
--- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/keymap.c
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/keymap.c
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/readme.md b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/readme.md
index 87c7542756..87c7542756 100644
--- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/readme.md
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/readme.md
diff --git a/keyboards/7skb/keymaps/via/rules.mk b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/rules.mk
index 036bd6d1c3..036bd6d1c3 100644
--- a/keyboards/7skb/keymaps/via/rules.mk
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/keymaps/via/rules.mk
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/readme.md b/keyboards/kprepublic/bm65hsrgb_iso/rev1/readme.md
index 752362e29a..752362e29a 100644
--- a/keyboards/kprepublic/bm65hsrgb_iso/readme.md
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/readme.md
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/rev1/rev1.c b/keyboards/kprepublic/bm65hsrgb_iso/rev1/rev1.c
new file mode 100644
index 0000000000..f351fa68a8
--- /dev/null
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/rev1.c
@@ -0,0 +1,59 @@
+/* Copyright 2020 ipetepete, 2021 deadolus
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "rev1.h"
+
+#ifdef RGB_MATRIX_ENABLE
+led_config_t g_led_config = { {
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 , 14},
+ { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29},
+ { 30, NO_LED, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43},
+ { 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58},
+ { 59, 60, NO_LED, NO_LED, NO_LED, 61, NO_LED, NO_LED, 62, 63, NO_LED, 64, 65, 66, 67}
+}, {
+ // Esc, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, =, Backspace
+ { 0, 0 }, { 15, 0 }, { 30, 0 }, { 45, 0 }, { 60, 0 }, { 75, 0 }, { 90, 0 }, { 105, 0 }, { 120, 0 }, { 135, 0 }, { 150, 0 }, { 165, 0 }, { 180, 0 }, { 202, 0 },{ 224, 0 },
+ // Tab, Q, W, E, R, T, Y, U, I, O, P, [, ], ,
+ { 7, 16 }, { 22, 16 }, { 37, 16 }, { 52, 16 }, { 67, 16 }, { 82, 16 }, { 97, 16 }, { 112, 16 }, { 127, 16 }, { 142, 16 }, { 157, 16 }, { 172, 16 }, { 187, 16 }, { 206, 16 },{ 224, 16},
+ // Capslock, A, S, D, F, G, H, J, K, L, ;, ', Enter
+ { 11, 32 }, { 26, 32 }, { 41, 32 }, { 56, 32 }, { 71, 32 }, { 86, 32 }, { 101, 32 }, { 116, 32 }, { 131, 32 }, { 146, 32 }, { 161, 32 }, { 176, 32 }, { 198, 32 }, { 224, 32 },
+ // LShift, Z, X, C, V, B, N, M, ,, ., /, Shift, Up,
+ { 18, 48 }, { 30, 48 }, { 45, 48 }, { 60, 48 }, { 75, 48 }, { 90, 48 }, { 105, 48 }, { 120, 48 }, { 135, 48 }, { 150, 48 }, { 165, 48 }, { 195, 48 }, { 209, 48 }, { 224, 48 },
+ // Ctrl, GUI, Alt, Space, RAlt, FN, Left, Down, Right
+ { 3, 64 }, { 22, 64 }, { 33, 64 }, { 101, 64 }, { 135, 64 }, { 153, 64 }, { 194, 64 }, { 209, 64 },{ 224, 64 },
+ // UNDERGLOW
+ { 216, 32 }, { 180, 32 }, { 144, 32 }, { 108, 32 }, { 72, 32 }, { 36, 32 }
+}, {
+ // Esc, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, =, Backspace
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+ // Tab, Q, W, E, R, T, Y, U, I, O, P, [, ], ,
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+ // Capslock, A, S, D, F, G, H, J, K, L, ;, ', Enter
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+ // LShift, Z, X, C, V, B, N, M, ,, ., /, Shift, Up,
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+ // Ctrl, GUI, Alt, Space, RAlt, FN, Left, Down, Right
+ 1, 1, 1, 4, 1, 1, 1, 1, 1,
+ // UNDERGLOW
+ 2, 2, 2, 2, 2, 2
+} };
+
+__attribute__ ((weak))
+void rgb_matrix_indicators_user(void) {
+ if (host_keyboard_led_state().caps_lock) {
+ rgb_matrix_set_color(30, 0xFF, 0xFF, 0xFF);
+ }
+}
+#endif
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/bm65hsrgb_iso.h b/keyboards/kprepublic/bm65hsrgb_iso/rev1/rev1.h
index 7f39c6f61b..7f39c6f61b 100644
--- a/keyboards/kprepublic/bm65hsrgb_iso/bm65hsrgb_iso.h
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/rev1.h
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/rules.mk b/keyboards/kprepublic/bm65hsrgb_iso/rev1/rules.mk
index c3a6bf1d48..c3a6bf1d48 100644
--- a/keyboards/kprepublic/bm65hsrgb_iso/rules.mk
+++ b/keyboards/kprepublic/bm65hsrgb_iso/rev1/rules.mk
diff --git a/keyboards/kprepublic/bm68hsrgb/bm68hsrgb.c b/keyboards/kprepublic/bm68hsrgb/bm68hsrgb.c
deleted file mode 100644
index 734d2ee677..0000000000
--- a/keyboards/kprepublic/bm68hsrgb/bm68hsrgb.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/* Copyright 2021 peepeetee
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General 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 "bm68hsrgb.h"
-
-#ifdef RGB_MATRIX_ENABLE
-led_config_t g_led_config = { {
- // Key Matrix to LED Index
- { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 },
- { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 },
- { 30, NO_LED, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43 },
- { NO_LED, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57 },
- { 58, 59, 60, NO_LED, NO_LED, NO_LED, 61, NO_LED, NO_LED, 62, 63, 64, 65, 66, 67 }
-}, {
- // LED Index to Physical Position
- { 0, 0}, { 15, 0}, { 30, 0}, { 45, 0}, { 60, 0}, { 75, 0}, { 90, 0}, {105, 0}, {120, 0}, {135, 0}, {150, 0}, {165, 0}, {180, 0}, {202, 0}, {225, 0}, // Esc, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, =, Backspace, Delete
- { 4, 16}, { 22, 16}, { 37, 16}, { 52, 16}, { 67, 16}, { 82, 16}, { 97, 16}, {112, 16}, {127, 16}, {142, 16}, {157, 16}, {172, 16}, {187, 16}, {206, 16}, {225, 16}, // Tab, Q, W, E, R, T, Y, U, I, O, P, [, ], backslash , Home
- { 6, 32}, { 26, 32}, { 41, 32}, { 56, 32}, { 71, 32}, { 86, 32}, {101, 32}, {116, 32}, {131, 32}, {146, 32}, {161, 32}, {176, 32}, {201, 32}, {225, 32}, // Capslock, A, S, D, F, G, H, J, K, L, ;, ', Enter, Page up
- { 9, 48}, { 34, 48}, { 49, 48}, { 64, 48}, { 79, 48}, { 94, 48}, {109, 48}, {124, 48}, {139, 48}, {154, 48}, {169, 48}, {189, 48}, {208, 48}, {225, 48}, // LShift, Z, X, C, V, B, N, M, ,, ., /, Shift, Up, Page Down
- { 2, 64}, { 21, 64}, { 39, 64}, { 94, 64}, {148, 64}, {163, 64}, {178, 64}, {193, 64}, {208, 64}, {225, 64}, // Ctrl, GUI, Alt, Space, RAlt, FN, Ctrl, Left, Down, Right
- {185, 45}, {160, 45}, {125, 45}, { 95, 45}, { 60, 45}, { 25, 45} // UNDERGLOW
-}, {
- // LED Index to Flag
- 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, // Esc, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, =, Backspace, Delete
- 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, // Tab, Q, W, E, R, T, Y, U, I, O, P, [, ], backslash , Home
- 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, // Capslock, A, S, D, F, G, H, J, K, L, ;, ', Enter, Page up
- 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, // LShift, Z, X, C, V, B, N, M, ,, ., /, Shift, Up, Page Down
- 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, // Ctrl, GUI, Alt, Space, RAlt, FN, Ctrl, Left, Down, Right
- 2, 2, 2, 2, 2, 2 // UNDERGLOW
-} };
-
-//CAPS backlight
-__attribute__ ((weak))
-void rgb_matrix_indicators_user(void) {
- if (host_keyboard_led_state().caps_lock) {
- rgb_matrix_set_color(30, 0xFF, 0xFF, 0xFF);
- }
-}
-#endif
diff --git a/keyboards/kprepublic/bm68hsrgb/config.h b/keyboards/kprepublic/bm68hsrgb/rev1/config.h
index a779c97b7b..a779c97b7b 100644
--- a/keyboards/kprepublic/bm68hsrgb/config.h
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/config.h
diff --git a/keyboards/kprepublic/bm68hsrgb/info.json b/keyboards/kprepublic/bm68hsrgb/rev1/info.json
index 0a72da6e98..0a72da6e98 100644
--- a/keyboards/kprepublic/bm68hsrgb/info.json
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/info.json
diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/default/keymap.c b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/default/keymap.c
index b4bc5cb59d..b4bc5cb59d 100644
--- a/keyboards/kprepublic/bm68hsrgb/keymaps/default/keymap.c
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/default/keymap.c
diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/default/readme.md b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/default/readme.md
index 0408ee9e98..0408ee9e98 100644
--- a/keyboards/kprepublic/bm68hsrgb/keymaps/default/readme.md
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/default/readme.md
diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/config.h b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/config.h
index 0748f83cdc..0748f83cdc 100644
--- a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/config.h
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/config.h
diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/keymap.c b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/keymap.c
index 934463b11f..934463b11f 100644
--- a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/keymap.c
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/keymap.c
diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/keymap.h b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/keymap.h
index e8d0170d4d..e8d0170d4d 100644
--- a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/keymap.h
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/keymap.h
diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/readme.md b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/readme.md
index 47899c27e1..47899c27e1 100644
--- a/keyboards/kprepublic/bm68hsrgb/keymaps/peepeetee/readme.md
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/peepeetee/readme.md
diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/via/keymap.c b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/keymap.c
index 46381c561c..46381c561c 100644
--- a/keyboards/kprepublic/bm68hsrgb/keymaps/via/keymap.c
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/keymap.c
diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/via/readme.md b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/readme.md
index c013ae25e2..c013ae25e2 100644
--- a/keyboards/kprepublic/bm68hsrgb/keymaps/via/readme.md
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/readme.md
diff --git a/keyboards/geminate60/keymaps/via/rules.mk b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/geminate60/keymaps/via/rules.mk
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/keymaps/via/rules.mk
diff --git a/keyboards/kprepublic/bm68hsrgb/readme.md b/keyboards/kprepublic/bm68hsrgb/rev1/readme.md
index 54d71cab2c..54d71cab2c 100644
--- a/keyboards/kprepublic/bm68hsrgb/readme.md
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/readme.md
diff --git a/keyboards/kprepublic/bm68hsrgb/rev1/rev1.c b/keyboards/kprepublic/bm68hsrgb/rev1/rev1.c
new file mode 100644
index 0000000000..4634a662b6
--- /dev/null
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/rev1.c
@@ -0,0 +1,52 @@
+/* Copyright 2021 peepeetee
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "rev1.h"
+
+#ifdef RGB_MATRIX_ENABLE
+led_config_t g_led_config = { {
+ // Key Matrix to LED Index
+ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 },
+ { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 },
+ { 30, NO_LED, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43 },
+ { NO_LED, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57 },
+ { 58, 59, 60, NO_LED, NO_LED, NO_LED, 61, NO_LED, NO_LED, 62, 63, 64, 65, 66, 67 }
+}, {
+ // LED Index to Physical Position
+ { 0, 0}, { 15, 0}, { 30, 0}, { 45, 0}, { 60, 0}, { 75, 0}, { 90, 0}, {105, 0}, {120, 0}, {135, 0}, {150, 0}, {165, 0}, {180, 0}, {202, 0}, {225, 0}, // Esc, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, =, Backspace, Delete
+ { 4, 16}, { 22, 16}, { 37, 16}, { 52, 16}, { 67, 16}, { 82, 16}, { 97, 16}, {112, 16}, {127, 16}, {142, 16}, {157, 16}, {172, 16}, {187, 16}, {206, 16}, {225, 16}, // Tab, Q, W, E, R, T, Y, U, I, O, P, [, ], backslash , Home
+ { 6, 32}, { 26, 32}, { 41, 32}, { 56, 32}, { 71, 32}, { 86, 32}, {101, 32}, {116, 32}, {131, 32}, {146, 32}, {161, 32}, {176, 32}, {201, 32}, {225, 32}, // Capslock, A, S, D, F, G, H, J, K, L, ;, ', Enter, Page up
+ { 9, 48}, { 34, 48}, { 49, 48}, { 64, 48}, { 79, 48}, { 94, 48}, {109, 48}, {124, 48}, {139, 48}, {154, 48}, {169, 48}, {189, 48}, {208, 48}, {225, 48}, // LShift, Z, X, C, V, B, N, M, ,, ., /, Shift, Up, Page Down
+ { 2, 64}, { 21, 64}, { 39, 64}, { 94, 64}, {148, 64}, {163, 64}, {178, 64}, {193, 64}, {208, 64}, {225, 64}, // Ctrl, GUI, Alt, Space, RAlt, FN, Ctrl, Left, Down, Right
+ {185, 45}, {160, 45}, {125, 45}, { 95, 45}, { 60, 45}, { 25, 45} // UNDERGLOW
+}, {
+ // LED Index to Flag
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, // Esc, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, =, Backspace, Delete
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, // Tab, Q, W, E, R, T, Y, U, I, O, P, [, ], backslash , Home
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, // Capslock, A, S, D, F, G, H, J, K, L, ;, ', Enter, Page up
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, // LShift, Z, X, C, V, B, N, M, ,, ., /, Shift, Up, Page Down
+ 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, // Ctrl, GUI, Alt, Space, RAlt, FN, Ctrl, Left, Down, Right
+ 2, 2, 2, 2, 2, 2 // UNDERGLOW
+} };
+
+//CAPS backlight
+__attribute__ ((weak))
+void rgb_matrix_indicators_user(void) {
+ if (host_keyboard_led_state().caps_lock) {
+ rgb_matrix_set_color(30, 0xFF, 0xFF, 0xFF);
+ }
+}
+#endif
diff --git a/keyboards/kprepublic/bm68hsrgb/bm68hsrgb.h b/keyboards/kprepublic/bm68hsrgb/rev1/rev1.h
index 3e18b914cc..3e18b914cc 100644
--- a/keyboards/kprepublic/bm68hsrgb/bm68hsrgb.h
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/rev1.h
diff --git a/keyboards/kprepublic/bm68hsrgb/rules.mk b/keyboards/kprepublic/bm68hsrgb/rev1/rules.mk
index 92c37f393b..92c37f393b 100644
--- a/keyboards/kprepublic/bm68hsrgb/rules.mk
+++ b/keyboards/kprepublic/bm68hsrgb/rev1/rules.mk
diff --git a/keyboards/lck75/readme.md b/keyboards/lck75/readme.md
deleted file mode 100644
index 2ded56ebd2..0000000000
--- a/keyboards/lck75/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# lck75
-
-A 75% keyboard that can be assembled with only through hole components, including usb type-c
-
-* Keyboard Maintainer: [Lyso1](https://github.com/lyso1)
-* Hardware Supported: LCK75, atmega32
-* Hardware Availability: [GitHub](https://github.com/lyso1)
-
-Make example for this keyboard (after setting up your build environment):
-
- make lck75:default
-
-Flashing example for this keyboard:
-
- make lck75:default:flash
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/lefishe/readme.md b/keyboards/lefishe/readme.md
deleted file mode 100644
index ae6ab1322e..0000000000
--- a/keyboards/lefishe/readme.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# lefishe
-
-firmware for the 65xt keyboard designed around the symmetrical blocker 65% layout.
-This pcb cab also be used as a replacement pcb for the revoKmini/kmacmini with some modification to the design
-
-* Keyboard Maintainer: [Lyso1](https://github.com/lyso1)
-* Hardware Supported: LeFishe, atmega32u4
-* Hardware Availability: [/u/TheLysol_27](https://www.reddit.com/user/TheLysol_27)
-
-Make example for this keyboard (after setting up your build environment):
-
- make lefishe:default
-
-Enter into the bootloader to flash new firmware in 3 ways:
-
- * **Bootmagic reset**: Hold down the key at (0,0) in the matrix(The F1 key in this case) and plug the the keyboard in.
- * **Physical reset button**: Briefly press the button on the back and left side of the PCB(exactly under where the "2" key would be located) while the PCB is plugged in.
- * **Keycode in layout**: Press the key mapped to `RESET` (RALT + E in this case) while the keyboard is plugged in.
-
-Flashing example for this keyboard:
-
- make lefishe:default:flash
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/ls_60/readme.md b/keyboards/ls_60/readme.md
deleted file mode 100644
index e0efdfd9b5..0000000000
--- a/keyboards/ls_60/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# LS_60
-
-![LS_60](https://i.imgur.com/Cuy5W1H.png)
-
-A 60% keyboard based on STM32f303
-
-* Keyboard Maintainer: [Weirdo](https://weirdo-f.github.io)(https://github.com/1248314361)
-* Hardware Supported: LS_60
-* Hardware Availability: Not yet
-
-Make example for this keyboard (after setting up your build environment):
-
- make ls_60:default
-
-The RST pin and GND pin on the board can be quickly shortened twice to enter DFU mode, and then the program can be written.
-
-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/lck75/config.h b/keyboards/lyso1/lck75/config.h
index 18dd381ece..18dd381ece 100644
--- a/keyboards/lck75/config.h
+++ b/keyboards/lyso1/lck75/config.h
diff --git a/keyboards/lck75/info.json b/keyboards/lyso1/lck75/info.json
index 4d04175e00..4d04175e00 100644
--- a/keyboards/lck75/info.json
+++ b/keyboards/lyso1/lck75/info.json
diff --git a/keyboards/lck75/keymaps/7u/keymap.c b/keyboards/lyso1/lck75/keymaps/7u/keymap.c
index 25cf66176e..25cf66176e 100644
--- a/keyboards/lck75/keymaps/7u/keymap.c
+++ b/keyboards/lyso1/lck75/keymaps/7u/keymap.c
diff --git a/keyboards/lck75/keymaps/7u_iso/keymap.c b/keyboards/lyso1/lck75/keymaps/7u_iso/keymap.c
index f42d638778..f42d638778 100644
--- a/keyboards/lck75/keymaps/7u_iso/keymap.c
+++ b/keyboards/lyso1/lck75/keymaps/7u_iso/keymap.c
diff --git a/keyboards/lck75/keymaps/7u_sbs/keymap.c b/keyboards/lyso1/lck75/keymaps/7u_sbs/keymap.c
index 3c562659dc..3c562659dc 100644
--- a/keyboards/lck75/keymaps/7u_sbs/keymap.c
+++ b/keyboards/lyso1/lck75/keymaps/7u_sbs/keymap.c
diff --git a/keyboards/lck75/keymaps/default/keymap.c b/keyboards/lyso1/lck75/keymaps/default/keymap.c
index 4af75f23e2..4af75f23e2 100644
--- a/keyboards/lck75/keymaps/default/keymap.c
+++ b/keyboards/lyso1/lck75/keymaps/default/keymap.c
diff --git a/keyboards/lck75/keymaps/iso/keymap.c b/keyboards/lyso1/lck75/keymaps/iso/keymap.c
index f0d6dbaf12..f0d6dbaf12 100644
--- a/keyboards/lck75/keymaps/iso/keymap.c
+++ b/keyboards/lyso1/lck75/keymaps/iso/keymap.c
diff --git a/keyboards/lck75/keymaps/iso_sbs/keymap.c b/keyboards/lyso1/lck75/keymaps/iso_sbs/keymap.c
index a2b2469d3e..a2b2469d3e 100644
--- a/keyboards/lck75/keymaps/iso_sbs/keymap.c
+++ b/keyboards/lyso1/lck75/keymaps/iso_sbs/keymap.c
diff --git a/keyboards/lck75/keymaps/sbs/keymap.c b/keyboards/lyso1/lck75/keymaps/sbs/keymap.c
index 7671765619..7671765619 100644
--- a/keyboards/lck75/keymaps/sbs/keymap.c
+++ b/keyboards/lyso1/lck75/keymaps/sbs/keymap.c
diff --git a/keyboards/lck75/keymaps/via/keymap.c b/keyboards/lyso1/lck75/keymaps/via/keymap.c
index 4ba5c50f44..4ba5c50f44 100644
--- a/keyboards/lck75/keymaps/via/keymap.c
+++ b/keyboards/lyso1/lck75/keymaps/via/keymap.c
diff --git a/keyboards/lck75/keymaps/via/rules.mk b/keyboards/lyso1/lck75/keymaps/via/rules.mk
index 541a15608a..541a15608a 100644
--- a/keyboards/lck75/keymaps/via/rules.mk
+++ b/keyboards/lyso1/lck75/keymaps/via/rules.mk
diff --git a/keyboards/lck75/lck75.c b/keyboards/lyso1/lck75/lck75.c
index 55650681ac..55650681ac 100644
--- a/keyboards/lck75/lck75.c
+++ b/keyboards/lyso1/lck75/lck75.c
diff --git a/keyboards/lck75/lck75.h b/keyboards/lyso1/lck75/lck75.h
index d7648eff2a..d7648eff2a 100644
--- a/keyboards/lck75/lck75.h
+++ b/keyboards/lyso1/lck75/lck75.h
diff --git a/keyboards/lyso1/lck75/readme.md b/keyboards/lyso1/lck75/readme.md
new file mode 100644
index 0000000000..bb3dd2626a
--- /dev/null
+++ b/keyboards/lyso1/lck75/readme.md
@@ -0,0 +1,17 @@
+# lck75
+
+A 75% keyboard that can be assembled with only through hole components, including usb type-c
+
+* Keyboard Maintainer: [Lyso1](https://github.com/lyso1)
+* Hardware Supported: LCK75, atmega32
+* Hardware Availability: [GitHub](https://github.com/lyso1)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make lyso1/lck75:default
+
+Flashing example for this keyboard:
+
+ make lyso1/lck75:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/lck75/rules.mk b/keyboards/lyso1/lck75/rules.mk
index 1af1d4921b..1af1d4921b 100644
--- a/keyboards/lck75/rules.mk
+++ b/keyboards/lyso1/lck75/rules.mk
diff --git a/keyboards/lefishe/config.h b/keyboards/lyso1/lefishe/config.h
index a5bafa5413..a5bafa5413 100644
--- a/keyboards/lefishe/config.h
+++ b/keyboards/lyso1/lefishe/config.h
diff --git a/keyboards/lefishe/info.json b/keyboards/lyso1/lefishe/info.json
index e31877a95b..e31877a95b 100644
--- a/keyboards/lefishe/info.json
+++ b/keyboards/lyso1/lefishe/info.json
diff --git a/keyboards/lefishe/keymaps/default/keymap.c b/keyboards/lyso1/lefishe/keymaps/default/keymap.c
index 5ba35de7b0..5ba35de7b0 100644
--- a/keyboards/lefishe/keymaps/default/keymap.c
+++ b/keyboards/lyso1/lefishe/keymaps/default/keymap.c
diff --git a/keyboards/lefishe/keymaps/wk_sbs/keymap.c b/keyboards/lyso1/lefishe/keymaps/wk_sbs/keymap.c
index 36c7d73b86..36c7d73b86 100644
--- a/keyboards/lefishe/keymaps/wk_sbs/keymap.c
+++ b/keyboards/lyso1/lefishe/keymaps/wk_sbs/keymap.c
diff --git a/keyboards/lefishe/keymaps/wkl/keymap.c b/keyboards/lyso1/lefishe/keymaps/wkl/keymap.c
index f40e933d6d..f40e933d6d 100644
--- a/keyboards/lefishe/keymaps/wkl/keymap.c
+++ b/keyboards/lyso1/lefishe/keymaps/wkl/keymap.c
diff --git a/keyboards/lefishe/keymaps/wkl_sbs/keymap.c b/keyboards/lyso1/lefishe/keymaps/wkl_sbs/keymap.c
index 91a707db78..91a707db78 100644
--- a/keyboards/lefishe/keymaps/wkl_sbs/keymap.c
+++ b/keyboards/lyso1/lefishe/keymaps/wkl_sbs/keymap.c
diff --git a/keyboards/lefishe/lefishe.c b/keyboards/lyso1/lefishe/lefishe.c
index c557a59c2d..c557a59c2d 100644
--- a/keyboards/lefishe/lefishe.c
+++ b/keyboards/lyso1/lefishe/lefishe.c
diff --git a/keyboards/lefishe/lefishe.h b/keyboards/lyso1/lefishe/lefishe.h
index 98197b21c4..98197b21c4 100644
--- a/keyboards/lefishe/lefishe.h
+++ b/keyboards/lyso1/lefishe/lefishe.h
diff --git a/keyboards/lyso1/lefishe/readme.md b/keyboards/lyso1/lefishe/readme.md
new file mode 100644
index 0000000000..eb8322b2df
--- /dev/null
+++ b/keyboards/lyso1/lefishe/readme.md
@@ -0,0 +1,24 @@
+# lefishe
+
+firmware for the 65xt keyboard designed around the symmetrical blocker 65% layout.
+This pcb cab also be used as a replacement pcb for the revoKmini/kmacmini with some modification to the design
+
+* Keyboard Maintainer: [Lyso1](https://github.com/lyso1)
+* Hardware Supported: LeFishe, atmega32u4
+* Hardware Availability: [/u/TheLysol_27](https://www.reddit.com/user/TheLysol_27)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make lyso1/lefishe:default
+
+Enter into the bootloader to flash new firmware in 3 ways:
+
+ * **Bootmagic reset**: Hold down the key at (0,0) in the matrix(The F1 key in this case) and plug the the keyboard in.
+ * **Physical reset button**: Briefly press the button on the back and left side of the PCB(exactly under where the "2" key would be located) while the PCB is plugged in.
+ * **Keycode in layout**: Press the key mapped to `RESET` (RALT + E in this case) while the keyboard is plugged in.
+
+Flashing example for this keyboard:
+
+ make lyso1/lefishe:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/lefishe/rules.mk b/keyboards/lyso1/lefishe/rules.mk
index 5d063b8756..5d063b8756 100644
--- a/keyboards/lefishe/rules.mk
+++ b/keyboards/lyso1/lefishe/rules.mk
diff --git a/keyboards/treadstone32/info.json b/keyboards/marksard/treadstone32/info.json
index d9c1069b38..d9c1069b38 100644
--- a/keyboards/treadstone32/info.json
+++ b/keyboards/marksard/treadstone32/info.json
diff --git a/keyboards/treadstone32/keymaps/default/config.h b/keyboards/marksard/treadstone32/keymaps/default/config.h
index 863588c5aa..863588c5aa 100644
--- a/keyboards/treadstone32/keymaps/default/config.h
+++ b/keyboards/marksard/treadstone32/keymaps/default/config.h
diff --git a/keyboards/treadstone32/keymaps/default/keymap.c b/keyboards/marksard/treadstone32/keymaps/default/keymap.c
index 791fed059b..791fed059b 100644
--- a/keyboards/treadstone32/keymaps/default/keymap.c
+++ b/keyboards/marksard/treadstone32/keymaps/default/keymap.c
diff --git a/keyboards/treadstone32/keymaps/default/readme.md b/keyboards/marksard/treadstone32/keymaps/default/readme.md
index 387efc0d45..387efc0d45 100644
--- a/keyboards/treadstone32/keymaps/default/readme.md
+++ b/keyboards/marksard/treadstone32/keymaps/default/readme.md
diff --git a/keyboards/treadstone32/keymaps/default/readme_jp.md b/keyboards/marksard/treadstone32/keymaps/default/readme_jp.md
index ff078dcc8a..ff078dcc8a 100644
--- a/keyboards/treadstone32/keymaps/default/readme_jp.md
+++ b/keyboards/marksard/treadstone32/keymaps/default/readme_jp.md
diff --git a/keyboards/treadstone32/keymaps/default/rules.mk b/keyboards/marksard/treadstone32/keymaps/default/rules.mk
index 387a81d04b..387a81d04b 100644
--- a/keyboards/treadstone32/keymaps/default/rules.mk
+++ b/keyboards/marksard/treadstone32/keymaps/default/rules.mk
diff --git a/keyboards/treadstone32/keymaps/like_jis/config.h b/keyboards/marksard/treadstone32/keymaps/like_jis/config.h
index 863588c5aa..863588c5aa 100644
--- a/keyboards/treadstone32/keymaps/like_jis/config.h
+++ b/keyboards/marksard/treadstone32/keymaps/like_jis/config.h
diff --git a/keyboards/treadstone32/keymaps/like_jis/keymap.c b/keyboards/marksard/treadstone32/keymaps/like_jis/keymap.c
index 92518b11a7..92518b11a7 100644
--- a/keyboards/treadstone32/keymaps/like_jis/keymap.c
+++ b/keyboards/marksard/treadstone32/keymaps/like_jis/keymap.c
diff --git a/keyboards/treadstone32/keymaps/like_jis/readme.md b/keyboards/marksard/treadstone32/keymaps/like_jis/readme.md
index 206133ee7c..206133ee7c 100644
--- a/keyboards/treadstone32/keymaps/like_jis/readme.md
+++ b/keyboards/marksard/treadstone32/keymaps/like_jis/readme.md
diff --git a/keyboards/treadstone32/keymaps/like_jis/readme_jp.md b/keyboards/marksard/treadstone32/keymaps/like_jis/readme_jp.md
index 3242f101e2..3242f101e2 100644
--- a/keyboards/treadstone32/keymaps/like_jis/readme_jp.md
+++ b/keyboards/marksard/treadstone32/keymaps/like_jis/readme_jp.md
diff --git a/keyboards/treadstone32/keymaps/like_jis/rules.mk b/keyboards/marksard/treadstone32/keymaps/like_jis/rules.mk
index 882ddd6977..882ddd6977 100644
--- a/keyboards/treadstone32/keymaps/like_jis/rules.mk
+++ b/keyboards/marksard/treadstone32/keymaps/like_jis/rules.mk
diff --git a/keyboards/jisplit89/.noci b/keyboards/marksard/treadstone32/lite/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/jisplit89/.noci
+++ b/keyboards/marksard/treadstone32/lite/.noci
diff --git a/keyboards/treadstone32/lite/config.h b/keyboards/marksard/treadstone32/lite/config.h
index 90db1a7895..90db1a7895 100644
--- a/keyboards/treadstone32/lite/config.h
+++ b/keyboards/marksard/treadstone32/lite/config.h
diff --git a/keyboards/treadstone32/lite/lite.c b/keyboards/marksard/treadstone32/lite/lite.c
index a1997feff0..a1997feff0 100644
--- a/keyboards/treadstone32/lite/lite.c
+++ b/keyboards/marksard/treadstone32/lite/lite.c
diff --git a/keyboards/treadstone32/lite/lite.h b/keyboards/marksard/treadstone32/lite/lite.h
index 90181124c0..90181124c0 100644
--- a/keyboards/treadstone32/lite/lite.h
+++ b/keyboards/marksard/treadstone32/lite/lite.h
diff --git a/keyboards/treadstone32/lite/rules.mk b/keyboards/marksard/treadstone32/lite/rules.mk
index 6ded83e74b..6ded83e74b 100644
--- a/keyboards/treadstone32/lite/rules.mk
+++ b/keyboards/marksard/treadstone32/lite/rules.mk
diff --git a/keyboards/marksard/treadstone32/readme.md b/keyboards/marksard/treadstone32/readme.md
new file mode 100644
index 0000000000..170c6bc761
--- /dev/null
+++ b/keyboards/marksard/treadstone32/readme.md
@@ -0,0 +1,21 @@
+# treadstone32
+
+![treadstone32](https://github.com/marksard/Keyboards/raw/master/_image/20190421-P4210001.jpg)
+
+A 32-key Symmetric staggered keyboard.
+
+Keyboard Maintainer: [marksard](https://github.com/marksard)
+Hardware Supported: The PCBs, controllers supported
+Hardware Availability: links to where you can find this hardware
+
+Make example for this keyboard (after setting up your build environment):
+
+ make marksard/treadstone32:default
+ or
+ make marksard/treadstone32/lite:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://github.com/marksard/Keyboards/blob/master/treadstone32/documents/treadstone32_buildguide.md)
+[Build guide (lite)](https://github.com/marksard/Keyboards/blob/master/treadstone32/documents/treadstone32lite_buildguide.md)
+[Firmware](https://github.com/marksard/qmk_firmware/tree/my_customize/keyboards/treadstone32)
diff --git a/keyboards/naked48/.noci b/keyboards/marksard/treadstone32/rev1/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/naked48/.noci
+++ b/keyboards/marksard/treadstone32/rev1/.noci
diff --git a/keyboards/treadstone32/rev1/config.h b/keyboards/marksard/treadstone32/rev1/config.h
index 3f21ad59c5..3f21ad59c5 100644
--- a/keyboards/treadstone32/rev1/config.h
+++ b/keyboards/marksard/treadstone32/rev1/config.h
diff --git a/keyboards/treadstone32/rev1/rev1.c b/keyboards/marksard/treadstone32/rev1/rev1.c
index bf41abddbe..bf41abddbe 100644
--- a/keyboards/treadstone32/rev1/rev1.c
+++ b/keyboards/marksard/treadstone32/rev1/rev1.c
diff --git a/keyboards/treadstone32/rev1/rev1.h b/keyboards/marksard/treadstone32/rev1/rev1.h
index 90181124c0..90181124c0 100644
--- a/keyboards/treadstone32/rev1/rev1.h
+++ b/keyboards/marksard/treadstone32/rev1/rev1.h
diff --git a/keyboards/treadstone32/rev1/rules.mk b/keyboards/marksard/treadstone32/rev1/rules.mk
index bddd4e389e..bddd4e389e 100644
--- a/keyboards/treadstone32/rev1/rules.mk
+++ b/keyboards/marksard/treadstone32/rev1/rules.mk
diff --git a/keyboards/marksard/treadstone32/rules.mk b/keyboards/marksard/treadstone32/rules.mk
new file mode 100644
index 0000000000..a0b43873cc
--- /dev/null
+++ b/keyboards/marksard/treadstone32/rules.mk
@@ -0,0 +1,18 @@
+# MCU name
+MCU = atmega32u4
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = no # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = no # Audio output
+RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
+LEADER_ENABLE = no
+
+DEFAULT_FOLDER = marksard/treadstone32/rev1
diff --git a/keyboards/naked64/.noci b/keyboards/marksard/treadstone48/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/naked64/.noci
+++ b/keyboards/marksard/treadstone48/.noci
diff --git a/keyboards/treadstone48/common/glcdfont.c b/keyboards/marksard/treadstone48/common/glcdfont.c
index 003ce1a87b..003ce1a87b 100644
--- a/keyboards/treadstone48/common/glcdfont.c
+++ b/keyboards/marksard/treadstone48/common/glcdfont.c
diff --git a/keyboards/treadstone48/common/oled_helper.c b/keyboards/marksard/treadstone48/common/oled_helper.c
index 68adbe83a8..68adbe83a8 100644
--- a/keyboards/treadstone48/common/oled_helper.c
+++ b/keyboards/marksard/treadstone48/common/oled_helper.c
diff --git a/keyboards/treadstone48/common/oled_helper.h b/keyboards/marksard/treadstone48/common/oled_helper.h
index 56c2a5b236..56c2a5b236 100644
--- a/keyboards/treadstone48/common/oled_helper.h
+++ b/keyboards/marksard/treadstone48/common/oled_helper.h
diff --git a/keyboards/marksard/treadstone48/keymaps/default/config.h b/keyboards/marksard/treadstone48/keymaps/default/config.h
new file mode 100644
index 0000000000..a5f68e7a2b
--- /dev/null
+++ b/keyboards/marksard/treadstone48/keymaps/default/config.h
@@ -0,0 +1,49 @@
+/* Copyright 2020 marksard
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+// place overrides here
+
+#ifdef TAPPING_TERM
+#undef TAPPING_TERM
+#endif
+#define TAPPING_TERM 225
+
+#ifdef MOUSEKEY_ENABLE
+ #undef MOUSEKEY_INTERVAL
+ #define MOUSEKEY_INTERVAL 1
+
+ #undef MOUSEKEY_TIME_TO_MAX
+ #define MOUSEKEY_TIME_TO_MAX 150
+
+ #undef MOUSEKEY_MAX_SPEED
+ #define MOUSEKEY_MAX_SPEED 3
+
+ #undef MOUSEKEY_MOVE_DELTA
+ #define MOUSEKEY_MOVE_DELTA 4
+
+ #undef MOUSEKEY_DELAY
+ #define MOUSEKEY_DELAY 0
+#endif
+
+// If you use the HashTwenty(alpha), please enable USE_HASHTWENTY
+// #define ANGELINA_KEYMAP
+
+// If you plug in the USB on the right side, please enable MASTER_RIGHT
+// #define RHYMESTONE_RIGHTHAND
+
+#define OLED_FONT_H "keyboards/marksard/treadstone48/common/glcdfont.c"
diff --git a/keyboards/treadstone48/keymaps/default/keymap.c b/keyboards/marksard/treadstone48/keymaps/default/keymap.c
index 00884f3918..00884f3918 100644
--- a/keyboards/treadstone48/keymaps/default/keymap.c
+++ b/keyboards/marksard/treadstone48/keymaps/default/keymap.c
diff --git a/keyboards/treadstone48/keymaps/default/readme.md b/keyboards/marksard/treadstone48/keymaps/default/readme.md
index bb835d169c..bb835d169c 100644
--- a/keyboards/treadstone48/keymaps/default/readme.md
+++ b/keyboards/marksard/treadstone48/keymaps/default/readme.md
diff --git a/keyboards/treadstone48/keymaps/default/readme_jp.md b/keyboards/marksard/treadstone48/keymaps/default/readme_jp.md
index 93aaa190e3..93aaa190e3 100644
--- a/keyboards/treadstone48/keymaps/default/readme_jp.md
+++ b/keyboards/marksard/treadstone48/keymaps/default/readme_jp.md
diff --git a/keyboards/treadstone48/keymaps/default/rules.mk b/keyboards/marksard/treadstone48/keymaps/default/rules.mk
index 23c4ae9542..23c4ae9542 100644
--- a/keyboards/treadstone48/keymaps/default/rules.mk
+++ b/keyboards/marksard/treadstone48/keymaps/default/rules.mk
diff --git a/keyboards/marksard/treadstone48/keymaps/like_jis/config.h b/keyboards/marksard/treadstone48/keymaps/like_jis/config.h
new file mode 100644
index 0000000000..a5f68e7a2b
--- /dev/null
+++ b/keyboards/marksard/treadstone48/keymaps/like_jis/config.h
@@ -0,0 +1,49 @@
+/* Copyright 2020 marksard
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+// place overrides here
+
+#ifdef TAPPING_TERM
+#undef TAPPING_TERM
+#endif
+#define TAPPING_TERM 225
+
+#ifdef MOUSEKEY_ENABLE
+ #undef MOUSEKEY_INTERVAL
+ #define MOUSEKEY_INTERVAL 1
+
+ #undef MOUSEKEY_TIME_TO_MAX
+ #define MOUSEKEY_TIME_TO_MAX 150
+
+ #undef MOUSEKEY_MAX_SPEED
+ #define MOUSEKEY_MAX_SPEED 3
+
+ #undef MOUSEKEY_MOVE_DELTA
+ #define MOUSEKEY_MOVE_DELTA 4
+
+ #undef MOUSEKEY_DELAY
+ #define MOUSEKEY_DELAY 0
+#endif
+
+// If you use the HashTwenty(alpha), please enable USE_HASHTWENTY
+// #define ANGELINA_KEYMAP
+
+// If you plug in the USB on the right side, please enable MASTER_RIGHT
+// #define RHYMESTONE_RIGHTHAND
+
+#define OLED_FONT_H "keyboards/marksard/treadstone48/common/glcdfont.c"
diff --git a/keyboards/treadstone48/keymaps/like_jis/keymap.c b/keyboards/marksard/treadstone48/keymaps/like_jis/keymap.c
index 1e90a2416e..1e90a2416e 100644
--- a/keyboards/treadstone48/keymaps/like_jis/keymap.c
+++ b/keyboards/marksard/treadstone48/keymaps/like_jis/keymap.c
diff --git a/keyboards/treadstone48/keymaps/like_jis/readme.md b/keyboards/marksard/treadstone48/keymaps/like_jis/readme.md
index 796df6c4cd..796df6c4cd 100644
--- a/keyboards/treadstone48/keymaps/like_jis/readme.md
+++ b/keyboards/marksard/treadstone48/keymaps/like_jis/readme.md
diff --git a/keyboards/treadstone48/keymaps/like_jis/readme_jp.md b/keyboards/marksard/treadstone48/keymaps/like_jis/readme_jp.md
index 5ae638b0d1..5ae638b0d1 100644
--- a/keyboards/treadstone48/keymaps/like_jis/readme_jp.md
+++ b/keyboards/marksard/treadstone48/keymaps/like_jis/readme_jp.md
diff --git a/keyboards/treadstone48/keymaps/like_jis/rules.mk b/keyboards/marksard/treadstone48/keymaps/like_jis/rules.mk
index 23c4ae9542..23c4ae9542 100644
--- a/keyboards/treadstone48/keymaps/like_jis/rules.mk
+++ b/keyboards/marksard/treadstone48/keymaps/like_jis/rules.mk
diff --git a/keyboards/marksard/treadstone48/readme.md b/keyboards/marksard/treadstone48/readme.md
new file mode 100644
index 0000000000..c5f6f8f73f
--- /dev/null
+++ b/keyboards/marksard/treadstone48/readme.md
@@ -0,0 +1,21 @@
+# treadstone48
+
+![treadstone48](https://github.com/marksard/Keyboards/raw/master/_image/20181219-PC190003.jpg)
+
+A 47 (or 48) keys Symmetric Staggered keyboard.
+
+Keyboard Maintainer: [marksard](https://github.com/marksard)
+Hardware Supported: The PCBs, controllers supported
+Hardware Availability: links to where you can find this hardware
+
+Make example for this keyboard (after setting up your build environment):
+
+ make marksard/treadstone48:default
+ or
+ make marksard/treadstone48/rev2:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://github.com/marksard/Keyboards/blob/master/treadstone48/documents/treadstone48_buildguide.md)
+[Build guide (rev2)](https://github.com/marksard/Keyboards/blob/master/treadstone48/documents/treadstone48rev2_buildguide.md)
+[Firmware](https://github.com/marksard/qmk_firmware/tree/my_customize/keyboards/treadstone48)
diff --git a/keyboards/setta21/rev1/.noci b/keyboards/marksard/treadstone48/rev1/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/setta21/rev1/.noci
+++ b/keyboards/marksard/treadstone48/rev1/.noci
diff --git a/keyboards/treadstone48/rev1/config.h b/keyboards/marksard/treadstone48/rev1/config.h
index ad9de636d0..ad9de636d0 100644
--- a/keyboards/treadstone48/rev1/config.h
+++ b/keyboards/marksard/treadstone48/rev1/config.h
diff --git a/keyboards/treadstone48/rev1/info.json b/keyboards/marksard/treadstone48/rev1/info.json
index 8b90429d00..8b90429d00 100644
--- a/keyboards/treadstone48/rev1/info.json
+++ b/keyboards/marksard/treadstone48/rev1/info.json
diff --git a/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/config.h b/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/config.h
new file mode 100644
index 0000000000..54ac1f2fce
--- /dev/null
+++ b/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/config.h
@@ -0,0 +1,51 @@
+/* Copyright 2020 marksard
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+// place overrides here
+
+#ifdef TAPPING_TERM
+#undef TAPPING_TERM
+#endif
+#define TAPPING_TERM 225
+#define PREVENT_STUCK_MODIFIERS
+#define IGNORE_MOD_TAP_INTERRUPT
+
+#ifdef MOUSEKEY_ENABLE
+ #undef MOUSEKEY_INTERVAL
+ #define MOUSEKEY_INTERVAL 1
+
+ #undef MOUSEKEY_TIME_TO_MAX
+ #define MOUSEKEY_TIME_TO_MAX 150
+
+ #undef MOUSEKEY_MAX_SPEED
+ #define MOUSEKEY_MAX_SPEED 3
+
+ #undef MOUSEKEY_MOVE_DELTA
+ #define MOUSEKEY_MOVE_DELTA 4
+
+ #undef MOUSEKEY_DELAY
+ #define MOUSEKEY_DELAY 0
+#endif
+
+// If you use the HashTwenty(alpha), please enable USE_HASHTWENTY
+// #define ANGELINA_KEYMAP
+
+// If you plug in the USB on the right side, please enable MASTER_RIGHT
+// #define RHYMESTONE_RIGHTHAND
+
+#define OLED_FONT_H "keyboards/marksard/treadstone48/common/glcdfont.c"
diff --git a/keyboards/treadstone48/rev1/keymaps/like_jis_rs/keymap.c b/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/keymap.c
index e1f0835881..e1f0835881 100644
--- a/keyboards/treadstone48/rev1/keymaps/like_jis_rs/keymap.c
+++ b/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/keymap.c
diff --git a/keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme.md b/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/readme.md
index 796df6c4cd..796df6c4cd 100644
--- a/keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme.md
+++ b/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/readme.md
diff --git a/keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme_jp.md b/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/readme_jp.md
index 81c5e017ec..81c5e017ec 100644
--- a/keyboards/treadstone48/rev1/keymaps/like_jis_rs/readme_jp.md
+++ b/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/readme_jp.md
diff --git a/keyboards/treadstone48/rev1/keymaps/like_jis_rs/rules.mk b/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/rules.mk
index fafe992d6f..fafe992d6f 100644
--- a/keyboards/treadstone48/rev1/keymaps/like_jis_rs/rules.mk
+++ b/keyboards/marksard/treadstone48/rev1/keymaps/like_jis_rs/rules.mk
diff --git a/keyboards/treadstone48/rev1/rev1.c b/keyboards/marksard/treadstone48/rev1/rev1.c
index 3daa3e8e81..3daa3e8e81 100644
--- a/keyboards/treadstone48/rev1/rev1.c
+++ b/keyboards/marksard/treadstone48/rev1/rev1.c
diff --git a/keyboards/treadstone48/rev1/rev1.h b/keyboards/marksard/treadstone48/rev1/rev1.h
index 7534796422..7534796422 100644
--- a/keyboards/treadstone48/rev1/rev1.h
+++ b/keyboards/marksard/treadstone48/rev1/rev1.h
diff --git a/keyboards/getta25/rev1/rules.mk b/keyboards/marksard/treadstone48/rev1/rules.mk
index fff00a1b51..fff00a1b51 100644
--- a/keyboards/getta25/rev1/rules.mk
+++ b/keyboards/marksard/treadstone48/rev1/rules.mk
diff --git a/keyboards/treadstone48/rev2/config.h b/keyboards/marksard/treadstone48/rev2/config.h
index 6df1467d8c..6df1467d8c 100644
--- a/keyboards/treadstone48/rev2/config.h
+++ b/keyboards/marksard/treadstone48/rev2/config.h
diff --git a/keyboards/treadstone48/rev2/info.json b/keyboards/marksard/treadstone48/rev2/info.json
index 73527155e8..73527155e8 100644
--- a/keyboards/treadstone48/rev2/info.json
+++ b/keyboards/marksard/treadstone48/rev2/info.json
diff --git a/keyboards/treadstone48/rev2/rev2.c b/keyboards/marksard/treadstone48/rev2/rev2.c
index f7e7bc7702..f7e7bc7702 100644
--- a/keyboards/treadstone48/rev2/rev2.c
+++ b/keyboards/marksard/treadstone48/rev2/rev2.c
diff --git a/keyboards/treadstone48/rev2/rev2.h b/keyboards/marksard/treadstone48/rev2/rev2.h
index 651468c4a5..651468c4a5 100644
--- a/keyboards/treadstone48/rev2/rev2.h
+++ b/keyboards/marksard/treadstone48/rev2/rev2.h
diff --git a/keyboards/naked48/keymaps/default/rules.mk b/keyboards/marksard/treadstone48/rev2/rules.mk
index d29d9074a0..d29d9074a0 100644
--- a/keyboards/naked48/keymaps/default/rules.mk
+++ b/keyboards/marksard/treadstone48/rev2/rules.mk
diff --git a/keyboards/marksard/treadstone48/rules.mk b/keyboards/marksard/treadstone48/rules.mk
new file mode 100644
index 0000000000..67c171a7b7
--- /dev/null
+++ b/keyboards/marksard/treadstone48/rules.mk
@@ -0,0 +1,25 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
+EXTRAKEY_ENABLE = no # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = no # Audio output
+SPLIT_KEYBOARD = yes
+
+MOUSEKEY_ENABLE = yes # Mouse keys
+
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+OLED_ENABLE = yes
+OLED_DRIVER = SSD1306
+
+DEFAULT_FOLDER = marksard/treadstone48/rev1
diff --git a/keyboards/massdrop/alt/rules.mk b/keyboards/massdrop/alt/rules.mk
index 83d4fc590b..f0ff36fa35 100644
--- a/keyboards/massdrop/alt/rules.mk
+++ b/keyboards/massdrop/alt/rules.mk
@@ -5,6 +5,9 @@ SRC += config_led.c
ARM_ATSAM = SAMD51J18A
MCU = cortex-m4
+# Bootloader selection
+BOOTLOADER = md-boot
+
# Build Options
# change yes to no to disable
#
diff --git a/keyboards/massdrop/ctrl/rules.mk b/keyboards/massdrop/ctrl/rules.mk
index 667642f83d..a302c82d86 100644
--- a/keyboards/massdrop/ctrl/rules.mk
+++ b/keyboards/massdrop/ctrl/rules.mk
@@ -5,6 +5,9 @@ SRC += config_led.c
ARM_ATSAM = SAMD51J18A
MCU = cortex-m4
+# Bootloader selection
+BOOTLOADER = md-boot
+
# Build Options
# change yes to no to disable
#
diff --git a/keyboards/matrix/abelx/boards/abelx_bd/board.c b/keyboards/matrix/abelx/boards/abelx_bd/board.c
index 68cf23cddc..db40a8e37b 100644
--- a/keyboards/matrix/abelx/boards/abelx_bd/board.c
+++ b/keyboards/matrix/abelx/boards/abelx_bd/board.c
@@ -208,9 +208,6 @@ static void stm32_gpio_init(void) {
* else.
*/
void __early_init(void) {
- extern void enter_bootloader_mode_if_requested(void);
- enter_bootloader_mode_if_requested();
-
stm32_gpio_init();
stm32_clock_init();
}
diff --git a/keyboards/matrix/abelx/bootloader_defs.h b/keyboards/matrix/abelx/bootloader_defs.h
deleted file mode 100644
index 20b8f73e6f..0000000000
--- a/keyboards/matrix/abelx/bootloader_defs.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Address for jumping to bootloader on STM32 chips. */
-/* It is chip dependent, the correct number can be looked up here:
- * 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
- */
-#define STM32_BOOTLOADER_ADDRESS 0x1FFF0000
diff --git a/keyboards/matrix/abelx/rules.mk b/keyboards/matrix/abelx/rules.mk
index 98b6cfa65e..ac00984eae 100644
--- a/keyboards/matrix/abelx/rules.mk
+++ b/keyboards/matrix/abelx/rules.mk
@@ -25,14 +25,6 @@ ARMV = 7
USE_FPU = yes
-# Vector table for application
-# 0x00000000-0x00001000 area is occupied by bootlaoder.*/
-OPT_DEFS =
-
-# Options to pass to dfu-util when flashing
-#DFU_ARGS = -d 0483:df11 -a 0 -s 0x08000000:leave
-#DFU_SUFFIX_ARGS = -p DF11 -v 0483
-
# Build Options
# change yes to no to disable
#
diff --git a/keyboards/matrix/m20add/bootloader_defs.h b/keyboards/matrix/m20add/bootloader_defs.h
deleted file mode 100644
index 4da3d39a32..0000000000
--- a/keyboards/matrix/m20add/bootloader_defs.h
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Address for jumping to bootloader on STM32 chips. */
-/* It is chip dependent, the correct number can be looked up here:
- * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
- */
-#define STM32_BOOTLOADER_ADDRESS 0x1FFF0000
diff --git a/keyboards/matrix/m20add/m20add.c b/keyboards/matrix/m20add/m20add.c
index 21f4f9b1ba..4d328d6c54 100644
--- a/keyboards/matrix/m20add/m20add.c
+++ b/keyboards/matrix/m20add/m20add.c
@@ -53,25 +53,6 @@ bool led_update_kb(led_t led_state) {
return res;
}
-// override the default implementation to avoid re-initialization
-void i2c_init(void)
-{
- static bool initialized = false;
- if (initialized) {
- return;
- } else {
- initialized = true;
- }
-
- // Try releasing special pins for a short time
- palSetLineMode(I2C1_SCL_PIN, PAL_MODE_INPUT);
- palSetLineMode(I2C1_SDA_PIN, PAL_MODE_INPUT);
-
- chThdSleepMilliseconds(10);
- palSetLineMode(I2C1_SCL_PIN, PAL_MODE_ALTERNATE(I2C1_SCL_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
- palSetLineMode(I2C1_SDA_PIN, PAL_MODE_ALTERNATE(I2C1_SDA_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
-}
-
#define REBOOT_MAGIC 0x41544B42
void shutdown_user(void)
{
diff --git a/keyboards/matrix/noah/bootloader_defs.h b/keyboards/matrix/noah/bootloader_defs.h
deleted file mode 100644
index 4da3d39a32..0000000000
--- a/keyboards/matrix/noah/bootloader_defs.h
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Address for jumping to bootloader on STM32 chips. */
-/* It is chip dependent, the correct number can be looked up here:
- * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
- */
-#define STM32_BOOTLOADER_ADDRESS 0x1FFF0000
diff --git a/keyboards/mechlovin/mechlovin9/rev1/rules.mk b/keyboards/mechlovin/mechlovin9/rev1/rules.mk
index 1333470e59..927204fc74 100644
--- a/keyboards/mechlovin/mechlovin9/rev1/rules.mk
+++ b/keyboards/mechlovin/mechlovin9/rev1/rules.mk
@@ -2,6 +2,9 @@
MCU = STM32F303
BOARD = QMK_PROTON_C
+# Bootloader selection
+BOOTLOADER = stm32-dfu
+
# Build Options
# change yes to no to disable
#
diff --git a/keyboards/mechlovin/olly/jf/rules.mk b/keyboards/mechlovin/olly/jf/rules.mk
index c0c9b2d7ea..2fafe64f12 100644
--- a/keyboards/mechlovin/olly/jf/rules.mk
+++ b/keyboards/mechlovin/olly/jf/rules.mk
@@ -5,7 +5,7 @@ MCU = atmega32a
F_CPU = 16000000
# Bootloader selection
-BOOTLOADER = USBasp
+BOOTLOADER = usbasploader
# Build Options
# change yes to no to disable
@@ -21,4 +21,4 @@ RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
CUSTOM_MATRIX = lite
-SRC += matrix.c \ No newline at end of file
+SRC += matrix.c
diff --git a/keyboards/mechmini/v1/rules.mk b/keyboards/mechmini/v1/rules.mk
index 6905e73c27..a7d4a67a16 100644
--- a/keyboards/mechmini/v1/rules.mk
+++ b/keyboards/mechmini/v1/rules.mk
@@ -2,7 +2,7 @@
MCU = atmega32a
# Bootloader selection
-BOOTLOADER = atmel-dfu
+BOOTLOADER = bootloadhid
# Build Options
# change yes to no to disable
diff --git a/keyboards/meira/matrix.c b/keyboards/meira/matrix.c
index ae1ae5ce9d..8e8e9485b4 100644
--- a/keyboards/meira/matrix.c
+++ b/keyboards/meira/matrix.c
@@ -161,12 +161,6 @@ uint8_t matrix_scan(void)
return ret;
}
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/mitosis/config.h b/keyboards/mitosis/config.h
index 94e84e680e..2c72eed5f2 100644
--- a/keyboards/mitosis/config.h
+++ b/keyboards/mitosis/config.h
@@ -56,12 +56,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
-
-//UART settings for communication with the RF microcontroller
-#define SERIAL_UART_BAUD 1000000
-#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
-#define SERIAL_UART_INIT_CUSTOM \
- /* enable TX and RX */ \
- UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
- /* 8-bit data */ \
- UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
diff --git a/keyboards/mitosis/matrix.c b/keyboards/mitosis/matrix.c
index 71c372a3ce..a92c3e8431 100644
--- a/keyboards/mitosis/matrix.c
+++ b/keyboards/mitosis/matrix.c
@@ -15,80 +15,21 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <stdint.h>
-#include <stdbool.h>
-#if defined(__AVR__)
-#include <avr/io.h>
-#endif
-#include "wait.h"
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "timer.h"
-#include "protocol/serial.h"
-
-#if (MATRIX_COLS <= 8)
-# define print_matrix_header() print("\nr/c 01234567\n")
-# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop(matrix[i])
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop16(matrix[i])
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop32(matrix[i])
-# define ROW_SHIFTER ((uint32_t)1)
-#endif
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void) {
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void) {
- return MATRIX_COLS;
-}
-void matrix_init(void) {
+#include "quantum.h"
+#include "matrix.h"
+#include "uart.h"
- matrix_init_quantum();
- serial_init();
+void matrix_init_custom(void) {
+ uart_init(1000000);
}
-uint8_t matrix_scan(void)
-{
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
uint32_t timeout = 0;
+ bool changed = false;
//the s character requests the RF slave to send the matrix
- SERIAL_UART_DATA = 's';
+ uart_write('s');
//trust the external keystates entirely, erase the last data
uint8_t uart_data[11] = {0};
@@ -98,58 +39,27 @@ uint8_t matrix_scan(void)
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
- while(!SERIAL_UART_RXD_PRESENT){
+ while (!uart_available()) {
timeout++;
- if (timeout > 10000){
+ if (timeout > 10000) {
break;
}
}
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
//check for the end packet, the key state bytes use the LSBs, so 0xE0
//will only show up here if the correct bytes were recieved
- if (uart_data[10] == 0xE0)
- {
+ if (uart_data[10] == 0xE0) {
//shifting and transferring the keystates to the QMK matrix variable
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 5;
+ matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 5;
+ if (current_matrix[i] != current_row) {
+ changed = true;
+ }
+ current_matrix[i] = current_row;
}
}
-
- matrix_scan_quantum();
- return 1;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & ((matrix_row_t)1<<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print_matrix_header();
-
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row); print(": ");
- print_matrix_row(row);
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += matrix_bitpop(i);
- }
- return count;
+ return changed;
}
diff --git a/keyboards/mitosis/rules.mk b/keyboards/mitosis/rules.mk
index 6c7aa30d88..0a8a31e7dd 100644
--- a/keyboards/mitosis/rules.mk
+++ b/keyboards/mitosis/rules.mk
@@ -8,14 +8,17 @@ BOOTLOADER = caterina
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-CUSTOM_MATRIX = yes # Remote matrix from the wireless bridge
+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
NKRO_ENABLE = yes # Enable N-Key Rollover
-# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
-UNICODE_ENABLE = yes # Unicode
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+UNICODE_ENABLE = yes
+CUSTOM_MATRIX = lite
-# # project specific files
-SRC += matrix.c serial_uart.c
+# project specific files
+SRC += matrix.c
+QUANTUM_LIB_SRC += uart.c
diff --git a/keyboards/mode/m65s/rules.mk b/keyboards/mode/m65s/rules.mk
index ed43a7bc77..bb3ebaee28 100644
--- a/keyboards/mode/m65s/rules.mk
+++ b/keyboards/mode/m65s/rules.mk
@@ -1,6 +1,9 @@
# MCU name
MCU = STM32F401
+# Bootloader selection
+BOOTLOADER = stm32-dfu
+
# Build Options
# change yes to no to disable
#
@@ -14,6 +17,6 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
EEPROM_DRIVER = i2c
+
# Enter lower-power sleep mode when on the ChibiOS idle thread
OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE -DDEBUG_EEPROM_OUTPUT=TRUE
-STM32_BOOTLOADER_ADDRESS = 0x1FFF0000
diff --git a/keyboards/splitreus62/config.h b/keyboards/nacly/splitreus62/config.h
index d8e67661bd..d8e67661bd 100644
--- a/keyboards/splitreus62/config.h
+++ b/keyboards/nacly/splitreus62/config.h
diff --git a/keyboards/splitreus62/info.json b/keyboards/nacly/splitreus62/info.json
index a9f9b540a9..a9f9b540a9 100644
--- a/keyboards/splitreus62/info.json
+++ b/keyboards/nacly/splitreus62/info.json
diff --git a/keyboards/splitreus62/keymaps/default/keymap.c b/keyboards/nacly/splitreus62/keymaps/default/keymap.c
index 0137b7e3d9..0137b7e3d9 100644
--- a/keyboards/splitreus62/keymaps/default/keymap.c
+++ b/keyboards/nacly/splitreus62/keymaps/default/keymap.c
diff --git a/keyboards/splitreus62/keymaps/scheiklp/config.h b/keyboards/nacly/splitreus62/keymaps/scheiklp/config.h
index 04af418d8f..04af418d8f 100644
--- a/keyboards/splitreus62/keymaps/scheiklp/config.h
+++ b/keyboards/nacly/splitreus62/keymaps/scheiklp/config.h
diff --git a/keyboards/splitreus62/keymaps/scheiklp/keymap.c b/keyboards/nacly/splitreus62/keymaps/scheiklp/keymap.c
index b192e357f0..b192e357f0 100644
--- a/keyboards/splitreus62/keymaps/scheiklp/keymap.c
+++ b/keyboards/nacly/splitreus62/keymaps/scheiklp/keymap.c
diff --git a/keyboards/splitreus62/keymaps/scheiklp/rules.mk b/keyboards/nacly/splitreus62/keymaps/scheiklp/rules.mk
index cbfc44e1bd..cbfc44e1bd 100644
--- a/keyboards/splitreus62/keymaps/scheiklp/rules.mk
+++ b/keyboards/nacly/splitreus62/keymaps/scheiklp/rules.mk
diff --git a/keyboards/nacly/splitreus62/readme.md b/keyboards/nacly/splitreus62/readme.md
new file mode 100644
index 0000000000..414b507d97
--- /dev/null
+++ b/keyboards/nacly/splitreus62/readme.md
@@ -0,0 +1,13 @@
+# splitreus62
+
+A split version of the [Atreus62](https://github.com/profet23/atreus62) by Profet23, which itself is based on Phil Hagelberg's [Atreus](https://github.com/technomancy/atreus). You can copy keymaps from Atreus62 and use them with this keyboard.
+
+* Keyboard Maintainer: [NaCly](https://github.com/Na-Cly)
+* Hardware Supported: splitreus62 PCBs, Pro Micro
+* Hardware Availability: https://github.com/Na-Cly/splitreus62
+
+Make example for this keyboard (after setting up your build environment):
+
+ make nacly/splitreus62:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/splitreus62/rules.mk b/keyboards/nacly/splitreus62/rules.mk
index d585e3b4b3..d585e3b4b3 100644
--- a/keyboards/splitreus62/rules.mk
+++ b/keyboards/nacly/splitreus62/rules.mk
diff --git a/keyboards/splitreus62/splitreus62.c b/keyboards/nacly/splitreus62/splitreus62.c
index d6ea3f9135..d6ea3f9135 100644
--- a/keyboards/splitreus62/splitreus62.c
+++ b/keyboards/nacly/splitreus62/splitreus62.c
diff --git a/keyboards/splitreus62/splitreus62.h b/keyboards/nacly/splitreus62/splitreus62.h
index bc6c2a9131..bc6c2a9131 100644
--- a/keyboards/splitreus62/splitreus62.h
+++ b/keyboards/nacly/splitreus62/splitreus62.h
diff --git a/keyboards/ua62/config.h b/keyboards/nacly/ua62/config.h
index 492bba93e8..492bba93e8 100644
--- a/keyboards/ua62/config.h
+++ b/keyboards/nacly/ua62/config.h
diff --git a/keyboards/ua62/info.json b/keyboards/nacly/ua62/info.json
index 4090b43d11..4090b43d11 100644
--- a/keyboards/ua62/info.json
+++ b/keyboards/nacly/ua62/info.json
diff --git a/keyboards/ua62/keymaps/default/keymap.c b/keyboards/nacly/ua62/keymaps/default/keymap.c
index 5488fdfdc1..5488fdfdc1 100644
--- a/keyboards/ua62/keymaps/default/keymap.c
+++ b/keyboards/nacly/ua62/keymaps/default/keymap.c
diff --git a/keyboards/nacly/ua62/readme.md b/keyboards/nacly/ua62/readme.md
new file mode 100644
index 0000000000..cb4b870bcd
--- /dev/null
+++ b/keyboards/nacly/ua62/readme.md
@@ -0,0 +1,14 @@
+# UA62
+
+* A Universal pcb for the atreus62
+* atreus62 by profet23
+* Original atreus by Phil Hagelberg
+* Keyboard Maintainer: [NaCly](https://github.com/na-cly)
+* Hardware Supported: UA62 PCB
+* Hardware Availability: https://github.com/na-cly/UA62 (Order PCBS)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make nacly/ua62: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/ua62/rules.mk b/keyboards/nacly/ua62/rules.mk
index 33d28b3a89..33d28b3a89 100644
--- a/keyboards/ua62/rules.mk
+++ b/keyboards/nacly/ua62/rules.mk
diff --git a/keyboards/ua62/ua62.c b/keyboards/nacly/ua62/ua62.c
index cac45f3fbf..cac45f3fbf 100644
--- a/keyboards/ua62/ua62.c
+++ b/keyboards/nacly/ua62/ua62.c
diff --git a/keyboards/ua62/ua62.h b/keyboards/nacly/ua62/ua62.h
index 4509bbff3d..4509bbff3d 100644
--- a/keyboards/ua62/ua62.h
+++ b/keyboards/nacly/ua62/ua62.h
diff --git a/keyboards/nafuda/readme.md b/keyboards/nafuda/readme.md
deleted file mode 100644
index 73007ed01e..0000000000
--- a/keyboards/nafuda/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# nafuda
-
-![nafuda](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20190608/20190608024901.jpg)
-
-This is 7 keys cursor macropad.
-
-* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
-* Hardware Supported: Nafuda PCB, Pro Micro
-* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1271706)
-
-Make example for this keyboard (after setting up your build environment):
-
- make nafuda:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://salicylic-acid3.hatenablog.com/entry/nafuda-build-guide)
diff --git a/keyboards/naiping/np64/readme.md b/keyboards/naiping/np64/readme.md
deleted file mode 100644
index 8e85d79de3..0000000000
--- a/keyboards/naiping/np64/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# NP_64
-
-![NP_64](https://i.imgur.com/DzLy87M.png)
-
-A 60% keyboard based on STM32f303
-
-* Keyboard Maintainer: [Weirdo](https://github.com/weirdo-f) (https://weirdo-f.github.io)
-* Hardware Supported: NP_64
-* Hardware Availability: Not yet
-
-Make example for this keyboard (after setting up your build environment):
-
- make naiping/np64:default
-
-The RST pin and GND pin on the board can be quickly shortened twice to enter DFU mode, and then the program can be written.
-
-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/naiping/nphhkb/readme.md b/keyboards/naiping/nphhkb/readme.md
deleted file mode 100644
index 47ad9dafc3..0000000000
--- a/keyboards/naiping/nphhkb/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# NP_hhkb
-
-![NP_hhkb](https://i.imgur.com/XnA4qVU.png)
-
-A 60% keyboard based on STM32f303
-
-* Keyboard Maintainer: [Weirdo](https://github.com/weirdo-f) (https://weirdo-f.github.io)
-* Hardware Supported: NP_hhkb
-* Hardware Availability: Not yet
-
-Make example for this keyboard (after setting up your build environment):
-
- make naiping/nphhkb:default
-
-The RST pin and GND pin on the board can be quickly shortened twice to enter DFU mode, and then the program can be written.
-
-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/naiping/npminila/readme.md b/keyboards/naiping/npminila/readme.md
deleted file mode 100644
index 335e12508d..0000000000
--- a/keyboards/naiping/npminila/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# NP_minila
-
-![NP_minila](https://i.imgur.com/Cuy5W1H.png)
-
-A 60% keyboard based on STM32f303
-
-* Keyboard Maintainer: [Weirdo](https://weirdo-f.github.io)(https://github.com/1248314361)
-* Hardware Supported: NP_minila
-* Hardware Availability: Not yet
-
-Make example for this keyboard (after setting up your build environment):
-
- make naiping/npminila:default
-
-The RST pin and GND pin on the board can be quickly shortened twice to enter DFU mode, and then the program can be written.
-
-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/naked48/naked48.h b/keyboards/naked48/naked48.h
deleted file mode 100644
index e210cf0f57..0000000000
--- a/keyboards/naked48/naked48.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-Copyright 2021 Salicylic_Acid
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General 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"
-
-#ifdef KEYBOARD_naked48_rev1
- #include "rev1.h"
-#endif
diff --git a/keyboards/naked48/readme.md b/keyboards/naked48/readme.md
deleted file mode 100644
index bb16571efd..0000000000
--- a/keyboards/naked48/readme.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# naked48
-
-![naked48](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20190326/20190326015949.jpg)
-
-This is 48 keys modification Ortholinear keyboard.
-
-Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
-Hardware Supported: Naked60BMP PCB, Pro Micro
-Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1271568)
-
-Make example for this keyboard (after setting up your build environment):
-
- make naked48:default:avrdude
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://salicylic-acid3.hatenablog.com/entry/naked48led-build-guide)
-[Firmware](https://github.com/Salicylic-acid3/qmk_firmware/tree/master/keyboards/naked48)
diff --git a/keyboards/naked48/rules.mk b/keyboards/naked48/rules.mk
deleted file mode 100644
index 6e848a2815..0000000000
--- a/keyboards/naked48/rules.mk
+++ /dev/null
@@ -1,24 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = caterina
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
-AUDIO_ENABLE = no # Audio output
-RGB_MATRIX_ENABLE = no
-RGB_MATRIX_DRIVER = WS2812
-
-SPLIT_KEYBOARD = yes
-
-DEFAULT_FOLDER = naked48/rev1
diff --git a/keyboards/naked60/naked60.h b/keyboards/naked60/naked60.h
deleted file mode 100644
index 4952b6b076..0000000000
--- a/keyboards/naked60/naked60.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
-Copyright 2021 Salicylic_Acid
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General 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"
-
-#ifdef KEYBOARD_naked60_rev1
- #include "rev1.h"
-#endif
diff --git a/keyboards/naked60/readme.md b/keyboards/naked60/readme.md
deleted file mode 100644
index 60bb164377..0000000000
--- a/keyboards/naked60/readme.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# naked60
-
-![naked60](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20190530/20190530040355.jpg)
-
-This is 60 keys modification Ortholinear keyboard.
-
-Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
-Hardware Supported: Naked60BMP PCB, Pro Micro
-Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1360780)
-
-Make example for this keyboard (after setting up your build environment):
-
- make naked60:default:avrdude
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://salicylic-acid3.hatenablog.com/entry/naked60bmp-build-guide)
-[Firmware](https://github.com/Salicylic-acid3/qmk_firmware/tree/master/keyboards/naked60)
diff --git a/keyboards/naked60/rules.mk b/keyboards/naked60/rules.mk
deleted file mode 100644
index 46aef17c7a..0000000000
--- a/keyboards/naked60/rules.mk
+++ /dev/null
@@ -1,22 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = caterina
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
-AUDIO_ENABLE = no # Audio output
-
-SPLIT_KEYBOARD = yes
-
-DEFAULT_FOLDER = naked60/rev1
diff --git a/keyboards/naked64/naked64.h b/keyboards/naked64/naked64.h
deleted file mode 100644
index a131440118..0000000000
--- a/keyboards/naked64/naked64.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#pragma once
-
-#include "quantum.h"
-
-#ifdef KEYBOARD_naked64_rev1
- #include "rev1.h"
-#endif
diff --git a/keyboards/naked64/readme.md b/keyboards/naked64/readme.md
deleted file mode 100644
index 403e5cf4ae..0000000000
--- a/keyboards/naked64/readme.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# naked64
-
-![naked64](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20190627/20190627022840.jpg)
-
-This is 64 keys modification Ortholinear keyboard.
-
-Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
-Hardware Supported: Naked64SF PCB, Pro Micro
-Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1418693)
-
-Make example for this keyboard (after setting up your build environment):
-
- make naked64:default:flash
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://salicylic-acid3.hatenablog.com/entry/naked64SF-build-guide)
-[Firmware](https://github.com/Salicylic-acid3/qmk_firmware/tree/master/keyboards/naked64)
diff --git a/keyboards/naked64/rules.mk b/keyboards/naked64/rules.mk
deleted file mode 100644
index 7de80383e1..0000000000
--- a/keyboards/naked64/rules.mk
+++ /dev/null
@@ -1,24 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = caterina
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-AUDIO_ENABLE = no # Audio output
-RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
-OLED_ENABLE = no
-USE_I2C = no
-
-SPLIT_KEYBOARD = yes
-
-DEFAULT_FOLDER = naked64/rev1
diff --git a/keyboards/nek_type_a/matrix.c b/keyboards/nek_type_a/matrix.c
index a59598a503..b396be9911 100644
--- a/keyboards/nek_type_a/matrix.c
+++ b/keyboards/nek_type_a/matrix.c
@@ -205,14 +205,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
-#if (DEBOUNCE > 0)
- if (debouncing) return false;
-#endif
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/nk1/readme.md b/keyboards/nk1/readme.md
deleted file mode 100644
index bc668481b5..0000000000
--- a/keyboards/nk1/readme.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# NK1
-
-A big switch keypad!
-
-* Keyboard Maintainer: [Yiancar](https://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
-* Hardware Supported: A BIG keypad with ATmega 32u4
-* Hardware Availability: https://novelkeys.xyz/
-
-## Instructions
-
-### Build
-
-Make example for this keyboard (after setting up your build environment):
-
- make nk1: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).
-
-### Reset
-
-- Unplug
-- Hold the key
-- Plug In
-- Unplug
-- Release the key
-
-### Flash
-
-- Unplug
-- Hold the key
-- Plug In
-- Flash using QMK Toolbox or dfu-util (`make nk1:<keymap>:flash`)
diff --git a/keyboards/nk65/readme.md b/keyboards/nk65/readme.md
deleted file mode 100755
index 3bd04210d1..0000000000
--- a/keyboards/nk65/readme.md
+++ /dev/null
@@ -1,39 +0,0 @@
-NK65
-=========
-
-![NK65](https://i.imgur.com/EXNbVpL.jpg)
-
-This is a standard fixed layout 65% PCB. It supports VIA and full per-key RGB.
-
-Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
-Hardware Supported: A 65% keyboard with STM32F303CC
-Hardware Availability: https://novelkeys.xyz/
-
-Due to the RGB implementation, the NK65 is currently not compatible with community layouts.
-
-NOTE: For PCBs with revision v1.4 or later please use nk65/v1_4 in the make command.
-
-## Instructions
-
-### Build
-
-Make example for this keyboard (after setting up your build environment):
-
- make nk65:via
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-### Reset
-
-- Unplug
-- Hold Escape
-- Plug In
-- Unplug
-- Release Escape
-
-### Flash
-
-- Unplug
-- Hold Escape
-- Plug In
-- Flash using QMK Toolbox or dfu-util (`make nk65:<keymap>:dfu-util`)
diff --git a/keyboards/nk87/readme.md b/keyboards/nk87/readme.md
deleted file mode 100755
index 9ea4d99718..0000000000
--- a/keyboards/nk87/readme.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# NK87
-
-![NK87](https://i.imgur.com/nw29fvc.png)
-
-This is a standard fixed layout TKL PCB. It supports VIA and full per-key RGB.
-
-* Keyboard Maintainer: [Yiancar](https://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
-* Hardware Supported: A TKL keyboard with STM32F303CC
-* Hardware Availability: https://novelkeys.xyz/
-
-## Instructions
-
-### Build
-
-Make example for this keyboard (after setting up your build environment):
-
- make nk87: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).
-
-### Reset
-
-- Unplug
-- Hold Escape
-- Plug In
-- Unplug
-- Release Escape
-
-### Flash
-
-- Unplug
-- Hold Escape
-- Plug In
-- Flash using QMK Toolbox or dfu-util (`make nk87:<keymap>:dfu-util`)
diff --git a/keyboards/nknl7en/readme.md b/keyboards/nknl7en/readme.md
deleted file mode 100644
index 5cbffae30c..0000000000
--- a/keyboards/nknl7en/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# nknl7en
-
-![nknl7en](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20201113/20201113010013.png)
-
-This is 70 keys Custom keyboard.
-
-* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
-* Hardware Supported: nknl7 PCB, Pro Micro
-* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/2672651)
-
-Make example for this keyboard (after setting up your build environment):
-
- make nknl7en:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://salicylic-acid3.hatenablog.com/entry/nknl7-build-guide)
diff --git a/keyboards/nknl7jp/readme.md b/keyboards/nknl7jp/readme.md
deleted file mode 100644
index 9d0ccba4e8..0000000000
--- a/keyboards/nknl7jp/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# nknl7jp
-
-![nknl7jp](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20201113/20201113010013.png)
-
-This is 73 keys Custom keyboard.
-
-* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
-* Hardware Supported: nknl7jp PCB, Pro Micro
-* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/2672651)
-
-Make example for this keyboard (after setting up your build environment):
-
- make nknl7jp:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://salicylic-acid3.hatenablog.com/entry/nknl7-build-guide)
diff --git a/keyboards/nk1/config.h b/keyboards/novelkeys/nk1/config.h
index 122df2e6da..122df2e6da 100644
--- a/keyboards/nk1/config.h
+++ b/keyboards/novelkeys/nk1/config.h
diff --git a/keyboards/nk1/info.json b/keyboards/novelkeys/nk1/info.json
index 43b1719e94..43b1719e94 100755
--- a/keyboards/nk1/info.json
+++ b/keyboards/novelkeys/nk1/info.json
diff --git a/keyboards/nk1/keymaps/default/keymap.c b/keyboards/novelkeys/nk1/keymaps/default/keymap.c
index 550a0f4873..550a0f4873 100644
--- a/keyboards/nk1/keymaps/default/keymap.c
+++ b/keyboards/novelkeys/nk1/keymaps/default/keymap.c
diff --git a/keyboards/nk1/keymaps/default/readme.md b/keyboards/novelkeys/nk1/keymaps/default/readme.md
index 6e9c78ee51..6e9c78ee51 100644
--- a/keyboards/nk1/keymaps/default/readme.md
+++ b/keyboards/novelkeys/nk1/keymaps/default/readme.md
diff --git a/keyboards/nk1/keymaps/via/keymap.c b/keyboards/novelkeys/nk1/keymaps/via/keymap.c
index 550a0f4873..550a0f4873 100644
--- a/keyboards/nk1/keymaps/via/keymap.c
+++ b/keyboards/novelkeys/nk1/keymaps/via/keymap.c
diff --git a/keyboards/nk1/keymaps/via/readme.md b/keyboards/novelkeys/nk1/keymaps/via/readme.md
index 10025a5969..10025a5969 100644
--- a/keyboards/nk1/keymaps/via/readme.md
+++ b/keyboards/novelkeys/nk1/keymaps/via/readme.md
diff --git a/keyboards/7splus/keymaps/via/rules.mk b/keyboards/novelkeys/nk1/keymaps/via/rules.mk
index 036bd6d1c3..036bd6d1c3 100644
--- a/keyboards/7splus/keymaps/via/rules.mk
+++ b/keyboards/novelkeys/nk1/keymaps/via/rules.mk
diff --git a/keyboards/nk1/nk1.c b/keyboards/novelkeys/nk1/nk1.c
index 6833478568..6833478568 100644
--- a/keyboards/nk1/nk1.c
+++ b/keyboards/novelkeys/nk1/nk1.c
diff --git a/keyboards/nk1/nk1.h b/keyboards/novelkeys/nk1/nk1.h
index 3962e18516..3962e18516 100644
--- a/keyboards/nk1/nk1.h
+++ b/keyboards/novelkeys/nk1/nk1.h
diff --git a/keyboards/novelkeys/nk1/readme.md b/keyboards/novelkeys/nk1/readme.md
new file mode 100644
index 0000000000..720d03adbc
--- /dev/null
+++ b/keyboards/novelkeys/nk1/readme.md
@@ -0,0 +1,32 @@
+# NK1
+
+A big switch keypad!
+
+* Keyboard Maintainer: [Yiancar](https://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
+* Hardware Supported: A BIG keypad with ATmega 32u4
+* Hardware Availability: https://novelkeys.xyz/
+
+## Instructions
+
+### Build
+
+Make example for this keyboard (after setting up your build environment):
+
+ make novelkeys/nk1: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).
+
+### Reset
+
+- Unplug
+- Hold the key
+- Plug In
+- Unplug
+- Release the key
+
+### Flash
+
+- Unplug
+- Hold the key
+- Plug In
+- Flash using QMK Toolbox or dfu-util (`make nk1:<keymap>:flash`)
diff --git a/keyboards/nk1/rules.mk b/keyboards/novelkeys/nk1/rules.mk
index 16d3dfedd0..16d3dfedd0 100644
--- a/keyboards/nk1/rules.mk
+++ b/keyboards/novelkeys/nk1/rules.mk
diff --git a/keyboards/nk65/config.h b/keyboards/novelkeys/nk65/config.h
index 3268e8ebf4..3268e8ebf4 100755
--- a/keyboards/nk65/config.h
+++ b/keyboards/novelkeys/nk65/config.h
diff --git a/keyboards/nk65/halconf.h b/keyboards/novelkeys/nk65/halconf.h
index e6d7e3c2ed..e6d7e3c2ed 100644
--- a/keyboards/nk65/halconf.h
+++ b/keyboards/novelkeys/nk65/halconf.h
diff --git a/keyboards/nk65/info.json b/keyboards/novelkeys/nk65/info.json
index 3c2b438c2b..3c2b438c2b 100755
--- a/keyboards/nk65/info.json
+++ b/keyboards/novelkeys/nk65/info.json
diff --git a/keyboards/nk65/keymaps/default/keymap.c b/keyboards/novelkeys/nk65/keymaps/default/keymap.c
index f0fcda4674..f0fcda4674 100755
--- a/keyboards/nk65/keymaps/default/keymap.c
+++ b/keyboards/novelkeys/nk65/keymaps/default/keymap.c
diff --git a/keyboards/nk65/keymaps/default/readme.md b/keyboards/novelkeys/nk65/keymaps/default/readme.md
index 27bcd0501d..27bcd0501d 100755
--- a/keyboards/nk65/keymaps/default/readme.md
+++ b/keyboards/novelkeys/nk65/keymaps/default/readme.md
diff --git a/keyboards/nk65/keymaps/madhatter/keymap.c b/keyboards/novelkeys/nk65/keymaps/madhatter/keymap.c
index e5e0fea461..e5e0fea461 100755
--- a/keyboards/nk65/keymaps/madhatter/keymap.c
+++ b/keyboards/novelkeys/nk65/keymaps/madhatter/keymap.c
diff --git a/keyboards/nk65/keymaps/via/keymap.c b/keyboards/novelkeys/nk65/keymaps/via/keymap.c
index f0fcda4674..f0fcda4674 100755
--- a/keyboards/nk65/keymaps/via/keymap.c
+++ b/keyboards/novelkeys/nk65/keymaps/via/keymap.c
diff --git a/keyboards/nk65/keymaps/via/readme.md b/keyboards/novelkeys/nk65/keymaps/via/readme.md
index 6689191e4c..6689191e4c 100755
--- a/keyboards/nk65/keymaps/via/readme.md
+++ b/keyboards/novelkeys/nk65/keymaps/via/readme.md
diff --git a/keyboards/gingham/keymaps/via/rules.mk b/keyboards/novelkeys/nk65/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644..100755
--- a/keyboards/gingham/keymaps/via/rules.mk
+++ b/keyboards/novelkeys/nk65/keymaps/via/rules.mk
diff --git a/keyboards/nk65/mcuconf.h b/keyboards/novelkeys/nk65/mcuconf.h
index f37f37c179..f37f37c179 100644
--- a/keyboards/nk65/mcuconf.h
+++ b/keyboards/novelkeys/nk65/mcuconf.h
diff --git a/keyboards/nk65/nk65.c b/keyboards/novelkeys/nk65/nk65.c
index 4ed18c114e..4ed18c114e 100755
--- a/keyboards/nk65/nk65.c
+++ b/keyboards/novelkeys/nk65/nk65.c
diff --git a/keyboards/nk65/nk65.h b/keyboards/novelkeys/nk65/nk65.h
index 35aca2a64c..35aca2a64c 100755
--- a/keyboards/nk65/nk65.h
+++ b/keyboards/novelkeys/nk65/nk65.h
diff --git a/keyboards/novelkeys/nk65/readme.md b/keyboards/novelkeys/nk65/readme.md
new file mode 100755
index 0000000000..38f66500b9
--- /dev/null
+++ b/keyboards/novelkeys/nk65/readme.md
@@ -0,0 +1,39 @@
+NK65
+=========
+
+![NK65](https://i.imgur.com/EXNbVpL.jpg)
+
+This is a standard fixed layout 65% PCB. It supports VIA and full per-key RGB.
+
+Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
+Hardware Supported: A 65% keyboard with STM32F303CC
+Hardware Availability: https://novelkeys.xyz/
+
+Due to the RGB implementation, the NK65 is currently not compatible with community layouts.
+
+NOTE: For PCBs with revision v1.4 or later please use nk65/v1_4 in the make command.
+
+## Instructions
+
+### Build
+
+Make example for this keyboard (after setting up your build environment):
+
+ make novelkeys/nk65:via
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+### Reset
+
+- Unplug
+- Hold Escape
+- Plug In
+- Unplug
+- Release Escape
+
+### Flash
+
+- Unplug
+- Hold Escape
+- Plug In
+- Flash using QMK Toolbox or dfu-util (`make nk65:<keymap>:dfu-util`)
diff --git a/keyboards/nk65/rules.mk b/keyboards/novelkeys/nk65/rules.mk
index d64ce8e1f6..d64ce8e1f6 100755
--- a/keyboards/nk65/rules.mk
+++ b/keyboards/novelkeys/nk65/rules.mk
diff --git a/keyboards/nk65/v1_4/config.h b/keyboards/novelkeys/nk65/v1_4/config.h
index 88629e5c99..88629e5c99 100755
--- a/keyboards/nk65/v1_4/config.h
+++ b/keyboards/novelkeys/nk65/v1_4/config.h
diff --git a/keyboards/nk65/v1_4/readme.md b/keyboards/novelkeys/nk65/v1_4/readme.md
index 399919a8be..399919a8be 100755
--- a/keyboards/nk65/v1_4/readme.md
+++ b/keyboards/novelkeys/nk65/v1_4/readme.md
diff --git a/keyboards/nk65/v1_4/rules.mk b/keyboards/novelkeys/nk65/v1_4/rules.mk
index 8b13789179..8b13789179 100755
--- a/keyboards/nk65/v1_4/rules.mk
+++ b/keyboards/novelkeys/nk65/v1_4/rules.mk
diff --git a/keyboards/nk87/config.h b/keyboards/novelkeys/nk87/config.h
index 091d80efb8..091d80efb8 100755
--- a/keyboards/nk87/config.h
+++ b/keyboards/novelkeys/nk87/config.h
diff --git a/keyboards/nk87/halconf.h b/keyboards/novelkeys/nk87/halconf.h
index fb0c214264..fb0c214264 100644
--- a/keyboards/nk87/halconf.h
+++ b/keyboards/novelkeys/nk87/halconf.h
diff --git a/keyboards/nk87/info.json b/keyboards/novelkeys/nk87/info.json
index 5603ffd52b..5603ffd52b 100755
--- a/keyboards/nk87/info.json
+++ b/keyboards/novelkeys/nk87/info.json
diff --git a/keyboards/nk87/keymaps/default/keymap.c b/keyboards/novelkeys/nk87/keymaps/default/keymap.c
index f5387d48de..f5387d48de 100755
--- a/keyboards/nk87/keymaps/default/keymap.c
+++ b/keyboards/novelkeys/nk87/keymaps/default/keymap.c
diff --git a/keyboards/nk87/keymaps/default/readme.md b/keyboards/novelkeys/nk87/keymaps/default/readme.md
index c0ca436184..c0ca436184 100755
--- a/keyboards/nk87/keymaps/default/readme.md
+++ b/keyboards/novelkeys/nk87/keymaps/default/readme.md
diff --git a/keyboards/nk87/keymaps/via/keymap.c b/keyboards/novelkeys/nk87/keymaps/via/keymap.c
index f8ada46952..f8ada46952 100755
--- a/keyboards/nk87/keymaps/via/keymap.c
+++ b/keyboards/novelkeys/nk87/keymaps/via/keymap.c
diff --git a/keyboards/nk87/keymaps/via/readme.md b/keyboards/novelkeys/nk87/keymaps/via/readme.md
index 90253575e7..90253575e7 100755
--- a/keyboards/nk87/keymaps/via/readme.md
+++ b/keyboards/novelkeys/nk87/keymaps/via/readme.md
diff --git a/keyboards/idobo/keymaps/via/rules.mk b/keyboards/novelkeys/nk87/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644..100755
--- a/keyboards/idobo/keymaps/via/rules.mk
+++ b/keyboards/novelkeys/nk87/keymaps/via/rules.mk
diff --git a/keyboards/nk87/mcuconf.h b/keyboards/novelkeys/nk87/mcuconf.h
index 1aa2fb55b4..1aa2fb55b4 100644
--- a/keyboards/nk87/mcuconf.h
+++ b/keyboards/novelkeys/nk87/mcuconf.h
diff --git a/keyboards/nk87/nk87.c b/keyboards/novelkeys/nk87/nk87.c
index c90ba02ea4..c90ba02ea4 100755
--- a/keyboards/nk87/nk87.c
+++ b/keyboards/novelkeys/nk87/nk87.c
diff --git a/keyboards/nk87/nk87.h b/keyboards/novelkeys/nk87/nk87.h
index d17b1fb4a0..d17b1fb4a0 100755
--- a/keyboards/nk87/nk87.h
+++ b/keyboards/novelkeys/nk87/nk87.h
diff --git a/keyboards/novelkeys/nk87/readme.md b/keyboards/novelkeys/nk87/readme.md
new file mode 100755
index 0000000000..0de3e08b40
--- /dev/null
+++ b/keyboards/novelkeys/nk87/readme.md
@@ -0,0 +1,34 @@
+# NK87
+
+![NK87](https://i.imgur.com/nw29fvc.png)
+
+This is a standard fixed layout TKL PCB. It supports VIA and full per-key RGB.
+
+* Keyboard Maintainer: [Yiancar](https://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
+* Hardware Supported: A TKL keyboard with STM32F303CC
+* Hardware Availability: https://novelkeys.xyz/
+
+## Instructions
+
+### Build
+
+Make example for this keyboard (after setting up your build environment):
+
+ make novelkeys/nk87: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).
+
+### Reset
+
+- Unplug
+- Hold Escape
+- Plug In
+- Unplug
+- Release Escape
+
+### Flash
+
+- Unplug
+- Hold Escape
+- Plug In
+- Flash using QMK Toolbox or dfu-util (`make nk87:<keymap>:dfu-util`)
diff --git a/keyboards/nk87/rules.mk b/keyboards/novelkeys/nk87/rules.mk
index fb3055a2a8..fb3055a2a8 100755
--- a/keyboards/nk87/rules.mk
+++ b/keyboards/novelkeys/nk87/rules.mk
diff --git a/keyboards/novelpad/config.h b/keyboards/novelkeys/novelpad/config.h
index a7947220ff..a7947220ff 100755
--- a/keyboards/novelpad/config.h
+++ b/keyboards/novelkeys/novelpad/config.h
diff --git a/keyboards/novelpad/info.json b/keyboards/novelkeys/novelpad/info.json
index ed4a31236d..ed4a31236d 100644
--- a/keyboards/novelpad/info.json
+++ b/keyboards/novelkeys/novelpad/info.json
diff --git a/keyboards/novelpad/keymaps/0xdec/keymap.c b/keyboards/novelkeys/novelpad/keymaps/0xdec/keymap.c
index bb8c977c92..bb8c977c92 100755
--- a/keyboards/novelpad/keymaps/0xdec/keymap.c
+++ b/keyboards/novelkeys/novelpad/keymaps/0xdec/keymap.c
diff --git a/keyboards/novelpad/keymaps/default/keymap.c b/keyboards/novelkeys/novelpad/keymaps/default/keymap.c
index cbac67eaaa..cbac67eaaa 100755
--- a/keyboards/novelpad/keymaps/default/keymap.c
+++ b/keyboards/novelkeys/novelpad/keymaps/default/keymap.c
diff --git a/keyboards/novelpad/novelpad.c b/keyboards/novelkeys/novelpad/novelpad.c
index 9f6ee7dae4..9f6ee7dae4 100755
--- a/keyboards/novelpad/novelpad.c
+++ b/keyboards/novelkeys/novelpad/novelpad.c
diff --git a/keyboards/novelpad/novelpad.h b/keyboards/novelkeys/novelpad/novelpad.h
index 6650a67223..6650a67223 100755
--- a/keyboards/novelpad/novelpad.h
+++ b/keyboards/novelkeys/novelpad/novelpad.h
diff --git a/keyboards/novelkeys/novelpad/readme.md b/keyboards/novelkeys/novelpad/readme.md
new file mode 100644
index 0000000000..49773b8dc0
--- /dev/null
+++ b/keyboards/novelkeys/novelpad/readme.md
@@ -0,0 +1,15 @@
+# NovelPad/NumChoc
+
+![NovelPad](https://i.imgur.com/vi4EdSh.jpg?1)
+
+A 5x4 macropad/numpad, sold by NovelKeys.xyz. There are two versions of the PCB, the NovelPad for MX switches and the NumChoc for Kailh Choc low profile switches. Both utilize the same firmware with no changes required.
+
+Keyboard Maintainer: [Cole Markham](https://github.com/colemarkham) / [Woodkeys.click](https://woodkeys.click)
+Hardware Supported: NovelPad
+Hardware Availability: [Novelkeys.xyz](https://novelkeys.xyz)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make novelkeys/novelpad: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/novelpad/rules.mk b/keyboards/novelkeys/novelpad/rules.mk
index ecdb295257..ecdb295257 100755
--- a/keyboards/novelpad/rules.mk
+++ b/keyboards/novelkeys/novelpad/rules.mk
diff --git a/keyboards/novelpad/readme.md b/keyboards/novelpad/readme.md
deleted file mode 100644
index 0cde8337ca..0000000000
--- a/keyboards/novelpad/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# NovelPad/NumChoc
-
-![NovelPad](https://i.imgur.com/vi4EdSh.jpg?1)
-
-A 5x4 macropad/numpad, sold by NovelKeys.xyz. There are two versions of the PCB, the NovelPad for MX switches and the NumChoc for Kailh Choc low profile switches. Both utilize the same firmware with no changes required.
-
-Keyboard Maintainer: [Cole Markham](https://github.com/colemarkham) / [Woodkeys.click](https://woodkeys.click)
-Hardware Supported: NovelPad
-Hardware Availability: [Novelkeys.xyz](https://novelkeys.xyz)
-
-Make example for this keyboard (after setting up your build environment):
-
- make novelpad: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/arch_36/arch_36.c b/keyboards/obosob/arch_36/arch_36.c
index d707e64195..d707e64195 100644
--- a/keyboards/arch_36/arch_36.c
+++ b/keyboards/obosob/arch_36/arch_36.c
diff --git a/keyboards/arch_36/arch_36.h b/keyboards/obosob/arch_36/arch_36.h
index 11c5e2de22..11c5e2de22 100644
--- a/keyboards/arch_36/arch_36.h
+++ b/keyboards/obosob/arch_36/arch_36.h
diff --git a/keyboards/arch_36/config.h b/keyboards/obosob/arch_36/config.h
index be4a0a9830..be4a0a9830 100644
--- a/keyboards/arch_36/config.h
+++ b/keyboards/obosob/arch_36/config.h
diff --git a/keyboards/arch_36/info.json b/keyboards/obosob/arch_36/info.json
index 344674a426..344674a426 100644
--- a/keyboards/arch_36/info.json
+++ b/keyboards/obosob/arch_36/info.json
diff --git a/keyboards/arch_36/keymaps/default/keymap.c b/keyboards/obosob/arch_36/keymaps/default/keymap.c
index 797ca8798f..797ca8798f 100644
--- a/keyboards/arch_36/keymaps/default/keymap.c
+++ b/keyboards/obosob/arch_36/keymaps/default/keymap.c
diff --git a/keyboards/arch_36/keymaps/obosob/config.h b/keyboards/obosob/arch_36/keymaps/obosob/config.h
index a60cafb5df..a60cafb5df 100644
--- a/keyboards/arch_36/keymaps/obosob/config.h
+++ b/keyboards/obosob/arch_36/keymaps/obosob/config.h
diff --git a/keyboards/arch_36/keymaps/obosob/keymap.c b/keyboards/obosob/arch_36/keymaps/obosob/keymap.c
index 104ee378f5..104ee378f5 100644
--- a/keyboards/arch_36/keymaps/obosob/keymap.c
+++ b/keyboards/obosob/arch_36/keymaps/obosob/keymap.c
diff --git a/keyboards/arch_36/keymaps/obosob/readme.md b/keyboards/obosob/arch_36/keymaps/obosob/readme.md
index e7dc6952d7..e7dc6952d7 100644
--- a/keyboards/arch_36/keymaps/obosob/readme.md
+++ b/keyboards/obosob/arch_36/keymaps/obosob/readme.md
diff --git a/keyboards/arch_36/keymaps/obosob/rules.mk b/keyboards/obosob/arch_36/keymaps/obosob/rules.mk
index 2b16ebb7bc..2b16ebb7bc 100644
--- a/keyboards/arch_36/keymaps/obosob/rules.mk
+++ b/keyboards/obosob/arch_36/keymaps/obosob/rules.mk
diff --git a/keyboards/obosob/arch_36/readme.md b/keyboards/obosob/arch_36/readme.md
new file mode 100644
index 0000000000..77c07a2a3b
--- /dev/null
+++ b/keyboards/obosob/arch_36/readme.md
@@ -0,0 +1,16 @@
+# Arch-36
+
+An ergonomic 30% split keyboard
+
+* Keyboard Maintainer: [obosob](https://github.com/obosob)
+* Hardware Supported: Pro Micro 5V/16MHz and compatible.
+
+Make example for this keyboard (after setting up your build environment):
+
+ make obosob/arch_36:default
+
+Example of flashing this keyboard:
+
+ make obosob/arch_36:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/arch_36/rules.mk b/keyboards/obosob/arch_36/rules.mk
index 9631a0323e..9631a0323e 100644
--- a/keyboards/arch_36/rules.mk
+++ b/keyboards/obosob/arch_36/rules.mk
diff --git a/keyboards/steal_this_keyboard/config.h b/keyboards/obosob/steal_this_keyboard/config.h
index ea637d0c2f..ea637d0c2f 100644
--- a/keyboards/steal_this_keyboard/config.h
+++ b/keyboards/obosob/steal_this_keyboard/config.h
diff --git a/keyboards/steal_this_keyboard/info.json b/keyboards/obosob/steal_this_keyboard/info.json
index 7a4eabdb55..7a4eabdb55 100644
--- a/keyboards/steal_this_keyboard/info.json
+++ b/keyboards/obosob/steal_this_keyboard/info.json
diff --git a/keyboards/steal_this_keyboard/keymaps/default/config.h b/keyboards/obosob/steal_this_keyboard/keymaps/default/config.h
index 14ec0792b1..14ec0792b1 100644
--- a/keyboards/steal_this_keyboard/keymaps/default/config.h
+++ b/keyboards/obosob/steal_this_keyboard/keymaps/default/config.h
diff --git a/keyboards/steal_this_keyboard/keymaps/default/keymap.c b/keyboards/obosob/steal_this_keyboard/keymaps/default/keymap.c
index 32834c16b1..32834c16b1 100644
--- a/keyboards/steal_this_keyboard/keymaps/default/keymap.c
+++ b/keyboards/obosob/steal_this_keyboard/keymaps/default/keymap.c
diff --git a/keyboards/obosob/steal_this_keyboard/readme.md b/keyboards/obosob/steal_this_keyboard/readme.md
new file mode 100644
index 0000000000..55384a9234
--- /dev/null
+++ b/keyboards/obosob/steal_this_keyboard/readme.md
@@ -0,0 +1,11 @@
+# steal this keyboard!
+
+A split 34 keys column staggered keyboard named and decorated after the System of a Down album Steal This Album. All PCB files are available on the [project's github page](https://github.com/obosob/steal_this_keyboard)
+
+* Keyboard Maintainer: [Obosob](https://github.com/obosob)
+
+Make examples for this keyboard (after setting up your build environment):
+
+ make obosob/steal_this_keyboard: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/steal_this_keyboard/rules.mk b/keyboards/obosob/steal_this_keyboard/rules.mk
index 03ff795574..03ff795574 100644
--- a/keyboards/steal_this_keyboard/rules.mk
+++ b/keyboards/obosob/steal_this_keyboard/rules.mk
diff --git a/keyboards/steal_this_keyboard/steal_this_keyboard.c b/keyboards/obosob/steal_this_keyboard/steal_this_keyboard.c
index cd5ef5cdda..cd5ef5cdda 100644
--- a/keyboards/steal_this_keyboard/steal_this_keyboard.c
+++ b/keyboards/obosob/steal_this_keyboard/steal_this_keyboard.c
diff --git a/keyboards/steal_this_keyboard/steal_this_keyboard.h b/keyboards/obosob/steal_this_keyboard/steal_this_keyboard.h
index af7204f540..af7204f540 100644
--- a/keyboards/steal_this_keyboard/steal_this_keyboard.h
+++ b/keyboards/obosob/steal_this_keyboard/steal_this_keyboard.h
diff --git a/keyboards/owl8/readme.md b/keyboards/owl8/readme.md
deleted file mode 100644
index b40a5f35cb..0000000000
--- a/keyboards/owl8/readme.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# owl8
-
-![owl8](https://raw.githubusercontent.com/yfuku/owl8/master/images/owl8.jpg)
-
-macropad
-
-* Keyboard Maintainer: [yfuku](https://github.com/yfuku)
-* Hardware Supported: owl8 PCB, Pro Micro
-* Hardware Availability: https://yfuku.booth.pm/
-
-Make example for this keyboard (after setting up your build environment):
-
- make owl8:default
-
-Flashing example for this keyboard:
-
- make owl8:default:flash
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/planck/keymaps/thermal_printer/config.h b/keyboards/planck/keymaps/thermal_printer/config.h
index 4ae9ced258..dd9d6a9d25 100644
--- a/keyboards/planck/keymaps/thermal_printer/config.h
+++ b/keyboards/planck/keymaps/thermal_printer/config.h
@@ -1,9 +1,4 @@
-#ifndef CONFIG_USER_H
-#define CONFIG_USER_H
-
-#include "../../config.h"
-
-#define SERIAL_UART_BAUD 19200
+#pragma once
/*
* MIDI options
@@ -21,8 +16,3 @@
- etc.
*/
//#define MIDI_ADVANCED
-
-/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
-//#define MIDI_TONE_KEYCODE_OCTAVES 2
-
- #endif \ No newline at end of file
diff --git a/keyboards/ploopyco/mouse/readme.md b/keyboards/ploopyco/mouse/readme.md
index f7f072928b..af3cb3520f 100644
--- a/keyboards/ploopyco/mouse/readme.md
+++ b/keyboards/ploopyco/mouse/readme.md
@@ -39,7 +39,7 @@ This should allow you to more heavily customize the behavior.
Alternatively, the `process_wheel` and `process_mouse` functions can both be replaced too, to allow for even more functionality.
-Additionally, you can change the DPI/CPI or speed of the krackball by calling `pmw_set_cpi` at any time. Additionally, there is a `DPI_CONFIG` macro that will cycle through an array of options for the DPI. This is set to 1200, 1600, and 2400, but can be changed. 1600 is also set to the default.
+Additionally, you can change the DPI/CPI or speed of the trackball by calling `pointing_device_set_cpi` at any time. Additionally, there is a `DPI_CONFIG` macro that will cycle through an array of options for the DPI. This is set to 1200, 1600, and 2400, but can be changed. 1600 is also set to the default.
To configure/set your own array, there are two defines to use, `PLOOPY_DPI_OPTIONS` to set the array, and `PLOOPY_DPI_DEFAULT`.
diff --git a/keyboards/ploopyco/trackball/readme.md b/keyboards/ploopyco/trackball/readme.md
index e1885d149a..1648bd20f9 100644
--- a/keyboards/ploopyco/trackball/readme.md
+++ b/keyboards/ploopyco/trackball/readme.md
@@ -19,7 +19,7 @@ See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_to
## Revisions
-There are two main revisions for the PloopyCo Tracball, everything up to 1.004, and 1.005-1.006.
+There are two main revisions for the PloopyCo Trackball, everything up to 1.004, and 1.005-1.006.
In the 1.005 revision, button for was changed from pin B5 to B6, and the debug LED pin was changed from F7 to B5.
@@ -47,7 +47,7 @@ This should allow you to more heavily customize the behavior.
Alternatively, the `process_wheel` and `process_mouse` functions can both be replaced too, to allow for even more functionality.
-Additionally, you can change the DPI/CPI or speed of the trackball by calling `pmw_set_cpi` at any time. Additionally, there is a `DPI_CONFIG` macro that will cycle through an array of options for the DPI. This is set to 1200, 1600, and 2400, but can be changed. 1600 is also set to the default.
+Additionally, you can change the DPI/CPI or speed of the trackball by calling `pointing_device_set_cpi` at any time. Additionally, there is a `DPI_CONFIG` macro that will cycle through an array of options for the DPI. This is set to 1200, 1600, and 2400, but can be changed. 1600 is also set to the default.
To configure/set your own array, there are two defines to use, `PLOOPY_DPI_OPTIONS` to set the array, and `PLOOPY_DPI_DEFAULT`.
diff --git a/keyboards/ploopyco/trackball/trackball.c b/keyboards/ploopyco/trackball/trackball.c
index 25b36574a5..f819958734 100644
--- a/keyboards/ploopyco/trackball/trackball.c
+++ b/keyboards/ploopyco/trackball/trackball.c
@@ -218,7 +218,7 @@ void keyboard_pre_init_kb(void) {
}
void pointing_device_init_kb(void) {
- pmw3360_set_cpi(dpi_array[keyboard_config.dpi_config]);
+ pointing_device_set_cpi(dpi_array[keyboard_config.dpi_config]);
// initialize the scroll wheel's optical encoder
opt_encoder_init();
}
diff --git a/keyboards/allison/allison.c b/keyboards/prototypist/allison/allison.c
index 4ca8bd07de..4ca8bd07de 100644
--- a/keyboards/allison/allison.c
+++ b/keyboards/prototypist/allison/allison.c
diff --git a/keyboards/allison/allison.h b/keyboards/prototypist/allison/allison.h
index e9078a82a1..e9078a82a1 100644
--- a/keyboards/allison/allison.h
+++ b/keyboards/prototypist/allison/allison.h
diff --git a/keyboards/allison/config.h b/keyboards/prototypist/allison/config.h
index 85cb6ee9f5..85cb6ee9f5 100644
--- a/keyboards/allison/config.h
+++ b/keyboards/prototypist/allison/config.h
diff --git a/keyboards/allison/info.json b/keyboards/prototypist/allison/info.json
index cd6b51f96e..cd6b51f96e 100644
--- a/keyboards/allison/info.json
+++ b/keyboards/prototypist/allison/info.json
diff --git a/keyboards/allison/keymaps/default/keymap.c b/keyboards/prototypist/allison/keymaps/default/keymap.c
index 30fed354a4..30fed354a4 100644
--- a/keyboards/allison/keymaps/default/keymap.c
+++ b/keyboards/prototypist/allison/keymaps/default/keymap.c
diff --git a/keyboards/allison/keymaps/default/readme.md b/keyboards/prototypist/allison/keymaps/default/readme.md
index 13f200dad3..13f200dad3 100644
--- a/keyboards/allison/keymaps/default/readme.md
+++ b/keyboards/prototypist/allison/keymaps/default/readme.md
diff --git a/keyboards/allison/keymaps/via/keymap.c b/keyboards/prototypist/allison/keymaps/via/keymap.c
index 30fed354a4..30fed354a4 100644
--- a/keyboards/allison/keymaps/via/keymap.c
+++ b/keyboards/prototypist/allison/keymaps/via/keymap.c
diff --git a/keyboards/allison/keymaps/via/readme.md b/keyboards/prototypist/allison/keymaps/via/readme.md
index b82bc8e79f..b82bc8e79f 100644
--- a/keyboards/allison/keymaps/via/readme.md
+++ b/keyboards/prototypist/allison/keymaps/via/readme.md
diff --git a/keyboards/jisplit89/keymaps/via/rules.mk b/keyboards/prototypist/allison/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/jisplit89/keymaps/via/rules.mk
+++ b/keyboards/prototypist/allison/keymaps/via/rules.mk
diff --git a/keyboards/prototypist/allison/readme.md b/keyboards/prototypist/allison/readme.md
new file mode 100644
index 0000000000..8101c3c715
--- /dev/null
+++ b/keyboards/prototypist/allison/readme.md
@@ -0,0 +1,15 @@
+# Allison
+
+![Allison](https://i.imgur.com/tvLtu4K.jpg)
+
+A custom luxurious 60 with F-row and Macro
+
+* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
+* Hardware Supported: ATmega32U4
+* Hardware Availability: Small production run by mrpetrov#9585 and [protoTypist](https://discord.gg/UvskpBB)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make prototypist/allison: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/allison/rules.mk b/keyboards/prototypist/allison/rules.mk
index 1c4073c9ce..1c4073c9ce 100644
--- a/keyboards/allison/rules.mk
+++ b/keyboards/prototypist/allison/rules.mk
diff --git a/keyboards/allison_numpad/allison_numpad.c b/keyboards/prototypist/allison_numpad/allison_numpad.c
index 16f36e3140..16f36e3140 100644
--- a/keyboards/allison_numpad/allison_numpad.c
+++ b/keyboards/prototypist/allison_numpad/allison_numpad.c
diff --git a/keyboards/allison_numpad/allison_numpad.h b/keyboards/prototypist/allison_numpad/allison_numpad.h
index 9295e68668..9295e68668 100644
--- a/keyboards/allison_numpad/allison_numpad.h
+++ b/keyboards/prototypist/allison_numpad/allison_numpad.h
diff --git a/keyboards/allison_numpad/config.h b/keyboards/prototypist/allison_numpad/config.h
index 581926c24c..581926c24c 100644
--- a/keyboards/allison_numpad/config.h
+++ b/keyboards/prototypist/allison_numpad/config.h
diff --git a/keyboards/allison_numpad/info.json b/keyboards/prototypist/allison_numpad/info.json
index e644d8ec3b..e644d8ec3b 100644
--- a/keyboards/allison_numpad/info.json
+++ b/keyboards/prototypist/allison_numpad/info.json
diff --git a/keyboards/allison_numpad/keymaps/default/keymap.c b/keyboards/prototypist/allison_numpad/keymaps/default/keymap.c
index 74310885c5..74310885c5 100644
--- a/keyboards/allison_numpad/keymaps/default/keymap.c
+++ b/keyboards/prototypist/allison_numpad/keymaps/default/keymap.c
diff --git a/keyboards/allison_numpad/keymaps/default/readme.md b/keyboards/prototypist/allison_numpad/keymaps/default/readme.md
index b6b98a1815..b6b98a1815 100644
--- a/keyboards/allison_numpad/keymaps/default/readme.md
+++ b/keyboards/prototypist/allison_numpad/keymaps/default/readme.md
diff --git a/keyboards/allison_numpad/keymaps/via/keymap.c b/keyboards/prototypist/allison_numpad/keymaps/via/keymap.c
index 74310885c5..74310885c5 100644
--- a/keyboards/allison_numpad/keymaps/via/keymap.c
+++ b/keyboards/prototypist/allison_numpad/keymaps/via/keymap.c
diff --git a/keyboards/allison_numpad/keymaps/via/readme.md b/keyboards/prototypist/allison_numpad/keymaps/via/readme.md
index b82bc8e79f..b82bc8e79f 100644
--- a/keyboards/allison_numpad/keymaps/via/readme.md
+++ b/keyboards/prototypist/allison_numpad/keymaps/via/readme.md
diff --git a/keyboards/kelowna/rgb64/keymaps/via/rules.mk b/keyboards/prototypist/allison_numpad/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/kelowna/rgb64/keymaps/via/rules.mk
+++ b/keyboards/prototypist/allison_numpad/keymaps/via/rules.mk
diff --git a/keyboards/prototypist/allison_numpad/readme.md b/keyboards/prototypist/allison_numpad/readme.md
new file mode 100644
index 0000000000..ea5e449b03
--- /dev/null
+++ b/keyboards/prototypist/allison_numpad/readme.md
@@ -0,0 +1,15 @@
+# Allison Numpad
+
+![Allison Numpad](https://i.imgur.com/tvLtu4K.jpg)
+
+A custom luxurious numpad to match Allison
+
+* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
+* Hardware Supported: ATmega32U4
+* Hardware Availability: Small production run by mrpetrov#9585 and [protoTypist](https://discord.gg/UvskpBB)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make prototypist/allison_numpad: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/allison_numpad/rules.mk b/keyboards/prototypist/allison_numpad/rules.mk
index 3bf8aba9f4..3bf8aba9f4 100644
--- a/keyboards/allison_numpad/rules.mk
+++ b/keyboards/prototypist/allison_numpad/rules.mk
diff --git a/keyboards/rabbit_capture_plan/readme.md b/keyboards/rabbit_capture_plan/readme.md
deleted file mode 100644
index bc6f9d5dea..0000000000
--- a/keyboards/rabbit_capture_plan/readme.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# rabbit_capture_plan
-
-![rabbit_capture_plan](https://i.gyazo.com/eb25048b17906f897253e8be18db001c.jpg)
-
-This is 70 keys split keyboard with trackball.
-
-* Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
-* Hardware Supported: rabbit capture plan pcb
-* Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
-
-Make example for this keyboard (after setting up your build environment):
-
- make rabbit_capture_plan:default
-
-Flashing example for this keyboard:
-
- make rabbit_capture_plan:default:flash
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/rainkeeb/readme.md b/keyboards/rainkeeb/readme.md
deleted file mode 100644
index f2c759ebeb..0000000000
--- a/keyboards/rainkeeb/readme.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# rainkeeb
-
-![rainkeeb](https://i.imgur.com/GpVBRMw.jpg)
-
-My first custom mech design. 4x10(ish), pro micro based, unibody, split, ortho (any more adjectives?), with OLED and (optional) rotary encoder.
-
-![Default layout](https://i.imgur.com/rCOwsoy.png)
-This is the default layout, at least the base layer. By default the OLED displays "rainkeeb" at the top in case you forget what you're typing on, a layer indicator below that (Default, Raised, Alt), and a WPM counter below that. Encoder toggles Play/Pause on click on the Default and Raised layers, and is supposed to RESET into flash-mode on the Alt layer but that's not working for some reason. Clockwise turn increases volume, scrolls down, and scrolls right on the Default, Raise, and Alt layers respectively. Counterclockwise does the opposite of the clockwise turns, you get the picture.
-
-* Keyboard Maintainer: [rain](https://github.com/rainsff)
-* Hardware Supported: rainkeeb PCB v1
-* Hardware Availability: GB soon
-
-Make example for this keyboard (after setting up your build environment):
-
- make rainkeeb:default
-
-To put reset into bootloader mode just push the reset button from the left side of the board using a pair of tweezers or similar object.
-
-Install example for this keyboard:
-
- make rainkeeb:default:flash
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/delilah/config.h b/keyboards/rainkeebs/delilah/config.h
index d07366a51d..d07366a51d 100644
--- a/keyboards/delilah/config.h
+++ b/keyboards/rainkeebs/delilah/config.h
diff --git a/keyboards/delilah/delilah.c b/keyboards/rainkeebs/delilah/delilah.c
index b2e98b60fa..b2e98b60fa 100644
--- a/keyboards/delilah/delilah.c
+++ b/keyboards/rainkeebs/delilah/delilah.c
diff --git a/keyboards/delilah/delilah.h b/keyboards/rainkeebs/delilah/delilah.h
index 64b25351b1..64b25351b1 100644
--- a/keyboards/delilah/delilah.h
+++ b/keyboards/rainkeebs/delilah/delilah.h
diff --git a/keyboards/delilah/info.json b/keyboards/rainkeebs/delilah/info.json
index d6a378eeba..d6a378eeba 100644
--- a/keyboards/delilah/info.json
+++ b/keyboards/rainkeebs/delilah/info.json
diff --git a/keyboards/delilah/keymaps/default/keymap.c b/keyboards/rainkeebs/delilah/keymaps/default/keymap.c
index ae00beadf5..ae00beadf5 100644
--- a/keyboards/delilah/keymaps/default/keymap.c
+++ b/keyboards/rainkeebs/delilah/keymaps/default/keymap.c
diff --git a/keyboards/delilah/keymaps/via/keymap.c b/keyboards/rainkeebs/delilah/keymaps/via/keymap.c
index 3a6e0d9a20..3a6e0d9a20 100644
--- a/keyboards/delilah/keymaps/via/keymap.c
+++ b/keyboards/rainkeebs/delilah/keymaps/via/keymap.c
diff --git a/keyboards/kprepublic/bm68hsrgb/keymaps/via/rules.mk b/keyboards/rainkeebs/delilah/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/kprepublic/bm68hsrgb/keymaps/via/rules.mk
+++ b/keyboards/rainkeebs/delilah/keymaps/via/rules.mk
diff --git a/keyboards/rainkeebs/delilah/readme.md b/keyboards/rainkeebs/delilah/readme.md
new file mode 100644
index 0000000000..cc8ad40d62
--- /dev/null
+++ b/keyboards/rainkeebs/delilah/readme.md
@@ -0,0 +1,22 @@
+# Delilah
+
+![Delilah](https://i.imgur.com/TqBZycx.png)
+
+A 12.25u, traditional stagger, 40% keyboard. Designed to keep another punctuation key on base layer while still being compact.
+
+* Keyboard Maintainer: Rain
+* Hardware Supported: Delilah PCB v1.0, v1.1
+* Hardware Availability: [rainkeebs](https://www.rainkeebs.mx/)
+
+
+Make example for this keyboard (after setting up your build environment):
+
+ qmk compile -kb rainkeebs/delilah -km default
+
+To reset the keyboard, hold the top left key while plugging in, or hit the reset button near the USB port
+
+Install example for this keyboard:
+
+ qmk flash -kb rainkeebs/delilah -km default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/delilah/rules.mk b/keyboards/rainkeebs/delilah/rules.mk
index 7c928a6cbf..7c928a6cbf 100644
--- a/keyboards/delilah/rules.mk
+++ b/keyboards/rainkeebs/delilah/rules.mk
diff --git a/keyboards/rainkeeb/config.h b/keyboards/rainkeebs/rainkeeb/config.h
index 36c3a5d5bf..36c3a5d5bf 100644
--- a/keyboards/rainkeeb/config.h
+++ b/keyboards/rainkeebs/rainkeeb/config.h
diff --git a/keyboards/rainkeeb/info.json b/keyboards/rainkeebs/rainkeeb/info.json
index b704d2d43b..b704d2d43b 100644
--- a/keyboards/rainkeeb/info.json
+++ b/keyboards/rainkeebs/rainkeeb/info.json
diff --git a/keyboards/rainkeeb/keymaps/default/keymap.c b/keyboards/rainkeebs/rainkeeb/keymaps/default/keymap.c
index 08cf7462c3..08cf7462c3 100644
--- a/keyboards/rainkeeb/keymaps/default/keymap.c
+++ b/keyboards/rainkeebs/rainkeeb/keymaps/default/keymap.c
diff --git a/keyboards/rainkeeb/keymaps/via/keymap.c b/keyboards/rainkeebs/rainkeeb/keymaps/via/keymap.c
index 08cf7462c3..08cf7462c3 100644
--- a/keyboards/rainkeeb/keymaps/via/keymap.c
+++ b/keyboards/rainkeebs/rainkeeb/keymaps/via/keymap.c
diff --git a/keyboards/ajisai74/keymaps/via/rules.mk b/keyboards/rainkeebs/rainkeeb/keymaps/via/rules.mk
index 036bd6d1c3..036bd6d1c3 100644
--- a/keyboards/ajisai74/keymaps/via/rules.mk
+++ b/keyboards/rainkeebs/rainkeeb/keymaps/via/rules.mk
diff --git a/keyboards/rainkeeb/rainkeeb.c b/keyboards/rainkeebs/rainkeeb/rainkeeb.c
index b13ecb2483..b13ecb2483 100644
--- a/keyboards/rainkeeb/rainkeeb.c
+++ b/keyboards/rainkeebs/rainkeeb/rainkeeb.c
diff --git a/keyboards/rainkeeb/rainkeeb.h b/keyboards/rainkeebs/rainkeeb/rainkeeb.h
index f0179f087c..f0179f087c 100644
--- a/keyboards/rainkeeb/rainkeeb.h
+++ b/keyboards/rainkeebs/rainkeeb/rainkeeb.h
diff --git a/keyboards/rainkeebs/rainkeeb/readme.md b/keyboards/rainkeebs/rainkeeb/readme.md
new file mode 100644
index 0000000000..6d82df0283
--- /dev/null
+++ b/keyboards/rainkeebs/rainkeeb/readme.md
@@ -0,0 +1,24 @@
+# rainkeeb
+
+![rainkeeb](https://i.imgur.com/GpVBRMw.jpg)
+
+My first custom mech design. 4x10(ish), pro micro based, unibody, split, ortho (any more adjectives?), with OLED and (optional) rotary encoder.
+
+![Default layout](https://i.imgur.com/rCOwsoy.png)
+This is the default layout, at least the base layer. By default the OLED displays "rainkeeb" at the top in case you forget what you're typing on, a layer indicator below that (Default, Raised, Alt), and a WPM counter below that. Encoder toggles Play/Pause on click on the Default and Raised layers, and is supposed to RESET into flash-mode on the Alt layer but that's not working for some reason. Clockwise turn increases volume, scrolls down, and scrolls right on the Default, Raise, and Alt layers respectively. Counterclockwise does the opposite of the clockwise turns, you get the picture.
+
+* Keyboard Maintainer: [rain](https://github.com/rainsff)
+* Hardware Supported: rainkeeb PCB v1
+* Hardware Availability: GB soon
+
+Make example for this keyboard (after setting up your build environment):
+
+ make rainkeebs/rainkeeb:default
+
+To put reset into bootloader mode just push the reset button from the left side of the board using a pair of tweezers or similar object.
+
+Install example for this keyboard:
+
+ make rainkeebs/rainkeeb:default:flash
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/rainkeeb/rules.mk b/keyboards/rainkeebs/rainkeeb/rules.mk
index a4b7fca0d1..a4b7fca0d1 100644
--- a/keyboards/rainkeeb/rules.mk
+++ b/keyboards/rainkeebs/rainkeeb/rules.mk
diff --git a/keyboards/yasui/config.h b/keyboards/rainkeebs/yasui/config.h
index 7d41a9e7f9..7d41a9e7f9 100644
--- a/keyboards/yasui/config.h
+++ b/keyboards/rainkeebs/yasui/config.h
diff --git a/keyboards/yasui/info.json b/keyboards/rainkeebs/yasui/info.json
index 019d4f94fc..019d4f94fc 100644
--- a/keyboards/yasui/info.json
+++ b/keyboards/rainkeebs/yasui/info.json
diff --git a/keyboards/yasui/keymaps/default/keymap.c b/keyboards/rainkeebs/yasui/keymaps/default/keymap.c
index 3f90b06c41..3f90b06c41 100644
--- a/keyboards/yasui/keymaps/default/keymap.c
+++ b/keyboards/rainkeebs/yasui/keymaps/default/keymap.c
diff --git a/keyboards/yasui/keymaps/via/keymap.c b/keyboards/rainkeebs/yasui/keymaps/via/keymap.c
index 3f90b06c41..3f90b06c41 100644
--- a/keyboards/yasui/keymaps/via/keymap.c
+++ b/keyboards/rainkeebs/yasui/keymaps/via/keymap.c
diff --git a/keyboards/ls_60/keymaps/via/rules.mk b/keyboards/rainkeebs/yasui/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/ls_60/keymaps/via/rules.mk
+++ b/keyboards/rainkeebs/yasui/keymaps/via/rules.mk
diff --git a/keyboards/rainkeebs/yasui/readme.md b/keyboards/rainkeebs/yasui/readme.md
new file mode 100644
index 0000000000..c167abf4a0
--- /dev/null
+++ b/keyboards/rainkeebs/yasui/readme.md
@@ -0,0 +1,22 @@
+# Yasui
+
+![Yasui](https://i.imgur.com/TRFOEkw.png)
+
+A 10u ortho kit.
+
+* Keyboard Maintainer: Rain
+* Hardware Supported: Yasui PCB v2
+* Hardware Availability: [rainkeebs](https://www.rainkeebs.mx/product/yasui-keyboard-kit)
+
+
+Make example for this keyboard (after setting up your build environment):
+
+ qmk compile -kb rainkeebs/yasui -km default
+
+To reset the keyboard, hold the top left key while plugging in, or hit the reset button near the USB port
+
+Install example for this keyboard:
+
+ qmk flash -kb rainkeebs/yasui -km default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/yasui/rules.mk b/keyboards/rainkeebs/yasui/rules.mk
index bc14e746aa..bc14e746aa 100644
--- a/keyboards/yasui/rules.mk
+++ b/keyboards/rainkeebs/yasui/rules.mk
diff --git a/keyboards/yasui/yasui.c b/keyboards/rainkeebs/yasui/yasui.c
index a87f7482a0..a87f7482a0 100644
--- a/keyboards/yasui/yasui.c
+++ b/keyboards/rainkeebs/yasui/yasui.c
diff --git a/keyboards/yasui/yasui.h b/keyboards/rainkeebs/yasui/yasui.h
index 387b9a5ac8..387b9a5ac8 100644
--- a/keyboards/yasui/yasui.h
+++ b/keyboards/rainkeebs/yasui/yasui.h
diff --git a/keyboards/redox_w/config.h b/keyboards/redox_w/config.h
index b480b072f9..c4aeb32d58 100644
--- a/keyboards/redox_w/config.h
+++ b/keyboards/redox_w/config.h
@@ -55,12 +55,3 @@
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
-
-//UART settings for communication with the RF microcontroller
-#define SERIAL_UART_BAUD 1000000
-#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
-#define SERIAL_UART_INIT_CUSTOM \
- /* enable TX and RX */ \
- UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
- /* 8-bit data */ \
- UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
diff --git a/keyboards/redox_w/matrix.c b/keyboards/redox_w/matrix.c
index 703987a939..fd25231d9e 100644
--- a/keyboards/redox_w/matrix.c
+++ b/keyboards/redox_w/matrix.c
@@ -13,89 +13,21 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <stdint.h>
-#include <stdbool.h>
-#if defined(__AVR__)
-#include <avr/io.h>
-#endif
-#include "wait.h"
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "timer.h"
-#include "protocol/serial.h"
-
-#if (MATRIX_COLS <= 8)
-# define print_matrix_header() print("\nr/c 01234567\n")
-# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop(matrix[i])
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop16(matrix[i])
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop32(matrix[i])
-# define ROW_SHIFTER ((uint32_t)1)
-#endif
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-
-__attribute__ ((weak))
-void matrix_init_quantum(void) {
- matrix_init_kb();
-}
-
-__attribute__ ((weak))
-void matrix_scan_quantum(void) {
- matrix_scan_kb();
-}
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void) {
- return MATRIX_ROWS;
-}
-inline
-uint8_t matrix_cols(void) {
- return MATRIX_COLS;
-}
-
-void matrix_init(void) {
+#include "quantum.h"
+#include "matrix.h"
+#include "uart.h"
- matrix_init_quantum();
- serial_init();
+void matrix_init_custom(void) {
+ uart_init(1000000);
}
-uint8_t matrix_scan(void)
-{
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
uint32_t timeout = 0;
+ bool changed = false;
//the s character requests the RF slave to send the matrix
- SERIAL_UART_DATA = 's';
+ uart_write('s');
//trust the external keystates entirely, erase the last data
uint8_t uart_data[11] = {0};
@@ -105,58 +37,27 @@ uint8_t matrix_scan(void)
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
- while(!SERIAL_UART_RXD_PRESENT){
+ while (!uart_available()) {
timeout++;
- if (timeout > 10000){
+ if (timeout > 10000) {
break;
}
}
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
//check for the end packet, the key state bytes use the LSBs, so 0xE0
//will only show up here if the correct bytes were recieved
- if (uart_data[10] == 0xE0)
- {
+ if (uart_data[10] == 0xE0) {
//shifting and transferring the keystates to the QMK matrix variable
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 7;
+ matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 7;
+ if (current_matrix[i] != current_row) {
+ changed = true;
+ }
+ current_matrix[i] = current_row;
}
}
-
- matrix_scan_quantum();
- return 1;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & ((matrix_row_t)1<<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print_matrix_header();
-
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row); print(": ");
- print_matrix_row(row);
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += matrix_bitpop(i);
- }
- return count;
+ return changed;
}
diff --git a/keyboards/redox_w/rules.mk b/keyboards/redox_w/rules.mk
index a8bd3a027a..8cb1736147 100644
--- a/keyboards/redox_w/rules.mk
+++ b/keyboards/redox_w/rules.mk
@@ -8,13 +8,16 @@ BOOTLOADER = caterina
# change yes to no to disable
#
BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-CUSTOM_MATRIX = yes # Remote matrix from the wireless bridge
+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
NKRO_ENABLE = yes # Enable N-Key Rollover
-# BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+CUSTOM_MATRIX = lite
-# # project specific files
-SRC += matrix.c serial_uart.c
+# project specific files
+SRC += matrix.c
+QUANTUM_LIB_SRC += uart.c
diff --git a/keyboards/redscarf_iiplus/verb/matrix.c b/keyboards/redscarf_iiplus/verb/matrix.c
index 42cfb7c037..88ecb586b3 100755
--- a/keyboards/redscarf_iiplus/verb/matrix.c
+++ b/keyboards/redscarf_iiplus/verb/matrix.c
@@ -94,13 +94,6 @@ uint8_t matrix_cols(void) {
return MATRIX_COLS;
}
-//Deprecated.
-bool matrix_is_modified(void)
-{
- if (debounce_active()) return false;
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/redscarf_iiplus/verc/matrix.c b/keyboards/redscarf_iiplus/verc/matrix.c
index 42cfb7c037..88ecb586b3 100755
--- a/keyboards/redscarf_iiplus/verc/matrix.c
+++ b/keyboards/redscarf_iiplus/verc/matrix.c
@@ -94,13 +94,6 @@ uint8_t matrix_cols(void) {
return MATRIX_COLS;
}
-//Deprecated.
-bool matrix_is_modified(void)
-{
- if (debounce_active()) return false;
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/redscarf_iiplus/verd/matrix.c b/keyboards/redscarf_iiplus/verd/matrix.c
index 78d1191b68..d9dbb3c0a3 100644
--- a/keyboards/redscarf_iiplus/verd/matrix.c
+++ b/keyboards/redscarf_iiplus/verd/matrix.c
@@ -94,13 +94,6 @@ uint8_t matrix_cols(void) {
return MATRIX_COLS;
}
-//Deprecated.
-bool matrix_is_modified(void)
-{
- if (debounce_active()) return false;
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/reviung33/config.h b/keyboards/reviung/reviung33/config.h
index b65d1d7c39..b65d1d7c39 100644
--- a/keyboards/reviung33/config.h
+++ b/keyboards/reviung/reviung33/config.h
diff --git a/keyboards/reviung33/info.json b/keyboards/reviung/reviung33/info.json
index 450a41930b..450a41930b 100644
--- a/keyboards/reviung33/info.json
+++ b/keyboards/reviung/reviung33/info.json
diff --git a/keyboards/reviung33/keymaps/default/keymap.c b/keyboards/reviung/reviung33/keymaps/default/keymap.c
index 875df97601..875df97601 100644
--- a/keyboards/reviung33/keymaps/default/keymap.c
+++ b/keyboards/reviung/reviung33/keymaps/default/keymap.c
diff --git a/keyboards/reviung33/keymaps/default/readme.md b/keyboards/reviung/reviung33/keymaps/default/readme.md
index 9121b14294..9121b14294 100644
--- a/keyboards/reviung33/keymaps/default/readme.md
+++ b/keyboards/reviung/reviung33/keymaps/default/readme.md
diff --git a/keyboards/reviung33/keymaps/default_jp/keymap.c b/keyboards/reviung/reviung33/keymaps/default_jp/keymap.c
index 1265a301ed..1265a301ed 100644
--- a/keyboards/reviung33/keymaps/default_jp/keymap.c
+++ b/keyboards/reviung/reviung33/keymaps/default_jp/keymap.c
diff --git a/keyboards/reviung33/keymaps/default_jp/readme.md b/keyboards/reviung/reviung33/keymaps/default_jp/readme.md
index d7739a3d86..d7739a3d86 100644
--- a/keyboards/reviung33/keymaps/default_jp/readme.md
+++ b/keyboards/reviung/reviung33/keymaps/default_jp/readme.md
diff --git a/keyboards/reviung33/readme.md b/keyboards/reviung/reviung33/readme.md
index 64ed4d57fe..64ed4d57fe 100644
--- a/keyboards/reviung33/readme.md
+++ b/keyboards/reviung/reviung33/readme.md
diff --git a/keyboards/reviung33/reviung33.c b/keyboards/reviung/reviung33/reviung33.c
index 7684cb72c8..7684cb72c8 100644
--- a/keyboards/reviung33/reviung33.c
+++ b/keyboards/reviung/reviung33/reviung33.c
diff --git a/keyboards/reviung33/reviung33.h b/keyboards/reviung/reviung33/reviung33.h
index ea72a4aadb..ea72a4aadb 100644
--- a/keyboards/reviung33/reviung33.h
+++ b/keyboards/reviung/reviung33/reviung33.h
diff --git a/keyboards/reviung33/rules.mk b/keyboards/reviung/reviung33/rules.mk
index 77a2d1ee7d..77a2d1ee7d 100644
--- a/keyboards/reviung33/rules.mk
+++ b/keyboards/reviung/reviung33/rules.mk
diff --git a/keyboards/reviung34/config.h b/keyboards/reviung/reviung34/config.h
index 0847678e86..0847678e86 100755
--- a/keyboards/reviung34/config.h
+++ b/keyboards/reviung/reviung34/config.h
diff --git a/keyboards/reviung34/info.json b/keyboards/reviung/reviung34/info.json
index ecd89d4742..ecd89d4742 100755
--- a/keyboards/reviung34/info.json
+++ b/keyboards/reviung/reviung34/info.json
diff --git a/keyboards/reviung34/keymaps/default/keymap.c b/keyboards/reviung/reviung34/keymaps/default/keymap.c
index 66939d2469..66939d2469 100755
--- a/keyboards/reviung34/keymaps/default/keymap.c
+++ b/keyboards/reviung/reviung34/keymaps/default/keymap.c
diff --git a/keyboards/reviung34/keymaps/default/readme.md b/keyboards/reviung/reviung34/keymaps/default/readme.md
index 2e4619fae8..2e4619fae8 100755
--- a/keyboards/reviung34/keymaps/default/readme.md
+++ b/keyboards/reviung/reviung34/keymaps/default/readme.md
diff --git a/keyboards/reviung34/keymaps/default_2uL/keymap.c b/keyboards/reviung/reviung34/keymaps/default_2uL/keymap.c
index 767c0ff4c6..767c0ff4c6 100755
--- a/keyboards/reviung34/keymaps/default_2uL/keymap.c
+++ b/keyboards/reviung/reviung34/keymaps/default_2uL/keymap.c
diff --git a/keyboards/reviung34/keymaps/default_2uL/readme.md b/keyboards/reviung/reviung34/keymaps/default_2uL/readme.md
index 2e4619fae8..2e4619fae8 100755
--- a/keyboards/reviung34/keymaps/default_2uL/readme.md
+++ b/keyboards/reviung/reviung34/keymaps/default_2uL/readme.md
diff --git a/keyboards/reviung34/keymaps/default_jp/keymap.c b/keyboards/reviung/reviung34/keymaps/default_jp/keymap.c
index c37d87662c..c37d87662c 100755
--- a/keyboards/reviung34/keymaps/default_jp/keymap.c
+++ b/keyboards/reviung/reviung34/keymaps/default_jp/keymap.c
diff --git a/keyboards/reviung34/keymaps/default_jp/readme.md b/keyboards/reviung/reviung34/keymaps/default_jp/readme.md
index 2e4619fae8..2e4619fae8 100755
--- a/keyboards/reviung34/keymaps/default_jp/readme.md
+++ b/keyboards/reviung/reviung34/keymaps/default_jp/readme.md
diff --git a/keyboards/reviung34/keymaps/default_rgb/config.h b/keyboards/reviung/reviung34/keymaps/default_rgb/config.h
index b68201231f..b68201231f 100644
--- a/keyboards/reviung34/keymaps/default_rgb/config.h
+++ b/keyboards/reviung/reviung34/keymaps/default_rgb/config.h
diff --git a/keyboards/reviung34/keymaps/default_rgb/keymap.c b/keyboards/reviung/reviung34/keymaps/default_rgb/keymap.c
index e2d852354b..e2d852354b 100755
--- a/keyboards/reviung34/keymaps/default_rgb/keymap.c
+++ b/keyboards/reviung/reviung34/keymaps/default_rgb/keymap.c
diff --git a/keyboards/reviung34/keymaps/default_rgb/readme.md b/keyboards/reviung/reviung34/keymaps/default_rgb/readme.md
index 81b04868cb..81b04868cb 100755
--- a/keyboards/reviung34/keymaps/default_rgb/readme.md
+++ b/keyboards/reviung/reviung34/keymaps/default_rgb/readme.md
diff --git a/keyboards/reviung39/keymaps/default_s/rules.mk b/keyboards/reviung/reviung34/keymaps/default_rgb/rules.mk
index 1e3cebb145..1e3cebb145 100644
--- a/keyboards/reviung39/keymaps/default_s/rules.mk
+++ b/keyboards/reviung/reviung34/keymaps/default_rgb/rules.mk
diff --git a/keyboards/reviung34/keymaps/default_rgb2u/config.h b/keyboards/reviung/reviung34/keymaps/default_rgb2u/config.h
index b68201231f..b68201231f 100644
--- a/keyboards/reviung34/keymaps/default_rgb2u/config.h
+++ b/keyboards/reviung/reviung34/keymaps/default_rgb2u/config.h
diff --git a/keyboards/reviung34/keymaps/default_rgb2u/keymap.c b/keyboards/reviung/reviung34/keymaps/default_rgb2u/keymap.c
index f4f1d3be50..f4f1d3be50 100755
--- a/keyboards/reviung34/keymaps/default_rgb2u/keymap.c
+++ b/keyboards/reviung/reviung34/keymaps/default_rgb2u/keymap.c
diff --git a/keyboards/reviung34/keymaps/default_rgb2u/readme.md b/keyboards/reviung/reviung34/keymaps/default_rgb2u/readme.md
index 8acc99250f..8acc99250f 100755
--- a/keyboards/reviung34/keymaps/default_rgb2u/readme.md
+++ b/keyboards/reviung/reviung34/keymaps/default_rgb2u/readme.md
diff --git a/keyboards/suihankey/alpha/rules.mk b/keyboards/reviung/reviung34/keymaps/default_rgb2u/rules.mk
index 1e3cebb145..1e3cebb145 100644
--- a/keyboards/suihankey/alpha/rules.mk
+++ b/keyboards/reviung/reviung34/keymaps/default_rgb2u/rules.mk
diff --git a/keyboards/reviung34/readme.md b/keyboards/reviung/reviung34/readme.md
index 48b054cf94..48b054cf94 100755
--- a/keyboards/reviung34/readme.md
+++ b/keyboards/reviung/reviung34/readme.md
diff --git a/keyboards/reviung34/reviung34.c b/keyboards/reviung/reviung34/reviung34.c
index 00862d73e9..00862d73e9 100755
--- a/keyboards/reviung34/reviung34.c
+++ b/keyboards/reviung/reviung34/reviung34.c
diff --git a/keyboards/reviung34/reviung34.h b/keyboards/reviung/reviung34/reviung34.h
index 8385e5c8c2..8385e5c8c2 100755
--- a/keyboards/reviung34/reviung34.h
+++ b/keyboards/reviung/reviung34/reviung34.h
diff --git a/keyboards/reviung34/rules.mk b/keyboards/reviung/reviung34/rules.mk
index 203f9645e5..203f9645e5 100755
--- a/keyboards/reviung34/rules.mk
+++ b/keyboards/reviung/reviung34/rules.mk
diff --git a/keyboards/reviung39/config.h b/keyboards/reviung/reviung39/config.h
index 098497bc9f..098497bc9f 100644
--- a/keyboards/reviung39/config.h
+++ b/keyboards/reviung/reviung39/config.h
diff --git a/keyboards/reviung39/info.json b/keyboards/reviung/reviung39/info.json
index 725e2ff8e1..725e2ff8e1 100644
--- a/keyboards/reviung39/info.json
+++ b/keyboards/reviung/reviung39/info.json
diff --git a/keyboards/reviung39/keymaps/default/config.h b/keyboards/reviung/reviung39/keymaps/default/config.h
index 70c641fca0..70c641fca0 100644
--- a/keyboards/reviung39/keymaps/default/config.h
+++ b/keyboards/reviung/reviung39/keymaps/default/config.h
diff --git a/keyboards/reviung39/keymaps/default/keymap.c b/keyboards/reviung/reviung39/keymaps/default/keymap.c
index 7030be13fa..7030be13fa 100644
--- a/keyboards/reviung39/keymaps/default/keymap.c
+++ b/keyboards/reviung/reviung39/keymaps/default/keymap.c
diff --git a/keyboards/reviung39/keymaps/default/readme.md b/keyboards/reviung/reviung39/keymaps/default/readme.md
index 0c8f52d105..0c8f52d105 100644
--- a/keyboards/reviung39/keymaps/default/readme.md
+++ b/keyboards/reviung/reviung39/keymaps/default/readme.md
diff --git a/keyboards/suihankey/rev1/rules.mk b/keyboards/reviung/reviung39/keymaps/default/rules.mk
index 1e3cebb145..1e3cebb145 100644
--- a/keyboards/suihankey/rev1/rules.mk
+++ b/keyboards/reviung/reviung39/keymaps/default/rules.mk
diff --git a/keyboards/reviung39/keymaps/default_s/config.h b/keyboards/reviung/reviung39/keymaps/default_s/config.h
index 48be04a5b1..48be04a5b1 100644
--- a/keyboards/reviung39/keymaps/default_s/config.h
+++ b/keyboards/reviung/reviung39/keymaps/default_s/config.h
diff --git a/keyboards/reviung39/keymaps/default_s/keymap.c b/keyboards/reviung/reviung39/keymaps/default_s/keymap.c
index 42e2694315..42e2694315 100644
--- a/keyboards/reviung39/keymaps/default_s/keymap.c
+++ b/keyboards/reviung/reviung39/keymaps/default_s/keymap.c
diff --git a/keyboards/reviung39/keymaps/default_s/readme.md b/keyboards/reviung/reviung39/keymaps/default_s/readme.md
index b882ec40c2..b882ec40c2 100644
--- a/keyboards/reviung39/keymaps/default_s/readme.md
+++ b/keyboards/reviung/reviung39/keymaps/default_s/readme.md
diff --git a/keyboards/suihankey/split/alpha/rules.mk b/keyboards/reviung/reviung39/keymaps/default_s/rules.mk
index 1e3cebb145..1e3cebb145 100644
--- a/keyboards/suihankey/split/alpha/rules.mk
+++ b/keyboards/reviung/reviung39/keymaps/default_s/rules.mk
diff --git a/keyboards/reviung39/keymaps/toshi0383/config.h b/keyboards/reviung/reviung39/keymaps/toshi0383/config.h
index cd201ebfbb..cd201ebfbb 100644
--- a/keyboards/reviung39/keymaps/toshi0383/config.h
+++ b/keyboards/reviung/reviung39/keymaps/toshi0383/config.h
diff --git a/keyboards/reviung39/keymaps/toshi0383/keymap.c b/keyboards/reviung/reviung39/keymaps/toshi0383/keymap.c
index f2586086c2..f2586086c2 100644
--- a/keyboards/reviung39/keymaps/toshi0383/keymap.c
+++ b/keyboards/reviung/reviung39/keymaps/toshi0383/keymap.c
diff --git a/keyboards/reviung39/keymaps/toshi0383/readme.md b/keyboards/reviung/reviung39/keymaps/toshi0383/readme.md
index 5a09f2559a..5a09f2559a 100644
--- a/keyboards/reviung39/keymaps/toshi0383/readme.md
+++ b/keyboards/reviung/reviung39/keymaps/toshi0383/readme.md
diff --git a/keyboards/reviung39/keymaps/toshi0383/rules.mk b/keyboards/reviung/reviung39/keymaps/toshi0383/rules.mk
index 7ad666d1a3..7ad666d1a3 100644
--- a/keyboards/reviung39/keymaps/toshi0383/rules.mk
+++ b/keyboards/reviung/reviung39/keymaps/toshi0383/rules.mk
diff --git a/keyboards/reviung39/keymaps/via/keymap.c b/keyboards/reviung/reviung39/keymaps/via/keymap.c
index 0a4a664dc2..0a4a664dc2 100644
--- a/keyboards/reviung39/keymaps/via/keymap.c
+++ b/keyboards/reviung/reviung39/keymaps/via/keymap.c
diff --git a/keyboards/reviung39/keymaps/via/rules.mk b/keyboards/reviung/reviung39/keymaps/via/rules.mk
index 5d85ccd103..5d85ccd103 100644
--- a/keyboards/reviung39/keymaps/via/rules.mk
+++ b/keyboards/reviung/reviung39/keymaps/via/rules.mk
diff --git a/keyboards/reviung39/readme.md b/keyboards/reviung/reviung39/readme.md
index e0bf642828..e0bf642828 100644
--- a/keyboards/reviung39/readme.md
+++ b/keyboards/reviung/reviung39/readme.md
diff --git a/keyboards/reviung39/reviung39.c b/keyboards/reviung/reviung39/reviung39.c
index 0948106e9d..0948106e9d 100644
--- a/keyboards/reviung39/reviung39.c
+++ b/keyboards/reviung/reviung39/reviung39.c
diff --git a/keyboards/reviung39/reviung39.h b/keyboards/reviung/reviung39/reviung39.h
index 89776c5aa2..89776c5aa2 100644
--- a/keyboards/reviung39/reviung39.h
+++ b/keyboards/reviung/reviung39/reviung39.h
diff --git a/keyboards/reviung39/rules.mk b/keyboards/reviung/reviung39/rules.mk
index 203f9645e5..203f9645e5 100644
--- a/keyboards/reviung39/rules.mk
+++ b/keyboards/reviung/reviung39/rules.mk
diff --git a/keyboards/reviung41/config.h b/keyboards/reviung/reviung41/config.h
index 967ca791d5..967ca791d5 100644
--- a/keyboards/reviung41/config.h
+++ b/keyboards/reviung/reviung41/config.h
diff --git a/keyboards/reviung41/info.json b/keyboards/reviung/reviung41/info.json
index ff9e11b939..ff9e11b939 100644
--- a/keyboards/reviung41/info.json
+++ b/keyboards/reviung/reviung41/info.json
diff --git a/keyboards/reviung41/keymaps/ciutadellla/config.h b/keyboards/reviung/reviung41/keymaps/ciutadellla/config.h
index 920c317e4b..920c317e4b 100644
--- a/keyboards/reviung41/keymaps/ciutadellla/config.h
+++ b/keyboards/reviung/reviung41/keymaps/ciutadellla/config.h
diff --git a/keyboards/reviung41/keymaps/ciutadellla/keymap.c b/keyboards/reviung/reviung41/keymaps/ciutadellla/keymap.c
index a35b677197..a35b677197 100644
--- a/keyboards/reviung41/keymaps/ciutadellla/keymap.c
+++ b/keyboards/reviung/reviung41/keymaps/ciutadellla/keymap.c
diff --git a/keyboards/reviung41/keymaps/ciutadellla/rules.mk b/keyboards/reviung/reviung41/keymaps/ciutadellla/rules.mk
index eeafc12006..eeafc12006 100644
--- a/keyboards/reviung41/keymaps/ciutadellla/rules.mk
+++ b/keyboards/reviung/reviung41/keymaps/ciutadellla/rules.mk
diff --git a/keyboards/reviung41/keymaps/default/keymap.c b/keyboards/reviung/reviung41/keymaps/default/keymap.c
index 4231e4896b..4231e4896b 100644
--- a/keyboards/reviung41/keymaps/default/keymap.c
+++ b/keyboards/reviung/reviung41/keymaps/default/keymap.c
diff --git a/keyboards/reviung41/keymaps/default/readme.md b/keyboards/reviung/reviung41/keymaps/default/readme.md
index 7e8120413e..7e8120413e 100644
--- a/keyboards/reviung41/keymaps/default/readme.md
+++ b/keyboards/reviung/reviung41/keymaps/default/readme.md
diff --git a/keyboards/reviung41/keymaps/via/keymap.c b/keyboards/reviung/reviung41/keymaps/via/keymap.c
index 1f0bce741f..1f0bce741f 100644
--- a/keyboards/reviung41/keymaps/via/keymap.c
+++ b/keyboards/reviung/reviung41/keymaps/via/keymap.c
diff --git a/keyboards/reviung41/keymaps/via/rules.mk b/keyboards/reviung/reviung41/keymaps/via/rules.mk
index 5ed1ee4706..5ed1ee4706 100644
--- a/keyboards/reviung41/keymaps/via/rules.mk
+++ b/keyboards/reviung/reviung41/keymaps/via/rules.mk
diff --git a/keyboards/reviung41/readme.md b/keyboards/reviung/reviung41/readme.md
index c8f5146385..c8f5146385 100644
--- a/keyboards/reviung41/readme.md
+++ b/keyboards/reviung/reviung41/readme.md
diff --git a/keyboards/reviung41/reviung41.c b/keyboards/reviung/reviung41/reviung41.c
index 05bb42160a..05bb42160a 100644
--- a/keyboards/reviung41/reviung41.c
+++ b/keyboards/reviung/reviung41/reviung41.c
diff --git a/keyboards/reviung41/reviung41.h b/keyboards/reviung/reviung41/reviung41.h
index 6bc80e8b21..6bc80e8b21 100644
--- a/keyboards/reviung41/reviung41.h
+++ b/keyboards/reviung/reviung41/reviung41.h
diff --git a/keyboards/reviung41/rules.mk b/keyboards/reviung/reviung41/rules.mk
index e4e00e6274..e4e00e6274 100644
--- a/keyboards/reviung41/rules.mk
+++ b/keyboards/reviung/reviung41/rules.mk
diff --git a/keyboards/reviung5/config.h b/keyboards/reviung/reviung5/config.h
index b06c5797fd..b06c5797fd 100644
--- a/keyboards/reviung5/config.h
+++ b/keyboards/reviung/reviung5/config.h
diff --git a/keyboards/reviung5/info.json b/keyboards/reviung/reviung5/info.json
index 78d27d64e2..78d27d64e2 100644
--- a/keyboards/reviung5/info.json
+++ b/keyboards/reviung/reviung5/info.json
diff --git a/keyboards/reviung5/keymaps/default/keymap.c b/keyboards/reviung/reviung5/keymaps/default/keymap.c
index 39f6669a52..39f6669a52 100644
--- a/keyboards/reviung5/keymaps/default/keymap.c
+++ b/keyboards/reviung/reviung5/keymaps/default/keymap.c
diff --git a/keyboards/reviung5/keymaps/default/readme.md b/keyboards/reviung/reviung5/keymaps/default/readme.md
index babdce579f..babdce579f 100644
--- a/keyboards/reviung5/keymaps/default/readme.md
+++ b/keyboards/reviung/reviung5/keymaps/default/readme.md
diff --git a/keyboards/reviung5/keymaps/default_lre/keymap.c b/keyboards/reviung/reviung5/keymaps/default_lre/keymap.c
index 2e732e72fe..2e732e72fe 100644
--- a/keyboards/reviung5/keymaps/default_lre/keymap.c
+++ b/keyboards/reviung/reviung5/keymaps/default_lre/keymap.c
diff --git a/keyboards/reviung5/keymaps/default_lre/readme.md b/keyboards/reviung/reviung5/keymaps/default_lre/readme.md
index 0e3edee7b1..0e3edee7b1 100644
--- a/keyboards/reviung5/keymaps/default_lre/readme.md
+++ b/keyboards/reviung/reviung5/keymaps/default_lre/readme.md
diff --git a/keyboards/reviung5/keymaps/default_rre/keymap.c b/keyboards/reviung/reviung5/keymaps/default_rre/keymap.c
index 9ee41cb7e9..9ee41cb7e9 100644
--- a/keyboards/reviung5/keymaps/default_rre/keymap.c
+++ b/keyboards/reviung/reviung5/keymaps/default_rre/keymap.c
diff --git a/keyboards/reviung5/keymaps/default_rre/readme.md b/keyboards/reviung/reviung5/keymaps/default_rre/readme.md
index d16e25ce50..d16e25ce50 100644
--- a/keyboards/reviung5/keymaps/default_rre/readme.md
+++ b/keyboards/reviung/reviung5/keymaps/default_rre/readme.md
diff --git a/keyboards/reviung5/readme.md b/keyboards/reviung/reviung5/readme.md
index 990645649c..990645649c 100644
--- a/keyboards/reviung5/readme.md
+++ b/keyboards/reviung/reviung5/readme.md
diff --git a/keyboards/reviung5/reviung5.c b/keyboards/reviung/reviung5/reviung5.c
index a8f98f0627..a8f98f0627 100644
--- a/keyboards/reviung5/reviung5.c
+++ b/keyboards/reviung/reviung5/reviung5.c
diff --git a/keyboards/reviung5/reviung5.h b/keyboards/reviung/reviung5/reviung5.h
index f5d952ba94..f5d952ba94 100644
--- a/keyboards/reviung5/reviung5.h
+++ b/keyboards/reviung/reviung5/reviung5.h
diff --git a/keyboards/reviung5/rules.mk b/keyboards/reviung/reviung5/rules.mk
index a72c119315..a72c119315 100644
--- a/keyboards/reviung5/rules.mk
+++ b/keyboards/reviung/reviung5/rules.mk
diff --git a/keyboards/reviung53/config.h b/keyboards/reviung/reviung53/config.h
index d73e6eab8a..d73e6eab8a 100644
--- a/keyboards/reviung53/config.h
+++ b/keyboards/reviung/reviung53/config.h
diff --git a/keyboards/reviung53/info.json b/keyboards/reviung/reviung53/info.json
index ff63de5bc8..ff63de5bc8 100644
--- a/keyboards/reviung53/info.json
+++ b/keyboards/reviung/reviung53/info.json
diff --git a/keyboards/reviung53/keymaps/default/keymap.c b/keyboards/reviung/reviung53/keymaps/default/keymap.c
index a8d95d70d5..a8d95d70d5 100644
--- a/keyboards/reviung53/keymaps/default/keymap.c
+++ b/keyboards/reviung/reviung53/keymaps/default/keymap.c
diff --git a/keyboards/reviung53/keymaps/default/readme.md b/keyboards/reviung/reviung53/keymaps/default/readme.md
index 1e473c9a74..1e473c9a74 100644
--- a/keyboards/reviung53/keymaps/default/readme.md
+++ b/keyboards/reviung/reviung53/keymaps/default/readme.md
diff --git a/keyboards/reviung53/keymaps/via/keymap.c b/keyboards/reviung/reviung53/keymaps/via/keymap.c
index a8d95d70d5..a8d95d70d5 100644
--- a/keyboards/reviung53/keymaps/via/keymap.c
+++ b/keyboards/reviung/reviung53/keymaps/via/keymap.c
diff --git a/keyboards/reviung53/keymaps/via/readme.md b/keyboards/reviung/reviung53/keymaps/via/readme.md
index 9b299ba286..9b299ba286 100644
--- a/keyboards/reviung53/keymaps/via/readme.md
+++ b/keyboards/reviung/reviung53/keymaps/via/readme.md
diff --git a/keyboards/naiping/np64/keymaps/via/rules.mk b/keyboards/reviung/reviung53/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/naiping/np64/keymaps/via/rules.mk
+++ b/keyboards/reviung/reviung53/keymaps/via/rules.mk
diff --git a/keyboards/reviung53/readme.md b/keyboards/reviung/reviung53/readme.md
index a2bfbcdbc2..a2bfbcdbc2 100644
--- a/keyboards/reviung53/readme.md
+++ b/keyboards/reviung/reviung53/readme.md
diff --git a/keyboards/reviung53/reviung53.c b/keyboards/reviung/reviung53/reviung53.c
index e2190aeccf..e2190aeccf 100644
--- a/keyboards/reviung53/reviung53.c
+++ b/keyboards/reviung/reviung53/reviung53.c
diff --git a/keyboards/reviung53/reviung53.h b/keyboards/reviung/reviung53/reviung53.h
index 89ebc45c18..89ebc45c18 100644
--- a/keyboards/reviung53/reviung53.h
+++ b/keyboards/reviung/reviung53/reviung53.h
diff --git a/keyboards/reviung53/rules.mk b/keyboards/reviung/reviung53/rules.mk
index 90670e4b9e..90670e4b9e 100644
--- a/keyboards/reviung53/rules.mk
+++ b/keyboards/reviung/reviung53/rules.mk
diff --git a/keyboards/reviung61/config.h b/keyboards/reviung/reviung61/config.h
index 26588d8688..26588d8688 100644
--- a/keyboards/reviung61/config.h
+++ b/keyboards/reviung/reviung61/config.h
diff --git a/keyboards/reviung61/info.json b/keyboards/reviung/reviung61/info.json
index 5a23617d55..5a23617d55 100644
--- a/keyboards/reviung61/info.json
+++ b/keyboards/reviung/reviung61/info.json
diff --git a/keyboards/reviung61/keymaps/default/keymap.c b/keyboards/reviung/reviung61/keymaps/default/keymap.c
index ef24d4be27..ef24d4be27 100644
--- a/keyboards/reviung61/keymaps/default/keymap.c
+++ b/keyboards/reviung/reviung61/keymaps/default/keymap.c
diff --git a/keyboards/reviung61/keymaps/default/readme.md b/keyboards/reviung/reviung61/keymaps/default/readme.md
index 43446daa89..43446daa89 100644
--- a/keyboards/reviung61/keymaps/default/readme.md
+++ b/keyboards/reviung/reviung61/keymaps/default/readme.md
diff --git a/keyboards/reviung61/keymaps/default_rgb/config.h b/keyboards/reviung/reviung61/keymaps/default_rgb/config.h
index 619060d0bc..619060d0bc 100644
--- a/keyboards/reviung61/keymaps/default_rgb/config.h
+++ b/keyboards/reviung/reviung61/keymaps/default_rgb/config.h
diff --git a/keyboards/reviung61/keymaps/default_rgb/keymap.c b/keyboards/reviung/reviung61/keymaps/default_rgb/keymap.c
index ef24d4be27..ef24d4be27 100644
--- a/keyboards/reviung61/keymaps/default_rgb/keymap.c
+++ b/keyboards/reviung/reviung61/keymaps/default_rgb/keymap.c
diff --git a/keyboards/reviung61/keymaps/default_rgb/readme.md b/keyboards/reviung/reviung61/keymaps/default_rgb/readme.md
index 741e912705..741e912705 100644
--- a/keyboards/reviung61/keymaps/default_rgb/readme.md
+++ b/keyboards/reviung/reviung61/keymaps/default_rgb/readme.md
diff --git a/keyboards/reviung61/keymaps/default_rgb/rules.mk b/keyboards/reviung/reviung61/keymaps/default_rgb/rules.mk
index 7ad666d1a3..7ad666d1a3 100644
--- a/keyboards/reviung61/keymaps/default_rgb/rules.mk
+++ b/keyboards/reviung/reviung61/keymaps/default_rgb/rules.mk
diff --git a/keyboards/reviung61/readme.md b/keyboards/reviung/reviung61/readme.md
index d483ec5b09..d483ec5b09 100644
--- a/keyboards/reviung61/readme.md
+++ b/keyboards/reviung/reviung61/readme.md
diff --git a/keyboards/reviung61/reviung61.c b/keyboards/reviung/reviung61/reviung61.c
index 3cd69bf27f..3cd69bf27f 100644
--- a/keyboards/reviung61/reviung61.c
+++ b/keyboards/reviung/reviung61/reviung61.c
diff --git a/keyboards/reviung61/reviung61.h b/keyboards/reviung/reviung61/reviung61.h
index bae0cd2155..bae0cd2155 100644
--- a/keyboards/reviung61/reviung61.h
+++ b/keyboards/reviung/reviung61/reviung61.h
diff --git a/keyboards/reviung61/rules.mk b/keyboards/reviung/reviung61/rules.mk
index badcdb845b..badcdb845b 100644
--- a/keyboards/reviung61/rules.mk
+++ b/keyboards/reviung/reviung61/rules.mk
diff --git a/keyboards/rgbkb/mun/rules.mk b/keyboards/rgbkb/mun/rules.mk
index c7e6594ead..d2ad9cdcc2 100644
--- a/keyboards/rgbkb/mun/rules.mk
+++ b/keyboards/rgbkb/mun/rules.mk
@@ -1,6 +1,9 @@
# MCU name
MCU = STM32F303
+# Bootloader selection
+BOOTLOADER = stm32-dfu
+
# Touch encoder needs
SRC += ../common/touch_encoder.c
SRC += ../common/common_oled.c
diff --git a/keyboards/rocketboard_16/rules.mk b/keyboards/rocketboard_16/rules.mk
index d27da2c226..c07ebff427 100644
--- a/keyboards/rocketboard_16/rules.mk
+++ b/keyboards/rocketboard_16/rules.mk
@@ -8,7 +8,7 @@ MCU = STM32F103
MCU_LDSCRIPT = STM32F103xB_stm32duino_bootloader
OPT_DEFS += -DBOOTLOADER_STM32DUINO
BOARD = STM32_F103_STM32DUINO
-STM32_BOOTLOADER_ADDRESS = 0x80000000
+BOOTLOADER_TYPE = stm32duino
DFU_ARGS = -d 1EAF:0003 -a 2 -R
DFU_SUFFIX_ARGS = -v 1EAF -p 0003
diff --git a/keyboards/suihankey/split/.noci b/keyboards/salicylic_acid3/7skb/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/suihankey/split/.noci
+++ b/keyboards/salicylic_acid3/7skb/.noci
diff --git a/keyboards/7skb/7skb.c b/keyboards/salicylic_acid3/7skb/7skb.c
index 3044e02233..3044e02233 100644
--- a/keyboards/7skb/7skb.c
+++ b/keyboards/salicylic_acid3/7skb/7skb.c
diff --git a/keyboards/salicylic_acid3/7skb/7skb.h b/keyboards/salicylic_acid3/7skb/7skb.h
new file mode 100644
index 0000000000..5043a46747
--- /dev/null
+++ b/keyboards/salicylic_acid3/7skb/7skb.h
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "quantum.h"
+
+#ifdef KEYBOARD_salicylic_acid3_7skb_rev1
+ #include "rev1.h"
+#endif
diff --git a/keyboards/getta25/config.h b/keyboards/salicylic_acid3/7skb/config.h
index cfb6bf4ffc..cfb6bf4ffc 100644
--- a/keyboards/getta25/config.h
+++ b/keyboards/salicylic_acid3/7skb/config.h
diff --git a/keyboards/7skb/info.json b/keyboards/salicylic_acid3/7skb/info.json
index f85f32cb6d..f85f32cb6d 100644
--- a/keyboards/7skb/info.json
+++ b/keyboards/salicylic_acid3/7skb/info.json
diff --git a/keyboards/7skb/keymaps/default/config.h b/keyboards/salicylic_acid3/7skb/keymaps/default/config.h
index 4b3496d856..4b3496d856 100644
--- a/keyboards/7skb/keymaps/default/config.h
+++ b/keyboards/salicylic_acid3/7skb/keymaps/default/config.h
diff --git a/keyboards/7skb/keymaps/default/keymap.c b/keyboards/salicylic_acid3/7skb/keymaps/default/keymap.c
index c56fb76fcb..c56fb76fcb 100644
--- a/keyboards/7skb/keymaps/default/keymap.c
+++ b/keyboards/salicylic_acid3/7skb/keymaps/default/keymap.c
diff --git a/keyboards/7skb/keymaps/salicylic/config.h b/keyboards/salicylic_acid3/7skb/keymaps/salicylic/config.h
index cc4a3d4426..cc4a3d4426 100644
--- a/keyboards/7skb/keymaps/salicylic/config.h
+++ b/keyboards/salicylic_acid3/7skb/keymaps/salicylic/config.h
diff --git a/keyboards/7skb/keymaps/salicylic/keymap.c b/keyboards/salicylic_acid3/7skb/keymaps/salicylic/keymap.c
index ad12f49d5b..ad12f49d5b 100644
--- a/keyboards/7skb/keymaps/salicylic/keymap.c
+++ b/keyboards/salicylic_acid3/7skb/keymaps/salicylic/keymap.c
diff --git a/keyboards/7skb/keymaps/salicylic/rules.mk b/keyboards/salicylic_acid3/7skb/keymaps/salicylic/rules.mk
index e5ddcae8d9..e5ddcae8d9 100644
--- a/keyboards/7skb/keymaps/salicylic/rules.mk
+++ b/keyboards/salicylic_acid3/7skb/keymaps/salicylic/rules.mk
diff --git a/keyboards/7skb/keymaps/via/keymap.c b/keyboards/salicylic_acid3/7skb/keymaps/via/keymap.c
index 7b0b76c76a..7b0b76c76a 100644
--- a/keyboards/7skb/keymaps/via/keymap.c
+++ b/keyboards/salicylic_acid3/7skb/keymaps/via/keymap.c
diff --git a/keyboards/7skb/keymaps/via/readme.md b/keyboards/salicylic_acid3/7skb/keymaps/via/readme.md
index 67c31de5c0..67c31de5c0 100644
--- a/keyboards/7skb/keymaps/via/readme.md
+++ b/keyboards/salicylic_acid3/7skb/keymaps/via/readme.md
diff --git a/keyboards/ergoarrows/keymaps/via/rules.mk b/keyboards/salicylic_acid3/7skb/keymaps/via/rules.mk
index 036bd6d1c3..036bd6d1c3 100644
--- a/keyboards/ergoarrows/keymaps/via/rules.mk
+++ b/keyboards/salicylic_acid3/7skb/keymaps/via/rules.mk
diff --git a/keyboards/salicylic_acid3/7skb/readme.md b/keyboards/salicylic_acid3/7skb/readme.md
new file mode 100644
index 0000000000..a3077f068a
--- /dev/null
+++ b/keyboards/salicylic_acid3/7skb/readme.md
@@ -0,0 +1,17 @@
+# 7skb
+
+![7skb](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20191124/20191124025208.png)
+
+This is 63 keys Custom keyboard.
+
+* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+* Hardware Supported: 7skb PCB, Pro Micro
+* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1673395)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make salicylic_acid3/7skb/rev1:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/7skb-mx-build-guide)
diff --git a/keyboards/7skb/rev1/config.h b/keyboards/salicylic_acid3/7skb/rev1/config.h
index a74cd25c29..a74cd25c29 100644
--- a/keyboards/7skb/rev1/config.h
+++ b/keyboards/salicylic_acid3/7skb/rev1/config.h
diff --git a/keyboards/claw44/rev1/rev1.c b/keyboards/salicylic_acid3/7skb/rev1/rev1.c
index 520a869e57..520a869e57 100644
--- a/keyboards/claw44/rev1/rev1.c
+++ b/keyboards/salicylic_acid3/7skb/rev1/rev1.c
diff --git a/keyboards/7skb/rev1/rev1.h b/keyboards/salicylic_acid3/7skb/rev1/rev1.h
index 8ab845240d..8ab845240d 100644
--- a/keyboards/7skb/rev1/rev1.h
+++ b/keyboards/salicylic_acid3/7skb/rev1/rev1.h
diff --git a/keyboards/naked48/rev1/rules.mk b/keyboards/salicylic_acid3/7skb/rev1/rules.mk
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/naked48/rev1/rules.mk
+++ b/keyboards/salicylic_acid3/7skb/rev1/rules.mk
diff --git a/keyboards/salicylic_acid3/7skb/rules.mk b/keyboards/salicylic_acid3/7skb/rules.mk
new file mode 100644
index 0000000000..3ae2e899ca
--- /dev/null
+++ b/keyboards/salicylic_acid3/7skb/rules.mk
@@ -0,0 +1,22 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = no # Audio output
+RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
+
+SPLIT_KEYBOARD = yes
+
+DEFAULT_FOLDER = salicylic_acid3/7skb/rev1
diff --git a/keyboards/7splus/7splus.c b/keyboards/salicylic_acid3/7splus/7splus.c
index ca94ab0efa..ca94ab0efa 100644
--- a/keyboards/7splus/7splus.c
+++ b/keyboards/salicylic_acid3/7splus/7splus.c
diff --git a/keyboards/7splus/7splus.h b/keyboards/salicylic_acid3/7splus/7splus.h
index 55b9c24f9c..55b9c24f9c 100644
--- a/keyboards/7splus/7splus.h
+++ b/keyboards/salicylic_acid3/7splus/7splus.h
diff --git a/keyboards/7splus/config.h b/keyboards/salicylic_acid3/7splus/config.h
index 8f3e32a52f..8f3e32a52f 100644
--- a/keyboards/7splus/config.h
+++ b/keyboards/salicylic_acid3/7splus/config.h
diff --git a/keyboards/7splus/info.json b/keyboards/salicylic_acid3/7splus/info.json
index a87909c07b..a87909c07b 100644
--- a/keyboards/7splus/info.json
+++ b/keyboards/salicylic_acid3/7splus/info.json
diff --git a/keyboards/7splus/keymaps/default/keymap.c b/keyboards/salicylic_acid3/7splus/keymaps/default/keymap.c
index 282bfaf661..282bfaf661 100644
--- a/keyboards/7splus/keymaps/default/keymap.c
+++ b/keyboards/salicylic_acid3/7splus/keymaps/default/keymap.c
diff --git a/keyboards/7splus/keymaps/salicylic/config.h b/keyboards/salicylic_acid3/7splus/keymaps/salicylic/config.h
index 81ee8ef785..81ee8ef785 100644
--- a/keyboards/7splus/keymaps/salicylic/config.h
+++ b/keyboards/salicylic_acid3/7splus/keymaps/salicylic/config.h
diff --git a/keyboards/7splus/keymaps/salicylic/keymap.c b/keyboards/salicylic_acid3/7splus/keymaps/salicylic/keymap.c
index cbe4e57dcf..cbe4e57dcf 100644
--- a/keyboards/7splus/keymaps/salicylic/keymap.c
+++ b/keyboards/salicylic_acid3/7splus/keymaps/salicylic/keymap.c
diff --git a/keyboards/7splus/keymaps/salicylic/rules.mk b/keyboards/salicylic_acid3/7splus/keymaps/salicylic/rules.mk
index 0bcbf86d5e..0bcbf86d5e 100644
--- a/keyboards/7splus/keymaps/salicylic/rules.mk
+++ b/keyboards/salicylic_acid3/7splus/keymaps/salicylic/rules.mk
diff --git a/keyboards/7splus/keymaps/via/config.h b/keyboards/salicylic_acid3/7splus/keymaps/via/config.h
index 8a89da2eae..8a89da2eae 100644
--- a/keyboards/7splus/keymaps/via/config.h
+++ b/keyboards/salicylic_acid3/7splus/keymaps/via/config.h
diff --git a/keyboards/7splus/keymaps/via/keymap.c b/keyboards/salicylic_acid3/7splus/keymaps/via/keymap.c
index c17e1ce450..c17e1ce450 100644
--- a/keyboards/7splus/keymaps/via/keymap.c
+++ b/keyboards/salicylic_acid3/7splus/keymaps/via/keymap.c
diff --git a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/rules.mk b/keyboards/salicylic_acid3/7splus/keymaps/via/rules.mk
index 036bd6d1c3..036bd6d1c3 100644
--- a/keyboards/kprepublic/bm65hsrgb_iso/keymaps/via/rules.mk
+++ b/keyboards/salicylic_acid3/7splus/keymaps/via/rules.mk
diff --git a/keyboards/salicylic_acid3/7splus/readme.md b/keyboards/salicylic_acid3/7splus/readme.md
new file mode 100644
index 0000000000..ef6820a188
--- /dev/null
+++ b/keyboards/salicylic_acid3/7splus/readme.md
@@ -0,0 +1,17 @@
+# 7sPlus
+
+![7splus](https://s2.booth.pm/1d33594d-0c5f-4f93-baf5-2e89e0d99afc/i/2425503/044ca31d-6715-475c-b8c4-1dfdeb57b682_base_resized.jpg)
+
+This is 85 keys Custom keyboard.
+
+* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+* Hardware Supported: 7sPlus PCB, Pro Micro
+* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/2425503)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make salicylic_acid3/7splus:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/7splus-build-guide)
diff --git a/keyboards/7splus/rules.mk b/keyboards/salicylic_acid3/7splus/rules.mk
index b0a2799e4b..b0a2799e4b 100644
--- a/keyboards/7splus/rules.mk
+++ b/keyboards/salicylic_acid3/7splus/rules.mk
diff --git a/keyboards/ajisai74/ajisai74.c b/keyboards/salicylic_acid3/ajisai74/ajisai74.c
index 3c9342e6f7..3c9342e6f7 100644
--- a/keyboards/ajisai74/ajisai74.c
+++ b/keyboards/salicylic_acid3/ajisai74/ajisai74.c
diff --git a/keyboards/ajisai74/ajisai74.h b/keyboards/salicylic_acid3/ajisai74/ajisai74.h
index 40c7d8b31b..40c7d8b31b 100644
--- a/keyboards/ajisai74/ajisai74.h
+++ b/keyboards/salicylic_acid3/ajisai74/ajisai74.h
diff --git a/keyboards/ajisai74/config.h b/keyboards/salicylic_acid3/ajisai74/config.h
index e7a1555aea..e7a1555aea 100644
--- a/keyboards/ajisai74/config.h
+++ b/keyboards/salicylic_acid3/ajisai74/config.h
diff --git a/keyboards/ajisai74/info.json b/keyboards/salicylic_acid3/ajisai74/info.json
index 6bf2d7af49..6bf2d7af49 100644
--- a/keyboards/ajisai74/info.json
+++ b/keyboards/salicylic_acid3/ajisai74/info.json
diff --git a/keyboards/ajisai74/keymaps/default/config.h b/keyboards/salicylic_acid3/ajisai74/keymaps/default/config.h
index 81ee8ef785..81ee8ef785 100644
--- a/keyboards/ajisai74/keymaps/default/config.h
+++ b/keyboards/salicylic_acid3/ajisai74/keymaps/default/config.h
diff --git a/keyboards/ajisai74/keymaps/default/keymap.c b/keyboards/salicylic_acid3/ajisai74/keymaps/default/keymap.c
index 4bd68878aa..4bd68878aa 100644
--- a/keyboards/ajisai74/keymaps/default/keymap.c
+++ b/keyboards/salicylic_acid3/ajisai74/keymaps/default/keymap.c
diff --git a/keyboards/ajisai74/keymaps/jis/config.h b/keyboards/salicylic_acid3/ajisai74/keymaps/jis/config.h
index 81ee8ef785..81ee8ef785 100644
--- a/keyboards/ajisai74/keymaps/jis/config.h
+++ b/keyboards/salicylic_acid3/ajisai74/keymaps/jis/config.h
diff --git a/keyboards/ajisai74/keymaps/jis/keymap.c b/keyboards/salicylic_acid3/ajisai74/keymaps/jis/keymap.c
index b0d31b03bd..b0d31b03bd 100644
--- a/keyboards/ajisai74/keymaps/jis/keymap.c
+++ b/keyboards/salicylic_acid3/ajisai74/keymaps/jis/keymap.c
diff --git a/keyboards/ajisai74/keymaps/jis/rules.mk b/keyboards/salicylic_acid3/ajisai74/keymaps/jis/rules.mk
index e5ddcae8d9..e5ddcae8d9 100644
--- a/keyboards/ajisai74/keymaps/jis/rules.mk
+++ b/keyboards/salicylic_acid3/ajisai74/keymaps/jis/rules.mk
diff --git a/keyboards/ajisai74/keymaps/salicylic/config.h b/keyboards/salicylic_acid3/ajisai74/keymaps/salicylic/config.h
index 81ee8ef785..81ee8ef785 100644
--- a/keyboards/ajisai74/keymaps/salicylic/config.h
+++ b/keyboards/salicylic_acid3/ajisai74/keymaps/salicylic/config.h
diff --git a/keyboards/ajisai74/keymaps/salicylic/keymap.c b/keyboards/salicylic_acid3/ajisai74/keymaps/salicylic/keymap.c
index f8b430af1c..f8b430af1c 100644
--- a/keyboards/ajisai74/keymaps/salicylic/keymap.c
+++ b/keyboards/salicylic_acid3/ajisai74/keymaps/salicylic/keymap.c
diff --git a/keyboards/ajisai74/keymaps/salicylic/rules.mk b/keyboards/salicylic_acid3/ajisai74/keymaps/salicylic/rules.mk
index e5ddcae8d9..e5ddcae8d9 100644
--- a/keyboards/ajisai74/keymaps/salicylic/rules.mk
+++ b/keyboards/salicylic_acid3/ajisai74/keymaps/salicylic/rules.mk
diff --git a/keyboards/ajisai74/keymaps/via/config.h b/keyboards/salicylic_acid3/ajisai74/keymaps/via/config.h
index 81ee8ef785..81ee8ef785 100644
--- a/keyboards/ajisai74/keymaps/via/config.h
+++ b/keyboards/salicylic_acid3/ajisai74/keymaps/via/config.h
diff --git a/keyboards/ajisai74/keymaps/via/keymap.c b/keyboards/salicylic_acid3/ajisai74/keymaps/via/keymap.c
index 79bd7541c5..79bd7541c5 100644
--- a/keyboards/ajisai74/keymaps/via/keymap.c
+++ b/keyboards/salicylic_acid3/ajisai74/keymaps/via/keymap.c
diff --git a/keyboards/nk1/keymaps/via/rules.mk b/keyboards/salicylic_acid3/ajisai74/keymaps/via/rules.mk
index 036bd6d1c3..036bd6d1c3 100644
--- a/keyboards/nk1/keymaps/via/rules.mk
+++ b/keyboards/salicylic_acid3/ajisai74/keymaps/via/rules.mk
diff --git a/keyboards/salicylic_acid3/ajisai74/readme.md b/keyboards/salicylic_acid3/ajisai74/readme.md
new file mode 100644
index 0000000000..e274eb0ac4
--- /dev/null
+++ b/keyboards/salicylic_acid3/ajisai74/readme.md
@@ -0,0 +1,17 @@
+# AJisai74
+
+![ajisai74](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20200812/20200812214740.png)
+
+This is 74 keys Custom keyboard.
+
+* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+* Hardware Supported: AJisai74 PCB, Pro Micro
+* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/2291877)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make salicylic_acid3/ajisai74:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/ajisai74-build-guide)
diff --git a/keyboards/ajisai74/rules.mk b/keyboards/salicylic_acid3/ajisai74/rules.mk
index 8f9772df22..8f9772df22 100644
--- a/keyboards/ajisai74/rules.mk
+++ b/keyboards/salicylic_acid3/ajisai74/rules.mk
diff --git a/keyboards/ergoarrows/config.h b/keyboards/salicylic_acid3/ergoarrows/config.h
index ae13e20014..ae13e20014 100644
--- a/keyboards/ergoarrows/config.h
+++ b/keyboards/salicylic_acid3/ergoarrows/config.h
diff --git a/keyboards/ergoarrows/ergoarrows.c b/keyboards/salicylic_acid3/ergoarrows/ergoarrows.c
index 7d2c11e6ec..7d2c11e6ec 100644
--- a/keyboards/ergoarrows/ergoarrows.c
+++ b/keyboards/salicylic_acid3/ergoarrows/ergoarrows.c
diff --git a/keyboards/ergoarrows/ergoarrows.h b/keyboards/salicylic_acid3/ergoarrows/ergoarrows.h
index 7944337b4e..7944337b4e 100644
--- a/keyboards/ergoarrows/ergoarrows.h
+++ b/keyboards/salicylic_acid3/ergoarrows/ergoarrows.h
diff --git a/keyboards/ergoarrows/info.json b/keyboards/salicylic_acid3/ergoarrows/info.json
index a625476e79..a625476e79 100644
--- a/keyboards/ergoarrows/info.json
+++ b/keyboards/salicylic_acid3/ergoarrows/info.json
diff --git a/keyboards/ergoarrows/keymaps/default/config.h b/keyboards/salicylic_acid3/ergoarrows/keymaps/default/config.h
index fd96baa819..fd96baa819 100644
--- a/keyboards/ergoarrows/keymaps/default/config.h
+++ b/keyboards/salicylic_acid3/ergoarrows/keymaps/default/config.h
diff --git a/keyboards/ergoarrows/keymaps/default/keymap.c b/keyboards/salicylic_acid3/ergoarrows/keymaps/default/keymap.c
index eda419d72c..eda419d72c 100644
--- a/keyboards/ergoarrows/keymaps/default/keymap.c
+++ b/keyboards/salicylic_acid3/ergoarrows/keymaps/default/keymap.c
diff --git a/keyboards/ergoarrows/keymaps/salicylic/config.h b/keyboards/salicylic_acid3/ergoarrows/keymaps/salicylic/config.h
index fd96baa819..fd96baa819 100644
--- a/keyboards/ergoarrows/keymaps/salicylic/config.h
+++ b/keyboards/salicylic_acid3/ergoarrows/keymaps/salicylic/config.h
diff --git a/keyboards/ergoarrows/keymaps/salicylic/keymap.c b/keyboards/salicylic_acid3/ergoarrows/keymaps/salicylic/keymap.c
index c841371dba..c841371dba 100644
--- a/keyboards/ergoarrows/keymaps/salicylic/keymap.c
+++ b/keyboards/salicylic_acid3/ergoarrows/keymaps/salicylic/keymap.c
diff --git a/keyboards/ergoarrows/keymaps/via/config.h b/keyboards/salicylic_acid3/ergoarrows/keymaps/via/config.h
index fd96baa819..fd96baa819 100644
--- a/keyboards/ergoarrows/keymaps/via/config.h
+++ b/keyboards/salicylic_acid3/ergoarrows/keymaps/via/config.h
diff --git a/keyboards/ergoarrows/keymaps/via/keymap.c b/keyboards/salicylic_acid3/ergoarrows/keymaps/via/keymap.c
index 6bc8ec95ef..6bc8ec95ef 100644
--- a/keyboards/ergoarrows/keymaps/via/keymap.c
+++ b/keyboards/salicylic_acid3/ergoarrows/keymaps/via/keymap.c
diff --git a/keyboards/nknl7en/keymaps/via/rules.mk b/keyboards/salicylic_acid3/ergoarrows/keymaps/via/rules.mk
index 036bd6d1c3..036bd6d1c3 100644
--- a/keyboards/nknl7en/keymaps/via/rules.mk
+++ b/keyboards/salicylic_acid3/ergoarrows/keymaps/via/rules.mk
diff --git a/keyboards/salicylic_acid3/ergoarrows/readme.md b/keyboards/salicylic_acid3/ergoarrows/readme.md
new file mode 100644
index 0000000000..93ad989415
--- /dev/null
+++ b/keyboards/salicylic_acid3/ergoarrows/readme.md
@@ -0,0 +1,17 @@
+# ergoarrows
+
+![ergoarrows](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20210117/20210117011553.png)
+
+This is 76 keys Custom keyboard.
+
+* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+* Hardware Supported: nknl7 PCB, Pro Micro
+* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/2681816)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make salicylic_acid3/ergoarrows:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/ergo-arrows-build-guide)
diff --git a/keyboards/ergoarrows/rules.mk b/keyboards/salicylic_acid3/ergoarrows/rules.mk
index aba3644c9e..aba3644c9e 100644
--- a/keyboards/ergoarrows/rules.mk
+++ b/keyboards/salicylic_acid3/ergoarrows/rules.mk
diff --git a/keyboards/suihankey/split/alpha/.noci b/keyboards/salicylic_acid3/getta25/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/suihankey/split/alpha/.noci
+++ b/keyboards/salicylic_acid3/getta25/.noci
diff --git a/keyboards/naked64/config.h b/keyboards/salicylic_acid3/getta25/config.h
index cfb6bf4ffc..cfb6bf4ffc 100644
--- a/keyboards/naked64/config.h
+++ b/keyboards/salicylic_acid3/getta25/config.h
diff --git a/keyboards/getta25/getta25.c b/keyboards/salicylic_acid3/getta25/getta25.c
index 4f8cc63b42..4f8cc63b42 100644
--- a/keyboards/getta25/getta25.c
+++ b/keyboards/salicylic_acid3/getta25/getta25.c
diff --git a/keyboards/salicylic_acid3/getta25/getta25.h b/keyboards/salicylic_acid3/getta25/getta25.h
new file mode 100644
index 0000000000..67632bba4d
--- /dev/null
+++ b/keyboards/salicylic_acid3/getta25/getta25.h
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "quantum.h"
+
+#ifdef KEYBOARD_salicylic_acid3_getta25_rev1
+ #include "rev1.h"
+#endif
diff --git a/keyboards/getta25/info.json b/keyboards/salicylic_acid3/getta25/info.json
index 980b5142db..980b5142db 100644
--- a/keyboards/getta25/info.json
+++ b/keyboards/salicylic_acid3/getta25/info.json
diff --git a/keyboards/getta25/keymaps/default/config.h b/keyboards/salicylic_acid3/getta25/keymaps/default/config.h
index 8c4e1f5129..8c4e1f5129 100644
--- a/keyboards/getta25/keymaps/default/config.h
+++ b/keyboards/salicylic_acid3/getta25/keymaps/default/config.h
diff --git a/keyboards/getta25/keymaps/default/keymap.c b/keyboards/salicylic_acid3/getta25/keymaps/default/keymap.c
index a70df01c18..a70df01c18 100644
--- a/keyboards/getta25/keymaps/default/keymap.c
+++ b/keyboards/salicylic_acid3/getta25/keymaps/default/keymap.c
diff --git a/keyboards/getta25/keymaps/oled/config.h b/keyboards/salicylic_acid3/getta25/keymaps/oled/config.h
index be988915c2..be988915c2 100644
--- a/keyboards/getta25/keymaps/oled/config.h
+++ b/keyboards/salicylic_acid3/getta25/keymaps/oled/config.h
diff --git a/keyboards/getta25/keymaps/oled/glcdfont.c b/keyboards/salicylic_acid3/getta25/keymaps/oled/glcdfont.c
index 939db32ca6..939db32ca6 100644
--- a/keyboards/getta25/keymaps/oled/glcdfont.c
+++ b/keyboards/salicylic_acid3/getta25/keymaps/oled/glcdfont.c
diff --git a/keyboards/getta25/keymaps/oled/keymap.c b/keyboards/salicylic_acid3/getta25/keymaps/oled/keymap.c
index 7d8151b86d..7d8151b86d 100644
--- a/keyboards/getta25/keymaps/oled/keymap.c
+++ b/keyboards/salicylic_acid3/getta25/keymaps/oled/keymap.c
diff --git a/keyboards/getta25/keymaps/oled/rules.mk b/keyboards/salicylic_acid3/getta25/keymaps/oled/rules.mk
index d34d066ded..d34d066ded 100644
--- a/keyboards/getta25/keymaps/oled/rules.mk
+++ b/keyboards/salicylic_acid3/getta25/keymaps/oled/rules.mk
diff --git a/keyboards/salicylic_acid3/getta25/readme.md b/keyboards/salicylic_acid3/getta25/readme.md
new file mode 100644
index 0000000000..2f3e9d1f1b
--- /dev/null
+++ b/keyboards/salicylic_acid3/getta25/readme.md
@@ -0,0 +1,17 @@
+# getta25
+
+![getta25](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20191127/20191127005608.png)
+
+This is 25 keys tenkeypad.
+
+* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+* Hardware Supported: Getta25 PCB, Pro Micro
+* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1700006)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make salicylic_acid3/getta25/rev1:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/getta25-rev2-build-guide)
diff --git a/keyboards/getta25/rev1/config.h b/keyboards/salicylic_acid3/getta25/rev1/config.h
index 740a9f3fbd..740a9f3fbd 100644
--- a/keyboards/getta25/rev1/config.h
+++ b/keyboards/salicylic_acid3/getta25/rev1/config.h
diff --git a/keyboards/getta25/rev1/rev1.c b/keyboards/salicylic_acid3/getta25/rev1/rev1.c
index 520a869e57..520a869e57 100644
--- a/keyboards/getta25/rev1/rev1.c
+++ b/keyboards/salicylic_acid3/getta25/rev1/rev1.c
diff --git a/keyboards/getta25/rev1/rev1.h b/keyboards/salicylic_acid3/getta25/rev1/rev1.h
index 98f4318a6a..98f4318a6a 100644
--- a/keyboards/getta25/rev1/rev1.h
+++ b/keyboards/salicylic_acid3/getta25/rev1/rev1.h
diff --git a/keyboards/treadstone48/rev1/rules.mk b/keyboards/salicylic_acid3/getta25/rev1/rules.mk
index fff00a1b51..fff00a1b51 100644
--- a/keyboards/treadstone48/rev1/rules.mk
+++ b/keyboards/salicylic_acid3/getta25/rev1/rules.mk
diff --git a/keyboards/salicylic_acid3/getta25/rules.mk b/keyboards/salicylic_acid3/getta25/rules.mk
new file mode 100644
index 0000000000..977ef5bb1d
--- /dev/null
+++ b/keyboards/salicylic_acid3/getta25/rules.mk
@@ -0,0 +1,21 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = no # Audio output
+RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
+OLED_ENABLE = no
+
+DEFAULT_FOLDER = salicylic_acid3/getta25/rev1
diff --git a/keyboards/treadstone32/lite/.noci b/keyboards/salicylic_acid3/jisplit89/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/treadstone32/lite/.noci
+++ b/keyboards/salicylic_acid3/jisplit89/.noci
diff --git a/keyboards/jisplit89/config.h b/keyboards/salicylic_acid3/jisplit89/config.h
index c9b55e7a03..c9b55e7a03 100644
--- a/keyboards/jisplit89/config.h
+++ b/keyboards/salicylic_acid3/jisplit89/config.h
diff --git a/keyboards/jisplit89/info.json b/keyboards/salicylic_acid3/jisplit89/info.json
index 4f138a5262..4f138a5262 100644
--- a/keyboards/jisplit89/info.json
+++ b/keyboards/salicylic_acid3/jisplit89/info.json
diff --git a/keyboards/jisplit89/jisplit89.c b/keyboards/salicylic_acid3/jisplit89/jisplit89.c
index 0f03aa4ce2..0f03aa4ce2 100644
--- a/keyboards/jisplit89/jisplit89.c
+++ b/keyboards/salicylic_acid3/jisplit89/jisplit89.c
diff --git a/keyboards/salicylic_acid3/jisplit89/jisplit89.h b/keyboards/salicylic_acid3/jisplit89/jisplit89.h
new file mode 100644
index 0000000000..8de2326de6
--- /dev/null
+++ b/keyboards/salicylic_acid3/jisplit89/jisplit89.h
@@ -0,0 +1,22 @@
+/*
+Copyright 2020 Salicylic_Acid
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+
+#ifdef KEYBOARD_salicylic_acid3_jisplit89_rev1
+ #include "rev1.h"
+#endif
diff --git a/keyboards/jisplit89/keymaps/default/keymap.c b/keyboards/salicylic_acid3/jisplit89/keymaps/default/keymap.c
index e782a4b451..e782a4b451 100644
--- a/keyboards/jisplit89/keymaps/default/keymap.c
+++ b/keyboards/salicylic_acid3/jisplit89/keymaps/default/keymap.c
diff --git a/keyboards/jisplit89/keymaps/salicylic/config.h b/keyboards/salicylic_acid3/jisplit89/keymaps/salicylic/config.h
index 81ee8ef785..81ee8ef785 100644
--- a/keyboards/jisplit89/keymaps/salicylic/config.h
+++ b/keyboards/salicylic_acid3/jisplit89/keymaps/salicylic/config.h
diff --git a/keyboards/jisplit89/keymaps/salicylic/keymap.c b/keyboards/salicylic_acid3/jisplit89/keymaps/salicylic/keymap.c
index ffd3b853b5..ffd3b853b5 100644
--- a/keyboards/jisplit89/keymaps/salicylic/keymap.c
+++ b/keyboards/salicylic_acid3/jisplit89/keymaps/salicylic/keymap.c
diff --git a/keyboards/jisplit89/keymaps/salicylic/rules.mk b/keyboards/salicylic_acid3/jisplit89/keymaps/salicylic/rules.mk
index 8db2280906..8db2280906 100644
--- a/keyboards/jisplit89/keymaps/salicylic/rules.mk
+++ b/keyboards/salicylic_acid3/jisplit89/keymaps/salicylic/rules.mk
diff --git a/keyboards/jisplit89/keymaps/via/config.h b/keyboards/salicylic_acid3/jisplit89/keymaps/via/config.h
index 08bcdab701..08bcdab701 100644
--- a/keyboards/jisplit89/keymaps/via/config.h
+++ b/keyboards/salicylic_acid3/jisplit89/keymaps/via/config.h
diff --git a/keyboards/jisplit89/keymaps/via/keymap.c b/keyboards/salicylic_acid3/jisplit89/keymaps/via/keymap.c
index b2ceacb0e6..b2ceacb0e6 100644
--- a/keyboards/jisplit89/keymaps/via/keymap.c
+++ b/keyboards/salicylic_acid3/jisplit89/keymaps/via/keymap.c
diff --git a/keyboards/naiping/nphhkb/keymaps/via/rules.mk b/keyboards/salicylic_acid3/jisplit89/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/naiping/nphhkb/keymaps/via/rules.mk
+++ b/keyboards/salicylic_acid3/jisplit89/keymaps/via/rules.mk
diff --git a/keyboards/salicylic_acid3/jisplit89/readme.md b/keyboards/salicylic_acid3/jisplit89/readme.md
new file mode 100644
index 0000000000..df0994e109
--- /dev/null
+++ b/keyboards/salicylic_acid3/jisplit89/readme.md
@@ -0,0 +1,17 @@
+# JISplit89
+
+![jisplit89](https://s2.booth.pm/1d33594d-0c5f-4f93-baf5-2e89e0d99afc/i/1916810/ee9743ff-b03d-4ab8-8130-ddaad3c1b30d_base_resized.jpg)
+
+This is 89 keys Custom keyboard.
+
+* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+* Hardware Supported: jisplit89 PCB, Pro Micro
+* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1916810)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make salicylic_acid3/jisplit89/rev1:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/jisplit89-build-guide)
diff --git a/keyboards/jisplit89/rev1/config.h b/keyboards/salicylic_acid3/jisplit89/rev1/config.h
index ee5f2ca0bc..ee5f2ca0bc 100644
--- a/keyboards/jisplit89/rev1/config.h
+++ b/keyboards/salicylic_acid3/jisplit89/rev1/config.h
diff --git a/keyboards/jisplit89/rev1/rev1.c b/keyboards/salicylic_acid3/jisplit89/rev1/rev1.c
index 13e201e63a..13e201e63a 100644
--- a/keyboards/jisplit89/rev1/rev1.c
+++ b/keyboards/salicylic_acid3/jisplit89/rev1/rev1.c
diff --git a/keyboards/jisplit89/rev1/rev1.h b/keyboards/salicylic_acid3/jisplit89/rev1/rev1.h
index 71515f5ef6..71515f5ef6 100644
--- a/keyboards/jisplit89/rev1/rev1.h
+++ b/keyboards/salicylic_acid3/jisplit89/rev1/rev1.h
diff --git a/keyboards/naked60/rev1/rules.mk b/keyboards/salicylic_acid3/jisplit89/rev1/rules.mk
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/naked60/rev1/rules.mk
+++ b/keyboards/salicylic_acid3/jisplit89/rev1/rules.mk
diff --git a/keyboards/salicylic_acid3/jisplit89/rules.mk b/keyboards/salicylic_acid3/jisplit89/rules.mk
new file mode 100644
index 0000000000..a6a8510675
--- /dev/null
+++ b/keyboards/salicylic_acid3/jisplit89/rules.mk
@@ -0,0 +1,22 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+SPLIT_KEYBOARD = yes
+
+DEFAULT_FOLDER = salicylic_acid3/jisplit89/rev1
diff --git a/keyboards/nafuda/config.h b/keyboards/salicylic_acid3/nafuda/config.h
index 22e17c6cc7..22e17c6cc7 100644
--- a/keyboards/nafuda/config.h
+++ b/keyboards/salicylic_acid3/nafuda/config.h
diff --git a/keyboards/nafuda/info.json b/keyboards/salicylic_acid3/nafuda/info.json
index d418341d19..d418341d19 100644
--- a/keyboards/nafuda/info.json
+++ b/keyboards/salicylic_acid3/nafuda/info.json
diff --git a/keyboards/nafuda/keymaps/default/config.h b/keyboards/salicylic_acid3/nafuda/keymaps/default/config.h
index e35fe2ccd7..e35fe2ccd7 100644
--- a/keyboards/nafuda/keymaps/default/config.h
+++ b/keyboards/salicylic_acid3/nafuda/keymaps/default/config.h
diff --git a/keyboards/nafuda/keymaps/default/keymap.c b/keyboards/salicylic_acid3/nafuda/keymaps/default/keymap.c
index f0baff6c22..f0baff6c22 100644
--- a/keyboards/nafuda/keymaps/default/keymap.c
+++ b/keyboards/salicylic_acid3/nafuda/keymaps/default/keymap.c
diff --git a/keyboards/nafuda/keymaps/default/readme.md b/keyboards/salicylic_acid3/nafuda/keymaps/default/readme.md
index b84276bf8a..b84276bf8a 100644
--- a/keyboards/nafuda/keymaps/default/readme.md
+++ b/keyboards/salicylic_acid3/nafuda/keymaps/default/readme.md
diff --git a/keyboards/nafuda/nafuda.c b/keyboards/salicylic_acid3/nafuda/nafuda.c
index 334b3dab27..334b3dab27 100644
--- a/keyboards/nafuda/nafuda.c
+++ b/keyboards/salicylic_acid3/nafuda/nafuda.c
diff --git a/keyboards/nafuda/nafuda.h b/keyboards/salicylic_acid3/nafuda/nafuda.h
index 008a9c16f4..008a9c16f4 100644
--- a/keyboards/nafuda/nafuda.h
+++ b/keyboards/salicylic_acid3/nafuda/nafuda.h
diff --git a/keyboards/salicylic_acid3/nafuda/readme.md b/keyboards/salicylic_acid3/nafuda/readme.md
new file mode 100644
index 0000000000..5df9b5df0f
--- /dev/null
+++ b/keyboards/salicylic_acid3/nafuda/readme.md
@@ -0,0 +1,17 @@
+# nafuda
+
+![nafuda](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20190608/20190608024901.jpg)
+
+This is 7 keys cursor macropad.
+
+* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+* Hardware Supported: Nafuda PCB, Pro Micro
+* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1271706)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make salicylic_acid3/nafuda:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/nafuda-build-guide)
diff --git a/keyboards/nafuda/rules.mk b/keyboards/salicylic_acid3/nafuda/rules.mk
index e9d90e7ad8..e9d90e7ad8 100644
--- a/keyboards/nafuda/rules.mk
+++ b/keyboards/salicylic_acid3/nafuda/rules.mk
diff --git a/keyboards/treadstone32/rev1/.noci b/keyboards/salicylic_acid3/naked48/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/treadstone32/rev1/.noci
+++ b/keyboards/salicylic_acid3/naked48/.noci
diff --git a/keyboards/naked48/config.h b/keyboards/salicylic_acid3/naked48/config.h
index fae55d19f7..fae55d19f7 100644
--- a/keyboards/naked48/config.h
+++ b/keyboards/salicylic_acid3/naked48/config.h
diff --git a/keyboards/naked48/info.json b/keyboards/salicylic_acid3/naked48/info.json
index 8186a6ba5b..8186a6ba5b 100644
--- a/keyboards/naked48/info.json
+++ b/keyboards/salicylic_acid3/naked48/info.json
diff --git a/keyboards/naked48/keymaps/default/config.h b/keyboards/salicylic_acid3/naked48/keymaps/default/config.h
index 0e452bdb4a..0e452bdb4a 100644
--- a/keyboards/naked48/keymaps/default/config.h
+++ b/keyboards/salicylic_acid3/naked48/keymaps/default/config.h
diff --git a/keyboards/naked48/keymaps/default/keymap.c b/keyboards/salicylic_acid3/naked48/keymaps/default/keymap.c
index e145c02e32..e145c02e32 100644
--- a/keyboards/naked48/keymaps/default/keymap.c
+++ b/keyboards/salicylic_acid3/naked48/keymaps/default/keymap.c
diff --git a/keyboards/naked48/keymaps/default/readme.md b/keyboards/salicylic_acid3/naked48/keymaps/default/readme.md
index a28ad8c52c..a28ad8c52c 100644
--- a/keyboards/naked48/keymaps/default/readme.md
+++ b/keyboards/salicylic_acid3/naked48/keymaps/default/readme.md
diff --git a/keyboards/treadstone48/rev2/rules.mk b/keyboards/salicylic_acid3/naked48/keymaps/default/rules.mk
index d29d9074a0..d29d9074a0 100644
--- a/keyboards/treadstone48/rev2/rules.mk
+++ b/keyboards/salicylic_acid3/naked48/keymaps/default/rules.mk
diff --git a/keyboards/naked48/keymaps/default_with_nafuda/config.h b/keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/config.h
index 314fe55c30..314fe55c30 100644
--- a/keyboards/naked48/keymaps/default_with_nafuda/config.h
+++ b/keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/config.h
diff --git a/keyboards/naked48/keymaps/default_with_nafuda/keymap.c b/keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/keymap.c
index f5d0772aa4..f5d0772aa4 100644
--- a/keyboards/naked48/keymaps/default_with_nafuda/keymap.c
+++ b/keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/keymap.c
diff --git a/keyboards/naked48/keymaps/default_with_nafuda/readme.md b/keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/readme.md
index 417b44133b..417b44133b 100644
--- a/keyboards/naked48/keymaps/default_with_nafuda/readme.md
+++ b/keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/readme.md
diff --git a/keyboards/naked48/keymaps/default_with_nafuda/rules.mk b/keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/rules.mk
index 6c605daecf..6c605daecf 100644
--- a/keyboards/naked48/keymaps/default_with_nafuda/rules.mk
+++ b/keyboards/salicylic_acid3/naked48/keymaps/default_with_nafuda/rules.mk
diff --git a/keyboards/naked48/keymaps/default_with_setta21/config.h b/keyboards/salicylic_acid3/naked48/keymaps/default_with_setta21/config.h
index 2ad4d0adeb..2ad4d0adeb 100644
--- a/keyboards/naked48/keymaps/default_with_setta21/config.h
+++ b/keyboards/salicylic_acid3/naked48/keymaps/default_with_setta21/config.h
diff --git a/keyboards/naked48/keymaps/default_with_setta21/keymap.c b/keyboards/salicylic_acid3/naked48/keymaps/default_with_setta21/keymap.c
index f6e460588c..f6e460588c 100644
--- a/keyboards/naked48/keymaps/default_with_setta21/keymap.c
+++ b/keyboards/salicylic_acid3/naked48/keymaps/default_with_setta21/keymap.c
diff --git a/keyboards/naked48/keymaps/default_with_setta21/readme.md b/keyboards/salicylic_acid3/naked48/keymaps/default_with_setta21/readme.md
index 6e2a3441d2..6e2a3441d2 100644
--- a/keyboards/naked48/keymaps/default_with_setta21/readme.md
+++ b/keyboards/salicylic_acid3/naked48/keymaps/default_with_setta21/readme.md
diff --git a/keyboards/naked48/keymaps/salicylic/config.h b/keyboards/salicylic_acid3/naked48/keymaps/salicylic/config.h
index 71a43e208c..71a43e208c 100644
--- a/keyboards/naked48/keymaps/salicylic/config.h
+++ b/keyboards/salicylic_acid3/naked48/keymaps/salicylic/config.h
diff --git a/keyboards/naked48/keymaps/salicylic/keymap.c b/keyboards/salicylic_acid3/naked48/keymaps/salicylic/keymap.c
index dddb6c0432..dddb6c0432 100644
--- a/keyboards/naked48/keymaps/salicylic/keymap.c
+++ b/keyboards/salicylic_acid3/naked48/keymaps/salicylic/keymap.c
diff --git a/keyboards/naked48/keymaps/salicylic/readme.md b/keyboards/salicylic_acid3/naked48/keymaps/salicylic/readme.md
index 6563bb46ff..6563bb46ff 100644
--- a/keyboards/naked48/keymaps/salicylic/readme.md
+++ b/keyboards/salicylic_acid3/naked48/keymaps/salicylic/readme.md
diff --git a/keyboards/naked48/keymaps/salicylic/rules.mk b/keyboards/salicylic_acid3/naked48/keymaps/salicylic/rules.mk
index bdf3488cc1..bdf3488cc1 100644
--- a/keyboards/naked48/keymaps/salicylic/rules.mk
+++ b/keyboards/salicylic_acid3/naked48/keymaps/salicylic/rules.mk
diff --git a/keyboards/naked48/keymaps/salicylic_with_nafuda/config.h b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_nafuda/config.h
index 7ce6416010..7ce6416010 100644
--- a/keyboards/naked48/keymaps/salicylic_with_nafuda/config.h
+++ b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_nafuda/config.h
diff --git a/keyboards/naked48/keymaps/salicylic_with_nafuda/keymap.c b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_nafuda/keymap.c
index 7566d4c00a..7566d4c00a 100644
--- a/keyboards/naked48/keymaps/salicylic_with_nafuda/keymap.c
+++ b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_nafuda/keymap.c
diff --git a/keyboards/naked48/keymaps/salicylic_with_nafuda/readme.md b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_nafuda/readme.md
index 15e34e188c..15e34e188c 100644
--- a/keyboards/naked48/keymaps/salicylic_with_nafuda/readme.md
+++ b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_nafuda/readme.md
diff --git a/keyboards/naked48/keymaps/salicylic_with_nafuda/rules.mk b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_nafuda/rules.mk
index f76b955efd..f76b955efd 100644
--- a/keyboards/naked48/keymaps/salicylic_with_nafuda/rules.mk
+++ b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_nafuda/rules.mk
diff --git a/keyboards/naked48/keymaps/salicylic_with_setta21/config.h b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_setta21/config.h
index 2ad4d0adeb..2ad4d0adeb 100644
--- a/keyboards/naked48/keymaps/salicylic_with_setta21/config.h
+++ b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_setta21/config.h
diff --git a/keyboards/naked48/keymaps/salicylic_with_setta21/keymap.c b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_setta21/keymap.c
index 1925067d22..1925067d22 100644
--- a/keyboards/naked48/keymaps/salicylic_with_setta21/keymap.c
+++ b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_setta21/keymap.c
diff --git a/keyboards/naked48/keymaps/salicylic_with_setta21/readme.md b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_setta21/readme.md
index 2c76bc2907..2c76bc2907 100644
--- a/keyboards/naked48/keymaps/salicylic_with_setta21/readme.md
+++ b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_setta21/readme.md
diff --git a/keyboards/naked64/keymaps/default/rules.mk b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_setta21/rules.mk
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/naked64/keymaps/default/rules.mk
+++ b/keyboards/salicylic_acid3/naked48/keymaps/salicylic_with_setta21/rules.mk
diff --git a/keyboards/naked48/keymaps/scheiklp/config.h b/keyboards/salicylic_acid3/naked48/keymaps/scheiklp/config.h
index 8c11ad6078..8c11ad6078 100644
--- a/keyboards/naked48/keymaps/scheiklp/config.h
+++ b/keyboards/salicylic_acid3/naked48/keymaps/scheiklp/config.h
diff --git a/keyboards/naked48/keymaps/scheiklp/keymap.c b/keyboards/salicylic_acid3/naked48/keymaps/scheiklp/keymap.c
index d8549e0e8b..d8549e0e8b 100644
--- a/keyboards/naked48/keymaps/scheiklp/keymap.c
+++ b/keyboards/salicylic_acid3/naked48/keymaps/scheiklp/keymap.c
diff --git a/keyboards/naked48/keymaps/scheiklp/readme.md b/keyboards/salicylic_acid3/naked48/keymaps/scheiklp/readme.md
index a28ad8c52c..a28ad8c52c 100644
--- a/keyboards/naked48/keymaps/scheiklp/readme.md
+++ b/keyboards/salicylic_acid3/naked48/keymaps/scheiklp/readme.md
diff --git a/keyboards/naked48/keymaps/scheiklp/rules.mk b/keyboards/salicylic_acid3/naked48/keymaps/scheiklp/rules.mk
index 0b64091e58..0b64091e58 100644
--- a/keyboards/naked48/keymaps/scheiklp/rules.mk
+++ b/keyboards/salicylic_acid3/naked48/keymaps/scheiklp/rules.mk
diff --git a/keyboards/naked48/keymaps/via/config.h b/keyboards/salicylic_acid3/naked48/keymaps/via/config.h
index fd96baa819..fd96baa819 100644
--- a/keyboards/naked48/keymaps/via/config.h
+++ b/keyboards/salicylic_acid3/naked48/keymaps/via/config.h
diff --git a/keyboards/naked48/keymaps/via/keymap.c b/keyboards/salicylic_acid3/naked48/keymaps/via/keymap.c
index 8d0c6f901b..8d0c6f901b 100644
--- a/keyboards/naked48/keymaps/via/keymap.c
+++ b/keyboards/salicylic_acid3/naked48/keymaps/via/keymap.c
diff --git a/keyboards/naked48/keymaps/via/rules.mk b/keyboards/salicylic_acid3/naked48/keymaps/via/rules.mk
index 8712957dfa..8712957dfa 100644
--- a/keyboards/naked48/keymaps/via/rules.mk
+++ b/keyboards/salicylic_acid3/naked48/keymaps/via/rules.mk
diff --git a/keyboards/naked48/keymaps/via_rgb_matrix/config.h b/keyboards/salicylic_acid3/naked48/keymaps/via_rgb_matrix/config.h
index 0920b2bc35..0920b2bc35 100644
--- a/keyboards/naked48/keymaps/via_rgb_matrix/config.h
+++ b/keyboards/salicylic_acid3/naked48/keymaps/via_rgb_matrix/config.h
diff --git a/keyboards/naked48/keymaps/via_rgb_matrix/keymap.c b/keyboards/salicylic_acid3/naked48/keymaps/via_rgb_matrix/keymap.c
index 8d0c6f901b..8d0c6f901b 100644
--- a/keyboards/naked48/keymaps/via_rgb_matrix/keymap.c
+++ b/keyboards/salicylic_acid3/naked48/keymaps/via_rgb_matrix/keymap.c
diff --git a/keyboards/naked48/keymaps/via_rgb_matrix/rules.mk b/keyboards/salicylic_acid3/naked48/keymaps/via_rgb_matrix/rules.mk
index 49bb80ca31..49bb80ca31 100644
--- a/keyboards/naked48/keymaps/via_rgb_matrix/rules.mk
+++ b/keyboards/salicylic_acid3/naked48/keymaps/via_rgb_matrix/rules.mk
diff --git a/keyboards/naked48/naked48.c b/keyboards/salicylic_acid3/naked48/naked48.c
index c2a10ed3e6..c2a10ed3e6 100644
--- a/keyboards/naked48/naked48.c
+++ b/keyboards/salicylic_acid3/naked48/naked48.c
diff --git a/keyboards/salicylic_acid3/naked48/naked48.h b/keyboards/salicylic_acid3/naked48/naked48.h
new file mode 100644
index 0000000000..bbfa6d2e84
--- /dev/null
+++ b/keyboards/salicylic_acid3/naked48/naked48.h
@@ -0,0 +1,24 @@
+/*
+Copyright 2021 Salicylic_Acid
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General 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"
+
+#ifdef KEYBOARD_salicylic_acid3_naked48_rev1
+ #include "rev1.h"
+#endif
diff --git a/keyboards/salicylic_acid3/naked48/readme.md b/keyboards/salicylic_acid3/naked48/readme.md
new file mode 100644
index 0000000000..c3a826f13e
--- /dev/null
+++ b/keyboards/salicylic_acid3/naked48/readme.md
@@ -0,0 +1,18 @@
+# naked48
+
+![naked48](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20190326/20190326015949.jpg)
+
+This is 48 keys modification Ortholinear keyboard.
+
+Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+Hardware Supported: Naked60BMP PCB, Pro Micro
+Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1271568)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make salicylic_acid3/naked48/rev1:default:avrdude
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/naked48led-build-guide)
+[Firmware](https://github.com/Salicylic-acid3/qmk_firmware/tree/master/keyboards/naked48)
diff --git a/keyboards/naked48/rev1/config.h b/keyboards/salicylic_acid3/naked48/rev1/config.h
index b79384a48a..b79384a48a 100644
--- a/keyboards/naked48/rev1/config.h
+++ b/keyboards/salicylic_acid3/naked48/rev1/config.h
diff --git a/keyboards/naked48/rev1/rev1.c b/keyboards/salicylic_acid3/naked48/rev1/rev1.c
index 0129b6c1a3..0129b6c1a3 100644
--- a/keyboards/naked48/rev1/rev1.c
+++ b/keyboards/salicylic_acid3/naked48/rev1/rev1.c
diff --git a/keyboards/naked48/rev1/rev1.h b/keyboards/salicylic_acid3/naked48/rev1/rev1.h
index eee5c4185f..eee5c4185f 100644
--- a/keyboards/naked48/rev1/rev1.h
+++ b/keyboards/salicylic_acid3/naked48/rev1/rev1.h
diff --git a/keyboards/naked64/keymaps/default_with_setta21/rules.mk b/keyboards/salicylic_acid3/naked48/rev1/rules.mk
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/naked64/keymaps/default_with_setta21/rules.mk
+++ b/keyboards/salicylic_acid3/naked48/rev1/rules.mk
diff --git a/keyboards/salicylic_acid3/naked48/rules.mk b/keyboards/salicylic_acid3/naked48/rules.mk
new file mode 100644
index 0000000000..0e297ebf60
--- /dev/null
+++ b/keyboards/salicylic_acid3/naked48/rules.mk
@@ -0,0 +1,24 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+RGB_MATRIX_ENABLE = no
+RGB_MATRIX_DRIVER = WS2812
+
+SPLIT_KEYBOARD = yes
+
+DEFAULT_FOLDER = salicylic_acid3/naked48/rev1
diff --git a/keyboards/naked60/config.h b/keyboards/salicylic_acid3/naked60/config.h
index fae55d19f7..fae55d19f7 100644
--- a/keyboards/naked60/config.h
+++ b/keyboards/salicylic_acid3/naked60/config.h
diff --git a/keyboards/naked60/info.json b/keyboards/salicylic_acid3/naked60/info.json
index 8ec020ae72..8ec020ae72 100644
--- a/keyboards/naked60/info.json
+++ b/keyboards/salicylic_acid3/naked60/info.json
diff --git a/keyboards/naked60/keymaps/333fred/config.h b/keyboards/salicylic_acid3/naked60/keymaps/333fred/config.h
index d19e77f044..d19e77f044 100644
--- a/keyboards/naked60/keymaps/333fred/config.h
+++ b/keyboards/salicylic_acid3/naked60/keymaps/333fred/config.h
diff --git a/keyboards/naked60/keymaps/333fred/keymap.c b/keyboards/salicylic_acid3/naked60/keymaps/333fred/keymap.c
index 7185ec78b7..7185ec78b7 100644
--- a/keyboards/naked60/keymaps/333fred/keymap.c
+++ b/keyboards/salicylic_acid3/naked60/keymaps/333fred/keymap.c
diff --git a/keyboards/naked60/keymaps/default/config.h b/keyboards/salicylic_acid3/naked60/keymaps/default/config.h
index 4b3496d856..4b3496d856 100644
--- a/keyboards/naked60/keymaps/default/config.h
+++ b/keyboards/salicylic_acid3/naked60/keymaps/default/config.h
diff --git a/keyboards/naked60/keymaps/default/keymap.c b/keyboards/salicylic_acid3/naked60/keymaps/default/keymap.c
index 3a95e73244..3a95e73244 100644
--- a/keyboards/naked60/keymaps/default/keymap.c
+++ b/keyboards/salicylic_acid3/naked60/keymaps/default/keymap.c
diff --git a/keyboards/naked60/keymaps/default/readme.md b/keyboards/salicylic_acid3/naked60/keymaps/default/readme.md
index c6f3342b21..c6f3342b21 100644
--- a/keyboards/naked60/keymaps/default/readme.md
+++ b/keyboards/salicylic_acid3/naked60/keymaps/default/readme.md
diff --git a/keyboards/naked60/keymaps/default_with_nafuda/config.h b/keyboards/salicylic_acid3/naked60/keymaps/default_with_nafuda/config.h
index 0761e5b6d3..0761e5b6d3 100644
--- a/keyboards/naked60/keymaps/default_with_nafuda/config.h
+++ b/keyboards/salicylic_acid3/naked60/keymaps/default_with_nafuda/config.h
diff --git a/keyboards/naked60/keymaps/default_with_nafuda/keymap.c b/keyboards/salicylic_acid3/naked60/keymaps/default_with_nafuda/keymap.c
index be8c9f3ec9..be8c9f3ec9 100644
--- a/keyboards/naked60/keymaps/default_with_nafuda/keymap.c
+++ b/keyboards/salicylic_acid3/naked60/keymaps/default_with_nafuda/keymap.c
diff --git a/keyboards/naked60/keymaps/default_with_nafuda/readme.md b/keyboards/salicylic_acid3/naked60/keymaps/default_with_nafuda/readme.md
index 27201090df..27201090df 100644
--- a/keyboards/naked60/keymaps/default_with_nafuda/readme.md
+++ b/keyboards/salicylic_acid3/naked60/keymaps/default_with_nafuda/readme.md
diff --git a/keyboards/naked60/keymaps/default_with_setta21/config.h b/keyboards/salicylic_acid3/naked60/keymaps/default_with_setta21/config.h
index 0761e5b6d3..0761e5b6d3 100644
--- a/keyboards/naked60/keymaps/default_with_setta21/config.h
+++ b/keyboards/salicylic_acid3/naked60/keymaps/default_with_setta21/config.h
diff --git a/keyboards/naked60/keymaps/default_with_setta21/keymap.c b/keyboards/salicylic_acid3/naked60/keymaps/default_with_setta21/keymap.c
index 95a273a388..95a273a388 100644
--- a/keyboards/naked60/keymaps/default_with_setta21/keymap.c
+++ b/keyboards/salicylic_acid3/naked60/keymaps/default_with_setta21/keymap.c
diff --git a/keyboards/naked60/keymaps/default_with_setta21/readme.md b/keyboards/salicylic_acid3/naked60/keymaps/default_with_setta21/readme.md
index 750a8b3508..750a8b3508 100644
--- a/keyboards/naked60/keymaps/default_with_setta21/readme.md
+++ b/keyboards/salicylic_acid3/naked60/keymaps/default_with_setta21/readme.md
diff --git a/keyboards/naked60/keymaps/salicylic/config.h b/keyboards/salicylic_acid3/naked60/keymaps/salicylic/config.h
index 4b3496d856..4b3496d856 100644
--- a/keyboards/naked60/keymaps/salicylic/config.h
+++ b/keyboards/salicylic_acid3/naked60/keymaps/salicylic/config.h
diff --git a/keyboards/naked60/keymaps/salicylic/keymap.c b/keyboards/salicylic_acid3/naked60/keymaps/salicylic/keymap.c
index 9be4bcb422..9be4bcb422 100644
--- a/keyboards/naked60/keymaps/salicylic/keymap.c
+++ b/keyboards/salicylic_acid3/naked60/keymaps/salicylic/keymap.c
diff --git a/keyboards/naked60/keymaps/salicylic/readme.md b/keyboards/salicylic_acid3/naked60/keymaps/salicylic/readme.md
index 2901dbf7fa..2901dbf7fa 100644
--- a/keyboards/naked60/keymaps/salicylic/readme.md
+++ b/keyboards/salicylic_acid3/naked60/keymaps/salicylic/readme.md
diff --git a/keyboards/naked60/keymaps/salicylic/rules.mk b/keyboards/salicylic_acid3/naked60/keymaps/salicylic/rules.mk
index e5ddcae8d9..e5ddcae8d9 100644
--- a/keyboards/naked60/keymaps/salicylic/rules.mk
+++ b/keyboards/salicylic_acid3/naked60/keymaps/salicylic/rules.mk
diff --git a/keyboards/naked60/keymaps/salicylic_with_nafuda/config.h b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_nafuda/config.h
index 47da6d4418..47da6d4418 100644
--- a/keyboards/naked60/keymaps/salicylic_with_nafuda/config.h
+++ b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_nafuda/config.h
diff --git a/keyboards/naked60/keymaps/salicylic_with_nafuda/keymap.c b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_nafuda/keymap.c
index 8fb0ce26f1..8fb0ce26f1 100644
--- a/keyboards/naked60/keymaps/salicylic_with_nafuda/keymap.c
+++ b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_nafuda/keymap.c
diff --git a/keyboards/naked60/keymaps/salicylic_with_nafuda/readme.md b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_nafuda/readme.md
index 17b973b73a..17b973b73a 100644
--- a/keyboards/naked60/keymaps/salicylic_with_nafuda/readme.md
+++ b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_nafuda/readme.md
diff --git a/keyboards/naked60/keymaps/salicylic_with_nafuda/rules.mk b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_nafuda/rules.mk
index e5ddcae8d9..e5ddcae8d9 100644
--- a/keyboards/naked60/keymaps/salicylic_with_nafuda/rules.mk
+++ b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_nafuda/rules.mk
diff --git a/keyboards/naked60/keymaps/salicylic_with_setta21/config.h b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_setta21/config.h
index 0761e5b6d3..0761e5b6d3 100644
--- a/keyboards/naked60/keymaps/salicylic_with_setta21/config.h
+++ b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_setta21/config.h
diff --git a/keyboards/naked60/keymaps/salicylic_with_setta21/keymap.c b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_setta21/keymap.c
index 7f50e89f3c..7f50e89f3c 100644
--- a/keyboards/naked60/keymaps/salicylic_with_setta21/keymap.c
+++ b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_setta21/keymap.c
diff --git a/keyboards/naked60/keymaps/salicylic_with_setta21/readme.md b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_setta21/readme.md
index 1baa36703a..1baa36703a 100644
--- a/keyboards/naked60/keymaps/salicylic_with_setta21/readme.md
+++ b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_setta21/readme.md
diff --git a/keyboards/naked60/keymaps/salicylic_with_setta21/rules.mk b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_setta21/rules.mk
index e5ddcae8d9..e5ddcae8d9 100644
--- a/keyboards/naked60/keymaps/salicylic_with_setta21/rules.mk
+++ b/keyboards/salicylic_acid3/naked60/keymaps/salicylic_with_setta21/rules.mk
diff --git a/keyboards/naked60/keymaps/via/config.h b/keyboards/salicylic_acid3/naked60/keymaps/via/config.h
index 32ec5281b2..32ec5281b2 100644
--- a/keyboards/naked60/keymaps/via/config.h
+++ b/keyboards/salicylic_acid3/naked60/keymaps/via/config.h
diff --git a/keyboards/naked60/keymaps/via/keymap.c b/keyboards/salicylic_acid3/naked60/keymaps/via/keymap.c
index 9921858717..9921858717 100644
--- a/keyboards/naked60/keymaps/via/keymap.c
+++ b/keyboards/salicylic_acid3/naked60/keymaps/via/keymap.c
diff --git a/keyboards/naiping/npminila/keymaps/via/rules.mk b/keyboards/salicylic_acid3/naked60/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/naiping/npminila/keymaps/via/rules.mk
+++ b/keyboards/salicylic_acid3/naked60/keymaps/via/rules.mk
diff --git a/keyboards/naked60/naked60.c b/keyboards/salicylic_acid3/naked60/naked60.c
index d1d46394f6..d1d46394f6 100644
--- a/keyboards/naked60/naked60.c
+++ b/keyboards/salicylic_acid3/naked60/naked60.c
diff --git a/keyboards/salicylic_acid3/naked60/naked60.h b/keyboards/salicylic_acid3/naked60/naked60.h
new file mode 100644
index 0000000000..9ad73df67f
--- /dev/null
+++ b/keyboards/salicylic_acid3/naked60/naked60.h
@@ -0,0 +1,24 @@
+/*
+Copyright 2021 Salicylic_Acid
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General 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"
+
+#ifdef KEYBOARD_salicylic_acid3_naked60_rev1
+ #include "rev1.h"
+#endif
diff --git a/keyboards/salicylic_acid3/naked60/readme.md b/keyboards/salicylic_acid3/naked60/readme.md
new file mode 100644
index 0000000000..e44aa64a44
--- /dev/null
+++ b/keyboards/salicylic_acid3/naked60/readme.md
@@ -0,0 +1,18 @@
+# naked60
+
+![naked60](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20190530/20190530040355.jpg)
+
+This is 60 keys modification Ortholinear keyboard.
+
+Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+Hardware Supported: Naked60BMP PCB, Pro Micro
+Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1360780)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make salicylic_acid3/naked60/rev1:default:avrdude
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/naked60bmp-build-guide)
+[Firmware](https://github.com/Salicylic-acid3/qmk_firmware/tree/master/keyboards/naked60)
diff --git a/keyboards/naked60/rev1/config.h b/keyboards/salicylic_acid3/naked60/rev1/config.h
index b754095011..b754095011 100644
--- a/keyboards/naked60/rev1/config.h
+++ b/keyboards/salicylic_acid3/naked60/rev1/config.h
diff --git a/keyboards/naked60/rev1/rev1.c b/keyboards/salicylic_acid3/naked60/rev1/rev1.c
index d1d46394f6..d1d46394f6 100644
--- a/keyboards/naked60/rev1/rev1.c
+++ b/keyboards/salicylic_acid3/naked60/rev1/rev1.c
diff --git a/keyboards/naked60/rev1/rev1.h b/keyboards/salicylic_acid3/naked60/rev1/rev1.h
index 12798022e9..12798022e9 100644
--- a/keyboards/naked60/rev1/rev1.h
+++ b/keyboards/salicylic_acid3/naked60/rev1/rev1.h
diff --git a/keyboards/naked64/rev1/rules.mk b/keyboards/salicylic_acid3/naked60/rev1/rules.mk
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/naked64/rev1/rules.mk
+++ b/keyboards/salicylic_acid3/naked60/rev1/rules.mk
diff --git a/keyboards/salicylic_acid3/naked60/rules.mk b/keyboards/salicylic_acid3/naked60/rules.mk
new file mode 100644
index 0000000000..1aefc7b595
--- /dev/null
+++ b/keyboards/salicylic_acid3/naked60/rules.mk
@@ -0,0 +1,22 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
+AUDIO_ENABLE = no # Audio output
+
+SPLIT_KEYBOARD = yes
+
+DEFAULT_FOLDER = salicylic_acid3/naked60/rev1
diff --git a/keyboards/treadstone48/.noci b/keyboards/salicylic_acid3/naked64/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/treadstone48/.noci
+++ b/keyboards/salicylic_acid3/naked64/.noci
diff --git a/keyboards/setta21/config.h b/keyboards/salicylic_acid3/naked64/config.h
index cfb6bf4ffc..cfb6bf4ffc 100644
--- a/keyboards/setta21/config.h
+++ b/keyboards/salicylic_acid3/naked64/config.h
diff --git a/keyboards/naked64/info.json b/keyboards/salicylic_acid3/naked64/info.json
index 887f43b087..887f43b087 100644
--- a/keyboards/naked64/info.json
+++ b/keyboards/salicylic_acid3/naked64/info.json
diff --git a/keyboards/naked64/keymaps/default/config.h b/keyboards/salicylic_acid3/naked64/keymaps/default/config.h
index 8c4e1f5129..8c4e1f5129 100644
--- a/keyboards/naked64/keymaps/default/config.h
+++ b/keyboards/salicylic_acid3/naked64/keymaps/default/config.h
diff --git a/keyboards/naked64/keymaps/default/keymap.c b/keyboards/salicylic_acid3/naked64/keymaps/default/keymap.c
index b26044507e..b26044507e 100644
--- a/keyboards/naked64/keymaps/default/keymap.c
+++ b/keyboards/salicylic_acid3/naked64/keymaps/default/keymap.c
diff --git a/keyboards/naked64/keymaps/default/readme.md b/keyboards/salicylic_acid3/naked64/keymaps/default/readme.md
index 66bb965b29..66bb965b29 100644
--- a/keyboards/naked64/keymaps/default/readme.md
+++ b/keyboards/salicylic_acid3/naked64/keymaps/default/readme.md
diff --git a/keyboards/setta21/rev1/rules.mk b/keyboards/salicylic_acid3/naked64/keymaps/default/rules.mk
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/setta21/rev1/rules.mk
+++ b/keyboards/salicylic_acid3/naked64/keymaps/default/rules.mk
diff --git a/keyboards/naked64/keymaps/default_with_setta21/config.h b/keyboards/salicylic_acid3/naked64/keymaps/default_with_setta21/config.h
index c88277da20..c88277da20 100644
--- a/keyboards/naked64/keymaps/default_with_setta21/config.h
+++ b/keyboards/salicylic_acid3/naked64/keymaps/default_with_setta21/config.h
diff --git a/keyboards/naked64/keymaps/default_with_setta21/keymap.c b/keyboards/salicylic_acid3/naked64/keymaps/default_with_setta21/keymap.c
index 01039aaecc..01039aaecc 100644
--- a/keyboards/naked64/keymaps/default_with_setta21/keymap.c
+++ b/keyboards/salicylic_acid3/naked64/keymaps/default_with_setta21/keymap.c
diff --git a/keyboards/naked64/keymaps/default_with_setta21/readme.md b/keyboards/salicylic_acid3/naked64/keymaps/default_with_setta21/readme.md
index 6196d68fe0..6196d68fe0 100644
--- a/keyboards/naked64/keymaps/default_with_setta21/readme.md
+++ b/keyboards/salicylic_acid3/naked64/keymaps/default_with_setta21/readme.md
diff --git a/keyboards/wings42/rev1/rules.mk b/keyboards/salicylic_acid3/naked64/keymaps/default_with_setta21/rules.mk
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/wings42/rev1/rules.mk
+++ b/keyboards/salicylic_acid3/naked64/keymaps/default_with_setta21/rules.mk
diff --git a/keyboards/naked64/keymaps/salicylic/config.h b/keyboards/salicylic_acid3/naked64/keymaps/salicylic/config.h
index 4b3496d856..4b3496d856 100644
--- a/keyboards/naked64/keymaps/salicylic/config.h
+++ b/keyboards/salicylic_acid3/naked64/keymaps/salicylic/config.h
diff --git a/keyboards/naked64/keymaps/salicylic/keymap.c b/keyboards/salicylic_acid3/naked64/keymaps/salicylic/keymap.c
index 40e92393da..40e92393da 100644
--- a/keyboards/naked64/keymaps/salicylic/keymap.c
+++ b/keyboards/salicylic_acid3/naked64/keymaps/salicylic/keymap.c
diff --git a/keyboards/naked64/keymaps/salicylic/readme.md b/keyboards/salicylic_acid3/naked64/keymaps/salicylic/readme.md
index 8b2d812ea4..8b2d812ea4 100644
--- a/keyboards/naked64/keymaps/salicylic/readme.md
+++ b/keyboards/salicylic_acid3/naked64/keymaps/salicylic/readme.md
diff --git a/keyboards/naked64/keymaps/salicylic/rules.mk b/keyboards/salicylic_acid3/naked64/keymaps/salicylic/rules.mk
index e5ddcae8d9..e5ddcae8d9 100644
--- a/keyboards/naked64/keymaps/salicylic/rules.mk
+++ b/keyboards/salicylic_acid3/naked64/keymaps/salicylic/rules.mk
diff --git a/keyboards/naked64/keymaps/salicylic_with_setta21/config.h b/keyboards/salicylic_acid3/naked64/keymaps/salicylic_with_setta21/config.h
index 0761e5b6d3..0761e5b6d3 100644
--- a/keyboards/naked64/keymaps/salicylic_with_setta21/config.h
+++ b/keyboards/salicylic_acid3/naked64/keymaps/salicylic_with_setta21/config.h
diff --git a/keyboards/naked64/keymaps/salicylic_with_setta21/keymap.c b/keyboards/salicylic_acid3/naked64/keymaps/salicylic_with_setta21/keymap.c
index df80e0772b..df80e0772b 100644
--- a/keyboards/naked64/keymaps/salicylic_with_setta21/keymap.c
+++ b/keyboards/salicylic_acid3/naked64/keymaps/salicylic_with_setta21/keymap.c
diff --git a/keyboards/naked64/keymaps/salicylic_with_setta21/readme.md b/keyboards/salicylic_acid3/naked64/keymaps/salicylic_with_setta21/readme.md
index cf09c1a74c..cf09c1a74c 100644
--- a/keyboards/naked64/keymaps/salicylic_with_setta21/readme.md
+++ b/keyboards/salicylic_acid3/naked64/keymaps/salicylic_with_setta21/readme.md
diff --git a/keyboards/naked64/keymaps/salicylic_with_setta21/rules.mk b/keyboards/salicylic_acid3/naked64/keymaps/salicylic_with_setta21/rules.mk
index e5ddcae8d9..e5ddcae8d9 100644
--- a/keyboards/naked64/keymaps/salicylic_with_setta21/rules.mk
+++ b/keyboards/salicylic_acid3/naked64/keymaps/salicylic_with_setta21/rules.mk
diff --git a/keyboards/naked64/naked64.c b/keyboards/salicylic_acid3/naked64/naked64.c
index a2863f0477..a2863f0477 100644
--- a/keyboards/naked64/naked64.c
+++ b/keyboards/salicylic_acid3/naked64/naked64.c
diff --git a/keyboards/salicylic_acid3/naked64/naked64.h b/keyboards/salicylic_acid3/naked64/naked64.h
new file mode 100644
index 0000000000..cb73e2142d
--- /dev/null
+++ b/keyboards/salicylic_acid3/naked64/naked64.h
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "quantum.h"
+
+#ifdef KEYBOARD_salicylic_acid3_naked64_rev1
+ #include "rev1.h"
+#endif
diff --git a/keyboards/salicylic_acid3/naked64/readme.md b/keyboards/salicylic_acid3/naked64/readme.md
new file mode 100644
index 0000000000..ab02be74f5
--- /dev/null
+++ b/keyboards/salicylic_acid3/naked64/readme.md
@@ -0,0 +1,18 @@
+# naked64
+
+![naked64](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20190627/20190627022840.jpg)
+
+This is 64 keys modification Ortholinear keyboard.
+
+Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+Hardware Supported: Naked64SF PCB, Pro Micro
+Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1418693)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make salicylic_acid3/naked64/rev1:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/naked64SF-build-guide)
+[Firmware](https://github.com/Salicylic-acid3/qmk_firmware/tree/master/keyboards/naked64)
diff --git a/keyboards/naked64/rev1/config.h b/keyboards/salicylic_acid3/naked64/rev1/config.h
index b4699a9ca2..b4699a9ca2 100644
--- a/keyboards/naked64/rev1/config.h
+++ b/keyboards/salicylic_acid3/naked64/rev1/config.h
diff --git a/keyboards/naked64/rev1/rev1.c b/keyboards/salicylic_acid3/naked64/rev1/rev1.c
index 520a869e57..520a869e57 100644
--- a/keyboards/naked64/rev1/rev1.c
+++ b/keyboards/salicylic_acid3/naked64/rev1/rev1.c
diff --git a/keyboards/naked64/rev1/rev1.h b/keyboards/salicylic_acid3/naked64/rev1/rev1.h
index 0ac804ee0f..0ac804ee0f 100644
--- a/keyboards/naked64/rev1/rev1.h
+++ b/keyboards/salicylic_acid3/naked64/rev1/rev1.h
diff --git a/keyboards/wings42/rev1_extkeys/rules.mk b/keyboards/salicylic_acid3/naked64/rev1/rules.mk
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/wings42/rev1_extkeys/rules.mk
+++ b/keyboards/salicylic_acid3/naked64/rev1/rules.mk
diff --git a/keyboards/salicylic_acid3/naked64/rules.mk b/keyboards/salicylic_acid3/naked64/rules.mk
new file mode 100644
index 0000000000..db027e3bda
--- /dev/null
+++ b/keyboards/salicylic_acid3/naked64/rules.mk
@@ -0,0 +1,24 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = yes # Mouse keys
+EXTRAKEY_ENABLE = yes # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = yes # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = no # Audio output
+RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
+OLED_ENABLE = no
+USE_I2C = no
+
+SPLIT_KEYBOARD = yes
+
+DEFAULT_FOLDER = salicylic_acid3/naked64/rev1
diff --git a/keyboards/nknl7en/config.h b/keyboards/salicylic_acid3/nknl7en/config.h
index 997971bc96..997971bc96 100644
--- a/keyboards/nknl7en/config.h
+++ b/keyboards/salicylic_acid3/nknl7en/config.h
diff --git a/keyboards/nknl7en/info.json b/keyboards/salicylic_acid3/nknl7en/info.json
index c80ac22769..c80ac22769 100644
--- a/keyboards/nknl7en/info.json
+++ b/keyboards/salicylic_acid3/nknl7en/info.json
diff --git a/keyboards/nknl7en/keymaps/default/config.h b/keyboards/salicylic_acid3/nknl7en/keymaps/default/config.h
index fd96baa819..fd96baa819 100644
--- a/keyboards/nknl7en/keymaps/default/config.h
+++ b/keyboards/salicylic_acid3/nknl7en/keymaps/default/config.h
diff --git a/keyboards/nknl7en/keymaps/default/keymap.c b/keyboards/salicylic_acid3/nknl7en/keymaps/default/keymap.c
index f3ce52e91b..f3ce52e91b 100644
--- a/keyboards/nknl7en/keymaps/default/keymap.c
+++ b/keyboards/salicylic_acid3/nknl7en/keymaps/default/keymap.c
diff --git a/keyboards/nknl7en/keymaps/salicylic/config.h b/keyboards/salicylic_acid3/nknl7en/keymaps/salicylic/config.h
index fd96baa819..fd96baa819 100644
--- a/keyboards/nknl7en/keymaps/salicylic/config.h
+++ b/keyboards/salicylic_acid3/nknl7en/keymaps/salicylic/config.h
diff --git a/keyboards/nknl7en/keymaps/salicylic/keymap.c b/keyboards/salicylic_acid3/nknl7en/keymaps/salicylic/keymap.c
index e7de4e50f0..e7de4e50f0 100644
--- a/keyboards/nknl7en/keymaps/salicylic/keymap.c
+++ b/keyboards/salicylic_acid3/nknl7en/keymaps/salicylic/keymap.c
diff --git a/keyboards/nknl7en/keymaps/via/config.h b/keyboards/salicylic_acid3/nknl7en/keymaps/via/config.h
index fd96baa819..fd96baa819 100644
--- a/keyboards/nknl7en/keymaps/via/config.h
+++ b/keyboards/salicylic_acid3/nknl7en/keymaps/via/config.h
diff --git a/keyboards/nknl7en/keymaps/via/keymap.c b/keyboards/salicylic_acid3/nknl7en/keymaps/via/keymap.c
index f31d06a22b..f31d06a22b 100644
--- a/keyboards/nknl7en/keymaps/via/keymap.c
+++ b/keyboards/salicylic_acid3/nknl7en/keymaps/via/keymap.c
diff --git a/keyboards/nknl7jp/keymaps/via/rules.mk b/keyboards/salicylic_acid3/nknl7en/keymaps/via/rules.mk
index 036bd6d1c3..036bd6d1c3 100644
--- a/keyboards/nknl7jp/keymaps/via/rules.mk
+++ b/keyboards/salicylic_acid3/nknl7en/keymaps/via/rules.mk
diff --git a/keyboards/nknl7en/nknl7en.c b/keyboards/salicylic_acid3/nknl7en/nknl7en.c
index 1f06cb7336..1f06cb7336 100644
--- a/keyboards/nknl7en/nknl7en.c
+++ b/keyboards/salicylic_acid3/nknl7en/nknl7en.c
diff --git a/keyboards/nknl7en/nknl7en.h b/keyboards/salicylic_acid3/nknl7en/nknl7en.h
index 945e42956f..945e42956f 100644
--- a/keyboards/nknl7en/nknl7en.h
+++ b/keyboards/salicylic_acid3/nknl7en/nknl7en.h
diff --git a/keyboards/salicylic_acid3/nknl7en/readme.md b/keyboards/salicylic_acid3/nknl7en/readme.md
new file mode 100644
index 0000000000..07f87e3e5e
--- /dev/null
+++ b/keyboards/salicylic_acid3/nknl7en/readme.md
@@ -0,0 +1,17 @@
+# nknl7en
+
+![nknl7en](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20201113/20201113010013.png)
+
+This is 70 keys Custom keyboard.
+
+* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+* Hardware Supported: nknl7 PCB, Pro Micro
+* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/2672651)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make salicylic_acid3/nknl7en:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/nknl7-build-guide)
diff --git a/keyboards/nknl7en/rules.mk b/keyboards/salicylic_acid3/nknl7en/rules.mk
index aba3644c9e..aba3644c9e 100644
--- a/keyboards/nknl7en/rules.mk
+++ b/keyboards/salicylic_acid3/nknl7en/rules.mk
diff --git a/keyboards/nknl7jp/config.h b/keyboards/salicylic_acid3/nknl7jp/config.h
index 7fb3c0e9c9..7fb3c0e9c9 100644
--- a/keyboards/nknl7jp/config.h
+++ b/keyboards/salicylic_acid3/nknl7jp/config.h
diff --git a/keyboards/nknl7jp/info.json b/keyboards/salicylic_acid3/nknl7jp/info.json
index c074d9019f..c074d9019f 100644
--- a/keyboards/nknl7jp/info.json
+++ b/keyboards/salicylic_acid3/nknl7jp/info.json
diff --git a/keyboards/nknl7jp/keymaps/default/config.h b/keyboards/salicylic_acid3/nknl7jp/keymaps/default/config.h
index fd96baa819..fd96baa819 100644
--- a/keyboards/nknl7jp/keymaps/default/config.h
+++ b/keyboards/salicylic_acid3/nknl7jp/keymaps/default/config.h
diff --git a/keyboards/nknl7jp/keymaps/default/keymap.c b/keyboards/salicylic_acid3/nknl7jp/keymaps/default/keymap.c
index 0f90eb883c..0f90eb883c 100644
--- a/keyboards/nknl7jp/keymaps/default/keymap.c
+++ b/keyboards/salicylic_acid3/nknl7jp/keymaps/default/keymap.c
diff --git a/keyboards/nknl7jp/keymaps/salicylic/config.h b/keyboards/salicylic_acid3/nknl7jp/keymaps/salicylic/config.h
index 653695d629..653695d629 100644
--- a/keyboards/nknl7jp/keymaps/salicylic/config.h
+++ b/keyboards/salicylic_acid3/nknl7jp/keymaps/salicylic/config.h
diff --git a/keyboards/nknl7jp/keymaps/salicylic/keymap.c b/keyboards/salicylic_acid3/nknl7jp/keymaps/salicylic/keymap.c
index 65f95f0173..65f95f0173 100644
--- a/keyboards/nknl7jp/keymaps/salicylic/keymap.c
+++ b/keyboards/salicylic_acid3/nknl7jp/keymaps/salicylic/keymap.c
diff --git a/keyboards/nknl7jp/keymaps/via/config.h b/keyboards/salicylic_acid3/nknl7jp/keymaps/via/config.h
index fd96baa819..fd96baa819 100644
--- a/keyboards/nknl7jp/keymaps/via/config.h
+++ b/keyboards/salicylic_acid3/nknl7jp/keymaps/via/config.h
diff --git a/keyboards/nknl7jp/keymaps/via/keymap.c b/keyboards/salicylic_acid3/nknl7jp/keymaps/via/keymap.c
index 660fb2a159..660fb2a159 100644
--- a/keyboards/nknl7jp/keymaps/via/keymap.c
+++ b/keyboards/salicylic_acid3/nknl7jp/keymaps/via/keymap.c
diff --git a/keyboards/rainkeeb/keymaps/via/rules.mk b/keyboards/salicylic_acid3/nknl7jp/keymaps/via/rules.mk
index 036bd6d1c3..036bd6d1c3 100644
--- a/keyboards/rainkeeb/keymaps/via/rules.mk
+++ b/keyboards/salicylic_acid3/nknl7jp/keymaps/via/rules.mk
diff --git a/keyboards/nknl7jp/nknl7jp.c b/keyboards/salicylic_acid3/nknl7jp/nknl7jp.c
index 0395a3b678..0395a3b678 100644
--- a/keyboards/nknl7jp/nknl7jp.c
+++ b/keyboards/salicylic_acid3/nknl7jp/nknl7jp.c
diff --git a/keyboards/nknl7jp/nknl7jp.h b/keyboards/salicylic_acid3/nknl7jp/nknl7jp.h
index 3984ac7788..3984ac7788 100644
--- a/keyboards/nknl7jp/nknl7jp.h
+++ b/keyboards/salicylic_acid3/nknl7jp/nknl7jp.h
diff --git a/keyboards/salicylic_acid3/nknl7jp/readme.md b/keyboards/salicylic_acid3/nknl7jp/readme.md
new file mode 100644
index 0000000000..b2f375aef8
--- /dev/null
+++ b/keyboards/salicylic_acid3/nknl7jp/readme.md
@@ -0,0 +1,17 @@
+# nknl7jp
+
+![nknl7jp](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20201113/20201113010013.png)
+
+This is 73 keys Custom keyboard.
+
+* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+* Hardware Supported: nknl7jp PCB, Pro Micro
+* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/2672651)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make salicylic_acid3/nknl7jp:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/nknl7-build-guide)
diff --git a/keyboards/nknl7jp/rules.mk b/keyboards/salicylic_acid3/nknl7jp/rules.mk
index aba3644c9e..aba3644c9e 100644
--- a/keyboards/nknl7jp/rules.mk
+++ b/keyboards/salicylic_acid3/nknl7jp/rules.mk
diff --git a/keyboards/wings42/config.h b/keyboards/salicylic_acid3/setta21/config.h
index cfb6bf4ffc..cfb6bf4ffc 100644
--- a/keyboards/wings42/config.h
+++ b/keyboards/salicylic_acid3/setta21/config.h
diff --git a/keyboards/setta21/info.json b/keyboards/salicylic_acid3/setta21/info.json
index 46c06613a8..46c06613a8 100644
--- a/keyboards/setta21/info.json
+++ b/keyboards/salicylic_acid3/setta21/info.json
diff --git a/keyboards/setta21/keymaps/default/config.h b/keyboards/salicylic_acid3/setta21/keymaps/default/config.h
index e35fe2ccd7..e35fe2ccd7 100644
--- a/keyboards/setta21/keymaps/default/config.h
+++ b/keyboards/salicylic_acid3/setta21/keymaps/default/config.h
diff --git a/keyboards/setta21/keymaps/default/keymap.c b/keyboards/salicylic_acid3/setta21/keymaps/default/keymap.c
index fa33c08f26..fa33c08f26 100644
--- a/keyboards/setta21/keymaps/default/keymap.c
+++ b/keyboards/salicylic_acid3/setta21/keymaps/default/keymap.c
diff --git a/keyboards/setta21/keymaps/default/readme.md b/keyboards/salicylic_acid3/setta21/keymaps/default/readme.md
index 1028d848c5..1028d848c5 100644
--- a/keyboards/setta21/keymaps/default/readme.md
+++ b/keyboards/salicylic_acid3/setta21/keymaps/default/readme.md
diff --git a/keyboards/setta21/keymaps/salicylic/config.h b/keyboards/salicylic_acid3/setta21/keymaps/salicylic/config.h
index 06e23ba7a3..06e23ba7a3 100644
--- a/keyboards/setta21/keymaps/salicylic/config.h
+++ b/keyboards/salicylic_acid3/setta21/keymaps/salicylic/config.h
diff --git a/keyboards/setta21/keymaps/salicylic/keymap.c b/keyboards/salicylic_acid3/setta21/keymaps/salicylic/keymap.c
index 06fa89c9c7..06fa89c9c7 100644
--- a/keyboards/setta21/keymaps/salicylic/keymap.c
+++ b/keyboards/salicylic_acid3/setta21/keymaps/salicylic/keymap.c
diff --git a/keyboards/setta21/keymaps/salicylic/readme.md b/keyboards/salicylic_acid3/setta21/keymaps/salicylic/readme.md
index ad27736d2b..ad27736d2b 100644
--- a/keyboards/setta21/keymaps/salicylic/readme.md
+++ b/keyboards/salicylic_acid3/setta21/keymaps/salicylic/readme.md
diff --git a/keyboards/setta21/keymaps/salicylic/rules.mk b/keyboards/salicylic_acid3/setta21/keymaps/salicylic/rules.mk
index 69864a3166..69864a3166 100644
--- a/keyboards/setta21/keymaps/salicylic/rules.mk
+++ b/keyboards/salicylic_acid3/setta21/keymaps/salicylic/rules.mk
diff --git a/keyboards/salicylic_acid3/setta21/readme.md b/keyboards/salicylic_acid3/setta21/readme.md
new file mode 100644
index 0000000000..25027b7281
--- /dev/null
+++ b/keyboards/salicylic_acid3/setta21/readme.md
@@ -0,0 +1,17 @@
+# setta21
+
+![setta21](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20190315/20190315022018.jpg)
+
+This is 21 keys tenkeypad.
+
+* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
+* Hardware Supported: setta21 PCB, Pro Micro
+* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1271667)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make salicylic_acid3/setta21/rev1:default
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
+
+[Build guide](https://salicylic-acid3.hatenablog.com/entry/setta21-build-guide)
diff --git a/keyboards/treadstone48/rev1/.noci b/keyboards/salicylic_acid3/setta21/rev1/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/treadstone48/rev1/.noci
+++ b/keyboards/salicylic_acid3/setta21/rev1/.noci
diff --git a/keyboards/setta21/rev1/config.h b/keyboards/salicylic_acid3/setta21/rev1/config.h
index 742a8d73d0..742a8d73d0 100644
--- a/keyboards/setta21/rev1/config.h
+++ b/keyboards/salicylic_acid3/setta21/rev1/config.h
diff --git a/keyboards/setta21/rev1/rev1.c b/keyboards/salicylic_acid3/setta21/rev1/rev1.c
index b377452770..b377452770 100644
--- a/keyboards/setta21/rev1/rev1.c
+++ b/keyboards/salicylic_acid3/setta21/rev1/rev1.c
diff --git a/keyboards/setta21/rev1/rev1.h b/keyboards/salicylic_acid3/setta21/rev1/rev1.h
index 772c843c57..772c843c57 100644
--- a/keyboards/setta21/rev1/rev1.h
+++ b/keyboards/salicylic_acid3/setta21/rev1/rev1.h
diff --git a/keyboards/wings42/rev2/rules.mk b/keyboards/salicylic_acid3/setta21/rev1/rules.mk
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/wings42/rev2/rules.mk
+++ b/keyboards/salicylic_acid3/setta21/rev1/rules.mk
diff --git a/keyboards/salicylic_acid3/setta21/rules.mk b/keyboards/salicylic_acid3/setta21/rules.mk
new file mode 100644
index 0000000000..c7920fdfe8
--- /dev/null
+++ b/keyboards/salicylic_acid3/setta21/rules.mk
@@ -0,0 +1,26 @@
+# MCU name
+MCU = atmega32u4
+
+# Bootloader selection
+BOOTLOADER = caterina
+
+# Build Options
+# change yes to no to disable
+#
+BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
+MOUSEKEY_ENABLE = no # Mouse keys
+EXTRAKEY_ENABLE = no # Audio control and System control
+CONSOLE_ENABLE = no # Console for debug
+COMMAND_ENABLE = no # Commands for debug and configuration
+NKRO_ENABLE = no # Enable N-Key Rollover
+BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
+AUDIO_ENABLE = no # Audio output
+RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
+OLED_ENABLE = no
+USE_I2C = no
+RGB_MATRIX_ENABLE = no
+RGB_MATRIX_DRIVER = WS2812
+
+DEFAULT_FOLDER = salicylic_acid3/setta21/rev1
+
+LAYOUTS = numpad_6x4
diff --git a/keyboards/setta21/setta21.c b/keyboards/salicylic_acid3/setta21/setta21.c
index 73c07682f7..73c07682f7 100644
--- a/keyboards/setta21/setta21.c
+++ b/keyboards/salicylic_acid3/setta21/setta21.c
diff --git a/keyboards/salicylic_acid3/setta21/setta21.h b/keyboards/salicylic_acid3/setta21/setta21.h
new file mode 100644
index 0000000000..9e5b17e2c3
--- /dev/null
+++ b/keyboards/salicylic_acid3/setta21/setta21.h
@@ -0,0 +1,7 @@
+#pragma once
+
+#include "quantum.h"
+
+#ifdef KEYBOARD_salicylic_acid3_setta21_rev1
+ #include "rev1.h"
+#endif
diff --git a/keyboards/seigaiha/readme.md b/keyboards/seigaiha/readme.md
deleted file mode 100644
index fb0e8571ae..0000000000
--- a/keyboards/seigaiha/readme.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# Seigaiha
-
-![Seigaiha](https://i.imgur.com/GCGyOmph.jpg)
-
-An alice layout kit with only through hole components.
-
-* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
-* Hardware Supported: ATMEGA328p with vusb [PCB](https://github.com/yiancar/seigaiha_pcb)
-* Hardware Availability: https://mykeyboard.eu/, https://novelkeys.xyz
-
-Make example for this keyboard (after setting up your build environment):
-
- make seigaiha:default
-
-Flashing example for this keyboard:
-
- make seigaiha:default:flash
-
-Bootloader:
-use usbasploader from HSGW's repository.
-https://github.com/hsgw/USBaspLoader/tree/plaid
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/sekigon/grs_70ec/matrix.c b/keyboards/sekigon/grs_70ec/matrix.c
index 98b2347937..926ed6f813 100644
--- a/keyboards/sekigon/grs_70ec/matrix.c
+++ b/keyboards/sekigon/grs_70ec/matrix.c
@@ -70,50 +70,3 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) {
return updated;
}
-
-bool matrix_post_scan(void) {
- bool changed = false;
- if (is_keyboard_master()) {
- static uint8_t error_count;
-
- matrix_row_t slave_matrix[ROWS_PER_HAND] = {0};
- if (!transport_master(matrix + thatHand, slave_matrix)) {
- error_count++;
-
- if (error_count > ERROR_DISCONNECT_COUNT) {
- // reset other half if disconnected
- dprintf("Error: disconnect split half\n");
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- matrix[thatHand + i] = 0;
- slave_matrix[i] = 0;
- }
-
- changed = true;
- }
- } else {
- error_count = 0;
-
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- if (matrix[thatHand + i] != slave_matrix[i]) {
- matrix[thatHand + i] = slave_matrix[i];
- changed = true;
- }
- }
- }
-
- matrix_scan_quantum();
- } else {
- transport_slave(matrix + thatHand, matrix + thisHand);
-
- matrix_slave_scan_user();
- }
- return changed;
-}
-
-uint8_t matrix_scan(void) {
- bool changed = matrix_scan_custom(raw_matrix) || matrix_post_scan();
-
- debounce(raw_matrix, matrix + thisHand, ROWS_PER_HAND, changed);
-
- return changed;
-}
diff --git a/keyboards/setta21/readme.md b/keyboards/setta21/readme.md
deleted file mode 100644
index c940079997..0000000000
--- a/keyboards/setta21/readme.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# setta21
-
-![setta21](https://cdn-ak.f.st-hatena.com/images/fotolife/S/Salicylic_acid3/20190315/20190315022018.jpg)
-
-This is 21 keys tenkeypad.
-
-* Keyboard Maintainer: [Salicylic_acid3](https://github.com/Salicylic-acid3)
-* Hardware Supported: setta21 PCB, Pro Micro
-* Hardware Availability: [PCB & Case Data](https://github.com/Salicylic-acid3/PCB_Data), [Booth Shop](https://salicylic-acid3.booth.pm/items/1271667)
-
-Make example for this keyboard (after setting up your build environment):
-
- make setta21:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://salicylic-acid3.hatenablog.com/entry/setta21-build-guide)
diff --git a/keyboards/setta21/rules.mk b/keyboards/setta21/rules.mk
deleted file mode 100644
index e31a7b5c7a..0000000000
--- a/keyboards/setta21/rules.mk
+++ /dev/null
@@ -1,26 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = caterina
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys
-EXTRAKEY_ENABLE = no # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-AUDIO_ENABLE = no # Audio output
-RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.
-OLED_ENABLE = no
-USE_I2C = no
-RGB_MATRIX_ENABLE = no
-RGB_MATRIX_DRIVER = WS2812
-
-DEFAULT_FOLDER = setta21/rev1
-
-LAYOUTS = numpad_6x4
diff --git a/keyboards/setta21/setta21.h b/keyboards/setta21/setta21.h
deleted file mode 100644
index 0409f6cbc2..0000000000
--- a/keyboards/setta21/setta21.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#pragma once
-
-#include "quantum.h"
-
-#ifdef KEYBOARD_setta21_rev1
- #include "rev1.h"
-#endif
diff --git a/keyboards/sirius/uni660/rev1/config.h b/keyboards/sirius/uni660/rev1/config.h
index 91d7c5d7a3..f9815844cb 100644
--- a/keyboards/sirius/uni660/rev1/config.h
+++ b/keyboards/sirius/uni660/rev1/config.h
@@ -57,13 +57,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
-//UART settings for communication with the RF microcontroller
-#define SERIAL_UART_BAUD 1000000
-#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
-#define SERIAL_UART_INIT_CUSTOM \
- /* enable TX and RX */ \
- UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
- /* 8-bit data */ \
- UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
-
#define DYNAMIC_KEYMAP_LAYER_COUNT 4
diff --git a/keyboards/sirius/uni660/rev1/matrix.c b/keyboards/sirius/uni660/rev1/matrix.c
index 2db6767a46..919db5c80d 100644
--- a/keyboards/sirius/uni660/rev1/matrix.c
+++ b/keyboards/sirius/uni660/rev1/matrix.c
@@ -15,83 +15,21 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <stdint.h>
-#include <stdbool.h>
-#if defined(__AVR__)
-#include <avr/io.h>
-#endif
-#include "wait.h"
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "timer.h"
-#include "debounce.h"
-#include "protocol/serial.h"
-
-#if (MATRIX_COLS <= 8)
-# define print_matrix_header() print("\nr/c 01234567\n")
-# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop(matrix[i])
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop16(matrix[i])
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop32(matrix[i])
-# define ROW_SHIFTER ((uint32_t)1)
-#endif
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void) {
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void) {
- return MATRIX_COLS;
-}
+#include "quantum.h"
+#include "matrix.h"
+#include "uart.h"
-void matrix_init(void) {
- debounce_init(MATRIX_ROWS);
- matrix_init_quantum();
- serial_init();
+void matrix_init_custom(void) {
+ uart_init(1000000);
}
-uint8_t matrix_scan(void)
-{
- bool matrix_has_changed = false;
-
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
uint32_t timeout = 0;
+ bool changed = false;
//the s character requests the RF slave to send the matrix
- SERIAL_UART_DATA = 's';
+ uart_write('s');
//trust the external keystates entirely, erase the last data
uint8_t uart_data[17] = {0};
@@ -101,60 +39,27 @@ uint8_t matrix_scan(void)
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
- while(!SERIAL_UART_RXD_PRESENT){
+ while (!uart_available()) {
timeout++;
- if (timeout > 10000){
+ if (timeout > 10000) {
break;
}
}
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
//check for the end packet, the key state bytes use the LSBs, so 0xE0
//will only show up here if the correct bytes were recieved
- if (uart_data[10] == 0xE0)
- {
+ if (uart_data[10] == 0xE0) {
//shifting and transferring the keystates to the QMK matrix variable
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 8;
+ matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 8;
+ if (current_matrix[i] != current_row) {
+ changed = true;
+ }
+ current_matrix[i] = current_row;
}
}
- debounce(matrix, matrix, MATRIX_ROWS, matrix_has_changed);
-
- matrix_scan_quantum();
-
- return matrix_has_changed;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & ((matrix_row_t)1<<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print_matrix_header();
-
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row); print(": ");
- print_matrix_row(row);
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += matrix_bitpop(i);
- }
- return count;
+ return changed;
}
diff --git a/keyboards/sirius/uni660/rev1/rules.mk b/keyboards/sirius/uni660/rev1/rules.mk
index 836bf6b442..71cc3efd92 100644
--- a/keyboards/sirius/uni660/rev1/rules.mk
+++ b/keyboards/sirius/uni660/rev1/rules.mk
@@ -17,7 +17,8 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
UNICODE_ENABLE = yes # Unicode
-CUSTOM_MATRIX = yes
+CUSTOM_MATRIX = lite
# project specific files
-SRC += matrix.c serial_uart.c
+SRC += matrix.c
+QUANTUM_LIB_SRC += uart.c
diff --git a/keyboards/sirius/uni660/rev2/ansi/config.h b/keyboards/sirius/uni660/rev2/ansi/config.h
index 13e33ebf11..8777dc4011 100644
--- a/keyboards/sirius/uni660/rev2/ansi/config.h
+++ b/keyboards/sirius/uni660/rev2/ansi/config.h
@@ -57,13 +57,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
-//UART settings for communication with the RF microcontroller
-#define SERIAL_UART_BAUD 1000000
-#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
-#define SERIAL_UART_INIT_CUSTOM \
- /* enable TX and RX */ \
- UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
- /* 8-bit data */ \
- UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
-
#define DYNAMIC_KEYMAP_LAYER_COUNT 4
diff --git a/keyboards/sirius/uni660/rev2/iso/config.h b/keyboards/sirius/uni660/rev2/iso/config.h
index 3283f0cd67..763230dca8 100644
--- a/keyboards/sirius/uni660/rev2/iso/config.h
+++ b/keyboards/sirius/uni660/rev2/iso/config.h
@@ -57,13 +57,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
-//UART settings for communication with the RF microcontroller
-#define SERIAL_UART_BAUD 1000000
-#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
-#define SERIAL_UART_INIT_CUSTOM \
- /* enable TX and RX */ \
- UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
- /* 8-bit data */ \
- UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
-
#define DYNAMIC_KEYMAP_LAYER_COUNT 4
diff --git a/keyboards/sirius/uni660/rev2/matrix.c b/keyboards/sirius/uni660/rev2/matrix.c
index 2db6767a46..919db5c80d 100644
--- a/keyboards/sirius/uni660/rev2/matrix.c
+++ b/keyboards/sirius/uni660/rev2/matrix.c
@@ -15,83 +15,21 @@ GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include <stdint.h>
-#include <stdbool.h>
-#if defined(__AVR__)
-#include <avr/io.h>
-#endif
-#include "wait.h"
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "timer.h"
-#include "debounce.h"
-#include "protocol/serial.h"
-
-#if (MATRIX_COLS <= 8)
-# define print_matrix_header() print("\nr/c 01234567\n")
-# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop(matrix[i])
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop16(matrix[i])
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop32(matrix[i])
-# define ROW_SHIFTER ((uint32_t)1)
-#endif
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t matrix[MATRIX_ROWS];
-
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void) {
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void) {
- return MATRIX_COLS;
-}
+#include "quantum.h"
+#include "matrix.h"
+#include "uart.h"
-void matrix_init(void) {
- debounce_init(MATRIX_ROWS);
- matrix_init_quantum();
- serial_init();
+void matrix_init_custom(void) {
+ uart_init(1000000);
}
-uint8_t matrix_scan(void)
-{
- bool matrix_has_changed = false;
-
+bool matrix_scan_custom(matrix_row_t current_matrix[]) {
uint32_t timeout = 0;
+ bool changed = false;
//the s character requests the RF slave to send the matrix
- SERIAL_UART_DATA = 's';
+ uart_write('s');
//trust the external keystates entirely, erase the last data
uint8_t uart_data[17] = {0};
@@ -101,60 +39,27 @@ uint8_t matrix_scan(void)
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
- while(!SERIAL_UART_RXD_PRESENT){
+ while (!uart_available()) {
timeout++;
- if (timeout > 10000){
+ if (timeout > 10000) {
break;
}
}
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
//check for the end packet, the key state bytes use the LSBs, so 0xE0
//will only show up here if the correct bytes were recieved
- if (uart_data[10] == 0xE0)
- {
+ if (uart_data[10] == 0xE0) {
//shifting and transferring the keystates to the QMK matrix variable
for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- matrix[i] = (uint16_t) uart_data[i*2] | (uint16_t) uart_data[i*2+1] << 8;
+ matrix_row_t current_row = (uint16_t) uart_data[i * 2] | (uint16_t) uart_data[i * 2 + 1] << 8;
+ if (current_matrix[i] != current_row) {
+ changed = true;
+ }
+ current_matrix[i] = current_row;
}
}
- debounce(matrix, matrix, MATRIX_ROWS, matrix_has_changed);
-
- matrix_scan_quantum();
-
- return matrix_has_changed;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & ((matrix_row_t)1<<col));
-}
-
-inline
-matrix_row_t matrix_get_row(uint8_t row)
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print_matrix_header();
-
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row); print(": ");
- print_matrix_row(row);
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += matrix_bitpop(i);
- }
- return count;
+ return changed;
}
diff --git a/keyboards/sirius/uni660/rev2/rules.mk b/keyboards/sirius/uni660/rev2/rules.mk
index 0abebb07c6..850c2a2e35 100644
--- a/keyboards/sirius/uni660/rev2/rules.mk
+++ b/keyboards/sirius/uni660/rev2/rules.mk
@@ -17,9 +17,10 @@ BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
UNICODE_ENABLE = yes # Unicode
-CUSTOM_MATRIX = yes
+CUSTOM_MATRIX = lite
# project specific files
-SRC += matrix.c serial_uart.c
+SRC += matrix.c
+QUANTUM_LIB_SRC += uart.c
DEFAULT_FOLDER = sirius/uni660/rev2/ansi
diff --git a/keyboards/sirius/unigo66/custom_matrix.cpp b/keyboards/sirius/unigo66/custom_matrix.cpp
index fba107c7cb..dfcf82c779 100644
--- a/keyboards/sirius/unigo66/custom_matrix.cpp
+++ b/keyboards/sirius/unigo66/custom_matrix.cpp
@@ -172,10 +172,6 @@ extern "C"
return 1;
}
- bool matrix_is_modified(void) {
- return matrix_is_mod;
- }
-
bool matrix_is_on(uint8_t row, uint8_t col) {
uint8_t code = CODE(row, col);
diff --git a/keyboards/sixkeyboard/matrix.c b/keyboards/sixkeyboard/matrix.c
index 64b46e9b0c..a6b28f3a12 100644
--- a/keyboards/sixkeyboard/matrix.c
+++ b/keyboards/sixkeyboard/matrix.c
@@ -114,11 +114,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/spiderisland/winry25tc/readme.md b/keyboards/spiderisland/winry25tc/readme.md
deleted file mode 100644
index 45ba0bd5a4..0000000000
--- a/keyboards/spiderisland/winry25tc/readme.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# SpiderIsland 25-key RGB Backlight Hot Swap Mechanical Keyboard
-
-Keyboard from [SpiderIsland on AliExpress](https://a.aliexpress.com/_dVJsSpR). Seller provides [kbfirmware](https://kbfirmware.com/) JSON config that was converted to QMK.
-
-* Keyboard Maintainer: [andrzejressel](https://github.com/andrzejressel)
-* Hardware Availability: https://aliexpress.com/item/1005001523579896.html
-
-Make example for this keyboard (after setting up your build environment):
-
- make spiderisland/winry25tc:default
-
-**Reset Key**: Located on the other side of the keyboard.
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). \ No newline at end of file
diff --git a/keyboards/splitreus62/readme.md b/keyboards/splitreus62/readme.md
deleted file mode 100644
index 34fda47535..0000000000
--- a/keyboards/splitreus62/readme.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# splitreus62
-
-A split version of the [Atreus62](https://github.com/profet23/atreus62) by Profet23, which itself is based on Phil Hagelberg's [Atreus](https://github.com/technomancy/atreus). You can copy keymaps from Atreus62 and use them with this keyboard.
-
-* Keyboard Maintainer: [NaCly](https://github.com/Na-Cly)
-* Hardware Supported: splitreus62 PCBs, Pro Micro
-* Hardware Availability: https://github.com/Na-Cly/splitreus62
-
-Make example for this keyboard (after setting up your build environment):
-
- make splitreus62:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/standaside/readme.md b/keyboards/standaside/readme.md
deleted file mode 100644
index ca1cfb2763..0000000000
--- a/keyboards/standaside/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Stand Aside
-
-![Stand Aside](https://i.imgur.com/X6Katar.png)
-
-A compact 60% keyboard designed by Fate Everywhere. Born out of the desire for a Planck with a numpad for technical work. Available for sale (kit and completed) once the store comes up.
-
-Keyboard Maintainer: [Fate Everywhere](https://github.com/fateeverywhere)
-Hardware Supported: Mark 3 Stand Aside.
-Hardware Availability: Seven Store (https://store.7storm.org).
-
-Make example for this keyboard (after setting up your build environment):
-
- make standaside: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/steal_this_keyboard/readme.md b/keyboards/steal_this_keyboard/readme.md
deleted file mode 100644
index 395487f7b3..0000000000
--- a/keyboards/steal_this_keyboard/readme.md
+++ /dev/null
@@ -1,11 +0,0 @@
-# steal this keyboard!
-
-A split 34 keys column staggered keyboard named and decorated after the System of a Down album Steal This Album. All PCB files are available on the [project's github page](https://github.com/obosob/steal_this_keyboard)
-
-* Keyboard Maintainer: [Obosob](https://github.com/obosob)
-
-Make examples for this keyboard (after setting up your build environment):
-
- make steal_this_keyboard: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/suihankey/readme.md b/keyboards/suihankey/readme.md
deleted file mode 100644
index 29d82323d3..0000000000
--- a/keyboards/suihankey/readme.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# suihankey
-
-![suihankey](https://i.gyazo.com/f798c5967f2ac457dd520ab8ff83b6ac.jpg)
-
-Compact with only 36 keys is a concept keyboard.
-Supports OLED and RGBLED (optional)
-
-
-
-Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
-Hardware Supported: suihankeyboard_alpha, promicro
-Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
-
-Make example for this keyboard (after setting up your build environment):
-
- make suihankey: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/suihankey/rules.mk b/keyboards/suihankey/rules.mk
deleted file mode 100644
index 8e1e7f7856..0000000000
--- a/keyboards/suihankey/rules.mk
+++ /dev/null
@@ -1,23 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = atmel-dfu
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys
-EXTRAKEY_ENABLE = no # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
-AUDIO_ENABLE = no # Audio output
-OLED_ENABLE = yes
-OLED_DRIVER = SSD1306
-SPLIT_KEYBOARD = no
-
-DEFAULT_FOLDER = suihankey/rev1
diff --git a/keyboards/suihankey/split/alpha/readme.md b/keyboards/suihankey/split/alpha/readme.md
deleted file mode 100644
index 2ea1503eb3..0000000000
--- a/keyboards/suihankey/split/alpha/readme.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# suihankey_alpha
-
-![suihankey_alpha](https://i.gyazo.com/f798c5967f2ac457dd520ab8ff83b6ac.jpg)
-
-Compact with only 36 keys is a concept keyboard.
-Supports OLED and RGBLED (optional)
-
-
-
-Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
-Hardware Supported: suihankey_alphaboard_alpha, promicro
-Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
-
-Make example for this keyboard (after setting up your build environment):
-
- make suihankey/alpha: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/suihankey/split/readme.md b/keyboards/suihankey/split/readme.md
deleted file mode 100644
index 34d30580d1..0000000000
--- a/keyboards/suihankey/split/readme.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# suihankey split
-
-![suihankey](https://i.gyazo.com/f798c5967f2ac457dd520ab8ff83b6ac.jpg)
-
-Compact with only 36 keys is a concept keyboard.
-Supports OLED and RGBLED (optional)
-
-
-
-Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
-Hardware Supported: suihankeyboard_alpha, promicro
-Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
-
-Make example for this keyboard (after setting up your build environment):
-
- make suihankey/split: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/suihankey/split/rev1/readme.md b/keyboards/suihankey/split/rev1/readme.md
deleted file mode 100644
index f7c4bce166..0000000000
--- a/keyboards/suihankey/split/rev1/readme.md
+++ /dev/null
@@ -1,18 +0,0 @@
-# suihankey_rev1
-
-![suihankey_rev1](https://i.gyazo.com/f798c5967f2ac457dd520ab8ff83b6ac.jpg)
-
-Compact with only 36 keys is a concept keyboard.
-Supports OLED and RGBLED (optional)
-
-
-
-Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
-Hardware Supported: suihankey_rev1board_rev1, promicro
-Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
-
-Make example for this keyboard (after setting up your build environment):
-
- make suihankey/rev1:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/suihankey/split/rules.mk b/keyboards/suihankey/split/rules.mk
deleted file mode 100644
index f0bdf744ee..0000000000
--- a/keyboards/suihankey/split/rules.mk
+++ /dev/null
@@ -1,4 +0,0 @@
-OLED_ENABLE = no
-SPLIT_KEYBOARD = yes
-
-DEFAULT_FOLDER = suihankey/split/rev1
diff --git a/keyboards/sx60/matrix.c b/keyboards/sx60/matrix.c
index b7dc25425d..231e1c8836 100644
--- a/keyboards/sx60/matrix.c
+++ b/keyboards/sx60/matrix.c
@@ -172,14 +172,6 @@ uint8_t matrix_scan(void)
return 1;
}
-bool matrix_is_modified(void)
-{
-#if (DEBOUNCE > 0)
- if (debouncing) return false;
-#endif
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/keyboards/telophase/config.h b/keyboards/telophase/config.h
index 51718da9d4..837bb8ab9b 100644
--- a/keyboards/telophase/config.h
+++ b/keyboards/telophase/config.h
@@ -72,12 +72,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* disable these deprecated features by default */
#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
-
-// UART settings for communication with the RF microcontroller
-#define SERIAL_UART_BAUD 1000000
-#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
-#define SERIAL_UART_INIT_CUSTOM \
- /* enable TX and RX */ \
- UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
- /* 8-bit data */ \
- UCSR1C = _BV(UCSZ11) | _BV(UCSZ10);
diff --git a/keyboards/telophase/matrix.c b/keyboards/telophase/matrix.c
index a153dd4bf1..44b7e4c9e9 100644
--- a/keyboards/telophase/matrix.c
+++ b/keyboards/telophase/matrix.c
@@ -18,10 +18,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "quantum.h"
#include "matrix.h"
-#include "protocol/serial.h"
+#include "uart.h"
void matrix_init_custom(void) {
- serial_init();
+ uart_init(1000000);
}
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
@@ -29,7 +29,7 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) {
bool changed = false;
//the s character requests the RF slave to send the matrix
- SERIAL_UART_DATA = 's';
+ uart_write('s');
//trust the external keystates entirely, erase the last data
uint8_t uart_data[13] = {0};
@@ -39,13 +39,13 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) {
//wait for the serial data, timeout if it's been too long
//this only happened in testing with a loose wire, but does no
//harm to leave it in here
- while (!SERIAL_UART_RXD_PRESENT) {
+ while (!uart_available()) {
timeout++;
if (timeout > 10000) {
break;
}
}
- uart_data[i] = SERIAL_UART_DATA;
+ uart_data[i] = uart_read();
}
//check for the end packet, the key state bytes use the LSBs, so 0xE0
diff --git a/keyboards/telophase/rules.mk b/keyboards/telophase/rules.mk
index c3a8aaf79f..41a6ee25f5 100644
--- a/keyboards/telophase/rules.mk
+++ b/keyboards/telophase/rules.mk
@@ -19,7 +19,8 @@ AUDIO_ENABLE = no # Audio output
CUSTOM_MATRIX = lite
# project specific files
-SRC += matrix.c serial_uart.c
+SRC += matrix.c
+QUANTUM_LIB_SRC += uart.c
# Disable unsupported hardware
RGBLIGHT_SUPPORTED = no
diff --git a/keyboards/tgr/jane/v2ce/rules.mk b/keyboards/tgr/jane/v2ce/rules.mk
index 0a865321a6..8fcc8d911f 100644
--- a/keyboards/tgr/jane/v2ce/rules.mk
+++ b/keyboards/tgr/jane/v2ce/rules.mk
@@ -2,7 +2,7 @@
MCU = atmega32a
# Bootloader selection
-BOOTLOADER = bootloadHID
+BOOTLOADER = bootloadhid
# Build Options
# change yes to no to disable
diff --git a/keyboards/thedogkeyboard/matrix.c b/keyboards/thedogkeyboard/matrix.c
deleted file mode 100644
index 474fbec030..0000000000
--- a/keyboards/thedogkeyboard/matrix.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
-Copyright 2012-2018 Jun Wako, Jack Humbert, Yiancar
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-#include <stdint.h>
-#include <stdbool.h>
-#include "wait.h"
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-#include "debounce.h"
-#include "quantum.h"
-
-#if (MATRIX_COLS <= 8)
-# define print_matrix_header() print("\nr/c 01234567\n")
-# define print_matrix_row(row) print_bin_reverse8(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop(matrix[i])
-# define ROW_SHIFTER ((uint8_t)1)
-#elif (MATRIX_COLS <= 16)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse16(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop16(matrix[i])
-# define ROW_SHIFTER ((uint16_t)1)
-#elif (MATRIX_COLS <= 32)
-# define print_matrix_header() print("\nr/c 0123456789ABCDEF0123456789ABCDEF\n")
-# define print_matrix_row(row) print_bin_reverse32(matrix_get_row(row))
-# define matrix_bitpop(i) bitpop32(matrix[i])
-# define ROW_SHIFTER ((uint32_t)1)
-#endif
-
-#ifdef MATRIX_MASKED
- extern const matrix_row_t matrix_mask[];
-#endif
-
-static const pin_t row_pins[MATRIX_ROWS] = MATRIX_ROW_PINS;
-static const pin_t col_pins[MATRIX_COLS] = MATRIX_COL_PINS;
-
-/* matrix state(1:on, 0:off) */
-static matrix_row_t raw_matrix[MATRIX_ROWS]; //raw values
-static matrix_row_t matrix[MATRIX_ROWS]; //debounced values
-
-__attribute__ ((weak))
-void matrix_init_quantum(void) {
- matrix_init_kb();
-}
-
-__attribute__ ((weak))
-void matrix_scan_quantum(void) {
- matrix_scan_kb();
-}
-
-__attribute__ ((weak))
-void matrix_init_kb(void) {
- matrix_init_user();
-}
-
-__attribute__ ((weak))
-void matrix_scan_kb(void) {
- matrix_scan_user();
-}
-
-__attribute__ ((weak))
-void matrix_init_user(void) {
-}
-
-__attribute__ ((weak))
-void matrix_scan_user(void) {
-}
-
-inline
-uint8_t matrix_rows(void) {
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void) {
- return MATRIX_COLS;
-}
-
-//Deprecated.
-bool matrix_is_modified(void)
-{
- if (debounce_active()) 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)
-{
- // Matrix mask lets you disable switches in the returned matrix data. For example, if you have a
- // switch blocker installed and the switch is always pressed.
-#ifdef MATRIX_MASKED
- return matrix[row] & matrix_mask[row];
-#else
- return matrix[row];
-#endif
-}
-
-void matrix_print(void)
-{
- print_matrix_header();
-
- for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
- print_hex8(row); print(": ");
- print_matrix_row(row);
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- count += matrix_bitpop(i);
- }
- return count;
-}
-
-static void select_row(uint8_t row)
-{
- setPinOutput(row_pins[row]);
- writePinLow(row_pins[row]);
-}
-
-static void unselect_row(uint8_t row)
-{
- setPinInputHigh(row_pins[row]);
-}
-
-static void unselect_rows(void)
-{
- for(uint8_t x = 0; x < MATRIX_ROWS; x++) {
- setPinInputHigh(row_pins[x]);
- }
-}
-
-static void select_col(uint8_t col)
-{
- setPinOutput(col_pins[col]);
- writePinLow(col_pins[col]);
-}
-
-static void unselect_col(uint8_t col)
-{
- setPinInputHigh(col_pins[col]);
-}
-
-static void unselect_cols(void)
-{
- for(uint8_t x = 0; x < MATRIX_COLS; x++) {
- setPinInputHigh(col_pins[x]);
- }
-}
-
-static void init_pins(void) {
- unselect_rows();
- unselect_cols();
- for (uint8_t x = 0; x < MATRIX_COLS; x++) {
- setPinInputHigh(col_pins[x]);
- }
- for (uint8_t x = 0; x < MATRIX_ROWS; x++) {
- setPinInputHigh(row_pins[x]);
- }
-}
-
-static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row)
-{
- // Store last value of row prior to reading
- matrix_row_t last_row_value = current_matrix[current_row];
-
- // Clear data in matrix row
- current_matrix[current_row] = 0;
-
- // Select row and wait for row selecton to stabilize
- select_row(current_row);
- wait_us(30);
-
- // For each col...
- for(uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) {
-
- // Select the col pin to read (active low)
- uint8_t pin_state = readPin(col_pins[col_index]);
-
- // Populate the matrix row with the state of the col pin
- current_matrix[current_row] |= pin_state ? 0 : (ROW_SHIFTER << col_index);
- }
-
- // Unselect row
- unselect_row(current_row);
-
- return (last_row_value != current_matrix[current_row]);
-}
-
-static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
-{
- bool matrix_changed = false;
-
- // Select col and wait for col selecton to stabilize
- select_col(current_col);
- wait_us(30);
-
- // For each row...
- for(uint8_t row_index = 0; row_index < MATRIX_ROWS/2; row_index++)
- {
- uint8_t tmp = row_index + MATRIX_ROWS/2;
- // Store last value of row prior to reading
- matrix_row_t last_row_value = current_matrix[tmp];
-
- // Check row pin state
- if (readPin(row_pins[row_index]) == 0)
- {
- // Pin LO, set col bit
- current_matrix[tmp] |= (ROW_SHIFTER << current_col);
- }
- else
- {
- // Pin HI, clear col bit
- current_matrix[tmp] &= ~(ROW_SHIFTER << current_col);
- }
-
- // Determine if the matrix changed state
- if ((last_row_value != current_matrix[tmp]) && !(matrix_changed))
- {
- matrix_changed = true;
- }
- }
-
- // Unselect col
- unselect_col(current_col);
-
- return matrix_changed;
-}
-
-void matrix_init(void) {
-
- // initialize key pins
- init_pins();
-
- // initialize matrix state: all keys off
- for (uint8_t i=0; i < MATRIX_ROWS; i++) {
- raw_matrix[i] = 0;
- matrix[i] = 0;
- }
-
- debounce_init(MATRIX_ROWS);
-
- matrix_init_quantum();
-}
-
-uint8_t matrix_scan(void)
-{
- bool changed = false;
-
- // Set row, read cols
- for (uint8_t current_row = 0; current_row < MATRIX_ROWS / 2; current_row++) {
- changed |= read_cols_on_row(raw_matrix, current_row);
- }
- //else
- // Set col, read rows
- for (uint8_t current_col = 0; current_col < MATRIX_COLS; current_col++) {
- changed |= read_rows_on_col(raw_matrix, current_col);
- }
-
- debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
-
- matrix_scan_quantum();
- return (uint8_t)changed;
-}
diff --git a/keyboards/thedogkeyboard/readme.md b/keyboards/thedogkeyboard/readme.md
deleted file mode 100644
index 789149ca82..0000000000
--- a/keyboards/thedogkeyboard/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# thedogkeyboard
-
-![thedogkeyboard](https://i.gyazo.com/70ac677c1e75c04b812e5dce311f7901.jpg)
-
-ProMicro 100% Keyboard.
-
-* Keyboard Maintainer: [kakunpc](https://github.com/kakunpc)
-* Hardware Supported: thedogkeyboard_rev1, promicro
-* Hardware Availability: booth([@kakunpc](https://kakunpc.booth.pm/))
-
-Make example for this keyboard (after setting up your build environment):
-
- make thedogkeyboard: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/tiger910/readme.md b/keyboards/tiger910/readme.md
deleted file mode 100644
index ed14a307d3..0000000000
--- a/keyboards/tiger910/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Tiger910
-
-![Tiger910](https://www.hualigs.cn/image/60272570d2764.jpg)
-
-A 65% keyboard
-
-* Keyboard Maintainer: [Weirdo](https://weirdo-f.github.io)(https://github.com/1248314361)
-* Hardware Supported: Tiger910
-* Hardware Availability: Not yet
-
-Make example for this keyboard (after setting up your build environment):
-
- make tiger910: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/treadstone32/readme.md b/keyboards/treadstone32/readme.md
deleted file mode 100644
index 99cbe4e014..0000000000
--- a/keyboards/treadstone32/readme.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# treadstone32
-
-![treadstone32](https://github.com/marksard/Keyboards/raw/master/_image/20190421-P4210001.jpg)
-
-A 32-key Symmetric staggered keyboard.
-
-Keyboard Maintainer: [marksard](https://github.com/marksard)
-Hardware Supported: The PCBs, controllers supported
-Hardware Availability: links to where you can find this hardware
-
-Make example for this keyboard (after setting up your build environment):
-
- make treadstone32:default
- or
- make treadstone32/lite:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://github.com/marksard/Keyboards/blob/master/treadstone32/documents/treadstone32_buildguide.md)
-[Build guide (lite)](https://github.com/marksard/Keyboards/blob/master/treadstone32/documents/treadstone32lite_buildguide.md)
-[Firmware](https://github.com/marksard/qmk_firmware/tree/my_customize/keyboards/treadstone32)
diff --git a/keyboards/treadstone32/rules.mk b/keyboards/treadstone32/rules.mk
deleted file mode 100644
index 096c25856e..0000000000
--- a/keyboards/treadstone32/rules.mk
+++ /dev/null
@@ -1,18 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = no # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-AUDIO_ENABLE = no # Audio output
-RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
-LEADER_ENABLE = no
-
-DEFAULT_FOLDER = treadstone32/rev1
diff --git a/keyboards/treadstone48/keymaps/default/config.h b/keyboards/treadstone48/keymaps/default/config.h
deleted file mode 100644
index baa4ec8461..0000000000
--- a/keyboards/treadstone48/keymaps/default/config.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright 2020 marksard
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#pragma once
-
-// place overrides here
-
-#ifdef TAPPING_TERM
-#undef TAPPING_TERM
-#endif
-#define TAPPING_TERM 225
-
-#ifdef MOUSEKEY_ENABLE
- #undef MOUSEKEY_INTERVAL
- #define MOUSEKEY_INTERVAL 1
-
- #undef MOUSEKEY_TIME_TO_MAX
- #define MOUSEKEY_TIME_TO_MAX 150
-
- #undef MOUSEKEY_MAX_SPEED
- #define MOUSEKEY_MAX_SPEED 3
-
- #undef MOUSEKEY_MOVE_DELTA
- #define MOUSEKEY_MOVE_DELTA 4
-
- #undef MOUSEKEY_DELAY
- #define MOUSEKEY_DELAY 0
-#endif
-
-// If you use the HashTwenty(alpha), please enable USE_HASHTWENTY
-// #define ANGELINA_KEYMAP
-
-// If you plug in the USB on the right side, please enable MASTER_RIGHT
-// #define RHYMESTONE_RIGHTHAND
-
-#define OLED_FONT_H "keyboards/treadstone48/common/glcdfont.c"
diff --git a/keyboards/treadstone48/keymaps/like_jis/config.h b/keyboards/treadstone48/keymaps/like_jis/config.h
deleted file mode 100644
index baa4ec8461..0000000000
--- a/keyboards/treadstone48/keymaps/like_jis/config.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright 2020 marksard
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#pragma once
-
-// place overrides here
-
-#ifdef TAPPING_TERM
-#undef TAPPING_TERM
-#endif
-#define TAPPING_TERM 225
-
-#ifdef MOUSEKEY_ENABLE
- #undef MOUSEKEY_INTERVAL
- #define MOUSEKEY_INTERVAL 1
-
- #undef MOUSEKEY_TIME_TO_MAX
- #define MOUSEKEY_TIME_TO_MAX 150
-
- #undef MOUSEKEY_MAX_SPEED
- #define MOUSEKEY_MAX_SPEED 3
-
- #undef MOUSEKEY_MOVE_DELTA
- #define MOUSEKEY_MOVE_DELTA 4
-
- #undef MOUSEKEY_DELAY
- #define MOUSEKEY_DELAY 0
-#endif
-
-// If you use the HashTwenty(alpha), please enable USE_HASHTWENTY
-// #define ANGELINA_KEYMAP
-
-// If you plug in the USB on the right side, please enable MASTER_RIGHT
-// #define RHYMESTONE_RIGHTHAND
-
-#define OLED_FONT_H "keyboards/treadstone48/common/glcdfont.c"
diff --git a/keyboards/treadstone48/readme.md b/keyboards/treadstone48/readme.md
deleted file mode 100644
index 432ef33fe9..0000000000
--- a/keyboards/treadstone48/readme.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# treadstone48
-
-![treadstone48](https://github.com/marksard/Keyboards/raw/master/_image/20181219-PC190003.jpg)
-
-A 47 (or 48) keys Symmetric Staggered keyboard.
-
-Keyboard Maintainer: [marksard](https://github.com/marksard)
-Hardware Supported: The PCBs, controllers supported
-Hardware Availability: links to where you can find this hardware
-
-Make example for this keyboard (after setting up your build environment):
-
- make treadstone48:default
- or
- make treadstone48/rev2:default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-[Build guide](https://github.com/marksard/Keyboards/blob/master/treadstone48/documents/treadstone48_buildguide.md)
-[Build guide (rev2)](https://github.com/marksard/Keyboards/blob/master/treadstone48/documents/treadstone48rev2_buildguide.md)
-[Firmware](https://github.com/marksard/qmk_firmware/tree/my_customize/keyboards/treadstone48)
diff --git a/keyboards/treadstone48/rev1/keymaps/like_jis_rs/config.h b/keyboards/treadstone48/rev1/keymaps/like_jis_rs/config.h
deleted file mode 100644
index 95b58c23db..0000000000
--- a/keyboards/treadstone48/rev1/keymaps/like_jis_rs/config.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* Copyright 2020 marksard
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#pragma once
-
-// place overrides here
-
-#ifdef TAPPING_TERM
-#undef TAPPING_TERM
-#endif
-#define TAPPING_TERM 225
-#define PREVENT_STUCK_MODIFIERS
-#define IGNORE_MOD_TAP_INTERRUPT
-
-#ifdef MOUSEKEY_ENABLE
- #undef MOUSEKEY_INTERVAL
- #define MOUSEKEY_INTERVAL 1
-
- #undef MOUSEKEY_TIME_TO_MAX
- #define MOUSEKEY_TIME_TO_MAX 150
-
- #undef MOUSEKEY_MAX_SPEED
- #define MOUSEKEY_MAX_SPEED 3
-
- #undef MOUSEKEY_MOVE_DELTA
- #define MOUSEKEY_MOVE_DELTA 4
-
- #undef MOUSEKEY_DELAY
- #define MOUSEKEY_DELAY 0
-#endif
-
-// If you use the HashTwenty(alpha), please enable USE_HASHTWENTY
-// #define ANGELINA_KEYMAP
-
-// If you plug in the USB on the right side, please enable MASTER_RIGHT
-// #define RHYMESTONE_RIGHTHAND
-
-#define OLED_FONT_H "keyboards/treadstone48/common/glcdfont.c"
diff --git a/keyboards/treadstone48/rules.mk b/keyboards/treadstone48/rules.mk
deleted file mode 100644
index 3bf42c85c6..0000000000
--- a/keyboards/treadstone48/rules.mk
+++ /dev/null
@@ -1,25 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = caterina
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-EXTRAKEY_ENABLE = no # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-AUDIO_ENABLE = no # Audio output
-SPLIT_KEYBOARD = yes
-
-MOUSEKEY_ENABLE = yes # Mouse keys
-
-RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
-OLED_ENABLE = yes
-OLED_DRIVER = SSD1306
-
-DEFAULT_FOLDER = treadstone48/rev1
diff --git a/keyboards/ua62/readme.md b/keyboards/ua62/readme.md
deleted file mode 100644
index 62523e2146..0000000000
--- a/keyboards/ua62/readme.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# UA62
-
-* A Universal pcb for the atreus62
-* atreus62 by profet23
-* Original atreus by Phil Hagelberg
-* Keyboard Maintainer: [NaCly](https://github.com/na-cly)
-* Hardware Supported: UA62 PCB
-* Hardware Availability: https://github.com/na-cly/UA62 (Order PCBS)
-
-Make example for this keyboard (after setting up your build environment):
-
- make ua62: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/geminate60/chconf.h b/keyboards/weirdo/geminate60/chconf.h
index d58807924a..d58807924a 100644
--- a/keyboards/geminate60/chconf.h
+++ b/keyboards/weirdo/geminate60/chconf.h
diff --git a/keyboards/geminate60/config.h b/keyboards/weirdo/geminate60/config.h
index 6e13da06de..6e13da06de 100644
--- a/keyboards/geminate60/config.h
+++ b/keyboards/weirdo/geminate60/config.h
diff --git a/keyboards/geminate60/geminate60.c b/keyboards/weirdo/geminate60/geminate60.c
index 3f0218c890..3f0218c890 100644
--- a/keyboards/geminate60/geminate60.c
+++ b/keyboards/weirdo/geminate60/geminate60.c
diff --git a/keyboards/geminate60/geminate60.h b/keyboards/weirdo/geminate60/geminate60.h
index 7361930a20..7361930a20 100644
--- a/keyboards/geminate60/geminate60.h
+++ b/keyboards/weirdo/geminate60/geminate60.h
diff --git a/keyboards/geminate60/info.json b/keyboards/weirdo/geminate60/info.json
index ba34264f62..ba34264f62 100644
--- a/keyboards/geminate60/info.json
+++ b/keyboards/weirdo/geminate60/info.json
diff --git a/keyboards/geminate60/keymaps/default/keymap.c b/keyboards/weirdo/geminate60/keymaps/default/keymap.c
index 91a6f8c3e2..91a6f8c3e2 100644
--- a/keyboards/geminate60/keymaps/default/keymap.c
+++ b/keyboards/weirdo/geminate60/keymaps/default/keymap.c
diff --git a/keyboards/geminate60/keymaps/via/keymap.c b/keyboards/weirdo/geminate60/keymaps/via/keymap.c
index 85210835e4..85210835e4 100644
--- a/keyboards/geminate60/keymaps/via/keymap.c
+++ b/keyboards/weirdo/geminate60/keymaps/via/keymap.c
diff --git a/keyboards/naked60/keymaps/via/rules.mk b/keyboards/weirdo/geminate60/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/naked60/keymaps/via/rules.mk
+++ b/keyboards/weirdo/geminate60/keymaps/via/rules.mk
diff --git a/keyboards/weirdo/geminate60/readme.md b/keyboards/weirdo/geminate60/readme.md
new file mode 100644
index 0000000000..ca865c8cff
--- /dev/null
+++ b/keyboards/weirdo/geminate60/readme.md
@@ -0,0 +1,16 @@
+# Geminate60
+
+![Geminate60](https://www.hualigs.cn/image/600d9391f16d7.jpg)
+
+A 60% keyboard based on STM32F303.
+
+* Keyboard Maintainer: [Weirdo](https://github.com/weirdo-f) ([weirdo-f.github.io](https://))
+* Hardware Supported: Geminate60
+* Hardware Availability: Not yet
+
+Make example for this keyboard (after setting up your build environment):
+
+ make weirdo/geminate60:default
+
+The RST pin and GND pin on the board can be quickly shortened twice to enter DFU mode, and then the program can be written.
+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/geminate60/rules.mk b/keyboards/weirdo/geminate60/rules.mk
index f6ad535987..f6ad535987 100644
--- a/keyboards/geminate60/rules.mk
+++ b/keyboards/weirdo/geminate60/rules.mk
diff --git a/keyboards/kelowna/rgb64/config.h b/keyboards/weirdo/kelowna/rgb64/config.h
index 906755d88a..906755d88a 100644
--- a/keyboards/kelowna/rgb64/config.h
+++ b/keyboards/weirdo/kelowna/rgb64/config.h
diff --git a/keyboards/kelowna/rgb64/info.json b/keyboards/weirdo/kelowna/rgb64/info.json
index 8dbb01a410..8dbb01a410 100644
--- a/keyboards/kelowna/rgb64/info.json
+++ b/keyboards/weirdo/kelowna/rgb64/info.json
diff --git a/keyboards/kelowna/rgb64/keymaps/default/keymap.c b/keyboards/weirdo/kelowna/rgb64/keymaps/default/keymap.c
index 1c5acf6bab..1c5acf6bab 100644
--- a/keyboards/kelowna/rgb64/keymaps/default/keymap.c
+++ b/keyboards/weirdo/kelowna/rgb64/keymaps/default/keymap.c
diff --git a/keyboards/kelowna/rgb64/keymaps/via/keymap.c b/keyboards/weirdo/kelowna/rgb64/keymaps/via/keymap.c
index db6b096b54..db6b096b54 100644
--- a/keyboards/kelowna/rgb64/keymaps/via/keymap.c
+++ b/keyboards/weirdo/kelowna/rgb64/keymaps/via/keymap.c
diff --git a/keyboards/nk65/keymaps/via/rules.mk b/keyboards/weirdo/kelowna/rgb64/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100755..100644
--- a/keyboards/nk65/keymaps/via/rules.mk
+++ b/keyboards/weirdo/kelowna/rgb64/keymaps/via/rules.mk
diff --git a/keyboards/weirdo/kelowna/rgb64/readme.md b/keyboards/weirdo/kelowna/rgb64/readme.md
new file mode 100644
index 0000000000..f12e155c8a
--- /dev/null
+++ b/keyboards/weirdo/kelowna/rgb64/readme.md
@@ -0,0 +1,17 @@
+# kelownaRGB64
+
+![kelownaRGB64](https://i.imgur.com/DzLy87M.png)
+
+A 60% keyboard based on STM32f303
+
+* Keyboard Maintainer: [Weirdo](https://github.com/Weirdo-F)(https://github.com/Weirdo-F)
+* Hardware Supported: kelownaRGB64
+* Hardware Availability: Not yet
+
+Make example for this keyboard (after setting up your build environment):
+
+ make weirdo/kelowna/rgb64:default
+
+Use the SWD interface on the board to connect to the STlink (JLink) to directly burn firmware without entering the bootloader.
+
+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/kelowna/rgb64/rgb64.c b/keyboards/weirdo/kelowna/rgb64/rgb64.c
index dd57616161..dd57616161 100644
--- a/keyboards/kelowna/rgb64/rgb64.c
+++ b/keyboards/weirdo/kelowna/rgb64/rgb64.c
diff --git a/keyboards/kelowna/rgb64/rgb64.h b/keyboards/weirdo/kelowna/rgb64/rgb64.h
index c2277aa208..c2277aa208 100644
--- a/keyboards/kelowna/rgb64/rgb64.h
+++ b/keyboards/weirdo/kelowna/rgb64/rgb64.h
diff --git a/keyboards/kelowna/rgb64/rules.mk b/keyboards/weirdo/kelowna/rgb64/rules.mk
index 4e81168041..4e81168041 100644
--- a/keyboards/kelowna/rgb64/rules.mk
+++ b/keyboards/weirdo/kelowna/rgb64/rules.mk
diff --git a/keyboards/ls_60/chconf.h b/keyboards/weirdo/ls_60/chconf.h
index 5884dd8b0b..5884dd8b0b 100644
--- a/keyboards/ls_60/chconf.h
+++ b/keyboards/weirdo/ls_60/chconf.h
diff --git a/keyboards/ls_60/config.h b/keyboards/weirdo/ls_60/config.h
index e7151ac10f..e7151ac10f 100644
--- a/keyboards/ls_60/config.h
+++ b/keyboards/weirdo/ls_60/config.h
diff --git a/keyboards/ls_60/info.json b/keyboards/weirdo/ls_60/info.json
index 20cb544b98..20cb544b98 100644
--- a/keyboards/ls_60/info.json
+++ b/keyboards/weirdo/ls_60/info.json
diff --git a/keyboards/ls_60/keymaps/default/keymap.c b/keyboards/weirdo/ls_60/keymaps/default/keymap.c
index 3587959399..3587959399 100644
--- a/keyboards/ls_60/keymaps/default/keymap.c
+++ b/keyboards/weirdo/ls_60/keymaps/default/keymap.c
diff --git a/keyboards/ls_60/keymaps/via/keymap.c b/keyboards/weirdo/ls_60/keymaps/via/keymap.c
index e3af8eb7da..e3af8eb7da 100644
--- a/keyboards/ls_60/keymaps/via/keymap.c
+++ b/keyboards/weirdo/ls_60/keymaps/via/keymap.c
diff --git a/keyboards/nk87/keymaps/via/rules.mk b/keyboards/weirdo/ls_60/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100755..100644
--- a/keyboards/nk87/keymaps/via/rules.mk
+++ b/keyboards/weirdo/ls_60/keymaps/via/rules.mk
diff --git a/keyboards/ls_60/ls_60.c b/keyboards/weirdo/ls_60/ls_60.c
index ef29acf9a1..ef29acf9a1 100644
--- a/keyboards/ls_60/ls_60.c
+++ b/keyboards/weirdo/ls_60/ls_60.c
diff --git a/keyboards/ls_60/ls_60.h b/keyboards/weirdo/ls_60/ls_60.h
index b099521b9e..b099521b9e 100644
--- a/keyboards/ls_60/ls_60.h
+++ b/keyboards/weirdo/ls_60/ls_60.h
diff --git a/keyboards/weirdo/ls_60/readme.md b/keyboards/weirdo/ls_60/readme.md
new file mode 100644
index 0000000000..cb289b8ad6
--- /dev/null
+++ b/keyboards/weirdo/ls_60/readme.md
@@ -0,0 +1,17 @@
+# LS_60
+
+![LS_60](https://i.imgur.com/Cuy5W1H.png)
+
+A 60% keyboard based on STM32f303
+
+* Keyboard Maintainer: [Weirdo](https://weirdo-f.github.io)(https://github.com/1248314361)
+* Hardware Supported: LS_60
+* Hardware Availability: Not yet
+
+Make example for this keyboard (after setting up your build environment):
+
+ make weirdo/ls_60:default
+
+The RST pin and GND pin on the board can be quickly shortened twice to enter DFU mode, and then the program can be written.
+
+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/ls_60/rules.mk b/keyboards/weirdo/ls_60/rules.mk
index bcc109f6d4..bcc109f6d4 100644
--- a/keyboards/ls_60/rules.mk
+++ b/keyboards/weirdo/ls_60/rules.mk
diff --git a/keyboards/naiping/np64/chconf.h b/keyboards/weirdo/naiping/np64/chconf.h
index 5884dd8b0b..5884dd8b0b 100644
--- a/keyboards/naiping/np64/chconf.h
+++ b/keyboards/weirdo/naiping/np64/chconf.h
diff --git a/keyboards/naiping/np64/config.h b/keyboards/weirdo/naiping/np64/config.h
index ee4bdb8675..ee4bdb8675 100644
--- a/keyboards/naiping/np64/config.h
+++ b/keyboards/weirdo/naiping/np64/config.h
diff --git a/keyboards/naiping/np64/info.json b/keyboards/weirdo/naiping/np64/info.json
index 8bf71afe0c..8bf71afe0c 100644
--- a/keyboards/naiping/np64/info.json
+++ b/keyboards/weirdo/naiping/np64/info.json
diff --git a/keyboards/naiping/np64/keymaps/default/keymap.c b/keyboards/weirdo/naiping/np64/keymaps/default/keymap.c
index 25f72fe664..25f72fe664 100644
--- a/keyboards/naiping/np64/keymaps/default/keymap.c
+++ b/keyboards/weirdo/naiping/np64/keymaps/default/keymap.c
diff --git a/keyboards/naiping/np64/keymaps/via/keymap.c b/keyboards/weirdo/naiping/np64/keymaps/via/keymap.c
index 7afa15e735..7afa15e735 100644
--- a/keyboards/naiping/np64/keymaps/via/keymap.c
+++ b/keyboards/weirdo/naiping/np64/keymaps/via/keymap.c
diff --git a/keyboards/owl8/keymaps/via/rules.mk b/keyboards/weirdo/naiping/np64/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/owl8/keymaps/via/rules.mk
+++ b/keyboards/weirdo/naiping/np64/keymaps/via/rules.mk
diff --git a/keyboards/naiping/np64/np64.c b/keyboards/weirdo/naiping/np64/np64.c
index ee4c08cd34..ee4c08cd34 100644
--- a/keyboards/naiping/np64/np64.c
+++ b/keyboards/weirdo/naiping/np64/np64.c
diff --git a/keyboards/naiping/np64/np64.h b/keyboards/weirdo/naiping/np64/np64.h
index c2277aa208..c2277aa208 100644
--- a/keyboards/naiping/np64/np64.h
+++ b/keyboards/weirdo/naiping/np64/np64.h
diff --git a/keyboards/weirdo/naiping/np64/readme.md b/keyboards/weirdo/naiping/np64/readme.md
new file mode 100644
index 0000000000..a5b4c89f01
--- /dev/null
+++ b/keyboards/weirdo/naiping/np64/readme.md
@@ -0,0 +1,17 @@
+# NP_64
+
+![NP_64](https://i.imgur.com/DzLy87M.png)
+
+A 60% keyboard based on STM32f303
+
+* Keyboard Maintainer: [Weirdo](https://github.com/weirdo-f) (https://weirdo-f.github.io)
+* Hardware Supported: NP_64
+* Hardware Availability: Not yet
+
+Make example for this keyboard (after setting up your build environment):
+
+ make weirdo/naiping/np64:default
+
+The RST pin and GND pin on the board can be quickly shortened twice to enter DFU mode, and then the program can be written.
+
+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/naiping/np64/rules.mk b/keyboards/weirdo/naiping/np64/rules.mk
index 55c914453e..55c914453e 100644
--- a/keyboards/naiping/np64/rules.mk
+++ b/keyboards/weirdo/naiping/np64/rules.mk
diff --git a/keyboards/naiping/nphhkb/chconf.h b/keyboards/weirdo/naiping/nphhkb/chconf.h
index 5884dd8b0b..5884dd8b0b 100644
--- a/keyboards/naiping/nphhkb/chconf.h
+++ b/keyboards/weirdo/naiping/nphhkb/chconf.h
diff --git a/keyboards/naiping/nphhkb/config.h b/keyboards/weirdo/naiping/nphhkb/config.h
index 26993eeb7f..26993eeb7f 100644
--- a/keyboards/naiping/nphhkb/config.h
+++ b/keyboards/weirdo/naiping/nphhkb/config.h
diff --git a/keyboards/naiping/nphhkb/info.json b/keyboards/weirdo/naiping/nphhkb/info.json
index 4975aa3a41..4975aa3a41 100644
--- a/keyboards/naiping/nphhkb/info.json
+++ b/keyboards/weirdo/naiping/nphhkb/info.json
diff --git a/keyboards/naiping/nphhkb/keymaps/default/keymap.c b/keyboards/weirdo/naiping/nphhkb/keymaps/default/keymap.c
index 2c4b6324be..2c4b6324be 100644
--- a/keyboards/naiping/nphhkb/keymaps/default/keymap.c
+++ b/keyboards/weirdo/naiping/nphhkb/keymaps/default/keymap.c
diff --git a/keyboards/naiping/nphhkb/keymaps/via/keymap.c b/keyboards/weirdo/naiping/nphhkb/keymaps/via/keymap.c
index 36128f8bba..36128f8bba 100644
--- a/keyboards/naiping/nphhkb/keymaps/via/keymap.c
+++ b/keyboards/weirdo/naiping/nphhkb/keymaps/via/keymap.c
diff --git a/keyboards/rabbit_capture_plan/keymaps/via/rules.mk b/keyboards/weirdo/naiping/nphhkb/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/rabbit_capture_plan/keymaps/via/rules.mk
+++ b/keyboards/weirdo/naiping/nphhkb/keymaps/via/rules.mk
diff --git a/keyboards/naiping/nphhkb/nphhkb.c b/keyboards/weirdo/naiping/nphhkb/nphhkb.c
index 881522c0b3..881522c0b3 100644
--- a/keyboards/naiping/nphhkb/nphhkb.c
+++ b/keyboards/weirdo/naiping/nphhkb/nphhkb.c
diff --git a/keyboards/naiping/nphhkb/nphhkb.h b/keyboards/weirdo/naiping/nphhkb/nphhkb.h
index 96c99451b4..96c99451b4 100644
--- a/keyboards/naiping/nphhkb/nphhkb.h
+++ b/keyboards/weirdo/naiping/nphhkb/nphhkb.h
diff --git a/keyboards/weirdo/naiping/nphhkb/readme.md b/keyboards/weirdo/naiping/nphhkb/readme.md
new file mode 100644
index 0000000000..1ed6d46eff
--- /dev/null
+++ b/keyboards/weirdo/naiping/nphhkb/readme.md
@@ -0,0 +1,17 @@
+# NP_hhkb
+
+![NP_hhkb](https://i.imgur.com/XnA4qVU.png)
+
+A 60% keyboard based on STM32f303
+
+* Keyboard Maintainer: [Weirdo](https://github.com/weirdo-f) (https://weirdo-f.github.io)
+* Hardware Supported: NP_hhkb
+* Hardware Availability: Not yet
+
+Make example for this keyboard (after setting up your build environment):
+
+ make weirdo/naiping/nphhkb:default
+
+The RST pin and GND pin on the board can be quickly shortened twice to enter DFU mode, and then the program can be written.
+
+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/naiping/nphhkb/rules.mk b/keyboards/weirdo/naiping/nphhkb/rules.mk
index 64284e913b..64284e913b 100644
--- a/keyboards/naiping/nphhkb/rules.mk
+++ b/keyboards/weirdo/naiping/nphhkb/rules.mk
diff --git a/keyboards/naiping/npminila/chconf.h b/keyboards/weirdo/naiping/npminila/chconf.h
index 5884dd8b0b..5884dd8b0b 100644
--- a/keyboards/naiping/npminila/chconf.h
+++ b/keyboards/weirdo/naiping/npminila/chconf.h
diff --git a/keyboards/naiping/npminila/config.h b/keyboards/weirdo/naiping/npminila/config.h
index f18b36d8e7..f18b36d8e7 100644
--- a/keyboards/naiping/npminila/config.h
+++ b/keyboards/weirdo/naiping/npminila/config.h
diff --git a/keyboards/naiping/npminila/info.json b/keyboards/weirdo/naiping/npminila/info.json
index 4dbe3127d3..4dbe3127d3 100644
--- a/keyboards/naiping/npminila/info.json
+++ b/keyboards/weirdo/naiping/npminila/info.json
diff --git a/keyboards/naiping/npminila/keymaps/default/keymap.c b/keyboards/weirdo/naiping/npminila/keymaps/default/keymap.c
index 30d6bf291e..30d6bf291e 100644
--- a/keyboards/naiping/npminila/keymaps/default/keymap.c
+++ b/keyboards/weirdo/naiping/npminila/keymaps/default/keymap.c
diff --git a/keyboards/naiping/npminila/keymaps/via/keymap.c b/keyboards/weirdo/naiping/npminila/keymaps/via/keymap.c
index 10ec385de9..10ec385de9 100644
--- a/keyboards/naiping/npminila/keymaps/via/keymap.c
+++ b/keyboards/weirdo/naiping/npminila/keymaps/via/keymap.c
diff --git a/keyboards/reviung53/keymaps/via/rules.mk b/keyboards/weirdo/naiping/npminila/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/reviung53/keymaps/via/rules.mk
+++ b/keyboards/weirdo/naiping/npminila/keymaps/via/rules.mk
diff --git a/keyboards/naiping/npminila/npminila.c b/keyboards/weirdo/naiping/npminila/npminila.c
index ab9ebb45d7..ab9ebb45d7 100644
--- a/keyboards/naiping/npminila/npminila.c
+++ b/keyboards/weirdo/naiping/npminila/npminila.c
diff --git a/keyboards/naiping/npminila/npminila.h b/keyboards/weirdo/naiping/npminila/npminila.h
index 3d0d927a0b..3d0d927a0b 100644
--- a/keyboards/naiping/npminila/npminila.h
+++ b/keyboards/weirdo/naiping/npminila/npminila.h
diff --git a/keyboards/weirdo/naiping/npminila/readme.md b/keyboards/weirdo/naiping/npminila/readme.md
new file mode 100644
index 0000000000..35d5a2e5ec
--- /dev/null
+++ b/keyboards/weirdo/naiping/npminila/readme.md
@@ -0,0 +1,17 @@
+# NP_minila
+
+![NP_minila](https://i.imgur.com/Cuy5W1H.png)
+
+A 60% keyboard based on STM32f303
+
+* Keyboard Maintainer: [Weirdo](https://weirdo-f.github.io)(https://github.com/1248314361)
+* Hardware Supported: NP_minila
+* Hardware Availability: Not yet
+
+Make example for this keyboard (after setting up your build environment):
+
+ make weirdo/naiping/npminila:default
+
+The RST pin and GND pin on the board can be quickly shortened twice to enter DFU mode, and then the program can be written.
+
+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/naiping/npminila/rules.mk b/keyboards/weirdo/naiping/npminila/rules.mk
index bcc109f6d4..bcc109f6d4 100644
--- a/keyboards/naiping/npminila/rules.mk
+++ b/keyboards/weirdo/naiping/npminila/rules.mk
diff --git a/keyboards/tiger910/config.h b/keyboards/weirdo/tiger910/config.h
index 4f2541739a..4f2541739a 100644
--- a/keyboards/tiger910/config.h
+++ b/keyboards/weirdo/tiger910/config.h
diff --git a/keyboards/tiger910/info.json b/keyboards/weirdo/tiger910/info.json
index 1c4e706e37..1c4e706e37 100644
--- a/keyboards/tiger910/info.json
+++ b/keyboards/weirdo/tiger910/info.json
diff --git a/keyboards/tiger910/keymaps/default/keymap.c b/keyboards/weirdo/tiger910/keymaps/default/keymap.c
index 5896a6913c..5896a6913c 100644
--- a/keyboards/tiger910/keymaps/default/keymap.c
+++ b/keyboards/weirdo/tiger910/keymaps/default/keymap.c
diff --git a/keyboards/tiger910/keymaps/via/keymap.c b/keyboards/weirdo/tiger910/keymaps/via/keymap.c
index 051796e3de..051796e3de 100644
--- a/keyboards/tiger910/keymaps/via/keymap.c
+++ b/keyboards/weirdo/tiger910/keymaps/via/keymap.c
diff --git a/keyboards/tiger910/keymaps/via/rules.mk b/keyboards/weirdo/tiger910/keymaps/via/rules.mk
index 036bd6d1c3..036bd6d1c3 100644
--- a/keyboards/tiger910/keymaps/via/rules.mk
+++ b/keyboards/weirdo/tiger910/keymaps/via/rules.mk
diff --git a/keyboards/weirdo/tiger910/readme.md b/keyboards/weirdo/tiger910/readme.md
new file mode 100644
index 0000000000..a47b84db87
--- /dev/null
+++ b/keyboards/weirdo/tiger910/readme.md
@@ -0,0 +1,15 @@
+# Tiger910
+
+![Tiger910](https://www.hualigs.cn/image/60272570d2764.jpg)
+
+A 65% keyboard
+
+* Keyboard Maintainer: [Weirdo](https://weirdo-f.github.io)(https://github.com/1248314361)
+* Hardware Supported: Tiger910
+* Hardware Availability: Not yet
+
+Make example for this keyboard (after setting up your build environment):
+
+ make weirdo/tiger910: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/tiger910/rules.mk b/keyboards/weirdo/tiger910/rules.mk
index ee0b9bc30c..ee0b9bc30c 100644
--- a/keyboards/tiger910/rules.mk
+++ b/keyboards/weirdo/tiger910/rules.mk
diff --git a/keyboards/tiger910/tiger910.c b/keyboards/weirdo/tiger910/tiger910.c
index d0964d9be9..d0964d9be9 100644
--- a/keyboards/tiger910/tiger910.c
+++ b/keyboards/weirdo/tiger910/tiger910.c
diff --git a/keyboards/tiger910/tiger910.h b/keyboards/weirdo/tiger910/tiger910.h
index 529c12fc5e..529c12fc5e 100644
--- a/keyboards/tiger910/tiger910.h
+++ b/keyboards/weirdo/tiger910/tiger910.h
diff --git a/keyboards/wings42/readme.md b/keyboards/wings42/readme.md
deleted file mode 100644
index fc71d58ab6..0000000000
--- a/keyboards/wings42/readme.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# wings42
-
-![wings42](https://raw.githubusercontent.com/yfuku/wings42/main/images/wings42.jpg)
-
-A split keyboard with 3x6 vertically staggered keys and 3 thumb keys.
-
-* Keyboard Maintainer: [yfuku](https://github.com/yfuku)
-* Hardware Supported: wings42 PCB, Pro Micro
-* Hardware Availability: https://yfuku.booth.pm/
-
-Make example for this keyboard (after setting up your build environment):
-
- make wings42:default
-
-Flashing example for this keyboard:
-
- make wings42:default:flash
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/wings42/rev1/readme.md b/keyboards/wings42/rev1/readme.md
deleted file mode 100644
index 4ddfe3e83c..0000000000
--- a/keyboards/wings42/rev1/readme.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# wings42
-
-![wings42](https://raw.githubusercontent.com/yfuku/wings42/main/images/wings42.jpg)
-
-A split keyboard with 3x6 vertically staggered keys and 3 thumb keys.
-
-* Keyboard Maintainer: [yfuku](https://github.com/yfuku)
-* Hardware Supported: wings42 PCB, Pro Micro
-* Hardware Availability: https://yfuku.booth.pm/
-
-Make example for this keyboard (after setting up your build environment):
-
- make wings42/rev1:default
-
-Flashing example for this keyboard:
-
- make wings42/rev1:default:flash
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-A build guide for this keyboard can be found here: [wings42 build guide](https://yfuku.com/wings42/buildguide/)
diff --git a/keyboards/wings42/rev1_extkeys/readme.md b/keyboards/wings42/rev1_extkeys/readme.md
deleted file mode 100644
index 7be464a141..0000000000
--- a/keyboards/wings42/rev1_extkeys/readme.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# wings42
-
-![wings42](https://raw.githubusercontent.com/yfuku/wings42/main/images/wings42.jpg)
-
-A split keyboard with 3x6 vertically staggered keys and 3 thumb keys.
-
-* Keyboard Maintainer: [yfuku](https://github.com/yfuku)
-* Hardware Supported: wings42 PCB, Pro Micro
-* Hardware Availability: https://yfuku.booth.pm/
-
-Make example for this keyboard (after setting up your build environment):
-
- make make wings42/rev1_extkeys:default
-
-Flashing example for this keyboard:
-
- make make wings42/rev1_extkeys:default:flash
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-A build guide for this keyboard can be found here: [wings42 build guide](https://yfuku.com/wings42/buildguide/)
diff --git a/keyboards/wings42/rev2/readme.md b/keyboards/wings42/rev2/readme.md
deleted file mode 100644
index 158372feb4..0000000000
--- a/keyboards/wings42/rev2/readme.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# wings42
-
-![wings42](https://raw.githubusercontent.com/yfuku/wings42/main/images/wings42.jpg)
-
-A split keyboard with 3x6 vertically staggered keys and 3 thumb keys.
-
-* Keyboard Maintainer: [yfuku](https://github.com/yfuku)
-* Hardware Supported: wings42 PCB, Pro Micro
-* Hardware Availability: https://yfuku.booth.pm/
-
-Make example for this keyboard (after setting up your build environment):
-
- make wings42:default
-
-Flashing example for this keyboard:
-
- make wings42:default:flash
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
-
-A build guide for this keyboard can be found here: [wings42 build guide](https://yfuku.com/wings42/buildguide/)
diff --git a/keyboards/wings42/rules.mk b/keyboards/wings42/rules.mk
deleted file mode 100644
index 74e894efec..0000000000
--- a/keyboards/wings42/rules.mk
+++ /dev/null
@@ -1,22 +0,0 @@
-# MCU name
-MCU = atmega32u4
-
-# Bootloader selection
-BOOTLOADER = caterina
-
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
-AUDIO_ENABLE = no # Audio output
-
-SPLIT_KEYBOARD = yes
-
-DEFAULT_FOLDER = wings42/rev2
diff --git a/keyboards/wings42/wings42.h b/keyboards/wings42/wings42.h
deleted file mode 100644
index 9412b7117a..0000000000
--- a/keyboards/wings42/wings42.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* Copyright 2021 yfuku
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General 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"
-
-#ifdef KEYBOARD_wings42_rev1
-# include "rev1.h"
-#endif
-#ifdef KEYBOARD_wings42_rev1_extkeys
-# include "rev1_extkeys.h"
-#endif
-#ifdef KEYBOARD_wings42_rev2
-# include "rev2.h"
-#endif
-
diff --git a/keyboards/spiderisland/winry25tc/config.h b/keyboards/winry/winry25tc/config.h
index 1e7ff4c63b..1e7ff4c63b 100644
--- a/keyboards/spiderisland/winry25tc/config.h
+++ b/keyboards/winry/winry25tc/config.h
diff --git a/keyboards/spiderisland/winry25tc/info.json b/keyboards/winry/winry25tc/info.json
index 8e503bc74a..8e503bc74a 100644
--- a/keyboards/spiderisland/winry25tc/info.json
+++ b/keyboards/winry/winry25tc/info.json
diff --git a/keyboards/spiderisland/winry25tc/keymaps/default/keymap.c b/keyboards/winry/winry25tc/keymaps/default/keymap.c
index ec1d0f42ed..ec1d0f42ed 100644
--- a/keyboards/spiderisland/winry25tc/keymaps/default/keymap.c
+++ b/keyboards/winry/winry25tc/keymaps/default/keymap.c
diff --git a/keyboards/winry/winry25tc/readme.md b/keyboards/winry/winry25tc/readme.md
new file mode 100644
index 0000000000..9507aef74b
--- /dev/null
+++ b/keyboards/winry/winry25tc/readme.md
@@ -0,0 +1,19 @@
+# Winry 25-key RGB Backlight Hot Swap Mechanical Keyboard
+
+Keyboard from
+* [SpiderIsland on AliExpress(reseller)](https://a.aliexpress.com/_dVJsSpR). Seller provides [kbfirmware](https://kbfirmware.com/) JSON config that was converted to QMK.
+
+
+
+* Keyboard Maintainer: [andrzejressel](https://github.com/andrzejressel)
+* Hardware Availability:
+https://aliexpress.com/item/1005001523579896.html
+https://item.taobao.com/item.htm?id=599731303104
+
+Make example for this keyboard (after setting up your build environment):
+
+ make winry/winry25tc:default
+
+**Reset Key**: Located on the other side of the keyboard.
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/spiderisland/winry25tc/rules.mk b/keyboards/winry/winry25tc/rules.mk
index b0352b513c..b0352b513c 100644
--- a/keyboards/spiderisland/winry25tc/rules.mk
+++ b/keyboards/winry/winry25tc/rules.mk
diff --git a/keyboards/spiderisland/winry25tc/winry25tc.c b/keyboards/winry/winry25tc/winry25tc.c
index 938dadaf8f..938dadaf8f 100644
--- a/keyboards/spiderisland/winry25tc/winry25tc.c
+++ b/keyboards/winry/winry25tc/winry25tc.c
diff --git a/keyboards/spiderisland/winry25tc/winry25tc.h b/keyboards/winry/winry25tc/winry25tc.h
index 5498dd8d6b..5498dd8d6b 100644
--- a/keyboards/spiderisland/winry25tc/winry25tc.h
+++ b/keyboards/winry/winry25tc/winry25tc.h
diff --git a/keyboards/yanghu/unicorne/config.h b/keyboards/yanghu/unicorne/config.h
index 652afeb3b4..27d21c7906 100644
--- a/keyboards/yanghu/unicorne/config.h
+++ b/keyboards/yanghu/unicorne/config.h
@@ -42,6 +42,12 @@
#define ENCODERS_PAD_B \
{ B12, B0 }
+/* I2C - required for custom i2c_init */
+#define I2C1_SCL_PIN B6
+#define I2C1_SDA_PIN B7
+#define I2C1_SCL_PAL_MODE 4
+#define I2C1_SDA_PAL_MODE 4
+
/* Audio */
#define AUDIO_PIN A8
#define AUDIO_PWM_PAL_MODE 1
diff --git a/keyboards/yasui/readme.md b/keyboards/yasui/readme.md
deleted file mode 100644
index dfc20bbe6b..0000000000
--- a/keyboards/yasui/readme.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# Yasui
-
-![Yasui](https://i.imgur.com/TRFOEkw.png)
-
-A 10u ortho kit.
-
-* Keyboard Maintainer: Rain
-* Hardware Supported: Yasui PCB v2
-* Hardware Availability: [rainkeebs](https://www.rainkeebs.mx/product/yasui-keyboard-kit)
-
-
-Make example for this keyboard (after setting up your build environment):
-
- qmk compile -kb yasui -kb default
-
-To reset the keyboard, hold the top left key while plugging in, or hit the reset button near the USB port
-
-Install example for this keyboard:
-
- qmk flash -kb yasui -km default
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/yd68/readme.md b/keyboards/yd68/readme.md
deleted file mode 100644
index 7e5e83bcc9..0000000000
--- a/keyboards/yd68/readme.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# yd68
-
-[yd68](https://imgur.com/gallery/Ygo668L)
-
-A 68-key board with RGB underlighting and bluetooth.
-
-Keyboard Maintainer: [Izzy84075](https://github.com/izzy84075)
-Hardware Supported: YD68/YD68v2
-Hardware Availability: [KBDFans](https://kbdfans.cn/collections/diy-kit/products/yd68-65-bluetooth-custom-keyboard-pcb)
-
-Make example for this keyboard (after setting up your build environment):
-
- make yd68: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/chili/chili.c b/keyboards/ydkb/chili/chili.c
index f629a6d60a..f629a6d60a 100644
--- a/keyboards/chili/chili.c
+++ b/keyboards/ydkb/chili/chili.c
diff --git a/keyboards/chili/chili.h b/keyboards/ydkb/chili/chili.h
index f5e1444b94..f5e1444b94 100644
--- a/keyboards/chili/chili.h
+++ b/keyboards/ydkb/chili/chili.h
diff --git a/keyboards/chili/config.h b/keyboards/ydkb/chili/config.h
index 13bd700363..13bd700363 100644
--- a/keyboards/chili/config.h
+++ b/keyboards/ydkb/chili/config.h
diff --git a/keyboards/chili/info.json b/keyboards/ydkb/chili/info.json
index 8e92d83de0..8e92d83de0 100644
--- a/keyboards/chili/info.json
+++ b/keyboards/ydkb/chili/info.json
diff --git a/keyboards/chili/keymaps/default/keymap.c b/keyboards/ydkb/chili/keymaps/default/keymap.c
index 32ac9a066d..32ac9a066d 100644
--- a/keyboards/chili/keymaps/default/keymap.c
+++ b/keyboards/ydkb/chili/keymaps/default/keymap.c
diff --git a/keyboards/chili/keymaps/via/keymap.c b/keyboards/ydkb/chili/keymaps/via/keymap.c
index 9d5cdd303f..9d5cdd303f 100644
--- a/keyboards/chili/keymaps/via/keymap.c
+++ b/keyboards/ydkb/chili/keymaps/via/keymap.c
diff --git a/keyboards/seigaiha/keymaps/via/rules.mk b/keyboards/ydkb/chili/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/seigaiha/keymaps/via/rules.mk
+++ b/keyboards/ydkb/chili/keymaps/via/rules.mk
diff --git a/keyboards/ydkb/chili/readme.md b/keyboards/ydkb/chili/readme.md
new file mode 100644
index 0000000000..c7be92b9e5
--- /dev/null
+++ b/keyboards/ydkb/chili/readme.md
@@ -0,0 +1,15 @@
+# YDKB Chili
+
+[Chili PCB](https://i.imgur.com/fKi896a.jpg)
+
+The YDKB Chili is a Cherry G80-3000 replacement PCB utilizing the ATmega32U4 microcontroller.
+
+* Keyboard Maintainer: QMK community
+* Hardware Supported: YDKB Chili
+* Hardware Availability: [TaoBao](https://item.taobao.com/item.htm?id=565823984744)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make ydkb/chili: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/chili/rules.mk b/keyboards/ydkb/chili/rules.mk
index 31559786a6..31559786a6 100644
--- a/keyboards/chili/rules.mk
+++ b/keyboards/ydkb/chili/rules.mk
diff --git a/keyboards/just60/config.h b/keyboards/ydkb/just60/config.h
index b2ff156310..b2ff156310 100644
--- a/keyboards/just60/config.h
+++ b/keyboards/ydkb/just60/config.h
diff --git a/keyboards/just60/info.json b/keyboards/ydkb/just60/info.json
index 5f42033845..5f42033845 100644
--- a/keyboards/just60/info.json
+++ b/keyboards/ydkb/just60/info.json
diff --git a/keyboards/just60/just60.h b/keyboards/ydkb/just60/just60.h
index 426324fe02..426324fe02 100644
--- a/keyboards/just60/just60.h
+++ b/keyboards/ydkb/just60/just60.h
diff --git a/keyboards/just60/keymaps/default/keymap.c b/keyboards/ydkb/just60/keymaps/default/keymap.c
index da034e0e44..da034e0e44 100644
--- a/keyboards/just60/keymaps/default/keymap.c
+++ b/keyboards/ydkb/just60/keymaps/default/keymap.c
diff --git a/keyboards/just60/keymaps/default/readme.md b/keyboards/ydkb/just60/keymaps/default/readme.md
index 927618c910..927618c910 100644
--- a/keyboards/just60/keymaps/default/readme.md
+++ b/keyboards/ydkb/just60/keymaps/default/readme.md
diff --git a/keyboards/just60/keymaps/thinxer/keymap.c b/keyboards/ydkb/just60/keymaps/thinxer/keymap.c
index da034e0e44..da034e0e44 100644
--- a/keyboards/just60/keymaps/thinxer/keymap.c
+++ b/keyboards/ydkb/just60/keymaps/thinxer/keymap.c
diff --git a/keyboards/just60/keymaps/thinxer/readme.md b/keyboards/ydkb/just60/keymaps/thinxer/readme.md
index 9cd12c192f..9cd12c192f 100644
--- a/keyboards/just60/keymaps/thinxer/readme.md
+++ b/keyboards/ydkb/just60/keymaps/thinxer/readme.md
diff --git a/keyboards/just60/keymaps/thinxer/rules.mk b/keyboards/ydkb/just60/keymaps/thinxer/rules.mk
index 0613ea8667..0613ea8667 100644
--- a/keyboards/just60/keymaps/thinxer/rules.mk
+++ b/keyboards/ydkb/just60/keymaps/thinxer/rules.mk
diff --git a/keyboards/ydkb/just60/readme.md b/keyboards/ydkb/just60/readme.md
new file mode 100644
index 0000000000..1fe05bd3ea
--- /dev/null
+++ b/keyboards/ydkb/just60/readme.md
@@ -0,0 +1,17 @@
+# Just60
+
+Just60 keyboard produced by Yang. The keyboard comes with a custom Mass Storage Device bootloader and a TMK based firmware from ydkb.io.
+
+To use a QMK based firmware, you might want to install a QMK bootloader. The PCB exposes 6 pins for ISP(In-System Programming), and they are located just under the ATMega32U4 chip. From left to right, the pins are `VCC`, `SCLK`, `MOSI`, `MISO`, `RESET`, `GND`. The `GND` is the square one. You could program the flash with any AVR programmer, or a Raspberry Pi with `avrdude`.
+
+Backlight LEDs and Bluetooth are not working yet.
+
+* Keyboard Maintainer: [Jianfei Wang](https://github.com/thinxer)
+* Hardware Supported: Just60 (atmega32u4)
+* Hardware Availability: https://item.taobao.com/item.htm?id=564176654249
+
+Make example for this keyboard (after setting up your build environment):
+
+ make ydkb/just60: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/just60/rules.mk b/keyboards/ydkb/just60/rules.mk
index 7323e8f1e2..7323e8f1e2 100644
--- a/keyboards/just60/rules.mk
+++ b/keyboards/ydkb/just60/rules.mk
diff --git a/keyboards/yd68/config.h b/keyboards/ydkb/yd68/config.h
index a501a98476..a501a98476 100644
--- a/keyboards/yd68/config.h
+++ b/keyboards/ydkb/yd68/config.h
diff --git a/keyboards/yd68/info.json b/keyboards/ydkb/yd68/info.json
index 8797620557..8797620557 100644
--- a/keyboards/yd68/info.json
+++ b/keyboards/ydkb/yd68/info.json
diff --git a/keyboards/yd68/keymaps/default/keymap.c b/keyboards/ydkb/yd68/keymaps/default/keymap.c
index c8b49c76a3..c8b49c76a3 100644
--- a/keyboards/yd68/keymaps/default/keymap.c
+++ b/keyboards/ydkb/yd68/keymaps/default/keymap.c
diff --git a/keyboards/yd68/keymaps/default/readme.md b/keyboards/ydkb/yd68/keymaps/default/readme.md
index 877e64f18b..877e64f18b 100644
--- a/keyboards/yd68/keymaps/default/readme.md
+++ b/keyboards/ydkb/yd68/keymaps/default/readme.md
diff --git a/keyboards/ydkb/yd68/readme.md b/keyboards/ydkb/yd68/readme.md
new file mode 100644
index 0000000000..2632e8e9f8
--- /dev/null
+++ b/keyboards/ydkb/yd68/readme.md
@@ -0,0 +1,15 @@
+# yd68
+
+[yd68](https://imgur.com/gallery/Ygo668L)
+
+A 68-key board with RGB underlighting and bluetooth.
+
+Keyboard Maintainer: [Izzy84075](https://github.com/izzy84075)
+Hardware Supported: YD68/YD68v2
+Hardware Availability: [KBDFans](https://kbdfans.cn/collections/diy-kit/products/yd68-65-bluetooth-custom-keyboard-pcb)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make ydkb/yd68: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/yd68/rules.mk b/keyboards/ydkb/yd68/rules.mk
index 561e8f4ca1..561e8f4ca1 100644
--- a/keyboards/yd68/rules.mk
+++ b/keyboards/ydkb/yd68/rules.mk
diff --git a/keyboards/yd68/yd68.c b/keyboards/ydkb/yd68/yd68.c
index 22f75f7f81..22f75f7f81 100644
--- a/keyboards/yd68/yd68.c
+++ b/keyboards/ydkb/yd68/yd68.c
diff --git a/keyboards/yd68/yd68.h b/keyboards/ydkb/yd68/yd68.h
index 3303bd899e..3303bd899e 100644
--- a/keyboards/yd68/yd68.h
+++ b/keyboards/ydkb/yd68/yd68.h
diff --git a/keyboards/barleycorn/barleycorn.c b/keyboards/yiancardesigns/barleycorn/barleycorn.c
index 4d555de195..4d555de195 100644
--- a/keyboards/barleycorn/barleycorn.c
+++ b/keyboards/yiancardesigns/barleycorn/barleycorn.c
diff --git a/keyboards/barleycorn/barleycorn.h b/keyboards/yiancardesigns/barleycorn/barleycorn.h
index 0b266feaed..0b266feaed 100644
--- a/keyboards/barleycorn/barleycorn.h
+++ b/keyboards/yiancardesigns/barleycorn/barleycorn.h
diff --git a/keyboards/barleycorn/config.h b/keyboards/yiancardesigns/barleycorn/config.h
index 77714a87fc..77714a87fc 100644
--- a/keyboards/barleycorn/config.h
+++ b/keyboards/yiancardesigns/barleycorn/config.h
diff --git a/keyboards/barleycorn/info.json b/keyboards/yiancardesigns/barleycorn/info.json
index 293f321b2c..293f321b2c 100644
--- a/keyboards/barleycorn/info.json
+++ b/keyboards/yiancardesigns/barleycorn/info.json
diff --git a/keyboards/barleycorn/keymaps/default/keymap.c b/keyboards/yiancardesigns/barleycorn/keymaps/default/keymap.c
index 230b78e991..230b78e991 100644
--- a/keyboards/barleycorn/keymaps/default/keymap.c
+++ b/keyboards/yiancardesigns/barleycorn/keymaps/default/keymap.c
diff --git a/keyboards/barleycorn/keymaps/default/readme.md b/keyboards/yiancardesigns/barleycorn/keymaps/default/readme.md
index 04903f8cc9..04903f8cc9 100644
--- a/keyboards/barleycorn/keymaps/default/readme.md
+++ b/keyboards/yiancardesigns/barleycorn/keymaps/default/readme.md
diff --git a/keyboards/barleycorn/keymaps/iso/keymap.c b/keyboards/yiancardesigns/barleycorn/keymaps/iso/keymap.c
index 7fd4d06969..7fd4d06969 100644
--- a/keyboards/barleycorn/keymaps/iso/keymap.c
+++ b/keyboards/yiancardesigns/barleycorn/keymaps/iso/keymap.c
diff --git a/keyboards/barleycorn/keymaps/iso/readme.md b/keyboards/yiancardesigns/barleycorn/keymaps/iso/readme.md
index 492abfcecc..492abfcecc 100644
--- a/keyboards/barleycorn/keymaps/iso/readme.md
+++ b/keyboards/yiancardesigns/barleycorn/keymaps/iso/readme.md
diff --git a/keyboards/barleycorn/keymaps/via/keymap.c b/keyboards/yiancardesigns/barleycorn/keymaps/via/keymap.c
index 90ce60d1ea..90ce60d1ea 100644
--- a/keyboards/barleycorn/keymaps/via/keymap.c
+++ b/keyboards/yiancardesigns/barleycorn/keymaps/via/keymap.c
diff --git a/keyboards/barleycorn/keymaps/via/readme.md b/keyboards/yiancardesigns/barleycorn/keymaps/via/readme.md
index b82bc8e79f..b82bc8e79f 100644
--- a/keyboards/barleycorn/keymaps/via/readme.md
+++ b/keyboards/yiancardesigns/barleycorn/keymaps/via/readme.md
diff --git a/keyboards/wings42/rev1/keymaps/via/rules.mk b/keyboards/yiancardesigns/barleycorn/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/wings42/rev1/keymaps/via/rules.mk
+++ b/keyboards/yiancardesigns/barleycorn/keymaps/via/rules.mk
diff --git a/keyboards/barleycorn/matrix.c b/keyboards/yiancardesigns/barleycorn/matrix.c
index 99366d6098..99366d6098 100644
--- a/keyboards/barleycorn/matrix.c
+++ b/keyboards/yiancardesigns/barleycorn/matrix.c
diff --git a/keyboards/yiancardesigns/barleycorn/readme.md b/keyboards/yiancardesigns/barleycorn/readme.md
new file mode 100644
index 0000000000..c98be3e042
--- /dev/null
+++ b/keyboards/yiancardesigns/barleycorn/readme.md
@@ -0,0 +1,23 @@
+# Barleycorn
+
+![Barleycorn](https://i.imgur.com/vi3L1HYl.png)
+
+An f-row less compact 1800 kit with only through hole components.
+
+* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
+* Hardware Supported: ATMEGA328p with vusb [PCB](https://github.com/yiancar/barleycorn_pcb)
+* Hardware Availability: https://mykeyboard.eu/, https://novelkeys.xyz
+
+Make example for this keyboard (after setting up your build environment):
+
+ make yiancardesigns/barleycorn:default
+
+Flashing example for this keyboard:
+
+ make yiancardesigns/barleycorn:default:flash
+
+Bootloader:
+use usbasploader from HSGW's repository.
+https://github.com/hsgw/USBaspLoader/tree/plaid
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/barleycorn/rules.mk b/keyboards/yiancardesigns/barleycorn/rules.mk
index c7d4310cb2..c7d4310cb2 100644
--- a/keyboards/barleycorn/rules.mk
+++ b/keyboards/yiancardesigns/barleycorn/rules.mk
diff --git a/keyboards/gingham/config.h b/keyboards/yiancardesigns/gingham/config.h
index 62f25b06c9..62f25b06c9 100644
--- a/keyboards/gingham/config.h
+++ b/keyboards/yiancardesigns/gingham/config.h
diff --git a/keyboards/gingham/gingham.c b/keyboards/yiancardesigns/gingham/gingham.c
index 9a5ffe4530..9a5ffe4530 100644
--- a/keyboards/gingham/gingham.c
+++ b/keyboards/yiancardesigns/gingham/gingham.c
diff --git a/keyboards/gingham/gingham.h b/keyboards/yiancardesigns/gingham/gingham.h
index a9785b5416..a9785b5416 100644
--- a/keyboards/gingham/gingham.h
+++ b/keyboards/yiancardesigns/gingham/gingham.h
diff --git a/keyboards/gingham/info.json b/keyboards/yiancardesigns/gingham/info.json
index 0f9e81decc..0f9e81decc 100644
--- a/keyboards/gingham/info.json
+++ b/keyboards/yiancardesigns/gingham/info.json
diff --git a/keyboards/gingham/keymaps/codecoffeecode/keymap.c b/keyboards/yiancardesigns/gingham/keymaps/codecoffeecode/keymap.c
index 5c3891845d..5c3891845d 100644
--- a/keyboards/gingham/keymaps/codecoffeecode/keymap.c
+++ b/keyboards/yiancardesigns/gingham/keymaps/codecoffeecode/keymap.c
diff --git a/keyboards/gingham/keymaps/codecoffeecode/readme.md b/keyboards/yiancardesigns/gingham/keymaps/codecoffeecode/readme.md
index 6f6dbfc859..6f6dbfc859 100644
--- a/keyboards/gingham/keymaps/codecoffeecode/readme.md
+++ b/keyboards/yiancardesigns/gingham/keymaps/codecoffeecode/readme.md
diff --git a/keyboards/gingham/keymaps/default/keymap.c b/keyboards/yiancardesigns/gingham/keymaps/default/keymap.c
index f54d6d8bdc..f54d6d8bdc 100644
--- a/keyboards/gingham/keymaps/default/keymap.c
+++ b/keyboards/yiancardesigns/gingham/keymaps/default/keymap.c
diff --git a/keyboards/gingham/keymaps/default/readme.md b/keyboards/yiancardesigns/gingham/keymaps/default/readme.md
index 2f3372492e..2f3372492e 100644
--- a/keyboards/gingham/keymaps/default/readme.md
+++ b/keyboards/yiancardesigns/gingham/keymaps/default/readme.md
diff --git a/keyboards/gingham/keymaps/iso/keymap.c b/keyboards/yiancardesigns/gingham/keymaps/iso/keymap.c
index 6aae0ccf36..6aae0ccf36 100644
--- a/keyboards/gingham/keymaps/iso/keymap.c
+++ b/keyboards/yiancardesigns/gingham/keymaps/iso/keymap.c
diff --git a/keyboards/gingham/keymaps/iso/readme.md b/keyboards/yiancardesigns/gingham/keymaps/iso/readme.md
index cd29c28900..cd29c28900 100644
--- a/keyboards/gingham/keymaps/iso/readme.md
+++ b/keyboards/yiancardesigns/gingham/keymaps/iso/readme.md
diff --git a/keyboards/gingham/keymaps/via/keymap.c b/keyboards/yiancardesigns/gingham/keymaps/via/keymap.c
index f303449739..f303449739 100644
--- a/keyboards/gingham/keymaps/via/keymap.c
+++ b/keyboards/yiancardesigns/gingham/keymaps/via/keymap.c
diff --git a/keyboards/gingham/keymaps/via/readme.md b/keyboards/yiancardesigns/gingham/keymaps/via/readme.md
index b82bc8e79f..b82bc8e79f 100644
--- a/keyboards/gingham/keymaps/via/readme.md
+++ b/keyboards/yiancardesigns/gingham/keymaps/via/readme.md
diff --git a/keyboards/wings42/rev1_extkeys/keymaps/via/rules.mk b/keyboards/yiancardesigns/gingham/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/wings42/rev1_extkeys/keymaps/via/rules.mk
+++ b/keyboards/yiancardesigns/gingham/keymaps/via/rules.mk
diff --git a/keyboards/gingham/matrix.c b/keyboards/yiancardesigns/gingham/matrix.c
index 47c8830565..47c8830565 100644
--- a/keyboards/gingham/matrix.c
+++ b/keyboards/yiancardesigns/gingham/matrix.c
diff --git a/keyboards/yiancardesigns/gingham/readme.md b/keyboards/yiancardesigns/gingham/readme.md
new file mode 100644
index 0000000000..994fcaac55
--- /dev/null
+++ b/keyboards/yiancardesigns/gingham/readme.md
@@ -0,0 +1,23 @@
+# Gingham
+
+![gingham](https://yiancar-designs.com/wp-content/uploads/2019/06/IMG_20190625_233619.jpg)
+
+A 60% keyboard with only through hole components.
+
+Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
+Hardware Supported: ATMEGA328p with vusb [PCB](https://github.com/yiancar/gingham_pcb)
+Hardware Availability: https://yiancar-designs.com/, https://novelkeys.xyz, https://mechboards.co.uk/
+
+Make example for this keyboard (after setting up your build environment):
+
+ make yiancardesigns/gingham:default
+
+Flashing example for this keyboard:
+
+ make yiancardesigns/gingham:default:flash
+
+Bootloader:
+use usbasploader HSGW's my repository.
+https://github.com/hsgw/USBaspLoader/tree/plaid
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/gingham/rules.mk b/keyboards/yiancardesigns/gingham/rules.mk
index 977d9b9d81..977d9b9d81 100644
--- a/keyboards/gingham/rules.mk
+++ b/keyboards/yiancardesigns/gingham/rules.mk
diff --git a/keyboards/seigaiha/config.h b/keyboards/yiancardesigns/seigaiha/config.h
index 5e87bd6f83..5e87bd6f83 100644
--- a/keyboards/seigaiha/config.h
+++ b/keyboards/yiancardesigns/seigaiha/config.h
diff --git a/keyboards/seigaiha/info.json b/keyboards/yiancardesigns/seigaiha/info.json
index 09bc2d09d0..09bc2d09d0 100644
--- a/keyboards/seigaiha/info.json
+++ b/keyboards/yiancardesigns/seigaiha/info.json
diff --git a/keyboards/seigaiha/keymaps/default/keymap.c b/keyboards/yiancardesigns/seigaiha/keymaps/default/keymap.c
index 607d85a132..607d85a132 100644
--- a/keyboards/seigaiha/keymaps/default/keymap.c
+++ b/keyboards/yiancardesigns/seigaiha/keymaps/default/keymap.c
diff --git a/keyboards/seigaiha/keymaps/default/readme.md b/keyboards/yiancardesigns/seigaiha/keymaps/default/readme.md
index dceb6080e4..dceb6080e4 100644
--- a/keyboards/seigaiha/keymaps/default/readme.md
+++ b/keyboards/yiancardesigns/seigaiha/keymaps/default/readme.md
diff --git a/keyboards/seigaiha/keymaps/via/keymap.c b/keyboards/yiancardesigns/seigaiha/keymaps/via/keymap.c
index 00f1b01501..00f1b01501 100644
--- a/keyboards/seigaiha/keymaps/via/keymap.c
+++ b/keyboards/yiancardesigns/seigaiha/keymaps/via/keymap.c
diff --git a/keyboards/seigaiha/keymaps/via/readme.md b/keyboards/yiancardesigns/seigaiha/keymaps/via/readme.md
index 8f626d49e3..8f626d49e3 100644
--- a/keyboards/seigaiha/keymaps/via/readme.md
+++ b/keyboards/yiancardesigns/seigaiha/keymaps/via/readme.md
diff --git a/keyboards/yasui/keymaps/via/rules.mk b/keyboards/yiancardesigns/seigaiha/keymaps/via/rules.mk
index 1e5b99807c..1e5b99807c 100644
--- a/keyboards/yasui/keymaps/via/rules.mk
+++ b/keyboards/yiancardesigns/seigaiha/keymaps/via/rules.mk
diff --git a/keyboards/seigaiha/matrix.c b/keyboards/yiancardesigns/seigaiha/matrix.c
index 212b8015f0..212b8015f0 100644
--- a/keyboards/seigaiha/matrix.c
+++ b/keyboards/yiancardesigns/seigaiha/matrix.c
diff --git a/keyboards/yiancardesigns/seigaiha/readme.md b/keyboards/yiancardesigns/seigaiha/readme.md
new file mode 100644
index 0000000000..8c81723563
--- /dev/null
+++ b/keyboards/yiancardesigns/seigaiha/readme.md
@@ -0,0 +1,23 @@
+# Seigaiha
+
+![Seigaiha](https://i.imgur.com/GCGyOmph.jpg)
+
+An alice layout kit with only through hole components.
+
+* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
+* Hardware Supported: ATMEGA328p with vusb [PCB](https://github.com/yiancar/seigaiha_pcb)
+* Hardware Availability: https://mykeyboard.eu/, https://novelkeys.xyz
+
+Make example for this keyboard (after setting up your build environment):
+
+ make yiancardesigns/seigaiha:default
+
+Flashing example for this keyboard:
+
+ make yiancardesigns/seigaiha:default:flash
+
+Bootloader:
+use usbasploader from HSGW's repository.
+https://github.com/hsgw/USBaspLoader/tree/plaid
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/seigaiha/rules.mk b/keyboards/yiancardesigns/seigaiha/rules.mk
index 0e494f8488..0e494f8488 100644
--- a/keyboards/seigaiha/rules.mk
+++ b/keyboards/yiancardesigns/seigaiha/rules.mk
diff --git a/keyboards/seigaiha/seigaiha.c b/keyboards/yiancardesigns/seigaiha/seigaiha.c
index 911034eb56..911034eb56 100644
--- a/keyboards/seigaiha/seigaiha.c
+++ b/keyboards/yiancardesigns/seigaiha/seigaiha.c
diff --git a/keyboards/seigaiha/seigaiha.h b/keyboards/yiancardesigns/seigaiha/seigaiha.h
index e05c6f5242..e05c6f5242 100644
--- a/keyboards/seigaiha/seigaiha.h
+++ b/keyboards/yiancardesigns/seigaiha/seigaiha.h
diff --git a/keyboards/ymd75/readme.md b/keyboards/ymd75/readme.md
deleted file mode 100644
index 99e9f656c0..0000000000
--- a/keyboards/ymd75/readme.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# YMD75 / MT84
-
-75% keyboard from YMDK. YMDK sell the board and name it "YMD75", however revision 1 of the PCB has "MT84" printed on both sides.
-
-This firmware can also be flashed onto the KBDFans KBD75 Round 2 Bootmapper Client boards sold during the mid-2018 timeframe.
-
-* Keyboard Maintainer: [Wayne K Jones](github.com/WarmCatUK)
-* Hardware Supported:
- - rev1 (ATmega32a)
- - rev2 (ATmega32a)
- - rev3 (ATmega32u4)
-* Hardware Availability: <https://www.aliexpress.com/item/32812690592.html>
-
-Make example for this keyboard (after setting up your build environment):
-
- make ymd75/rev1:default
-
-Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
-
- make ymd75/rev1:default:flash
-
-**Reset Key**: Hold down the key located at *Key below the top right key*, commonly programmed as *Backspace* while plugging in the keyboard. On PCB revision 2, enter the bootloader by holding `L_CTRL` while plugging in the keyboard.
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/ymd75/rules.mk b/keyboards/ymd75/rules.mk
deleted file mode 100644
index 756d20c54c..0000000000
--- a/keyboards/ymd75/rules.mk
+++ /dev/null
@@ -1 +0,0 @@
-DEFAULT_FOLDER = ymd75/rev1
diff --git a/keyboards/ymd75/ymd75.h b/keyboards/ymd75/ymd75.h
deleted file mode 100644
index 134f08060f..0000000000
--- a/keyboards/ymd75/ymd75.h
+++ /dev/null
@@ -1,11 +0,0 @@
-#pragma once
-
-#include "quantum.h"
-
-#if defined(KEYBOARD_ymd75_rev1)
- #include "rev1.h"
-#elif defined(KEYBOARD_ymd75_rev2)
- #include "rev2.h"
-#elif defined(KEYBOARD_ymd75_rev3)
- #include "rev3.h"
-#endif
diff --git a/keyboards/ymd96/readme.md b/keyboards/ymd96/readme.md
deleted file mode 100644
index 59d6b73379..0000000000
--- a/keyboards/ymd96/readme.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# YMD96
-
-A 96-keyboard which supports both ANSI and ISO along with many different layout combinations, and RGB underglow.
-
-* Keyboard maintainer: [Andrew](https://github.com/sparkyman215)
-* Hardware Supported: YMD96 with the ATmega32a chip.
-* Hardware Availability: The GB was run June 2017, [in this thread](https://www.reddit.com/r/mechmarket/comments/6hu3yx/vendor_ymd96_gb_is_now_live_68_an_universal_and/). The vendor has stated that they plan on selling more rounds.
-
-Make example for this keyboard (after setting up your build environment):
-
- make ymd96:default
-
-Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
-
- make ymd96:default:flash
-
-**Reset Key**: Hold down the key commonly programmed as *L_Ctrl* while plugging in the keyboard.
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/ymdk_np21/config.h b/keyboards/ymdk/np21/config.h
index 83423792b0..83423792b0 100644
--- a/keyboards/ymdk_np21/config.h
+++ b/keyboards/ymdk/np21/config.h
diff --git a/keyboards/ymdk_np21/info.json b/keyboards/ymdk/np21/info.json
index 6a611d7a38..6a611d7a38 100644
--- a/keyboards/ymdk_np21/info.json
+++ b/keyboards/ymdk/np21/info.json
diff --git a/keyboards/ymdk_np21/keymaps/default/keymap.c b/keyboards/ymdk/np21/keymaps/default/keymap.c
index e15fb1d6eb..e15fb1d6eb 100644
--- a/keyboards/ymdk_np21/keymaps/default/keymap.c
+++ b/keyboards/ymdk/np21/keymaps/default/keymap.c
diff --git a/keyboards/ymdk_np21/keymaps/default/readme.md b/keyboards/ymdk/np21/keymaps/default/readme.md
index 3a4730f7e6..3a4730f7e6 100644
--- a/keyboards/ymdk_np21/keymaps/default/readme.md
+++ b/keyboards/ymdk/np21/keymaps/default/readme.md
diff --git a/keyboards/ymdk_np21/keymaps/via/keymap.c b/keyboards/ymdk/np21/keymaps/via/keymap.c
index b361414023..b361414023 100644
--- a/keyboards/ymdk_np21/keymaps/via/keymap.c
+++ b/keyboards/ymdk/np21/keymaps/via/keymap.c
diff --git a/keyboards/ymdk_np21/keymaps/via/rules.mk b/keyboards/ymdk/np21/keymaps/via/rules.mk
index 36b7ba9cbc..36b7ba9cbc 100644
--- a/keyboards/ymdk_np21/keymaps/via/rules.mk
+++ b/keyboards/ymdk/np21/keymaps/via/rules.mk
diff --git a/keyboards/ymdk/np21/np21.c b/keyboards/ymdk/np21/np21.c
new file mode 100644
index 0000000000..824cfb0d1a
--- /dev/null
+++ b/keyboards/ymdk/np21/np21.c
@@ -0,0 +1,19 @@
+/*
+Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
+Modified 2018 Kenneth A. <github.com/krusli>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General 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 "np21.h"
diff --git a/keyboards/ymdk_np21/ymdk_np21.h b/keyboards/ymdk/np21/np21.h
index 7434cf016d..7434cf016d 100644
--- a/keyboards/ymdk_np21/ymdk_np21.h
+++ b/keyboards/ymdk/np21/np21.h
diff --git a/keyboards/ymdk/np21/readme.md b/keyboards/ymdk/np21/readme.md
new file mode 100644
index 0000000000..e9eaad9b7b
--- /dev/null
+++ b/keyboards/ymdk/np21/readme.md
@@ -0,0 +1,21 @@
+# YMDK NP21
+
+![kp21 &mdash; full grid layout](https://ae01.alicdn.com/kf/HTB1d.txfHsTMeJjSszhq6AGCFXaF.jpg?size=35021&height=662&width=1000&hash=62b3a453686e2154dc51a7af67495e28)
+
+ps2avrGB based number-pad sold fully assembled by YMDK on Aliexpress.
+
+* Keyboard Maintainer: [QMK Community](https://github.com/qmk)
+* Hardware Supported: Atmega32A
+* Hardware Availability: [AliExpress](https://www.aliexpress.com/item/21-Key-NPKC-Programmable-Cherry-MX-Kailh-Gateron-Switches-Mechanical-Keyboard-Numpad-Free-shipping/32812732361.html)
+
+Make example for this keyboard (after setting up your build environment):
+
+ make ymdk/np21:default
+
+Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
+
+ make ymdk/np21:default:flash
+
+**Reset Key**: Hold down the 'Top Left Key' (USB on top) while plugging in the keyboard.
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/ymdk_np21/rules.mk b/keyboards/ymdk/np21/rules.mk
index 7316ceff6d..7316ceff6d 100644
--- a/keyboards/ymdk_np21/rules.mk
+++ b/keyboards/ymdk/np21/rules.mk
diff --git a/keyboards/ymd75/.noci b/keyboards/ymdk/ymd75/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/ymd75/.noci
+++ b/keyboards/ymdk/ymd75/.noci
diff --git a/keyboards/ymd75/config.h b/keyboards/ymdk/ymd75/config.h
index a828c4d64b..a828c4d64b 100644
--- a/keyboards/ymd75/config.h
+++ b/keyboards/ymdk/ymd75/config.h
diff --git a/keyboards/ymd75/info.json b/keyboards/ymdk/ymd75/info.json
index 65a53e87cd..65a53e87cd 100644
--- a/keyboards/ymd75/info.json
+++ b/keyboards/ymdk/ymd75/info.json
diff --git a/keyboards/ymd75/keymaps/default/keymap.c b/keyboards/ymdk/ymd75/keymaps/default/keymap.c
index 2b64124681..2b64124681 100644
--- a/keyboards/ymd75/keymaps/default/keymap.c
+++ b/keyboards/ymdk/ymd75/keymaps/default/keymap.c
diff --git a/keyboards/ymd75/keymaps/default_iso/keymap.c b/keyboards/ymdk/ymd75/keymaps/default_iso/keymap.c
index 2008dddf8c..2008dddf8c 100644
--- a/keyboards/ymd75/keymaps/default_iso/keymap.c
+++ b/keyboards/ymdk/ymd75/keymaps/default_iso/keymap.c
diff --git a/keyboards/ymd75/keymaps/default_iso_rwkl/keymap.c b/keyboards/ymdk/ymd75/keymaps/default_iso_rwkl/keymap.c
index 0db1c8d288..0db1c8d288 100644
--- a/keyboards/ymd75/keymaps/default_iso_rwkl/keymap.c
+++ b/keyboards/ymdk/ymd75/keymaps/default_iso_rwkl/keymap.c
diff --git a/keyboards/ymd75/keymaps/via/keymap.c b/keyboards/ymdk/ymd75/keymaps/via/keymap.c
index 4a9107bf95..4a9107bf95 100644
--- a/keyboards/ymd75/keymaps/via/keymap.c
+++ b/keyboards/ymdk/ymd75/keymaps/via/keymap.c
diff --git a/keyboards/ymd75/keymaps/via/rules.mk b/keyboards/ymdk/ymd75/keymaps/via/rules.mk
index 152460f304..152460f304 100644
--- a/keyboards/ymd75/keymaps/via/rules.mk
+++ b/keyboards/ymdk/ymd75/keymaps/via/rules.mk
diff --git a/keyboards/ymdk/ymd75/readme.md b/keyboards/ymdk/ymd75/readme.md
new file mode 100644
index 0000000000..78b4d089af
--- /dev/null
+++ b/keyboards/ymdk/ymd75/readme.md
@@ -0,0 +1,24 @@
+# YMD75 / MT84
+
+75% keyboard from YMDK. YMDK sell the board and name it "YMD75", however revision 1 of the PCB has "MT84" printed on both sides.
+
+This firmware can also be flashed onto the KBDFans KBD75 Round 2 Bootmapper Client boards sold during the mid-2018 timeframe.
+
+* Keyboard Maintainer: [Wayne K Jones](github.com/WarmCatUK)
+* Hardware Supported:
+ - rev1 (ATmega32a)
+ - rev2 (ATmega32a)
+ - rev3 (ATmega32u4)
+* Hardware Availability: <https://www.aliexpress.com/item/32812690592.html>
+
+Make example for this keyboard (after setting up your build environment):
+
+ make ymdk/ymd75/rev1:default
+
+Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
+
+ make ymdk/ymd75/rev1:default:flash
+
+**Reset Key**: Hold down the key located at *Key below the top right key*, commonly programmed as *Backspace* while plugging in the keyboard. On PCB revision 2, enter the bootloader by holding `L_CTRL` while plugging in the keyboard.
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/ymd75/rev1/.noci b/keyboards/ymdk/ymd75/rev1/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/ymd75/rev1/.noci
+++ b/keyboards/ymdk/ymd75/rev1/.noci
diff --git a/keyboards/ymd75/rev1/config.h b/keyboards/ymdk/ymd75/rev1/config.h
index bd169471af..bd169471af 100644
--- a/keyboards/ymd75/rev1/config.h
+++ b/keyboards/ymdk/ymd75/rev1/config.h
diff --git a/keyboards/ymd75/rev1/rev1.c b/keyboards/ymdk/ymd75/rev1/rev1.c
index c1ad021b15..c1ad021b15 100644
--- a/keyboards/ymd75/rev1/rev1.c
+++ b/keyboards/ymdk/ymd75/rev1/rev1.c
diff --git a/keyboards/ymd75/rev1/rev1.h b/keyboards/ymdk/ymd75/rev1/rev1.h
index d88e8fb802..d88e8fb802 100644
--- a/keyboards/ymd75/rev1/rev1.h
+++ b/keyboards/ymdk/ymd75/rev1/rev1.h
diff --git a/keyboards/ymd75/rev1/rules.mk b/keyboards/ymdk/ymd75/rev1/rules.mk
index 816b0060c9..816b0060c9 100644
--- a/keyboards/ymd75/rev1/rules.mk
+++ b/keyboards/ymdk/ymd75/rev1/rules.mk
diff --git a/keyboards/ymd75/rev2/.noci b/keyboards/ymdk/ymd75/rev2/.noci
index e69de29bb2..e69de29bb2 100644
--- a/keyboards/ymd75/rev2/.noci
+++ b/keyboards/ymdk/ymd75/rev2/.noci
diff --git a/keyboards/ymd75/rev2/config.h b/keyboards/ymdk/ymd75/rev2/config.h
index 41a75e6271..41a75e6271 100644
--- a/keyboards/ymd75/rev2/config.h
+++ b/keyboards/ymdk/ymd75/rev2/config.h
diff --git a/keyboards/ymd75/rev2/rev2.c b/keyboards/ymdk/ymd75/rev2/rev2.c
index c1ad021b15..c1ad021b15 100644
--- a/keyboards/ymd75/rev2/rev2.c
+++ b/keyboards/ymdk/ymd75/rev2/rev2.c
diff --git a/keyboards/ymd75/rev2/rev2.h b/keyboards/ymdk/ymd75/rev2/rev2.h
index 952858382b..952858382b 100644
--- a/keyboards/ymd75/rev2/rev2.h
+++ b/keyboards/ymdk/ymd75/rev2/rev2.h
diff --git a/keyboards/ymd75/rev2/rules.mk b/keyboards/ymdk/ymd75/rev2/rules.mk
index 816b0060c9..816b0060c9 100644
--- a/keyboards/ymd75/rev2/rules.mk
+++ b/keyboards/ymdk/ymd75/rev2/rules.mk
diff --git a/keyboards/ymd75/rev3/config.h b/keyboards/ymdk/ymd75/rev3/config.h
index cbed2e00ee..cbed2e00ee 100644
--- a/keyboards/ymd75/rev3/config.h
+++ b/keyboards/ymdk/ymd75/rev3/config.h
diff --git a/keyboards/ymd75/rev3/rev3.c b/keyboards/ymdk/ymd75/rev3/rev3.c
index c1ad021b15..c1ad021b15 100644
--- a/keyboards/ymd75/rev3/rev3.c
+++ b/keyboards/ymdk/ymd75/rev3/rev3.c
diff --git a/keyboards/ymd75/rev3/rev3.h b/keyboards/ymdk/ymd75/rev3/rev3.h
index d247797736..d247797736 100644
--- a/keyboards/ymd75/rev3/rev3.h
+++ b/keyboards/ymdk/ymd75/rev3/rev3.h
diff --git a/keyboards/ymd75/rev3/rules.mk b/keyboards/ymdk/ymd75/rev3/rules.mk
index 258c4d3ff6..258c4d3ff6 100644
--- a/keyboards/ymd75/rev3/rules.mk
+++ b/keyboards/ymdk/ymd75/rev3/rules.mk
diff --git a/keyboards/ymdk/ymd75/rules.mk b/keyboards/ymdk/ymd75/rules.mk
new file mode 100644
index 0000000000..ec66e0734a
--- /dev/null
+++ b/keyboards/ymdk/ymd75/rules.mk
@@ -0,0 +1 @@
+DEFAULT_FOLDER = ymdk/ymd75/rev1
diff --git a/keyboards/ymd75/ymd75.c b/keyboards/ymdk/ymd75/ymd75.c
index 2fca021f78..2fca021f78 100644
--- a/keyboards/ymd75/ymd75.c
+++ b/keyboards/ymdk/ymd75/ymd75.c
diff --git a/keyboards/ymdk/ymd75/ymd75.h b/keyboards/ymdk/ymd75/ymd75.h
new file mode 100644
index 0000000000..dbaf93e7db
--- /dev/null
+++ b/keyboards/ymdk/ymd75/ymd75.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#include "quantum.h"
+
+#if defined(KEYBOARD_ymdk_ymd75_rev1)
+ #include "rev1.h"
+#elif defined(KEYBOARD_ymdk_ymd75_rev2)
+ #include "rev2.h"
+#elif defined(KEYBOARD_ymdk_ymd75_rev3)
+ #include "rev3.h"
+#endif
diff --git a/keyboards/ymd96/config.h b/keyboards/ymdk/ymd96/config.h
index 55c5beaf3e..55c5beaf3e 100644
--- a/keyboards/ymd96/config.h
+++ b/keyboards/ymdk/ymd96/config.h
diff --git a/keyboards/ymd96/info.json b/keyboards/ymdk/ymd96/info.json
index d83312015e..d83312015e 100644
--- a/keyboards/ymd96/info.json
+++ b/keyboards/ymdk/ymd96/info.json
diff --git a/keyboards/ymd96/keymaps/AnthonyWharton/README.md b/keyboards/ymdk/ymd96/keymaps/AnthonyWharton/README.md
index 973e336cb6..973e336cb6 100644
--- a/keyboards/ymd96/keymaps/AnthonyWharton/README.md
+++ b/keyboards/ymdk/ymd96/keymaps/AnthonyWharton/README.md
diff --git a/keyboards/ymd96/keymaps/AnthonyWharton/config.h b/keyboards/ymdk/ymd96/keymaps/AnthonyWharton/config.h
index e730e99b27..e730e99b27 100644
--- a/keyboards/ymd96/keymaps/AnthonyWharton/config.h
+++ b/keyboards/ymdk/ymd96/keymaps/AnthonyWharton/config.h
diff --git a/keyboards/ymd96/keymaps/AnthonyWharton/keymap.c b/keyboards/ymdk/ymd96/keymaps/AnthonyWharton/keymap.c
index 2b3e2e2c7c..2b3e2e2c7c 100644
--- a/keyboards/ymd96/keymaps/AnthonyWharton/keymap.c
+++ b/keyboards/ymdk/ymd96/keymaps/AnthonyWharton/keymap.c
diff --git a/keyboards/ymd96/keymaps/default/keymap.c b/keyboards/ymdk/ymd96/keymaps/default/keymap.c
index 0b8b98157d..0b8b98157d 100644
--- a/keyboards/ymd96/keymaps/default/keymap.c
+++ b/keyboards/ymdk/ymd96/keymaps/default/keymap.c
diff --git a/keyboards/ymd96/keymaps/epx/keymap.c b/keyboards/ymdk/ymd96/keymaps/epx/keymap.c
index cb353a08b7..cb353a08b7 100644
--- a/keyboards/ymd96/keymaps/epx/keymap.c
+++ b/keyboards/ymdk/ymd96/keymaps/epx/keymap.c
diff --git a/keyboards/ymd96/keymaps/hgoel89/config.h b/keyboards/ymdk/ymd96/keymaps/hgoel89/config.h
index b1d74e1e69..b1d74e1e69 100644
--- a/keyboards/ymd96/keymaps/hgoel89/config.h
+++ b/keyboards/ymdk/ymd96/keymaps/hgoel89/config.h
diff --git a/keyboards/ymd96/keymaps/hgoel89/keymap.c b/keyboards/ymdk/ymd96/keymaps/hgoel89/keymap.c
index cb7a3eb1e7..cb7a3eb1e7 100644
--- a/keyboards/ymd96/keymaps/hgoel89/keymap.c
+++ b/keyboards/ymdk/ymd96/keymaps/hgoel89/keymap.c
diff --git a/keyboards/ymd96/keymaps/hgoel89/readme.md b/keyboards/ymdk/ymd96/keymaps/hgoel89/readme.md
index 05488df990..05488df990 100644
--- a/keyboards/ymd96/keymaps/hgoel89/readme.md
+++ b/keyboards/ymdk/ymd96/keymaps/hgoel89/readme.md
diff --git a/keyboards/ymd96/keymaps/hgoel89/rules.mk b/keyboards/ymdk/ymd96/keymaps/hgoel89/rules.mk
index e5ddcae8d9..e5ddcae8d9 100644
--- a/keyboards/ymd96/keymaps/hgoel89/rules.mk
+++ b/keyboards/ymdk/ymd96/keymaps/hgoel89/rules.mk
diff --git a/keyboards/ymdk/ymd96/readme.md b/keyboards/ymdk/ymd96/readme.md
new file mode 100644
index 0000000000..6a967a49c2
--- /dev/null
+++ b/keyboards/ymdk/ymd96/readme.md
@@ -0,0 +1,19 @@
+# YMD96
+
+A 96-keyboard which supports both ANSI and ISO along with many different layout combinations, and RGB underglow.
+
+* Keyboard maintainer: [Andrew](https://github.com/sparkyman215)
+* Hardware Supported: YMD96 with the ATmega32a chip.
+* Hardware Availability: The GB was run June 2017, [in this thread](https://www.reddit.com/r/mechmarket/comments/6hu3yx/vendor_ymd96_gb_is_now_live_68_an_universal_and/). The vendor has stated that they plan on selling more rounds.
+
+Make example for this keyboard (after setting up your build environment):
+
+ make ymdk/ymd96:default
+
+Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
+
+ make ymdk/ymd96:default:flash
+
+**Reset Key**: Hold down the key commonly programmed as *L_Ctrl* while plugging in the keyboard.
+
+See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/ymd96/rules.mk b/keyboards/ymdk/ymd96/rules.mk
index 8dab58389a..8dab58389a 100644
--- a/keyboards/ymd96/rules.mk
+++ b/keyboards/ymdk/ymd96/rules.mk
diff --git a/keyboards/ymd96/ymd96.c b/keyboards/ymdk/ymd96/ymd96.c
index 0c212f4abb..0c212f4abb 100644
--- a/keyboards/ymd96/ymd96.c
+++ b/keyboards/ymdk/ymd96/ymd96.c
diff --git a/keyboards/ymd96/ymd96.h b/keyboards/ymdk/ymd96/ymd96.h
index c89be71686..c89be71686 100644
--- a/keyboards/ymd96/ymd96.h
+++ b/keyboards/ymdk/ymd96/ymd96.h
diff --git a/keyboards/ymdk_np21/readme.md b/keyboards/ymdk_np21/readme.md
deleted file mode 100644
index decd30b275..0000000000
--- a/keyboards/ymdk_np21/readme.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# YMDK NP21
-
-![kp21 &mdash; full grid layout](https://ae01.alicdn.com/kf/HTB1d.txfHsTMeJjSszhq6AGCFXaF.jpg?size=35021&height=662&width=1000&hash=62b3a453686e2154dc51a7af67495e28)
-
-ps2avrGB based number-pad sold fully assembled by YMDK on Aliexpress.
-
-* Keyboard Maintainer: [QMK Community](https://github.com/qmk)
-* Hardware Supported: Atmega32A
-* Hardware Availability: [AliExpress](https://www.aliexpress.com/item/21-Key-NPKC-Programmable-Cherry-MX-Kailh-Gateron-Switches-Mechanical-Keyboard-Numpad-Free-shipping/32812732361.html)
-
-Make example for this keyboard (after setting up your build environment):
-
- make ymdk_np21:default
-
-Flashing example for this keyboard ([after setting up the bootloadHID flashing environment](https://docs.qmk.fm/#/flashing_bootloadhid))
-
- make ymdk_np21:default:flash
-
-**Reset Key**: Hold down the 'Top Left Key' (USB on top) while plugging in the keyboard.
-
-See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/ymdk_np21/ymdk_np21.c b/keyboards/ymdk_np21/ymdk_np21.c
deleted file mode 100644
index 3ca0e8baa0..0000000000
--- a/keyboards/ymdk_np21/ymdk_np21.c
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
-Copyright 2017 Luiz Ribeiro <luizribeiro@gmail.com>
-Modified 2018 Kenneth A. <github.com/krusli>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General 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 "ymdk_np21.h"
diff --git a/keyboards/yosino58/rev1/matrix.c b/keyboards/yosino58/rev1/matrix.c
index 3db40b3829..e2be7113bf 100644
--- a/keyboards/yosino58/rev1/matrix.c
+++ b/keyboards/yosino58/rev1/matrix.c
@@ -289,12 +289,6 @@ void matrix_slave_scan(void) {
#endif
}
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- return true;
-}
-
inline
bool matrix_is_on(uint8_t row, uint8_t col)
{
diff --git a/lib/python/qmk/cli/generate/develop_pr_list.py b/lib/python/qmk/cli/generate/develop_pr_list.py
index 07e46752a6..fab0262773 100755
--- a/lib/python/qmk/cli/generate/develop_pr_list.py
+++ b/lib/python/qmk/cli/generate/develop_pr_list.py
@@ -97,7 +97,7 @@ def generate_develop_pr_list(cli):
match = git_expr.search(line)
if match:
pr_info = _get_pr_info(cache, gh, match.group("pr"))
- commit_info = {'hash': match.group("hash"), 'title': match.group("title"), 'pr_num': int(match.group("pr")), 'pr_labels': [label.name for label in pr_info.labels.items]}
+ commit_info = {'hash': match.group("hash"), 'title': pr_info['title'], 'pr_num': int(match.group("pr")), 'pr_labels': [label.name for label in pr_info.labels.items]}
_categorise_commit(commit_info)
def _dump_commit_list(name, collection):
diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py
index 9a07fc842f..6bdf2cb166 100644
--- a/lib/python/qmk/info.py
+++ b/lib/python/qmk/info.py
@@ -622,12 +622,7 @@ def arm_processor_rules(info_data, rules):
info_data['protocol'] = 'ChibiOS'
if 'bootloader' not in info_data:
- if 'STM32' in info_data['processor']:
- info_data['bootloader'] = 'stm32-dfu'
- elif 'WB32' in info_data['processor']:
- info_data['bootloader'] = 'wb32-dfu'
- else:
- info_data['bootloader'] = 'unknown'
+ info_data['bootloader'] = 'unknown'
if 'STM32' in info_data['processor']:
info_data['platform'] = 'STM32'
diff --git a/platforms/arm_atsam/bootloader.c b/platforms/arm_atsam/bootloader.c
deleted file mode 100644
index 9015b00aab..0000000000
--- a/platforms/arm_atsam/bootloader.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* Copyright 2017 Fred Sundvik
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "bootloader.h"
-#include "samd51j18a.h"
-#include "md_bootloader.h"
-
-// Set watchdog timer to reset. Directs the bootloader to stay in programming mode.
-void bootloader_jump(void) {
-#ifdef KEYBOARD_massdrop_ctrl
- // CTRL keyboards released with bootloader version below must use RAM method. Otherwise use WDT method.
- uint8_t ver_ram_method[] = "v2.18Jun 22 2018 17:28:08"; // The version to match (NULL terminated by compiler)
- uint8_t *ver_check = ver_ram_method; // Pointer to version match string for traversal
- uint8_t *ver_rom = (uint8_t *)0x21A0; // Pointer to address in ROM where this specific bootloader version would exist
-
- while (*ver_check && *ver_rom == *ver_check) { // While there are check version characters to match and bootloader's version matches check's version
- ver_check++; // Move check version pointer to next character
- ver_rom++; // Move ROM version pointer to next character
- }
-
- if (!*ver_check) { // If check version pointer is NULL, all characters have matched
- *MAGIC_ADDR = BOOTLOADER_MAGIC; // Set magic number into RAM
- NVIC_SystemReset(); // Perform system reset
- while (1) {
- } // Won't get here
- }
-#endif
-
- WDT->CTRLA.bit.ENABLE = 0;
- while (WDT->SYNCBUSY.bit.ENABLE) {
- }
- while (WDT->CTRLA.bit.ENABLE) {
- }
- WDT->CONFIG.bit.WINDOW = 0;
- WDT->CONFIG.bit.PER = 0;
- WDT->EWCTRL.bit.EWOFFSET = 0;
- WDT->CTRLA.bit.ENABLE = 1;
- while (WDT->SYNCBUSY.bit.ENABLE) {
- }
- while (!WDT->CTRLA.bit.ENABLE) {
- }
- while (1) {
- } // Wait on timeout
-}
diff --git a/platforms/arm_atsam/bootloaders/md_boot.c b/platforms/arm_atsam/bootloaders/md_boot.c
new file mode 100644
index 0000000000..e7508ffe51
--- /dev/null
+++ b/platforms/arm_atsam/bootloaders/md_boot.c
@@ -0,0 +1,72 @@
+/* Copyright 2017 Fred Sundvik
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "bootloader.h"
+
+#include "samd51j18a.h"
+
+#ifdef KEYBOARD_massdrop_ctrl
+// WARNING: These are only for CTRL bootloader release "v2.18Jun 22 2018 17:28:08" for bootloader_jump support
+extern uint32_t _eram;
+
+# define BOOTLOADER_MAGIC 0x3B9ACA00
+# define MAGIC_ADDR (uint32_t *)((intptr_t)(&_eram) - 4)
+
+// CTRL keyboards released with bootloader version below must use RAM method. Otherwise use WDT method.
+void bootloader_jump(void) {
+ uint8_t ver_ram_method[] = "v2.18Jun 22 2018 17:28:08"; // The version to match (NULL terminated by compiler)
+ uint8_t *ver_check = ver_ram_method; // Pointer to version match string for traversal
+ uint8_t *ver_rom = (uint8_t *)0x21A0; // Pointer to address in ROM where this specific bootloader version would exist
+
+ while (*ver_check && *ver_rom == *ver_check) { // While there are check version characters to match and bootloader's version matches check's version
+ ver_check++; // Move check version pointer to next character
+ ver_rom++; // Move ROM version pointer to next character
+ }
+
+ if (!*ver_check) { // If check version pointer is NULL, all characters have matched
+ *MAGIC_ADDR = BOOTLOADER_MAGIC; // Set magic number into RAM
+ NVIC_SystemReset(); // Perform system reset
+
+ while (1)
+ ; // Won't get here
+ }
+}
+
+#else
+
+// Set watchdog timer to reset. Directs the bootloader to stay in programming mode.
+void bootloader_jump(void) {
+ WDT->CTRLA.bit.ENABLE = 0;
+
+ while (WDT->SYNCBUSY.bit.ENABLE)
+ ;
+ while (WDT->CTRLA.bit.ENABLE)
+ ;
+
+ WDT->CONFIG.bit.WINDOW = 0;
+ WDT->CONFIG.bit.PER = 0;
+ WDT->EWCTRL.bit.EWOFFSET = 0;
+ WDT->CTRLA.bit.ENABLE = 1;
+
+ while (WDT->SYNCBUSY.bit.ENABLE)
+ ;
+ while (!WDT->CTRLA.bit.ENABLE)
+ ;
+
+ while (1)
+ ; // Wait on timeout
+}
+#endif
diff --git a/platforms/arm_atsam/gpio.h b/platforms/arm_atsam/gpio.h
index 915ed0ef4f..a42aaff54d 100644
--- a/platforms/arm_atsam/gpio.h
+++ b/platforms/arm_atsam/gpio.h
@@ -22,9 +22,9 @@
typedef uint8_t pin_t;
-#define SAMD_PORT(pin) ((pin & 0x20) >> 5)
-#define SAMD_PIN(pin) (pin & 0x1f)
-#define SAMD_PIN_MASK(pin) (1 << (pin & 0x1f))
+#define SAMD_PORT(pin) (((pin)&0x20) >> 5)
+#define SAMD_PIN(pin) ((pin)&0x1f)
+#define SAMD_PIN_MASK(pin) (1 << ((pin)&0x1f))
#define setPinInput(pin) \
do { \
@@ -48,12 +48,16 @@ typedef uint8_t pin_t;
PORT->Group[SAMD_PORT(pin)].PINCFG[SAMD_PIN(pin)].bit.PULLEN = 1; \
} while (0)
-#define setPinOutput(pin) \
+#define setPinOutputPushPull(pin) \
do { \
PORT->Group[SAMD_PORT(pin)].DIRSET.reg = SAMD_PIN_MASK(pin); \
PORT->Group[SAMD_PORT(pin)].OUTCLR.reg = SAMD_PIN_MASK(pin); \
} while (0)
+#define setPinOutputOpenDrain(pin) _Static_assert(0, "arm_atsam platform does not implement an open-drain output")
+
+#define setPinOutput(pin) setPinOutputPushPull(pin)
+
#define writePinHigh(pin) \
do { \
PORT->Group[SAMD_PORT(pin)].OUTSET.reg = SAMD_PIN_MASK(pin); \
diff --git a/platforms/avr/bootloader.c b/platforms/avr/bootloader.c
deleted file mode 100644
index c0272903b8..0000000000
--- a/platforms/avr/bootloader.c
+++ /dev/null
@@ -1,293 +0,0 @@
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/io.h>
-#include <avr/eeprom.h>
-#include <avr/interrupt.h>
-#include <avr/wdt.h>
-#include <util/delay.h>
-#include "bootloader.h"
-#include <avr/boot.h>
-
-#ifdef PROTOCOL_LUFA
-# include <LUFA/Drivers/USB/USB.h>
-#endif
-
-/** \brief Bootloader Size in *bytes*
- *
- * AVR Boot section size are defined by setting BOOTSZ fuse in fact. Consult with your MCU datasheet.
- * Note that 'Word'(2 bytes) size and address are used in datasheet while TMK uses 'Byte'.
- *
- * Size of Bootloaders in bytes:
- * Atmel DFU loader(ATmega32U4) 4096
- * Atmel DFU loader(AT90USB128) 8192
- * LUFA bootloader(ATmega32U4) 4096
- * Arduino Caterina(ATmega32U4) 4096
- * USBaspLoader(ATmega***) 2048
- * Teensy halfKay(ATmega32U4) 512
- * Teensy++ halfKay(AT90USB128) 1024
- *
- * AVR Boot section is located at the end of Flash memory like the followings.
- *
- * byte Atmel/LUFA(ATMega32u4) byte Atmel(AT90SUB128)
- * 0x0000 +---------------+ 0x00000 +---------------+
- * | | | |
- * | | | |
- * | Application | | Application |
- * | | | |
- * = = = =
- * | | 32KB-4KB | | 128KB-8KB
- * 0x7000 +---------------+ 0x1E000 +---------------+
- * | Bootloader | 4KB | Bootloader | 8KB
- * 0x7FFF +---------------+ 0x1FFFF +---------------+
- *
- *
- * byte Teensy(ATMega32u4) byte Teensy++(AT90SUB128)
- * 0x0000 +---------------+ 0x00000 +---------------+
- * | | | |
- * | | | |
- * | Application | | Application |
- * | | | |
- * = = = =
- * | | 32KB-512B | | 128KB-1KB
- * 0x7E00 +---------------+ 0x1FC00 +---------------+
- * | Bootloader | 512B | Bootloader | 1KB
- * 0x7FFF +---------------+ 0x1FFFF +---------------+
- */
-#define FLASH_SIZE (FLASHEND + 1L)
-
-#if !defined(BOOTLOADER_SIZE)
-uint16_t bootloader_start;
-#endif
-
-// compatibility between ATMega8 and ATMega88
-#if !defined(MCUCSR)
-# if defined(MCUSR)
-# define MCUCSR MCUSR
-# endif
-#endif
-
-/** \brief Entering the Bootloader via Software
- *
- * http://www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html
- */
-#define BOOTLOADER_RESET_KEY 0xB007B007
-uint32_t reset_key __attribute__((section(".noinit,\"aw\",@nobits;")));
-
-/** \brief initialize MCU status by watchdog reset
- *
- * FIXME: needs doc
- */
-__attribute__((weak)) void bootloader_jump(void) {
-#if !defined(BOOTLOADER_SIZE)
- uint8_t high_fuse = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS);
-
- if (high_fuse & ~(FUSE_BOOTSZ0 & FUSE_BOOTSZ1)) {
- bootloader_start = (FLASH_SIZE - 512) >> 1;
- } else if (high_fuse & ~(FUSE_BOOTSZ1)) {
- bootloader_start = (FLASH_SIZE - 1024) >> 1;
- } else if (high_fuse & ~(FUSE_BOOTSZ0)) {
- bootloader_start = (FLASH_SIZE - 2048) >> 1;
- } else {
- bootloader_start = (FLASH_SIZE - 4096) >> 1;
- }
-#endif
-
- // Something like this might work, but it compiled larger than the block above
- // bootloader_start = FLASH_SIZE - (256 << (~high_fuse & 0b110 >> 1));
-
-#if defined(BOOTLOADER_HALFKAY)
- // http://www.pjrc.com/teensy/jump_to_bootloader.html
- cli();
- // disable watchdog, if enabled (it's not)
- // disable all peripherals
- // a shutdown call might make sense here
- UDCON = 1;
- USBCON = (1 << FRZCLK); // disable USB
- UCSR1B = 0;
- _delay_ms(5);
-# if defined(__AVR_AT90USB162__) // Teensy 1.0
- EIMSK = 0;
- PCICR = 0;
- SPCR = 0;
- ACSR = 0;
- EECR = 0;
- TIMSK0 = 0;
- TIMSK1 = 0;
- UCSR1B = 0;
- DDRB = 0;
- DDRC = 0;
- DDRD = 0;
- PORTB = 0;
- PORTC = 0;
- PORTD = 0;
- asm volatile("jmp 0x3E00");
-# elif defined(__AVR_ATmega32U4__) // Teensy 2.0
- EIMSK = 0;
- PCICR = 0;
- SPCR = 0;
- ACSR = 0;
- EECR = 0;
- ADCSRA = 0;
- TIMSK0 = 0;
- TIMSK1 = 0;
- TIMSK3 = 0;
- TIMSK4 = 0;
- UCSR1B = 0;
- TWCR = 0;
- DDRB = 0;
- DDRC = 0;
- DDRD = 0;
- DDRE = 0;
- DDRF = 0;
- TWCR = 0;
- PORTB = 0;
- PORTC = 0;
- PORTD = 0;
- PORTE = 0;
- PORTF = 0;
- asm volatile("jmp 0x7E00");
-# elif defined(__AVR_AT90USB646__) // Teensy++ 1.0
- EIMSK = 0;
- PCICR = 0;
- SPCR = 0;
- ACSR = 0;
- EECR = 0;
- ADCSRA = 0;
- TIMSK0 = 0;
- TIMSK1 = 0;
- TIMSK2 = 0;
- TIMSK3 = 0;
- UCSR1B = 0;
- TWCR = 0;
- DDRA = 0;
- DDRB = 0;
- DDRC = 0;
- DDRD = 0;
- DDRE = 0;
- DDRF = 0;
- PORTA = 0;
- PORTB = 0;
- PORTC = 0;
- PORTD = 0;
- PORTE = 0;
- PORTF = 0;
- asm volatile("jmp 0xFC00");
-# elif defined(__AVR_AT90USB1286__) // Teensy++ 2.0
- EIMSK = 0;
- PCICR = 0;
- SPCR = 0;
- ACSR = 0;
- EECR = 0;
- ADCSRA = 0;
- TIMSK0 = 0;
- TIMSK1 = 0;
- TIMSK2 = 0;
- TIMSK3 = 0;
- UCSR1B = 0;
- TWCR = 0;
- DDRA = 0;
- DDRB = 0;
- DDRC = 0;
- DDRD = 0;
- DDRE = 0;
- DDRF = 0;
- PORTA = 0;
- PORTB = 0;
- PORTC = 0;
- PORTD = 0;
- PORTE = 0;
- PORTF = 0;
- asm volatile("jmp 0x1FC00");
-# endif
-
-#elif defined(BOOTLOADER_CATERINA)
- // this block may be optional
- // TODO: figure it out
-
- uint16_t *const bootKeyPtr = (uint16_t *)0x0800;
-
- // Value used by Caterina bootloader use to determine whether to run the
- // sketch or the bootloader programmer.
- uint16_t bootKey = 0x7777;
-
- *bootKeyPtr = bootKey;
-
- // setup watchdog timeout
- wdt_enable(WDTO_60MS);
-
- while (1) {
- } // wait for watchdog timer to trigger
-
-#elif defined(BOOTLOADER_USBASP)
- // Taken with permission of Stephan Baerwolf from https://github.com/tinyusbboard/API/blob/master/apipage.c
- wdt_enable(WDTO_15MS);
- wdt_reset();
- asm volatile("cli \n\t"
- "ldi r29 , %[ramendhi] \n\t"
- "ldi r28 , %[ramendlo] \n\t"
-# if (FLASHEND > 131071)
- "ldi r18 , %[bootaddrhi] \n\t"
- "st Y+, r18 \n\t"
-# endif
- "ldi r18 , %[bootaddrme] \n\t"
- "st Y+, r18 \n\t"
- "ldi r18 , %[bootaddrlo] \n\t"
- "st Y+, r18 \n\t"
- "out %[mcucsrio], __zero_reg__ \n\t"
- "bootloader_startup_loop%=: \n\t"
- "rjmp bootloader_startup_loop%= \n\t"
- :
- : [mcucsrio] "I"(_SFR_IO_ADDR(MCUCSR)),
-# if (FLASHEND > 131071)
- [ramendhi] "M"(((RAMEND - 2) >> 8) & 0xff), [ramendlo] "M"(((RAMEND - 2) >> 0) & 0xff), [bootaddrhi] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 16) & 0xff),
-# else
- [ramendhi] "M"(((RAMEND - 1) >> 8) & 0xff), [ramendlo] "M"(((RAMEND - 1) >> 0) & 0xff),
-# endif
- [bootaddrme] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 8) & 0xff), [bootaddrlo] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 0) & 0xff));
-
-#else // Assume remaining boards are DFU, even if the flag isn't set
-
-# if !(defined(__AVR_ATmega32A__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328__) || defined(__AVR_ATtiny85__)) // no USB - maybe BOOTLOADER_BOOTLOADHID instead though?
- UDCON = 1;
- USBCON = (1 << FRZCLK); // disable USB
- UCSR1B = 0;
- _delay_ms(5); // 5 seems to work fine
-# endif
-
-# ifdef BOOTLOADER_BOOTLOADHID
- // force bootloadHID to stay in bootloader mode, so that it waits
- // for a new firmware to be flashed
- eeprom_write_byte((uint8_t *)1, 0x00);
-# endif
-
- // watchdog reset
- reset_key = BOOTLOADER_RESET_KEY;
- wdt_enable(WDTO_250MS);
- for (;;)
- ;
-#endif
-}
-
-/* this runs before main() */
-void bootloader_jump_after_watchdog_reset(void) __attribute__((used, naked, section(".init3")));
-void bootloader_jump_after_watchdog_reset(void) {
-#ifndef BOOTLOADER_HALFKAY
- if ((MCUCSR & (1 << WDRF)) && reset_key == BOOTLOADER_RESET_KEY) {
- reset_key = 0;
-
- // My custom USBasploader requires this to come up.
- MCUCSR = 0;
-
- // Seems like Teensy halfkay loader requires clearing WDRF and disabling watchdog.
- MCUCSR &= ~(1 << WDRF);
- wdt_disable();
-
-// This is compled into 'icall', address should be in word unit, not byte.
-# ifdef BOOTLOADER_SIZE
- ((void (*)(void))((FLASH_SIZE - BOOTLOADER_SIZE) >> 1))();
-# else
- asm("ijmp" ::"z"(bootloader_start));
-# endif
- }
-#endif
-}
diff --git a/platforms/avr/bootloaders/bootloadhid.c b/platforms/avr/bootloaders/bootloadhid.c
new file mode 100644
index 0000000000..ae58760d7d
--- /dev/null
+++ b/platforms/avr/bootloaders/bootloadhid.c
@@ -0,0 +1,33 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "bootloader.h"
+
+#include <avr/eeprom.h>
+#include <avr/wdt.h>
+
+__attribute__((weak)) void bootloader_jump(void) {
+ // force bootloadHID to stay in bootloader mode, so that it waits
+ // for a new firmware to be flashed
+ // NOTE: this byte is part of QMK's "magic number" - changing it causes the EEPROM to be re-initialized
+ // thus every time the device is flashed the EEPROM will be wiped
+ eeprom_write_byte((uint8_t *)1, 0x00);
+
+ // watchdog reset
+ wdt_enable(WDTO_250MS);
+ for (;;)
+ ;
+}
diff --git a/platforms/avr/bootloaders/caterina.c b/platforms/avr/bootloaders/caterina.c
new file mode 100644
index 0000000000..82a16a3765
--- /dev/null
+++ b/platforms/avr/bootloaders/caterina.c
@@ -0,0 +1,39 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "bootloader.h"
+
+#include <avr/wdt.h>
+
+__attribute__((weak)) void bootloader_jump(void) {
+ // this block may be optional
+ // TODO: figure it out
+
+ uint16_t *const bootKeyPtr = (uint16_t *)0x0800;
+
+ // Value used by Caterina bootloader use to determine whether to run the
+ // sketch or the bootloader programmer.
+ uint16_t bootKey = 0x7777;
+
+ *bootKeyPtr = bootKey;
+
+ // setup watchdog timeout
+ wdt_enable(WDTO_60MS);
+
+ // wait for watchdog timer to trigger
+ while (1) {
+ }
+}
diff --git a/platforms/avr/bootloaders/dfu.c b/platforms/avr/bootloaders/dfu.c
new file mode 100644
index 0000000000..cb42821a93
--- /dev/null
+++ b/platforms/avr/bootloaders/dfu.c
@@ -0,0 +1,52 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "bootloader.h"
+
+#include <avr/wdt.h>
+#include <util/delay.h>
+
+#define FLASH_SIZE (FLASHEND + 1L)
+
+/** \brief Entering the Bootloader via Software
+ *
+ * http://www.fourwalledcubicle.com/files/LUFA/Doc/120730/html/_page__software_bootloader_start.html
+ */
+#define BOOTLOADER_RESET_KEY 0xB007B007
+uint32_t reset_key __attribute__((section(".noinit,\"aw\",@nobits;")));
+
+__attribute__((weak)) void bootloader_jump(void) {
+ UDCON = 1;
+ USBCON = (1 << FRZCLK); // disable USB
+ UCSR1B = 0;
+ _delay_ms(5); // 5 seems to work fine
+
+ // watchdog reset
+ reset_key = BOOTLOADER_RESET_KEY;
+ wdt_enable(WDTO_250MS);
+ for (;;)
+ ;
+}
+
+/* this runs before main() */
+void bootloader_jump_after_watchdog_reset(void) __attribute__((used, naked, section(".init3")));
+void bootloader_jump_after_watchdog_reset(void) {
+ if ((MCUSR & (1 << WDRF)) && reset_key == BOOTLOADER_RESET_KEY) {
+ reset_key = 0;
+
+ ((void (*)(void))((FLASH_SIZE - BOOTLOADER_SIZE) >> 1))();
+ }
+}
diff --git a/platforms/avr/bootloaders/halfkay.c b/platforms/avr/bootloaders/halfkay.c
new file mode 100644
index 0000000000..6ce2e19114
--- /dev/null
+++ b/platforms/avr/bootloaders/halfkay.c
@@ -0,0 +1,128 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "bootloader.h"
+
+#include <avr/interrupt.h>
+#include <util/delay.h>
+
+__attribute__((weak)) void bootloader_jump(void) {
+ // http://www.pjrc.com/teensy/jump_to_bootloader.html
+
+ cli();
+ // disable watchdog, if enabled (it's not)
+ // disable all peripherals
+ // a shutdown call might make sense here
+ UDCON = 1;
+ USBCON = (1 << FRZCLK); // disable USB
+ UCSR1B = 0;
+ _delay_ms(5);
+
+#if defined(__AVR_AT90USB162__) // Teensy 1.0
+ EIMSK = 0;
+ PCICR = 0;
+ SPCR = 0;
+ ACSR = 0;
+ EECR = 0;
+ TIMSK0 = 0;
+ TIMSK1 = 0;
+ UCSR1B = 0;
+ DDRB = 0;
+ DDRC = 0;
+ DDRD = 0;
+ PORTB = 0;
+ PORTC = 0;
+ PORTD = 0;
+ asm volatile("jmp 0x3E00");
+#elif defined(__AVR_ATmega32U4__) // Teensy 2.0
+ EIMSK = 0;
+ PCICR = 0;
+ SPCR = 0;
+ ACSR = 0;
+ EECR = 0;
+ ADCSRA = 0;
+ TIMSK0 = 0;
+ TIMSK1 = 0;
+ TIMSK3 = 0;
+ TIMSK4 = 0;
+ UCSR1B = 0;
+ TWCR = 0;
+ DDRB = 0;
+ DDRC = 0;
+ DDRD = 0;
+ DDRE = 0;
+ DDRF = 0;
+ TWCR = 0;
+ PORTB = 0;
+ PORTC = 0;
+ PORTD = 0;
+ PORTE = 0;
+ PORTF = 0;
+ asm volatile("jmp 0x7E00");
+#elif defined(__AVR_AT90USB646__) // Teensy++ 1.0
+ EIMSK = 0;
+ PCICR = 0;
+ SPCR = 0;
+ ACSR = 0;
+ EECR = 0;
+ ADCSRA = 0;
+ TIMSK0 = 0;
+ TIMSK1 = 0;
+ TIMSK2 = 0;
+ TIMSK3 = 0;
+ UCSR1B = 0;
+ TWCR = 0;
+ DDRA = 0;
+ DDRB = 0;
+ DDRC = 0;
+ DDRD = 0;
+ DDRE = 0;
+ DDRF = 0;
+ PORTA = 0;
+ PORTB = 0;
+ PORTC = 0;
+ PORTD = 0;
+ PORTE = 0;
+ PORTF = 0;
+ asm volatile("jmp 0xFC00");
+#elif defined(__AVR_AT90USB1286__) // Teensy++ 2.0
+ EIMSK = 0;
+ PCICR = 0;
+ SPCR = 0;
+ ACSR = 0;
+ EECR = 0;
+ ADCSRA = 0;
+ TIMSK0 = 0;
+ TIMSK1 = 0;
+ TIMSK2 = 0;
+ TIMSK3 = 0;
+ UCSR1B = 0;
+ TWCR = 0;
+ DDRA = 0;
+ DDRB = 0;
+ DDRC = 0;
+ DDRD = 0;
+ DDRE = 0;
+ DDRF = 0;
+ PORTA = 0;
+ PORTB = 0;
+ PORTC = 0;
+ PORTD = 0;
+ PORTE = 0;
+ PORTF = 0;
+ asm volatile("jmp 0x1FC00");
+#endif
+}
diff --git a/platforms/avr/bootloaders/none.c b/platforms/avr/bootloaders/none.c
new file mode 100644
index 0000000000..624fbe242a
--- /dev/null
+++ b/platforms/avr/bootloaders/none.c
@@ -0,0 +1,19 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "bootloader.h"
+
+__attribute__((weak)) void bootloader_jump(void) {}
diff --git a/platforms/avr/bootloaders/usbasploader.c b/platforms/avr/bootloaders/usbasploader.c
new file mode 100644
index 0000000000..008bd16069
--- /dev/null
+++ b/platforms/avr/bootloaders/usbasploader.c
@@ -0,0 +1,56 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "bootloader.h"
+
+#include <avr/wdt.h>
+
+#define FLASH_SIZE (FLASHEND + 1L)
+
+#if !defined(MCUCSR)
+# if defined(MCUSR)
+# define MCUCSR MCUSR
+# endif
+#endif
+
+__attribute__((weak)) void bootloader_jump(void) {
+ // Taken with permission of Stephan Baerwolf from https://github.com/tinyusbboard/API/blob/master/apipage.c
+
+ wdt_enable(WDTO_15MS);
+ wdt_reset();
+ asm volatile("cli \n\t"
+ "ldi r29 , %[ramendhi] \n\t"
+ "ldi r28 , %[ramendlo] \n\t"
+#if (FLASHEND > 131071)
+ "ldi r18 , %[bootaddrhi] \n\t"
+ "st Y+, r18 \n\t"
+#endif
+ "ldi r18 , %[bootaddrme] \n\t"
+ "st Y+, r18 \n\t"
+ "ldi r18 , %[bootaddrlo] \n\t"
+ "st Y+, r18 \n\t"
+ "out %[mcucsrio], __zero_reg__ \n\t"
+ "bootloader_startup_loop%=: \n\t"
+ "rjmp bootloader_startup_loop%= \n\t"
+ :
+ : [mcucsrio] "I"(_SFR_IO_ADDR(MCUCSR)),
+#if (FLASHEND > 131071)
+ [ramendhi] "M"(((RAMEND - 2) >> 8) & 0xff), [ramendlo] "M"(((RAMEND - 2) >> 0) & 0xff), [bootaddrhi] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 16) & 0xff),
+#else
+ [ramendhi] "M"(((RAMEND - 1) >> 8) & 0xff), [ramendlo] "M"(((RAMEND - 1) >> 0) & 0xff),
+#endif
+ [bootaddrme] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 8) & 0xff), [bootaddrlo] "M"((((FLASH_SIZE - BOOTLOADER_SIZE) >> 1) >> 0) & 0xff));
+}
diff --git a/platforms/avr/drivers/i2c_master.c b/platforms/avr/drivers/i2c_master.c
index 111b55d6b0..d4024378ca 100644
--- a/platforms/avr/drivers/i2c_master.c
+++ b/platforms/avr/drivers/i2c_master.c
@@ -32,6 +32,9 @@
# define I2C_START_RETRY_COUNT 20
#endif // I2C_START_RETRY_COUNT
+#define I2C_ACTION_READ 0x01
+#define I2C_ACTION_WRITE 0x00
+
#define TWBR_val (((F_CPU / F_SCL) - 16) / 2)
#define MAX(X, Y) ((X) > (Y) ? (X) : (Y))
@@ -154,7 +157,7 @@ int16_t i2c_read_nack(uint16_t timeout) {
}
i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length, uint16_t timeout) {
- i2c_status_t status = i2c_start(address | I2C_WRITE, timeout);
+ i2c_status_t status = i2c_start(address | I2C_ACTION_WRITE, timeout);
for (uint16_t i = 0; i < length && status >= 0; i++) {
status = i2c_write(data[i], timeout);
@@ -166,7 +169,7 @@ i2c_status_t i2c_transmit(uint8_t address, const uint8_t* data, uint16_t length,
}
i2c_status_t i2c_receive(uint8_t address, uint8_t* data, uint16_t length, uint16_t timeout) {
- i2c_status_t status = i2c_start(address | I2C_READ, timeout);
+ i2c_status_t status = i2c_start(address | I2C_ACTION_READ, timeout);
for (uint16_t i = 0; i < (length - 1) && status >= 0; i++) {
status = i2c_read_ack(timeout);
diff --git a/platforms/avr/drivers/serial.c b/platforms/avr/drivers/serial.c
index 9a7345a53d..ab0b52afd1 100644
--- a/platforms/avr/drivers/serial.c
+++ b/platforms/avr/drivers/serial.c
@@ -16,6 +16,7 @@
#include <util/delay.h>
#include <stddef.h>
#include <stdbool.h>
+#include "gpio.h"
#include "serial.h"
#ifdef SOFT_SERIAL_PIN
@@ -119,12 +120,6 @@
# error invalid SOFT_SERIAL_PIN value
# endif
-# define setPinInputHigh(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) |= _BV((pin)&0xF))
-# define setPinOutput(pin) (DDRx_ADDRESS(pin) |= _BV((pin)&0xF))
-# define writePinHigh(pin) (PORTx_ADDRESS(pin) |= _BV((pin)&0xF))
-# define writePinLow(pin) (PORTx_ADDRESS(pin) &= ~_BV((pin)&0xF))
-# define readPin(pin) ((bool)(PINx_ADDRESS(pin) & _BV((pin)&0xF)))
-
# define ALWAYS_INLINE __attribute__((always_inline))
# define NO_INLINE __attribute__((noinline))
# define _delay_sub_us(x) __builtin_avr_delay_cycles(x)
diff --git a/platforms/avr/gpio.h b/platforms/avr/gpio.h
index e9be68491d..95f15c28dc 100644
--- a/platforms/avr/gpio.h
+++ b/platforms/avr/gpio.h
@@ -25,7 +25,9 @@ typedef uint8_t pin_t;
#define setPinInput(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) &= ~_BV((pin)&0xF))
#define setPinInputHigh(pin) (DDRx_ADDRESS(pin) &= ~_BV((pin)&0xF), PORTx_ADDRESS(pin) |= _BV((pin)&0xF))
#define setPinInputLow(pin) _Static_assert(0, "AVR processors cannot implement an input as pull low")
-#define setPinOutput(pin) (DDRx_ADDRESS(pin) |= _BV((pin)&0xF))
+#define setPinOutputPushPull(pin) (DDRx_ADDRESS(pin) |= _BV((pin)&0xF))
+#define setPinOutputOpenDrain(pin) _Static_assert(0, "AVR platform does not implement an open-drain output")
+#define setPinOutput(pin) setPinOutputPushPull(pin)
#define writePinHigh(pin) (PORTx_ADDRESS(pin) |= _BV((pin)&0xF))
#define writePinLow(pin) (PORTx_ADDRESS(pin) &= ~_BV((pin)&0xF))
@@ -34,16 +36,3 @@ typedef uint8_t pin_t;
#define readPin(pin) ((bool)(PINx_ADDRESS(pin) & _BV((pin)&0xF)))
#define togglePin(pin) (PORTx_ADDRESS(pin) ^= _BV((pin)&0xF))
-
-/* Operation of GPIO by port. */
-
-typedef uint8_t port_data_t;
-
-#define readPort(port) PINx_ADDRESS(port)
-
-#define setPortBitInput(port, bit) (DDRx_ADDRESS(port) &= ~_BV((bit)&0xF), PORTx_ADDRESS(port) &= ~_BV((bit)&0xF))
-#define setPortBitInputHigh(port, bit) (DDRx_ADDRESS(port) &= ~_BV((bit)&0xF), PORTx_ADDRESS(port) |= _BV((bit)&0xF))
-#define setPortBitOutput(port, bit) (DDRx_ADDRESS(port) |= _BV((bit)&0xF))
-
-#define writePortBitLow(port, bit) (PORTx_ADDRESS(port) &= ~_BV((bit)&0xF))
-#define writePortBitHigh(port, bit) (PORTx_ADDRESS(port) |= _BV((bit)&0xF))
diff --git a/platforms/chibios/boards/BLACKPILL_STM32_F401/configs/bootloader_defs.h b/platforms/chibios/boards/BLACKPILL_STM32_F401/configs/bootloader_defs.h
deleted file mode 100644
index 4da3d39a32..0000000000
--- a/platforms/chibios/boards/BLACKPILL_STM32_F401/configs/bootloader_defs.h
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Address for jumping to bootloader on STM32 chips. */
-/* It is chip dependent, the correct number can be looked up here:
- * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
- */
-#define STM32_BOOTLOADER_ADDRESS 0x1FFF0000
diff --git a/platforms/chibios/boards/BLACKPILL_STM32_F411/configs/bootloader_defs.h b/platforms/chibios/boards/BLACKPILL_STM32_F411/configs/bootloader_defs.h
deleted file mode 100644
index 4da3d39a32..0000000000
--- a/platforms/chibios/boards/BLACKPILL_STM32_F411/configs/bootloader_defs.h
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Address for jumping to bootloader on STM32 chips. */
-/* It is chip dependent, the correct number can be looked up here:
- * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
- */
-#define STM32_BOOTLOADER_ADDRESS 0x1FFF0000
diff --git a/platforms/chibios/boards/GENERIC_STM32_F042X6/configs/bootloader_defs.h b/platforms/chibios/boards/GENERIC_STM32_F042X6/configs/bootloader_defs.h
deleted file mode 100644
index 25113425a6..0000000000
--- a/platforms/chibios/boards/GENERIC_STM32_F042X6/configs/bootloader_defs.h
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Address for jumping to bootloader on STM32 chips. */
-/* It is chip dependent, the correct number can be looked up here:
- * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
- */
-#define STM32_BOOTLOADER_ADDRESS 0x1FFFC400
diff --git a/platforms/chibios/boards/GENERIC_STM32_F072XB/configs/bootloader_defs.h b/platforms/chibios/boards/GENERIC_STM32_F072XB/configs/bootloader_defs.h
deleted file mode 100644
index dccd0fa5d1..0000000000
--- a/platforms/chibios/boards/GENERIC_STM32_F072XB/configs/bootloader_defs.h
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Address for jumping to bootloader on STM32 chips. */
-/* It is chip dependent, the correct number can be looked up here (page 175):
- * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
- */
-#define STM32_BOOTLOADER_ADDRESS 0x1FFFC800
diff --git a/platforms/chibios/boards/GENERIC_STM32_F303XC/configs/bootloader_defs.h b/platforms/chibios/boards/GENERIC_STM32_F303XC/configs/bootloader_defs.h
deleted file mode 100644
index 87ac7b10dc..0000000000
--- a/platforms/chibios/boards/GENERIC_STM32_F303XC/configs/bootloader_defs.h
+++ /dev/null
@@ -1,5 +0,0 @@
-/* Address for jumping to bootloader on STM32 chips. */
-/* It is chip dependent, the correct number can be looked up here:
- * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
- */
-#define STM32_BOOTLOADER_ADDRESS 0x1FFFD800
diff --git a/platforms/chibios/boards/GENERIC_STM32_F405XG/configs/config.h b/platforms/chibios/boards/GENERIC_STM32_F405XG/configs/config.h
index cc52a953ed..90a41326a1 100644
--- a/platforms/chibios/boards/GENERIC_STM32_F405XG/configs/config.h
+++ b/platforms/chibios/boards/GENERIC_STM32_F405XG/configs/config.h
@@ -17,7 +17,7 @@
/* Address for jumping to bootloader on STM32 chips. */
/* It is chip dependent, the correct number can be looked up by checking against ST's application note AN2606.
*/
-#define STM32_BOOTLOADER_ADDRESS 0x1FFF0000
+
#ifndef EARLY_INIT_PERFORM_BOOTLOADER_JUMP
# define EARLY_INIT_PERFORM_BOOTLOADER_JUMP TRUE
#endif
diff --git a/platforms/chibios/boards/GENERIC_STM32_F407XE/configs/config.h b/platforms/chibios/boards/GENERIC_STM32_F407XE/configs/config.h
index cc52a953ed..90a41326a1 100644
--- a/platforms/chibios/boards/GENERIC_STM32_F407XE/configs/config.h
+++ b/platforms/chibios/boards/GENERIC_STM32_F407XE/configs/config.h
@@ -17,7 +17,7 @@
/* Address for jumping to bootloader on STM32 chips. */
/* It is chip dependent, the correct number can be looked up by checking against ST's application note AN2606.
*/
-#define STM32_BOOTLOADER_ADDRESS 0x1FFF0000
+
#ifndef EARLY_INIT_PERFORM_BOOTLOADER_JUMP
# define EARLY_INIT_PERFORM_BOOTLOADER_JUMP TRUE
#endif
diff --git a/platforms/chibios/boards/GENERIC_STM32_F446XE/configs/config.h b/platforms/chibios/boards/GENERIC_STM32_F446XE/configs/config.h
index cc52a953ed..90a41326a1 100644
--- a/platforms/chibios/boards/GENERIC_STM32_F446XE/configs/config.h
+++ b/platforms/chibios/boards/GENERIC_STM32_F446XE/configs/config.h
@@ -17,7 +17,7 @@
/* Address for jumping to bootloader on STM32 chips. */
/* It is chip dependent, the correct number can be looked up by checking against ST's application note AN2606.
*/
-#define STM32_BOOTLOADER_ADDRESS 0x1FFF0000
+
#ifndef EARLY_INIT_PERFORM_BOOTLOADER_JUMP
# define EARLY_INIT_PERFORM_BOOTLOADER_JUMP TRUE
#endif
diff --git a/platforms/chibios/boards/GENERIC_STM32_G431XB/configs/config.h b/platforms/chibios/boards/GENERIC_STM32_G431XB/configs/config.h
deleted file mode 100644
index 39ce627e77..0000000000
--- a/platforms/chibios/boards/GENERIC_STM32_G431XB/configs/config.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* Copyright 2018-2020 Nick Brassel (@tzarc)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* 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
- */
-#define STM32_BOOTLOADER_ADDRESS 0x1FFF0000
diff --git a/platforms/chibios/boards/GENERIC_STM32_L412XB/configs/config.h b/platforms/chibios/boards/GENERIC_STM32_L412XB/configs/config.h
index c27c61b19a..fc9055ccfb 100644
--- a/platforms/chibios/boards/GENERIC_STM32_L412XB/configs/config.h
+++ b/platforms/chibios/boards/GENERIC_STM32_L412XB/configs/config.h
@@ -17,7 +17,6 @@
/* Address for jumping to bootloader on STM32 chips. */
/* It is chip dependent, the correct number can be looked up by checking against ST's application note AN2606.
*/
-#define STM32_BOOTLOADER_ADDRESS 0x1FFF0000
#define PAL_STM32_OSPEED_HIGHEST PAL_STM32_OSPEED_HIGH
diff --git a/platforms/chibios/boards/GENERIC_STM32_L433XC/configs/config.h b/platforms/chibios/boards/GENERIC_STM32_L433XC/configs/config.h
index c27c61b19a..fc9055ccfb 100644
--- a/platforms/chibios/boards/GENERIC_STM32_L433XC/configs/config.h
+++ b/platforms/chibios/boards/GENERIC_STM32_L433XC/configs/config.h
@@ -17,7 +17,6 @@
/* Address for jumping to bootloader on STM32 chips. */
/* It is chip dependent, the correct number can be looked up by checking against ST's application note AN2606.
*/
-#define STM32_BOOTLOADER_ADDRESS 0x1FFF0000
#define PAL_STM32_OSPEED_HIGHEST PAL_STM32_OSPEED_HIGH
diff --git a/platforms/chibios/boards/GENERIC_WB32_F3G71XX/configs/bootloader_defs.h b/platforms/chibios/boards/GENERIC_WB32_F3G71XX/configs/bootloader_defs.h
deleted file mode 100644
index c929d2ad03..0000000000
--- a/platforms/chibios/boards/GENERIC_WB32_F3G71XX/configs/bootloader_defs.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/* Address for jumping to bootloader on WB32 chips. */
-/* It is chip dependent, the correct number can be looked up here:
- * http://www.westberrytech.com/down/mcu/data/WB32F3G71xx_rm.pdf
- */
-#ifndef WB32_BOOTLOADER_ADDRESS
-# undef STM32_BOOTLOADER_ADDRESS
-# define WB32_BOOTLOADER_ADDRESS 0x1FFFE000
-# define STM32_BOOTLOADER_ADDRESS WB32_BOOTLOADER_ADDRESS
-#else
-# undef STM32_BOOTLOADER_ADDRESS
-# define STM32_BOOTLOADER_ADDRESS WB32_BOOTLOADER_ADDRESS
-#endif
diff --git a/platforms/chibios/boards/QMK_PROTON_C/configs/bootloader_defs.h b/platforms/chibios/boards/QMK_PROTON_C/configs/bootloader_defs.h
deleted file mode 100644
index 3b0e9d20a6..0000000000
--- a/platforms/chibios/boards/QMK_PROTON_C/configs/bootloader_defs.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* Address for jumping to bootloader on STM32 chips. */
-/* It is chip dependent, the correct number can be looked up here:
- * 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
- */
-#define STM32_BOOTLOADER_ADDRESS 0x1FFFD800
diff --git a/platforms/chibios/bootloader.c b/platforms/chibios/bootloader.c
deleted file mode 100644
index 58212948b0..0000000000
--- a/platforms/chibios/bootloader.c
+++ /dev/null
@@ -1,145 +0,0 @@
-#include "bootloader.h"
-
-#include <ch.h>
-#include <hal.h>
-#include "wait.h"
-
-/* This code should be checked whether it runs correctly on platforms */
-#define SYMVAL(sym) (uint32_t)(((uint8_t *)&(sym)) - ((uint8_t *)0))
-#define BOOTLOADER_MAGIC 0xDEADBEEF
-#define MAGIC_ADDR (unsigned long *)(SYMVAL(__ram0_end__) - 4)
-
-#ifndef STM32_BOOTLOADER_DUAL_BANK
-# define STM32_BOOTLOADER_DUAL_BANK FALSE
-#endif
-
-#ifdef BOOTLOADER_TINYUF2
-
-# define DBL_TAP_MAGIC 0xf01669ef // From tinyuf2's board_api.h
-
-// defined by linker script
-extern uint32_t _board_dfu_dbl_tap[];
-# define DBL_TAP_REG _board_dfu_dbl_tap[0]
-
-void bootloader_jump(void) {
- DBL_TAP_REG = DBL_TAP_MAGIC;
- NVIC_SystemReset();
-}
-
-void enter_bootloader_mode_if_requested(void) { /* not needed, no two-stage reset */
-}
-
-#elif STM32_BOOTLOADER_DUAL_BANK
-
-// Need pin definitions
-# include "config_common.h"
-
-# ifndef STM32_BOOTLOADER_DUAL_BANK_GPIO
-# error "No STM32_BOOTLOADER_DUAL_BANK_GPIO defined, don't know which pin to toggle"
-# endif
-
-# ifndef STM32_BOOTLOADER_DUAL_BANK_POLARITY
-# define STM32_BOOTLOADER_DUAL_BANK_POLARITY 0
-# endif
-
-# ifndef STM32_BOOTLOADER_DUAL_BANK_DELAY
-# define STM32_BOOTLOADER_DUAL_BANK_DELAY 100000
-# endif
-
-extern uint32_t __ram0_end__;
-
-__attribute__((weak)) void bootloader_jump(void) {
- // For STM32 MCUs with dual-bank flash, and we're incapable of jumping to the bootloader. The first valid flash
- // bank is executed unconditionally after a reset, so it doesn't enter DFU unless BOOT0 is high. Instead, we do
- // it with hardware...in this case, we pull a GPIO high/low depending on the configuration, connects 3.3V to
- // BOOT0's RC charging circuit, lets it charge the capacitor, and issue a system reset. See the QMK discord
- // #hardware channel pins for an example circuit.
- palSetPadMode(PAL_PORT(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_PAD(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_MODE_OUTPUT_PUSHPULL);
-# if STM32_BOOTLOADER_DUAL_BANK_POLARITY
- palSetPad(PAL_PORT(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_PAD(STM32_BOOTLOADER_DUAL_BANK_GPIO));
-# else
- palClearPad(PAL_PORT(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_PAD(STM32_BOOTLOADER_DUAL_BANK_GPIO));
-# endif
-
- // Wait for a while for the capacitor to charge
- wait_ms(100);
-
- // Issue a system reset to get the ROM bootloader to execute, with BOOT0 high
- NVIC_SystemReset();
-}
-
-void enter_bootloader_mode_if_requested(void) {} // not needed at all, but if anybody attempts to invoke it....
-
-#elif defined(STM32_BOOTLOADER_ADDRESS) // STM32_BOOTLOADER_DUAL_BANK
-
-extern uint32_t __ram0_end__;
-
-__attribute__((weak)) void bootloader_jump(void) {
- *MAGIC_ADDR = BOOTLOADER_MAGIC; // set magic flag => reset handler will jump into boot loader
- NVIC_SystemReset();
-}
-
-void enter_bootloader_mode_if_requested(void) {
- unsigned long *check = MAGIC_ADDR;
- if (*check == BOOTLOADER_MAGIC) {
- *check = 0;
- __set_CONTROL(0);
- __set_MSP(*(__IO uint32_t *)STM32_BOOTLOADER_ADDRESS);
- __enable_irq();
-
- typedef void (*BootJump_t)(void);
- BootJump_t boot_jump = *(BootJump_t *)(STM32_BOOTLOADER_ADDRESS + 4);
- boot_jump();
- while (1)
- ;
- }
-}
-
-#elif defined(GD32VF103)
-
-# define DBGMCU_KEY_UNLOCK 0x4B5A6978
-# define DBGMCU_CMD_RESET 0x1
-
-__IO uint32_t *DBGMCU_KEY = (uint32_t *)DBGMCU_BASE + 0x0CU;
-__IO uint32_t *DBGMCU_CMD = (uint32_t *)DBGMCU_BASE + 0x08U;
-
-__attribute__((weak)) void bootloader_jump(void) {
- /* The MTIMER unit of the GD32VF103 doesn't have the MSFRST
- * register to generate a software reset request.
- * BUT instead two undocumented registers in the debug peripheral
- * that allow issueing a software reset. WHO would need the MSFRST
- * register anyway? Source:
- * https://github.com/esmil/gd32vf103inator/blob/master/include/gd32vf103/dbg.h */
- *DBGMCU_KEY = DBGMCU_KEY_UNLOCK;
- *DBGMCU_CMD = DBGMCU_CMD_RESET;
-}
-
-void enter_bootloader_mode_if_requested(void) { /* Jumping to bootloader is not possible from user code. */
-}
-
-#elif defined(KL2x) || defined(K20x) || defined(MK66F18) || defined(MIMXRT1062) // STM32_BOOTLOADER_DUAL_BANK // STM32_BOOTLOADER_ADDRESS
-/* Kinetis */
-
-# if defined(BOOTLOADER_KIIBOHD)
-/* Kiibohd Bootloader (MCHCK and Infinity KB) */
-# define SCB_AIRCR_VECTKEY_WRITEMAGIC 0x05FA0000
-const uint8_t sys_reset_to_loader_magic[] = "\xff\x00\x7fRESET TO LOADER\x7f\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
-__attribute__((weak)) void bootloader_jump(void) {
- void *volatile vbat = (void *)VBAT;
- __builtin_memcpy(vbat, (const void *)sys_reset_to_loader_magic, sizeof(sys_reset_to_loader_magic));
- // request reset
- SCB->AIRCR = SCB_AIRCR_VECTKEY_WRITEMAGIC | SCB_AIRCR_SYSRESETREQ_Msk;
-}
-
-# else /* defined(BOOTLOADER_KIIBOHD) */
-/* Default for Kinetis - expecting an ARM Teensy */
-# include "wait.h"
-__attribute__((weak)) void bootloader_jump(void) {
- wait_ms(100);
- __BKPT(0);
-}
-# endif /* defined(BOOTLOADER_KIIBOHD) */
-
-#else /* neither STM32 nor KINETIS */
-__attribute__((weak)) void bootloader_jump(void) {}
-#endif
diff --git a/platforms/chibios/bootloaders/gd32v_dfu.c b/platforms/chibios/bootloaders/gd32v_dfu.c
new file mode 100644
index 0000000000..baa7d1f882
--- /dev/null
+++ b/platforms/chibios/bootloaders/gd32v_dfu.c
@@ -0,0 +1,40 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "bootloader.h"
+
+#include <ch.h>
+#include <hal.h>
+
+#define DBGMCU_KEY_UNLOCK 0x4B5A6978
+#define DBGMCU_CMD_RESET 0x1
+
+__IO uint32_t *DBGMCU_KEY = (uint32_t *)DBGMCU_BASE + 0x0CU;
+__IO uint32_t *DBGMCU_CMD = (uint32_t *)DBGMCU_BASE + 0x08U;
+
+__attribute__((weak)) void bootloader_jump(void) {
+ /* The MTIMER unit of the GD32VF103 doesn't have the MSFRST
+ * register to generate a software reset request.
+ * BUT instead two undocumented registers in the debug peripheral
+ * that allow issueing a software reset. WHO would need the MSFRST
+ * register anyway? Source:
+ * https://github.com/esmil/gd32vf103inator/blob/master/include/gd32vf103/dbg.h */
+ *DBGMCU_KEY = DBGMCU_KEY_UNLOCK;
+ *DBGMCU_CMD = DBGMCU_CMD_RESET;
+}
+
+/* Jumping to bootloader is not possible from user code. */
+void enter_bootloader_mode_if_requested(void) {}
diff --git a/platforms/chibios/bootloaders/halfkay.c b/platforms/chibios/bootloaders/halfkay.c
new file mode 100644
index 0000000000..168c2abc23
--- /dev/null
+++ b/platforms/chibios/bootloaders/halfkay.c
@@ -0,0 +1,25 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "bootloader.h"
+
+#include <ch.h>
+#include "wait.h"
+
+__attribute__((weak)) void bootloader_jump(void) {
+ wait_ms(100);
+ __BKPT(0);
+}
diff --git a/platforms/chibios/bootloaders/kiibohd.c b/platforms/chibios/bootloaders/kiibohd.c
new file mode 100644
index 0000000000..911e807092
--- /dev/null
+++ b/platforms/chibios/bootloaders/kiibohd.c
@@ -0,0 +1,32 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "bootloader.h"
+
+#include <ch.h>
+
+/* Kiibohd Bootloader (MCHCK and Infinity KB) */
+#define SCB_AIRCR_VECTKEY_WRITEMAGIC 0x05FA0000
+
+const uint8_t sys_reset_to_loader_magic[] = "\xff\x00\x7fRESET TO LOADER\x7f\x00\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
+
+__attribute__((weak)) void bootloader_jump(void) {
+ void *volatile vbat = (void *)VBAT;
+ __builtin_memcpy(vbat, (const void *)sys_reset_to_loader_magic, sizeof(sys_reset_to_loader_magic));
+
+ // request reset
+ SCB->AIRCR = SCB_AIRCR_VECTKEY_WRITEMAGIC | SCB_AIRCR_SYSRESETREQ_Msk;
+}
diff --git a/platforms/chibios/bootloaders/none.c b/platforms/chibios/bootloaders/none.c
new file mode 100644
index 0000000000..8379d35abf
--- /dev/null
+++ b/platforms/chibios/bootloaders/none.c
@@ -0,0 +1,23 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "bootloader.h"
+
+#pragma message "Unknown bootloader set, you may not be able to enter bootloader using software reset"
+
+__attribute__((weak)) void bootloader_jump(void) {}
+
+__attribute__((weak)) void enter_bootloader_mode_if_requested(void) {}
diff --git a/platforms/chibios/bootloaders/stm32_dfu.c b/platforms/chibios/bootloaders/stm32_dfu.c
new file mode 100644
index 0000000000..0a113570f7
--- /dev/null
+++ b/platforms/chibios/bootloaders/stm32_dfu.c
@@ -0,0 +1,94 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "bootloader.h"
+
+#include <ch.h>
+#include <hal.h>
+#include "wait.h"
+
+extern uint32_t __ram0_end__;
+
+#ifndef STM32_BOOTLOADER_DUAL_BANK
+# define STM32_BOOTLOADER_DUAL_BANK FALSE
+#endif
+
+#if STM32_BOOTLOADER_DUAL_BANK
+# include "config_common.h"
+
+# ifndef STM32_BOOTLOADER_DUAL_BANK_GPIO
+# error "No STM32_BOOTLOADER_DUAL_BANK_GPIO defined, don't know which pin to toggle"
+# endif
+
+# ifndef STM32_BOOTLOADER_DUAL_BANK_POLARITY
+# define STM32_BOOTLOADER_DUAL_BANK_POLARITY 0
+# endif
+
+# ifndef STM32_BOOTLOADER_DUAL_BANK_DELAY
+# define STM32_BOOTLOADER_DUAL_BANK_DELAY 100000
+# endif
+
+__attribute__((weak)) void bootloader_jump(void) {
+ // For STM32 MCUs with dual-bank flash, and we're incapable of jumping to the bootloader. The first valid flash
+ // bank is executed unconditionally after a reset, so it doesn't enter DFU unless BOOT0 is high. Instead, we do
+ // it with hardware...in this case, we pull a GPIO high/low depending on the configuration, connects 3.3V to
+ // BOOT0's RC charging circuit, lets it charge the capacitor, and issue a system reset. See the QMK discord
+ // #hardware channel pins for an example circuit.
+ palSetPadMode(PAL_PORT(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_PAD(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_MODE_OUTPUT_PUSHPULL);
+# if STM32_BOOTLOADER_DUAL_BANK_POLARITY
+ palSetPad(PAL_PORT(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_PAD(STM32_BOOTLOADER_DUAL_BANK_GPIO));
+# else
+ palClearPad(PAL_PORT(STM32_BOOTLOADER_DUAL_BANK_GPIO), PAL_PAD(STM32_BOOTLOADER_DUAL_BANK_GPIO));
+# endif
+
+ // Wait for a while for the capacitor to charge
+ wait_ms(100);
+
+ // Issue a system reset to get the ROM bootloader to execute, with BOOT0 high
+ NVIC_SystemReset();
+}
+
+// not needed at all, but if anybody attempts to invoke it....
+void enter_bootloader_mode_if_requested(void) {}
+
+#else
+
+/* This code should be checked whether it runs correctly on platforms */
+# define SYMVAL(sym) (uint32_t)(((uint8_t *)&(sym)) - ((uint8_t *)0))
+# define BOOTLOADER_MAGIC 0xDEADBEEF
+# define MAGIC_ADDR (unsigned long *)(SYMVAL(__ram0_end__) - 4)
+
+__attribute__((weak)) void bootloader_jump(void) {
+ *MAGIC_ADDR = BOOTLOADER_MAGIC; // set magic flag => reset handler will jump into boot loader
+ NVIC_SystemReset();
+}
+
+void enter_bootloader_mode_if_requested(void) {
+ unsigned long *check = MAGIC_ADDR;
+ if (*check == BOOTLOADER_MAGIC) {
+ *check = 0;
+ __set_CONTROL(0);
+ __set_MSP(*(__IO uint32_t *)STM32_BOOTLOADER_ADDRESS);
+ __enable_irq();
+
+ typedef void (*BootJump_t)(void);
+ BootJump_t boot_jump = *(BootJump_t *)(STM32_BOOTLOADER_ADDRESS + 4);
+ boot_jump();
+ while (1)
+ ;
+ }
+}
+#endif
diff --git a/platforms/chibios/bootloaders/stm32duino.c b/platforms/chibios/bootloaders/stm32duino.c
new file mode 100644
index 0000000000..dd1d551fa9
--- /dev/null
+++ b/platforms/chibios/bootloaders/stm32duino.c
@@ -0,0 +1,21 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "bootloader.h"
+
+#include <ch.h>
+
+__attribute__((weak)) void bootloader_jump(void) { NVIC_SystemReset(); }
diff --git a/platforms/chibios/bootloaders/tinyuf2.c b/platforms/chibios/bootloaders/tinyuf2.c
new file mode 100644
index 0000000000..9ffca5dec8
--- /dev/null
+++ b/platforms/chibios/bootloaders/tinyuf2.c
@@ -0,0 +1,34 @@
+/* Copyright 2021 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "bootloader.h"
+
+#include <ch.h>
+
+// From tinyuf2's board_api.h
+#define DBL_TAP_MAGIC 0xF01669EF
+
+// defined by linker script
+extern uint32_t _board_dfu_dbl_tap[];
+#define DBL_TAP_REG _board_dfu_dbl_tap[0]
+
+__attribute__((weak)) void bootloader_jump(void) {
+ DBL_TAP_REG = DBL_TAP_MAGIC;
+ NVIC_SystemReset();
+}
+
+/* not needed, no two-stage reset */
+void enter_bootloader_mode_if_requested(void) {}
diff --git a/platforms/chibios/drivers/i2c_master.c b/platforms/chibios/drivers/i2c_master.c
index 43591d56f8..4a5d4760d0 100644
--- a/platforms/chibios/drivers/i2c_master.c
+++ b/platforms/chibios/drivers/i2c_master.c
@@ -27,8 +27,67 @@
#include "quantum.h"
#include "i2c_master.h"
#include <string.h>
+#include <ch.h>
#include <hal.h>
+#ifndef I2C1_SCL_PIN
+# define I2C1_SCL_PIN B6
+#endif
+#ifndef I2C1_SDA_PIN
+# define I2C1_SDA_PIN B7
+#endif
+
+#ifdef USE_I2CV1
+# ifndef I2C1_OPMODE
+# define I2C1_OPMODE OPMODE_I2C
+# endif
+# ifndef I2C1_CLOCK_SPEED
+# define I2C1_CLOCK_SPEED 100000 /* 400000 */
+# endif
+# ifndef I2C1_DUTY_CYCLE
+# define I2C1_DUTY_CYCLE STD_DUTY_CYCLE /* FAST_DUTY_CYCLE_2 */
+# endif
+#else
+// The default timing values below configures the I2C clock to 400khz assuming a 72Mhz clock
+// For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html
+# ifndef I2C1_TIMINGR_PRESC
+# define I2C1_TIMINGR_PRESC 0U
+# endif
+# ifndef I2C1_TIMINGR_SCLDEL
+# define I2C1_TIMINGR_SCLDEL 7U
+# endif
+# ifndef I2C1_TIMINGR_SDADEL
+# define I2C1_TIMINGR_SDADEL 0U
+# endif
+# ifndef I2C1_TIMINGR_SCLH
+# define I2C1_TIMINGR_SCLH 38U
+# endif
+# ifndef I2C1_TIMINGR_SCLL
+# define I2C1_TIMINGR_SCLL 129U
+# endif
+#endif
+
+#ifndef I2C_DRIVER
+# define I2C_DRIVER I2CD1
+#endif
+
+#ifdef USE_GPIOV1
+# ifndef I2C1_SCL_PAL_MODE
+# define I2C1_SCL_PAL_MODE PAL_MODE_ALTERNATE_OPENDRAIN
+# endif
+# ifndef I2C1_SDA_PAL_MODE
+# define I2C1_SDA_PAL_MODE PAL_MODE_ALTERNATE_OPENDRAIN
+# endif
+#else
+// The default PAL alternate modes are used to signal that the pins are used for I2C
+# ifndef I2C1_SCL_PAL_MODE
+# define I2C1_SCL_PAL_MODE 4
+# endif
+# ifndef I2C1_SDA_PAL_MODE
+# define I2C1_SDA_PAL_MODE 4
+# endif
+#endif
+
static uint8_t i2c_address;
static const I2CConfig i2cconfig = {
diff --git a/platforms/chibios/drivers/i2c_master.h b/platforms/chibios/drivers/i2c_master.h
index 5f082e9d1e..deee7ecc08 100644
--- a/platforms/chibios/drivers/i2c_master.h
+++ b/platforms/chibios/drivers/i2c_master.h
@@ -24,66 +24,7 @@
*/
#pragma once
-#include <ch.h>
-#include <hal.h>
-
-#ifndef I2C1_SCL_PIN
-# define I2C1_SCL_PIN B6
-#endif
-#ifndef I2C1_SDA_PIN
-# define I2C1_SDA_PIN B7
-#endif
-
-#ifdef USE_I2CV1
-# ifndef I2C1_OPMODE
-# define I2C1_OPMODE OPMODE_I2C
-# endif
-# ifndef I2C1_CLOCK_SPEED
-# define I2C1_CLOCK_SPEED 100000 /* 400000 */
-# endif
-# ifndef I2C1_DUTY_CYCLE
-# define I2C1_DUTY_CYCLE STD_DUTY_CYCLE /* FAST_DUTY_CYCLE_2 */
-# endif
-#else
-// The default timing values below configures the I2C clock to 400khz assuming a 72Mhz clock
-// For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html
-# ifndef I2C1_TIMINGR_PRESC
-# define I2C1_TIMINGR_PRESC 0U
-# endif
-# ifndef I2C1_TIMINGR_SCLDEL
-# define I2C1_TIMINGR_SCLDEL 7U
-# endif
-# ifndef I2C1_TIMINGR_SDADEL
-# define I2C1_TIMINGR_SDADEL 0U
-# endif
-# ifndef I2C1_TIMINGR_SCLH
-# define I2C1_TIMINGR_SCLH 38U
-# endif
-# ifndef I2C1_TIMINGR_SCLL
-# define I2C1_TIMINGR_SCLL 129U
-# endif
-#endif
-
-#ifndef I2C_DRIVER
-# define I2C_DRIVER I2CD1
-#endif
-
-#ifdef USE_GPIOV1
-# ifndef I2C1_SCL_PAL_MODE
-# define I2C1_SCL_PAL_MODE PAL_MODE_ALTERNATE_OPENDRAIN
-# endif
-# ifndef I2C1_SDA_PAL_MODE
-# define I2C1_SDA_PAL_MODE PAL_MODE_ALTERNATE_OPENDRAIN
-# endif
-#else
-// The default PAL alternate modes are used to signal that the pins are used for I2C
-# ifndef I2C1_SCL_PAL_MODE
-# define I2C1_SCL_PAL_MODE 4
-# endif
-# ifndef I2C1_SDA_PAL_MODE
-# define I2C1_SDA_PAL_MODE 4
-# endif
-#endif
+#include <stdint.h>
typedef int16_t i2c_status_t;
diff --git a/platforms/chibios/gpio.h b/platforms/chibios/gpio.h
index 4d057f1cab..eb44a18f9c 100644
--- a/platforms/chibios/gpio.h
+++ b/platforms/chibios/gpio.h
@@ -22,10 +22,12 @@ typedef ioline_t pin_t;
/* Operation of GPIO by pin. */
-#define setPinInput(pin) palSetLineMode(pin, PAL_MODE_INPUT)
-#define setPinInputHigh(pin) palSetLineMode(pin, PAL_MODE_INPUT_PULLUP)
-#define setPinInputLow(pin) palSetLineMode(pin, PAL_MODE_INPUT_PULLDOWN)
-#define setPinOutput(pin) palSetLineMode(pin, PAL_MODE_OUTPUT_PUSHPULL)
+#define setPinInput(pin) palSetLineMode((pin), PAL_MODE_INPUT)
+#define setPinInputHigh(pin) palSetLineMode((pin), PAL_MODE_INPUT_PULLUP)
+#define setPinInputLow(pin) palSetLineMode((pin), PAL_MODE_INPUT_PULLDOWN)
+#define setPinOutputPushPull(pin) palSetLineMode((pin), PAL_MODE_OUTPUT_PUSHPULL)
+#define setPinOutputOpenDrain(pin) palSetLineMode((pin), PAL_MODE_OUTPUT_OPENDRAIN)
+#define setPinOutput(pin) setPinOutputPushPull(pin)
#define writePinHigh(pin) palSetLine(pin)
#define writePinLow(pin) palClearLine(pin)
@@ -34,17 +36,3 @@ typedef ioline_t pin_t;
#define readPin(pin) palReadLine(pin)
#define togglePin(pin) palToggleLine(pin)
-
-/* Operation of GPIO by port. */
-
-typedef uint16_t port_data_t;
-
-#define readPort(pin) palReadPort(PAL_PORT(pin))
-
-#define setPortBitInput(pin, bit) palSetPadMode(PAL_PORT(pin), bit, PAL_MODE_INPUT)
-#define setPortBitInputHigh(pin, bit) palSetPadMode(PAL_PORT(pin), bit, PAL_MODE_INPUT_PULLUP)
-#define setPortBitInputLow(pin, bit) palSetPadMode(PAL_PORT(pin), bit, PAL_MODE_INPUT_PULLDOWN)
-#define setPortBitOutput(pin, bit) palSetPadMode(PAL_PORT(pin), bit, PAL_MODE_OUTPUT_PUSHPULL)
-
-#define writePortBitLow(pin, bit) palClearLine(PAL_LINE(PAL_PORT(pin), bit))
-#define writePortBitHigh(pin, bit) palSetLine(PAL_LINE(PAL_PORT(pin), bit))
diff --git a/platforms/common.mk b/platforms/common.mk
index f7a0fc7028..12ab45f823 100644
--- a/platforms/common.mk
+++ b/platforms/common.mk
@@ -4,7 +4,7 @@ TMK_COMMON_SRC += \
$(PLATFORM_COMMON_DIR)/platform.c \
$(PLATFORM_COMMON_DIR)/suspend.c \
$(PLATFORM_COMMON_DIR)/timer.c \
- $(PLATFORM_COMMON_DIR)/bootloader.c \
+ $(PLATFORM_COMMON_DIR)/bootloaders/$(BOOTLOADER_TYPE).c
# Search Path
VPATH += $(PLATFORM_PATH)
diff --git a/platforms/test/bootloader.c b/platforms/test/bootloaders/none.c
index 5155d9ff04..5155d9ff04 100644
--- a/platforms/test/bootloader.c
+++ b/platforms/test/bootloaders/none.c
diff --git a/quantum/action.c b/quantum/action.c
index 5e81efb671..ea2310a4d9 100644
--- a/quantum/action.c
+++ b/quantum/action.c
@@ -794,7 +794,7 @@ void process_action(keyrecord_t *record, action_t action) {
*
* FIXME: Needs documentation.
*/
-void register_code(uint8_t code) {
+__attribute__((weak)) void register_code(uint8_t code) {
if (code == KC_NO) {
return;
}
@@ -890,7 +890,7 @@ void register_code(uint8_t code) {
*
* FIXME: Needs documentation.
*/
-void unregister_code(uint8_t code) {
+__attribute__((weak)) void unregister_code(uint8_t code) {
if (code == KC_NO) {
return;
}
@@ -955,7 +955,7 @@ void unregister_code(uint8_t code) {
* \param code The basic keycode to tap.
* \param delay The amount of time in milliseconds to leave the keycode registered, before unregistering it.
*/
-void tap_code_delay(uint8_t code, uint16_t delay) {
+__attribute__((weak)) void tap_code_delay(uint8_t code, uint16_t delay) {
register_code(code);
for (uint16_t i = delay; i > 0; i--) {
wait_ms(1);
@@ -967,13 +967,13 @@ void tap_code_delay(uint8_t code, uint16_t delay) {
*
* \param code The basic keycode to tap. If `code` is `KC_CAPS_LOCK`, the delay will be `TAP_HOLD_CAPS_DELAY`, otherwise `TAP_CODE_DELAY`, if defined.
*/
-void tap_code(uint8_t code) { tap_code_delay(code, code == KC_CAPS_LOCK ? TAP_HOLD_CAPS_DELAY : TAP_CODE_DELAY); }
+__attribute__((weak)) void tap_code(uint8_t code) { tap_code_delay(code, code == KC_CAPS_LOCK ? TAP_HOLD_CAPS_DELAY : TAP_CODE_DELAY); }
/** \brief Adds the given physically pressed modifiers and sends a keyboard report immediately.
*
* \param mods A bitfield of modifiers to register.
*/
-void register_mods(uint8_t mods) {
+__attribute__((weak)) void register_mods(uint8_t mods) {
if (mods) {
add_mods(mods);
send_keyboard_report();
@@ -984,7 +984,7 @@ void register_mods(uint8_t mods) {
*
* \param mods A bitfield of modifiers to unregister.
*/
-void unregister_mods(uint8_t mods) {
+__attribute__((weak)) void unregister_mods(uint8_t mods) {
if (mods) {
del_mods(mods);
send_keyboard_report();
@@ -995,7 +995,7 @@ void unregister_mods(uint8_t mods) {
*
* \param mods A bitfield of modifiers to register.
*/
-void register_weak_mods(uint8_t mods) {
+__attribute__((weak)) void register_weak_mods(uint8_t mods) {
if (mods) {
add_weak_mods(mods);
send_keyboard_report();
@@ -1006,7 +1006,7 @@ void register_weak_mods(uint8_t mods) {
*
* \param mods A bitfield of modifiers to unregister.
*/
-void unregister_weak_mods(uint8_t mods) {
+__attribute__((weak)) void unregister_weak_mods(uint8_t mods) {
if (mods) {
del_weak_mods(mods);
send_keyboard_report();
diff --git a/quantum/action_util.c b/quantum/action_util.c
index 78e02aec18..7e30593fb1 100644
--- a/quantum/action_util.c
+++ b/quantum/action_util.c
@@ -21,6 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "action_layer.h"
#include "timer.h"
#include "keycode_config.h"
+#include <string.h>
extern keymap_config_t keymap_config;
@@ -247,7 +248,13 @@ void send_keyboard_report(void) {
keyboard_report->mods |= weak_override_mods;
#endif
- host_keyboard_send(keyboard_report);
+ static report_keyboard_t last_report;
+
+ /* Only send the report if there are changes to propagate to the host. */
+ if (memcmp(keyboard_report, &last_report, sizeof(report_keyboard_t)) != 0) {
+ memcpy(&last_report, keyboard_report, sizeof(report_keyboard_t));
+ host_keyboard_send(keyboard_report);
+ }
}
/** \brief Get mods
diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c
index 49bb309e80..b3d6389dd5 100644
--- a/quantum/audio/audio.c
+++ b/quantum/audio/audio.c
@@ -160,6 +160,8 @@ void audio_toggle(void) {
eeconfig_update_audio(audio_config.raw);
if (audio_config.enable) {
audio_on_user();
+ } else {
+ audio_off_user();
}
}
@@ -172,6 +174,7 @@ void audio_on(void) {
void audio_off(void) {
PLAY_SONG(audio_off_song);
+ audio_off_user();
wait_ms(100);
audio_stop_all();
audio_config.enable = 0;
diff --git a/quantum/debounce.h b/quantum/debounce.h
index 5043868289..3532d9cd7b 100644
--- a/quantum/debounce.h
+++ b/quantum/debounce.h
@@ -6,8 +6,6 @@
// changed is true if raw has changed since the last call
void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed);
-bool debounce_active(void);
-
void debounce_init(uint8_t num_rows);
void debounce_free(void);
diff --git a/quantum/debounce/asym_eager_defer_pk.c b/quantum/debounce/asym_eager_defer_pk.c
index 81f39383c4..b1eb4a2b7b 100644
--- a/quantum/debounce/asym_eager_defer_pk.c
+++ b/quantum/debounce/asym_eager_defer_pk.c
@@ -165,7 +165,6 @@ static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], ui
}
}
-bool debounce_active(void) { return true; }
#else
# include "none.c"
#endif
diff --git a/quantum/debounce/none.c b/quantum/debounce/none.c
index b03892bc5b..8a85cc04a8 100644
--- a/quantum/debounce/none.c
+++ b/quantum/debounce/none.c
@@ -26,6 +26,4 @@ void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool
}
}
-bool debounce_active(void) { return false; }
-
void debounce_free(void) {}
diff --git a/quantum/debounce/sym_defer_g.c b/quantum/debounce/sym_defer_g.c
index 9155eb914c..8cac1c37f9 100644
--- a/quantum/debounce/sym_defer_g.c
+++ b/quantum/debounce/sym_defer_g.c
@@ -44,8 +44,6 @@ void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool
}
}
-bool debounce_active(void) { return debouncing; }
-
void debounce_free(void) {}
#else // no debouncing.
# include "none.c"
diff --git a/quantum/debounce/sym_defer_pk.c b/quantum/debounce/sym_defer_pk.c
index 1b698ba347..9dee29e28e 100644
--- a/quantum/debounce/sym_defer_pk.c
+++ b/quantum/debounce/sym_defer_pk.c
@@ -134,7 +134,6 @@ static void start_debounce_counters(matrix_row_t raw[], matrix_row_t cooked[], u
}
}
-bool debounce_active(void) { return true; }
#else
# include "none.c"
#endif
diff --git a/quantum/debounce/sym_defer_pr.c b/quantum/debounce/sym_defer_pr.c
new file mode 100644
index 0000000000..8b33acc6a2
--- /dev/null
+++ b/quantum/debounce/sym_defer_pr.c
@@ -0,0 +1,72 @@
+/*
+Copyright 2021 Chad Austin <chad@chadaustin.me>
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General 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/>.
+*/
+
+/*
+Symmetric per-row debounce algorithm. Changes only apply when
+DEBOUNCE milliseconds have elapsed since the last change.
+*/
+
+#include "matrix.h"
+#include "timer.h"
+#include "quantum.h"
+#include <stdlib.h>
+
+#ifndef DEBOUNCE
+# define DEBOUNCE 5
+#endif
+
+static uint16_t last_time;
+// [row] milliseconds until key's state is considered debounced.
+static uint8_t* countdowns;
+// [row]
+static matrix_row_t* last_raw;
+
+void debounce_init(uint8_t num_rows) {
+ countdowns = (uint8_t*)calloc(num_rows, sizeof(uint8_t));
+ last_raw = (matrix_row_t*)calloc(num_rows, sizeof(matrix_row_t));
+
+ last_time = timer_read();
+}
+
+void debounce_free(void) {
+ free(countdowns);
+ countdowns = NULL;
+ free(last_raw);
+ last_raw = NULL;
+}
+
+void debounce(matrix_row_t raw[], matrix_row_t cooked[], uint8_t num_rows, bool changed) {
+ uint16_t now = timer_read();
+ uint16_t elapsed16 = TIMER_DIFF_16(now, last_time);
+ last_time = now;
+ uint8_t elapsed = (elapsed16 > 255) ? 255 : elapsed16;
+
+ uint8_t* countdown = countdowns;
+
+ for (uint8_t row = 0; row < num_rows; ++row, ++countdown) {
+ matrix_row_t raw_row = raw[row];
+
+ if (raw_row != last_raw[row]) {
+ *countdown = DEBOUNCE;
+ last_raw[row] = raw_row;
+ } else if (*countdown > elapsed) {
+ *countdown -= elapsed;
+ } else if (*countdown) {
+ cooked[row] = raw_row;
+ *countdown = 0;
+ }
+ }
+}
+
+bool debounce_active(void) { return true; }
diff --git a/quantum/debounce/sym_eager_pk.c b/quantum/debounce/sym_eager_pk.c
index 9da000ea9a..deec463649 100644
--- a/quantum/debounce/sym_eager_pk.c
+++ b/quantum/debounce/sym_eager_pk.c
@@ -140,7 +140,6 @@ static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], ui
}
}
-bool debounce_active(void) { return true; }
#else
# include "none.c"
#endif
diff --git a/quantum/debounce/sym_eager_pr.c b/quantum/debounce/sym_eager_pr.c
index eda92a263b..29b0cabefb 100644
--- a/quantum/debounce/sym_eager_pr.c
+++ b/quantum/debounce/sym_eager_pr.c
@@ -132,7 +132,6 @@ static void transfer_matrix_values(matrix_row_t raw[], matrix_row_t cooked[], ui
}
}
-bool debounce_active(void) { return true; }
#else
# include "none.c"
#endif
diff --git a/quantum/debounce/tests/rules.mk b/quantum/debounce/tests/rules.mk
index e908dd6f67..8318b1c668 100644
--- a/quantum/debounce/tests/rules.mk
+++ b/quantum/debounce/tests/rules.mk
@@ -28,6 +28,11 @@ debounce_sym_defer_pk_SRC := $(DEBOUNCE_COMMON_SRC) \
$(QUANTUM_PATH)/debounce/sym_defer_pk.c \
$(QUANTUM_PATH)/debounce/tests/sym_defer_pk_tests.cpp
+debounce_sym_defer_pr_DEFS := $(DEBOUNCE_COMMON_DEFS)
+debounce_sym_defer_pr_SRC := $(DEBOUNCE_COMMON_SRC) \
+ $(QUANTUM_PATH)/debounce/sym_defer_pr.c \
+ $(QUANTUM_PATH)/debounce/tests/sym_defer_pr_tests.cpp
+
debounce_sym_eager_pk_DEFS := $(DEBOUNCE_COMMON_DEFS)
debounce_sym_eager_pk_SRC := $(DEBOUNCE_COMMON_SRC) \
$(QUANTUM_PATH)/debounce/sym_eager_pk.c \
diff --git a/quantum/debounce/tests/sym_defer_pr_tests.cpp b/quantum/debounce/tests/sym_defer_pr_tests.cpp
new file mode 100644
index 0000000000..417e1f4ca2
--- /dev/null
+++ b/quantum/debounce/tests/sym_defer_pr_tests.cpp
@@ -0,0 +1,238 @@
+/* Copyright 2021 Simon Arlott
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General 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 "gtest/gtest.h"
+
+#include "debounce_test_common.h"
+
+TEST_F(DebounceTest, OneKeyShort1) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}}, {}},
+
+ {5, {}, {{0, 1, DOWN}}},
+ /* 0ms delay (fast scan rate) */
+ {5, {{0, 1, UP}}, {}},
+
+ {10, {}, {{0, 1, UP}}},
+ });
+ runEvents();
+}
+
+TEST_F(DebounceTest, OneKeyShort2) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}}, {}},
+
+ {5, {}, {{0, 1, DOWN}}},
+ /* 1ms delay */
+ {6, {{0, 1, UP}}, {}},
+
+ {11, {}, {{0, 1, UP}}},
+ });
+ runEvents();
+}
+
+TEST_F(DebounceTest, OneKeyShort3) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}}, {}},
+
+ {5, {}, {{0, 1, DOWN}}},
+ /* 2ms delay */
+ {7, {{0, 1, UP}}, {}},
+
+ {12, {}, {{0, 1, UP}}},
+ });
+ runEvents();
+}
+
+TEST_F(DebounceTest, OneKeyTooQuick1) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}}, {}},
+ /* Release key exactly on the debounce time */
+ {5, {{0, 1, UP}}, {}},
+ });
+ runEvents();
+}
+
+TEST_F(DebounceTest, OneKeyTooQuick2) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}}, {}},
+
+ {5, {}, {{0, 1, DOWN}}},
+ {6, {{0, 1, UP}}, {}},
+
+ /* Press key exactly on the debounce time */
+ {11, {{0, 1, DOWN}}, {}},
+ });
+ runEvents();
+}
+
+TEST_F(DebounceTest, OneKeyBouncing1) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}}, {}},
+ {1, {{0, 1, UP}}, {}},
+ {2, {{0, 1, DOWN}}, {}},
+ {3, {{0, 1, UP}}, {}},
+ {4, {{0, 1, DOWN}}, {}},
+ {5, {{0, 1, UP}}, {}},
+ {6, {{0, 1, DOWN}}, {}},
+ {11, {}, {{0, 1, DOWN}}}, /* 5ms after DOWN at time 7 */
+ });
+ runEvents();
+}
+
+TEST_F(DebounceTest, OneKeyBouncing2) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}}, {}},
+ {5, {}, {{0, 1, DOWN}}},
+ {6, {{0, 1, UP}}, {}},
+ {7, {{0, 1, DOWN}}, {}},
+ {8, {{0, 1, UP}}, {}},
+ {9, {{0, 1, DOWN}}, {}},
+ {10, {{0, 1, UP}}, {}},
+ {15, {}, {{0, 1, UP}}}, /* 5ms after UP at time 10 */
+ });
+ runEvents();
+}
+
+TEST_F(DebounceTest, OneKeyLong) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}}, {}},
+
+ {5, {}, {{0, 1, DOWN}}},
+
+ {25, {{0, 1, UP}}, {}},
+
+ {30, {}, {{0, 1, UP}}},
+
+ {50, {{0, 1, DOWN}}, {}},
+
+ {55, {}, {{0, 1, DOWN}}},
+ });
+ runEvents();
+}
+
+TEST_F(DebounceTest, TwoKeysShort) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}}, {}},
+ {1, {{0, 2, DOWN}}, {}},
+
+ {6, {}, {{0, 1, DOWN}, {0, 2, DOWN}}},
+
+ {7, {{0, 1, UP}}, {}},
+ {8, {{0, 2, UP}}, {}},
+
+ {13, {}, {{0, 1, UP}, {0, 2, UP}}},
+ });
+ runEvents();
+}
+
+TEST_F(DebounceTest, TwoKeysSimultaneous1) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}, {0, 2, DOWN}}, {}},
+
+ {5, {}, {{0, 1, DOWN}, {0, 2, DOWN}}},
+ {6, {{0, 1, UP}, {0, 2, UP}}, {}},
+
+ {11, {}, {{0, 1, UP}, {0, 2, UP}}},
+ });
+ runEvents();
+}
+
+TEST_F(DebounceTest, TwoKeysSimultaneous2) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}}, {}},
+ {1, {{0, 2, DOWN}}, {}},
+
+ {6, {}, {{0, 1, DOWN}, {0, 2, DOWN}}},
+ {7, {{0, 2, UP}}, {}},
+ {9, {{0, 1, UP}}, {}},
+
+ // Debouncing loses the specific ordering -- both events report simultaneously.
+ {14, {}, {{0, 1, UP}, {0, 2, UP}}},
+ });
+ runEvents();
+}
+
+TEST_F(DebounceTest, OneKeyDelayedScan1) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}}, {}},
+
+ /* Processing is very late */
+ {300, {}, {{0, 1, DOWN}}},
+ /* Immediately release key */
+ {300, {{0, 1, UP}}, {}},
+
+ {305, {}, {{0, 1, UP}}},
+ });
+ time_jumps_ = true;
+ runEvents();
+}
+
+TEST_F(DebounceTest, OneKeyDelayedScan2) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}}, {}},
+
+ /* Processing is very late */
+ {300, {}, {{0, 1, DOWN}}},
+ /* Release key after 1ms */
+ {301, {{0, 1, UP}}, {}},
+
+ {306, {}, {{0, 1, UP}}},
+ });
+ time_jumps_ = true;
+ runEvents();
+}
+
+TEST_F(DebounceTest, OneKeyDelayedScan3) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}}, {}},
+
+ /* Release key before debounce expires */
+ {300, {{0, 1, UP}}, {}},
+ });
+ time_jumps_ = true;
+ runEvents();
+}
+
+TEST_F(DebounceTest, OneKeyDelayedScan4) {
+ addEvents({
+ /* Time, Inputs, Outputs */
+ {0, {{0, 1, DOWN}}, {}},
+
+ /* Processing is a bit late */
+ {50, {}, {{0, 1, DOWN}}},
+ /* Release key after 1ms */
+ {51, {{0, 1, UP}}, {}},
+
+ {56, {}, {{0, 1, UP}}},
+ });
+ time_jumps_ = true;
+ runEvents();
+}
diff --git a/quantum/debounce/tests/testlist.mk b/quantum/debounce/tests/testlist.mk
index c54c45aa63..f7bd520698 100644
--- a/quantum/debounce/tests/testlist.mk
+++ b/quantum/debounce/tests/testlist.mk
@@ -1,6 +1,7 @@
TEST_LIST += \
debounce_sym_defer_g \
debounce_sym_defer_pk \
+ debounce_sym_defer_pr \
debounce_sym_eager_pk \
debounce_sym_eager_pr \
debounce_asym_eager_defer_pk
diff --git a/quantum/deferred_exec.c b/quantum/deferred_exec.c
index 5b0a5b1425..a64b451df2 100644
--- a/quantum/deferred_exec.c
+++ b/quantum/deferred_exec.c
@@ -9,32 +9,27 @@
# define MAX_DEFERRED_EXECUTORS 8
#endif
-typedef struct deferred_executor_t {
- deferred_token token;
- uint32_t trigger_time;
- deferred_exec_callback callback;
- void * cb_arg;
-} deferred_executor_t;
-
-static deferred_token current_token = 0;
-static uint32_t last_deferred_exec_check = 0;
-static deferred_executor_t executors[MAX_DEFERRED_EXECUTORS] = {0};
-
-static inline bool token_can_be_used(deferred_token token) {
+//------------------------------------
+// Helpers
+//
+
+static deferred_token current_token = 0;
+
+static inline bool token_can_be_used(deferred_executor_t *table, size_t table_count, deferred_token token) {
if (token == INVALID_DEFERRED_TOKEN) {
return false;
}
- for (int i = 0; i < MAX_DEFERRED_EXECUTORS; ++i) {
- if (executors[i].token == token) {
+ for (int i = 0; i < table_count; ++i) {
+ if (table[i].token == token) {
return false;
}
}
return true;
}
-static inline deferred_token allocate_token(void) {
+static inline deferred_token allocate_token(deferred_executor_t *table, size_t table_count) {
deferred_token first = ++current_token;
- while (!token_can_be_used(current_token)) {
+ while (!token_can_be_used(table, table_count, current_token)) {
++current_token;
if (current_token == first) {
// If we've looped back around to the first, everything is already allocated (yikes!). Need to exit with a failure.
@@ -44,18 +39,22 @@ static inline deferred_token allocate_token(void) {
return current_token;
}
-deferred_token defer_exec(uint32_t delay_ms, deferred_exec_callback callback, void *cb_arg) {
- // Ignore queueing if it's a zero-time delay, or invalid callback
- if (delay_ms == 0 || !callback) {
+//------------------------------------
+// Advanced API: used when a custom-allocated table is used, primarily for core code.
+//
+
+deferred_token defer_exec_advanced(deferred_executor_t *table, size_t table_count, uint32_t delay_ms, deferred_exec_callback callback, void *cb_arg) {
+ // Ignore queueing if the table isn't valid, it's a zero-time delay, or the token is not valid
+ if (!table || table_count == 0 || delay_ms == 0 || !callback) {
return INVALID_DEFERRED_TOKEN;
}
// Find an unused slot and claim it
- for (int i = 0; i < MAX_DEFERRED_EXECUTORS; ++i) {
- deferred_executor_t *entry = &executors[i];
+ for (int i = 0; i < table_count; ++i) {
+ deferred_executor_t *entry = &table[i];
if (entry->token == INVALID_DEFERRED_TOKEN) {
// Work out the new token value, dropping out if none were available
- deferred_token token = allocate_token();
+ deferred_token token = allocate_token(table, table_count);
if (token == INVALID_DEFERRED_TOKEN) {
return false;
}
@@ -73,15 +72,15 @@ deferred_token defer_exec(uint32_t delay_ms, deferred_exec_callback callback, vo
return INVALID_DEFERRED_TOKEN;
}
-bool extend_deferred_exec(deferred_token token, uint32_t delay_ms) {
- // Ignore queueing if it's a zero-time delay, or the token is not valid
- if (delay_ms == 0 || token == INVALID_DEFERRED_TOKEN) {
+bool extend_deferred_exec_advanced(deferred_executor_t *table, size_t table_count, deferred_token token, uint32_t delay_ms) {
+ // Ignore queueing if the table isn't valid, it's a zero-time delay, or the token is not valid
+ if (!table || table_count == 0 || delay_ms == 0 || token == INVALID_DEFERRED_TOKEN) {
return false;
}
// Find the entry corresponding to the token
- for (int i = 0; i < MAX_DEFERRED_EXECUTORS; ++i) {
- deferred_executor_t *entry = &executors[i];
+ for (int i = 0; i < table_count; ++i) {
+ deferred_executor_t *entry = &table[i];
if (entry->token == token) {
// Found it, extend the delay
entry->trigger_time = timer_read32() + delay_ms;
@@ -93,15 +92,15 @@ bool extend_deferred_exec(deferred_token token, uint32_t delay_ms) {
return false;
}
-bool cancel_deferred_exec(deferred_token token) {
- // Ignore request if the token is not valid
- if (token == INVALID_DEFERRED_TOKEN) {
+bool cancel_deferred_exec_advanced(deferred_executor_t *table, size_t table_count, deferred_token token) {
+ // Ignore request if the table/token are not valid
+ if (!table || table_count == 0 || token == INVALID_DEFERRED_TOKEN) {
return false;
}
// Find the entry corresponding to the token
- for (int i = 0; i < MAX_DEFERRED_EXECUTORS; ++i) {
- deferred_executor_t *entry = &executors[i];
+ for (int i = 0; i < table_count; ++i) {
+ deferred_executor_t *entry = &table[i];
if (entry->token == token) {
// Found it, cancel and clear the table entry
entry->token = INVALID_DEFERRED_TOKEN;
@@ -116,16 +115,16 @@ bool cancel_deferred_exec(deferred_token token) {
return false;
}
-void deferred_exec_task(void) {
+void deferred_exec_advanced_task(deferred_executor_t *table, size_t table_count, uint32_t *last_execution_time) {
uint32_t now = timer_read32();
// Throttle only once per millisecond
- if (((int32_t)TIMER_DIFF_32(now, last_deferred_exec_check)) > 0) {
- last_deferred_exec_check = now;
+ if (((int32_t)TIMER_DIFF_32(now, (*last_execution_time))) > 0) {
+ *last_execution_time = now;
// Run through each of the executors
- for (int i = 0; i < MAX_DEFERRED_EXECUTORS; ++i) {
- deferred_executor_t *entry = &executors[i];
+ for (int i = 0; i < table_count; ++i) {
+ deferred_executor_t *entry = &table[i];
// Check if we're supposed to execute this entry
if (entry->token != INVALID_DEFERRED_TOKEN && ((int32_t)TIMER_DIFF_32(entry->trigger_time, now)) <= 0) {
@@ -150,3 +149,15 @@ void deferred_exec_task(void) {
}
}
}
+
+//------------------------------------
+// Basic API: used by user-mode code, guaranteed to not collide with core deferred execution
+//
+
+static uint32_t last_deferred_exec_check = 0;
+static deferred_executor_t basic_executors[MAX_DEFERRED_EXECUTORS] = {0};
+
+deferred_token defer_exec(uint32_t delay_ms, deferred_exec_callback callback, void *cb_arg) { return defer_exec_advanced(basic_executors, MAX_DEFERRED_EXECUTORS, delay_ms, callback, cb_arg); }
+bool extend_deferred_exec(deferred_token token, uint32_t delay_ms) { return extend_deferred_exec_advanced(basic_executors, MAX_DEFERRED_EXECUTORS, token, delay_ms); }
+bool cancel_deferred_exec(deferred_token token) { return cancel_deferred_exec_advanced(basic_executors, MAX_DEFERRED_EXECUTORS, token); }
+void deferred_exec_task(void) { deferred_exec_advanced_task(basic_executors, MAX_DEFERRED_EXECUTORS, &last_deferred_exec_check); }
diff --git a/quantum/deferred_exec.h b/quantum/deferred_exec.h
index f80d353169..97ef0f6c0e 100644
--- a/quantum/deferred_exec.h
+++ b/quantum/deferred_exec.h
@@ -5,34 +5,117 @@
#include <stdbool.h>
#include <stdint.h>
+#include <stdlib.h>
-// A token that can be used to cancel an existing deferred execution.
+//------------------------------------
+// Common
+//------------------------------------
+
+/**
+ * @typedef A token that can be used to cancel or extend an existing deferred execution.
+ */
typedef uint8_t deferred_token;
+
+/**
+ * @def The constant used to denote an invalid deferred execution token.
+ */
#define INVALID_DEFERRED_TOKEN 0
-// Callback to execute.
-// -- Parameter trigger_time: the intended trigger time to execute the callback -- equivalent time-space as timer_read32()
-// cb_arg: the callback argument specified when enqueueing the deferred executor
-// -- Return value: Non-zero re-queues the callback to execute after the returned number of milliseconds. Zero cancels repeated execution.
+/**
+ * @typedef Callback to execute.
+ * @param trigger_time[in] the intended trigger time to execute the callback -- equivalent time-space as timer_read32()
+ * @param cb_arg[in] the callback argument specified when enqueueing the deferred executor
+ * @return non-zero re-queues the callback to execute after the returned number of milliseconds. Zero cancels repeated execution.
+ */
typedef uint32_t (*deferred_exec_callback)(uint32_t trigger_time, void *cb_arg);
-// Configures the supplied deferred executor to be executed after the required number of milliseconds.
-// -- Parameter delay_ms: the number of milliseconds before executing the callback
-// -- callback: the executor to invoke
-// -- cb_arg: the argument to pass to the executor, may be NULL if unused by the executor
-// -- Return value: a token usable for cancellation, or INVALID_DEFERRED_TOKEN if an error occurred
+//------------------------------------
+// Basic API: used by user-mode code, guaranteed to not collide with core deferred execution
+//------------------------------------
+
+/**
+ * Configures the supplied deferred executor to be executed after the required number of milliseconds.
+ *
+ * @param delay_ms[in] the number of milliseconds before executing the callback
+ * @param callback[in] the executor to invoke
+ * @param cb_arg[in] the argument to pass to the executor, may be NULL if unused by the executor
+ * @return a token usable for extension/cancellation, or INVALID_DEFERRED_TOKEN if an error occurred
+ */
deferred_token defer_exec(uint32_t delay_ms, deferred_exec_callback callback, void *cb_arg);
-// Allows for extending the timeframe before an existing deferred execution is invoked.
-// -- Parameter token: the returned value from defer_exec for the deferred execution you wish to extend.
-// -- delay_ms: the new delay (with respect to the current time)
-// -- Return value: if the token was found, and the delay was extended
+/**
+ * Allows for extending the timeframe before an existing deferred execution is invoked.
+ *
+ * @param token[in] the returned value from defer_exec for the deferred execution you wish to extend
+ * @param delay_ms[in] the number of milliseconds before executing the callback
+ * @return true if the token was extended successfully, otherwise false
+ */
bool extend_deferred_exec(deferred_token token, uint32_t delay_ms);
-// Allows for cancellation of an existing deferred execution.
-// -- Parameter token: the returned value from defer_exec for the deferred execution you wish to cancel.
-// -- Return value: if the token was found, and the executor was cancelled
+/**
+ * Allows for cancellation of an existing deferred execution.
+ *
+ * @param token[in] the returned value from defer_exec for the deferred execution you wish to cancel
+ * @return true if the token was cancelled successfully, otherwise false
+ */
bool cancel_deferred_exec(deferred_token token);
-// Forward declaration for the main loop in order to execute any deferred executors. Should not be invoked by keyboard/user code.
+/**
+ * Forward declaration for the main loop in order to execute any deferred executors. Should not be invoked by keyboard/user code.
+ */
void deferred_exec_task(void);
+
+//------------------------------------
+// Advanced API: used when a custom-allocated table is used, primarily for core code.
+//------------------------------------
+
+/**
+ * @struct Structure for containing self-hosted deferred executor tables.
+ * @brief Core-side code can use this to create their own tables without impacting on the use of users' ability to add deferred execution.
+ * Code outside deferred_exec.c should not worry about internals of this struct, and should just allocate the required number in an array.
+ */
+typedef struct deferred_executor_t {
+ deferred_token token;
+ uint32_t trigger_time;
+ deferred_exec_callback callback;
+ void * cb_arg;
+} deferred_executor_t;
+
+/**
+ * Configures the supplied deferred executor to be executed after the required number of milliseconds.
+ *
+ * @param table[in] the custom table used for storage
+ * @param table_count[in] the number of available items in the table
+ * @param delay_ms[in] the number of milliseconds before executing the callback
+ * @param callback[in] the executor to invoke
+ * @param cb_arg[in] the argument to pass to the executor, may be NULL if unused by the executor
+ * @return a token usable for extension/cancellation, or INVALID_DEFERRED_TOKEN if an error occurred
+ */
+deferred_token defer_exec_advanced(deferred_executor_t *table, size_t table_count, uint32_t delay_ms, deferred_exec_callback callback, void *cb_arg);
+
+/**
+ * Allows for extending the timeframe before an existing deferred execution is invoked.
+ *
+ * @param token[in] the returned value from defer_exec for the deferred execution you wish to extend
+ * @param delay_ms[in] the number of milliseconds before executing the callback
+ * @return true if the token was extended successfully, otherwise false
+ */
+bool extend_deferred_exec_advanced(deferred_executor_t *table, size_t table_count, deferred_token token, uint32_t delay_ms);
+
+/**
+ * Allows for cancellation of an existing deferred execution.
+ *
+ * @param token[in] the returned value from defer_exec for the deferred execution you wish to cancel
+ * @return true if the token was cancelled successfully, otherwise false
+ */
+bool cancel_deferred_exec_advanced(deferred_executor_t *table, size_t table_count, deferred_token token);
+
+/**
+ * Forward declaration for the main loop in order to execute any custom table deferred executors. Should not be invoked by keyboard/user code.
+ * Needed for any custom-allocated deferred execution tables. Any core tasks should add appropriate invocation to quantum/main.c.
+ *
+ * @param table[in] the custom table used for storage
+ * @param table_count[in] the number of available items in the table
+ * @param last_execution_time[in,out] the last execution time -- this will be checked first to determine if execution is needed, and updated if execution occurred
+ */
+void deferred_exec_advanced_task(deferred_executor_t *table, size_t table_count, uint32_t *last_execution_time);
diff --git a/quantum/keyboard.c b/quantum/keyboard.c
index 3bca05aab7..67f7381f74 100644
--- a/quantum/keyboard.c
+++ b/quantum/keyboard.c
@@ -349,6 +349,32 @@ void keyboard_init(void) {
keyboard_post_init_kb(); /* Always keep this last */
}
+/** \brief keyboard set leds
+ *
+ * FIXME: needs doc
+ */
+void keyboard_set_leds(uint8_t leds) {
+ if (debug_keyboard) {
+ debug("keyboard_set_led: ");
+ debug_hex8(leds);
+ debug("\n");
+ }
+ led_set(leds);
+}
+
+/** \brief set host led state
+ *
+ * Only sets state if change detected
+ */
+void led_task(void) {
+ static uint8_t led_status = 0;
+ // update LED
+ if (led_status != host_keyboard_leds()) {
+ led_status = host_keyboard_leds();
+ keyboard_set_leds(led_status);
+ }
+}
+
/** \brief key_event_task
*
* This function is responsible for calling into other systems when they need to respond to electrical switch press events.
@@ -363,28 +389,17 @@ void switch_events(uint8_t row, uint8_t col, bool pressed) {
#endif
}
-/** \brief Keyboard task: Do keyboard routine jobs
- *
- * Do routine keyboard jobs:
+/** \brief Perform scan of keyboard matrix
*
- * * scan matrix
- * * handle mouse movements
- * * handle midi commands
- * * light LEDs
- *
- * This is repeatedly called as fast as possible.
+ * Any detected changes in state are sent out as part of the processing
*/
-void keyboard_task(void) {
+bool matrix_scan_task(void) {
static matrix_row_t matrix_prev[MATRIX_ROWS];
- static uint8_t led_status = 0;
matrix_row_t matrix_row = 0;
matrix_row_t matrix_change = 0;
#ifdef QMK_KEYS_PER_SCAN
uint8_t keys_processed = 0;
#endif
-#ifdef ENCODER_ENABLE
- bool encoders_changed = false;
-#endif
uint8_t matrix_changed = matrix_scan();
if (matrix_changed) last_matrix_activity_trigger();
@@ -431,9 +446,24 @@ void keyboard_task(void) {
MATRIX_LOOP_END:
-#ifdef DEBUG_MATRIX_SCAN_RATE
matrix_scan_perf_task();
-#endif
+ return matrix_changed;
+}
+
+/** \brief Keyboard task: Do keyboard routine jobs
+ *
+ * Do routine keyboard jobs:
+ *
+ * * scan matrix
+ * * handle mouse movements
+ * * handle midi commands
+ * * light LEDs
+ *
+ * This is repeatedly called as fast as possible.
+ */
+void keyboard_task(void) {
+ bool matrix_changed = matrix_scan_task();
+ (void)matrix_changed;
#if defined(RGBLIGHT_ENABLE)
rgblight_task();
@@ -453,7 +483,7 @@ MATRIX_LOOP_END:
#endif
#ifdef ENCODER_ENABLE
- encoders_changed = encoder_read();
+ bool encoders_changed = encoder_read();
if (encoders_changed) last_encoder_activity_trigger();
#endif
@@ -516,22 +546,5 @@ MATRIX_LOOP_END:
programmable_button_send();
#endif
- // update LED
- if (led_status != host_keyboard_leds()) {
- led_status = host_keyboard_leds();
- keyboard_set_leds(led_status);
- }
-}
-
-/** \brief keyboard set leds
- *
- * FIXME: needs doc
- */
-void keyboard_set_leds(uint8_t leds) {
- if (debug_keyboard) {
- debug("keyboard_set_led: ");
- debug_hex8(leds);
- debug("\n");
- }
- led_set(leds);
+ led_task();
}
diff --git a/quantum/led_matrix/led_matrix.h b/quantum/led_matrix/led_matrix.h
index e42be64661..cb7526d6e0 100644
--- a/quantum/led_matrix/led_matrix.h
+++ b/quantum/led_matrix/led_matrix.h
@@ -2,6 +2,7 @@
* Copyright 2017 Jack Humbert
* Copyright 2018 Yiancar
* Copyright 2019 Clueboard
+ * Copyright 2021 Leo Deng
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -27,6 +28,9 @@
#ifdef IS31FL3731
# include "is31fl3731-simple.h"
#endif
+#ifdef IS31FL3733
+# include "is31fl3733-simple.h"
+#endif
#ifndef LED_MATRIX_LED_FLUSH_LIMIT
# define LED_MATRIX_LED_FLUSH_LIMIT 16
diff --git a/quantum/matrix.c b/quantum/matrix.c
index 483d518ecc..a58cc752fb 100644
--- a/quantum/matrix.c
+++ b/quantum/matrix.c
@@ -63,17 +63,13 @@ extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values
#ifdef SPLIT_KEYBOARD
// row offsets for each hand
-uint8_t thisHand, thatHand;
+extern uint8_t thisHand, thatHand;
#endif
// user-defined overridable functions
__attribute__((weak)) void matrix_init_pins(void);
__attribute__((weak)) void matrix_read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row);
__attribute__((weak)) void matrix_read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col, matrix_row_t row_shifter);
-#ifdef SPLIT_KEYBOARD
-__attribute__((weak)) void matrix_slave_scan_kb(void) { matrix_slave_scan_user(); }
-__attribute__((weak)) void matrix_slave_scan_user(void) {}
-#endif
static inline void setPinOutput_writeLow(pin_t pin) {
ATOMIC_BLOCK_FORCEON {
@@ -308,35 +304,6 @@ __attribute__((weak)) bool transport_master_if_connected(matrix_row_t master_mat
transport_master(master_matrix, slave_matrix);
return true; // Treat the transport as always connected
}
-
-bool matrix_post_scan(void) {
- bool changed = false;
- if (is_keyboard_master()) {
- static bool last_connected = false;
- matrix_row_t slave_matrix[ROWS_PER_HAND] = {0};
- if (transport_master_if_connected(matrix + thisHand, slave_matrix)) {
- changed = memcmp(matrix + thatHand, slave_matrix, sizeof(slave_matrix)) != 0;
-
- last_connected = true;
- } else if (last_connected) {
- // reset other half when disconnected
- memset(slave_matrix, 0, sizeof(slave_matrix));
- changed = true;
-
- last_connected = false;
- }
-
- if (changed) memcpy(matrix + thatHand, slave_matrix, sizeof(slave_matrix));
-
- matrix_scan_quantum();
- } else {
- transport_slave(matrix + thatHand, matrix + thisHand);
-
- matrix_slave_scan_kb();
- }
-
- return changed;
-}
#endif
uint8_t matrix_scan(void) {
diff --git a/quantum/matrix.h b/quantum/matrix.h
index 5c696622fc..d968efeb0f 100644
--- a/quantum/matrix.h
+++ b/quantum/matrix.h
@@ -46,8 +46,6 @@ void matrix_setup(void);
void matrix_init(void);
/* scan all key states on matrix */
uint8_t matrix_scan(void);
-/* whether modified from previous scan. used after matrix_scan. */
-bool matrix_is_modified(void) __attribute__((deprecated));
/* whether a switch is on */
bool matrix_is_on(uint8_t row, uint8_t col);
/* matrix state on row */
@@ -75,6 +73,7 @@ void matrix_init_user(void);
void matrix_scan_user(void);
#ifdef SPLIT_KEYBOARD
+bool matrix_post_scan(void);
void matrix_slave_scan_kb(void);
void matrix_slave_scan_user(void);
#endif
diff --git a/quantum/matrix_common.c b/quantum/matrix_common.c
index 66c89970b1..98b83ddcf6 100644
--- a/quantum/matrix_common.c
+++ b/quantum/matrix_common.c
@@ -4,6 +4,15 @@
#include "wait.h"
#include "print.h"
#include "debug.h"
+#ifdef SPLIT_KEYBOARD
+# include "split_common/split_util.h"
+# include "split_common/transactions.h"
+# include <string.h>
+
+# define ROWS_PER_HAND (MATRIX_ROWS / 2)
+#else
+# define ROWS_PER_HAND (MATRIX_ROWS)
+#endif
#ifndef MATRIX_IO_DELAY
# define MATRIX_IO_DELAY 30
@@ -13,6 +22,11 @@
matrix_row_t raw_matrix[MATRIX_ROWS];
matrix_row_t matrix[MATRIX_ROWS];
+#ifdef SPLIT_KEYBOARD
+// row offsets for each hand
+uint8_t thisHand, thatHand;
+#endif
+
#ifdef MATRIX_MASKED
extern const matrix_row_t matrix_mask[];
#endif
@@ -45,12 +59,6 @@ inline matrix_row_t matrix_get_row(uint8_t row) {
#endif
}
-// Deprecated.
-bool matrix_is_modified(void) {
- if (debounce_active()) return false;
- return true;
-}
-
#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))
@@ -84,18 +92,59 @@ uint8_t matrix_key_count(void) {
return count;
}
+#ifdef SPLIT_KEYBOARD
+bool matrix_post_scan(void) {
+ bool changed = false;
+ if (is_keyboard_master()) {
+ static bool last_connected = false;
+ matrix_row_t slave_matrix[ROWS_PER_HAND] = {0};
+ if (transport_master_if_connected(matrix + thisHand, slave_matrix)) {
+ changed = memcmp(matrix + thatHand, slave_matrix, sizeof(slave_matrix)) != 0;
+
+ last_connected = true;
+ } else if (last_connected) {
+ // reset other half when disconnected
+ memset(slave_matrix, 0, sizeof(slave_matrix));
+ changed = true;
+
+ last_connected = false;
+ }
+
+ if (changed) memcpy(matrix + thatHand, slave_matrix, sizeof(slave_matrix));
+
+ matrix_scan_quantum();
+ } else {
+ transport_slave(matrix + thatHand, matrix + thisHand);
+
+ matrix_slave_scan_kb();
+ }
+
+ return changed;
+}
+#endif
+
/* `matrix_io_delay ()` exists for backwards compatibility. From now on, use matrix_output_unselect_delay(). */
__attribute__((weak)) void matrix_io_delay(void) { wait_us(MATRIX_IO_DELAY); }
-
__attribute__((weak)) void matrix_output_select_delay(void) { waitInputPinDelay(); }
__attribute__((weak)) void matrix_output_unselect_delay(uint8_t line, bool key_pressed) { matrix_io_delay(); }
// CUSTOM MATRIX 'LITE'
__attribute__((weak)) void matrix_init_custom(void) {}
-
__attribute__((weak)) bool matrix_scan_custom(matrix_row_t current_matrix[]) { return true; }
+#ifdef SPLIT_KEYBOARD
+__attribute__((weak)) void matrix_slave_scan_kb(void) { matrix_slave_scan_user(); }
+__attribute__((weak)) void matrix_slave_scan_user(void) {}
+#endif
+
__attribute__((weak)) void matrix_init(void) {
+#ifdef SPLIT_KEYBOARD
+ split_pre_init();
+
+ thisHand = isLeftHand ? 0 : (ROWS_PER_HAND);
+ thatHand = ROWS_PER_HAND - thisHand;
+#endif
+
matrix_init_custom();
// initialize matrix state: all keys off
@@ -104,17 +153,26 @@ __attribute__((weak)) void matrix_init(void) {
matrix[i] = 0;
}
- debounce_init(MATRIX_ROWS);
+ debounce_init(ROWS_PER_HAND);
matrix_init_quantum();
+
+#ifdef SPLIT_KEYBOARD
+ split_post_init();
+#endif
}
__attribute__((weak)) uint8_t matrix_scan(void) {
bool changed = matrix_scan_custom(raw_matrix);
- debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
-
+#ifdef SPLIT_KEYBOARD
+ debounce(raw_matrix, matrix + thisHand, ROWS_PER_HAND, changed);
+ changed = (changed || matrix_post_scan());
+#else
+ debounce(raw_matrix, matrix, ROWS_PER_HAND, changed);
matrix_scan_quantum();
+#endif
+
return changed;
}
diff --git a/quantum/pointing_device.c b/quantum/pointing_device.c
index 2fefdb67b6..23d93fa15f 100644
--- a/quantum/pointing_device.c
+++ b/quantum/pointing_device.c
@@ -18,24 +18,105 @@
#include "pointing_device.h"
#include <string.h>
+#include "timer.h"
#ifdef MOUSEKEY_ENABLE
# include "mousekey.h"
#endif
#if (defined(POINTING_DEVICE_ROTATION_90) + defined(POINTING_DEVICE_ROTATION_180) + defined(POINTING_DEVICE_ROTATION_270)) > 1
# error More than one rotation selected. This is not supported.
#endif
+#if defined(SPLIT_POINTING_ENABLE)
+# include "transactions.h"
+# include "keyboard.h"
-static report_mouse_t mouseReport = {};
+report_mouse_t shared_mouse_report = {};
+uint16_t shared_cpi = 0;
+
+/**
+ * @brief Sets the shared mouse report used be pointing device task
+ *
+ * NOTE : Only available when using SPLIT_POINTING_ENABLE
+ *
+ * @param[in] new_mouse_report report_mouse_t
+ */
+void pointing_device_set_shared_report(report_mouse_t new_mouse_report) { shared_mouse_report = new_mouse_report; }
+
+/**
+ * @brief Gets current pointing device CPI if supported
+ *
+ * Gets current cpi of the shared report and returns it as uint16_t
+ *
+ * NOTE : Only available when using SPLIT_POINTING_ENABLE
+ *
+ * @return cpi value as uint16_t
+ */
+uint16_t pointing_device_get_shared_cpi(void) { return shared_cpi; }
+
+# if defined(POINTING_DEVICE_LEFT)
+# define POINTING_DEVICE_THIS_SIDE is_keyboard_left()
+# elif defined(POINTING_DEVICE_RIGHT)
+# define POINTING_DEVICE_THIS_SIDE !is_keyboard_left()
+# elif defined(POINTING_DEVICE_COMBINED)
+# define POINTING_DEVICE_THIS_SIDE true
+# endif
+
+#endif // defined(SPLIT_POINTING_ENABLE)
+
+static report_mouse_t local_mouse_report = {};
extern const pointing_device_driver_t pointing_device_driver;
+/**
+ * @brief Compares 2 mouse reports for difference and returns result
+ *
+ * @param[in] new report_mouse_t
+ * @param[in] old report_mouse_t
+ * @return bool result
+ */
__attribute__((weak)) bool has_mouse_report_changed(report_mouse_t new, report_mouse_t old) { return memcmp(&new, &old, sizeof(new)); }
-__attribute__((weak)) void pointing_device_init_kb(void) {}
-__attribute__((weak)) void pointing_device_init_user(void) {}
+/**
+ * @brief Keyboard level code pointing device initialisation
+ *
+ */
+__attribute__((weak)) void pointing_device_init_kb(void) {}
+
+/**
+ * @brief User level code pointing device initialisation
+ *
+ */
+__attribute__((weak)) void pointing_device_init_user(void) {}
+
+/**
+ * @brief Weak function allowing for keyboard level mouse report modification
+ *
+ * Takes report_mouse_t struct allowing modification at keyboard level then returns report_mouse_t.
+ *
+ * @param[in] mouse_report report_mouse_t
+ * @return report_mouse_t
+ */
__attribute__((weak)) report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report) { return pointing_device_task_user(mouse_report); }
+
+/**
+ * @brief Weak function allowing for user level mouse report modification
+ *
+ * Takes report_mouse_t struct allowing modification at user level then returns report_mouse_t.
+ *
+ * @param[in] mouse_report report_mouse_t
+ * @return report_mouse_t
+ */
__attribute__((weak)) report_mouse_t pointing_device_task_user(report_mouse_t mouse_report) { return mouse_report; }
+/**
+ * @brief Handles pointing device buttons
+ *
+ * Returns modified button bitmask using bool pressed and selected pointing_device_buttons_t button in uint8_t buttons bitmask.
+ *
+ * @param buttons[in] uint8_t bitmask
+ * @param pressed[in] bool
+ * @param button[in] pointing_device_buttons_t value
+ * @return Modified uint8_t bitmask buttons
+ */
__attribute__((weak)) uint8_t pointing_device_handle_buttons(uint8_t buttons, bool pressed, pointing_device_buttons_t button) {
if (pressed) {
buttons |= 1 << (button);
@@ -45,7 +126,17 @@ __attribute__((weak)) uint8_t pointing_device_handle_buttons(uint8_t buttons, bo
return buttons;
}
+/**
+ * @brief Initialises pointing device
+ *
+ * Initialises pointing device, perform driver init and optional keyboard/user level code.
+ */
__attribute__((weak)) void pointing_device_init(void) {
+#if defined(SPLIT_POINTING_ENABLE)
+ if (!(POINTING_DEVICE_THIS_SIDE)) {
+ return;
+ }
+#endif
pointing_device_driver.init();
#ifdef POINTING_DEVICE_MOTION_PIN
setPinInputHigh(POINTING_DEVICE_MOTION_PIN);
@@ -54,67 +145,299 @@ __attribute__((weak)) void pointing_device_init(void) {
pointing_device_init_user();
}
+/**
+ * @brief Sends processed mouse report to host
+ *
+ * This sends the mouse report generated by pointing_device_task if changed since the last report. Once send zeros mouse report except buttons.
+ *
+ */
__attribute__((weak)) void pointing_device_send(void) {
static report_mouse_t old_report = {};
// If you need to do other things, like debugging, this is the place to do it.
- if (has_mouse_report_changed(mouseReport, old_report)) {
- host_mouse_send(&mouseReport);
+ if (has_mouse_report_changed(local_mouse_report, old_report)) {
+ host_mouse_send(&local_mouse_report);
}
// send it and 0 it out except for buttons, so those stay until they are explicity over-ridden using update_pointing_device
- mouseReport.x = 0;
- mouseReport.y = 0;
- mouseReport.v = 0;
- mouseReport.h = 0;
+ local_mouse_report.x = 0;
+ local_mouse_report.y = 0;
+ local_mouse_report.v = 0;
+ local_mouse_report.h = 0;
- memcpy(&old_report, &mouseReport, sizeof(mouseReport));
+ memcpy(&old_report, &local_mouse_report, sizeof(local_mouse_report));
}
-__attribute__((weak)) void pointing_device_task(void) {
- // Gather report info
-#ifdef POINTING_DEVICE_MOTION_PIN
- if (!readPin(POINTING_DEVICE_MOTION_PIN))
-#endif
- mouseReport = pointing_device_driver.get_report(mouseReport);
-
- // Support rotation of the sensor data
+/**
+ * @brief Adjust mouse report by any optional common pointing configuration defines
+ *
+ * This applies rotation or inversion to the mouse report as selected by the pointing device common configuration defines.
+ *
+ * @param mouse_report[in] takes a report_mouse_t to be adjusted
+ * @return report_mouse_t with adjusted values
+ */
+report_mouse_t pointing_device_adjust_by_defines(report_mouse_t mouse_report) {
+ // Support rotation of the sensor data
#if defined(POINTING_DEVICE_ROTATION_90) || defined(POINTING_DEVICE_ROTATION_180) || defined(POINTING_DEVICE_ROTATION_270)
- int8_t x = mouseReport.x, y = mouseReport.y;
+ int8_t x = mouse_report.x, y = mouse_report.y;
# if defined(POINTING_DEVICE_ROTATION_90)
- mouseReport.x = y;
- mouseReport.y = -x;
+ mouse_report.x = y;
+ mouse_report.y = -x;
# elif defined(POINTING_DEVICE_ROTATION_180)
- mouseReport.x = -x;
- mouseReport.y = -y;
+ mouse_report.x = -x;
+ mouse_report.y = -y;
# elif defined(POINTING_DEVICE_ROTATION_270)
- mouseReport.x = -y;
- mouseReport.y = x;
+ mouse_report.x = -y;
+ mouse_report.y = x;
# else
# error "How the heck did you get here?!"
# endif
#endif
// Support Inverting the X and Y Axises
#if defined(POINTING_DEVICE_INVERT_X)
- mouseReport.x = -mouseReport.x;
+ mouse_report.x = -mouse_report.x;
#endif
#if defined(POINTING_DEVICE_INVERT_Y)
- mouseReport.y = -mouseReport.y;
+ mouse_report.y = -mouse_report.y;
+#endif
+ return mouse_report;
+}
+
+/**
+ * @brief Retrieves and processes pointing device data.
+ *
+ * This function is part of the keyboard loop and retrieves the mouse report from the pointing device driver.
+ * It applies any optional configuration e.g. rotation or axis inversion and then initiates a send.
+ *
+ */
+__attribute__((weak)) void pointing_device_task(void) {
+#if defined(SPLIT_POINTING_ENABLE)
+ // Don't poll the target side pointing device.
+ if (!is_keyboard_master()) {
+ return;
+ };
+#endif
+
+#if defined(POINTING_DEVICE_TASK_THROTTLE_MS)
+ static uint32_t last_exec = 0;
+ if (timer_elapsed32(last_exec) < POINTING_DEVICE_TASK_THROTTLE_MS) {
+ return;
+ }
+ last_exec = timer_read32();
+#else
+# if defined(SPLIT_POINTING_ENABLE)
+# pragma message("It's recommended you enable a throttle when sharing pointing devices.")
+# endif
+#endif
+
+ // Gather report info
+#ifdef POINTING_DEVICE_MOTION_PIN
+# if defined(SPLIT_POINTING_ENABLE)
+# error POINTING_DEVICE_MOTION_PIN not supported when sharing the pointing device report between sides.
+# endif
+ if (!readPin(POINTING_DEVICE_MOTION_PIN))
#endif
+#if defined(SPLIT_POINTING_ENABLE)
+# if defined(POINTING_DEVICE_COMBINED)
+ static uint8_t old_buttons = 0;
+ local_mouse_report.buttons = old_buttons;
+ local_mouse_report = pointing_device_driver.get_report(local_mouse_report);
+ old_buttons = local_mouse_report.buttons;
+# elif defined(POINTING_DEVICE_LEFT) || defined(POINTING_DEVICE_RIGHT)
+ local_mouse_report = POINTING_DEVICE_THIS_SIDE ? pointing_device_driver.get_report(local_mouse_report) : shared_mouse_report;
+# else
+# error "You need to define the side(s) the pointing device is on. POINTING_DEVICE_COMBINED / POINTING_DEVICE_LEFT / POINTING_DEVICE_RIGHT"
+# endif
+#else
+ local_mouse_report = pointing_device_driver.get_report(local_mouse_report);
+#endif // defined(SPLIT_POINTING_ENABLE)
+
// allow kb to intercept and modify report
- mouseReport = pointing_device_task_kb(mouseReport);
+#if defined(SPLIT_POINTING_ENABLE) && defined(POINTING_DEVICE_COMBINED)
+ if (is_keyboard_left()) {
+ local_mouse_report = pointing_device_adjust_by_defines(local_mouse_report);
+ shared_mouse_report = pointing_device_adjust_by_defines_right(shared_mouse_report);
+ } else {
+ local_mouse_report = pointing_device_adjust_by_defines_right(local_mouse_report);
+ shared_mouse_report = pointing_device_adjust_by_defines(shared_mouse_report);
+ }
+ local_mouse_report = is_keyboard_left() ? pointing_device_task_combined_kb(local_mouse_report, shared_mouse_report) : pointing_device_task_combined_kb(shared_mouse_report, local_mouse_report);
+#else
+ local_mouse_report = pointing_device_adjust_by_defines(local_mouse_report);
+ local_mouse_report = pointing_device_task_kb(local_mouse_report);
+#endif
// combine with mouse report to ensure that the combined is sent correctly
#ifdef MOUSEKEY_ENABLE
report_mouse_t mousekey_report = mousekey_get_report();
- mouseReport.buttons = mouseReport.buttons | mousekey_report.buttons;
+ local_mouse_report.buttons = local_mouse_report.buttons | mousekey_report.buttons;
#endif
pointing_device_send();
}
-report_mouse_t pointing_device_get_report(void) { return mouseReport; }
+/**
+ * @brief Gets current mouse report used by pointing device task
+ *
+ * @return report_mouse_t
+ */
+report_mouse_t pointing_device_get_report(void) { return local_mouse_report; }
+
+/**
+ * @brief Sets mouse report used be pointing device task
+ *
+ * @param[in] new_mouse_report
+ */
+void pointing_device_set_report(report_mouse_t new_mouse_report) { local_mouse_report = new_mouse_report; }
+
+/**
+ * @brief Gets current pointing device CPI if supported
+ *
+ * Gets current cpi from pointing device driver if supported and returns it as uint16_t
+ *
+ * @return cpi value as uint16_t
+ */
+uint16_t pointing_device_get_cpi(void) {
+#if defined(SPLIT_POINTING_ENABLE)
+ return POINTING_DEVICE_THIS_SIDE ? pointing_device_driver.get_cpi() : shared_cpi;
+#else
+ return pointing_device_driver.get_cpi();
+#endif
+}
-void pointing_device_set_report(report_mouse_t newMouseReport) { mouseReport = newMouseReport; }
+/**
+ * @brief Set pointing device CPI if supported
+ *
+ * Takes a uint16_t value to set pointing device cpi if supported by driver.
+ *
+ * @param[in] cpi uint16_t value.
+ */
+void pointing_device_set_cpi(uint16_t cpi) {
+#if defined(SPLIT_POINTING_ENABLE)
+ if (POINTING_DEVICE_THIS_SIDE) {
+ pointing_device_driver.set_cpi(cpi);
+ } else {
+ shared_cpi = cpi;
+ }
+#else
+ pointing_device_driver.set_cpi(cpi);
+#endif
+}
-uint16_t pointing_device_get_cpi(void) { return pointing_device_driver.get_cpi(); }
+#if defined(SPLIT_POINTING_ENABLE) && defined(POINTING_DEVICE_COMBINED)
+/**
+ * @brief Set pointing device CPI if supported
+ *
+ * Takes a bool and uint16_t and allows setting cpi for a single side when using 2 pointing devices with a split keyboard.
+ *
+ * NOTE: Only available when using SPLIT_POINTING_ENABLE and POINTING_DEVICE_COMBINED
+ *
+ * @param[in] left true = left, false = right.
+ * @param[in] cpi uint16_t value.
+ */
+void pointing_device_set_cpi_on_side(bool left, uint16_t cpi) {
+ bool local = (is_keyboard_left() & left) ? true : false;
+ if (local) {
+ pointing_device_driver.set_cpi(cpi);
+ } else {
+ shared_cpi = cpi;
+ }
+}
-void pointing_device_set_cpi(uint16_t cpi) { pointing_device_driver.set_cpi(cpi); }
+/**
+ * @brief clamps int16_t to int8_t
+ *
+ * @param[in] int16_t value
+ * @return int8_t clamped value
+ */
+static inline int8_t pointing_device_movement_clamp(int16_t value) {
+ if (value < INT8_MIN) {
+ return INT8_MIN;
+ } else if (value > INT8_MAX) {
+ return INT8_MAX;
+ } else {
+ return value;
+ }
+}
+
+/**
+ * @brief combines 2 mouse reports and returns 2
+ *
+ * Combines 2 report_mouse_t structs, clamping movement values to int8_t and ignores report_id then returns the resulting report_mouse_t struct.
+ *
+ * NOTE: Only available when using SPLIT_POINTING_ENABLE and POINTING_DEVICE_COMBINED
+ *
+ * @param[in] left_report left report_mouse_t
+ * @param[in] right_report right report_mouse_t
+ * @return combined report_mouse_t of left_report and right_report
+ */
+report_mouse_t pointing_device_combine_reports(report_mouse_t left_report, report_mouse_t right_report) {
+ left_report.x = pointing_device_movement_clamp((int16_t)left_report.x + right_report.x);
+ left_report.y = pointing_device_movement_clamp((int16_t)left_report.y + right_report.y);
+ left_report.h = pointing_device_movement_clamp((int16_t)left_report.h + right_report.h);
+ left_report.v = pointing_device_movement_clamp((int16_t)left_report.v + right_report.v);
+ left_report.buttons |= right_report.buttons;
+ return left_report;
+}
+
+/**
+ * @brief Adjust mouse report by any optional right pointing configuration defines
+ *
+ * This applies rotation or inversion to the mouse report as selected by the pointing device common configuration defines.
+ *
+ * NOTE: Only available when using SPLIT_POINTING_ENABLE and POINTING_DEVICE_COMBINED
+ *
+ * @param[in] mouse_report report_mouse_t to be adjusted
+ * @return report_mouse_t with adjusted values
+ */
+report_mouse_t pointing_device_adjust_by_defines_right(report_mouse_t mouse_report) {
+ // Support rotation of the sensor data
+# if defined(POINTING_DEVICE_ROTATION_90_RIGHT) || defined(POINTING_DEVICE_ROTATION_RIGHT) || defined(POINTING_DEVICE_ROTATION_RIGHT)
+ int8_t x = mouse_report.x, y = mouse_report.y;
+# if defined(POINTING_DEVICE_ROTATION_90_RIGHT)
+ mouse_report.x = y;
+ mouse_report.y = -x;
+# elif defined(POINTING_DEVICE_ROTATION_180_RIGHT)
+ mouse_report.x = -x;
+ mouse_report.y = -y;
+# elif defined(POINTING_DEVICE_ROTATION_270_RIGHT)
+ mouse_report.x = -y;
+ mouse_report.y = x;
+# else
+# error "How the heck did you get here?!"
+# endif
+# endif
+ // Support Inverting the X and Y Axises
+# if defined(POINTING_DEVICE_INVERT_X_RIGHT)
+ mouse_report.x = -mouse_report.x;
+# endif
+# if defined(POINTING_DEVICE_INVERT_Y_RIGHT)
+ mouse_report.y = -mouse_report.y;
+# endif
+ return mouse_report;
+}
+
+/**
+ * @brief Weak function allowing for keyboard level mouse report modification
+ *
+ * Takes 2 report_mouse_t structs allowing individual modification of sides at keyboard level then returns pointing_device_task_combined_user.
+ *
+ * NOTE: Only available when using SPLIT_POINTING_ENABLE and POINTING_DEVICE_COMBINED
+ *
+ * @param[in] left_report report_mouse_t
+ * @param[in] right_report report_mouse_t
+ * @return pointing_device_task_combined_user(left_report, right_report) by default
+ */
+__attribute__((weak)) report_mouse_t pointing_device_task_combined_kb(report_mouse_t left_report, report_mouse_t right_report) { return pointing_device_task_combined_user(left_report, right_report); }
+
+/**
+ * @brief Weak function allowing for user level mouse report modification
+ *
+ * Takes 2 report_mouse_t structs allowing individual modification of sides at user level then returns pointing_device_combine_reports.
+ *
+ * NOTE: Only available when using SPLIT_POINTING_ENABLE and POINTING_DEVICE_COMBINED
+ *
+ * @param[in] left_report report_mouse_t
+ * @param[in] right_report report_mouse_t
+ * @return pointing_device_combine_reports(left_report, right_report) by default
+ */
+__attribute__((weak)) report_mouse_t pointing_device_task_combined_user(report_mouse_t left_report, report_mouse_t right_report) { return pointing_device_combine_reports(left_report, right_report); }
+#endif
diff --git a/quantum/pointing_device.h b/quantum/pointing_device.h
index 5106c26660..6ff267e491 100644
--- a/quantum/pointing_device.h
+++ b/quantum/pointing_device.h
@@ -47,6 +47,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#elif defined(POINTING_DEVICE_DRIVER_pmw3360)
# include "spi_master.h"
# include "drivers/sensors/pmw3360.h"
+#elif defined(POINTING_DEVICE_DRIVER_pmw3389)
+# include "spi_master.h"
+# include "drivers/sensors/pmw3389.h"
#else
void pointing_device_driver_init(void);
report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report);
@@ -86,3 +89,16 @@ void pointing_device_init_user(void);
report_mouse_t pointing_device_task_kb(report_mouse_t mouse_report);
report_mouse_t pointing_device_task_user(report_mouse_t mouse_report);
uint8_t pointing_device_handle_buttons(uint8_t buttons, bool pressed, pointing_device_buttons_t button);
+report_mouse_t pointing_device_adjust_by_defines(report_mouse_t mouse_report);
+
+#if defined(SPLIT_POINTING_ENABLE)
+void pointing_device_set_shared_report(report_mouse_t report);
+uint16_t pointing_device_get_shared_cpi(void);
+# if defined(POINTING_DEVICE_COMBINED)
+void pointing_device_set_cpi_on_side(bool left, uint16_t cpi);
+report_mouse_t pointing_device_combine_reports(report_mouse_t left_report, report_mouse_t right_report);
+report_mouse_t pointing_device_task_combined_kb(report_mouse_t left_report, report_mouse_t right_report);
+report_mouse_t pointing_device_task_combined_user(report_mouse_t left_report, report_mouse_t right_report);
+report_mouse_t pointing_device_adjust_by_defines_right(report_mouse_t mouse_report);
+# endif // defined(POINTING_DEVICE_COMBINED)
+#endif // defined(SPLIT_POINTING_ENABLE)
diff --git a/quantum/pointing_device_drivers.c b/quantum/pointing_device_drivers.c
index 9ad5e76ba6..4333bbb095 100644
--- a/quantum/pointing_device_drivers.c
+++ b/quantum/pointing_device_drivers.c
@@ -165,14 +165,13 @@ const pointing_device_driver_t pointing_device_driver = {
// clang-format on
#elif defined(POINTING_DEVICE_DRIVER_pimoroni_trackball)
-report_mouse_t pimorono_trackball_get_report(report_mouse_t mouse_report) {
- static fast_timer_t throttle = 0;
- static uint16_t debounce = 0;
- static uint8_t error_count = 0;
- pimoroni_data_t pimoroni_data = {0};
- static int16_t x_offset = 0, y_offset = 0;
-
- if (error_count < PIMORONI_TRACKBALL_ERROR_COUNT && timer_elapsed_fast(throttle) >= PIMORONI_TRACKBALL_INTERVAL_MS) {
+report_mouse_t pimoroni_trackball_get_report(report_mouse_t mouse_report) {
+ static uint16_t debounce = 0;
+ static uint8_t error_count = 0;
+ pimoroni_data_t pimoroni_data = {0};
+ static int16_t x_offset = 0, y_offset = 0;
+
+ if (error_count < PIMORONI_TRACKBALL_ERROR_COUNT) {
i2c_status_t status = read_pimoroni_trackball(&pimoroni_data);
if (status == I2C_STATUS_SUCCESS) {
@@ -195,22 +194,20 @@ report_mouse_t pimorono_trackball_get_report(report_mouse_t mouse_report) {
} else {
error_count++;
}
- throttle = timer_read_fast();
}
return mouse_report;
}
// clang-format off
const pointing_device_driver_t pointing_device_driver = {
- .init = pimironi_trackball_device_init,
- .get_report = pimorono_trackball_get_report,
- .set_cpi = NULL,
- .get_cpi = NULL
+ .init = pimoroni_trackball_device_init,
+ .get_report = pimoroni_trackball_get_report,
+ .set_cpi = pimoroni_trackball_set_cpi,
+ .get_cpi = pimoroni_trackball_get_cpi
};
// clang-format on
#elif defined(POINTING_DEVICE_DRIVER_pmw3360)
-
-static void init(void) { pmw3360_init(); }
+static void pmw3360_device_init(void) { pmw3360_init(); }
report_mouse_t pmw3360_get_report(report_mouse_t mouse_report) {
report_pmw3360_t data = pmw3360_read_burst();
@@ -239,12 +236,48 @@ report_mouse_t pmw3360_get_report(report_mouse_t mouse_report) {
// clang-format off
const pointing_device_driver_t pointing_device_driver = {
- .init = init,
+ .init = pmw3360_device_init,
.get_report = pmw3360_get_report,
.set_cpi = pmw3360_set_cpi,
.get_cpi = pmw3360_get_cpi
};
// clang-format on
+#elif defined(POINTING_DEVICE_DRIVER_pmw3389)
+static void pmw3389_device_init(void) { pmw3389_init(); }
+
+report_mouse_t pmw3389_get_report(report_mouse_t mouse_report) {
+ report_pmw3389_t data = pmw3389_read_burst();
+ static uint16_t MotionStart = 0; // Timer for accel, 0 is resting state
+
+ if (data.isOnSurface && data.isMotion) {
+ // Reset timer if stopped moving
+ if (!data.isMotion) {
+ if (MotionStart != 0) MotionStart = 0;
+ return mouse_report;
+ }
+
+ // Set timer if new motion
+ if ((MotionStart == 0) && data.isMotion) {
+# ifdef CONSOLE_ENABLE
+ if (debug_mouse) dprintf("Starting motion.\n");
+# endif
+ MotionStart = timer_read();
+ }
+ mouse_report.x = constrain_hid(data.dx);
+ mouse_report.y = constrain_hid(data.dy);
+ }
+
+ return mouse_report;
+}
+
+// clang-format off
+const pointing_device_driver_t pointing_device_driver = {
+ .init = pmw3389_device_init,
+ .get_report = pmw3389_get_report,
+ .set_cpi = pmw3389_set_cpi,
+ .get_cpi = pmw3389_get_cpi
+};
+// clang-format on
#else
__attribute__((weak)) void pointing_device_driver_init(void) {}
__attribute__((weak)) report_mouse_t pointing_device_driver_get_report(report_mouse_t mouse_report) { return mouse_report; }
diff --git a/quantum/process_keycode/process_audio.c b/quantum/process_keycode/process_audio.c
index 3b5fa8490b..23664721e8 100644
--- a/quantum/process_keycode/process_audio.c
+++ b/quantum/process_keycode/process_audio.c
@@ -57,3 +57,4 @@ void process_audio_noteoff(uint8_t note) { stop_note(compute_freq_for_midi_note(
void process_audio_all_notes_off(void) { stop_all_notes(); }
__attribute__((weak)) void audio_on_user() {}
+__attribute__((weak)) void audio_off_user() {}
diff --git a/quantum/process_keycode/process_audio.h b/quantum/process_keycode/process_audio.h
index d89a834ea8..42cfab4af2 100644
--- a/quantum/process_keycode/process_audio.h
+++ b/quantum/process_keycode/process_audio.h
@@ -8,3 +8,4 @@ void process_audio_noteoff(uint8_t note);
void process_audio_all_notes_off(void);
void audio_on_user(void);
+void audio_off_user(void);
diff --git a/quantum/process_keycode/process_combo.c b/quantum/process_keycode/process_combo.c
index a050161edf..8040ede528 100644
--- a/quantum/process_keycode/process_combo.c
+++ b/quantum/process_keycode/process_combo.c
@@ -40,10 +40,18 @@ __attribute__((weak)) bool get_combo_must_tap(uint16_t index, combo_t *combo) {
__attribute__((weak)) uint16_t get_combo_term(uint16_t index, combo_t *combo) { return COMBO_TERM; }
#endif
+#ifdef COMBO_MUST_PRESS_IN_ORDER_PER_COMBO
+__attribute__((weak)) bool get_combo_must_press_in_order(uint16_t combo_index, combo_t *combo) { return true; }
+#endif
+
#ifdef COMBO_PROCESS_KEY_RELEASE
__attribute__((weak)) bool process_combo_key_release(uint16_t combo_index, combo_t *combo, uint8_t key_index, uint16_t keycode) { return false; }
#endif
+#ifdef COMBO_SHOULD_TRIGGER
+__attribute__((weak)) bool combo_should_trigger(uint16_t combo_index, combo_t *combo, uint16_t keycode, keyrecord_t *record) { return true; }
+#endif
+
#ifndef COMBO_NO_TIMER
static uint16_t timer = 0;
#endif
@@ -350,6 +358,28 @@ combo_t *overlaps(combo_t *combo1, combo_t *combo2) {
return combo1;
}
+#if defined(COMBO_MUST_PRESS_IN_ORDER) || defined(COMBO_MUST_PRESS_IN_ORDER_PER_COMBO)
+static bool keys_pressed_in_order(uint16_t combo_index, combo_t *combo, uint16_t key_index, uint16_t keycode, keyrecord_t *record) {
+# ifdef COMBO_MUST_PRESS_IN_ORDER_PER_COMBO
+ if (!get_combo_must_press_in_order(combo_index, combo)) {
+ return true;
+ }
+# endif
+ if (
+ // The `state` bit for the key being pressed.
+ (1 << key_index) ==
+ // The *next* combo key's bit.
+ (COMBO_STATE(combo) + 1)
+ // E.g. two keys already pressed: `state == 11`.
+ // Next possible `state` is `111`.
+ // So the needed bit is `100` which we get with `11 + 1`.
+ ) {
+ return true;
+ }
+ return false;
+}
+#endif
+
static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *record, uint16_t combo_index) {
uint8_t key_count = 0;
uint16_t key_index = -1;
@@ -360,7 +390,14 @@ static bool process_single_combo(combo_t *combo, uint16_t keycode, keyrecord_t *
return false;
}
- bool key_is_part_of_combo = !COMBO_DISABLED(combo) && is_combo_enabled();
+ bool key_is_part_of_combo = (!COMBO_DISABLED(combo) && is_combo_enabled()
+#if defined(COMBO_MUST_PRESS_IN_ORDER) || defined(COMBO_MUST_PRESS_IN_ORDER_PER_COMBO)
+ && keys_pressed_in_order(combo_index, combo, key_index, keycode, record)
+#endif
+#ifdef COMBO_SHOULD_TRIGGER
+ && combo_should_trigger(combo_index, combo, keycode, record)
+#endif
+ );
if (record->event.pressed && key_is_part_of_combo) {
uint16_t time = _get_combo_term(combo_index, combo);
diff --git a/quantum/process_keycode/process_key_lock.c b/quantum/process_keycode/process_key_lock.c
index 4bd58f0c1e..941a2c5780 100644
--- a/quantum/process_keycode/process_key_lock.c
+++ b/quantum/process_keycode/process_key_lock.c
@@ -56,6 +56,11 @@ static inline uint16_t translate_keycode(uint16_t keycode) {
}
}
+void cancel_key_lock(void) {
+ watching = false;
+ UNSET_KEY_STATE(0x0);
+}
+
bool process_key_lock(uint16_t *keycode, keyrecord_t *record) {
// We start by categorizing the keypress event. In the event of a down
// event, there are several possibilities:
diff --git a/quantum/process_keycode/process_key_lock.h b/quantum/process_keycode/process_key_lock.h
index baa0b39077..5159b0ba02 100644
--- a/quantum/process_keycode/process_key_lock.h
+++ b/quantum/process_keycode/process_key_lock.h
@@ -18,4 +18,5 @@
#include "quantum.h"
+void cancel_key_lock(void);
bool process_key_lock(uint16_t *keycode, keyrecord_t *record);
diff --git a/quantum/process_keycode/process_magic.c b/quantum/process_keycode/process_magic.c
index d5cff4f12a..6332be647c 100644
--- a/quantum/process_keycode/process_magic.c
+++ b/quantum/process_keycode/process_magic.c
@@ -44,6 +44,7 @@ bool process_magic(uint16_t keycode, keyrecord_t *record) {
case MAGIC_SWAP_CONTROL_CAPSLOCK ... MAGIC_TOGGLE_ALT_GUI:
case MAGIC_SWAP_LCTL_LGUI ... MAGIC_EE_HANDS_RIGHT:
case MAGIC_TOGGLE_GUI:
+ case MAGIC_TOGGLE_CONTROL_CAPSLOCK:
/* keymap config */
keymap_config.raw = eeconfig_read_keymap();
switch (keycode) {
@@ -168,6 +169,9 @@ bool process_magic(uint16_t keycode, keyrecord_t *record) {
case MAGIC_TOGGLE_GUI:
keymap_config.no_gui = !keymap_config.no_gui;
break;
+ case MAGIC_TOGGLE_CONTROL_CAPSLOCK:
+ keymap_config.swap_control_capslock = !keymap_config.swap_control_capslock;
+ break;
}
eeconfig_update_keymap(keymap_config.raw);
diff --git a/quantum/process_keycode/process_printer.c b/quantum/process_keycode/process_printer.c
index 82528cc680..0801f078ef 100644
--- a/quantum/process_keycode/process_printer.c
+++ b/quantum/process_keycode/process_printer.c
@@ -16,13 +16,14 @@
#include "process_printer.h"
#include "action_util.h"
+#include "uart.h"
bool printing_enabled = false;
uint8_t character_shift = 0;
void enable_printing(void) {
printing_enabled = true;
- serial_init();
+ uart_init(19200);
}
void disable_printing(void) { printing_enabled = false; }
@@ -35,7 +36,7 @@ uint8_t shifted_numbers[10] = {0x21, 0x40, 0x23, 0x24, 0x25, 0x5E, 0x26, 0x2A, 0
void print_char(char c) {
USB_Disable();
- serial_send(c);
+ uart_write(c);
USB_Init();
}
diff --git a/quantum/process_keycode/process_printer.h b/quantum/process_keycode/process_printer.h
index 3c6d06ff94..6f4d09f333 100644
--- a/quantum/process_keycode/process_printer.h
+++ b/quantum/process_keycode/process_printer.h
@@ -18,6 +18,4 @@
#include "quantum.h"
-#include "protocol/serial.h"
-
bool process_printer(uint16_t keycode, keyrecord_t *record);
diff --git a/quantum/process_keycode/process_rgb.c b/quantum/process_keycode/process_rgb.c
index 69853cd5c4..c805bd615d 100644
--- a/quantum/process_keycode/process_rgb.c
+++ b/quantum/process_keycode/process_rgb.c
@@ -51,12 +51,8 @@ static void __attribute__((noinline, unused)) handleKeycodeRGBMode(const uint8_t
* Handle keycodes for both rgblight and rgbmatrix
*/
bool process_rgb(const uint16_t keycode, const keyrecord_t *record) {
-#ifndef SPLIT_KEYBOARD
- if (record->event.pressed) {
-#else
- // Split keyboards need to trigger on key-up for edge-case issue
+ // need to trigger on key-up for edge-case issue
if (!record->event.pressed) {
-#endif
#if (defined(RGBLIGHT_ENABLE) && !defined(RGBLIGHT_DISABLE_KEYCODES)) || (defined(RGB_MATRIX_ENABLE) && !defined(RGB_MATRIX_DISABLE_KEYCODES))
uint8_t shifted = get_mods() & MOD_MASK_SHIFT;
#endif
diff --git a/quantum/quantum.c b/quantum/quantum.c
index 35b6351e9d..c106f795d0 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -76,9 +76,9 @@ uint8_t extract_mod_bits(uint16_t code) {
return mods_to_send;
}
-static void do_code16(uint16_t code, void (*f)(uint8_t)) { f(extract_mod_bits(code)); }
+void do_code16(uint16_t code, void (*f)(uint8_t)) { f(extract_mod_bits(code)); }
-void register_code16(uint16_t code) {
+__attribute__((weak)) void register_code16(uint16_t code) {
if (IS_MOD(code) || code == KC_NO) {
do_code16(code, register_mods);
} else {
@@ -87,7 +87,7 @@ void register_code16(uint16_t code) {
register_code(code);
}
-void unregister_code16(uint16_t code) {
+__attribute__((weak)) void unregister_code16(uint16_t code) {
unregister_code(code);
if (IS_MOD(code) || code == KC_NO) {
do_code16(code, unregister_mods);
@@ -96,7 +96,7 @@ void unregister_code16(uint16_t code) {
}
}
-void tap_code16(uint16_t code) {
+__attribute__((weak)) void tap_code16(uint16_t code) {
register_code16(code);
#if TAP_CODE_DELAY > 0
wait_ms(TAP_CODE_DELAY);
@@ -263,7 +263,7 @@ bool process_record_quantum(keyrecord_t *record) {
#ifdef TAP_DANCE_ENABLE
process_tap_dance(keycode, record) &&
#endif
-#if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)
+#if defined(UNICODE_COMMON_ENABLE)
process_unicode_common(keycode, record) &&
#endif
#ifdef LEADER_ENABLE
@@ -387,7 +387,7 @@ void matrix_init_quantum() {
#ifdef RGB_MATRIX_ENABLE
rgb_matrix_init();
#endif
-#if defined(UNICODE_ENABLE) || defined(UNICODEMAP_ENABLE) || defined(UCIS_ENABLE)
+#if defined(UNICODE_COMMON_ENABLE)
unicode_input_mode_init();
#endif
#ifdef HAPTIC_ENABLE
diff --git a/quantum/quantum.h b/quantum/quantum.h
index 6927884e2f..5d3a665887 100644
--- a/quantum/quantum.h
+++ b/quantum/quantum.h
@@ -109,6 +109,10 @@ extern layer_state_t layer_state;
# include "process_unicodemap.h"
#endif
+#ifdef UNICODE_COMMON_ENABLE
+# include "process_unicode_common.h"
+#endif
+
#ifdef KEY_OVERRIDE_ENABLE
# include "process_key_override.h"
#endif
diff --git a/quantum/quantum_keycodes.h b/quantum/quantum_keycodes.h
index e4d0167aac..3950a3bcae 100644
--- a/quantum/quantum_keycodes.h
+++ b/quantum/quantum_keycodes.h
@@ -597,6 +597,8 @@ enum quantum_keycodes {
MACRO_30,
MACRO_31,
+ MAGIC_TOGGLE_CONTROL_CAPSLOCK,
+
// Start of custom keycode range for keyboards and keymaps - always leave at the end
SAFE_RANGE
};
@@ -749,6 +751,7 @@ enum quantum_keycodes {
#define CL_NORM MAGIC_UNSWAP_CONTROL_CAPSLOCK
#define CL_CTRL MAGIC_CAPSLOCK_TO_CONTROL
#define CL_CAPS MAGIC_UNCAPSLOCK_TO_CONTROL
+#define CL_TOGG MAGIC_TOGGLE_CONTROL_CAPSLOCK
#define LCG_SWP MAGIC_SWAP_LCTL_LGUI
#define LCG_NRM MAGIC_UNSWAP_LCTL_LGUI
diff --git a/quantum/rgb_matrix/animations/pixel_fractal_anim.h b/quantum/rgb_matrix/animations/pixel_fractal_anim.h
index 8e25ec402c..35187b92de 100644
--- a/quantum/rgb_matrix/animations/pixel_fractal_anim.h
+++ b/quantum/rgb_matrix/animations/pixel_fractal_anim.h
@@ -31,6 +31,10 @@ static bool PIXEL_FRACTAL(effect_params_t* params) {
inline uint32_t interval(void) { return 3000 / scale16by8(qadd8(rgb_matrix_config.speed, 16), 16); }
+ if (params->init) {
+ rgb_matrix_set_color_all(0, 0, 0);
+ }
+
RGB rgb = rgb_matrix_hsv_to_rgb(rgb_matrix_config.hsv);
for (uint8_t h = 0; h < MATRIX_ROWS; ++h) {
for (uint8_t l = 0; l < MID_COL - 1; ++l) { // Light and move left columns outwards
diff --git a/quantum/split_common/split_util.h b/quantum/split_common/split_util.h
index ef72043bb7..c7eabea233 100644
--- a/quantum/split_common/split_util.h
+++ b/quantum/split_common/split_util.h
@@ -2,7 +2,6 @@
#include <stdbool.h>
#include <stdint.h>
-#include <stdio.h>
#include <stdlib.h>
#include "matrix.h"
diff --git a/quantum/split_common/transaction_id_define.h b/quantum/split_common/transaction_id_define.h
index 535bc21aea..aa71c3621e 100644
--- a/quantum/split_common/transaction_id_define.h
+++ b/quantum/split_common/transaction_id_define.h
@@ -78,6 +78,12 @@ enum serial_transaction_id {
PUT_ST7565,
#endif // defined(ST7565_ENABLE) && defined(SPLIT_ST7565_ENABLE)
+#if defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE)
+ GET_POINTING_CHECKSUM,
+ GET_POINTING_DATA,
+ PUT_POINTING_CPI,
+#endif // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE)
+
#if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER)
PUT_RPC_INFO,
PUT_RPC_REQ_DATA,
diff --git a/quantum/split_common/transactions.c b/quantum/split_common/transactions.c
index 3ff87710e7..81f9836382 100644
--- a/quantum/split_common/transactions.c
+++ b/quantum/split_common/transactions.c
@@ -579,6 +579,84 @@ static void st7565_handlers_slave(matrix_row_t master_matrix[], matrix_row_t sla
#endif // defined(ST7565_ENABLE) && defined(SPLIT_ST7565_ENABLE)
////////////////////////////////////////////////////
+// POINTING
+
+#if defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE)
+
+static bool pointing_handlers_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) {
+# if defined(POINTING_DEVICE_LEFT)
+ if (is_keyboard_left()) {
+ return true;
+ }
+# elif defined(POINTING_DEVICE_RIGHT)
+ if (!is_keyboard_left()) {
+ return true;
+ }
+# endif
+ static uint32_t last_update = 0;
+ static uint16_t last_cpi = 0;
+ report_mouse_t temp_state;
+ uint16_t temp_cpi;
+ bool okay = read_if_checksum_mismatch(GET_POINTING_CHECKSUM, GET_POINTING_DATA, &last_update, &temp_state, &split_shmem->pointing.report, sizeof(temp_state));
+ if (okay) pointing_device_set_shared_report(temp_state);
+ temp_cpi = pointing_device_get_shared_cpi();
+ if (temp_cpi && memcmp(&last_cpi, &temp_cpi, sizeof(temp_cpi)) != 0) {
+ memcpy(&split_shmem->pointing.cpi, &temp_cpi, sizeof(temp_cpi));
+ okay = transport_write(PUT_POINTING_CPI, &split_shmem->pointing.cpi, sizeof(split_shmem->pointing.cpi));
+ if (okay) {
+ last_cpi = temp_cpi;
+ }
+ }
+ return okay;
+}
+
+extern const pointing_device_driver_t pointing_device_driver;
+
+static void pointing_handlers_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[]) {
+# if defined(POINTING_DEVICE_LEFT)
+ if (!is_keyboard_left()) {
+ return;
+ }
+# elif defined(POINTING_DEVICE_RIGHT)
+ if (is_keyboard_left()) {
+ return;
+ }
+# endif
+ report_mouse_t temp_report;
+ uint16_t temp_cpi;
+# ifdef POINTING_DEVICE_TASK_THROTTLE_MS
+ static uint32_t last_exec = 0;
+ if (timer_elapsed32(last_exec) < POINTING_DEVICE_TASK_THROTTLE_MS) {
+ return;
+ }
+ last_exec = timer_read32();
+# endif
+ temp_cpi = !pointing_device_driver.get_cpi ? 0 : pointing_device_driver.get_cpi(); // check for NULL
+ if (split_shmem->pointing.cpi && memcmp(&split_shmem->pointing.cpi, &temp_cpi, sizeof(temp_cpi)) != 0) {
+ if (pointing_device_driver.set_cpi) {
+ pointing_device_driver.set_cpi(split_shmem->pointing.cpi);
+ }
+ }
+ memset(&temp_report, 0, sizeof(temp_report));
+ temp_report = pointing_device_driver.get_report(temp_report);
+ memcpy(&split_shmem->pointing.report, &temp_report, sizeof(temp_report));
+ // Now update the checksum given that the pointing has been written to
+ split_shmem->pointing.checksum = crc8(&temp_report, sizeof(temp_report));
+}
+
+# define TRANSACTIONS_POINTING_MASTER() TRANSACTION_HANDLER_MASTER(pointing)
+# define TRANSACTIONS_POINTING_SLAVE() TRANSACTION_HANDLER_SLAVE(pointing)
+# define TRANSACTIONS_POINTING_REGISTRATIONS [GET_POINTING_CHECKSUM] = trans_target2initiator_initializer(pointing.checksum), [GET_POINTING_DATA] = trans_target2initiator_initializer(pointing.report), [PUT_POINTING_CPI] = trans_initiator2target_initializer(pointing.cpi),
+
+#else // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE)
+
+# define TRANSACTIONS_POINTING_MASTER()
+# define TRANSACTIONS_POINTING_SLAVE()
+# define TRANSACTIONS_POINTING_REGISTRATIONS
+
+#endif // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE)
+
+////////////////////////////////////////////////////
uint8_t dummy;
split_transaction_desc_t split_transaction_table[NUM_TOTAL_TRANSACTIONS] = {
@@ -604,6 +682,7 @@ split_transaction_desc_t split_transaction_table[NUM_TOTAL_TRANSACTIONS] = {
TRANSACTIONS_WPM_REGISTRATIONS
TRANSACTIONS_OLED_REGISTRATIONS
TRANSACTIONS_ST7565_REGISTRATIONS
+ TRANSACTIONS_POINTING_REGISTRATIONS
// clang-format on
#if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER)
@@ -629,6 +708,7 @@ bool transactions_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix
TRANSACTIONS_WPM_MASTER();
TRANSACTIONS_OLED_MASTER();
TRANSACTIONS_ST7565_MASTER();
+ TRANSACTIONS_POINTING_MASTER();
return true;
}
@@ -647,6 +727,7 @@ void transactions_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[
TRANSACTIONS_WPM_SLAVE();
TRANSACTIONS_OLED_SLAVE();
TRANSACTIONS_ST7565_SLAVE();
+ TRANSACTIONS_POINTING_SLAVE();
}
#if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER)
diff --git a/quantum/split_common/transport.h b/quantum/split_common/transport.h
index 1d4f6ed0cd..31b804908b 100644
--- a/quantum/split_common/transport.h
+++ b/quantum/split_common/transport.h
@@ -106,6 +106,15 @@ typedef struct _split_mods_sync_t {
} split_mods_sync_t;
#endif // SPLIT_MODS_ENABLE
+#if defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE)
+# include "pointing_device.h"
+typedef struct _split_slave_pointing_sync_t {
+ uint8_t checksum;
+ report_mouse_t report;
+ uint16_t cpi;
+} split_slave_pointing_sync_t;
+#endif // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE)
+
#if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER)
typedef struct _rpc_sync_info_t {
int8_t transaction_id;
@@ -173,6 +182,10 @@ typedef struct _split_shared_memory_t {
uint8_t current_st7565_state;
#endif // ST7565_ENABLE(OLED_ENABLE) && defined(SPLIT_ST7565_ENABLE)
+#if defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE)
+ split_slave_pointing_sync_t pointing;
+#endif // defined(POINTING_DEVICE_ENABLE) && defined(SPLIT_POINTING_ENABLE)
+
#if defined(SPLIT_TRANSACTION_IDS_KB) || defined(SPLIT_TRANSACTION_IDS_USER)
rpc_sync_info_t rpc_info;
uint8_t rpc_m2s_buffer[RPC_M2S_BUFFER_SIZE];
diff --git a/quantum/wpm.c b/quantum/wpm.c
index 925e2c416e..62d4128b8e 100644
--- a/quantum/wpm.c
+++ b/quantum/wpm.c
@@ -22,33 +22,37 @@
// WPM Stuff
static uint8_t current_wpm = 0;
static uint32_t wpm_timer = 0;
-#ifndef WPM_UNFILTERED
-static uint32_t smoothing_timer = 0;
-#endif
/* The WPM calculation works by specifying a certain number of 'periods' inside
* a ring buffer, and we count the number of keypresses which occur in each of
* those periods. Then to calculate WPM, we add up all of the keypresses in
* the whole ring buffer, divide by the number of keypresses in a 'word', and
- * then adjust for how much time is captured by our ring buffer. Right now
- * the ring buffer is hardcoded below to be six half-second periods, accounting
- * for a total WPM sampling period of up to three seconds of typing.
+ * then adjust for how much time is captured by our ring buffer. The size
+ * of the ring buffer can be configured using the keymap configuration
+ * value `WPM_SAMPLE_PERIODS`.
*
- * Whenever our WPM drops to absolute zero due to no typing occurring within
- * any contiguous three seconds, we reset and start measuring fresh,
- * which lets our WPM immediately reach the correct value even before a full
- * three second sampling buffer has been filled.
*/
#define MAX_PERIODS (WPM_SAMPLE_PERIODS)
#define PERIOD_DURATION (1000 * WPM_SAMPLE_SECONDS / MAX_PERIODS)
-#define LATENCY (100)
-static int8_t period_presses[MAX_PERIODS] = {0};
+
+static int16_t period_presses[MAX_PERIODS] = {0};
static uint8_t current_period = 0;
static uint8_t periods = 1;
#if !defined(WPM_UNFILTERED)
-static uint8_t prev_wpm = 0;
-static uint8_t next_wpm = 0;
+/* LATENCY is used as part of filtering, and controls how quickly the reported
+ * WPM trails behind our actual instantaneous measured WPM value, and is
+ * defined in milliseconds. So for LATENCY == 100, the displayed WPM is
+ * smoothed out over periods of 0.1 seconds. This results in a nice,
+ * smoothly-moving reported WPM value which nevertheless is never more than
+ * 0.1 seconds behind the typist's actual current WPM.
+ *
+ * LATENCY is not used if WPM_UNFILTERED is defined.
+ */
+# define LATENCY (100)
+static uint32_t smoothing_timer = 0;
+static uint8_t prev_wpm = 0;
+static uint8_t next_wpm = 0;
#endif
void set_current_wpm(uint8_t new_wpm) { current_wpm = new_wpm; }
@@ -71,7 +75,7 @@ __attribute__((weak)) bool wpm_keycode_user(uint16_t keycode) {
return false;
}
-#ifdef WPM_ALLOW_COUNT_REGRESSION
+#if defined(WPM_ALLOW_COUNT_REGRESSION)
__attribute__((weak)) uint8_t wpm_regress_count(uint16_t keycode) {
bool weak_modded = (keycode >= QK_LCTL && keycode < QK_LSFT) || (keycode >= QK_RCTL && keycode < QK_RSFT);
@@ -95,12 +99,12 @@ __attribute__((weak)) uint8_t wpm_regress_count(uint16_t keycode) {
// Outside 'raw' mode we smooth results over time.
void update_wpm(uint16_t keycode) {
- if (wpm_keycode(keycode)) {
+ if (wpm_keycode(keycode) && period_presses[current_period] < INT16_MAX) {
period_presses[current_period]++;
}
-#ifdef WPM_ALLOW_COUNT_REGRESSION
+#if defined(WPM_ALLOW_COUNT_REGRESSION)
uint8_t regress = wpm_regress_count(keycode);
- if (regress) {
+ if (regress && period_presses[current_period] > INT16_MIN) {
period_presses[current_period]--;
}
#endif
@@ -116,32 +120,41 @@ void decay_wpm(void) {
}
int32_t elapsed = timer_elapsed32(wpm_timer);
uint32_t duration = (((periods)*PERIOD_DURATION) + elapsed);
- uint32_t wpm_now = (60000 * presses) / (duration * WPM_ESTIMATED_WORD_SIZE);
- wpm_now = (wpm_now > 240) ? 240 : wpm_now;
+ int32_t wpm_now = (60000 * presses) / (duration * WPM_ESTIMATED_WORD_SIZE);
+
+ if (wpm_now < 0) // set some reasonable WPM measurement limits
+ wpm_now = 0;
+ if (wpm_now > 240) wpm_now = 240;
if (elapsed > PERIOD_DURATION) {
current_period = (current_period + 1) % MAX_PERIODS;
period_presses[current_period] = 0;
periods = (periods < MAX_PERIODS - 1) ? periods + 1 : MAX_PERIODS - 1;
elapsed = 0;
- /* if (wpm_timer == 0) { */
- wpm_timer = timer_read32();
- /* } else { */
- /* wpm_timer += PERIOD_DURATION; */
- /* } */
+ wpm_timer = timer_read32();
}
if (presses < 2) // don't guess high WPM based on a single keypress.
wpm_now = 0;
-#if defined WPM_LAUNCH_CONTROL
+#if defined(WPM_LAUNCH_CONTROL)
+ /*
+ * If the `WPM_LAUNCH_CONTROL` option is enabled, then whenever our WPM
+ * drops to absolute zero due to no typing occurring within our sample
+ * ring buffer, we reset and start measuring fresh, which lets our WPM
+ * immediately reach the correct value even before a full sampling buffer
+ * has been filled.
+ */
if (presses == 0) {
- current_period = 0;
- periods = 0;
- wpm_now = 0;
+ current_period = 0;
+ periods = 0;
+ wpm_now = 0;
+ period_presses[0] = 0;
}
#endif // WPM_LAUNCH_CONTROL
-#ifndef WPM_UNFILTERED
+#if defined(WPM_UNFILTERED)
+ current_wpm = wpm_now;
+#else
int32_t latency = timer_elapsed32(smoothing_timer);
if (latency > LATENCY) {
smoothing_timer = timer_read32();
@@ -150,7 +163,5 @@ void decay_wpm(void) {
}
current_wpm = prev_wpm + (latency * ((int)next_wpm - (int)prev_wpm) / LATENCY);
-#else
- current_wpm = wpm_now;
#endif
}
diff --git a/quantum/wpm.h b/quantum/wpm.h
index c8e7d26684..305d75b450 100644
--- a/quantum/wpm.h
+++ b/quantum/wpm.h
@@ -26,7 +26,7 @@
# define WPM_SAMPLE_SECONDS 5
#endif
#ifndef WPM_SAMPLE_PERIODS
-# define WPM_SAMPLE_PERIODS 50
+# define WPM_SAMPLE_PERIODS 25
#endif
bool wpm_keycode(uint16_t keycode);
diff --git a/readme.md b/readme.md
index 5649ddfa09..63b483c744 100644
--- a/readme.md
+++ b/readme.md
@@ -1,3 +1,7 @@
+# This is the `develop` branch!
+
+See the [Breaking Changes](https://docs.qmk.fm/#/breaking_changes) document for more information.
+
# Quantum Mechanical Keyboard Firmware
[![Current Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags)
diff --git a/tests/auto_shift/test_auto_shift.cpp b/tests/auto_shift/test_auto_shift.cpp
index 9c5ed9a832..a19b5dfa82 100644
--- a/tests/auto_shift/test_auto_shift.cpp
+++ b/tests/auto_shift/test_auto_shift.cpp
@@ -42,7 +42,6 @@ TEST_F(AutoShift, key_release_before_timeout) {
/* Release regular key */
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_A)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
regular_key.release();
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
@@ -65,8 +64,6 @@ TEST_F(AutoShift, key_release_after_timeout) {
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_A)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
regular_key.release();
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
diff --git a/tests/basic/test_action_layer.cpp b/tests/basic/test_action_layer.cpp
index 1b12d13642..fe5c729f7c 100644
--- a/tests/basic/test_action_layer.cpp
+++ b/tests/basic/test_action_layer.cpp
@@ -131,14 +131,12 @@ TEST_F(ActionLayer, MomentaryLayerDoesNothing) {
set_keymap({layer_key});
/* Press and release MO, nothing should happen. */
- /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
layer_key.press();
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
- /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
layer_key.release();
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
@@ -153,8 +151,7 @@ TEST_F(ActionLayer, MomentaryLayerWithKeypress) {
set_keymap({layer_key, regular_key, KeymapKey{1, 1, 0, KC_B}});
/* Press MO. */
- /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
layer_key.press();
run_one_scan_loop();
EXPECT_TRUE(layer_state_is(1));
@@ -175,8 +172,7 @@ TEST_F(ActionLayer, MomentaryLayerWithKeypress) {
testing::Mock::VerifyAndClearExpectations(&driver);
/* Release MO */
- /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
layer_key.release();
run_one_scan_loop();
EXPECT_TRUE(layer_state_is(0));
@@ -199,8 +195,7 @@ TEST_F(ActionLayer, ToggleLayerDoesNothing) {
testing::Mock::VerifyAndClearExpectations(&driver);
/* Release TG. */
- /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
layer_key.release();
run_one_scan_loop();
EXPECT_TRUE(layer_state_is(1));
@@ -223,8 +218,7 @@ TEST_F(ActionLayer, ToggleLayerUpAndDown) {
EXPECT_TRUE(layer_state_is(1));
testing::Mock::VerifyAndClearExpectations(&driver);
- /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
toggle_layer_1_on_layer_0.release();
run_one_scan_loop();
EXPECT_TRUE(layer_state_is(1));
@@ -237,8 +231,7 @@ TEST_F(ActionLayer, ToggleLayerUpAndDown) {
EXPECT_TRUE(layer_state_is(0));
testing::Mock::VerifyAndClearExpectations(&driver);
- /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
toggle_layer_0_on_layer_1.release();
run_one_scan_loop();
EXPECT_TRUE(layer_state_is(0));
@@ -254,14 +247,13 @@ TEST_F(ActionLayer, LayerTapToggleDoesNothing) {
set_keymap({layer_key});
/* Press and release TT. */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(0);
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
layer_key.press();
run_one_scan_loop();
EXPECT_TRUE(layer_state_is(1));
testing::Mock::VerifyAndClearExpectations(&driver);
- /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(2);
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
layer_key.release();
run_one_scan_loop();
EXPECT_TRUE(layer_state_is(0));
@@ -279,7 +271,6 @@ TEST_F(ActionLayer, LayerTapToggleWithKeypress) {
set_keymap({layer_key, regular_key, KeymapKey{1, 1, 0, KC_B}});
/* Press TT. */
- /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(0);
layer_key.press();
run_one_scan_loop();
@@ -298,8 +289,7 @@ TEST_F(ActionLayer, LayerTapToggleWithKeypress) {
EXPECT_TRUE(layer_state_is(1));
testing::Mock::VerifyAndClearExpectations(&driver);
- /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
layer_key.release();
run_one_scan_loop();
EXPECT_TRUE(layer_state_is(0));
@@ -317,8 +307,7 @@ TEST_F(ActionLayer, LayerTapToggleWithToggleWithKeypress) {
set_keymap({layer_key, regular_key, KeymapKey{1, 1, 0, KC_B}});
/* Tap TT five times . */
- /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(9);
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
layer_key.press();
run_one_scan_loop();
diff --git a/tests/basic/test_keypress.cpp b/tests/basic/test_keypress.cpp
index 1c175c9d56..044fc29378 100644
--- a/tests/basic/test_keypress.cpp
+++ b/tests/basic/test_keypress.cpp
@@ -85,7 +85,7 @@ TEST_F(KeyPress, CorrectKeysAreReportedWhenTwoKeysArePressed) {
TEST_F(KeyPress, LeftShiftIsReportedCorrectly) {
TestDriver driver;
auto key_a = KeymapKey(0, 0, 0, KC_A);
- auto key_lsft = KeymapKey(0, 3, 0, KC_LSFT);
+ auto key_lsft = KeymapKey(0, 3, 0, KC_LEFT_SHIFT);
set_keymap({key_a, key_lsft});
@@ -110,8 +110,8 @@ TEST_F(KeyPress, LeftShiftIsReportedCorrectly) {
TEST_F(KeyPress, PressLeftShiftAndControl) {
TestDriver driver;
- auto key_lsft = KeymapKey(0, 3, 0, KC_LSFT);
- auto key_lctrl = KeymapKey(0, 5, 0, KC_LCTRL);
+ auto key_lsft = KeymapKey(0, 3, 0, KC_LEFT_SHIFT);
+ auto key_lctrl = KeymapKey(0, 5, 0, KC_LEFT_CTRL);
set_keymap({key_lctrl, key_lsft});
@@ -138,8 +138,8 @@ TEST_F(KeyPress, PressLeftShiftAndControl) {
TEST_F(KeyPress, LeftAndRightShiftCanBePressedAtTheSameTime) {
TestDriver driver;
- auto key_lsft = KeymapKey(0, 3, 0, KC_LSFT);
- auto key_rsft = KeymapKey(0, 4, 0, KC_RSFT);
+ auto key_lsft = KeymapKey(0, 3, 0, KC_LEFT_SHIFT);
+ auto key_rsft = KeymapKey(0, 4, 0, KC_RIGHT_SHIFT);
set_keymap({key_rsft, key_lsft});
@@ -175,12 +175,12 @@ TEST_F(KeyPress, RightShiftLeftControlAndCharWithTheSameKey) {
// The underlying cause is that we use only one bit to represent the right hand
// modifiers.
combo_key.press();
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RSFT, KC_RCTRL)));
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RSFT, KC_RCTRL, KC_O)));
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RIGHT_SHIFT, KC_RIGHT_CTRL)));
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RIGHT_SHIFT, KC_RIGHT_CTRL, KC_O)));
keyboard_task();
combo_key.release();
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RSFT, KC_RCTRL)));
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_RIGHT_SHIFT, KC_RIGHT_CTRL)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
keyboard_task();
}
@@ -189,18 +189,18 @@ TEST_F(KeyPress, PressPlusEqualReleaseBeforePress) {
TestDriver driver;
InSequence s;
auto key_plus = KeymapKey(0, 1, 1, KC_PLUS);
- auto key_eql = KeymapKey(0, 0, 1, KC_EQL);
+ auto key_eql = KeymapKey(0, 0, 1, KC_EQUAL);
set_keymap({key_plus, key_eql});
key_plus.press();
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL)));
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT)));
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT, KC_EQUAL)));
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
key_plus.release();
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
@@ -220,13 +220,13 @@ TEST_F(KeyPress, PressPlusEqualDontReleaseBeforePress) {
TestDriver driver;
InSequence s;
auto key_plus = KeymapKey(0, 1, 1, KC_PLUS);
- auto key_eql = KeymapKey(0, 0, 1, KC_EQL);
+ auto key_eql = KeymapKey(0, 0, 1, KC_EQUAL);
set_keymap({key_plus, key_eql});
key_plus.press();
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL)));
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT)));
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT, KC_EQUAL)));
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
@@ -237,14 +237,13 @@ TEST_F(KeyPress, PressPlusEqualDontReleaseBeforePress) {
testing::Mock::VerifyAndClearExpectations(&driver);
key_plus.release();
- // BUG: Should really still return KC_EQL, but this is fine too
- // It's also called twice for some reason
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(2);
+ // BUG: Should really still return KC_EQUAL, but this is fine too
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(1);
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
key_eql.release();
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
}
@@ -253,12 +252,12 @@ TEST_F(KeyPress, PressEqualPlusReleaseBeforePress) {
TestDriver driver;
InSequence s;
auto key_plus = KeymapKey(0, 1, 1, KC_PLUS);
- auto key_eql = KeymapKey(0, 0, 1, KC_EQL);
+ auto key_eql = KeymapKey(0, 0, 1, KC_EQUAL);
set_keymap({key_plus, key_eql});
key_eql.press();
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL)));
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQUAL)));
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
@@ -268,13 +267,13 @@ TEST_F(KeyPress, PressEqualPlusReleaseBeforePress) {
testing::Mock::VerifyAndClearExpectations(&driver);
key_plus.press();
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_EQL)));
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT)));
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT, KC_EQUAL)));
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
key_plus.release();
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
@@ -284,12 +283,12 @@ TEST_F(KeyPress, PressEqualPlusDontReleaseBeforePress) {
TestDriver driver;
InSequence s;
auto key_plus = KeymapKey(0, 1, 1, KC_PLUS);
- auto key_eql = KeymapKey(0, 0, 1, KC_EQL);
+ auto key_eql = KeymapKey(0, 0, 1, KC_EQUAL);
set_keymap({key_plus, key_eql});
key_eql.press();
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQL)));
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_EQUAL)));
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
@@ -309,9 +308,7 @@ TEST_F(KeyPress, PressEqualPlusDontReleaseBeforePress) {
testing::Mock::VerifyAndClearExpectations(&driver);
key_plus.release();
- // This report is not needed
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LEFT_SHIFT)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
-} \ No newline at end of file
+}
diff --git a/tests/basic/test_one_shot_keys.cpp b/tests/basic/test_one_shot_keys.cpp
index 98178912e4..43fc3e1ba3 100644
--- a/tests/basic/test_one_shot_keys.cpp
+++ b/tests/basic/test_one_shot_keys.cpp
@@ -175,22 +175,20 @@ TEST_F(OneShot, OSLWithAdditionalKeypress) {
testing::Mock::VerifyAndClearExpectations(&driver);
/* Release OSL key */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(2);
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
osl_key.release();
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
/* Press regular key */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(regular_key.report_code))).Times(2);
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
+ EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(regular_key.report_code))).Times(1);
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
regular_key.press();
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
/* Release regular key */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
regular_key.release();
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
diff --git a/tests/tap_hold_configurations/permissive_hold/test_tap_hold.cpp b/tests/tap_hold_configurations/permissive_hold/test_tap_hold.cpp
index ab9dd1518b..00c2b33cb7 100644
--- a/tests/tap_hold_configurations/permissive_hold/test_tap_hold.cpp
+++ b/tests/tap_hold_configurations/permissive_hold/test_tap_hold.cpp
@@ -117,7 +117,6 @@ TEST_F(PermissiveHold, tap_regular_key_while_layer_tap_key_is_held) {
testing::Mock::VerifyAndClearExpectations(&driver);
/* Release regular key */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(layer_key.report_code)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
regular_key.release();
@@ -125,7 +124,7 @@ TEST_F(PermissiveHold, tap_regular_key_while_layer_tap_key_is_held) {
testing::Mock::VerifyAndClearExpectations(&driver);
/* Release layer-tap-hold key */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
layer_tap_hold_key.release();
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
diff --git a/tests/tap_hold_configurations/permissive_hold_ignore_mod_tap_interrupt/test_tap_hold.cpp b/tests/tap_hold_configurations/permissive_hold_ignore_mod_tap_interrupt/test_tap_hold.cpp
index 67f394653f..67706f80dc 100644
--- a/tests/tap_hold_configurations/permissive_hold_ignore_mod_tap_interrupt/test_tap_hold.cpp
+++ b/tests/tap_hold_configurations/permissive_hold_ignore_mod_tap_interrupt/test_tap_hold.cpp
@@ -119,7 +119,6 @@ TEST_F(PermissiveHold_IgnoreModTapInterrupt, tap_regular_key_while_layer_tap_key
testing::Mock::VerifyAndClearExpectations(&driver);
/* Release regular key */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_B)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
regular_key.release();
@@ -127,7 +126,7 @@ TEST_F(PermissiveHold_IgnoreModTapInterrupt, tap_regular_key_while_layer_tap_key
testing::Mock::VerifyAndClearExpectations(&driver);
/* Release layer-tap-hold key */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
layer_tap_hold_key.release();
run_one_scan_loop();
testing::Mock::VerifyAndClearExpectations(&driver);
diff --git a/tests/tap_hold_configurations/tapping_force_hold/test_action_layer.cpp b/tests/tap_hold_configurations/tapping_force_hold/test_action_layer.cpp
index 02416eed73..54e7daa22c 100644
--- a/tests/tap_hold_configurations/tapping_force_hold/test_action_layer.cpp
+++ b/tests/tap_hold_configurations/tapping_force_hold/test_action_layer.cpp
@@ -31,9 +31,8 @@ TEST_F(ActionLayer, LayerTapToggleWithToggleWithKeypress) {
set_keymap({layer_key, regular_key, KeymapKey{1, 1, 0, KC_B}});
/* Tap TT five times . */
- /* TODO: QMK currently sends an empty report even if nothing needs to be reported to the host! */
/* TODO: Tapping Force Hold breaks TT */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(10);
+ EXPECT_CALL(driver, send_keyboard_mock(_)).Times(0);
layer_key.press();
run_one_scan_loop();
diff --git a/tests/tap_hold_configurations/tapping_force_hold/test_tap_hold.cpp b/tests/tap_hold_configurations/tapping_force_hold/test_tap_hold.cpp
index cb68429617..3ae7c4ccfd 100644
--- a/tests/tap_hold_configurations/tapping_force_hold/test_tap_hold.cpp
+++ b/tests/tap_hold_configurations/tapping_force_hold/test_tap_hold.cpp
@@ -60,7 +60,6 @@ TEST_F(TappingForceHold, tap_regular_key_while_mod_tap_key_is_held) {
testing::Mock::VerifyAndClearExpectations(&driver);
/* Idle for tapping term of mod tap hold key. */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_A)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
@@ -101,7 +100,6 @@ TEST_F(TappingForceHold, tap_mod_tap_key_while_mod_tap_key_is_held) {
testing::Mock::VerifyAndClearExpectations(&driver);
/* Idle for tapping term of first mod tap hold key. */
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT, KC_A)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport(KC_LSFT)));
EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport()));
diff --git a/tests/test_common/test_fixture.cpp b/tests/test_common/test_fixture.cpp
index 0601b17191..91bf3e779e 100644
--- a/tests/test_common/test_fixture.cpp
+++ b/tests/test_common/test_fixture.cpp
@@ -48,7 +48,6 @@ void TestFixture::SetUpTestCase() {
eeconfig_update_debug(debug_config.raw);
TestDriver driver;
- EXPECT_CALL(driver, send_keyboard_mock(_));
keyboard_init();
test_logger.info() << "TestFixture setup-up end." << std::endl;
@@ -62,8 +61,6 @@ TestFixture::~TestFixture() {
test_logger.info() << "TestFixture clean-up start." << std::endl;
TestDriver driver;
- EXPECT_CALL(driver, send_keyboard_mock(KeyboardReport())).Times(2);
-
/* Reset keyboard state. */
clear_all_keys();
diff --git a/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h b/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h
index e1749f872d..319ff8487d 100644
--- a/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h
+++ b/tmk_core/protocol/arm_atsam/arm_atsam_protocol.h
@@ -19,7 +19,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define _ARM_ATSAM_PROTOCOL_H_
#include "samd51j18a.h"
-#include "md_bootloader.h"
#include "timer.h"
#include "d51_util.h"
diff --git a/tmk_core/protocol/arm_atsam/md_bootloader.h b/tmk_core/protocol/arm_atsam/md_bootloader.h
deleted file mode 100644
index 362b9bd52a..0000000000
--- a/tmk_core/protocol/arm_atsam/md_bootloader.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#ifndef _MD_BOOTLOADER_H_
-#define _MD_BOOTLOADER_H_
-
-extern uint32_t _srom;
-extern uint32_t _lrom;
-extern uint32_t _erom;
-
-#define BOOTLOADER_SERIAL_MAX_SIZE 20 // DO NOT MODIFY!
-
-#ifdef KEYBOARD_massdrop_ctrl
-// WARNING: These are only for CTRL bootloader release "v2.18Jun 22 2018 17:28:08" for bootloader_jump support
-extern uint32_t _eram;
-# define BOOTLOADER_MAGIC 0x3B9ACA00
-# define MAGIC_ADDR (uint32_t *)((intptr_t)(&_eram) - 4)
-#endif
-
-#ifdef MD_BOOTLOADER
-
-# define MCU_HZ 48000000
-# define I2C_HZ 0 // Not used
-
-#endif // MD_BOOTLOADER
-
-#endif //_MD_BOOTLOADER_H_
diff --git a/tmk_core/protocol/arm_atsam/startup.c b/tmk_core/protocol/arm_atsam/startup.c
index 7a5791ab55..ce043bad51 100644
--- a/tmk_core/protocol/arm_atsam/startup.c
+++ b/tmk_core/protocol/arm_atsam/startup.c
@@ -28,7 +28,6 @@
*/
#include "samd51.h"
-#include "md_bootloader.h"
/* Initialize segments */
extern uint32_t _sfixed;
@@ -496,6 +495,11 @@ __attribute__((section(".vectors"))) const DeviceVectors exception_table = {
#endif
};
+// WARNING: These are only for CTRL bootloader release "v2.18Jun 22 2018 17:28:08" for bootloader_jump support
+extern uint32_t _eram;
+#define BOOTLOADER_MAGIC 0x3B9ACA00
+#define MAGIC_ADDR (uint32_t *)((intptr_t)(&_eram) - 4)
+
/**
* \brief This is the code that gets called on processor reset.
* To initialize the device, and call the main() routine.
diff --git a/tmk_core/protocol/arm_atsam/usb/udc.c b/tmk_core/protocol/arm_atsam/usb/udc.c
index d04e9b7b28..1f0c0d95d6 100644
--- a/tmk_core/protocol/arm_atsam/usb/udc.c
+++ b/tmk_core/protocol/arm_atsam/usb/udc.c
@@ -51,7 +51,8 @@
#include "udi_device_conf.h"
#include "udi.h"
#include "udc.h"
-#include "md_bootloader.h"
+
+#define BOOTLOADER_SERIAL_MAX_SIZE 20 // DO NOT MODIFY!
/**
* \ingroup udc_group
@@ -122,6 +123,8 @@ static uint8_t udc_string_product_name[] = USB_DEVICE_PRODUCT_NAME;
# define USB_DEVICE_SERIAL_NAME_SIZE 0
#endif
+extern uint32_t _srom;
+
uint8_t usb_device_serial_name_size = 0;
#if defined USB_DEVICE_SERIAL_USE_BOOTLOADER_SERIAL
uint8_t bootloader_serial_number[BOOTLOADER_SERIAL_MAX_SIZE + 1] = "";
diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c
index ac46a9312b..541c44b574 100644
--- a/tmk_core/protocol/chibios/usb_main.c
+++ b/tmk_core/protocol/chibios/usb_main.c
@@ -734,7 +734,7 @@ void init_usb_driver(USBDriver *usbp) {
* after a reset.
*/
usbDisconnectBus(usbp);
- wait_ms(1500);
+ wait_ms(50);
usbStart(usbp, &usbcfg);
usbConnectBus(usbp);
diff --git a/tmk_core/protocol/lufa/lufa.c b/tmk_core/protocol/lufa/lufa.c
index e3be96d93d..b9c2616058 100644
--- a/tmk_core/protocol/lufa/lufa.c
+++ b/tmk_core/protocol/lufa/lufa.c
@@ -69,8 +69,8 @@ extern keymap_config_t keymap_config;
# include "outputselect.h"
# ifdef MODULE_ADAFRUIT_BLE
# include "adafruit_ble.h"
-# else
-# include "../serial.h"
+# elif MODULE_RN42
+# include "rn42.h"
# endif
#endif
@@ -90,46 +90,6 @@ extern keymap_config_t keymap_config;
# include "joystick.h"
#endif
-// https://cdn.sparkfun.com/datasheets/Wireless/Bluetooth/bluetooth_cr_UG-v1.0r.pdf#G7.663734
-static inline uint16_t CONSUMER2RN42(uint16_t usage) {
- switch (usage) {
- case AC_HOME:
- return 0x0001;
- case AL_EMAIL:
- return 0x0002;
- case AC_SEARCH:
- return 0x0004;
- case AL_KEYBOARD_LAYOUT:
- return 0x0008;
- case AUDIO_VOL_UP:
- return 0x0010;
- case AUDIO_VOL_DOWN:
- return 0x0020;
- case AUDIO_MUTE:
- return 0x0040;
- case TRANSPORT_PLAY_PAUSE:
- return 0x0080;
- case TRANSPORT_NEXT_TRACK:
- return 0x0100;
- case TRANSPORT_PREV_TRACK:
- return 0x0200;
- case TRANSPORT_STOP:
- return 0x0400;
- case TRANSPORT_EJECT:
- return 0x0800;
- case TRANSPORT_FAST_FORWARD:
- return 0x1000;
- case TRANSPORT_REWIND:
- return 0x2000;
- case TRANSPORT_STOP_EJECT:
- return 0x4000;
- case AL_LOCAL_BROWSER:
- return 0x8000;
- default:
- return 0;
- }
-}
-
uint8_t keyboard_idle = 0;
/* 0: Boot Protocol, 1: Report Protocol(default) */
uint8_t keyboard_protocol = 1;
@@ -688,14 +648,7 @@ static void send_keyboard(report_keyboard_t *report) {
# ifdef MODULE_ADAFRUIT_BLE
adafruit_ble_send_keys(report->mods, report->keys, sizeof(report->keys));
# elif MODULE_RN42
- serial_send(0xFD);
- serial_send(0x09);
- serial_send(0x01);
- serial_send(report->mods);
- serial_send(report->reserved);
- for (uint8_t i = 0; i < KEYBOARD_REPORT_KEYS; i++) {
- serial_send(report->keys[i]);
- }
+ rn42_send_keyboard(report);
# endif
return;
}
@@ -741,16 +694,8 @@ static void send_mouse(report_mouse_t *report) {
# ifdef MODULE_ADAFRUIT_BLE
// FIXME: mouse buttons
adafruit_ble_send_mouse_move(report->x, report->y, report->v, report->h, report->buttons);
-# else
- serial_send(0xFD);
- serial_send(0x00);
- serial_send(0x03);
- serial_send(report->buttons);
- serial_send(report->x);
- serial_send(report->y);
- serial_send(report->v); // should try sending the wheel v here
- serial_send(report->h); // should try sending the wheel h here
- serial_send(0x00);
+# elif MODULE_RN42
+ rn42_send_mouse(report);
# endif
return;
}
@@ -821,15 +766,7 @@ static void send_consumer(uint16_t data) {
# ifdef MODULE_ADAFRUIT_BLE
adafruit_ble_send_consumer_key(data);
# elif MODULE_RN42
- static uint16_t last_data = 0;
- if (data == last_data) return;
- last_data = data;
- uint16_t bitmap = CONSUMER2RN42(data);
- serial_send(0xFD);
- serial_send(0x03);
- serial_send(0x03);
- serial_send(bitmap & 0xFF);
- serial_send((bitmap >> 8) & 0xFF);
+ rn42_send_consumer(data);
# endif
return;
}
@@ -1077,7 +1014,7 @@ void protocol_pre_init(void) {
sei();
#if defined(MODULE_RN42)
- serial_init();
+ rn42_init();
#endif
/* wait for USB startup & debug output */
diff --git a/tmk_core/protocol/usb_descriptor.c b/tmk_core/protocol/usb_descriptor.c
index a43755f899..0b992ba6c5 100644
--- a/tmk_core/protocol/usb_descriptor.c
+++ b/tmk_core/protocol/usb_descriptor.c
@@ -450,7 +450,7 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = {
#endif
#ifndef USB_POLLING_INTERVAL_MS
-# define USB_POLLING_INTERVAL_MS 10
+# define USB_POLLING_INTERVAL_MS 1
#endif
/*
diff --git a/tmk_core/protocol/vusb/vusb.c b/tmk_core/protocol/vusb/vusb.c
index bd0f1c21aa..8bdcccc9c9 100644
--- a/tmk_core/protocol/vusb/vusb.c
+++ b/tmk_core/protocol/vusb/vusb.c
@@ -647,7 +647,6 @@ const PROGMEM uchar console_hid_report[] = {
# define USB_MAX_POWER_CONSUMPTION 500
#endif
-// TODO: change this to 10ms to match LUFA
#ifndef USB_POLLING_INTERVAL_MS
# define USB_POLLING_INTERVAL_MS 1
#endif
diff --git a/users/cedrikl/cedrikl.c b/users/cedrikl/cedrikl.c
new file mode 100644
index 0000000000..0479e22b5d
--- /dev/null
+++ b/users/cedrikl/cedrikl.c
@@ -0,0 +1,36 @@
+/* Copyright 2021 Cedrik Lussier @cedrikl
+.* Directly inspired from the work of jonavin https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/ansi/keymaps/jonavin
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#include QMK_KEYBOARD_H
+#include "cedrikl.h"
+
+// Turn on/off NUM LOCK if current state is different
+void activate_numlock(bool turn_on) {
+ if (host_keyboard_led_state().num_lock != turn_on) {
+ tap_code(KC_NUMLOCK);
+ }
+}
+
+
+// INITIAL STARTUP
+
+void keyboard_post_init_user(void) {
+ #ifdef STARTUP_NUMLOCK_ON
+ activate_numlock(true); // turn on Num lock by default so that the numpad layer always has predictable results
+ #endif // STARTUP_NUMLOC_ON
+}
diff --git a/users/cedrikl/cedrikl.h b/users/cedrikl/cedrikl.h
new file mode 100644
index 0000000000..e25d274664
--- /dev/null
+++ b/users/cedrikl/cedrikl.h
@@ -0,0 +1,21 @@
+/* Copyright 2021 Cedrik Lussier @cedrikl
+.* Directly inspired from the work of jonavin https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/ansi/keymaps/jonavin
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General 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
+
+// OTHER FUNCTION PROTOTYPE
+void activate_numlock(bool turn_on);
diff --git a/users/cedrikl/config.h b/users/cedrikl/config.h
new file mode 100644
index 0000000000..741a2fe470
--- /dev/null
+++ b/users/cedrikl/config.h
@@ -0,0 +1,25 @@
+/* Copyright 2021 Cedrik Lussier @cedrikl
+.* Directly inspired from the work of jonavin https://github.com/qmk/qmk_firmware/tree/master/keyboards/gmmk/pro/ansi/keymaps/jonavin
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#ifdef RGB_MATRIX_ENABLE
+ #define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_COLOR
+ //#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_ALL
+ #define RGB_DISABLE_WHEN_USB_SUSPENDED
+ #define RGB_MATRIX_STARTUP_VAL 120
+#endif
diff --git a/users/cedrikl/rules.mk b/users/cedrikl/rules.mk
new file mode 100644
index 0000000000..b5ee62c43a
--- /dev/null
+++ b/users/cedrikl/rules.mk
@@ -0,0 +1,4 @@
+SRC += cedrikl.c
+ifeq ($(strip $(STARTUP_NUMLOCK_ON)), yes)
+ OPT_DEFS += -DSTARTUP_NUMLOCK_ON
+endif
diff --git a/users/drashna/oled/oled_stuff.c b/users/drashna/oled/oled_stuff.c
index de84766725..26411305e7 100644
--- a/users/drashna/oled/oled_stuff.c
+++ b/users/drashna/oled/oled_stuff.c
@@ -341,9 +341,8 @@ void render_wpm(uint8_t padding) {
#endif
}
-#if defined(KEYBOARD_handwired_tractyl_manuform) || defined(KEYBOARD_bastardkb_charybdis)
-extern kb_config_data_t kb_config;
-void render_pointing_dpi_status(uint8_t padding) {
+#if defined(POINTING_DEVICE_ENABLE)
+void render_pointing_dpi_status(uint16_t cpi, uint8_t padding) {
oled_write_P(PSTR("CPI:"), false);
if (padding) {
for (uint8_t n = padding - 1; n > 0; n--) {
@@ -351,7 +350,7 @@ void render_pointing_dpi_status(uint8_t padding) {
}
}
- oled_write(get_u16_str(kb_config.device_cpi, ' '), false);
+ oled_write(get_u16_str(cpi, ' '), false);
}
#endif
@@ -374,8 +373,10 @@ __attribute__((weak)) void oled_driver_render_logo_left(void) {
render_wpm(0);
# endif
oled_write_P(PSTR(" "), false);
-# if defined(KEYBOARD_handwired_tractyl_manuform) || defined(KEYBOARD_bastardkb_charybdis)
- render_pointing_dpi_status(1);
+# if defined(KEYBOARD_handwired_tractyl_manuform)
+ render_pointing_dpi_status(kb_config_data.device_cpi, 1);
+# elif defined(KEYBOARD_bastardkb_charybdis)
+ render_pointing_dpi_status(, 1);
# endif
oled_set_cursor(0, 4);
#else
diff --git a/users/drashna/oled/oled_stuff.h b/users/drashna/oled/oled_stuff.h
index 8795684d6a..fd64b50874 100644
--- a/users/drashna/oled/oled_stuff.h
+++ b/users/drashna/oled/oled_stuff.h
@@ -33,7 +33,7 @@ void render_bootmagic_status(void);
void render_user_status(void);
void oled_driver_render_logo(void);
void render_wpm(uint8_t padding);
-void render_pointing_dpi_status(uint8_t padding);
+void render_pointing_dpi_status(uint16_t cpi, uint8_t padding);
void oled_driver_render_logo_left(void);
void oled_driver_render_logo_right(void);
diff --git a/users/vitoni/readme.adoc b/users/vitoni/readme.adoc
new file mode 100644
index 0000000000..acf65793d2
--- /dev/null
+++ b/users/vitoni/readme.adoc
@@ -0,0 +1,16 @@
+= User functions
+
+Functions are mostly related to changing the RGB lights depending on user interaction and when idling.
+
+== utils.h
+
+Common functions are declared in link:utils.h[]. These function are not directly RGB related but used to modify state and calculate values.
+
+== rgb_matrix_effects.h
+
+Functions in link:rgb_matrix_effects.h[] make use of common function in `utils.h` and are used to create to RGB matrix effects such as fading or breathing.
+
+== vitoni.h
+
+The functions declared in link:vitoni.h[] are used as entry points for usage of RGB effects.
+One entry point is `matrix_scan` based for regular task while the other is `process_record` based for user activity tasks.
diff --git a/users/vitoni/rgb_matrix_effects.c b/users/vitoni/rgb_matrix_effects.c
new file mode 100644
index 0000000000..3a13e99bc7
--- /dev/null
+++ b/users/vitoni/rgb_matrix_effects.c
@@ -0,0 +1,236 @@
+// Copyright 2021 Victor Toni (@vitoni)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "rgb_matrix_effects.h"
+
+#include <rgb_matrix.h>
+#include <lib/lib8tion/lib8tion.h>
+
+#include "utils.h"
+
+/*
+ Offset used to start at the right point in th curve to avoid big jumps in brightness
+ 0 => 0% (signed) => 50% (unsigned)
+ 64 => 100% (signed) => 100% (unsigned)
+ 128 => 0% (signed) => 50% (unsigned)
+ 192 => -100% (signed) => 0% (unsigned)
+*/
+enum PHASE {
+ PHASE_ZERO_RAISING
+ ,PHASE_HIGH
+ ,PHASE_ZERO_FALLING
+ ,PHASE_LOW
+};
+
+/**
+ * @brief Calculates the offset so that a specific time is aligned to a specific point in the sine curve.
+ * @param[in] time The time for which the offset shopuld be calculated.
+ * @param[in] phase Phase which should be reached with the offset
+ * @see PHASE
+ */
+uint8_t offset_for_time(const uint8_t time, const uint8_t phase) {
+ switch (phase) {
+ case PHASE_ZERO_RAISING:
+ return 0 - time;
+ case PHASE_HIGH:
+ return 64 - time;
+ case PHASE_ZERO_FALLING:
+ return 128 - time;
+ case PHASE_LOW:
+ return 192 - time;
+ default:
+ return 0;
+ }
+}
+
+/**
+ * @brief Scales down `g_rgb_timer` so that it can be used for RGB effects.
+ * @return scaled down timer
+ * @see rgb_time_2_scale_w_factor()
+ */
+uint8_t rgb_time_2_scale(void) {
+ static const uint8_t factor = 1;
+ return rgb_time_2_scale_w_factor(factor);
+}
+
+/*
+ * Used to slow down RGB speed.
+ */
+static const uint8_t rgb_speed_divisor = 8;
+
+/**
+ * @brief Scales down `g_rgb_timer` so that it can be used for RGB effects.
+ * @details Usually these calculations aredone internally by some RGB effects.
+ This method exposed to scaling so that all effects to have same timebase. If `rgb_matrix_config.speed` all effects are affected the same.
+ * @param[in] factor The factor can be used to speed up some operations in relation to others.
+ * @return scaled down timer taking into account the given factor
+ * @see g_rgb_timer
+ * @see rgb_matrix_config.speed
+ */
+uint8_t rgb_time_2_scale_w_factor(const uint8_t rgb_speed_factor) {
+ const uint8_t scaled_time = scale16by8(g_rgb_timer, rgb_matrix_config.speed * rgb_speed_factor / rgb_speed_divisor);
+
+ return scaled_time;
+}
+
+/**
+ * @brief Inverse function to calculate time required to execute `timer` steps.
+ * @details This method allows calculation of the time needed to execute N `timer`steps.
+ Usefull when using a scaled down time but requiring the time needed to perform these steps.
+ * @param[in] scaled_time scaled down timer to inverse to time
+ * @return time corresponding to scaled down time
+ * @see rgb_time_2_scale()
+ */
+uint16_t scale_2_rgb_time(const uint8_t scaled_time) {
+ const uint16_t time = scaled_time * rgb_speed_divisor * UINT8_MAX / rgb_matrix_config.speed;
+
+ return time;
+}
+
+bool fade_in_ranged(const uint8_t time, const uint8_t range_min, const uint8_t range_max) {
+ static const uint8_t max_delta = 1;
+ return scaled_sin_up(time, range_min, range_max, max_delta, &(rgb_matrix_config.hsv.v));
+}
+
+bool fade_out_ranged(const uint8_t time, const uint8_t range_min, const uint8_t range_max) {
+ static const uint8_t max_delta = 1;
+ return scaled_sin_down(time, range_min, range_max, max_delta, &(rgb_matrix_config.hsv.v));
+}
+
+/**
+ * @brief Convenience method to eventually skip the value part when setting HSV.
+ * @details When setting HSV this includes the value/brightness.
+ As changing brightness might interfer with fading or breathing effects,
+ this method can skip the value part of HSV (depending on the preprocessor flag: RGB_FADE_IN).
+ * @param[in] hue Hue
+ * @param[in] sat Saturation
+ * @param[in] hue Value (brightness)
+ * @see rgb_matrix_sethsv_noeeprom()
+ */
+void rgb_matrix_sethsv_noeeprom_user(const uint16_t hue, const uint8_t sat, const uint8_t val) {
+#if defined(RGB_FADE_IN) || defined(RGB_IDLE_TIMEOUT)
+ rgb_matrix_config.hsv.h = hue;
+ rgb_matrix_config.hsv.s = sat;
+ // omitting setting the value to avoid interfering with effects
+// rgb_matrix_config.hsv.v = val;
+#else
+ rgb_matrix_sethsv_noeeprom(hue, sat, val);
+#endif
+}
+
+#if defined(RGB_FADE_IN) || defined(RGB_IDLE_TIMEOUT)
+/**
+ * @brief Calculates the time offset required by fade in.
+ * @details Using an arbitrary timer any point on the sine curve might be pointed to.
+ * The offest is calculated so that
+ * a) the point is at the lowest point in the curve and the curve is raising
+ * b) the point is near the current brightness (eg. fade in might be called while fading out and the lowest value has not yet been reached).
+ * @param[in] time Current time usually represented by (usually scaled) timer
+ * @return Offset required so that time matches the current brightness
+ */
+uint8_t calc_fade_in_offset(const uint8_t time) {
+ static const uint8_t max_steps = UINT8_MAX/2;
+ static const uint8_t range_min = 0;
+ static const uint8_t range_max = RGB_MATRIX_MAXIMUM_BRIGHTNESS;
+
+ // start at the right point in the sine curve
+ uint8_t time_offset = offset_for_time(time, PHASE_LOW);
+
+ // find the right offset to match the current brightness
+ for (int i = 1; i < max_steps; i++) {
+ const uint8_t value = scaled_sin(time + time_offset + 1, range_min, range_max);
+ if (in_range(value, range_min, range_max) && value < rgb_matrix_config.hsv.v) {
+ time_offset++;
+ } else {
+ break;
+ }
+ }
+
+ return time_offset;
+}
+
+/**
+ * @brief Increases value/brightness until reaching RGB_MATRIX_MAXIMUM_BRIGHTNESS based on given timer.
+ * @param[in] time A (usually scaled) timer
+ * @return Returns `true` if RGB_MATRIX_MAXIMUM_BRIGHTNESS has been reached, `false` otherwise.
+ */
+bool fade_in(const uint8_t time) {
+ static const uint8_t range_min = 0;
+ static const uint8_t range_max = RGB_MATRIX_MAXIMUM_BRIGHTNESS;
+
+ return fade_in_ranged(time, range_min, range_max);
+}
+#endif
+
+#if defined(RGB_DISABLE_WITH_FADE_OUT) || defined(RGB_IDLE_TIMEOUT)
+/**
+ * @brief Calculates the time offset required by fade out.
+ * @details Using an arbitrary timer any point on the Sinus curve might be pointed to.
+ * The offest is calculated so that
+ * a) the point is at the highest point in the curve and the curve is failing
+ * b) the point is near the current brightness (eg. fade out might be called while on breath effect).
+ * @param[in] time Current time usually represented by a(usually scaled) timer
+ * @return Offset required so that time matches the current brightness
+ */
+uint8_t calc_fade_out_offset(const uint8_t time) {
+ static const uint8_t range_min = 0;
+ static const uint8_t range_max = RGB_MATRIX_MAXIMUM_BRIGHTNESS;
+
+ // start at the right point in the sin() curve
+ uint8_t time_offset = offset_for_time(time, PHASE_HIGH);
+
+ // find the right offset to match the current brightness
+ for (int i = 1; i < 127; i++) {
+ const uint8_t value = scaled_sin(time + time_offset + 1, range_min, range_max);
+ if (in_range(value, range_min, range_max) && rgb_matrix_config.hsv.v < value) {
+ time_offset++;
+ } else {
+ break;
+ }
+ }
+
+ return time_offset;
+}
+#endif
+
+#if defined(RGB_DISABLE_WITH_FADE_OUT)
+/**
+ * @brief Decreases value/brightness until reaching 0 based on given timer.
+ * @param[in] time A (usually scaled) timer
+ * @return Returns `true` if 0 has been reached, `false` otherwise.
+ */
+bool fade_out(const uint8_t time) {
+ static const uint8_t range_min = 0;
+ static const uint8_t range_max = RGB_MATRIX_MAXIMUM_BRIGHTNESS;
+
+ return fade_out_ranged(time, range_min, range_max);
+}
+#endif
+
+#if defined(RGB_IDLE_TIMEOUT)
+/**
+ * @brief Decreases value/brightness until reaching `RGB_IDLE_MINIMUM_BRIGHTNESS` based on given timer.
+ * @param[in] time A (usually scaled) timer
+ * @return Returns `true` if `RGB_IDLE_MINIMUM_BRIGHTNESS` has been reached, `false` otherwise.
+ */
+bool idle_fade_out(const uint8_t time) {
+ static const uint8_t range_min = RGB_IDLE_MINIMUM_BRIGHTNESS;
+ static const uint8_t range_max = RGB_MATRIX_MAXIMUM_BRIGHTNESS;
+
+ return fade_out_ranged(time, range_min, range_max);
+}
+
+#if defined(RGB_IDLE_BREATHE)
+/**
+ * @brief Changes value/brightness to create a breathing effect based on given timer.
+ * @details Brightness will breathe in the range starting from `RGB_IDLE_MINIMUM_BRIGHTNESS` to `RGB_IDLE_MAXIMUM_BRIGHTNESS`.
+ * @param[in] time A (usually scaled) timer
+ */
+void idle_breathe(const uint8_t time) {
+ static const uint8_t range_min = RGB_IDLE_MINIMUM_BRIGHTNESS;
+ static const uint8_t range_max = RGB_IDLE_MAXIMUM_BRIGHTNESS;
+
+ rgb_matrix_config.hsv.v = scaled_sin(time, range_min, range_max);
+}
+#endif // RGB_IDLE_BREATHE
+#endif // RGB_IDLE_TIMEOUT
diff --git a/users/vitoni/rgb_matrix_effects.h b/users/vitoni/rgb_matrix_effects.h
new file mode 100644
index 0000000000..ed74500b18
--- /dev/null
+++ b/users/vitoni/rgb_matrix_effects.h
@@ -0,0 +1,174 @@
+// Copyright 2021 Victor Toni (@vitoni)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+
+/**
+ * States reflecting the state of the keyboard.
+ * Dependeing on these states various effects can set for the RGB matrix.
+ */
+enum states {
+ REGULAR //!< when in regular use
+#if defined(RGB_IDLE_TIMEOUT)
+ ,IDLE_FADE_OUT //!< when started idling
+ ,IDLE //!< when idling
+#endif
+#if defined(RGB_FADE_IN) || defined(RGB_IDLE_TIMEOUT)
+ ,FADE_IN //!< when starting initially or before going back to REGULAR
+#endif
+#if defined(RGB_DISABLE_WITH_FADE_OUT)
+ ,FADE_OUT //!< before supending
+#endif
+ ,SUSPENDED //!< expecting to be suspended by RGB_DISABLE_TIMEOUT any time
+};
+
+/**
+ * @brief Scales down `g_rgb_timer` so that it can be used for RGB effects.
+ * @details Usually these calculations aredone internally by some RGB effects.
+ This method exposed to scaling so that all effects to have same timebase. If `rgb_matrix_config.speed` all effects are affected the same.
+ * @param[in] factor The factor can be used to speed up some operations in relation to others.
+ * @return scaled down timer taking into account the given factor
+ * @see g_rgb_timer
+ * @see rgb_matrix_config.speed
+ */
+uint8_t rgb_time_2_scale_w_factor(const uint8_t factor);
+
+/**
+ * @brief Scales down `g_rgb_timer` so that it can be used for RGB effects.
+ * @return scaled down timer
+ * @see rgb_time_2_scale_w_factor()
+ */
+uint8_t rgb_time_2_scale(void);
+
+/**
+ * @brief Inverse function to calculate time required to execute `timer` steps.
+ * @details This method allows calculation of the time needed to execute N `timer`steps.
+ Usefull when using a scaled down time but requiring the time needed to perform these steps.
+ * @param[in] scaled_time scaled down timer to inverse to time
+ * @return time corresponding to scaled down time
+ * @see rgb_time_2_scale()
+ */
+uint16_t scale_2_rgb_time(const uint8_t scaled_time);
+
+/**
+ * @brief Convenience method to eventually skip the value part when setting HSV.
+ * @details When setting HSV this includes the value/brightness.
+ As changing brightness might interfer with fading or breathing effects,
+ this method can skip the value part of HSV (depending on the preprocessor flag: RGB_FADE_IN).
+ * @param[in] hue Hue
+ * @param[in] sat Saturation
+ * @param[in] hue Value (brightness)
+ * @see rgb_matrix_sethsv_noeeprom()
+ */
+void rgb_matrix_sethsv_noeeprom_user(const uint16_t hue, const uint8_t sat, const uint8_t val);
+
+#if defined(RGB_FADE_IN) || defined(RGB_DISABLE_WITH_FADE_OUT) || defined(RGB_IDLE_TIMEOUT)
+# if defined(RGB_MATRIX_MAXIMUM_BRIGHTNESS)
+# if (RGB_MATRIX_MAXIMUM_BRIGHTNESS) < 1
+# error "RGB_MATRIX_MAXIMUM_BRIGHTNESS must not be less than ONE"
+# endif
+# if UINT8_MAX < (RGB_MATRIX_MAXIMUM_BRIGHTNESS)
+# error "RGB_MATRIX_MAXIMUM_BRIGHTNESS must not be larger than UINT8_MAX"
+# endif
+# else
+# define RGB_MATRIX_MAXIMUM_BRIGHTNESS 200
+# endif
+#endif
+
+#if defined(RGB_FADE_IN) || defined(RGB_IDLE_TIMEOUT)
+/**
+ * @brief Calculates the time offset required by fade in.
+ * @details Using an arbitrary timer any point on the sine curve might be pointed to.
+ * The offset is calculated so that
+ * a) the point is at the lowest point in the curve and the curve is raising
+ * b) the point is near the current brightness (eg. fade in might be called while fading out and the lowest value has not yet been reached).
+ * @param[in] time Current time usually represented by a(usually scaled) timer
+ * @return Offset required so that time matches the current brightness
+ */
+uint8_t calc_fade_in_offset(const uint8_t time);
+
+/**
+ * @brief Increases value/brightness until reaching RGB_MATRIX_MAXIMUM_BRIGHTNESS based on given timer.
+ * @param[in] time A (usually scaled) timer
+ * @return Returns `true` if RGB_MATRIX_MAXIMUM_BRIGHTNESS has been reached, `false` otherwise.
+ */
+bool fade_in(const uint8_t time);
+#endif
+
+#if defined(RGB_DISABLE_WITH_FADE_OUT)
+# if !defined(RGB_DISABLE_TIMEOUT)
+# warning "RGB_DISABLE_WITH_FADE_OUT expects RGB_DISABLE_TIMEOUT to be defined"
+# endif
+#endif
+
+#if defined(RGB_DISABLE_WITH_FADE_OUT) || defined(RGB_IDLE_TIMEOUT)
+/**
+ * @brief Calculates the time offset required by fade out.
+ * @details Using an arbitrary timer any point on the Sinus curve might be pointed to.
+ * The offest is calculated so that
+ * a) the point is at the highest point in the curve and the curve is failing
+ * b) the point is near the current brightness (eg. fade out might be called while on breath effect).
+ * @param[in] time Current time usually represented by a(usually scaled) timer
+ * @return Offset required so that time matches the current brightness
+ */
+uint8_t calc_fade_out_offset(const uint8_t time);
+#endif
+
+#if defined(RGB_DISABLE_WITH_FADE_OUT)
+/**
+ * @brief Decreases value/brightness until reaching 0 based on given timer.
+ * @param[in] time A (usually scaled) timer
+ * @return Returns `true` if 0 has been reached, `false` otherwise.
+ */
+bool fade_out(const uint8_t time);
+#endif
+
+#if defined(RGB_IDLE_TIMEOUT)
+# if RGB_IDLE_TIMEOUT < 0
+# error "RGB_IDLE_TIMEOUT must not be less than ZERO"
+# endif
+# if !defined(RGB_IDLE_MINIMUM_BRIGHTNESS)
+ // minimum brightness when idling
+# define RGB_IDLE_MINIMUM_BRIGHTNESS (RGB_MATRIX_MAXIMUM_BRIGHTNESS/5)
+# endif
+# if RGB_IDLE_MINIMUM_BRIGHTNESS < 0
+# error "RGB_IDLE_MINIMUM_BRIGHTNESS must not be less than ZERO"
+# endif // RGB_IDLE_MINIMUM_BRIGHTNESS < 0
+# if RGB_MATRIX_MAXIMUM_BRIGHTNESS <= RGB_IDLE_MINIMUM_BRIGHTNESS
+# error "RGB_IDLE_MINIMUM_BRIGHTNESS must be less than RGB_MATRIX_MAXIMUM_BRIGHTNESS"
+# endif // RGB_MATRIX_MAXIMUM_BRIGHTNESS <= RGB_IDLE_MINIMUM_BRIGHTNESS
+
+/**
+ * @brief Decreases value/brightness until reaching `RGB_IDLE_MINIMUM_BRIGHTNESS` based on given timer.
+ * @param[in] time A (usually scaled) timer
+ * @return Returns `true` if `RGB_IDLE_MINIMUM_BRIGHTNESS` has been reached, `false` otherwise.
+ */
+bool idle_fade_out(const uint8_t time);
+
+#if defined(RGB_IDLE_BREATHE)
+# if !defined(RGB_IDLE_MAXIMUM_BRIGHTNESS)
+ // maximum brightness when idling
+# define RGB_IDLE_MAXIMUM_BRIGHTNESS (RGB_MATRIX_MAXIMUM_BRIGHTNESS*3/5)
+# endif
+# if !(0 <= RGB_IDLE_MAXIMUM_BRIGHTNESS)
+# error "RGB_IDLE_MINIMUM_BRIGHTNESS must not be less than ZERO, was: " RGB_IDLE_MAXIMUM_BRIGHTNESS
+# endif // RGB_IDLE_MAXIMUM_BRIGHTNESS < 0
+# if !(RGB_IDLE_MINIMUM_BRIGHTNESS < RGB_IDLE_MAXIMUM_BRIGHTNESS)
+# error "RGB_IDLE_MINIMUM_BRIGHTNESS must be less than RGB_IDLE_MAXIMUM_BRIGHTNESS"
+# endif // RGB_IDLE_MAXIMUM_BRIGHTNESS <= RGB_IDLE_MINIMUM_BRIGHTNESS
+# if !(RGB_IDLE_MAXIMUM_BRIGHTNESS <= RGB_MATRIX_MAXIMUM_BRIGHTNESS)
+# error "RGB_IDLE_MAXIMUM_BRIGHTNESS must be less than or equal to RGB_MATRIX_MAXIMUM_BRIGHTNESS"
+# endif // RGB_MATRIX_MAXIMUM_BRIGHTNESS <= RGB_IDLE_MAXIMUM_BRIGHTNESS
+
+/**
+ * @brief Changes value/brightness to create a breathing effect based on given timer.
+ * @details Brightness will breathe in the range starting from `RGB_IDLE_MINIMUM_BRIGHTNESS` to `RGB_IDLE_MAXIMUM_BRIGHTNESS`.
+ * @param[in] time A (usually scaled) timer
+ */
+void idle_breathe(const uint8_t time);
+#endif // RGB_IDLE_BREATHE
+
+#endif // RGB_IDLE_TIMEOUT
diff --git a/users/vitoni/rules.mk b/users/vitoni/rules.mk
new file mode 100644
index 0000000000..2f3b0d15e5
--- /dev/null
+++ b/users/vitoni/rules.mk
@@ -0,0 +1,4 @@
+SRC += \
+ vitoni.c \
+ utils.c \
+ rgb_matrix_effects.c
diff --git a/users/vitoni/utils.c b/users/vitoni/utils.c
new file mode 100644
index 0000000000..fb011570e4
--- /dev/null
+++ b/users/vitoni/utils.c
@@ -0,0 +1,129 @@
+// Copyright 2021 Victor Toni (@vitoni)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "utils.h"
+
+#include <lib/lib8tion/lib8tion.h>
+
+/**
+* @brief Changes `*value` to `new_value`.
+* @param[in,out] value Pointer to variable to be changed.
+* @param[in] new_value Value to be changed.
+* @param[in,out] changed Flag indicating `*value` and `new_value` were different.
+*/
+void update_value(uint8_t *value, const uint8_t new_value, bool *changed) {
+ if (new_value != (*value)) {
+ (*changed) = true;
+ (*value) = new_value;
+ }
+}
+
+/**
+* @brief Checks whether a value is in the given range.
+* @param[in] value Value to be checked.
+* @param[in] range_min Lower bound of range (inclusive).
+* @param[in] range_max Upper bound of range (inclusive).
+* @return `true` if (range_min <= value <= range_max), `false` otherwise
+*/
+bool in_range(const uint8_t value, const uint8_t range_min, const uint8_t range_max) {
+ return range_min <= value && value <= range_max;
+}
+
+/**
+* @brief Calculates the sine value based on sin8() and scales it to the given range (unsigned).
+*
+* Table of values for unscaled sin8() eg. a theta of 0 results to 128 and a theta of 255 (240+15) results to 125.
+ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+ +----------------------------------------------------------------
+ 0: 128 131 134 137 140 143 146 149 152 155 158 161 164 167 170 173
+ 16: 177 179 182 184 187 189 192 194 197 200 202 205 207 210 212 215
+ 32: 218 219 221 223 224 226 228 229 231 233 234 236 238 239 241 243
+ 48: 245 245 246 246 247 248 248 249 250 250 251 251 252 253 253 254
+ 64: 255 254 253 253 252 251 251 250 250 249 248 248 247 246 246 245
+ 80: 245 243 241 239 238 236 234 233 231 229 228 226 224 223 221 219
+ 96: 218 215 212 210 207 205 202 200 197 194 192 189 187 184 182 179
+ 112: 177 173 170 167 164 161 158 155 152 149 146 143 140 137 134 131
+ 128: 128 125 122 119 116 113 110 107 104 101 98 95 92 89 86 83
+ 144: 79 77 74 72 69 67 64 62 59 56 54 51 49 46 44 41
+ 160: 38 37 35 33 32 30 28 27 25 23 22 20 18 17 15 13
+ 176: 11 11 10 10 9 8 8 7 6 6 5 5 4 3 3 2
+ 192: 1 2 3 3 4 5 5 6 6 7 8 8 9 10 10 11
+ 208: 11 13 15 17 18 20 22 23 25 27 28 30 32 33 35 37
+ 224: 38 41 44 46 49 51 54 56 59 62 64 67 69 72 74 77
+ 240: 79 83 86 89 92 95 98 101 104 107 110 113 116 119 122 125
+*
+* @param[in] theta Angle (a full circle mapped to 0-255) used as input for sine calculation.
+* @param[in] range_min Lower bound of range (inclusive).
+* @param[in] range_max Upper bound of range (inclusive).
+* @return Calculated sine value mapped to the given range.
+*/
+uint8_t scaled_sin(const uint8_t theta, const uint8_t range_min, const uint8_t range_max) {
+ const uint8_t range = range_max - range_min;
+ return scale8(sin8(theta), range) + range_min;
+}
+
+/**
+* @brief Increases the given value until reaching range_max.
+* The increments occur following an upwards sine wave (scaled from range_min to range_max).
+* @param[in] theta Angle (a full circle mapped to 0-255) used as input for sine calculation.
+* @param[in] range_min Lower bound of range (inclusive).
+* @param[in] range_max Upper bound of range (inclusive).
+* @param[in] max_delta Maximum delta between value and range_max (due to values being integers and eventually not fully matching).
+* @param[in,out] value Reference of variable to be increased
+* @return `true` if value and range_max are within a delta of 3 (chosen by fair dice rolling), `false` otherwise
+* @see scaled_sin()
+*/
+bool scaled_sin_up(const uint8_t theta, const uint8_t range_min, const uint8_t range_max, const uint8_t max_delta, uint8_t *value) {
+ // ensure upper range bound
+ if (range_max <= (*value)) {
+ (*value) = range_max;
+ return true;
+ }
+
+ const uint8_t new_value = scaled_sin(theta, range_min, range_max);
+ if (in_range(new_value, range_min, range_max) && (*value) < new_value) {
+ (*value) = new_value;
+
+ return range_max == (*value);
+ }
+
+ const uint8_t delta = range_max - (*value);
+ if (delta <= max_delta) {
+ (*value) = range_max;
+ }
+
+ return delta <= max_delta;
+}
+
+/**
+* @brief Decreases the given value until reaching range_min.
+* The decrements occur following an downwards sinus wave (scaled from range_min to range_max).
+* @param[in] theta Angle (a full circle mapped to 0-255) used as input for sinus calculation.
+* @param[in] range_min Lower bound of range (inclusive).
+* @param[in] range_max Upper bound of range (inclusive).
+* @param[in] max_delta Maximum delta between value and range_min (due to values being integers and eventually not fully matching).
+* @param[in,out] value Reference of variable to be decreased
+* @return `true` if value and range_max are within a delta of 3 (chosen by fair dice rolling), `false` otherwise
+* @see scaled_sin()
+*/
+bool scaled_sin_down(const uint8_t theta, const uint8_t range_min, const uint8_t range_max, const uint8_t max_delta, uint8_t *value) {
+ // ensure lower range bound
+ if ((*value) <= range_min) {
+ (*value) = range_min;
+ return true;
+ }
+
+ const uint8_t new_value = scaled_sin(theta, range_min, range_max);
+ if (in_range(new_value, range_min, range_max) && new_value < (*value)) {
+ (*value) = new_value;
+
+ return range_min == (*value);
+ }
+
+ const uint8_t delta = (*value) - range_min;
+ if (delta <= max_delta) {
+ (*value) = range_min;
+ }
+
+ return delta <= max_delta;
+}
diff --git a/users/vitoni/utils.h b/users/vitoni/utils.h
new file mode 100644
index 0000000000..987b612d58
--- /dev/null
+++ b/users/vitoni/utils.h
@@ -0,0 +1,80 @@
+// Copyright 2021 Victor Toni (@vitoni)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+
+/**
+* @brief Changes `*value` to `new_value`.
+* @param[in,out] value Pointer to variable to be changed.
+* @param[in] new_value Value to be changed.
+* @param[in,out] changed Flag indicating `*value` and `new_value` were different.
+*/
+void update_value(uint8_t *value, const uint8_t new_value, bool *changed);
+
+/**
+* @brief Checks whether a value is in the given range.
+* @param[in] value Value to be checked.
+* @param[in] range_min Lower bound of range (inclusive).
+* @param[in] range_max Upper bound of range (inclusive).
+* @return `true` if (range_min <= value <= range_max), `false` otherwise
+*/
+bool in_range(const uint8_t value, const uint8_t range_min, const uint8_t range_max);
+
+/**
+* @brief Calculates the sine value based on sin8() and scales it to the given range (unsigned).
+*
+* Table of values for unscaled sin8() eg. a theta of 0 results to 128 and a theta of 255 (240+15) results to 125.
+ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+ +----------------------------------------------------------------
+ 0: 128 131 134 137 140 143 146 149 152 155 158 161 164 167 170 173
+ 16: 177 179 182 184 187 189 192 194 197 200 202 205 207 210 212 215
+ 32: 218 219 221 223 224 226 228 229 231 233 234 236 238 239 241 243
+ 48: 245 245 246 246 247 248 248 249 250 250 251 251 252 253 253 254
+ 64: 255 254 253 253 252 251 251 250 250 249 248 248 247 246 246 245
+ 80: 245 243 241 239 238 236 234 233 231 229 228 226 224 223 221 219
+ 96: 218 215 212 210 207 205 202 200 197 194 192 189 187 184 182 179
+ 112: 177 173 170 167 164 161 158 155 152 149 146 143 140 137 134 131
+ 128: 128 125 122 119 116 113 110 107 104 101 98 95 92 89 86 83
+ 144: 79 77 74 72 69 67 64 62 59 56 54 51 49 46 44 41
+ 160: 38 37 35 33 32 30 28 27 25 23 22 20 18 17 15 13
+ 176: 11 11 10 10 9 8 8 7 6 6 5 5 4 3 3 2
+ 192: 1 2 3 3 4 5 5 6 6 7 8 8 9 10 10 11
+ 208: 11 13 15 17 18 20 22 23 25 27 28 30 32 33 35 37
+ 224: 38 41 44 46 49 51 54 56 59 62 64 67 69 72 74 77
+ 240: 79 83 86 89 92 95 98 101 104 107 110 113 116 119 122 125
+*
+* @param[in] theta Angle (a full circle mapped to 0-255) used as input for sine calculation.
+* @param[in] range_min Lower bound of range (inclusive).
+* @param[in] range_max Upper bound of range (inclusive).
+* @return Calculated sine value mapped to the given range.
+*/
+uint8_t scaled_sin(const uint8_t theta, const uint8_t range_min, const uint8_t range_max);
+
+/**
+* @brief Increases the given value until reaching range_max.
+* The increments occur following an upwards sine wave (scaled from range_min to range_max).
+* @param[in] theta Angle (a full circle mapped to 0-255) used as input for sine calculation.
+* @param[in] range_min Lower bound of range (inclusive).
+* @param[in] range_max Upper bound of range (inclusive).
+* @param[in] max_delta Maximum delta between value and range_max (due to values being integers and eventually not fully matching).
+* @param[in,out] value Reference of variable to be increased
+* @return `true` if value and range_max are within a delta of 3 (chosen by fair dice rolling), `false` otherwise
+* @see scaled_sin()
+*/
+bool scaled_sin_up(const uint8_t thea, const uint8_t range_min, const uint8_t range_max, const uint8_t max_delta, uint8_t *value);
+
+/**
+* @brief Decreases the given value until reaching range_min.
+* The decrements occur following an downwards sinus wave (scaled from range_min to range_max).
+* @param[in] theta Angle (a full circle mapped to 0-255) used as input for sinus calculation.
+* @param[in] range_min Lower bound of range (inclusive).
+* @param[in] range_max Upper bound of range (inclusive).
+* @param[in] max_delta Maximum delta between value and range_min (due to values being integers and eventually not fully matching).
+* @param[in,out] value Reference of variable to be decreased
+* @return `true` if value and range_max are within a delta of 3 (chosen by fair dice rolling), `false` otherwise
+* @see scaled_sin()
+*/
+bool scaled_sin_down(const uint8_t theta, const uint8_t range_min, const uint8_t range_max, const uint8_t max_delta, uint8_t *value);
diff --git a/users/vitoni/vitoni.c b/users/vitoni/vitoni.c
new file mode 100644
index 0000000000..2a0ff5c46f
--- /dev/null
+++ b/users/vitoni/vitoni.c
@@ -0,0 +1,131 @@
+// Copyright 2021 Victor Toni (@vitoni)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "vitoni.h"
+
+#include <rgb_matrix.h>
+#include <lib/lib8tion/lib8tion.h>
+
+#include "rgb_matrix_effects.h"
+#include "utils.h"
+
+#if defined(RGB_FADE_IN) || defined(RGB_DISABLE_WITH_FADE_OUT) || defined(RGB_IDLE_TIMEOUT)
+static uint8_t state;
+
+// flag used to indicate that offset calculation is needed to adjust the timer,
+// so that it matches the index used for sine calculation
+static bool calc_offset;
+
+void matrix_scan_user_rgb(void) {
+#if defined(RGB_DISABLE_WITH_FADE_OUT) || defined(RGB_IDLE_TIMEOUT)
+ const uint8_t time = rgb_time_2_scale();
+#endif
+ static uint8_t time_offset;
+
+ const uint32_t inactivity_millis = last_input_activity_elapsed();
+
+#if defined(RGB_IDLE_TIMEOUT)
+ if (IDLE != state && RGB_IDLE_TIMEOUT <= inactivity_millis) {
+ update_value(&state, IDLE_FADE_OUT, &calc_offset);
+ }
+#endif
+#if defined(RGB_DISABLE_WITH_FADE_OUT)
+ const uint32_t fade_out_duration = scale_2_rgb_time(128);
+ const uint32_t start_fade_out_after_millis = (RGB_DISABLE_TIMEOUT) > fade_out_duration
+ ? (RGB_DISABLE_TIMEOUT) - fade_out_duration
+ : 0;
+
+ if (start_fade_out_after_millis <= inactivity_millis) {
+ update_value(&state, FADE_OUT, &calc_offset);
+ }
+#elif defined(RGB_DISABLE_TIMEOUT)
+ // having to set brightness "manually" to black as starting point for fade in
+ // for the time when returning from suspended state
+ if (RGB_DISABLE_TIMEOUT <= inactivity_millis + 15) {
+ rgb_matrix_config.hsv.v = 0;
+ state = SUSPENDED;
+ }
+#endif
+
+ switch(state) {
+#if defined(RGB_IDLE_TIMEOUT)
+ case IDLE_FADE_OUT:
+ if (calc_offset) {
+ time_offset = calc_fade_out_offset(time);
+
+ // resetting flag for subsequent calls
+ calc_offset = false;
+ }
+ if (idle_fade_out(time + time_offset)) {
+ update_value(&state, IDLE, &calc_offset);
+ }
+ break;
+ case IDLE:
+#if defined(RGB_IDLE_BREATHE)
+ if (calc_offset) {
+ // no need to calculate time_offset since we are aligned already due to IDLE_FADE_OUT
+ // resetting flag for subsequent calls
+ calc_offset = false;
+ }
+ idle_breathe(time + time_offset);
+#endif
+ break;
+#endif
+#if defined(RGB_DISABLE_WITH_FADE_OUT)
+ case FADE_OUT:
+ if (calc_offset) {
+ time_offset = calc_fade_out_offset(time);
+
+ // resetting flag for subsequent calls
+ calc_offset = false;
+ }
+ if (fade_out(time + time_offset)) {
+ update_value(&state, SUSPENDED, &calc_offset);
+ }
+ break;
+#endif
+#if defined(RGB_FADE_IN) || defined(RGB_IDLE_TIMEOUT)
+ case FADE_IN:
+ {
+ // since we want to be active, fade in should be faster than e.g. fading out
+ const uint8_t fade_in_time = rgb_time_2_scale_w_factor(4);
+ if (calc_offset) {
+ time_offset = calc_fade_in_offset(fade_in_time);
+
+ // resetting flag for subsequent calls
+ calc_offset = false;
+ }
+ if (fade_in(fade_in_time + time_offset)) {
+ update_value(&state, REGULAR, &calc_offset);
+ }
+ }
+ break;
+#endif
+ default:
+ break;
+ }
+}
+
+#if defined(RGB_FADE_IN) || defined(RGB_IDLE_TIMEOUT)
+bool process_record_user_rgb(const uint16_t keycode, const keyrecord_t *record) {
+ // if we are in a non regular state we might have faded out (eventually partially)
+ // so we restore brightness (to max as we don't keep track of manually changed brightness)
+ // if (REGULAR != state && FADE_IN != state) {
+ if (FADE_IN != state && REGULAR != state) {
+ update_value(&state, FADE_IN, &calc_offset);
+ }
+
+ return true; // Process all other keycodes normally
+}
+
+void suspend_wakeup_init_user(void) {
+ if (FADE_IN != state) {
+ // setting brightness to black as starting point for fade in
+ rgb_matrix_config.hsv.v = 0;
+
+ update_value(&state, FADE_IN, &calc_offset);
+ }
+}
+#endif // defined(RGB_FADE_IN)
+
+#endif // defined(RGB_FADE_IN) || defined(RGB_DISABLE_WITH_FADE_OUT)
diff --git a/users/vitoni/vitoni.h b/users/vitoni/vitoni.h
new file mode 100644
index 0000000000..1f26037135
--- /dev/null
+++ b/users/vitoni/vitoni.h
@@ -0,0 +1,30 @@
+// Copyright 2021 Victor Toni (@vitoni)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+
+#include <quantum/action.h>
+
+#include "rgb_matrix_effects.h"
+
+/**
+ * @brief Executes periodic tasks, eg. fading or checking for upcoming supend.
+ * @details Function declaration as weak as the implementation might "disappear" depending on the RGB settings used.
+ * The weak declaration avoids having to change `keymap.c`.
+ */
+__attribute__((weak))
+void matrix_scan_user_rgb(void);
+
+/**
+ * @brief Executes tasks based on user activity, eg. fading in.
+ * @details Function declaration as weak as the implementation might "disappear" depending on the RGB settings used.
+ * The weak declaration avoids having to change `keymap.c`.
+ * @param[in] keycode
+ * @param[in] record
+ * @return `false` if further processing should be stopped, `true` otherwise
+ */
+__attribute__((weak))
+bool process_record_user_rgb(const uint16_t keycode, const keyrecord_t *record);
diff --git a/util/update_chibios_mirror.sh b/util/update_chibios_mirror.sh
index 0bf648ebfd..e6666c55c9 100755
--- a/util/update_chibios_mirror.sh
+++ b/util/update_chibios_mirror.sh
@@ -4,13 +4,13 @@
# Configuration
# The ChibiOS branches to mirror
-chibios_branches="trunk stable_20.3.x stable_21.6.x"
+chibios_branches="trunk stable_20.3.x stable_21.11.x"
# The ChibiOS tags to mirror
-chibios_tags="ver20.3.1 ver20.3.2 ver20.3.3 ver20.3.4 ver21.6.0"
+chibios_tags="ver20.3.1 ver20.3.2 ver20.3.3 ver20.3.4 ver21.11.1"
# The ChibiOS-Contrib branches to mirror
-contrib_branches="chibios-20.3.x chibios-21.6.x"
+contrib_branches="chibios-20.3.x chibios-21.11.x"
################################
# Actions
@@ -88,5 +88,5 @@ echo "Updating ChibiOS-Contrib branches..."
for branch in $contrib_branches ; do
echo "Creating branch 'mirror/$branch' from 'upstream/$branch'..."
git branch -f mirror/$branch upstream/$branch \
- && git push qmk mirror/$branch
+ && git push qmk mirror/$branch || true # Allow for nonexistent ChibiOS-Contrib branches -- they'll turn up eventually.
done